n8n-editor-ui 1.41.0 → 1.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +61 -61
- package/dist/assets/{AuthView-E0Dwqa78.js → AuthView-CMX_-yPy.js} +2 -2
- package/dist/assets/{AuthView-E0Dwqa78.js.map → AuthView-CMX_-yPy.js.map} +1 -1
- package/dist/assets/{CanvasControls-yrXCY2V6.js → CanvasControls-9oKgZX9B.js} +2 -2
- package/dist/assets/{CanvasControls-yrXCY2V6.js.map → CanvasControls-9oKgZX9B.js.map} +1 -1
- package/dist/assets/{ChangePasswordView-kHBWSwn5.js → ChangePasswordView-GG3ESv5E.js} +2 -2
- package/dist/assets/{ChangePasswordView-kHBWSwn5.js.map → ChangePasswordView-GG3ESv5E.js.map} +1 -1
- package/dist/assets/{CollectionParameter-ZuNQUd29.js → CollectionParameter-1UnufhEZ.js} +2 -2
- package/dist/assets/CollectionParameter-1UnufhEZ.js.map +1 -0
- package/dist/assets/{CredentialsView-24rpr6nX.js → CredentialsView-TrGa_IpW.js} +2 -2
- package/dist/assets/{CredentialsView-24rpr6nX.js.map → CredentialsView-TrGa_IpW.js.map} +1 -1
- package/dist/assets/{ExecutionsFilter-RyBW2SgR.js → ExecutionsFilter-W0_jymTM.js} +2 -2
- package/dist/assets/{ExecutionsFilter-RyBW2SgR.js.map → ExecutionsFilter-W0_jymTM.js.map} +1 -1
- package/dist/assets/{ExecutionsView-NIusemYP.js → ExecutionsView-P-nSEBpq.js} +2 -2
- package/dist/assets/{ExecutionsView-NIusemYP.js.map → ExecutionsView-P-nSEBpq.js.map} +1 -1
- package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js → ForgotMyPasswordView-_Ft-h_Xq.js} +2 -2
- package/dist/assets/{ForgotMyPasswordView-ebrry8c_.js.map → ForgotMyPasswordView-_Ft-h_Xq.js.map} +1 -1
- package/dist/assets/{MainHeader-JJIRXuyj.js → MainHeader-UFj-n8nH.js} +2 -2
- package/dist/assets/{MainHeader-JJIRXuyj.js.map → MainHeader-UFj-n8nH.js.map} +1 -1
- package/dist/assets/{MainSidebar-KnXGjnqU.js → MainSidebar-H7A2NfnT.js} +2 -2
- package/dist/assets/{MainSidebar-KnXGjnqU.js.map → MainSidebar-H7A2NfnT.js.map} +1 -1
- package/dist/assets/{NodeCreation-01VRbmJn.js → NodeCreation-MVULkw2n.js} +3 -3
- package/dist/assets/{NodeCreation-01VRbmJn.js.map → NodeCreation-MVULkw2n.js.map} +1 -1
- package/dist/assets/{NodeCreator-D_gQXSbT.js → NodeCreator-NjQetiNP.js} +2 -2
- package/dist/assets/{NodeCreator-D_gQXSbT.js.map → NodeCreator-NjQetiNP.js.map} +1 -1
- package/dist/assets/{NodeList-Ysq3Cjbn.js → NodeList-f4t5_e24.js} +2 -2
- package/dist/assets/{NodeList-Ysq3Cjbn.js.map → NodeList-f4t5_e24.js.map} +1 -1
- package/dist/assets/{NodeView-QjQV3eFX.js → NodeView-kA0j8oya.js} +4 -4
- package/dist/assets/{NodeView-QjQV3eFX.js.map → NodeView-kA0j8oya.js.map} +1 -1
- package/dist/assets/{RunDataAi-wbEK-oHX.js → RunDataAi-9Rk5nlrG.js} +2 -2
- package/dist/assets/{RunDataAi-wbEK-oHX.js.map → RunDataAi-9Rk5nlrG.js.map} +1 -1
- package/dist/assets/{RunDataJson-YtVT_k9o.js → RunDataJson-3HvvCXQv.js} +3 -3
- package/dist/assets/{RunDataJson-YtVT_k9o.js.map → RunDataJson-3HvvCXQv.js.map} +1 -1
- package/dist/assets/{RunDataJsonActions-dl7uUHxF.js → RunDataJsonActions-QVURaY0g.js} +2 -2
- package/dist/assets/{RunDataJsonActions-dl7uUHxF.js.map → RunDataJsonActions-QVURaY0g.js.map} +1 -1
- package/dist/assets/{RunDataSchema-zsup9Psk.js → RunDataSchema-8AcA4SSx.js} +2 -2
- package/dist/assets/{RunDataSchema-zsup9Psk.js.map → RunDataSchema-8AcA4SSx.js.map} +1 -1
- package/dist/assets/{RunDataTable-4PVwCliN.js → RunDataTable-aySP3LG2.js} +2 -2
- package/dist/assets/{RunDataTable-4PVwCliN.js.map → RunDataTable-aySP3LG2.js.map} +1 -1
- package/dist/assets/{SamlOnboarding-a7AOJSPY.js → SamlOnboarding-g5DOLc7y.js} +2 -2
- package/dist/assets/{SamlOnboarding-a7AOJSPY.js.map → SamlOnboarding-g5DOLc7y.js.map} +1 -1
- package/dist/assets/{SettingsApiView-MKVmxKrc.js → SettingsApiView-368bFhYh.js} +2 -2
- package/dist/assets/{SettingsApiView-MKVmxKrc.js.map → SettingsApiView-368bFhYh.js.map} +1 -1
- package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js → SettingsCommunityNodesView-4ma9ZrA6.js} +2 -2
- package/dist/assets/{SettingsCommunityNodesView-JSEAJRmQ.js.map → SettingsCommunityNodesView-4ma9ZrA6.js.map} +1 -1
- package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js → SettingsExternalSecrets-anO5H_X6.js} +2 -2
- package/dist/assets/{SettingsExternalSecrets-LATcSwCb.js.map → SettingsExternalSecrets-anO5H_X6.js.map} +1 -1
- package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js → SettingsFakeDoorView-DP8hJH_b.js} +2 -2
- package/dist/assets/{SettingsFakeDoorView-JXYglIiV.js.map → SettingsFakeDoorView-DP8hJH_b.js.map} +1 -1
- package/dist/assets/{SettingsLdapView-2qYzfmuL.js → SettingsLdapView-TVoyUgkx.js} +2 -2
- package/dist/assets/{SettingsLdapView-2qYzfmuL.js.map → SettingsLdapView-TVoyUgkx.js.map} +1 -1
- package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js → SettingsLogStreamingView-IIFjEkjs.js} +2 -2
- package/dist/assets/{SettingsLogStreamingView-Xc6EScgx.js.map → SettingsLogStreamingView-IIFjEkjs.js.map} +1 -1
- package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js → SettingsSourceControl-1zDUY0dl.js} +2 -2
- package/dist/assets/{SettingsSourceControl-Mb0LqGSl.js.map → SettingsSourceControl-1zDUY0dl.js.map} +1 -1
- package/dist/assets/{SettingsSso-2YEXaMhF.js → SettingsSso-7dAOqmaA.js} +2 -2
- package/dist/assets/{SettingsSso-2YEXaMhF.js.map → SettingsSso-7dAOqmaA.js.map} +1 -1
- package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js → SettingsUsageAndPlan-0b_7OZCC.js} +2 -2
- package/dist/assets/{SettingsUsageAndPlan-_C19BOT1.js.map → SettingsUsageAndPlan-0b_7OZCC.js.map} +1 -1
- package/dist/assets/{SettingsUsersView-salH__qs.js → SettingsUsersView-0AZ_F16e.js} +2 -2
- package/dist/assets/{SettingsUsersView-salH__qs.js.map → SettingsUsersView-0AZ_F16e.js.map} +1 -1
- package/dist/assets/{SettingsView-EBt-ouA4.js → SettingsView-pF2qlNhK.js} +2 -2
- package/dist/assets/SettingsView-pF2qlNhK.js.map +1 -0
- package/dist/assets/{SetupView-T7JQiE1O.js → SetupView-IPdjd4om.js} +2 -2
- package/dist/assets/{SetupView-T7JQiE1O.js.map → SetupView-IPdjd4om.js.map} +1 -1
- package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js → SetupWorkflowCredentialsButton-fL7BC8Hp.js} +2 -2
- package/dist/assets/{SetupWorkflowCredentialsButton-lDl1ksax.js.map → SetupWorkflowCredentialsButton-fL7BC8Hp.js.map} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js → SetupWorkflowFromTemplateView-mDNSG38Q.js} +2 -2
- package/dist/assets/{SetupWorkflowFromTemplateView-uEG55eR-.js.map → SetupWorkflowFromTemplateView-mDNSG38Q.js.map} +1 -1
- package/dist/assets/{SigninView-tsJLDDbt.js → SigninView-4mpqXNHu.js} +2 -2
- package/dist/assets/{SigninView-tsJLDDbt.js.map → SigninView-4mpqXNHu.js.map} +1 -1
- package/dist/assets/{SignupView-ckdGMylG.js → SignupView-v6AVy0zJ.js} +2 -2
- package/dist/assets/{SignupView-ckdGMylG.js.map → SignupView-v6AVy0zJ.js.map} +1 -1
- package/dist/assets/{TemplateDetails-YEZlo0n4.js → TemplateDetails-WQVyxQi7.js} +2 -2
- package/dist/assets/{TemplateDetails-YEZlo0n4.js.map → TemplateDetails-WQVyxQi7.js.map} +1 -1
- package/dist/assets/{TemplateList-OGWLmWk_.js → TemplateList--WJ98ZVH.js} +2 -2
- package/dist/assets/{TemplateList-OGWLmWk_.js.map → TemplateList--WJ98ZVH.js.map} +1 -1
- package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js → TemplatesCollectionView-g59Pu268.js} +2 -2
- package/dist/assets/{TemplatesCollectionView-Fx5qyXc6.js.map → TemplatesCollectionView-g59Pu268.js.map} +1 -1
- package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js → TemplatesInfoCarousel-Nq4oRyBi.js} +2 -2
- package/dist/assets/{TemplatesInfoCarousel-oLwAv_o3.js.map → TemplatesInfoCarousel-Nq4oRyBi.js.map} +1 -1
- package/dist/assets/{TemplatesSearchView-TtSL2qyI.js → TemplatesSearchView-Lv0e5mOk.js} +2 -2
- package/dist/assets/{TemplatesSearchView-TtSL2qyI.js.map → TemplatesSearchView-Lv0e5mOk.js.map} +1 -1
- package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js → TemplatesWorkflowView-FoPXbc_4.js} +2 -2
- package/dist/assets/{TemplatesWorkflowView-Ipt1HHPc.js.map → TemplatesWorkflowView-FoPXbc_4.js.map} +1 -1
- package/dist/assets/{VariablesView-pLmlCm20.js → VariablesView-Sg4v_4Ai.js} +2 -2
- package/dist/assets/{VariablesView-pLmlCm20.js.map → VariablesView-Sg4v_4Ai.js.map} +1 -1
- package/dist/assets/{WorkerView-Du8mpTon.js → WorkerView-y-y5Q5E5.js} +2 -2
- package/dist/assets/{WorkerView-Du8mpTon.js.map → WorkerView-y-y5Q5E5.js.map} +1 -1
- package/dist/assets/{WorkflowActivator-MuCzpXdv.js → WorkflowActivator-vtOaSPI6.js} +2 -2
- package/dist/assets/{WorkflowActivator-MuCzpXdv.js.map → WorkflowActivator-vtOaSPI6.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-9gkfchSQ.js.map → WorkflowExecutionsInfoAccordion-Gm7eM0Un.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js → WorkflowExecutionsLandingPage-C_oVBqy4.js} +2 -2
- package/dist/assets/{WorkflowExecutionsLandingPage-g4QNNuc4.js.map → WorkflowExecutionsLandingPage-C_oVBqy4.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js → WorkflowExecutionsPreview-Yw0HRwQz.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-KNJgPBbn.js.map → WorkflowExecutionsPreview-Yw0HRwQz.js.map} +1 -1
- package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js → WorkflowExecutionsView-dwh6ZDgY.js} +2 -2
- package/dist/assets/{WorkflowExecutionsView-Iwwaw9Lt.js.map → WorkflowExecutionsView-dwh6ZDgY.js.map} +1 -1
- package/dist/assets/{WorkflowHistory-HxH8_2Dt.js → WorkflowHistory-RGKALSm6.js} +2 -2
- package/dist/assets/{WorkflowHistory-HxH8_2Dt.js.map → WorkflowHistory-RGKALSm6.js.map} +1 -1
- package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js → WorkflowOnboardingView-kAh_YIAL.js} +2 -2
- package/dist/assets/{WorkflowOnboardingView-KirfsyFh.js.map → WorkflowOnboardingView-kAh_YIAL.js.map} +1 -1
- package/dist/assets/{WorkflowsView-SJ6W5Ten.js → WorkflowsView-_nHq94Wq.js} +2 -2
- package/dist/assets/{WorkflowsView-SJ6W5Ten.js.map → WorkflowsView-_nHq94Wq.js.map} +1 -1
- package/dist/assets/{cloud-WKIHJYyR.js → cloud-jEANLTrV.js} +2 -2
- package/dist/assets/{cloud-WKIHJYyR.js.map → cloud-jEANLTrV.js.map} +1 -1
- package/dist/assets/{index-Qw68KAhz.js → index-6M_Mo9yq.js} +4 -4
- package/dist/assets/{index-Qw68KAhz.js.map → index-6M_Mo9yq.js.map} +1 -1
- package/dist/assets/{templateActions-5n_gDrp9.js → templateActions-l9fJr0Cu.js} +2 -2
- package/dist/assets/{templateActions-5n_gDrp9.js.map → templateActions-l9fJr0Cu.js.map} +1 -1
- package/dist/assets/{useExecutionDebugging-bM31shhY.js → useExecutionDebugging-ndesKh44.js} +2 -2
- package/dist/assets/{useExecutionDebugging-bM31shhY.js.map → useExecutionDebugging-ndesKh44.js.map} +1 -1
- package/dist/assets/{usePushConnection-YMVPmkf5.js → usePushConnection-vhkd7pw_.js} +2 -2
- package/dist/assets/{usePushConnection-YMVPmkf5.js.map → usePushConnection-vhkd7pw_.js.map} +1 -1
- package/dist/assets/{workflowActivate-L9KnNQBb.js → workflowActivate-dwxhdtFU.js} +2 -2
- package/dist/assets/{workflowActivate-L9KnNQBb.js.map → workflowActivate-dwxhdtFU.js.map} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-ZuNQUd29.js.map +0 -1
- package/dist/assets/SettingsView-EBt-ouA4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":";;;;;;itGAgCA,MAAMA,GAAWC,EAAgB,CAAC,EAAG,CAAC,CAAC,EACjCC,GAASD,EAAI,EAAK,EAClBE,GAASF,EAAuB,CAAE,OAAQ,QAAU,GACpDG,GAAUH,EAA0B,EAAE,EACtCI,GAAiBJ,EAA+B,IAAM,CAAC,CAAC,EAEjDK,GAAiB,CAACC,EAAsC,IAAM,CAAC,IAAM,CACjF,MAAMC,EAAUC,KACVC,EAAiBC,KACjBC,EAAiBC,IACjBC,EAAqBC,KAErBC,EAAOC,KAEPC,EAAaC,EAClB,IAAML,EAAmB,YAAY,gBAAkBN,EAAQ,gBAG1DY,EAAcD,EAAS,IAAM,CAClC,GAAI,CAACjB,GAAO,MAAO,MAAO,GACpB,MAAAmB,EAAgBb,EAAQ,cAAc,IAAKc,GAChDV,EAAe,cAAcU,EAAK,IAAI,GAEjCC,EAAgBpB,GAAO,MACzB,OAAAoB,EAAc,SAAW,SACrBF,EACGE,EAAc,SAAW,mBACTF,EAAc,KAAMC,GAASA,EAAK,OAASC,EAAc,KAAK,IAAI,EACjEF,EAAgB,CAACE,EAAc,IAAI,EAGxD,CAACA,EAAc,IAAI,EAC1B,EAEKC,EAAoBC,GAAmC,CACtD,MAAAC,EAAgBd,EAAe,SAAS,OAAQe,GAAMA,EAAE,OAASF,EAAS,IAAI,EACpF,OAAOA,EAAS,WAAa,QAAaC,EAAc,OAASD,EAAS,UAGrEG,EAAoBN,GAAyB,CAClD,MAAMG,EAAWf,EAAe,YAAYY,EAAK,KAAMA,EAAK,WAAW,EAEnE,MADA,CAACG,GACDI,GAA2B,SAASJ,EAAS,IAAI,EAAU,GAExDD,EAAiBC,CAAQ,GAG3BK,EAAcR,GACZ,CAAC,CAACV,EAAe,kBAAkBU,EAAK,IAAI,EAE9CS,EAAQ,IAAM,CACZ5B,GAAA,MAAQ,CAAE,OAAQ,QAAS,EAClCD,GAAO,MAAQ,GACfE,GAAQ,MAAQ,GACPJ,GAAA,MAAQ,CAAC,EAAG,CAAC,GAGjBgC,EAAO,CAACC,EAAmBC,EAAgC,CAAE,OAAQ,YAAe,CAGzF,GAFAD,EAAM,gBAAgB,EAElB/B,GAAO,OAASgC,EAAW,SAAW/B,GAAO,MAAM,OAAQ,CAExD4B,IACN,MACD,CAEAE,EAAM,eAAe,EAErB5B,GAAe,MAAQE,EACvBJ,GAAO,MAAQ+B,EACNlC,GAAA,MAAQmC,GAAiBF,CAAK,EACvC/B,GAAO,MAAQ,GAEf,MAAMkC,EAAQhB,EAAY,MACpBiB,EAAeD,EAAM,MAAOd,GAASA,EAAK,OAASgB,EAAgB,EACnEC,EAAc,CACnB,eAAgBH,EAAM,OACtB,YAAa,CACZ,QAASC,EACNrB,EAAK,SAAS,qBAAsB,CAAE,eAAgBoB,EAAM,MAAQ,GACpEpB,EAAK,SAAS,mBAAoB,CAAE,eAAgBoB,EAAM,OAAQ,CACtE,GAGKI,EAAmB,CACxB,CACC,GAAI,aACJ,QAAS,GACT,MAAOxB,EAAK,SAAS,uBAAuB,EAC5C,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,EACvC,SAAUoB,EAAM,SAAWxB,EAAe,SAAS,MACpD,EACA,CACC,GAAI,eACJ,MAAOI,EAAK,SAAS,yBAAyB,EAC9C,SAAUoB,EAAM,SAAW,CAC5B,GAGG,GAAAA,EAAM,SAAW,EACpBhC,GAAQ,MAAQ,CACf,CACC,GAAI,WACJ,SAAU,CAAE,KAAM,CAAC,KAAK,CAAE,EAC1B,MAAOY,EAAK,SAAS,qBAAqB,EAC1C,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,aACJ,SAAU,CAAE,SAAU,GAAM,KAAM,CAAC,GAAG,CAAE,EACxC,MAAOF,EAAK,SAAS,uBAAuB,EAC5C,SAAUE,EAAW,KACtB,EACA,GAAGsB,CAAA,MAEE,CACN,MAAMC,EAAoC,CACzC,CAACJ,GAAgB,CAChB,GAAI,oBACJ,MAAOD,EAAM,MAAOd,GAASA,EAAK,QAAQ,EACvCN,EAAK,SAAS,uBAAwBuB,CAAW,EACjDvB,EAAK,SAAS,yBAA0BuB,CAAW,EACtD,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUrB,EAAW,KACtB,EACA,CAACmB,GAAgB,CAChB,GAAI,aACJ,MAAOD,EAAM,MAAOd,GAASQ,EAAWR,CAAI,CAAC,EAC1CN,EAAK,SAAS,oBAAqBuB,CAAW,EAC9CvB,EAAK,SAAS,kBAAmBuB,CAAW,EAC/C,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUrB,EAAW,OAAS,CAACkB,EAAM,MAAOT,GAAMe,GAAcf,CAAC,EAAE,WAAW,EAAI,CAAC,CACpF,EACA,CACC,GAAI,OACJ,MAAOX,EAAK,SAAS,mBAAoBuB,CAAW,EACpD,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,CACxC,EACA,CACC,GAAI,YACJ,MAAOvB,EAAK,SAAS,wBAAyBuB,CAAW,EACzD,SAAU,CAAE,QAAS,GAAM,KAAM,CAAC,GAAG,CAAE,EACvC,SAAUrB,EAAW,OAAS,CAACkB,EAAM,MAAMR,CAAgB,CAC5D,EACA,GAAGY,EACH,CACC,GAAI,SACJ,QAAS,GACT,MAAOxB,EAAK,SAAS,qBAAsBuB,CAAW,EACtD,SAAU,CAAE,KAAM,CAAC,KAAK,CAAE,EAC1B,SAAUrB,EAAW,KACtB,GACC,OAAO,OAAO,EAEZ,GAAAkB,EAAM,SAAW,EAAG,CACvB,MAAMO,EAAoBN,EACvB,CACA,CACC,GAAI,OACJ,MAAOrB,EAAK,SAAS,wBAAwB,EAC7C,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,EACxB,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,eACJ,MAAOF,EAAK,SAAS,yBAAyB,EAC9C,SAAUE,EAAW,KACtB,GAEA,CACA,CACC,GAAI,OACJ,MAAOF,EAAK,SAAS,kBAAkB,EACvC,SAAU,CAAE,KAAM,CAAC,GAAG,CAAE,CACzB,EACA,CACC,GAAI,UACJ,MAAOA,EAAK,SAAS,kBAAkB,EACvC,SAAUE,EAAW,KACtB,EACA,CACC,GAAI,SACJ,MAAOF,EAAK,SAAS,oBAAoB,EACzC,SAAU,CAAE,KAAM,CAAC,IAAI,CAAE,EACzB,SAAUE,EAAW,KACtB,GAGSuB,EAAA,QAAQ,GAAGE,CAAiB,CACzC,CAEAvC,GAAQ,MAAQqC,CACjB,GAGKG,EAAmBC,GAA8B,CACvCxC,GAAA,MAAMwC,EAAQzB,EAAY,KAAK,GAG/C,OAAA0B,GACC,IAAMtC,EAAQ,uBACd,IAAM,CACCuB,GACP,GAGM,CACN,OAAA7B,GACA,SAAAF,GACA,OAAAG,GACA,QAAAC,GACA,YAAAgB,EACA,KAAAY,EACA,MAAAD,EACA,gBAAAa,CAAA,CAEF,ECzOA,SAAwBG,IAAuB,CACxC,MAAAC,EAAe/C,EAAI,EAAK,EACxBgD,EAAYhD,EAAI,SAAS,cAAc,MAAM,CAA4B,EAEzE,CAAE,cAAAiD,EAAe,iBAAAC,CAAiB,EAAIC,GAAiB,EACvD5C,EAAUC,KACV4C,EAAcC,KACd1C,EAAiBC,IACjB,CAAE,OAAQ0C,CAAkB,EAAIjD,GAAe,EAErD,SAASkD,EAAmBC,EAAgC,CAC3D,OAAO,OAAOR,EAAU,MAAM,MAAOQ,CAAM,CAC5C,CAEA,SAASC,EAAezB,EAAmB,CAC1C,KAAM,CAAC,EAAG0B,CAAC,EAAIC,EAA+B3B,CAAK,EACzCgB,EAAA,MAAQ,OAAO,OAAOA,EAAU,MAAO,CAAE,EAAG,EAAAU,EAAG,EAEtCH,EAAA,CAClB,KAAMP,EAAU,MAAM,EAAI,KAC1B,IAAKA,EAAU,MAAM,EAAI,KACzB,WAAY,UACZ,EACDD,EAAa,MAAQ,EACtB,CAEA,SAASa,EAAiB5B,EAAmB,CACtC,MAAA6B,EAAeC,EAAiB9B,CAAK,EAExBuB,EAAA,CAClB,KAAMM,EAAa,EAAI,KACvB,IAAKA,EAAa,EAAI,KACtB,MAAOA,EAAa,MAAQ,KAC5B,OAAQA,EAAa,OAAS,KAC9B,CACF,CAEA,SAASE,GAAiB,CACzBf,EAAU,MAAM,EAAI,EACpBA,EAAU,MAAM,EAAI,EAEDO,EAAA,CAClB,WAAY,SACZ,KAAM,MACN,IAAK,MACL,MAAO,MACP,OAAQ,MACR,EACDR,EAAa,MAAQ,EACtB,CAEA,SAASe,EAAiB9B,EAAmB,CAC5C,KAAM,CAAC,EAAG0B,CAAC,EAAIC,EAA+B3B,CAAK,EAC5C,OACN,EAAG,KAAK,IAAI,EAAGgB,EAAU,MAAM,CAAC,EAChC,EAAG,KAAK,IAAIU,EAAGV,EAAU,MAAM,CAAC,EAChC,MAAO,KAAK,IAAI,EAAIA,EAAU,MAAM,CAAC,EACrC,OAAQ,KAAK,IAAIU,EAAIV,EAAU,MAAM,CAAC,EAExC,CAEA,SAASgB,EAAqBhC,EAA8B,CAC3D,MAAMiC,EAAyB,GACzBJ,EAAeC,EAAiB9B,CAAK,EAG5B,OAAArB,EAAA,SAAS,QAASU,IAAkB,CAGjDA,GAAK,SAAS,CAAC,EAAIwC,EAAa,GAChCxC,GAAK,SAAS,CAAC,EAAIwC,EAAa,EAAIA,EAAa,OAKjDxC,GAAK,SAAS,CAAC,EAAIwC,EAAa,GAChCxC,GAAK,SAAS,CAAC,EAAIwC,EAAa,EAAIA,EAAa,QAIlDI,EAAY,KAAK5C,EAAI,EACrB,EAEM4C,CACR,CAEA,SAASC,GAAmB,CAC3BlB,EAAU,MAAM,GAAK,aACFO,EAAA,CAClB,OAAQ,WACR,OAAQ,qBAER,SAAU,WACV,OAAQ,MACR,WAAY,SACZ,EAESP,EAAA,MAAM,iBAAiB,UAAWmB,CAAkB,EAE3C,SAAS,cAAc,YAAY,EAC3C,YAAYnB,EAAU,KAAK,CACvC,CAEA,SAASoB,EAAiBC,EAAe,CACpC,GAAAA,EAAE,UAAY,EAAG,CAIpBF,EAAmBE,CAAC,EACpB,MACD,CAEAT,EAAiBS,CAAC,CACnB,CAEA,SAASF,EAAmBE,EAAe,CAEtC,GAAAA,EAAE,SAAW,GAAKf,EAAkB,MAAO,OAE3C,IAACP,EAAa,MAAO,CACpBE,GAAiBoB,EAAE,kBAAkB,aACpCA,EAAE,QAAUA,EAAE,OAAO,GAAG,SAAS,WAAW,GAE9BC,IAKnB,MACD,CACS,6BAAoB,YAAaF,CAAgB,EAGzCE,IAGX,MAAAlD,EAAgB4C,EAAqBK,CAAC,EAC9BjD,EAAA,QAASC,GAAS,CAC/BkD,EAAalD,CAAI,EACjB,EAEGD,EAAc,SAAW,IACpBb,EAAA,iBAAmBa,EAAc,CAAC,EAAE,MAG9B2C,GAChB,CACS,SAAAS,EAAqBH,EAAeI,EAA4B,CACpEvB,EAAiBmB,CAAC,GAAKI,GAAqBJ,EAAE,SAAW,GAMzD9D,EAAQ,eAAe,YAAY,IAIvCkD,EAAeY,CAAC,EAIP,0BAAiB,YAAaD,CAAgB,EACxD,CAEA,SAAST,EAA+B3B,EAA4C,CAC7E,MAAA0C,EAAgBxC,GAAiBF,CAAK,EAEtC,CAAC2C,EAAWC,EAAS,EAAIxB,EAAY,+BAA+BsB,CAAa,EACjFG,GAAgBzB,EAAY,cAC5B0B,EAAyBvE,EAAQ,uBAEvC,OAAOwE,GAAoBJ,EAAWC,GAAWC,GAAeC,CAAsB,CACvF,CAEA,SAASE,EAAe3D,EAAe,CACtCd,EAAQ,wBAAwBc,CAAI,EACpC4D,EAAS,MAAM,wBAAwBA,EAAS,MAAM,kBAAkB5D,GAAA,YAAAA,EAAM,EAAE,CAAC,CAClF,CAEA,SAASkD,EAAalD,EAAe,CACpCd,EAAQ,gBAAgBc,CAAI,EAC5B4D,EAAS,MAAM,mBAAmBA,EAAS,MAAM,kBAAkB5D,GAAA,YAAAA,EAAM,EAAE,CAAC,CAC7E,CAEA,SAASiD,GAAmB,CAC3BW,EAAS,MAAM,qBACf1E,EAAQ,mBAAmB,EAC3BA,EAAQ,iBAAmB,KAC3BA,EAAQ,4BAA8B,KAEtC6C,EAAY,uBAAyB,KACrCA,EAAY,sBAAwB,IACrC,CAEA,MAAM6B,EAAW/D,EAAS,IAAMkC,EAAY,eAAe,EAE3D,OAAA8B,GAAU,IAAM,CACEhB,GAAA,CACjB,EAEM,CACN,aAAAnB,EACA,+BAAAY,EACA,mBAAAQ,EACA,qBAAAK,EACA,eAAAQ,EACA,aAAAT,EACA,iBAAAD,CAAA,CAEF,CC9NO,SAASa,IAAoB,CAKnC,SAASC,GAAsB,CAC9B,OAAO1E,GAAoB,eAAa,OAAiB,CAAC2E,EAAK7D,IAAa,CAC3E,GAAI,OAAOA,EAAS,SAAS,MAAS,SAC/B,UAAI,MAAM,2CAA2C,EAG5D,MAAI,MAAM,KAAKA,EAAS,SAAS,IAAI,GAAO6D,EAAA,KAAK7D,EAAS,SAAS,IAAI,EAEhE6D,CACR,EAAG,CAAE,EACN,CAMA,SAASC,EAAeC,EAAsBC,EAAuB,GAAI,SAClE,MAAE,YAAAC,GAAgB7E,IAIpB,GAFa,CAAC6E,EAAY,IAAIF,CAAY,GAAK,CAACC,EAAW,SAASD,CAAY,EAE/D,OAAAA,EAEf,MAAAG,EAAMN,EAAsB,OAAMM,GAAQH,EAAa,WAAWG,CAAG,CAAC,EAI5E,GAAIA,EAAK,CACR,IAAIC,EAAS,GACTC,EAAQ,EAEZ,MAAMC,EAAYN,EAAa,MAAMG,CAAG,EAAE,IAAI,EAExCI,EAAWD,GAAA,YAAAA,EAAYA,EAAU,OAAS,GAShD,IAPIC,GAAY,OAAO,UAAU,OAAOA,CAAQ,CAAC,IAChDF,EAAQ,SAASE,EAAU,EAAE,EACdP,IAAa,MAAM,EAAG,EAAE,GAGxCI,EAASJ,EAEFE,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAC3DA,EAASJ,EAAeK,IAGlBD,QACR,CAII,gBAAa,KAAKJ,CAAY,EAAG,CACpC,IAAII,EAAS,GACTC,EAAQ,EAENG,QAAQR,EAAa,MAAM,8BAA8B,EAE3D,KAACQ,WAAO,QACL,UAAI,MAAM,sCAAsC,EASvD,MANIA,mBAAO,SAAPA,cAAe,UAAW,KAC7BH,EAAQ,SAASG,EAAM,OAAO,OAAQ,EAAE,GAGzCJ,EAASI,EAAM,OAAO,KAEfN,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAC3DA,EAASI,EAAM,OAAO,KAAO,IAAMH,IAG7BD,QACR,CAIA,IAAIA,EAAS,GACTC,EAAQ,EAEN,MAAAG,EAAQR,EAAa,MAAM,8BAA8B,EAE3D,KAACQ,GAAA,MAAAA,EAAO,QACL,UAAI,MAAM,sCAAsC,EASvD,MANIC,EAAAD,GAAA,YAAAA,EAAO,SAAP,YAAAC,EAAe,UAAW,KAC7BJ,EAAQ,SAASG,EAAM,OAAO,OAAQ,EAAE,GAGzCJ,EAASI,EAAM,OAAO,KAEfN,EAAY,IAAIE,CAAM,GAAKH,EAAW,SAASG,CAAM,GAClDA,EAAAI,EAAM,OAAO,KAAOH,IAGvB,OAAAD,CACR,CAEA,MAAO,CAAE,eAAAL,CAAe,CACzB,CC9DA,MAAAW,GAAeC,EAAgB,CAC9B,KAAM,YACN,WAAY,CACX,SAAAC,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,SAAU,CAAC,EACX,SAAU,CACT,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,SAAU,GACV,QAAS,GAEX,EACA,SAAU,CACT,UAAoB,CACnB,MAAO,CAAC,KAAK,UAAY,SAAW,OAAO,MAC5C,CACD,EACA,QAAS,CACR,MAAM,QAAS,CACd,KAAK,QAAU,KAAK,WACpB,KAAK,SAAW,GAChB,MAAM,KAAK,YACL,MAAAC,EAAW,KAAK,MAAM,MACxBA,GACHA,EAAS,MAAM,CAEjB,EACA,UAAW,CACN,KAAK,QAAQ,KAAK,IAAM,IAC3B,KAAK,MAAM,oBAAqB,KAAK,QAAQ,MAAM,EAGpD,KAAK,SAAW,EACjB,CACD,CACD,CAAC,ycAzFAC,EAqCO,eArCyB,OAAAC,EAAA,EAAmCC,EAAA,QAAE,MAAKC,EAAAC,EAAA,wDACzE,QAAsFC,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,QAAAA,EAAA,UAAAE,CAAA,eAApD,MAA6CH,EAAAC,EAAA,sBAAJG,EAAAC,EAAA,aAAAJ,EAAA,gBAmC7D,uBAlCD,KAAAG,EAAwBE,EAAK,CAAE,UAASC,QAAW,oBAAAN,EAAA,SA0BpD,SAAS,CAAAA,EAAA,WA7BvB,UAAAO,EAAA,KAAAC,EAAA,aA+BQC,uBAAU,CAAGT,EAChB,kBAAAA,EAAA,aAhCLU,EAAAC,EAgCkBC,EAAO,UAAiB,SAAAJ,EAAA,aACXK,EAAQb,EAAA,4BAjCvCA,EAAA,UAAAH,IAAAiB,EAiCiDF,EAAe,CAAE,IAAI,QAAAb,EAAAC,EAAA,iBAjCtE,sCAAAe,EAAA,yBAKUR,EALV,KAMYC,EAAA,OANZ,MAAAT,EAAAC,EAAA,iCAAAC,EAAA,KAAAA,EAAA,GAAAe,GAAA,IAAAd,IAQkBI,EAAQ,UAAAN,EAAA,YAAAE,CAAA,cAAAD,EAAA,KAAAA,EAAA,GAAAgB,GAAA,2DAEtB,MAA6BC,EAAW,CAAC,KAAI,qBAVjD,2BAAAR,EAAAC,EAAAX,EAAA,+CAaI,QAbJmB,EAa2C,CAb3C,YAa6C,WAAKnB,EAAO,QAAC,sBAAaC,EAAmB,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,QAAAoB,GAAA,aACtF,oCAAM,KAdV,EAciBR,yBACZ,MAKEb,EAAAC,EAAA,wBAHIqB,EAAO,CACX,KAAK,YACL,mBAAArB,EAAA,qCAEF,QAKEC,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,cAJD,KAAK,EAAS,WAAAG,EACTkB,EAAO,CACX,KAAK,UACL,mBAAArB,EAAA,wFAzBP,6GC0BAsB,GAAe7B,EAAgB,CAC9B,KAAM,mBACN,MAAO,CACN,WAAY,CACX,KAAM,OACN,QAAS,EACV,EACA,SAAU,CAAC,EACX,QAAS,CACR,KAAM,MACP,CACD,EACA,OAAQ,CAEA,OACN,cAFqB8B,IAErB,CAEF,EACA,SAAU,CACT,GAAGC,GAAUC,GAAatH,CAAiB,EAC3C,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,kBAA2B,aAC1B,MAAMY,EAAW,KAAK,SAEtB,GAAI,CAACA,EACG,SAGR,GAAIA,EAAS,kBAAoBA,EAAS,iBAAiB,WAAW,MAAM,EAC3E,OAAOA,EAAS,iBAGX,MAAA2G,EACL,mFAEA3G,EAAS,KAGJ4G,GAAgBC,GAAAC,GAAAtC,GAAAuC,EAAA/G,EAAS,QAAT,YAAA+G,EAAgB,YAAhB,YAAAvC,EAA2B,uBAA3B,YAAAsC,EAAkD,KAAlD,YAAAD,EAAsD,IAC5E,OAAID,EACIA,EAAgBD,EAGpB,KAAK,gBACD,GAAGK,EAAyB,GAAGhH,EAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,GAI3DiH,GAAyBN,CACjC,EACA,iBAA2B,CAC1B,MAAM3G,EAAW,KAAK,SACtB,OAAIA,EACIkH,GAAuBlH,EAAS,IAAI,EAErC,EACR,EACA,aAAsB,CAErB,OADiB,KAAK,SACN,KAAK,MAAM,GAAG,EAAE,CAAC,CAClC,EACA,SAAkB,CACjB,MAAMmH,EAAkB,CACvB,CACC,MAAO,KAAK,QAAQ,SAAS,yBAAyB,EACtD,MAAO,QACR,GAEG,KAAK,kBACRA,EAAQ,KAAK,CACZ,MAAO,KAAK,QAAQ,SAAS,mBAAmB,EAChD,MAAO,OACP,KAAM,KAAK,iBACX,EAEE,KAAK,iBACRA,EAAQ,KAAK,CACZ,KAAM,OACN,MAAO,gBACP,MAAO,QACP,QAAS,KAAK,QAAQ,SAAS,gCAAiC,CAC/D,YAAa,CACZ,OAAQC,GACR,YAAa,KAAK,WACnB,EACA,EACD,EAGI,MAAAC,EAAe,MAAK,gBAC1B,OAAAF,EAAQ,KAAK,CACZ,KAAM,MACN,MAAO,WACP,MAAOE,EAAe,QAAU,OAChC,EAEMF,CACR,CACD,EACA,QAAS,CACR,YAAYG,EAAa,CACpBA,IAAQ,QAAU,KAAK,WACrB,KAAK,cAAc,IAAI,sCAAuC,CAClE,SAAU,KAAK,SACf,iBAAkB,KAAK,iBACvB,EACI,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAMC,EAAmB,KACzB,KAAM,OACN,GAGED,IAAQ,YAAc,KAAK,UACzB,gBAAW,MAAM,4BAA6B,CAClD,UAAY,KAAK,SAAkC,KACnD,YAAa,KAAK,eAAe,WACjC,GAGEA,IAAQ,YAAcA,IAAQ,WAC5B,WAAM,oBAAqBA,CAAG,CAErC,EACA,eAAeA,EAAa9G,EAAmB,CAC1C8G,IAAQ,iBAAoB9G,EAAM,OAAmB,YAAc,KACtE,KAAK,WAAW,MAAM,6BAA8B,CAAE,OAAQ,oBAAqB,CAErF,CACD,CACD,CAAC,mCA/JAqE,EAKE,YAHA,OAAAC,EAAA,EAAuBiB,EAAAyB,EAAA,CACvB,QAAAvC,EAAA,QACA,cAAaA,EAAEwC,wLC6DlBC,GAAehD,EAAgB,CAC9B,KAAM,eACN,MAAO,CACN,OACA,UACD,EACA,OAAQ,CACP,MAAMiD,EAASC,KACTC,EAAYC,KACZC,EAAkBC,GAAmB,CAAE,OAAAL,CAAQ,GAC9C,OACN,UAAAE,EACA,gBAAAE,EACA,GAAGE,GAAS,EAEd,EACA,MAAO,CACC,OACN,YAAa,KAAK,UAAY,CAACC,GAAkC,SAAS,KAAK,SAAS,IAAI,EAC5F,WAAY,OAEd,EACA,SAAU,CACT,kBAA4B,CAC3B,OAAO,KAAK,UAAYC,GAAmC,SAAS,KAAK,SAAS,IAAI,CACvF,EACA,YAAsD,CAC9C,OACN,GAAI,KAAK,iBAAmB,CAAK,GAAC,CAAE,MAAO,KAAK,SAAS,QAAS,MAAO,OAAQ,EACjF,CACC,MAAO,KAAK,SAAS,cACrB,MAAO,YACR,EAEF,EACA,oBAA4C,CAC3C,OAAO,KAAK,aAAa,OAAQC,GAC5B,OAAOA,EAAQ,YAAe,SAC1B,CAAC,KAAK,gBAAgB,0BAA0BA,EAAS,YAAY,EAGtE,CAACA,EAAQ,UAChB,CACF,EACA,cAAsC,CACrC,OAAI,KAAK,WAAa,MAAQ,KAAK,SAAS,WAAa,OACjD,GAGA,KAAK,SAAkC,SAAU,OACvDC,GAAgBA,EAAY,iBAAmB,GAElD,EACA,UAAW,CAEV,OADiB,KAAK,SAAS,KACb,CACjB,KAAKC,GACG,OACN,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,eAAgB,KAAK,QAAQ,SAC5B,oDACD,EACA,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,QAAS,KAAK,QAAQ,SAAS,sBAAsB,EACrD,cAAe,KAAK,QAAQ,SAAS,4BAA4B,EACjE,UAAW,KAAK,QAAQ,SAAS,4CAA4C,EAC7E,YAAa,KAAK,QAAQ,SAAS,8CAA8C,GAGnF,KAAKC,GACG,OACN,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,eAAgB,KAAK,QAAQ,SAC5B,oDACD,EACA,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,YAAa,KAAK,QAAQ,SAAS,iDAAiD,EACpF,QAAS,KAAK,QAAQ,SAAS,sBAAsB,EACrD,cAAe,KAAK,QAAQ,SAAS,4BAA4B,EACjE,UAAW,KAAK,QAAQ,SAAS,4CAA4C,EAC7E,YAAa,KAAK,QAAQ,SAAS,8CAA8C,GAGnF,QACQ,OACN,YAAa,KAAK,QAAQ,SAAS,0BAA0B,EAC7D,eAAgB,KAAK,QAAQ,SAAS,wCAAwC,EAC9E,YAAa,KAAK,QAAQ,SAAS,qCAAqC,EACxE,YAAa,KAAK,QAAQ,SAAS,qCAAqC,EACxE,QAAS,KAAK,QAAQ,SAAS,sBAAsB,EACrD,cAAe,KAAK,QAAQ,SAAS,4BAA4B,EACjE,UAAW,KAAK,QAAQ,SAAS,gCAAgC,EACjE,YAAa,OAEhB,CACD,CACD,EACA,MAAO,CACN,MAAO,CACN,KAAK,YAAc,CAACL,GAAkC,SAAS,KAAK,SAAS,IAAI,CAClF,CACD,EACA,QAAS,CACR,eAAeG,EAAwC,CAChD,MAAAG,EAAa,KAAK,qBAAqBH,CAAW,EACnD,KAAK,UAAU,KAAKG,CAAU,EAEnC,KAAK,YAAY,CAChB,MAAO,KAAK,SAAS,UACrB,QAAS,KAAK,SAAS,YACvB,KAAM,UACN,EACI,gBAAW,MAAM,0BAA2B,CAChD,KAAM,aACN,KAAM,GAAG,KAAK,UAAU,OACxB,CACF,EACA,qBAAqBH,EAA0C,CAC9D,OAAI,KAAK,KACD,KAAK,gBAAgB,cAC3BA,EACA,KAAK,KACL,KAAK,iBAAmB,aAAe,KAAK,YAGvC,EACR,EACA,uBAAuBD,EAAuC,CACzD,IACH,MAAMK,EAAS,KAAK,gBAAgB,0BAA0BL,EAAS,aAAc,EAAK,EAC1F,GAAI,MAAM,QAAQK,CAAM,GAAKA,EAAO,SAAW,EACvC,cAEO,CAAC,CAEb,cAAOL,EAAQ,eAAkB,SAC7B,CAAC,KAAK,gBAAgB,0BAA0BA,EAAS,eAAe,EAGzE,CAACA,EAAQ,aACjB,EAEA,qBAAqBA,EAAsC,CAC1D,MAAMK,EAAS,KAAK,gBAAgB,0BAA0BL,EAAS,aAAc,EAAK,EACtF,aAAM,QAAQK,CAAM,EAChBA,EAAO,CAAC,EAETA,CACR,CACD,CACD,CAAC,EAzNDC,GAAAxI,IAAAyI,GAAA,mBAAAzI,MAAA0I,KAAA1I,GACkE2I,GAAgB,yBADlFC,GAAA,UAY4BC,GAAM,8BACAC,GAAM,8BAeSC,GAAM,wDAI5CC,GAAA,OAAM,eAhCjBC,GAAAT,GAAA,IAAAjD,EAAA,0DAAA2D,GAAAV,GAAA,IAAAjD,EAAA,oBAsCiB4D,GAAM,iPArCYC,IAAmB,wBAAM,SAC1DrE,EAQM,qBAAAA,EAAA,6BAAAH,MAPC,MAAoB+D,GAAA,CAAApD,EAElB8D,MAAW,CAClB,MAAKvE,EAAEuE,mCAAW,WAAIA,yEAEvB,QAA8ErE,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,aAAAA,EAAA,iBAAlCuE,EAA+B,oBAR9E,wCAWE7D,EAoCyB,IAAAC,EAAAX,EAAA,0BA/C3B,GAAA6D,EAAA,EAAA1D,EAYemE,EAAW,MAAvB,QAAA/D,EAAA,KAAAP,EAAA,YAZHe,EAAA,QAYGlB,EAAA,EAAAC,EACC,MAMMgE,GANN,CAAA9D,EACC,iBAODe,EAAA,UAJW,EAAAjB,EAAA,MAAAiE,GAAA,CAAA5D,EAFTqE,EAES,KAFA,SAffjE,EAgBuE,KAAAJ,EAAhEsE,EAAgE,mBAhBvElE,EAgBmCmE,KAhBnCvE,EAAAwE,EAAA,CAgBgD,WAASC,sFAhBzD,mDAqBI,IAAA/E,EAEO,EAAK,EAAAC,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,oBAAAmD,EAAAhE,KACNU,EAAO,EAAAiB,EAAAiE,EAAA,CACX,IAAA5F,EACD,qBAAAa,EAAA,qBA1BL,mBA4BK,QAAAO,EAAA,KACCP,EAAA,uBAEMmD,CAFN,GAAAtD,EAAA,EACyEC,EAAA,MAAAkE,GAAA,CAAAxD,EA9B/E,MA8BmCwE,IAAsCxE,EAAA,MAAAyD,GAAA,CAAAvD,EAAAC,EAAAX,EAAA,qBAAAmD,CAAA,QAEnE,KACY3C,EAAA,MAAAyE,GAAA,CAAAzE,EAA4C,MAAE0E,6CAjChE,QAkCWC,wBAAgC,CAlC3CzE,EAAAC,EAAAX,EAAA,qBAAAmD,CAAA,MAAAgB,kBA0Ca,EAAArE,EAAA,MAAAsE,GAAA,CAFK5D,EAAA,MAAA4E,GAAA,CAAA5E,EAA4C,MAAE0E,6CAxChE,QAyCWC,wBAAgC,CAzC3CzE,EAAAC,EAAAX,EAAA,qBAAAmD,CAAA,MAAAkC,WAAA,mDAAAtE,EAAA,yTCwIA,MAAMuE,EAAQC,EACRrL,EAAiBC,IACjBH,EAAiBC,KACjBuL,EAAcC,KACd,CAAE,SAAAC,GAAaC,KACfC,EAAOC,EAQPC,EAAsBvM,EAA+B,EAAE,EAEvDwM,EAAiBxM,EAAuB,EAAE,EAC1CyM,EAA4BzM,EAAI,EAAK,EAErCwB,EAAWN,EAAS,IACzBT,EAAe,YAAYsL,EAAM,SAAS,KAAMA,EAAM,SAAS,WAAW,GAGrEW,EAAWxL,EAAS,IAAMP,EAAe,cAAcoL,EAAM,SAAS,IAAI,CAAC,EAE3EY,EAAWzL,EAAS,IAAMP,EAAe,mBAAoB,GAE7DiM,EAAkB1L,EAAS,IAAM,CAChC,MAAA2L,EAASZ,EAAY,cAAczK,EAAS,MAAOuK,EAAM,SAAUY,EAAS,MAAO,CACxF,cACA,aACA,cACA,YACA,EACM,OAAAE,GAAA,YAAAA,EAAQ,QAAS,EAAC,CACzB,EAEKC,EAAiB5L,EAAgD,IAC/DqL,EAAoB,MAAM,OAChC,CAAClH,EAAK0H,IAAe,CACpB,MAAM5K,EAAQ6K,EACbL,EAAS,MAAM,eAAeZ,EAAM,SAAS,KAAMgB,EAAW,IAAI,GAEnE,MAAO,CAAE,GAAG1H,EAAK,CAAC0H,EAAW,IAAI,EAAG5K,CAAM,CAC3C,EACA,CAAC,EAEF,EAED,SAAS8K,EAAoBC,EAAiC,CAC7D,OAAOX,EAAoB,MAAM,KAAMY,GAAMA,EAAE,OAASD,CAAc,CACvE,CAEA,SAASE,EAAkBF,EAAiC,CACrD,MAAAG,EAAmBJ,EAAoBC,CAAc,EAC3D,OAAOG,GAAA,YAAAA,EAAkB,kBAAmB,CAC7C,CAEA,SAASC,EAA4BJ,EAAiC,CACrE,OAAOE,EAAkBF,CAAc,GAAK,CAACV,EAAe,MAAM,SAASU,CAAc,CAC1F,CAES,SAAAK,EAAsBL,EAAiCM,EAAqB,CAE/EJ,EAAkBF,CAAc,IAIjCM,EACHhB,EAAe,MAAQ,CAAC,GAAGA,EAAe,MAAOU,CAAc,EAE/DV,EAAe,MAAQA,EAAe,MAAM,OAAQiB,GAAMA,IAAMP,CAAc,EAEhF,CAEA,SAASF,EAAmBU,EAA+B,CACnD,OAAAA,EACL,IAAKC,GAAS,CACR,MAAAtM,EAAOV,EAAe,cAAcgN,CAAI,EAC9C,GAAItM,EAAM,CACT,MAAMuM,EAAkBnN,EAAe,YAAYY,EAAK,IAAI,EAC5D,GAAIuM,EAAiB,CACpB,MAAMf,EAASZ,EAAY,cAAc2B,EAAiBvM,EAAMsL,EAAS,KAAK,EACxEkB,EAAoBhB,EAASiB,GAA+BjB,EAAQxL,CAAI,EAAI,GAClF,MAAO,CAAE,KAAAA,EAAM,SAAUuM,EAAiB,OAAQC,CAAkB,CACrE,CACD,CACO,WACP,GACA,OAAQnM,GAAuBA,IAAM,IAAI,CAC5C,CAEA,SAASqM,EAAeb,EAAiC,CAEvD,OAAAT,EAA0B,QAAUG,EAAgB,MAAMM,CAAc,GAAK,IAAI,OAAS,CAE5F,CAEA,SAASc,EACRX,EAC8C,CAC9C,OAAI,OAAOA,GAAqB,SAAiB,GAE1C,SAAUA,CAClB,CAEA,SAASY,GAA4D,CACpE,MAAI,CAACzM,EAAS,OAAS,CAACuK,EAAM,SAAiB,GAEhCmC,GAA0BvB,EAAS,MAAOZ,EAAM,SAAUvK,EAAS,KAAK,EAE1D,OAAQ2M,GAC/BH,EAAyBG,CAAK,EAE5BA,EAAM,OAAS,OAFuB,EAG7C,CAGF,CAES,SAAAC,EAAYC,EAAkBnB,EAAiC,CACnE,GAAAE,EAAkBF,CAAc,GAAK,CAACV,EAAe,MAAM,SAASU,CAAc,EAAG,CACxFK,EAAsBL,EAAgB,EAAI,EAC1C,MACD,CAEAb,EAAK,qBAAsBgC,CAAQ,CACpC,CAEA,SAASC,GAAYpB,EAAiC,CAC/C,MAAAqB,EAAkBzB,EAAe,MAAMI,CAAc,EAE1D,GAAAE,EAAkBF,CAAc,GAChC,CAACV,EAAe,MAAM,SAASU,CAAc,GAC7CqB,EAAgB,QAAU,EACzB,CACDhB,EAAsBL,EAAgB,EAAI,EAC1C,MACD,CAEAb,EAAK,4BAA6BN,EAAM,SAAS,KAAMmB,CAAc,CACtE,CAEA,SAASsB,IAAuB,CAC/B/B,EAA0B,MAAQ,GAElC,WAAW,IAAM,CAChBA,EAA0B,MAAQ,IAChC,CAAC,CACL,CAEA,OAAA5J,GACC6J,EACAP,EACC,IACC,WAAW,IAAM,CAChBK,EAAe,MAAQ,GACvBD,EAAoB,MAAQ0B,KAC1B,CAAC,EACL,CAAE,aAAc,GAAK,CACtB,EACA,CAAE,UAAW,EAAK,GAGNQ,EAAA,CACZ,qBAAAD,EAAA,CACA,y/FC7PDE,GAAexI,EAAgB,CAC9B,aAAc,GACd,MAAO,CACN,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,EACA,MAAO,CACN,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,YAAa,CACZ,KAAM,QACN,QAAS,EACV,EACA,gBAAiB,CAChB,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACP,CACD,EACA,MAAO,CAAC,gBAAiB,SAAS,EAClC,MAAM6F,EAAO,CACZ,MAAM5C,EAASC,KAET/H,EADiBT,IACK,cAAcmL,EAAM,QAAQ,EAClD4C,EAAalM,GAAcpB,CAAI,EAC/BuN,EAAgB5G,KAChB,CAAE,YAAA6G,EAAa,qBAAAC,CAAA,EAAyBC,GAAe,CAAE,OAAA5F,EAAQ,EAEhE,OACN,cAAAyF,EACA,WAAAD,EACA,YAAAE,EACA,qBAAAC,EACA,GAAGrF,GAAS,EACZ,GAAGuF,GAAW,EAEhB,EACA,SAAU,CACT,GAAG/G,GAAUvH,GAAmBwH,GAAatH,EAAmBJ,EAAU,EAC1E,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,QAAQ,CACvD,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,aAAuB,CAChB,MAAAyO,EAAgB,KAAK,eAAe,aAEzC,YAAK,kBACJ,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,GAAKA,IAAkB,KAAK,KAAK,KAEtF,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,eAAyB,CACpB,OAAC,KAAK,KAGH,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,EAF/C,EAGT,EACA,qBAA+B,CAC9B,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAASC,GACxD,EACA,YAAsB,CACrB,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAASpF,GACxD,EACA,aAAuB,CACtB,OAAO,KAAK,eAAe,yBAAyB,KAAK,QAAQ,CAClE,EACA,mBAA6B,CAC5B,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAASC,GACxD,EACA,mBAA6B,OACrB,OAAC,GAACxB,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,mBAA6B,OAC5B,MAAO,CAAC,GAACA,EAAA,KAAK,WAAL,MAAAA,EAAe,MAAM,SAAS,YACxC,EACA,eAAyB,CACxB,MAAO,GAAQ,KAAK,UAAY,KAAK,SAAS,OAAS4G,GACxD,EACA,sBAAgC,CACzB,MAAAC,EAAmB,KAAK,eAAe,2BACvCC,EAAe,KAAK,eAAe,aAEzC,OACC,KAAK,MACL,CAAC,KAAK,KAAK,UACX,KAAK,eACLD,IACC,CAACC,GAAgBA,IAAiB,KAAK,SAE1C,EACA,8BAAwC,CAEtC,YAAK,aACL,KAAK,eACL,CAAC,KAAK,mBACN,CAAC,KAAK,mBAER,EACA,WAAqB,OACb,UACN9G,EAAA,KAAK,OAAL,MAAAA,EAAW,SAAW,KAAK,KAAK,OAAO,YAAc,KAAK,KAAK,OAAO,aAExE,EACA,cAAuB,CACtB,GAAI,KAAK,qBACD,SAGR,GAAI,KAAK,eAAiB,KAAK,KAAK,SAC5B,YAAK,QAAQ,SAAS,4BAA4B,EAGtD,QAAK,eAAiB,KAAK,UAAW,CACnC,MAAA+G,EAAa,KAAK,SAAS,WACjC,OAAIA,GAAcA,EAAW,OAAS,KAAK,SACnC,KAAK,QAAQ,SAAS,yBAAyB,EAGhD,KAAK,QAAQ,SAAS,mCAAmC,CACjE,CAEA,OAAI,KAAK,iBAAmB,CAAC,KAAK,YAC1B,KAAK,QAAQ,SAAS,oCAAoC,EAG3D,EACR,EACA,aAAsB,OACjB,YAAK,sBAAwB,KAAK,6BAC9B,KAAK,QAAQ,SAAS,2BAA2B,EAGrD,KAAK,MACD,KAAK,MAGT,KAAK,WACD,KAAK,QAAQ,SAAS,sBAAsB,EAGhD,KAAK,cACD,KAAK,QAAQ,SAAS,gCAAgC,EAG1D,KAAK,kBACD,KAAK,QAAQ,SAAS,sBAAsB,EAGhD,KAAK,oBAAqB/G,EAAA,KAAK,WAAL,MAAAA,EAAe,oBACrC,KAAK,QAAQ,SAAS,wBAAwB,EAG/C,KAAK,QAAQ,SAAS,sBAAsB,CACpD,CACD,EACA,QAAS,CACR,MAAM,uBAAwB,CACzB,IACH,MAAM,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,QAClEgH,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,yCAAyC,CAAC,EACtF,MACD,CACD,EAEA,MAAM,SAAU,CAEX,QAAK,YAAe,KAAK,aAAe,KAAK,SAAS,eAAe,OAAO,EAC1E,cAAS,kBAAkB,IAAI,EACpCC,GAAiB,KAAK,UAAU,UACtB,KAAK,qBACf,MAAM,KAAK,gCACD,KAAK,6BACf,MAAM,KAAK,uBACX,KAAK,MAAM,eAAe,MACpB,CACN,IAAIC,EAAwB,GAiB5B,GAhBI,KAAK,WAAW,QAAQ,QAS3BA,EARsB,MAAM,KAAK,QAChC,KAAK,QAAQ,SAAS,yCAAyC,EAC/D,KAAK,QAAQ,SAAS,mCAAmC,EACzD,CACC,kBAAmB,KAAK,QAAQ,SAAS,qCAAqC,EAC9E,iBAAkB,KAAK,QAAQ,SAAS,oCAAoC,CAC7E,KAEyCC,GAEtCD,GAAyB,KAAK,MAC5B,gBAAW,UAAU,yBAAyB,GAIjD,CAAC,KAAK,WAAW,QAAQ,OAASA,EAAuB,CAC5D,MAAME,EAAmB,CACxB,UAAW,KAAK,SAAW,KAAK,SAAS,KAAO,KAChD,YAAa,KAAK,eAAe,WACjC,OAAQ,KAAK,gBACb,SAAU,KAAK,SAAS,SAEpB,gBAAW,MAAM,mCAAoCA,CAAgB,EAC1E,MAAM,KAAK,cAAc,IAAI,4BAA6BA,CAAgB,EAE1E,MAAM,KAAK,YAAY,CACtB,gBAAiB,KAAK,SACtB,OAAQ,4BACR,EACD,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CACD,CACD,CAAC,qDAtRAtJ,EAoBM,eAnBQ,OAAAC,EAAkB,EAAAC,EAAA,YAAAK,EAAagJ,EAAY,oBAC5C,SAAO,CAAAnJ,EAAA,8BAHrBQ,EAmBS,WAAAG,EAAAX,EAAA,2BAZLO,EAWE,KAAAC,EATS4I,MAAW,MAAAjJ,EACVkJ,EAAcF,GAAYnJ,EAAA,QACpC,QAAOsJ,EAAW,cAAAtJ,EAAA,uBAAAA,EAAA,6BAClB,SAAMuJ,EAAI,YAAAvJ,EAAA,aACV,MAAMwJ,cACN,KAAIxJ,EAAGyJ,KACP,KAAAzJ,EAAA,KACA,KAAK,CAAAA,EAAG0J,sBAAgBC,GAAQ,SAAQ,eACxC,yBAAc3J,EAAA,kBAAAA,EAAA,iBAAAA,EAAA,gLAjBpB,2DC4OA4J,GAAenK,EAAgB,CAC9B,KAAM,eACN,WAAY,CACX,UAAAoK,GACA,gBAAAC,GACA,mBAAAC,GACA,iBAAAC,GACA,aAAAC,GACA,kBAAAC,GACA,kBAAAC,EACD,EACA,OAAQ,CACP,MAAM3E,EAAcC,KACd0C,EAAgB5G,KAChB,CAAE,YAAA6I,GAAgBpH,KAEjB,OACN,cAAAmF,EACA,YAAA3C,EACA,YAAA4E,CAAA,CAEF,EACA,SAAU,CACT,GAAG5I,GACF6I,GACApQ,GACAwH,GACA1H,GACAuQ,GACAnQ,EACAoQ,EACD,EACA,YAAsB,CACd,YAAK,UAAY,KAAK,oBAC9B,EACA,cAAwB,CACnB,QAAK,UAAY,KAAK,KAAM,CACzB,MAAArE,EAAW,KAAK,eAAe,mBAAmB,EAClDsE,EAAetE,EAAS,QAAQ,KAAK,KAAK,IAAI,EAC9CuE,EAAShD,GAA0BvB,EAAUsE,EAAe,KAAK,QAAQ,EAG3E,IAFeE,GAA+BD,CAAM,EAExC,SAASnI,EAAmB,IAAI,GAAK,CAAC,KAAK,cACnD,QAET,CAEO,YAAK,YAAc,KAAK,oBAChC,EACA,cAAuB,CACtB,GAAI,KAAK,SAAU,CAClB,MAAMqI,EAAgB,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EAE5D,YAAK,QAAQ,WAAW,CAC9B,IAAK,WAAWA,CAAa,eAC7B,SAAU,KAAK,SAAS,KACxB,CACF,CAEO,QACR,EACA,kBAA6B,CAC5B,OAAK,KAAK,KACH,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,EADlC,EAExB,EACA,eAAwB,CACvB,OAAO,KAAK,IAAI,GAAG,KAAK,gBAAgB,CACzC,EACA,qBAA+B,OAC9B,MAAO,GAAC7I,EAAA,KAAK,OAAL,MAAAA,EAAW,cAAe,KAAK,gBAAkB,KAAK,KAAK,WACpE,EACA,gBAAyB,CACxB,MAAI,CAAC,KAAK,UAAY,KAAK,SAAS,OAC5B,KAAK,QAAQ,SAAS,yBAAyB,EAGnD,KAAK,oBACD,KAAK,QAAQ,SAAS,qBAAqB,EAG5C,KAAK,QAAQ,SAAS,6BAA8B,CAC1D,YAAa,CAAE,QAAS,KAAK,cAAc,UAAW,EACtD,CACF,EACA,qBAA8B,OACzB,IAAAA,EAAA,KAAK,WAAL,MAAAA,EAAe,YAAa,CAC/B,MAAM6I,EAAgB,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EAE5D,YAAK,QAAQ,WAAW,CAC9B,IAAK,WAAWA,CAAa,eAC7B,SAAU,KAAK,SAAS,YACxB,MAEM,aAAK,QAAQ,SAAS,iCAAiC,CAEhE,EACA,aAAsB,CACjB,OAAC,KAAK,KAIH,CACN,mBAAoB,KAAK,KAAK,OAJvB,EAMT,EACA,MAAuB,CACtB,OAAO,KAAK,SAAS,UACtB,EACA,mBAAuC,CACtC,OAAO,KAAK,WAAW,OAAQC,GACvBA,EAAK,aACZ,CACF,EACA,uBAA2C,CAC1C,OAAO,KAAK,WAAW,OAAQA,GACvB,CAACA,EAAK,aACb,CACF,EACA,YAAgC,CAC3B,YAAK,WAAa,KACd,GAGD,KAAK,SAAS,UACtB,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,iBAA2B,OACnB,OAAA3I,IAAuBH,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAI,CAC9C,EACA,eAAyB,OACxB,OAAO,KAAK,eAAe,eAAcA,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAI,CACzD,EACA,mBAA4B,CAC3B,OAAO,KAAK,iBAAiB,qBAAqB,GAAG,KAAK,eAAe,UAAU,EAAE,CACtF,EACA,sBAAgC,CACxB,YAAK,mBAAmB,OAAS,CACzC,EACA,iBAAqC,CAC7B,cAAO,OAAO,KAAK,eAAe,eAAe,EAAE,OAAQ+I,GAAe,OACzE,cAAO,SAAO/I,EAAA,KAAK,OAAL,YAAAA,EAAW,cAAe,EAAE,EAAE,KAAMgJ,GACjDA,EAAe,KAAOD,EAAW,EACxC,EACD,CACF,EACA,qBAA8B,CACvB,MAAAA,EAAa,KAAK,gBACrB,OAAO,OAAO,KAAK,eAAe,EAAE,KAAMA,GACnCA,EAAW,KAAO,KAAK,mBAAmB,CAAC,CAClD,EACA,OAEI,YAAK,iBAAiB,uBAAuBA,CAAU,CAC/D,CACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACP,EACA,QAAS,CACR,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,QACN,QAAS,EACV,EACA,mBAAoB,CACnB,KAAM,MACN,QAAS,IAAM,CAAC,CACjB,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,WAAY,CACX,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,UAAW,GACX,UAAW,KACX,UAAW,SACX,WAAY,CACX,MAAO,UACP,iBAAkB,GAClB,YAAa,GACb,YAAa,GACb,QAAS,eACT,YAAa,GACb,SAAU,EACV,iBAAkB,IAClB,MAAO,GACP,WAAY,CAAC,CACd,EACA,sBAAuB,GAEvB,aAAc,CAAC,EACf,sCAAA1I,GACA,sBAAA4I,GACA,sBAAAC,GACA,mBAAoB,CAAC,EAEvB,EACA,MAAO,CACN,KAAKC,EAASC,EAAS,CACtB,KAAK,cAAc,CACpB,CACD,EACA,SAAU,OACT,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACnBpJ,EAAA,KAAK,WAAL,MAAAA,EAAe,GAAG,eAAgB,KAAK,cAEvC,KAAK,YAAY,0BAA0B,KAAK,KAAiB,KAAK,QAAQ,EAC3DqJ,GAAA,GAAG,wBAAyB,KAAK,qBAAqB,CAC1E,EACA,eAAgB,QACfrJ,EAAA,KAAK,WAAL,MAAAA,EAAe,IAAI,eAAgB,KAAK,cACrBqJ,GAAA,IAAI,wBAAyB,KAAK,qBAAqB,CAC3E,EACA,QAAS,CACR,sBAAsBC,EAAqC,CACtD,IACH,KAAK,aAAa,CACjB,KAAM,KAAK,KAAK,KAChB,KAAM,aACN,MAAOA,CAAA,CACP,OACM,CAAC,CACV,EACA,qBAAqBxQ,EAAc,CAC7B,WAAM,qBAAsBA,CAAI,CACtC,EACA,4BAA4BA,EAAc6L,EAAiC,CACrE,WAAM,4BAA6B7L,EAAM6L,CAAc,CAC7D,EACA,yBAA0B,CACrB,CAAC,KAAK,MAAQ,CAAC,KAAK,eAAe,eAAe,KAAK,KAAK,IAAI,IAE/D,wBAAmB,KAAK,aAAa,EACrC,2BAAsB,QAAS4E,GAAc,CAC5C,wBAAmB,KAAKA,EAAU,IAAI,EAC3C,EAED,KAAK,eAAe,gBAAgB,KAAK,KAAK,KAAM,EAAK,EAC1D,EACA,kBAAmB,CACd,KAAK,cAAgB,CAAC,KAAK,eAC9B,KAAK,aAAa,KAEhB,CACC,YAAa,KAAK,QAAQ,SAAS,2CAA2C,EAC9E,KAAM,mBACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,2CAA2C,CAC/E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,mCAAmC,EACtE,KAAM,WACN,KAAM,SACN,YAAa,CACZ,SAAU,EACV,SAAU,CACX,EACA,QAAS,EACT,eAAgB,CACf,KAAM,CACL,YAAa,CAAC,EAAI,CACnB,CACD,EACA,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,mCAAmC,CACvE,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,2CAA2C,EAC9E,KAAM,mBACN,KAAM,SACN,YAAa,CACZ,SAAU,EACV,SAAU,GACX,EACA,QAAS,IACT,eAAgB,CACf,KAAM,CACL,YAAa,CAAC,EAAI,CACnB,CACD,EACA,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,2CAA2C,CAC/E,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,kCAAkC,EACrE,KAAM,UACN,KAAM,UACN,QAAS,CACR,CACC,KAAM,KAAK,QAAQ,SAClB,uDACD,EACA,MAAO,eACP,YAAa,KAAK,QAAQ,SACzB,uDACD,CACD,EACA,CACC,KAAM,KAAK,QAAQ,SAClB,gEACD,EACA,MAAO,wBACP,YAAa,KAAK,QAAQ,SACzB,gEACD,CACD,EACA,CACC,KAAM,KAAK,QAAQ,SAClB,8DACD,EACA,MAAO,sBACP,YAAa,KAAK,QAAQ,SACzB,8DACD,CACD,CACD,EACA,QAAS,eACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,kCAAkC,CACtE,CACD,EAGF,KAAK,aAAa,KAEhB,CACC,YAAa,KAAK,QAAQ,SAAS,gCAAgC,EACnE,KAAM,QACN,KAAM,SACN,YAAa,CACZ,KAAM,CACP,EACA,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,gCAAgC,CACpE,EACA,CACC,YAAa,KAAK,QAAQ,SAAS,sCAAsC,EACzE,KAAM,cACN,KAAM,UACN,QAAS,GACT,iBAAkB,GAClB,YAAa,KAAK,QAAQ,SAAS,sCAAsC,CAC1E,CACD,CAEF,EACA,gBAAgBC,EAAuB,CACtC,KAAK,mBAAqB,KAAK,mBAAmB,OAAQpE,GAASA,IAASoE,CAAa,CAC1F,EACA,oBAAqB,CACpB,KAAK,mBAAqB,GAC1B,KAAK,MAAM,UAAU,CACtB,EACA,eAAgB,OACf,KAAK,mBAAqB,IACzBxJ,EAAA,KAAK,MAAM,iBAAX,MAAAA,EAAsE,uBACvE,KAAK,MAAM,SAAS,CACrB,EACA,SAASoF,EAAcqE,EAA2B,CAC3C,MAAAC,EAAYtE,EAAK,MAAM,GAAG,EAC5B,IAAAuE,EAAmCD,EAAU,MAE7CE,EAAU,GACd,GAAID,IAAiB,QAAaA,EAAa,SAAS,GAAG,EAAG,CAEvD,MAAAE,EAAgBF,EAAa,MAAM,gBAAgB,EACrDE,IACOH,EAAA,KAAKG,EAAc,CAAC,CAAC,EAC/BF,EAAeE,EAAc,CAAC,EACpBD,EAAA,GAEZ,CAGI,GAAAF,EAAU,SAAW,EAExB,GAAID,IAAU,KAAM,CAEb,MAAE,CAACE,CAAY,EAAGG,EAAkB,GAAGC,GAAwB,KAAK,WAC1E,KAAK,WAAaA,CAAA,MAGlB,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACJ,CAAsB,EAAGF,CAAA,UAKxBA,IAAU,KAAM,CAEnB,IAAIO,EAAYC,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EAIxD,KAAM,CAAE,CAACC,CAAY,EAAGG,EAAkB,GAAGC,GAAwBC,EAGjE,GAFQA,EAAAD,EAERH,GAAYI,EAAgC,SAAW,EAAG,CAG7DL,EAAeD,EAAU,MACzBM,EAAYC,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACpD,KAAM,CAAE,CAACC,CAAY,EAAGO,EAAuB,GAAGC,GACjDH,EACWA,EAAAG,CACb,OAGI,OAAOV,GAAU,SACpBW,GACCH,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACxCC,EACAU,GAASZ,CAAK,GAGfW,GACCH,GAAI,KAAK,WAAYP,EAAU,KAAK,GAAG,CAAC,EACxCC,EACAF,CAAA,EAMJ,KAAK,WAAa,CAAE,GAAG,KAAK,UAAW,CACxC,EACA,mBAAmBa,EAAqD,CAElE,oBAAe,qBAAqBA,CAAiB,EAE1D,MAAMxR,EAAO,KAAK,eAAe,cAAcwR,EAAkB,IAAI,EAEjExR,GAEE,iBAAY,2BAA2BA,CAAI,EAG5C,KAAK,cAAc,IAAI,kCAAmC,CAAE,kBAAAwR,EAAmB,CACrF,EACA,YAAYlF,EAAc,CACrB,KAAK,MACH,kBAAa,kBAAkB,IAAImF,GAAkB,KAAK,KAAK,KAAMnF,CAAI,CAAC,EAGhF,KAAK,aAAa,CACjB,MAAOA,EACP,KAAM,OACN,CACF,EACA,aAAaoF,EAAmC,WAC3C,IAAAC,EAEAD,EAAc,eAAe,OAAO,EAEvCC,EAAWD,EAAc,MAGzBC,EAAWR,GAAI,KAAK,WAAYO,EAAc,IAAI,EAInD,MAAME,EAAiBF,EAAc,QAAQxK,EAAA,KAAK,OAAL,YAAAA,EAAW,MAClDlH,EAAO,KAAK,eAAe,cAAc4R,CAAc,EAE7D,GAAI5R,IAAS,KAST,GALA0R,EAAc,OAAS,WAE1B,KAAK,MAAM,gBAAgB,EAGxBA,EAAc,OAAS,OAAQ,CAIlC,MAAMG,EAAW,CAChB,MAAOF,EACP,SAAUC,EACV,KAAMF,EAAc,MAEhB,WAAM,eAAgBG,CAAQ,UACzBH,EAAc,OAAS,aAAc,CAC/C,MAAMvR,EAAW,KAAK,eAAe,YAAYH,EAAK,KAAMA,EAAK,WAAW,EAC5E,GAAI,CAACG,EACJ,OAID,IAAI2R,EAAiBC,GACpB5R,EAAS,WACTH,EAAK,WACL,GACA,GACAA,CAAA,EAGD,MAAMgS,EAAoB,OAAO,OAAO,GAAIF,CAAc,EAI1DA,EAAiBP,GAASO,CAAc,EAExC,UAAWpB,KAAiB,OAAO,KAAKgB,EAAc,KAAK,EAAG,CAElDC,EAAAD,EAAc,MAAMhB,CAAa,EAItC,MAAAuB,EAAgBvB,EAAc,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAI1DwB,EAAqBD,EAAc,MAAM,gBAAgB,EAI/D,GAAIP,EAAchB,CAAa,IAAM,QAAawB,IAAuB,KAAM,CAExE,MAAAC,EAAOD,EAAmB,CAAC,EAC3B3N,EAAQ2N,EAAmB,CAAC,EAC5BE,EAAOjB,GAAIW,EAAgBK,CAAI,EAEjC,MAAM,QAAQC,CAAI,IACrBA,EAAK,OAAO,SAAS7N,EAAO,EAAE,EAAG,CAAC,EAC9B+M,GAAAQ,EAA0BK,EAAMC,CAAI,EACzC,MAEIT,IAAa,OAChBU,GAAMP,EAA0BG,CAAa,EAEzCX,GAAAQ,EAA0BG,EAAeN,CAAQ,EAIlD,KAAK,cAAc,IAAI,4BAA6B,CACxD,cAAAM,EACA,SAAAN,EACA,WAAY,KAAK,WACjB,kBAAAK,CAAA,CACA,CACF,CAIAF,EAAiBC,GAChB5R,EAAS,WACT2R,EACA,GACA,GACA9R,CAAA,EAGD,UAAWsS,KAAO,OAAO,KAAKR,CAAwB,EACjDA,GAAkBA,EAAeQ,CAAG,IAAM,MAAQR,EAAeQ,CAAG,IAAM,QAC7E,KAAK,SAAS,cAAcA,CAAG,GAAIR,EAAeQ,CAAG,CAAW,EAIlE,GAAIR,EAAgB,CACnB,MAAMN,EAAwC,CAC7C,KAAMxR,EAAK,KACX,MAAO8R,CAAA,EAGH,oBAAe,kBAAkBN,CAAiB,EAElD,iBAAY,gCAAgCxR,EAAK,IAAI,EACrD,iBAAY,iCAAiCA,EAAK,IAAI,CAC5D,CACU,SAAA0R,EAAc,KAAK,WAAW,aAAa,EAAG,CAGxD,MAAMvR,EAAW,KAAK,eAAe,YAAYH,EAAK,KAAMA,EAAK,WAAW,EAC5E,GAAI,CAACG,EACJ,OAIAuR,EAAc,MACd,KAAK,eAAe,wBAAwB1R,EAAK,IAAI,KACrD2E,EAAA4N,GAA0BpS,EAAS,IAAI,IAAvC,MAAAwE,EAA0C,WAAW,SAAS+M,EAAc,UAC5EzK,EAAAsL,GAA0BpS,EAAS,IAAI,IAAvC,MAAA8G,EAA0C,eAAe,SAASyK,EAAc,SAEhF,KAAK,eAAe,wBAAwB1R,EAAM,CAAE,yBAA0B,GAAM,EACpF,KAAK,YAAY,CAChB,KAAM,UACN,MAAO,KAAK,QAAQ,SAAS,kCAAkC,EAC/D,QAAS,KAAK,QAAQ,SAAS,oCAAoC,EACnE,GAIF,IAAI8R,EAAiBC,GACpB5R,EAAS,WACTH,EAAK,WACL,GACA,GACAA,CAAA,EAED,MAAMgS,EAAoB,OAAO,OAAO,GAAIF,CAAc,EAI1DA,EAAiBP,GAASO,CAAc,EAIlC,MAAAG,EAAgBP,EAAc,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAI/DQ,EAAqBD,EAAc,MAAM,gBAAgB,EAG/D,GAAIP,EAAc,QAAU,QAAaQ,IAAuB,KAAM,CAE/D,MAAAC,EAAOD,EAAmB,CAAC,EAC3B3N,EAAQ2N,EAAmB,CAAC,EAC5BE,EAAOjB,GAAIW,EAAgBK,CAAI,EAEjC,MAAM,QAAQC,CAAI,IACrBA,EAAK,OAAO,SAAS7N,EAAO,EAAE,EAAG,CAAC,EAC9B+M,GAAAQ,EAA0BK,EAAMC,CAAI,EACzC,MAEIT,IAAa,OAChBU,GAAMP,EAA0BG,CAAa,EAEzCX,GAAAQ,EAA0BG,EAAeN,CAAQ,EAIjD,kCAA6BxR,EAAU2R,EAAgB,CAC3D,KAAMG,EACN,MAAON,CAAA,CACP,EAKFG,EAAiBC,GAChB5R,EAAS,WACT2R,EACA,GACA,GACA9R,CAAA,EAGD,UAAWsS,KAAO,OAAO,KAAKR,CAAwB,EACjDA,GAAkBA,EAAeQ,CAAG,IAAM,MAAQR,EAAeQ,CAAG,IAAM,QAC7E,KAAK,SAAS,cAAcA,CAAG,GAAIR,EAAeQ,CAAG,CAAW,EAKlE,MAAMd,EAAwC,CAC7C,KAAMxR,EAAK,KACX,MAAO8R,CAAA,EAGH,oBAAe,kBAAkBN,CAAiB,EAElD,KAAK,cAAc,IAAI,4BAA6B,CACxD,cAAAS,EACA,SAAAN,EACA,WAAY,KAAK,WACjB,kBAAAK,CAAA,CACA,EAEI,iBAAY,gCAAgChS,EAAK,IAAI,EACrD,iBAAY,iCAAiCA,EAAK,IAAI,EAC3D,KAAK,WAAW,gCAAgCG,EAAS,KAAMuR,CAAa,MACtE,CAIN,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACA,EAAc,IAAI,EAAGC,CAAA,EAIvB,MAAMH,EAAoB,CACzB,KAAMxR,EAAK,KACX,IAAK0R,EAAc,KACnB,MAAOC,CAAA,EAGH,oBAAe,aAAaH,CAAiB,CACnD,CACD,EASA,6BACCrR,EACAqS,EACAC,EACC,CACQtS,EAAA,WAAW,QAASuS,GAAS,SACrC,MAAMC,EAAiBD,EAAK,eAExB,KAACF,GAAA,MAAAA,EAAqB,eAAeE,EAAK,QAAS,CAACC,GAAkB,CAACD,EAAK,QAC/E,OAGD,MAAME,GAAgB1L,EAAAyL,EAAe,OAAf,YAAAzL,EAAsBuL,EAAiB,MACvDI,GAAgBlO,EAAAgO,EAAe,OAAf,YAAAhO,EAAsB8N,EAAiB,MACzD,GAAAG,IAAkB,QAAaC,IAAkB,OACpD,OAGD,IAAIC,EAAkB,GAGlBC,GAA8BL,EAAK,OAAO,GAAKM,GAAsBN,EAAK,OAAO,EAClEI,EAAA,OAAO,KAAKN,CAAmB,EAAE,MACjDF,IAASI,EAAK,SAAW,IAAI,KAAMO,GAAWA,EAAO,OAASX,CAAG,IAAM,QAE/DY,GAA2BR,EAAK,OAAO,IAC/BI,EAAA,CAAC,CAACJ,EAAK,QAAQ,KAC/BO,GAAWA,EAAO,QAAUT,EAAoBE,EAAK,IAAI,IAIxD,CAACI,GAAmBK,GAAiBX,EAAqBE,EAAM,KAAK,IAAI,GACtEL,GAAAG,EAA+BE,EAAK,IAAI,CAC/C,CACA,CACF,EAIA,eAAgB,CAEX,IAAC,KAAK,KAAM,CACf,KAAK,sBAAwB,GAC7B,MACD,CAEI,QAAK,WAAa,KAAM,CAC3B,KAAK,UAAY,GAEjB,MAAMU,EAAoB,GACtB,KAAK,KAAK,QACbA,EAAkB,KAAK,OAAO,EAC9B,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,MAAO,KAAK,KAAK,QAIf,KAAK,KAAK,QACbA,EAAkB,KAAK,OAAO,EAC9B,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,MAAO,KAAK,KAAK,QAIf,KAAK,KAAK,mBACbA,EAAkB,KAAK,kBAAkB,EACzC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,iBAAkB,KAAK,KAAK,mBAI1B,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,iBACbA,EAAkB,KAAK,SAAS,EAChC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,QAAS,0BAIP,KAAK,KAAK,UACbA,EAAkB,KAAK,SAAS,EAChC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,QAAS,KAAK,KAAK,UAIjB,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,cACbA,EAAkB,KAAK,aAAa,EACpC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,YAAa,KAAK,KAAK,cAIrB,KAAK,KAAK,WACbA,EAAkB,KAAK,UAAU,EACjC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,SAAU,KAAK,KAAK,WAIlB,KAAK,KAAK,mBACbA,EAAkB,KAAK,kBAAkB,EACzC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,iBAAkB,KAAK,KAAK,mBAKnB,UAAAC,KAAe,KAAK,aACzBD,EAAkB,SAASC,EAAY,IAAI,IAE/C,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,CAACA,EAAY,IAAI,EAAGA,EAAY,UAKnC,KAAK,WAAa,CACjB,GAAG,KAAK,WACR,WAAY9B,GAAS,KAAK,KAAK,UAAU,EAC1C,MAEA,KAAK,UAAY,GAGlB,KAAK,sBAAwB,EAC9B,EACA,uBAAuB5Q,EAAmB,CACpCA,EAAM,OAAmB,YAAc,KACtC,gBAAW,MAAM,iCAAkC,CACvD,OAAQ,yBACR,CAEH,EACA,iCAAkC,SAC5B,gBAAW,MAAM,6BAA8B,CACnD,OAAQ,4BACR,cAAcuG,EAAA,KAAK,OAAL,YAAAA,EAAW,KAAK,MAAM,KAAK,GACzC,WAAWvC,EAAA,KAAK,OAAL,YAAAA,EAAW,KACtB,CACF,EACA,iBAAkB,CACjB,KAAK,MAAM,eAAe,CAC3B,EACA,cAAe,CACd,KAAK,UAAY,UAClB,CACD,CACD,CAAC,yKA3nCDsE,GAAA,QAsCiCC,GAAM,kCAtCvCC,GAAA,+CAAAC,GAAA,2BAAAC,GAAA,uBAgFgCC,GAAM,CAA0B,wEAkCbe,GAAM,8BAQpDiJ,GAAM,CACN,4FA+ByB/J,GAAa,qVAzJ1CvE,EA8KM,oCA7KoD,MAAAG,EAAA,oBAIjD,SAAAC,EAAA,WAER,UA6BMC,EAAA,KAAAA,EAAA,GAAAgB,GAAA,6BA5BL,MAAAlB,EAqBMC,EArBN,OAqBM,kBApBL4D,GAOa,CAAA5D,EAjBjB,UAYsBc,EAAAqN,EAAA,CAChB,MACA,kBACA,cAAW3T,YACX,YAAAwF,EAAA,qBAAAA,EAAA,WAhBN,sBAAAA,EAAA,mCAkB2B,YAAvB,qCAAAe,EAAA,OAUGf,EAAA,cAAAH,EAAA,EAAAC,EAAA,MAAA+D,GAAA,CA5BP,CAAA7D,EAAA,SAAAA,EAAA,MAAAA,EAAA,WAAAH,EAAA,IAqBmBuO,EAAqB,CACjC,MACA,eAAUC,sBACX,YAAYrO,EAAA,UACZ,SAA6BA,EAAA,8BAAAA,EAAA,cAC5B,aACA,mBAAgBsO,uCA3BvB,gBAAAtO,EAAA,iFAAAe,EAAA,UAgCUnG,EAAQ2T,GAAS,MAhC3BvO,EAAA,MAAAA,EAAA,WAAAH,EAAA,EAiCa2O,EAASC,EAAA,CAjCtB,MAkCK,WAASzO,EAAEjF,UACX,sBAAU2T,EAAO,KAAAzO,EAAA,GAAAmB,GAAApB,EAAA,UAAAoB,GAAA,YAAApB,EAAA,SAnCtB,WAAAA,EAAA,wDAsCapF,EAAS2T,GAAS,UAC5B,MAvCH,CAAAvO,EAAA,WAAAH,IAAAC,EAuCcc,MAAOkD,GAAW,CAAAtD,EAAA,KAC5B,MAAAT,EAAiDC,EAA9B,sBAEpBG,EAIMoE,EAAA,8BAHL,KAAsB/D,EAAA,MAAAuD,GAAA,CAAA5D,EAAOe,EAAW,CAAC,+BA3C7C,yBAAAR,EAAAC,EAAAX,EAAA,qEA+Cc2O,KA/Cd3O,EAAA,iBAAAH,IAAAC,EA+CuCc,MAAO,OAC1C,MAAAb,EAcMC,EAdN,OAcM,wBAZIQ,EAAA,MAAAwD,GAAA,CACE7D,EAAAyO,EAAA,CACT,QAAOC,2DAEG,QAAM7O,EAAA,yBAEV,OAAAO,EAAA,KACUC,EAAA,2CACIR,EA1D3B,2CAAAW,EAAAX,EAAA,2BAAA8O,EAAA,SAoEe,iBAHFC,gDAjEb,QAAA/O,EAAA,iDAAAU,EAAAC,EAAAX,EAAA,gFAsEG,uBAtEH,CAsE0B,IAAAH,IAAAiB,EAAA8N,EAAA,CAA2C,IAAI,qDAC1D,oBAEJrO,EAAEwK,KACQvK,EAAA,KA1ErB,KAAAR,EAAA,uIAAAiE,EAAA,WAgFE,GAAAlD,EAAA,OAAAf,EAAA,MAEQgP,EAML,WAAAnP,EAAA,EAAAC,EAAA,MAAAoE,GAAA,CAAAlE,EAxFL,sBAmFYH,IAAAiB,EAAAmO,EAAA,CAAQtF,IAAQ,UAAA3J,EAAA,iGAMzB,uBACCe,EAAmD,OAAAmO,EAA9BtU,EAAI,YAAAuF,EAAYgP,EAAU,MAAAnP,EAAA,KAGxCoP,uCADP,WAqBqB,GAjHzBpP,EAAA,uBAAAH,IA8FkBwP,EAAqBC,EAAA,CACjC,MACA,WAAaC,wBACb,cAAY,GACZ,cAAAvP,EAAA,WACD,eAAKA,EAAY,WAChB,uBAAewP,qBACf,kBACA,eAAcxP,EAAEyP,6CAtGtB,gBAgHOzP,EAAA,kBAPI,QAAAO,EAAE3F,IAAI,CAAAuF,EACA3F,EAAU,CACpB,KAAQwF,EAAA,KACR,SAAa0P,aACb,cACA,cAAa1P,EAAEwP,mBAAY,wBAC3B,qBAAMC,2EA/Gb,kIAkH2C,eAAvC,0EAAA1O,EAAA,OACCf,EAAA,sBAEW,gBAD6DF,EAAA,MAAAmF,GAAA,CAAA9E,EApH7Ee,EAoHSyI,qBApHTjJ,EAAAC,EAAAX,EAAA,8EAwHI,GAAAe,EAAA,OAAAf,EAKC,oCAMEA,EALO,aAAAH,IAAAC,EAAA,MAAAoO,GAAA,CAAUvE,EAAgBsF,EAAA,SAAAjP,EAAA,iHA9HxC,sBAyFyB,GAAAe,EAAA,oBA6CtB,YA+BM,cA7BS4O,EAAiB,YAAAxP,EAC7BmP,EAAuB,CACvB,WAAc9U,oBACd,cAAAwF,EAAA,WACD,eAAKA,EAAY,WAChB,uBAAewP,qBACf,iCAAAxP,EAAA,aAEF,gBASEA,EAAA,iBARA,OAAU,cAAE4P,cAAY,2EAAAzP,EACxBmP,EAAiB,CACjB,WAAaC,eACb,cAAY,GACZ,cAAAvP,EAAA,WACD,eAAOA,EAAA,WACN,uBAAewP,qBACf,uBAAAxP,EAAA,aAEF,gBAUMA,EAAA,iBApKV,mCA4JM2J,eAAgB,4DAAAnJ,EAAA,MAAA2D,GAAA,CAAmEpJ,EAAU4F,EAAWX,EAAA,6CAA8BpF,4DAOvI,SAAAoF,EAAA,kBAAAA,EAAA,wHAnKL,QAuKE,GAME,IAAAA,EA7KJ,UAyKuBc,EAAA+O,EAAA,CACnB,MACA,qBACA,YAAA7P,EAAA,0BAAAA,EAAA,qBA5KJ,4BAAAA,EAAA,6BA8KE,KAAgC,sCAAX8P,6BAAO,IAAA/O,EAAA,oJCvJ9BgP,GAAetQ,EAAgB,CAC9B,KAAM,YACN,MAAO,CACN,SAAU,CACT,KAAM,OACP,EACA,KAAM,CACL,KAAM,MACP,EACA,KAAM,CACL,KAAM,MACP,EACA,IAAK,CACJ,KAAM,OACN,QAAS,KACV,EACA,cAAe,CACd,KAAM,MACP,CACD,EACA,MAAO,CACN,MAAMuQ,EAAoB,CACzB,EAAG,KACH,EAAG,MAGG,OACN,WAAY,GACZ,kBAAAA,EACA,WAAY,KACZ,eAAgB,CACf,UAAW,aAAaA,EAAkB,CAAC,OAAOA,EAAkB,CAAC,KACtE,EACA,iBAAkB,EAEpB,EACA,SAAU,CACT,GAAGxO,GAAUC,EAAW,EACxB,SAAmB,CAClB,OAAO,KAAK,SAAS,gBACtB,EACA,gBAAoC,CACnC,OAAO,KAAK,SAAS,kBACtB,CACD,EACA,QAAS,CACR,mBAAoB,CACnB,KAAK,eAAiB,CACrB,UAAW,aAAa,KAAK,kBAAkB,CAAC,OAAO,KAAK,kBAAkB,CAAC,MAEjF,EACA,YAAY,EAAe,WAY1B,GAXI,KAAK,WAIT,KAAK,WAAa,EAAE,OAChB,KAAK,iBAAiBK,EAAA,KAAK,WAAW,UAAhB,YAAAA,EAAyB,UAAW,KAAK,gBAC7D,gBAAa,KAAK,WAAW,QACjC,iBAAiB,KAAK,aAAa,OAIjC,KAAK,iBAAiBD,GAAAtC,EAAA,KAAK,aAAL,YAAAA,EAAiB,UAAjB,YAAAsC,EAA0B,UAAW,KAAK,eACnE,OAGD,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAElB,KAAK,WAAa,GAClB,KAAK,kBAAoB,CAAE,EAAG,EAAE,MAAO,EAAG,EAAE,OAC5C,KAAK,kBAAkB,EAEhB,wBAAiB,YAAa,KAAK,MAAM,EACzC,wBAAiB,UAAW,KAAK,SAAS,EAGjD,MAAMoO,EAAgB,SAAS,cAC3BA,GACHA,EAAc,KAAK,CAErB,EACA,OAAO,EAAe,OAIrB,GAHA,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAEd,MAAK,SAIL,KAAC,KAAK,WAAY,CACrB,KAAK,WAAa,GAEZ,MAAAjD,EACL,KAAK,eAAiB,KAAK,WAAa,KAAK,WAAW,QAAQ,MAAQ,KAAK,MAAQ,GACtF,KAAK,SAAS,uBAAuB,CACpC,KAAM,KAAK,KACX,KAAMA,GAAQ,GACd,aAAYlL,EAAA,KAAK,aAAL,YAAAA,EAAiB,0BAA2B,KACxD,EAEI,WAAM,YAAa,KAAK,UAAU,EAC9B,cAAK,MAAM,OAAS,UAC9B,CAEK,sBAAmB,OAAO,sBAAsB,IAAM,CACtD,KAAK,SAAW,KAAK,eACnB,uBAAoB,CAAE,EAAG,KAAK,eAAe,CAAC,EAAG,EAAG,KAAK,eAAe,CAAC,CAAE,EAEhF,KAAK,kBAAoB,CAAE,EAAG,EAAE,MAAO,EAAG,EAAE,OAE7C,KAAK,kBAAkB,EAClB,WAAM,OAAQ,KAAK,iBAAiB,EACzC,EACF,EACA,WAAY,CACP,KAAK,WAIA,cAAK,MAAM,OAAS,QACtB,2BAAoB,YAAa,KAAK,MAAM,EAC5C,2BAAoB,UAAW,KAAK,SAAS,EAC7C,4BAAqB,KAAK,gBAAgB,EAEjD,WAAW,IAAM,CACX,WAAM,UAAW,KAAK,UAAU,EACrC,KAAK,WAAa,GAClB,KAAK,WAAa,KAClB,KAAK,SAAS,yBACZ,CAAC,EACL,CACD,CACD,CAAC,sJA1JKoO,GAASlQ,EAAAC,EAAAkQ,EAAAC,EAAAC,EAAAC,EAAA,QACPzQ,EAJR,EAAAiB,EAIaF,GAAkB2P,EAAU,MACtC,oBAAAxQ,EAAA,EAAAC,EAAA,iBAAAA,EAAA,aALH,YAOEA,EAAA,cAEA,QAAAO,EAAA,KAAAiQ,GAAAxQ,EAAA,OACC,UAEM,YAAAA,EAAA,cAAAH,EAAA,EAFkCiB,EAAA2P,GAAA,aAAAvB,EAV3C1O,EAU0D,MAAC,CAAY,IAAK,kBAAAT,EAAAC,EAAA,kBACxE,MAAiE0Q,GAAA1Q,EAAA,qBAAnB2Q,EAAU,0BAAA3Q,EAAA,kDAX5D,yGC+CA4Q,GAAenR,EAAgB,CAC9B,WAAY,CACX,UAAAoR,EACD,EACA,MAAO,CACN,aAAc,CACb,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,CACD,EACA,QAAS,CACR,OAAO,EAA6B,CAC9B,WAAM,OAAQ,CAAC,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CAAC,wSA7CgBrQ,EAAA,YACAA,EAAA,OACAA,EAAA,OACAA,EAAA,OAAAA,EAAA,OAEZA,EAAA,eAEYA,EAAA,YACAA,EAAA,OACAA,EAAA,OACAA,EAAA,OAAAA,EAAA,eAZZ,MAOAsD,GAMM,CAAAF,iEAnCVhE,EAuCY,aArCL,OAAAC,EAAA,IAAEe,EAAoB,CAC3B,KAAI,eACJ,QAAWkQ,EAAW,sBACtB,OAASC,mCAEC,UAAO/Q,EAAA,YACN,QAAAO,EATd,CASmBK,iCAERoQ,EAAW,EAAAhR,EAAA,0BAXtBA,EAAA,aAAAH,IAAAC,EAYgBc,OAAO,OAElB,MAAuCb,EAAA,EAAAC,EAAA,gBAApB,EAAI,GAAC,CAAYA,EAAA,gBAAAuQ,CAAA,KAdzCpQ,EAAAoE,EAAA,oBAgBI,MAAAxD,EAAA,OAAAf,EAhBJ,oBAkBgBY,OAAO,OAElB,MAAwCb,EAAA,EAAAC,EAAA,iBAArB,EAAK,GAAa,CAAAA,EAAA,gBAAAuQ,CAAA,KApB1CpQ,EAAAoE,EAAA,qBAsBI,MAAMxD,EAtBV,GAsBiBH,IAtBjBJ,EAAA,aAAAT,EAAAC,EAAA,mTCsDA,MAAMsF,EAAQC,EACRrL,EAAiBC,IACjBH,EAAiBC,KACjBiM,EAAWhM,EAAe,qBAC1B0L,EAAOC,EAMb,SAASoL,EAAkBC,EAAiC,CAC3D,MAAMC,EAAuB9K,EAAe,MAAM6K,CAAS,EAAE,CAAC,EAC1DC,GACEvL,EAAA,qBAAsBuL,EAAqB,KAAK,IAAI,CAE3D,CAEA,SAASC,EAAUxT,EAAkB,CACpC,GAAIA,EAAE,UAAYA,EAAE,SAAWA,EAAE,SAAWA,EAAE,SAAU,CASvD,MAAMyT,EAPS,CACd,QAAS,YACT,WAAY,aACZ,UAAW,aAIqBzT,EAAE,GAA0B,GAAK,KAC9DyT,GACHJ,EAAkBI,CAAiB,CAErC,CACD,CACA,SAAS9K,EAAmBU,EAA+B,CACnD,OAAAA,EACL,IAAKC,GAAS,CACR,MAAAtM,EAAOV,EAAe,cAAcgN,CAAI,EAC9C,GAAItM,EAAM,CACT,MAAMG,EAAWf,EAAe,YAAYY,EAAK,IAAI,EACrD,GAAIG,EACI,OAAE,KAAAH,EAAM,SAAAG,EAEjB,CACO,WACP,GACA,OAAQE,GAAuBA,IAAM,IAAI,CAC5C,CACM,MAAAoL,EAAiB5L,EAErB,IAAM,CACD,MAAA6W,EAAWhM,EAAM,SAAS,KACzB,OACL,UAA2BiB,EAC3BL,EAAS,cAAcoL,EAAU,cAAc,CAChD,EACC,WAA6B/K,EAAmBL,EAAS,cAAcoL,EAAU,OAAQ,CAAC,CAAC,EAC3F,UAA4B/K,EAAmBL,EAAS,eAAeoL,EAAU,OAAQ,CAAC,CAAC,EAC7F,CACA,EAEKC,EAAmB,CACxB,YACA,aACA,aAEKC,EAAwB,CAC5B,UAA2B,SAC3B,WAA6B,OAC7B,UAA4B,SAG9B,OAAA/S,GAAU,IAAM,CACN,0BAAiB,UAAW2S,EAAW,EAAI,EACpD,EAEDK,GAAgB,IAAM,CACZ,6BAAoB,UAAWL,EAAW,EAAI,EACvD,EACYpJ,EAAA,CACZ,kBAAAiJ,CAAA,CACA,4iCC3EKS,GAAc,GACdC,GAAqB,GACrBC,GAAkB,IAClBC,GAAc,IACdC,GAAoB,IAEpBC,GAAmD,CACxD,QAAS/G,GACT,SAAUA,GACV,QAASA,GACT,UAAWA,GACX,KAAMA,GAAwB,CAC/B,EAEAgH,GAAevS,EAAgB,CAC9B,KAAM,qBACN,WAAY,CACX,gBAAAwS,GACA,iBAAAC,EACD,EACA,MAAO,CACN,YAAa,CACZ,KAAM,OACP,EACA,mBAAoB,CACnB,KAAM,OACP,EACA,SAAU,CACT,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,QAAS,KAAO,GACjB,CACD,EACA,OAAQ,CACD,MAAE,cAAAC,GAAkBxM,KAE1B,MAAO,CAAE,cAAAwM,CAAc,CACxB,EACA,MAKE,CACM,OACN,YAAa,EACb,WAAY,GACZ,gBAAAP,GACA,YAAa,GAEf,EACA,SAAU,CACT,KAAK,cAAc,EAOlB,KAAK,oBAAoB,eAAiB,GAC1C,KAAK,oBAAoB,gBAAkB,IAE3C,KAAK,kBAAkB,EACvB,KAAK,aAAa,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,CAAC,EACrF,KAAK,oBAAoB,GAGnB,wBAAiB,SAAU,KAAK,aAAa,EACpD,KAAK,MAAM,OAAQ,CAAE,SAAU,KAAK,oBAAoB,aAAc,EACtE,WAAW,IAAM,CAChB,KAAK,YAAc,IACjB,CAAC,EAEQQ,GAAA,GAAG,oBAAqB,KAAK,iBAAiB,CAC3D,EACA,eAAgB,CACR,2BAAoB,SAAU,KAAK,aAAa,EAC3CA,GAAA,IAAI,oBAAqB,KAAK,iBAAiB,CAC5D,EACA,SAAU,CACT,GAAG5Q,GAAUC,EAAW,EACxB,qBAIE,CACD,OAAO,KAAK,SAAS,uBAAuB,KAAK,mBAAmB,CACrE,EACA,YAAa,CACZ,OAAO,KAAK,SAAS,UACtB,EACA,2BAAsC,CAC/B,MAAA4Q,EAAsB,CAAC,OAAO,EAEpC,OAAI,KAAK,aAAaA,EAAoB,KAAK,MAAM,EAC9CA,CACR,EACA,qBAA8B,CAC7B,OAAK,KAAK,aACL,KAAK,YACN,KAAK,WAAa,KAAa,UAC5BtG,GAAI,KAAM,wBAAwB,GAAK,UAFhB,WADC,WAIhC,EACA,cAAwB,CAChB,YAAK,OAAO,QAAU,MAC9B,EACA,kBAA2B,CACnB,YAAK,kBAAkB4F,EAAkB,CACjD,EACA,gBAAyB,CACjB,UAAKD,GAAcC,IAAsBC,EACjD,EACA,qBAA8B,CACzB,YAAK,YAAc,KAAK,eAAuB,KAAK,kBAAkB,CAAC,EAEtE,KAAK,aACH,KAAK,kBAAkBF,GAAc,EAAE,EAAI,KAAK,iBADxB,KAAK,kBAAkBA,EAAW,CAElE,EACA,sBAA+B,CAC1B,YAAK,YAAc,KAAK,eAAuB,KAAK,kBAAkB,CAAC,EAEpE,KAAK,kBAAkBA,GAAc,EAAE,EAAI,KAAK,gBACxD,EACA,aAAuB,CACf,YAAK,oBAAoB,aAAe,KAAK,mBACrD,EACA,cAAwB,CAChB,YAAK,oBAAoB,cAAgB,KAAK,oBACtD,EACA,iBAAmD,CAC3C,OACN,KAAM,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,YAAY,CAAC,KACtE,MAAO,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,aAAa,CAAC,KAE1E,EACA,kBAAsC,CAC9B,OACN,MAAO,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,uBAAuB,CAAC,KAEpF,EACA,mBAAyD,CACjD,OACN,KAAM,GAAG,KAAK,kBAAkB,KAAK,oBAAoB,uBAAuB,CAAC,KACjF,UAAW,eAAe,KAAK,kBAAkB,KAAK,4BAA4B,CAAC,MAErF,EACA,qBAA4F,CACrF,MAAAY,EAAW,KAAK,OAAO,QAAU,OACjCC,EACL,KAAK,oBAAoB,aAAe,KAAK,oBAAoB,cAM3D,OACN,wBAL+BD,EAC7B,EAAIC,EAA0B,KAAK,oBAAoB,cACvD,EAAI,KAAK,kBAAkBb,EAAW,EAIxC,wBAAAa,CAAA,CAEF,EACA,8BAAuC,CACtC,MAAMC,EAAe,EAAI,KAAK,kBAAkBZ,GAAkBF,EAAW,EACvEe,EACL,KAAK,oBAAoB,wBAA0BD,EAC7C,OAAAC,EAA2B,EAAIA,EAA2B,CAClE,EACA,gBAA0B,CAClB,OAAA1G,GAAI,KAAM,wBAAwB,IAAM,MAChD,EACA,iBAA0B,CACnB,MAAA2G,EAAa,KAAK,eAAiB,EAAI,EAEzC,YAAK,YAAc,KACfZ,GAAoBY,EAGrBb,GAAca,CACtB,EACA,0BAAoC,CAC7B,MAAAC,EAAmB,KAAK,kBAAkBf,EAAe,EACxD,YAAK,oBAAoB,cAAgBe,CACjD,CACD,EACA,MAAO,CACN,YAAYC,EAAa,CAClB,MAAAD,EAAmB,KAAK,kBAAkBf,EAAe,EAE3D,KAAK,0BACR,KAAK,kBAAkBe,CAAgB,EAGxC,MAAME,EAAiB,KAAK,oBAAsB,KAAK,oBAAoB,aACrEC,EAAa,KAAK,qBAAuB,KAAK,oBAAoB,cAGpEF,EAAc,KAAK,gBAAkBC,GAAkBC,IAC1D,KAAK,kBAAkBH,CAAgB,EACvC,KAAK,aAAa,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,CAAC,GAGjF,kBAAa,KAAK,oBAAoB,YAAY,CACxD,CACD,EACA,QAAS,CACR,qBAAqB/X,EAAc,CAC7B,WAAM,qBAAsBA,CAAI,CACtC,EACA,uBAAuBmY,EAAe,CACrC,OAAI,KAAK,sBAAwB,WACzB,KAAK,kBAAkBrB,GAAc,EAAI,KAAK,eAAe,EAE9D,KAAK,aAAe,GAAMqB,EAAQ,EAAI,KAAK,mBACnD,EACA,kBAAkBC,EAAwB,CACzC,MAAMC,EACLD,GAAiB,KAAK,kBAAkBjB,GAAsB,KAAK,mBAAmB,CAAC,EAExF,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,cAAekB,CAChB,EACA,CACF,EACA,aAAaC,EAAsB,CAClC,MAAMC,EACLD,GAAgB,EAAI,KAAK,oBAAoB,wBACxCE,EACL,EAAID,EAAwB,KAAK,oBAAoB,cAEhDL,EAAa,KAAK,qBAAuBM,EACzCC,EAAY,KAAK,oBAAsBF,EACvCG,EAAc,KAAK,sBAAwB,YAEjD,GAAID,EAAW,CACd,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAc,KAAK,oBACnB,cAAe,EAAI,KAAK,oBAAoB,cAAgB,KAAK,mBAClE,EACA,EACD,MACD,CAEA,GAAIP,EAAY,CACf,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAc,EAAI,KAAK,oBAAoB,cAAgB,KAAK,qBAChE,cAAe,KAAK,oBACrB,EACA,EACD,MACD,CAEA,KAAK,SAAS,uBAAuB,CACpC,UAAW,KAAK,oBAChB,WAAY,CACX,aAAcQ,EAAc,KAAK,oBAAsBH,EACvD,cAAeC,CAChB,EACA,CACF,EACA,kBAAkB9Z,EAA8C,CAC/D,MAAMia,EAAyC,CAC9C,QAAS,KAAK,oBACd,SAAU,KAAK,qBACf,QAAS,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,GAGvE,kBAAaA,EAAeja,CAAQ,CAAC,CAC3C,EACA,kBAAkBka,EAAY,CAC7B,OAAOA,EAAK,KAAK,WAClB,EACA,kBAAkBR,EAAuB,CACxC,OAAOA,EAAgB,KAAK,WAC7B,EACA,eAAgB,CACf,KAAK,cAAc,CACpB,EACA,aAAc,CACb,KAAK,kBAAkB,CACxB,EACA,kBAAkBhG,EAAuD,CACpE,KAAK,aACH,KAAK,cAAc,KAAK,SAAU,CAAE,aAAc,GAAI,SAAU,EAAK,EAAGA,CAAI,CAEnF,EACA,SAAS,CAAE,UAAAkE,EAAW,EAAAuC,EAAG,MAAAV,GAA0D,CAC5E,MAAAW,EAAmB,KAAK,kBAAkBD,CAAC,EAC3CT,EAAgB,KAAK,kBAAkBD,CAAK,EAE9C7B,IAAc,QAAUwC,GAAoB,KAAK,qBACjDxC,IAAc,SAAW,EAAIwC,GAAoB,KAAK,sBACtDX,GAASnB,KAEb,KAAK,kBAAkBoB,CAAa,EAC/B,kBACJ9B,IAAc,OAASwC,EAAmB,KAAK,oBAAoB,cAErE,EACA,qBAAsB,CACrB,MAAMC,EAAuBC,GAC5B,GAAGC,EAAuC,IAAI,KAAK,mBAAmB,EACrE,QAEF,GAAIF,EAAsB,CACnB,MAAAG,EAAc,WAAWH,CAAoB,EACnD,KAAK,kBAAkBG,CAAW,EAC5B,MAAAC,EAAkB,KAAK,uBAAuBD,CAAW,EAE/D,YAAK,aAAaC,CAAe,EAC1B,EACR,CACO,QACR,EACA,mBAAoB,CACRH,GAAA,GAAGC,EAAuC,IAAI,KAAK,mBAAmB,EAAE,EAAE,MACpF,KAAK,oBAAoB,cAAc,SAAS,CAClD,EACA,aAAc,CACb,KAAK,WAAa,GAClB,KAAK,MAAM,YAAa,CAAE,SAAU,KAAK,oBAAoB,aAAc,CAC5E,EACA,OAAO,EAA6B,CAC7B,MAAAX,EAAe,KAAK,kBAAkB,EAAE,CAAC,EAAI,KAAK,oBAAoB,cAAgB,EAE5F,KAAK,aAAaA,CAAY,CAC/B,EACA,WAAY,CACX,WAAW,IAAM,CAChB,KAAK,WAAa,GAClB,KAAK,MAAM,UAAW,CACrB,YAAa,KAAK,YAClB,SAAU,KAAK,oBAAoB,aACnC,GACC,CAAC,EACJ,KAAK,kBAAkB,CACxB,EACA,eAAgB,CACf,KAAK,YAAc,OAAO,UAC3B,EACA,OAAQ,CACP,KAAK,MAAM,OAAO,CACnB,CACD,CACD,CAAC,whBAxZAtT,EAuCM,iCAtCLE,EAIE,YANJE,EAAA,YAAAH,IAIegJ,EAAUmL,EAAA,CACrB,kBAAAhU,EAAA,WALJ,qBAAAA,EAAA,0CAOgC,sBAA9B,IAAAe,EAAA,OAAAf,EAPF,mBAUEe,EAAA,cAHwCH,MAAO,CAAa,IAAK,QAAAb,EAAAC,EAAA,mBAChE,MAA0B0Q,GAAA1Q,EAAA,oBAR7BwQ,GAAAxQ,EAAA,eAUE,MAAAA,EAVF,mBAaQe,EAbR,GAaeH,WAH2BA,MAAO,CAAc,IAAK,QAAAb,EAAAC,EAAA,oBACjE,MAA2B0Q,GAAA1Q,EAAA,qBAX9BwQ,GAAAxQ,EAAA,gBAaE,MAAaY,EAbf,MAayCqT,6BACtC,MAwBqBvD,GAAA1Q,EAAA,qBAtBZkU,EAAkBC,CACzB,sBAAWvC,EAAe,gCAC1B,QAAS,kBAAI5R,EAAA,mCACb,YAAAA,EAAA,gBACA,YAAQoU,GACR,uBAAaC,4BACb,SAAWC,kDAtBhB,YAwBItU,EAAA,sBAAWO,EAxBf,KAAAC,EAAA,OA0Ba+T,UAAkB,OAAIC,mBAAW,IA1B9C,CAAAxU,EAAA,oBAAAA,EAAA,aAAAH,EAAA,EAAAiB,EA2BiBF,EAAgB,CAC1B,MACA,QAAgB6T,CAAY,CAAAzU,EAAA,sBAAAA,EAAA,gBAAAA,EAAA,aAC5B,gBAAW8Q,cACX,iBAAM4D,EAAM,aACZ,YAAS3D,8BAhChB,UAAA/Q,EAAA,kGAmCIe,EAEM,MAFA,KAAAP,EAAA,OACL,MAAoBT,EAAA,EAAAC,EAAA,2BAAAA,EAAA,iBAAAA,EAAA,kCApCzB,mMCQM2U,GAAmC,CACxC,oBAAqB,GACrB,oBAAqB,GACrB,mBAAoB,UACpB,YAAa,CAAC,GAAGC,YAAS,YAAa,QAAS,MAAO,OAAO,EAC9D,kBAAmB,CAClB,GAAGA,GAAS,2BACZ,IAAK,CAAC,QAAS,OAAO,CACvB,EACA,cAAe,CACd,KAAM,EACP,CACD,EAEeC,GAAA,CACd,KAAM,cACN,MAAO,CACN,UAAW,CACV,KAAM,MACP,CACD,EACA,SAAU,CACT,eAAgB,CACR,OAAAC,GAAa,KAAK,UAAWH,EAAe,CACpD,CACD,CACD,gBAjCc,SAAAzE,GAAClQ,EAAgBC,EAAAkQ,EAAAC,EAAAC,EAAAC,EAAA,CAAQ,OAAAzQ,EAAA,EAAeC,EAAA,4MCkCtDiV,GAAetV,EAAgB,CAC9B,KAAM,yBACN,WAAY,CACX,cAAAuV,GAAA,YACAC,EACD,EACA,MAAO,CACN,WAAY,CACX,KAAM,OACN,SAAU,EACX,CACD,EACA,MAAO,CACC,OACN,UAAW,GACX,YAAa,GACb,MAAO,GACP,KAAM,GAER,EACA,SAAU,CACT,GAAGzT,GAAUrH,CAAiB,CAC/B,EACA,MAAM,SAAU,CACf,KAAM,CAAE,GAAA+a,EAAI,KAAAlI,EAAM,SAAAmI,EAAU,SAAAC,EAAU,SAAAC,GAAa,KAAK,WAClDC,EAAaF,IAAa,OAC1BG,EAAaH,IAAa,OAEhC,GAAI,CAACF,EACAI,GAAcC,EACjB,KAAK,KAAOC,GAAU,KAAKxI,CAAI,CAAC,EAE3B,iBAAc,QAAUqI,EAAW,WAAarI,MAGlD,KACH,MAAMyI,EAAY,KAAK,eAAe,aAAaP,EAAI,OAAQC,EAAUE,CAAQ,EACjF,GAAIC,GAAcC,EAAY,CAC7B,MAAMG,EAAc,MAAM,MAAMD,EAAW,CAAE,YAAa,UAAW,EACrE,KAAK,KAAO,MAAOH,EAAaI,EAAY,OAASA,EAAY,KAAK,QAEtE,KAAK,YAAcD,OAET,CACX,KAAK,MAAQ,EACd,CAGD,KAAK,UAAY,EAClB,EACA,QAAS,CACR,YAAuB,CAChB,MAAE,SAAAL,CAAS,EAAI,KAAK,WACnB,OAACA,GAAY,OAAO,CAC5B,CACD,CACD,CAAC,EA3FDxR,GAAA,mBAAAE,GAAA,QAKiDC,GAAQ,CAAC,+BAL1DC,GAAA,eASsD8K,GAAQ,CAAC,kHAR9DlP,EAqBO,eApBN,OAAAC,EAAA,EAAAC,EAAkD,OAFpD,MAGkBgJ,mBAAhB,MAAsDlF,GAHxD,wBAGyB,gBAEU9D,EAAA,MAAA+D,GAAA,+BAAAhE,IAAAC,EAAhC,OAGQgE,GAHR,CACC9D,EAAA,sBAAyD,aAAhCF,EAAA,QAAAiE,GAAA,CAAAvD,EAASmV,SAAW,CANjD,IAAA3V,EAAA,YAOI,KAAAA,EAAA,4BAAAgE,EAAA,EAEiB2R,EAAW,IAAQhV,EAAAX,EAAA,oEACpC,GAAAA,EAAA,sBAAyD,aAAhCF,EAAA,QAAAgP,GAAA,CAAAtO,EAASmV,SAAW,CAVjD,IAAA3V,EAAA,YAWI,KAAAA,EAAA,4BAAAiE,EAAA,EAGW0R,EAAW,IAAQhV,EAAAX,EAAA,uEAAAA,EAdlC,gCAee,EAAAc,EAAA8U,EAAA,CACV,IAAI,EACJ,KAAA5V,EAAA,YAEsB2V,cAAW,EAAnC,oBAAA3V,EAnBH,WAmB4D,mBAAAH,IAAUiB,EAAM+U,EAAA,OACzE,aAAA7V,EAAA,MApBH,2BAoBkC,EAAAF,EAAA,SAAE,IAAK,MAAAE,EAAA,sGCUzC8V,GAAerW,EAAgB,CAC9B,KAAM,oBAEN,WAAY,CACX,uBAAAsW,EACD,EACA,MAAO,CACN,cACA,eACD,EACA,OAAQ,CAGA,OACN,YAHmBtQ,IAGnB,CAEF,EACA,SAAU,CACT,GAAGjE,GAAUrH,CAAiB,EAC9B,YAAiC,CAC1B,MAAAwb,EAAa,KAAK,YAAY,cACnC,KAAK,gBACL,KAAK,YAAY,KACjB,KAAK,YAAY,SACjB,KAAK,YAAY,aAOlB,OAJIA,EAAW,SAAW,GAKzB,KAAK,YAAY,OAASA,EAAW,QACrCA,EAAW,KAAK,YAAY,KAAK,EAAE,KAAK,YAAY,GAAG,IAAM,OAEtD,KAG4BA,EAAW,KAAK,YAAY,KAAK,EAAE,KAAK,YAAY,GAAG,CAG5F,EAEA,iBAAmC,CAC5B,MAAAK,EAAoB,KAAK,eAAe,qBAC9C,GAAIA,IAAsB,KAClB,YAER,MAAMC,EAAgBD,EAAkB,KACjC,OAAAC,EAAgBA,EAAc,WAAW,QAAU,IAC3D,CACD,EACA,QAAS,CACR,aAAc,CAGb,YAAK,MAAM,OAAO,EACX,EACR,CACD,CACD,CAAC,4GAzFwBC,EAAAtW,EAAA,0BADzB,OAAAI,EAAA,eAAAH,EAAA,EAAAC,EAAA,aAEE,MAOEC,EAAA,uBAAA+B,EAAA9B,EAAA,yBAAA8B,EAAA,eALKT,EAAyB,CAC9B,KAAK,QACN,MAAK,0BACJ,MAAOsI,UAAQ,SAAQ,wCACvB,wBAAA3J,EAAA,iDAGF,QAAAiB,GAKMjB,EALN,YAKM,gBAJO2V,EAAU,6BAAtBnV,EAAA,MAAAoD,GAAA,CAZH5D,EAAA,YAAAH,EAe8C,EAAAiB,EAAE6U,EAAU,6DAf1D9V,EAAA,EAAAC,EAAA,MAAA+D,GAAAlD,EAAAX,EAAA,uEAAAe,EAAA,kLCIA,MAAM6E,EAAOC,EAWPvL,EAAOC,KAEb,SAAS4b,EAAWC,EAAmC,CACtDxQ,EAAK,oBAAqBwQ,CAAQ,CACnC,0qHCOA,MAAM9Q,EAAQC,EAOR3C,EAAYC,KACZwT,EAAQrT,KACR1I,EAAOC,KACP+b,EAAYC,KAEZvc,EAAiBC,KACjBuc,EAAW/U,KACXgV,EAAYC,KACZC,EAAUC,KAEVC,EAA0Btd,EAAI,EAAK,EACnCud,EAAwBvd,EAAI,EAAE,EAC9Bwd,EAAyBxd,IAEzByd,EAAevc,EAAS,IACtB,KAAK,UAAU6K,EAAM,MAAM,KAAK,EAAE,OAAS2R,EAClD,EAEK7L,EAAa3Q,EAA4B,IAAM,CACpD,MAAMG,EAAO4b,EAAS,WACtB,GAAI,CAAC5b,EACJ,MAAO,GAER,MAAMG,EAAWf,EAAe,YAAYY,EAAK,KAAMA,EAAK,WAAW,EAEvE,OAAIG,IAAa,KACT,GAGDA,EAAS,WAChB,EAEKmc,EAAazc,EAAS,IAAM,CACjC,MAAM0c,EAAUV,EAAU,cAC1B,IAAIW,EAAe,cAEf,OAAAD,EAAQ,SAAS,WAAW,IAChBC,EAAA,SAGTX,EAAU,WAAa,KAAKW,CAAY,IAC/C,EAEKC,EAAoB5c,EAAS,IAC3B+b,EAAS,aAAa,OAAS,CACtC,EAEKc,EAAkB7c,EAAS,IAAM,SAChC,MAAAG,GAAOkH,EAAAwD,EAAM,QAAN,YAAAxD,EAAa,KAC1B,GAAI,CAAClH,EACG,aAGR,MAAMG,EAAWf,EAAe,YAAYY,EAAK,KAAMA,EAAK,WAAW,EAChE,QAAA2E,EAAAxE,GAAA,YAAAA,EAAU,WAAV,YAAAwE,EAAoB,OAAQ3E,EAAK,KACxC,EAEK2c,EAAqB9c,EAAS,IAAM,OACzC,MAAM+c,EAA0C,GAChD,GAAI,GAAC1V,EAAAwD,EAAM,MAAM,WAAZ,MAAAxD,EAAsB,QAC1B,MAAO,GAER,MAAM2V,EAAeC,IAEf,kBAAK,IAAI,IAAIpS,EAAM,MAAM,QAAQ,CAAC,EAAE,QAASqS,GAAY,CAE9D,MAAMC,EADa,cAAc,KAAKD,CAAO,EAClBA,EAAQ,MAAM,KAAK,EAAE,IAAKE,IAASA,GAAK,KAAM,GAAI,GAG7E,UAAWA,MAAQD,EACd,IACG,MAAAE,GAAS,KAAK,MAAMD,EAAI,EAC1B,UAAOC,IAAW,SAAU,CAC/BN,EAAW,KAAKM,EAAM,EACtB,MACD,OACe,CAAC,CAGdH,IAAYF,GAChBD,EAAW,KAAKG,CAAO,EACvB,EACMH,CAAA,CACP,EAED,eAAeO,GAAe,OACzB,IACHlB,EAAwB,MAAQ,GACtBP,EAAA,MACT,sCACA,CACC,WAAWxU,EAAAwD,EAAM,MAAM,OAAZ,YAAAxD,EAAkB,KAC7B,YAAawD,EAAM,MAAM,OAC1B,EACA,CAAE,YAAa,EAAK,GAGf,MAAE,QAAAqS,GAAY,MAAMhB,EAAQ,WAAW,CAAE,MAAOrR,EAAM,MAAO,EACnEwR,EAAsB,MAAQa,QACtB7O,EAAO,CACfuN,EAAM,UAAUvN,EAAOxO,EAAK,SAAS,eAAe,CAAC,SACpD,CACDuc,EAAwB,MAAQ,EACjC,CACD,CAEA,eAAemB,GAAyB,OACvClB,EAAsB,MAAQ,GAC9BC,EAAuB,MAAQ,OAC/B,MAAMgB,EAAa,EACnBzB,EAAU,MAAM,2CAA4C,CAC3D,WAAWxU,EAAAwD,EAAM,MAAM,OAAZ,YAAAxD,EAAkB,KAC7B,YAAawD,EAAM,MAAM,QACzB,CACF,CAEA,eAAe2S,EAAyB7B,EAAmC,OAC1EE,EAAU,MAAM,yCAA0C,CACzD,QAASF,IAAa,WACtB,WAAWtU,EAAAwD,EAAM,MAAM,OAAZ,YAAAxD,EAAkB,KAC7B,YAAawD,EAAM,MAAM,QACzB,CACF,CAEA,SAAS4S,EAAend,EAAqC,CAC5D,GAAI,CAACA,GAAa,WAAYA,GAAYA,EAAS,OAC3C,OAAAT,EAAK,SAAS,yBAAyB,EAGzC,MAAA6d,EAAoB,KAAK,IAAI,GAAGne,EAAe,gBAAgBe,EAAS,IAAI,CAAC,EAE/E,OAAAod,IAAsBpd,EAAS,YAC3BT,EAAK,SAAS,qBAAqB,EAGpCA,EAAK,SAAS,6BAA8B,CAClD,YAAa,CAAE,QAAS6d,EAAkB,UAAW,EACrD,CACF,CAUA,SAASC,GAA8B,SAKtC,GAHC9S,EAAM,MAAM,OAAS,sBACpBA,EAAM,MAA6B,gBAAkB,qBAG/C,OAAAwP,GACNxP,EAAM,MAAM,YACXhL,EAAK,SAAS,yCAA0C,CACvD,YAAa,CAAE,KAAMgL,EAAM,MAAM,KAAK,IAAK,EAC3C,GAIA,IAAAxD,EAAAwD,EAAM,MAAM,UAAZ,MAAAxD,EAAqB,eAAgB,CACxC,MAAMuW,EAAc,CACnB,UAAW/S,EAAM,MAAM,QAAQ,UAC/B,SAAWA,EAAM,MAAM,QAAQ,UAAuB,IACtD,UAAYA,EAAM,MAAM,QAAQ,WAAwB,KAElD,OAAAwP,GACNxa,EAAK,SACJ,6BAA6BgL,EAAM,MAAM,QAAQ,cAAwB,GACzE,CAAE,YAAA+S,CAAY,CACf,EAEF,CAEA,GAAI,GAAC9Y,EAAA+F,EAAM,MAAM,UAAZ,MAAA/F,EAAqB,qBACzB,OAAOuV,GAAaxP,EAAM,MAAM,aAAe,EAAE,EAGlD,MAAMgG,EAAgBgN,GAAqBhT,EAAM,MAAM,QAAQ,SAAmB,EAC3E,OAAAwP,GACLxP,EAAM,MAAM,QAAQ,oBAA+B,QAAQ,iBAAkBgG,CAAa,EAE7F,CAEA,SAASiN,EAAmBZ,EAAyB,SACpD,IAAIa,EAAkB,GAEtB,MAAMC,EAAyB,SAG9B,OAAApB,EAAkB,OAClB,CAACM,EAAQ,SAASc,CAAsB,KACxClZ,GAAAuC,EAAAwD,EAAM,QAAN,YAAAxD,EAAa,UAAb,YAAAvC,EAAsB,aAAc,SAEpCiZ,EAAkB,UAAUlT,EAAM,MAAM,QAAQ,SAAS,KAGnDqS,EAAUa,CAClB,CAEA,SAASd,GAA0B,OAClC,MAAMgB,EAAmB,GACzB,IAAIf,EAAU,GAMd,GAHCrS,EAAM,MAAM,OAAS,sBACpBA,EAAM,MAA6B,gBAAkB,qBAG5CqS,EAAArd,EAAK,SAAS,6BAA8B,CACrD,YAAa,CAAE,KAAMgL,EAAM,MAAM,KAAK,IAAK,EAC3C,UAEDA,EAAM,MAAM,UAAYA,EAAM,MAAM,aACpC,GAACxD,EAAAwD,EAAM,MAAM,UAAZ,MAAAxD,EAAqB,iBAEZ6V,EAAAe,EAAmBpT,EAAM,MAAM,YACnC,CACN,MAAMgG,EAAgBgN,GAAqBhT,EAAM,MAAM,QAAQ,SAAmB,EAElFqS,EACCe,EACCpT,EAAM,MAAM,QAAQ,gBAA2B,QAAQ,iBAAkBgG,CAAa,CACzF,CAEA,OAAOiN,EAAmBZ,CAAO,CAClC,CAES,SAAAW,GAAqBvL,EAAc4L,EAAW,GAAM,CACxD,IACH,MAAMC,EAAStN,GAAcF,EAAW,MAAO2B,EAAK,MAAM,GAAG,CAAC,EAC1D,IAAC6L,EAAO,OACX,MAAM,IAAI,MAGX,OAAKD,EAGEC,EAAO,IAAKvN,GAAcA,EAAU,WAAW,EAAE,KAAK,KAAK,EAF1DuN,EAAO,IAAO,mBAGP,CACf,MAAO,6BAA6B7L,CAAI,GACzC,CACD,CAES,SAAAzB,GACRsN,EACAC,EACmD,CAC/C,IAAAC,EAAuBD,EAAU,QAErC,GAAIC,IAAyB,OAC5B,MAAO,GAGF,MAAAC,EAAaD,EAAqB,MAAM,iBAAiB,EAC3DC,IAAe,MAAQA,EAAW,OAAS,IAC9CD,EAAuBC,EAAW,CAAC,GAEpC,MAAMC,EAAmBJ,EAAO,KAC9BvN,GAAcA,EAAU,OAASyN,CAAA,EAGnC,GAAIE,IAAqB,OACxB,MAAM,IAAI,MAAM,6BAA6BF,CAAoB,GAAG,EAGjE,OAAAD,EAAU,SAAW,EACjB,CAACG,CAAgB,EAGrBA,EAAiB,eAAe,SAAS,EACrC,CACNA,EACA,GAAG1N,GAAe0N,EAAqC,QAAUH,CAAS,GAIxEG,EAAiB,eAAe,QAAQ,EACpC,CACNA,EACA,GAAG1N,GAAe0N,EAA6C,OAAQH,CAAS,GAK3E,CAACG,CAAgB,CACzB,CAEA,SAASC,GAAmB,qBAC3B,MAAMnQ,EAAQxD,EAAM,MAEd4T,EAAyB,CAC9B,aAAcxB,EAAgB,GAE3B5O,EAAM,cACToQ,EAAU,iBAAmBpQ,EAAM,aAIpC,MAAMqQ,EAA4B,IAE9BrX,EAAAgH,GAAA,YAAAA,EAAO,WAAP,MAAAhH,EAAiB,SACpBqX,EAAa,gBAAkBrQ,EAAM,UAGlC,aAAcA,GAASA,EAAM,WAChCqQ,EAAa,SAAWrQ,EAAM,UAG3BA,EAAM,SAAWA,EAAM,QAAQ,OACrBqQ,EAAA,UAAYrQ,EAAM,QAAQ,MAGpCA,EAAM,QACTqQ,EAAa,WAAarQ,EAAM,OAGjCoQ,EAAU,aAAeC,EAGzB,MAAMC,EAA0B,GAE5BtQ,EAAM,OACEsQ,EAAA,SAAWtQ,EAAM,KAAK,KACtBsQ,EAAA,SAAWtQ,EAAM,KAAK,KACtBsQ,EAAA,YAActQ,EAAM,KAAK,aAEhCjH,IAAAtC,EAAAuJ,EAAM,OAAN,YAAAvJ,EAAY,aAAZ,MAAAsC,GAAwB,WAChBuX,EAAA,SAAWtQ,EAAM,KAAK,WAAW,WAEzCuQ,IAAAzX,GAAAkH,GAAA,YAAAA,EAAO,OAAP,YAAAlH,GAAa,aAAb,MAAAyX,GAAyB,YACjBD,EAAA,UAAYtQ,EAAM,KAAK,WAAW,YAI3CA,EAAM,UACLA,EAAM,QAAQ,YAAc,SACpBsQ,EAAA,UAAYtQ,EAAM,QAAQ,WAGlCA,EAAM,QAAQ,WAAa,SACnBsQ,EAAA,SAAWtQ,EAAM,QAAQ,UAGjCA,EAAM,QAAQ,YAAc,SACpBsQ,EAAA,UAAYtQ,EAAM,QAAQ,WAGlCA,EAAM,QAAQ,gBACNsQ,EAAA,cAAgBtQ,EAAM,QAAQ,gBAIvCA,EAAM,YACTsQ,EAAW,KAAO,IAAI,KAAKtQ,EAAM,SAAS,EAAE,kBAG7CsQ,EAAW,WAAalC,EAAW,MAEnCkC,EAAW,eAAiB3C,EAAU,eAElC3N,EAAM,QACTsQ,EAAW,MAAQtQ,EAAM,OAG1BsQ,EAAW,YAAaE,GAAAxQ,EAAM,QAAN,YAAAwQ,GAAa,MAAM;AAAA,GAE3CJ,EAAU,WAAaE,EAElBxW,EAAU,KAAK,KAAK,UAAUsW,EAAW,KAAM,CAAC,CAAC,EAC1CK,GACb,CAEA,SAASA,GAAc,CACtBlD,EAAM,YAAY,CACjB,MAAO/b,EAAK,SAAS,iCAAiC,EACtD,KAAM,OACN,CACF,w3JCxZA,MAAMkf,EAASjf,KAYT+K,EAAQC,EAERK,EAAOC,EAIP4T,EAAUhf,EAAS,IACxB6K,EAAM,0BAA0B,+BAAiC,GAAO,8kCCglBnEoU,GAAeC,GACpB,SAAY,MAAMC,GAAA,WAAO,4BAA+B,yIACzD,EACMC,GAAcF,GAAqB,SAAY,MAAMC,GAAA,WAAO,2BAA8B,0IAAC,EAC3FE,GAAgBH,GACrB,SAAY,MAAMC,GAAA,WAAO,6BAAgC,0IAC1D,EACM3E,GAAc0E,GAAqB,SAAY,MAAMC,GAAA,mCAAqC,OAAC,EAC3FG,GAAgBJ,GACrB,SAAY,MAAMC,GAAA,WAAO,6BAAgC,yDAC1D,EAMAI,GAAeva,EAAgB,CAC9B,KAAM,UACN,WAAY,CACX,kBAAAwa,GAAA,cACAC,GACA,WAAAC,GACA,aAAAT,GACA,YAAAG,GACA,cAAAC,GACA,YAAA7E,GACA,cAAA8E,GACA,iBAAAK,EACD,EACA,MAAO,CACN,KAAM,CACL,KAAM,OACN,QAAS,IACV,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,MACP,EACA,sBAAuB,CACtB,KAAM,MACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,MACP,EACA,QAAS,CACR,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,gBAAiB,CAChB,KAAM,KACP,EACA,eAAgB,CACf,KAAM,OACP,EACA,mBAAoB,CACnB,KAAM,MACP,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAM9U,EAAO,CACZ,MAAMkR,EAAW/U,KACX+D,EAAcC,KACd0C,EAAgB5G,KAChB3G,EAAOyf,GAAM/U,EAAO,MAAM,EAC1B4C,EAAalM,GAAcpB,EAAM,CACtC,SAAU0K,EAAM,SAChB,YAAakR,EAAS,oBAAoBlR,EAAM,QAAQ,EACxD,EAEM,OACN,GAAGtC,GAAS,EACZ,cAAAmF,EACA,YAAA3C,EACA,WAAA0C,CAAA,CAEF,EACA,MAAO,CACC,OACN,eAAgB5F,EAAmB,KACnC,wBAAyB,GACzB,SAAU,EACV,SAAU,GACV,YAAa,EACb,yBAA0B,GAC1B,sBAAuB,KAEvB,sBAAA2U,GACA,2BAAAqD,GACA,YAAa,EACb,SAAU,GACV,UAAW,CAAC,GAAI,GAAI,GAAI,GAAG,EAE3B,+BAAgC,GAChC,2BAA4B,GAC5B,OAAQ,GAEV,EACA,SAAU,CACT,GAAG9Y,GACFvH,GACAwH,GACAtH,EACAE,GACAqc,EACD,EACA,iBAAkB,SACV,QAAAnX,GAAAuC,EAAA,KAAK,SAAL,YAAAA,EAAa,OAAb,YAAAvC,EAAmB,kBAAmB,EAC9C,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,oBAA6B,CACrB,OAAAgb,EACR,EACA,oBAA6B,CACrB,OAAAC,EACR,EACA,aAAmC,CAClC,OAAO,KAAK,SAAS,oBAAoB,KAAK,QAAQ,CACvD,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,cAAwB,CACvB,OAAO,KAAK,cAAgB,QAC7B,EACA,eAAyB,CACpB,YAAK,OAAS,KACV,GAED,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,CACxD,EACA,YAAsB,CACjB,YAAK,OAAS,KACV,GAGWxe,GAAc,KAAK,IAAI,EAAE,WAAW,EAAK,GAI3D,CAAC,KAAK,iBACN,KAAK,WAAW,gBAAgB,OAChC,EAAE,KAAK,YAAc,KAAK,WAAW,OAAS,EAEhD,EACA,SAAmD,OAClD,MAAM4Y,EAAW,CAChB,CAAE,MAAO,KAAK,QAAQ,SAAS,eAAe,EAAG,MAAO,OAAQ,EAChE,CAAE,MAAO,KAAK,QAAQ,SAAS,cAAc,EAAG,MAAO,MAAO,GAG3D,KAAK,WAAW,QACVA,EAAA,KAAK,CAAE,MAAO,KAAK,QAAQ,SAAS,gBAAgB,EAAG,MAAO,QAAU,GAG5E,MAAA6F,EAAa,CAAE,MAAO,KAAK,QAAQ,SAAS,gBAAgB,EAAG,MAAO,UAC5E,OAAI,KAAK,iBAAmB,CAACC,GAAQ,KAAK,QAAQ,EACjD9F,EAAS,QAAQ6F,CAAU,EAE3B7F,EAAS,KAAK6F,CAAU,EAIxB,KAAK,oBACL3Y,EAAA,KAAK,aAAL,YAAAA,EAAiB,QAAS6Y,IAC1B,KAAK,WAAW,WAAW,YAAc,wBAEzC/F,EAAS,QAAQ,CAAE,MAAO,OAAQ,MAAO,OAAQ,EAG3CA,CACR,EACA,YAAsB,CACd,SACN,CAAC,KAAK,aACL,KAAK,OACH,KAAK,iBAAmB,KAAK,gBAAgB,eAAe,KAAK,KAAK,IAAI,GAC3E,KAAK,WAAW,QAAQ,OAE5B,EACA,gCAA0C,WACzC,MAAO,CAAC,GAAC/S,GAAAtC,GAAAuC,EAAA,KAAK,eAAL,YAAAA,EAAoB,KAApB,YAAAvC,EAAwB,OAAxB,MAAAsC,EAA8B,+BACxC,EACA,2BAA0C,CACzC,OAAO,KAAK,eAAe,yBAC5B,EACA,8BAAwC,CAChC,QAAQ,KAAK,yBACrB,EACA,aAAuB,WACtB,MAAO,GAAQ,KAAK,QAAQA,GAAAtC,GAAAuC,EAAA,KAAK,kBAAL,YAAAA,EAAuB,KAAK,KAAK,QAAjC,YAAAvC,EAAyC,KAAK,YAA9C,MAAAsC,EAAyD,OACtF,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,CAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAAoU,EAA+C,KAAK,kBAAkB,KAC5E,OAAIA,GAAA,MAAAA,EAAe,WACXA,EAAc,WAAW,QAE1B,IACR,EACA,WAAoB,CACnB,OAAO,KAAK,aAAa,KAAK,SAAU,KAAK,kBAAkB,CAChE,EACA,qBAA8B,CACtB,YAAK,WAAW,KAAK,MACzB,KAAK,WAAW,KAAK,MAAM,OAC3B,KAAK,aAAa,MACtB,EACA,cAAuB,CACtB,OAAQ,KAAK,SAAW,KAAO,KAAM,eAAe,CACrD,EACA,gBAAyB,CACxB,GAAI,KAAK,OAAS,MAAQ,KAAK,WAAa,OACpC,SAGR,MAAM2E,EAA2B,KAAK,gBAMtC,GAJIA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,GAI1DA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAAS,KAAK,SAClC,SAGR,GAAIA,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAG,CACrC,MAAAC,EAAWD,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,KACxD,GAAIC,GAAA,MAAAA,EAAU,KACN,OAAAA,EAAS,KAAK,OAAS,CAEhC,CAEO,QACR,EACA,mBAA4B,CACpB,YAAK,UAAY,KAAK,YAAc,EAC5C,EACA,aAAsB,CACjB,QAAK,OAAS,KACV,SAGR,MAAMD,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,EACtD,EAGJA,EAAQ,KAAK,KAAK,IAAI,EAAE,OACpBA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAAS,EAGlC,CACR,EACA,cAAqC,CACpC,OAAO,KAAK,gBAAgB,KAAK,SAAU,KAAK,mBAAoB,KAAK,cAAc,CACxF,EACA,WAAkC,CACjC,MAAME,EAAgB,KAAK,qBAAqB,KAAK,YAAY,EAC1D,YAAK,gBAAgBA,CAAa,CAC1C,EACA,eAAsC,CACrC,MAAMC,EAAS,KAAK,UAAY,KAAK,YAAc,GACnD,OAAO,KAAK,UAAU,MAAMA,EAAQA,EAAS,KAAK,QAAQ,CAC3D,EACA,UAA0B,CAClB,OAAAC,GAAoB,KAAK,SAAS,CAC1C,EACA,YAA+B,CAC1B,OAAC,KAAK,KAIS,KAAK,YAAY,cACnC,KAAK,gBACL,KAAK,KAAK,KACV,KAAK,SACL,KAAK,oBAEY,OAAQhO,GAAS,GAAQA,GAAQ,OAAO,KAAKA,CAAI,EAAE,OAAO,EATpE,EAUT,EACA,oBAA6B,OACxB,OAAAlL,EAAA,KAAK,kBAAL,MAAAA,EAAsB,QAAU,CAAC,KAAK,gBAAgB,SAAS,KAAK,WAAW,EAC3E,KAAK,gBAAgB,CAAC,EAGvB,KAAK,WACb,EACA,UAAmB,OACZ,MAAAmZ,EAAc/T,GAAiBA,EAAK,OAAO,CAAC,EAAE,oBAAsBA,EAAK,MAAM,CAAC,EAEhFgU,EAAmB,GAEzB,QAASC,EAAI,EAAGA,GAAK,KAAK,eAAgBA,IAAK,CAC9C,GAAI,KAAK,iBAAmB,CAAC,KAAK,gBAAgB,SAASA,CAAC,EAC3D,SAED,MAAMC,EAAkB,KAAK,gBAAgB,KAAK,SAAUD,CAAC,EAAE,OACzDE,EAAa,KAAK,aAAa,KAAK,SAAUF,CAAC,EAC/CG,EAAQ,KAAK,OAChB,KAAK,QAAQ,SAAS,mBAAoB,CAC1C,eAAgBF,EAChB,YAAa,CAAE,QAASC,EAAY,MAAOD,CAAgB,CAC3D,GACA,KAAK,QAAQ,SAAS,mBAAoB,CAC1C,eAAgBC,EAChB,YAAa,CAAE,MAAOA,CAAW,EACjC,EACC,IAAAE,EAAa,KAAK,cAAcJ,CAAC,EAErC,GAAI,GAAGI,CAAU,IAAO,GAAGJ,CAAC,GAC3BI,EAAa,GAAG,KAAK,QAAQ,SAAS,YAAY,CAAC,IAAIA,CAAU,OAC3D,CACN,MAAMC,EAAmBC,GAA4C,UACpE3Z,EAAA,KAAK,OAAL,YAAAA,EAAW,MAET,GACA,IAAI,KAAK,QAAQ,SAAS,mBAAmB,CAAC,GACpCyZ,EAAAN,EAAW,GAAG,KAAK,cAAcE,CAAC,CAAC,GAAGK,CAAgB,EAAE,CACtE,CACAN,EAAS,KAAK,CACb,MACE,KAAK,QAAUG,GAAeD,EAC5B,GAAGG,CAAU,KAAKD,CAAK,IACvBC,EACJ,MAAOJ,CAAA,CACP,CACF,CACO,OAAAD,CACR,EACA,UAAgD,CACxC,YAAK,gBACT,CAAE,QAAS,GAAO,MAAO,IACzB,KAAK,SAAS,mBAClB,EACA,iBAA2B,CAC1B,OAAO,KAAK,WAAa,OAC1B,EACA,kBAA4B,CAC3B,OAAO,KAAK,WAAa,QAC1B,EACA,aAAuB,CACf,YAAK,mBAAmB,YAAY,cAC5C,EACA,cAAwB,CAChB,YAAK,YAAc,CAAC,KAAK,WACjC,EACA,4BAAsC,CACrC,OAAO,KAAK,YAAc,CAAC,KAAK,UAAU,QAAU,KAAK,MAC1D,CACD,EACA,MAAO,CACN,KAAKjQ,EAAkByQ,EAAmB,CACrCzQ,EAAQ,KAAOyQ,EAAS,IAC5B,KAAK,KAAK,CACX,EACA,YAAa,CACR,KAAK,WAAa,UAAU,KAAK,eAAe,CACrD,EACA,cAAe,CACd,QAAQ1O,EAA4B,CAC/B,KAAK,UAAYA,GACpB,KAAK,SAAS,uBAAuB,CACpC,MAAO,KAAK,SACZ,QAASA,EAAK,MAAOpC,GAAS8P,GAAQ9P,EAAK,IAAI,CAAC,EAChD,CAEH,EACA,UAAW,GACX,KAAM,EACP,EACA,SAASoC,EAAqB2O,EAAyB,CAClDC,GAAQ5O,EAAM2O,CAAQ,IAC1B,KAAK,gBAAgB,EACrB,KAAK,4BAA4B3O,CAAI,EACtC,EACA,WAAW6O,EAA2BF,EAA4B,CAC7DE,EAAQ,QAAU,CAACF,EAAS,QAAU,KAAK,cAAgB,SAC9D,KAAK,eAAe,EACV,CAACE,EAAQ,QAAU,KAAK,cAAgB,UAClD,KAAK,oBAAoB,OAAO,CAElC,EACA,mBAAmBC,EAAqB,CACvC,KAAK,SAAS,kBAAkB,CAC/B,KAAM,KAAK,SACX,YAAAA,CAAA,CACA,CACF,EACA,OAAOC,EAAmB,CACpB,WAAM,SAAUA,CAAS,CAC/B,CACD,EACA,SAAU,WAgBT,GAfA,KAAK,KAAK,EAEL,KAAK,iBACJ,iCAA4B,KAAK,QAAQ,EAE/C,KAAK,SAAS,kBAAkB,CAC/B,KAAM,KAAK,SACX,YAAa,KAAK,mBAClB,EAEG,KAAK,WAAa,WACrB,KAAK,eAAe,EACpB,KAAK,aAAa,GAGf,KAAK,YAAa,CACf,MAAAjT,GAAQjH,GAAAtC,GAAAuC,EAAA,KAAK,kBAAL,YAAAA,EAAuB,KAAK,KAAK,QAAjC,YAAAvC,EAAyC,KAAK,YAA9C,YAAAsC,EAAyD,MAGnEiH,GAFkB,CAAC,eAAe,EAEX,KAAMlL,GAAMkL,EAAM,QAAQ,YAAc,WAASlL,CAAC,CAAC,GAC7E,KAAK,WAAW,MACf,+BAA+BkL,EAAM,OAAO,IAC5C,CACC,KAAM,KAAK,KAAK,KAChB,aAAcA,EAAM,QACpB,YAAa,KAAK,KAAK,YACvB,WAAY,KAAK,UAAU,UAC5B,EACA,CACC,YAAa,EACd,EAGH,CACD,EACA,eAAgB,CACf,KAAK,4BAA4B,CAClC,EACA,QAAS,CACR,wBAAyB,CACpB,QAAK,MAAQ,KAAK,SAAU,CACzB,MAAA5C,EAAW,KAAK,eAAe,mBAAmB,EAClDsE,EAAetE,EAAS,QAAQ,KAAK,KAAK,IAAI,EAEpD,GAAIsE,EAEI,OADSwR,GAA2B9V,EAAUsE,EAAc,KAAK,QAAQ,CAGlF,CACA,MAAO,EACR,EACA,YAAYyR,EAA0B,CACrC,GAAIA,IAAc,KAAM,CAClB,WAAM,YAAa,IAAI,EAE5B,MACD,CACA,KAAK,MAAM,YAAa,CACvB,YAAa,KAAK,mBAClB,UAAAA,CAAA,CACA,CACF,EACA,4BAA6B,OACvB,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,WAAWna,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,KAAM,SACN,KAAM,oBACN,CACF,EACA,4BAA4ByJ,EAAsB,CAC7C,IAAC,KAAK,cACT,OAGK,MAAA2Q,EAAuBtI,GAAWuI,EAAyC,EAAE,MAE/E5Q,GAASA,EAAM,OAAS,GAAK,CAAC,KAAK,iBAAmB,CAAC2Q,IAC1D,KAAK,yBAAyB,EAE9B,WAAW,IAAM,CAChB,KAAK,2BAA6B,GAClC,KAAK,+BAAiC,GACtCE,GAAoB,KAAK,yBAA0B,CAAE,iBAAkB,EAAM,IAC3E,GAAG,EAER,EACA,6BAA8B,CACzB,KAAK,iCACR,KAAK,2BAA6B,GAClC,KAAK,+BAAiC,GACtCA,GAAoB,KAAK,yBAA0B,CAAE,iBAAkB,EAAO,GAEhF,EACA,0BAA2B,CACfxI,GAAAuI,EAAyC,EAAE,MAAQ,OACnDvI,GAAAyI,EAA4C,EAAE,MAAQ,MAClE,EACA,cAAc,CAAE,OAAAC,GAA6B,OAC5C,MAAMC,EAAY,KAAK,WAAW,KAAK,MACpCC,GAAa,KAAK,WAAW,KAAK,KAAK,EACvCxB,GAAoB,KAAK,YAAY,EAElChO,EAAOuP,EAAU,OAAS,EAAIA,EAAYE,GAE3C,cAAS,8BAA8B,EAAI,EAChD,KAAK,SAAS,4BAA4B,KAAK,UAAUzP,EAAM,KAAM,CAAC,CAAC,EAElE,gBAAW,MAAM,6BAA8B,CACnD,WAAWlL,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,WAAYwa,IAAW,iBAAmB,SAAW,OACrD,SAAU,KAAK,QACf,UAAW,KAAK,SAChB,kBAAmB,KAAK,YAAc,KAAK,WAAW,QAAQ,MAC9D,KAAM,CAAC,KAAK,YAAc,CAAC,KAAK,WAAW,QAAQ,MAAQ,YAAc,KAAK,YAC9E,eAAgB,KAAK,WAAW,QAAQ,MACxC,CACF,EACA,mBAAoB,CACd,cAAS,8BAA8B,EAAK,EAC5C,cAAS,4BAA4B,EAAE,EAC5C,KAAK,eAAe,CAAE,KAAM,QAAU,EACvC,EACA,iBAAkB,CACb,IAAC,KAAK,KACT,OAGK,MAAE,MAAA/Q,CAAM,EAAI,KAAK,SAEvB,KAAK,4BAA4B,EAE7B,IACH,KAAK,WAAW,QAAQiR,GAAajR,CAAK,EAA2B,WAAW,QACxEzC,EAAO,CACf,QAAQ,MAAMA,CAAK,EACnB,MACD,CAEK,cAAS,8BAA8B,EAAK,EAEjD,KAAK,eAAe,CAAE,KAAM,MAAQ,EACrC,EACA,eAAe,CAAE,KAAAS,GAAqC,OAChD,gBAAW,MAAM,6BAA8B,CACnD,WAAWzH,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,SAAU,KAAK,QACf,UAAW,KAAK,SAChB,KAAM,KAAK,YACX,KAAAyH,CAAA,CACA,CACF,EACA,MAAM,gBAAgB,CAAE,OAAAmT,GAAqC,CACxD,GAAC,KAAK,KAIV,IAAIA,IAAW,iBAAkB,CAChC,MAAMxT,EAAmB,CACxB,UAAW,KAAK,WAAW,KAC3B,SAAU,KAAK,QACf,UAAW,KAAK,SAChB,KAAM,CAAC,KAAK,YAAc,CAAC,KAAK,WAAW,QAAQ,MAAQ,OAAS,KAAK,aAGrE,KAAK,cAAc,IAAI,0BAA2BA,CAAgB,EAClE,gBAAW,MAAM,6BAA8BA,CAAgB,CACrE,CAII,GAFC,iBAAY,0BAA0B,KAAK,IAAI,EAEhD,KAAK,WAAW,QAAQ,MAAO,CAC7B,gBAAW,UAAUwT,CAAM,EAChC,MACD,CAEI,IACH,KAAK,WAAW,QAAQ,KAAK,aAAc,gBAAgB,QACnD5T,EAAO,CACf,QAAQ,MAAMA,CAAK,EACnB,MACD,CAEI,KAAK,YAAc,GACtB,KAAK,UAAU,CACd,MAAO,KAAK,QAAQ,SAAS,qCAAsC,CAClE,YAAa,CACZ,MAAO,GAAG,KAAK,QAAQ,EACxB,EACA,EACD,QAAS,KAAK,QAAQ,SAAS,0CAA0C,EACzE,KAAM,UACN,SAAU,IACV,EAGF,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC/B,EACA,gBAAiB,CAChB,KAAK,oBAAoB,QAAQ,CAClC,EACA,eAAeyC,EAAe,CAC7B,KAAK,YAAcA,EAEd,gBAAW,MAAM,0BAA2B,CAChD,SAAU,KAAK,QACf,aAAcA,EACd,UAAW,KAAK,WAAW,KAC3B,0BAA2B,KAAK,SAAW,KAAK,SAAS,KAAO,GAChE,KAAM,KAAK,SACX,CACF,EACA,iBAAkB,CACjB,KAAK,SAAW,GACX,gBAAW,MAAM,0BAA2B,CAChD,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,KAAK,SACX,KAAM,kBACN,CACF,EACA,gBAAiB,CAChB,KAAK,WAAa,KAAK,UAAU,EAAI,KAAK,SAC3C,EACA,SAAU,CACT,KAAK,MAAM,SAAS,CACrB,EACA,WAAY,CACX,KAAK,MAAM,WAAW,CACvB,EACA,oBAAoBA,EAAO,OAC1B,KAAK,YAAcA,EACd,gBAAW,MAAM,wBAAyB,CAC9C,WAAWzJ,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,KAAK,SACX,cAAe,KAAK,YACpB,UAAW,KAAK,SAChB,YAAa,KAAK,UAClB,CACF,EACA,iBAAiB6a,EAAkB,OAClC,KAAK,SAAWA,EAChB,MAAMC,EAAU,KAAK,KAAK,KAAK,UAAY,KAAK,QAAQ,EACpDA,EAAU,KAAK,cAClB,KAAK,YAAcA,GAGf,gBAAW,MAAM,6BAA8B,CACnD,WAAW9a,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC5B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,KAAK,SACX,cAAe,KAAK,YACpB,UAAW,KAAK,SAChB,YAAa,KAAK,UAClB,CACF,EACA,oBAAoB+a,EAAkC,CACrD,MAAMC,EAAW,KAAK,YACjB,cAAS,oBAAoB,CAAE,KAAM,KAAK,SAAU,KAAMD,EAAa,EAEtE,MAAAE,EAAmB,KAAK,MAAM,cACpC,GAAIA,EAAkB,CACf,MAAAC,EAAcD,EAAiB,SAAS,CAAC,EAE3CC,GACSA,EAAA,SAAS,EAAG,CAAC,CAE3B,CAEA,KAAK,uBAAuB,EACvB,KAAK,cAAc,IAAI,6BAA8B,CACzD,SAAUH,EACV,SAAUC,CAAA,CACV,EACG,KAAK,YACH,gBAAW,MAAM,6BAA8B,CACnD,cAAeA,EACf,SAAUD,EACV,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,KAAK,SACX,CAEH,EACA,YAAYhP,EAAgB,CAC3B,IAAIwN,EAAa,EACjB,QAASF,EAAI,EAAGA,GAAK,KAAK,eAAgBA,IAC3BE,GAAA,KAAK,qBAAqB,KAAK,gBAAgBxN,EAAS,EAAGsN,CAAC,CAAC,EAAE,OAE9E,MAAMG,EAAQ,KAAK,QAAQ,SAAS,mBAAoB,CACvD,eAAgBD,EAChB,YAAa,CAAE,MAAOA,CAAW,EACjC,EACK4B,EAAa5B,EAAa,EAAI,KAAKC,CAAK,IAAM,GAC7C,OAAAzN,EAAS,KAAK,QAAQ,SAAS,eAAe,GAAK,KAAK,YAAc,GAAKoP,CACnF,EACA,gBACCC,EACAC,EACA1W,EAAkCnE,EAAmB,KAC9B,CACvB,IAAIia,EAAkC,GAYtC,OAVI,KAAK,OACRA,EAAY,KAAK,YAAY,iBAC5B,KAAK,KACLW,EACAC,EACA,KAAK,SACL1W,CAAA,GAIE8V,EAAU,SAAW,GAAK,CAAC,MAAM,QAAQA,CAAS,EAC9C,GAGDA,CACR,EACA,qBAAqBA,EAAuD,CAC3E,OAAI,KAAK,WAAW,KAAK,OAAS,CAAC,KAAK,6BAChC,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,EAC5C,KAAK,WAAW,KAAK,MAAM,IAAKhR,IAAW,CAC3C,KAAMA,GACL,EACD,CACA,CACC,KAAM,KAAK,WAAW,KAAK,KAC5B,GAGGgR,CACR,EACA,gBAAgBA,EAAuD,CAClE,OAAC,KAAK,QAIV,KAAK,YAAc,EACZA,EAAU,OAAO,CAAC,CAAE,KAAAa,CAAA,IAAWC,GAAeD,EAAM,KAAK,MAAM,CAAC,GAJ/Db,CAKT,EACA,aACCW,EACAC,EACA1W,EAAkCnE,EAAmB,KACpD,WACG,IAAC,KAAK,KACF,SAGJ,IAAAT,GAAAtC,GAAAuC,EAAA,KAAK,kBAAL,YAAAA,EAAuB,KAAK,KAAK,QAAjC,YAAAvC,EAAyC2d,KAAzC,MAAArb,EAAoD,eAAe,SAC/D,SAGR,MAAMyb,EAAe,KAAK,gBAAgBJ,EAAUC,EAAa1W,CAAc,EACzEqU,EAAgB,KAAK,qBAAqBwC,CAAY,EACrD,YAAK,gBAAgBxC,CAAa,EAAE,MAC5C,EACA,MAAO,CAEN,KAAK,YAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,IAAIyC,EAAiC,GACrC,GAAI,KAAK,WAAa,MAAQ,KAAK,OAAS,KAAM,CAC3C,MAAAC,EAAU,KAAK,yBACPD,EAAA7S,GAA+B8S,CAAO,CACrD,CACA,KAAK,eAAiBD,EAAY,SAAW,EAAIjb,EAAmB,KAAOib,EAAY,CAAC,EACpF,KAAK,WAAW,OAAS,EAC5B,KAAK,SAAS,oBAAoB,CACjC,KAAM,KAAK,SACX,KAAM,SACN,EACS,KAAK,cAAgB,UAC/B,KAAK,SAAS,oBAAoB,CACjC,KAAM,KAAK,SACX,KAAM,QACN,CAEH,EACA,wBAAyB,CACxB,KAAK,yBAA2B,GAChC,KAAK,sBAAwB,IAC9B,EACA,oBAAqB,CACf,oBAAe,yBAAyB,IAAI,EACjD,KAAK,YAAY,4BAClB,EACA,WAAWpe,EAAe+N,EAAsB,CAC/C,KAAM,CAAE,SAAAkI,CAAS,EAAI,KAAK,WAAWjW,CAAK,EAAE+N,CAAG,EAC/C,MACC,CAAC,CAACkI,GAAY,CAAC,QAAS,QAAS,QAAS,OAAQ,OAAQ,MAAO,MAAM,EAAE,SAASA,CAAQ,CAE5F,EACA,eAAejW,EAAe+N,EAAsB,CAC7C,MAAE,SAAAmI,EAAU,SAAAF,GAAa,KAAK,WAAWhW,CAAK,EAAE+N,CAAG,EAClD,OAAC,EAAEmI,GAAYF,EACvB,EACA,MAAM,mBAAmBhW,EAAe+N,EAAa,CAC9C,MAAE,GAAAgI,EAAI,KAAAlI,EAAM,SAAAmI,EAAU,cAAAsI,EAAe,SAAApI,GAAa,KAAK,WAAWlW,CAAK,EAAE+N,CAAG,EAElF,GAAIgI,EAAI,CACP,MAAMwI,EAAM,KAAK,eAAe,aAAaxI,EAAI,WAAYC,EAAUE,CAAQ,EAC/EsI,GAAA,OAAOD,EAAK,CAACvI,EAAUsI,CAAa,EAAE,KAAK,GAAG,CAAC,EAC/C,WACM,CACA,MAAAG,EAAe,QAAUvI,EAAW,WAAarI,EACjD6Q,EAAO,MAAM,MAAMD,CAAY,EAAE,KAAK,MAAOE,GAAM,MAAMA,EAAE,MAAM,EACvEH,UAAOE,EAAM1I,CAAQ,CACtB,CACD,EACA,MAAM,kBAAmB,CACxB,MAAMA,EAAW,KAAK,KAAK,KAAK,QAAQ,WAAY,GAAG,EACjD0I,EAAO,IAAI,KAAK,CAAC,KAAK,UAAU,KAAK,aAAc,KAAM,CAAC,CAAC,EAAG,CACnE,KAAM,mBACN,EAEMF,UAAAE,EAAM,GAAG1I,CAAQ,OAAO,CAChC,EACA,kBAAkBhW,EAAe+N,EAAa,CAC7C,KAAK,yBAA2B,GAEhC,KAAK,sBAAwB,CAC5B,KAAM,KAAK,KAAK,KAChB,SAAU,KAAK,SACf,YAAa,KAAK,mBAClB,MAAA/N,EACA,IAAA+N,CAAA,CAEF,EACA,cAAciQ,EAAqB,CAC9B,QAAK,OAAS,KACjB,OAAOA,EAAc,EAGtB,MAAMpiB,EAAW,KAAK,SAChByiB,EAAU,KAAK,yBACfO,EAAsBP,GAAA,YAAAA,EAAUL,GAElC,OAAAY,GAAuBC,GAASD,CAAmB,EAC/CA,GAAA,YAAAA,EAAqB,YAEzB,EAAChjB,GAAA,MAAAA,EAAU,cAAeA,EAAS,YAAY,QAAUoiB,EACrDA,EAAc,EAGfpiB,EAAS,YAAYoiB,CAAW,CACxC,EACA,iBAAkB,CAEjB,KAAK,SAAW,GAChB,MAAMc,EAAY,KAAK,cAAc,IAAKrT,GAASA,EAAK,IAAI,EAC5D,KAAK,SAAW,KAAK,UAAUqT,CAAS,EAAE,OACtC,KAAK,SAAW,KAAK,wBAExB,KAAK,SAAW,GAElB,EACA,iBAAiBC,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,YAAa,CACZ,GAAI,KAAK,KAAM,CACd,MAAM9R,EAAoB,CACzB,KAAM,KAAK,KAAK,KAChB,WAAY,CACX,SAAU,CAAC,KAAK,KAAK,QACtB,GAGI,oBAAe,qBAAqBA,CAAiB,CAC3D,CACD,EACA,gBAAiB,CAChB,GAAI,CAAC,KAAK,WAAY,OAGrB,KAAK,WAAW,OAASuO,IACzB,KAAK,WAAW,WAAW,YAAc,wBAGzC,KAAK,SAAS,oBAAoB,CACjC,KAAM,SACN,KAAM,OACN,CAEH,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,EACA,eAAgB,CACf,KAAK,OAAS,GACL,uBAAc,IAAI,cAAc,QAAS,CAAE,IAAK,GAAK,EAAC,CAChE,CACD,CACD,CAAC,izCAlgDgD/W,GAAc,uBAX/DC,GAAA,QAAAC,GAAA,cAAAC,GAAA,iBAAAC,GAAA,QAAA8K,GAAA,QAAA7K,GAAA,6gBACCrE,EAuiBM,uBAviBwCC,EAAS,EAAAC,EAAA,aAAAC,EAAA,YAAAC,EAAA,0FAE1Cme,GADZne,EAAA,YAAAA,EAAA,WAgCc,uEA5BI,EAAAc,EAAAsd,EAAA,CACjB,IAAI,EACH,MARJ,6BAsBc,MAAAre,EAAeC,EAUd,4CARLqe,EAAkB,KAAAle,EAClBme,EAAO,CACZ,GAAMte,EAAA,mBACN,aACA,kBACC,qBA7BN,QAAAA,EAAA,4CAAAU,EAAAC,EAAAX,EAAA,uDAU6D,gCAC7Cue,EAAe,KAA5B7d,EAAAC,EAAAX,EAUO,QAVP,SAUO,4CATN,CAAAA,EAAA,iBAQW,oBAPOF,EAAA,OAAA8D,GAAA,CAAAzD,EACZme,EAAO,CACZ,kBACA,aACC,UAAK,WAjBX,QAmBoDre,EAAA,KAAAA,EAAA,GAAAgB,GAAAG,GAAApB,EAAA,oEAnBpDU,EAAAC,EAAAX,EAAA,yDAAAe,EAAA,cAoCE,UAIE,IAHAA,EAAgByd,SAChBC,EAAcC,CACd,iBAAOC,kEAGT,QAAA3e,EAAA,wBAAM,KA1CR,oBA0CeY,eAAa,YAAAJ,EAAA,OACzB,MAA2BT,EAAAC,EAAA,oBA3C9BA,EA+CYY,mBAAO,OAAY,IAAAsO,EACf1O,EAAC,MAAsB,CAClC,MAAKT,EAjDVC,EAAA,qEAmDI,CAQE,IAAAC,EAAA,GAAAgB,GAAA,sBAHS2d,EAAOja,EAAA,CACjB,cAAY3E,EAAC,YACZ,QAAAA,EAAA,gGANwB,sBAAKuc,UAAgB,qBAAe,kGApDlEvc,EAAA,aAAAA,EAAA,kBAAAA,EAAA,YAAAkP,GA+DavF,IAAgB7I,EAAA+d,EAAA,CACvB,MACA,MAAA7e,EAAUpF,QAAK,SAAQ,sBACxB,OAAM,GACN,SAAKoF,EAAY,cACjB,MAAK,SACL,kBACC,sDARQ8e,eAAQ7e,EAAC,CAAO,EAAAmB,GAAApB,EAAA,0EA9D9B,CAAA+e,GAAA,CAAA/e,EAAA,sBAyEI,GAgBE,KAAAA,EAzFN,aA2Ec8B,EAAA9B,EAAA,mBAAA8B,EAAA,SAAA9B,EAAA,sBAAAA,EAAA,kBAAAH,EAAA,EAAAiB,EAAAke,EAAA,CAAW1B,MAA2DiB,SAAyBU,CAAWjf,EAAA,sBAAAA,EAAA,0BAAAA,EAAY2V,iBAM9H3V,EAAA,iBAAAT,EAAAS,EAAA,mBAAAT,EAAA,uCAAkI2f,iCAA0B,aAA1BA,QAA8BC,QAKzId,+FAEvB,wBAAere,EAAA,iCAAAA,EAAA,WAxFrB,gBAAAC,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,2CA2FI,mDAYM,wBAZ0B,iBAAAe,EA3FpC,GA2F2CH,eACtC,MAIEb,EAAAC,EAAA,4BAFO2J,EAAgB,CACvB,sBAAA3J,EAAA,0CAEF,QAKEA,EAAA,mBAJD,KAAM,EAAQ,qBAAAG,EACTkB,EAAS,CACb,MAAOsI,SACP,qBAAA3J,EAAA,iEAVU8e,kBAAQ,SAAQ,0DAiBxBM,OA5GTpf,EAAA,cAAAkP,GAAArP,EA8G6B,EAAAC,EAAA,OAC1B,YAAAC,EAAAC,EAAA,oBAEA,yCACC,MAcaD,EAAAC,EAAA,+BAZXqf,EAAqB,CACtB,aACC,cAAArf,EAAA,SACA,WAAK,yBAAAA,EAAA,iBAEK,QAAOC,EAAyC,KAAAA,EAAA,GAAAgB,GAAA,mCAzHhEP,EA2HuCC,EAAAX,EAAA,2DAC3B,EAAM,EAAAF,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,cAAA6N,IACNhO,EAAA,EAAoBiB,EAAAwe,EAAA,CACzB,IAAKzR,EAAA,MAAA7N,EAAA,YAAA6N,CAAA,uCA9HZ,UAiIuB0R,sBAAnB,qBAYc,GA7IlBvf,EAAA,aAAAH,IAiI8CiB,EAAOiE,EAAA,OACrC,UAAO,yBAlIvBrE,EA4IOC,EAAAX,EAAA,iBAAAA,EAAA,kEANI,QAAAO,EAAC,IAAS,CAAAJ,EACRqf,EAAU,CACjB,gBACA,KAAKxf,EAAU,2BACf,KAAK,GACJ,qDA3IP,mCA8II,GAAAe,EAAA,OAGM0e,GAAYzf,EAAA,oCAjJtBA,EAAA,cAAAH,IAkJa6f,EAAMC,EAAA,CAlJnB,MAmJK,WAAS3f,EAAE4f,OACX,sBAAgBC,EAAY,KAAA5f,EAAA,GAAAmB,GAAApB,EAAA,OAAAoB,GAC5B,YAAO0e,2CArJZ,QAAA9f,EAAA,6EAAAe,EA6GqB,GAAO,UA7G5B,CAAAge,GAAA,CAAA/e,EAAA,kBAwJE,EAGO+f,EAAc,GAAQ7E,gBAD7B,cAiBM,cAAAlb,EA3KR,6CA4JWY,MAAW,CACnB,YAAAb,EAAAC,EAAA,aAEA,eAIE,eAFSkb,EAAQ,CACjB,cAAAlb,EAAA,2BAAAA,EAAA,SAGKyf,sBAAYzf,EAAA,sCADnB,UAME,wBAAAA,EA1KL,kBAsKa0f,EAAMC,EAAA,CAtKnB,MAuKK,WAAS3f,EAAE4f,OACX,sBAAgBC,EAAY,KAAA5f,EAAA,GAAAmB,GAAApB,EAAA,OAAAoB,GAC5B,YAAO0e,2CAzKZ,QAAA9f,EAAA,6EAAAe,EAAA,QA8K2Dif,sBAAuDC,aA9KlHjgB,EAAA,aAAAA,EAAA,iBAAAA,EAAA,UAAAA,EAAA,+BAAAkP,GAAArP,EAAA,EAwL4BC,EAAA,OACzB,YAAAC,EAAAC,EAAA,mBAEsB,mCA3LzBA,EAAA,QAAAH,IAAAiB,EAAAI,EA6LKyI,CAAQ,IAAQ,IAA6CuW,iBAAmDF,EAAkBE,EAAmB,oDAAAlgB,EAAA,6FA7L1J,KAAAH,EAAA,EAAAiB,EAAAI,EAqMKyI,CAAQ,IAAQ,YAA6CqW,EAAS,KAAAtf,EAA8Bsf,EAAShgB,EAAA,oDAAAA,EAAA,kDAOxGyf,OA5MVzf,EAAA,cAAAH,IA6Ma6f,EAAMC,EAAA,CA7MnB,MA8MK,WAAS3f,EAAE4f,OACX,sBAAgBC,EAAY,KAAA5f,EAAA,GAAAmB,GAAApB,EAAA,OAAAoB,GAC5B,YAAO0e,2CAhNZ,QAAA9f,EAAA,6EAAAe,EAuLqB,GAAO,UAvL5B,CAAAge,GAAA,CAAA/e,EAAA,mBAAAA,EAAA,eAoNUe,EAAgB,OAAAP,EApN1B,MAoNmCI,CAAsB,0BAAAb,EAAAC,EAAA,sBAC3CmgB,sCArNdngB,EAAA,aAAAH,IAAAC,EAqNmCc,MAAO,CAAQ,YAAAb,EAAAC,EAAA,eAC9C,0CAA6B,MAAAD,EAA2BC,EAAd,kBAC1CG,EAA2CigB,EAAA,cAvN/C,KAuNiBC,yBAvNjB3f,EAAAC,EAAAX,EAAA,0BA0NmB8e,UA1NnB,wBA0N6Cle,MAAO,OAChD,MAMMb,EAAAC,EAAA,4BALL,MAIED,EAAA,CAAAC,EAAA,6CAFAsgB,EAAiB,CACjB,cAAkBtgB,EAAA,+GAUf,yBAPA,KAAAQ,EAAA,OACL,MAKeT,EAAAC,EAAA,2BAxOpBugB,EAmOgD,SAnOhD,MAoO2DxgB,EAAAC,EAAA,wCACrDO,EAEW,KAAAG,EAFI8f,EAAkBxgB,EAAA,wDAAAG,EAAOme,EAAO,IAAAte,EAAA,mBArOrD,8BAAAU,EAAAC,EAAAX,EAAA,8EA6Oe4f,YA7Of,2DA8OYhf,MAAO,OAEf,MAAiFb,EAAAC,EAAA,8BAhPrFygB,EAgPqE,OAAAzgB,EAAA,wDAGvC,iCAAAA,EAnP9B,WAuPwDA,EAvPxD,2CAuPkEY,MAAO,OACrE,MAKWb,EAAAC,EAAA,mBA7PfkB,EAyPQyI,cACHpJ,EAEW,KAAAG,EA5PhBC,EA2PsDX,EAAA,6DAAAA,EAAA,qBA3PtDG,EAAAme,EAAA,SA2PS3U,EAAO,UAAS,WAAApJ,EAAA,KA3PzBG,EAAAC,EAAAX,EAAA,0EAgQmB0gB,UAhQnB,oDAgQyE9f,MAAO,OAC5E,MAAqDb,EAAAC,EAAA,iBAGtC0gB,KAAU,OAAIC,mCAAW,mBAAA3gB,EApQ5C,iCAoQsDY,MAAO,aACzCggB,EAAe5gB,EAAA,4BArQnCA,EAAA,iBAAAH,IAAAiB,EAqQ6CF,EAAa,CAAE,IAAI,EAAS,MAAIb,EAAGC,EAAA,eAAC,qBArQjF,kBAuQ6GpF,EAAS,KAAA8F,EAAAC,EAAAX,EAAA,gHAKjG6gB,KAAjB,EAA0D,YAAA7gB,EAAA,eA5Q9DwQ,GAAAxQ,EAAA,qCAAAH,EAAA,EA+QwCqd,KAClC,IAAK,QAAAld,EAAA,gBAAAA,EAAA,WAAAA,EAAA,yEAKoB,GAAMkgB,GADlClgB,EAAA,cAAAA,EAAA,qBAAAA,EAuBM,QA3ST,CAAAA,EAAA,YAAAA,EAAA,mBAAAH,EAAA,EAAAC,EAwRYc,MAAO,aAEJ8e,EAAM1f,EAAA,iBAChBA,EAAA,QAAAH,EAAA,EAAkBC,EAAA,MAAA+D,GAAA,CAAA1D,EAAMe,EAAO,UA3RpC,8BAAAR,EAAAC,EAAAX,EAAA,mDA8RK,QACCkB,EAMS,cANDX,EAAQ,KAA2CJ,EAAAyO,EAAA,0CAC/C,IAAI,cACXrO,EAAQ,KAAOC,EAAA,iFAjS1B,EAAAG,EAAAX,EAAA,oFAySQ8gB,4BAzSRpgB,EAAAC,EAAAX,EAAA,+BA6SmB0gB,WA7SnB,kDA6SuE9f,MAAO,OAC1E,MAAsCb,EAAAC,EAAA,8DAGvB0gB,aAjTnB,+BAiToD9f,MAAO,OACvD,MAAuFb,EAAAC,EAAA,mBAA1DkB,EAAW,CAAC,KAAK,qBAlTlD,8BAAAR,EAAAC,EAAAX,EAAA,uBAmTI,MAAkCG,EAAAe,EAAA,gBAnTtC,oBAqTMX,EAIC,KAJ+BC,EAAA,QAAkEugB,kGArTxG,SAAAjd,EAAA,IA6TI,QAES6F,EAAgB,CACvB,QAAOqX,qEAGT,QAIEhhB,EAAA,iBAHD,KAAK,EAAO,qBAAAG,EACJwJ,EAAgB,CACvB,mBAAA3J,EAAA,6FAK4B6gB,qBAA/B,IAAA7gB,EAAA,YAAAA,EAAA,eAG4BwQ,GAAyCmF,qDAA8B4G,EAAgB,uBAAevc,aAAYihB,OAAQ,GAAAjhB,EAAA,kCAAAA,EAAA,0BADtJ,GA7UHH,EAAA,EAAAC,EAyVYc,MAAO,QAEf,MAKWb,EAAAC,EAAA,mBAhWfkB,EA4VQyI,cACHpJ,EAEI,KAAAG,EAFKC,EAAEX,EAAA,wDACP2J,8EA9VT,EAAAhJ,EAAAX,EAAA,2DAmWmBkhB,UAnWnB,kCAmWuDtgB,MAAO,QAC1D,MAEab,EAAAC,EAAA,mBAFWkB,EAAO,UApWnC,8BAAAR,EAAAC,EAAAX,EAAA,mDAuWI,QACCkB,EAMS,cANDX,EAAQ,KAA2CJ,EAAAyO,EAAA,0CAC/C,IAAI,cACXrO,EAAQ,KAAOC,EAAA,mFA1WzB,EAAAG,EAAAX,EAAA,yEAkXwB0gB,EAlXxB,MAAA1gB,EAAA,YAAAA,EAgYM,2BAAAc,EAAAqgB,GAAA,kBAZI5gB,EAAE3F,IAAI,CAAAuF,EACVihB,EAAyB,CACzB,KAAAphB,EAAA,KACA,aAAAA,EAAA,cACA,kBAAWkd,iBACX,uBAAamE,qBACb,YAAUrhB,EAAEof,SACZ,cAAApf,EAAA,kBACA,aAAQ0f,EAAM,YACd,0BAAO1f,sBAAEshB,CAAKthB,EAAA,OACd,OAAAA,EAAA,OACA,UAAAC,EAAA,EAAmB,IAAEshB,EAAmB,IAAAngB,GAAApB,EAAA,qBAAAoB,CAAA,sBAAApB,EAAA,qDA/X9C,gMAmYwB0gB,GAnYxB,IAAA1gB,EAAA,YAAAA,EA+YM,0BAAAc,EAAAqgB,GAAA,kBAVA5gB,EAAWqf,OACF4B,EAAU,CACnB,YAAU9S,WACV,YAAM9T,EAAI,SACV,WAAUoF,EAAEyhB,QACZ,KAAAzhB,EAAA,KACA,aAAAA,EAAA,cACA,kBAAWkd,iBACX,uBAAYkC,qBACZ,YAAQM,qDA9Yd,gJAkZwBgB,IAlZxB,GAAA1gB,EAAA,YAAAA,EAmZ4D,8CAAAc,EAAAqgB,GAAA,kBAA1C5gB,EAAYkhB,oDAnZ9B,2BAsZwBf,GAtZxB,IAAA1gB,EAAA,YAAAA,EAgaM,kBAAAc,EAAAqgB,GAAA,kBARI5gB,EAAE0gB,IAAQ,CAAA9gB,EACduhB,GAAiBC,CACjB,KAAA3hB,EAAA,SACA,kBAAUA,EAAA,eACV,uBAAW4f,EAAQ,mBACnB,KAAS5f,EAAA,KACT,YAAUA,EAAEof,SACZ,YAAQM,qDA/Zd,mHAmamB7C,SAnanB,uDAmagFjc,MAAO,QACnF,MAEab,EAAAC,EAAA,iBAFqBG,EAAAe,EAAA,gBApatC,2BAAAR,EAAAC,EAAAX,EAAA,uDAyamB6c,UAzanB,8BAyaqDjc,MAAO,gBACxDZ,EA8EM,yBA7EM2V,EAAiB,EAAA7V,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,YAAA4hB,EAAAziB,SAA5BW,EAIM,WAAAX,GAAA,CAAAa,EA/aX,2BA2a+CY,MAAO,OAChD,MAEMb,EAAAC,EAAA,sBA9aZQ,EAAA,WAAAG,EAAAxB,EAAA,KAibK,MAAM4B,EAjbX,GAibkBH,qBACZZ,EAoEM,qBAlECH,EAAA,EAAK,EAAYC,EAAA+E,GAAA,KAAAC,GAAA8c,EAAA,CAAAjM,EAAAzI,MACjBrN,EAAA,IAAS,MAAU,KAAAV,EAAA,IAAA+N,GAEzB,MA8DMnN,EAAAC,EAAA,8BA7DL,eAEM,mBAAAb,CAAA,KADF,MAAG,CAEI,MAAmBY,EAAAC,EAAA,sBAA9BW,EAAAuM,EAAA,KAAAyI,EACC,cAGY7V,EAAA,MAAAkE,GAAA,CAFWxD,EAAA,YAAYL,EAAAe,EAAA,cA7b5C,yBAAAR,EAAAC,EAAAX,EAAA,mDAicS,KAAoCQ,EAAA,aAAAT,EAAAC,EAAA,mBAjc7C,EAAAW,EAAAgV,EAAA,aAmcQ,GAAA5U,EAAA,OAAA4U,EACC,eAGY7V,EAAA,MAAAgP,GAAA,CAFWtO,EAAA,YAAYL,EAAAe,EAAA,cArc5C,yBAAAR,EAAAC,EAAAX,EAAA,oDAycS,KAAoCQ,EAAA,aAAAT,EAAAC,EAAA,mBAzc7C,EAAAW,EAAAgV,EAAA,cA2cQ,GAAA5U,EAAA,OAAA4U,EACC,mBAGT7V,EAAA,MAAAmE,GAAA,CAFgCzD,EAAA,YAAYL,EAAAe,EAAA,cA7c5C,yBAAAR,EAAAC,EAAAX,EAAA,uDAidS,KAAoCQ,EAAA,aAAAT,EAAAC,EAAA,mBAjd7C,EAAAW,EAAAgV,EAAA,kBAmdQ,GAAA5U,EAAA,OAAA4U,EACC,cAGY7V,EAAA,MAAAoE,GAAA,CAFW1D,EAAA,YAAYL,EAAAe,EAAA,cArd5C,yBAAAR,EAAAC,EAAAX,EAAA,mDAydS,KAAoCQ,EAAA,aAAAT,EAAAC,EAAA,mBAzd7C,EAAAW,EAAAgV,EAAA,aA2dQ,GAAA5U,EAAA,OAAA4U,EACC,cAGY7V,EAAA,MAAAmF,GAAA,CAFWzE,EAAA,YAAYL,EAAAe,EAAA,cA7d5C,yBAAAR,EAAAC,EAAAX,EAAA,mDAieS,KAAoCQ,EAAA,aAAAT,EAAAC,EAAA,mBAje7C,EAAAW,EAAAgV,EAAA,aAoeQ,GAAM5U,EAped,GAoeqBH,aAELihB,QAAgB7hB,EAAK,gCAterCA,EAAA,WAAAb,EAAA+N,EAAA,GAAArN,EAuesB,EAAAiB,EAAAO,EAAA,CACX,IAAK,EACN,aACC,MAAKrB,UAAE8hB,SAA4B,gEA1e9C,QAAA1gB,IAAApB,EAAA,kBAAAb,EAAA+N,EAAA,GA6egB6U,gBAAoB,SAAK,IAAAhhB,EADhC,GAOE,IAAAf,EAnfX,wBA8esB,EAAAc,EAAAO,EAAA,CACZ,IAAI,EACH,KAAK,QACN,iBACC,MAAKrB,UAAEgiB,SAA6B,wEAlf/C,QAAA5gB,IAAApB,EAAA,mBAAAb,EAAA+N,EAAA,gCAAAnM,EAAA,iDAAAA,EAAA,cAmPwCH,MAAO,OAC3C,MAAiCb,EAAAC,EAAA,iBAGlB4f,GAAQ5f,wBAAqB,GAAQ,eAqQ1C0gB,KAAsC/K,cAA+BqK,CAA6BiC,qCAAY,GAAShC,8EA5frIpgB,IA0gB4BC,EAAA,OACzB,YAAAC,EAAAC,EAAA,mBAEA,eAUgB,0BARdkiB,EAAyB,CACzB,cACA,sBAAc,GACd,eAAWvF,cACZ,cAAO,EACN,YAAOqD,WACP,iCAAAhgB,EAAA,UAIF,uBAYMA,EAAA,qBAZA,KAzhBT,EAyhBgBY,4BAAO,QAAgB,yBAAAJ,EAAA,OACnC,MAUaT,EAAAC,EAAA,6BARXqf,EAAqB,CACtB,YACC,cAAArf,EAAA,uBAEU,sBAAqDA,EAAA,kCAhiBrEU,EAiiB0CC,EAAAX,EAAA,gEAAO,EAAI,EAAAF,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,UAAAwJ,IAAQ3J,EAAM,EAAAiB,EAAAwe,EAAA,CAAG,IAAK9V,EAAA,MAAAA,SAEmB,8BAA5E,GAAK,GAAArJ,EAA8C6f,EAAS,OAAAhgB,EAAA,oDAniB9E,uFAAA+e,GAAA,CAAA/e,EAAA,oBAuiBiBe,EAAa,OAAAZ,EAviB9BgiB,EAuiB+C,MAAAniB,EAAA,qKCrf/CoiB,GAAe3iB,EAAgB,CAC9B,MAAO,CACN,SAAU,CAAC,EACX,aAAc,QACd,WAAY,OACb,EAEA,SAAU,CACT,OAAgB,OACR,OAAAqC,EAAA,KAAK,cAAL,MAAAA,EAAkB,MAAQ,SAAW,SAC7C,EACA,aAAyB,CACxB,OAAO,KAAK,QACb,EACA,aAAmE,CAC9D,IAAC,KAAK,YACF,YAER,KAAM,CAAE,KAAAugB,EAAM,KAAAC,GAASC,GAA+B,KAAK,YAAY,SAAS,EACzE,OACN,cAAe,KAAK,YAAY,cAChC,UAAW,GAAGF,CAAI,OAAOC,CAAI,GAE/B,CACD,CACD,CAAC,sHAzEmBphB,EAAAtB,EAAA,YAFpB,OAAAI,EAAA,cAAAH,EAAA,EAGiBiB,EAAAyf,EAAA,CACf,IAAI,EACJ,gBACA,2CANF,+CASGhgB,EAMC,KANYoJ,EAAgB,QAAOvO,sHATvC,SAAAwI,EAAA,IAmBa4e,SAnBb,iBAoBgB1hB,EAAAyf,EAAA,CACb,IAAK,EACL,eACD,MAAAvgB,EAAA,sCAAAA,EAAA,QAvBF,oBAyCQ,kBAfLO,EAMH,KANwBC,EAAA,YAAAL,EAAOe,EAAO,SA1BtC,eA4B+ByI,QAAQpJ,EAAQ,KAA2CoJ,EAAgBhJ,EA5B1GX,EAAA,kBAAAA,EAAA,mDAAAA,EAAA,0DAgCI,IACD,EAAA6D,KAA4B3C,EAAO,SAjCtC,8BAAAR,EAAAC,EAAAX,EAAA,oDAoC8B,EAC3BU,EAEa,IAAAC,EAAAX,EAAA,0BAAA8D,KAFe5C,EAAO,SArCtC,8BAAAR,EAAAC,EAAAX,EAAA,gLAAAe,EAAA,sCCuHM0hB,GAAc,CACnB,QAAS,UACT,KAAM,MACP,EAEAC,GAAejjB,EAAgB,CAC9B,KAAM,cACN,WAAY,CAAE,QAAAkjB,GAAS,QAAAC,GAAS,UAAAC,EAAU,EAC1C,MAAO,CACN,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,WAAY,CACX,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,QAAS,CACR,KAAM,MACP,EACA,QAAS,CACR,KAAM,QACN,QAAS,EACV,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAMvd,EAAO,CACZ,MAAMkR,EAAW/U,KACX,CAAE,WAAAoH,CAAA,EAAeia,GAAYtM,CAAQ,EACrC,CAAE,cAAAuM,CAAc,EAAIC,GAAY,CACrC,KAAMna,CAAA,CACN,EAMM,OACN,WANkB7M,GAAc6M,EAAY,CAC5C,SAAUvD,EAAM,SAChB,YAAakR,EAAS,oBAAoB,QAAQ,EAClD,EAIA,cAAAuM,CAAA,CAEF,EACA,MAAO,CACC,OACN,WAAY,UACZ,YAAa,CACZ,CAAE,MAAO,KAAK,QAAQ,SAAS,4BAA4B,EAAG,MAAON,GAAY,OAAQ,EACzF,CAAE,MAAO,KAAK,QAAQ,SAAS,yBAAyB,EAAG,MAAOA,GAAY,IAAK,CACpF,EAEF,EACA,SAAU,CACT,GAAGjhB,GAAUvH,GAAmBwH,GAAa1H,GAAYI,CAAiB,EAC1E,MAAuB,CACtB,OAAO,KAAK,SAAS,UACtB,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAEtE,IACR,EACA,eAAyB,CACxB,OAAO,KAAK,eAAe,cAAc,KAAK,KAAK,IAAI,CACxD,EACA,eAAyB,CACxB,GAAI,KAAK,KAAM,CACd,MAAM8oB,EAAa,KAAK,eAAe,gCAAgC,KAAK,KAAK,IAAI,EAEjF,OAACA,GAAc,CAAC,MAAM,QAAQA,CAAU,GAAKA,EAAW,SAAW,EAC/D,GAGD,CAAC,CAACA,EAAWA,EAAW,OAAS,CAAC,EAAE,QAC5C,CACO,QACR,EACA,mBAA6B,OACrB,OAAC,GAACnhB,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,mBAA6B,CACrB,OAAC,EAAE,KAAK,UAAY,KAAK,SAAS,MAAM,SAAS,UAAU,EACnE,EACA,eAAyB,CACxB,OAAO,KAAK,MAAQ,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,CACvE,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,OAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAAmU,EAA+C,KAAK,kBAAkB,KACxE,OAACnU,EAAAmU,GAAA,YAAAA,EAAe,aAAf,MAAAnU,EAA2B,QAGzBmU,EAAc,WAAW,QAFxB,IAGT,EACA,YAAsB,CACrB,OAAI,KAAK,eAAe,0BAAkC,GAEnD,GACN,KAAK,MAAQ,KAAK,iBAAmB,KAAK,gBAAgB,eAAe,KAAK,KAAK,IAAI,EAEzF,EACA,aAAgC,CAC/B,GAAI,CAAC,KAAK,MAAQ,KAAK,oBAAsB,KACrC,YAGR,MAAM2E,EAAU,KAAK,gBAMrB,OAJIA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,GAI1DA,EAAQ,KAAK,KAAK,IAAI,EAAE,QAAU,KAAK,SACnC,KAGDA,EAAQ,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,CAC7C,EACA,WAAoB,CACf,QAAK,OAAS,KACV,SAGR,MAAMA,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,KAAK,IAAI,EACtD,EAGJA,EAAQ,KAAK,KAAK,IAAI,EAAE,OACpBA,EAAQ,KAAK,KAAK,IAAI,EAAE,OAGzB,CACR,EACA,WAAqB,CAChB,IAAC,KAAK,KACF,SAER,MAAMsI,EAAY,KAAK,eAAe,wBAAwB,KAAK,KAAK,IAAI,EAC5E,GAAI,CAACA,GAAa,CAAC,KAAK,YAChB,SAEF,MAAAC,EAAQ,KAAK,YAAY,UAC/B,OAAOD,EAAYC,CACpB,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,YAAsB,CACrB,OAAO,KAAK,WAAW,gBAAgB,OAAS,CAAC,KAAK,UACvD,CACD,EACA,QAAS,CACR,gBAAiB,CACV,MAAAC,EAAa,KAAK,MAAM,QAC1BA,IACHA,EAAW,cAAc,CACxB,OAAQ,qBACR,EAEI,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,UAAW,KAAK,KAAK,KACrB,KAAM,SACN,KAAM,mBACN,EAEH,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,cAAe,CACd,KAAK,MAAM,cAAc,EACpB,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,KAAK,KACrB,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,SACN,KAAM,WACN,CACF,EACA,iBAAiBlF,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,mBAAmBmF,EAA0C,CACxDA,IAAeZ,GAAY,KAClBrQ,GAAA,KAAK,oBAAqB,SAAS,EAEnCA,GAAA,KAAK,oBAAqB,SAAS,CAEjD,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,CACD,CACD,CAAC,4WAlVAxS,EAiGU,kBA/FFhF,EAAI,EAAAkG,EAAAwiB,EAAA,CACV,cACA,KAAAtjB,EAAA,KACA,YAAeuf,WACf,cAAAvf,EAAA,WACA,gBAAAA,EAAA,YACA,sBAAcujB,EAAa,iDAC3B,4BAAmB5Z,EAAQ,QAAQ,4CACnC,eAAU+E,gBACV,oBAAWoB,EAAO,yCAClB,WAAA9P,EAAA,QACA,YAAgB6f,UACjB,kCAAkB7f,EAAA,6BACjB,iBAAgBA,EAAEqjB,aAClB,qBACA,mBAAYG,aACZ,eAAUC,eACV,YAAYC,mBACZ,UAAa1jB,EAAA,UACb,YAAUA,EAAA,YACV,eAAMC,EAAEqhB,eAAK,MAAiB,eAAAlgB,CAAA,GAvBjC,YAAAnB,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,kBAAAoB,CAAA,GAyBa,SAAMnB,EAChB,CAkBM,IAAAA,EAAA,GAAAmB,GAAApB,EAAA,eAAAoB,CAAA,EAlBN,EAAAuiB,GAAA,QAAMpjB,EA1BT,KAAAC,EAAA,aA2BoBojB,EAAa5jB,EAAA,uBA3BjCA,EAAA,eAAAH,IA6BewjB,EAAU1e,EAAA,CA7BzB,iBAAA3E,EAAA,WA+B2B6jB,sDADpB7jB,EAAO,oBAIV,QAAAA,EAAA,aAlCJ,+DAkCyBY,OAAY,OAI1B8f,QAAexY,SAAW,KAAQ,GAAAvH,EAAAX,EAAA,QADzC,SAMEA,EAAA,iEAAAA,EA3CN,4DAwCiB8jB,EAAW,EAAAhjB,EAAAijB,EAAA,CACtB,MACA,YAAc7b,0DAHNmG,EAAoB,kFAvClC,CAAA0Q,GAAA,CAAA/e,EAAA,+BAAAe,EAAA,MA+Ca,OACV,eAAAR,EAAA,KAhDHP,EAAA,kBAAAA,EAAA,eAAAH,MAgDmEqB,EAAoB,OAhDvF,qDAAAR,EAAAC,EAAAX,EAAA,2DAmDG,GAcW,IAjEdA,EAAA,gBAoEae,EAAc,GAGX,KAvEhBlB,EAAA,IAmDkDqB,EAA0B,OAnD5E,4CAoDI,QAAAX,EAAA,KApDJP,EAAA,qBAAAH,EAAA,EAAAC,EAAA+E,GAAA,SAuDInE,EAAAC,EASWX,EAhEf,6DAAAH,IAyD2BC,EAAA+E,GAAA,SAAAnE,EAAAC,EAAtBX,EAMO,mDAAAA,EA/DZ,YAyDmCH,IAAAC,EAAA,cAC7B,QAAMG,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,gBAAAA,EAAA,kBAAAE,CAAA,IA1DZ,CA4DM0D,GAAiBlD,EAAA,IAAAC,EAAAX,EAAA,uCAAAG,EAAMe,EAAQ,CAAC,IAAK,kBA5D3C,iCAAAR,EAAAC,EAAAX,EAAA,6DAAAe,EAAA,qBAuEgB,GAFQ,iBAAAR,EAAA,KAAAJ,EAAQe,EAAW,CAAC,KAAK,qBArEjD,8BAAAR,EAAAC,EAAAX,EAAA,wDAwEG,QAxEHkB,EAyEOyI,cACHpJ,EAEM,KAAAG,EAFGC,qBAAE,iCAAY,UACtBgJ,OA3EL,QA4EU1J,EAAA,KACNA,EAAG0J,aAAQ,cAAQ3J,EAAA,gBAAAE,CAAA,IAAAS,EAAAX,EAAA,iEA7EvBU,EAAA,IAAAC,EAAAX,EAAA,4EAoFa,wCACGY,EAAO,KAAAJ,EAAA,OACnB,MAEaT,EAAAC,EAAA,8BAFkBG,EAAAe,EAAA,CAAE,IAAK,MAAa,KAAK,qBAtF5D,8BAAAR,EAAAC,EAAAX,EAAA,8EAyFI,QAzFJkB,EA0FQyI,qBA1FRjJ,EAAAC,EAAAX,EAAA,4FAiFkBqjB,QAjFlB,aAiFiD,QAC9C,kBAAY9iB,EAAM3F,IAAI,CAAAuF,EAAY6jB,EAAU,MAAAhkB,EAAA,2BAlF/C,wCA+FmBkI,SA/FnB,CAAAlI,EAAA,WA+F+D,QAAQ,OAAAA,EAAA,aACpE,mBAAAO,EAAA,KAhGHJ,EAAA4jB,EAAA,aAAA/jB,EAAA,maCEE4D,GAAW,CACX,YACA,YACA,QAAW,aACX,YACA,+EAPF,ykSAmBSI,GAAA,mBA0BF/D,EAAA,0DCmJPgkB,GAAexkB,EAAgB,CAC9B,KAAM,aACN,WAAY,CAAE,QAAAkjB,GAAS,kBAAAxY,GAAmB,SAAA+Z,EAAS,EACnD,MAAO,CACN,gBAAiB,CAChB,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,EACA,WAAY,CACX,KAAM,OACP,EACA,SAAU,CAAC,EACX,YAAa,CACZ,KAAM,OACP,EACA,QAAS,CACR,KAAM,MACP,EACA,SAAU,CACT,KAAM,OACP,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,aAAc,CACb,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAO,CACC,OACN,2BAA4B,GAC5B,mBAAoB,GACpB,UAAW,YACX,WAAY,KACZ,WAAY,CACX,CAAE,MAAO,UAAW,MAAO,KAAK,QAAQ,SAAS,mBAAmB,CAAE,EACtE,CAAE,MAAO,YAAa,MAAO,KAAK,QAAQ,SAAS,qBAAqB,CAAE,CAC3E,EAEF,EACA,SAAU,CACT,GAAG1iB,GAAUvH,GAAmBwH,GAAatH,EAAmBJ,EAAU,EAC1E,sBAA+B,CAC9B,OAAO,KAAK,SAAS,oBACtB,EACA,iBAA2B,CAC1B,OAAO,KAAK,SAAS,kBACtB,EACA,eAAyB,CACjB,YAAK,oBAAsB,KAAK,YAAc,SACtD,EACA,mBAA6B,CAC5B,MAAMoqB,EAAW,CAChBC,GACA3b,GACA4b,GACAC,EAAA,EAEG,OAAC,KAAK,aAAeH,EAAS,SAAS,KAAK,YAAY,IAAI,EACxD,GAGD,CAAC,CAAC,KAAK,sBAAwB,CAAC,KAAK,eAC7C,EACA,oBAA8B,SAC7B,IAAI1Z,IAAS3I,EAAA,KAAK,iBAAL,YAAAA,EAAqB,SAAU,GACxC0b,IAAUje,EAAA,KAAK,iBAAL,YAAAA,EAAqB,UAAW,GAC9C,GAAI,KAAK,aAAe,MAAQ,KAAK,kBAAoB,KAAM,CAC9D,MAAM3E,EAAO,KAAK,gBAAgB,QAAQ,KAAK,WAAW,IAAI,EAC9D6P,EAAShD,GAA0B,KAAK,gBAAiB7M,EAAO,KAAK,cAAe,EACpF4iB,EAAUxB,GAA2B,KAAK,gBAAiBphB,EAAO,KAAK,cAAe,OAGjF,MAAM,QAAQ6P,CAAM,IACxBA,EAAS,IAEL,MAAM,QAAQ+S,CAAO,IACzBA,EAAU,IAKX,SAAA/S,EAAO,SAAW,GACjBA,EAAO,MAAO/C,GAAU,KAAK,wBAAwBA,EAAOpF,EAAmB,IAAI,CAAC,GACpFkb,EAAQ,KAAM+G,GAAW,KAAK,wBAAwBA,EAAQjiB,EAAmB,IAAI,CAAC,EAMzF,EACA,kBAA4B,CAC3B,OAAI,KAAK,SAAiB,GAGtB,KAAK,mBAA2B,KAAK,eAAiB,KAAK,aAAe,KAEvE,EACR,EACA,qBAA+B,CAC1B,IAAC,KAAK,gBACF,SAEF,MAAAkG,EAAgB,KAAK,eAAe,aACpCgc,EAAgB,KAAK,eAAe,cAE1C,OACC,KAAK,YACLhc,IAAkB,KAAK,WAAW,MAClC,CAAC,KAAK,eAAe,gBAAgB,KAAK,WAAW,IAAI,EAElD,GAGJgc,EAAc,QAAUhc,EACpB,CAAC,CAAC,KAAK,YAAY,KACxB5N,GAAS,KAAK,eAAe,gBAAgBA,EAAK,IAAI,GAAKA,EAAK,OAAS4N,CAAA,EAGrE,EACR,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,iBAA4B,CAC3B,OAAO,KAAK,QACb,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EAEA,UAAmB,CAIlB,OAHiB,KAAK,gBACK,cAAc,KAAK,WAAW,KAAM,cAAc,EAE5D,CAAC,CACnB,EACA,kBAA6B,CAIrB,MAFa,CAAC,GADJ,KAAK,gBACW,eAAe,KAAK,SAAU,MAAM,CAAC,EAAE,SAGzE,EACA,aAA8B,CAC7B,OAAI,KAAK,mBAEJ,KAAK,WACD,KAAK,eAAe,cAAc,KAAK,UAAU,EAKlD,KAAK,WAGN,KAAK,eAAe,cAAc,KAAK,eAAe,CAC9D,EACA,6BAAoD,CAC7C,MAAAkX,EAAS,KAAK,YAAY,KAAK,CAAC,CAAE,KAAAxY,CAAK,IAAMA,IAAS,KAAK,eAAe,EAChF,GAAIwY,EACH,OAAOA,EAAO,QAGhB,EACA,aAAgC,CAC3B,IAAC,KAAK,WACT,MAAO,GAEF,MAAAhkB,EAA2B,KAAK,SAAsB,sBAC3D,KAAK,WAAW,MAGjB,OAAOA,EAAM,OACZ,CAAC,CAAE,KAAAwL,CAAA,EAAQiU,IACV,KAAK,YACLjU,IAAS,KAAK,WAAW,MACzBxL,EAAM,UAAWd,GAASA,EAAK,OAASsM,CAAI,IAAMiU,CAAA,CAErD,EACA,kBAA2B,CACpB,MAAAvgB,EAAO,KAAK,YAAY,KAC5BA,GAAS,KAAK,aAAeA,EAAK,OAAS,KAAK,YAAY,MAEvD,OAAAA,EAAOA,EAAK,MAAQ,EAC5B,EACA,gBAA8C,CAC7C,OAAK,KAAK,WAEH,KAAK,eAAe,YAAY,KAAK,WAAW,KAAM,KAAK,WAAW,WAAW,EAF3D,IAG9B,EACA,kBAA4B,CAC3B,OAAO,KAAK,iBAAmB,MAAQ,KAAK,eAAe,OAAO,OAAS,CAC5E,CACD,EACA,MAAO,CACN,UAAW,CACV,QAAQ6pB,EAAK,CACZ,KAAK,iBAAiB,EAAE,EACpBA,IAAQ,WACX,KAAK,YAAY,EACZ,gBAAa,KAAK,iBAAiB,CAAC,GAEzC,KAAK,WAAa,IAEpB,EACA,UAAW,EACZ,EACA,kBAAkBC,EAAeC,EAAe,CAC3CD,GAAQ,CAACC,EACZ,WAAW,IAAM,CACZ,KAAK,qBAGT,KAAK,2BAA6B,KAAK,kBACnC,KAAK,6BACR,KAAK,mBAAqB,GAErB,gBAAW,MAAM,mCAAoC,CACzD,KAAM,wBACN,KAEA,GAAI,EACID,IACX,KAAK,2BAA6B,GAEpC,CACD,EACA,QAAS,CACR,wBACC9Z,EACArB,EACC,CACD,OAAKqB,EAEE,OAAOA,GAAS,SAAWA,IAASrB,EAAOqB,EAAK,OAASrB,EAF9C,EAGnB,EACA,kBAAkBkb,EAAkB,CACnC,KAAK,UAAYA,CAClB,EACA,qBAAqBA,EAAa,CACjC,KAAK,WAAaA,EAElB,KAAK,iBAAiB,CAAC,EACvB,KAAK,YAAY,CAClB,EACA,qBAAqB7c,EAA2B,OAE9C,IAACA,GACD,CAAC,KAAK,kBACN,CAAC,KAAK,cACN9F,EAAA,KAAK,iBAAL,YAAAA,EAAqB,cAAe,OAE7B,SAWR,MAAM8iB,GARL,KAAK,gBAAgB,6BAA6B,KAAK,WAAW,IAAI,EAAE,MAAQ,IAE7B,OAAO,CAAChmB,EAAehE,EAAMuE,IAC5EvE,EAAK,CAAC,GAAKA,EAAK,CAAC,EAAE,OAASgN,EAAiB,CAAC,GAAGhJ,EAAKO,CAAK,EACxDP,EACL,CAAE,GAGyC,IAC5CimB,GAAA,SAAe,OAAAtlB,GAAAuC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,aAArB,YAAAvC,EAAkCslB,GAAU,EAG7D,OAAID,EAAgB,SAAW,EAAU,GAElC,IAAIA,EAAgB,KAAK,KAAK,CAAC,GACvC,EACA,eAAgB,CACf,KAAK,MAAM,SAAS,EAChB,KAAK,YACH,gBAAW,MAAM,0BAA2B,CAChD,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,QACN,KAAM,kBACN,CAEH,EACA,iBAAiB1G,EAAa,CACxB,WAAM,YAAaA,CAAG,CAC5B,EACA,WAAY,CACX,KAAK,MAAM,SAAS,CACrB,EACA,aAAc,CACb,KAAK,MAAM,WAAW,CACvB,EACA,kBAAkB3S,EAAe,CAC1B,MAAApM,EAAQ,KAAK,YAAY,UAAWvE,GAASA,EAAK,OAAS2Q,CAAK,EAAI,EACrE,WAAM,kBAAmBA,EAAOpM,CAAK,CAC3C,EACA,uBAAwB,CACnB,KAAK,YACH,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,QACN,KAAM,qBACN,CAEH,EACA,SAASyI,EAAkB,CAC1B,MAAMkd,EAAYld,EAAS,UAAU,EAAG,EAAE,EACtC,OAAAkd,EAAU,OAASld,EAAS,OACxB,GAAGkd,CAAS,MAEbA,CACR,EACA,cAAe,CACd,KAAK,MAAM,cAAc,CAC1B,CACD,CACD,CAAC,oTAngBDlhB,GAAA,8MACChE,EAgKU,WA9JR,OAAAC,EAAA,EAAmBiB,EAAAwiB,EAAA,CACnB,KAAAtjB,EAAA,YACA,YAAgB+kB,WAChB,cAAA/kB,EAAA,WACA,+BAA2B2J,EAAQ,YACnC,sBAAcqb,EAAmB,gDACjC,4BAAmBrb,EAAQ,QAAQ,2CACnC,eAAU+E,sBACV,oBAAkBuW,EAA2B,gDAC7C,WAAejlB,EAAA,QACf,mBAAsBklB,8BACtB,kBAAAllB,EAAA,iBACA,uBAAgB6f,mBACjB,kCAAiB7f,EAAA,6BACjB,iBAAaA,EAAA,aACZ,oBACA,eAAU,kBACV,eAAUyjB,eACV,YAAYC,EAAW,KAAAzjB,EAAA,GAAAmB,GAAApB,EAAA,kBAAAoB,CAAA,GACvB,UAAUpB,EAAEwjB,UACZ,YAAaxjB,EAAA,YACb,YAAMA,EAAA,iBAxBT,eAAAC,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,qBAAAoB,CAAA,GA0Ba,SAAMnB,EAChB,CAuCM,IAAAA,EAAA,GAAAmB,GAAApB,EAAA,eAAAoB,CAAA,EAvCN,EAAAuiB,GAAA,QAAMpjB,EA3BT,KAAAC,EAAA,OA6BW2kB,QAAYnlB,EAAM,uBA7B7BA,EAAA,oBAAAH,EAAA,EA8BKiB,EAAUue,EAAA,CACV,IAAI,EACH,cACA,aACA,cAAa1V,kBACd,eAAU3J,EAAA,2CACV,cAAa,QAAkB,kCAC9B,gDAEU,sBAC4DA,EAAA,4BAA1DO,EAxClB,KAwCqCoJ,mCAGJhJ,EAAAX,EAAA,oDACrBH,EAAA,EAAK,EAAIC,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,YAAApF,IACTiF,EAAW,EAAAiB,EAAAwe,EAAA,CACjB,IAAK1kB,EAAC,KACL,MAAKA,EAAKwqB,KACX,6BAAAplB,EAAA,SAAApF,EAAA,SAAAoF,EAAA,qBAAApF,EAAA,QAhDN,oCAmDkByqB,iBAAZ,cAnDNrlB,EAoDOqlB,gDAEDzqB,EAtDN,OAAAiF,EAAA,EAAAC,EAAA,OAAA8D,GAAAjD,EAAAX,EAAA,qBAAApF,EAAA,YAAAiF,EAAA,EAAAC,EAAA,OAAA+D,GAAAlD,EAAAX,EAAA,0DAAApF,EAAA,mIAAAiF,EAAA,EAAAC,EA2DyBc,OAAY,OAE1B0kB,QAAuBC,EAAQ,eAAA5kB,EADtCX,EAKE,mCAAAA,EAjEN,mCA8DyB,EAAAc,EAAA6D,EAAA,CACnB,MACA,QAAA3E,EAAA,yBAAAA,EAAA,UAhEN,sBAAAA,EAAA,4EAAAe,EAAA,MA4Fa,OACV,eAAAR,EAAA,KAAAP,EA7FH,4DA+FYY,MAAO,OAEf,MAEab,EAAAC,EAAA,uBAFkBG,EAAAe,EAAA,CAAE,IAAK,MAAa,KAAK,qBAjG5D,8BAAAR,EAAAC,EAAAX,EAAA,uDAoGwBulB,MApGxBvlB,EAAA,WAyHI,GAEW,KA3HfH,EAAA,EAoGiE2lB,WACjD,QAAOxlB,EAOV,mBAAAA,EAAA,qCALNO,EAIC,KAJuBC,EAAS,iBAAAR,EAAA,kGAgBjC,OAAA8D,EAAA,IARG,QAAAvD,EAAC,IAAW,CACPJ,EAAAiO,EAAA,CACR,iBACA,YAAWkX,GACX,YAAO3b,GACR,cAAgB,mBAAS3J,EAAA,SAAAA,EAAA,gBACzB,gBAAa,SAAuB,0CACnC,mBAASylB,yEAtHhB,mDAyHqBF,YAAQ,IAEdvlB,EA3Hf,SA6HGe,EAAA,QAJqClB,EAAA,EAAAiB,EAAAI,EAAA,CAAC,IAAI,YAzH7C,8BAAAR,EAAAC,EAAAX,EAAA,0DA6HG,IA7HH,WA6HuBY,MAAO,OAC1B,MAEMb,EAAAC,EAAA,qCACNG,EAEaulB,CAAA,IAFkBvlB,EAAAe,EAAA,CAAE,IAAK,MAAa,KAAK,qBAjI5D,8BAAAR,EAAAC,EAAAX,EAAA,uDAoII,MApIJG,EAAAe,EAAA,KAqIQyI,KAAO,WACVpJ,EAMI,KAAAG,EALEC,EAA4CX,EAAA,2DAClCQ,EAAA,KACd,qJAzIP,EAAAG,EAAAX,EAAA,gEAiJa,QACS,iBAAAO,EAAA,KAAYJ,EAAAe,EAAA,CAAE,IAAK,MAAa,KAAK,qBAlJ3D,8BAAAR,EAAAC,EAAAX,EAAA,oDAuJa,wCACGY,EAAO,KAAAJ,EAAA,OACnB,MAEaT,EAAAC,EAAA,8BAFkBG,EAAAe,EAAA,CAAE,IAAK,MAAa,KAAK,qBAzJ5D,8BAAAR,EAAAC,EAAAX,EAAA,8EA4JI,QA5JJkB,EA6JQyI,qBA7JRjJ,EAAAC,EAAAX,EAAA,4FAoEkB2lB,MApElB3lB,EAAA,qCAAAO,EAAA,MAAAV,EAAA,EAAAiB,EAyE4B8kB,GAAgC,uBAAArlB,EAAA,KAzE5DG,EAAA,sCA0EG,gBACC,MAcaX,EAAAC,EAAA,uBAZPqf,EAAO,CACZ,cAAUrf,EAAA,WACT,aACA,WAAK,yBAAAA,EAAA,qBAEK,QAAOC,EAAiD,KAAAA,EAAA,GAAAgB,GAAA,mCAlFxEP,EAoF0CC,EAAAX,EAAA,mEAC9B,EAAQ,EAAAF,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,iBAAA4H,IACR/H,EAAU,EAAAiB,EAAAwe,EAAA,CACf,IAAK1X,EAAA,MAAAA,qCAvFZ,mfCqIAie,GAAepmB,EAAgB,CAC9B,KAAM,eACN,WAAY,CACX,kBAAA0K,GACA,UAAA2b,GACA,SAAApmB,EACD,EACA,MAAO,CACN,SAAU,CACT,KAAM,MACP,EACA,QAAS,CACR,KAAM,MACP,CACD,EACA,OAAQ,CACP,MAAMgD,EAASC,KAGR,OACN,gBAHuBI,GAAmB,CAAE,OAAAL,CAAQ,EAGpD,CAEF,EACA,KAAM,KACE,CACN,uBAAwBqjB,GAAe,IAGzC,SAAU,CACT,GAAGvkB,GAAUvH,GAAmBwH,GAAa1H,GAAYI,CAAiB,EAC1E,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,QAAkB,CACjE,EACA,UAAwC,CACvC,OAAI,KAAK,KACD,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,EAGtE,IACR,EACA,aAAuB,aAClB,MAAC2H,EAAA,KAAK,WAAL,MAAAA,EAAe,cACZ,SAIP,IAAAvC,EAAA,KAAK,WAAL,MAAAA,EAAe,gBACfsC,EAAA,KAAK,WAAL,MAAAA,EAAe,aAAa,eAAe,gBAC1C,CACK,MAAAmkB,GAAcpkB,EAAA,KAAK,WAAL,YAAAA,EAAe,aAAa,YAC5C,UAAOokB,GAAgB,UACnB,OAAAA,EAGR,GAAI,KAAK,KAAM,CACd,MAAMC,EAAmB,KAAK,gBAC5B,mBACA,aAAW,wBAAwB,KAAK,KAAMD,EAAa,WAAY,CAAE,GAEvE,UAAOC,GAAqB,UACxB,OAAAA,CAET,CACD,CAEO,QACR,EACA,WAAqB,OACb,UACNnkB,EAAA,KAAK,OAAL,MAAAA,EAAW,SAAW,KAAK,KAAK,OAAO,YAAc,KAAK,KAAK,OAAO,aAExE,EACA,aAAsB,CACrB,OAAI,KAAK,SACDokB,GAA0B,KAAK,QAAQ,EAGxC,EACR,EACA,mBAA6B,CACrB,SACN,KAAK,MACJ,KAAK,KAAK,OAAS7iB,IACnB,KAAK,KAAK,WAAW,OAAS,UAEjC,EACA,eAAyB,CACxB,MAAO,GAAQ,KAAK,MAAQ,KAAK,KAAK,OAASqF,GAChD,EACA,mBAAwC,SACvC,GAAI,CAAC,KAAK,MAAQ,GAACnJ,GAAAuC,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAvC,EAAyB,QACpC,OAGF,MAAA4mB,EAAa,KAAK,gBAAgB,0BACvC,KAAK,SAAS,SAAS,CAAC,EACxB,aACA,IAGG,aAAM,QAAQA,CAAU,EACpBA,EAAW,KAAK,IAAI,EAGrBA,CACR,EACA,gBAAqC,SACpC,GAAI,GAAC,KAAK,MAAQ,GAAC5mB,GAAAuC,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAvC,EAAyB,SAIrC,YAAK,gBAAgB,cAAc,KAAK,SAAS,SAAS,CAAC,EAAG,KAAK,KAAM,MAAM,CACvF,EACA,oBAA8B,SAC7B,MAAO,IAAQA,GAAAuC,EAAA,KAAK,WAAL,YAAAA,EAAe,WAAf,MAAAvC,EAAyB,OACzC,EACA,eAAyB,OACjB,UAAQuC,EAAA,KAAK,WAAL,MAAAA,EAAe,QAC/B,EACA,sBAAgC,CACzB,MAAA6G,EAAmB,KAAK,eAAe,2BACvCC,EAAe,KAAK,eAAe,aACzC,MACC,CAAC,CAAC,KAAK,MACP,CAAC,KAAK,KAAK,UACX,KAAK,oBACLD,IACC,CAACC,GAAgBA,IAAiB,KAAK,SAE1C,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,mBAA6B,CACtB,MAAAJ,EAAgB,KAAK,eAAe,aAE1C,OAAO,KAAK,iBAAmB,KAAK,eAAiB,KAAK,WAAaA,CACxE,EACA,kBAA4B,CAC3B,OAAO,KAAK,eAAe,gBAC5B,EACA,gBAAyB,OACxB,QAAO1G,EAAA,KAAK,WAAL,YAAAA,EAAe,QAASwB,GAC5B,KAAK,QAAQ,SAAS,+CAA+C,EACrE,KAAK,QAAQ,SAAS,mCAAmC,CAC7D,EACA,eAAwB,OACf,QAAAxB,EAAA,KAAK,WAAL,YAAAA,EAAe,KAAM,CAC5B,KAAKuB,GACG,YAAK,QAAQ,SAAS,sDAAsD,EACpF,KAAKC,GACG,YAAK,QAAQ,SAAS,sDAAsD,EACpF,QACQ,YAAK,QAAQ,SAAS,2CAA4C,CACxE,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,CACH,CACD,EACA,QAAiB,OAChB,MAAM8iB,EAAc,KAAK,SAAWF,GAA0B,KAAK,QAAQ,EAAI,GAE/E,OAAI,KAAK,kBACD,KAAK,QAAQ,SAAS,uCAAuC,GAGjEpkB,EAAA,KAAK,WAAL,MAAAA,EAAe,cAAgB,OAAO,KAAK,SAAS,aAAa,QAAW,SACxE,KAAK,SAAS,aAAa,OAG/B,KAAK,mBACD,KAAK,QAAQ,SAAS,sCAAuC,CACnE,YAAa,CAAE,KAAMskB,CAAY,EACjC,EAGK,EACR,EACA,WAAoB,CACnB,MAAMA,EAAc,KAAK,SAAWF,GAA0B,KAAK,QAAQ,EAAI,GAC/E,OAAI,KAAK,kBACD,KAAK,QAAQ,SAAS,uCAAwC,CACpE,YAAa,CAAE,KAAME,CAAY,EACjC,EAGK,EACR,EACA,gBAAyB,SACxB,KAAI7mB,GAAAuC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAf,YAAAvC,EAA6B,kBAAmB,OAAW,CAC9D,GAAI,OAAO,KAAK,SAAS,aAAa,gBAAmB,SACjD,YAAK,SAAS,aAAa,eAEnC,GAAI,CAAC,KAAK,kBAAoB,KAAK,SAAS,aAAa,eAAe,SAChE,YAAK,SAAS,aAAa,eAAe,SAElD,GAAI,KAAK,kBAAoB,KAAK,SAAS,aAAa,eAAe,OAC/D,YAAK,SAAS,aAAa,eAAe,MAEnD,CAEA,OAAI,KAAK,mBACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,qDAAsD,CAClF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,uDAAwD,CACpF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAIC,KAAK,cACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,gDAAiD,CAC7E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,kDAAmD,CAC/E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAII,EACR,EACA,gBAAyB,SACxB,GAAI,KAAK,kBACD,SAGJ,IAAAA,GAAAuC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAf,MAAAvC,EAA6B,eAAgB,CAChD,GAAI,OAAO,KAAK,SAAS,aAAa,gBAAmB,SACjD,YAAK,SAAS,aAAa,eAGlC,IAAC,KAAK,kBACN,OAAO,KAAK,SAAS,aAAa,eAAe,UAAa,SAEvD,YAAK,SAAS,aAAa,eAAe,SAGjD,QAAK,kBACL,OAAO,KAAK,SAAS,aAAa,eAAe,QAAW,SAErD,YAAK,SAAS,aAAa,eAAe,MAEnD,CAEA,OAAI,KAAK,mBACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,qDAAsD,CAClF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,uDAAwD,CACpF,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAIC,KAAK,cACJ,KAAK,iBACD,KAAK,QAAQ,SAAS,gDAAiD,CAC7E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAEM,KAAK,QAAQ,SAAS,kDAAmD,CAC/E,YAAa,CAAE,QAAS,KAAK,WAAY,EACzC,EAII,EACR,CACD,EACA,QAAS,CACR,qBAAsB,CACjB,KAAK,MAAM,MACT,4BAAuB,KAAK,QAAQ,CAE3C,EACA,gBAAiB,CACX,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,QACN,KAAM,YACN,EACD,OAAO,KAAK,KAAK,eAAgB,SAAU,YAAY,CACxD,EACA,YAAY,EAAe,OACtB,IAAC,EAAE,OACN,OAED,MAAM9F,EAAS,EAAE,OACbA,EAAO,YAAc,MAErBqI,EAAArI,EAAO,UAAP,MAAAqI,EAAgB,MACnB,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEbrI,EAAO,QAAQ,MAAQ,WAC1B,KAAK,MAAM,UAAU,EACXA,EAAO,QAAQ,MAAQ,cAC5B,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAM,QACN,KAAM,sBACN,EACD,KAAK,SAAS,eAAiB,KAC1B,KAAK,QAAQ,KAAK,CACtB,KAAM4sB,EAAM,WACZ,GACS5sB,EAAO,QAAQ,MAAQ,YAC5B,aAAQ,UAAU6sB,EAA2B,EAGrD,EACA,kBAAmB,CACb,gBAAW,MAAM,0BAA2B,CAChD,KAAM,SACN,KAAM,WACN,CACF,EACA,eAAgB,CACf,KAAK,MAAM,SAAS,CACrB,CACD,CACD,CAAC,gLA/cD1iB,GAAA,cAAAC,GAAA,kBAAAC,GAAA,YA8De,IAAI,cA9DnBgL,GAAA,gBA+DkC7K,GAAa,8PA9D9CrE,EAyGM,0CAxGL,MAuGaG,EAAAC,EAAA,sBAvGgBumB,GAAQ,aAFvC,gBAGG,QAAAhmB,EAAA,KAAAP,EACgByJ,WAAhBzJ,EAAA,aAAAH,EAAA,EAAAC,EAAA,MAyDM8D,EAzDN,GAAA5D,EACC,wBACuD,EAAAF,EAAA,MAAA+D,GAAA,CAAA1D,EAAtDqmB,EAAsD,cAA3CjmB,EAAWxF,KAAmBoF,EAAAC,EAAA,aAAAJ,EAAA,gBAN9C,0BAQeymB,MACVzmB,EAAA,eAAAH,EAAA,EAAmBC,EAAA,MAAAgE,GAAA,CAAA3D,EAAMe,EAAO,CAAC,IAAK,MAAa,KAAK,QAAU,iCATvE,yBAAAR,EAAAC,EAAAX,EAAA,4DAYK,eACC,MAMWD,EAAA,CAAAC,EAAA,2BAnBjBkB,EAeQyI,MAAwF+c,+HAM3F,EACE,KAAAvmB,EACAwmB,EAAqB,CACtB,MAAM3mB,EAAA,eACN,cAAaA,EAAA,8CACZ,eACA,cACA,SAAM4mB,gEAER,OAME5mB,EAAA,kBALD,gBAAa,cAAwB,8BAAAG,EAC3BiO,EAAU,CACpB,eAAa,yBACb,YAAgBpO,EAAA,SACf,6EAGH,YAsBM,kBAAAH,EArBc,EAAAC,EAAA,MAAAiE,GAAA,CAAA5D,EAAMe,EAAO,CAAC,IAAK,MAAa,KAAK,QAAU,iCAvCvE,yBAAAR,EAAAC,EAAAX,EAAA,qBA0CK,eACC,MAEWD,EAAA,CAAAC,EAAA,OAFD,MAAI,OAAK,OA3CzBkB,EA4CU2lB,4BA5CVnmB,EAAAC,EAAAX,EAAA,uBA+CgB8mB,OACV9mB,EAAA,mBAAAH,EAAA,EAAyBC,EAAA,MAAAkE,GAAA,CAAO7D,EAAAkB,EAAA,eAhDtC,QAiDiEpB,EAAA,KAAAA,EAAA,GAAAmB,GAAApB,EAAA,mCAjDjEU,EAAAC,EAAAX,EAAA,oEAsDMe,EAAa,OAAAZ,EACHiO,EAAU,CACpB,eAAa,yBACb,YAAgBpO,EAAA,SACf,yGAKH,KAAAH,EAAA,EAAAC,EAAA,MAEMgP,GAFN,CACC9O,EAAA,mBAAAH,EAAA,EAAAC,EAAA,MAAAmE,GAAA,CAhEL9D,EAAAigB,EAAA,eAmEI,GAAMrf,EAnEV,GAmEiBH,aACZ,MAOMb,EAAAC,EAAA,gCANc+mB,EAAM/mB,EAAA,mBArE/B,QAqEyCH,IAAAiB,EAAAkmB,EAAA,CAAC,IAAI,WArE9C,yBAAAtmB,EAAAC,EAAAX,EAAA,sBAwEM,GAEW,IAAAA,EA1EjB,eAyEkCc,EAAAI,EAAA,iBAzElCX,EAyEa,KAzEbC,EAAA,oBAAAG,EAAAX,EAAA,mBAAAkE,EAAA,WA6EKnD,EAME,MALD,KAAAZ,EACUiO,EAAU,CACpB,eAAa,yBACb,YAAgBpO,EAAA,SACf,mEAI2B,wCAtFlCA,EAAA,gBAAAH,IAsFgDiB,EAAAI,EAAA,CAAE,mBAtFlD,QAAAlB,EAAA,sBAAAO,EAwFI,KAAAC,EAAA,kBAAAR,EAAA,uBAAAiF,EAAA,EAxFJvE,EAAA,aA0FWumB,YAAc,MADrB,GAKJ,IAAAjnB,EA9FA,oCA2FiB,EAAAc,EAAAwd,EAAA,CACX,mBA5FN,QAAAte,EAAA,qCAAAU,EAAAC,EAAAX,EAAA,oDAgGWknB,YAAc,MADrB,GAQsB,IAAAlnB,EAvG1B,oBAiGec,EAAAqmB,EAAA,CACT,IAAK,EACL,IAAK,OACL,QAAaD,EAAc,kBAC3B,MAAAlnB,EAAS,QAAEonB,SAAsB,uCACjC,YAAYC,sDAtGlB,eAAArnB,EAAA,iFAAAe,EAAA,wHCsLAumB,GAAe7nB,EAAgB,CAC9B,KAAM,kBACN,WAAY,CACX,aAAA8nB,GACA,WAAAC,GACA,YAAAC,GACA,mBAAAC,GACA,aAAAC,EACD,EACA,OAAQ,CAACC,EAAgB,EACzB,MAAO,CACN,SAAU,CACT,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACP,EACA,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAMtiB,EAAOuiB,EAAK,SACjB,MAAMrR,EAAW/U,KACX0G,EAAgB5G,KAChBiE,EAAcC,KACd,CAAE,WAAAoD,CAAA,EAAeia,GAAYtM,CAAQ,EACrCtO,EAAalM,GAAc6M,CAAU,EACrCnG,EAASC,KACTG,EAAkBC,GAAmB,CAAE,OAAAL,CAAQ,GAE9C,OACN,cAAAyF,EACA,YAAA3C,EACA,WAAA0C,EACA,gBAAApF,EACA,GAAGpG,GAAiB,EACpB,GAAG6L,GAAW,EAEd,IAAGhJ,GAAAuC,EAAA8lB,IAAiB,QAAjB,YAAAroB,EAAA,KAAAuC,EAAyBwD,EAAOuiB,EAAG,CAExC,EACA,MAAO,CACC,OACN,iBAAkB9B,GAAe,EACjC,eAAgB,GAChB,cAAe,GACf,eAAgB,GAChB,iBAAkB,GAClB,cAAe,OACf,6BAA8B,GAC9B,WAAY,GACZ,kBAAmB,EACnB,+BAAgC,GAChC,kBAAmB,EACnB,mBAAoB,EACpB,kBAAmB,GACnB,mBAAoB,GACpB,4BAA6B,GAE/B,EACA,SAAU,CACW3J,GAAA,GAAG,yBAA0B,KAAK,mBAAmB,CAC1E,EACA,eAAgB,CACKA,GAAA,IAAI,yBAA0B,KAAK,mBAAmB,CAC3E,EACA,SAAU,CACT,GAAG5a,GAAUvH,GAAmBwH,GAAa1H,GAAYI,EAAmB2tB,EAAgB,EAC5F,SAAkB,CACjB,OAAO,KAAK,SAAS,OACtB,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,2BAAqC,CACpC,OACC,KAAK,8BACL,CAAC,CAAC,KAAK,gBACP,CAAC,KAAK,eAAe,MAAM,SAAS,SAAS,GAC7C,KAAK,iBACL,KAAK,eAAe,0BAEtB,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,eAAoC,CAC5B,YAAK,eAAiB,KAAK,UACnC,EACA,WAA4B,CAC3B,OAAI,KAAK,cACD,KAAK,eAAe,cAAc,KAAK,aAAa,EAGrD,IACR,EACA,gBAA8C,CAC7C,OAAI,KAAK,WACD,KAAK,eAAe,YAAY,KAAK,WAAW,KAAM,KAAK,WAAW,WAAW,EAElF,IACR,EACA,kBAA4B,eAC3B,MAAMC,EAAW,CAAC,GAACjmB,EAAA,KAAK,iBAAL,MAAAA,EAAqB,cACxC,GAAI,QAAOvC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,eAAiB,UACzC,OAAAwoB,EAGR,MAAMC,EAAqB,CAAC,GAACpmB,GAAAC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,WAArB,MAAAD,EAA+B,QACtDqmB,GAAgB5O,EAAA,KAAK,iBAAL,YAAAA,EAAqB,QAE3C,MACC,CAAC,KAAK,UAAY,KAAK,gBAAkB2O,GAAsBC,GAAiBF,EAElF,EACA,UAAqB,CACb,YAAK,gBAAgB,oBAC7B,EACA,qBAAsB,SACrB,GAAI,CAAC,KAAK,WAAmB,SACvB,MAAAG,EAAsB,KAAK,eAAe,8BAC/C,KAAK,WAAW,MAIT,SAAA3oB,GAAAuC,EAAA,OAAO,OAAOomB,CAAmB,IAAjC,YAAApmB,EAAqC,KAArC,YAAAvC,EAA0C,KAAM,IAAI,OAAS,CACtE,EACA,aAAwB,CACvB,OAAI,KAAK,WAEP,KAAK,SAAS,sBAAsB,KAAK,WAAW,KAAM,CAAC,EAAE,IAAI,CAAC,CAAE,KAAA2H,CAAW,IAAAA,CAAI,GAAK,GAInF,EACR,EACA,YAAiC,OAErB,UAAAihB,KAAkB,KAAK,YAO7B,GALA,KAAK,eAAe,mBAAmBA,CAAc,IAKrDrmB,EAAA,KAAK,kBAAL,MAAAA,EAAuBqmB,GACnB,OAAAA,EAIF,YAAK,YAAY,CAAC,CAC1B,EACA,yBAAmC,CAClC,OAAK,KAAK,eAEHC,GAA8B,SAAS,KAAK,eAAe,IAAI,EAFrC,EAGlC,EACA,eAAyB,CACxB,MACC,CAAC,CAAC,KAAK,iBACN,KAAK,eAAe,MAAM,SAAS,SAAS,GAC5C,KAAK,eAAe,OAAShE,GAEhC,EACA,oBAA8B,CACtB,OAAC,CAAC,KAAK,SAAS,YAAc,KAAK,SAAS,WAAW,OAASxoB,EACxE,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAAmC,CAC9B,QAAK,oBAAsB,KACvB,YAEF,MAAAqa,EAA+C,KAAK,kBAAkB,KAC5E,OAAIA,GAAA,MAAAA,EAAe,WACXA,EAAc,WAAW,QAE1B,IACR,EACA,cAAuB,CAClB,QAAK,aAAe,KAChB,SAGR,MAAM2E,EAA2B,KAAK,gBAElC,OAAAA,IAAY,MAAQ,CAACA,EAAQ,eAAe,KAAK,WAAW,IAAI,EAC5D,EAGJA,EAAQ,KAAK,WAAW,IAAI,EAAE,OAC1BA,EAAQ,KAAK,WAAW,IAAI,EAAE,OAAS,EAGxC,CACR,EACA,WAAoB,CACf,YAAK,iBAAmB,GACpB,KAAK,aAGN,KAAK,IAAI,KAAK,eAAgB,KAAK,YAAY,CACvD,EACA,aAAsB,CACrB,GAAI,KAAK,YAAc,MAAQ,KAAK,aAAe,KAC3C,SAGR,MAAMpQ,EAAe,KAAK,SAAS,QAAQ,KAAK,WAAW,IAAI,EACzDgT,EAAUxB,GAA2B,KAAK,SAAUxR,EAAc,KAAK,cAAc,EAE3F,IAAI5P,EAAO,KAAK,UAEhB,MAAMggB,EAA2B,KAAK,gBAMlC,OAJA4C,EAAQ,KAAM+G,GAAWA,IAAWjiB,EAAmB,IAAI,IAC9D1H,EAAO,KAAK,YAGT,CAACA,GAAQ,CAACggB,GAAW,CAACA,EAAQ,eAAehgB,EAAK,IAAI,EAClD,EAGJggB,EAAQhgB,EAAK,IAAI,EAAE,OACfggB,EAAQhgB,EAAK,IAAI,EAAE,OAAS,EAG7B,CACR,EACA,UAAmB,CAClB,OAAI,KAAK,kBAAoB,KAAK,eAAiB,KAAK,YAChD,KAAK,UAET,KAAK,gBAAkB,GACnB,KAAK,YAGN,KAAK,IAAI,KAAK,cAAe,KAAK,WAAW,CACrD,EACA,aAAuB,CACtB,OAAO,KAAK,aAAe,GAAK,KAAK,eAAiB,KAAK,WAC5D,EACA,QAAkB,CACV,YAAK,kBAAoB,KAAK,WACtC,EACA,kBAA2B,CACnB,YAAK,cAAgB,EAAI,EACjC,EACA,mBAA4B,CACvB,OAAC,KAAK,eAGH,GAAGytB,EAAoB,GAAG,KAAK,eAAe,IAAI,GAFjD,EAGT,EACA,qBAA2D,CAC1D,OAAO,KAAK,SAAS,mBACtB,EACA,mBAA6B,CACrB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,8BAAwC,CACvC,OAAO,KAAK,eAAe,0BAC5B,EACA,SAAmB,CACX,YAAK,mBAAqB,KAAK,4BACvC,EACA,oBAA+B,CAC9B,MAAMC,GAAe,KAAK,YAAc,IAAI,YACtCC,EAAkB,KAAK,eAAe,gBAEtCC,EAA+B,GACrC,OACCF,GACA,KAAK,cAAc,2BAA2BG,GAAyB,OAAO,GAE9E,OAAO,OAAOH,CAAW,EAAE,QAASzd,GAAe,CAEjDA,EAAW,IACX0d,EAAgB1d,EAAW,EAAE,GAC7B,CAAC0d,EAAgB1d,EAAW,EAAE,EAAE,sBAEb2d,EAAA,KAAK3d,EAAW,EAAE,CACtC,CACA,EAGK2d,CACR,EACA,sBAAgC,CACxB,YAAK,mBAAmB,OAAS,CACzC,CACD,EACA,MAAO,CACN,WAAW5tB,EAAsBsQ,EAAyB,CACrDtQ,GAAQA,EAAK,QAASsQ,GAAA,YAAAA,EAAS,OAAQ,CAAC,KAAK,qBAChD,KAAK,cAAgB,GACrB,KAAK,eAAiB,GACtB,KAAK,iBAAmB,GACxB,KAAK,cAAgB,OACrB,KAAK,6BAA+B,GACpC,KAAK,mBAAqB,EAC1B,KAAK,kBAAoB,EAEzB,WAAW,IAAM,KAAK,SAAS,gBAAiB,CAAC,EAC5C,KAAK,cAAc,IAAI,8BAA+B,CAC1D,aAAc,KAAK,YAAY,gBAC9BtQ,EACA,KAAK,eACL,KAAK,gBAAgB,mBAAmB,CACzC,EACA,EAED,WAAW,IAAM,OAChB,GAAI,KAAK,WAAY,CACd,MAAAstB,EAAsB,KAAK,eAAe,8BAC/C,KAAK,WAAW,MAGZ,gBAAW,MAAM,yBAA0B,CAC/C,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,YAAa,CAAC,KAAK,qBACnB,yBAA0B,KAAK,kBAC/B,2BAA4B,KAAK,YACjC,4BAA6B,KAAK,aAClC,qBAAsB,KAAK,cACxB,UACA,KAAK,SAAS,sBACjB,sBAAuB,KAAK,SAAS,uBACrC,iBAAkB,KAAK,YAAY,OACnC,mBAAmBpmB,EAAAomB,GAAA,YAAAA,EAAqB,OAArB,YAAApmB,EAA2B,OAC9C,0BAA2B,KAAK,SAChC,2BAA4B,KAAK,UACjC,+BAAgC,KAAK,+BACrC,+BAAgC,KAAK,kBACrC,gCAAiC,KAAK,mBACtC,CACF,GACE,GAAI,GAEJ,OAAO,KAAO,CAAC,KAAK,oBAChB,WAAI,YAAY,KAAK,UAAU,CAAE,QAASlH,EAAO,UAAY,WAAY,EAAG,GAAG,CAExF,EACA,cAAe,CACd,KAAK,eAAiB,EACvB,EACA,aAAc,CACb,KAAK,cAAgB,EACtB,EACA,cAAcgN,EAA8B,CAC3C,WAAW,IAAM,CACX,cAAS,iBAAiBA,CAAQ,GACrC,CAAC,CACL,EACA,UAAW,CACV,WAAW,IAAM,CACX,cAAS,iBAAiB,KAAK,QAAQ,GAC1C,CAAC,CACL,CACD,EACA,QAAS,CACR,oBAAoB,CAAE,iBAAA8gB,GAAmD,CACxE,KAAK,+BAAiCA,CACvC,EACA,UAAU,EAAkB,CAC3B,GAAI,EAAE,MAAQ,KAAO,KAAK,iBAAiB,CAAC,EAAG,CAI9C,GAHA,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEb,KAAK,SAAU,OAEd,WAAM,uBAAwB,CAAC,CACrC,CACD,EACA,iBAAiB,EAAsD,CACtE,GAAI,IAAM,MAAQ,CAAC,KAAK,eAAiB,CAAC,KAAK,4BAA6B,CACtE,cAAS,gBAAgB,IAAI,EAClC,MACD,CAEA,MAAM9d,EAAmB,CACxB,SAAU,KAAK,cACf,SAAU,KAAK,SACf,YAAa,EAAE,YACf,UAAW,EAAE,WAET,cAAS,gBAAgBA,CAAI,CACnC,EACA,kBAAkB,EAAsD,CACvE,GAAI,IAAM,MAAQ,CAAC,KAAK,YAAc,CAAC,KAAK,4BAA6B,CACnE,cAAS,gBAAgB,IAAI,EAClC,MACD,CAEA,MAAMA,EAAmB,CACxB,SAAU,KAAK,WAAW,KAC1B,SAAU,KAAK,UACf,YAAa,EAAE,YACf,UAAW,EAAE,WAET,cAAS,gBAAgBA,CAAI,CACnC,EACA,oBAAoB,EAA6B,CAChD,KAAK,kBAAoB,EAAE,YAC5B,EACA,qBAAqB,EAA6B,CACjD,KAAK,mBAAqB,EAAE,YAC7B,EACA,oBAAqB,CACpB,KAAK,SAAS,eAAiB,KAC/B,WAAW,IAAM,CACX,KAAK,wBAAwB,KAAK,GACrC,GAAI,CACR,EACA,uBAAwB,CAChB,YAAK,KAAK,kBAAmB,QAAQ,EACxC,KAAK,YACH,gBAAW,MAAM,wBAAyB,CAC9C,UAAW,KAAK,WAAW,KAC3B,YAAa,KAAK,eAAe,WACjC,SAAU,KAAK,QACf,KAAMtI,EAAmB,KACzB,KAAM,yBACN,CAEH,EACA,aAAa,EAAyB,CACrC,KAAK,kBAAoB,EAAE,QAC5B,EACA,YAAY,EAAyB,CACpC,KAAK,WAAa,GAClB,KAAK,kBAAoB,EAAE,QAC5B,EACA,UAAU,EAA8C,CACvD,KAAK,WAAa,GACb,gBAAW,MAAM,6BAA8B,CACnD,aAAc,EAAE,YAChB,eAAgB,KAAK,kBACrB,aAAc,EAAE,SAChB,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,SAAU,KAAK,QACf,YAAa,KAAK,eAAe,WACjC,EACD,KAAK,kBAAoB,EAAE,QAC5B,EACA,kBAAmB,CAClB,KAAK,eAAiB,KAAK,cAC3B,KAAK,iBAAmB,GACxB,KAAK,aAAa,OAAO,CAC1B,EACA,mBAAoB,CACnB,KAAK,iBAAmB,GACxB,KAAK,aAAa,QAAQ,CAC3B,EACA,YAAYqmB,EAAc,CACzB,KAAK,cAAgB,KAAK,eAC1B,KAAK,iBAAmB,GACxB,KAAK,aAAaA,CAAI,CACvB,EACA,aAAaA,EAAc,CACrB,gBAAW,MAAM,+BAAgC,CACrD,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,SAAU,KAAK,QACf,OAAQ,KAAK,OACb,KAAAA,CAAA,CACA,CACF,EACA,eAAgB,CACf,WAAW,IAAM,CACZ,CAAC,KAAK,YAAc,CAAC,KAAK,kBAG9B,KAAK,6BAA+B,KAClC,GAAI,CACR,EACA,cAAe,CACT,sBAAiB,KAAK,cAAc,CAC1C,EACA,aAAarc,EAAmC,CAC1C,WAAM,eAAgBA,CAAa,CACzC,EACA,iBAAiBsc,EAAsB,CACjC,WAAM,mBAAoBA,CAAY,CAC5C,EACA,qBAAqBA,EAAsB,CACrC,WAAM,qBAAsBA,CAAY,CAC9C,EACA,4BAA4BA,EAAsBniB,EAAiC,CAC7E,WAAM,4BAA6BmiB,EAAcniB,CAAc,CACrE,EACA,MAAM,OAAQ,SACb,GAAI,MAAK,WAIT,IACC,KAAK,aACJ,QAAO3E,EAAA,KAAK,iBAAL,YAAAA,EAAqB,UAAY,UACxC,QAAOvC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,SAAW,UACvC,KAAK,gBACL,CAIK,MAAAqI,EAAW,KAAK,WAAW,KACjC,WAAW,IAAM,CACX,WAAM,aAAcA,CAAQ,GAC/B,CAAC,CACL,CAEA,GAAI,KAAK,oBAAoB,SAAW,KAAK,WAAY,CAUxD,GATmC,MAAM,KAAK,QAC7C,GACA,KAAK,QAAQ,SAAS,iCAAiC,EACvD,CACC,kBAAmB,KAAK,QAAQ,SAAS,mCAAmC,EAC5E,iBAAkB,KAAK,QAAQ,SAAS,kCAAkC,CAC3E,KAGkCqB,GAAe,CAC3C,MAAE,MAAAsC,CAAM,EAAI,KAAK,oBACnB,IACH,KAAK,WAAW,QAAQiK,GAAUjK,CAAK,EAAG,oBAAoB,QACtDzC,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CACD,CAEK,cAAS,8BAA8B,EAAK,CAClD,CAEM,WAAK,cAAc,IAAI,iCAAiC,EACzD,gBAAW,MAAM,yBAA0B,CAC/C,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,SAAU,KAAK,QACf,YAAa,KAAK,eAAe,WACjC,EACD,KAAK,6BAA+B,GACpC,KAAK,SAAS,eAAiB,KAC/B,KAAK,SAAS,kBACf,EACA,uBAAuBoV,EAAa,CACnC,KAAK,eAAiBA,EACjB,oBAAeA,EAAK,QAAQ,CAClC,EACA,sBAAsBA,EAAa,CAClC,KAAK,cAAgBA,EACjB,KAAK,SACR,KAAK,eAAiBA,GAElB,oBAAeA,EAAK,OAAO,CACjC,EACA,eAAeA,EAAayK,EAAc,CACpC,gBAAW,MAAM,gCAAiC,CACtD,SAAU,KAAK,QACf,UAAWzK,EACX,UAAW,KAAK,eAAiB,KAAK,eAAe,KAAO,GAC5D,KAAAyK,CAAA,CACA,CACF,EACA,kBAAkBpd,EAAepM,EAAe,CAC/C,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,cAAgBoM,EAEhB,gBAAW,MAAM,kCAAmC,CACxD,UAAW,KAAK,WAAa,KAAK,WAAW,KAAO,GACpD,SAAU,KAAK,QACf,YAAa,KAAK,eAAe,WACjC,gBAAiBpM,EACjB,gBAAiB,KAAK,UAAY,KAAK,UAAU,KAAO,GACxD,CACF,EACA,iBAAkB,CACjB,KAAK,MAAM,eAAe,CAC3B,EACA,mBAAoB,CACnB,KAAK,kBAAoB,GACzB,KAAK,mBAAqB,EAC3B,EACA,oBAAqB,CACpB,KAAK,kBAAoB,GACzB,KAAK,mBAAqB,EAC3B,EACA,SAASugB,EAAgB,CACxB,KAAK,4BAA8B,CAACA,CACrC,CACD,CACD,CAAC,uZAtwBA9f,EAsIY,aApIV,OAAAC,EAAA,EAAmBiB,EAAA+nB,EAAA,CACnB,eAAY,CAAK,CAAA7oB,EAAA,YAAAA,EAAA,YAAAA,EAAA,mBAClB,eAAMA,EAAA,MACN,gBACA,MAAM,mCACN,gBAAc,uBACd,aACC,yCAVH,6BA4BgBA,EAAA,8BAfbO,EAAU,kBACAuoB,KACT,UAAWA,mDAED,SAAO,CAAA9oB,EAAA,oCACNO,EAlBf,KAmBQoJ,2CAQChJ,EAAAX,EAAA,4EALKO,EAtBd,KAsBkDC,EAAA,OAAkB,MAAKT,EAAAC,EAAA,qDACrE,QAAgEC,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,OAAAA,EAAA,SAAAE,CAAA,OAA9B6oB,EAAa,CAAC,KAAK,iCACrD,kBAAmC7nB,EAAQ,CAAE,MAAM,4BAxBvD,yBAAAR,EAAAC,EAAAX,EAAA,uDA+BS6I,GADP,4BAAA7I,EA9BF,gBAgCkBF,EAAA,OACf,IAAK,EACL,gBAlCH,kCAqCG,iBAA0DG,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,WAAAA,EAAA,aAAAE,CAAA,KAAfM,EAAA,aAAAT,EAAAC,EAAA,kCAC3C,CA+FqB,IAAAC,EAAA,OAAAC,IAAAF,EAAA,OAAAA,EAAA,SAAAE,CAAA,IA9FnB,KAAK2I,UACYa,EAAa,CAC9B,IAAA1J,EAAA,gBACA,kBAAU0J,gBACV,wBAAeA,EAAa,sBAC5B,0BAAkBsf,CAA6BhpB,EAAA,0BAC/C,eAAWgpB,iBACX,qBAAoBlnB,EAAA9B,EAAEipB,iBAAF,YAAAnnB,EAAsB,wBAC1C,YAAA9B,EAAA,eACA,qBAAYA,EAAA,qBACZ,4BAAkBA,EAAA,4BAClB,QAAW8Q,QACX,OAASC,eAnDd,YAAA/Q,EAAA,YAoFe,UAAMA,EAAA,SAChB,EAAA2jB,GAAA,QACCpjB,EAAa,KAAAJ,EACZ+oB,EAA0B,CAC1B,eAAWC,eACX,gBAAaC,cACb,YAAU1a,YACV,cAAY1O,EAAEulB,OACd,WAASvlB,EAAEqpB,QACX,2BAA+BrpB,EAAEspB,qBACjC,cAAgBC,SAAkBvpB,EAAA,gBAAAA,EAAA,wBAClC,kCAAewpB,EAAkB,6BACjC,iBAAUC,qBACV,eAAUzpB,EAAA,mBACV,UAAUA,EAAE0pB,kBACZ,cAAeC,CAAY,IAAA1pB,EAAA,OAAAD,EAAA,uBAC3B,YAAe4pB,yBACf,eAAYC,eACZ,eAAQC,0EAGA,EAAI,QACd,gBAgBE,6NAfA,KAAAvpB,EAAS,IAAEwpB,GACDxZ,EAAU,CACpB,YAAU7B,mBACV,SAAWsa,aACX,WAAAhpB,EAAA,QACA,YAAWulB,iBACX,sBAAW8D,EAAO,mBAClB,YAAa9D,WACb,cAAe/V,SAAYxP,EAAA,iBAC3B,WAASylB,YACT,eAAczlB,EAAEsO,aAChB,UAAetO,EAAA,cACf,gBAAUgqB,kBACV,mBAAsBf,CAAoB,IAAAhpB,EAAA,GAAAmB,GAAApB,EAAA,mBAC1C,WAAAA,EAAA,wCAAAA,EAAA,qBAGKiqB,4BAAiBjqB,EAAA,iDADxB,WAQI,qMAAAA,EAnIT,yBA6HcY,IAAO,CACf,MACC,MAAKb,EAAEC,EAAA,uCAER,QAAsCC,EAAA,KAAAA,EAAA,OAAAC,IAAfF,EAAC,uBAAWA,EAAA,yBAAAE,CAAA,IAjIzC,CAAAC,EAAAoE,EAAA,oBAAA7D,EAAA,IAAAC,EAAAX,EAAA,gDAAAe,EAAA,SAqDoBmpB,QArDpB,kBAqD8D,CAAAlqB,EAAA,eAElDkqB,uBAvDZlqB,EAAA,kBAAAH,IAwDkBgJ,EAAeshB,EAAA,CAC1B,MACA,YAAS1E,EAAa,gBACtB,WAAUuE,oCAGCtgB,+BADb,iCAqBE,YAlFP,gBAAA1J,EAAA,cAAAe,EAAA,QAAAlB,EAAA,EA+DyBiB,EAAAspB,EAAA,CAClB,MACA,SAAWC,WACX,gBAAajB,cACb,YAAAppB,EAAA,SACA,cAAU0O,SACV,oBAAW6W,EAAQ,cACnB,WAAAvlB,EAAA,QACA,YAAgBsqB,mCAChB,kCAAeC,EAAiB,6BAChC,iBAAUC,oBACV,eAAUxqB,EAAA,kBACV,UAAUA,EAAEyqB,iBACZ,cAAed,CAAY,IAAA1pB,EAAA,OAAAD,EAAA,sBAC3B,YAAiBA,EAAA,sBACjB,eAASylB,eACT,kBAAeiF,oBACf,UAAU1qB,EAAE2qB,cACZ,eAAQb,qDAjFf,SAAA9pB,EAAA,uhBAAAe,EAAA,8MCMA,MAAM6pB,EAAchxB,KACd,CAAE,SAAAN,EAAU,OAAAE,EAAQ,QAAAE,EAAS,OAAAD,GAAWmxB,EACxCC,EAAWtxB,IACXqM,EAAOC,EAEbzJ,GACC5C,EACA,IAAM,SACDA,GACHsI,EAAA+oB,EAAS,QAAT,MAAA/oB,EAAgB,QAEhBvC,EAAAsrB,EAAS,QAAT,MAAAtrB,EAAgB,OAElB,EACA,CAAE,MAAO,MAAO,GAGjB,SAASurB,EAAelgB,EAAc,CACrC,MAAMzO,EAASyO,EACfggB,EAAY,gBAAgBzuB,CAAM,EAClCyJ,EAAK,SAAUzJ,EAAQyuB,EAAY,YAAY,KAAK,CACrD,CAEA,SAASG,EAAgBzvB,EAAe,CAClCA,GACJsvB,EAAY,MAAM,CAEpB,4iBCDMI,GAA6B,CAClCC,EACAC,IACkB,CACZ,MAAAC,EAAWC,GAAoC,SAASH,CAAc,EAErE,OACN,KAAM,cACN,QAAS,CACR,MAAO,GACP,OAAQ,GACR,MAAAC,EACA,SAAAC,CACD,EAEF,EAEME,GAAkC,KAAqB,CAC5D,KAAM,YACN,QAAS,CACR,OAAQ,GACR,MAAO,GACP,SAAU,yBACX,CACD,GAEMC,GAA0BC,GAC3BA,GAAU,EAAU,QACfA,GAAU,EAAU,SACtB,QAGKC,GAAW/rB,EAAgB,CACvC,MAAO,CACC,OACN,OAAQ,CAAC,EACT,QAAS,CAAC,EAEZ,EACA,SAAU,CAEL,QAAK,OAAS,KACb,IACE,eAAU,KAAK,IAAI,OACT,CAGhB,CAEF,EACA,SAAU,CACT,GAAG+B,GAAUvH,GAAmBF,GAAY6C,GAAgBzC,EAAmBkQ,EAAe,EAC9F,MAAuB,CACtB,OAAO,KAAK,eAAe,cAAc,KAAK,IAAI,CACnD,EACA,QAAiB,OACT,QAAAvI,EAAA,KAAK,OAAL,YAAAA,EAAW,KAAM,EACzB,CACD,EACA,MAAO,CACN,KAAM,CACL,KAAM,OACN,SAAU,EACX,EACA,SAAU,CACT,KAAM,MACP,EACA,WAAY,CACX,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACP,EACA,YAAa,CACZ,KAAM,OACP,EACA,iBAAkB,CACjB,KAAM,OACP,EACA,kBAAmB,CAClB,KAAM,OACP,EACA,SAAU,CACT,KAAM,OACN,SAAU,EACX,CACD,EACA,QAAS,CACR,yBAAyB2pB,EAAoBliB,EAAcsb,EAAoB,CAC9E,GAAI,qBAAQ,SAAW,WAAY4G,EAAS,SAAU,CAC/C,MAAAC,EAASD,EAAS,SAAS,OACjC,KAAK,SAAS,aAAaC,EAAQ,qBAAsB,KAAK,KAAK,IAAI,EACvE,KAAK,SAAS,aAAaA,EAAQ,mBAAoB7G,EAAW,UAAU,EAC5E,KAAK,SAAS,aAAa6G,EAAQ,qBAAsBniB,CAAI,CAC9D,CACD,EACA,oBAAoB3O,EAAe+wB,EAAoC,CAEtE,MAAMC,EAEF,GACEC,EAEF,GAEEphB,EACLhD,GAA0B,KAAK,SAAU,KAAK,KAAOkkB,CAAY,GAAK,GACvE,KAAK,OAASlhB,EAER,MAAAqhB,EAAe,CAAC,GAAGrhB,CAAM,EAClBqhB,EAAA,KAAK,CAAC,EAAGC,IACjB,OAAO,GAAM,SACT,EACG,OAAOA,GAAM,UAIpB,EAAE,UAAY,CAACA,EAAE,SACb,GACG,CAAC,EAAE,UAAYA,EAAE,SACpB,EAGD,CACP,EAEYD,EAAA,QAAQ,CAACvgB,EAAO4P,IAAM,SAC9B,IAAA6Q,EACA,OAAOzgB,GAAU,SACCygB,EAAA,CACpB,KAAMzgB,CAAA,EAGcygB,EAAAzgB,EAGtB,MAAM0gB,EAA6BD,EAAmB,KAEhDE,EACLD,IAAc3pB,EAAmB,KAAOA,EAAmB,KAAO,QAG/DspB,EAAkB,eAAeM,CAAqB,EACzDN,EAAkBM,CAAqB,IAEvCN,EAAkBM,CAAqB,EAAI,EAGxCL,EAAc,eAAeI,CAAS,EACzCJ,EAAcI,CAAS,IAEvBJ,EAAcI,CAAS,EAAI,EAGtB,MAAAE,EAAgBP,EAAkBM,CAAqB,EACvDE,EAAYP,EAAcI,CAAS,EAEnCI,EAAuB5hB,EAAO,OAAQ8R,GAAc,CACzD,MAAM+P,EAAwB,OAAO/P,GAAc,SAAWA,EAAYA,EAAU,KACpF,OAAO0P,IAAc3pB,EAAmB,KACrCgqB,IAAkBhqB,EAAmB,KACrCgqB,IAAkBhqB,EAAmB,KACxC,EAEKiqB,EAAgBF,EAAqB,OAAQ9P,GAC3CA,IAAcja,EAAmB,IACxC,EACKkqB,EAAwBD,EAAc,OAAQhQ,GAC5C,OAAOA,GAAc,UAAYA,EAAU,QAClD,EACKkQ,EAAwBF,EAAc,OAAQhQ,GAC5C,OAAOA,GAAc,UAAY,CAACA,EAAU,QACnD,EACKmQ,EAAgB,KAAK,iBAC1BF,EAAsB,OACtBC,EAAsB,QAIjBE,EAAiBC,GACtBX,EACA,QACAI,EAAqB,OACrBK,GACCP,CAAa,EAETU,EAAQC,GAA+Bb,CAA+B,EAEtEc,EAAmC,CACxC,KAAMC,GAAmC,KAAK,OAAQf,EAAWG,CAAS,EAC1E,OAAQO,EAGR,eAAgBX,EAAmB,gBAAkB,GACrD,SAAU,YACV,WAAYiB,GACXtB,EACA,2BACAM,CACD,EACA,gBAAiBgB,GAChBtB,EACA,kBACAM,CACD,EACA,MAAOiB,GAAuBL,CAAK,EACnC,OAAQZ,IAAc3pB,EAAmB,KACzC,OAAQ,CAAC,KAAK,YAAcmI,EAAO,OAAS,EAC5C,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAMwhB,EACN,MAAOG,CACR,EACA,QAAS,CAAC,KAAK,WACf,SAAU,sBACV,oBAAqB,GACrB,WAAY,4BACZ,GAAG,KAAK,0BAA0BH,EAAWN,CAAY,GAGpDF,GAAW3pB,EAAA,KAAK,WAAL,YAAAA,EAAe,YAC/B,KAAK,MAAM,KAAK,KAAK,IAAI,EACzBirB,GAEI,8BAAyBtB,EAAU,QAASW,CAAS,GACtDJ,EAAmB,cAAezsB,EAAAosB,EAAa,aAAb,MAAApsB,EAA0B4b,KAEtDsQ,EAAA,WACR0B,GACCnB,EAAmB,aAAeL,EAAa,WAAWxQ,CAAC,EAC3D8Q,EACAD,EAAmB,QACpB,GAGG,MAAM,QAAQP,CAAQ,IAC1BA,EAAS,OAAS,CACjB,SAAU7wB,EAAK,KACf,OAAQ,KAAK,OACb,MAAOwxB,EACP,eAAgBC,EAAqB,OACrC,SAAUzxB,EAAK,MAEjB,CAYA,EACGkxB,EAAa,SAAW,GAC3B,KAAK,SAAS,OAAO,KAAK,MAAM,KAAK,KAAK,IAAI,CAAY,CAE5D,EACA,iBACCsB,EACAC,EACAC,EAA4BC,GAC5BC,EAAgBC,GACL,CACX,MAAMf,EAAgB,GAElB,GAAAU,EAAsB,GAAKC,EAAuB,GACrD,GAAIC,EACHZ,EAAc,KAAKU,CAAmB,UAC5BA,EAAsBC,EAAuBG,EACvD,QACKE,EAAcN,EAClBM,EAAcF,EAAgBH,EAC9BK,IAEAhB,EAAc,KAAKgB,CAAW,UAK/BN,EAAsB,GACtBA,EAAsBI,GACtBH,IAAyB,EAEzB,QACKK,EAAc,EAClBA,EAAcF,EAAgBJ,EAC9BM,IAEchB,EAAA,KAAKgB,EAAcN,CAAmB,UAGrDA,IAAwB,GACxBC,EAAuB,GACvBA,EAAuBG,EAEvB,QACKE,EAAc,EAClBA,EAAcF,EAAgBH,EAC9BK,IAEAhB,EAAc,KAAKgB,CAAW,EAK1B,OAAAhB,CACR,EACA,qBAAqB9xB,EAAe+wB,EAAoC,CACvE,MAAMC,EAEF,GACEC,EAEF,GAEC,aAAU7P,GAA2B,KAAK,SAAU,KAAK,KAAM2P,CAAY,GAAK,GAIrF,IAAIgC,EAAiB,EACrB,MAAMC,EAAmD,GACzD,KAAK,QAAQ,QAAQ,CAACriB,EAAO4P,IAAM,OAC9B,IAAA4C,EACA,OAAOxS,GAAU,SACEwS,EAAA,CACrB,KAAMxS,CAAA,EAGewS,EAAAxS,GAEnBzJ,EAAA6pB,EAAa,cAAb,MAAA7pB,EAA2BqZ,KACV4C,EAAA,YAAc4N,EAAa,YAAYxQ,CAAC,GAGzD4C,EAAoB,cACvB4P,EACC5P,EAAoB,YAAY,OAAS4P,EACtC5P,EAAoB,YAAY,OAChC4P,GAGLC,EAAqB,KAAK7P,CAAmB,EAC7C,EAEK,MAAA8P,EAAsBvC,GAAuBqC,CAAc,EAEjE,KAAK,QAAQ,QAAQ,CAACpiB,EAAO4P,IAAM,CAC5B,MAAA4C,EAAsB6P,EAAqBzS,CAAC,EAE5CI,EAA8BwC,EAAoB,KAElD+P,EACLvS,IAAejZ,EAAmB,KAAOA,EAAmB,KAAO,QAGhEspB,EAAkB,eAAekC,CAAsB,EAC1DlC,EAAkBkC,CAAsB,IAExClC,EAAkBkC,CAAsB,EAAI,EAGzCjC,EAAc,eAAetQ,CAAU,EAC1CsQ,EAActQ,CAAU,IAExBsQ,EAActQ,CAAU,EAAI,EAGvB,MAAA4Q,EAAgBP,EAAkBkC,CAAsB,EACxD1B,EAAYP,EAActQ,CAAU,EAEpCwS,EAAwB,KAAK,QAAQ,OAAQC,GAAe,CACjE,MAAMC,EACL,OAAOD,GAAe,SAAWA,EAAaA,EAAW,KAC1D,OAAOzS,IAAejZ,EAAmB,KACtC2rB,IAAmB3rB,EAAmB,KACtC2rB,IAAmB3rB,EAAmB,KACzC,EAGKqqB,EAAiBC,GACtBrR,EACA,SACAwS,EAAsB,QACrB5B,CAAa,EAETU,EAAQC,GAA+BvR,CAAgC,EAEvEwR,EAAmC,CACxC,KAAMmB,GAAoC,KAAK,OAAQ3S,EAAY6Q,CAAS,EAC5E,OAAQO,EACR,eAAgB,GAChB,SAAU,CACT,KAAM,MACN,QAAS,CACR,OAAQhB,GAAgBoC,EAAsB,OAAS,EAAI,EAAI,CAChE,CACD,EACA,gBAAiBI,GAAqCxC,EAAc,iBAAiB,EACrF,MAAAkB,EACA,OAAQ,GACR,OAAQtR,IAAejZ,EAAmB,KAC1C,QAAS,CAAC,KAAK,WACf,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAMiZ,EACN,MAAO6Q,CACR,EACA,WAAY,4BACZ,oBAAqB,GACrB,oBAAqB,GACrB,GAAG,KAAK,2BAA2B7Q,EAAYwC,EAAqB4N,CAAY,GAG3EF,EAAW,KAAK,SAAS,YAC9B,KAAK,MAAM,KAAK,KAAK,IAAI,EACzBsB,CAAA,EAID,GADK,8BAAyBtB,EAAU,SAAUW,CAAS,EACvDrO,EAAoB,YAAa,CAEpC,MAAMqQ,EAAcC,GACnBtQ,EAAoB,YACpBxC,EACAwC,GAAA,YAAAA,EAAqB,UAEtB0N,EAAS,WAAW2C,CAAW,CAChC,CAYA,GAVK,MAAM,QAAQ3C,CAAQ,IAC1BA,EAAS,OAAS,CACjB,SAAU7wB,EAAK,KACf,OAAQ,KAAK,OACb,MAAOwxB,EACP,eAAgB2B,EAAsB,OACtC,oBAAAF,CAAA,GAIE,CAAC,KAAK,YAActS,IAAejZ,EAAmB,KAAM,CAC/D,MAAMgsB,EAAoC,CACzC,KAAMJ,GAAoC,KAAK,OAAQ3S,EAAY6Q,CAAS,EAC5E,OAAQO,EACR,eAAgB,GAChB,SAAU,CACT,KAAM,UACN,QAAS,CACR,WAAY,GACZ,kBAAmBlB,EACnB,gBAAiB,KAAK,QAAQ,SAAW,EACzC,KAAM,KAAK,QAAQ,QAAU,EAAI,QAAU,SAC3C,oBAAAoC,EACA,aAAc,KAAK,QAAQ,SAAS,wCAAwC,CAC7E,CACD,EACA,OAAQ,GACR,OAAQ,GACR,QAAS,CAAC,KAAK,WACf,WAAY,CACX,cAAe,MAChB,EACA,gBAAiB,CAChB,cAAe,MAChB,EACA,WAAY,CACX,WAAY,SACZ,OAAQ,KAAK,OACb,KAAMtS,EACN,MAAO6Q,EACP,SAAUrO,GAAA,YAAAA,EAAqB,QAChC,EACA,SAAU,0BACV,oBAAqB,IAGlBA,GAAA,MAAAA,EAAqB,WACxBuQ,EAAiB,SAAW,GAAGA,EAAiB,QAAQ,IAAIvQ,GAAA,YAAAA,EAAqB,QAAQ,IAGpF,MAAAwQ,EAAe,KAAK,SAAS,YAClC,KAAK,MAAM,KAAK,KAAK,IAAI,EACzBD,CAAA,EAEI,8BAAyBC,EAAc,OAAQnC,CAAS,EAExD,MAAM,QAAQmC,CAAY,IAC9BA,EAAa,OAAS,CACrB,SAAU3zB,EAAK,KACf,OAAQ,KAAK,OACb,MAAOwxB,EACP,SAAUxxB,EAAK,KACf,eAAgBmzB,EAAsB,QAGzC,EACA,CACF,EACA,UAAUnzB,EAAe,CACxB,MAAM+wB,EAAgB,KAAK,eAAe,YAAY/wB,EAAK,KAAMA,EAAK,WAAW,GAChF,KAAK,eAAe,YAAY4zB,EAAe,EAE3C,yBAAoB5zB,EAAM+wB,CAAY,EACtC,0BAAqB/wB,EAAM+wB,CAAY,CAC7C,EACA,mBAAmBllB,EAAiC,CACnD,MAAO,eAAeA,CAAc,QACrC,EACA,0BACCA,EACAklB,EACkB,CACd,OAAAllB,IAAmBnE,EAAmB,KAClC,CACN,WAAY2qB,GACXtB,EACA,KAAK,mBAAmBrpB,EAAmB,IAAI,EAC/CmE,CACD,GAIG,OAAO,OAAOnE,CAAkB,EAAE,SAASmE,CAAoC,GAKnFwkB,IACsB,CACtB,SAAUD,GACTC,EACA,KAAK,mBAAmBA,CAAc,CACvC,KAGuCxkB,CAAc,EAZ9C,EAaT,EACA,2BACCA,EACAsX,EACA4N,EACkB,CAClB,MAAMpiB,EAAO,SAEPklB,EACLxD,IACsB,CACtB,SAAUI,GAAgC,EAC1C,WAAY8C,GACXxC,EACA,KAAK,mBAAmBV,CAAc,CACvC,EACA,gBAAiBkD,GAChBxC,EACA,KAAK,mBAAmBV,CAAc,CACvC,IAGG,OAAAxkB,IAAmBnE,EAAmB,KACrCyb,EAAoB,WAAa,QAC7B,CACN,WAAY,CACX,GAAGoQ,GACFxC,EACA,KAAK,mBAAmBrpB,EAAmB,IAAI,CAChD,EACA,KAAM,qBACP,EACA,SAAU,OAAOiH,CAAI,aAGhB,CACN,WAAY4kB,GACXxC,EACA,KAAK,mBAAmBrpB,EAAmB,IAAI,CAChD,EACA,SAAU,OAAOiH,CAAI,aAIlB,OAAO,OAAOjH,CAAkB,EAAE,SAASmE,CAAoC,EAI7EgoB,EAAiChoB,CAAc,EAH9C,EAIT,EACA,SAAS,EAAe,CACD/J,KACJ,eACb,KAAK,QAAQ,eAAe,YAAY,GACtC,aAAQ,mBAAmB,YAAY,CAG/C,EACA,eAAe,EAAe,CAC7B,MAAMgyB,EAAgBhyB,KAGhBqQ,EAAO,EAAE,MAAS,EAAE,cAAgB,EAAE,eAC5C,QAAS5N,EAAQ,EAAGA,EAAQ4N,EAAK,OAAQ5N,IACxC,GACC4N,EAAK5N,CAAK,EAAE,WACZ,OAAO4N,EAAK5N,CAAK,EAAE,WAAc,UACjC4N,EAAK5N,CAAK,EAAE,UAAU,SAAS,oBAAoB,EAEnD,OAIGuvB,EAAc,gBACd,KAAK,QAAQ,eAAe,YAAY,EACtC,aAAQ,mBAAmB,YAAY,GAEvCA,EAAc,iBAAiB,CAAC,GACpC,KAAK,MAAM,kBAAkB,EAG1B,KAAK,QAAQ,eAAe,KAAK,KAAK,IAAI,EACxC,WAAM,eAAgB,KAAK,IAAI,EAE/B,WAAM,eAAgB,KAAK,IAAI,GAIxC,CACD,CACD,CAAC,ECvbDC,GAAelvB,EAAgB,CAC9B,KAAM,OACN,WAAY,CACX,WAAAmvB,GACA,gBAAAC,GACA,SAAAnvB,EACD,EACA,OAAQ,CAAC8rB,EAAQ,EACjB,MAAO,CACN,6BAA8B,CAC7B,KAAM,QACN,QAAS,EACV,EACA,qBAAsB,CACrB,KAAM,QACN,QAAS,EACV,EACA,eAAgB,CACf,KAAM,QACN,QAAS,EACV,CACD,EACA,MAAMlmB,EAAO,CACZ,MAAMpL,EAAiBC,IACjBywB,EAAchxB,KACduO,EAAgB5G,KAChBiE,EAAcC,KACd7K,EAAOV,EAAe,cAAcoL,EAAM,IAAI,EAC9C4C,EAAalM,GAAcpB,CAAI,EAC/B8zB,EAAgBhyB,KAChB,CAAE,cAAAyV,GAAkBxM,KAEnB,OACN,YAAAilB,EACA,cAAAziB,EACA,YAAA3C,EACA,WAAA0C,EACA,cAAAwmB,EACA,cAAAvc,CAAA,CAEF,EACA,SAAU,CACT,GAAG3Q,GAAUvH,GAAmBwH,GAAa1H,GAAYI,CAAiB,EAC1E,oBAA8B,CAC7B,OAAO,KAAK,WAAW,QAAQ,OAAS,CAAC,KAAK,4BAC/C,EACA,gBAA0B,CACzB,OAAK,KAAK,SACNgB,GAA2B,SAAS,KAAK,SAAS,IAAI,EAAU,GAEnE,KAAK,SAAS,WAAa,QAAa,KAAK,cAAc,OAAS,KAAK,SAAS,SAHxD,EAK5B,EACA,kBAA4B,OAC3B,QAAO2G,EAAA,KAAK,WAAL,YAAAA,EAAe,MAAM,SAAS,eAAgB,EACtD,EACA,kBAAuC,CACtC,GAAI,KAAK,aACD,8BAGT,EACA,aAA2B,OACnB,YAAK,eAAe,kCAAgCA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,GAAK,EACtF,EACA,WAAqB,OAChB,YAAK,qBAAuB,CAAC,UAAW,OAAO,EAAE,SAAS,KAAK,mBAAmB,EAC9E,GACJ,KAAK,WAAW,QAAQ,MAAc,GACtC,KAAAA,EAAA,KAAK,OAAL,YAAAA,EAAW,UAAW,QAAa,OAAO,KAAK,KAAK,KAAK,MAAM,EAAE,OAItE,EACA,mBAA4B,CAC3B,MAAMgtB,EAAyB,KAAK,YACpC,OAAIA,IAA2B,KACvB,EAGDA,EAAuB,MAC/B,EACA,sBAAuB,CACtB,OAAO,KAAK,QAAQ,sBACrB,EACA,uBAA4C,CAC3C,GAAI,KAAK,WAAa,MAAQ,KAAK,SAAS,eAAe,yBAAyB,EAAG,CACtF,MAAMlnB,EAAW,KAAK,QAAQ,cAAc,KAAK,SAAS,IAAI,EACxD,CAAE,wBAAAmnB,CAAwB,EAAI,KAAK,SACzC,OAAO,KAAK,QACV,WACA,wBAAwBnnB,EAAUmnB,GAA2B,EAAE,MAE1D,aAAK,QAAQ,SAAS,sCAAuC,CACnE,YAAa,CACZ,SAAU,KAAK,SAAW7I,GAA0B,KAAK,QAAQ,EAAI,EACtE,EACA,CAEH,EACA,mBAA6B,OACrB,OAAC,GAACpkB,EAAA,KAAK,WAAL,MAAAA,EAAe,QACzB,EACA,aAAuB,CACtB,OAAO,KAAK,eAAe,gBAAgB,KAAK,KAAK,IAAI,CAC1D,EACA,2BAAqC,CAMpC,OALc,KAAK,eAAe,qBAAqB,OAAQlH,GAAkB,CAChF,MAAMG,EAAW,KAAK,eAAe,YAAYH,EAAK,KAAMA,EAAK,WAAW,EAC5E,OAAOG,GAAYA,EAAS,0BAA4B,IAAM,CAACH,EAAK,SACpE,EAEY,SAAW,CACzB,EACA,kBAA4B,CACpB,YAAK,KAAK,OAAS6N,EAC3B,EACA,cAAwB,OAChB,YAAK,eAAe,aAAa,KAAK,SAAU,KAAK,OAAM3G,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,CACxF,EACA,oBAA8B,OAC7B,OAAO,KAAK,eAAe,mBAC1B,KAAK,SACL,KAAK,OACLA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,GAErB,EACA,eAAyB,OACxB,OAAO,KAAK,eAAe,gBAAcA,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAQ,EAAE,CAC/D,EACA,2BAAqC,CACpC,OAAO,KAAK,WAAa,KAAO,KAAK,SAAS,0BAA4B,GAAK,EAChF,EACA,gBAAsC,CAC9B,YAAK,MAAQ,KAAK,KAAK,QAC/B,EACA,UAAwC,CAChC,YAAK,MAAQ,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,CAC1F,EACA,MAA4B,CAE3B,OAAO,KAAK,eAAe,YAAY,KAAK,IAAI,CACjD,EACA,eAA2B,CACnB,YAAK,eAAe,SAAS,OAAQlH,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,CAC3F,EACA,kBAA2B,CAC1B,MAAMo0B,EAAU,CACf,eAAgB,GAChB,wBAAyB,KAAK,cAC9B,6BAA8B,KAAK,mBACnC,uBAAwB,KAAK,cAG1B,QAAK,QAAQ,OAAQ,CAExB,MAAMC,EADcvkB,GAA+B,KAAK,OAAO,EAC9B,OAC/B6Q,GAAeA,IAAejZ,EAAmB,MAE/C2sB,EAAa,QACHA,EAAA,QAAS1T,GAAe,CAC5ByT,EAAA,iCAAiCzT,CAAU,EAAE,EAAI,GACzD,CAEH,CAEO,OAAAyT,CACR,EACA,mBAA4B,CAC3B,MAAMjyB,EAEF,CACH,KAAM,KAAK,SAAS,CAAC,EAAI,KACzB,IAAK,KAAK,SAAS,CAAC,EAAI,MAGrB,QAAK,MAAQ,KAAK,SAAU,CACzB,MAAA0N,EACLhD,GAA0B,KAAK,SAAU,KAAK,KAAM,KAAK,QAAQ,GAChE,GAGI8kB,EAFa7hB,GAA+BD,CAAM,EAEvB,OAAQ/C,GAAUA,IAAUpF,EAAmB,IAAI,EACpF,GAAIiqB,EAAc,OAAQ,CACK9hB,EAAO,OACnC/C,GAAU,OAAOA,GAAU,UAAYA,EAAM,QAC/C,EAEA,IAAIwnB,EAAc,EAOXnyB,EAAA,iCAAiC,EAAIwvB,EAAc,OAAS2C,CACpE,CAEA,IAAI1R,EAAU,GACV,KAAK,SAAS,MAAM,KAAK,KAAK,IAAI,IACrCA,EAAUxB,GAA2B,KAAK,SAAU,KAAK,KAAM,KAAK,QAAQ,GAK7E,MAAMmT,EAFczkB,GAA+B8S,CAAO,EAE1B,OAAQ+G,GAAWA,IAAWjiB,EAAmB,IAAI,EAC9EvF,EAAA,0BAA0B,EAAIoyB,EAAY,MAClD,CAEO,OAAApyB,CACR,EACA,WAAoB,CACZ,OACN,WAAY,GACZ,SAAU,KAAK,KAAK,SACpB,UAAW,KAAK,YAElB,EACA,qBAA8B,OAC7B,MAAMqyB,GAAuBttB,EAAA,KAAK,eAAe,qBAApB,YAAAA,EAAyC,KAAK,MAC3E,OAAIstB,EACIA,EAAqB,OAAO,OAAO,EAAE,CAAC,EAAE,iBAAmB,GAE5D,EACR,EACA,YAAuB,SACtB,MAAMhpB,EAAmB,GACnBgpB,GAAuBttB,EAAA,KAAK,eAAe,qBAApB,YAAAA,EAAyC,KAAK,MAC3E,OAAIstB,GACkBA,EAAA,QAASC,GAAqB,CAC9CA,GAAA,MAAAA,EAAkB,OACdjpB,EAAA,KACN,GAAGipB,EAAiB,MAAM,OAAO,GAChCA,EAAiB,MAAM,YAAc,KAAKA,EAAiB,MAAM,WAAW,IAAM,EACnF,GAEF,CACA,IAEE9vB,EAAA,KAAK,OAAL,YAAAA,EAAW,UAAW,QAClB6G,EAAA,KAAK,GAAGiB,GAA+B,KAAK,KAAK,OAAQ,KAAK,IAAI,CAAC,EAEpEjB,CACR,EACA,mBAA4B,CACpB,YAAK,KAAK,SACd,KAAK,QAAQ,SAAS,aAAa,EACnC,KAAK,QAAQ,SAAS,cAAc,CACxC,EACA,UAAuB,CACtB,OAAO,KAAK,KAAO,KAAK,KAAK,SAAW,CAAC,EAAG,CAAC,CAC9C,EACA,yBAAmC,CAClC,MACC,CAAC,KAAK,oBACN,CAAC,EAAE,KAAK,KAAK,UAAY,KAAK,OAAO,SAAW,GAAK,KAAK,QAAQ,SAAW,EAE/E,EACA,eAAwB,CACvB,OAAO,KAAK,QAAQ,cAAc,KAAK,KAAK,IAAI,CACjD,EACA,WAAoB,CACf,YAAK,KAAK,OAAS,QACf,KAAK,QAAQ,WAAW,CAC9B,IAAK,4BACL,SAAU,QACV,EAGK,KAAK,KAAK,IAClB,EACA,SAA8B,CACvB,MAAA4P,EAAoB,KAAK,eAAe,qBAE9C,GAAIA,GAAA,MAAAA,EAAmB,SAAU,CAC1B,MAAAsZ,EAAmBvjB,GAAIiK,EAAmB,kCAAkC,EAC9E,QAAK,OAASsZ,EAAkB,CACnC,MAAMC,EAAW,IAAI,KAAKvZ,EAAkB,QAAQ,EAChD,OAAAuZ,EAAS,YAAY,IAAMC,GACvB,KAAK,QAAQ,SACnB,6DAGK,KAAK,QAAQ,SAAS,yBAA0B,CACtD,YAAa,CACZ,KAAMD,EAAS,mBAAmB,EAClC,KAAMA,EAAS,mBAAmB,CACnC,EACA,CACF,CACD,CAGD,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,WAAoB,WACnB,MAAME,EAEF,GAEJ,IAAIC,EAAc,2BAEd,YAAK,oBAAsB,KAAK,gBACrBA,EAAA,2BAGX,KAAK,KAAK,SACCA,EAAA,0BACH,KAAK,cACZ,KAAK,WAAa,CAAC,KAAK,iBAGzB7tB,GAAAtC,GAAAuC,EAAA,KAAK,cAAL,YAAAA,EAAmB,KAAnB,YAAAvC,EAAuB,QAAvB,YAAAsC,EAAqD,iBACtD,uBAEc6tB,EAAA,iBACdD,EAAa,cAAc,EAAI,MAC/BA,EAAa,cAAc,EAAI,SAEtB,KAAK,SAAW,KAAK,mBACjBC,EAAA,oCACJ,KAAK,sBAAwB,UACzBA,EAAA,2BACJ,KAAK,oBACfD,EAAa,cAAc,EAAI,MAC/BA,EAAa,cAAc,EAAI,QACjBC,EAAA,oBAIHD,EAAA,cAAc,EAAI,OAAOC,CAAW,IAE1CD,CACR,EACA,YAAsB,CAEpB,YAAK,QAAQ,iBAAiB,KAAM70B,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,IAClF,MAEF,EACA,kBAA4B,CAC3B,MAAO,CAAC,EAAE,KAAK,UAAY,KAAK,QAAQ,OAAS,EAClD,EACA,0BAAoC,CACnC,MACC,CAAC,CAAC,KAAK,MACP,KAAK,eACL,CAAC,KAAK,mBACN,CAAC,KAAK,WAAW,QAAQ,OACzB,CAAC,KAAK,gBACN,KAAK,iBACL,KAAK,oBAAsB,GAC3B,KAAK,2BACL,CAAC,KAAK,2BACN,CAAC,KAAK,WACN,CAAC,KAAK,QAER,EACA,mBAA6B,OAC5B,OACC,KAAK,YAAY,OAAO,OACxB,KAAK,YAAY,OAAO,MAAM,SAAW,eACzC,KAAK,YAAY,OAAO,MAAM,KAAK,SAASkH,EAAA,KAAK,OAAL,YAAAA,EAAW,KAEzD,EACA,cAAe,WACd,KACCA,EAAA,KAAK,OAAL,YAAAA,EAAW,QAAS6tB,MACpBpwB,EAAA,KAAK,OAAL,YAAAA,EAAW,QAASqwB,GACnB,CACK,MAAAC,GAAOhuB,EAAA,KAAK,KAAK,aAAV,YAAAA,EAAsB,KAC7BiuB,EAAe,KAAK,SAAS,WAAW,wBAC7C,KAAK,KACLD,EACA,WACA,CAAC,GAEE,GAAAC,GAAgB,OAAOA,GAAiB,SACpC,YAAK,eAAe,YAAYA,CAAY,CAErD,CAEA,OAAO,KAAK,QACb,CACD,EACA,MAAO,CACN,SAASvjB,EAAUwjB,EAAU,CACxB,CAACxjB,GAAYwjB,GAChB,KAAK,YAAY,CAEnB,EACA,sBAAuB,CAClB,KAAK,yBACR,KAAK,uBAAyB,GAC9B,WAAW,IAAM,CAChB,KAAK,uBAAyB,KAAK,0BACjC,GAAG,GAGH,KAAK,iCACR,KAAK,+BAAiC,GACtC,WAAW,IAAM,CAChB,KAAK,+BAAiC,IACpC,GAAG,EAER,EACA,yBAAyBC,EAA0B,CAC9CA,EACH,WAAW,IAAM,CAChB,KAAK,uBAAyB,KAAK,0BACjC,IAAI,EAEP,KAAK,uBAAyB,EAEhC,EACA,YAAYzjB,EAAU,CAChB,KAAK,MAIV,KAAK,MAAM,MAAO,CAAE,KAAM,KAAK,KAAK,KAAM,KAAMA,EAAU,QAAS,CAAC,CAAC,KAAK,OAAS,EACpF,CACD,EACA,SAAU,CACqBqH,GAAWyI,EAA4C,EAAE,QAEtF,KAAK,yBAA2B,KAAK,OAAO,oBAAsB4T,GAA2B,CAC5F,KAAK,4BAA4BA,CAAc,EAC/C,EAEH,EACA,SAAU,CACT,WAAW,IAAM,CAChB,KAAK,YAAY,GACf,CAAC,EACA,KAAK,aACR,WAAW,IAAM,CAChB,KAAK,MAAM,MAAO,CACjB,KAAM,KAAK,MAAQ,KAAK,KAAK,KAC7B,KAAM,KAAK,YACX,QAAS,CAAC,CAAC,KAAK,QAChB,GACC,CAAC,CAEN,EACA,MAAO,CACC,OACN,cAAe,GACf,aAAc,GACd,uBAAwB,GACxB,+BAAgC,GAChC,SAAU,GACV,yBAA0B,IAAM,CAAC,EAEnC,EACA,QAAS,CACR,4BAA4BA,EAA8B,CAExD,CAAC,KAAK,eACN,KAAK,kBACL,KAAK,kBACL,KAAK,QAAQ,eACbA,IAAmB,IAITrc,GAAAyI,EAA4C,EAAE,MAAQ,OAEjE,KAAK,+BAAiC,GACtC,KAAK,yBAAyB,EAC/B,EACA,aAAc,CAKT,IACG,MAAA6T,EACL,KAAK,YAAY,gBAAgB,KAAK,KAAM,KAAK,SAAU,KAAK,QAAQ,GAAK,GAE9E,KAAK,aAAeA,EAAa,SAASC,EAAmB,EAAI,GAAKD,OAC3D,CAEZ,CACD,EACA,aAAc,CACT,KAAK,OAAS,OACjB,KAAK,YAAY,aAAa,CAAC,KAAK,IAAI,CAAC,EACzC,KAAK,aAAa,kBACjB,IAAIE,GACH,KAAK,KAAK,KACV,CAAC,KAAK,KAAK,SACX,KAAK,KAAK,WAAa,EACxB,GAEI,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,UACb,YAAa,KAAK,eAAe,WACjC,EAEH,EAEA,aAAc,CACb,KAAK,MAAM,cAAe,KAAK,KAAK,KAAM,kBAAkB,EACvD,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,UACb,YAAa,KAAK,eAAe,WACjC,CACF,EAEA,YAAa,CACP,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,SACb,YAAa,KAAK,eAAe,WACjC,EAED,KAAK,MAAM,aAAc,KAAK,KAAK,IAAI,CACxC,EAEA,kBAAkB70B,EAAmB,CACnCA,EAAM,cAAoC,OACtC,gBAAW,MAAM,iCAAkC,CACvD,UAAW,KAAK,KAAK,KACrB,YAAa,UACb,YAAa,KAAK,eAAe,WACjC,EACI,WAAM,oBAAqB,KAAK,IAAI,CAC1C,EAEA,QAAQA,EAAmB,CACrB,KAAK,cAAc,KAAK,iBAAkB,CAAE,aAAc,GAAI,SAAU,EAAK,EAAGA,CAAK,CAC3F,EAEA,iBAAiBA,EAAmB,CACbA,EAAM,QAAU,EAErC,KAAK,cAAc,EAEnB,KAAK,eAAeA,CAAK,CAE3B,EAEA,eAAgB,CACf,KAAK,SAAS,eAAiB,KAAK,KAAO,KAAK,KAAK,KAAO,GAC5D,KAAK,+BAAiC,EACvC,EACA,YAAa,CACR,KAAK,cAAc,eAAiB,CAAC,KAAK,cAAc,SAAW,CAAC,KAAK,gBAC5E,KAAK,cAAgB,GACrB,WAAW,IAAM,CAChB,KAAK,cAAgB,IACnB,GAAI,EAET,EACA,gBAAgBA,EAAmBmhB,EAAqC,CACnE,KAAK,MACH,iBAAY,KAAKnhB,EAAO,CAAE,OAAAmhB,EAAQ,KAAM,KAAK,KAAM,CAE1D,CACD,CACD,CAAC,EAzwB0BjZ,GAAAxI,IAAKyI,GAAC,iBAAmB,EAAAzI,MAAA0I,KAAA1I,0CAXpD4I,GAAA,4BA4B4BC,GAAM,6BA5BlCC,GAAA,cAwC8CC,GAAM,CAAc,wDAQC8K,GAAe,wBAhDlF7K,GAAA,gBAwD0CC,GAAM,mCAEPe,GAAM,4BA1D/CiJ,GAAA,QA+DyC/J,GAAM,2BAENC,GAAM,4BAjE/CgB,GAAA,2EAoH+B3B,GAAA,IAAAjD,EAAA,sBApH/B6vB,GAAA5sB,GAAA,IAAAjD,EAAA,0BAsHO,MAAa,oBAtHpB8vB,GAAA,UAAAC,GAAA,yCAuIQC,GAAA,KAAK,0LAtIZC,GA8KM,SA5KCzjB,WAASlN,EAAA,OACd,GAJHE,EAAA,OAKG,IAAKA,EALR,UAME,QAAaA,EAAa,kBACzB,SAAgBA,EAAI,mBACpB,eAAc,cACd,YAAWA,EAAA,4BAAA8B,EAAA9B,EAAA,uBAAA8B,EAAA,KAEZ,cAAA7B,EAAA,KAAAA,EAAyD,MAAzDD,EAAyD,gBAAApC,EAAA,+CACzD,CAuGMmhB,GAAA/e,EAAA,uBAtGmD0wB,2BAAoF7zB,+BAAiD8zB,oIAbhMzhB,GAAArP,EAAA,EAyBqBC,EAAA,OAChB,MAAKC,EA1BVC,EAAA,iBAAA0Q,GAAA1Q,EAAA,mBA4Ba0J,EAAa,KAAAzJ,EAAA,GAAAgB,GAAA,IAAAf,IAAAF,EAAA,SAAAA,EAAA,WAAAE,CAAA,eACrBF,EAAA,eAAAH,EAAA,EAE+DC,EAAA,IAAAgE,GAAA,CAAA3D,EAA7D4E,EAA6D,8BAAvDxE,EAAQoJ,KA/BrBnJ,EAAA,kBAAAR,EAAA,6CAiC+C,OAAA+D,EAAA,YAApBxD,EAAO,KAAUJ,EAAAywB,EAAA,sBAjC5C,WAoCI,GAAA7vB,EAAA,OApCJf,EAAA,cAqESe,EAAM,GAAqB,KArEpClB,EAAA,EAAAC,EAAA,aAwCgB+wB,QAAcC,CAAc,iCAAA9wB,EAAA,qBACtCA,EAAA,WAKc,uBALeF,EAAA,MAAAkE,GAAA,CAAA7D,EAAY4E,EAAQ,kBACrC,UAAO,mBACCxE,EAAKoJ,OAA4ConB,EAAU,UAAA/wB,EAAA,qDAE/B,6CA7CtDG,EAAAywB,EAAA,oCAgDqBI,EACf,IAAAhxB,EAAA,SAKcA,EALD,iCAAAH,IAEiBC,EAAA,MAAAgP,GAAA,CAAA3O,EAA5B4E,EAA4B,8BAnDpCxE,EAmDa,KAnDbC,EAAA,mBAAAG,EAAAX,EAAA,UAqDuC,OAAAiE,EAAA,mBArDvC9D,EAAAywB,EAAA,qBAwDsBK,QAChB,sBAC6B,EAAAnxB,EAAA,OAAAoE,GAAA,CAAA/D,EAAAywB,EAAyD,MAAtF,WAAsF,GAAA5wB,EA1D5F,gEA4DsBkxB,EAAmB,UAAAlxB,EAGnBmxB,sBAAiB,WAAlCtxB,EAAA,EAAAC,EAAA,OAGOoO,EAHP,GAAAlO,EACC,qBAC6B,EAAAF,EAAA,OAAAqE,GAAA,CAAAhE,EAAAywB,EAAyD,MAAtF,OAAsF,GAjE5F5wB,EAAA,qBAAAH,EAAA,EAAAC,EAAA,OAAAsE,GAAAzD,EAAAX,EAAA,uBAAAe,EAAA,UAAAA,EAAA,MAqEI,MAAgCP,EAASmJ,MAAQ,6BAChD,MAAwC3J,EAAA,2CAAHG,EAAAywB,EAAA,iBAtE1C,QAyEI,GACC,EAUcxrB,EAAA,EATE5E,EAAA,MAAA4wB,GAAA,CAAAjxB,EACd4E,EAAe,CACf,UAASssB,MACV,aAAY,YAAArxB,EAAA,uBAED,eAAO,gDAhFxBO,EAiFY,KAjFZC,EAAA,mBAAAG,EAAAX,EAAA,wBAmFc,OAAAqF,EAAA,mBAnFdisB,EAAA,GAsFY5nB,oBAtFZ1J,EAAA,eAAAH,IAuFgBiB,EAAKiE,EAAA,CACd,MACD,wBAAA/E,EAAA,+BAEW,eAAO,uDA3FxBU,EA8FcC,EAAAX,EAAA,uEA9FdqwB,EAAA,wBAkGItvB,EAOE,WALSX,EAAc,CACvB,MAAM,YACN,YAAaJ,EAAA,aACb,QACA,OAAQ,mBAAAA,EAAA,+DAlFKuxB,gBAAF,4CAuFPC,CAAuBC,EAAAzxB,EAAA,kBA7GjCA,EAAA,yBAAAH,IAAAC,EAAA,aA8GoF,MAAAC,EAAA,wGAMlF,WAAAgB,EAUM,GAVN,GACC,KAAAP,EAAW,MAAWkxB,GAAA,CAAAlxB,EAASmxB,MAAS,mBACvC,MAAA3xB,EAAA,WAGSgN,GAAT,SAzHJhN,EAyH6B,cAzH7BA,EAAA,eAAAH,EAAA,EAAAC,EAAA,IAAA0wB,GAAA,IAAA7vB,EAAAX,EAAA,2CA2HckwB,EAAiB,GAAS,OAAAI,EAAA,EA3HxCtwB,EAAA,uBAAAH,EA2H+D,EAAAC,EAAA,OAAE,IAAK,wBA3HtE,MAAAE,EAAA,cAAAW,EAAAX,EAAA,gBAAA4xB,EAAA,GAiIUp3B,EAAU,SAjIpBwF,EAAA,WAAAe,EAAA,OAAAmO,GAmISrP,EAAiC,EAAAC,EAAA,OACtC,MACA,sDAAAG,EAAA,KAAAA,EAAA,GAAAgB,GAAA,kBAED,YAAAhB,EAsCM,KAtCNA,EAsCM,GAAAgB,GAAA,4BArCL4wB,GAUE,CAlJN7xB,EAAA,aAoJKe,EAAa,QApJlBlB,EAAA,IA0IkBgf,EAAqB,CAClC,IAAI,EACJ,eAAI,sBACJ,KAAK,WACL,KAAK,GACJ,aACA,KAAK,OACL,SAAOiT,4DAjJb,QAAA9xB,EAAA,aAmJI,KAQE,mCAPYG,EACR0e,EAAU,CACf,eAAI,sBACJ,KAAK,WACL,KAAK,GACJ,KAAK,QACL,uBAAA7e,EAAA,kBAEF,QAQEA,EAAA,mBAPD,KAAa,uBAAAG,EACR0e,EAAU,CACf,eAAY,qBACZ,gBACA,KAAK,QACJ,KAAK,GACL,mBAAA7e,EAAA,gCAEF,QAOEA,EAAA,YAND,KAAa,uBAAAG,EACR0e,EAAU,CACf,eAAY,uBACZ,gBACA,KAAK,QACJ,iGA3KN,CAAAE,GAAA,CAAA/e,EAAA,sFC6HA+xB,GAAetyB,EAAgB,CAC9B,KAAM,SACN,OAAQ,CAAC+rB,EAAQ,EACjB,MAAO,CACN,cAAe,CACd,KAAM,MACP,EACA,SAAU,CACT,KAAM,MACP,CACD,EACA,OAAQ,CACP,MAAMkD,EAAgBhyB,KAChBs1B,EAAsBz4B,IACtB04B,EAAe14B,EAAI,EAAK,EACxB24B,EAAmB3mB,GAAmB,CAC3C0mB,EAAa,MAAQ1mB,CAAA,EAEhBqf,EAAchxB,GAAgBuC,GAAW,OAC1CA,IAAW,iBACd+1B,EAAgB,EAAI,GACpBpwB,EAAAkwB,EAAoB,QAApB,MAAAlwB,EAA2B,QAC5B,CACA,EAED,MAAO,CAAE,cAAA4sB,EAAe,oBAAAsD,EAAqB,YAAApH,EAAa,aAAAqH,EAAc,gBAAAC,CAAgB,CACzF,EACA,SAAU,CACT,GAAG1wB,GAAUvH,GAAmBwH,GAAa1H,GAAYI,CAAiB,EAC1E,aAAsB,CACjB,IAAC,KAAK,SACF,SAGR,MAAMg4B,EADa,KAAK,SAAS,WACN,KAAMC,GAAaA,EAAS,OAAS,SAAS,EAEzE,OAAOD,GAAWE,GAASF,EAAQ,OAAO,EAAIA,EAAQ,QAAU,EACjE,EACA,YAAsB,CAEpB,YAAK,QAAQ,iBAAiB,KAAMv3B,GAAkBA,EAAK,OAAS,KAAK,KAAK,IAAI,IAClF,MAEF,EACA,UAAwC,CAChC,YAAK,MAAQ,KAAK,eAAe,YAAY,KAAK,KAAK,KAAM,KAAK,KAAK,WAAW,CAC1F,EACA,MAAuB,CAEtB,OAAO,KAAK,eAAe,cAAc,KAAK,IAAI,CACnD,EACA,UAAuB,CACtB,OAAI,KAAK,KACD,KAAK,KAAK,SAEV,CAAC,EAAG,CAAC,CAEd,EACA,QAAiB,CACT,YAAK,MAAQ03B,GAAS,KAAK,KAAK,WAAW,MAAM,EAAI,KAAK,KAAK,WAAW,OAAS,CAC3F,EACA,OAAgB,CACR,YAAK,MAAQA,GAAS,KAAK,KAAK,WAAW,KAAK,EAAI,KAAK,KAAK,WAAW,MAAQ,CACzF,EACA,YAAqB,CAQb,MALH,CACH,OAAQ,KAAK,OAAS,KACtB,MAAO,KAAK,MAAQ,KAItB,EACA,gBAAyB,CASjB,MANH,CACH,KAAM,KAAK,SAAS,CAAC,EAAI,KACzB,IAAK,KAAK,SAAS,CAAC,EAAI,KACxB,OAAQ,KAAK,SAAW,QAAU,GAAK,KAAK,MAAO,KAAK,OAAS,KAAK,MAAS,GAAI,EAIrF,EACA,aAAuB,CAErB,QAAE,KAAK,aAAe,KAAK,YAAc,KAAK,iBAAmB,KAAK,aACtE,KAAK,YAEP,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,CACD,EACA,MAAO,CACC,OACN,WAAY,GACZ,cAAe,GAEjB,EACA,QAAS,CACR,eAAgB,CACf,KAAK,gBAAgB,EAAI,CAC1B,EACA,eAAgB,CACf,KAAK,gBAAgB,EAAK,CAC3B,EACA,MAAM,YAAa,CAElB,MAAM,KAAK,YACX,KAAK,MAAM,aAAc,KAAK,KAAK,IAAI,CACxC,EACA,YAAYnzB,EAAe,CAC1B,KAAK,eAAe,qBAAqB,CACxC,KAAM,KAAK,KACX,WAAY,CAAE,WAAY,CAAE,GAAG,KAAK,KAAK,WAAY,MAAOA,EAAQ,EACpE,CACF,EACA,OAAOozB,EAAe,CACjBA,GAAQ,CAAC,KAAK,UAAY,KAAK,KAC7B,cAAS,eAAiB,KAAK,KAAK,KAC/B,KAAK,UAAY,CAACA,IAC5B,KAAK,SAAS,eAAiB,KAEjC,EACA,gBAAgBC,EAAyBj3B,EAAc,CACtD,GAAIi3B,EAAM,CACH,MAAAC,EAAmB,KAAK,OAASC,GACjCC,EAAiBH,EAAK,cAAc,gCAAgC,EACpEjpB,EACLkpB,GAAoBE,EACjB,gBACAF,GAAoBD,EAAK,aAAa,MAAM,IAAM,aACjD,YACA,QAEL,KAAK,WAAW,MAAM,yBAA0B,CAAE,KAAAjpB,CAAM,EACzD,CACD,EACA,cAAc4oB,EAAiB,CACzB,UAAK,WAAW,QAAUA,EAC1B,mBAAc,CAAE,QAAAA,CAAA,CAAS,CAC/B,EACA,eAAgB,CACf,KAAK,WAAa,GACd,CAAC,KAAK,YAAc,KAAK,MAC5B,KAAK,MAAM,eAAgB,KAAK,KAAK,KAAM,GAAO,EAAI,CAExD,EACA,SAAS,CAAE,OAAAS,EAAQ,MAAA7f,EAAO,GAAA8f,EAAI,GAAAC,GAAiE,CACzF,KAAK,QAGND,IAAO,GAAKC,IAAO,IACtB,KAAK,YAAY,CAAC,KAAK,KAAK,SAAS,CAAC,GAAKD,GAAM,GAAI,KAAK,KAAK,SAAS,CAAC,GAAKC,GAAM,EAAE,CAAC,EAGxF,KAAK,cAAc,CAAE,OAAAF,EAAQ,MAAA7f,CAAO,GACrC,EACA,aAAc,CACb,KAAK,WAAa,EACnB,EACA,cAAc6F,EAA+E,CAC5F,GAAI,KAAK,KAAM,CACd,MAAMlM,EAAiB,CACtB,QAAS2lB,GAASzZ,EAAO,OAAO,EAAIA,EAAO,QAAU,KAAK,KAAK,WAAW,QAC1E,OAAQ0Z,GAAS1Z,EAAO,MAAM,EAAIA,EAAO,OAAS,KAAK,KAAK,WAAW,OACvE,MAAO0Z,GAAS1Z,EAAO,KAAK,EAAIA,EAAO,MAAQ,KAAK,KAAK,WAAW,MACpE,MAAOyZ,GAASzZ,EAAO,KAAK,EAAIA,EAAO,MAAQ,KAAK,KAAK,WAAW,OAG/DxM,EAAwC,CAC7C,IAAK,KAAK,KAAK,GACf,KAAM,KAAK,KAAK,KAChB,MAAOM,CAAA,EAGH,oBAAe,kBAAkBN,CAAiB,CACxD,CACD,EACA,YAAY9S,EAAsB,CAC7B,IAAC,KAAK,KACT,OAGD,MAAM8S,EAAsD,CAC3D,KAAM,KAAK,KAAK,KAChB,WAAY,CACX,SAAA9S,CACD,GAGI,oBAAe,qBAAqB8S,CAAiB,CAC3D,EACA,YAAa,CACR,KAAK,cAAc,eAAiB,CAAC,KAAK,SAAW,CAAC,KAAK,gBAC9D,KAAK,cAAgB,GACrB,WAAW,IAAM,CAChB,KAAK,cAAgB,IACnB,GAAI,EAET,EACA,cAAc,EAAqB,CAC9B,KAAK,MAAQ,CAAC,KAAK,SACjB,iBAAY,KAAK,EAAG,CAAE,OAAQ,mBAAoB,KAAM,KAAK,KAAM,EAExE,EAAE,gBAAgB,CAEpB,CACD,CACD,CAAC,EAhVDxI,GAAA,mBAAAC,GAAA,mCA4EeC,GAAA,UA5EfC,GAAA,6IACC0sB,GAmGM,SAjGCzjB,WAASlN,EAAA,OACf,GAAME,EAAA,OACL,IAAKA,EALR,UAMG,uBACD,SAAaA,EAAQ,4BAAAA,EAAA,UAErB,mCAC2D0wB,6BAAuFl2B,+EAVpJ,eAAAwF,EAAA,sBAkBGA,EAA4D,6DAKrDH,EAvBV,EAAAC,EAAA,OAwBK,2BAAAG,EAAA,KAAAA,EAAA,GAAAgB,GAAA,IAAAf,IAAAF,EAAA,gBAAAA,EAAA,kBAAAE,CAAA,aAED,cAiBED,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,eAAAA,EAAA,iBAAAE,CAAA,OAfA6yB,EAAkB,CAClB,GAAQn4B,UACR,cAAOA,EAAK,KAAgB,mBAC5B,OAAOwD,EAAa,uBACpB,MAAkBxD,wBAClB,MAASoF,EAAA,cACT,mBAAcgzB,EAAW,sBACzB,YAAWC,aACX,eAAWC,cACX,YAAMC,EAAM,WAAAnzB,EAAA,WACZ,YAAWA,EAAEqU,SACb,OAAMrU,EAAEozB,OACR,cAAW9e,gBACX,SAActU,EAAA,SACd,YAAAA,EAAA,4BAAAA,EAAA,qDAtBauxB,6BAAU,SAAZ,qNA0BdvxB,EAoDM,uDAhDL,GAOM,qCAAAA,EAAA,iBAJOkP,GAAArP,EAAA,EAAgBC,EAAA,OAC3B,MAAO6J,wCAER,MAAkC3J,EAAA,kCALvBG,EAAAoE,EAAA,mBAAAT,EAAA,IAOZ,CAuCc2tB,EAAAzxB,EAAA,sBArCZK,EAAgC,CACjC,OAAO,OACP,eAAe,gBACd,QAAMgzB,QACN,UAAMC,6BAEI,OAAStzB,EAAA,gBAEd,UAAAO,EAAA,KACUC,EAAA,OACd,0BACC,MAAOmJ,8CAER,MAAA3J,EAAA,QAAoC,SAAjB,6CAGrB,EAAA+D,EAAA,IACC,QAAAxD,EAAA,KAAAC,EAAA,MAAAwD,GAAA,EAAAnE,EAEO,EAAK,EAAAC,EAAA+E,GAAA,KAAAC,GAAA,wBAAAyuB,EAAAp0B,IAAA,SACN,OAAAU,EAAA,EAAQC,EAAA,OACb,IAAAX,EAEC,MAnFRY,EAAA,yBAAAZ,EAAA,qJAmFoQvE,iCAAsBuE,EAAA,KAAiH,aAAAA,IAAA,KAAA2C,EAAA9B,EAAA,mBAAA8B,EAAA,wBAAA3C,EAAA,MAAAI,EAAAS,EAAA,mBAAAT,EAAA,6DAAAJ,EAAA,gEAnF3Y,sBA+CYq0B,QAAW,wGCzCjBC,GAAmB,GACnBC,GAAkB,GAClBC,GAAc,GACdC,GAAqB,GAErBC,GAAyB,IACzBC,GAA6B,KAC7BC,GAA2B,GAOjC,SAASC,GAAiBC,EAAiBx6B,EAAyB,CACnE,IAAIy6B,EAAa,EACbC,EAAS,EAEb,KAAOD,EAAaD,EAAQ,QAAUE,EAAS16B,EAAO,QAAQ,CAC7D,MAAM26B,EAAcH,EAAQ,OAAOC,CAAU,EAAE,YAAY,EACrDG,EAAa56B,EAAO,OAAO06B,CAAM,EAAE,YAAY,EACjDC,IAAgBC,GACnBH,IAEC,EAAAC,CACH,CAEA,OAAOF,EAAQ,SAAW,GAAKx6B,EAAO,SAAW,GAAKy6B,IAAeD,EAAQ,MAC9E,CASA,SAASK,GAAWL,EAAiBx6B,EAAwD,CAMrF,OAAA86B,GACNN,EACAx6B,EACA,EACA,EACA,KARyB,GAUzB,IACA,EACA,EACA,EAEF,CAEA,SAAS86B,GACRN,EACAx6B,EACA+6B,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACyC,CACzC,IAAIC,EAAW,EAGX,KAAEF,GAAkBC,EAChB,OAAE,QAAS,GAAO,SAAAC,GAI1B,GAAIR,IAAoBP,EAAQ,QAAUQ,IAAoBh7B,EAAO,OAC7D,OAAE,QAAS,GAAO,SAAAu7B,GAI1B,IAAIC,EAAiB,GACjBC,EAAiC,GACjCC,EAAqB,EAGrBC,EAAa,GACjB,KAAOZ,EAAkBP,EAAQ,QAAUQ,EAAkBh7B,EAAO,QAAQ,CAEvE,GAAAw6B,EAAQO,CAAe,EAAE,gBAAkB/6B,EAAOg7B,CAAe,EAAE,cAAe,CACrF,GAAII,GAAaD,EACT,OAAE,QAAS,GAAO,SAAAI,GAGtBI,GAAcV,IACPC,EAAA,CAAC,GAAGD,CAAa,EACdU,EAAA,IAGd,MAAMC,EAA6B,GAC7BC,EAAkBf,GACvBN,EACAx6B,EACA+6B,EACAC,EAAkB,EAClBE,EACAU,EACAT,EACAC,EACAC,EACAC,CAAA,EAGKQ,EAAiBD,EAAgB,SACnCA,EAAgB,WAEf,CAACL,GAAkBM,EAAiBJ,KAChBD,EAAA,CAAC,GAAGG,CAAgB,EACtBF,EAAAI,GAELN,EAAA,IAGlBN,EAAQE,GAAW,EAAIJ,EACrB,EAAAD,CACH,CACE,EAAAC,CACH,CAEM,MAAAe,EAAUhB,IAAoBP,EAAQ,OAE5C,GAAIuB,EAAS,CACDR,EAAA,IAGP,IAAAS,EAAU5B,GAAyBc,EAAQ,CAAC,EACtCc,IAAU3B,GAA6BA,GAA6B2B,EAClET,GAAAS,EAGN,MAAAC,EAAYj8B,EAAO,OAASo7B,EAClCG,GAAYjB,GAA2B2B,EAGvC,QAASva,EAAI,EAAGA,EAAI0Z,EAAW1Z,IAAK,CAC7B,MAAAwa,EAAUhB,EAAQxZ,CAAC,EAEzB,GAAIA,EAAI,EAAG,CACJ,MAAAya,EAAUjB,EAAQxZ,EAAI,CAAC,EACzBwa,IAAYC,EAAU,IACbZ,GAAAvB,GAEd,CAGA,GAAIkC,EAAU,EAAG,CAEV,MAAAE,EAAWp8B,EAAOk8B,EAAU,CAAC,EAC7BjR,EAAOjrB,EAAOk8B,CAAO,EACvBE,IAAaA,EAAS,eAAiBnR,IAASA,EAAK,gBAC5CsQ,GAAArB,KAEgBkC,IAAa,KAAOA,IAAa,OAEjDb,GAAAtB,GACb,MAGYsB,GAAApB,EAEd,CAGA,OAAIqB,IAAmB,CAACO,GAAWL,EAAqBH,IAE7CL,EAAA,CAAC,GAAGO,CAAoB,EACvBF,EAAAG,EACJ,CAAE,QAAS,GAAM,SAAAH,IACdQ,EAEH,CAAE,QAAS,GAAM,SAAAR,GAEjB,CAAE,QAAS,GAAO,SAAAA,EAE3B,CACO,OAAE,QAAS,GAAO,SAAAA,EAC1B,CAKA,SAASc,GAA2BC,EAAQzoB,EAAuB,CAC9D,GAAAyoB,EAAI,eAAezoB,CAAI,EAC1B,OAAOyoB,EAAIzoB,CAAe,EAGrB,MAAA0oB,EAAW1oB,EAAK,MAAM,GAAG,EAE/B,IAAI2oB,EAASF,EACT5a,EAAI,EACD,KAAA8a,GAAU9a,EAAI6a,EAAS,QAAQ,CAC/B,MAAA9oB,EAAM8oB,EAAS7a,CAAC,EACtB8a,EAASA,EAAO/oB,CAAG,EACnBiO,GACD,CACO,OAAA8a,CACR,CAEgB,SAAAC,GACfC,EACAnpB,EACAopB,EACoC,CACpC,MAAMC,EAAUrpB,EAAK,OAAO,CAACspB,EAAyC1rB,IAAY,CACjF,IAAI2rB,EAAmD,GACvDH,EAAK,QAAQ,CAAC,CAAE,IAAAlpB,EAAK,OAAAspB,KAAa,CAC3B,MAAAjrB,EAAQuqB,GAASlrB,EAAMsC,CAAG,EAC5B,MAAM,QAAQ3B,CAAK,EACbgrB,IAAO,OAAOhrB,EAAM,IAAKkrB,IAAO,CAAE,MAAOA,EAAG,OAAAD,CAAO,EAAE,CAAC,EACrD,OAAOjrB,GAAU,UAC3BgrB,EAAO,KAAK,CACX,MAAAhrB,EACA,OAAAirB,CAAA,CACA,CACF,CACA,EAGD,MAAME,EAAYH,EAAO,OACxB,CACCD,EACA,CAAE,MAAA/qB,EAAO,OAAAirB,KACL,CACJ,GAAI,CAACxC,GAAiBmC,EAAQ5qB,CAAK,EAC3B+qB,SAGF,MAAAh3B,EAAQg1B,GAAW6B,EAAQ5qB,CAAK,EACtCjM,EAAM,UAAYk3B,EAEZ,MAAE,QAAAhB,EAAS,SAAAR,CAAa,EAAA11B,EAI9B,MAHI,CAACg3B,GAAQd,GAGTA,GAAWc,GAAQtB,EAAWsB,EAAK,SAC/Bh3B,EAEDg3B,CACR,EACA,MAGD,OAAII,GACHJ,EAAK,KAAK,CACT,MAAOI,EAAU,SACjB,KAAA9rB,CAAA,CACA,EAGK0rB,CACR,EAAG,CAAE,GAEG,OAAAD,EAAA,KAAK,CAACM,EAAG5K,IACTA,EAAE,MAAQ4K,EAAE,KACnB,EAEMN,CACR,CCnQO,SAASO,GACfh8B,EACAi8B,EACAttB,EAA0B,OACgB,WAC1C,MAAMutB,EAAgB,CACrB,KAAMC,GAAO,EACb,IAAKn8B,EAAK,KACV,YACCi8B,KAAeh1B,GAAAtC,GAAAuC,EAAAlH,EAAK,QAAL,YAAAkH,EAAY,gBAAZ,YAAAvC,EAA4By3B,MAA5B,YAAAn1B,EAAmD,KAAMo1B,GACzE,WAAY,CACX,GAAGr8B,CACJ,EACA,KAAA2O,CAAA,EAGM,OACHutB,CAEL,CAEO,SAASI,GAAmB5b,EAA6B,CACzD,MAAA6b,EAA6B,CAACH,GAAqBI,EAAc,EACvE,OAAO9b,EAAM,OAAO,CAAC1c,EAA8BgM,IAAS,CAEvD,IAAAysB,EAA0B,CAACJ,EAAmB,EAEvB,OAAAE,EAAA,QAASG,GAAa,cAC5C/3B,GAAAuC,EAAA8I,EAAK,QAAL,YAAA9I,EAAY,aAAZ,MAAAvC,EAAwB,SAAS+3B,KACpCD,IAAgBz1B,GAAAC,EAAA+I,EAAK,QAAL,YAAA/I,EAAY,gBAAZ,YAAAD,EAA4B01B,KAAa,GAC1D,CACA,EAEaD,EAAA,QAASR,GAAwB,CACzCj4B,EAAIi4B,CAAW,IACfj4B,EAAAi4B,CAAW,EAAI,IAEpBj4B,EAAIi4B,CAAW,EAAE,KAAKD,GAAkBhsB,EAAMisB,CAAW,CAAC,EAC1D,EAEMj4B,CACR,EAAG,CAAE,EACN,CAEO,SAAS24B,GAAuB77B,EAA6B,CACnE,OAAOA,EAAM,KAAK,CAACi7B,EAAG5K,IAAM,aAC3B,GAAI4K,EAAE,OAAS,QAAU5K,EAAE,OAAS,OAAe,SACnD,MAAMyL,IAAej4B,GAAAuC,EAAA60B,EAAE,aAAF,YAAA70B,EAAc,cAAd,YAAAvC,EAA2B,gBAAiBo3B,EAAE,IAC7Dc,IAAe71B,GAAAC,EAAAkqB,EAAE,aAAF,YAAAlqB,EAAc,cAAd,YAAAD,EAA2B,gBAAiBmqB,EAAE,IAEnE,OAAOyL,EAAa,cAAcC,EAAc,OAAW,CAAE,YAAa,OAAQ,EAClF,CACF,CAEgB,SAAAC,GAAYC,EAAsBrc,EAA6B,CAExE,MAAAsc,EAAgBD,EAAa,YAAY,EAAE,QAAQ,UAAW,EAAE,EAAE,UAQjE,OANNzB,GAAkC0B,EAAetc,EAAO,CACvD,CAAE,IAAK,yBAA0B,OAAQ,GAAI,EAC7C,CAAE,IAAK,yBAA0B,OAAQ,CAAE,EAC3C,GAAK,CAAC,GACN,IAAI,CAAC,CAAE,KAAA1Q,CAAK,IAAMA,CAAI,CAGzB,CAEO,SAASitB,GAAsBvc,EAAmD,CACjF,OAAAA,EAAM,IAAK1Q,GAAUA,EAAK,OAAS,UAAYA,EAAK,SAAWA,CAAK,EAAE,KAAK,CACnF,CAEgB,SAAAktB,GACfxc,EACAyc,EACuB,CACvB,MAAMC,EAAiB1c,EAAM,OAAO,CAAC1c,EAA2CgM,IAAS,CAClF,MAAAqtB,EAAUF,EAAS,KAAMG,GAAMA,EAAE,MAAM,SAASttB,EAAK,GAAG,CAAC,EACzDsC,GAAM+qB,GAAA,YAAAA,EAAS,MAAO,QACxB,OAAAr5B,EAAAsO,CAAG,EAAI,CAAC,GAAItO,EAAIsO,CAAG,GAAK,GAAKtC,CAAI,EAC9BhM,CACR,EAAG,CAAE,GAECq3B,EAAiC8B,EACrC,IACCE,IAAmC,CACnC,KAAM,UACN,IAAKA,EAAQ,IACb,MAAOA,EAAQ,MACf,SAAUV,GAAuBS,EAAeC,EAAQ,GAAG,GAAK,EAAE,KAGnE,OAAO,CACP,KAAM,UACN,IAAK,QACL,MAAO39B,GAAK,SAAS,gCAAgC,EACrD,SAAUi9B,GAAuBS,EAAe,OAAS,EAAE,EAC3D,EACA,OAAQC,GAAYA,EAAQ,SAAS,OAAS,CAAC,EAE7C,OAAAhC,EAAO,QAAU,EACb3a,EAGD2a,CACR,CC3GO,MAAMkC,GAAsBC,GAAYC,GAAO,aAAc,IAAM,CACnE,MAAAC,EAAe/+B,EAAoBg/B,EAAyB,EAC5DC,EAAcj/B,EAA0B,EAAE,EAC1CG,EAAUH,EAA6C,EAAE,EAEzDk/B,EAAYl/B,EAAI,EAAK,EACrBm/B,EAAan/B,EAA2B,EAAE,EAE1Co/B,EAAsBl+B,EAAS,IACpC,OAAO,OAAO+9B,EAAY,KAAK,EAAE,IAAKrd,GAAMyb,GAAkBzb,CAAC,CAAC,GAGjE,SAASyd,EAAcl9B,EAA6B,CACnD88B,EAAY,MAAQ98B,CACrB,CAEA,SAASm9B,EAAWn9B,EAAgD,CACnEhC,EAAQ,MAAQgC,CACjB,CAEA,SAASo9B,EAAaC,EAAoB,CACzCN,EAAU,MAAQM,CACnB,CAEA,SAASC,EAAgBC,EAAsB,CAC9CX,EAAa,MAAQW,CACtB,CAEA,SAASC,EAAcD,EAA6B,CACnDP,EAAW,MAAQO,CACpB,CAEO,OACN,WAAAP,EACA,aAAAJ,EACA,UAAAG,EACA,YAAAD,EACA,QAAA9+B,EACA,aAAAo/B,EACA,gBAAAE,EACA,cAAAE,EACA,WAAAL,EACA,cAAAD,EACA,oBAAAD,CAAA,CAEF,CAAC,4GCtBD,MAAMrzB,EAAQC,EAER4zB,EAAmBhB,KACnBiB,EAAmB3+B,EAAS,KAAO,CACxC,sCAAuC,GAAG6K,EAAM,SAAS,CAAC,CAAC,KAC3D,qCAAsC,GAAGA,EAAM,SAAS,CAAC,CAAC,IACzD,0+BCnCF,MAAMqR,EAAUC,KACV4C,EAASjf,KACT+b,EAAYC,KAEZ3Q,EAAOC,EAEPwzB,EAAsB5+B,EAAS,IAAMkc,EAAQ,iBAAiB,EAE9D2iB,EAAQ7+B,EAAS,IACfkc,EAAQ,oBAAoB,KACnC,EAEKzU,EAAUzH,EAAS,IAAM,CAC9B,CACC,MAAO+e,EAAO,SAAS,6BAA6B,EACpD,KAAM,IACN,IAAK,SACL,SAAU,EACX,EACA,CACC,MAAOA,EAAO,SAAS,+BAA+B,EACtD,KAAM,IACN,IAAK,WACL,SAAU6f,EAAoB,KAC/B,EACA,EAEK//B,EAAWmB,EAAS,IAClB,CAACkc,EAAQ,oBAAoB,SAAS,CAAC,EAAGA,EAAQ,oBAAoB,SAAS,CAAC,CAAC,CACxF,EAEK4iB,EAAQ9+B,EAAS,KACf,CACN,KAAM,GAAGnB,EAAS,MAAM,CAAC,CAAC,KAC1B,IAAK,GAAGA,EAAS,MAAM,CAAC,CAAC,MAE1B,EAEK+B,EAAQ,IAAM,CACnBsb,EAAQ,mBAAmB,GAGtB6iB,EAAoB3rB,GAAmB,CACxCA,IAAW,SACdjI,EAAK,iBAAkBiI,CAAM,EACnBA,IAAW,aACrByI,EAAU,MAAM,kCAAmC,GAAI,CAAE,YAAa,GAAM,EAC5EK,EAAQ,kBAAoB,IAEvBtb,GAAA,qrBC0CP,SAASo+B,GAAwB/9B,EAA+Bm7B,EAAqB,CACpF,OAAOn7B,EACL,OACCd,GAAS,kBAACA,EAAK,UAAUiH,GAAAtC,GAAAuC,EAAAlH,EAAK,QAAL,YAAAkH,EAAY,gBAAZ,YAAAvC,EAA4B63B,MAA5B,YAAAv1B,EAA6C,SAASg1B,IAAW,EAE3F,IAAKj8B,IAAU,CACf,IAAKA,EAAK,KACV,KAAM,OACN,WAAY,CACX,MAAO,CAAC,EACR,KAAMA,EAAK,KACX,YAAaA,EAAK,YAClB,MAAOA,EAAK,YACZ,YAAaA,EAAK,YAElB,KAAMA,EAAK,KACX,SAAUA,EAAK,KAAK,cAAc,SAAS,QAAQ,EAChD,CACA,KAAM,OACN,KAAM,SACN,WAAY,qBAEZ,QACJ,CACC,IACD,KAAK,CAAC+7B,EAAG5K,IAAM4K,EAAE,WAAW,YAAY,cAAc5K,EAAE,WAAW,WAAW,CAAC,CAClF,CAEO,SAAS2N,GAAOC,EAAwC,CAC9D,MAAMr/B,EAAOC,KACPP,EAAiBC,KACjB2/B,EAAiBC,KAEjBC,EAAaL,GAAwBz/B,EAAe,mBAAoB+/B,EAAkB,EAC1FC,EAAaP,GAAwBz/B,EAAe,mBAAoBigC,EAAkB,EAEzF,OACN,MAAOC,GACP,MAAO5/B,EAAK,SAAS,6BAA6B,EAClD,SAAUA,EAAK,SAAS,kCAAkC,EAC1D,KAAMA,EAAK,SAAS,8BAA+B,CAClD,YAAa,CAAE,KAAMs/B,EAAe,sBAAsB,IAAI,CAAE,EAChE,EACD,MAAO,CACN,GAAGE,EACH,GAAGE,EACH,CACC,IAAKG,GACL,KAAM,OACN,WAAY,CACX,MAAO7/B,EAAK,SAAS,kCAAkC,EACvD,KAAM,QACN,YAAaA,EAAK,SAAS,6CAA6C,CACzE,CACD,CACD,EAEF,CACO,SAAS8/B,GAAYT,EAAwC,CACnE,MAAMr/B,EAAOC,KAEb,SAAS8/B,EAA2BC,EAAwC,CACpE,OACN,eAAgBA,EAChB,UAAW,CACV,MAAO,mBAAmBA,CAAkB,SAC7C,EACA,WAAY,oBAAoBA,CAAkB,GAEpD,CAEO,OACN,MAAOH,GACP,MAAO7/B,EAAK,SAAS,kCAAkC,EACvD,SAAUA,EAAK,SAAS,kCAAkC,EAC1D,MAAO,CACN,CACC,IAAKigC,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,cACN,GAAGF,EAA2B/3B,EAAmB,UAAU,CAC5D,CACD,EACA,CACC,IAAKk4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,WACN,GAAGH,EAA2B/3B,EAAmB,eAAe,CACjE,CACD,EACA,CACC,IAAKm4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,QACN,GAAGJ,EAA2B/3B,EAAmB,QAAQ,CAC1D,CACD,EACA,CACC,IAAKo4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,OACN,GAAGL,EAA2B/3B,EAAmB,cAAc,CAChE,CACD,EACA,CACC,IAAKq4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,SACN,GAAGN,EAA2B/3B,EAAmB,WAAW,CAC7D,CACD,EACA,CACC,IAAKs4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,sBACN,GAAGP,EAA2B/3B,EAAmB,cAAc,CAChE,CACD,EACA,CACC,IAAKu4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,QACN,GAAGR,EAA2B/3B,EAAmB,MAAM,CACxD,CACD,EACA,CACC,IAAKw4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,gBACN,GAAGT,EAA2B/3B,EAAmB,WAAW,CAC7D,CACD,EACA,CACC,IAAKy4B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,kBACN,GAAGV,EAA2B/3B,EAAmB,aAAa,CAC/D,CACD,EACA,CACC,IAAK04B,GACL,KAAM,cACN,WAAY,CACX,MAAOA,GACP,KAAM,MACP,CACD,CACD,EAEF,CAEO,SAASC,GAAYv/B,EAA6B,CACxD,MAAMpB,EAAOC,KAgGN,MA9FgB,CACtB,MAAOg+B,GACP,MAAOj+B,EAAK,SAAS,+CAA+C,EACpE,SAAUA,EAAK,SAAS,0DAA0D,EAClF,MAAO,CACN,CACC,IAAK28B,GACL,KAAM,cACN,WAAY,CACX,kBAAmB,CAACvuB,GAAmBwyB,EAAoB,EAC3D,MAAO,oBACP,KAAM,gBACP,CACD,EACA,CACC,IAAKC,GACL,KAAM,OACN,SAAU,CAACnE,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMmE,GACN,YAAa7gC,EAAK,SAAS,2DAA2D,EACtF,YAAaA,EAAK,SAAS,2DAA2D,EACtF,KAAM,UACP,CACD,EACA,CACC,IAAKoO,GACL,KAAM,OACN,SAAU,CAACsuB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMtuB,GACN,YAAapO,EAAK,SAAS,0DAA0D,EACrF,YAAaA,EAAK,SAAS,0DAA0D,EACrF,SAAU,CACT,KAAM,OACN,KAAM,UACN,WAAY,0BACb,CACD,CACD,EACA,CACC,IAAKgJ,GACL,KAAM,OACN,SAAU,CAAC0zB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAM1zB,GACN,YAAahJ,EAAK,SAAS,uDAAuD,EAClF,YAAaA,EAAK,SAAS,uDAAuD,EAClF,SAAU,CACT,KAAM,OACN,KAAM,OACN,WAAY,uBACb,CACD,CACD,EACA,CACC,IAAKmO,GACL,KAAM,OACN,SAAU,CAACuuB,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMvuB,GACN,YAAanO,EAAK,SAAS,yDAAyD,EACpF,YAAaA,EAAK,SAAS,yDAAyD,EACpF,KAAM,kBACP,CACD,EACA,CACC,IAAK8gC,GACL,KAAM,OACN,SAAU,CAACpE,EAAmB,EAC9B,WAAY,CACX,MAAO,CAAC,EACR,KAAMoE,GACN,YAAa9gC,EAAK,SAAS,2DAA2D,EACtF,YAAaA,EAAK,SAAS,2DAA2D,EACtF,KAAM,iBACP,CACD,EACA,CACC,KAAM,cACN,IAAK+gC,GACL,SAAUrE,GACV,WAAY,CACX,MAAOqE,GACP,KAAM,aACP,CACD,CACD,EAIF,CAEO,SAASC,GAAY5/B,EAA6B,CACxD,MAAMpB,EAAOC,KAEP0+B,EAAiB,CACtB,MAAOsC,GACP,MAAOjhC,EAAK,SAAS,gDAAgD,EACrE,MAAO,CACN,CACC,IAAK28B,GACL,KAAM,cACN,WAAY,CACX,MAAO,oBACP,KAAM,QACN,kBAAmB,CAACuE,GAAoBC,EAAoB,CAC7D,CACD,EACA,CACC,KAAM,cACN,IAAKC,GACL,SAAU1E,GACV,WAAY,CACX,MAAO0E,GACP,KAAM,MACN,SAAU,CACT,CACC,IAAK,UACL,MAAOphC,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACqhC,GAAeC,GAAgBC,EAAkB,CAC1D,EACA,CACC,IAAK,cACL,MAAOvhC,EAAK,SAAS,gDAAgD,EACrE,MAAO,CACNwhC,GACAC,GACAC,GACAC,EACD,CACD,EACA,CACC,IAAK,UACL,MAAO3hC,EAAK,SAAS,4CAA4C,EACjE,MAAO,CAAC4hC,GAAqBC,GAAqBC,EAAe,CAClE,EACA,CACC,IAAK,UACL,MAAO9hC,EAAK,SAAS,4CAA4C,EACjE,MAAO,CACNqgB,GACA0hB,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACD,CACD,CACD,CACD,CACD,EACA,CACC,KAAM,cACN,IAAKC,GACL,SAAU5F,GACV,WAAY,CACX,MAAO4F,GACP,KAAM,cACN,SAAU,CACT,CACC,IAAK,UACL,MAAOtiC,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACwhC,GAAkBe,GAAcC,GAA4BV,EAAe,CACpF,CACD,CACD,CACD,EACA,CACC,KAAM,cACN,IAAKW,GACL,SAAU/F,GACV,WAAY,CACX,MAAO+F,GACP,KAAM,WACN,SAAU,CACT,CACC,IAAK,UACL,MAAOziC,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAACmiC,GAA2BD,EAA2B,CAC/D,CACD,CACD,CACD,EACA,CACC,KAAM,cACN,IAAKQ,GACL,SAAUhG,GACV,WAAY,CACX,MAAOgG,GACP,KAAM,UACN,SAAU,CACT,CACC,IAAK,UACL,MAAO1iC,EAAK,SAAS,kCAAkC,EACvD,MAAO,CAAC2iC,GAAwBv0B,GAAmBkzB,EAAc,CAClE,CACD,CACD,CACD,CACD,GAIG,OADgBlgC,GAAS,CAAC,GAAG,KAAMd,YAAS,OAAA2E,GAAAuC,EAAAlH,EAAK,QAAL,YAAAkH,EAAY,aAAZ,YAAAvC,EAAwB,SAAS63B,IAAe,GAE/F6B,EAAK,MAAM,KAAK,CACf,IAAKiB,GACL,KAAM,OACN,WAAY,CACX,MAAO5/B,EAAK,SAAS,sCAAsC,EAC3D,KAAM,QACN,YAAaA,EAAK,SAAS,gCAAgC,EAC3D,IAAKA,EAAK,SAAS,4BAA4B,CAChD,EACA,EAEF2+B,EAAK,MAAM,KAAK,CACf,IAAKV,GACL,KAAM,OACN,WAAY,CACX,MAAOj+B,EAAK,SAAS,kDAAkD,EACvE,KAAM,OACN,YAAaA,EAAK,SAAS,6DAA6D,CACzF,EACA,EAEM2+B,CACR,CC5eO,MAAMiE,GAAmB,uBACnBC,GAAe,CAC3B,UACA,YACA,YACA,aACA,QACA,SACA,KACD,EAEaC,GAAwBhF,GAAY,gCAAiC,IAAM,CACjF,MAAAiF,EAAkB9jC,EAA6B,EAAE,EACjD+jC,EAAe/jC,EAAmB,IAAI,EAEtCgkC,EAAYhkC,EAA6B,EAAE,EAEjD,SAASikC,EAAYC,EAAmB,CAChC,OAAAA,GAAA,YAAAA,EAAS,aAAa,yBAC9B,CACA,SAASC,EAAaD,EAAmB,CACjC,OAAAA,GAAA,YAAAA,EAAS,aAAaP,MAAqB,MACnD,CACA,eAAeS,GAAwC,CACtD,OAAO,MAAM,IAAI,QAASC,GAAY,CAEdC,IACvB,WAAW,IAAM,CAChBR,EAAgB,MAAQ,MAAM,KAC7B,SAAS,iBAAiB,0BAA0B,GACnD,IAAKS,GAAO,IAAI,QAAQA,CAAE,CAAC,EACrBF,KACN,CAAC,EACJ,CACF,CAES,SAAAG,EAAgBC,EAA0BC,EAAqB,CACrD,OAAO,OAAOV,EAAU,KAAK,EACvB,OAAQW,GAASA,EAAK,aAAa,SAASF,CAAW,CAAC,EAE1E,QAASE,GAAS,CACvB,GAAI,CAACZ,EAAa,MAAO,QAGxBY,EAAK,YAAc,QACnBA,EAAK,UAAUV,EAAYS,CAAU,GAAK,GAAIX,EAAa,KAAK,IAE1CA,EAAa,OAC9BY,EAAA,QAAQZ,EAAa,MAAOU,CAAW,CAC7C,CACA,CACF,CAEA,eAAe5sB,EAAUxT,EAAkB,WAC1C,MAAMugC,EAAavgC,EAAE,IACjB,IAACu/B,GAAa,SAASgB,CAAU,EAAG,OACxCvgC,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,MAAM+/B,EAAuB,EACvB,MAAAS,EAAkBf,EAAgB,MAAM,UAC5CzyB,GAAS8yB,EAAa9yB,GAAA,YAAAA,EAAM,OAAO,IAAM0yB,EAAa,OAElDW,GAAan8B,EAAAu7B,EAAgB,MAAMe,CAAe,IAArC,YAAAt8B,EAAwC,QAErDu8B,EAAcF,IAAe,YAC7BG,EAAYH,IAAe,UAEjC,GAAKF,EAEL,IAAII,EAAa,CAChB,MAAME,EACLH,EAAkBf,EAAgB,MAAM,OAAS,EAAIe,EAAkB,EAAI,EAE5EI,GAAcj/B,EAAA89B,EAAgB,MAAMkB,CAAa,IAAnC,YAAAh/B,EAAsC,OAAO,CAC5D,CACA,GAAI++B,EAAW,CACd,MAAMG,EACLL,EAAkB,EAAIA,EAAkB,EAAIf,EAAgB,MAAM,OAAS,EAE5EmB,GAAc38B,EAAAw7B,EAAgB,MAAMoB,CAAa,IAAnC,YAAA58B,EAAsC,OAAO,CAC5D,CACAk8B,EAAgBI,EAAYF,CAAU,EACvC,CAEA,SAASS,EAAgBxpB,EAAY,CACpCooB,EAAa,MAAQpoB,CACtB,CAEA,SAASspB,EAAc5zB,EAAgB,CAChC,MAAA+zB,EAASjB,EAAa9yB,CAAI,EAC3B+zB,IAELD,EAAgBC,CAAM,EAClB/zB,GAAA,MAAAA,EAAM,iBACTA,GAAA,MAAAA,EAAM,eAAe,CAAE,MAAO,QAAU,IAE1C,CAEA,eAAeg0B,EAAmBz/B,EAAe,OAChD,MAAMw+B,EAAuB,EAE7Ba,GAAc18B,EAAAu7B,EAAgB,MAAMl+B,CAAK,IAA3B,YAAA2C,EAA8B,OAAO,CACpD,CAEA,SAAS+8B,GAAqB,CAC7B,SAAS,iBAAiB,UAAWztB,EAAW,CAAE,QAAS,GAAM,CAClE,CAEA,SAAS0tB,GAAqB,CACNjB,IACvB,SAAS,oBAAoB,UAAWzsB,EAAW,CAAE,QAAS,GAAM,CACrE,CAES,SAAA2tB,EAAgB73B,EAAcg3B,EAAe,CAChDA,EAAA,aAAa,QAASF,GAAgB,CACtC,GAAAb,GAAa,SAASa,CAAW,EAC1BT,EAAA,MAAQ,CAAE,GAAGA,EAAU,MAAO,CAACr2B,CAAI,EAAGg3B,OAEhD,OAAM,IAAI,MAAM,OAAOF,CAAW,mBAAmB,CACtD,CACA,CACF,CAEA,SAASH,GAAyB,CAEjCR,EAAgB,MAAQ,EACzB,CAEA,SAAS2B,GAAqB,CAC7B,OAAO3B,EAAgB,MAAM,UAC3BzyB,GAAS8yB,EAAa9yB,GAAA,YAAAA,EAAM,OAAO,IAAM0yB,EAAa,MAEzD,CAEO,OACN,aAAAA,EACA,mBAAAuB,EACA,uBAAAlB,EACA,mBAAAmB,EACA,gBAAAC,EACA,mBAAAC,EACA,gBAAAN,EACA,mBAAAE,CAAA,CAEF,CAAC,EChGYK,GAAgB7G,GAAY,wBAAyB,IAAM,CACvE,MAAMe,EAAmBhB,KACnB,CAAE,mBAAA6G,GAAuB5B,KAEzB8B,EAAa3lC,EAAiB,EAAE,EAEhC4lC,EAAmB1kC,EAA+B,IAAM,CAC7D,MAAM2kC,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAEtD,KAACE,GAAA,MAAAA,EAAO,eACX,OAAOA,EAAM,MAAQC,EAAoBD,EAAM,KAAK,EAAI,GAGrD,GAAAA,EAAM,QAAUE,EAAgB,MAAO,CACpC,MAAAC,EACLD,EAAgB,MAAM,OAAS,EAC5BA,EAAgB,MAChBzH,GAAsBuH,EAAM,eAAiB,CAAE,GAEnD,OAAOC,EAAoB3H,GAAY0H,EAAM,QAAU,GAAIG,CAAU,CAAC,CACvE,CACO,OAAAF,EAAoBD,EAAM,aAAa,EAC9C,EAEKI,EAAkB/kC,EAAoB,IAAM,CACjD,MAAM2kC,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,CAACE,EAAO,MAAO,GAEnB,MAAMK,EAAoB5H,GAAsBuH,EAAM,eAAiB,CAAE,GAElE,OACN,GAAGA,EACH,MAAOD,EAAiB,MACxB,UAAWM,EAAkB,OAAS,IAAKL,GAAA,YAAAA,EAAO,WACnD,CACA,EAEKM,EAAsBjlC,EAC3B,IAAM+kC,EAAgB,MAAM,MAAQjH,EAAA,EAG/B+G,EAAkB7kC,EAA+B,IAAM,CAC5D,MAAM2kC,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,OAAKE,GAAA,MAAAA,EAAO,YAELA,EAAM,YAAY,IAAKx0B,GAASgsB,GAAkBhsB,EAAMw0B,EAAM,WAAW,CAAC,EAFjD,EAEiD,CACjF,EAGKO,EAAwBllC,EAA+B,IAAM,CAClE,MAAM2kC,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,EAACE,GAAA,MAAAA,EAAO,QAAQ,MAAO,GAErB,MAAAQ,EAAWzG,EAAiB,YAAY,IAAKvuB,GAASgsB,GAAkBhsB,CAAI,CAAC,EAG5E,OAFoBy0B,EAAoB3H,GAAY0H,EAAM,QAAU,GAAIQ,CAAQ,CAAC,EAE9D,OAAQh1B,GAC1B,CAACu0B,EAAiB,MAAM,KAAMlB,GAAeA,EAAW,MAAQrzB,EAAK,GAAG,CAC/E,EACD,EAEKi1B,EAAqBplC,EAAS,IAAMy8B,GAAmBiC,EAAiB,WAAW,CAAC,EAE3E,eAAA2G,EACdr5B,EACAs5B,EACA5J,EACC,OACD,MAAM77B,EAAOC,KAET,IAAAylC,EACAC,EAEAF,IAAa,IAChBC,EAAwB/lC,GAAoB,6CAC5BgmC,EAAA,CACf,WAAY,CACX,MAAO3lC,EAAK,SAAS,6BAA6B,EAClD,KAAM,OACP,KAGD0lC,EAAwB/lC,GAAoB,8CAE5CgmC,EAAgB7F,GAAc,EAAE,MAAM,KACpCxvB,GAASA,EAAK,WAAW,iBAAmBnE,CAAA,GAI/C,MAAMy5B,GAAS,EACDC,EAAA,CACb,MAAOF,GAAA,YAAAA,EAAe,WAAW,MACjC,SAAU9F,GACV,KAAM,QACN,MAAOhB,EAAiB,oBACxB,SAAU,CACT,SAAU,OACV,KAAM8G,GAAA,YAAAA,EAAe,WAAW,KAChC,OAAOn+B,EAAAm+B,GAAA,YAAAA,EAAe,WAAW,YAA1B,YAAAn+B,EAAqC,KAC7C,EACA,WAAYm+B,GAAA,YAAAA,EAAe,WAAW,WACtC,WAAa9kB,GAA0B,OAGtC,GAAIA,EAAE,MAAQilB,GAA0B,SACxC,MAAMC,EAAcL,EAAsBv5B,CAAc,EAAE,SAAS0U,EAAE,GAAG,EAMpE,OAAAklB,KAAev+B,EAAAq0B,GAAA,YAAAA,EAAQ,QAAR,MAAAr0B,EAAe,QAC1Bq0B,EAAO,MAAM,SAAShb,EAAE,GAAG,EAG5BklB,CACR,EACA,YAAYz1B,EAAM,CACV,OACN,GAAGA,EACH,YAAanE,CAAA,CAEf,EACA,YAAa,GACb,CACF,CAEA,SAAS65B,GAAwB,CAChC,MAAMlB,EAAQF,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC1D,GAAI,CAACE,GAAS,CAACI,EAAgB,MAAM,KAAM,OAEvC,IAAAe,GAAanB,GAAA,YAAAA,EAAO,QAAS,GAE7B,KAACA,GAAA,MAAAA,EAAO,OAAO,CACZ,MAAAvI,GAAcuI,GAAA,YAAAA,EAAO,cAAenI,GACpCuJ,EAAqBX,EAAmB,MAAMhJ,CAAW,EACzDkB,EAAWqH,EAAM,SAEnBrH,EACUwI,EAAAzI,GAAqB0I,EAAoBzI,CAAQ,EAEjDwI,EAAAC,CAEf,CAIA,IAAKpB,EAAM,mBAAqB,IAAI,OAAS,EAAG,CACzC,MAAAqB,EAAetH,EAAiB,YACpC,OAAQvuB,GAAS,cAAA9I,EAAAs9B,EAAM,oBAAN,YAAAt9B,EAAyB,SAAS8I,EAAK,MAAK,EAC7D,IAAKA,GAASgsB,GAAkBhsB,EAAMw0B,EAAM,WAAW,CAAC,EAE/CmB,EAAA,KAAK,GAAGE,CAAY,CAChC,CAEIrB,EAAM,aACImB,IAAW,OAAOnB,EAAM,UAAU,GAG5CA,EAAM,cACImB,IAAW,IAAInB,EAAM,WAAW,GAIzCA,EAAM,QACVmB,EAAahJ,GAAuBgJ,CAAU,GAGxBG,EAAA,CAAE,cAAeH,CAAA,CAAY,CACrD,CAEA,SAASlB,EAAoB/jB,EAA6B,CAClD,OAAAA,EAAM,IAAK1Q,IAAU,CAC3B,GAAGA,EACH,KAAM,GAAGA,EAAK,GAAG,IAAI+1B,IAAM,EAC1B,GACH,CAEA,SAASR,EAAcf,EAAkB,CACpCI,EAAgB,MAAM,MACzBkB,EAAuB,CAAE,YAAa1B,EAAmB,CAAG,GAG7D,MAAM4B,EAAeD,KACrBzB,EAAW,MAAM,KAAK,CACrB,GAAGE,EACH,KAAMwB,EACN,oBAAqB,KACrB,YAAa,EACb,EACqBN,GACvB,CAEA,SAASO,GAAe,CACnBrB,EAAgB,MAAM,OACzBN,EAAW,MAAM,MACMwB,EAAA,CAAE,oBAAqB,MAAO,EAEvD,CAEA,SAASA,EAAuBtB,EAA2B,CAC1D,MAAM0B,EAAe5B,EAAW,MAAMA,EAAW,MAAM,OAAS,CAAC,EAC3D6B,EAAe7B,EAAW,MAAM,UAAWhH,GAAMA,EAAE,OAAS4I,EAAa,IAAI,EAC9EA,GAGL,OAAO,KAAK1B,CAAK,EAAE,QAASlyB,GAAQ,CACnC,MAAM8zB,EAAW9zB,EACNgyB,EAAA,MAAM6B,CAAY,EAAI,CAChC,GAAG7B,EAAW,MAAM6B,CAAY,EAChC,CAAC7zB,CAAG,EAAGkyB,EAAM4B,CAAQ,EACtB,CACA,CACF,CAEA,SAASC,GAAkB,CAC1B/B,EAAW,MAAQ,EACpB,CAEO,OACN,WAAAA,EACA,gBAAAM,EACA,oBAAAE,EACA,sBAAAC,EACA,6BAAAG,EACA,gBAAAmB,EACA,uBAAAP,EACA,cAAAP,EACA,aAAAU,CAAA,CAEF,CAAC,ECrRM,SAASK,GACfC,EACAj/B,EAGI,GACH,CACD,MAAMpI,EAAUC,KACVqnC,EAAmB7nC,EAAI,CAAC,EAAG,CAAC,CAAC,EAC7Bm1B,EAAgBhyB,KAKtB,SAAS2kC,EAAUzjC,EAAe,CACjC,MAAM0jC,EAAiBxnC,EAAQ,uBAEzB,CAAC2Z,EAAGxW,CAAC,EAAIxB,GAAiBmC,CAAC,EAE3B2jC,EAA0BD,EAAe,CAAC,GAAK7tB,EAAI2tB,EAAiB,MAAM,CAAC,GAC3EI,EAA0BF,EAAe,CAAC,GAAKrkC,EAAImkC,EAAiB,MAAM,CAAC,GACzE,OAAAtnC,EAAA,uBAAyB,CAACynC,EAAyBC,CAAuB,EAGjEJ,EAAA,MAAQ,CAAC3tB,EAAGxW,CAAC,EAEvB,CAACskC,EAAyBC,CAAuB,CACzD,CAKS,SAAAC,EAAY7jC,EAAeI,EAA4B,CAO3D,GANA,EAAE0wB,EAAc,iBAAiB9wB,CAAC,GAAKI,IAMvClE,EAAQ,eAAe,YAAY,EAEtC,OAIG8D,EAAE,SAAW8jC,GAAmB,SACnC5nC,EAAQ,uBAAyB,IAGlC,KAAM,CAAC2Z,EAAGxW,CAAC,EAAIxB,GAAiBmC,CAAC,EAEhBwjC,EAAA,MAAQ,CAAC3tB,EAAGxW,CAAC,EAExB,MAAAwgC,EAAUkE,EAAMR,CAAU,EACvB1D,GAAA,MAAAA,EAAA,iBAAiB,YAAamE,EACxC,CAKA,SAASC,EAAUtO,EAAe,CAC7B,IAACz5B,EAAQ,uBAGZ,OAGK,MAAA2jC,EAAUkE,EAAMR,CAAU,EACvB1D,GAAA,MAAAA,EAAA,oBAAoB,YAAamE,GAE1C9nC,EAAQ,uBAAyB,EAGlC,CAMA,SAAS8nC,EAAYhkC,EAAe,CAC7B,MAAA6/B,EAAUkE,EAAMR,CAAU,EAC5B,KAAAvjC,EAAE,QAAU,EAAE6/B,IAAY7/B,EAAE,QAAU6/B,GAAA,MAAAA,EAAS,SAAS7/B,EAAE,WAI1D,CAAA9D,EAAQ,eAAe,YAAY,EASnC,IAJA8D,EAAE,UAAYkkC,GAAoB,SACrChoC,EAAQ,uBAAyB,IAG9B8D,EAAE,UAAYkkC,GAAoB,KAAM,CAIrC,MAAAC,EAAiBJ,EAAMz/B,EAAQ,cAAc,EACnD6/B,GAAA,MAAAA,EAAiBnkC,GACjB,MACD,CAEAyjC,EAAUzjC,CAAC,EACZ,CAEO,OACN,iBAAAwjC,EACA,YAAAK,EACA,UAAAI,EACA,YAAAD,EACA,UAAAP,CAAA,CAEF,CCuRA,MAAMW,GAAeroB,GACpB,SAAY,MAAMC,GAAA,WAAO,4BAAoC,OAAA3e,KAAA,6GAC9D,EACMgnC,GAAiBtoB,GACtB,SAAY,MAAMC,GAAA,WAAO,8BAAiC,4GAC3D,EACMsoB,GAAiCvoB,GACtC,SACC,MAAMC,GAAA,WAAO,8CAAgF,yGAC/F,EAEAuoB,GAAe1iC,EAAgB,CAC9B,KAAM,WACN,WAAY,CACX,gBAAA2iC,GACA,KAAAC,GACA,OAAAC,GACA,gBAAAC,GACA,wBAAAC,GACA,aAAAR,GACA,eAAAC,GACA,YAAAQ,GACA,+BAAAP,GACA,cAAAQ,EACD,EACA,MAAM,iBAAiBC,EAAIC,EAAMC,EAAM,CACtC,GACCC,GAAeH,CAAE,IAAMI,GAAiB,YACxCH,EAAK,OAASvc,EAAM,iBACnByc,GAAeH,CAAE,IAAMI,GAAiB,UAAYH,EAAK,OAASvc,EAAM,gBACxE,CACIwc,IACL,MACD,CACA,GAAI,KAAK,QAAQ,cAAgB,CAAC,KAAK,YAAa,CAC7C,MAAAG,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,GAEGA,IAAiB/5B,IAEf,oBAAe,cAAcg6B,EAA6B,EACjD,MAAM,KAAK,gBAAgB,oBAAoB,GAAI,EAAK,GAE/D,WAAK,cAAc,mBAE1B,KAAK,QAAQ,aAAe,GAExBL,EAAK,OAASvc,EAAM,aAGvB,MAAM,KAAK,QAAQ,QAClB,CAAE,KAAMA,EAAM,SAAU,OAAQ,CAAE,KAAM,KAAK,gBAAkB,EAC/D,IAAM,CAGA,KAAK,QAAQ,KAAKsc,CAAiB,CACzC,IAGI,wBAAmB,qBAAqB,KAAK,eAAe,EAC5DE,MAEIG,IAAiBE,KACtB,wBAAmB,qBAAqB,KAAK,eAAe,EAC5D,oBAAe,cAAcD,EAA6B,EAC/D,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAe,GACvBJ,IACN,MAEK,wBAAmB,qBAAqB,KAAK,eAAe,EAC5DA,GAEP,EACA,OAAQ,CACD,MAAAM,EAAkB5pC,EAAI,IAAI,EAC1B6pC,EAAc7pC,EAAI,IAAI,EACtBwoC,EAAiBxoC,EAAI,IAAI,EACzBmJ,EAASC,KAET6T,EAAW/U,KACX0G,EAAgB5G,KAChBiY,EAASjf,KACTqwB,EAAchxB,KACdypC,EAAaC,KACb99B,EAAcC,KACd7C,EAAYC,KACZ,CAAE,WAAAgG,CAAA,EAAeia,GAAYtM,CAAQ,EACrCtO,EAAalM,GAAc6M,CAAU,EACrC6lB,EAAgBhyB,KAChB,CAAE,cAAAyV,GAAkBxM,KACpB49B,EAAgBrC,GAAiBiC,EAAiB,CAAE,eAAApB,CAAgB,GACpEj/B,EAAkBC,GAAmB,CAAE,OAAAL,CAAQ,GAC/C,CAAE,YAAA0F,EAAa,qBAAAC,CAAA,EAAyBC,GAAe,CAAE,OAAA5F,EAAQ,EAEhE,OACN,OAAA8W,EACA,YAAAoR,EACA,WAAAyY,EACA,YAAA79B,EACA,cAAA2C,EACA,UAAAvF,EACA,WAAAsF,EACA,cAAAwmB,EACA,cAAA6U,EACA,gBAAAJ,EACA,YAAAC,EACA,eAAArB,EACA,gBAAAj/B,EACA,YAAAsF,EACA,qBAAAC,EACA,cAAA8J,EACA,GAAG9V,GAAqB,EACxB,GAAGmnC,GAAqB,EACxB,GAAGC,GAAe,EAClB,GAAGzgC,GAAS,EACZ,GAAGuF,GAAW,EACd,GAAG7J,GAAkB,EACrB,GAAGglC,GAAsB,EAE3B,EACA,MAAO,CAEN,MAAM,OAAOf,EAAWC,EAAa,CACpC,KAAK,sBAAsB,EAErB,MAAAe,EAAab,GAAeH,CAAE,EAC9BiB,EAAyB,CAAC,KAAK,QAAQ,oBAC7C,IAAIC,EACHjB,EAAK,OAAO,OAASD,EAAG,OAAO,MAE/B,EAAEC,EAAK,OAAO,OAAS,OAAS,KAAK,kBAAoBK,KACvDL,EAAK,OAASvc,EAAM,cAEtBsc,EAAG,OAAO,SAAW,eAChB,MAAAmB,EAAoBnB,EAAG,OAAStc,EAAM,gBAGxC,GAAAsd,IAAeZ,GAAiB,UAAYe,EAAmB,CAC9D,GAAAD,GAAmBD,GAA0BE,EAAmB,CAEnE,GADA,KAAK,YAAY,eACbF,EAAwB,CACrB,MAAAG,EAAqB,KAAK,QAAQ,aACxC,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAeA,CAC7B,CACM,cAAQ,IAAI,CAAC,KAAK,kBAAmB,KAAK,SAAU,EAAC,EAC3D,KAAK,YAAY,cACb,KAAK,gBACR,KAAK,cAAgB,GAEvB,CACA,MAAM,KAAK,uBACZ,CAEIJ,IAAeZ,GAAiB,aACnCc,EACCjB,EAAK,OAAO,OAASD,EAAG,OAAO,MAC/B,EAAEA,EAAG,OAAO,OAAS,OAASC,EAAK,OAAO,OAAS,QAChDiB,IAEH,KAAK,QAAQ,oBAAsB,IAGtC,EACA,YAAa,CAEZ,KAAK,iBAAmB,EACzB,EACA,gBAAgBG,EAAiB,CAE5BA,IAAoB,IAClB,iBAAY,qCAAqC,KAAK,yBAAyB,CACtF,EACA,cAAcC,EAAU,CACvB,MAAM9C,EAAa,KAAK,YACpBA,IACQA,EAAA,MAAM,UAAY,SAAS8C,CAAQ,IAEhD,CACD,EACA,cAAe,CAACC,EAAKC,EAAIC,IAAS,CACjC,QAAQ,MAAM,eAAe,EAC7B,QAAQ,MAAMF,CAAG,CAClB,EACA,SAAU,CACT,GAAG1iC,GACF5E,GACAynC,GACA/5B,GACA6tB,GACAl+B,GACAwH,GACAiV,GACAoR,GACA+R,GACA9/B,GACAI,EACAmqC,GACAnM,GACAoM,GACAh6B,GACAF,GACAm6B,GACAC,GACAC,GACArqC,GACAsqC,GACA/tB,EACD,EACA,gCAA2C,CAC1C,OAAO,KAAK,eAAe,8BAC5B,EACA,aAA4B,CAC3B,OAAO,KAAK,WAAW,WACxB,EACA,YAA6B,CAC5B,OAAO,KAAK,SAAS,UACtB,EACA,4BAAsC,CACrC,OAAO,KAAK,eAAe,0BAC5B,EACA,QAAkB,CACV,YAAK,OAAO,OAASyP,EAAM,IACnC,EACA,qBAA+B,CACvB,OAAC,KAAK,WAAa,CAAC,KAAK,iBAAmB,CAAC,KAAK,QAAU,CAAC,KAAK,WAC1E,EACA,kBAAmC,CAClC,OAAO,KAAK,QAAQ,mBACrB,EACA,OAAmB,CAClB,OAAO,KAAK,eAAe,QAC5B,EACA,eAA2B,CACnB,YAAK,eAAe,SAAS,OAAQzrB,GAASA,EAAK,OAASgB,EAAgB,CACpF,EACA,kBAA8B,CACtB,YAAK,eAAe,SAAS,OAAQhB,GAASA,EAAK,OAASgB,EAAgB,CACpF,EACA,eAAwB,CACnB,OAAC,KAAK,gBAIN,KAAK,2BACD,KAAK,QAAQ,SAAS,+CAA+C,EAGtE,KAAK,QAAQ,SAAS,0CAA0C,EAP/D,KAAK,QAAQ,SAAS,wCAAwC,CAQvE,EACA,eAAwB,CACjB,MAAA0lC,EAAiB,KAAK,QAAQ,uBAC7B,OACN,KAAMA,EAAe,CAAC,EAAI,KAC1B,IAAKA,EAAe,CAAC,EAAI,KAE3B,EACA,sBAA+B,CACvB,OACN,iBAAkB,KAAK,iBAAmB,OAAS,MAErD,EACA,iBAA0B,CACzB,OAAOsD,GACN,KAAK,cACL,KAAK,QAAQ,uBACb,KAAK,mBAEP,EACA,iBAAkB,CACjB,MAAMC,EAAgB,GAClB,YAAK,gBAAkB,KAAK,wBAC3B,KAAK,QAAQ,uBAChBA,EAAc,KAAK,iBAAiB,EAEpCA,EAAc,KAAK,aAAa,IAG9B,KAAK,cAAgB,KAAK,gBAAkB,KAAK,uBAEpDA,EAAc,KAAK,eAAe,EAG/B,KAAK,oBAAoB,OAC5BA,EAAc,KAAK,8BAA8B,EACjDA,EAAc,KAAK,qCAAqC,KAAK,oBAAoB,IAAI,EAAE,EACzEA,EAAA,KACb,2CAA2C,KAAK,oBAAoB,UAAU,KAIzEA,CACR,EACA,mBAA+C,CAC9C,OAAO,KAAK,eAAe,oBAC5B,EACA,iBAA2B,CACnB,YAAK,QAAQ,eAAe,iBAAiB,CACrD,EACA,iBAA0B,CACzB,OAAO,KAAK,OAAO,OAAO,MAAQ,KAAK,eAAe,UACvD,EACA,cAAuB,CACtB,OAAO,KAAK,eAAe,YAC5B,EACA,qBAA+B,CAEvB,OADsB,KAAK,aAAa,OAAQjqC,GAASA,EAAK,QAAQ,EACjD,SAAW,KAAK,aAAa,MAC1D,EACA,cAA0B,CACzB,OAAO,KAAK,MAAM,OAChBA,GAASA,EAAK,OAASwpB,IAAmB,KAAK,eAAe,cAAcxpB,EAAK,IAAI,EAExF,EACA,iBAA2B,CACnB,YAAK,aAAa,OAAS,CACnC,EACA,mBAA6B,CAC5B,MACC,CAAC,KAAK,4BACN,CAAC,CAAC,KAAK,MAAM,KACXA,GACA,CAACkqC,GAA+BzhC,EAAsB,EAAE,SAASzI,EAAK,IAAI,GAC1EA,EAAK,WAAa,GAGtB,EACA,kBAA4B,CAC3B,OAAO,KAAK,mBAAqB,KAAK,aAAa,SAAW,CAC/D,EACA,qBAA+B,CAC9B,OACC,KAAK,mBACL,KAAK,aAAa,MAAOA,GAASA,EAAK,UAAYA,EAAK,OAASyI,EAAsB,EAEhF,GAED,CAAC,KAAK,iBAAmB,KAAK,mBACtC,EACA,2BAAwC,CACvC,OAAO,KAAK,QAAQ,sBACrB,EACA,eAAwB,CACvB,OAAO,KAAK,YAAY,aACzB,EACA,UAAmC,CAClC,OAAO,KAAK,YAAY,eACzB,EACA,WAAqB,CACpB,OAAO,KAAK,YAAY,SACzB,EACA,uBAAkC,CAC1B,YAAK,eAAe,oBAC5B,EACA,aAAuB,CACf,YAAK,mBAAmB,YAAY,cAC5C,EACA,iBAAkB,SACV,QAAA9D,GAAAuC,EAAA,KAAK,SAAL,YAAAA,EAAa,OAAb,YAAAvC,EAAmB,kBAAmB,EAC9C,EACA,wBAAkC,CAC1B,YAAK,QAAQ,oBAAoB,IACzC,EACA,0BAAoC,CACnC,MAAMwlC,EACLnxB,GAAWoxB,EAA8B,EAAE,QAAU,OAChDC,EAAoB,KAAK,QAAQ,6BAEhC,OADmB,KAAK,cAAc,mBACjBA,GAAqB,CAACF,CACnD,CACD,EACA,MAAO,CACC,OACN,UAAWG,GACX,iBAAAtpC,GACA,iBAAkB,GAClB,kBAAmB,CAAC,IAAK,GAAG,EAC5B,eAAgB,GAChB,qBAAsB,GACtB,wBAAyB,GACzB,cAAe,GACf,mBAAoB,GACpB,uBAAwB,KACxB,eAAgB,GAChB,cAAe,GACf,oBAAqB,CACpB,KAAM,KACN,WAAY,IACb,EACA,eAAgB,GAChB,iBAAkB,GAClB,mBAAoB,GACpB,0BAA2B,GAC3B,aAAc,KACd,iBAAkB,KAClB,iBAAkB,GAClB,6BAA8B,GAC9B,WAAY,OACZ,UAAW,OACX,qBAAsB,KAItB,oCAAqC,GACrC,0BAAAupC,GACA,eAAgB,GAChB,cAAe,OACf,WAAY,GACZ,eAAgB,GAElB,EACA,MAAM,SAAU,OAEf,KAAK,eAAiB,KAAK,QAE3B,KAAK,eAAe,EACf,iBAAY,aAAa,KAAK,WAA0B,EAC7D,KAAK,WAAW,EAET,wBAAiB,UAAW,KAAK,qBAAqB,EAExD,eAAU,QAAQ,MAAQ,KAAK,sBAEpC,KAAK,YAAY,eAEjB,MAAMC,GAAgB,IAAM,CACvB,QAAK,cAAc,eAAiB,KAAK,OAAQ,MAAO,GAC5D,MAAMC,EAAW,CAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAE1B,OAAI,KAAK,cAAc,2BAA2B5c,GAAyB,SAAS,GAC1E4c,EAAA,KAAK,KAAK,cAAe,GAE/B,KAAK,cAAc,2BAA2B5c,GAAyB,eAAe,GAChF4c,EAAA,KAAK,KAAK,YAAa,GAE1BA,CAAA,KAGJ,KAAK,eAAe,aAAa,SAAW,GAClCD,EAAA,KAAK,KAAK,cAAe,GAGnC,IACG,cAAQ,IAAIA,CAAY,QACtBt8B,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,mCAAmC,EACzD,KAAK,QAAQ,SAAS,qCAAqC,EAAI,KAEhE,MACD,CAgCA,GA9BAw8B,GAAM,SAAY,CACb,IACC,IACH,KAAK,iBAAiB,OACf,CAAC,CACT,MAAM,KAAK,WACP,OAAO,QACV,OAAO,OAAO,YACb,KAAK,UAAU,CAAE,QAAS,WAAY,QAAS,KAAK,UAAU,WAAY,EAC1E,WAGMx8B,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,mCAAmC,EACzD,KAAK,QAAQ,SAAS,qCAAqC,EAAI,IAEjE,CACA,KAAK,YAAY,cAEjB,WAAW,IAAM,CACX,KAAK,WAAW,4BACrB,KAAK,sBAAsB,KAAK,eAAe,oBAAuB,CAAe,IACnF,CAAC,EACJ,EAGI,KAAK,cAAc,IAAI,gBAAgB,EAAE,MAAOlL,GAAM,EAAE,IAG5DkE,EAAA,KAAK,cAAL,YAAAA,EAAkB,0BAA2B,MAC7C,KAAK,cAAc,6BACnB,KAAK,aACLyjC,GAAc,KAAK,WAAW,GAAKC,GAClC,CACD,MAAMC,EAAqB,MAAM,KAAK,QAAQ,wBAAwB,EAChEC,GACLD,GAAA,YAAAA,EAAoB,yBAA0B,EAAIE,GAAkC,IAEjFF,GAAA,MAAAA,EAAoB,QAASA,GAAA,MAAAA,EAAoB,cACpD,WAAW,SAAY,CACtB,KAAK,UAAU,CACd,KAAM,OACN,MAAOA,EAAmB,MAC1B,QAASA,EAAmB,YAC5B,SAAU,EACV,YAAa,YACb,aAAc,GACd,QAAS,IAAM,CACT,gBAAW,MAAM,gCAAiC,CACtD,QAASA,EAAmB,sBAC5B,MAAOA,EAAmB,MAC1B,YAAaA,EAAmB,YAChC,EACI,aAAQ,UAAUG,EAAgC,CACxD,EACA,GACCF,CAAa,CAElB,CAEsBG,GAAA,GAAG,OAAQ,KAAK,mBAAmB,EAEzD,KAAK,qBAAqB,CACzB,IAAK,iBACL,OAAQ,CAAC,CAAE,KAAAjrC,KAA6B,CAClC,wBAAmBA,EAAM,EAAI,CACnC,EACA,EAED,KAAK,qBAAqB,CACzB,IAAK,2BACL,OAAQ,KAAK,yBACb,EAED,KAAK,sBAAsB,EACtB,iBAAY,OAAS,KAAK,MAChC,EACA,WAAY,CACU,KAAK,QAAQ,oBAE5B,wBAAmBuqC,GAA0B,0BAA0B,EAE7E,KAAK,QAAQ,mBAAqB,GAClC,KAAK,iBAAiB,EACb,0BAAiB,UAAW,KAAK,OAAO,EACxC,0BAAiB,QAAS,KAAK,KAAK,EACtC,wBAAiB,UAAW,KAAK,qBAAqB,EACtD,wBAAiB,WAAY,KAAK,UAAU,EAElCp8B,GAAA,GAAG,cAAe,KAAK,WAAW,EAClCA,GAAA,GAAG,qBAAsB,KAAK,yBAAyB,EACvDA,GAAA,GAAG,oBAAqB,KAAK,wBAAwB,EACrDA,GAAA,GAAG,WAAY,KAAK,UAAU,EACpC+8B,GAAA,GAAG,WAAY,KAAK,UAAU,EAC9BA,GAAA,GAAG,gBAAiB,KAAK,eAAe,EACxCA,GAAA,GAAG,mBAAoB,KAAK,kBAAkB,EAC9CA,GAAA,GAAG,sBAAuB,KAAK,qBAAqB,EACpDA,GAAA,GAAG,yBAA0B,KAAK,wBAAwB,EAC1DA,GAAA,GAAG,mBAAoB,KAAK,kBAAkB,EAC9CA,GAAA,GAAG,mBAAoB,KAAK,oBAAoB,EAEvC1pB,GAAA,GAAG,WAAY,KAAK,qBAAqB,EACzCA,GAAA,GAAG,aAAc,KAAK,wBAAwB,EACjDrT,GAAA,GAAG,eAAgB,KAAK,2BAA2B,EAE/D,iBAAY,OAAS,KAAK,MAChC,EACA,aAAc,CACb,KAAK,mBAAmB,EACf,6BAAoB,UAAW,KAAK,OAAO,EAC3C,6BAAoB,QAAS,KAAK,KAAK,EACzC,2BAAoB,UAAW,KAAK,qBAAqB,EACzD,2BAAoB,eAAgB,KAAK,cAAc,EACvD,2BAAoB,WAAY,KAAK,UAAU,EAErCA,GAAA,IAAI,cAAe,KAAK,WAAW,EACnCA,GAAA,IAAI,qBAAsB,KAAK,yBAAyB,EACxDA,GAAA,IAAI,oBAAqB,KAAK,wBAAwB,EACtDA,GAAA,IAAI,WAAY,KAAK,UAAU,EACrC+8B,GAAA,IAAI,WAAY,KAAK,UAAU,EAC/BA,GAAA,IAAI,gBAAiB,KAAK,eAAe,EACzCA,GAAA,IAAI,mBAAoB,KAAK,kBAAkB,EAC/CA,GAAA,IAAI,sBAAuB,KAAK,qBAAqB,EACrDA,GAAA,IAAI,yBAA0B,KAAK,wBAAwB,EAC3DA,GAAA,IAAI,mBAAoB,KAAK,kBAAkB,EAC/CA,GAAA,IAAI,mBAAoB,KAAK,oBAAoB,EAExC1pB,GAAA,IAAI,WAAY,KAAK,qBAAqB,EAC1CA,GAAA,IAAI,aAAc,KAAK,wBAAwB,EAClDrT,GAAA,IAAI,eAAgB,KAAK,2BAA2B,CACtE,EACA,aAAc,CACR,KAAK,QACT,KAAK,UAAU,cAEhB,KAAK,mBAAmB,YACzB,EACA,eAAgB,CAGN,6BAAoB,UAAW,KAAK,OAAO,EAC3C,6BAAoB,QAAS,KAAK,KAAK,EAChD,KAAK,uBAAuB,iBAAiB,EAC7C,KAAK,uBAAuB,gBAAgB,EAC5C,KAAK,uBAAuB,0BAA0B,EAEjD,KAAK,QACT,KAAK,UAAU,iBAEhB,KAAK,mBAAmB,YAExB,KAAK,eAAe,EACpB,KAAK,SAAS,SACd,KAAK,SAAS,UACd,KAAK,QAAQ,aAAe,GAC5B,KAAK,eAAe,oBACb,2BAAoB,UAAW,KAAK,qBAAqB,EAC/CA,GAAA,IAAI,cAAe,KAAK,WAAW,EACnCA,GAAA,IAAI,qBAAsB,KAAK,yBAAyB,EACxDA,GAAA,IAAI,oBAAqB,KAAK,wBAAwB,EAClE,oBAAe,cAAck6B,EAA6B,EACzC4C,GAAA,IAAI,OAAQ,KAAK,mBAAmB,CAC3D,EACA,QAAS,CACR,MAAM,yBAAyB,CAC9B,eAAAE,EACA,KAAAnrC,EACA,YAAAorC,CAAA,EAKE,CACI,MAAAp+B,EAAWhN,GAAQ,KAAK,SAAS,eACjCqL,EAAW2B,EAAW,KAAK,eAAe,cAAcA,CAAQ,EAAI,KAE1E,KAAK,SAAS,eAAiB,KACzB,WAAK,WAAWhN,CAAI,EAE1B,WAAW,IAAM,CACZorC,EACH,KAAK,oBAAoB,CACxB,iBAAkB,GAClB,gBAAiBA,CAAA,CACjB,EACSD,GAAkB9/B,GAC5B,KAAK,wBAAwB,CAC5B,MAAO,EACP,aAAc,GAAGA,EAAS,EAAE,SAAS8/B,CAAc,IACnD,YAAaZ,GAA0B,qBACvC,WAAYY,EACZ,SAAU9/B,EAAS,GACnB,CACF,CACA,CACF,EACA,kBAA4B,OACvB,MAAAnE,EAAA,KAAK,uBAAL,MAAAA,EAA2B,SAG3B,YAAK,iBAAmB,KAAK,aAC3B,0BAAuB,KAAK,YAAY,CAC5C,MAAO,KAAK,QAAQ,SACnB,KAAK,YACF,2BAA2B,KAAK,gBAAkB,aAAe,WAAW,SAC5E,uCACJ,EACA,QAAS,KAAK,QAAQ,SACrB,KAAK,YACF,2BACA,KAAK,gBAAkB,aAAe,WACvC,WACC,yCACJ,EACA,KAAM,OACN,yBAA0B,GAC1B,EAEM,IAED,EACR,EACA,yBAAyBi3B,EAAoB,CAC5C,KAAK,0BAA4BA,CAClC,EACA,UAAUnxB,EAAkB8U,EAAgB,CAC3C,MAAM9hB,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACjDsB,EAAmB,CACxB,UAAWtO,EAAOA,EAAK,KAAO,KAC9B,YAAa,KAAK,eAAe,WACjC,OAAQ,SACR,SAAU,KAAK,SAAS,SAEpB,gBAAW,MAAM,mCAAoCsO,CAAgB,EACrE,KAAK,cAAc,IAAI,qBAAsBA,CAAgB,EAC7D,KAAK,YAAY,CAAE,gBAAiBtB,EAAU,OAAA8U,EAAQ,CAC5D,EACA,MAAM,YAAa,CAClB,MAAMxT,EAAmB,CACxB,YAAa,KAAK,eAAe,YAE7B,gBAAW,MAAM,gCAAiCA,CAAgB,EAClE,KAAK,cAAc,IAAI,sBAAuBA,CAAgB,EAC9D,aAAQ,UAAU+8B,EAA0B,CAClD,EACA,MAAM,eAAgB,CAChB,KAAK,gBAAgB,sBAAwB,OAAMC,GAAiB,CACxE,MAAMh9B,EAAmB,CACxB,YAAa,KAAK,eAAe,WACjC,kBAAmB,KAAK,UACvBi9B,GACCD,EACA,KAAK,gBAAgB,aAAa,EAClC,CAAE,kBAAmB,KAAK,cAAc,iBAAkB,GACzD,SACH,GAEI,gBAAW,MAAM,uCAAwCh9B,CAAgB,EACzE,KAAK,cAAc,IAAI,yBAA0BA,CAAgB,EACtE,EAEK,WAAK,YAAY,EAAE,EACzB,KAAK,4BAA4B,CAClC,EACA,sBAAuB,CACD,OAAO,OAAO,KAAK,SAAS,mBAAoB,GAAE,QACrE40B,GAAOA,EAAG,WAIV,OAAQrS,IAAaA,GAAA,YAAAA,EAAU,SAAS,QAAS2a,EAAuB,EACxE,QAAS3a,GAAa,CACtB,MAAM4a,EAAsB5a,GAAA,YAAAA,EAAU,SAClC4a,KAAwB5a,GAAA,YAAAA,EAAU,cAAe,CAAC,GAAG,OAAS,GACjE4a,EAAoB,WAAW,CAChC,CACA,CACH,EACA,6BAA8B,CACvB,MAAAtV,EAAa,KAAK,eAAe,SAAS,OAAQ91B,GAAMA,EAAE,MAAM,EAEtE,KAAK,qBAAqB,EACf81B,EAAA,QAASn2B,GAAS,OAC5B,MAAM0rC,EAAc,KAAK,SAAS,kBAAkB1rC,EAAK,EAAE,EACrD2rC,EAAY,KAAK,SAAS,aAAaD,CAAW,EAEjD,cAAKxkC,EAAAlH,GAAA,YAAAA,EAAM,SAAN,YAAAkH,EAAc,QAAS,EAAE,EAAE,QAAS2E,GAAmB,CACjC8/B,EAAU,OACzC3oC,GAAMA,EAAE,aAAa,QAAU6I,CAAA,EAER,QAASglB,GAAa,CAC9C,MAAM4a,EAAsB5a,GAAA,YAAAA,EAAU,SAClC4a,GACHA,EAAoB,SAAS,CAC9B,CACA,EACD,EACD,CACF,EACA,qBAAsB,CACjB,QAAK,iBAAmB,CAAC,KAAK,oBAAqB,OAEvD,MAAM1uB,EACL,KAAK,iBAAmB,KAAK,oBAC1B,KAAK,QAAQ,SAAS,iCAAiC,EACvD,KAAK,QAAQ,SAAS,+BAA+B,EAEzD,KAAK,qBAAqB,CACzB,IAAK,kBACL,OAAQ,IACP,KAAK,mBAAmBwtB,GAA0B,4BAA4B,EAC/E,EAEK,MAAAqB,EAAS,KAAK,YAAY,CAC/B,KAAM,OACN,MAAO,KAAK,QAAQ,SAAS,+BAA+B,EAC5D,QAAA7uB,EACA,SAAU,IACV,QAAS,IACR,WAAW,IAAM,CAEZ,KAAK,kBAAkB6uB,EAAO,MAAM,GACtC,CAAC,EACL,yBAA0B,GAC1B,CACF,EACA,oBAAqB,CACpB,KAAK,eAAe,sBAAwB,KAC5C,KAAK,YAAY,4BAClB,EACA,MAAM,uBAAuB,EAAkB,CAC9C,IAAIC,EAAQ,MAAM,KAAK,gBAAgB,oBAAoB,EACvDA,IACG,WAAK,cAAc,mBAErB,KAAK,OAAO,OAASpgB,EAAM,iBACxB,WAAK,QAAQ,QAAQ,CAC1B,KAAMA,EAAM,SACZ,OAAQ,CAAE,KAAM,KAAK,eAAgB,EACrC,GAGC,KAAK,aAGJ,EAAE,kBAAkB,iBACvBogB,EAAQ,EAAE,OAAO,SAETA,EAAA,GAELA,GACH,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,uBAAuB,EACpD,KAAM,UACN,EAGJ,EACA,MAAM,uBAAuBlrC,EAAqB,CACjD,GAAIA,EAAO,CACV,GAAI,KAAK,yBAA0B,CAClC,MAAMmrC,EAAiBnrC,EAAM,OAAuB,QAAQ,QAAQ,EAChEmrC,IACH,KAAK,QAAQ,qBAAuB,KACpC,KAAK,QAAQ,kBACZ,KAAK,QAAQ,SAAS,+BAA+B,EACrDA,CAAA,GAGF,MACD,CACK,wBAAmBvB,GAA0B,0BAA0B,EAC5E,MACD,CACD,EACA,mBAAmBhpC,EAAgB,CAClC,GAAIA,IAAW,SAAU,CAClB,MAAAwqC,EAAqB,KAAK,QAAQ,qBACpCA,IAAuB,KACrB,wBAAmBxB,GAA0B,0BAA0B,EAE5E,KAAK,wBAAwBwB,CAAkB,CAEjD,CACD,EACA,mBAAmBjqB,EAA+B,CAC7C,KAAK,mBACJ,sBAAiB,gBAAgB6b,EAAyB,EAC1D,sBAAiB,aAAa,EAAI,EACvC,KAAK,oBAAoB,CAAE,OAAA7b,EAAQ,iBAAkB,EAAM,GAC5D,EACA,MAAM,cAAckqB,EAAqB,SACxC,KAAK,YAAY,eACjB,KAAK,eAAe,EAChB,IAAA55B,EACA,IACHA,EAAO,MAAM,KAAK,eAAe,aAAa45B,CAAW,QACjD99B,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,wCAAwC,CAAC,EACrF,MACD,CACA,GAAIkE,IAAS,OACZ,MAAM,IAAI,MAAM,sBAAsB45B,CAAW,uBAAuB,EAgDzE,GA9CA,KAAK,eAAe,gBAAgB,CACnC,QAAS55B,EAAK,aAAa,KAC3B,cAAe,GACf,EACI,oBAAe,cAAci2B,EAA6B,EAC1D,oBAAe,yBAAyBj2B,CAAI,EAC7CA,EAAK,aAAa,SACrB,KAAK,eAAe,mBAAmBA,EAAK,aAAa,OAAO,EAG7DA,EAAK,aAAa,SACrB,KAAK,iBAAiB,mBAAmB,CACxC,WAAYA,EAAK,aAAa,GAC9B,QAASA,EAAK,aAAa,QAC3B,EAGEA,EAAK,aAAa,YACrB,KAAK,iBAAiB,sBAAsB,CAC3C,WAAYA,EAAK,aAAa,GAC9B,WAAYA,EAAK,aAAa,WAC9B,EAGEA,EAAK,aAAa,iBACrB,KAAK,eAAe,mBAAmBA,EAAK,aAAa,eAAe,EAGzE,MAAM,KAAK,SACVb,GAASa,EAAK,aAAa,KAAK,EAChCb,GAASa,EAAK,aAAa,WAAW,GAEvC,MAAM,KAAK,YACX,KAAK,YAAY,YACjB,KAAK,QAAQ,aAAe,GACvB,KAAK,cAAc,IAAI,iBAAkB,CAC7C,WAAYA,EAAK,aAAa,GAC9B,aAAcA,EAAK,aAAa,KAChC,YAAA45B,CAAA,CACA,EACI,gBAAW,MAAM,kCAAmC,CACxD,YAAa55B,EAAK,aAAa,GAC/B,eAAgBA,EAAK,KACrB,mBAAoBA,EAAK,SACzB,EAEG,CAACA,EAAK,YAAYzN,GAAAuC,EAAAkL,EAAK,OAAL,YAAAlL,EAAW,aAAX,MAAAvC,EAAuB,OAAO,CAEnD,IAAIsnC,EAAiB,GACjB,GAAA75B,EAAK,KAAK,WAAW,QAAS,CAC3B,MAAA4N,EAAU5N,EAAK,KAAK,WAAW,QACrC85B,EAAY,UAAWl/B,KAAY,OAAO,KAAKgT,CAAO,EAC1C,UAAAC,KAAYD,EAAQhT,CAAQ,EACtC,GAAIiT,EAAS,MAAO,CACFgsB,EAAA,GACX,MAAAC,CACP,CAGH,CAEI,CAACD,GAAkB75B,EAAK,KAAK,WAAW,MAAM,QAEzC,cAAM,aAAa45B,CAAW,SAAS,EAC/C,QAAQ,MAAM55B,EAAK,KAAK,WAAW,MAAM,KAAK,EAC9C,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,kCAAkC,EAC/D,QAASA,EAAK,KAAK,WAAW,MAAM,QACpC,KAAM,QACN,SAAU,EACV,EAEH,CACKA,EAA0B,UAC9B,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,wCAAwC,EACrE,QAAS,2BAA2B,KAAK,QAAQ,SAChD,mBACA,QAAQ,KAAK,QAAQ,SACrB,gCACA,6GAA6G,KAAK,QAAQ,SAC1H,mBACA,QACD,KAAM,UACN,SAAU,EACV,EAEF,KAAK,YAAY,aAClB,EACA,MAAM,oBAAoBA,EAAyC,CAClE,GAAI,CAACA,EAAK,SAAS,OAAS,CAACA,EAAK,SAAS,YACpC,UAAI,MAAM,yBAAyB,EAE1C,KAAK,eAAe,EACpBA,EAAK,SAAS,MAAQ+5B,GAAgC/5B,EAAK,SAAS,KAAK,EAEzE,MAAM,KAAK,SAASA,EAAK,SAAS,MAAoBA,EAAK,SAAS,WAAW,EAE3EA,EAAK,SAAS,SACjB,KAAK,eAAe,mBAAmBA,EAAK,SAAS,OAAO,EAE7D,MAAM,KAAK,YACX,KAAK,YAAY,WAClB,EACA,MAAM,qBAAqBg6B,EAAoB,CAC9C,KAAK,YAAY,eACjB,KAAK,YAAY,eAAe,KAAK,QAAQ,SAAS,0BAA0B,CAAC,EACjF,KAAK,eAAe,EAEf,oBAAe,0BAA4B,GAChD,KAAK,gBAAgB,gBAAkB,KAEnC,IAAAh6B,EACA,IAIH,GAHK,KAAK,cAAc,IAAI,qBAAsB,CAAE,WAAAg6B,EAAY,EAChEh6B,EAAO,MAAM,KAAK,eAAe,yBAAyBg6B,CAAU,EAEhE,CAACh6B,EACJ,MAAM,IAAI,MACT,KAAK,QAAQ,SAAS,iDAAkD,CACvE,YAAa,CAAE,WAAAg6B,CAAW,EAC1B,SAGKl+B,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,gCAAgC,CAAC,EAC7E,MAAM,KAAK,QAAQ,QAAQ,CAAE,KAAMud,EAAM,aAAc,EACvD,MACD,CAEA,KAAK,WAAW,MACf,kCACA,CACC,OAAQ,WACR,YAAa4gB,GAAiBD,CAAU,EACxC,4BAA6B,KAAK,eAAe,iBAClD,EACA,CACC,YAAa,EACd,GAGD,KAAK,cAAgB,GACf,WAAK,QAAQ,QAAQ,CAAE,KAAM3gB,EAAM,aAAc,MAAO,CAAE,WAAA2gB,CAAW,CAAG,GAE9E,MAAM,KAAK,SAASh6B,EAAK,SAAS,MAAOA,EAAK,SAAS,WAAW,EAC7D,kBAAgB,MAAM,KAAK,eAAe,mBAAmBA,EAAK,IAAI,GAAM,GACjF,KAAK,eAAe,sBAAsB,CAAE,WAAAg6B,CAAY,GACxD,MAAM,KAAK,YACX,KAAK,YAAY,YACjB,KAAK,QAAQ,aAAe,GAEvB,KAAK,cAAc,IAAI,gBAAiB,CAC5C,WAAAA,EACA,aAAch6B,EAAK,KACnB,SAAUA,EAAK,SACf,EACD,KAAK,YAAY,aAClB,EACA,MAAM,aAAa9G,EAAuB,CACzC,KAAK,YAAY,eAEX,MAAAghC,EAAoB,KAAK,gBAAgB,gBAE/C,KAAK,eAAe,EAEf,oBAAe,YAAYhhC,CAAQ,EACxC,KAAK,eAAe,UAAUA,EAAS,QAAU,EAAK,EACjD,oBAAe,cAAcA,EAAS,EAAE,EACxC,oBAAe,gBAAgB,CAAE,QAASA,EAAS,KAAM,cAAe,GAAO,EACpF,KAAK,eAAe,oBAAoBA,EAAS,UAAY,CAAE,GAC/D,KAAK,eAAe,mBAAmBA,EAAS,SAAW,CAAE,GACxD,oBAAe,qBAAqBA,EAAS,SAAS,EACtD,oBAAe,oBAAoBA,EAAS,IAAI,EAEjDA,EAAS,SACZ,KAAK,iBAAiB,mBAAmB,CACxC,WAAYA,EAAS,GACrB,QAASA,EAAS,QAClB,EAGEA,EAAS,YACZ,KAAK,iBAAiB,sBAAsB,CAC3C,WAAYA,EAAS,GACrB,WAAYA,EAAS,WACrB,EAGEA,EAAS,iBACP,oBAAe,mBAAmBA,EAAS,eAAe,EAG1D,MAAAihC,EAAQjhC,EAAS,MAAQ,GACzBkhC,EAASD,EAAK,IAAKE,GAAQA,EAAI,EAAE,EACvC,KAAK,eAAe,kBAAkBD,GAAU,CAAE,GAC7C,eAAU,WAAWD,CAAI,EAE9B,MAAM,KAAK,SAASjhC,EAAS,MAAOA,EAAS,WAAW,EAEnD,KAAK,qBACT,KAAK,QAAQ,aAAe,IAE7B,KAAK,YAAY,YACZ,KAAK,cAAc,IAAI,gBAAiB,CAC5C,WAAYA,EAAS,GACrB,aAAcA,EAAS,KACvB,GACGghC,GAAA,YAAAA,EAAmB,cAAehhC,EAAS,IAC9C,KAAK,gBAAgB,gBAAkB,KAClC,oBAAe,0BAA4B,IAEhD,KAAK,gBAAgB,gBAAkBghC,EAExC,KAAK,YAAY,cACZ,wBAAmB,qBAAqBhhC,EAAS,EAAE,CACzD,EACA,SAAS,EAA4B,CAChC,KAAK,cAAc,eACtB,KAAK,UAAU,CAAC,CAElB,EACA,UAAU,EAA4B,CAEhC,uBAAoB,KAAK,+BAA+B,CAAC,EAC1D,aAAa,YAAc,EAAE,SAAW,IAC3C,KAAK,QAAQ,qBACb,KAAK,qBAAuB,IAGxB,0BAAqB,EAAiB,KAAK,oBAAoB,EACpE,KAAK,cAAc,YAAY,EAAiB,KAAK,oBAAoB,EAGzE,KAAK,iBAAmB,EACzB,EACA,QAAQ,EAAe,CAClB,EAAE,SAAW,IAChB,KAAK,qBAAuB,IAE7B,KAAK,mBAAmB,CAAC,EACpB,mBAAc,UAAU,CAAC,CAC/B,EACA,MAAM,EAAkB,CACnB,EAAE,MAAQ,KAAK,cAAc,iBAChC,KAAK,eAAiB,IAEnB,EAAE,MAAQ,MACb,KAAK,qBAAuB,GAE9B,EACA,MAAM,QAAQ,EAAkB,CAC/B,KAAK,YAAY,QACjB,KAAK,QAAQ,qBAEP,MAAAohC,EAAe,KAAK,cAAc,iBAAiB,CAAC,GAAK,CAAC,EAAE,UAAY,CAAC,EAAE,OAC3EC,EAAgB,EAAE,UAAY,CAAC,EAAE,QAAU,CAAC,KAAK,cAAc,iBAAiB,CAAC,EACjFC,EAAkB,KAAK,cAAc,iBAAiB,CAAC,GAAK,EAAE,QAAU,CAAC,EAAE,SAC3EC,EAAiB,CAAC,KAAK,cAAc,iBAAiB,CAAC,GAAK,CAAC,EAAE,UAAY,CAAC,EAAE,OAC9EliB,EAAW,KAAK,iBAAmB,KAAK,YAE9C,GAAI,EAAE,MAAQ,KAAO+hB,GAAgB,CAAC/hB,EAAU,CAI3C,GAHJ,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEb,KAAK,iBAAmB,KAAK,YAChC,OAGI,KAAK,cAAc,KAAK,uBAAwB,CAAE,aAAc,KAAQ,CAAC,EAE9E,MACD,CAGA,MAAMxY,EAAO,EAAE,MAAS,EAAE,cAAgB,EAAE,eAI5C,UAAW0wB,KAAW1wB,EAEpB,GAAA0wB,EAAQ,WACR,OAAOA,EAAQ,WAAc,UAC7BA,EAAQ,UAAU,SAAS,kBAAkB,EAE7C,OAKF,GAAI,OAAO,SAAS,KAAK,UAAU,SAAS,yBAAyB,EACpE,OAGG,KAAE,MAAQ,UAAYgK,EAAgB,CACzC,KAAK,iBAAmB,GACpB,KAAK,aACH,KAAK,cAAc,IAAI,iCAAiC,EAC7D,KAAK,SAAS,eAAiB,MAGhC,MACD,CAGA,GAAI,KAAK,WACR,OAGK,MAAA9sC,EAAgB,KAAK,QAAQ,iBACjC,IAAKC,GAASA,GAAQ,KAAK,eAAe,cAAcA,EAAK,IAAI,CAAC,EAClE,OAAQA,GAAS,CAAC,CAACA,CAAI,EAEzB,GAAI,EAAE,MAAQ,KAAO6sC,GAAkB,CAACliB,EAClC,KAAK,cAAc,KAAK,sBAAuB,CAAE,aAAc,KAAO5qB,CAAa,UAC9E,EAAE,MAAQ,KAAO2sC,GAAgB,CAAC/hB,EACxC5qB,EAAc,OAAS,IAC1B,EAAE,eAAe,EACZ,KAAK,eAAeA,CAAa,WAE7B,EAAE,MAAQ,KAAO8sC,GAAkB,CAACliB,EAC1C5qB,EAAc,OAAS,IAC1B,EAAE,eAAe,EACZ,oBAAeA,EAAe,mBAAmB,YAE5C,EAAE,MAAQ,UAAY,EAAE,MAAQ,cAAgB8sC,GAAkB,CAACliB,EAC9E,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,KAAK,YAAa,CAAE,aAAc,KAAO5qB,CAAa,UACpE,EAAE,MAAQ,OAAS8sC,GAAkB,CAACliB,EAChD,KAAK,oBAAoB,CACxB,OAAQ4f,GAA0B,IAClC,iBAAkB,CAAC,KAAK,kBAAoB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YAC3E,UACS,EAAE,MAAQ,SAAWmC,GAAgB,CAAC/hB,EAC3C,KAAK,wBACA,EAAE,MAAQ,KAAOgiB,GAAiB,CAAChiB,EACxC,KAAK,WAAW,CAAE,MAAO,CAAC,CAAE,KAAM3pB,GAAkB,EAAG,YAAa,EAAI,WACnE,EAAE,MAAQ,KAAK,cAAc,eACvC,KAAK,eAAiB,WACZ,EAAE,MAAQ,IACpB,KAAK,qBAAuB,WAClB,EAAE,MAAQ,MAAQ6rC,GAAkB,CAACliB,EAAU,CACzD,MAAMmiB,EAAmB,KAAK,iBAC1BA,IAAqB,MAAQA,EAAiB,OAAS9rC,IACrD,KAAK,cACT,KAAK,iBACL,CAAE,aAAc,IAAK,EACrB8rC,EAAiB,KAGT,WAAE,MAAQ,KAAOJ,EAE3B,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,KAAK,eAAgB,CAAE,aAAc,IAAM,UACzD,EAAE,MAAQ,KAAOA,EACtB,KAAK,cAAc,KAAK,UAAW,CAAE,aAAc,KAAQ3sC,CAAa,UACnE,EAAE,MAAQ,KAAO2sC,GAAgB,CAAC/hB,EAE5C,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,KAAK,SAAU,CAAE,aAAc,KAAQ5qB,CAAa,UAClE,EAAE,MAAQ,KAAO6sC,EAAiB,CAI5C,GAFA,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACb,KAAK,OACR,OAGG,KAAK,QAAQ,aAAa,OAASnhB,EAAM,aAC5Ctd,GAAiB,KAAK,aAAa,EAE9B,KAAK,QAAQ,KAAK,CAAE,KAAMsd,EAAM,aAAc,EAGpD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,oCAAoC,EACjE,KAAM,UACN,CACS,WAAE,MAAQ,SAAWohB,EAAgB,CAE/C,MAAMC,EAAmB,KAAK,iBAE9B,GAAIA,IAAqB,KAAM,CAC9B,GACCA,EAAiB,OAAS9rC,KACzB,KAAK,iBAAmB,KAAK,aAE9B,OAEI,cAAS,eAAiB8rC,EAAiB,IACjD,CACU,WAAE,MAAQ,cAAgBH,EAEpC,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,KAAK,sBAAuB,CACnD,aAAc,IACd,UACS,EAAE,MAAQ,cAAgBE,EAAgB,CAEpD,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAC,EAAc,KAAK,eAAe,8BACvCD,EAAiB,MAGlB,GAAIC,EAAY,OAAS,QAAaA,EAAY,KAAK,SAAW,EACjE,OAGI,KAAK,cACT,KAAK,mBACL,CAAE,aAAc,GAAI,EACpBA,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACvB,GACA,GAES,WAAE,MAAQ,aAAeJ,EAEnC,EAAE,gBAAgB,EAClB,EAAE,eAAe,EAEZ,KAAK,cAAc,KAAK,oBAAqB,CACjD,aAAc,IACd,UACS,EAAE,MAAQ,aAAeE,EAAgB,CAEnD,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAxhC,EAAW,KAAK,gBAAgB,mBAAmB,EAEzD,GAAI,CAACA,EAAS,6BAA6B,eAAewhC,EAAiB,IAAI,EAC9E,OAGD,MAAMC,EAAczhC,EAAS,6BAA6BwhC,EAAiB,IAAI,EAE/E,GAAIC,EAAY,OAAS,QAAaA,EAAY,KAAK,SAAW,EACjE,OAGI,KAAK,cACT,KAAK,mBACL,CAAE,aAAc,GAAI,EACpBA,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACvB,GACA,GACD,SACU,CAAC,UAAW,WAAW,EAAE,SAAS,EAAE,GAAG,GAAKF,EAAgB,CAItE,MAAMC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGK,MAAAxhC,EAAW,KAAK,gBAAgB,mBAAmB,EAEzD,GAAI,CAACA,EAAS,6BAA6B,eAAewhC,EAAiB,IAAI,EAC9E,OAGD,MAAMC,EAAczhC,EAAS,6BAA6BwhC,EAAiB,IAAI,EAE3E,IAAC,MAAM,QAAQC,EAAY,IAAI,GAAK,CAACA,EAAY,KAAK,OACzD,OAGD,MAAMC,EAAaD,EAAY,KAAK,CAAC,EAAE,CAAC,EAAE,KACpCE,EAAoB,KAAK,eAAe,8BAA8BD,CAAU,EAElF,IAAC,MAAM,QAAQC,EAAkB,IAAI,GAAK,CAACA,EAAkB,KAAK,OACrE,OAIG,IAAAC,EACAC,EAA0B,EAAE,MAAQ,UAAY,UAAY,SAC5DC,EAAgC,KACzB,UAAAC,KAAoBJ,EAAkB,KAChD,UAAWK,KAAmBD,EACzBC,EAAgB,OAASR,EAAiB,OAI9CI,EAAc,KAAK,eAAe,cAAcI,EAAgB,IAAI,EAEhEJ,IACC,EAAE,MAAQ,UAGZA,EAAY,SAAS,CAAC,GAAKJ,EAAiB,SAAS,CAAC,GACtDI,EAAY,SAAS,CAAC,EAAIC,IAE1BC,EAAiBF,EAAY,KACHC,EAAAD,EAAY,SAAS,CAAC,GAKhDA,EAAY,SAAS,CAAC,GAAKJ,EAAiB,SAAS,CAAC,GACtDI,EAAY,SAAS,CAAC,EAAIC,IAE1BC,EAAiBF,EAAY,KACHC,EAAAD,EAAY,SAAS,CAAC,KAOjDE,IAAmB,MACjB,KAAK,cACT,KAAK,mBACL,CAAE,aAAc,GAAI,EACpBA,EACA,GACA,GAGH,CACD,EAEA,sBAAsBtsC,EAAgB,CAChC,KAAK,oBAIL,iBAAY,aAAaA,EAAO,EAAI,CAC1C,EAEA,eAAeA,EAAgBghB,EAA8C,CACxE,IAAC,KAAK,mBACT,OAGD,KAAK,aAAa,qBAElB,MAAMyrB,EAAkBzsC,EAAM,KAC5Bd,GAAS,CAAC,KAAK,eAAe,kBAAkBA,EAAK,IAAI,GAG3D,UAAWA,KAAQc,EAAO,CACnB,MAAA0sC,EAAoBpsC,GAAcpB,CAAI,EAC5C,GAAIutC,EAAiB,CACpB,MAAME,EAAY,KAAK,WAAW,uBAAuBztC,CAAI,EACzDytC,EAAU,SAAW,GACND,EAAA,QAAQC,EAAW3rB,CAAM,CAC5C,MAEA0rB,EAAkB,UAAU1rB,CAAM,CAEpC,CAEA,KAAK,aAAa,mBACnB,EAEA,YAAYhhB,EAAgB,CAI3B,KAAK,aAAa,qBACZA,EAAA,QAASd,GAAS,CACvB,KAAK,WAAWA,EAAK,KAAM,GAAM,EAAK,EACtC,EACD,WAAW,IAAM,CAChB,KAAK,aAAa,qBAChB,GAAG,CACP,EAEA,gBAAiB,CACX,WAAM,QAASA,GAAS,CACvB,wBAAmBA,EAAK,IAAI,EACjC,CACF,EAEA,qBAAsB,CACrB,MAAM8sC,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGD,KAAK,iBAAiB,EAGhB,MAAAxhC,EAAW,KAAK,gBAAgB,mBAAmB,EAEnDoiC,EAAa,KAAK,gBAAgB,kBACvC,WACApiC,EACAwhC,EAAiB,MAElB,UAAW9/B,KAAY0gC,EACtB,KAAK,mBAAmB1gC,CAAQ,EAI5B,wBAAmB8/B,EAAiB,IAAI,CAC9C,EACA,uBAAwB,CACvB,MAAMA,EAAmB,KAAK,iBAC9B,GAAIA,IAAqB,KACxB,OAGD,KAAK,iBAAiB,EAGhB,MAAAxhC,EAAW,KAAK,gBAAgB,mBAAmB,EAEnDoiC,EAAa,KAAK,gBAAgB,kBACvC,aACApiC,EACAwhC,EAAiB,MAElB,UAAW9/B,KAAY0gC,EACtB,KAAK,mBAAmB1gC,CAAQ,EAI5B,wBAAmB8/B,EAAiB,IAAI,CAC9C,EAEA,oBAAoBa,EAAwBC,EAAgBC,EAAgB,GAAO,CAClF,MAAMC,EAAa,KAAK,eAAe,YAAYH,CAAc,EAE3DriC,EAAW,KAAK,gBAAgB,mBAAmB,EAEnDoiC,EAAa,KAAK,gBAAgB,kBACvC,aACApiC,EACAqiC,CAAA,EAED,UAAW3gC,KAAY0gC,EAAY,CAClC,MAAM1tC,EAAO,KAAK,eAAe,YAAYgN,CAAQ,EAC/C+gC,EAAc/tC,EAAK,SAEzB,GAAIA,EAAK,SAAS,CAAC,EAAI8tC,EAAW,SAAS,CAAC,EAC3C,SAGD,MAAMt8B,EAAsD,CAC3D,KAAMxE,EACN,WAAY,CACX,SAAU,CAAChN,EAAK,SAAS,CAAC,EAAI4tC,EAAQ5tC,EAAK,SAAS,CAAC,CAAC,CACvD,GAGI,oBAAe,qBAAqBwR,CAAiB,EAC1D,KAAK,YAAYxR,CAAI,GAGnB6tC,GAAiBE,EAAY,CAAC,IAAMv8B,EAAkB,WAAW,SAAS,CAAC,GAC5Eu8B,EAAY,CAAC,IAAMv8B,EAAkB,WAAW,SAAS,CAAC,IAE1D,KAAK,aAAa,kBACjB,IAAIw8B,GAAgBhhC,EAAU+gC,EAAav8B,EAAkB,WAAW,QAAQ,EAChFq8B,CAAA,CAGH,CACD,EAEA,SAAS/sC,EAAgB,CACxB,MAAMmtC,EAAoB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YACpD,eAAUntC,EAAOmtC,CAAiB,EACnCA,GACH,KAAK,YAAYntC,CAAK,CAExB,EAEA,UAAUA,EAAgBotC,EAAQ,GAAO,CACnC,KAAK,eAAeptC,CAAK,EAAE,KAAMsR,GAAS,CAC9C,MAAM+7B,EAAmC,CACxC,KAAM,CACL,GAAI,KAAK,eAAe,SAAS,MAAQ,CAAC,EAC1C,WAAY,KAAK,UAAU,UAC5B,EACA,GAAG/7B,CAAA,EAGJ,KAAK,gBAAgB,qCACpB+7B,EACA,KAAK,iBAAiB,gBAGvB,MAAM9iC,EAAW,KAAK,UAAU8iC,EAAgB,KAAM,CAAC,EAElD,KAAK,UAAU,KAAK9iC,CAAQ,EAC7B+G,EAAK,MAAM,OAAS,IAClB87B,GACJ,KAAK,YAAY,CAChB,MAAO,UACP,QAAS,GACT,KAAM,UACN,EAEG,gBAAW,MAAM,oBAAqB,CAC1C,WAAY97B,EAAK,MAAM,IAAKpS,GAASA,EAAK,IAAI,EAC9C,YAAa,KAAK,eAAe,WACjC,EACF,CACA,CACF,EACA,MAAM,eAAgB,CACf,MAAAgsC,EAAc,KAAK,eAAe,kBACxC,GAAIA,IAAgB,KAIhB,KACH,KAAK,wBAA0B,GACzB,WAAK,gBAAgB,qBAAqBA,CAAW,QACnD99B,EAAO,CAEf,MAAMkgC,EAAY,MAAM,KAAK,eAAe,aAAapC,CAAW,EAEpE,GAAIoC,IAAc,OAGjB,KAAK,eAAe,sBAAsB,CACzC,YAAApC,EACA,KAAM,CAAE,SAAU,GAAM,UAAW,IAAI,IAAO,EAC9C,EACI,oBAAe,cAAc,OAAS,EACtC,aAAQ,mBAAmB,iBAAiB,EAEjD,KAAK,SAAS,KAAK,eAAe,aAAc,MAAM,EACtD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,uDAAuD,EACpF,QAAS,KAAK,QAAQ,SACrB,yDACD,EACA,KAAM,UACN,UACSoC,GAAA,MAAAA,EAAW,SAAU,CAG/B,MAAMC,EAAe,CACpB,KAAMD,EAAU,KAChB,SAAUA,EAAU,SACpB,KAAMA,EAAU,KAChB,UAAWA,EAAU,UACrB,UAAWA,EAAU,WAEhBE,EAAW,CAChB,KAAMD,EACN,YAAArC,EACA,QAASoC,EAAU,SAEf,oBAAe,sBAAsBE,CAAQ,EAClD,KAAK,SAASF,EAAU,aAAa,KAAM,MAAM,EAC5C,oBAAe,cAAc,OAAS,EACtC,oBAAe,yBAAyBC,CAAkC,EAC1E,aAAQ,mBAAmB,iBAAiB,EACjD,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,+CAA+C,EAC5E,QAAS,KAAK,QAAQ,SAAS,iDAAiD,EAChF,KAAM,UACN,OAED,KAAK,UAAUngC,EAAO,KAAK,QAAQ,SAAS,wCAAwC,CAAC,CAEvF,CACA,KAAK,wBAA0B,GAC1B,KAAK,gBAAgB,sBAAwB,OAAMo9B,GAAiB,CACxE,MAAMiD,EAAa,CAClB,YAAa,KAAK,eAAe,WACjC,kBAAmB,KAAK,UACvBhD,GACCD,EACA,KAAK,gBAAgB,aAAa,EAClC,CAAE,kBAAmB,KAAK,cAAc,iBAAkB,GACzD,SACH,GAGI,gBAAW,MAAM,uCAAwCiD,CAAU,EACxE,EACF,EAEA,MAAM,uBAAwB,CACzB,IACH,MAAM,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,QAClErgC,EAAO,CACV,eACJA,EACA,KAAK,QAAQ,SAAS,gDAAgD,GAEvE,MACD,CACD,EAIA,MAAM,sBAAsBsgC,EAAsC,CACjE,GAAI,KAAK,YACR,OAIG,GADetG,GAAe,KAAK,MAAM,IAC1BC,GAAiB,SAAU,CACzC,IAAAmD,EACA,IAAC,KAAK,mBACT,OAGG,GAAAkD,EAAc,MAAM,0BAA0B,GA6BjD,GA1BI,CAAC,KAAK,oBAIY,MAAM,KAAK,QAChC,KAAK,QAAQ,SAAS,wDAAyD,CAC9E,YAAa,CAAE,cAAAA,CAAc,EAC7B,EACD,KAAK,QAAQ,SAAS,wDAAwD,EAC9E,CACC,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,iEACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,gEACD,EACA,yBAA0B,EAC3B,KAGqBngC,KAIPi9B,EAAA,MAAM,KAAK,uBAAuBkD,CAAa,EAC1DlD,IAAiB,QACpB,WAIG,KAIC,GAFWA,EAAA,KAAK,MAAMkD,CAAa,EAEnC,CAAC,KAAK,mBACT,YAEU,CAEX,MACD,CAGD,OAAO,MAAM,KAAK,mBAAmBlD,EAAe,QAAS,EAAK,CACnE,CACD,EAIA,MAAM,uBAAuBxoB,EAAuD,CAC/E,IAAAwoB,EAEJ,KAAK,YAAY,eACb,IACHA,EAAe,MAAM,KAAK,eAAe,mBAAmBxoB,CAAG,QACvD5U,EAAO,CACf,KAAK,YAAY,cACZ,eACJA,EACA,KAAK,QAAQ,SAAS,iDAAiD,GAExE,MACD,CACA,YAAK,YAAY,cAEVo9B,CACR,EAGA,MAAM,mBACLA,EACAxpB,EACA2sB,EAAa,GACG,CAEZ,MAACnD,EAAa,eAAe,OAAO,GAAK,CAACA,EAAa,eAAe,aAAa,GAInF,IACH,MAAMoD,EAAwC,GAC1CpD,EAAa,OACHA,EAAA,MAAM,QAAStrC,GAAgB,CAY3C,GAVIA,EAAK,WAAa2uC,GAA6B,SAAS3uC,EAAK,IAAI,GAChD,OAAO,OAC1B,KAAK,gBAAgB,qBAAqB,OACzC,KAAMK,GAAMA,EAAE,YAAcL,EAAK,SAAS,IAE3CA,EAAK,UAAY+lC,MAKf/lC,EAAK,GAAI,CACZ,MAAM4uC,EAAQ7I,KACJ2I,EAAAE,CAAK,EAAI5uC,EAAK,GACxBA,EAAK,GAAK4uC,CAAA,MAEV5uC,EAAK,GAAK+lC,IACX,CACA,EAGF,KAAK,yBAAyBuF,CAAY,EAEpC,MAAAuD,EAAiB,KAAK,UAAU,WAEhCC,EAAY,KAAK,UACtBvD,GACCD,EACA,KAAK,gBAAgB,aAAa,EAClC,CACC,UAAAoD,EACA,iBACCpD,EAAa,MAAQA,EAAa,KAAK,aAAeuD,EACnDvD,EAAa,KAAK,WAClB,GACJ,kBAAmB,KAAK,cAAc,iBACvC,GACC,WAECxpB,IAAW,QACT,gBAAW,MAAM,oBAAqB,CAC1C,YAAa,KAAK,eAAe,WACjC,kBAAmBgtB,CAAA,CACnB,EACShtB,IAAW,YAChB,gBAAW,MAAM,wBAAyB,CAC9C,YAAa,KAAK,eAAe,WACjC,kBAAmBgtB,CAAA,CACnB,EAEI,gBAAW,MAAM,yBAA0B,CAC/C,OAAAhtB,EACA,YAAa,KAAK,eAAe,WACjC,kBAAmBgtB,CAAA,CACnB,EAKF,KAAK,iBAAiB,EAKtB,KAAK,gBAAgB,oBACpBxD,EACAyD,GAAiC,KAAK,MAAO,KAAK,iBAAiB,GAGpE,MAAM38B,EAAO,MAAM,KAAK,mBAAmBk5B,CAAY,EAEvD,WAAW,IAAM,CACXl5B,EAAA,MAAO,QAASpS,GAAkB,CACjC,wBAAmBA,EAAK,IAAI,EACjC,EACD,EAEK,MAAAgvC,EAAc,KAAK,cAAc,eACvC,GAAIP,GAAcO,GAAe,MAAM,QAAQ1D,EAAa,IAAI,EAAG,CAClE,MAAM2D,EAAU,MAAM,KAAK,UAAU,SAAS,EACxCC,EAAW,IAAI,IAAID,EAAQ,IAAKxC,GAAQA,EAAI,IAAI,CAAC,EAEjD0C,EAAe7D,EAAa,KAC5B8D,EAAWD,EAAa,OAAQ1C,GAAQ,CAACyC,EAAS,IAAIzC,EAAI,IAAI,CAAC,EAE/D4C,EAA4C,GAClD,UAAW5C,KAAO2C,EAAU,CACrB,MAAAE,EAAkB,KAAK,UAAU,OAAO7C,EAAI,IAAI,EAAE,KAAMA,IAC7DwC,EAAQ,KAAKxC,CAAG,EACTA,EACP,EAED4C,EAAoB,KAAKC,CAAe,CACzC,CAEM,cAAQ,IAAID,CAAmB,EAErC,MAAM7C,EAAS2C,EAAa,OAAO,CAACzT,EAAgB6T,IAAmB,CAChE,MAAA9C,EAAMwC,EAAQ,KAAMxC,GAAQA,EAAI,OAAS8C,EAAS,IAAI,EAC5D,OAAI9C,GACE/Q,EAAA,KAAK+Q,EAAI,EAAE,EAGV/Q,CACR,EAAG,CAAE,GAEA,oBAAe,kBAAkB8Q,CAAM,EAC5C,WAAW,IAAM,CAChB,KAAK,sBAAsB,KAAK,eAAe,oBAAuB,CAAe,GACrF,CACF,QACQt+B,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,6CAA6C,CAAC,CAC3F,CACD,EAEA,yBAAyB5C,EAA4B,CACpD,GAAKA,GAAA,MAAAA,EAAU,OAEJ,UAAAtL,KAAQsL,EAAS,MAC3B,GAAKtL,EAAK,YAEC,UAACsM,EAAM2D,CAAU,IAAK,OAAO,QAAQjQ,EAAK,WAAW,EAC3DiQ,EAAW,KAAO,OAEjB,KAAK,iBAAiB,kBAAkBA,EAAW,EAAE,GAClD,OAAAjQ,EAAK,YAAYsM,CAAI,GAIhC,EAEA,WAAW3L,EAAkB,CAC5BA,EAAM,eAAe,CACtB,EAEA,MAAM,OAAOA,EAAkB,CAC1B,IAACA,EAAM,aACV,OAGD,MAAM6uC,EAAW50B,GAChBja,EAAM,aAAa,QAAQ8uC,EAAmB,GAE/C,GAAID,EAAU,CACP,MAAAnsC,EAAgB,KAAK,+BAA+B1C,CAAK,EACzD+uC,EAAqB,CAC1BrsC,EAAc,CAAC,EAAIssC,GAA0B,EAAIrF,GACjDjnC,EAAc,CAAC,EAAIssC,GAA0B,GAG9C,MAAM,KAAK,WAAWH,EAAU,GAAME,CAAkB,EACxD,KAAK,iBAAmB,EACzB,CACD,EAEA,qBAAqB1iC,EAAkB,CACtC,MAAMhN,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACnDhN,GACH,KAAK,eAAeA,CAAI,CAE1B,EAEA,mBAAmBgN,EAAkB4iC,EAAY,GAAOC,EAA6B,CAChFA,IAAsB,IACzB,KAAK,iBAAiB,EAGvB,MAAM7vC,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACnDhN,IACH,KAAK,aAAaA,CAAI,EACjB,aAAQ,iBAAmBA,EAAK,KACrC,KAAK,QAAQ,4BAA8B,KAC3C,KAAK,QAAQ,6BAA+B,KAC5C,KAAK,YAAY,uBAAyB,KAC1C,KAAK,YAAY,sBAAwB,KAErC4vC,IACE,cAAS,eAAiB5vC,EAAK,MAGvC,EACA,qBAAqB+wB,EAAoC,CACxD,MAAM+e,EAAW/e,EAAa,SAC9B,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,iDAAiD,EAC9E,QAAS,KAAK,QAAQ,SAAS,oDAAqD,CACnF,eAAgB+e,EAChB,YAAa,CAAE,wBAAyB/e,EAAa,WAAY,EACjE,EACD,KAAM,QACN,SAAU,EACV,CACF,EAEA,MAAM,gCACLA,EACAgf,EACC,aACD,IAAIC,EAAcjf,EAAa,eAE3Bif,IAAgB,SACnBA,EAAc,MAAM,QAAQjf,EAAa,OAAO,EAC7CA,EAAa,QAAQ,MAAM,EAAE,EAAE,CAAC,EAChCA,EAAa,SAGjB,MAAMkf,EAAuB,CAC5B,GAAIlK,GAAK,EACT,KAAMgK,EAAU,MAAShf,EAAa,SAAS,KAC/C,KAAMA,EAAa,KACnB,YAAaif,EACb,SAAU,CAAC,EAAG,CAAC,EACf,WAAY,CAAC,GAGRE,GAAoBhpC,EAAA6pB,EAAa,cAAb,YAAA7pB,EACvB,IAAKyH,GAAS,KAAK,iBAAiB,0BAA0BA,EAAK,IAAI,GACxE,OAEE,GAAAuhC,GAAqBA,EAAkB,SAAW,EAAG,CAClD,MAAAC,EAAoBD,EAAkB,CAAC,EAEvCE,EAAsB,KAAK,iBAAiB,kBAAkBD,EAAkB,EAAE,EAClFE,EAAW,CAAE,GAAID,EAAoB,GAAI,KAAMA,EAAoB,MACnE1iB,EAAc,CACnB,CAACyiB,EAAkB,IAAI,EAAGE,CAAA,EAG3B,MAAM,KAAK,oBACV,CAACJ,CAAW,EAAE,IAAKjwC,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAE7E,MAAMG,EAAW,KAAK,eAAe,YAAY8vC,EAAY,KAAMA,EAAY,WAAW,EACpFn+B,EAAiBC,IACtB5R,GAAA,YAAAA,EAAU,aAAc,CAAC,EACzB,CAAC,EACD,GACA,GACA8vC,CAAA,EAGD,GAAIlf,EAAa,YAAa,CACvB,MAAAuf,EAAiBvf,EAAa,YAAY,KAC9CpiB,GAASA,EAAK,OAASwhC,EAAkB,MAEvC,IAAAxrC,EAAA2rC,GAAA,YAAAA,EAAgB,iBAAhB,MAAA3rC,EAAgC,KAC5B,OAAAsrC,EAGF,MAAAM,GAAqBtpC,EAAAqpC,GAAA,YAAAA,EAAgB,iBAAhB,YAAArpC,EAAgC,KAC3D,GAAI,CAACspC,EACJ,OAAAN,EAAY,YAAcviB,EACnBuiB,EAGR,GAAI,OAAO,KAAKM,CAAkB,EAAE,SAAW,GAAKA,EAAmB,eAAgB,CAEtFN,EAAY,YAAcviB,EAE1B,IAAIld,EAAwC,GAC5C,UAAWggC,KAAiB,OAAO,KAAKD,CAAkB,EAAG,CAC5D,GAAIz+B,GAAkB,CAACA,EAAe0+B,CAAa,EAAG,CACrDhgC,EAAa,GACby/B,EAAY,YAAc,OAC1B,KACD,CACA,MAAMQ,GAAczpC,EAAAupC,EAAmBC,CAAa,IAAhC,YAAAxpC,EAAoC,GACpDypC,GAAe,OAAOA,GAAgB,WACzCjgC,EAAWggC,CAAa,EAAIC,GAE7BR,EAAY,WAAa,CACxB,GAAGA,EAAY,WACf,GAAGz/B,CAAA,CAEL,CACD,CACD,CACD,CACO,OAAAy/B,CACR,EAEA,MAAM,WACLjiB,EACA1mB,EAA0B,GAC1BopC,EAAa,GACbC,EAAe,GACfC,EAAY,GACX,SACD,MAAM7f,EACL,KAAK,eAAe,YAAY/C,CAAY,EAE7C,GAAI+C,IAAiB,KAAM,CAC1B,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,0CAA0C,EACvE,QAAS,KAAK,QAAQ,SAAS,6CAA8C,CAC5E,YAAa,CAAE,aAAA/C,CAAa,EAC5B,EACD,KAAM,QACN,EACD,MACD,CAGC,GAAA+C,EAAa,WAAa,QAC1B,KAAK,gBAAgB,iBAAiB/C,CAAY,GAAK+C,EAAa,SACnE,CACD,KAAK,qBAAqBA,CAAY,EACtC,MACD,CAEA,MAAMkf,EAAc,MAAM,KAAK,gCAAgClf,EAAc,CAC5E,KAAMzpB,EAAQ,KACd,EAGKwlC,EAAmB,KAAK,iBAE9B,GAAIxlC,EAAQ,SACX2oC,EAAY,SAAWlB,GACtB,KAAK,YAAY,4BAA4B,EAC7CznC,EAAQ,kBAECwlC,EAAkB,CACtB,MAAA+D,EAAyB,KAAK,YAAY,uBAChD,GAAIA,EAAwB,CAE3B,KAAM,CAACC,CAAK,EAAIC,GAAkCF,CAAsB,EACpEC,GAASE,IACP,yBACJlE,EAAiB,KACjBmE,GACAN,CAAA,CAGH,CAGI,QAAK,YAAY,sBACpBV,EAAY,SAAWlB,GAAiC,KAAK,MAAO,CACnE,KAAK,YAAY,sBAAsB,CAAC,EAAIzE,GAC5C,KAAK,YAAY,sBAAsB,CAAC,EAAIqF,GAA0B,EACtE,EACD,KAAK,YAAY,sBAAwB,SACnC,CACN,IAAIuB,EAAU,EACR,MAAA5lC,EAAW,KAAK,gBAAgB,mBAAmB,EAEzD,GAAIulC,EAAwB,CACrB,MAAAM,EAAiB,KAAK,eAAe,YAC1CrE,EAAiB,KACjBA,EAAiB,aAGlB,GAAIqE,EAAgB,CACnB,MAAMC,EAAU,CACf,CAAC,KAAM,GAAG,EACV,CAAC,KAAM,EAAG,GAAG,EACb,CAAC,KAAM,KAAM,IAAK,GAAG,GAGhBC,EAAoBjwB,GACzB9V,EACAwhC,EACAqE,CAAA,EAIKG,EAFwBxhC,GAA+BuhC,CAAiB,EAEpB,OACxD1nB,GAAWA,IAAWjiB,EAAmB,MAGvC,GAAA4pC,EAA4B,OAAS,EAAG,CAC3C,MAAMnxB,EAASixB,EAAQE,EAA4B,OAAS,CAAC,EACvDC,EAAoBV,EAAuB,OAC9CA,EAAuB,OAAO,kBAC9B,EACHK,EAAU/wB,EAAOoxB,CAAiB,CACnC,CACD,CACD,CAEA,IAAI3uB,EAA6D,GAC7D,IAMHA,EAAUxB,GAA2B9V,EAAU2kC,EAAalf,CAAY,OAC7D,CAAC,CACP,MAAApO,EAAc7S,GAA+B8S,CAAO,EACpD4uB,EAAuB,KAAK,eAAe,YAChD1E,EAAiB,KACjBA,EAAiB,aAKjB,GAAAnqB,EAAY,OAAS,GACrBA,EAAY,MAAOhC,GAAeA,IAAejZ,EAAmB,IAAI,EACvE,CACD,MAAM+pC,EAA2BnmC,EAAS,QAAQwhC,EAAiB,IAAI,EACjE4E,EAAqB7kC,GAC1BvB,EACAmmC,EACAD,CAAA,EAIKG,GAFyB7hC,GAA+B4hC,CAAkB,GAEvB,IACvD,OAAQ5kC,GAAUA,IAAUpF,EAAmB,IAAI,EACnD,UAAWkqC,GAAchvB,EAAQ,CAAC,IAAMgvB,CAAS,EAEnD3B,EAAY,SAAWlB,GACtB,KAAK,MACL,CACCjC,EAAiB,SAAS,CAAC,EACzB6C,IACC,KAAK,MAAIzoC,EAAAsqC,GAAA,YAAAA,EAAsB,SAAtB,YAAAtqC,EAA8B,SAAU,CAAC,EAAG,GACtDyqC,EACF7E,EAAiB,SAAS,CAAC,EAAImE,EAChC,EACA,CAAC,IAAK,CAAC,EACR,KACM,CAEN,MAAMphC,EAAShD,GACdvB,EACAwhC,EACA0E,CAAA,EAEKK,EAAc/hC,GAA+BD,CAAM,EAEzD,IAAIiiC,EAAab,GACXY,EAAY,KAAM/kC,GAAUA,IAAUpF,EAAmB,IAAI,IAEpDoqC,GAAA,KAIf7B,EAAY,SAAWlB,GACtB,KAAK,MACL,CAACjC,EAAiB,SAAS,CAAC,EAAIgF,EAAYhF,EAAiB,SAAS,CAAC,EAAIoE,CAAO,EAClF,CAAC,IAAK,CAAC,EAET,CACD,MACM,CAGA,MAAAxyC,EACL,KAAK,eAAe,cAAcsvB,CAAY,GAAK,CAAC,KAAK,gBACtD,KAAK,YAAY,wBAEjB,KAAK,kBAETiiB,EAAY,SAAWlB,GAAiC,KAAK,MAAOrwC,CAAQ,CAC7E,CAEA,MAAMqzC,EAAgB,KAAK,OAAO,iBAAiB9B,EAAY,KAAMA,EAAY,IAAI,EAarF,GAXYA,EAAA,KAAO,KAAK,eAAe8B,CAAa,GAEhDptC,EAAAosB,EAAa,WAAb,MAAApsB,EAAuB,SAC1BsrC,EAAY,UAAYlK,MAGzB,MAAM,KAAK,SAAS,CAACkK,CAAW,EAAG,OAAWU,CAAY,EAC1D,KAAK,eAAe,gBAAgBV,EAAY,KAAM,EAAI,EAE1D,KAAK,QAAQ,aAAe,GAExBjiB,IAAiBhtB,GACf,gBAAW,gBAAgB,qBAAsB,CACrD,YAAa,KAAK,eAAe,WACjC,MACK,CACD,KAAK,cAAc,IAAI,yBAA0B,CAAE,aAAAgtB,EAAc,EAC3DgkB,GAAA,EAAE,kBAAkBhkB,CAAY,EAC3C,MAAMikB,EAA6C,CAClD,UAAWjkB,EACX,aAAciiB,EAAY,YAC1B,YAAaW,EACb,YAAa,KAAK,eAAe,WACjC,cAAetpC,EAAQ,aAGpBwlC,IACHmF,EAAgB,gBAAkBnF,EAAiB,MAG/C,gBAAW,gBAAgB,yBAA0BmF,CAAe,CAC1E,CAIA,OAAItB,IACH,KAAK,iBAAiB,EACtB,WAAW,IAAM,CACX,wBACJV,EAAY,KACZS,GAAc1iB,IAAiBhtB,EAAA,CAChC,CACA,GAGKivC,CACR,EACA,cACCtC,EACAuE,EACAC,EACAC,EACAzjC,EAC0B,CAC1B,MAAM0jC,EACL,KAAK,eAAe,8BAA8B1E,CAAc,EAAEh/B,CAAI,EACvE,GAAI0jC,EAAiB,CACd,MAAAtF,EAAoCsF,EAAgBH,CAAqB,EAE/E,GAAInF,EACH,OAAOA,EAAY,KACjBrhC,GACAA,EAAW,OAASymC,GAAkBzmC,EAAW,QAAU0mC,CAAA,CAG/D,CAGD,EACA,gBACCzE,EACAuE,EACAC,EACAG,EACA3jC,EACC,CACD,KAAK,QAAQ,aAAe,GAE5B,MAAMm/B,EAAa,KAAK,eAAe,cAAcH,CAAc,EAC7D4E,EAAa,KAAK,eAAe,cAAcJ,CAAc,EAUnE,GAPCrE,GACAyE,GACA,CAAC,KAAK,2BAA2BzE,EAAYyE,EAAY5jC,CAAI,GAM7D,KAAK,cACJg/B,EACAuE,EACAC,EACAG,EACA3jC,CAAA,EAGD,OAGD,MAAM6jC,EAAiB,CACtB,CACC,KAAM7E,EACN,KAAAh/B,EACA,MAAOujC,CACR,EACA,CACC,KAAMC,EACN,KAAAxjC,EACA,MAAO2jC,CACR,GAGD,KAAK,gBAAgBE,CAAc,CACpC,EACA,MAAM,QACLxkB,EACA1mB,EAA0B,GAC1BopC,EAAa,GACbC,EAAe,GACfC,EAAY,GACX,OACG,IAAC,KAAK,mBACT,OAGD,MAAM9D,EAAmB,KAAK,iBACxB2F,EAA8B,KAAK,QAAQ,4BAC3CC,EAA+B,KAAK,QAAQ,6BAC5C7B,EAAyB,KAAK,YAAY,uBAEhD,KAAK,aAAa,qBAEZ,MAAAZ,EAAc,MAAM,KAAK,WAC9BjiB,EACA1mB,EACAopC,EACAC,EACAC,CAAA,EAED,GAAI,CAACX,EACJ,OAGD,MAAM1tB,EAAckwB,GAA+B,EAC7CE,EAAiBD,GAAgC,GAGnD,GAAAA,GAAgC,CAAC9B,EAAW,CAC/C,MAAMgC,EAAuB,KAAK,SAAS,YAAYF,CAA4B,EACnF,GACCE,GACA,KAAK,2BACJ9F,EACAmD,EACA2C,EAAqB,OAErB,CACD,MAAM/mC,EAAiB+mC,EAAqB,MACtCC,EAAiB,KAAK,SAAS,kBAAkB5C,EAAY,EAAE,EAE/D6C,EADqB,KAAK,SAAS,aAAaD,CAAc,EACxB,KAAME,GAEhDA,EAAK,QAAUlnC,GACf+mC,EAAqB,WAAW,aAAeG,EAAK,WAAW,UAEhE,GAED7rC,EAAA,KAAK,WAAL,MAAAA,EAAe,QAAQ,CACtB,MAAO,CAACyrC,GAAgBG,GAAA,YAAAA,EAAkB,OAAQ,EAAE,EACpD,WAAY,CAAC,KAAK,iBAAmB,CAAC,KAAK,cAE5C,KAAK,aAAa,oBAClB,MACD,CACD,CAEI,GAAAhG,GAAoB,CAAC8D,EAAW,CAGnC,GAFA,MAAM,KAAK,YAEPC,GAAA,MAAAA,EAAwB,OAAQ,CAC9B,+BAA0BA,EAAwBF,CAAY,EAE7D,MAAAwB,EAAiBtB,EAAuB,OAAO,eAC/CmC,EAAoBnC,EAAuB,OAAO,kBACnD,qBACJZ,EAAY,KACZ,EACAkC,EACAa,EACAtrC,EAAmB,KAErB,CAGK,qBACJolC,EAAiB,KACjBvqB,EACA0tB,EAAY,KACZ,EACAvoC,EAAmB,KAErB,CACA,KAAK,aAAa,mBACnB,EACA,qBAAqBsF,EAAkBimC,EAAiC,CACnE,IAAA1X,EACE,MAAAjwB,EAAW,KAAK,gBAAgB,mBAAmB,EACnDsE,EAAetE,EAAS,QAAQ0B,CAAQ,EAC9C,GAAI,CAAC4C,EAAqB,OAAE,MAAO,IAE7B,MAAAzP,EAAW,KAAK,eAAe,YACpCyP,GAAA,YAAAA,EAAc,KACdA,EAAa,aAEd,GAAIzP,EAAU,CAGb,MAAM+yC,EAFSrmC,GAA0BvB,EAAUsE,EAAczP,CAAQ,EAE9C,OAAQ2M,GAC9B,SAAOA,GAAU,UAAYA,EAAM,OAASmmC,GAAc,CAACnmC,EAAM,OAMrE,EAEGomC,EAAY,SACN3X,EAAA2X,EAAY,CAAC,EAAE,OAE1B,CAEO,OAAA3X,CACR,EACA,wBAAwBiO,EAAyB,WAC1C,MAAA76B,EAAO66B,EAAK,YAAc9hC,EAAmB,KAI7ComC,EAAa,KAAK,eAAe,YAAYtE,EAAK,QAAQ,EAChE,GAAI,CAACsE,EACJ,OAGI,aAAQ,iBAAmBA,EAAW,KACtC,aAAQ,6BACZtE,EAAK,gBAAgB7kC,GAAAuC,EAAAsiC,EAAK,aAAL,YAAAtiC,EAAiB,OAAO,MAAxB,YAAAvC,EAA6B,SAAS,MACvD,aAAQ,4BAA8B6kC,EAAK,MAChD,KAAK,YAAY,sBAAwB,KAErCA,EAAK,aACH,iBAAY,uBAAyBA,EAAK,YAGhD,KAAK,oBAAoB,CACxB,OAAQA,EAAK,YACb,iBAAkB,GAClB,gBAAiBA,EAAK,gBACtB,EAID,MAAMrE,IAAWl+B,EAAAuiC,EAAK,aAAL,YAAAviC,EAAiB,UAAU,GAAG,WAAW,cAAe,SAExE0H,IAASjH,EAAmB,MAAQ,OAAO,OAAOA,CAAkB,EAAE,SAASiH,CAAI,GAGnF01B,GACE,+BACA11B,EACAw2B,EACA,KAAK,qBAAqB2I,EAAW,KAAMn/B,CAAI,GAE/C,MAAO3L,GAAM,EAAE,CAEnB,EACA,MAAM,uBAAuB0I,EAAwB,WAChD,IACH,GAAI,KAAK,cAAe,CACvB,KAAK,cAAgB,GACrB,MACD,CACA,GAAI,KAAK,uBAAwB,CAChC,MAAMoiC,EAAa,KAAK,eAAe,YAAYpiC,EAAW,WAAW,MAAM,EACzEG,EAAiBH,EAAW,WAAW,MAAQhE,EAAmB,KAClEyrC,GAAyBjsC,EAAAwE,GAAA,YAAAA,EAAY,YAAZ,YAAAxE,EAC5B,uBAEH,GAAI4mC,EAAY,CACT,MAAAsF,EAAW1nC,EAAW,WAAW,aAAe,SAChDiiC,EAAiByF,EAAW,KAAK,uBAAyBtF,EAAW,KACrEqE,EAAiBiB,EAAWtF,EAAW,KAAO,KAAK,uBACnDvrB,EAAc7W,EAAW,WAAW,MAC1C2nC,GAAuC3nC,CAAU,EACjD,MAAM,KAAK,YAEN,qBACJiiC,EACAprB,EACA4vB,IACAxtC,EAAAwuC,GAAA,YAAAA,EAAwB,aAAxB,YAAAxuC,EAAoC,QAAS,EAC7CkH,CAAA,EAED,KAAK,uBAAyB,KAC9B,KAAK,cAAgB,EACtB,CACA,MACD,CAEM,MAAAynC,EAAa,GAAG5nC,EAAW,WAAW,MAAM,UAAUA,EAAW,WAAW,KAAK,GACjFmlB,EAAWnlB,EAAW,SAAS,YAAY4nC,CAAU,EAG3D,GAAI,GAACrsC,EAAA4pB,GAAA,YAAAA,EAAU,WAAV,MAAA5pB,EAAoB,SAAU,CAAC,KAAK,yBAA0B,CAClE,KAAK,wBAAwB,CAC5B,SAAUyE,EAAW,WAAW,OAChC,MAAOA,EAAW,WAAW,MAC7B,YAAa6+B,GAA0B,qBACvC,WAAA7+B,EACA,WAAYA,EAAW,WAAW,KAClC,EACD,MACD,CAEM,MAAA6nC,EAA+B1iB,EAAS,SAAS,OAGjD2iB,EAAW,IAAI,iBAAkBC,GAAc,CAUpD,GARyBA,EAAU,KAAMC,GAAa,CACrD,MAAM70C,EAAS60C,EAAS,OAEvB,OAAAC,GAAyB90C,CAAM,GAC/BA,EAAO,IAAI,SAAS,OAASgyB,EAAS,MACtChyB,EAAO,MAAM,UAAY,QAE1B,EACqB,CAErB,MAAM+0C,EAA+C,CACpD,SAAUloC,EAAW,WAAW,OAChC,MAAOA,EAAW,WAAW,MAC7B,YAAa6+B,GAA0B,qBACvC,WAAY7+B,EAAW,WAAW,KAClC,aAAcmlB,EAAS,KACvB,SAAUA,EAAS,OAAO,UAE3B,KAAK,QAAQ,qBAAuB+iB,EACpC,KAAK,QAAQ,kBACZ,KAAK,QAAQ,SAAS,8BAA8B,EACpDL,CAAA,EAEDC,EAAS,WAAW,EACpB,MACD,EACA,EACQA,EAAA,QAAQ,KAAK,MAAM,YAA4B,CACvD,WAAY,GACZ,gBAAiB,CAAC,OAAO,EACzB,QAAS,GACT,QACOxwC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,2BACC8qC,EACAyE,EACAsB,EACU,OACJ,MAAAC,EAAiB,KAAK,eAAe,YAC1CvB,EAAW,KACXA,EAAW,aAGR,IAAArrC,EAAA4sC,GAAA,YAAAA,EAAgB,SAAhB,MAAA5sC,EAAwB,OAAQ,CAC7B,MAAAoE,EAAW,KAAK,gBAAgB,mBAAmB,EACnDsE,EAAetE,EAAS,QAAQinC,EAAW,IAAI,EACrD,IAAI1iC,EAA2D,GAC3DikC,IACHjkC,EAAShD,GAA0BvB,EAAUsE,EAAckkC,CAAc,GAG/D,UAAAhnC,KAAS+C,GAAU,GACzB,YAAO/C,GAAU,UAAYA,EAAM,OAAS+mC,GAAkB,CAAC/mC,EAAM,SAKrEA,EAAM,OAAO,MAAM,QAClB,CAACA,EAAM,OAAO,MAAM,SAASghC,EAAW,IAAI,EAC/C,YAAK,cAAgB,GACrB,KAAK,UAAU,CACd,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,QAAS,KAAK,QAAQ,SAAS,gDAAiD,CAC/E,YAAa,CAAE,eAAgBA,EAAW,KAAM,eAAgByE,EAAW,IAAK,EAChF,EACD,KAAM,QACN,SAAU,IACV,EACM,EAIX,CACO,QACR,EACA,sBAAsB/I,EAAwB,CACzC,IACC,IAAAuK,EACAC,EASJ,GARIxK,EAAK,WAAW,UAAU,CAAC,EAAE,WAAW,aAAe,UAC1DuK,EAAavK,EAAK,aAAa,WAC/BwK,EAAaxK,EAAK,WAAW,UAAU,CAAC,EAAE,aAE1CuK,EAAavK,EAAK,WAAW,UAAU,CAAC,EAAE,WAC1CwK,EAAaxK,EAAK,aAAa,YAI/BuK,EAAW,OAASC,EAAW,MAC/BD,EAAW,aAAeC,EAAW,WAErC,YAAK,cAAgB,GACd,GAGR,MAAMlG,EAAa,KAAK,eAAe,YAAYiG,EAAW,MAAM,EAC9DxB,EAAa,KAAK,eAAe,YAAYyB,EAAW,MAAM,EAE9DrG,GAAiBG,GAAA,YAAAA,EAAY,OAAQ,GACrCqE,GAAiBI,GAAA,YAAAA,EAAY,OAAQ,GAE3C,OAAIzE,GAAcyE,GACb,CAAC,KAAK,2BAA2BzE,EAAYyE,EAAYyB,EAAW,IAAI,EACpE,GAMR,KAAK,cACJrG,EACAoG,EAAW,MACX5B,EACA6B,EAAW,MACXD,EAAW,OAGZ,KAAK,cAAgB,GACrB,KAAK,uBAAyB,KACvB,IAGD,SACC/wC,EAAG,CACX,eAAQ,MAAMA,CAAC,EACR,EACR,CACD,EACA,kBAAkBwmC,EAAmC,SAChD,IACH,GAAIA,EAAK,eAAe,WAAW,aAAe,SAAU,CAG3D,MAAMyK,EAAezK,EAAK,eAC1BA,EAAK,eAAiBA,EAAK,eAC3BA,EAAK,eAAiByK,CACvB,CAEM,MAAAF,EAAavK,EAAK,eAAe,WACjCwK,EAAaxK,EAAK,eAAe,WAEjCmE,GAAiBzmC,EAAA,KAAK,eAAe,YAAY6sC,EAAW,MAAM,IAAjD,YAAA7sC,EAAoD,KACrEirC,GAAiBxtC,EAAA,KAAK,eAAe,YAAYqvC,EAAW,MAAM,IAAjD,YAAArvC,EAAoD,KAEvEgpC,GAAkBwE,IACrB3I,EAAK,WAAW,OAAS,CACxB,eAAAmE,EACA,kBAAmBoG,EAAW,MAC9B,eAAA5B,EACA,kBAAmB6B,EAAW,QAIlBE,GAAgB1K,EAAK,UAAU,EAC/B2K,GAA2B3K,EAAK,cAAc,EAE5D,MAAMgJ,EAA6C,CAClD,CACC,KAAM7E,EACN,KAAMoG,EAAW,KACjB,MAAOA,EAAW,KACnB,EACA,CACC,KAAM5B,EACN,KAAM6B,EAAW,KACjB,MAAOA,EAAW,KACnB,GAMD,GAHA,KAAK,cAAgB,GACrB,KAAK,eAAe,cAAc,CAAE,WAAYxB,CAAgB,GAE5D,CAAC,KAAK,iBAAmB,CAAC,KAAK,YAAa,CACjC4B,GAAoB5K,EAAK,cAAc,EACvC6K,GACb7K,EAAK,WACL,IAAM,CACL,KAAK,iBAAmB,KACnB,+BAA0BA,EAAK,UAAU,CAC/C,EACA,IAAM,CACL,KAAK,wBAAwB,CAC5B,SAAUA,EAAK,eAAe,WAAW,OACzC,MAAOuK,EAAW,MAClB,WAAYvK,EAAK,WACjB,YAAae,GAA0B,uBACvC,CACF,GAGD,MAAM+J,EAAgBC,GACrB/K,EAAK,WACLgL,EAAA,EAEGT,EAAW,OAASrsC,EAAmB,OAE1C8hC,EAAK,WAAW,cACfiL,GAA2BjL,EAAK,WAAYA,EAAK,eAAe,WAAW,QAAQ,GAEpF8K,GAAA,MAAAA,EAAe,WAAW,IAE5B,CACA,KAAK,cAAgB,GAChB,KAAK,YACT,KAAK,QAAQ,aAAe,GACvB,KAAK,qCACT,KAAK,aAAa,kBAAkB,IAAII,GAAqBlC,CAAc,CAAC,EAIxE,KAAK,mBACT,KAAK,YAAY,yBACjB,KAAK,qBAAqB,EAC1B,WAAW,IAAM,SACFmC,GACbnL,EAAK,OACLA,EAAK,QACL7kC,GAAAuC,EAAAsiC,EAAK,aAAL,YAAAtiC,EAAiB,YAAjB,MAAAvC,EAA4B,eAAe,UACvC6kC,EAAK,WAAW,UAAU,OAC3B,SAEF,CAAC,UAGExmC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,uBAAwB,CACvB,KAAK,SAAS,YAAY,QAAS0I,GAAe,OACnCipC,GACbjpC,EAAW,OACXA,EAAW,QACXxE,EAAAwE,GAAA,YAAAA,EAAY,YAAZ,MAAAxE,EAAuB,eAAe,UAClCwE,GAAA,YAAAA,EAAY,UAAU,OACvB,OACJ,CACA,CACF,EACA,YAAa,CACN,MAAAkpC,EAAa,KAAK,MAAM,OACzB,KAAK,cAAc,KAAK,0BAA2B,CACvD,aAAcA,EAAa,GAAK,IAAM,EACtC,CACF,EACA,2BAA4B,QAC3B1tC,EAAA,KAAK,WAAL,MAAAA,EAAe,YAAY,QAASwE,GAAe,CAClDmpC,GAAmCnpC,CAAU,EAC7CopC,GAAsCppC,CAAU,EAEhD,OAAO,OAAOA,EAAW,QAAQ,EAAE,QAASqpC,GAAY,OAClDA,EAAQ,UACR7tC,EAAA,sBAAAA,EAAU,QAAQ6tC,EAAQ,QAAM,CACrC,GAEH,EACA,mBAAmBrpC,EAA+B,SACjD,MAAI,EAACA,GAAA,MAAAA,EAAY,KAAM,GAACxE,EAAA,KAAK,mBAAL,MAAAA,EAAuB,IAAW,KAEnDvC,EAAA,KAAK,mBAAL,YAAAA,EAAuB,MAAO+G,EAAW,EACjD,EACA,sBAAsBA,EAAwB,CACzC,IAMH,GALI,KAAK,YAAc,SACtB,aAAa,KAAK,SAAS,EAC3B,KAAK,UAAY,QAKjB,KAAK,iBACL,KAAK,aACL,KAAK,YACL,CAACA,GACD,KAAK,mBAAmBA,CAAU,EAElC,OAEI,gBAAa,WAAW,IAAM,CAE9B,KAAK,kBAAoB,CAAC,KAAK,mBAAmBA,CAAU,GACjDspC,GAAsB,KAAK,gBAAgB,EAE1D,KAAK,WAAa,OACdtpC,IACHupC,GAAoCvpC,CAAU,EAC9C,KAAK,iBAAmBA,IAEvB,GAAG,QACE1I,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,qBAAqB0I,EAAwB,CACxC,IAQH,GAPI,KAAK,YAEL,KAAK,aACR,aAAa,KAAK,UAAU,EAC5B,KAAK,WAAa,QAKlB,KAAK,iBACL,KAAK,aACL,CAACA,GACD,CAAC,KAAK,mBAAmBA,CAAU,GAEnC,OAEI,eAAY,WAAW,IAAM,CACjC,KAAK,UAAY,OAEbA,GAAc,KAAK,mBAAmBA,CAAU,IACrCspC,GAAsB,KAAK,gBAAgB,EACzD,KAAK,iBAAmB,OAEvB,GAAG,QACEhyC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,kBAAkBwmC,EAA6B,SAC1C,IAKW0L,GAAwB1L,EAAK,UAAU,EAE/C,MAAAuK,EAAavK,EAAK,WAAW,WAC7BwK,EAAaxK,EAAK,iBAAiB,WAEnC2L,EAAiB,CACtB,CACC,OAAMjuC,EAAA,KAAK,eAAe,YAAY6sC,EAAW,MAAM,IAAjD,YAAA7sC,EAAoD,OAAQ,GAClE,KAAM6sC,EAAW,KACjB,MAAOA,EAAW,KACnB,EACA,CACC,OAAMpvC,EAAA,KAAK,eAAe,YAAYqvC,EAAW,MAAM,IAAjD,YAAArvC,EAAoD,OAAQ,GAClE,KAAMqvC,EAAW,KACjB,MAAOA,EAAW,KACnB,GAGI,wBAAmBmB,EAAgB,EAAK,QACrCnyC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,oBAAoB6tB,EAAoBukB,EAAO,CAI1C,CAACvkB,EAAS,UAAYukB,EAAM,SAAWvkB,EAAS,SAAS,QACxD,cAAS,SAASA,EAAU,EAAI,CACtC,EACA,mBAAmBA,EAAoB,CACjCA,EAAS,UACT,cAAS,SAASA,EAAU,EAAK,CACvC,EACA,MAAM,qBAAqB2Y,EAAgC,OACtD,IACH,GAAIA,EAAK,eAAe,WAAW,aAAe,SAAU,CAE3D,MAAMyK,EAAezK,EAAK,eAC1BA,EAAK,eAAiBA,EAAK,eAC3BA,EAAK,eAAiByK,CACvB,CAEM,MAAAkB,EAAoDE,GAAkB7L,CAAI,EAOhF,GANc0L,GAAwB1L,EAAK,cAAc,EACzD8L,GAAkC9L,EAAK,eAAgBA,EAAK,UAAU,EAEtEA,EAAK,WAAW,iBACX,wCAAmCA,EAAM,GAAO,EAAK,EAEtD,KAAK,uBAAwB,CAEhC,KAAK,aAAa,qBAElB,MAAMmE,EADa,KAAK,eAAe,YAAYnE,EAAK,WAAW,WAAW,MAAM,EAClD,KAC5BjnB,EAAcinB,EAAK,WAAW,WAAW,MACzC2J,EAAyB3J,EAAK,WAAW,UAC7C,uBAEE2L,GACH,KAAK,aAAa,kBAAkB,IAAII,GAAwBJ,CAAc,CAAC,EAE3E,qBACJxH,EACAprB,EACA,KAAK,yBACLrb,EAAAisC,GAAA,YAAAA,EAAwB,aAAxB,YAAAjsC,EAAoC,QAAS,EAC7CQ,EAAmB,MAEpB,KAAK,uBAAyB,KAC9B,MAAM,KAAK,YACX,KAAK,aAAa,mBAAkB,SAEpC,CAAC,KAAK,aAAa,gBACnB,CAAC,KAAK,qCACNytC,EACC,CAGD,MAAMK,EAAgB,IAAID,GAAwBJ,EAAgB,IAAI,EACjE,kBAAa,kBAAkBK,CAAa,CAClD,CAEK,KAAK,YAAY,+BACdxyC,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,iBAAiB0I,EAAwB,QAGxCxE,EAAAwE,EAAW,SAAS,gBAAgB,IAApC,MAAAxE,EAAuC,WAAW,IAC9C,IACH,KAAK,uBAAyB,KAC9B,KAAK,eAAiB,GACtB,KAAK,YAAY,sBAAwB,KACzC8tC,GAAoCtpC,CAAU,EAC9CwoC,GAA8BxoC,CAAU,EAExC,MAAMumB,EAAQvmB,EAAW,MACnB+pC,EAAkB,MAAM,KAC7B,SAAS,iBAAiB,mBAAmBxjB,CAAK,QAAQ,GAGrDyjB,EADiBhqC,EAAW,WAAW,aACL,SAAW,SAAW,SAExDiqC,EAAoBF,EAAgB,OAAQvS,GAAO,CAClD,MAAArS,EAAWqS,EAAG,IAAI,SACxB,GAAI,CAACrS,EAAiB,SAGtB,MAAM+kB,EAAa/kB,EAAS,WAAW,SAAWnlB,EAAW,WAAW,OAClEmqC,EAAehlB,EAAS,WAAW,WAElC,OAAC+kB,GAAcC,IAAiBH,CAAA,CACvC,EAEK1O,EAAehkC,GAA+B,CACnD,GAAI,CAAC0I,EACJ,OAGD,MAAMoqC,EAAwBH,EAC5B,OAAQ9S,GAAqB,CACvB,MAAAhS,EAAWgS,EAAQ,IAAI,SAE7B,GAAIA,EAAQ,UAAU,SAAS,uBAAuB,EAC9C,SAER,MAAMkT,EAAsBC,GAAoCnT,EAAS7/B,EAAG,EAAE,EACxEizC,EAAyBD,GAC9BnlB,EAAS,QACT7tB,EACA,IAGD,GAAI+yC,GAAuBE,EAAwB,CAClD,MAAMj2C,EAAO,KAAK,eAAe,YAAY6wB,EAAS,WAAW,MAAM,EAEvE,GAAI7wB,EAGH,MAFiB,OAAK,eAAe,YAAYA,EAAK,KAAMA,EAAK,WAAW,CAM9E,CAEO,QACP,GACA,KAAK,CAAC+7B,EAAG5K,IAAM,CACf,MAAM+kB,EAAqBC,GAA2Cpa,EAAG/4B,EAAG,EAAE,EACxEozC,EAAqBD,GAA2ChlB,EAAGnuB,EAAG,EAAE,EAG9E,MAAI,EAACkzC,GAAA,MAAAA,EAAoB,IAAK,EAACE,GAAA,MAAAA,EAAoB,GAC3C,EAIHF,GAAA,MAAAA,EAAoB,EACpBE,GAAA,MAAAA,EAAoB,EAGlBA,EAAmB,EAAIF,EAAmB,EAHd,GADA,CAIc,CACjD,EAEE,GAAAJ,EAAsB,OAAS,EAAG,CAE/B,MAAAjlB,EADuBilB,EAAsB,CAAC,EACd,IAAI,SACpC91C,EAAO,KAAK,eAAe,YAAY6wB,EAAS,WAAW,MAAM,EAElE,6BAAyB7wB,GAAA,YAAAA,EAAM,OAAQ,KAE9Bq2C,GAAwB3qC,EAAYmlB,CAAQ,OAE1DylB,GAAsC5qC,CAAU,EAChD,KAAK,uBAAyB,IAC/B,EAGKu7B,EAAajkC,GAA+B,CACjD,KAAK,eAAiB,GACtB,KAAK,YAAY,sBAAwB,KAAK,+BAA+BA,CAAC,EAC9EqwC,GAAuC3nC,CAAU,EAC1C,2BAAoB,YAAas7B,CAAW,EAC5C,2BAAoB,UAAWC,CAAS,EAE/C,KAAK,oBAAsB,CAC1B,KAAM,KACN,WAAY,KACb,EAGM,wBAAiB,YAAaD,CAAW,EACzC,wBAAiB,YAAaA,CAAW,EACzC,wBAAiB,UAAWC,CAAS,EACrC,wBAAiB,WAAYD,CAAW,EAE/C,KAAK,oBAAsB,CAC1B,KAAMt7B,EAAW,WAAW,KAC5B,WAAYA,EAAW,WAAW,kBAE3B1I,EAAG,CACX,QAAQ,MAAMA,CAAC,CAChB,CACD,EACA,8BAA8B0I,EAAwB,OACrD,OAAO,QAAOxE,EAAA,KAAK,WAAL,YAAAA,EAAe,kBAAkB,EAC7C,QAASykC,GAAc,OAAO,OAAOA,CAAS,CAAC,EAC/C,OAAQ9a,GAAaA,EAAS,SAAS,OAAS,SAAS,EACzD,QAASA,GAAa,WAAW,IAAMA,EAAS,SAAS,WAAWA,EAAS,OAAO,EAAG,CAAC,CAAC,CAC5F,EACA,oBAAoBA,EAAoB,CACvC,GAAI,KAAK,0BACR,GAAIA,GAAA,MAAAA,EAAU,OAAQ,CACrB,KAAK,QAAQ,qBAAuB,CACnC,SAAUA,EAAS,OAAO,OAC1B,MAAOA,EAAS,OAAO,MACvB,YAAa0Z,GAA0B,cACvC,WAAY1Z,EAAS,MACrB,aAAcA,EAAS,KACvB,SAAUA,EAAS,OAAO,UAErB,MAAA0iB,EAAkB1iB,EAAS,SAAS,OAC1C,KAAK,QAAQ,kBACZ,KAAK,QAAQ,SAAS,8BAA8B,EACpD0iB,CAAA,CAEF,OAEA,KAAK,wBAAwB,CAC5B,SAAU1iB,EAAS,OAAO,OAC1B,MAAOA,EAAS,OAAO,MACvB,YAAa0Z,GAA0B,cACvC,WAAY1Z,EAAS,MACrB,aAAcA,EAAS,KACvB,SAAUA,EAAS,OAAO,SAC1B,CAEH,EACA,wBAAwBA,EAAoB,CACvCA,GAAA,MAAAA,EAAU,QACb,KAAK,wBAAwB,CAC5B,SAAUA,EAAS,OAAO,OAC1B,MAAOA,EAAS,OAAO,MACvB,YAAa0Z,GAA0B,mBACvC,gBAAiBjL,GACjB,WAAYzO,EAAS,MACrB,aAAcA,EAAS,KACvB,CAEH,EACA,kBAAmB,CACd,KAAK,iBACT,KAAK,SAAS,KAAK0lB,GAAwB,KAAK,sBAAsB,EAEtE,KAAK,SAAS,KAAKC,GAAuB,KAAK,qBAAqB,EAEpE,KAAK,SAAS,KAAKC,GAAkB,KAAK,iBAAiB,EAE3D,KAAK,SAAS,KAAKC,GAAiB,KAAK,UAAU,EACnD,KAAK,SAAS,KAAKC,GAA4B,KAAK,qBAAqB,EACzE,KAAK,SAAS,KAAKC,GAA2B,KAAK,oBAAoB,EAEvE,KAAK,SAAS,KAAKC,GAAwB,KAAK,iBAAiB,EACjE,KAAK,SAAS,KAAKC,GAA0B,KAAK,mBAAmB,EACrE,KAAK,SAAS,KAAKC,GAAyB,KAAK,kBAAkB,EACnE,KAAK,SAAS,KAAKC,GAA2B,KAAK,oBAAoB,EACvE,KAAK,SAAS,KAAKC,GAAuB,KAAK,gBAAgB,EAC/D,KAAK,SAAS,KACb,CAACA,GAAuBV,GAAwBS,EAAyB,EACzE,KAAK,+BAEN,KAAK,SAAS,KAAKE,GAA2B,KAAK,mBAAmB,EACtE,KAAK,SAAS,KAAKC,GAAgC,KAAK,uBAAuB,EAE/E,KAAK,eAAiB,GACvB,EACA,oBAAqB,CACpB,KAAK,SAAS,OAAOZ,GAAwB,KAAK,sBAAsB,EAExE,KAAK,SAAS,OAAOC,GAAuB,KAAK,qBAAqB,EAEtE,KAAK,SAAS,OAAOC,GAAkB,KAAK,iBAAiB,EAE7D,KAAK,SAAS,OAAOC,GAAiB,KAAK,UAAU,EACrD,KAAK,SAAS,OAAOC,GAA4B,KAAK,qBAAqB,EAC3E,KAAK,SAAS,OAAOC,GAA2B,KAAK,oBAAoB,EAEzE,KAAK,SAAS,OAAOC,GAAwB,KAAK,iBAAiB,EACnE,KAAK,SAAS,OAAOC,GAA0B,KAAK,mBAAmB,EACvE,KAAK,SAAS,OAAOC,GAAyB,KAAK,kBAAkB,EACrE,KAAK,SAAS,OAAOC,GAA2B,KAAK,oBAAoB,EACzE,KAAK,SAAS,OAAOC,GAAuB,KAAK,gBAAgB,EAEjE,KAAK,SAAS,OAAOA,GAAuB,KAAK,6BAA6B,EAC9E,KAAK,SAAS,OAAOV,GAAwB,KAAK,6BAA6B,EAC/E,KAAK,SAAS,OAAOS,GAA2B,KAAK,6BAA6B,EAClF,KAAK,SAAS,OAAOE,GAA2B,KAAK,mBAAmB,EACxE,KAAK,SAAS,OAAOC,GAAgC,KAAK,uBAAuB,EACjF,KAAK,eAAiB,EACvB,EACA,6BAA6BC,EAAO,GAAM,CACzC,GAAI,KAAK,SAAU,CAEZ,MAAAC,EAAW,KAAK,SAAS,mBAAmB,EAClD,UAAWxU,KAAW,OAAO,OAAOwU,CAAQ,EAAG,CAC9C,MAAM1L,EAAY9I,EAAQ,UACf,UAAAhS,KAAY8a,GAAa,GAAI,CACvC,MAAM2L,EAAmBzmB,GAAA,YAAAA,EAAU,SAC/BymB,GAAoBA,EAAiB,OAASC,IAChDD,EAAqC,aAAa,CAErD,CACD,CACD,CAEA,KAAK,eAAiB,EACvB,EACA,eAAe,EAAsB,CAChC,UAAK,QAAU,OAAO,6BAE1B,IAAW,KAAK,QAAQ,aAGvB,YAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,EAEtE,mBAAgB,WAAW,IAAM,CACrC,KAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,GACzE,EAAIE,GAAK,MAAM,EAClB,EAAE,YAAc,GACT,GAEP,KAAK,YAAY,aAAa,KAAK,QAAQ,SAAS,sBAAsB,CAAC,EAC3E,KAAK,mBAAmB,qBAAqB,KAAK,eAAe,UAAU,EAC3E,OAEF,EACA,UAAW,CAGV,aAAa,KAAK,aAAa,CAChC,EACA,MAAM,aAA6B,CAClC,KAAK,YAAY,eACjB,KAAK,eAAe,EACpB,KAAK,aAAe,MAAM,KAAK,eAAe,mBAAmB,EAC5D,oBAAe,0BAA4B,GAChD,KAAK,gBAAgB,gBAAkB,KAEvC,KAAK,QAAQ,aAAe,GAC5B,KAAK,YAAY,aAAa,EAAG,CAAC,EAAG,CAAC,CAAC,EACvC,MAAM,KAAK,wBACX,KAAK,QAAQ,oBAAsB,GACnC,KAAK,aAAa,QAClB,KAAK,gBAAgB,gBAAkB,KACvC,KAAK,YAAY,aAClB,EACA,MAAM,uBAAuC,CAC5C,KAAK,YAAY,WAClB,EACA,MAAM,UAA0B,SAC/B,GAAI,KAAK,OAAO,OAAO,SAAW,eAAgB,CAGjD,KAAK,QAAQ,aAAe,GAC5B,MACD,CACA,GAAI,KAAK,cACR,KAAK,cAAgB,WACX,KAAK,OAAO,OAAS/rB,EAAM,gBAAiB,CAChD,MAAA2gB,EAAa,KAAK,OAAO,OAAO,GAChC,WAAK,qBAAqBA,CAAU,MACpC,CACN,GAAI,KAAK,QAAQ,cAAgB,CAAC,KAAK,YAAa,CAC7C,MAAAhE,EAAe,MAAM,KAAK,QAC/B,KAAK,QAAQ,SAAS,4CAA4C,EAClE,CACC,MAAO,KAAK,QAAQ,SAAS,6CAA6C,EAC1E,KAAM,UACN,kBAAmB,KAAK,QAAQ,SAC/B,sDACD,EACA,iBAAkB,KAAK,QAAQ,SAC9B,qDACD,EACA,UAAW,EACZ,GAED,GAAIA,IAAiB/5B,GACN,MAAM,KAAK,gBAAgB,oBAAoB,GAC5C,WAAK,cAAc,2BAC1B+5B,IAAiBqP,GAC3B,MAEF,CAEA,IAAIC,EAAa,KAIjB,GAHI,KAAK,OAAO,OAAO,OACTA,EAAA,KAAK,OAAO,OAAO,MAE7BA,IAAe,KAAM,CACxB,IAAIpsC,EACA,IACHA,EAAW,MAAM,KAAK,eAAe,cAAcosC,CAAU,QACrDxpC,EAAO,CACf,KAAK,UAAUA,EAAO,KAAK,QAAQ,SAAS,oCAAoC,CAAC,EAE5E,KAAK,QAAQ,KAAK,CACtB,KAAMud,EAAM,aACZ,CACF,CAEIngB,IACE,cAASA,EAAS,KAAM,MAAM,EAC7B,WAAK,aAAaA,CAAQ,EAChC,MAAM,KAAK,yBAEPpE,EAAAoE,EAAS,OAAT,MAAApE,EAAe,cAClB,KAAK,WAAW,MACf,yDAAyDoE,EAAS,KAAK,YAAY,GACnF,CACC,YAAaA,EAAS,EACvB,EACA,CACC,YAAa,EACd,GAIO,OAAA3G,EAAA,KAAK,OAAO,OAAZ,YAAAA,EAAkB,YAAa,IAEzC,MAAM,KAAK,aAEb,CACA,KAAK,aAAa,QAClB,KAAK,QAAQ,oBAAsB,GAC1B,0BAAiB,UAAW,KAAK,OAAO,EACxC,0BAAiB,QAAS,KAAK,KAAK,EAEtC,wBAAiB,eAAgB,KAAK,cAAc,EACpD,wBAAiB,SAAU,KAAK,QAAQ,EAG/C,KAAK,yBAAyB,CAAC8mB,EAAM,SAAUA,EAAM,YAAY,CAAC,CACnE,EACA,sBACCze,EACAnB,EACAtH,EACgB,CAChB,MAAMvE,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,OAAKhN,EAIEszB,GAAoCtzB,EAAK,GAAI6L,EAAgBtH,CAAK,EAHjE,IAIT,EACA,qBAAqByI,EAAkBnB,EAAiCtH,EAAe,CACtF,MAAMvE,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,OAAKhN,EAIEoyB,GAAmCpyB,EAAK,GAAI6L,EAAgBtH,CAAK,EAHhE,IAIT,EACA,gBAAgBmH,EAAwC,OACvD,MAAMisC,EAAa,KAAK,sBACvBjsC,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,OAETksC,EAAY,KAAK,qBACtBlsC,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,KACdA,EAAW,CAAC,EAAE,OAEX,IAACisC,GAAc,CAACC,EACnB,OAGK7R,QAAyB,CAAC4R,EAAYC,CAAS,GAErD1wC,EAAA,KAAK,WAAL,MAAAA,EAAe,QAAQ,CACtB,MAAO6+B,EACP,WAAY,CAAC,KAAK,iBAAmB,CAAC,KAAK,cAG5C,WAAW,IAAM,CAChB,KAAK,sBAAsB,KAAK,eAAe,oBAAuB,CAAe,GACrF,CACF,EACA,mBAAmBr6B,EAAwCmsC,EAAyB,GAAO,SAC1F,GAAIA,EAAwB,CAC3B,MAAM/J,EAAa,KAAK,eAAe,cAAcpiC,EAAW,CAAC,EAAE,IAAI,EACjE6mC,EAAa,KAAK,eAAe,cAAc7mC,EAAW,CAAC,EAAE,IAAI,EAEnE,IAACoiC,GAAc,CAACyE,EACnB,OAGK,MAAApB,EAAiB,KAAK,eAAe,YAC1CrD,EAAW,KACXA,EAAW,aAENgK,IACL5wC,EAAAiqC,GAAA,YAAAA,EAAgB,UAAhB,YAAAjqC,EAA0BwE,EAAW,CAAC,EAAE,SAAUhE,EAAmB,KAChEqwC,EACL,OAAOD,GAAqB,SAAWA,EAAmBA,EAAiB,KACtE7lB,EAAQC,GAA+B6lB,CAAoB,IAE7CpzC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,MAAAstB,EACA,OAAQ6b,EAAW,GACnB,OAAQyE,EAAW,MAGR,QAASyF,GAAmC,CACnDA,EAAmB,OAGrBA,EAAmB,OAAO,oBAAsBtsC,EAAW,CAAC,EAAE,OAC9DssC,EAAmB,OAAO,oBAAsBtsC,EAAW,CAAC,EAAE,OAE9D,KAAK,0BAA0BssC,CAAkB,EAGlD,KAAK,0BAA0BA,CAAkB,CAClD,CACA,CACF,CAEA,KAAK,eAAe,iBAAiB,CAAE,WAAAtsC,CAAY,EACpD,EACA,0BAA0BA,EAAwBilC,EAAe,GAAO,WAOnE,GAJJjlC,EAAW,eAAe,EAE1B,KAAK,uBAAyB,MACzBxE,EAAA,sBAAAA,EAAU,iBAAiBwE,GAC5BilC,GAAgBjlC,EAAW,OAAQ,CACtC,MAAM8mC,EAA6C,CAClD,CACC,OAAO7tC,EAAA+G,EAAW,SAAX,YAAA/G,EAAmB,kBAC1B,KAAM+G,EAAW,OAAO,eACxB,KAAMhE,EAAmB,IAC1B,EACA,CACC,OAAOT,EAAAyE,EAAW,SAAX,YAAAzE,EAAmB,kBAC1B,KAAMyE,EAAW,OAAO,eACxB,KAAMhE,EAAmB,IAC1B,GAEK8tC,EAAgB,IAAID,GAAwB/C,EAAgB,IAAI,EACjE,kBAAa,kBAAkBgD,CAAa,CAClD,CACD,EACA,mCAAmChM,EAAMqO,EAAyB,GAAOlH,EAAe,GAAO,CACxF,MAAAwE,EAAoDE,GAAkB7L,CAAI,EAE5E2L,IACC0C,EACE,+BAA0BrO,EAAK,WAAYmH,CAAY,EAClDA,GACV,KAAK,aAAa,kBAAkB,IAAI4E,GAAwBJ,CAAc,CAAC,EAEhF,KAAK,eAAe,iBAAiB,CAAE,WAAYA,CAAgB,GAErE,EACA,MAAM,eAAer0C,EAA+B,CAC/C,IAAC,KAAK,mBACT,OAGD,MAAMwqC,EAAe/5B,GAAS,MAAM,KAAK,eAAezQ,CAAK,CAAC,EAC9D,MAAM,KAAK,mBAAmBwqC,EAAc,YAAa,EAAK,CAC/D,EACA,+BAA+Bt+B,EAG7B,SACD,MAAMhN,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EAEvD,GAAIhN,EAAM,CAEH,MAAAi4C,GAAW/wC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQlH,EAAK,KAQP,OACN,UALgB2E,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQ3E,EAAK,KAKb,SAAAi4C,CAAA,CAEF,CACA,MAAO,CAAE,SAAU,GAAI,SAAU,CAAG,EACrC,EACA,YAAYj4C,EAAe,CAC1B,KAAM,CAAE,SAAAk4C,EAAU,SAAAD,GAAa,KAAK,+BAA+Bj4C,EAAK,IAAI,EAE5E,CAAC,GAAGk4C,EAAU,GAAGD,CAAQ,EAAE,QAASvsC,GAA2B,CAC9DopC,GAAsCppC,CAAU,EAChDmpC,GAAmCnpC,CAAU,EAC7C,CACF,EACA,UAAU,CACT,KAAAY,EACA,KAAA8F,EACA,QAAAgkB,CAAA,EAKE,OACI,MAAA+hB,EAAU,KAAK,eAAe,mBAEhC,GAAAA,GAAA,MAAAA,EAAU7rC,GAAO,CACpB,KAAM,CAAE,SAAA2rC,CAAa,OAAK,+BAA+B3rC,CAAI,EAEpD2rC,EAAA,QAASvsC,GAA2B,OACxC,KAAAxE,EAAAwE,EAAW,SAAX,YAAAxE,EAAmB,kBAAmBoF,EAAM,CAC/C,MAAM8rC,EAAS,KAAK,eAAe,gCAAgC9rC,CAAI,IAAM,KAC7E+rC,GAAmC,CAClC,WAAA3sC,EACA,WAAY,CAAC4sC,EAAkC,EAC/C,WAAYF,EAAS,CAAC,SAAS,EAAI,CAAC,EACpC,iBAAkB,GAClB,CACF,EACA,EACD,MACD,CAEA,MAAMzK,EAAiBrhC,EACjBwhC,EAAa,KAAK,eAAe,cAAcH,CAAc,EAC7D4K,EAAWzK,IAAe,KAAOA,EAAW,GAAK,GAEvD,GAAI17B,IAAS,MAAQA,EAAK,SAAW,GAAKgkB,EAAS,GACjClvB,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CAC9C,OAAQqxC,CAAA,IAGA,QAAS7sC,GAA2B,CAC5CwoC,GAA8BxoC,CAAU,EACxC,EACiB8sC,GAAkC1K,EAAY,KAAK,QAAQ,EACnE,QAASjd,GAAuB,CACrCA,EAAS,SAAS,OAAS,WAC7BA,EAAS,SAA6B,oBACxC,CACA,EAED,MACD,CAEK,iBAAY,iBAAiBze,EAAM07B,CAAU,CACnD,EACA,WAAW9gC,EAAkB2jC,EAAe,GAAO8H,EAAY,GAAM,CAChE,IAAC,KAAK,mBACT,OAGD,MAAMz4C,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,GAAI,CAAChN,EACJ,OAGG2wC,GAAgB8H,GACnB,KAAK,aAAa,qBAInB,MAAMC,EAA8B,GAEpC,GAAIA,EAAkB,SAAS14C,EAAK,IAAI,EAAG,CAI1C,IAAI24C,EAAgB,GACT,UAAAC,KAAa,KAAK,MACxB,GAAAA,EAAU,OAAS54C,EAAK,MAGxB04C,EAAkB,SAASE,EAAU,IAAI,EAAG,CAC/BD,EAAA,GAChB,KACD,CAGD,GAAI,CAACA,EACJ,MAEF,CAEI34C,EAAK,OAASgB,GACZ,gBAAW,MAAM,6BAA8B,CACnD,YAAa,KAAK,eAAe,WACjC,gBAAiBhB,EAAK,OAAS83B,EAAA,CAC/B,GAEI,KAAK,cAAc,IAAI,kBAAmB,CAAE,KAAA93B,EAAM,EAClD,gBAAW,MAAM,oBAAqB,CAC1C,UAAWA,EAAK,KAChB,YAAa,KAAK,eAAe,WACjC,GAGF,IAAI64C,EAAuB,GAE3B,MAAM14C,EAAW,KAAK,eAAe,YAAYH,EAAK,KAAMA,EAAK,WAAW,EAEtEsL,EAAW,KAAK,gBAAgB,mBAAmB,EACnDsE,EAAetE,EAAS,QAAQtL,EAAK,IAAI,EAC/C,IAAI6P,EAA2D,GAC3D+S,EAA6D,GAMjE,GALIziB,IACH0P,EAAShD,GAA0BvB,EAAUsE,EAAczP,CAAQ,EACnEyiB,EAAUxB,GAA2B9V,EAAUsE,EAAczP,CAAQ,GAGlEyiB,EAAQ,SAAW,GAAK/S,EAAO,SAAW,EAAG,CAChD,KAAM,CAAE,SAAAqoC,EAAU,SAAAD,GAAa,KAAK,+BAA+Bj4C,EAAK,IAAI,EAC5E,GAAIk4C,EAAS,SAAW,GAAKD,EAAS,SAAW,EAAG,CAC7C,MAAAa,EAAQZ,EAAS,CAAC,EAClBa,EAAQd,EAAS,CAAC,EACpB,GAAAa,EAAM,QAAUC,EAAM,OAAQ,CACVF,EAAA,GACjB,MAAAlL,EAAiBmL,EAAM,OAAO,eAC9B5G,EAAwB4G,EAAM,OAAO,kBACrC3G,EAAiB4G,EAAM,OAAO,eAC9B3G,EAAuB2G,EAAM,OAAO,kBAE1C,WAAW,IAAM,OACX,qBACJpL,EACAuE,EACAC,EACAC,EACA1qC,EAAmB,MAGhBmxC,KACE3xC,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,IACjB2xC,EAAA,KAEtB,GAAG,CACP,CACD,CACD,CAEKvT,GAAS,IAAM,YAEdp+B,EAAA,sBAAAA,EAAU,kBAAkB,OAChCvC,EAAA,KAAK,WAAL,YAAAA,EAAe,mBAAmB3E,EAAK,MAAO,IAC7C,KAAK,EACL,QAAS6wB,UAAa,OAAA3pB,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe2pB,GAAS,EAG1D,oBAAe,wBAAwB7wB,CAAI,EAC3C,oBAAe,WAAWA,CAAI,EAC9B,oBAAe,uBAAuBA,EAAK,IAAI,EAE/C64C,IAEC5xC,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,IAIpC,aAAQ,wBAAwBjH,CAAI,EACrC2wC,GACH,KAAK,aAAa,kBAAkB,IAAIqI,GAAkBh5C,CAAI,CAAC,CAChE,CACA,EAEG2wC,GAAgB8H,GAEnB,WAAW,IAAM,CAChB,KAAK,aAAa,qBAFMI,EAAuB,IAAM,CAGnC,CAErB,EACA,MAAM,qBAAqB7rC,EAAkB,CACvC,wBAAmBA,EAAU,GAAM,EAAI,CAC7C,EACA,MAAM,4BAA4BhN,EAAc6L,EAAiC,CAChF,MAAM,KAAK,yBAAyB,CACnC,eAAgBA,EAChB,KAAA7L,CAAA,CACA,CACF,EACA,MAAM,WAAWgN,EAAkB,CAIlC,MAAMisC,EAAW,iBACX,WAAK,WAAWjsC,EAAUisC,CAAQ,EAClC,WAAK,WAAWA,EAAUjsC,CAAQ,CACzC,EACA,aAAa0E,EAAmC,CAC3CA,EAAc,OAAS,QAAUA,EAAc,UAG7C,KAAK,WAAWA,EAAc,SAAoBA,EAAc,KAAe,CAEtF,EACA,MAAM,iBAAiBwnC,EAAqB,CACvC,IACH,MAAMC,EAAwB,KAAK,OAClC,KAAK,QAAQ,SAAS,yBAAyB,EAAI,IACnD,KAAK,QAAQ,SAAS,4BAA4B,EAAI,KAAKD,CAAW,GACtE,CACC,YAAa,gBACb,kBAAmB,KAAK,QAAQ,SAAS,wBAAwB,EACjE,iBAAkB,KAAK,QAAQ,SAAS,wBAAwB,EAChE,kBAAmB,KAAK,QAAQ,SAAS,6BAA6B,EACtE,WAAYA,CACb,GAID,MAAM,KAAK,YAGL,MAAAE,EAAY,SAAS,cAAc,iCAAiC,EAGtEA,IACHA,EAAU,MAAM,EAChBA,EAAU,OAAO,GAGlB,MAAMC,EAAkB,MAAMF,EAE9B,IAAIE,GAAA,YAAAA,EAAgB,UAAWhrC,GAAe,OAE9C,MAAM,KAAK,WAAW6qC,EAAaG,EAAe,MAAO,EAAI,OAClD,CAAC,CACd,EACA,MAAM,WAAWH,EAAqBI,EAAiB3I,EAAe,GAAO,OAC5E,GAAIuI,IAAgBI,EACnB,OAGD,KAAK,oCAAsC,GACvC3I,GACH,KAAK,aAAa,qBAInB,MAAMtY,IADiBnxB,EAAA,KAAK,aAAL,YAAAA,EAAiB,QACJgyC,EAChC7gB,IACH,KAAK,eAAiB,IAGbihB,EAAA,KAAK,eAAeA,CAAO,EAGrC,MAAMhuC,EAAW,KAAK,gBAAgB,mBAAmB,EAAI,EACpDA,EAAA,WAAW4tC,EAAaI,CAAO,EAEpC3I,GACH,KAAK,aAAa,kBAAkB,IAAIl/B,GAAkBynC,EAAaI,CAAO,CAAC,EAIhF,KAAK,eAAe,+BAA+B,CAAE,IAAKJ,EAAa,IAAKI,EAAS,EAGrF,KAAK,oBAAoB,EAEzB,KAAK,eAAe,qBAAqB,CAAE,cAAe,EAAO,GACjE,KAAK,eAAe,eAAe,CAAE,cAAe,GAAO,cAAe,GAAM,EAGhF,MAAM,KAAK,YAGL,WAAK,SAAS,OAAO,OAAOhuC,EAAS,KAAK,EAAGA,EAAS,wBAAyB,EAAK,EAG1F,KAAK,iBAAiB,EACtB,KAAK,mBAAmBguC,CAAO,EAE3BjhB,IACH,KAAK,SAAS,eAAiBihB,EAC/B,KAAK,eAAiB,IAGnB3I,GACH,KAAK,aAAa,oBAEnB,KAAK,oCAAsC,EAC5C,EACA,qBAAsB,SAEjB,KAAK,YACRzpC,EAAA,KAAK,WAAL,MAAAA,EAAe,QACf,OAAO,QAAOvC,EAAA,KAAK,WAAL,YAAAA,EAAe,kBAAkB,EAC7C,QAASksB,GAAaA,CAAQ,EAC9B,QAASA,GAAaA,EAAS,SAAS,EAE1C,KAAK,SAAS,sBAAsB,CAAE,UAAW,EAAM,GAEzD,EACA,iBAAiB7wB,EAAe,CAC1BA,EAAK,aAGH,eAAQA,EAAK,WAAW,EAAE,QAChC,CAAC,CAACu5C,EAAoBC,CAAe,IAAyC,CAC7E,MAAMC,EAAoB,KAAK,iBAAiB,qBAAqBF,CAAkB,EAWvF,GARI,OAAOC,GAAoB,WACZA,EAAA,CACjB,GAAI,KACJ,KAAMA,CAAA,EAEP,KAAK,mBAAqB,IAGvBA,EAAgB,GAAI,CAEjB,MAAAE,EAAgBF,EAAgB,GAAG,SAAS,EAC5CG,EAAmBF,EAAkB,KACzCG,GAAqCA,EAAW,KAAOF,CAAA,EAEzD,GAAIC,EAAkB,EAEpBA,EAAiB,OAASH,EAAgB,MAC1C,OAAOA,EAAgB,IAAO,YAEzBx5C,EAAA,YAAau5C,CAAkB,EAAI,CACvC,GAAII,EAAiB,GACrB,KAAMA,EAAiB,MAExB,KAAK,mBAAqB,IAE3B,MACD,CACD,CAGK35C,EAAA,YAAau5C,CAAkB,EAAIC,EAGxC,MAAMK,EAAqBJ,EAAkB,OAC3CG,GAAqCA,EAAW,OAASJ,EAAgB,MAIvEK,EAAmB,SAAW,IACjC75C,EAAK,YAAau5C,CAAkB,EAAE,GAAKM,EAAmB,CAAC,EAAE,GACjE,KAAK,mBAAqB,GAE5B,EAEF,EACA,MAAM,SAAS/4C,EAAkBisC,EAA4B4D,EAAe,GAAO,SAC9E,KAAC7vC,GAAA,MAAAA,EAAO,QACX,OAED,KAAK,iBAAmB,GAIxB,MAAM,KAAK,oBACVA,EAAM,IAAKd,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAIjE,IAAAG,EACEW,EAAA,QAASd,GAAS,CAkBvB,GAjBKA,EAAK,KACTA,EAAK,GAAK+lC,MAGX5lC,EAAW,KAAK,eAAe,YAAYH,EAAK,KAAMA,EAAK,WAAW,EAGjEA,EAAK,eAAe,UAAU,IAClCA,EAAK,SAAW,IAGZA,EAAK,eAAe,YAAY,IACpCA,EAAK,WAAa,IAKfG,IAAa,KAAM,CACtB,IAAI2R,EAAiB,KACjB,IACHA,EAAiBC,GAChB5R,EAAS,WACTH,EAAK,WACL,GACA,GACAA,CAAA,QAEOgD,EAAG,CACH,cACP,KAAK,QAAQ,SAAS,yDAAyD,EAC9E,MAAMhD,EAAK,IAAI,KAEjB,QAAQ,MAAMgD,CAAC,CAChB,CACAhD,EAAK,WAAa8R,IAAmB,KAAOA,EAAiB,GAI5D,CAAChE,GAAmBpF,EAAsB,EAAE,SAAS1I,EAAK,IAAI,GAC9DA,EAAK,WAAW,OAAS,KAEpBA,EAAA,WAAW,KAAOA,EAAK,UAE9B,CAGA,KAAK,iBAAiBA,CAAI,EACrB,oBAAe,QAAQA,CAAI,EAC5B2wC,GACH,KAAK,aAAa,kBAAkB,IAAImJ,GAAe95C,CAAI,CAAC,CAC7D,CACA,EAGD,MAAM,KAAK,aAENkH,EAAA,sBAAAA,EAAU,kBAAkB,IAE7B6lC,GACG,WAAK,eAAeA,CAAW,EAGtC,KAAK,YAAY,oBACjB,KAAK,YAAY,yBACjB,KAAK,qBAAqB,EAC1B,KAAK,iBAAmB,IAGnBpoC,EAAA,sBAAAA,EAAU,kBAAkB,GAAO,GACzC,EACA,MAAM,eAAeooC,EAA2B,CAC/C,MAAMgN,EAA2D,GAEjE,UAAWjM,KAAcf,EACb,UAAAp+B,KAAQo+B,EAAYe,CAAU,EACxCf,EAAYe,CAAU,EAAEn/B,CAAI,EAAE,QAAQ,CAACqrC,EAAoBC,IAAgB,CACtED,GACgBA,EAAA,QAASE,GAAe,CAC1CH,EAAsB,KAAK,CAC1B,CAAE,KAAMjM,EAAY,KAAAn/B,EAAM,MAAOsrC,CAAY,EAC7C,CAAE,KAAMC,EAAW,KAAM,KAAMA,EAAW,KAAM,MAAOA,EAAW,KAAM,EACxE,EACD,CACF,CACA,EAKG,WAAK,uBAAuBH,CAAqB,EAC5C,gBAAK,sBAAuB,CAAC,CACzC,EAEA,MAAM,uBAAuBA,EAA0D,CAGtF,QAASx5B,EAAI,EAAGA,EAAIw5B,EAAsB,OAAQx5B,GAAK,IACxCw5B,EAAsB,MAAMx5B,EAAGA,EAAI,GAAS,EAEpD,QAASiyB,GAAmB,CACjC,KAAK,gBAAgBA,CAAc,EACnC,CAEH,EAEA,MAAM,mBAAmBpgC,EAAyD,CAOjF,MAAM+nC,EAEF,GACEC,EAAyB,GAE3B,IAAChoC,EAAK,MAET,MAAM,IAAI,MAAM,KAAK,QAAQ,SAAS,4BAA4B,CAAC,EAK9D,MAAAioC,EAAiB,KAAK,gBAAgB,qBAAqB,EAE7D,IAAAC,EACAhB,EACJ,MAAMiB,EAAuB,GAE7B,MAAM,KAAK,oBACVnoC,EAAK,MAAM,IAAKpS,IAAU,CAAE,KAAMA,EAAK,KAAM,QAASA,EAAK,WAAc,KAGrEoS,EAAA,MAAM,QAASpS,GAAS,CAC5B,GAAIq6C,EAAer6C,EAAK,IAAI,IAAM,OAC7B,GAAAq6C,EAAer6C,EAAK,IAAI,EAAE,OAASq6C,EAAer6C,EAAK,IAAI,EAAE,IAAK,CAKvDm6C,EAAAn6C,EAAK,IAAI,EAAIq6C,EAAer6C,EAAK,IAAI,EAAE,UAAU,CAAC,EAChE,YAKeq6C,EAAAr6C,EAAK,IAAI,EAAE,OAAS,EAIrCs6C,EAAUt6C,EAAK,KAEf,MAAMw6C,EAAY,KAAK,OAAO,iBAAiBx6C,EAAK,KAAMA,EAAK,IAAI,EAEzDs5C,EAAA,KAAK,eAAekB,EAAWJ,CAAY,EAErDA,EAAa,KAAKd,CAAO,EACzBa,EAAcG,CAAO,EAAIhB,EAEzBiB,EAAY,KAAKv6C,CAAI,EACrB,EAGD,MAAMy6C,EAA+B,GAC/BC,EAAqBtoC,EAAK,YAC1BuoC,EAAkBJ,EAAY,IAAKv6C,GAASA,EAAK,IAAI,EACvD,IAAA8tC,EAAYn/B,EAAMsrC,EAAaW,EAAiBpI,EACpD,IAAK1E,KAAc,OAAO,KAAK4M,CAAkB,EAAG,CACnD,GAAI,CAACC,EAAgB,SAAS7M,CAAU,EAEvC,SAGD,MAAMpiC,EAA+B,GAErC,IAAKiD,KAAQ,OAAO,KAAK+rC,EAAmB5M,CAAU,CAAC,EAGrD,IAFUpiC,EAAAiD,CAAI,EAAI,GAElBsrC,EAAc,EACdA,EAAcS,EAAmB5M,CAAU,EAAEn/B,CAAI,EAAE,OACnDsrC,IACC,CACD,MAAMY,EAAwB,GAC9B,GAAIH,EAAmB5M,CAAU,EAAEn/B,CAAI,EAAEsrC,CAAW,EAElD,IAAAW,EAAkB,EAClBA,EAAkBF,EAAmB5M,CAAU,EAAEn/B,CAAI,EAAEsrC,CAAW,EAAE,OACpEW,IAEApI,EAAiBkI,EAAmB5M,CAAU,EAAEn/B,CAAI,EAAEsrC,CAAW,EAAEW,CAAe,EAC7ED,EAAgB,SAASnI,EAAe,IAAI,GAKjDqI,EAAsB,KAAKrI,CAAc,EAIhC9mC,EAAAiD,CAAI,EAAE,KAAKksC,CAAqB,CAC5C,CAGDJ,EAAe3M,CAAU,EAAIpiC,CAC9B,CAIA,MAAMovC,EAAyB,KAAK,gBAAgB,YAAYP,EAAaE,CAAc,EAG3F,IAAKH,KAAWH,EACXG,IAAYH,EAAcG,CAAO,GAIrCQ,EAAa,WAAWR,EAASH,EAAcG,CAAO,CAAC,EAGxD,GAAIloC,EAAK,QAAS,CACjB,IAAI2oC,EAAiB,GACrB,UAAW/tC,KAAY,OAAO,KAAKoF,EAAK,OAAO,EAAG,CAEjD,GAAI,CAAC2oC,EAAgB,CACf,eACJ,IAAI,MAAM,KAAK,QAAQ,SAAS,wCAAwC,CAAC,EACzE,KAAK,QAAQ,SAAS,kCAAkC,GAEzD,QACD,CAEA,MAAM/6C,EAAO86C,EAAa,MAAMX,EAAcntC,CAAQ,CAAC,EACnD,IACuB5L,GAAcpB,CAAI,EAC1B,QAAQoS,EAAK,QAAQpF,CAAQ,EAAG,WAAW,EAC5C+tC,EAAA,SACT7sC,EAAO,CACE6sC,EAAA,GACjB,QAAQ,MAAM7sC,CAAK,CACpB,CACD,CACD,CAGA,YAAK,aAAa,qBAClB,MAAM,KAAK,SACV,OAAO,OAAO4sC,EAAa,KAAK,EAChCA,EAAa,wBACb,IAGD,KAAK,aAAa,oBAElB,KAAK,QAAQ,aAAe,GAErB,CACN,MAAO,OAAO,OAAOA,EAAa,KAAK,EACvC,YAAaA,EAAa,wBAE5B,EACA,MAAM,eAAeh6C,EAAwC,CAC5D,MAAMsR,EAAsB,CAC3B,MAAO,CAAC,EACR,YAAa,CAAC,EACd,QAAS,CAAC,GAIP,IAAA/G,EACJ,MAAM2vC,EAA4B,GAElC,UAAWh7C,KAAQc,EAAO,CACduK,EAAA,KAAK,gBAAgB,kBAAkBrL,CAAI,EACtCg7C,EAAA,KAAKh7C,EAAK,IAAI,EAEzBoS,EAAA,MAAM,KAAK/G,CAAQ,EAExB,MAAM4vC,EAAiB,KAAK,eAAe,kBAAkBj7C,EAAK,IAAI,EAKtE,GAJIi7C,IACE7oC,EAAA,QAASpS,EAAK,IAAI,EAAIi7C,GAI3B5vC,EAAS,aACT,KAAK,cAAc,2BAA2BwiB,GAAyB,OAAO,EAC7E,CACK,MAAAF,EAAkB,KAAK,eAAe,gBAC5CtiB,EAAS,YAAc,OAAO,YAC7B,OAAO,QAAQA,EAAS,WAAW,EAAE,OAAO,CAAC,CAACstB,EAAG1oB,CAAU,IAAM,OAE/D,OAAAA,EAAW,KACV,CAAC0d,EAAgB1d,EAAW,EAAE,KAC9B/I,EAAAymB,EAAgB1d,EAAW,EAAE,IAA7B,YAAA/I,EAAgC,uBAElC,EAEH,CACD,CAGA,IAAIg0C,EACHnO,EACAp+B,EACAisC,EACAX,EACAzH,EACA2I,EAEI,OAAA/oC,EAAA,MAAM,QAASpS,GAAS,CAE5B,GADA+sC,EAAc,KAAK,eAAe,8BAA8B/sC,EAAK,IAAI,EACrE,OAAO,KAAK+sC,CAAW,EAAE,SAAW,EAKxC,CAAAoO,EAAkB,GAClB,IAAKxsC,KAAQ,OAAO,KAAKo+B,CAAW,EACnC,IAAKkN,EAAc,EAAGA,EAAclN,EAAYp+B,CAAI,EAAE,OAAQsrC,IAAe,CAG3E,IAFDiB,EAAmB,GAElBN,EAAkB,EAClBA,EAAkB7N,EAAYp+B,CAAI,EAAEsrC,CAAW,EAAE,OACjDW,IAEApI,EAAiBzF,EAAYp+B,CAAI,EAAEsrC,CAAW,EAAEW,CAAe,EAC3DI,EAAgB,QAAQxI,EAAe,IAAI,IAAM,IACpD0I,EAAiB,KAAK1I,CAAc,EAIlC0I,EAAiB,SACfC,EAAgB,eAAexsC,CAAI,IACvBwsC,EAAAxsC,CAAI,EAAI,IAETwsC,EAAAxsC,CAAI,EAAEsrC,CAAW,EAAIiB,EAEvC,CAGG,OAAO,KAAKC,CAAe,EAAE,SAC3B/oC,EAAA,YAAYpS,EAAK,IAAI,EAAIm7C,GAC/B,CACA,EAEM/oC,CACR,EACA,gBAAiB,CAYhB,GAXA,KAAK,eAAe,gBAEpB,KAAK,oBAAoB,CAAE,iBAAkB,EAAO,GAC/C,sBAAiB,aAAa,EAAK,EACxC,KAAK,YAAY,YAGjB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EAGrB,KAAK,2BACJ,IACE,KAAK,eAAe,kBAAkB,KAAK,eAAe,UAAU,OAC1D,CAAC,CAElB,KAAK,eAAe,aACf,aAAQ,mBAAmB,iBAAiB,EAEjD,KAAK,QAAQ,qBACb,KAAK,QAAQ,uBAAyB,CAAC,EAAG,CAAC,EAE3C,KAAK,mBAAqB,EAC3B,EACA,MAAM,qBAAqC,CACpC,WAAK,eAAe,sBAC3B,EACA,MAAM,eAA+B,CAC9B,WAAK,eAAe,cAC3B,EACA,MAAM,qBAAqC,CACpC,WAAK,iBAAiB,qBAAqB,EAAI,CACtD,EACA,MAAM,iBAAiC,CAChC,WAAK,iBAAiB,qBAC7B,EACA,MAAM,eAA+B,CAC9B,WAAK,kBAAkB,mBAC9B,EACA,MAAM,aAA6B,CAC5B,WAAK,qBAAqB,iBACjC,EACA,MAAM,oBAAoBgpC,EAAkD,CACrE,MAAApW,EAAmC,KAAK,eAAe,aAEvDqW,EAA2C,GACxCrW,EAAA,QAAShlC,GAAS,CACpB,MAAAs7C,EAAe,MAAM,QAAQt7C,EAAK,OAAO,EAAIA,EAAK,QAAU,CAACA,EAAK,OAAO,EAE5Eo7C,EAAU,KAAM/6C,GAAMA,EAAE,OAASL,EAAK,MAAQs7C,EAAa,SAASj7C,EAAE,OAAO,CAAC,GAChF,CAACL,EAAK,eAAe,YAAY,GAEjCq7C,EAAiB,KAAK,CACrB,KAAMr7C,EAAK,KACX,QAAS,MAAM,QAAQA,EAAK,OAAO,EAAIA,EAAK,QAAQ,MAAM,EAAE,EAAE,CAAC,EAAIA,EAAK,QACxE,CACF,CACA,EAEGq7C,EAAiB,OAAS,IAE7B,KAAK,YAAY,eACX,WAAK,eAAe,oBAAoBA,CAAgB,EAC9D,KAAK,YAAY,cAEnB,EACA,MAAM,sBAAsBt+B,EAAuB,SAC9C,MAACA,GAAW,OAAOA,EAAQ,MAAS,UAAY,GAACpY,GAAAuC,EAAA6V,EAAQ,OAAR,YAAA7V,EAAc,WAAd,MAAAvC,EAAA,KAAAuC,EAAyB,eAG1E,IACH,MAAMsb,EAAO,KAAK,MAAMzF,EAAQ,IAAI,EAChC,GAAAyF,GAAQA,EAAK,UAAY,eACxB,IACG,WAAK,oBAAoBA,CAAI,EAC9B,gBAAaA,EAAK,YAAc,GAChC,oBAAiBA,EAAK,gBAAkB,GAC7C,KAAK,mBAAqB,SAClBxf,EAAG,CACP,OAAO,KACV,OAAO,IAAI,YACV,KAAK,UAAU,CACd,QAAS,QACT,QAAS,KAAK,QAAQ,SAAS,kCAAkC,EACjE,EACD,KAGF,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,kCAAkC,EAC/D,QAAUA,EAAY,QACtB,KAAM,QACN,CACF,SACUwf,GAAQA,EAAK,UAAY,gBAC/B,IAGE,kCAA+BA,EAAK,gBAAkB,SAErD,WAAK,cAAcA,EAAK,WAAW,EACpC,gBAAaA,EAAK,YAAc,GAChC,oBAAiBA,EAAK,gBAAkB,GAC7C,KAAK,mBAAqB,SAClBxf,EAAG,CACP,OAAO,KACV,OAAO,IAAI,YACV,KAAK,UAAU,CACd,QAAS,QACT,QAAS,KAAK,QAAQ,SAAS,wCAAwC,EACvE,EACD,KAGF,KAAK,YAAY,CAChB,MAAO,KAAK,QAAQ,SAAS,wCAAwC,EACrE,QAAUA,EAAY,QACtB,KAAM,QACN,CACF,MACUwf,GAAA,YAAAA,EAAM,WAAY,uBACvB,qBAAgB,gBAAkBA,EAAK,gBAElC,CAAC,CACd,EACA,MAAM,0BAA0BpQ,EAAmB,CAClD,MAAM,KAAK,mBAAmBA,EAAK,KAA6B,MAAM,CACvE,EACA,MAAM,yBAAyBA,EAAmB,CACjD,MAAMk5B,EAAe,MAAM,KAAK,uBAAuBl5B,EAAK,GAAa,EACrEk5B,IAAiB,QACd,WAAK,mBAAmBA,EAAc,KAAK,CAEnD,EACA,sBAAsB6M,EAAmB,CACxC,OAAO,KAAKA,CAAO,EAAE,QAASnrC,GAAa,OAC1C,MAAMhN,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,GAAI,CAAChN,EACJ,OAGD,MAAMo4C,EAAS,KAAK,eAAe,gCAAgCprC,CAAQ,IAAM,KAC3EuuC,EAAa,CAAC,QAAQ,EAExBnD,GACHmD,EAAW,KAAK,SAAS,IAINr0C,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,OAAQlH,EAAK,MAGF,QAAS0L,GAAe,CACnC8vC,GAAyC9vC,EAAY,CACpD,MAAOysC,EAAQnrC,CAAQ,EAAE,OACzB,WAAY,EACZ,WAAAuuC,CAAA,CACA,EACD,EACD,CACF,EACA,yBAAyBpD,EAAmB,CAC3C,OAAO,KAAKA,CAAO,EAAE,QAASnrC,GAAa,OAC1C,MAAMhN,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,GAAI,CAAChN,EACJ,OAIK,MAAA+sC,GAAc7lC,EAAA,KAAK,WAAL,YAAAA,EAAe,eAAe,CACjD,OAAQlH,EAAK,KAGT,cAAS,kBAAkB,EAAI,EACxB+sC,EAAA,QAAQmH,EAA6B,EAC5C,cAAS,kBAAkB,GAAO,EAAI,EAC3C,CACF,EACA,oBAAoB,CAAE,OAAApyB,EAAQ,iBAAA25B,EAAkB,gBAAAC,GAA6C,CAC5F,GAAID,IAAqB,KAAK,iBAAkB,OAE3CC,IACcA,EAAA,KAAK,gBACpB/a,GACAhD,IAIC,sBAAiB,gBAAgB+d,CAAe,EAErD,KAAK,iBAAmBD,EAEpB,IAAAE,EACI,YAAK,iBAAiB,aAAc,CAC3C,KAAKrc,GACGqc,EAAA,KACP,MACD,KAAKhb,GACGgb,EAAA,UACP,MACD,QACQA,EAAA,SACT,CAEIF,GAAuB,sBAAiB,cAAc35B,CAAM,EAC3D,KAAK,cAAc,IAAI,mCAAoC,CAC/D,OAAAA,EACA,KAAA65B,EACA,iBAAAF,CAAA,CACA,EACI,gBAAW,gBAAgB,mCAAoC,CACnE,OAAA35B,EACA,KAAA65B,EACA,iBAAAF,EACA,YAAa,KAAK,eAAe,WACjC,CACF,EACA,MAAM,WACL,CAAE,MAAA36C,EAAO,YAAAisC,CACT,EAAA6O,EAAc,GACdl9C,EACC,CACD,IAAIm9C,EAAkBn9C,EACX,UAAE,KAAAiQ,EAAM,UAAAiiC,EAAW,KAAAtkC,EAAM,WAAAwvC,EAAY,SAAUC,KAAkBj7C,EAAO,CAClF,MAAM,KAAK,QACV6N,EACA,CAAE,SAAUotC,GAAgBF,EAAiB,YAAAD,EAAa,KAAAtvC,CAAK,EAC/DwvC,GAAc,GACd,GACAlL,CAAA,EAGD,MAAMoL,EAAgB,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EACpCH,EAAA,CACjBG,EAAc,SAAS,CAAC,EAAIrM,GAA0B,EAAIrF,GAC1D0R,EAAc,SAAS,CAAC,EAE1B,CAEA,MAAMC,EAAiB,KAAK,MAAM,OAASn7C,EAAM,OACjD,SAAW,CAAE,KAAAknC,EAAM,GAAAD,CAAG,IAAKgF,EAAa,CACvC,MAAMmP,EAAW,KAAK,MAAMD,EAAiBjU,EAAK,SAAS,EACrDmU,EAAS,KAAK,MAAMF,EAAiBlU,EAAG,SAAS,EAElD,qBACJmU,EAAS,KACTlU,EAAK,aAAe,EACpBmU,EAAO,KACPpU,EAAG,YAAc,EACjBrgC,EAAmB,KAErB,CAEA,MAAMs0C,EAAgB,KAAK,MAAM,KAAK,MAAM,OAAS,CAAC,EAEhDI,EADW,KAAK,gBAAgB,mBAAmB,EACzB,sBAAsBJ,EAAc,KAAM,CAAC,EAGvEI,EAAe,OAAS,GAC3BA,EAAe,MAAM,CAAC,EAAE,QAAQ,CAACp8C,EAAMuE,IAAU,CAChD,MAAM83C,EAAS,KAAK,eAAe,cAAcr8C,EAAK,IAAI,EACrDq8C,GAEL,KAAK,WAAW,CACf,SAAUA,EAAO,KACjB,SAAU,CAACA,EAAO,SAAS,CAAC,EAAGA,EAAO,SAAS,CAAC,EAAI,KAAO93C,EAAQ,EAAE,EACrE,EACD,EAGF,KAAK,sBAAsB,KAAK,eAAe,oBAAuB,CAAe,EACtF,EAEA,MAAM,4BAA4B+3C,EAAsB,CACjD,WAAK,gBAAgB,sBAChBA,GAAA,MAAAA,GACZ,EACA,uCAAuCC,EAAkB,CACxD,KAAK,oCAAsCA,CAC5C,EACA,WAAW,CAAE,SAAAvvC,EAAU,SAAAtO,GAA8D,CAC/E,oBAAe,qBAAqB,CAAE,KAAMsO,EAAU,WAAY,CAAE,SAAAtO,CAAS,EAAG,EACrF,MAAMsB,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACvD,WAAW,IAAM,OACZhN,KACHkH,EAAA,KAAK,WAAL,MAAAA,EAAe,oBACf,KAAK,YAAYlH,CAAI,IAEpB,CAAC,CACL,EACA,gBAAgB,CAAE,KAAAA,GAAiC,CAC7C,gBAAWA,EAAK,KAAM,EAAK,CACjC,EACA,MAAM,mBAAmB,CAAE,KAAAA,GAA0C,CACnD,KAAK,eAAe,SAAS,MAAM,KAAMK,GAAMA,EAAE,KAAOL,EAAK,EAAE,IAMhFA,EAAK,GAAK+lC,KACV,MAAM,KAAK,SAAS,CAAC/lC,CAAI,CAAC,EAC3B,EACA,sBAAsB,CAAE,WAAA0L,GAA0D,CACjF,KAAK,oCAAsC,GACtC,wBAAmBA,EAAY,EAAI,EACxC,KAAK,oCAAsC,EAC5C,EACA,MAAM,yBAAyB,CAAE,WAAAA,GAA0D,CAC1F,KAAK,oCAAsC,GAC3C,KAAK,gBAAgBA,CAAU,EAC/B,KAAK,oCAAsC,EAC5C,EACA,MAAM,mBAAmB,CAAE,YAAAwtC,EAAa,QAAAI,GAAqD,CACtF,WAAK,WAAWA,EAASJ,CAAW,CAC3C,EACA,qBAAqB,CAAE,SAAAlsC,EAAU,WAAAwvC,GAAyD,CACzF,MAAMx8C,EAAO,KAAK,eAAe,cAAcgN,CAAQ,EACnDhN,GACH,KAAK,YAAY,aAAa,CAACA,CAAI,CAAC,CAEtC,EACA,WAAW,EAAwB,CAE9B,EAAE,WACL,KAAK,YAAY,aAEnB,EACA,uBAAwB,CAEtB,KAAK,aACL,CAACyrB,EAAM,aAAcA,EAAM,eAAe,EAAE,SAAS,KAAK,OAAO,IAAI,GAEhE,KAAK,UAAU,SAAY,CAC/B,KAAK,eAAe,EACpB,KAAK,QAAQ,aAAe,GAE5B,MAAM,KAAK,QAAQ,QAAQ,CAAE,KAAMA,EAAM,UAAW,EACpD,CAEH,EACA,MAAM,uBAAwB,CACzB,KAAK,OAAO,OAASA,EAAM,kBACzB,cAAS,KAAK,aAAc,OAAO,EACnC,KAAK,eAAe,gBACxB,MAAM,KAAK,mBAAmB,KAAK,OAAO,OAAO,WAAqB,EACtE,KAAK,eAAe,cAAgB,IAGvC,EACA,oBAAoBlqB,EAA2BT,EAAsB,CACpE,OAAQS,EAAQ,CACf,IAAK,OACJ,KAAK,UAAUT,CAAK,EACpB,MACD,IAAK,SACJ,KAAK,YAAYA,CAAK,EACtB,MACD,IAAK,YACC,KAAK,eAAeA,CAAK,EAC9B,MACD,IAAK,UACJ,KAAK,UAAUA,EAAM,CAAC,EAAE,KAAM,8BAA8B,EAC5D,MACD,IAAK,OACJ,KAAK,SAAS,eAAiBA,EAAM,CAAC,EAAE,KACxC,MACD,IAAK,SACC,KAAK,iBAAiBA,EAAM,CAAC,EAAE,IAAI,EACxC,MACD,IAAK,oBACJ,KAAK,sBAAsBA,CAAK,EAChC,MACD,IAAK,aACC,oBAAeA,EAAO,cAAc,EACzC,MACD,IAAK,WACJ,KAAK,oBAAoB,CACxB,OAAQypC,GAA0B,aAClC,iBAAkB,CAAC,KAAK,iBAAmB,CAAC,KAAK,YACjD,EACD,MACD,IAAK,aACC,KAAK,WAAW,CAAE,MAAO,CAAC,CAAE,KAAMvpC,GAAkB,EAAG,YAAa,EAAI,GAC7E,MACD,IAAK,aACJ,KAAK,eAAe,EACpB,MACD,IAAK,eACJ,KAAK,iBAAiB,EACtB,KACF,CACD,CACD,EACA,MAAM,qBAAsB,CAC3B,IAAI02C,EAAa,KACb,KAAK,OAAO,OAAO,OACTA,EAAA,KAAK,OAAO,OAAO,MAG7B,IAGH,GAFA,MAAM,QAAQ,IAAI,CAAC,KAAK,gBAAgB,EAAG,KAAK,gBAAiB,KAAK,UAAU,UAAU,CAAC,EAEvFA,IAAe,MAAQ,CAAC,KAAK,QAAQ,aAAc,CACtD,MAAMpsC,EACL,MAAM,KAAK,eAAe,cAAcosC,CAAU,EAC/CpsC,IACE,cAASA,EAAS,KAAM,MAAM,EAC7B,WAAK,aAAaA,CAAQ,EAElC,QACQ4C,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CACD,CACD,CAAC,mJA57JDlF,GAAA,gBA4HgDC,GAAM,kVA3HrD4sB,GA4MM,SA5M2B,OAAA5wB,EAAA,EAAQC,EAAA,6BACxC,MA0MMC,EAAAC,EAAA,kBAxMCQ,EAAA,OACN,oBACC,qCACA,eAAI,4BAAAP,EAAA,MAAAA,EAAA,QAAAC,IAAAF,EAAA,YAAAA,EAAA,cAAAE,CAAA,sBAEL,EAgFM,IAAAA,IAAAF,EAAA,QAAAA,EAAA,UAAAE,CAAA,KA5EOgP,GAAArP,EAAA,EAAoBC,EAAA,OAC/B,QAAU,CAAE,oBAAAE,EAAA,kBACZ,eAAQ,oBACR,aAASC,EAAEsjC,+BAAcvjC,EAAdujC,iBACX,WAAStjC,EAAE,KAAAA,EAAA,OAAAC,IAAAF,EAAA,SAAAA,EAAA,WAAAE,CAAA,GACX,YAAOD,oBAAED,EAAO,2BAAAA,EAAA,6BAAAE,CAAA,GAChB,YAAWD,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAE4qB,WAAW5qB,EAAK,UAAhB4qB,OACb,UAAK3qB,EAAA,KAAAA,EAAA,OAAAC,IAAEvD,EAAY,SAAAqD,EAAA,QAAW,GAAvBrD,oFAER,QAKEsD,EAAA,KAAAA,EAAA,OAAAC,IAAAF,EAAA,yBAAAA,EAAA,2BAAAE,CAAA,KAHKM,EAAA,OACL,0BACD,mCAAAkQ,GAAA1Q,EAAA,iBAED,uCACC,KAAG,GACcQ,EAAA,OACjB,eACC,IAAK,cACN,wBAAAkQ,GAAA1Q,EAAA,eAEA,6BAnCLkP,EAAA/O,EAsCck3C,EAAoB,CAC3B,sBACA,SAAU16C,EAAY,sBACvB,eAAa,CAAmBqD,EAAA,iBAAAA,EAAA,0BAC/B,SAAOs3C,sCACP,eAAY,4BAAAt3C,EAAA,wCAPLu3C,EAAmB,0HAS5B,CAAAx4B,GAAA/e,EAAA,0BAEU,EAAW,EAAAF,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,cAAAiG,IACbpG,EAAA,EAAaiB,EAAA02C,EAAA,CACnB,IAAcj5B,eACd,KAAU/f,OACV,eAAaqK,EAAcA,+BAC3B,SAAY7I,EAAA,SACZ,cAAAA,EAAA,YAA+BA,EAAEspB,WAA4B,OAAArjB,EAAA,KAC7D,eAAUwxC,iBACV,kCAAyBC,+BACzB,SAAA13C,EAAA,sBACA,yBAAoBnC,cACpB,mBAAe85C,iBACf,mBAAeC,mBACf,eAAcC,uBACd,eAAOC,qBACP,cAAKC,YACL,QAAW/3C,EAAA,YACX,MAAAA,EAAA,uBAAAC,EAAA,KAAAA,EAAA,GAAAiH,GAAAlH,EAAA,WAAAkH,EAAA,KAEU,oBAAcjH,EAGtB,KAAAA,EAAA,GAAArF,GAAAoF,EAAA,uBAAApF,CAAA,MADD,iBAAA2F,EAAA,KApERC,EAAA,oBAAAG,EAAAX,EAAA,oFAAA4D,EAAA,sBAwEK,eAeE,uBAvFP,eAyE2Bo0C,kCAAJ,6JACR,EAAa,EAAAl4C,EAAA+E,GAAA,KAAAC,GAAA9E,EAAA,iBAAAi4C,IACfp4C,EAAA,EAAeiB,EAAAo3C,EAAA,CACrB,OAAQD,EAAER,YACV,KAAcl5B,OACd,SAAU/f,wBACV,eAAaqK,EAAcA,+BAC3B,SAAA7I,EAAA,SACA,YAAWm4C,CAAS,CAAAn4C,EAAA,YAAAA,EAAA,kBAAAi4C,EAAA,KACpB,kBAAcG,gBACd,YAAkBp4C,EAAA,UAClB,eAAe23C,iBACf,mBAAeC,mBACf,eAAW53C,EAAA,oCAAAA,EAAA,6PAIf,CAUEyxB,EAAAzxB,EAAA,oBARUq4C,EAAc,CACxB,YAAiC/uB,iCACjC,SAAagvB,iBACb,kCAAsBrvB,+BACtB,aAAAjpB,EAAA,WACA,qBAAewP,uBACf,4BAAgB+oC,8BAChB,eAAAv4C,EAAA,6BAAAA,EAAA,qCAEFA,EAIW,wBAzGd,KAwGU,+LAAAH,IAAAiB,EAAAqgB,GAAA,cAFK5gB,EAtGf,KAAAC,EAAA,OAuGK,MAAkCT,EAAAC,EAAA,4CAvGvC,eA4GYue,MAAe4C,GAAKlC,MAD5B,QAAA1e,EAAA,KA3GJ,CAAAP,EAAA,kBAAAA,EAAA,aAAAH,MA6G0Bw2C,EAAgB,CACpC,MACA,qBAAqBmC,mBACrB,kBAAWC,0DAhHjB,WAAAz4C,EAAA,iGAAAe,EAAA,qBAoHsBD,EAAAqgB,GAAA,cAAA5gB,EAAA,KApHtBJ,EAAAu4C,CAAA,YAuHI74C,IAAAiB,EAA6CqgB,GAA/B,cAAA5gB,EAAA,KAvHlBJ,EAAAw4C,EAAA,UAAA34C,EAAA,0DA0HImhB,GAAuF,MAAhEy3B,wHA1H3B,KA4Her6B,OAEHs6B,uBAAgB,mBADxB,MAqBOh1C,GAAA,CAAA7D,EAlJX,mBAoJI,GAQE,SA7BUF,EAAA,QACV,MACA,aAAKG,EAAE,MAAAA,EAAA,IAAAmB,GAAApB,EAAA,2CAAAC,EAAA,MAAAA,EAAA,IAAAmB,GAAApB,EAAA,8BAER,QAc0BC,EAAA,MAAAA,EAAA,QAAAC,IAAAF,EAAA,qBAAAA,EAAA,uBAAAE,CAAA,OAZd44C,EAA8B,OAAA94C,EAAA,cArI/C,SAgJQ,kCARAO,EAASw4C,OACFC,EAAa,CACrB,QAAKh5C,EAAO,gBACZ,MAAKA,EAAA,cACL,KAAK,QACJ,aACD,eACC,SA/IRA,EAAA,8KA4JMA,EA5JN,uBAsJiBc,EAAAO,EAAA,CACZ,IAAI,EACJ,MAAK,OACL,KAAK,QACL,eACC,qDA3JN,QAAAJ,GAAAjB,EAAA,sBA+JW+4C,iBAAe,MADtB,GAcE,IAAA/4C,EA5KN,yDAgKgBc,EAAA+d,EAAA,CACX,IAAI,EACJ,KAAK,OACL,KAAK,QACJ,MAAK,iBAASo6B,iBAAiCtvC,QAA+DA,wBAK9G3J,EAAA,sDAAAA,EAAA,iBAASi5C,+BAAuB,EAEhC,QA3KNj5C,EAAA,uEAAAiB,GAAAjB,EAAA,yBA+KW+4C,gBAAe,UAAaG,eADnC,GASE,IAAAl5C,EAvLN,6DAgL2Bc,EAAA+d,EAAA,CACtB,IAAI,EACJ,MAAK,iBACJ,KAAK,OACN,KAAK,QACL,gBAAa,SAA2C,sCACvD,4EAtLN,QAAA5d,GAAAjB,EAAA,8DA0LmBue,EAAe,OAAgCvI,CAA4B+iC,qCAA0BI,mBAW3GxvC,kDAAQkV,EAAQ,CACxB,IAAI,EACJ,MAAK7e,EAAO,4DACZ,aACC,0DAzMN,QAAAiB,GAAAjB,EAAA,2DAAAe,EAAA,UAAAA,EAAA","names":["position","ref","isOpen","target","actions","actionCallback","useContextMenu","onAction","uiStore","useUIStore","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","sourceControlStore","useSourceControlStore","i18n","useI18n","isReadOnly","computed","targetNodes","selectedNodes","node","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","hasPinData","close","open","event","menuTarget","getMousePosition","nodes","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","menuActions","usePinnedData","singleNodeActions","_dispatchAction","action","watch","useCanvasMouseSelect","selectActive","selectBox","isTouchDevice","isCtrlKeyPressed","useDeviceSupport","canvasStore","useCanvasStore","isContextMenuOpen","_setSelectBoxStyle","styles","_showSelectBox","y","getMousePositionWithinNodeView","_updateSelectBox","selectionBox","_getSelectionBox","_hideSelectBox","_getNodesInSelection","returnNodes","_createSelectBox","mouseUpMouseSelect","_mouseMoveSelect","e","deselectAllNodes","nodeSelected","mouseDownMouseSelect","moveButtonPressed","mousePosition","relativeX","relativeY","nodeViewScale","nodeViewOffsetPosition","getRelativePosition","nodeDeselected","instance","onMounted","useUniqueNodeName","numberSuffixedNames","acc","uniqueNodeName","originalName","extraNames","canvasNames","nsn","unique","index","remainder","lastChar","match","_b","_sfc_main$s","defineComponent","NodeIcon","inputRef","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createVNode","_component_NodeIcon","_component_n8n_popover","editName","_withCtx","_createElementVNode","modelValue","_createTextVNode","_toDisplayString","$style","editable","_createBlock","_createCommentVNode","_withKeys","_withModifiers","_component_n8n_text","_component_n8n_input","$event","_component_n8n_button","_sfc_main$r","useExternalHooks","mapStores","useNDVStore","utmTags","primaryDocUrl","_d","_c","_a","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","isCommunityPackageName","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","pushCogRight","tab","NodeConnectionType","_component_n8n_tabs","onTooltipClick","_sfc_main$q","router","useRouter","clipboard","useClipboard","workflowHelpers","useWorkflowHelpers","useToast","OPEN_URL_PANEL_TRIGGER_NODE_TYPES","PRODUCTION_ONLY_TRIGGER_NODE_TYPES","webhook","webhookData","CHAT_TRIGGER_NODE_TYPE","FORM_TRIGGER_NODE_TYPE","webhookUrl","method","_withScopeId","_pushScopeId","_popScopeId","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_11","_hoisted_12","visibleWebhookUrls","isMinimized","_component_font_awesome_icon","_component_el_row","_component_el_col","showUrlFor","_component_n8n_radio_buttons","urlOptions","_Fragment","_renderList","_component_n8n_tooltip","getWebhookHttpMethod","_hoisted_9","copyWebhookUrl","getWebhookUrlDisplay","_hoisted_13","_hoisted_15","props","__props","nodeHelpers","useNodeHelpers","debounce","useDebounce","emit","__emit","possibleConnections","expandedGroups","shouldShowNodeInputIssues","nodeData","workflow","nodeInputIssues","issues","connectedNodes","connection","getINodesFromNames","getConnectionConfig","connectionType","c","isMultiConnection","connectionConfig","shouldShowConnectionTooltip","expandConnectionGroup","isExpanded","g","names","name","matchedNodeType","stringifiedIssues","NodeHelpers.nodeIssuesToString","hasInputIssues","isNodeInputConfiguration","getPossibleSubInputConnections","NodeHelpers.getNodeInputs","input","onNodeClick","nodeName","onPlusClick","connectionNodes","showNodeInputsIssues","__expose","_sfc_main$o","pinnedData","externalHooks","runWorkflow","stopCurrentExecution","useRunWorkflow","useMessage","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","activeNode","error","nodeViewEventBus","shouldUnpinAndExecute","MODAL_CONFIRM","telemetryPayload","disabledHint","nodeRunning","disabled","buttonLabel","type","size","isListeningForEvents","isTriggerNode","$locale","_sfc_main$n","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NDVSubConnections","NodeExecuteButton","showMessage","useHistoryStore","useCredentialsStore","useWorkflowsEEStore","workflowNode","inputs","NodeHelpers.getConnectionTypes","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","importCurlEventBus","parameters","parameter","parameterName","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","updateInformation","RenameNodeCommand","parameterData","newValue","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","data","unset","key","SHOULD_CLEAR_NODE_OUTPUTS","nodeParameterValues","updatedParameter","prop","displayOptions","showCondition","hideCondition","hasValidOptions","isINodePropertyCollectionList","isINodePropertiesList","option","isINodePropertyOptionsList","displayParameter","foundNodeSettings","nodeSetting","_hoisted_10","_component_NodeTitle","_component_NodeExecuteButton","outputPanelEditMode","onStopExecution","nodeValid","openPanel","_component_NodeSettingsTabs","pushRef","isCommunityNode","_component_i18n_t","onMissingNodeTextClick","_hoisted_6","onMissingNodeLearnMoreLinkClick","hasForeignCredential","_component_n8n_notice","_withDirectives","_component_NodeWebhooks","nodeValuesInitialized","parametersNoneSetting","_component_ParameterInputList","nodeValues","valueChanged","onParameterBlur","hiddenIssuesInputs","parametersSetting","nodeSettings","_component_NDVSubConnections","blockUI","_sfc_main$m","draggablePosition","activeElement","_sfc_render","$props","$setup","$data","$options","isDragging","_renderSlot","_Teleport","_normalizeStyle","draggingEl","_sfc_main$l","Draggable","onDragStart","onDragEnd","canMoveLeft","moveNodeDirection","direction","matchedDirectionNode","onKeyDown","matchingDirection","rootName","connectionGroups","tooltipPositionMapper","onBeforeUnmount","SIDE_MARGIN","SIDE_PANELS_MARGIN","MIN_PANEL_WIDTH","PANEL_WIDTH","PANEL_WIDTH_LARGE","initialMainPanelWidth","_sfc_main$j","PanelDragButton","NDVFloatingNodes","callDebounced","ndvEventBus","supportedDirections","hasInput","outputPanelRelativeLeft","panelMinLeft","currentRelativeLeftDelta","multiplier","minRelativeWidth","windowWidth","isBelowMinLeft","isMaxRight","width","relativeWidth","mainPanelRelativeWidth","relativeLeft","mainPanelRelativeLeft","mainPanelRelativeRight","isMinLeft","isInputless","positionByName","px","x","relativeDistance","storedPanelWidthData","useStorage","LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH","parsedWidth","initialPosition","_component_NDVFloatingNodes","mainPanelStyles","relativeWidthToPx","mainPanelDimensions","onResizeDebounced","onResizeStart","onResizeEnd","hideInputAndOutput","isDraggable","canMoveRight","onDrag","sanitizeOptions","defaults","_sfc_main$i","sanitizeHtml","_sfc_main$h","VueJsonPretty","RunDataHtml","id","fileName","fileType","mimeType","isJSONData","isHTMLData","jsonParse","binaryUrl","fetchedData","binaryData","_component_VueJsonPretty","_component_RunDataHtml","_sfc_main$g","BinaryDataDisplayEmbed","workflowExecution","executionData","_component_BinaryDataDisplayEmbed","onFeedback","feedback","toast","telemetry","useTelemetry","ndvStore","rootStore","useRootStore","aiStore","useAIStore","isLoadingErrorDebugging","errorDebuggingMessage","errorDebuggingFeedback","displayCause","MAX_DISPLAY_DATA_SIZE","n8nVersion","baseUrl","instanceType","hasManyInputItems","nodeDefaultName","prepareRawMessages","returnData","errorMessage","getErrorMessage","message","parts","part","parsed","onDebugError","onDebugErrorRegenerate","onErrorDebuggingFeedback","nodeVersionTag","latestNodeVersion","getErrorDescription","interpolate","parameterDisplayName","addItemIndexSuffix","itemIndexSuffix","ITEM_INDEX_SUFFIX_TEXT","baseErrorMessage","fullPath","params","pathParts","currentParameterName","arrayMatch","currentParameter","copyErrorDetails","errorInfo","errorDetails","n8nDetails","_e","_f","copySuccess","locale","visible","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataSearch","_sfc_main$c","BinaryDataDisplay","NodeErrorView","JsonEditor","RunDataPinButton","toRef","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","schemaView","isEmpty","HTML_NODE_TYPE","runData","taskData","pinOrLiveData","offset","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","prevNode","prevData","isEqual","newData","branchIndex","newSearch","NodeHelpers.getNodeOutputs","itemIndex","pinDataDiscoveryFlag","LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG","dataPinningEventBus","LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG","origin","inputData","clearJsonKey","TEST_PIN_DATA","source","pageSize","maxPage","displayMode","previous","dataContainerRef","dataDisplay","itemsLabel","runIndex","outputIndex","json","searchInObject","rawInputData","outputTypes","outputs","fileExtension","url","saveAs","bufferString","blob","d","outputConfiguration","isObject","jsonItems","run","canPinData","_component_n8n_callout","dataPinningDocsUrl","_component_n8n_link","isReadOnlyRoute","binaryDataDisplayVisible","_component_BinaryDataDisplay","binaryDataDisplayData","closeBinaryDataDisplay","buttons","_component_n8n_icon_button","editMode","_vShow","_component_RunDataPinButton","readOnlyEnv","isControlledPinDataTooltip","pinDataDiscoveryTooltipVisible","maxRunIndex","_component_n8n_select","_component_n8n_option","canLinkRuns","linkedRuns","showIOSearch","search","_component_RunDataSearch","paneType","isPaneActive","activatePane","maxOutputIndex","dataCount","isArtificialRecoveredEventItem","unfilteredDataCount","isExecuting","_component_n8n_spinner","executingMessage","_component_JsonEditor","_component_n8n_info_tip","dataEditingDocsUrl","_component_NodeErrorView","hasNodeRun","hasRunError","isPaneTypeInput","$slots","noDataInBranchMessage","dataSizeInMB","showTooMuchData","jsonData","showIoSearchNoMatchContent","_Suspense","_component_RunDataTable","currentPageOffset","$emit","onDisplayModeChange","_component_RunDataJson","inputDataPage","_component_RunDataSchema","mappingEnabled","binaryDataEntry","isViewable","displayBinaryData","isDownloadable","downloadBinaryData","isSchemaView","_component_el_pagination","_component_n8n_block_ui","_sfc_main$b","date","time","convertToDisplayDateComponents","runMetadata","OUTPUT_TYPE","_sfc_main$a","RunData","RunInfo","RunDataAi","storeToRefs","isSubNodeType","useNodeType","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","isNodeRunning","onRunIndexChange","onLinkRun","onUnlinkRun","_createSlots","hasAiMetadata","onUpdateOutputMode","runTaskData","_component_RunInfo","_component_RunDataAi","_sfc_main$8","WireMeUp","toIgnore","START_NODE_TYPE","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","output","executingNode","val","curr","prev","connectedInputs","inputIndex","truncated","mappedNode","isExecutingPrevious","connectedCurrentNodeOutputs","currentNodeDepth","parentNodes","truncate","getMultipleNodesText","isActiveNodeConfig","readOnly","showDraggableHintWithDelay","onNodeExecute","_component_WireMeUp","isMappingMode","_resolveDynamicComponent","_sfc_main$7","CopyInput","createEventBus","hideContent","hideContentValue","getTriggerNodeServiceName","httpMethod","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","isWebhookNode","webhookHttpMethod","_component_CopyInput","onTestLinkCopied","listeningHint","displayChatButton","header","_component_n8n_heading","activationHint","executionsHelp","_component_n8n_info_accordion","executionsHelpEventBus","onLinkClick","_sfc_main$6","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","workflowActivate","ctx","useSettingsStore","override","isWebhookBasedNode","isPollingNode","outgoingConnections","parentNodeName","EXECUTABLE_TRIGGER_NODE_TYPES","BASE_NODE_SURVEY_URL","credentials","usedCredentials","foreignCredentials","EnterpriseEditionFeature","isTooltipVisible","pane","nodeTypeName","_component_el_dialog","showTriggerWaitingWarning","_component_n8n_icon","activeNodeType","onSwitchSelectedNode","_component_OutputPanel","outputRun","linked","blockUi","isProductionExecutionPreview","isOutputPaneActive","activateOutputPane","onLinkRunToOutput","onRunOutputIndexChange","openSettings","onOutputTableMounted","onOutputItemHover","onSearch","settingsEventBus","onWorkflowActivate","featureRequestUrl","showTriggerPanel","_component_TriggerPanel","_component_InputPanel","inputRun","isInputPaneActive","activateInputPane","onLinkRunToInput","onRunInputIndexChange","onInputTableMounted","onInputItemHover","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","getEndpointLabelLength","length","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","b","inputConfiguration","inputName","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","nonMainInputs","requiredNonMainInputs","optionalNonMainInputs","spacerIndexes","anchorPosition","NodeViewUtils.getAnchorPosition","scope","NodeViewUtils.getEndpointScope","newEndpointData","NodeViewUtils.getInputEndpointUUID","NodeViewUtils.getInputEndpointStyle","NodeViewUtils.getScope","NodeViewUtils.getInputNameOverlay","leftGroupItemsCount","rightGroupItemsCount","insertSpacerBetweenGroups","NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS","minItemsCount","NODE_MIN_INPUT_ITEMS_COUNT","spacerIndex","maxLabelLength","outputConfigurations","endpointLabelLength","rootCategoryOutputName","outputsOfSameRootType","outputData","thisOutputName","NodeViewUtils.getOutputEndpointUUID","NodeViewUtils.getOutputEndpointStyle","overlaySpec","NodeViewUtils.getOutputNameOverlay","plusEndpointData","plusEndpoint","NO_OP_NODE_TYPE","createSupplementalConnectionType","deviceSupport","_sfc_main$4","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","executionRunData","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","SIMULATE_NODE_TYPE","SIMULATE_TRIGGER_NODE_TYPE","icon","iconNodeType","oldValue","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_21","_resolveDirective","isTouchActive","disablePointerEvents","_component_FontAwesomeIcon","hasIssues","hideNodeIssues","nodeIssues","waiting","showPinnedDataInfo","nodeExecutionStatus","workflowDataItems","_hoisted_14","showTriggerNodeTooltip","_hoisted_16","touchStart","showDisabledLinethrough","_directive_touch","_hoisted_18","nodeTitle","_hoisted_22","_hoisted_23","executeNode","_sfc_main$3","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","defaultText","isActive","gridSize","onEdit","onResize","onShowPopover","onHidePopover","_","showActions","SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","currIdx","prevIdx","neighbor","getValue","obj","segments","result","sublimeSearch","filter","keys","results","accu","values","weight","v","itemMatch","a","transformNodeType","subcategory","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","WHITE_LISTED_SUBCATEGORIES","AI_SUBCATEGORY","subcategories","category","sortNodeCreateElements","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","flattenCreateElements","groupItemsInSections","sections","itemsBySection","section","s","useNodeCreatorStore","defineStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","aiAssistantChatOpen","title","style","onOptionSelected","getAiNodesBySubcategory","AIView","_nodes","templatesStore","useTemplatesStore","chainNodes","AI_CATEGORY_CHAINS","agentNodes","AI_CATEGORY_AGENTS","AI_NODE_CREATOR_VIEW","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","getAISubcategoryProperties","nodeConnectionType","AI_CATEGORY_DOCUMENT_LOADERS","AI_CATEGORY_LANGUAGE_MODELS","AI_CATEGORY_MEMORY","AI_CATEGORY_OUTPUTPARSER","AI_CATEGORY_RETRIEVERS","AI_CATEGORY_TEXT_SPLITTERS","AI_CATEGORY_TOOLS","AI_CATEGORY_EMBEDDING","AI_CATEGORY_VECTOR_STORES","AI_UNCATEGORIZED_CATEGORY","TriggerView","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","RSS_READ_NODE_TYPE","EMAIL_SEND_NODE_TYPE","TRANSFORM_DATA_SUBCATEGORY","SET_NODE_TYPE","CODE_NODE_TYPE","DATETIME_NODE_TYPE","FILTER_NODE_TYPE","REMOVE_DUPLICATES_NODE_TYPE","SPLIT_OUT_NODE_TYPE","LIMIT_NODE_TYPE","SUMMARIZE_NODE_TYPE","AGGREGATE_NODE_TYPE","MERGE_NODE_TYPE","MARKDOWN_NODE_TYPE","XML_NODE_TYPE","CRYPTO_NODE_TYPE","EXTRACT_FROM_FILE_NODE_TYPE","CONVERT_TO_FILE_NODE_TYPE","COMPRESSION_NODE_TYPE","EDIT_IMAGE_NODE_TYPE","FLOWS_CONTROL_SUBCATEGORY","IF_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","FILES_SUBCATEGORY","HELPERS_SUBCATEGORY","HTTP_REQUEST_NODE_TYPE","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","selectableItems","activeItemId","keysHooks","getItemType","element","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","pressedKey","activeItemIndex","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","previousIndex","setActiveItemId","itemId","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","registerKeyHook","getActiveItemIndex","useViewStacks","viewStacks","activeStackItems","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","flatBaselineItems","activeViewStackMode","globalSearchItemsDiff","allNodes","itemsBySubcategory","gotoCompatibleConnectionView","isOutput","nodesByConnectionType","relatedAIView","nextTick","pushViewStack","AI_CODE_NODE_TYPE","displayNode","setStackBaselineItems","stackItems","itemsInSubcategory","matchedNodes","updateCurrentViewStack","uuid","newStackUuid","popViewStack","currentStack","matchedIndex","typedKey","resetViewStacks","useCanvasPanning","elementRef","moveLastPosition","panCanvas","offsetPosition","nodeViewOffsetPositionX","nodeViewOffsetPositionY","onMouseDown","MOUSE_EVENT_BUTTON","unref","onMouseMove","onMouseUp","MOUSE_EVENT_BUTTONS","onMouseMoveEnd","NodeCreation","CanvasControls","SetupWorkflowCredentialsButton","_sfc_main","NodeDetailsView","Node","Sticky","CanvasAddButton","KeyboardShortcutTooltip","ContextMenu","NextStepPopup","to","from","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","PLACEHOLDER_EMPTY_WORKFLOW_ID","MODAL_CANCEL","nodeViewRootRef","nodeViewRef","dataSchema","useDataSchema","canvasPanning","useGlobalLinkActions","useTitleChange","useExecutionDebugging","currentTab","nodeViewNotInitialized","workflowChanged","isOpeningTemplate","previousDirtyState","containsTrigger","newScale","err","vm","info","useTagsStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","useExecutionsStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","userHasSeenAIAssistantExperiment","AI_ASSISTANT_LOCAL_STORAGE_KEY","experimentEnabled","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","loadPromises","promises","ready","getAccountAge","ONBOARDING_PROMPT_TIMEBOX","onboardingResponse","promptTimeout","FIRST_ONBOARDING_PROMPT_TIMEOUT","ONBOARDING_CALL_SIGNUP_MODAL_KEY","sourceControlEventBus","historyBus","connectiontype","creatorview","WORKFLOW_LM_CHAT_MODAL_KEY","workflowData","TelemetryHelpers.generateNodesGraph","N8nAddInputEndpointType","n8nAddInputEndpoint","managedNode","endpoints","notice","saved","newNodeButton","lastConnectionInfo","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","tryToParseNumber","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","connections","parentNode","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","pinnedDataForNode","dataToPin","checkNodes","sourceNodeName","margin","recordHistory","sourceNode","oldPosition","MoveNodeCommand","deleteCopiedNodes","isCut","workflowToCopy","execution","executedData","pushData","trackProps","plainTextData","importTags","nodeIdMap","UPDATE_WEBHOOK_ID_NODE_TYPES","newId","currInstanceId","nodeGraph","NodeViewUtils.getNewNodePosition","tagsEnabled","allTags","tagNames","workflowTags","notFound","creatingTagPromises","creationPromise","imported","dropData","DRAG_EVENT_DATA_KEY","insertNodePosition","NodeViewUtils.NODE_SIZE","setActive","deselectAllOthers","maxNodes","overrides","nodeVersion","newNodeData","credentialPerType","defaultCredential","selectedCredentials","selected","authentication","authDisplayOptions","displayOption","optionValue","showDetail","trackHistory","isAutoAdd","lastSelectedConnection","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","sourceOutputIndex","lastSelectedNodeType","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeOutputIndex","targetNodeName","targetNodeOuputIndex","nodeConnections","targetNodeOutputIndex","targetNode","connectionData","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","targetEndpoint","lastSelectedEndpoint","newNodeElement","viableConnection","conn","targetOutputIndex","outputType","filterFound","overrideTargetEndpoint","isTarget","NodeViewUtils.resetConnectionAfterPull","endpointId","endpointElement","observer","mutations","mutation","isJSPlumbEndpointElement","newConnectionInfo","targetInfoType","targetNodeType","sourceInfo","targetInfo","tempEndpoint","NodeViewUtils.resetConnection","NodeViewUtils.moveBackInputLabelPosition","NodeViewUtils.hideOutputNameLabel","NodeViewUtils.addConnectionActionsOverlay","endpointArrow","NodeViewUtils.getOverlay","OVERLAY_ENDPOINT_ARROW_ID","getConnectorPaintStyleData","AddConnectionCommand","NodeViewUtils.addConnectionTestData","totalNodes","NodeViewUtils.showOrHideItemsLabel","NodeViewUtils.showOrHideMidpointArrow","overlay","NodeViewUtils.hideConnectionActions","NodeViewUtils.showConnectionActions","NodeViewUtils.resetInputLabelPosition","connectionInfo","mouse","getConnectionInfo","NodeViewUtils.showOutputNameLabel","RemoveConnectionCommand","removeCommand","scopedEndpoints","requiredType","filteredEndpoints","isSameNode","endpointType","intersectingEndpoints","isEndpointIntersect","NodeViewUtils.isElementIntersection","isNodeElementIntersect","aEndpointIntersect","NodeViewUtils.calculateElementIntersection","bEndpointIntersect","NodeViewUtils.showDropConnectionState","NodeViewUtils.showPullConnectionState","EVENT_CONNECTION_ABORT","INTERCEPT_BEFORE_DROP","EVENT_CONNECTION","EVENT_DRAG_MOVE","EVENT_CONNECTION_MOUSEOVER","EVENT_CONNECTION_MOUSEOUT","EVENT_CONNECTION_MOVED","EVENT_ENDPOINT_MOUSEOVER","EVENT_ENDPOINT_MOUSEOUT","EVENT_CONNECTION_DETACHED","EVENT_CONNECTION_DRAG","EVENT_PLUS_ENDPOINT_CLICK","EVENT_ADD_INPUT_ENDPOINT_CLICK","bind","elements","endpointInstance","N8nPlusEndpointType","TIME","MODAL_CLOSE","workflowId","outputUuid","inputUuid","removeVisualConnection","sourceNodeOutput","sourceNodeOutputName","connectionInstance","outgoing","incoming","pinData","hasRun","NodeViewUtils.addClassesToOverlays","NodeViewUtils.OVERLAY_RUN_ITEMS_ID","sourceId","NodeViewUtils.getJSPlumbEndpoints","trackBulk","requiredNodeTypes","deleteAllowed","checkNode","waitForNewConnection","conn1","conn2","RemoveNodeCommand","tempName","currentName","promptResponsePromise","nameInput","promptResponse","newName","nodeCredentialType","nodeCredentials","credentialOptions","credentialsId","credentialsForId","optionData","credentialsForName","AddNodeCommand","batchedConnectionData","outwardConnections","sourceIndex","targetData","nodeNameTable","newNodeNames","nodeTypesCount","oldName","createNodes","localized","newConnections","currentConnections","createNodeNames","connectionIndex","nodeSourceConnections","tempWorkflow","pinDataSuccess","exportNodeNames","pinDataForNode","connectionToKeep","typeConnections","nodeInfos","nodesToBeFetched","nodeVersions","classNames","NodeViewUtils.addConnectionOutputSuccess","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","canvasAddButtonStyle","onCanvasAddButtonCLick","showCanvasAddButton","_component_Node","currentWorkflowObject","canOpenNDV","nodeDeselectedByName","nodeSelectedByName","onRunNode","onNodeMoved","onNodeRun","stickiesToRender","stickyData","_component_Sticky","GRID_SIZE","pullConnActive","renamingActive","redrawNode","stopExecution","onToggleNodeCreator","onAddNodes","_component_CanvasControls","_component_ContextMenu","isNextStepPopupVisible","isManualChatOnly","_component_KeyboardShortcutTooltip","workflowRunning","runButtonText","stopExecutionInProgress","executionWaitingForWebhook","allTriggersDisabled"],"ignoreList":[],"sources":["../../src/composables/useContextMenu.ts","../../src/composables/useCanvasMouseSelect.ts","../../src/composables/useUniqueNodeName.ts","../../src/components/NodeTitle.vue","../../src/components/NodeSettingsTabs.vue","../../src/components/NodeWebhooks.vue","../../src/components/NDVSubConnections.vue","../../src/components/NodeExecuteButton.vue","../../src/components/NodeSettings.vue","../../src/components/Draggable.vue","../../src/components/PanelDragButton.vue","../../src/components/NDVFloatingNodes.vue","../../src/components/NDVDraggablePanels.vue","../../src/components/RunDataHtml.vue","../../src/components/BinaryDataDisplayEmbed.vue","../../src/components/BinaryDataDisplay.vue","../../src/components/Feedback.vue","../../src/components/Error/NodeErrorView.vue","../../src/components/RunDataPinButton.vue","../../src/components/RunData.vue","../../src/components/RunInfo.vue","../../src/components/OutputPanel.vue","../../src/components/WireMeUp.vue","../../src/components/InputPanel.vue","../../src/components/TriggerPanel.vue","../../src/components/NodeDetailsView.vue","../../src/components/ContextMenu/ContextMenu.vue","../../src/mixins/nodeBase.ts","../../src/components/Node.vue","../../src/components/Sticky.vue","../../src/utils/sortUtils.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/stores/nodeCreator.store.ts","../../src/views/CanvasAddButton.vue","../../src/components/AIAssistantChat/NextStepPopup.vue","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/composables/useCanvasPanning.ts","../../src/views/NodeView.vue"],"sourcesContent":["import type { ActionDropdownItem, XYPosition } from '@/Interface';\nimport { NOT_DUPLICATABE_NODE_TYPES, STICKY_NODE_TYPE } from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { usePinnedData } from './usePinnedData';\n\nexport type ContextMenuTarget =\n\t| { source: 'canvas' }\n\t| { source: 'node-right-click'; node: INode }\n\t| { source: 'node-button'; node: INode };\nexport type ContextMenuActionCallback = (action: ContextMenuAction, targets: INode[]) => void;\nexport type ContextMenuAction =\n\t| 'open'\n\t| 'copy'\n\t| 'toggle_activation'\n\t| 'duplicate'\n\t| 'execute'\n\t| 'rename'\n\t| 'toggle_pin'\n\t| 'delete'\n\t| 'select_all'\n\t| 'deselect_all'\n\t| 'add_node'\n\t| 'add_sticky'\n\t| 'change_color';\n\nconst position = ref<XYPosition>([0, 0]);\nconst isOpen = ref(false);\nconst target = ref<ContextMenuTarget>({ source: 'canvas' });\nconst actions = ref<ActionDropdownItem[]>([]);\nconst actionCallback = ref<ContextMenuActionCallback>(() => {});\n\nexport const useContextMenu = (onAction: ContextMenuActionCallback = () => {}) => {\n\tconst uiStore = useUIStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst sourceControlStore = useSourceControlStore();\n\n\tconst i18n = useI18n();\n\n\tconst isReadOnly = computed(\n\t\t() => sourceControlStore.preferences.branchReadOnly || uiStore.isReadOnlyView,\n\t);\n\n\tconst targetNodes = computed(() => {\n\t\tif (!isOpen.value) return [];\n\t\tconst selectedNodes = uiStore.selectedNodes.map((node) =>\n\t\t\tworkflowsStore.getNodeByName(node.name),\n\t\t) as INode[];\n\t\tconst currentTarget = target.value;\n\t\tif (currentTarget.source === 'canvas') {\n\t\t\treturn selectedNodes;\n\t\t} else if (currentTarget.source === 'node-right-click') {\n\t\t\tconst isNodeInSelection = selectedNodes.some((node) => node.name === currentTarget.node.name);\n\t\t\treturn isNodeInSelection ? selectedNodes : [currentTarget.node];\n\t\t}\n\n\t\treturn [currentTarget.node];\n\t});\n\n\tconst canAddNodeOfType = (nodeType: INodeTypeDescription) => {\n\t\tconst sameTypeNodes = workflowsStore.allNodes.filter((n) => n.type === nodeType.name);\n\t\treturn nodeType.maxNodes === undefined || sameTypeNodes.length < nodeType.maxNodes;\n\t};\n\n\tconst canDuplicateNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tif (!nodeType) return false;\n\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(nodeType.name)) return false;\n\n\t\treturn canAddNodeOfType(nodeType);\n\t};\n\n\tconst hasPinData = (node: INode): boolean => {\n\t\treturn !!workflowsStore.pinDataByNodeName(node.name);\n\t};\n\tconst close = () => {\n\t\ttarget.value = { source: 'canvas' };\n\t\tisOpen.value = false;\n\t\tactions.value = [];\n\t\tposition.value = [0, 0];\n\t};\n\n\tconst open = (event: MouseEvent, menuTarget: ContextMenuTarget = { source: 'canvas' }) => {\n\t\tevent.stopPropagation();\n\n\t\tif (isOpen.value && menuTarget.source === target.value.source) {\n\t\t\t// Close context menu, let browser open native context menu\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tactionCallback.value = onAction;\n\t\ttarget.value = menuTarget;\n\t\tposition.value = getMousePosition(event);\n\t\tisOpen.value = true;\n\n\t\tconst nodes = targetNodes.value;\n\t\tconst onlyStickies = nodes.every((node) => node.type === STICKY_NODE_TYPE);\n\t\tconst i18nOptions = {\n\t\t\tadjustToNumber: nodes.length,\n\t\t\tinterpolate: {\n\t\t\t\tsubject: onlyStickies\n\t\t\t\t\t? i18n.baseText('contextMenu.sticky', { adjustToNumber: nodes.length })\n\t\t\t\t\t: i18n.baseText('contextMenu.node', { adjustToNumber: nodes.length }),\n\t\t\t},\n\t\t};\n\n\t\tconst selectionActions = [\n\t\t\t{\n\t\t\t\tid: 'select_all',\n\t\t\t\tdivided: true,\n\t\t\t\tlabel: i18n.baseText('contextMenu.selectAll'),\n\t\t\t\tshortcut: { metaKey: true, keys: ['A'] },\n\t\t\t\tdisabled: nodes.length === workflowsStore.allNodes.length,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'deselect_all',\n\t\t\t\tlabel: i18n.baseText('contextMenu.deselectAll'),\n\t\t\t\tdisabled: nodes.length === 0,\n\t\t\t},\n\t\t];\n\n\t\tif (nodes.length === 0) {\n\t\t\tactions.value = [\n\t\t\t\t{\n\t\t\t\t\tid: 'add_node',\n\t\t\t\t\tshortcut: { keys: ['Tab'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addNode'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'add_sticky',\n\t\t\t\t\tshortcut: { shiftKey: true, keys: ['s'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addSticky'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t];\n\t\t} else {\n\t\t\tconst menuActions: ActionDropdownItem[] = [\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_activation',\n\t\t\t\t\tlabel: nodes.every((node) => node.disabled)\n\t\t\t\t\t\t? i18n.baseText('contextMenu.activate', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.deactivate', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_pin',\n\t\t\t\t\tlabel: nodes.every((node) => hasPinData(node))\n\t\t\t\t\t\t? i18n.baseText('contextMenu.unpin', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.pin', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['p'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every((n) => usePinnedData(n).canPinNode(true)),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'copy',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.copy', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['C'] },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'duplicate',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.duplicate', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canDuplicateNode),\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t\t{\n\t\t\t\t\tid: 'delete',\n\t\t\t\t\tdivided: true,\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.delete', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['Del'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t].filter(Boolean) as ActionDropdownItem[];\n\n\t\t\tif (nodes.length === 1) {\n\t\t\t\tconst singleNodeActions = onlyStickies\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.editSticky'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'change_color',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.changeColor'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.open'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'execute',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.test'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'rename',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.rename'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['F2'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t\t// Add actions only available for a single node\n\t\t\t\tmenuActions.unshift(...singleNodeActions);\n\t\t\t}\n\n\t\t\tactions.value = menuActions;\n\t\t}\n\t};\n\n\tconst _dispatchAction = (action: ContextMenuAction) => {\n\t\tactionCallback.value(action, targetNodes.value);\n\t};\n\n\twatch(\n\t\t() => uiStore.nodeViewOffsetPosition,\n\t\t() => {\n\t\t\tclose();\n\t\t},\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tposition,\n\t\ttarget,\n\t\tactions,\n\t\ttargetNodes,\n\t\topen,\n\t\tclose,\n\t\t_dispatchAction,\n\t};\n};\n","import type { INodeUi, XYPosition } from '@/Interface';\n\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getMousePosition, getRelativePosition } from '@/utils/nodeViewUtils';\nimport { ref, onMounted, computed } from 'vue';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useContextMenu } from './useContextMenu';\n\ninterface ExtendedHTMLSpanElement extends HTMLSpanElement {\n\tx: number;\n\ty: number;\n}\n\nexport default function useCanvasMouseSelect() {\n\tconst selectActive = ref(false);\n\tconst selectBox = ref(document.createElement('span') as ExtendedHTMLSpanElement);\n\n\tconst { isTouchDevice, isCtrlKeyPressed } = useDeviceSupport();\n\tconst uiStore = useUIStore();\n\tconst canvasStore = useCanvasStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst { isOpen: isContextMenuOpen } = useContextMenu();\n\n\tfunction _setSelectBoxStyle(styles: Record<string, string>) {\n\t\tObject.assign(selectBox.value.style, styles);\n\t}\n\n\tfunction _showSelectBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\tselectBox.value = Object.assign(selectBox.value, { x, y });\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectBox.value.x + 'px',\n\t\t\ttop: selectBox.value.y + 'px',\n\t\t\tvisibility: 'visible',\n\t\t});\n\t\tselectActive.value = true;\n\t}\n\n\tfunction _updateSelectBox(event: MouseEvent) {\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectionBox.x + 'px',\n\t\t\ttop: selectionBox.y + 'px',\n\t\t\twidth: selectionBox.width + 'px',\n\t\t\theight: selectionBox.height + 'px',\n\t\t});\n\t}\n\n\tfunction _hideSelectBox() {\n\t\tselectBox.value.x = 0;\n\t\tselectBox.value.y = 0;\n\n\t\t_setSelectBoxStyle({\n\t\t\tvisibility: 'hidden',\n\t\t\tleft: '0px',\n\t\t\ttop: '0px',\n\t\t\twidth: '0px',\n\t\t\theight: '0px',\n\t\t});\n\t\tselectActive.value = false;\n\t}\n\n\tfunction _getSelectionBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\treturn {\n\t\t\tx: Math.min(x, selectBox.value.x),\n\t\t\ty: Math.min(y, selectBox.value.y),\n\t\t\twidth: Math.abs(x - selectBox.value.x),\n\t\t\theight: Math.abs(y - selectBox.value.y),\n\t\t};\n\t}\n\n\tfunction _getNodesInSelection(event: MouseEvent): INodeUi[] {\n\t\tconst returnNodes: INodeUi[] = [];\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t// Go through all nodes and check if they are selected\n\t\tworkflowsStore.allNodes.forEach((node: INodeUi) => {\n\t\t\t// TODO: Currently always uses the top left corner for checking. Should probably use the center instead\n\t\t\tif (\n\t\t\t\tnode.position[0] < selectionBox.x ||\n\t\t\t\tnode.position[0] > selectionBox.x + selectionBox.width\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnode.position[1] < selectionBox.y ||\n\t\t\t\tnode.position[1] > selectionBox.y + selectionBox.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturnNodes.push(node);\n\t\t});\n\n\t\treturn returnNodes;\n\t}\n\n\tfunction _createSelectBox() {\n\t\tselectBox.value.id = 'select-box';\n\t\t_setSelectBoxStyle({\n\t\t\tmargin: '0px auto',\n\t\t\tborder: '2px dotted #FF0000',\n\t\t\t// Positioned absolutely within #node-view. This is consistent with how nodes are positioned.\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '100',\n\t\t\tvisibility: 'hidden',\n\t\t});\n\n\t\tselectBox.value.addEventListener('mouseup', mouseUpMouseSelect);\n\n\t\tconst nodeViewEl = document.querySelector('#node-view') as HTMLDivElement;\n\t\tnodeViewEl.appendChild(selectBox.value);\n\t}\n\n\tfunction _mouseMoveSelect(e: MouseEvent) {\n\t\tif (e.buttons === 0) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tmouseUpMouseSelect(e);\n\t\t\treturn;\n\t\t}\n\n\t\t_updateSelectBox(e);\n\t}\n\n\tfunction mouseUpMouseSelect(e: MouseEvent) {\n\t\t// Ignore right-click\n\t\tif (e.button === 2 || isContextMenuOpen.value) return;\n\n\t\tif (!selectActive.value) {\n\t\t\tif (isTouchDevice && e.target instanceof HTMLElement) {\n\t\t\t\tif (e.target && e.target.id.includes('node-view')) {\n\t\t\t\t\t// Deselect all nodes\n\t\t\t\t\tdeselectAllNodes();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\t\tdocument.removeEventListener('mousemove', _mouseMoveSelect);\n\n\t\t// Deselect all nodes\n\t\tdeselectAllNodes();\n\n\t\t// Select the nodes which are in the selection box\n\t\tconst selectedNodes = _getNodesInSelection(e);\n\t\tselectedNodes.forEach((node) => {\n\t\t\tnodeSelected(node);\n\t\t});\n\n\t\tif (selectedNodes.length === 1) {\n\t\t\tuiStore.lastSelectedNode = selectedNodes[0].name;\n\t\t}\n\n\t\t_hideSelectBox();\n\t}\n\tfunction mouseDownMouseSelect(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (isCtrlKeyPressed(e) || moveButtonPressed || e.button === 2) {\n\t\t\t// We only care about it when the ctrl key is not pressed at the same time.\n\t\t\t// So we exit when it is pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\t\t_showSelectBox(e);\n\n\t\t// Leave like this.\n\t\t// Do not add an anonymous function because then remove would not work anymore\n\t\tdocument.addEventListener('mousemove', _mouseMoveSelect);\n\t}\n\n\tfunction getMousePositionWithinNodeView(event: MouseEvent | TouchEvent): XYPosition {\n\t\tconst mousePosition = getMousePosition(event);\n\n\t\tconst [relativeX, relativeY] = canvasStore.canvasPositionFromPagePosition(mousePosition);\n\t\tconst nodeViewScale = canvasStore.nodeViewScale;\n\t\tconst nodeViewOffsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\treturn getRelativePosition(relativeX, relativeY, nodeViewScale, nodeViewOffsetPosition);\n\t}\n\n\tfunction nodeDeselected(node: INodeUi) {\n\t\tuiStore.removeNodeFromSelection(node);\n\t\tinstance.value.removeFromDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction nodeSelected(node: INodeUi) {\n\t\tuiStore.addSelectedNode(node);\n\t\tinstance.value.addToDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction deselectAllNodes() {\n\t\tinstance.value.clearDragSelection();\n\t\tuiStore.resetSelectedNodes();\n\t\tuiStore.lastSelectedNode = null;\n\t\tuiStore.lastSelectedNodeOutputIndex = null;\n\n\t\tcanvasStore.lastSelectedConnection = null;\n\t\tcanvasStore.newNodeInsertPosition = null;\n\t}\n\n\tconst instance = computed(() => canvasStore.jsPlumbInstance);\n\n\tonMounted(() => {\n\t\t_createSelectBox();\n\t});\n\n\treturn {\n\t\tselectActive,\n\t\tgetMousePositionWithinNodeView,\n\t\tmouseUpMouseSelect,\n\t\tmouseDownMouseSelect,\n\t\tnodeDeselected,\n\t\tnodeSelected,\n\t\tdeselectAllNodes,\n\t};\n}\n","import { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport function useUniqueNodeName() {\n\t/**\n\t * All in-store node name defaults ending with a number, e.g.\n\t * `AWS S3`, `Magento 2`, `MSG91`, `S3`, `SIGNL4`, `sms77`\n\t */\n\tfunction numberSuffixedNames() {\n\t\treturn useNodeTypesStore().allNodeTypes.reduce<string[]>((acc, nodeType) => {\n\t\t\tif (typeof nodeType.defaults.name !== 'string') {\n\t\t\t\tthrow new Error('Expected node name default to be a string');\n\t\t\t}\n\n\t\t\tif (/\\d$/.test(nodeType.defaults.name)) acc.push(nodeType.defaults.name);\n\n\t\t\treturn acc;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Create a unique node name from an original name, based on the names of\n\t * all nodes on canvas and any extra names that cannot be used.\n\t */\n\tfunction uniqueNodeName(originalName: string, extraNames: string[] = []) {\n\t\tconst { canvasNames } = useWorkflowsStore();\n\n\t\tconst isUnique = !canvasNames.has(originalName) && !extraNames.includes(originalName);\n\n\t\tif (isUnique) return originalName;\n\n\t\tconst nsn = numberSuffixedNames().find((nsn) => originalName.startsWith(nsn));\n\n\t\t// edge case, number suffix as part of name: S3 -> S31 -> S32\n\n\t\tif (nsn) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst remainder = originalName.split(nsn).pop();\n\n\t\t\tconst lastChar = remainder?.[remainder.length - 1];\n\n\t\t\tif (lastChar && Number.isInteger(Number(lastChar))) {\n\t\t\t\tindex = parseInt(lastChar, 10);\n\t\t\t\toriginalName = originalName.slice(0, -1);\n\t\t\t}\n\n\t\t\tunique = originalName;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = originalName + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// edge case, all-number name: 123 -> 123-1 -> 123-2\n\n\t\tif (/^\\d+-?\\d*$/.test(originalName)) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst match = originalName.match(/(?<base>\\d+)-?(?<suffix>\\d*)/);\n\n\t\t\tif (!match?.groups) {\n\t\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t\t}\n\n\t\t\tif (match?.groups?.suffix !== '') {\n\t\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t\t}\n\n\t\t\tunique = match.groups.base;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = match.groups.base + '-' + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// normal case: A -> A1 -> A2\n\n\t\tlet unique = '';\n\t\tlet index = 1;\n\n\t\tconst match = originalName.match(/(?<base>.*\\D+)(?<suffix>\\d*)/);\n\n\t\tif (!match?.groups) {\n\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t}\n\n\t\tif (match?.groups?.suffix !== '') {\n\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t}\n\n\t\tunique = match.groups.base;\n\n\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\tunique = match.groups.base + index++;\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\treturn { uniqueNodeName };\n}\n","<template>\n\t<span :class=\"$style.container\" data-test-id=\"node-title-container\" @click=\"onEdit\">\n\t\t<span :class=\"$style.iconWrapper\"><NodeIcon :node-type=\"nodeType\" :size=\"18\" /></span>\n\t\t<n8n-popover placement=\"right\" width=\"200\" :visible=\"editName\" :disabled=\"!editable\">\n\t\t\t<div\n\t\t\t\t:class=\"$style.editContainer\"\n\t\t\t\t@keydown.enter=\"onRename\"\n\t\t\t\t@keydown.stop\n\t\t\t\t@keydown.esc=\"editName = false\"\n\t\t\t>\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-base\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('ndv.title.renameNode')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-input ref=\"input\" v-model=\"newName\" size=\"small\" data-test-id=\"node-rename-input\" />\n\t\t\t\t<div :class=\"$style.editButtons\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.cancel')\"\n\t\t\t\t\t\t@click=\"editName = false\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.rename')\"\n\t\t\t\t\t\t@click=\"onRename\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<template #reference>\n\t\t\t\t<div :class=\"{ [$style.title]: true, [$style.hoverable]: editable }\">\n\t\t\t\t\t{{ modelValue }}\n\t\t\t\t\t<div :class=\"$style.editIconContainer\">\n\t\t\t\t\t\t<font-awesome-icon v-if=\"editable\" :class=\"$style.editIcon\" icon=\"pencil-alt\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-popover>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'NodeTitle',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\teditName: false,\n\t\t\tnewName: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\teditable(): boolean {\n\t\t\treturn !this.readOnly && window === window.parent;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onEdit() {\n\t\t\tthis.newName = this.modelValue;\n\t\t\tthis.editName = true;\n\t\t\tawait this.$nextTick();\n\t\t\tconst inputRef = this.$refs.input as HTMLInputElement | undefined;\n\t\t\tif (inputRef) {\n\t\t\t\tinputRef.focus();\n\t\t\t}\n\t\t},\n\t\tonRename() {\n\t\t\tif (this.newName.trim() !== '') {\n\t\t\t\tthis.$emit('update:modelValue', this.newName.trim());\n\t\t\t}\n\n\t\t\tthis.editName = false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tfont-weight: var(--font-weight-bold);\n\tdisplay: flex;\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-compact);\n\toverflow-wrap: anywhere;\n\tpadding-right: var(--spacing-s);\n\toverflow: hidden;\n}\n\n.title {\n\tmax-height: 100px;\n\tdisplay: -webkit-box;\n\t-webkit-line-clamp: 5;\n\t-webkit-box-orient: vertical;\n\tcolor: var(--color-text-dark);\n}\n\n.hoverable {\n\t&:hover {\n\t\tcursor: pointer;\n\t\t.editIcon {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n.iconWrapper {\n\tdisplay: inline-flex;\n\tmargin-right: var(--spacing-2xs);\n}\n\n.editIcon {\n\tdisplay: none;\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-base);\n\tposition: absolute;\n\tbottom: 0;\n}\n\n.editIconContainer {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 0;\n}\n\n.editButtons {\n\ttext-align: right;\n\tmargin-top: var(--spacing-s);\n\n\t> * {\n\t\tmargin-left: var(--spacing-4xs);\n\t}\n}\n\n.editContainer {\n\ttext-align: left;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-4xs);\n\t}\n}\n</style>\n","<template>\n\t<n8n-tabs\n\t\t:options=\"options\"\n\t\t:model-value=\"modelValue\"\n\t\t@update:model-value=\"onTabSelect\"\n\t\t@tooltip-click=\"onTooltipClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport type { INodeUi, ITab } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeSettingsTabs',\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdocumentationUrl(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\n\t\t\tif (!nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\t\t\treturn nodeType.documentationUrl;\n\t\t\t}\n\n\t\t\tconst utmTags =\n\t\t\t\t'?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link' +\n\t\t\t\t'&utm_campaign=' +\n\t\t\t\tnodeType.name;\n\n\t\t\t// Built-in node documentation available via its codex entry\n\t\t\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\t\t\tif (primaryDocUrl) {\n\t\t\t\treturn primaryDocUrl + utmTags;\n\t\t\t}\n\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${nodeType.name.split('.')[0]}`;\n\t\t\t}\n\n\t\t\t// Fallback to the root of the node documentation\n\t\t\treturn BUILTIN_NODES_DOCS_URL + utmTags;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\t\t\tif (nodeType) {\n\t\t\t\treturn isCommunityPackageName(nodeType.name);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tpackageName(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription;\n\t\t\treturn nodeType.name.split('.')[0];\n\t\t},\n\t\toptions(): ITab[] {\n\t\t\tconst options: ITab[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.parameters'),\n\t\t\t\t\tvalue: 'params',\n\t\t\t\t},\n\t\t\t];\n\t\t\tif (this.documentationUrl) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.docs'),\n\t\t\t\t\tvalue: 'docs',\n\t\t\t\t\thref: this.documentationUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\toptions.push({\n\t\t\t\t\ticon: 'cube',\n\t\t\t\t\tvalue: 'communityNode',\n\t\t\t\t\talign: 'right',\n\t\t\t\t\ttooltip: this.$locale.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t\tpackageName: this.packageName,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// If both tabs have align right, both will have excessive left margin\n\t\t\tconst pushCogRight = this.isCommunityNode ? false : true;\n\t\t\toptions.push({\n\t\t\t\ticon: 'cog',\n\t\t\t\tvalue: 'settings',\n\t\t\t\talign: pushCogRight ? 'right' : undefined,\n\t\t\t});\n\n\t\t\treturn options;\n\t\t},\n\t},\n\tmethods: {\n\t\tonTabSelect(tab: string) {\n\t\t\tif (tab === 'docs' && this.nodeType) {\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\t\t\tnodeType: this.nodeType as INodeTypeDescription,\n\t\t\t\t\tdocumentationUrl: this.documentationUrl,\n\t\t\t\t});\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'docs',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' && this.nodeType) {\n\t\t\t\tthis.$telemetry.track('User viewed node settings', {\n\t\t\t\t\tnode_type: (this.nodeType as INodeTypeDescription).name,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' || tab === 'params') {\n\t\t\t\tthis.$emit('update:modelValue', tab);\n\t\t\t}\n\t\t},\n\t\tonTooltipClick(tab: string, event: MouseEvent) {\n\t\t\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\n\n\t&:hover {\n\t\tcolor: unset;\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"webhooksNode.length && visibleWebhookUrls.length > 0\" class=\"webhooks\">\n\t\t<div\n\t\t\tclass=\"clickable headline\"\n\t\t\t:class=\"{ expanded: !isMinimized }\"\n\t\t\t:title=\"isMinimized ? baseText.clickToDisplay : baseText.clickToHide\"\n\t\t\t@click=\"isMinimized = !isMinimized\"\n\t\t>\n\t\t\t<font-awesome-icon icon=\"angle-right\" class=\"minimize-button minimize-icon\" />\n\t\t\t{{ baseText.toggleTitle }}\n\t\t</div>\n\t\t<el-collapse-transition>\n\t\t\t<div v-if=\"!isMinimized\" class=\"node-webhooks\">\n\t\t\t\t<div v-if=\"!isProductionOnly\" class=\"url-selection\">\n\t\t\t\t\t<el-row>\n\t\t\t\t\t\t<el-col :span=\"24\">\n\t\t\t\t\t\t\t<n8n-radio-buttons v-model=\"showUrlFor\" :options=\"urlOptions\" />\n\t\t\t\t\t\t</el-col>\n\t\t\t\t\t</el-row>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-for=\"(webhook, index) in visibleWebhookUrls\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"baseText.clickToCopy\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"isWebhookMethodVisible(webhook)\" class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"http-field\">\n\t\t\t\t\t\t\t<div class=\"http-method\">{{ getWebhookHttpMethod(webhook) }}<br /></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"url-field\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"url-field-full-width\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</el-collapse-transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { INodeTypeDescription, IWebhookDescription } from 'n8n-workflow';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tOPEN_URL_PANEL_TRIGGER_NODE_TYPES,\n\tPRODUCTION_ONLY_TRIGGER_NODE_TYPES,\n} from '@/constants';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tname: 'NodeWebhooks',\n\tprops: [\n\t\t'node', // NodeUi\n\t\t'nodeType', // INodeTypeDescription\n\t],\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst clipboard = useClipboard();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\treturn {\n\t\t\tclipboard,\n\t\t\tworkflowHelpers,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMinimized: this.nodeType && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name),\n\t\t\tshowUrlFor: 'test',\n\t\t};\n\t},\n\tcomputed: {\n\t\tisProductionOnly(): boolean {\n\t\t\treturn this.nodeType && PRODUCTION_ONLY_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t\turlOptions(): Array<{ label: string; value: string }> {\n\t\t\treturn [\n\t\t\t\t...(this.isProductionOnly ? [] : [{ label: this.baseText.testUrl, value: 'test' }]),\n\t\t\t\t{\n\t\t\t\t\tlabel: this.baseText.productionUrl,\n\t\t\t\t\tvalue: 'production',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tvisibleWebhookUrls(): IWebhookDescription[] {\n\t\t\treturn this.webhooksNode.filter((webhook) => {\n\t\t\t\tif (typeof webhook.ndvHideUrl === 'string') {\n\t\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideUrl');\n\t\t\t\t}\n\n\t\t\t\treturn !webhook.ndvHideUrl;\n\t\t\t});\n\t\t},\n\t\twebhooksNode(): IWebhookDescription[] {\n\t\t\tif (this.nodeType === null || this.nodeType.webhooks === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn (this.nodeType as INodeTypeDescription).webhooks!.filter(\n\t\t\t\t(webhookData) => webhookData.restartWebhook !== true,\n\t\t\t);\n\t\t},\n\t\tbaseText() {\n\t\t\tconst nodeType = this.nodeType.name;\n\t\t\tswitch (nodeType) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.chatTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.chatTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.chatTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.formTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.formTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.formTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText('nodeWebhooks.clickToDisplayWebhookUrls'),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title'),\n\t\t\t\t\t\tcopyMessage: undefined,\n\t\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.isMinimized = !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t},\n\tmethods: {\n\t\tcopyWebhookUrl(webhookData: IWebhookDescription): void {\n\t\t\tconst webhookUrl = this.getWebhookUrlDisplay(webhookData);\n\t\t\tvoid this.clipboard.copy(webhookUrl);\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.baseText.copyTitle,\n\t\t\t\tmessage: this.baseText.copyMessage,\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'parameters',\n\t\t\t\ttype: `${this.showUrlFor} url`,\n\t\t\t});\n\t\t},\n\t\tgetWebhookUrlDisplay(webhookData: IWebhookDescription): string {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.workflowHelpers.getWebhookUrl(\n\t\t\t\t\twebhookData,\n\t\t\t\t\tthis.node,\n\t\t\t\t\tthis.isProductionOnly ? 'production' : this.showUrlFor,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tisWebhookMethodVisible(webhook: IWebhookDescription): boolean {\n\t\t\ttry {\n\t\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\t\tif (Array.isArray(method) && method.length !== 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\n\t\t\tif (typeof webhook.ndvHideMethod === 'string') {\n\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideMethod');\n\t\t\t}\n\n\t\t\treturn !webhook.ndvHideMethod;\n\t\t},\n\n\t\tgetWebhookHttpMethod(webhook: IWebhookDescription): string {\n\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\tif (Array.isArray(method)) {\n\t\t\t\treturn method[0];\n\t\t\t}\n\t\t\treturn method;\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.webhooks {\n\tpadding-bottom: var(--spacing-xs);\n\tmargin: var(--spacing-xs) 0;\n\tborder-bottom: 1px solid var(--color-text-lighter);\n\n\t.headline {\n\t\tcolor: $color-primary;\n\t\tfont-weight: 600;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n\n.http-field {\n\tposition: absolute;\n\twidth: 50px;\n\tdisplay: inline-block;\n\ttop: calc(50% - 8px);\n}\n\n.http-method {\n\tbackground-color: var(--color-foreground-xdark);\n\twidth: 40px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 5px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tfont-size: var(--font-size-2xs);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-foreground-xlight);\n}\n\n.minimize-icon {\n\tfont-size: 1.3em;\n\tmargin-right: 0.5em;\n}\n\n.mode-selection-headline {\n\tline-height: 1.8em;\n}\n\n.node-webhooks {\n\tmargin-left: 1em;\n}\n\n.url-field {\n\tdisplay: inline-block;\n\twidth: calc(100% - 60px);\n\tmargin-left: 55px;\n}\n.url-field-full-width {\n\tdisplay: inline-block;\n\tmargin: 5px 10px;\n}\n\n.url-selection {\n\tmargin-top: var(--spacing-xs);\n}\n\n.minimize-button {\n\tdisplay: inline-block;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-duration: 0.5s;\n\t-o-transition-duration: 0.5s;\n\ttransition-duration: 0.5s;\n\n\t-webkit-transition-property: -webkit-transform;\n\t-moz-transition-property: -moz-transform;\n\t-o-transition-property: -o-transform;\n\ttransition-property: transform;\n}\n.expanded .minimize-button {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n\n.webhook-url {\n\tposition: relative;\n\ttop: 0;\n\twidth: 100%;\n\tfont-size: var(--font-size-2xs);\n\twhite-space: normal;\n\toverflow: visible;\n\ttext-overflow: initial;\n\tcolor: var(--color-text-dark);\n\ttext-align: left;\n\tdirection: ltr;\n\tword-break: break-all;\n}\n\n.webhook-wrapper {\n\tline-height: 1.5;\n\tposition: relative;\n\tmargin-top: var(--spacing-xs);\n\tbackground-color: var(--color-foreground-xlight);\n\tborder-radius: 3px;\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div\n\t\t\t:class=\"$style.connections\"\n\t\t\t:style=\"`--possible-connections: ${possibleConnections.length}`\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for=\"connection in possibleConnections\"\n\t\t\t\t:key=\"connection.type\"\n\t\t\t\t:data-test-id=\"`subnode-connection-group-${connection.type}`\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.connectionType\">\n\t\t\t\t\t<span\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectionLabel]: true,\n\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tv-text=\"`${connection.displayName}${connection.required ? ' *' : ''}`\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-on-click-outside=\"() => expandConnectionGroup(connection.type, false)\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectedNodesWrapper]: true,\n\t\t\t\t\t\t\t[$style.connectedNodesWrapperExpanded]: expandedGroups.includes(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:style=\"`--nodes-length: ${connectedNodes[connection.type].length}`\"\n\t\t\t\t\t\t@click=\"expandConnectionGroup(connection.type, true)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1 ? connection.maxConnections !== 1 : true\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.plusButton]: true,\n\t\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"onPlusClick(connection.type)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\t\tshouldShowConnectionTooltip(connection.type) &&\n\t\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\tAdd {{ connection.displayName }}\n\t\t\t\t\t\t\t\t\t<template v-if=\"hasInputIssues(connection.type)\">\n\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t:items=\"nodeInputIssues[connection.type]\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:data-test-id=\"`add-subnode-${connection.type}`\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"connectedNodes[connection.type].length > 0\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.connectedNodes]: true,\n\t\t\t\t\t\t\t\t[$style.connectedNodesMultiple]: connectedNodes[connection.type].length > 1,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"(node, index) in connectedNodes[connection.type]\"\n\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t:class=\"{ [$style.nodeWrapper]: true, [$style.hasIssues]: node.issues }\"\n\t\t\t\t\t\t\t\tdata-test-id=\"floating-subnode\"\n\t\t\t\t\t\t\t\t:data-node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t:style=\"`--node-index: ${index}`\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t\t:disabled=\"shouldShowConnectionTooltip(connection.type)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\t\t{{ node.node.name }}\n\t\t\t\t\t\t\t\t\t\t<template v-if=\"node.issues\">\n\t\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t\t:items=\"node.issues\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\t\t\t\t\t@click=\"onNodeClick(node.node.name, connection.type)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t\t\t\t\t:node-type=\"node.nodeType\"\n\t\t\t\t\t\t\t\t\t\t\t:node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t\t\t\ttooltip-position=\"top\"\n\t\t\t\t\t\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, ref, watch } from 'vue';\nimport { NodeHelpers } from 'n8n-workflow';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\nimport type { ConnectionTypes, INodeInputConfiguration, INodeTypeDescription } from 'n8n-workflow';\nimport { useDebounce } from '@/composables/useDebounce';\n\ninterface Props {\n\trootNode: INodeUi;\n}\n\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst nodeHelpers = useNodeHelpers();\nconst { debounce } = useDebounce();\nconst emit = defineEmits(['switchSelectedNode', 'openConnectionNodeCreator']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n\tissues: string[];\n}\n\nconst possibleConnections = ref<INodeInputConfiguration[]>([]);\n\nconst expandedGroups = ref<ConnectionTypes[]>([]);\nconst shouldShowNodeInputIssues = ref(false);\n\nconst nodeType = computed(() =>\n\tnodeTypesStore.getNodeType(props.rootNode.type, props.rootNode.typeVersion),\n);\n\nconst nodeData = computed(() => workflowsStore.getNodeByName(props.rootNode.name));\n\nconst workflow = computed(() => workflowsStore.getCurrentWorkflow());\n\nconst nodeInputIssues = computed(() => {\n\tconst issues = nodeHelpers.getNodeIssues(nodeType.value, props.rootNode, workflow.value, [\n\t\t'typeUnknown',\n\t\t'parameters',\n\t\t'credentials',\n\t\t'execution',\n\t]);\n\treturn issues?.input ?? {};\n});\n\nconst connectedNodes = computed<Record<ConnectionTypes, NodeConfig[]>>(() => {\n\treturn possibleConnections.value.reduce(\n\t\t(acc, connection) => {\n\t\t\tconst nodes = getINodesFromNames(\n\t\t\t\tworkflow.value.getParentNodes(props.rootNode.name, connection.type),\n\t\t\t);\n\t\t\treturn { ...acc, [connection.type]: nodes };\n\t\t},\n\t\t{} as Record<ConnectionTypes, NodeConfig[]>,\n\t);\n});\n\nfunction getConnectionConfig(connectionType: ConnectionTypes) {\n\treturn possibleConnections.value.find((c) => c.type === connectionType);\n}\n\nfunction isMultiConnection(connectionType: ConnectionTypes) {\n\tconst connectionConfig = getConnectionConfig(connectionType);\n\treturn connectionConfig?.maxConnections !== 1;\n}\n\nfunction shouldShowConnectionTooltip(connectionType: ConnectionTypes) {\n\treturn isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType);\n}\n\nfunction expandConnectionGroup(connectionType: ConnectionTypes, isExpanded: boolean) {\n\t// If the connection is a single connection, we don't need to expand the group\n\tif (!isMultiConnection(connectionType)) {\n\t\treturn;\n\t}\n\n\tif (isExpanded) {\n\t\texpandedGroups.value = [...expandedGroups.value, connectionType];\n\t} else {\n\t\texpandedGroups.value = expandedGroups.value.filter((g) => g !== connectionType);\n\t}\n}\n\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst matchedNodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (matchedNodeType) {\n\t\t\t\t\tconst issues = nodeHelpers.getNodeIssues(matchedNodeType, node, workflow.value);\n\t\t\t\t\tconst stringifiedIssues = issues ? NodeHelpers.nodeIssuesToString(issues, node) : '';\n\t\t\t\t\treturn { node, nodeType: matchedNodeType, issues: stringifiedIssues };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\n\nfunction hasInputIssues(connectionType: ConnectionTypes) {\n\treturn (\n\t\tshouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionType] ?? []).length > 0\n\t);\n}\n\nfunction isNodeInputConfiguration(\n\tconnectionConfig: ConnectionTypes | INodeInputConfiguration,\n): connectionConfig is INodeInputConfiguration {\n\tif (typeof connectionConfig === 'string') return false;\n\n\treturn 'type' in connectionConfig;\n}\n\nfunction getPossibleSubInputConnections(): INodeInputConfiguration[] {\n\tif (!nodeType.value || !props.rootNode) return [];\n\n\tconst inputs = NodeHelpers.getNodeInputs(workflow.value, props.rootNode, nodeType.value);\n\n\tconst nonMainInputs = inputs.filter((input): input is INodeInputConfiguration => {\n\t\tif (!isNodeInputConfiguration(input)) return false;\n\n\t\treturn input.type !== 'main';\n\t});\n\n\treturn nonMainInputs;\n}\n\nfunction onNodeClick(nodeName: string, connectionType: ConnectionTypes) {\n\tif (isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType)) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('switchSelectedNode', nodeName);\n}\n\nfunction onPlusClick(connectionType: ConnectionTypes) {\n\tconst connectionNodes = connectedNodes.value[connectionType];\n\tif (\n\t\tisMultiConnection(connectionType) &&\n\t\t!expandedGroups.value.includes(connectionType) &&\n\t\tconnectionNodes.length >= 1\n\t) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('openConnectionNodeCreator', props.rootNode.name, connectionType);\n}\n\nfunction showNodeInputsIssues() {\n\tshouldShowNodeInputIssues.value = false;\n\t// Reset animation\n\tsetTimeout(() => {\n\t\tshouldShowNodeInputIssues.value = true;\n\t}, 0);\n}\n\nwatch(\n\tnodeData,\n\tdebounce(\n\t\t() =>\n\t\t\tsetTimeout(() => {\n\t\t\t\texpandedGroups.value = [];\n\t\t\t\tpossibleConnections.value = getPossibleSubInputConnections();\n\t\t\t}, 0),\n\t\t{ debounceTime: 1000 },\n\t),\n\t{ immediate: true },\n);\n\ndefineExpose({\n\tshowNodeInputsIssues,\n});\n</script>\n\n<style lang=\"scss\" module>\n@keyframes horizontal-shake {\n\t0% {\n\t\ttransform: translateX(0);\n\t}\n\t25% {\n\t\ttransform: translateX(5px);\n\t}\n\t50% {\n\t\ttransform: translateX(-5px);\n\t}\n\t75% {\n\t\ttransform: translateX(5px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n.container {\n\t--node-size: 45px;\n\t--plus-button-size: 30px;\n\t--animation-duration: 150ms;\n\t--collapsed-offset: 10px;\n\tpadding-top: calc(var(--node-size) + var(--spacing-3xs));\n}\n.connections {\n\t// Make sure container has matching height if there's no connections\n\t// since the plus button is absolutely positioned\n\tmin-height: calc(var(--node-size) + var(--spacing-m));\n\tposition: absolute;\n\tbottom: calc((var(--node-size) / 2) * -1);\n\tleft: 0;\n\tright: 0;\n\tuser-select: none;\n\tjustify-content: space-between;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--possible-connections), 1fr);\n}\n.connectionType {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\ttransition: all calc((var(--animation-duration) - 50ms)) ease;\n}\n.connectionLabel {\n\tmargin-bottom: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\tuser-select: none;\n\ttext-wrap: nowrap;\n\n\t&.hasIssues {\n\t\tcolor: var(--color-danger);\n\t}\n}\n.connectedNodesWrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: space-between;\n\tposition: relative;\n}\n.plusButton {\n\ttransition: all var(--animation-duration) ease;\n\tposition: absolute;\n\ttop: var(--spacing-2xs);\n\n\t&.hasIssues {\n\t\tanimation: horizontal-shake 500ms;\n\t\tbutton {\n\t\t\t--button-font-color: var(--color-danger);\n\t\t\t--button-border-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tz-index: 1;\n\t\tright: 100%;\n\t\tmargin-right: calc((var(--plus-button-size) * -1) * 0.9);\n\t\tpointer-events: none;\n\n\t\t.connectedNodesWrapperExpanded & {\n\t\t\t// left: 100%;\n\t\t\tmargin-right: var(--spacing-2xs);\n\t\t\topacity: 1;\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n}\n\n.connectedNodesMultiple {\n\ttransition: all var(--animation-duration) ease;\n}\n.connectedNodesWrapperExpanded {\n\tz-index: 1;\n}\n// Hide all other connection groups when one is expanded\n.connections:has(.connectedNodesWrapperExpanded)\n\t.connectionType:not(:has(.connectedNodesWrapperExpanded)) {\n\topacity: 0;\n\tpointer-events: none;\n\tvisibility: hidden;\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-xs);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: all var(--animation-duration) ease;\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n}\n.connectedNodes {\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-right: calc(\n\t\t(var(--nodes-length) - 1) * (-1 * (var(--node-size) - var(--collapsed-offset)))\n\t);\n\t.connectedNodesWrapperExpanded & {\n\t\tmargin-right: 0;\n\t\t// Negative margin to offset the absolutely positioned plus button\n\t\t// when the nodes are expanded to center the nodes\n\t\tmargin-right: calc((var(--spacing-2xs) + var(--plus-button-size)) * -1);\n\t}\n}\n.nodeWrapper {\n\ttransition: all var(--animation-duration) ease;\n\ttransform-origin: center;\n\tz-index: 1;\n\t.connectedNodesWrapperExpanded &:not(:first-child) {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n\t&.hasIssues {\n\t\t.connectedNode {\n\t\t\tborder-width: calc(var(--border-width-base) * 2);\n\t\t\tborder-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:first-child) {\n\t\ttransform: translateX(\n\t\t\tcalc(var(--node-index) * (-1 * (var(--node-size) - var(--collapsed-offset))))\n\t\t);\n\t}\n\n\t.connectedNodesWrapperExpanded & {\n\t\ttransform: translateX(0);\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<n8n-tooltip placement=\"bottom\" :disabled=\"!disabledHint\">\n\t\t\t<template #content>\n\t\t\t\t<div>{{ disabledHint }}</div>\n\t\t\t</template>\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-bind=\"$attrs\"\n\t\t\t\t\t:loading=\"nodeRunning && !isListeningForEvents && !isListeningForWorkflowEvents\"\n\t\t\t\t\t:disabled=\"disabled || !!disabledHint\"\n\t\t\t\t\t:label=\"buttonLabel\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:size=\"size\"\n\t\t\t\t\t:icon=\"!isListeningForEvents && !hideIcon ? 'flask' : undefined\"\n\t\t\t\t\t:transparent-background=\"transparent\"\n\t\t\t\t\t:title=\"!isTriggerNode ? $locale.baseText('ndv.execute.testNode.description') : ''\"\n\t\t\t\t\t@click=\"onClick\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tWEBHOOK_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tMODAL_CONFIRM,\n\tFORM_TRIGGER_NODE_TYPE,\n\tCHAT_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tinheritAttrs: false,\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t},\n\t\ttransparent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttelemetrySource: {\n\t\t\ttype: String,\n\t\t},\n\t\thideIcon: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['stopExecution', 'execute'],\n\tsetup(props) {\n\t\tconst router = useRouter();\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst node = workflowsStore.getNodeByName(props.nodeName);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tpinnedData,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tnodeRunning(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\t(this.workflowsStore.isNodeExecuting(this.node.name) || triggeredNode === this.node.name)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tisManualTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === MANUAL_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === CHAT_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatChild(): boolean {\n\t\t\treturn this.workflowsStore.checkIfNodeHasChatParent(this.nodeName);\n\t\t},\n\t\tisFormTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === FORM_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!this.nodeType?.group.includes('schedule');\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\n\t\t\treturn (\n\t\t\t\tthis.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tisListeningForWorkflowEvents(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.nodeRunning &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode\n\t\t\t);\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tdisabledHint(): string {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.node.disabled) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.nodeIsDisabled');\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.hasIssues) {\n\t\t\t\tconst activeNode = this.ndvStore.activeNode;\n\t\t\t\tif (activeNode && activeNode.name !== this.nodeName) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.execute.fixPrevious');\n\t\t\t\t}\n\n\t\t\t\treturn this.$locale.baseText('ndv.execute.requiredFieldsMissing');\n\t\t\t}\n\n\t\t\tif (this.workflowRunning && !this.nodeRunning) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.workflowAlreadyRunning');\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tbuttonLabel(): string {\n\t\t\tif (this.isListeningForEvents || this.isListeningForWorkflowEvents) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.stopListening');\n\t\t\t}\n\n\t\t\tif (this.label) {\n\t\t\t\treturn this.label;\n\t\t\t}\n\n\t\t\tif (this.isChatNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testChat');\n\t\t\t}\n\n\t\t\tif (this.isWebhookNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForTestEvent');\n\t\t\t}\n\n\t\t\tif (this.isFormTriggerNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testStep');\n\t\t\t}\n\n\t\t\tif (this.isPollingTypeNode || this.nodeType?.mockManualExecution) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.fetchEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('ndv.execute.testNode');\n\t\t},\n\t},\n\tmethods: {\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('ndv.execute.stopWaitingForWebhook.error'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\tasync onClick() {\n\t\t\t// Show chat if it's a chat node or a child of a chat node with no input data\n\t\t\tif (this.isChatNode || (this.isChatChild && this.ndvStore.isNDVDataEmpty('input'))) {\n\t\t\t\tthis.ndvStore.setActiveNodeName(null);\n\t\t\t\tnodeViewEventBus.emit('openChat');\n\t\t\t} else if (this.isListeningForEvents) {\n\t\t\t\tawait this.stopWaitingForWebhook();\n\t\t\t} else if (this.isListeningForWorkflowEvents) {\n\t\t\t\tawait this.stopCurrentExecution();\n\t\t\t\tthis.$emit('stopExecution');\n\t\t\t} else {\n\t\t\t\tlet shouldUnpinAndExecute = false;\n\t\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\t\tconst confirmResult = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.description'),\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.title'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.confirm'),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.cancel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tshouldUnpinAndExecute = confirmResult === MODAL_CONFIRM;\n\n\t\t\t\t\tif (shouldUnpinAndExecute && this.node) {\n\t\t\t\t\t\tthis.pinnedData.unsetData('unpin-and-execute-modal');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!this.pinnedData.hasData.value || shouldUnpinAndExecute) {\n\t\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\t\tnode_type: this.nodeType ? this.nodeType.name : null,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsource: this.telemetrySource,\n\t\t\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t\t\t};\n\t\t\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\t\t\tawait this.externalHooks.run('nodeExecuteButton.onClick', telemetryPayload);\n\n\t\t\t\t\tawait this.runWorkflow({\n\t\t\t\t\t\tdestinationNode: this.nodeName,\n\t\t\t\t\t\tsource: 'RunData.ExecuteNodeButton',\n\t\t\t\t\t});\n\t\t\t\t\tthis.$emit('execute');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'node-settings': true,\n\t\t\tdragging: dragging,\n\t\t}\"\n\t\t@keydown.stop\n\t>\n\t\t<div :class=\"$style.header\">\n\t\t\t<div class=\"header-side-menu\">\n\t\t\t\t<NodeTitle\n\t\t\t\t\tv-if=\"node\"\n\t\t\t\t\tclass=\"node-name\"\n\t\t\t\t\t:model-value=\"node.name\"\n\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t@update:model-value=\"nameChanged\"\n\t\t\t\t></NodeTitle>\n\t\t\t\t<div v-if=\"isExecutable\">\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tv-if=\"!blockUI && node && nodeValid\"\n\t\t\t\t\t\tdata-test-id=\"node-execute-button\"\n\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t:disabled=\"outputPanelEditMode.enabled && !isTriggerNode\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\ttelemetry-source=\"parameters\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeSettingsTabs\n\t\t\t\tv-if=\"node && nodeValid\"\n\t\t\t\tv-model=\"openPanel\"\n\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"node && !nodeValid\" class=\"node-is-not-valid\">\n\t\t\t<p :class=\"$style.warningIcon\">\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t</p>\n\t\t\t<div class=\"missingNodeTitleContainer mt-s mb-xs\">\n\t\t\t\t<n8n-text size=\"large\" color=\"text-dark\" bold>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.title') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-if=\"isCommunityNode\" :class=\"$style.descriptionContainer\">\n\t\t\t\t<div class=\"mb-l\">\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\tkeypath=\"nodeSettings.communityNodeUnknown.description\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t@click=\"onMissingNodeTextClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://www.npmjs.com/package/${node.type.split('.')[0]}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ node.type.split('.')[0] }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"COMMUNITY_NODES_INSTALLATION_DOCS_URL\"\n\t\t\t\t\t@click=\"onMissingNodeLearnMoreLinkClick\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.installLink.text') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t\t<i18n-t v-else keypath=\"nodeSettings.nodeTypeUnknown.description\" tag=\"span\">\n\t\t\t\t<template #action>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"CUSTOM_NODES_DOCS_URL\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tv-text=\"$locale.baseText('nodeSettings.nodeTypeUnknown.description.customNode')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-if=\"node && nodeValid\" class=\"node-parameters-wrapper\" data-test-id=\"node-parameters\">\n\t\t\t<n8n-notice\n\t\t\t\tv-if=\"hasForeignCredential\"\n\t\t\t\t:content=\"\n\t\t\t\t\t$locale.baseText('nodeSettings.hasForeignCredential', {\n\t\t\t\t\t\tinterpolate: { owner: credentialOwnerName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t\t<div v-show=\"openPanel === 'params'\">\n\t\t\t\t<NodeWebhooks :node=\"node\" :node-type=\"nodeType\" />\n\n\t\t\t\t<ParameterInputList\n\t\t\t\t\tv-if=\"nodeValuesInitialized\"\n\t\t\t\t\t:parameters=\"parametersNoneSetting\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t>\n\t\t\t\t\t<NodeCredentials\n\t\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t\t:readonly=\"isReadOnly\"\n\t\t\t\t\t\t:show-all=\"true\"\n\t\t\t\t\t\t:hide-issues=\"hiddenIssuesInputs.includes('credentials')\"\n\t\t\t\t\t\t@credential-selected=\"credentialSelected\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@blur=\"onParameterBlur\"\n\t\t\t\t\t/>\n\t\t\t\t</ParameterInputList>\n\t\t\t\t<div v-if=\"parametersNoneSetting.length === 0\" class=\"no-parameters\">\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t{{ $locale.baseText('nodeSettings.thisNodeDoesNotHaveAnyParameters') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"nodeHelpers.isCustomApiCallSelected(nodeValues)\"\n\t\t\t\t\tclass=\"parameter-item parameter-notice\"\n\t\t\t\t\tdata-test-id=\"node-parameters-http-notice\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-notice\n\t\t\t\t\t\t:content=\"\n\t\t\t\t\t\t\t$locale.baseText('nodeSettings.useTheHttpRequestNode', {\n\t\t\t\t\t\t\t\tinterpolate: { nodeTypeDisplayName: nodeType.displayName },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-show=\"openPanel === 'settings'\">\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"parametersSetting\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"nodeSettings\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"node-version\" data-test-id=\"node-version\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeSettings.nodeVersion', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: nodeType?.displayName as string,\n\t\t\t\t\t\t\t\tversion: (node.typeVersion ?? latestVersion).toString(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\t<span>({{ nodeVersionTag }})</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<NDVSubConnections\n\t\t\tv-if=\"node\"\n\t\t\tref=\"subConnections\"\n\t\t\t:root-node=\"node\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t/>\n\t\t<n8n-block-ui :show=\"blockUI\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type {\n\tINodeTypeDescription,\n\tINodeParameters,\n\tINodeProperties,\n\tNodeParameterValue,\n\tConnectionTypes,\n} from 'n8n-workflow';\nimport {\n\tNodeHelpers,\n\tNodeConnectionType,\n\tdeepCopy,\n\tisINodePropertyCollectionList,\n\tisINodePropertiesList,\n\tisINodePropertyOptionsList,\n\tdisplayParameter,\n} from 'n8n-workflow';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tIUsedCredential,\n} from '@/Interface';\n\nimport {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCUSTOM_NODES_DOCS_URL,\n\tMAIN_NODE_PANEL_WIDTH,\n\tSHOULD_CLEAR_NODE_OUTPUTS,\n} from '@/constants';\n\nimport NodeTitle from '@/components/NodeTitle.vue';\nimport ParameterInputList from '@/components/ParameterInputList.vue';\nimport NodeCredentials from '@/components/NodeCredentials.vue';\nimport NodeSettingsTabs from '@/components/NodeSettingsTabs.vue';\nimport NodeWebhooks from '@/components/NodeWebhooks.vue';\nimport NDVSubConnections from '@/components/NDVSubConnections.vue';\nimport { get, set, unset } from 'lodash-es';\n\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { RenameNodeCommand } from '@/models/history';\nimport useWorkflowsEEStore from '@/stores/workflows.ee.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport type { EventBus } from 'n8n-design-system';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { importCurlEventBus } from '@/event-bus';\nimport { useToast } from '@/composables/useToast';\n\nexport default defineComponent({\n\tname: 'NodeSettings',\n\tcomponents: {\n\t\tNodeTitle,\n\t\tNodeCredentials,\n\t\tParameterInputList,\n\t\tNodeSettingsTabs,\n\t\tNodeWebhooks,\n\t\tNDVSubConnections,\n\t\tNodeExecuteButton,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { showMessage } = useToast();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tshowMessage,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseHistoryStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t),\n\t\tisReadOnly(): boolean {\n\t\t\treturn this.readOnly || this.hasForeignCredential;\n\t\t},\n\t\tisExecutable(): boolean {\n\t\t\tif (this.nodeType && this.node) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tif (!inputNames.includes(NodeConnectionType.Main) && !this.isTriggerNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.executable || this.hasForeignCredential;\n\t\t},\n\t\tnodeTypeName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.displayName`,\n\t\t\t\t\tfallback: this.nodeType.name,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tnodeTypeVersions(): number[] {\n\t\t\tif (!this.node) return [];\n\t\t\treturn this.nodeTypesStore.getNodeVersions(this.node.type);\n\t\t},\n\t\tlatestVersion(): number {\n\t\t\treturn Math.max(...this.nodeTypeVersions);\n\t\t},\n\t\tisLatestNodeVersion(): boolean {\n\t\t\treturn !this.node?.typeVersion || this.latestVersion === this.node.typeVersion;\n\t\t},\n\t\tnodeVersionTag(): string {\n\t\t\tif (!this.nodeType || this.nodeType.hidden) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.deprecated');\n\t\t\t}\n\n\t\t\tif (this.isLatestNodeVersion) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.latest');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeSettings.latestVersion', {\n\t\t\t\tinterpolate: { version: this.latestVersion.toString() },\n\t\t\t});\n\t\t},\n\t\tnodeTypeDescription(): string {\n\t\t\tif (this.nodeType?.description) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.description`,\n\t\t\t\t\tfallback: this.nodeType.description,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.noDescriptionFound');\n\t\t\t}\n\t\t},\n\t\theaderStyle(): object {\n\t\t\tif (!this.node) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t'background-color': this.node.color,\n\t\t\t};\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tparametersSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparametersNoneSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn !item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tif (this.nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.nodeType.properties;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\treturn isCommunityPackageName(this.node?.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node?.type);\n\t\t},\n\t\tworkflowOwnerName(): string {\n\t\t\treturn this.workflowsEEStore.getWorkflowOwnerName(`${this.workflowsStore.workflowId}`);\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t\tusedCredentials(): IUsedCredential[] {\n\t\t\treturn Object.values(this.workflowsStore.usedCredentials).filter((credential) => {\n\t\t\t\treturn Object.values(this.node?.credentials || []).find((nodeCredential) => {\n\t\t\t\t\treturn nodeCredential.id === credential.id;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tcredentialOwnerName(): string {\n\t\t\tconst credential = this.usedCredentials\n\t\t\t\t? Object.values(this.usedCredentials).find((credential) => {\n\t\t\t\t\t\treturn credential.id === this.foreignCredentials[0];\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\t\treturn this.credentialsStore.getCredentialOwnerName(credential);\n\t\t},\n\t},\n\tprops: {\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t\tdragging: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tforeignCredentials: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\texecutable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnodeValid: true,\n\t\t\tnodeColor: null,\n\t\t\topenPanel: 'params',\n\t\t\tnodeValues: {\n\t\t\t\tcolor: '#ff0000',\n\t\t\t\talwaysOutputData: false,\n\t\t\t\texecuteOnce: false,\n\t\t\t\tnotesInFlow: false,\n\t\t\t\tonError: 'stopWorkflow',\n\t\t\t\tretryOnFail: false,\n\t\t\t\tmaxTries: 3,\n\t\t\t\twaitBetweenTries: 1000,\n\t\t\t\tnotes: '',\n\t\t\t\tparameters: {},\n\t\t\t} as INodeParameters,\n\t\t\tnodeValuesInitialized: false, // Used to prevent nodeValues from being overwritten by defaults on reopening ndv\n\n\t\t\tnodeSettings: [] as INodeProperties[],\n\t\t\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\tCUSTOM_NODES_DOCS_URL,\n\t\t\tMAIN_NODE_PANEL_WIDTH,\n\t\t\thiddenIssuesInputs: [] as string[],\n\t\t};\n\t},\n\twatch: {\n\t\tnode(newNode, oldNode) {\n\t\t\tthis.setNodeValues();\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.populateHiddenIssuesSet();\n\t\tthis.populateSettings();\n\t\tthis.setNodeValues();\n\t\tthis.eventBus?.on('openSettings', this.openSettings);\n\n\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node as INodeUi, this.nodeType);\n\t\timportCurlEventBus.on('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t\timportCurlEventBus.off('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tmethods: {\n\t\tsetHttpNodeParameters(parameters: Record<string, unknown>) {\n\t\t\ttry {\n\t\t\t\tthis.valueChanged({\n\t\t\t\t\tnode: this.node.name,\n\t\t\t\t\tname: 'parameters',\n\t\t\t\t\tvalue: parameters,\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t},\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tonOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', node, connectionType);\n\t\t},\n\t\tpopulateHiddenIssuesSet() {\n\t\t\tif (!this.node || !this.workflowsStore.isNodePristine(this.node.name)) return;\n\n\t\t\tthis.hiddenIssuesInputs.push('credentials');\n\t\t\tthis.parametersNoneSetting.forEach((parameter) => {\n\t\t\t\tthis.hiddenIssuesInputs.push(parameter.name);\n\t\t\t});\n\n\t\t\tthis.workflowsStore.setNodePristine(this.node.name, false);\n\t\t},\n\t\tpopulateSettings() {\n\t\t\tif (this.isExecutable && !this.isTriggerNode) {\n\t\t\t\tthis.nodeSettings.push(\n\t\t\t\t\t...([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.alwaysOutputData.displayName'),\n\t\t\t\t\t\t\tname: 'alwaysOutputData',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.alwaysOutputData.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.executeOnce.displayName'),\n\t\t\t\t\t\t\tname: 'executeOnce',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.executeOnce.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.retryOnFail.displayName'),\n\t\t\t\t\t\t\tname: 'retryOnFail',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.retryOnFail.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.maxTries.displayName'),\n\t\t\t\t\t\t\tname: 'maxTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 2,\n\t\t\t\t\t\t\t\tmaxValue: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 3,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.maxTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.waitBetweenTries.displayName'),\n\t\t\t\t\t\t\tname: 'waitBetweenTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\t\tmaxValue: 5000,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.waitBetweenTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.onError.displayName'),\n\t\t\t\t\t\t\tname: 'onError',\n\t\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'stopWorkflow',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueRegularOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueErrorOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: 'stopWorkflow',\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.onError.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t] as INodeProperties[]),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.nodeSettings.push(\n\t\t\t\t...([\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notes.displayName'),\n\t\t\t\t\t\tname: 'notes',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 5,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notes.description'),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notesInFlow.displayName'),\n\t\t\t\t\t\tname: 'notesInFlow',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notesInFlow.description'),\n\t\t\t\t\t},\n\t\t\t\t] as INodeProperties[]),\n\t\t\t);\n\t\t},\n\t\tonParameterBlur(parameterName: string) {\n\t\t\tthis.hiddenIssuesInputs = this.hiddenIssuesInputs.filter((name) => name !== parameterName);\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('activate');\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\t(this.$refs.subConnections as InstanceType<typeof NDVSubConnections>)?.showNodeInputsIssues();\n\t\t\tthis.$emit('execute');\n\t\t},\n\t\tsetValue(name: string, value: NodeParameterValue) {\n\t\t\tconst nameParts = name.split('.');\n\t\t\tlet lastNamePart: string | undefined = nameParts.pop();\n\n\t\t\tlet isArray = false;\n\t\t\tif (lastNamePart !== undefined && lastNamePart.includes('[')) {\n\t\t\t\t// It includes an index so we have to extract it\n\t\t\t\tconst lastNameParts = lastNamePart.match(/(.*)\\[(\\d+)\\]$/);\n\t\t\t\tif (lastNameParts) {\n\t\t\t\t\tnameParts.push(lastNameParts[1]);\n\t\t\t\t\tlastNamePart = lastNameParts[2];\n\t\t\t\t\tisArray = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the value so that everything updates correctly in the UI\n\t\t\tif (nameParts.length === 0) {\n\t\t\t\t// Data is on top level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\tthis.nodeValues = remainingNodeValues;\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t[lastNamePart as string]: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Data is on lower level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tlet tempValue = get(this.nodeValues, nameParts.join('.')) as\n\t\t\t\t\t\t| INodeParameters\n\t\t\t\t\t\t| INodeParameters[];\n\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\ttempValue = remainingNodeValues;\n\n\t\t\t\t\tif (isArray && (tempValue as INodeParameters[]).length === 0) {\n\t\t\t\t\t\t// If a value from an array got delete and no values are left\n\t\t\t\t\t\t// delete also the parent\n\t\t\t\t\t\tlastNamePart = nameParts.pop();\n\t\t\t\t\t\ttempValue = get(this.nodeValues, nameParts.join('.')) as INodeParameters;\n\t\t\t\t\t\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tdeepCopy(value),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.nodeValues = { ...this.nodeValues };\n\t\t},\n\t\tcredentialSelected(updateInformation: INodeUpdatePropertiesInformation) {\n\t\t\t// Update the values on the node\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(updateInformation.name);\n\n\t\t\tif (node) {\n\t\t\t\t// Update the issues\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssues(node);\n\t\t\t}\n\n\t\t\tvoid this.externalHooks.run('nodeSettings.credentialSelected', { updateInformation });\n\t\t},\n\t\tnameChanged(name: string) {\n\t\t\tif (this.node) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(this.node.name, name));\n\t\t\t}\n\t\t\t// @ts-ignore\n\t\t\tthis.valueChanged({\n\t\t\t\tvalue: name,\n\t\t\t\tname: 'name',\n\t\t\t});\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tlet newValue: NodeParameterValue;\n\n\t\t\tif (parameterData.hasOwnProperty('value')) {\n\t\t\t\t// New value is given\n\t\t\t\tnewValue = parameterData.value as string | number;\n\t\t\t} else {\n\t\t\t\t// Get new value from nodeData where it is set already\n\t\t\t\tnewValue = get(this.nodeValues, parameterData.name) as NodeParameterValue;\n\t\t\t}\n\t\t\t// Save the node name before we commit the change because\n\t\t\t// we need the old name to rename the node properly\n\t\t\tconst nodeNameBefore = parameterData.node || this.node?.name;\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeNameBefore);\n\n\t\t\tif (node === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'onError') {\n\t\t\t\t// If that parameter changes, we need to redraw the connections, as the error output may need to be added or removed\n\t\t\t\tthis.$emit('redrawRequired');\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'name') {\n\t\t\t\t// Name of node changed so we have to set also the new node name as active\n\n\t\t\t\t// Update happens in NodeView so emit event\n\t\t\t\tconst sendData = {\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t\toldValue: nodeNameBefore,\n\t\t\t\t\tname: parameterData.name,\n\t\t\t\t};\n\t\t\t\tthis.$emit('valueChanged', sendData);\n\t\t\t} else if (parameterData.name === 'parameters') {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t// actual parameter name\n\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\t\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t\t// the needed data like path and index\n\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t// Apply the new value\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\toldNodeParameters,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeParameters) {\n\t\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\t}\n\t\t\t} else if (parameterData.name.startsWith('parameters.')) {\n\t\t\t\t// A node parameter changed\n\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tparameterData.type &&\n\t\t\t\t\tthis.workflowsStore.nodeHasOutputConnection(node.name) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.eventTypes.includes(parameterData.type) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.parameterPaths.includes(parameterData.name)\n\t\t\t\t) {\n\t\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node, { preserveInputConnections: true });\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeSettings.outputCleared.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeSettings.outputCleared.message'),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t// actual parameter name\n\t\t\t\tconst parameterPath = parameterData.name.split('.').slice(1).join('.');\n\n\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t// the needed data like path and index\n\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t// Apply the new value\n\t\t\t\tif (parameterData.value === undefined && parameterPathArray !== null) {\n\t\t\t\t\t// Delete array item\n\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t}\n\t\t\t\t\t// If value is updated, remove parameter values that have invalid options\n\t\t\t\t\t// so getNodeParameters checks don't fail\n\t\t\t\t\tthis.removeMismatchedOptionValues(nodeType, nodeParameters, {\n\t\t\t\t\t\tname: parameterPath,\n\t\t\t\t\t\tvalue: newValue,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update the data in vuex\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\tparameterPath,\n\t\t\t\t\tnewValue,\n\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\toldNodeParameters,\n\t\t\t\t});\n\n\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\tthis.$telemetry.trackNodeParametersValuesChange(nodeType.name, parameterData);\n\t\t\t} else {\n\t\t\t\t// A property on the node itself changed\n\n\t\t\t\t// Update data in settings\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t[parameterData.name]: newValue,\n\t\t\t\t};\n\n\t\t\t\t// Update data in vuex\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tkey: parameterData.name,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeValue(updateInformation);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Removes node values that are not valid options for the given parameter.\n\t\t * This can happen when there are multiple node parameters with the same name\n\t\t * but different options and display conditions\n\t\t * @param nodeType The node type description\n\t\t * @param nodeParameterValues Current node parameter values\n\t\t * @param updatedParameter The parameter that was updated. Will be used to determine which parameters to remove based on their display conditions and option values\n\t\t */\n\t\tremoveMismatchedOptionValues(\n\t\t\tnodeType: INodeTypeDescription,\n\t\t\tnodeParameterValues: INodeParameters | null,\n\t\t\tupdatedParameter: { name: string; value: NodeParameterValue },\n\t\t) {\n\t\t\tnodeType.properties.forEach((prop) => {\n\t\t\t\tconst displayOptions = prop.displayOptions;\n\t\t\t\t// Not processing parameters that are not set or don't have options\n\t\t\t\tif (!nodeParameterValues?.hasOwnProperty(prop.name) || !displayOptions || !prop.options) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Only process the parameters that depend on the updated parameter\n\t\t\t\tconst showCondition = displayOptions.show?.[updatedParameter.name];\n\t\t\t\tconst hideCondition = displayOptions.hide?.[updatedParameter.name];\n\t\t\t\tif (showCondition === undefined && hideCondition === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet hasValidOptions = true;\n\n\t\t\t\t// Every value should be a possible option\n\t\t\t\tif (isINodePropertyCollectionList(prop.options) || isINodePropertiesList(prop.options)) {\n\t\t\t\t\thasValidOptions = Object.keys(nodeParameterValues).every(\n\t\t\t\t\t\t(key) => (prop.options ?? []).find((option) => option.name === key) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t} else if (isINodePropertyOptionsList(prop.options)) {\n\t\t\t\t\thasValidOptions = !!prop.options.find(\n\t\t\t\t\t\t(option) => option.value === nodeParameterValues[prop.name],\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!hasValidOptions && displayParameter(nodeParameterValues, prop, this.node)) {\n\t\t\t\t\tunset(nodeParameterValues as object, prop.name);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Sets the values of the active node in the internal settings variables\n\t\t */\n\t\tsetNodeValues() {\n\t\t\t// No node selected\n\t\t\tif (!this.node) {\n\t\t\t\tthis.nodeValuesInitialized = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.nodeType !== null) {\n\t\t\t\tthis.nodeValid = true;\n\n\t\t\t\tconst foundNodeSettings = [];\n\t\t\t\tif (this.node.color) {\n\t\t\t\t\tfoundNodeSettings.push('color');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tcolor: this.node.color,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notes) {\n\t\t\t\t\tfoundNodeSettings.push('notes');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotes: this.node.notes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.alwaysOutputData) {\n\t\t\t\t\tfoundNodeSettings.push('alwaysOutputData');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\talwaysOutputData: this.node.alwaysOutputData,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.executeOnce) {\n\t\t\t\t\tfoundNodeSettings.push('executeOnce');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\texecuteOnce: this.node.executeOnce,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.continueOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: 'continueRegularOutput',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.onError) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: this.node.onError,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notesInFlow) {\n\t\t\t\t\tfoundNodeSettings.push('notesInFlow');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotesInFlow: this.node.notesInFlow,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.retryOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('retryOnFail');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tretryOnFail: this.node.retryOnFail,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.maxTries) {\n\t\t\t\t\tfoundNodeSettings.push('maxTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tmaxTries: this.node.maxTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.waitBetweenTries) {\n\t\t\t\t\tfoundNodeSettings.push('waitBetweenTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\twaitBetweenTries: this.node.waitBetweenTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Set default node settings\n\t\t\t\tfor (const nodeSetting of this.nodeSettings) {\n\t\t\t\t\tif (!foundNodeSettings.includes(nodeSetting.name)) {\n\t\t\t\t\t\t// Set default value\n\t\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t\t[nodeSetting.name]: nodeSetting.default,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\tparameters: deepCopy(this.node.parameters),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.nodeValid = false;\n\t\t\t}\n\n\t\t\tthis.nodeValuesInitialized = true;\n\t\t},\n\t\tonMissingNodeTextClick(event: MouseEvent) {\n\t\t\tif ((event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr browse button', {\n\t\t\t\t\tsource: 'cnr missing node modal',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonMissingNodeLearnMoreLinkClick() {\n\t\t\tthis.$telemetry.track('user clicked cnr docs link', {\n\t\t\t\tsource: 'missing node modal source',\n\t\t\t\tpackage_name: this.node?.type.split('.')[0],\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.openPanel = 'settings';\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.header {\n\tbackground-color: var(--color-background-base);\n}\n\n.warningIcon {\n\tcolor: var(--color-text-lighter);\n\tfont-size: var(--font-size-2xl);\n}\n\n.descriptionContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-xlight);\n\theight: 100%;\n\twidth: 100%;\n\n\t.no-parameters {\n\t\tmargin-top: var(--spacing-xs);\n\t}\n\n\t.header-side-menu {\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\t\tfont-size: var(--font-size-l);\n\t\tdisplay: flex;\n\n\t\t.node-name {\n\t\t\tpadding-top: var(--spacing-5xs);\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t.node-is-not-valid {\n\t\theight: 75%;\n\t\tpadding: 10px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tline-height: var(--font-line-height-regular);\n\t}\n\n\t.node-parameters-wrapper {\n\t\toverflow-y: auto;\n\t\tpadding: 0 var(--spacing-m) var(--spacing-l) var(--spacing-m);\n\t\tflex-grow: 1;\n\t}\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.parameter-content {\n\tfont-size: 0.9em;\n\tmargin-right: -15px;\n\tmargin-left: -15px;\n\tinput {\n\t\twidth: calc(100% - 35px);\n\t\tpadding: 5px;\n\t}\n\tselect {\n\t\twidth: calc(100% - 20px);\n\t\tpadding: 5px;\n\t}\n\n\t&:before {\n\t\tdisplay: table;\n\t\tcontent: ' ';\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\tclear: both;\n\t}\n}\n\n.parameter-wrapper {\n\tpadding: 0 1em;\n}\n\n.color-reset-button-wrapper {\n\tposition: relative;\n}\n.color-reset-button {\n\tposition: absolute;\n\tright: 7px;\n\ttop: -25px;\n}\n\n.node-version {\n\tborder-top: var(--border-base);\n\tfont-size: var(--font-size-xs);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-xs) 0 var(--spacing-2xs) 0;\n\tcolor: var(--color-text-light);\n}\n\n.parameter-value {\n\tinput.expression {\n\t\tborder-style: dashed;\n\t\tborder-color: #ff9600;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tbackground-color: #793300;\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"tag\"\n\t\tref=\"wrapper\"\n\t\t:class=\"{ [$style.dragging]: isDragging }\"\n\t\t@mousedown=\"onDragStart\"\n\t>\n\t\t<slot :is-dragging=\"isDragging\"></slot>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div v-show=\"isDragging\" ref=\"draggable\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<slot name=\"preview\" :can-drop=\"canDrop\" :el=\"draggingEl\"></slot>\n\t\t\t</div>\n\t\t</Teleport>\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport type { XYPosition } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'Draggable',\n\tprops: {\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t\ttargetDataKey: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tdata() {\n\t\tconst draggablePosition = {\n\t\t\tx: -100,\n\t\t\ty: -100,\n\t\t};\n\n\t\treturn {\n\t\t\tisDragging: false,\n\t\t\tdraggablePosition,\n\t\t\tdraggingEl: null as null | HTMLElement,\n\t\t\tdraggableStyle: {\n\t\t\t\ttransform: `translate(${draggablePosition.x}px, ${draggablePosition.y}px)`,\n\t\t\t},\n\t\t\tanimationFrameId: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tcanDrop(): boolean {\n\t\t\treturn this.ndvStore.canDraggableDrop;\n\t\t},\n\t\tstickyPosition(): XYPosition | null {\n\t\t\treturn this.ndvStore.draggableStickyPos;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggableStyle() {\n\t\t\tthis.draggableStyle = {\n\t\t\t\ttransform: `translate(${this.draggablePosition.x}px, ${this.draggablePosition.y}px)`,\n\t\t\t};\n\t\t},\n\t\tonDragStart(e: MouseEvent) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.draggingEl = e.target as HTMLElement;\n\t\t\tif (this.targetDataKey && this.draggingEl.dataset?.target !== this.targetDataKey) {\n\t\t\t\tthis.draggingEl = this.draggingEl.closest(\n\t\t\t\t\t`[data-target=\"${this.targetDataKey}\"]`,\n\t\t\t\t) as HTMLElement;\n\t\t\t}\n\n\t\t\tif (this.targetDataKey && this.draggingEl?.dataset?.target !== this.targetDataKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.isDragging = false;\n\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\tthis.setDraggableStyle();\n\n\t\t\twindow.addEventListener('mousemove', this.onDrag);\n\t\t\twindow.addEventListener('mouseup', this.onDragEnd);\n\n\t\t\t// blur so that any focused inputs update value\n\t\t\tconst activeElement = document.activeElement as HTMLElement;\n\t\t\tif (activeElement) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t},\n\t\tonDrag(e: MouseEvent) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isDragging) {\n\t\t\t\tthis.isDragging = true;\n\n\t\t\t\tconst data =\n\t\t\t\t\tthis.targetDataKey && this.draggingEl ? this.draggingEl.dataset.value : this.data || '';\n\t\t\t\tthis.ndvStore.draggableStartDragging({\n\t\t\t\t\ttype: this.type,\n\t\t\t\t\tdata: data || '',\n\t\t\t\t\tdimensions: this.draggingEl?.getBoundingClientRect() ?? null,\n\t\t\t\t});\n\n\t\t\t\tthis.$emit('dragstart', this.draggingEl);\n\t\t\t\tdocument.body.style.cursor = 'grabbing';\n\t\t\t}\n\n\t\t\tthis.animationFrameId = window.requestAnimationFrame(() => {\n\t\t\t\tif (this.canDrop && this.stickyPosition) {\n\t\t\t\t\tthis.draggablePosition = { x: this.stickyPosition[0], y: this.stickyPosition[1] };\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\t\t}\n\t\t\t\tthis.setDraggableStyle();\n\t\t\t\tthis.$emit('drag', this.draggablePosition);\n\t\t\t});\n\t\t},\n\t\tonDragEnd() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.style.cursor = 'unset';\n\t\t\twindow.removeEventListener('mousemove', this.onDrag);\n\t\t\twindow.removeEventListener('mouseup', this.onDragEnd);\n\t\t\twindow.cancelAnimationFrame(this.animationFrameId);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('dragend', this.draggingEl);\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggingEl = null;\n\t\t\t\tthis.ndvStore.draggableStopDragging();\n\t\t\t}, 0);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragging {\n\tvisibility: visible;\n\tcursor: grabbing;\n}\n\n.draggable {\n\tposition: fixed;\n\tz-index: 9999999;\n\ttop: 0;\n\tleft: 0;\n}\n\n.draggable-data-transfer {\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","<template>\n\t<Draggable\n\t\ttype=\"panel-resize\"\n\t\t:class=\"$style.dragContainer\"\n\t\t@drag=\"onDrag\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #default=\"{ isDragging }\">\n\t\t\t<div :class=\"{ [$style.dragButton]: true }\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveLeft\"\n\t\t\t\t\t:class=\"{ [$style.leftArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveRight\"\n\t\t\t\t\t:class=\"{ [$style.rightArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-right\" />\n\t\t\t\t</span>\n\t\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</Draggable>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Draggable from './Draggable.vue';\n\nexport default defineComponent({\n\tcomponents: {\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tcanMoveRight: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanMoveLeft: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\tmethods: {\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tthis.$emit('drag', e);\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.$emit('dragstart');\n\t\t},\n\t\tonDragEnd() {\n\t\t\tthis.$emit('dragend');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragContainer {\n\tpointer-events: all;\n}\n.dragButton {\n\tbackground-color: var(--color-background-base);\n\twidth: 64px;\n\theight: 21px;\n\tborder-top-left-radius: var(--border-radius-base);\n\tborder-top-right-radius: var(--border-radius-base);\n\tcursor: grab;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: visible;\n\tposition: relative;\n\tz-index: 3;\n\n\t&:hover {\n\t\t.leftArrow,\n\t\t.rightArrow {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.visible {\n\tvisibility: visible !important;\n}\n\n.arrow {\n\tposition: absolute;\n\tcolor: var(--color-background-xlight);\n\tfont-size: var(--font-size-3xs);\n\tvisibility: hidden;\n\ttop: 0;\n}\n\n.leftArrow {\n\tcomposes: arrow;\n\tleft: -16px;\n}\n\n.rightArrow {\n\tcomposes: arrow;\n\tright: -16px;\n}\n\n.grid {\n\t> div {\n\t\tdisplay: flex;\n\n\t\t&:first-child {\n\t\t\t> div {\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\t\t}\n\n\t\t> div {\n\t\t\theight: 2px;\n\t\t\twidth: 2px;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground-color: var(--color-foreground-xdark);\n\t\t\tmargin-right: 4px;\n\n\t\t\t&:last-child {\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<aside :class=\"$style.floatingNodes\">\n\t\t<ul\n\t\t\tv-for=\"connectionGroup in connectionGroups\"\n\t\t\t:key=\"connectionGroup\"\n\t\t\t:class=\"[$style.nodesList, $style[connectionGroup]]\"\n\t\t>\n\t\t\t<template v-for=\"{ node, nodeType } in connectedNodes[connectionGroup]\">\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"node && nodeType\"\n\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t:placement=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t:offset=\"60\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ node.name }}</template>\n\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\tdata-test-id=\"floating-node\"\n\t\t\t\t\t\t:data-node-name=\"node.name\"\n\t\t\t\t\t\t:data-node-placement=\"connectionGroup\"\n\t\t\t\t\t\t@click=\"$emit('switchSelectedNode', node.name)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t\t:tooltip-position=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t\t\t:size=\"35\"\n\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</template>\n\t\t</ul>\n\t</aside>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, onMounted, onBeforeUnmount } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\n\ninterface Props {\n\trootNode: INodeUi;\n}\nconst enum FloatingNodePosition {\n\ttop = 'outputSub',\n\tright = 'outputMain',\n\tleft = 'inputMain',\n}\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst workflow = workflowsStore.getCurrentWorkflow();\nconst emit = defineEmits(['switchSelectedNode']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n}\nfunction moveNodeDirection(direction: FloatingNodePosition) {\n\tconst matchedDirectionNode = connectedNodes.value[direction][0];\n\tif (matchedDirectionNode) {\n\t\temit('switchSelectedNode', matchedDirectionNode.node.name);\n\t}\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.shiftKey && e.altKey && (e.ctrlKey || e.metaKey)) {\n\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\tconst mapper = {\n\t\t\tArrowUp: FloatingNodePosition.top,\n\t\t\tArrowRight: FloatingNodePosition.right,\n\t\t\tArrowLeft: FloatingNodePosition.left,\n\t\t};\n\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\n\t\tconst matchingDirection = mapper[e.key as keyof typeof mapper] || null;\n\t\tif (matchingDirection) {\n\t\t\tmoveNodeDirection(matchingDirection);\n\t\t}\n\t}\n}\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (nodeType) {\n\t\t\t\t\treturn { node, nodeType };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\nconst connectedNodes = computed<\n\tRecord<FloatingNodePosition, Array<{ node: INodeUi; nodeType: INodeTypeDescription }>>\n>(() => {\n\tconst rootName = props.rootNode.name;\n\treturn {\n\t\t[FloatingNodePosition.top]: getINodesFromNames(\n\t\t\tworkflow.getChildNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)),\n\t\t[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)),\n\t};\n});\n\nconst connectionGroups = [\n\tFloatingNodePosition.top,\n\tFloatingNodePosition.right,\n\tFloatingNodePosition.left,\n];\nconst tooltipPositionMapper = {\n\t[FloatingNodePosition.top]: 'bottom',\n\t[FloatingNodePosition.right]: 'left',\n\t[FloatingNodePosition.left]: 'right',\n};\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown, true);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('keydown', onKeyDown, true);\n});\ndefineExpose({\n\tmoveNodeDirection,\n});\n</script>\n\n<style lang=\"scss\" module>\n.floatingNodes {\n\tposition: fixed;\n\tbottom: 0;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 10;\n\tpointer-events: none;\n}\n.floatingNodes {\n\tright: 0;\n}\n\n.nodesList {\n\tlist-style: none;\n\tpadding: 0;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n\twidth: min-content;\n\tmargin: auto;\n\ttransform-origin: center;\n\tgap: var(--spacing-s);\n\ttransition: transform 0.2s ease-in-out;\n\n\t&.inputSub,\n\t&.outputSub {\n\t\tright: 0;\n\t\tleft: 0;\n\t\tflex-direction: row;\n\t}\n\t&.outputSub {\n\t\ttop: 0;\n\t}\n\t&.inputSub {\n\t\tbottom: 0;\n\t}\n\t&.outputMain,\n\t&.inputMain {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n\t&.outputMain {\n\t\tright: 0;\n\t}\n\t&.inputMain {\n\t\tleft: 0;\n\t}\n\n\t&.outputMain {\n\t\ttransform: translateX(50%);\n\t}\n\t&.outputSub {\n\t\ttransform: translateY(-50%);\n\t}\n\t&.inputMain {\n\t\ttransform: translateX(-50%);\n\t}\n\t&.inputSub {\n\t\ttransform: translateY(50%);\n\t}\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-s);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n\tposition: relative;\n\ttransform: scale(0.8);\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: -35%;\n\t\tright: -30%;\n\t\tbottom: -35%;\n\t\tleft: -30%;\n\t\tz-index: -1;\n\t}\n\t.outputMain &,\n\t.inputMain & {\n\t\tborder-radius: var(--border-radius-large);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.outputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(-50%);\n\t\t}\n\t}\n\t.outputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(50%);\n\t\t}\n\t}\n\t.inputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(50%);\n\t\t}\n\t}\n\t.inputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(-50%);\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<NDVFloatingNodes\n\t\t\tv-if=\"activeNode\"\n\t\t\t:root-node=\"activeNode\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t/>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.inputPanel\" :style=\"inputPanelStyles\">\n\t\t\t<slot name=\"input\"></slot>\n\t\t</div>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.outputPanel\" :style=\"outputPanelStyles\">\n\t\t\t<slot name=\"output\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.mainPanel\" :style=\"mainPanelStyles\">\n\t\t\t<n8n-resize-wrapper\n\t\t\t\t:is-resizing-enabled=\"currentNodePaneType !== 'unknown'\"\n\t\t\t\t:width=\"relativeWidthToPx(mainPanelDimensions.relativeWidth)\"\n\t\t\t\t:min-width=\"MIN_PANEL_WIDTH\"\n\t\t\t\t:grid-size=\"20\"\n\t\t\t\t:supported-directions=\"supportedResizeDirections\"\n\t\t\t\t@resize=\"onResizeDebounced\"\n\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.dragButtonContainer\">\n\t\t\t\t\t<PanelDragButton\n\t\t\t\t\t\tv-if=\"!hideInputAndOutput && isDraggable\"\n\t\t\t\t\t\t:class=\"{ [$style.draggable]: true, [$style.visible]: isDragging }\"\n\t\t\t\t\t\t:can-move-left=\"canMoveLeft\"\n\t\t\t\t\t\t:can-move-right=\"canMoveRight\"\n\t\t\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t\t\t@drag=\"onDrag\"\n\t\t\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"{ [$style.mainPanelInner]: true, [$style.dragging]: isDragging }\">\n\t\t\t\t\t<slot name=\"main\" />\n\t\t\t\t</div>\n\t\t\t</n8n-resize-wrapper>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { get } from 'lodash-es';\nimport { useStorage } from '@/composables/useStorage';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport PanelDragButton from './PanelDragButton.vue';\n\nimport { LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH, MAIN_NODE_PANEL_WIDTH } from '@/constants';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { ndvEventBus } from '@/event-bus';\nimport NDVFloatingNodes from '@/components/NDVFloatingNodes.vue';\nimport { useDebounce } from '@/composables/useDebounce';\n\nconst SIDE_MARGIN = 24;\nconst SIDE_PANELS_MARGIN = 80;\nconst MIN_PANEL_WIDTH = 280;\nconst PANEL_WIDTH = 320;\nconst PANEL_WIDTH_LARGE = 420;\n\nconst initialMainPanelWidth: { [key: string]: number } = {\n\tregular: MAIN_NODE_PANEL_WIDTH,\n\tdragless: MAIN_NODE_PANEL_WIDTH,\n\tunknown: MAIN_NODE_PANEL_WIDTH,\n\tinputless: MAIN_NODE_PANEL_WIDTH,\n\twide: MAIN_NODE_PANEL_WIDTH * 2,\n};\n\nexport default defineComponent({\n\tname: 'NDVDraggablePanels',\n\tcomponents: {\n\t\tPanelDragButton,\n\t\tNDVFloatingNodes,\n\t},\n\tprops: {\n\t\tisDraggable: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideInputAndOutput: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tposition: {\n\t\t\ttype: Number,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn { callDebounced };\n\t},\n\tdata(): {\n\t\twindowWidth: number;\n\t\tisDragging: boolean;\n\t\tMIN_PANEL_WIDTH: number;\n\t\tinitialized: boolean;\n\t} {\n\t\treturn {\n\t\t\twindowWidth: 1,\n\t\t\tisDragging: false,\n\t\t\tMIN_PANEL_WIDTH,\n\t\t\tinitialized: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.setTotalWidth();\n\n\t\t/*\n\t\t\tOnly set(or restore) initial position if `mainPanelDimensions`\n\t\t\tis at the default state({relativeLeft:1, relativeRight: 1, relativeWidth: 1}) to make sure we use store values if they are set\n\t\t*/\n\t\tif (\n\t\t\tthis.mainPanelDimensions.relativeLeft === 1 &&\n\t\t\tthis.mainPanelDimensions.relativeRight === 1\n\t\t) {\n\t\t\tthis.setMainPanelWidth();\n\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\tthis.restorePositionData();\n\t\t}\n\n\t\twindow.addEventListener('resize', this.setTotalWidth);\n\t\tthis.$emit('init', { position: this.mainPanelDimensions.relativeLeft });\n\t\tsetTimeout(() => {\n\t\t\tthis.initialized = true;\n\t\t}, 0);\n\n\t\tndvEventBus.on('setPositionByName', this.setPositionByName);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.setTotalWidth);\n\t\tndvEventBus.off('setPositionByName', this.setPositionByName);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tmainPanelDimensions(): {\n\t\t\trelativeWidth: number;\n\t\t\trelativeLeft: number;\n\t\t\trelativeRight: number;\n\t\t} {\n\t\t\treturn this.ndvStore.getMainPanelDimensions(this.currentNodePaneType);\n\t\t},\n\t\tactiveNode() {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tsupportedResizeDirections(): string[] {\n\t\t\tconst supportedDirections = ['right'];\n\n\t\t\tif (this.isDraggable) supportedDirections.push('left');\n\t\t\treturn supportedDirections;\n\t\t},\n\t\tcurrentNodePaneType(): string {\n\t\t\tif (!this.hasInputSlot) return 'inputless';\n\t\t\tif (!this.isDraggable) return 'dragless';\n\t\t\tif (this.nodeType === null) return 'unknown';\n\t\t\treturn get(this, 'nodeType.parameterPane') || 'regular';\n\t\t},\n\t\thasInputSlot(): boolean {\n\t\t\treturn this.$slots.input !== undefined;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.pxToRelativeWidth(SIDE_PANELS_MARGIN);\n\t\t},\n\t\tminWindowWidth(): number {\n\t\t\treturn 2 * (SIDE_MARGIN + SIDE_PANELS_MARGIN) + MIN_PANEL_WIDTH;\n\t\t},\n\t\tminimumLeftPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\tif (!this.hasInputSlot) return this.pxToRelativeWidth(SIDE_MARGIN);\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tmaximumRightPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tcanMoveLeft(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeLeft > this.minimumLeftPosition;\n\t\t},\n\t\tcanMoveRight(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeRight > this.maximumRightPosition;\n\t\t},\n\t\tmainPanelStyles(): { left: string; right: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeLeft)}px`,\n\t\t\t\tright: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\tinputPanelStyles(): { right: string } {\n\t\t\treturn {\n\t\t\t\tright: `${this.relativeWidthToPx(this.calculatedPositions.inputPanelRelativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\toutputPanelStyles(): { left: string; transform: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.calculatedPositions.outputPanelRelativeLeft)}px`,\n\t\t\t\ttransform: `translateX(-${this.relativeWidthToPx(this.outputPanelRelativeTranslate)}px)`,\n\t\t\t};\n\t\t},\n\t\tcalculatedPositions(): { inputPanelRelativeRight: number; outputPanelRelativeLeft: number } {\n\t\t\tconst hasInput = this.$slots.input !== undefined;\n\t\t\tconst outputPanelRelativeLeft =\n\t\t\t\tthis.mainPanelDimensions.relativeLeft + this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst inputPanelRelativeRight = hasInput\n\t\t\t\t? 1 - outputPanelRelativeLeft + this.mainPanelDimensions.relativeWidth\n\t\t\t\t: 1 - this.pxToRelativeWidth(SIDE_MARGIN);\n\n\t\t\treturn {\n\t\t\t\tinputPanelRelativeRight,\n\t\t\t\toutputPanelRelativeLeft,\n\t\t\t};\n\t\t},\n\t\toutputPanelRelativeTranslate(): number {\n\t\t\tconst panelMinLeft = 1 - this.pxToRelativeWidth(MIN_PANEL_WIDTH + SIDE_MARGIN);\n\t\t\tconst currentRelativeLeftDelta =\n\t\t\t\tthis.calculatedPositions.outputPanelRelativeLeft - panelMinLeft;\n\t\t\treturn currentRelativeLeftDelta > 0 ? currentRelativeLeftDelta : 0;\n\t\t},\n\t\thasDoubleWidth(): boolean {\n\t\t\treturn get(this, 'nodeType.parameterPane') === 'wide';\n\t\t},\n\t\tfixedPanelWidth(): number {\n\t\t\tconst multiplier = this.hasDoubleWidth ? 2 : 1;\n\n\t\t\tif (this.windowWidth > 1700) {\n\t\t\t\treturn PANEL_WIDTH_LARGE * multiplier;\n\t\t\t}\n\n\t\t\treturn PANEL_WIDTH * multiplier;\n\t\t},\n\t\tisBelowMinWidthMainPanel(): boolean {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\treturn this.mainPanelDimensions.relativeWidth < minRelativeWidth;\n\t\t},\n\t},\n\twatch: {\n\t\twindowWidth(windowWidth) {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\t// Prevent the panel resizing below MIN_PANEL_WIDTH whhile maintaing position\n\t\t\tif (this.isBelowMinWidthMainPanel) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t}\n\n\t\t\tconst isBelowMinLeft = this.minimumLeftPosition > this.mainPanelDimensions.relativeLeft;\n\t\t\tconst isMaxRight = this.maximumRightPosition > this.mainPanelDimensions.relativeRight;\n\n\t\t\t// When user is resizing from non-supported view(sub ~488px) we need to refit the panels\n\t\t\tif (windowWidth > this.minWindowWidth && isBelowMinLeft && isMaxRight) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\t}\n\n\t\t\tthis.setPositions(this.mainPanelDimensions.relativeLeft);\n\t\t},\n\t},\n\tmethods: {\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tgetInitialLeftPosition(width: number) {\n\t\t\tif (this.currentNodePaneType === 'dragless')\n\t\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 1 + this.fixedPanelWidth);\n\n\t\t\treturn this.hasInputSlot ? 0.5 - width / 2 : this.minimumLeftPosition;\n\t\t},\n\t\tsetMainPanelWidth(relativeWidth?: number) {\n\t\t\tconst mainPanelRelativeWidth =\n\t\t\t\trelativeWidth || this.pxToRelativeWidth(initialMainPanelWidth[this.currentNodePaneType]);\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeWidth: mainPanelRelativeWidth,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositions(relativeLeft: number) {\n\t\t\tconst mainPanelRelativeLeft =\n\t\t\t\trelativeLeft || 1 - this.calculatedPositions.inputPanelRelativeRight;\n\t\t\tconst mainPanelRelativeRight =\n\t\t\t\t1 - mainPanelRelativeLeft - this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst isMaxRight = this.maximumRightPosition > mainPanelRelativeRight;\n\t\t\tconst isMinLeft = this.minimumLeftPosition > mainPanelRelativeLeft;\n\t\t\tconst isInputless = this.currentNodePaneType === 'inputless';\n\n\t\t\tif (isMinLeft) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: this.minimumLeftPosition,\n\t\t\t\t\t\trelativeRight: 1 - this.mainPanelDimensions.relativeWidth - this.minimumLeftPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isMaxRight) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: 1 - this.mainPanelDimensions.relativeWidth - this.maximumRightPosition,\n\t\t\t\t\t\trelativeRight: this.maximumRightPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeLeft: isInputless ? this.minimumLeftPosition : mainPanelRelativeLeft,\n\t\t\t\t\trelativeRight: mainPanelRelativeRight,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositionByName(position: 'minLeft' | 'maxRight' | 'initial') {\n\t\t\tconst positionByName: Record<string, number> = {\n\t\t\t\tminLeft: this.minimumLeftPosition,\n\t\t\t\tmaxRight: this.maximumRightPosition,\n\t\t\t\tinitial: this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth),\n\t\t\t};\n\n\t\t\tthis.setPositions(positionByName[position]);\n\t\t},\n\t\tpxToRelativeWidth(px: number) {\n\t\t\treturn px / this.windowWidth;\n\t\t},\n\t\trelativeWidthToPx(relativeWidth: number) {\n\t\t\treturn relativeWidth * this.windowWidth;\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.setTotalWidth();\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tonResizeDebounced(data: { direction: string; x: number; width: number }) {\n\t\t\tif (this.initialized) {\n\t\t\t\tvoid this.callDebounced(this.onResize, { debounceTime: 10, trailing: true }, data);\n\t\t\t}\n\t\t},\n\t\tonResize({ direction, x, width }: { direction: string; x: number; width: number }) {\n\t\t\tconst relativeDistance = this.pxToRelativeWidth(x);\n\t\t\tconst relativeWidth = this.pxToRelativeWidth(width);\n\n\t\t\tif (direction === 'left' && relativeDistance <= this.minimumLeftPosition) return;\n\t\t\tif (direction === 'right' && 1 - relativeDistance <= this.maximumRightPosition) return;\n\t\t\tif (width <= MIN_PANEL_WIDTH) return;\n\n\t\t\tthis.setMainPanelWidth(relativeWidth);\n\t\t\tthis.setPositions(\n\t\t\t\tdirection === 'left' ? relativeDistance : this.mainPanelDimensions.relativeLeft,\n\t\t\t);\n\t\t},\n\t\trestorePositionData() {\n\t\t\tconst storedPanelWidthData = useStorage(\n\t\t\t\t`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`,\n\t\t\t).value;\n\n\t\t\tif (storedPanelWidthData) {\n\t\t\t\tconst parsedWidth = parseFloat(storedPanelWidthData);\n\t\t\t\tthis.setMainPanelWidth(parsedWidth);\n\t\t\t\tconst initialPosition = this.getInitialLeftPosition(parsedWidth);\n\n\t\t\t\tthis.setPositions(initialPosition);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstorePositionData() {\n\t\t\tuseStorage(`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`).value =\n\t\t\t\tthis.mainPanelDimensions.relativeWidth.toString();\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.$emit('dragstart', { position: this.mainPanelDimensions.relativeLeft });\n\t\t},\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tconst relativeLeft = this.pxToRelativeWidth(e.x) - this.mainPanelDimensions.relativeWidth / 2;\n\n\t\t\tthis.setPositions(relativeLeft);\n\t\t},\n\t\tonDragEnd() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.$emit('dragend', {\n\t\t\t\t\twindowWidth: this.windowWidth,\n\t\t\t\t\tposition: this.mainPanelDimensions.relativeLeft,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tsetTotalWidth() {\n\t\t\tthis.windowWidth = window.innerWidth;\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dataPanel {\n\tposition: absolute;\n\theight: calc(100% - 2 * var(--spacing-l));\n\tposition: absolute;\n\ttop: var(--spacing-l);\n\tz-index: 0;\n\tmin-width: 280px;\n}\n\n.inputPanel {\n\tcomposes: dataPanel;\n\tleft: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: var(--border-radius-large) 0 0 var(--border-radius-large);\n\t}\n}\n\n.outputPanel {\n\tcomposes: dataPanel;\n\tright: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: 0 var(--border-radius-large) var(--border-radius-large) 0;\n\t}\n}\n\n.mainPanel {\n\tposition: absolute;\n\theight: 100%;\n\n\t&:hover {\n\t\t.draggable {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.mainPanelInner {\n\theight: 100%;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\tbox-shadow: 0 4px 16px rgb(50 61 85 / 10%);\n\toverflow: hidden;\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.draggable {\n\tvisibility: hidden;\n}\n\n.double-width {\n\tleft: 90%;\n}\n\n.dragButtonContainer {\n\tposition: absolute;\n\ttop: -12px;\n\twidth: 100%;\n\theight: 12px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tpointer-events: none;\n\n\t.draggable {\n\t\tpointer-events: all;\n\t}\n\t&:hover .draggable {\n\t\tvisibility: visible;\n\t}\n}\n\n.visible {\n\tvisibility: visible;\n}\n</style>\n","<template>\n\t<iframe class=\"__html-display\" :srcdoc=\"sanitizedHtml\" />\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport sanitizeHtml, { defaults, type IOptions as SanitizeOptions } from 'sanitize-html';\n\nconst sanitizeOptions: SanitizeOptions = {\n\tallowVulnerableTags: false,\n\tenforceHtmlBoundary: false,\n\tdisallowedTagsMode: 'discard',\n\tallowedTags: [...defaults.allowedTags, 'style', 'img', 'title'],\n\tallowedAttributes: {\n\t\t...defaults.allowedAttributes,\n\t\t'*': ['class', 'style'],\n\t},\n\ttransformTags: {\n\t\thead: '',\n\t},\n};\n\nexport default {\n\tname: 'RunDataHtml',\n\tprops: {\n\t\tinputHtml: {\n\t\t\ttype: String as PropType<string>,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsanitizedHtml() {\n\t\t\treturn sanitizeHtml(this.inputHtml, sanitizeOptions);\n\t\t},\n\t},\n};\n</script>\n\n<style lang=\"scss\">\n.__html-display {\n\twidth: 100%;\n\theight: 100%;\n}\n</style>\n","<template>\n\t<span>\n\t\t<div v-if=\"isLoading\">Loading binary data...</div>\n\t\t<div v-else-if=\"error\">Error loading binary data</div>\n\t\t<span v-else>\n\t\t\t<video v-if=\"binaryData.fileType === 'video'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</video>\n\t\t\t<audio v-else-if=\"binaryData.fileType === 'audio'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</audio>\n\t\t\t<VueJsonPretty\n\t\t\t\tv-else-if=\"binaryData.fileType === 'json'\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:deep=\"3\"\n\t\t\t\t:show-length=\"true\"\n\t\t\t/>\n\t\t\t<RunDataHtml v-else-if=\"binaryData.fileType === 'html'\" :input-html=\"data\" />\n\t\t\t<embed v-else :src=\"embedSource\" class=\"binary-data\" :class=\"embedClass()\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData } from 'n8n-workflow';\nimport { jsonParse } from 'n8n-workflow';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport RunDataHtml from '@/components/RunDataHtml.vue';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplayEmbed',\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tRunDataHtml,\n\t},\n\tprops: {\n\t\tbinaryData: {\n\t\t\ttype: Object as PropType<IBinaryData>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisLoading: true,\n\t\t\tembedSource: '',\n\t\t\terror: false,\n\t\t\tdata: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t},\n\tasync mounted() {\n\t\tconst { id, data, fileName, fileType, mimeType } = this.binaryData;\n\t\tconst isJSONData = fileType === 'json';\n\t\tconst isHTMLData = fileType === 'html';\n\n\t\tif (!id) {\n\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\tthis.data = jsonParse(atob(data));\n\t\t\t} else {\n\t\t\t\tthis.embedSource = 'data:' + mimeType + ';base64,' + data;\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst binaryUrl = this.workflowsStore.getBinaryUrl(id, 'view', fileName, mimeType);\n\t\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\t\tconst fetchedData = await fetch(binaryUrl, { credentials: 'include' });\n\t\t\t\t\tthis.data = await (isJSONData ? fetchedData.json() : fetchedData.text());\n\t\t\t\t} else {\n\t\t\t\t\tthis.embedSource = binaryUrl;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = false;\n\t},\n\tmethods: {\n\t\tembedClass(): string[] {\n\t\t\tconst { fileType } = this.binaryData;\n\t\t\treturn [fileType ?? 'other'];\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data {\n\tbackground-color: var(--color-foreground-xlight);\n\n\t&.image {\n\t\tmax-height: calc(100% - 1em);\n\t\tmax-width: calc(100% - 1em);\n\t}\n\n\t&.other,\n\t&.pdf {\n\t\theight: calc(100% - 1em);\n\t\twidth: calc(100% - 1em);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"windowVisible\" :class=\"['binary-data-window', binaryData?.fileType]\">\n\t\t<n8n-button\n\t\t\tsize=\"small\"\n\t\t\tclass=\"binary-data-window-back\"\n\t\t\t:title=\"$locale.baseText('binaryDataDisplay.backToOverviewPage')\"\n\t\t\ticon=\"arrow-left\"\n\t\t\t:label=\"$locale.baseText('binaryDataDisplay.backToList')\"\n\t\t\t@click.stop=\"closeWindow\"\n\t\t/>\n\n\t\t<div class=\"binary-data-window-wrapper\">\n\t\t\t<div v-if=\"!binaryData\">\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.noDataFoundToDisplay') }}\n\t\t\t</div>\n\t\t\t<BinaryDataDisplayEmbed v-else :binary-data=\"binaryData\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData, IRunData } from 'n8n-workflow';\n\nimport BinaryDataDisplayEmbed from '@/components/BinaryDataDisplayEmbed.vue';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplay',\n\n\tcomponents: {\n\t\tBinaryDataDisplayEmbed,\n\t},\n\tprops: [\n\t\t'displayData', // IBinaryData\n\t\t'windowVisible', // boolean\n\t],\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tbinaryData(): IBinaryData | null {\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.displayData.node,\n\t\t\t\tthis.displayData.runIndex,\n\t\t\t\tthis.displayData.outputIndex,\n\t\t\t);\n\n\t\t\tif (binaryData.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.displayData.index >= binaryData.length ||\n\t\t\t\tbinaryData[this.displayData.index][this.displayData.key] === undefined\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst binaryDataItem: IBinaryData = binaryData[this.displayData.index][this.displayData.key];\n\n\t\t\treturn binaryDataItem;\n\t\t},\n\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution;\n\t\t\tif (workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData = workflowExecution.data;\n\t\t\treturn executionData ? executionData.resultData.runData : null;\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseWindow() {\n\t\t\t// Handle the close externally as the visible parameter is an external prop\n\t\t\t// and is so not allowed to be changed here.\n\t\t\tthis.$emit('close');\n\t\t\treturn false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data-window {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 100%;\n\theight: calc(100% - 50px);\n\tbackground-color: var(--color-run-data-background);\n\toverflow: hidden;\n\ttext-align: center;\n\n\t&.json {\n\t\toverflow: auto;\n\t}\n\n\t.binary-data-window-wrapper {\n\t\tmargin-top: 0.5em;\n\t\tpadding: 0 1em;\n\t\theight: calc(100% - 50px);\n\n\t\t.el-row,\n\t\t.el-col {\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from '@/composables/useI18n';\nimport type { PropType } from 'vue';\n\nconst emit = defineEmits<{\n\t(e: 'update:modelValue', feedback: 'positive' | 'negative'): void;\n}>();\n\ndefineProps({\n\tmodelValue: {\n\t\ttype: String as PropType<'positive' | 'negative' | undefined>,\n\t\tdefault: undefined,\n\t},\n});\n\nconst i18n = useI18n();\n\nfunction onFeedback(feedback: 'positive' | 'negative') {\n\temit('update:modelValue', feedback);\n}\n</script>\n<template>\n\t<div class=\"feedback\">\n\t\t<N8nText v-if=\"!modelValue\" class=\"mr-2xs\">\n\t\t\t{{ i18n.baseText('feedback.title') }}\n\t\t</N8nText>\n\t\t<N8nText v-else :color=\"modelValue === 'positive' ? 'success' : 'danger'\">\n\t\t\t<FontAwesomeIcon\n\t\t\t\t:icon=\"modelValue === 'positive' ? 'thumbs-up' : 'thumbs-down'\"\n\t\t\t\tclass=\"mr-2xs\"\n\t\t\t/>\n\t\t\t{{ i18n.baseText(`feedback.${modelValue}`) }}\n\t\t</N8nText>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.positive')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-positive\"\n\t\t\t\t@click=\"onFeedback('positive')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-up\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.negative')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-negative\"\n\t\t\t\t@click=\"onFeedback('negative')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-down\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.feedback {\n\tdisplay: flex;\n\talign-items: center;\n\n\t.feedback-button {\n\t\tcursor: pointer;\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport Feedback from '@/components/Feedback.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { PropType } from 'vue';\nimport { computed, ref } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useToast } from '@/composables/useToast';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport type {\n\tIDataObject,\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tNodeApiError,\n\tNodeError,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { sanitizeHtml } from '@/utils/htmlUtils';\nimport { useAIStore } from '@/stores/ai.store';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\nimport VueMarkdown from 'vue-markdown-render';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\nconst props = defineProps({\n\terror: {\n\t\ttype: Object as PropType<NodeError | NodeApiError | NodeOperationError>,\n\t\trequired: true,\n\t},\n});\n\nconst clipboard = useClipboard();\nconst toast = useToast();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst ndvStore = useNDVStore();\nconst rootStore = useRootStore();\nconst aiStore = useAIStore();\n\nconst isLoadingErrorDebugging = ref(false);\nconst errorDebuggingMessage = ref('');\nconst errorDebuggingFeedback = ref<'positive' | 'negative' | undefined>();\n\nconst displayCause = computed(() => {\n\treturn JSON.stringify(props.error.cause).length < MAX_DISPLAY_DATA_SIZE;\n});\n\nconst parameters = computed<INodeProperties[]>(() => {\n\tconst node = ndvStore.activeNode;\n\tif (!node) {\n\t\treturn [];\n\t}\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\tif (nodeType === null) {\n\t\treturn [];\n\t}\n\n\treturn nodeType.properties;\n});\n\nconst n8nVersion = computed(() => {\n\tconst baseUrl = rootStore.urlBaseEditor;\n\tlet instanceType = 'Self Hosted';\n\n\tif (baseUrl.includes('n8n.cloud')) {\n\t\tinstanceType = 'Cloud';\n\t}\n\n\treturn rootStore.versionCli + ` (${instanceType})`;\n});\n\nconst hasManyInputItems = computed(() => {\n\treturn ndvStore.ndvInputData.length > 1;\n});\n\nconst nodeDefaultName = computed(() => {\n\tconst node = props.error?.node;\n\tif (!node) {\n\t\treturn 'Node';\n\t}\n\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\treturn nodeType?.defaults?.name || node.name;\n});\n\nconst prepareRawMessages = computed(() => {\n\tconst returnData: Array<string | IDataObject> = [];\n\tif (!props.error.messages?.length) {\n\t\treturn [];\n\t}\n\tconst errorMessage = getErrorMessage();\n\n\tArray.from(new Set(props.error.messages)).forEach((message) => {\n\t\tconst isParsable = /^\\d{3} - \\{/.test(message);\n\t\tconst parts = isParsable ? message.split(' - ').map((part) => part.trim()) : [];\n\n\t\t//try to parse the message as JSON\n\t\tfor (const part of parts) {\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(part);\n\t\t\t\tif (typeof parsed === 'object') {\n\t\t\t\t\treturnData.push(parsed);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\t\t}\n\t\t//if message is the same as error message, do not include it\n\t\tif (message === errorMessage) return;\n\t\treturnData.push(message);\n\t});\n\treturn returnData;\n});\n\nasync function onDebugError() {\n\ttry {\n\t\tisLoadingErrorDebugging.value = true;\n\t\ttelemetry.track(\n\t\t\t'User clicked AI error helper button',\n\t\t\t{\n\t\t\t\tnode_type: props.error.node?.type,\n\t\t\t\terror_title: props.error.message,\n\t\t\t},\n\t\t\t{ withPostHog: true },\n\t\t);\n\n\t\tconst { message } = await aiStore.debugError({ error: props.error });\n\t\terrorDebuggingMessage.value = message;\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('generic.error'));\n\t} finally {\n\t\tisLoadingErrorDebugging.value = false;\n\t}\n}\n\nasync function onDebugErrorRegenerate() {\n\terrorDebuggingMessage.value = '';\n\terrorDebuggingFeedback.value = undefined;\n\tawait onDebugError();\n\ttelemetry.track('User regenerated error debugging AI hint', {\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\n}\n\nasync function onErrorDebuggingFeedback(feedback: 'positive' | 'negative') {\n\ttelemetry.track('User responded error debugging AI hint', {\n\t\thelpful: feedback === 'positive',\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\n}\n\nfunction nodeVersionTag(nodeType: NodeError['node']): string {\n\tif (!nodeType || ('hidden' in nodeType && nodeType.hidden)) {\n\t\treturn i18n.baseText('nodeSettings.deprecated');\n\t}\n\n\tconst latestNodeVersion = Math.max(...nodeTypesStore.getNodeVersions(nodeType.type));\n\n\tif (latestNodeVersion === nodeType.typeVersion) {\n\t\treturn i18n.baseText('nodeSettings.latest');\n\t}\n\n\treturn i18n.baseText('nodeSettings.latestVersion', {\n\t\tinterpolate: { version: latestNodeVersion.toString() },\n\t});\n}\n\nfunction replacePlaceholders(parameter: string, message: string): string {\n\tconst parameterName = parameterDisplayName(parameter, false);\n\tconst parameterFullName = parameterDisplayName(parameter, true);\n\treturn message\n\t\t.replace(/%%PARAMETER%%/g, parameterName)\n\t\t.replace(/%%PARAMETER_FULL%%/g, parameterFullName);\n}\n\nfunction getErrorDescription(): string {\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\n\tif (isSubNodeError) {\n\t\treturn sanitizeHtml(\n\t\t\tprops.error.description +\n\t\t\t\ti18n.baseText('pushConnection.executionError.openNode', {\n\t\t\t\t\tinterpolate: { node: props.error.node.name },\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tif (props.error.context?.descriptionKey) {\n\t\tconst interpolate = {\n\t\t\tnodeCause: props.error.context.nodeCause as string,\n\t\t\trunIndex: (props.error.context.runIndex as string) ?? '0',\n\t\t\titemIndex: (props.error.context.itemIndex as string) ?? '0',\n\t\t};\n\t\treturn sanitizeHtml(\n\t\t\ti18n.baseText(\n\t\t\t\t`nodeErrorView.description.${props.error.context.descriptionKey as string}` as BaseTextKey,\n\t\t\t\t{ interpolate },\n\t\t\t),\n\t\t);\n\t}\n\n\tif (!props.error.context?.descriptionTemplate) {\n\t\treturn sanitizeHtml(props.error.description ?? '');\n\t}\n\n\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\treturn sanitizeHtml(\n\t\t(props.error.context.descriptionTemplate as string).replace(/%%PARAMETER%%/g, parameterName),\n\t);\n}\n\nfunction addItemIndexSuffix(message: string): string {\n\tlet itemIndexSuffix = '';\n\n\tconst ITEM_INDEX_SUFFIX_TEXT = '[item ';\n\n\tif (\n\t\thasManyInputItems.value &&\n\t\t!message.includes(ITEM_INDEX_SUFFIX_TEXT) &&\n\t\tprops.error?.context?.itemIndex !== undefined\n\t) {\n\t\titemIndexSuffix = ` [item ${props.error.context.itemIndex}]`;\n\t}\n\n\treturn message + itemIndexSuffix;\n}\n\nfunction getErrorMessage(): string {\n\tconst baseErrorMessage = '';\n\tlet message = '';\n\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\n\tif (isSubNodeError) {\n\t\tmessage = i18n.baseText('nodeErrorView.errorSubNode', {\n\t\t\tinterpolate: { node: props.error.node.name },\n\t\t});\n\t} else if (\n\t\tprops.error.message === props.error.description ||\n\t\t!props.error.context?.messageTemplate\n\t) {\n\t\tmessage = baseErrorMessage + props.error.message;\n\t} else {\n\t\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\n\t\tmessage =\n\t\t\tbaseErrorMessage +\n\t\t\t(props.error.context.messageTemplate as string).replace(/%%PARAMETER%%/g, parameterName);\n\t}\n\n\treturn addItemIndexSuffix(message);\n}\n\nfunction parameterDisplayName(path: string, fullPath = true) {\n\ttry {\n\t\tconst params = parameterName(parameters.value, path.split('.'));\n\t\tif (!params.length) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tif (!fullPath) {\n\t\t\treturn params.pop()!.displayName;\n\t\t}\n\t\treturn params.map((parameter) => parameter.displayName).join(' > ');\n\t} catch (error) {\n\t\treturn `Could not find parameter \"${path}\"`;\n\t}\n}\n\nfunction parameterName(\n\tparams: Array<INodePropertyOptions | INodeProperties | INodePropertyCollection>,\n\tpathParts: string[],\n): Array<INodeProperties | INodePropertyCollection> {\n\tlet currentParameterName = pathParts.shift();\n\n\tif (currentParameterName === undefined) {\n\t\treturn [];\n\t}\n\n\tconst arrayMatch = currentParameterName.match(/(.*)\\[([\\d])\\]$/);\n\tif (arrayMatch !== null && arrayMatch.length > 0) {\n\t\tcurrentParameterName = arrayMatch[1];\n\t}\n\tconst currentParameter = params.find(\n\t\t(parameter) => parameter.name === currentParameterName,\n\t) as unknown as INodeProperties | INodePropertyCollection;\n\n\tif (currentParameter === undefined) {\n\t\tthrow new Error(`Could not find parameter \"${currentParameterName}\"`);\n\t}\n\n\tif (pathParts.length === 0) {\n\t\treturn [currentParameter];\n\t}\n\n\tif (currentParameter.hasOwnProperty('options')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...parameterName((currentParameter as INodeProperties).options!, pathParts),\n\t\t];\n\t}\n\n\tif (currentParameter.hasOwnProperty('values')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...parameterName((currentParameter as INodePropertyCollection).values, pathParts),\n\t\t];\n\t}\n\n\t// We can not resolve any deeper so lets stop here and at least return hopefully something useful\n\treturn [currentParameter];\n}\n\nfunction copyErrorDetails() {\n\tconst error = props.error;\n\n\tconst errorInfo: IDataObject = {\n\t\terrorMessage: getErrorMessage(),\n\t};\n\tif (error.description) {\n\t\terrorInfo.errorDescription = error.description;\n\t}\n\n\t//add error details\n\tconst errorDetails: IDataObject = {};\n\n\tif (error?.messages?.length) {\n\t\terrorDetails.rawErrorMessage = error.messages;\n\t}\n\n\tif ('httpCode' in error && error.httpCode) {\n\t\terrorDetails.httpCode = error.httpCode;\n\t}\n\n\tif (error.context && error.context.data) {\n\t\terrorDetails.errorData = error.context.data;\n\t}\n\n\tif (error.extra) {\n\t\terrorDetails.errorExtra = error.extra;\n\t}\n\n\terrorInfo.errorDetails = errorDetails;\n\n\t//add n8n details\n\tconst n8nDetails: IDataObject = {};\n\n\tif (error.node) {\n\t\tn8nDetails.nodeName = error.node.name;\n\t\tn8nDetails.nodeType = error.node.type;\n\t\tn8nDetails.nodeVersion = error.node.typeVersion;\n\n\t\tif (error.node?.parameters?.resource) {\n\t\t\tn8nDetails.resource = error.node.parameters.resource;\n\t\t}\n\t\tif (error?.node?.parameters?.operation) {\n\t\t\tn8nDetails.operation = error.node.parameters.operation;\n\t\t}\n\t}\n\n\tif (error.context) {\n\t\tif (error.context.itemIndex !== undefined) {\n\t\t\tn8nDetails.itemIndex = error.context.itemIndex;\n\t\t}\n\n\t\tif (error.context.runIndex !== undefined) {\n\t\t\tn8nDetails.runIndex = error.context.runIndex;\n\t\t}\n\n\t\tif (error.context.parameter !== undefined) {\n\t\t\tn8nDetails.parameter = error.context.parameter;\n\t\t}\n\n\t\tif (error.context.causeDetailed) {\n\t\t\tn8nDetails.causeDetailed = error.context.causeDetailed;\n\t\t}\n\t}\n\n\tif (error.timestamp) {\n\t\tn8nDetails.time = new Date(error.timestamp).toLocaleString();\n\t}\n\n\tn8nDetails.n8nVersion = n8nVersion.value;\n\n\tn8nDetails.binaryDataMode = rootStore.binaryDataMode;\n\n\tif (error.cause) {\n\t\tn8nDetails.cause = error.cause;\n\t}\n\n\tn8nDetails.stackTrace = error.stack?.split('\\n');\n\n\terrorInfo.n8nDetails = n8nDetails;\n\n\tvoid clipboard.copy(JSON.stringify(errorInfo, null, 2));\n\tcopySuccess();\n}\n\nfunction copySuccess() {\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('nodeErrorView.showMessage.title'),\n\t\ttype: 'info',\n\t});\n}\n</script>\n\n<template>\n\t<div class=\"node-error-view\">\n\t\t<div class=\"node-error-view__header\">\n\t\t\t<div class=\"node-error-view__header-message\">\n\t\t\t\t<div>\n\t\t\t\t\t{{ getErrorMessage() }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"error.description || error.context?.descriptionKey\"\n\t\t\t\tclass=\"node-error-view__header-description\"\n\t\t\t\tv-html=\"getErrorDescription()\"\n\t\t\t></div>\n\t\t</div>\n\n\t\t<N8nCard\n\t\t\tv-if=\"isLoadingErrorDebugging || errorDebuggingMessage\"\n\t\t\tclass=\"node-error-view__debugging mb-s\"\n\t\t>\n\t\t\t<span v-if=\"isLoadingErrorDebugging\">\n\t\t\t\t<N8nSpinner class=\"mr-3xs\" />\n\t\t\t\t{{ i18n.baseText('nodeErrorView.debugError.loading') }}\n\t\t\t</span>\n\t\t\t<VueMarkdown v-else :source=\"errorDebuggingMessage\" />\n\n\t\t\t<div v-if=\"errorDebuggingMessage\" class=\"node-error-view__feedback-toolbar\">\n\t\t\t\t<Feedback v-model=\"errorDebuggingFeedback\" @update:model-value=\"onErrorDebuggingFeedback\" />\n\t\t\t\t<N8nTooltip :content=\"i18n.baseText('nodeErrorView.debugError.feedback.reload')\">\n\t\t\t\t\t<span class=\"node-error-view__feedback-button\" @click=\"onDebugErrorRegenerate\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" />\n\t\t\t\t\t</span>\n\t\t\t\t</N8nTooltip>\n\t\t\t</div>\n\t\t</N8nCard>\n\n\t\t<div class=\"node-error-view__info\">\n\t\t\t<div class=\"node-error-view__info-header\">\n\t\t\t\t<p class=\"node-error-view__info-title\">\n\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.title') }}\n\t\t\t\t</p>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"i18n.baseText('nodeErrorView.copyToClipboard.tooltip')\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"copy-button\">\n\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t\ttext=\"true\"\n\t\t\t\t\t\t\ttransparent-background=\"transparent\"\n\t\t\t\t\t\t\t@click=\"copyErrorDetails\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\n\t\t\t<div class=\"node-error-view__info-content\">\n\t\t\t\t<details\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t('httpCode' in error && error.httpCode) ||\n\t\t\t\t\t\tprepareRawMessages.length ||\n\t\t\t\t\t\terror?.context?.data ||\n\t\t\t\t\t\terror.extra\n\t\t\t\t\t\"\n\t\t\t\t\tclass=\"node-error-view__details\"\n\t\t\t\t>\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\ti18n.baseText('nodeErrorView.details.from', {\n\t\t\t\t\t\t\t\tinterpolate: { node: `${nodeDefaultName}` },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div v-if=\"'httpCode' in error && error.httpCode\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.errorCode') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.httpCode }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"prepareRawMessages.length\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.rawMessages') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<div v-for=\"(msg, index) in prepareRawMessages\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t<pre><code>{{ msg }}</code></pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error?.context?.data\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorData') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.data }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.extra\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorExtra') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.extra }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.context && error.context.request\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.request') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.request }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\n\t\t\t\t<details class=\"node-error-view__details\">\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.info') }}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.itemIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.itemIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.itemIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.runIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.runIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.runIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.parameter !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.inParameter') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ parameterDisplayName(`${error.context.parameter}`) }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.type\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeType') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.node.type }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.typeVersion\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>\n\t\t\t\t\t\t\t\t\t<span>{{ error.node.typeVersion + ' ' }}</span>\n\t\t\t\t\t\t\t\t\t<span>({{ nodeVersionTag(error.node) }})</span>\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.n8nVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ n8nVersion }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.timestamp\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.time') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ new Date(error.timestamp).toLocaleString() }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.cause && displayCause\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorCause') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.cause }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.causeDetailed\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.causeDetailed') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\t\tclass=\"node-error-view__details-value\"\n\t\t\t\t\t\t\t><code>{{ error.context.causeDetailed }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.stack\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.stackTrace') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.stack }}</code></pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.node-error-view {\n\t&__header {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto var(--spacing-s) auto;\n\t\tpadding-bottom: var(--spacing-3xs);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__header-title {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-danger-tint-1);\n\t\tfont-size: var(--font-size-3xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tbackground-color: var(--color-danger-tint-2);\n\t\tborder-radius: var(--border-radius-large) var(--border-radius-large) 0 0;\n\t\tcolor: var(--color-danger);\n\t}\n\n\t&__header-message {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-xs) var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tcolor: var(--color-ndv-output-error-message);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tfont-size: var(--font-size-s);\n\t}\n\n\t&__header-description {\n\t\tpadding: 0 var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tfont-size: var(--font-size-xs);\n\n\t\tul {\n\t\t\tpadding: var(--spacing-s) 0;\n\t\t\tpadding-left: var(--spacing-l);\n\t\t}\n\n\t\tcode {\n\t\t\tfont-size: var(--font-size-xs);\n\t\t\tcolor: var(--color-text-base);\n\t\t\tbackground: var(--color-background-base);\n\t\t\tpadding: var(--spacing-5xs);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t&__debugging {\n\t\tfont-size: var(--font-size-s);\n\n\t\tul,\n\t\tol,\n\t\tdl {\n\t\t\tpadding-left: var(--spacing-s);\n\t\t\tmargin-top: var(--spacing-2xs);\n\t\t\tmargin-bottom: var(--spacing-2xs);\n\t\t}\n\n\t\tpre {\n\t\t\tpadding: var(--spacing-s);\n\t\t\twidth: 100%;\n\t\t\toverflow: auto;\n\t\t\tbackground: var(--color-background-light);\n\t\t\tcode {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__feedback-toolbar {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-top: var(--spacing-s);\n\t\tpadding-top: var(--spacing-3xs);\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__feedback-button {\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t&__info {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto;\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__info-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tpadding: var(--spacing-3xs) var(--spacing-3xs) var(--spacing-3xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__info-title {\n\t\tfont-size: var(--font-size-2xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-dark);\n\t}\n\n\t&__info-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details:not(:last-child) {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n\n\t&__details[open] {\n\t\t.node-error-view__details {\n\t\t\t&-icon {\n\t\t\t\ttransform: rotate(90deg);\n\t\t\t\ttransition: transform 0.3s ease;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__details-summary {\n\t\tpadding: var(--spacing-5xs) 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-dark);\n\t\tcursor: pointer;\n\t\tlist-style-type: none;\n\t\toutline: none;\n\t}\n\n\t&__details-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details-row {\n\t\tdisplay: flex;\n\t\tpadding: var(--spacing-4xs) 0;\n\t}\n\n\t&__details-row:not(:first-child) {\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__details-icon {\n\t\tmargin-right: var(--spacing-xs);\n\t}\n\n\t&__details-label {\n\t\tflex-grow: 0;\n\t\tflex-shrink: 0;\n\t\twidth: 120px;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t}\n\n\t&__details-value {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tmargin-right: auto;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t\tword-wrap: break-word;\n\n\t\tcode {\n\t\t\tcolor: var(--color-json-string);\n\t\t\twhite-space: normal;\n\t\t\tword-wrap: break-word;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { usePinnedData } from '@/composables/usePinnedData';\n\nconst locale = useI18n();\n\ntype Props = {\n\ttooltipContentsVisibility: {\n\t\tbinaryDataTooltipContent: boolean;\n\t\tpinDataDiscoveryTooltipContent: boolean;\n\t};\n\tdataPinningDocsUrl: string;\n\tpinnedData: ReturnType<typeof usePinnedData>;\n\tdisabled: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n\t(event: 'togglePinData'): void;\n}>();\n\nconst visible = computed(() =>\n\tprops.tooltipContentsVisibility.pinDataDiscoveryTooltipContent ? true : undefined,\n);\n</script>\n\n<template>\n\t<n8n-tooltip placement=\"bottom-end\" :visible=\"visible\">\n\t\t<template #content>\n\t\t\t<div v-if=\"props.tooltipContentsVisibility.binaryDataTooltipContent\">\n\t\t\t\t{{ locale.baseText('ndv.pinData.pin.binary') }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"props.tooltipContentsVisibility.pinDataDiscoveryTooltipContent\">\n\t\t\t\t{{ locale.baseText('node.discovery.pinData.ndv') }}\n\t\t\t</div>\n\t\t\t<div v-else>\n\t\t\t\t<strong>{{ locale.baseText('ndv.pinData.pin.title') }}</strong>\n\t\t\t\t<n8n-text size=\"small\" tag=\"p\">\n\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.description') }}\n\n\t\t\t\t\t<n8n-link :to=\"props.dataPinningDocsUrl\" size=\"small\">\n\t\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.link') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t\t<n8n-icon-button\n\t\t\t:class=\"$style.pinDataButton\"\n\t\t\ttype=\"tertiary\"\n\t\t\t:active=\"props.pinnedData.hasData.value\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:disabled=\"props.disabled\"\n\t\t\tdata-test-id=\"ndv-pin-data\"\n\t\t\t@click=\"emit('togglePinData')\"\n\t\t/>\n\t</n8n-tooltip>\n</template>\n\n<style lang=\"scss\" module>\n.pinDataButton {\n\tmargin-left: var(--spacing-2xs);\n\tsvg {\n\t\ttransition: transform 0.3s ease;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"['run-data', $style.container]\" @mouseover=\"activatePane\">\n\t\t<n8n-callout\n\t\t\tv-if=\"\n\t\t\t\tcanPinData && pinnedData.hasData.value && !editMode.enabled && !isProductionExecutionPreview\n\t\t\t\"\n\t\t\ttheme=\"secondary\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:class=\"$style.pinnedDataCallout\"\n\t\t>\n\t\t\t{{ $locale.baseText('runData.pindata.thisDataIsPinned') }}\n\t\t\t<span v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"ml-4xs\">\n\t\t\t\t<n8n-link\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tunderline\n\t\t\t\t\tbold\n\t\t\t\t\t@click.stop=\"onTogglePinData({ source: 'banner-link' })\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.unpin') }}\n\t\t\t\t</n8n-link>\n\t\t\t</span>\n\t\t\t<template #trailingContent>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"dataPinningDocsUrl\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tbold\n\t\t\t\t\tunderline\n\t\t\t\t\t@click=\"onClickDataPinningDocsLink\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.learnMore') }}\n\t\t\t\t</n8n-link>\n\t\t\t</template>\n\t\t</n8n-callout>\n\n\t\t<BinaryDataDisplay\n\t\t\t:window-visible=\"binaryDataDisplayVisible\"\n\t\t\t:display-data=\"binaryDataDisplayData\"\n\t\t\t@close=\"closeBinaryDataDisplay\"\n\t\t/>\n\n\t\t<div :class=\"$style.header\">\n\t\t\t<slot name=\"header\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-show=\"!hasRunError\"\n\t\t\t\t:class=\"$style.displayModes\"\n\t\t\t\tdata-test-id=\"run-data-pane-header\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-show=\"\n\t\t\t\t\t\thasNodeRun && (inputData.length || binaryData.length || search) && !editMode.enabled\n\t\t\t\t\t\"\n\t\t\t\t\t:model-value=\"displayMode\"\n\t\t\t\t\t:options=\"buttons\"\n\t\t\t\t\tdata-test-id=\"ndv-run-data-display-mode\"\n\t\t\t\t\t@update:model-value=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"canPinData && !isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:title=\"$locale.baseText('runData.editOutput')\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t:disabled=\"node.disabled\"\n\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\ticon=\"pencil-alt\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"ndv-edit-pinned-data\"\n\t\t\t\t\t@click=\"enterEditMode({ origin: 'editIconButton' })\"\n\t\t\t\t/>\n\n\t\t\t\t<RunDataPinButton\n\t\t\t\t\tv-if=\"(canPinData || !!binaryData?.length) && rawInputData.length && !editMode.enabled\"\n\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t(!rawInputData.length && !pinnedData.hasData.value) ||\n\t\t\t\t\t\tisReadOnlyRoute ||\n\t\t\t\t\t\treadOnlyEnv ||\n\t\t\t\t\t\t!!binaryData?.length\n\t\t\t\t\t\"\n\t\t\t\t\t:tooltip-contents-visibility=\"{\n\t\t\t\t\t\tbinaryDataTooltipContent: !!binaryData?.length,\n\t\t\t\t\t\tpinDataDiscoveryTooltipContent:\n\t\t\t\t\t\t\tisControlledPinDataTooltip && pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-pinning-docs-url=\"dataPinningDocsUrl\"\n\t\t\t\t\t:pinned-data=\"pinnedData\"\n\t\t\t\t\t@toggle-pin-data=\"onTogglePinData({ source: 'pin-icon-click' })\"\n\t\t\t\t/>\n\n\t\t\t\t<div v-show=\"editMode.enabled\" :class=\"$style.editModeActions\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.cancel')\"\n\t\t\t\t\t\t@click=\"onClickCancelEdit\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.save')\"\n\t\t\t\t\t\t@click=\"onClickSaveEdit\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"maxRunIndex > 0\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.runSelector\"\n\t\t\tdata-test-id=\"run-selector\"\n\t\t>\n\t\t\t<div :class=\"$style.runSelectorWrapper\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"runIndex\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onRunIndexChange\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.run') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in maxRunIndex + 1\"\n\t\t\t\t\t\t:key=\"option\"\n\t\t\t\t\t\t:label=\"getRunLabel(option)\"\n\t\t\t\t\t\t:value=\"option - 1\"\n\t\t\t\t\t></n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<n8n-tooltip v-if=\"canLinkRuns\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ $locale.baseText(linkedRuns ? 'runData.unlinking.hint' : 'runData.linking.hint') }}\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tclass=\"linkRun\"\n\t\t\t\t\t\t:icon=\"linkedRuns ? 'unlink' : 'link'\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"toggleLinkRuns\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<slot name=\"run-info\"></slot>\n\t\t\t</div>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\t\t<slot name=\"before-data\" />\n\n\t\t<div\n\t\t\tv-if=\"maxOutputIndex > 0 && branches.length > 1\"\n\t\t\t:class=\"$style.tabs\"\n\t\t\tdata-test-id=\"branches\"\n\t\t>\n\t\t\t<n8n-tabs\n\t\t\t\t:model-value=\"currentOutputIndex\"\n\t\t\t\t:options=\"branches\"\n\t\t\t\t@update:model-value=\"onBranchChange\"\n\t\t\t/>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-else-if=\"\n\t\t\t\t!hasRunError &&\n\t\t\t\thasNodeRun &&\n\t\t\t\t((dataCount > 0 && maxRunIndex === 0) || search) &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled && !hasRunError\"\n\t\t\t:class=\"$style.itemsCount\"\n\t\t\tdata-test-id=\"ndv-items-count\"\n\t\t>\n\t\t\t<n8n-text v-if=\"search\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\tadjustToNumber: unfilteredDataCount,\n\t\t\t\t\t\tinterpolate: { matched: dataCount, total: unfilteredDataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else>\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\tadjustToNumber: dataCount,\n\t\t\t\t\t\tinterpolate: { count: dataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div ref=\"dataContainer\" :class=\"$style.dataContainer\" data-test-id=\"ndv-data-container\">\n\t\t\t<div v-if=\"isExecuting\" :class=\"$style.center\" data-test-id=\"ndv-executing\">\n\t\t\t\t<div :class=\"$style.spinner\"><n8n-spinner type=\"ring\" /></div>\n\t\t\t\t<n8n-text>{{ executingMessage }}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"editMode.enabled\" :class=\"$style.editMode\">\n\t\t\t\t<div :class=\"[$style.editModeBody, 'ignore-key-press']\">\n\t\t\t\t\t<JsonEditor\n\t\t\t\t\t\t:model-value=\"editMode.value\"\n\t\t\t\t\t\t:fill-parent=\"true\"\n\t\t\t\t\t\t@update:model-value=\"ndvStore.setOutputPanelEditModeValue($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.editModeFooter\">\n\t\t\t\t\t<n8n-info-tip :bold=\"false\" :class=\"$style.editModeFooterInfotip\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.editor.copyDataInfo') }}\n\t\t\t\t\t\t<n8n-link :to=\"dataEditingDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t{{ $locale.baseText('generic.learnMore') }}\n\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"paneType === 'output' && hasSubworkflowExecutionError\"\n\t\t\t\t:class=\"$style.stretchVertically\"\n\t\t\t>\n\t\t\t\t<NodeErrorView :error=\"subworkflowExecutionError\" :class=\"$style.errorDisplay\" />\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"!hasNodeRun\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"node-not-run\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"paneType === 'input' && node.disabled\" :class=\"$style.center\">\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled', { interpolate: { nodeName: node.name } }) }}\n\t\t\t\t\t<n8n-link @click=\"enableNode\">\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled.cta') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && isArtificialRecoveredEventItem\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"recovered-artificial-output-data\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && hasRunError\" :class=\"$style.stretchVertically\">\n\t\t\t\t<n8n-text v-if=\"isPaneTypeInput\" :class=\"$style.center\" size=\"large\" tag=\"p\" bold>\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeErrorView.inputPanel.previousNodeError.title', {\n\t\t\t\t\t\t\tinterpolate: { nodeName: node.name },\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t\t<slot v-else-if=\"$slots['content']\" name=\"content\"></slot>\n\t\t\t\t<NodeErrorView\n\t\t\t\t\tv-else\n\t\t\t\t\t:error=\"workflowRunData[node.name][runIndex].error\"\n\t\t\t\t\t:class=\"$style.dataDisplay\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun && (!unfilteredDataCount || (search && !dataCount)) && branches.length > 1\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<div v-if=\"search\">\n\t\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<n8n-text v-else>\n\t\t\t\t\t{{ noDataInBranchMessage }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !inputData.length && !search\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"no-output-data\">xxx</slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !showData\" :class=\"$style.center\">\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{ tooMuchDataTitle }}</n8n-text>\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\"\n\t\t\t\t\t><span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText('ndv.output.tooMuchData.message', {\n\t\t\t\t\t\t\t\tinterpolate: { size: dataSizeInMB },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span\n\t\t\t\t></n8n-text>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"$locale.baseText('ndv.output.tooMuchData.showDataAnyway')\"\n\t\t\t\t\t@click=\"showTooMuchData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t@click=\"downloadJsonData()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- V-else slot named content which only renders if $slots.content is passed and hasNodeRun -->\n\t\t\t<slot v-else-if=\"hasNodeRun && $slots['content']\" name=\"content\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun &&\n\t\t\t\t\tdisplayMode === 'table' &&\n\t\t\t\t\tbinaryData.length > 0 &&\n\t\t\t\t\tinputData.length === 1 &&\n\t\t\t\t\tObject.keys(jsonData[0] || {}).length === 0\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.info') }}\n\t\t\t\t\t<a @click=\"switchToBinary\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.binary') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"showIoSearchNoMatchContent\" :class=\"$style.center\">\n\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'table'\">\n\t\t\t\t<RunDataTable\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:page-offset=\"currentPageOffset\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:has-default-hover-state=\"paneType === 'input' && !search\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t\t@mounted=\"$emit('tableMounted', $event)\"\n\t\t\t\t\t@active-row-changed=\"onItemHover\"\n\t\t\t\t\t@display-mode-change=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json'\">\n\t\t\t\t<RunDataJson\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:edit-mode=\"editMode\"\n\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isPaneTypeOutput && displayMode === 'html'\">\n\t\t\t\t<RunDataHtml :input-html=\"inputDataPage[0].json.html\" />\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isSchemaView\">\n\t\t\t\t<RunDataSchema\n\t\t\t\t\t:data=\"jsonData\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary' && binaryData.length === 0\" :class=\"$style.center\">\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('runData.noBinaryDataFound')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary'\" :class=\"$style.dataDisplay\">\n\t\t\t\t<div v-for=\"(binaryDataEntry, index) in binaryData\" :key=\"index\">\n\t\t\t\t\t<div v-if=\"binaryData.length > 1\" :class=\"$style.binaryIndex\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ index + 1 }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div :class=\"$style.binaryRow\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(binaryData, key) in binaryDataEntry\"\n\t\t\t\t\t\t\t:key=\"index + '_' + key\"\n\t\t\t\t\t\t\t:class=\"$style.binaryCell\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :data-test-id=\"'ndv-binary-data_' + index\">\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryHeader\">\n\t\t\t\t\t\t\t\t\t{{ key }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileName\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileName') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileName }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.directory\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.directory') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.directory }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileExtension\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileExtension') }}:</n8n-text\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileExtension }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.mimeType\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.mimeType') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.mimeType }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileSize\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileSize') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileSize }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryButtonContainer\">\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isViewable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.showBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-view-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"displayBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isDownloadable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-download-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"downloadBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t!hasRunError &&\n\t\t\t\tbinaryData.length === 0 &&\n\t\t\t\tdataCount > pageSize &&\n\t\t\t\t!isSchemaView &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.pagination\"\n\t\t\tdata-test-id=\"ndv-data-pagination\"\n\t\t>\n\t\t\t<el-pagination\n\t\t\t\tbackground\n\t\t\t\t:hide-on-single-page=\"true\"\n\t\t\t\t:current-page=\"currentPage\"\n\t\t\t\t:pager-count=\"5\"\n\t\t\t\t:page-size=\"pageSize\"\n\t\t\t\tlayout=\"prev, pager, next\"\n\t\t\t\t:total=\"dataCount\"\n\t\t\t\t@update:current-page=\"onCurrentPageChange\"\n\t\t\t>\n\t\t\t</el-pagination>\n\n\t\t\t<div :class=\"$style.pageSizeSelector\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t:model-value=\"pageSize\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onPageSizeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.pageSize') }}</template>\n\t\t\t\t\t<n8n-option v-for=\"size in pageSizes\" :key=\"size\" :label=\"size\" :value=\"size\">\n\t\t\t\t\t</n8n-option>\n\t\t\t\t\t<n8n-option :label=\"$locale.baseText('ndv.output.all')\" :value=\"dataCount\"> </n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" :class=\"$style.uiBlocker\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, toRef } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport { saveAs } from 'file-saver';\nimport type {\n\tConnectionTypes,\n\tIBinaryData,\n\tIBinaryKeyData,\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\n\nimport type {\n\tIExecutionResponse,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIRunDataDisplayMode,\n\tITab,\n\tNodePanelType,\n} from '@/Interface';\n\nimport {\n\tDATA_PINNING_DOCS_URL,\n\tDATA_EDITING_DOCS_URL,\n\tNODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMAX_DISPLAY_DATA_SIZE,\n\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\tTEST_PIN_DATA,\n\tHTML_NODE_TYPE,\n} from '@/constants';\n\nimport BinaryDataDisplay from '@/components/BinaryDataDisplay.vue';\nimport NodeErrorView from '@/components/Error/NodeErrorView.vue';\nimport JsonEditor from '@/components/JsonEditor/JsonEditor.vue';\n\nimport type { PinDataSource } from '@/composables/usePinnedData';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { clearJsonKey, isEmpty } from '@/utils/typesUtils';\nimport { executionDataToJson } from '@/utils/nodeTypesUtils';\nimport { searchInObject } from '@/utils/objectUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useToast } from '@/composables/useToast';\nimport { isEqual, isObject } from 'lodash-es';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport RunDataPinButton from '@/components/RunDataPinButton.vue';\n\nconst RunDataTable = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataTable.vue'),\n);\nconst RunDataJson = defineAsyncComponent(async () => await import('@/components/RunDataJson.vue'));\nconst RunDataSchema = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSchema.vue'),\n);\nconst RunDataHtml = defineAsyncComponent(async () => await import('@/components/RunDataHtml.vue'));\nconst RunDataSearch = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSearch.vue'),\n);\n\nexport type EnterEditModeArgs = {\n\torigin: 'editIconButton' | 'insertTestDataLink';\n};\n\nexport default defineComponent({\n\tname: 'RunData',\n\tcomponents: {\n\t\tBinaryDataDisplay,\n\t\tNodeErrorView,\n\t\tJsonEditor,\n\t\tRunDataTable,\n\t\tRunDataJson,\n\t\tRunDataSchema,\n\t\tRunDataHtml,\n\t\tRunDataSearch,\n\t\tRunDataPinButton,\n\t},\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t\tdefault: null,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttooMuchDataTitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tnoDataInBranchMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tisExecuting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\texecutingMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String as PropType<NodePanelType>,\n\t\t\trequired: true,\n\t\t},\n\t\toverrideOutputs: {\n\t\t\ttype: Array as PropType<number[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst node = toRef(props, 'node');\n\t\tconst pinnedData = usePinnedData(node, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode(props.paneType),\n\t\t});\n\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconnectionType: NodeConnectionType.Main,\n\t\t\tbinaryDataPreviewActive: false,\n\t\t\tdataSize: 0,\n\t\t\tshowData: false,\n\t\t\toutputIndex: 0,\n\t\t\tbinaryDataDisplayVisible: false,\n\t\t\tbinaryDataDisplayData: null as IBinaryData | null,\n\n\t\t\tMAX_DISPLAY_DATA_SIZE,\n\t\t\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\t\t\tcurrentPage: 1,\n\t\t\tpageSize: 10,\n\t\t\tpageSizes: [10, 25, 50, 100],\n\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tisControlledPinDataTooltip: false,\n\t\t\tsearch: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseRootStore,\n\t\t),\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdataPinningDocsUrl(): string {\n\t\t\treturn DATA_PINNING_DOCS_URL;\n\t\t},\n\t\tdataEditingDocsUrl(): string {\n\t\t\treturn DATA_EDITING_DOCS_URL;\n\t\t},\n\t\tdisplayMode(): IRunDataDisplayMode {\n\t\t\treturn this.ndvStore.getPanelDisplayMode(this.paneType);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisSchemaView(): boolean {\n\t\t\treturn this.displayMode === 'schema';\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst canPinNode = usePinnedData(this.node).canPinNode(false);\n\n\t\t\treturn (\n\t\t\t\tcanPinNode &&\n\t\t\t\t!this.isPaneTypeInput &&\n\t\t\t\tthis.pinnedData.isValidNodeType.value &&\n\t\t\t\t!(this.binaryData && this.binaryData.length > 0)\n\t\t\t);\n\t\t},\n\t\tbuttons(): Array<{ label: string; value: string }> {\n\t\t\tconst defaults = [\n\t\t\t\t{ label: this.$locale.baseText('runData.table'), value: 'table' },\n\t\t\t\t{ label: this.$locale.baseText('runData.json'), value: 'json' },\n\t\t\t];\n\n\t\t\tif (this.binaryData.length) {\n\t\t\t\tdefaults.push({ label: this.$locale.baseText('runData.binary'), value: 'binary' });\n\t\t\t}\n\n\t\t\tconst schemaView = { label: this.$locale.baseText('runData.schema'), value: 'schema' };\n\t\t\tif (this.isPaneTypeInput && !isEmpty(this.jsonData)) {\n\t\t\t\tdefaults.unshift(schemaView);\n\t\t\t} else {\n\t\t\t\tdefaults.push(schemaView);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isPaneTypeOutput &&\n\t\t\t\tthis.activeNode?.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate'\n\t\t\t) {\n\t\t\t\tdefaults.unshift({ label: 'HTML', value: 'html' });\n\t\t\t}\n\n\t\t\treturn defaults;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\t!this.isExecuting &&\n\t\t\t\t\tthis.node &&\n\t\t\t\t\t((this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name)) ||\n\t\t\t\t\t\tthis.pinnedData.hasData.value),\n\t\t\t);\n\t\t},\n\t\tisArtificialRecoveredEventItem(): boolean {\n\t\t\treturn !!this.rawInputData?.[0]?.json?.isArtificialRecoveredEventItem;\n\t\t},\n\t\tsubworkflowExecutionError(): Error | null {\n\t\t\treturn this.workflowsStore.subWorkflowExecutionError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.subworkflowExecutionError);\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tdataCount(): number {\n\t\t\treturn this.getDataCount(this.runIndex, this.currentOutputIndex);\n\t\t},\n\t\tunfilteredDataCount(): number {\n\t\t\treturn this.pinnedData.data.value\n\t\t\t\t? this.pinnedData.data.value.length\n\t\t\t\t: this.rawInputData.length;\n\t\t},\n\t\tdataSizeInMB(): string {\n\t\t\treturn (this.dataSize / 1024 / 1000).toLocaleString();\n\t\t},\n\t\tmaxOutputIndex(): number {\n\t\t\tif (this.node === null || this.runIndex === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length < this.runIndex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name][this.runIndex]) {\n\t\t\t\tconst taskData = runData[this.node.name][this.runIndex].data;\n\t\t\t\tif (taskData?.main) {\n\t\t\t\t\treturn taskData.main.length - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tcurrentPageOffset(): number {\n\t\t\treturn this.pageSize * (this.currentPage - 1);\n\t\t},\n\t\tmaxRunIndex(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\trawInputData(): INodeExecutionData[] {\n\t\t\treturn this.getRawInputData(this.runIndex, this.currentOutputIndex, this.connectionType);\n\t\t},\n\t\tinputData(): INodeExecutionData[] {\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(this.rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData);\n\t\t},\n\t\tinputDataPage(): INodeExecutionData[] {\n\t\t\tconst offset = this.pageSize * (this.currentPage - 1);\n\t\t\treturn this.inputData.slice(offset, offset + this.pageSize);\n\t\t},\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t\tbinaryData(): IBinaryKeyData[] {\n\t\t\tif (!this.node) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.node.name,\n\t\t\t\tthis.runIndex,\n\t\t\t\tthis.currentOutputIndex,\n\t\t\t);\n\t\t\treturn binaryData.filter((data) => Boolean(data && Object.keys(data).length));\n\t\t},\n\t\tcurrentOutputIndex(): number {\n\t\t\tif (this.overrideOutputs?.length && !this.overrideOutputs.includes(this.outputIndex)) {\n\t\t\t\treturn this.overrideOutputs[0];\n\t\t\t}\n\n\t\t\treturn this.outputIndex;\n\t\t},\n\t\tbranches(): ITab[] {\n\t\t\tconst capitalize = (name: string) => name.charAt(0).toLocaleUpperCase() + name.slice(1);\n\n\t\t\tconst branches: ITab[] = [];\n\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\tif (this.overrideOutputs && !this.overrideOutputs.includes(i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst totalItemsCount = this.getRawInputData(this.runIndex, i).length;\n\t\t\t\tconst itemsCount = this.getDataCount(this.runIndex, i);\n\t\t\t\tconst items = this.search\n\t\t\t\t\t? this.$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\t\tadjustToNumber: totalItemsCount,\n\t\t\t\t\t\t\tinterpolate: { matched: itemsCount, total: totalItemsCount },\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t\t\t\t});\n\t\t\t\tlet outputName = this.getOutputName(i);\n\n\t\t\t\tif (`${outputName}` === `${i}`) {\n\t\t\t\t\toutputName = `${this.$locale.baseText('ndv.output')} ${outputName}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst appendBranchWord = NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND.includes(\n\t\t\t\t\t\tthis.node?.type,\n\t\t\t\t\t)\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: ` ${this.$locale.baseText('ndv.output.branch')}`;\n\t\t\t\t\toutputName = capitalize(`${this.getOutputName(i)}${appendBranchWord}`);\n\t\t\t\t}\n\t\t\t\tbranches.push({\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(this.search && itemsCount) || totalItemsCount\n\t\t\t\t\t\t\t? `${outputName} (${items})`\n\t\t\t\t\t\t\t: outputName,\n\t\t\t\t\tvalue: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn branches;\n\t\t},\n\t\teditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.isPaneTypeInput\n\t\t\t\t? { enabled: false, value: '' }\n\t\t\t\t: this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisPaneTypeInput(): boolean {\n\t\t\treturn this.paneType === 'input';\n\t\t},\n\t\tisPaneTypeOutput(): boolean {\n\t\t\treturn this.paneType === 'output';\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tshowIOSearch(): boolean {\n\t\t\treturn this.hasNodeRun && !this.hasRunError;\n\t\t},\n\t\tshowIoSearchNoMatchContent(): boolean {\n\t\t\treturn this.hasNodeRun && !this.inputData.length && this.search;\n\t\t},\n\t},\n\twatch: {\n\t\tnode(newNode: INodeUi, prevNode: INodeUi) {\n\t\t\tif (newNode.id === prevNode.id) return;\n\t\t\tthis.init();\n\t\t},\n\t\thasNodeRun() {\n\t\t\tif (this.paneType === 'output') this.setDisplayMode();\n\t\t},\n\t\tinputDataPage: {\n\t\t\thandler(data: INodeExecutionData[]) {\n\t\t\t\tif (this.paneType && data) {\n\t\t\t\t\tthis.ndvStore.setNDVPanelDataIsEmpty({\n\t\t\t\t\t\tpanel: this.paneType as 'input' | 'output',\n\t\t\t\t\t\tisEmpty: data.every((item) => isEmpty(item.json)),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t\tjsonData(data: IDataObject[], prevData: IDataObject[]) {\n\t\t\tif (isEqual(data, prevData)) return;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.showPinDataDiscoveryTooltip(data);\n\t\t},\n\t\tbinaryData(newData: IBinaryKeyData[], prevData: IBinaryKeyData[]) {\n\t\t\tif (newData.length && !prevData.length && this.displayMode !== 'binary') {\n\t\t\t\tthis.switchToBinary();\n\t\t\t} else if (!newData.length && this.displayMode === 'binary') {\n\t\t\t\tthis.onDisplayModeChange('table');\n\t\t\t}\n\t\t},\n\t\tcurrentOutputIndex(branchIndex: number) {\n\t\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\tbranchIndex,\n\t\t\t});\n\t\t},\n\t\tsearch(newSearch: string) {\n\t\t\tthis.$emit('search', newSearch);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.init();\n\n\t\tif (!this.isPaneTypeInput) {\n\t\t\tthis.showPinDataDiscoveryTooltip(this.jsonData);\n\t\t}\n\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\tbranchIndex: this.currentOutputIndex,\n\t\t});\n\n\t\tif (this.paneType === 'output') {\n\t\t\tthis.setDisplayMode();\n\t\t\tthis.activatePane();\n\t\t}\n\n\t\tif (this.hasRunError) {\n\t\t\tconst error = this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error;\n\t\t\tconst errorsToTrack = ['unknown error'];\n\n\t\t\tif (error && errorsToTrack.some((e) => error.message.toLowerCase().includes(e))) {\n\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t`User encountered an error: \"${error.message}\"`,\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.node.type,\n\t\t\t\t\t\terrorMessage: error.message,\n\t\t\t\t\t\tnodeVersion: this.node.typeVersion,\n\t\t\t\t\t\tn8nVersion: this.rootStore.versionCli,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hidePinDataDiscoveryTooltip();\n\t},\n\tmethods: {\n\t\tgetResolvedNodeOutputs() {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, this.nodeType);\n\t\t\t\t\treturn outputs;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tonItemHover(itemIndex: number | null) {\n\t\t\tif (itemIndex === null) {\n\t\t\t\tthis.$emit('itemHover', null);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$emit('itemHover', {\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t},\n\t\tonClickDataPinningDocsLink() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'data-pinning-docs',\n\t\t\t});\n\t\t},\n\t\tshowPinDataDiscoveryTooltip(value: IDataObject[]) {\n\t\t\tif (!this.isTriggerNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pinDataDiscoveryFlag = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value;\n\n\t\t\tif (value && value.length > 0 && !this.isReadOnlyRoute && !pinDataDiscoveryFlag) {\n\t\t\t\tthis.pinDataDiscoveryComplete();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isControlledPinDataTooltip = true;\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: true });\n\t\t\t\t}, 500); // Wait for NDV to open\n\t\t\t}\n\t\t},\n\t\thidePinDataDiscoveryTooltip() {\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.isControlledPinDataTooltip = false;\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: false });\n\t\t\t}\n\t\t},\n\t\tpinDataDiscoveryComplete() {\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value = 'true';\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\t\t},\n\t\tenterEditMode({ origin }: EnterEditModeArgs) {\n\t\t\tconst inputData = this.pinnedData.data.value\n\t\t\t\t? clearJsonKey(this.pinnedData.data.value)\n\t\t\t\t: executionDataToJson(this.rawInputData);\n\n\t\t\tconst data = inputData.length > 0 ? inputData : TEST_PIN_DATA;\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(true);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue(JSON.stringify(data, null, 2));\n\n\t\t\tthis.$telemetry.track('User opened ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tclick_type: origin === 'editIconButton' ? 'button' : 'link',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tis_output_present: this.hasNodeRun || this.pinnedData.hasData.value,\n\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'undefined' : this.displayMode,\n\t\t\t\tis_data_pinned: this.pinnedData.hasData.value,\n\t\t\t});\n\t\t},\n\t\tonClickCancelEdit() {\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue('');\n\t\t\tthis.onExitEditMode({ type: 'cancel' });\n\t\t},\n\t\tonClickSaveEdit() {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { value } = this.editMode;\n\n\t\t\tthis.clearAllStickyNotifications();\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(clearJsonKey(value) as INodeExecutionData[], 'save-edit');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\n\t\t\tthis.onExitEditMode({ type: 'save' });\n\t\t},\n\t\tonExitEditMode({ type }: { type: 'save' | 'cancel' }) {\n\t\t\tthis.$telemetry.track('User closed ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: this.displayMode,\n\t\t\t\ttype,\n\t\t\t});\n\t\t},\n\t\tasync onTogglePinData({ source }: { source: PinDataSource }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (source === 'pin-icon-click') {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\trun_index: this.runIndex,\n\t\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'none' : this.displayMode,\n\t\t\t\t};\n\n\t\t\t\tvoid this.externalHooks.run('runData.onTogglePinData', telemetryPayload);\n\t\t\t\tthis.$telemetry.track('User clicked pin data icon', telemetryPayload);\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node);\n\n\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\tthis.pinnedData.unsetData(source);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(this.rawInputData, 'pin-icon-click');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.maxRunIndex > 0) {\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.$locale.baseText('ndv.pinData.pin.multipleRuns.title', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tindex: `${this.runIndex}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tmessage: this.$locale.baseText('ndv.pinData.pin.multipleRuns.description'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.hidePinDataDiscoveryTooltip();\n\t\t\tthis.pinDataDiscoveryComplete();\n\t\t},\n\t\tswitchToBinary() {\n\t\t\tthis.onDisplayModeChange('binary');\n\t\t},\n\t\tonBranchChange(value: number) {\n\t\t\tthis.outputIndex = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv branch', {\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tbranch_index: value,\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tnode_type_input_selection: this.nodeType ? this.nodeType.name : '',\n\t\t\t\tpane: this.paneType,\n\t\t\t});\n\t\t},\n\t\tshowTooMuchData() {\n\t\t\tthis.showData = true;\n\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\ttype: 'showTooMuchData',\n\t\t\t});\n\t\t},\n\t\ttoggleLinkRuns() {\n\t\t\tthis.linkedRuns ? this.unlinkRun() : this.linkRun();\n\t\t},\n\t\tlinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tunlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonCurrentPageChange(value) {\n\t\t\tthis.currentPage = value;\n\t\t\tthis.$telemetry.track('User changed ndv page', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonPageSizeChange(pageSize: number) {\n\t\t\tthis.pageSize = pageSize;\n\t\t\tconst maxPage = Math.ceil(this.dataCount / this.pageSize);\n\t\t\tif (maxPage < this.currentPage) {\n\t\t\t\tthis.currentPage = maxPage;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track('User changed ndv page size', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonDisplayModeChange(displayMode: IRunDataDisplayMode) {\n\t\t\tconst previous = this.displayMode;\n\t\t\tthis.ndvStore.setPanelDisplayMode({ pane: this.paneType, mode: displayMode });\n\n\t\t\tconst dataContainerRef = this.$refs.dataContainer as Element | undefined;\n\t\t\tif (dataContainerRef) {\n\t\t\t\tconst dataDisplay = dataContainerRef.children[0];\n\n\t\t\t\tif (dataDisplay) {\n\t\t\t\t\tdataDisplay.scrollTo(0, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tvoid this.externalHooks.run('runData.displayModeChanged', {\n\t\t\t\tnewValue: displayMode,\n\t\t\t\toldValue: previous,\n\t\t\t});\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User changed ndv item view', {\n\t\t\t\t\tprevious_view: previous,\n\t\t\t\t\tnew_view: displayMode,\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: this.paneType,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgetRunLabel(option: number) {\n\t\t\tlet itemsCount = 0;\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\titemsCount += this.getPinDataOrLiveData(this.getRawInputData(option - 1, i)).length;\n\t\t\t}\n\t\t\tconst items = this.$locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t});\n\t\t\tconst itemsLabel = itemsCount > 0 ? ` (${items})` : '';\n\t\t\treturn option + this.$locale.baseText('ndv.output.of') + (this.maxRunIndex + 1) + itemsLabel;\n\t\t},\n\t\tgetRawInputData(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t): INodeExecutionData[] {\n\t\t\tlet inputData: INodeExecutionData[] = [];\n\n\t\t\tif (this.node) {\n\t\t\t\tinputData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tthis.node,\n\t\t\t\t\trunIndex,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tthis.paneType,\n\t\t\t\t\tconnectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (inputData.length === 0 || !Array.isArray(inputData)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn inputData;\n\t\t},\n\t\tgetPinDataOrLiveData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (this.pinnedData.data.value && !this.isProductionExecutionPreview) {\n\t\t\t\treturn Array.isArray(this.pinnedData.data.value)\n\t\t\t\t\t? this.pinnedData.data.value.map((value) => ({\n\t\t\t\t\t\t\tjson: value,\n\t\t\t\t\t\t}))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjson: this.pinnedData.data.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t}\n\t\t\treturn inputData;\n\t\t},\n\t\tgetFilteredData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (!this.search) {\n\t\t\t\treturn inputData;\n\t\t\t}\n\n\t\t\tthis.currentPage = 1;\n\t\t\treturn inputData.filter(({ json }) => searchInObject(json, this.search));\n\t\t},\n\t\tgetDataCount(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.workflowRunData?.[this.node.name]?.[runIndex]?.hasOwnProperty('error')) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tconst rawInputData = this.getRawInputData(runIndex, outputIndex, connectionType);\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData).length;\n\t\t},\n\t\tinit() {\n\t\t\t// Reset the selected output index every time another node gets selected\n\t\t\tthis.outputIndex = 0;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tlet outputTypes: ConnectionTypes[] = [];\n\t\t\tif (this.nodeType !== null && this.node !== null) {\n\t\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\t\toutputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t}\n\t\t\tthis.connectionType = outputTypes.length === 0 ? NodeConnectionType.Main : outputTypes[0];\n\t\t\tif (this.binaryData.length > 0) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'binary',\n\t\t\t\t});\n\t\t\t} else if (this.displayMode === 'binary') {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'table',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcloseBinaryDataDisplay() {\n\t\t\tthis.binaryDataDisplayVisible = false;\n\t\t\tthis.binaryDataDisplayData = null;\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(null);\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tisViewable(index: number, key: string): boolean {\n\t\t\tconst { fileType } = this.binaryData[index][key];\n\t\t\treturn (\n\t\t\t\t!!fileType && ['image', 'audio', 'video', 'text', 'json', 'pdf', 'html'].includes(fileType)\n\t\t\t);\n\t\t},\n\t\tisDownloadable(index: number, key: string): boolean {\n\t\t\tconst { mimeType, fileName } = this.binaryData[index][key];\n\t\t\treturn !!(mimeType && fileName);\n\t\t},\n\t\tasync downloadBinaryData(index: number, key: string) {\n\t\t\tconst { id, data, fileName, fileExtension, mimeType } = this.binaryData[index][key];\n\n\t\t\tif (id) {\n\t\t\t\tconst url = this.workflowsStore.getBinaryUrl(id, 'download', fileName, mimeType);\n\t\t\t\tsaveAs(url, [fileName, fileExtension].join('.'));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst bufferString = 'data:' + mimeType + ';base64,' + data;\n\t\t\t\tconst blob = await fetch(bufferString).then(async (d) => await d.blob());\n\t\t\t\tsaveAs(blob, fileName);\n\t\t\t}\n\t\t},\n\t\tasync downloadJsonData() {\n\t\t\tconst fileName = this.node.name.replace(/[^\\w\\d]/g, '_');\n\t\t\tconst blob = new Blob([JSON.stringify(this.rawInputData, null, 2)], {\n\t\t\t\ttype: 'application/json',\n\t\t\t});\n\n\t\t\tsaveAs(blob, `${fileName}.json`);\n\t\t},\n\t\tdisplayBinaryData(index: number, key: string) {\n\t\t\tthis.binaryDataDisplayVisible = true;\n\n\t\t\tthis.binaryDataDisplayData = {\n\t\t\t\tnode: this.node.name,\n\t\t\t\trunIndex: this.runIndex,\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\tindex,\n\t\t\t\tkey,\n\t\t\t};\n\t\t},\n\t\tgetOutputName(outputIndex: number) {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\tconst nodeType = this.nodeType;\n\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\tconst outputConfiguration = outputs?.[outputIndex] as INodeOutputConfiguration;\n\n\t\t\tif (outputConfiguration && isObject(outputConfiguration)) {\n\t\t\t\treturn outputConfiguration?.displayName;\n\t\t\t}\n\t\t\tif (!nodeType?.outputNames || nodeType.outputNames.length <= outputIndex) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\treturn nodeType.outputNames[outputIndex];\n\t\t},\n\t\trefreshDataSize() {\n\t\t\t// Hide by default the data from being displayed\n\t\t\tthis.showData = false;\n\t\t\tconst jsonItems = this.inputDataPage.map((item) => item.json);\n\t\t\tthis.dataSize = JSON.stringify(jsonItems).length;\n\t\t\tif (this.dataSize < this.MAX_DISPLAY_DATA_SIZE) {\n\t\t\t\t// Data is reasonable small (< 200kb) so display it directly\n\t\t\t\tthis.showData = true;\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tenableNode() {\n\t\t\tif (this.node) {\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdisabled: !this.node.disabled,\n\t\t\t\t\t} as IDataObject,\n\t\t\t\t} as INodeUpdatePropertiesInformation;\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetDisplayMode() {\n\t\t\tif (!this.activeNode) return;\n\n\t\t\tconst shouldDisplayHtml =\n\t\t\t\tthis.activeNode.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate';\n\n\t\t\tif (shouldDisplayHtml) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\tmode: 'html',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t\tonSearchClear() {\n\t\t\tthis.search = '';\n\t\t\tdocument.dispatchEvent(new KeyboardEvent('keyup', { key: '/' }));\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.infoIcon {\n\tcolor: var(--color-foreground-dark);\n}\n\n.center {\n\tdisplay: flex;\n\theight: 100%;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\n\t> * {\n\t\tmax-width: 316px;\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-run-data-background);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.pinnedDataCallout {\n\tborder-radius: inherit;\n\tborder-bottom-right-radius: 0;\n\tborder-top: 0;\n\tborder-left: 0;\n\tborder-right: 0;\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n\tpadding: var(--spacing-s) var(--spacing-s) 0 var(--spacing-s);\n\tposition: relative;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tmin-height: calc(30px + var(--spacing-s));\n\n\t> *:first-child {\n\t\tflex-grow: 1;\n\t}\n}\n\n.dataContainer {\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\n\t&:hover {\n\t\t.actions-group {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.dataDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 0 var(--spacing-s) var(--spacing-3xl) var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: var(--font-line-height-xloose);\n\tword-break: normal;\n\theight: 100%;\n}\n\n.tabs {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.itemsCount {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n}\n\n.runSelector {\n\tpadding-left: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.runSelectorWrapper {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbottom: 0;\n\tpadding: 5px;\n\toverflow-y: hidden;\n}\n\n.pageSizeSelector {\n\ttext-transform: capitalize;\n\tmax-width: 150px;\n\tflex: 0 1 auto;\n}\n\n.binaryIndex {\n\tdisplay: block;\n\tpadding: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\n\t> * {\n\t\tdisplay: inline-block;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t\tborder-radius: var(--border-radius-base);\n\t\ttext-align: center;\n\t\tbackground-color: var(--color-foreground-xdark);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-xlight);\n\t}\n}\n\n.binaryRow {\n\tdisplay: inline-flex;\n\tfont-size: var(--font-size-2xs);\n}\n\n.binaryCell {\n\tdisplay: inline-block;\n\twidth: 300px;\n\toverflow: hidden;\n\tbackground-color: var(--color-foreground-xlight);\n\tmargin-right: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n\tborder-radius: var(--border-radius-base);\n\tborder: var(--border-base);\n\tpadding: var(--spacing-s);\n}\n\n.binaryHeader {\n\tcolor: $color-primary;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: 1.2em;\n\tpadding-bottom: var(--spacing-2xs);\n\tmargin-bottom: var(--spacing-2xs);\n\tborder-bottom: 1px solid var(--color-text-light);\n}\n\n.binaryButtonContainer {\n\tmargin-top: 1.5em;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\n\t> * {\n\t\tflex-grow: 0;\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n.binaryValue {\n\twhite-space: initial;\n\tword-wrap: break-word;\n}\n\n.displayModes {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n.tooltipContain {\n\tmax-width: 240px;\n}\n\n.spinner {\n\t* {\n\t\tcolor: var(--color-primary);\n\t\tmin-height: 40px;\n\t\tmin-width: 40px;\n\t}\n\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.editMode {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n}\n\n.editModeBody {\n\tflex: 1 1 auto;\n\tmax-height: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.editModeFooter {\n\tflex: 0 1 auto;\n\tdisplay: flex;\n\twidth: 100%;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-top: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n}\n\n.editModeFooterInfotip {\n\tdisplay: flex;\n\tflex: 1;\n\twidth: 100%;\n}\n\n.editModeActions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n}\n\n.stretchVertically {\n\theight: 100%;\n}\n\n.uiBlocker {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.run-data {\n\t.code-node-editor {\n\t\theight: 100%;\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.highlight) {\n\tbackground-color: #f7dc55;\n\tcolor: black;\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0 1px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n</style>\n","<template>\n\t<n8n-info-tip\n\t\tv-if=\"hasStaleData\"\n\t\ttheme=\"warning\"\n\t\ttype=\"tooltip\"\n\t\ttooltip-placement=\"right\"\n\t\tdata-test-id=\"node-run-info-stale\"\n\t>\n\t\t<span\n\t\t\tv-html=\"\n\t\t\t\t$locale.baseText(\n\t\t\t\t\thasPinData\n\t\t\t\t\t\t? 'ndv.output.staleDataWarning.pinData'\n\t\t\t\t\t\t: 'ndv.output.staleDataWarning.regular',\n\t\t\t\t)\n\t\t\t\"\n\t\t></span>\n\t</n8n-info-tip>\n\t<n8n-info-tip\n\t\tv-else-if=\"runMetadata\"\n\t\ttype=\"tooltip\"\n\t\t:theme=\"theme\"\n\t\t:data-test-id=\"`node-run-info-${theme}`\"\n\t\ttooltip-placement=\"right\"\n\t>\n\t\t<div>\n\t\t\t<n8n-text :bold=\"true\" size=\"small\"\n\t\t\t\t>{{\n\t\t\t\t\trunTaskData.error\n\t\t\t\t\t\t? $locale.baseText('runData.executionStatus.failed')\n\t\t\t\t\t\t: $locale.baseText('runData.executionStatus.success')\n\t\t\t\t}} </n8n-text\n\t\t\t><br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.startTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.startTime }}<br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.executionTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.executionTime }} {{ $locale.baseText('runData.ms') }}\n\t\t</div>\n\t</n8n-info-tip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { ITaskData } from 'n8n-workflow';\nimport { convertToDisplayDateComponents } from '@/utils/formatters/dateFormatter';\n\nexport default defineComponent({\n\tprops: {\n\t\ttaskData: {}, // ITaskData\n\t\thasStaleData: Boolean,\n\t\thasPinData: Boolean,\n\t},\n\n\tcomputed: {\n\t\ttheme(): string {\n\t\t\treturn this.runTaskData?.error ? 'danger' : 'success';\n\t\t},\n\t\trunTaskData(): ITaskData {\n\t\t\treturn this.taskData as ITaskData;\n\t\t},\n\t\trunMetadata(): { executionTime: number; startTime: string } | null {\n\t\t\tif (!this.runTaskData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst { date, time } = convertToDisplayDateComponents(this.runTaskData.startTime);\n\t\t\treturn {\n\t\t\t\texecutionTime: this.runTaskData.executionTime,\n\t\t\t\tstartTime: `${date} at ${time}`,\n\t\t\t};\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<RunData\n\t\tref=\"runData\"\n\t\t:node=\"node\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.output.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.output.noOutputDataInBranch')\"\n\t\t:is-executing=\"isNodeRunning\"\n\t\t:executing-message=\"$locale.baseText('ndv.output.executing')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:block-u-i=\"blockUI\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"output\"\n\t\t:data-output-type=\"outputMode\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<template v-if=\"hasAiMetadata\">\n\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\tv-model=\"outputMode\"\n\t\t\t\t\t\t:options=\"outputTypes\"\n\t\t\t\t\t\t@update:model-value=\"onUpdateOutputMode\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<span v-else :class=\"$style.title\">\n\t\t\t\t\t{{ $locale.baseText(outputPanelEditMode.enabled ? 'ndv.output.edit' : 'ndv.output') }}\n\t\t\t\t</span>\n\t\t\t\t<RunInfo\n\t\t\t\t\tv-if=\"hasNodeRun && !pinnedData.hasData.value && runsCount === 1\"\n\t\t\t\t\tv-show=\"!outputPanelEditMode.enabled\"\n\t\t\t\t\t:task-data=\"runTaskData\"\n\t\t\t\t\t:has-stale-data=\"staleData\"\n\t\t\t\t\t:has-pin-data=\"pinnedData.hasData.value\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #node-not-run>\n\t\t\t<n8n-text v-if=\"workflowRunning && !isTriggerNode\" data-test-id=\"ndv-output-waiting\">{{\n\t\t\t\t$locale.baseText('ndv.output.waitingToRun')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text v-if=\"!workflowRunning\" data-test-id=\"ndv-output-run-node-hint\">\n\t\t\t\t<template v-if=\"isSubNodeType.value\">\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHintSubNode') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHint') }}\n\t\t\t\t\t<span v-if=\"canPinData\" @click=\"insertTestData\">\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t{{ $locale.baseText('generic.or') }}\n\t\t\t\t\t\t<n8n-text tag=\"a\" size=\"medium\" color=\"primary\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.output.insertTestData') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.output.noOutputData.title')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message') }}\n\t\t\t\t<a @click=\"openSettings\">{{\n\t\t\t\t\t$locale.baseText('ndv.output.noOutputData.message.settings')\n\t\t\t\t}}</a>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message.settingsOption') }}\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template v-if=\"outputMode === 'logs'\" #content>\n\t\t\t<RunDataAi :node=\"node\" :run-index=\"runIndex\" />\n\t\t</template>\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template v-if=\"!pinnedData.hasData.value && runsCount > 1\" #run-info>\n\t\t\t<RunInfo :task-data=\"runTaskData\" />\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionResponse, INodeUi } from '@/Interface';\nimport type { INodeTypeDescription, IRunData, IRunExecutionData, ITaskData } from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport RunInfo from './RunInfo.vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport RunDataAi from './RunDataAi/RunDataAi.vue';\nimport { ndvEventBus } from '@/event-bus';\nimport { useNodeType } from '@/composables/useNodeType';\nimport { usePinnedData } from '@/composables/usePinnedData';\n\ntype RunDataRef = InstanceType<typeof RunData>;\n\nconst OUTPUT_TYPE = {\n\tREGULAR: 'regular',\n\tLOGS: 'logs',\n};\n\nexport default defineComponent({\n\tname: 'OutputPanel',\n\tcomponents: { RunData, RunInfo, RunDataAi },\n\tprops: {\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst { isSubNodeType } = useNodeType({\n\t\t\tnode: activeNode,\n\t\t});\n\t\tconst pinnedData = usePinnedData(activeNode, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode('output'),\n\t\t});\n\n\t\treturn {\n\t\t\tpinnedData,\n\t\t\tisSubNodeType,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\toutputMode: 'regular',\n\t\t\toutputTypes: [\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.regular'), value: OUTPUT_TYPE.REGULAR },\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.logs'), value: OUTPUT_TYPE.LOGS },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\thasAiMetadata(): boolean {\n\t\t\tif (this.node) {\n\t\t\t\tconst resultData = this.workflowsStore.getWorkflowResultDataByNodeName(this.node.name);\n\n\t\t\t\tif (!resultData || !Array.isArray(resultData) || resultData.length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn !!resultData[resultData.length - 1].metadata;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!(this.nodeType && this.nodeType.group.includes('schedule'));\n\t\t},\n\t\tisNodeRunning(): boolean {\n\t\t\treturn this.node && this.workflowsStore.isNodeExecuting(this.node.name);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (!executionData?.resultData?.runData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn executionData.resultData.runData;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\tif (this.workflowsStore.subWorkflowExecutionError) return true;\n\n\t\t\treturn Boolean(\n\t\t\t\tthis.node && this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name),\n\t\t\t);\n\t\t},\n\t\trunTaskData(): ITaskData | null {\n\t\t\tif (!this.node || this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst runData = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length <= this.runIndex) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn runData[this.node.name][this.runIndex];\n\t\t},\n\t\trunsCount(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tstaleData(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst updatedAt = this.workflowsStore.getParametersLastUpdate(this.node.name);\n\t\t\tif (!updatedAt || !this.runTaskData) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst runAt = this.runTaskData.startTime;\n\t\t\treturn updatedAt > runAt;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\treturn this.pinnedData.isValidNodeType.value && !this.isReadOnly;\n\t\t},\n\t},\n\tmethods: {\n\t\tinsertTestData() {\n\t\t\tconst runDataRef = this.$refs.runData as RunDataRef | undefined;\n\t\t\tif (runDataRef) {\n\t\t\t\trunDataRef.enterEditMode({\n\t\t\t\t\torigin: 'insertTestDataLink',\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tnode_type: this.node.type,\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\ttype: 'insert-test-data',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.$emit('openSettings');\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tnode_type: this.node.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'settings',\n\t\t\t});\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonUpdateOutputMode(outputMode: (typeof OUTPUT_TYPE)[string]) {\n\t\t\tif (outputMode === OUTPUT_TYPE.LOGS) {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'minLeft');\n\t\t\t} else {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'initial');\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n// The items count and displayModes are rendered in the RunData component\n// this is a workaround to hide it in the output panel(for ai type) to not add unnecessary one-time props\n:global([data-output-type='logs'] [class*='itemsCount']),\n:global([data-output-type='logs'] [class*='displayModes']) {\n\tdisplay: none;\n}\n.outputTypeSelect {\n\tmargin-bottom: var(--spacing-4xs);\n\twidth: fit-content;\n}\n.titleSection {\n\tdisplay: flex;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-s);\n}\n\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"112\"\n\t\theight=\"80\"\n\t\tviewBox=\"0 0 112 80\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<mask\n\t\t\tid=\"mask0_489_46042\"\n\t\t\tstyle=\"mask-type: alpha\"\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"112\"\n\t\t\theight=\"80\"\n\t\t>\n\t\t\t<rect width=\"112\" height=\"80\" fill=\"url(#paint0_linear_489_46042)\" />\n\t\t</mask>\n\t\t<g mask=\"url(#mask0_489_46042)\">\n\t\t\t<rect x=\"-0.5\" width=\"112\" height=\"80\" fill=\"url(#pattern0)\" fill-opacity=\"0.6\" />\n\t\t</g>\n\t\t<defs>\n\t\t\t<pattern id=\"pattern0\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n\t\t\t\t<use xlink:href=\"#image0_489_46042\" transform=\"scale(0.00357143 0.005)\" />\n\t\t\t</pattern>\n\t\t\t<linearGradient\n\t\t\t\tid=\"paint0_linear_489_46042\"\n\t\t\t\tx1=\"90.5\"\n\t\t\t\ty1=\"40.4494\"\n\t\t\t\tx2=\"112.5\"\n\t\t\t\ty2=\"40.4494\"\n\t\t\t\tgradientUnits=\"userSpaceOnUse\"\n\t\t\t>\n\t\t\t\t<stop />\n\t\t\t\t<stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<image\n\t\t\t\tid=\"image0_489_46042\"\n\t\t\t\twidth=\"280\"\n\t\t\t\theight=\"200\"\n\t\t\t\txlink:href=\"data:image/png;base64,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\"\n\t\t\t/>\n\t\t</defs>\n\t</svg>\n</template>\n","<template>\n\t<RunData\n\t\t:node=\"currentNode\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"!mappedNode && canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.input.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.input.noOutputDataInBranch')\"\n\t\t:is-executing=\"isExecutingPrevious\"\n\t\t:executing-message=\"$locale.baseText('ndv.input.executingPrevious')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:override-outputs=\"connectedCurrentNodeOutputs\"\n\t\t:mapping-enabled=\"isMappingEnabled\"\n\t\t:distance-from-active=\"currentNodeDepth\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"input\"\n\t\tdata-test-id=\"ndv-input-panel\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tv-if=\"parentNodes.length\"\n\t\t\t\t\tteleported\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"currentNodeName\"\n\t\t\t\t\t:no-data-text=\"$locale.baseText('ndv.input.noNodesFound')\"\n\t\t\t\t\t:placeholder=\"$locale.baseText('ndv.input.parentNodes')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"ndv-input-select\"\n\t\t\t\t\t@update:model-value=\"onInputNodeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>\n\t\t\t\t\t\t<span :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"node of parentNodes\"\n\t\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t\t:value=\"node.name\"\n\t\t\t\t\t\tclass=\"node-option\"\n\t\t\t\t\t\t:label=\"`${truncate(node.name)} ${getMultipleNodesText(node.name)}`\"\n\t\t\t\t\t\tdata-test-id=\"ndv-input-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ truncate(node.name) }} </span>\n\t\t\t\t\t\t<span v-if=\"getMultipleNodesText(node.name)\">{{\n\t\t\t\t\t\t\tgetMultipleNodesText(node.name)\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{\n\t\t\t\t\t\t\t$locale.baseText('ndv.input.nodeDistance', { adjustToNumber: node.depth })\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<span v-else :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-if=\"isActiveNodeConfig && !readOnly\"\n\t\t\t\t\t:options=\"inputModes\"\n\t\t\t\t\t:model-value=\"inputMode\"\n\t\t\t\t\t@update:model-value=\"onInputModeChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-if=\"isMappingMode\" #before-data>\n\t\t\t<!--\n\t\t\t\t\t\tHide the run linking buttons for both input and ouput panels when in 'Mapping Mode' because the run indices wouldn't match.\n\t\t\t\t\t\tAlthough this is not the most elegant solution, it's straightforward and simpler than introducing a new props and logic to handle this.\n\t\t\t\t-->\n\t\t\t<component :is=\"'style'\">button.linkRun { display: none }</component>\n\t\t\t<div :class=\"$style.mappedNode\">\n\t\t\t\t<n8n-select\n\t\t\t\t\t:model-value=\"mappedNode\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onMappedNodeSelected\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.input.previousNode') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"nodeName in rootNodesParents\"\n\t\t\t\t\t\t:key=\"nodeName\"\n\t\t\t\t\t\t:label=\"nodeName\"\n\t\t\t\t\t\t:value=\"nodeName\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #node-not-run>\n\t\t\t<div\n\t\t\t\tv-if=\"(isActiveNodeConfig && rootNode) || parentNodes.length\"\n\t\t\t\t:class=\"$style.noOutputData\"\n\t\t\t>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.noOutputData.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-tooltip v-if=\"!readOnly\" :visible=\"showDraggableHint && showDraggableHintWithDelay\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t$locale.baseText('dataMapping.dragFromPreviousHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { name: focusedMappableInput },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\thide-icon\n\t\t\t\t\t\t:transparent=\"true\"\n\t\t\t\t\t\t:node-name=\"isActiveNodeConfig ? rootNode : currentNodeName\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.input.noOutputData.executePrevious')\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\tdata-test-id=\"execute-previous-node\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-text v-if=\"!readOnly\" tag=\"div\" size=\"small\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.noOutputData.hint') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.notConnected\">\n\t\t\t\t<div>\n\t\t\t\t\t<WireMeUp />\n\t\t\t\t</div>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.notConnected.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.message') }}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/connections/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onConnectionHelpClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.learnMore') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.input.noOutputData')\n\t\t\t}}</n8n-text>\n\t\t</template>\n\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { INodeUi } from '@/Interface';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tIConnectedNode,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tWorkflow,\n} from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport WireMeUp from './WireMeUp.vue';\nimport {\n\tCRON_NODE_TYPE,\n\tINTERVAL_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSTART_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\n\ntype MappingMode = 'debugging' | 'mapping';\n\nexport default defineComponent({\n\tname: 'InputPanel',\n\tcomponents: { RunData, NodeExecuteButton, WireMeUp },\n\tprops: {\n\t\tcurrentNodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowDraggableHintWithDelay: false,\n\t\t\tdraggableHintShown: false,\n\t\t\tinputMode: 'debugging' as MappingMode,\n\t\t\tmappedNode: null as string | null,\n\t\t\tinputModes: [\n\t\t\t\t{ value: 'mapping', label: this.$locale.baseText('ndv.input.mapping') },\n\t\t\t\t{ value: 'debugging', label: this.$locale.baseText('ndv.input.debugging') },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tfocusedMappableInput(): string {\n\t\t\treturn this.ndvStore.focusedMappableInput;\n\t\t},\n\t\tisUserOnboarded(): boolean {\n\t\t\treturn this.ndvStore.isMappingOnboarded;\n\t\t},\n\t\tisMappingMode(): boolean {\n\t\t\treturn this.isActiveNodeConfig && this.inputMode === 'mapping';\n\t\t},\n\t\tshowDraggableHint(): boolean {\n\t\t\tconst toIgnore = [\n\t\t\t\tSTART_NODE_TYPE,\n\t\t\t\tMANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\tCRON_NODE_TYPE,\n\t\t\t\tINTERVAL_NODE_TYPE,\n\t\t\t];\n\t\t\tif (!this.currentNode || toIgnore.includes(this.currentNode.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !!this.focusedMappableInput && !this.isUserOnboarded;\n\t\t},\n\t\tisActiveNodeConfig(): boolean {\n\t\t\tlet inputs = this.activeNodeType?.inputs ?? [];\n\t\t\tlet outputs = this.activeNodeType?.outputs ?? [];\n\t\t\tif (this.activeNode !== null && this.currentWorkflow !== null) {\n\t\t\t\tconst node = this.currentWorkflow.getNode(this.activeNode.name);\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t} else {\n\t\t\t\t// If we can not figure out the node type we set no outputs\n\t\t\t\tif (!Array.isArray(inputs)) {\n\t\t\t\t\tinputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(outputs)) {\n\t\t\t\t\toutputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tinputs.length === 0 ||\n\t\t\t\t(inputs.every((input) => this.filterOutConnectionType(input, NodeConnectionType.Main)) &&\n\t\t\t\t\toutputs.find((output) => this.filterOutConnectionType(output, NodeConnectionType.Main)))\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisMappingEnabled(): boolean {\n\t\t\tif (this.readOnly) return false;\n\n\t\t\t// Mapping is only enabled in mapping mode for config nodes and if node to map is selected\n\t\t\tif (this.isActiveNodeConfig) return this.isMappingMode && this.mappedNode !== null;\n\n\t\t\treturn true;\n\t\t},\n\t\tisExecutingPrevious(): boolean {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\tconst executingNode = this.workflowsStore.executingNode;\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\ttriggeredNode === this.activeNode.name &&\n\t\t\t\t!this.workflowsStore.isNodeExecuting(this.activeNode.name)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (executingNode.length || triggeredNode) {\n\t\t\t\treturn !!this.parentNodes.find(\n\t\t\t\t\t(node) => this.workflowsStore.isNodeExecuting(node.name) || node.name === triggeredNode,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): Workflow {\n\t\t\treturn this.workflow as Workflow;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\n\t\trootNode(): string {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst rootNodes = workflow.getChildNodes(this.activeNode.name, 'ALL_NON_MAIN');\n\n\t\t\treturn rootNodes[0];\n\t\t},\n\t\trootNodesParents(): string[] {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')].reverse();\n\n\t\t\treturn parentNodes;\n\t\t},\n\t\tcurrentNode(): INodeUi | null {\n\t\t\tif (this.isActiveNodeConfig) {\n\t\t\t\t// if we're mapping node we want to show the output of the mapped node\n\t\t\t\tif (this.mappedNode) {\n\t\t\t\t\treturn this.workflowsStore.getNodeByName(this.mappedNode);\n\t\t\t\t}\n\n\t\t\t\t// in debugging mode data does get set manually and is only for debugging\n\t\t\t\t// so we want to force the node to be the active node to make sure we show the correct data\n\t\t\t\treturn this.activeNode;\n\t\t\t}\n\n\t\t\treturn this.workflowsStore.getNodeByName(this.currentNodeName);\n\t\t},\n\t\tconnectedCurrentNodeOutputs(): number[] | undefined {\n\t\t\tconst search = this.parentNodes.find(({ name }) => name === this.currentNodeName);\n\t\t\tif (search) {\n\t\t\t\treturn search.indicies;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tparentNodes(): IConnectedNode[] {\n\t\t\tif (!this.activeNode) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodes: IConnectedNode[] = (this.workflow as Workflow).getParentNodesByDepth(\n\t\t\t\tthis.activeNode.name,\n\t\t\t);\n\n\t\t\treturn nodes.filter(\n\t\t\t\t({ name }, i) =>\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\tname !== this.activeNode.name &&\n\t\t\t\t\tnodes.findIndex((node) => node.name === name) === i,\n\t\t\t);\n\t\t},\n\t\tcurrentNodeDepth(): number {\n\t\t\tconst node = this.parentNodes.find(\n\t\t\t\t(node) => this.currentNode && node.name === this.currentNode.name,\n\t\t\t);\n\t\t\treturn node ? node.depth : -1;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (!this.activeNode) return null;\n\n\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t},\n\t\tisMultiInputNode(): boolean {\n\t\t\treturn this.activeNodeType !== null && this.activeNodeType.inputs.length > 1;\n\t\t},\n\t},\n\twatch: {\n\t\tinputMode: {\n\t\t\thandler(val) {\n\t\t\t\tthis.onRunIndexChange(-1);\n\t\t\t\tif (val === 'mapping') {\n\t\t\t\t\tthis.onUnlinkRun();\n\t\t\t\t\tthis.mappedNode = this.rootNodesParents[0];\n\t\t\t\t} else {\n\t\t\t\t\tthis.mappedNode = null;\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\t\tshowDraggableHint(curr: boolean, prev: boolean) {\n\t\t\tif (curr && !prev) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.draggableHintShown) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDraggableHintWithDelay = this.showDraggableHint;\n\t\t\t\t\tif (this.showDraggableHintWithDelay) {\n\t\t\t\t\t\tthis.draggableHintShown = true;\n\n\t\t\t\t\t\tthis.$telemetry.track('User viewed data mapping tooltip', {\n\t\t\t\t\t\t\ttype: 'unexecuted input pane',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 1000);\n\t\t\t} else if (!curr) {\n\t\t\t\tthis.showDraggableHintWithDelay = false;\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tfilterOutConnectionType(\n\t\t\titem: ConnectionTypes | INodeOutputConfiguration,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tif (!item) return false;\n\n\t\t\treturn typeof item === 'string' ? item !== type : item.type !== type;\n\t\t},\n\t\tonInputModeChange(val: MappingMode) {\n\t\t\tthis.inputMode = val;\n\t\t},\n\t\tonMappedNodeSelected(val: string) {\n\t\t\tthis.mappedNode = val;\n\n\t\t\tthis.onRunIndexChange(0);\n\t\t\tthis.onUnlinkRun();\n\t\t},\n\t\tgetMultipleNodesText(nodeName?: string): string {\n\t\t\tif (\n\t\t\t\t!nodeName ||\n\t\t\t\t!this.isMultiInputNode ||\n\t\t\t\t!this.activeNode ||\n\t\t\t\tthis.activeNodeType?.inputNames === undefined\n\t\t\t)\n\t\t\t\treturn '';\n\n\t\t\tconst activeNodeConnections =\n\t\t\t\tthis.currentWorkflow.connectionsByDestinationNode[this.activeNode.name].main || [];\n\t\t\t// Collect indexes of connected nodes\n\t\t\tconst connectedInputIndexes = activeNodeConnections.reduce((acc: number[], node, index) => {\n\t\t\t\tif (node[0] && node[0].node === nodeName) return [...acc, index];\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\n\t\t\t// Match connected input indexes to their names specified by active node\n\t\t\tconst connectedInputs = connectedInputIndexes.map(\n\t\t\t\t(inputIndex) => this.activeNodeType?.inputNames?.[inputIndex],\n\t\t\t);\n\n\t\t\tif (connectedInputs.length === 0) return '';\n\n\t\t\treturn `(${connectedInputs.join(' & ')})`;\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'executePrevious',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonInputNodeChange(value: string) {\n\t\t\tconst index = this.parentNodes.findIndex((node) => node.name === value) + 1;\n\t\t\tthis.$emit('changeInputNode', value, index);\n\t\t},\n\t\tonConnectionHelpClick() {\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'not-connected-help',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\ttruncate(nodeName: string) {\n\t\t\tconst truncated = nodeName.substring(0, 30);\n\t\t\tif (truncated.length < nodeName.length) {\n\t\t\t\treturn `${truncated}...`;\n\t\t\t}\n\t\t\treturn truncated;\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.mappedNode {\n\twidth: max-content;\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.titleSection {\n\tdisplay: flex;\n\tmax-width: 300px;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n.inputModeTab {\n\tmargin-left: auto;\n}\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n\n.notConnected {\n\tmax-width: 300px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-option {\n\tfont-weight: var(--font-weight-regular) !important;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n\n\t&.selected > span {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<transition name=\"fade\" mode=\"out-in\">\n\t\t\t<div v-if=\"hasIssues || hideContent\" key=\"empty\"></div>\n\t\t\t<div v-else-if=\"isListeningForEvents\" key=\"listening\">\n\t\t\t\t<n8n-pulse>\n\t\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\"></NodeIcon>\n\t\t\t\t</n8n-pulse>\n\t\t\t\t<div v-if=\"isWebhookNode\">\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.listening')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.requestHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { type: webhookHttpMethod },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:value=\"webhookTestUrl\"\n\t\t\t\t\t\t:toast-title=\"$locale.baseText('ndv.trigger.copiedTestUrl')\"\n\t\t\t\t\t\tclass=\"mb-2xl\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:collapse=\"true\"\n\t\t\t\t\t\t:copy-button-text=\"$locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t\t@copy=\"onTestLinkCopied\"\n\t\t\t\t\t></CopyInput>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else>\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\tlisteningTitle\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t\t\t{{ listeningHint }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayChatButton\">\n\t\t\t\t\t\t<n8n-button class=\"mb-xl\" @click=\"openWebhookUrl()\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.trigger.chatTrigger.openChat') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else key=\"default\">\n\t\t\t\t<div v-if=\"isActivelyPolling\" class=\"mb-xl\">\n\t\t\t\t\t<n8n-spinner type=\"ring\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.action\">\n\t\t\t\t\t<div :class=\"$style.header\">\n\t\t\t\t\t\t<n8n-heading v-if=\"header\" tag=\"h1\" bold>\n\t\t\t\t\t\t\t{{ header }}\n\t\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t\t<n8n-text v-if=\"subheader\">\n\t\t\t\t\t\t\t<span v-text=\"subheader\" />\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text v-if=\"activationHint\" size=\"small\" @click=\"onLinkClick\">\n\t\t\t\t\t<span v-html=\"activationHint\"></span> \n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-link\n\t\t\t\t\tv-if=\"activationHint && executionsHelp\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click=\"expandExecutionHelp\"\n\t\t\t\t\t>{{ $locale.baseText('ndv.trigger.moreInfo') }}</n8n-link\n\t\t\t\t>\n\t\t\t\t<n8n-info-accordion\n\t\t\t\t\tv-if=\"executionsHelp\"\n\t\t\t\t\tref=\"help\"\n\t\t\t\t\t:class=\"$style.accordion\"\n\t\t\t\t\t:title=\"$locale.baseText('ndv.trigger.executionsHint.question')\"\n\t\t\t\t\t:description=\"executionsHelp\"\n\t\t\t\t\t:event-bus=\"executionsHelpEventBus\"\n\t\t\t\t\t@click:body=\"onLinkClick\"\n\t\t\t\t></n8n-info-accordion>\n\t\t\t</div>\n\t\t</transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport NodeExecuteButton from '@/components/NodeExecuteButton.vue';\nimport CopyInput from '@/components/CopyInput.vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nexport default defineComponent({\n\tname: 'TriggerPanel',\n\tcomponents: {\n\t\tNodeExecuteButton,\n\t\tCopyInput,\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t};\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\texecutionsHelpEventBus: createEventBus(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName as string);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thideContent(): boolean {\n\t\t\tif (!this.nodeType?.triggerPanel) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.nodeType?.triggerPanel &&\n\t\t\t\tthis.nodeType?.triggerPanel.hasOwnProperty('hideContent')\n\t\t\t) {\n\t\t\t\tconst hideContent = this.nodeType?.triggerPanel.hideContent;\n\t\t\t\tif (typeof hideContent === 'boolean') {\n\t\t\t\t\treturn hideContent;\n\t\t\t\t}\n\n\t\t\t\tif (this.node) {\n\t\t\t\t\tconst hideContentValue = this.workflowHelpers\n\t\t\t\t\t\t.getCurrentWorkflow()\n\t\t\t\t\t\t.expression.getSimpleParameterValue(this.node, hideContent, 'internal', {});\n\n\t\t\t\t\tif (typeof hideContentValue === 'boolean') {\n\t\t\t\t\t\treturn hideContentValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tserviceName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\treturn getTriggerNodeServiceName(this.nodeType);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tdisplayChatButton(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node &&\n\t\t\t\t\tthis.node.type === CHAT_TRIGGER_NODE_TYPE &&\n\t\t\t\t\tthis.node.parameters.mode !== 'webhook',\n\t\t\t);\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.node && this.node.type === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\twebhookHttpMethod(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst httpMethod = this.workflowHelpers.getWebhookExpressionValue(\n\t\t\t\tthis.nodeType.webhooks[0],\n\t\t\t\t'httpMethod',\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\tif (Array.isArray(httpMethod)) {\n\t\t\t\treturn httpMethod.join(', ');\n\t\t\t}\n\n\t\t\treturn httpMethod;\n\t\t},\n\t\twebhookTestUrl(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.workflowHelpers.getWebhookUrl(this.nodeType.webhooks[0], this.node, 'test');\n\t\t},\n\t\tisWebhookBasedNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.webhooks?.length);\n\t\t},\n\t\tisPollingNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.polling);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isWebhookBasedNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisActivelyPolling(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\n\t\t\treturn this.workflowRunning && this.isPollingNode && this.nodeName === triggeredNode;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tlisteningTitle(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookNode.formTrigger.listening')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookNode.listening');\n\t\t},\n\t\tlisteningHint(): string {\n\t\t\tswitch (this.nodeType?.name) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.chatTrigger.serviceHint');\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.formTrigger.serviceHint');\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.serviceHint', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\theader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingEvent');\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel && typeof this.nodeType.triggerPanel.header === 'string') {\n\t\t\t\treturn this.nodeType.triggerPanel.header;\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.action', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tsubheader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingHint', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\texecutionsHelp(): string {\n\t\t\tif (this.nodeType?.triggerPanel?.executionsHelp !== undefined) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.executionsHelp === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp;\n\t\t\t\t}\n\t\t\t\tif (!this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.inactive) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.inactive;\n\t\t\t\t}\n\t\t\t\tif (this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.active) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tactivationHint(): string {\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel?.activationHint) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.activationHint === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.inactive === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.inactive;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.active === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t},\n\tmethods: {\n\t\texpandExecutionHelp() {\n\t\t\tif (this.$refs.help) {\n\t\t\t\tthis.executionsHelpEventBus.emit('expand');\n\t\t\t}\n\t\t},\n\t\topenWebhookUrl() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'input',\n\t\t\t\ttype: 'open-chat',\n\t\t\t});\n\t\t\twindow.open(this.webhookTestUrl, '_blank', 'noreferrer');\n\t\t},\n\t\tonLinkClick(e: MouseEvent) {\n\t\t\tif (!e.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (target.localName !== 'a') return;\n\n\t\t\tif (target.dataset?.key) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (target.dataset.key === 'activate') {\n\t\t\t\t\tthis.$emit('activate');\n\t\t\t\t} else if (target.dataset.key === 'executions') {\n\t\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\t\tpane: 'input',\n\t\t\t\t\t\ttype: 'open-executions-log',\n\t\t\t\t\t});\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\tname: VIEWS.EXECUTIONS,\n\t\t\t\t\t});\n\t\t\t\t} else if (target.dataset.key === 'settings') {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonTestLinkCopied() {\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'inputs',\n\t\t\t\ttype: 'test url',\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-background-base);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\toverflow: hidden;\n\n\t> * {\n\t\twidth: 100%;\n\t}\n}\n\n.header {\n\tmargin-bottom: var(--spacing-s);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.action {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.shake {\n\tanimation: shake 8s infinite;\n}\n\n@keyframes shake {\n\t90% {\n\t\ttransform: translateX(0);\n\t}\n\t92.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t95% {\n\t\ttransform: translateX(-6px);\n\t}\n\t97.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n\n.accordion {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 200ms;\n}\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n</style>\n","<template>\n\t<el-dialog\n\t\t:model-value=\"(!!activeNode || renaming) && !isActiveStickyNode\"\n\t\t:before-close=\"close\"\n\t\t:show-close=\"false\"\n\t\tclass=\"data-display-wrapper ndv-wrapper\"\n\t\toverlay-class=\"data-display-overlay\"\n\t\twidth=\"auto\"\n\t\tappend-to-body\n\t\tdata-test-id=\"ndv\"\n\t\t:data-has-output-connection=\"hasOutputConnection\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"bottom-start\"\n\t\t\t:visible=\"showTriggerWaitingWarning\"\n\t\t\t:disabled=\"!showTriggerWaitingWarning\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<div :class=\"$style.triggerWarning\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas.waitingForTriggerWarning') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div :class=\"$style.backToCanvas\" data-test-id=\"back-to-canvas\" @click=\"close\">\n\t\t\t\t<n8n-icon icon=\"arrow-left\" color=\"text-xlight\" size=\"medium\" />\n\t\t\t\t<n8n-text color=\"text-xlight\" size=\"medium\" :bold=\"true\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\n\t\t<div\n\t\t\tv-if=\"activeNode\"\n\t\t\tref=\"container\"\n\t\t\tclass=\"data-display\"\n\t\t\ttabindex=\"0\"\n\t\t\t@keydown.capture=\"onKeyDown\"\n\t\t>\n\t\t\t<div :class=\"$style.modalBackground\" @click=\"close\"></div>\n\t\t\t<NDVDraggablePanels\n\t\t\t\t:key=\"activeNode.name\"\n\t\t\t\t:is-trigger-node=\"isTriggerNode\"\n\t\t\t\t:hide-input-and-output=\"activeNodeType === null\"\n\t\t\t\t:position=\"isTriggerNode && !showTriggerPanel ? 0 : undefined\"\n\t\t\t\t:is-draggable=\"!isTriggerNode\"\n\t\t\t\t:has-double-width=\"activeNodeType?.parameterPane === 'wide'\"\n\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@init=\"onPanelsInit\"\n\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<template v-if=\"showTriggerPanel || !isTriggerNode\" #input>\n\t\t\t\t\t<TriggerPanel\n\t\t\t\t\t\tv-if=\"showTriggerPanel\"\n\t\t\t\t\t\t:node-name=\"activeNode.name\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputPanel\n\t\t\t\t\t\tv-else-if=\"!isTriggerNode\"\n\t\t\t\t\t\t:workflow=\"workflow\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"inputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:current-node-name=\"inputNodeName\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isInputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateInputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@run-change=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@change-input-node=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@table-mounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onInputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #output>\n\t\t\t\t\t<OutputPanel\n\t\t\t\t\t\tdata-test-id=\"output-panel\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"outputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:is-read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && isTriggerNode && !isExecutableTriggerNode\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isOutputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateOutputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@run-change=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@table-mounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onOutputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #main>\n\t\t\t\t\t<NodeSettings\n\t\t\t\t\t\t:event-bus=\"settingsEventBus\"\n\t\t\t\t\t\t:dragging=\"isDragging\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t\t\t:foreign-credentials=\"foreignCredentials\"\n\t\t\t\t\t\t:read-only=\"readOnly\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && showTriggerPanel\"\n\t\t\t\t\t\t:executable=\"!readOnly\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t\t@redraw-required=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t\t/>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"featureRequestUrl\"\n\t\t\t\t\t\t:class=\"$style.featureRequest\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onFeatureRequestClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<font-awesome-icon icon=\"lightbulb\" />\n\t\t\t\t\t\t{{ $locale.baseText('ndv.featureRequest') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</NDVDraggablePanels>\n\t\t</div>\n\t</el-dialog>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type {\n\tINodeConnections,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tWorkflow,\n\tConnectionTypes,\n} from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IExecutionResponse, INodeUi, IUpdateInformation, TargetItem } from '@/Interface';\n\nimport NodeSettings from '@/components/NodeSettings.vue';\nimport NDVDraggablePanels from './NDVDraggablePanels.vue';\n\nimport OutputPanel from './OutputPanel.vue';\nimport InputPanel from './InputPanel.vue';\nimport TriggerPanel from './TriggerPanel.vue';\nimport {\n\tBASE_NODE_SURVEY_URL,\n\tEnterpriseEditionFeature,\n\tEXECUTABLE_TRIGGER_NODE_TYPES,\n\tMODAL_CONFIRM,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nexport default defineComponent({\n\tname: 'NodeDetailsView',\n\tcomponents: {\n\t\tNodeSettings,\n\t\tInputPanel,\n\t\tOutputPanel,\n\t\tNDVDraggablePanels,\n\t\tTriggerPanel,\n\t},\n\tmixins: [workflowActivate],\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\trenaming: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tworkflowHelpers,\n\t\t\t...useDeviceSupport(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettingsEventBus: createEventBus(),\n\t\t\tredrawRequired: false,\n\t\t\trunInputIndex: -1,\n\t\t\trunOutputIndex: -1,\n\t\t\tisLinkingEnabled: true,\n\t\t\tselectedInput: undefined as string | undefined,\n\t\t\ttriggerWaitingWarningEnabled: false,\n\t\t\tisDragging: false,\n\t\t\tmainPanelPosition: 0,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tavgInputRowHeight: 0,\n\t\t\tavgOutputRowHeight: 0,\n\t\t\tisInputPaneActive: false,\n\t\t\tisOutputPaneActive: false,\n\t\t\tisPairedItemHoveringEnabled: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tdataPinningEventBus.on('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tbeforeUnmount() {\n\t\tdataPinningEventBus.off('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore, useSettingsStore),\n\t\tpushRef(): string {\n\t\t\treturn this.ndvStore.pushRef;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tshowTriggerWaitingWarning(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.triggerWaitingWarningEnabled &&\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t!this.activeNodeType.group.includes('trigger') &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowsStore.executionWaitingForWebhook\n\t\t\t);\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tinputNodeName(): string | undefined {\n\t\t\treturn this.selectedInput || this.parentNode;\n\t\t},\n\t\tinputNode(): INodeUi | null {\n\t\t\tif (this.inputNodeName) {\n\t\t\t\treturn this.workflowsStore.getNodeByName(this.inputNodeName);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tshowTriggerPanel(): boolean {\n\t\t\tconst override = !!this.activeNodeType?.triggerPanel;\n\t\t\tif (typeof this.activeNodeType?.triggerPanel === 'boolean') {\n\t\t\t\treturn override;\n\t\t\t}\n\n\t\t\tconst isWebhookBasedNode = !!this.activeNodeType?.webhooks?.length;\n\t\t\tconst isPollingNode = this.activeNodeType?.polling;\n\n\t\t\treturn (\n\t\t\t\t!this.readOnly && this.isTriggerNode && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t},\n\t\tworkflow(): Workflow {\n\t\t\treturn this.workflowHelpers.getCurrentWorkflow();\n\t\t},\n\t\thasOutputConnection() {\n\t\t\tif (!this.activeNode) return false;\n\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tthis.activeNode.name,\n\t\t\t) as INodeConnections;\n\n\t\t\t// Check if there's at-least one output connection\n\t\t\treturn (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;\n\t\t},\n\t\tparentNodes(): string[] {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn (\n\t\t\t\t\tthis.workflow.getParentNodesByDepth(this.activeNode.name, 1).map(({ name }) => name) || []\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tparentNode(): string | undefined {\n\t\t\t// Return the first parent node that contains data\n\t\t\tfor (const parentNodeName of this.parentNodes) {\n\t\t\t\t// Check first for pinned data\n\t\t\t\tif (this.workflowsStore.pinnedWorkflowData[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\t// Check then the data of the current execution\n\t\t\t\tif (this.workflowRunData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.parentNodes[0];\n\t\t},\n\t\tisExecutableTriggerNode(): boolean {\n\t\t\tif (!this.activeNodeType) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(this.activeNodeType.name);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t(this.activeNodeType.group.includes('trigger') ||\n\t\t\t\t\tthis.activeNodeType.name === START_NODE_TYPE)\n\t\t\t);\n\t\t},\n\t\tisActiveStickyNode(): boolean {\n\t\t\treturn !!this.ndvStore.activeNode && this.ndvStore.activeNode.type === STICKY_NODE_TYPE;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tmaxOutputRun(): number {\n\t\t\tif (this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.activeNode.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.activeNode.name].length) {\n\t\t\t\treturn runData[this.activeNode.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\toutputRun(): number {\n\t\t\tif (this.runOutputIndex === -1) {\n\t\t\t\treturn this.maxOutputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runOutputIndex, this.maxOutputRun);\n\t\t},\n\t\tmaxInputRun(): number {\n\t\t\tif (this.inputNode === null || this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = this.workflow.getNode(this.activeNode.name);\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(this.workflow, workflowNode, this.activeNodeType);\n\n\t\t\tlet node = this.inputNode;\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = this.activeNode;\n\t\t\t}\n\n\t\t\tif (!node || !runData || !runData.hasOwnProperty(node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[node.name].length) {\n\t\t\t\treturn runData[node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tinputRun(): number {\n\t\t\tif (this.isLinkingEnabled && this.maxOutputRun === this.maxInputRun) {\n\t\t\t\treturn this.outputRun;\n\t\t\t}\n\t\t\tif (this.runInputIndex === -1) {\n\t\t\t\treturn this.maxInputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runInputIndex, this.maxInputRun);\n\t\t},\n\t\tcanLinkRuns(): boolean {\n\t\t\treturn this.maxOutputRun > 0 && this.maxOutputRun === this.maxInputRun;\n\t\t},\n\t\tlinked(): boolean {\n\t\t\treturn this.isLinkingEnabled && this.canLinkRuns;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.isTriggerNode ? 0 : 80;\n\t\t},\n\t\tfeatureRequestUrl(): string {\n\t\t\tif (!this.activeNodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${this.activeNodeType.name}`;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisWorkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisExecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tblockUi(): boolean {\n\t\t\treturn this.isWorkflowRunning || this.isExecutionWaitingForWebhook;\n\t\t},\n\t\tforeignCredentials(): string[] {\n\t\t\tconst credentials = (this.activeNode || {}).credentials;\n\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentials: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t) {\n\t\t\t\tObject.values(credentials).forEach((credential) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\tusedCredentials[credential.id] &&\n\t\t\t\t\t\t!usedCredentials[credential.id].currentUserHasAccess\n\t\t\t\t\t) {\n\t\t\t\t\t\tforeignCredentials.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentials;\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveNode(node: INodeUi | null, oldNode: INodeUi | null) {\n\t\t\tif (node && node.name !== oldNode?.name && !this.isActiveStickyNode) {\n\t\t\t\tthis.runInputIndex = -1;\n\t\t\t\tthis.runOutputIndex = -1;\n\t\t\t\tthis.isLinkingEnabled = true;\n\t\t\t\tthis.selectedInput = undefined;\n\t\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\t\tthis.avgOutputRowHeight = 0;\n\t\t\t\tthis.avgInputRowHeight = 0;\n\n\t\t\t\tsetTimeout(() => this.ndvStore.setNDVPushRef(), 0);\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\tnodeSubtitle: this.nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.activeNodeType,\n\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow(),\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.activeNode) {\n\t\t\t\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\tthis.activeNode.name,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.$telemetry.track('User opened node modal', {\n\t\t\t\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\t\t\tis_editable: !this.hasForeignCredential,\n\t\t\t\t\t\t\tparameters_pane_position: this.mainPanelPosition,\n\t\t\t\t\t\t\tinput_first_connector_runs: this.maxInputRun,\n\t\t\t\t\t\t\toutput_first_connector_runs: this.maxOutputRun,\n\t\t\t\t\t\t\tselected_view_inputs: this.isTriggerNode\n\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t: this.ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\tselected_view_outputs: this.ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\tinput_connectors: this.parentNodes.length,\n\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\tinput_displayed_run_index: this.inputRun,\n\t\t\t\t\t\t\toutput_displayed_run_index: this.outputRun,\n\t\t\t\t\t\t\tdata_pinning_tooltip_presented: this.pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t\t\tinput_displayed_row_height_avg: this.avgInputRowHeight,\n\t\t\t\t\t\t\toutput_displayed_row_height_avg: this.avgOutputRowHeight,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t}\n\t\t\tif (window.top && !this.isActiveStickyNode) {\n\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t}\n\t\t},\n\t\tmaxOutputRun() {\n\t\t\tthis.runOutputIndex = -1;\n\t\t},\n\t\tmaxInputRun() {\n\t\t\tthis.runInputIndex = -1;\n\t\t},\n\t\tinputNodeName(nodeName: string | undefined) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t},\n\t\tinputRun() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputRunIndex(this.inputRun);\n\t\t\t}, 0);\n\t\t},\n\t},\n\tmethods: {\n\t\tsetIsTooltipVisible({ isTooltipVisible }: { isTooltipVisible: boolean }) {\n\t\t\tthis.pinDataDiscoveryTooltipVisible = isTooltipVisible;\n\t\t},\n\t\tonKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key === 's' && this.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.readOnly) return;\n\n\t\t\t\tthis.$emit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t},\n\t\tonInputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.inputNodeName || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.inputNodeName,\n\t\t\t\trunIndex: this.inputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonOutputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.activeNode || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.activeNode.name,\n\t\t\t\trunIndex: this.outputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonInputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgInputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonOutputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgOutputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t},\n\t\tonFeatureRequestClick() {\n\t\t\twindow.open(this.featureRequestUrl, '_blank');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'i-wish-this-node-would',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonPanelsInit(e: { position: number }) {\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragStart(e: { position: number }) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragEnd(e: { windowWidth: number; position: number }) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.$telemetry.track('User moved parameters pane', {\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: this.mainPanelPosition,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonLinkRunToInput() {\n\t\t\tthis.runOutputIndex = this.runInputIndex;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('input');\n\t\t},\n\t\tonLinkRunToOutput() {\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('output');\n\t\t},\n\t\tonUnlinkRun(pane: string) {\n\t\t\tthis.runInputIndex = this.runOutputIndex;\n\t\t\tthis.isLinkingEnabled = false;\n\t\t\tthis.trackLinking(pane);\n\t\t},\n\t\ttrackLinking(pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tlinked: this.linked,\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.activeNode || !this.workflowRunning) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.triggerWaitingWarningEnabled = true;\n\t\t\t}, 1000);\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.settingsEventBus.emit('openSettings');\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tthis.$emit('valueChanged', parameterData);\n\t\t},\n\t\tnodeTypeSelected(nodeTypeName: string) {\n\t\t\tthis.$emit('nodeTypeSelected', nodeTypeName);\n\t\t},\n\t\tonSwitchSelectedNode(nodeTypeName: string) {\n\t\t\tthis.$emit('switchSelectedNode', nodeTypeName);\n\t\t},\n\t\tonOpenConnectionNodeCreator(nodeTypeName: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', nodeTypeName, connectionType);\n\t\t},\n\t\tasync close() {\n\t\t\tif (this.isDragging) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\t(typeof this.activeNodeType?.outputs === 'string' ||\n\t\t\t\t\ttypeof this.activeNodeType?.inputs === 'string' ||\n\t\t\t\t\tthis.redrawRequired)\n\t\t\t) {\n\t\t\t\t// TODO: We should keep track of if it actually changed and only do if required\n\t\t\t\t// Whenever a node with custom inputs and outputs gets closed redraw it in case\n\t\t\t\t// they changed\n\t\t\t\tconst nodeName = this.activeNode.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$emit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (this.outputPanelEditMode.enabled && this.activeNode) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await this.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.cancel'),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (shouldPinDataBeforeClosing === MODAL_CONFIRM) {\n\t\t\t\t\tconst { value } = this.outputPanelEditMode;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.pinnedData.setData(jsonParse(value), 'on-ndv-close-modal');\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\tthis.$telemetry.track('User closed node modal', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tthis.ndvStore.resetNDVPushRef();\n\t\t},\n\t\tonRunOutputIndexChange(run: number) {\n\t\t\tthis.runOutputIndex = run;\n\t\t\tthis.trackRunChange(run, 'output');\n\t\t},\n\t\tonRunInputIndexChange(run: number) {\n\t\t\tthis.runInputIndex = run;\n\t\t\tif (this.linked) {\n\t\t\t\tthis.runOutputIndex = run;\n\t\t\t}\n\t\t\tthis.trackRunChange(run, 'input');\n\t\t},\n\t\ttrackRunChange(run: number, pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run dropdown', {\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonInputNodeChange(value: string, index: number) {\n\t\t\tthis.runInputIndex = -1;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.selectedInput = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: this.activeNode ? this.activeNode.type : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: this.inputNode ? this.inputNode.type : '',\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\tactivateInputPane() {\n\t\t\tthis.isInputPaneActive = true;\n\t\t\tthis.isOutputPaneActive = false;\n\t\t},\n\t\tactivateOutputPane() {\n\t\t\tthis.isInputPaneActive = false;\n\t\t\tthis.isOutputPaneActive = true;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.isPairedItemHoveringEnabled = !search;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n// Hide notice(.ndv-connection-hint-notice) warning when node has output connection\n[data-has-output-connection='true'] .ndv-connection-hint-notice {\n\tdisplay: none;\n}\n.ndv-wrapper {\n\toverflow: visible;\n\tmargin-top: 0;\n}\n\n.data-display-wrapper {\n\theight: calc(100% - var(--spacing-l)) !important;\n\tmargin-top: var(--spacing-xl) !important;\n\tmargin-bottom: var(--spacing-xl) !important;\n\twidth: 100%;\n\tbackground: none;\n\tborder: none;\n\n\t.el-dialog__header {\n\t\tpadding: 0 !important;\n\t}\n\n\t.el-dialog__body {\n\t\tpadding: 0 !important;\n\t\theight: 100%;\n\t\tmin-height: 400px;\n\t\toverflow: visible;\n\t\tborder-radius: 8px;\n\t}\n}\n\n.data-display {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n}\n</style>\n\n<style lang=\"scss\" module>\n$main-panel-width: 360px;\n\n.modalBackground {\n\theight: 100%;\n\twidth: 100%;\n}\n\n.triggerWarning {\n\tmax-width: 180px;\n}\n\n.backToCanvas {\n\tposition: fixed;\n\ttop: var(--spacing-xs);\n\tleft: var(--spacing-l);\n\n\tspan {\n\t\tcolor: var(--color-ndv-back-font);\n\t}\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n\n\t> * {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n@media (min-width: $breakpoint-lg) {\n\t.backToCanvas {\n\t\ttop: var(--spacing-xs);\n\t\tleft: var(--spacing-m);\n\t}\n}\n\n.featureRequest {\n\tposition: absolute;\n\tbottom: var(--spacing-4xs);\n\tleft: calc(100% + var(--spacing-s));\n\tcolor: var(--color-feature-request-font);\n\tfont-size: var(--font-size-2xs);\n\twhite-space: nowrap;\n\n\t* {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { N8nActionDropdown } from 'n8n-design-system';\nimport type { INode } from 'n8n-workflow';\nimport { watch, ref } from 'vue';\n\nconst contextMenu = useContextMenu();\nconst { position, isOpen, actions, target } = contextMenu;\nconst dropdown = ref<InstanceType<typeof N8nActionDropdown>>();\nconst emit = defineEmits<{ (event: 'action', action: ContextMenuAction, nodes: INode[]): void }>();\n\nwatch(\n\tisOpen,\n\t() => {\n\t\tif (isOpen) {\n\t\t\tdropdown.value?.open();\n\t\t} else {\n\t\t\tdropdown.value?.close();\n\t\t}\n\t},\n\t{ flush: 'post' },\n);\n\nfunction onActionSelect(item: string) {\n\tconst action = item as ContextMenuAction;\n\tcontextMenu._dispatchAction(action);\n\temit('action', action, contextMenu.targetNodes.value);\n}\n\nfunction onVisibleChange(open: boolean) {\n\tif (!open) {\n\t\tcontextMenu.close();\n\t}\n}\n</script>\n\n<template>\n\t<Teleport v-if=\"isOpen\" to=\"body\">\n\t\t<div\n\t\t\t:class=\"$style.contextMenu\"\n\t\t\t:style=\"{\n\t\t\t\tleft: `${position[0]}px`,\n\t\t\t\ttop: `${position[1]}px`,\n\t\t\t}\"\n\t\t>\n\t\t\t<N8nActionDropdown\n\t\t\t\tref=\"dropdown\"\n\t\t\t\t:items=\"actions\"\n\t\t\t\tplacement=\"bottom-start\"\n\t\t\t\tdata-test-id=\"context-menu\"\n\t\t\t\t:hide-arrow=\"target.source !== 'node-button'\"\n\t\t\t\t@select=\"onActionSelect\"\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<template #activator>\n\t\t\t\t\t<div :class=\"$style.activator\"></div>\n\t\t\t\t</template>\n\t\t\t</N8nActionDropdown>\n\t\t</div>\n\t</Teleport>\n</template>\n\n<style module lang=\"scss\">\n.contextMenu {\n\tposition: fixed;\n}\n\n.activator {\n\tpointer-events: none;\n\topacity: 0;\n}\n</style>\n","import { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { INodeUi } from '@/Interface';\nimport {\n\tNO_OP_NODE_TYPE,\n\tNODE_CONNECTION_TYPE_ALLOW_MULTIPLE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNODE_MIN_INPUT_ITEMS_COUNT,\n} from '@/constants';\n\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeOutputConfiguration,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport type { Endpoint, EndpointOptions } from '@jsplumb/core';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport type { EndpointSpec } from '@jsplumb/common';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport type { N8nEndpointLabelLength } from '@/plugins/jsplumb/N8nPlusEndpointType';\n\nconst createAddInputEndpointSpec = (\n\tconnectionName: NodeConnectionType,\n\tcolor: string,\n): EndpointSpec => {\n\tconst multiple = NODE_CONNECTION_TYPE_ALLOW_MULTIPLE.includes(connectionName);\n\n\treturn {\n\t\ttype: 'N8nAddInput',\n\t\toptions: {\n\t\t\twidth: 24,\n\t\t\theight: 72,\n\t\t\tcolor,\n\t\t\tmultiple,\n\t\t},\n\t};\n};\n\nconst createDiamondOutputEndpointSpec = (): EndpointSpec => ({\n\ttype: 'Rectangle',\n\toptions: {\n\t\theight: 10,\n\t\twidth: 10,\n\t\tcssClass: 'diamond-output-endpoint',\n\t},\n});\n\nconst getEndpointLabelLength = (length: number): N8nEndpointLabelLength => {\n\tif (length <= 2) return 'small';\n\telse if (length <= 6) return 'medium';\n\treturn 'large';\n};\n\nexport const nodeBase = defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\tinputs: [] as Array<ConnectionTypes | INodeInputConfiguration>,\n\t\t\toutputs: [] as Array<ConnectionTypes | INodeOutputConfiguration>,\n\t\t};\n\t},\n\tmounted() {\n\t\t// Initialize the node\n\t\tif (this.data !== null) {\n\t\t\ttry {\n\t\t\t\tthis.__addNode(this.data);\n\t\t\t} catch (error) {\n\t\t\t\t// This breaks when new nodes are loaded into store but workflow tab is not currently active\n\t\t\t\t// Shouldn't affect anything\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useUIStore, useCanvasStore, useWorkflowsStore, useHistoryStore),\n\t\tdata(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tnodeId(): string {\n\t\t\treturn this.data?.id || '';\n\t\t},\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tinstance: {\n\t\t\ttype: Object as PropType<BrowserJsPlumbInstance>,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisActive: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideActions: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdisableSelecting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tshowCustomTooltip: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as () => Workflow,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmethods: {\n\t\t__addEndpointTestingData(endpoint: Endpoint, type: string, inputIndex: number) {\n\t\t\tif (window?.Cypress && 'canvas' in endpoint.endpoint) {\n\t\t\t\tconst canvas = endpoint.endpoint.canvas;\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-name', this.data.name);\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-input-index', inputIndex.toString());\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-type', type);\n\t\t\t}\n\t\t},\n\t\t__addInputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\t// Add Inputs\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tconst inputs: Array<ConnectionTypes | INodeInputConfiguration> =\n\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.data!, nodeTypeData) || [];\n\t\t\tthis.inputs = inputs;\n\n\t\t\tconst sortedInputs = [...inputs];\n\t\t\tsortedInputs.sort((a, b) => {\n\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (typeof b === 'string') {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (a.required && !b.required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (!a.required && b.required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t});\n\n\t\t\tsortedInputs.forEach((value, i) => {\n\t\t\t\tlet inputConfiguration: INodeInputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tinputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinputConfiguration = value;\n\t\t\t\t}\n\n\t\t\t\tconst inputName: ConnectionTypes = inputConfiguration.type;\n\n\t\t\t\tconst rootCategoryInputName =\n\t\t\t\t\tinputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for inputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryInputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(inputName)) {\n\t\t\t\t\ttypeIndexData[inputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[inputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryInputName];\n\t\t\t\tconst typeIndex = typeIndexData[inputName];\n\n\t\t\t\tconst inputsOfSameRootType = inputs.filter((inputData) => {\n\t\t\t\t\tconst thisInputName: string = typeof inputData === 'string' ? inputData : inputData.type;\n\t\t\t\t\treturn inputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisInputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisInputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\tconst nonMainInputs = inputsOfSameRootType.filter((inputData) => {\n\t\t\t\t\treturn inputData !== NodeConnectionType.Main;\n\t\t\t\t});\n\t\t\t\tconst requiredNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && inputData.required;\n\t\t\t\t});\n\t\t\t\tconst optionalNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && !inputData.required;\n\t\t\t\t});\n\t\t\t\tconst spacerIndexes = this.getSpacerIndexes(\n\t\t\t\t\trequiredNonMainInputs.length,\n\t\t\t\t\toptionalNonMainInputs.length,\n\t\t\t\t);\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\tinputName,\n\t\t\t\t\t'input',\n\t\t\t\t\tinputsOfSameRootType.length,\n\t\t\t\t\tspacerIndexes,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(inputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getInputEndpointUUID(this.nodeId, inputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t// We potentially want to change that in the future to allow people to dynamically\n\t\t\t\t\t// activate and deactivate connected nodes\n\t\t\t\t\tmaxConnections: inputConfiguration.maxConnections ?? -1,\n\t\t\t\t\tendpoint: 'Rectangle',\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-foreground-xdark',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-primary',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\tscope: NodeViewUtils.getScope(scope),\n\t\t\t\t\tsource: inputName !== NodeConnectionType.Main,\n\t\t\t\t\ttarget: !this.isReadOnly && inputs.length > 1, // only enabled for nodes with multiple inputs.. otherwise attachment handled by connectionDrag event in NodeView,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'target',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: inputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !this.isReadOnly, // enabled in default case to allow dragging\n\t\t\t\t\tcssClass: 'rect-input-endpoint',\n\t\t\t\t\tdragAllowedWhenFull: true,\n\t\t\t\t\thoverClass: 'rect-input-endpoint-hover',\n\t\t\t\t\t...this.__getInputConnectionStyle(inputName, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance?.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t) as Endpoint;\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'input', typeIndex);\n\t\t\t\tif (inputConfiguration.displayName || nodeTypeData.inputNames?.[i]) {\n\t\t\t\t\t// Apply input names if they got set\n\t\t\t\t\tendpoint.addOverlay(\n\t\t\t\t\t\tNodeViewUtils.getInputNameOverlay(\n\t\t\t\t\t\t\tinputConfiguration.displayName || nodeTypeData.inputNames[i],\n\t\t\t\t\t\t\tinputName,\n\t\t\t\t\t\t\tinputConfiguration.required,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: inputsOfSameRootType.length,\n\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// TODO: Activate again if it makes sense. Currently makes problems when removing\n\t\t\t\t// connection on which the input has a name. It does not get hidden because\n\t\t\t\t// the endpoint to which it connects when letting it go over the node is\n\t\t\t\t// different to the regular one (have different ids). So that seems to make\n\t\t\t\t// problems when hiding the input-name.\n\n\t\t\t\t// if (index === 0 && inputName === NodeConnectionType.Main) {\n\t\t\t\t// \t// Make the first main-input the default one to connect to when connection gets dropped on node\n\t\t\t\t// \tthis.instance.makeTarget(this.nodeId, newEndpointData);\n\t\t\t\t// }\n\t\t\t});\n\t\t\tif (sortedInputs.length === 0) {\n\t\t\t\tthis.instance.manage(this.$refs[this.data.name] as Element);\n\t\t\t}\n\t\t},\n\t\tgetSpacerIndexes(\n\t\t\tleftGroupItemsCount: number,\n\t\t\trightGroupItemsCount: number,\n\t\t\tinsertSpacerBetweenGroups = NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\t\t\tminItemsCount = NODE_MIN_INPUT_ITEMS_COUNT,\n\t\t): number[] {\n\t\t\tconst spacerIndexes = [];\n\n\t\t\tif (leftGroupItemsCount > 0 && rightGroupItemsCount > 0) {\n\t\t\t\tif (insertSpacerBetweenGroups) {\n\t\t\t\t\tspacerIndexes.push(leftGroupItemsCount);\n\t\t\t\t} else if (leftGroupItemsCount + rightGroupItemsCount < minItemsCount) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tleftGroupItemsCount > 0 &&\n\t\t\t\t\tleftGroupItemsCount < minItemsCount &&\n\t\t\t\t\trightGroupItemsCount === 0\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex + leftGroupItemsCount);\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tleftGroupItemsCount === 0 &&\n\t\t\t\t\trightGroupItemsCount > 0 &&\n\t\t\t\t\trightGroupItemsCount < minItemsCount\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spacerIndexes;\n\t\t},\n\t\t__addOutputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tthis.outputs = NodeHelpers.getNodeOutputs(this.workflow, this.data, nodeTypeData) || [];\n\n\t\t\t// TODO: There are still a lot of references of \"main\" in NodesView and\n\t\t\t// other locations. So assume there will be more problems\n\t\t\tlet maxLabelLength = 0;\n\t\t\tconst outputConfigurations: INodeOutputConfiguration[] = [];\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tlet outputConfiguration: INodeOutputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\toutputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\toutputConfiguration = value;\n\t\t\t\t}\n\t\t\t\tif (nodeTypeData.outputNames?.[i]) {\n\t\t\t\t\toutputConfiguration.displayName = nodeTypeData.outputNames[i];\n\t\t\t\t}\n\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\tmaxLabelLength =\n\t\t\t\t\t\toutputConfiguration.displayName.length > maxLabelLength\n\t\t\t\t\t\t\t? outputConfiguration.displayName.length\n\t\t\t\t\t\t\t: maxLabelLength;\n\t\t\t\t}\n\n\t\t\t\toutputConfigurations.push(outputConfiguration);\n\t\t\t});\n\n\t\t\tconst endpointLabelLength = getEndpointLabelLength(maxLabelLength);\n\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tconst outputConfiguration = outputConfigurations[i];\n\n\t\t\t\tconst outputName: ConnectionTypes = outputConfiguration.type;\n\n\t\t\t\tconst rootCategoryOutputName =\n\t\t\t\t\toutputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for outputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryOutputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(outputName)) {\n\t\t\t\t\ttypeIndexData[outputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[outputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryOutputName];\n\t\t\t\tconst typeIndex = typeIndexData[outputName];\n\n\t\t\t\tconst outputsOfSameRootType = this.outputs.filter((outputData) => {\n\t\t\t\t\tconst thisOutputName: string =\n\t\t\t\t\t\ttypeof outputData === 'string' ? outputData : outputData.type;\n\t\t\t\t\treturn outputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisOutputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisOutputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\toutputName,\n\t\t\t\t\t'output',\n\t\t\t\t\toutputsOfSameRootType.length,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(outputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\tendpoint: {\n\t\t\t\t\t\ttype: 'Dot',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tradius: nodeTypeData && outputsOfSameRootType.length > 2 ? 7 : 9,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(nodeTypeData, '--color-primary'),\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: true,\n\t\t\t\t\ttarget: outputName !== NodeConnectionType.Main,\n\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\thoverClass: 'dot-output-endpoint-hover',\n\t\t\t\t\tconnectionsDirected: true,\n\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t...this.__getOutputConnectionStyle(outputName, outputConfiguration, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t);\n\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'output', typeIndex);\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\t// Apply output names if they got set\n\t\t\t\t\tconst overlaySpec = NodeViewUtils.getOutputNameOverlay(\n\t\t\t\t\t\toutputConfiguration.displayName,\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\toutputConfiguration?.category,\n\t\t\t\t\t);\n\t\t\t\t\tendpoint.addOverlay(overlaySpec);\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (!this.isReadOnly && outputName === NodeConnectionType.Main) {\n\t\t\t\t\tconst plusEndpointData: EndpointOptions = {\n\t\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\t\tendpoint: {\n\t\t\t\t\t\t\ttype: 'N8nPlus',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdimensions: 24,\n\t\t\t\t\t\t\t\tconnectedEndpoint: endpoint,\n\t\t\t\t\t\t\t\tshowOutputLabel: this.outputs.length === 1,\n\t\t\t\t\t\t\t\tsize: this.outputs.length >= 3 ? 'small' : 'medium',\n\t\t\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t\t\t\thoverMessage: this.$locale.baseText('nodeBase.clickToAddNodeOrDragToConnect'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: true,\n\t\t\t\t\t\ttarget: false,\n\t\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\thoverPaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparameters: {\n\t\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tcategory: outputConfiguration?.category,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: 'plus-draggable-endpoint',\n\t\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (outputConfiguration?.category) {\n\t\t\t\t\t\tplusEndpointData.cssClass = `${plusEndpointData.cssClass} ${outputConfiguration?.category}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst plusEndpoint = this.instance.addEndpoint(\n\t\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\t\tplusEndpointData,\n\t\t\t\t\t);\n\t\t\t\t\tthis.__addEndpointTestingData(plusEndpoint, 'plus', typeIndex);\n\n\t\t\t\t\tif (!Array.isArray(plusEndpoint)) {\n\t\t\t\t\t\tplusEndpoint.__meta = {\n\t\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t__addNode(node: INodeUi) {\n\t\t\tconst nodeTypeData = (this.nodeTypesStore.getNodeType(node.type, node.typeVersion) ??\n\t\t\t\tthis.nodeTypesStore.getNodeType(NO_OP_NODE_TYPE)) as INodeTypeDescription;\n\n\t\t\tthis.__addInputEndpoints(node, nodeTypeData);\n\t\t\tthis.__addOutputEndpoints(node, nodeTypeData);\n\t\t},\n\t\t__getEndpointColor(connectionType: ConnectionTypes) {\n\t\t\treturn `--node-type-${connectionType}-color`;\n\t\t},\n\t\t__getInputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createAddInputEndpointSpec(\n\t\t\t\t\tconnectionName as NodeConnectionType,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\t__getOutputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\toutputConfiguration: INodeOutputConfiguration,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tconst type = 'output';\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createDiamondOutputEndpointSpec(),\n\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\tif (outputConfiguration.category === 'error') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\t...NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfill: 'var(--color-danger)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t),\n\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\ttouchEnd(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\t\t\tif (deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmouseLeftClick(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\t\t\tfor (let index = 0; index < path.length; index++) {\n\t\t\t\tif (\n\t\t\t\t\tpath[index].className &&\n\t\t\t\t\ttypeof path[index].className === 'string' &&\n\t\t\t\t\tpath[index].className.includes('no-select-on-click')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t} else {\n\t\t\t\t\tif (!deviceSupport.isCtrlKeyPressed(e)) {\n\t\t\t\t\t\tthis.$emit('deselectAllNodes');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.uiStore.isNodeSelected(this.data.name)) {\n\t\t\t\t\t\tthis.$emit('deselectNode', this.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit('nodeSelected', this.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n","<template>\n\t<div\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\t:class=\"nodeWrapperClass\"\n\t\t:style=\"nodeWrapperStyles\"\n\t\tdata-test-id=\"canvas-node\"\n\t\t:data-name=\"data.name\"\n\t\t:data-node-type=\"nodeType?.name\"\n\t\t@contextmenu=\"(e: MouseEvent) => openContextMenu(e, 'node-right-click')\"\n\t>\n\t\t<div v-show=\"isSelected\" class=\"select-background\"></div>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'node-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'menu-open': isContextMenuOpen,\n\t\t\t\t'disable-pointer-events': disablePointerEvents,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\t:class=\"nodeClass\"\n\t\t\t\t:style=\"nodeStyle\"\n\t\t\t\t@click.left=\"onClick\"\n\t\t\t>\n\t\t\t\t<i v-if=\"isTriggerNode\" class=\"trigger-icon\">\n\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<span v-html=\"$locale.baseText('node.thisIsATriggerNode')\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"bolt\" size=\"lg\" />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</i>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!data.disabled\"\n\t\t\t\t\t:class=\"{ 'node-info-icon': true, 'shift-icon': shiftOutputCount }\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"hasIssues && !hideNodeIssues\" class=\"node-issues\" data-test-id=\"node-issues\">\n\t\t\t\t\t\t<n8n-tooltip :show-after=\"500\" placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<TitledList :title=\"`${$locale.baseText('node.issues')}:`\" :items=\"nodeIssues\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"exclamation-triangle\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else-if=\"waiting || nodeExecutionStatus === 'waiting'\" class=\"waiting\">\n\t\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<div v-text=\"waiting\"></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"clock\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-else-if=\"showPinnedDataInfo\" class=\"node-pin-data-icon\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"thumbtack\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"nodeExecutionStatus === 'unknown'\">\n\t\t\t\t\t\t<!-- Do nothing, unknown means the node never executed -->\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"workflowDataItems\" class=\"data-count\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"check\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-executing-info\" :title=\"$locale.baseText('node.nodeIsExecuting')\">\n\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" spin />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-trigger-tooltip__wrapper\">\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:show-after=\"500\"\n\t\t\t\t\t\t:visible=\"showTriggerNodeTooltip\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<div v-text=\"getTriggerNodeTooltip\"></div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isTriggerNode\"\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:visible=\"pinDataDiscoveryTooltipVisible\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.canvas') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\n\t\t\t\t<NodeIcon\n\t\t\t\t\tclass=\"node-icon\"\n\t\t\t\t\t:node-type=\"iconNodeType\"\n\t\t\t\t\t:size=\"40\"\n\t\t\t\t\t:shrink=\"false\"\n\t\t\t\t\t:color-default=\"iconColorDefault\"\n\t\t\t\t\t:disabled=\"data.disabled\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"showDisabledLinethrough\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'disabled-linethrough': true,\n\t\t\t\t\tsuccess: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,\n\t\t\t\t}\"\n\t\t\t></div>\n\t\t</div>\n\t\t<div class=\"node-description\">\n\t\t\t<div class=\"node-name\" :title=\"nodeTitle\">\n\t\t\t\t<p data-test-id=\"canvas-node-box-title\">\n\t\t\t\t\t{{ nodeTitle }}\n\t\t\t\t</p>\n\t\t\t\t<p v-if=\"data.disabled\">({{ $locale.baseText('node.disabled') }})</p>\n\t\t\t</div>\n\t\t\t<div v-if=\"nodeSubtitle !== undefined\" class=\"node-subtitle\" :title=\"nodeSubtitle\">\n\t\t\t\t{{ nodeSubtitle }}\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"!isReadOnly\"\n\t\t\tv-show=\"!hideActions\"\n\t\t\tclass=\"node-options no-select-on-click\"\n\t\t\t@contextmenu.stop\n\t\t\t@mousedown.stop\n\t\t>\n\t\t\t<div class=\"node-options-inner\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"!isConfigNode\"\n\t\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"play\"\n\t\t\t\t\t:disabled=\"workflowRunning\"\n\t\t\t\t\t:title=\"$locale.baseText('node.testStep')\"\n\t\t\t\t\t@click=\"executeNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"disable-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"power-off\"\n\t\t\t\t\t:title=\"nodeDisabledTitle\"\n\t\t\t\t\t@click=\"toggleDisableNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"delete-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t\t@click=\"deleteNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport {\n\tCUSTOM_API_CALL_KEY,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tSIMULATE_NODE_TYPE,\n\tSIMULATE_TRIGGER_NODE_TYPE,\n\tWAIT_TIME_UNLIMITED,\n} from '@/constants';\nimport { nodeBase } from '@/mixins/nodeBase';\nimport type {\n\tConnectionTypes,\n\tExecutionSummary,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tITaskData,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\n\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\n\nimport { get } from 'lodash-es';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { EnableNodeToggleCommand } from '@/models/history';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { type ContextMenuTarget, useContextMenu } from '@/composables/useContextMenu';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'Node',\n\tcomponents: {\n\t\tTitledList,\n\t\tFontAwesomeIcon,\n\t\tNodeIcon,\n\t},\n\tmixins: [nodeBase],\n\tprops: {\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tdisablePointerEvents: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thideNodeIssues: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst node = workflowsStore.getNodeByName(props.name);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\tcontextMenu,\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcallDebounced,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tshowPinnedDataInfo(): boolean {\n\t\t\treturn this.pinnedData.hasData.value && !this.isProductionExecutionPreview;\n\t\t},\n\t\tisDuplicatable(): boolean {\n\t\t\tif (!this.nodeType) return true;\n\t\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(this.nodeType.name)) return false;\n\t\t\treturn (\n\t\t\t\tthis.nodeType.maxNodes === undefined || this.sameTypeNodes.length < this.nodeType.maxNodes\n\t\t\t);\n\t\t},\n\t\tisScheduledGroup(): boolean {\n\t\t\treturn this.nodeType?.group.includes('schedule') === true;\n\t\t},\n\t\ticonColorDefault(): string | undefined {\n\t\t\tif (this.isConfigNode) {\n\t\t\t\treturn 'var(--color-text-base)';\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tnodeRunData(): ITaskData[] {\n\t\t\treturn this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\tif (this.nodeExecutionStatus && ['crashed', 'error'].includes(this.nodeExecutionStatus))\n\t\t\t\treturn true;\n\t\t\tif (this.pinnedData.hasData.value) return false;\n\t\t\tif (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowDataItems(): number {\n\t\t\tconst workflowResultDataNode = this.nodeRunData;\n\t\t\tif (workflowResultDataNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn workflowResultDataNode.length;\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tgetTriggerNodeTooltip(): string | undefined {\n\t\t\tif (this.nodeType !== null && this.nodeType.hasOwnProperty('eventTriggerDescription')) {\n\t\t\t\tconst nodeName = this.$locale.shortNodeType(this.nodeType.name);\n\t\t\t\tconst { eventTriggerDescription } = this.nodeType;\n\t\t\t\treturn this.$locale\n\t\t\t\t\t.nodeText()\n\t\t\t\t\t.eventTriggerDescription(nodeName, eventTriggerDescription || '');\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('node.waitingForYouToCreateAnEventIn', {\n\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\tnodeType: this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisExecuting(): boolean {\n\t\t\treturn this.workflowsStore.isNodeExecuting(this.data.name);\n\t\t},\n\t\tisSingleActiveTriggerNode(): boolean {\n\t\t\tconst nodes = this.workflowsStore.workflowTriggerNodes.filter((node: INodeUi) => {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\treturn nodeType && nodeType.eventTriggerDescription !== '' && !node.disabled;\n\t\t\t});\n\n\t\t\treturn nodes.length === 1;\n\t\t},\n\t\tisManualTypeNode(): boolean {\n\t\t\treturn this.data.type === MANUAL_TRIGGER_NODE_TYPE;\n\t\t},\n\t\tisConfigNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data?.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigurableNode(\n\t\t\t\tthis.workflow,\n\t\t\t\tthis.data,\n\t\t\t\tthis.data?.type ?? '',\n\t\t\t);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.data?.type || '');\n\t\t},\n\t\tisTriggerNodeTooltipEmpty(): boolean {\n\t\t\treturn this.nodeType !== null ? this.nodeType.eventTriggerDescription === '' : false;\n\t\t},\n\t\tisNodeDisabled(): boolean | undefined {\n\t\t\treturn this.node && this.node.disabled;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | undefined {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.nodesByName[this.name] as INodeUi | undefined;\n\t\t},\n\t\tsameTypeNodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node: INodeUi) => node.type === this.data.type);\n\t\t},\n\t\tnodeWrapperClass(): object {\n\t\t\tconst classes = {\n\t\t\t\t'node-wrapper': true,\n\t\t\t\t'node-wrapper--trigger': this.isTriggerNode,\n\t\t\t\t'node-wrapper--configurable': this.isConfigurableNode,\n\t\t\t\t'node-wrapper--config': this.isConfigNode,\n\t\t\t};\n\n\t\t\tif (this.outputs.length) {\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.outputs);\n\t\t\t\tconst otherOutputs = outputTypes.filter(\n\t\t\t\t\t(outputName) => outputName !== NodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t\tif (otherOutputs.length) {\n\t\t\t\t\totherOutputs.forEach((outputName) => {\n\t\t\t\t\t\tclasses[`node-wrapper--connection-type-${outputName}`] = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t},\n\t\tnodeWrapperStyles(): object {\n\t\t\tconst styles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t};\n\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst inputs =\n\t\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.node, this.nodeType) ||\n\t\t\t\t\t([] as Array<ConnectionTypes | INodeInputConfiguration>);\n\t\t\t\tconst inputTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tconst nonMainInputs = inputTypes.filter((input) => input !== NodeConnectionType.Main);\n\t\t\t\tif (nonMainInputs.length) {\n\t\t\t\t\tconst requiredNonMainInputs = inputs.filter(\n\t\t\t\t\t\t(input) => typeof input !== 'string' && input.required,\n\t\t\t\t\t);\n\n\t\t\t\t\tlet spacerCount = 0;\n\t\t\t\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\t\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.length;\n\t\t\t\t\t\tconst optionalNonMainInputsCount = nonMainInputs.length - requiredNonMainInputsCount;\n\t\t\t\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tstyles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount;\n\t\t\t\t}\n\n\t\t\t\tlet outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>;\n\t\t\t\tif (this.workflow.nodes[this.node.name]) {\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType);\n\t\t\t\t}\n\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\n\t\t\t\tconst mainOutputs = outputTypes.filter((output) => output === NodeConnectionType.Main);\n\t\t\t\tstyles['--node-main-output-count'] = mainOutputs.length;\n\t\t\t}\n\n\t\t\treturn styles;\n\t\t},\n\t\tnodeClass(): object {\n\t\t\treturn {\n\t\t\t\t'node-box': true,\n\t\t\t\tdisabled: this.data.disabled,\n\t\t\t\texecuting: this.isExecuting,\n\t\t\t};\n\t\t},\n\t\tnodeExecutionStatus(): string {\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\treturn nodeExecutionRunData.filter(Boolean)[0].executionStatus ?? '';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tnodeIssues(): string[] {\n\t\t\tconst issues: string[] = [];\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\tnodeExecutionRunData.forEach((executionRunData) => {\n\t\t\t\t\tif (executionRunData?.error) {\n\t\t\t\t\t\tissues.push(\n\t\t\t\t\t\t\t`${executionRunData.error.message}${\n\t\t\t\t\t\t\t\texecutionRunData.error.description ? ` (${executionRunData.error.description})` : ''\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.data?.issues !== undefined) {\n\t\t\t\tissues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));\n\t\t\t}\n\t\t\treturn issues;\n\t\t},\n\t\tnodeDisabledTitle(): string {\n\t\t\treturn this.data.disabled\n\t\t\t\t? this.$locale.baseText('node.enable')\n\t\t\t\t: this.$locale.baseText('node.disable');\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\treturn this.node ? this.node.position : [0, 0];\n\t\t},\n\t\tshowDisabledLinethrough(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.isConfigurableNode &&\n\t\t\t\t!!(this.data.disabled && this.inputs.length === 1 && this.outputs.length === 1)\n\t\t\t);\n\t\t},\n\t\tshortNodeType(): string {\n\t\t\treturn this.$locale.shortNodeType(this.data.type);\n\t\t},\n\t\tnodeTitle(): string {\n\t\t\tif (this.data.name === 'Start') {\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: 'headers.start.displayName',\n\t\t\t\t\tfallback: 'Start',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn this.data.name;\n\t\t},\n\t\twaiting(): string | undefined {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution as ExecutionSummary;\n\n\t\t\tif (workflowExecution?.waitTill) {\n\t\t\t\tconst lastNodeExecuted = get(workflowExecution, 'data.resultData.lastNodeExecuted');\n\t\t\t\tif (this.name === lastNodeExecuted) {\n\t\t\t\t\tconst waitDate = new Date(workflowExecution.waitTill);\n\t\t\t\t\tif (waitDate.toISOString() === WAIT_TIME_UNLIMITED) {\n\t\t\t\t\t\treturn this.$locale.baseText(\n\t\t\t\t\t\t\t'node.theNodeIsWaitingIndefinitelyForAnIncomingWebhookCall',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.$locale.baseText('node.nodeIsWaitingTill', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdate: waitDate.toLocaleDateString(),\n\t\t\t\t\t\t\ttime: waitDate.toLocaleTimeString(),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tnodeStyle(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\n\t\t\tlet borderColor = '--color-foreground-xdark';\n\n\t\t\tif (this.isConfigurableNode || this.isConfigNode) {\n\t\t\t\tborderColor = '--color-foreground-dark';\n\t\t\t}\n\n\t\t\tif (this.data.disabled) {\n\t\t\t\tborderColor = '--color-foreground-base';\n\t\t\t} else if (!this.isExecuting) {\n\t\t\t\tif (this.hasIssues && !this.hideNodeIssues) {\n\t\t\t\t\t// Do not set red border if there is an issue with the configuration node\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.nodeRunData?.[0]?.error as NodeOperationError)?.functionality !==\n\t\t\t\t\t\t'configuration-node'\n\t\t\t\t\t) {\n\t\t\t\t\t\tborderColor = '--color-danger';\n\t\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\t}\n\t\t\t\t} else if (this.waiting || this.showPinnedDataInfo) {\n\t\t\t\t\tborderColor = '--color-canvas-node-pinned-border';\n\t\t\t\t} else if (this.nodeExecutionStatus === 'unknown') {\n\t\t\t\t\tborderColor = '--color-foreground-xdark';\n\t\t\t\t} else if (this.workflowDataItems) {\n\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\tborderColor = '--color-success';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnStyles['border-color'] = `var(${borderColor})`;\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tshiftOutputCount(): boolean {\n\t\t\treturn !!(this.nodeType && this.outputs.length > 2);\n\t\t},\n\t\tshouldShowTriggerTooltip(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isPollingTypeNode &&\n\t\t\t\t!this.pinnedData.hasData.value &&\n\t\t\t\t!this.isNodeDisabled &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowDataItems === 0 &&\n\t\t\t\tthis.isSingleActiveTriggerNode &&\n\t\t\t\t!this.isTriggerNodeTooltipEmpty &&\n\t\t\t\t!this.hasIssues &&\n\t\t\t\t!this.dragging\n\t\t\t);\n\t\t},\n\t\tisContextMenuOpen(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.contextMenu.isOpen.value &&\n\t\t\t\tthis.contextMenu.target.value.source === 'node-button' &&\n\t\t\t\tthis.contextMenu.target.value.node.name === this.data?.name\n\t\t\t);\n\t\t},\n\t\ticonNodeType() {\n\t\t\tif (\n\t\t\t\tthis.data?.type === SIMULATE_NODE_TYPE ||\n\t\t\t\tthis.data?.type === SIMULATE_TRIGGER_NODE_TYPE\n\t\t\t) {\n\t\t\t\tconst icon = this.data.parameters?.icon as string;\n\t\t\t\tconst iconNodeType = this.workflow.expression.getSimpleParameterValue(\n\t\t\t\t\tthis.data,\n\t\t\t\t\ticon,\n\t\t\t\t\t'internal',\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t\tif (iconNodeType && typeof iconNodeType === 'string') {\n\t\t\t\t\treturn this.nodeTypesStore.getNodeType(iconNodeType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.nodeType;\n\t\t},\n\t},\n\twatch: {\n\t\tisActive(newValue, oldValue) {\n\t\t\tif (!newValue && oldValue) {\n\t\t\t\tthis.setSubtitle();\n\t\t\t}\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\tif (this.showTriggerNodeTooltip) {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 200);\n\t\t\t}\n\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t},\n\t\tshouldShowTriggerTooltip(shouldShowTriggerTooltip) {\n\t\t\tif (shouldShowTriggerTooltip) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 2500);\n\t\t\t} else {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t}\n\t\t},\n\t\tnodeRunData(newValue) {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$emit('run', { name: this.data.name, data: newValue, waiting: !!this.waiting });\n\t\t},\n\t},\n\tcreated() {\n\t\tconst hasSeenPinDataTooltip = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value;\n\t\tif (!hasSeenPinDataTooltip) {\n\t\t\tthis.unwatchWorkflowDataItems = this.$watch('workflowDataItems', (dataItemsCount: number) => {\n\t\t\t\tthis.showPinDataDiscoveryTooltip(dataItemsCount);\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tsetTimeout(() => {\n\t\t\tthis.setSubtitle();\n\t\t}, 0);\n\t\tif (this.nodeRunData) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('run', {\n\t\t\t\t\tname: this.data && this.data.name,\n\t\t\t\t\tdata: this.nodeRunData,\n\t\t\t\t\twaiting: !!this.waiting,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTouchActive: false,\n\t\t\tnodeSubtitle: '',\n\t\t\tshowTriggerNodeTooltip: false,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tdragging: false,\n\t\t\tunwatchWorkflowDataItems: () => {},\n\t\t};\n\t},\n\tmethods: {\n\t\tshowPinDataDiscoveryTooltip(dataItemsCount: number): void {\n\t\t\tif (\n\t\t\t\t!this.isTriggerNode ||\n\t\t\t\tthis.isManualTypeNode ||\n\t\t\t\tthis.isScheduledGroup ||\n\t\t\t\tthis.uiStore.isModalActive ||\n\t\t\t\tdataItemsCount === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\n\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\tthis.unwatchWorkflowDataItems();\n\t\t},\n\t\tsetSubtitle() {\n\t\t\t// why is this not a computed property? because it's a very expensive operation\n\t\t\t// it requires expressions to resolve each subtitle...\n\t\t\t// and ends up bogging down the UI with big workflows, for example when pasting a workflow or even opening a node...\n\t\t\t// so we only update it when necessary (when node is mounted and when it's opened and closed (isActive))\n\t\t\ttry {\n\t\t\t\tconst nodeSubtitle =\n\t\t\t\t\tthis.nodeHelpers.getNodeSubtitle(this.data, this.nodeType, this.workflow) || '';\n\n\t\t\t\tthis.nodeSubtitle = nodeSubtitle.includes(CUSTOM_API_CALL_KEY) ? '' : nodeSubtitle;\n\t\t\t} catch (e) {\n\t\t\t\t// avoid breaking UI if expression error occurs\n\t\t\t}\n\t\t},\n\t\tdisableNode() {\n\t\t\tif (this.data !== null) {\n\t\t\t\tthis.nodeHelpers.disableNodes([this.data]);\n\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\tnew EnableNodeToggleCommand(\n\t\t\t\t\t\tthis.data.name,\n\t\t\t\t\t\t!this.data.disabled,\n\t\t\t\t\t\tthis.data.disabled === true,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\t\tnode_type: this.data.type,\n\t\t\t\t\tbutton_name: 'disable',\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\texecuteNode() {\n\t\t\tthis.$emit('runWorkflow', this.data.name, 'Node.executeNode');\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'execute',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\n\t\tdeleteNode() {\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'delete',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\n\t\ttoggleDisableNode(event: MouseEvent) {\n\t\t\t(event.currentTarget as HTMLButtonElement).blur();\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'disable',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.$emit('toggleDisableNode', this.data);\n\t\t},\n\n\t\tonClick(event: MouseEvent) {\n\t\t\tvoid this.callDebounced(this.onClickDebounced, { debounceTime: 50, trailing: true }, event);\n\t\t},\n\n\t\tonClickDebounced(event: MouseEvent) {\n\t\t\tconst isDoubleClick = event.detail >= 2;\n\t\t\tif (isDoubleClick) {\n\t\t\t\tthis.setNodeActive();\n\t\t\t} else {\n\t\t\t\tthis.mouseLeftClick(event);\n\t\t\t}\n\t\t},\n\n\t\tsetNodeActive() {\n\t\t\tthis.ndvStore.activeNodeName = this.data ? this.data.name : '';\n\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.deviceSupport.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event: MouseEvent, source: ContextMenuTarget['source']) {\n\t\t\tif (this.data) {\n\t\t\t\tthis.contextMenu.open(event, { source, node: this.data });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.context-menu {\n\tposition: absolute;\n}\n\n.node-wrapper {\n\t--node-width: 100px;\n\t/*\n\t\tSet the node height to 100px as a base.\n\t\tIncrease height by 20px for each output beyond the 4th one.\n\t\tmax(0, var(--node-main-output-count, 1) - 4) ensures that we only start counting after the 4th output.\n\t*/\n\t--node-height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 20px);\n\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\n\tposition: absolute;\n\twidth: var(--node-width);\n\theight: var(--node-height);\n\n\t.node-description {\n\t\tposition: absolute;\n\t\ttop: var(--node-height);\n\t\tleft: calc(var(--node-width) / 2 * -1);\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcursor: default;\n\t\tpadding: 8px;\n\t\twidth: 100%;\n\t\tmin-width: calc(var(--node-width) * 2);\n\t\tpointer-events: none; // prevent container from being draggable\n\n\t\t.node-name > p {\n\t\t\t// must be paragraph tag to have two lines in safari\n\t\t\ttext-overflow: ellipsis;\n\t\t\tdisplay: -webkit-box;\n\t\t\t-webkit-box-orient: vertical;\n\t\t\t-webkit-line-clamp: 2;\n\t\t\toverflow: hidden;\n\t\t\toverflow-wrap: anywhere;\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t\tline-height: var(--font-line-height-compact);\n\t\t}\n\n\t\t.node-subtitle {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: $custom-font-light;\n\t\t\tfont-size: 0.8em;\n\t\t}\n\t}\n\n\t&.touch-active,\n\t&:hover,\n\t&.menu-open {\n\t\t.node-options {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t.node-options {\n\t\t:deep(.button) {\n\t\t\t--button-font-color: var(--color-text-light);\n\t\t\t--button-border-radius: 0;\n\t\t}\n\t\tcursor: default;\n\t\tposition: absolute;\n\t\tbottom: 100%;\n\t\tz-index: 11;\n\t\tmin-width: 100%;\n\t\tdisplay: flex;\n\t\tleft: calc(-1 * var(--spacing-4xs));\n\t\tright: calc(-1 * var(--spacing-4xs));\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tpadding-bottom: var(--spacing-2xs);\n\t\tfont-size: var(--font-size-s);\n\t\topacity: 0;\n\t\ttransition: opacity 100ms ease-in;\n\n\t\t&-inner {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbackground-color: var(--color-canvas-background);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t.node-default {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\t\t&.disable-pointer-events {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.node-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\tbackground-color: var(--color-canvas-node-background);\n\t\t\t--color-background-node-icon-badge: var(--color-canvas-node-background);\n\t\t\t&.executing {\n\t\t\t\tbackground-color: $node-background-executing !important;\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-executing-info {\n\t\t\tdisplay: none;\n\t\t\tposition: absolute;\n\t\t\tleft: 0px;\n\t\t\ttop: 0px;\n\t\t\tz-index: 12;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfont-size: 3.75em;\n\t\t\tline-height: 1.65em;\n\t\t\ttext-align: center;\n\t\t\tcolor: hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.7);\n\t\t}\n\n\t\t.node-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50% - 20px);\n\t\t\tleft: calc(50% - 20px);\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tposition: absolute;\n\t\t\tbottom: 6px;\n\t\t\tright: 6px;\n\n\t\t\t&.shift-icon {\n\t\t\t\tright: 12px;\n\t\t\t}\n\n\t\t\t.data-count {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--color-success);\n\t\t\t}\n\n\t\t\t.node-issues {\n\t\t\t\tcolor: var(--color-danger);\n\t\t\t}\n\n\t\t\t.items-count {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\n\t\t.node-pin-data-icon {\n\t\t\tcolor: var(--color-secondary);\n\t\t\tmargin-right: 2px;\n\n\t\t\tsvg {\n\t\t\t\theight: 0.85rem;\n\t\t\t}\n\t\t}\n\n\t\t.waiting {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\t}\n\n\t&--config {\n\t\t--configurable-node-input-width: 55px;\n\t\t--node-width: 75px;\n\t\t--node-height: 75px;\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tscale: 0.75;\n\t\t\t}\n\n\t\t\t.node-box {\n\t\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\t\tborder-radius: 50px;\n\n\t\t\t\t&.executing {\n\t\t\t\t\tbackground-color: $node-background-executing-other !important;\n\t\t\t\t}\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tfont-size: 2.85em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t&.node-wrapper--connection-type-#{$node-type} {\n\t\t\t\t.node-default .node-box {\n\t\t\t\t\tbackground: var(--node-type-#{$node-type}-background);\n\t\t\t\t}\n\n\t\t\t\t.node-description {\n\t\t\t\t\t.node-subtitle {\n\t\t\t\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tbottom: 4px !important;\n\t\t\tright: 50% !important;\n\t\t\ttransform: translateX(50%) scale(0.75);\n\t\t}\n\n\t\t&.node-wrapper--configurable {\n\t\t\t--configurable-node-icon-offset: 20px;\n\n\t\t\t.node-info-icon {\n\t\t\t\tbottom: 1px !important;\n\t\t\t\tright: 1px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--configurable {\n\t\t--node-width: var(\n\t\t\t--configurable-node-width,\n\t\t\tcalc(\n\t\t\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\t\t\tvar(--configurable-node-input-width)\n\t\t\t)\n\t\t);\n\t\t--configurable-node-icon-offset: 40px;\n\t\t--configurable-node-icon-size: 30px;\n\n\t\t.node-description {\n\t\t\ttop: calc(50%);\n\t\t\ttransform: translateY(-50%);\n\t\t\tleft: calc(\n\t\t\t\tvar(--configurable-node-icon-offset) + var(--configurable-node-icon-size) + var(--spacing-s)\n\t\t\t);\n\t\t\ttext-align: left;\n\t\t\toverflow: auto;\n\t\t\twhite-space: normal;\n\t\t\tmin-width: unset;\n\t\t\tmax-width: calc(\n\t\t\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(\n\t\t\t\t\t\t--configurable-node-icon-size\n\t\t\t\t\t) - 2 * var(--spacing-s)\n\t\t\t);\n\t\t\t.node-name > p {\n\t\t\t\tcolor: var(--color-configurable-node-name);\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tleft: var(--configurable-node-icon-offset);\n\t\t\t}\n\n\t\t\t.node-executing-info {\n\t\t\t\tleft: -67px;\n\t\t\t}\n\t\t}\n\n\t\t&[data-node-type='@n8n/n8n-nodes-langchain.chatTrigger'] {\n\t\t\t--configurable-node-min-input-count: 1;\n\t\t\t--configurable-node-input-width: 176px;\n\t\t}\n\t}\n\n\t&--trigger .node-default .node-box {\n\t\tborder-radius: 32px 8px 8px 32px;\n\t}\n\n\t.trigger-icon {\n\t\tposition: absolute;\n\t\tright: 100%;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tmargin: auto;\n\t\tcolor: var(--color-primary);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: fit-content;\n\t\t// Increase click radius of the bolt icon\n\t\tpadding: var(--spacing-2xs);\n\t}\n}\n\n.select-background {\n\t--node--selected--box-shadow-radius: 8px;\n\n\tdisplay: block;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\ttop: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\theight: calc(100% + 2 * var(--node--selected--box-shadow-radius));\n\twidth: calc(100% + 2 * var(--node--selected--box-shadow-radius)) !important;\n\n\t.node-wrapper--trigger & {\n\t\tborder-radius: 36px 8px 8px 36px;\n\t}\n\n\t.node-wrapper--config & {\n\t\t--node--selected--box-shadow-radius: 4px;\n\t\tborder-radius: 60px;\n\t}\n}\n\n.disabled-linethrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: 49px;\n\tleft: -3px;\n\twidth: 111px;\n\tpointer-events: none;\n\n\t&.success {\n\t\tborder-color: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.jtk-endpoint {\n\tz-index: 2;\n}\n\n.node-trigger-tooltip {\n\t&__wrapper {\n\t\ttop: -22px;\n\t\tleft: 50px;\n\t\tposition: relative;\n\n\t\t&--item {\n\t\t\tmax-width: 160px;\n\t\t\tposition: fixed;\n\t\t\tz-index: 0 !important;\n\t\t}\n\t}\n}\n.dot-output-endpoint:hover circle {\n\tfill: var(--color-primary);\n}\n/** connector */\n.jtk-connector {\n\tz-index: 3;\n}\n\n.jtk-floating-endpoint {\n\topacity: 0;\n}\n\n.jtk-connector path {\n\ttransition: stroke 0.1s ease-in-out;\n}\n\n.jtk-overlay {\n\tz-index: 3;\n}\n.jtk-connector {\n\tz-index: 4;\n}\n.node-input-endpoint-label,\n.node-output-endpoint-label,\n.connection-run-items-label {\n\tz-index: 5;\n}\n.jtk-connector.jtk-hover {\n\tz-index: 6;\n}\n\n.jtk-endpoint.plus-endpoint {\n\tz-index: 6;\n}\n.jtk-endpoint.dot-output-endpoint {\n\tz-index: 7;\n\toverflow: auto;\n}\n\n.disabled-linethrough {\n\tz-index: 8;\n}\n\n.jtk-drag-active.dot-output-endpoint,\n.jtk-drag-active.rect-input-endpoint {\n\tz-index: 9;\n}\n.rect-input-endpoint > * {\n\tpointer-events: none;\n}\n\n.connection-actions {\n\tz-index: 100;\n}\n\n.drop-add-node-label {\n\tz-index: 10;\n}\n</style>\n\n<style lang=\"scss\">\n:root {\n\t--endpoint-size-small: 14px;\n\t--endpoint-size-medium: 18px;\n\t--stalk-size: 40px;\n\t--stalk-medium-size: 60px;\n\t--stalk-large-size: 90px;\n\t--stalk-success-size: 87px;\n\t--stalk-success-size-without-label: 40px;\n\t--stalk-long-size: 127px;\n\t--plus-endpoint-box-size: 24px;\n\t--plus-endpoint-box-size-small: 17px;\n}\n\n.plus-svg-circle {\n\tz-index: 111;\n\tcircle {\n\t\tstroke: var(--color-foreground-xdark);\n\t\tstroke-width: 2px;\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\n\t&:hover {\n\t\tcircle {\n\t\t\tstroke: var(--color-primary);\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n}\n.plus-stalk {\n\twidth: calc(var(--stalk-size) + 2px);\n\tborder: 1px solid var(--color-foreground-dark);\n\tmargin-left: calc(var(--stalk-size) / 2);\n\tz-index: 3;\n\t&.ep-success {\n\t\tborder-color: var(--color-success-light);\n\n\t\t&:after {\n\t\t\tcontent: attr(data-label);\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 100%;\n\t\t\tmargin: auto;\n\t\t\tmargin-bottom: 2px;\n\t\t\ttext-align: center;\n\n\t\t\tline-height: 1.3em;\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-regular);\n\t\t\tcolor: var(--color-success);\n\t\t}\n\t}\n}\n.connection-run-items-label {\n\t// Disable points events so that the label does not block the connection\n\t// mouse over event.\n\tpointer-events: none;\n\tspan {\n\t\tbackground-color: hsla(\n\t\t\tvar(--color-canvas-background-h),\n\t\t\tvar(--color-canvas-background-s),\n\t\t\tvar(--color-canvas-background-l),\n\t\t\t0.85\n\t\t);\n\t\tborder-radius: var(--border-radius-base);\n\t\tline-height: 1.3em;\n\t\tpadding: 0px 3px;\n\t\twhite-space: nowrap;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-regular);\n\t\tmargin-top: -15px;\n\n\t\t&.floating {\n\t\t\tposition: absolute;\n\t\t\ttop: -6px;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\t}\n}\n\n.connection-input-name-label {\n\tposition: relative;\n\n\tspan {\n\t\tposition: absolute;\n\t\ttop: -10px;\n\t\tleft: -60px;\n\t}\n}\n\n.plus-endpoint {\n\tcursor: pointer;\n\tz-index: 10;\n\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size) / 2) - 1px);\n\tg {\n\t\tfill: var(--color-background-xlight);\n\t\tpointer-events: none;\n\t}\n\n\t&:hover {\n\t\tpath {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-primary);\n\t\t}\n\t}\n\tpath {\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\trect {\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.error {\n\t\tpath {\n\t\t\tfill: var(--color-node-error-output-text-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-node-error-output-text-color);\n\t\t}\n\t}\n\n\t&.small {\n\t\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size-small) / 2));\n\t\tg {\n\t\t\ttransform: scale(0.75);\n\t\t\ttransform-origin: center;\n\t\t}\n\t\trect {\n\t\t\tstroke-width: 2.5;\n\t\t}\n\t}\n\t&:hover .plus-container {\n\t\tcolor: var(--color-primary);\n\t\tborder: 2px solid var(--color-primary);\n\t}\n\t&:hover .drop-hover-message {\n\t\tdisplay: block;\n\t}\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n}\n\n.diamond-output-endpoint {\n\t--diamond-output-endpoint--transition-duration: 0.15s;\n\n\ttransition: transform var(--diamond-output-endpoint--transition-duration) ease;\n\ttransform: rotate(45deg);\n\tz-index: 10;\n}\n\n.add-input-endpoint {\n\t--add-input-endpoint--transition-duration: 0.15s;\n\n\t&:not(.jtk-endpoint-connected) {\n\t\tcursor: pointer;\n\t}\n\n\t&.add-input-endpoint-multiple {\n\t\tz-index: 100;\n\t\tcursor: pointer;\n\t}\n\n\t&.jtk-endpoint-connected {\n\t\tz-index: 10;\n\t}\n\n\t&.add-input-endpoint-error {\n\t\t--endpoint-svg-color: var(--color-danger);\n\t}\n\n\t.add-input-endpoint-default {\n\t\ttransition: transform var(--add-input-endpoint--transition-duration) ease;\n\t}\n\n\t.add-input-endpoint-diamond {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-line {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xlight);\n\t\tstroke: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-icon {\n\t\tstroke: none;\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-connected-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xdark);\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.rect-input-endpoint-hover {\n\t\t.add-input-endpoint-plus-rectangle {\n\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t}\n\n\t\t.add-input-endpoint-plus-icon {\n\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t}\n\t}\n\n\t&.jtk-endpoint-connected:not(.add-input-endpoint-multiple) {\n\t\t.add-input-endpoint-unconnected {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.rect-input-endpoint-hover {\n\t\t\t.add-input-endpoint-connected-rectangle {\n\t\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t\t}\n\t\t}\n\t}\n}\n\n.node-input-endpoint-label,\n.node-output-endpoint-label {\n\t--node-endpoint-label--transition-duration: 0.15s;\n\n\tbackground-color: hsla(\n\t\tvar(--color-canvas-background-h),\n\t\tvar(--color-canvas-background-s),\n\t\tvar(--color-canvas-background-l),\n\t\t0.85\n\t);\n\tborder-radius: var(--border-radius-large);\n\tfont-size: var(--font-size-3xs);\n\tpadding: var(--spacing-5xs) var(--spacing-4xs);\n\twhite-space: nowrap;\n\ttransition: color var(--node-endpoint-label--transition-duration) ease;\n\n\t@each $node-type in $supplemental-node-types {\n\t\t&.node-connection-type-#{$node-type} {\n\t\t\tcolor: var(--node-type-supplemental-label-color);\n\t\t}\n\t}\n}\n\n.node-output-endpoint-label.node-connection-category-error {\n\tcolor: var(--color-node-error-output-text-color);\n}\n\n.node-output-endpoint-label {\n\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs));\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-l) * -1);\n\t\tmargin-left: 0;\n\t}\n\n\t// Some nodes allow for dynamic connection labels\n\t// so we need to make sure the label does not overflow\n\t&.node-connection-type-main[data-endpoint-label-length] {\n\t\tmax-width: calc(var(--stalk-size) - var(--endpoint-size-small) - var(--spacing-4xs));\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\ttransform: translateY(-50%) !important;\n\t\tmargin-left: var(--endpoint-size-small);\n\t}\n}\n\n.node-input-endpoint-label {\n\ttext-align: right;\n\tmargin-left: -25px;\n\n\t&--moved {\n\t\tmargin-left: -40px;\n\t}\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-5xs) * -1);\n\t\tmargin-left: 0;\n\t}\n}\n\n.hover-message.jtk-overlay {\n\t--hover-message-width: 110px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-regular);\n\tcolor: var(--color-text-light);\n\twidth: var(--hover-message-width);\n\tmargin-left: calc(\n\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size) +\n\t\t\tvar(--spacing-2xs)\n\t);\n\topacity: 0;\n\tpointer-events: none;\n\t&.small {\n\t\tmargin-left: calc(\n\t\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size-small) +\n\t\t\t\tvar(--spacing-2xs)\n\t\t);\n\t}\n\t&.visible {\n\t\tpointer-events: all;\n\t\topacity: 1;\n\t}\n}\n\n.long-stalk {\n\t--stalk-size: var(--stalk-long-size);\n}\n.ep-success {\n\t--stalk-size: var(--stalk-success-size);\n}\n.ep-success--without-label {\n\t--stalk-size: var(--stalk-success-size-without-label);\n}\n\n[data-endpoint-label-length='medium'] {\n\t--stalk-size: var(--stalk-medium-size);\n}\n\n[data-endpoint-label-length='large'] {\n\t--stalk-size: var(--stalk-large-size);\n}\n</style>\n","<template>\n\t<div\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\tclass=\"sticky-wrapper\"\n\t\t:style=\"stickyPosition\"\n\t\t:data-name=\"data.name\"\n\t\tdata-test-id=\"sticky\"\n\t>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'sticky-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'is-read-only': isReadOnly,\n\t\t\t}\"\n\t\t\t:style=\"stickySize\"\n\t\t>\n\t\t\t<div v-show=\"isSelected\" class=\"select-sticky-background\" />\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\tclass=\"sticky-box\"\n\t\t\t\t@click.left=\"mouseLeftClick\"\n\t\t\t\t@contextmenu=\"onContextMenu\"\n\t\t\t>\n\t\t\t\t<n8n-sticky\n\t\t\t\t\t:id=\"node.id\"\n\t\t\t\t\t:model-value=\"node.parameters.content\"\n\t\t\t\t\t:height=\"node.parameters.height\"\n\t\t\t\t\t:width=\"node.parameters.width\"\n\t\t\t\t\t:scale=\"nodeViewScale\"\n\t\t\t\t\t:background-color=\"node.parameters.color\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t:default-text=\"defaultText\"\n\t\t\t\t\t:edit-mode=\"isActive && !isReadOnly\"\n\t\t\t\t\t:grid-size=\"gridSize\"\n\t\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t\t@resize=\"onResize\"\n\t\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t\t@markdown-click=\"onMarkdownClick\"\n\t\t\t\t\t@update:model-value=\"onInputChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-show=\"showActions\"\n\t\t\t\t:class=\"{ 'sticky-options': true, 'no-select-on-click': true, 'force-show': forceActions }\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-touch:tap=\"deleteNode\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tdata-test-id=\"delete-sticky\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"trash\" />\n\t\t\t\t</div>\n\t\t\t\t<n8n-popover\n\t\t\t\t\teffect=\"dark\"\n\t\t\t\t\t:popper-style=\"{ width: '208px' }\"\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t@show=\"onShowPopover\"\n\t\t\t\t\t@hide=\"onHidePopover\"\n\t\t\t\t>\n\t\t\t\t\t<template #reference>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref=\"colorPopoverTrigger\"\n\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\tdata-test-id=\"change-sticky-color\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('node.changeColor')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"palette\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(_, index) in Array.from({ length: 7 })\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\tclass=\"color\"\n\t\t\t\t\t\t\tdata-test-id=\"color\"\n\t\t\t\t\t\t\t:class=\"`sticky-color-${index + 1}`\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\t'border-width': '1px',\n\t\t\t\t\t\t\t\t'border-style': 'solid',\n\t\t\t\t\t\t\t\t'border-color': 'var(--color-foreground-xdark)',\n\t\t\t\t\t\t\t\t'background-color': `var(--color-sticky-background-${index + 1})`,\n\t\t\t\t\t\t\t\t'box-shadow':\n\t\t\t\t\t\t\t\t\t(index === 0 && node?.parameters.color === '') ||\n\t\t\t\t\t\t\t\t\tindex + 1 === node?.parameters.color\n\t\t\t\t\t\t\t\t\t\t? `0 0 0 1px var(--color-sticky-background-${index + 1})`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"changeColor(index + 1)\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-popover>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { isNumber, isString } from '@/utils/typeGuards';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tXYPosition,\n} from '@/Interface';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { QUICKSTART_NOTE_NAME } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useContextMenu } from '@/composables/useContextMenu';\nimport { useDeviceSupport } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'Sticky',\n\tmixins: [nodeBase],\n\tprops: {\n\t\tnodeViewScale: {\n\t\t\ttype: Number,\n\t\t},\n\t\tgridSize: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst colorPopoverTrigger = ref<HTMLDivElement>();\n\t\tconst forceActions = ref(false);\n\t\tconst setForceActions = (value: boolean) => {\n\t\t\tforceActions.value = value;\n\t\t};\n\t\tconst contextMenu = useContextMenu((action) => {\n\t\t\tif (action === 'change_color') {\n\t\t\t\tsetForceActions(true);\n\t\t\t\tcolorPopoverTrigger.value?.click();\n\t\t\t}\n\t\t});\n\n\t\treturn { deviceSupport, colorPopoverTrigger, contextMenu, forceActions, setForceActions };\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tdefaultText(): string {\n\t\t\tif (!this.nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst properties = this.nodeType.properties;\n\t\t\tconst content = properties.find((property) => property.name === 'content');\n\n\t\t\treturn content && isString(content.default) ? content.default : '';\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.node.position;\n\t\t\t} else {\n\t\t\t\treturn [0, 0];\n\t\t\t}\n\t\t},\n\t\theight(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.height) ? this.node.parameters.height : 0;\n\t\t},\n\t\twidth(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.width) ? this.node.parameters.width : 0;\n\t\t},\n\t\tstickySize(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\theight: this.height + 'px',\n\t\t\t\twidth: this.width + 'px',\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tstickyPosition(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t\tzIndex: this.isActive ? 9999999 : -1 * Math.floor((this.height * this.width) / 1000),\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tshowActions(): boolean {\n\t\t\treturn (\n\t\t\t\t!(this.hideActions || this.isReadOnly || this.workflowRunning || this.isResizing) ||\n\t\t\t\tthis.forceActions\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisResizing: false,\n\t\t\tisTouchActive: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonShowPopover() {\n\t\t\tthis.setForceActions(true);\n\t\t},\n\t\tonHidePopover() {\n\t\t\tthis.setForceActions(false);\n\t\t},\n\t\tasync deleteNode() {\n\t\t\t// Wait a tick else vue causes problems because the data is gone\n\t\t\tawait this.$nextTick();\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\t\tchangeColor(index: number) {\n\t\t\tthis.workflowsStore.updateNodeProperties({\n\t\t\t\tname: this.name,\n\t\t\t\tproperties: { parameters: { ...this.node.parameters, color: index } },\n\t\t\t});\n\t\t},\n\t\tonEdit(edit: boolean) {\n\t\t\tif (edit && !this.isActive && this.node) {\n\t\t\t\tthis.ndvStore.activeNodeName = this.node.name;\n\t\t\t} else if (this.isActive && !edit) {\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t}\n\t\t},\n\t\tonMarkdownClick(link: HTMLAnchorElement, event: Event) {\n\t\t\tif (link) {\n\t\t\t\tconst isOnboardingNote = this.name === QUICKSTART_NOTE_NAME;\n\t\t\t\tconst isWelcomeVideo = link.querySelector('img[alt=\"n8n quickstart video\"');\n\t\t\t\tconst type =\n\t\t\t\t\tisOnboardingNote && isWelcomeVideo\n\t\t\t\t\t\t? 'welcome_video'\n\t\t\t\t\t\t: isOnboardingNote && link.getAttribute('href') === '/templates'\n\t\t\t\t\t\t\t? 'templates'\n\t\t\t\t\t\t\t: 'other';\n\n\t\t\t\tthis.$telemetry.track('User clicked note link', { type });\n\t\t\t}\n\t\t},\n\t\tonInputChange(content: string) {\n\t\t\tthis.node.parameters.content = content;\n\t\t\tthis.setParameters({ content });\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.isResizing = true;\n\t\t\tif (!this.isSelected && this.node) {\n\t\t\t\tthis.$emit('nodeSelected', this.node.name, false, true);\n\t\t\t}\n\t\t},\n\t\tonResize({ height, width, dX, dY }: { width: number; height: number; dX: number; dY: number }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dX !== 0 || dY !== 0) {\n\t\t\t\tthis.setPosition([this.node.position[0] + (dX || 0), this.node.position[1] + (dY || 0)]);\n\t\t\t}\n\n\t\t\tthis.setParameters({ height, width });\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.isResizing = false;\n\t\t},\n\t\tsetParameters(params: { content?: string; height?: number; width?: number; color?: string }) {\n\t\t\tif (this.node) {\n\t\t\t\tconst nodeParameters = {\n\t\t\t\t\tcontent: isString(params.content) ? params.content : this.node.parameters.content,\n\t\t\t\t\theight: isNumber(params.height) ? params.height : this.node.parameters.height,\n\t\t\t\t\twidth: isNumber(params.width) ? params.width : this.node.parameters.width,\n\t\t\t\t\tcolor: isString(params.color) ? params.color : this.node.parameters.color,\n\t\t\t\t};\n\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tkey: this.node.id,\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetPosition(position: XYPosition) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: this.node.name,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\tonContextMenu(e: MouseEvent): void {\n\t\t\tif (this.node && !this.isActive) {\n\t\t\t\tthis.contextMenu.open(e, { source: 'node-right-click', node: this.node });\n\t\t\t} else {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.sticky-wrapper {\n\tposition: absolute;\n\n\t.sticky-default {\n\t\t.sticky-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover {\n\t\t\t.sticky-options {\n\t\t\t\tdisplay: flex;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t&.is-read-only {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.sticky-options {\n\t\t\tdisplay: none;\n\t\t\tjustify-content: flex-start;\n\t\t\tposition: absolute;\n\t\t\ttop: -25px;\n\t\t\tleft: -8px;\n\t\t\theight: 26px;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: left;\n\t\t\tz-index: 10;\n\t\t\tcolor: #aaa;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\twidth: 28px;\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.force-show {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&.is-touch-device .sticky-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.select-sticky-background {\n\tdisplay: block;\n\tposition: absolute;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\theight: calc(100% + 16px);\n\twidth: calc(100% + 16px);\n\tleft: -8px;\n\ttop: -8px;\n\tz-index: 0;\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: row;\n\twidth: fit-content;\n\tgap: var(--spacing-2xs);\n}\n\n.color {\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tborder-color: var(--color-primary-shade-1);\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n\tSectionCreateElement,\n} from '@/Interface';\nimport { AI_SUBCATEGORY, CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { sublimeSearch } from '@/utils/sortUtils';\nimport { i18n } from '@/plugins/i18n';\nimport type { NodeViewItemSection } from './viewsData';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\tconst WHITE_LISTED_SUBCATEGORIES = [CORE_NODES_CATEGORY, AI_SUBCATEGORY];\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only some subcategories are allowed\n\t\tlet subcategories: string[] = [DEFAULT_SUBCATEGORY];\n\n\t\tWHITE_LISTED_SUBCATEGORIES.forEach((category) => {\n\t\t\tif (item.codex?.categories?.includes(category)) {\n\t\t\t\tsubcategories = item.codex?.subcategories?.[category] ?? [];\n\t\t\t}\n\t\t});\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return 0;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n\nexport function flattenCreateElements(items: INodeCreateElement[]): INodeCreateElement[] {\n\treturn items.map((item) => (item.type === 'section' ? item.children : item)).flat();\n}\n\nexport function groupItemsInSections(\n\titems: INodeCreateElement[],\n\tsections: NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = sections.find((s) => s.items.includes(item.key));\n\t\tconst key = section?.key ?? 'other';\n\t\tacc[key] = [...(acc[key] ?? []), item];\n\t\treturn acc;\n\t}, {});\n\n\tconst result: SectionCreateElement[] = sections\n\t\t.map(\n\t\t\t(section): SectionCreateElement => ({\n\t\t\t\ttype: 'section',\n\t\t\t\tkey: section.key,\n\t\t\t\ttitle: section.title,\n\t\t\t\tchildren: sortNodeCreateElements(itemsBySection[section.key] ?? []),\n\t\t\t}),\n\t\t)\n\t\t.concat({\n\t\t\ttype: 'section',\n\t\t\tkey: 'other',\n\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.other'),\n\t\t\tchildren: sortNodeCreateElements(itemsBySection.other ?? []),\n\t\t})\n\t\t.filter((section) => section.children.length > 0);\n\n\tif (result.length <= 1) {\n\t\treturn items;\n\t}\n\n\treturn result;\n}\n","import { defineStore } from 'pinia';\nimport { STORES, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\nimport type {\n\tNodeFilterType,\n\tNodeCreatorOpenSource,\n\tSimplifiedNodeType,\n\tActionsRecord,\n} from '@/Interface';\n\nimport { computed, ref } from 'vue';\nimport { transformNodeType } from '@/components/Node/NodeCreator/utils';\n\nexport const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => {\n\tconst selectedView = ref<NodeFilterType>(TRIGGER_NODE_CREATOR_VIEW);\n\tconst mergedNodes = ref<SimplifiedNodeType[]>([]);\n\tconst actions = ref<ActionsRecord<typeof mergedNodes.value>>({});\n\n\tconst showScrim = ref(false);\n\tconst openSource = ref<NodeCreatorOpenSource>('');\n\n\tconst allNodeCreatorNodes = computed(() =>\n\t\tObject.values(mergedNodes.value).map((i) => transformNodeType(i)),\n\t);\n\n\tfunction setMergeNodes(nodes: SimplifiedNodeType[]) {\n\t\tmergedNodes.value = nodes;\n\t}\n\n\tfunction setActions(nodes: ActionsRecord<typeof mergedNodes.value>) {\n\t\tactions.value = nodes;\n\t}\n\n\tfunction setShowScrim(isVisible: boolean) {\n\t\tshowScrim.value = isVisible;\n\t}\n\n\tfunction setSelectedView(view: NodeFilterType) {\n\t\tselectedView.value = view;\n\t}\n\n\tfunction setOpenSource(view: NodeCreatorOpenSource) {\n\t\topenSource.value = view;\n\t}\n\n\treturn {\n\t\topenSource,\n\t\tselectedView,\n\t\tshowScrim,\n\t\tmergedNodes,\n\t\tactions,\n\t\tsetShowScrim,\n\t\tsetSelectedView,\n\t\tsetOpenSource,\n\t\tsetActions,\n\t\tsetMergeNodes,\n\t\tallNodeCreatorNodes,\n\t};\n});\n","<template>\n\t<div\n\t\tref=\"container\"\n\t\t:class=\"$style.canvasAddButton\"\n\t\t:style=\"containerCssVars\"\n\t\tdata-test-id=\"canvas-add-button\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"top\"\n\t\t\t:visible=\"showTooltip\"\n\t\t\t:disabled=\"nodeCreatorStore.showScrim\"\n\t\t\t:popper-class=\"$style.tooltip\"\n\t\t\t:show-after=\"700\"\n\t\t>\n\t\t\t<button :class=\"$style.button\" data-test-id=\"canvas-plus-button\" @click=\"$emit('click')\">\n\t\t\t\t<font-awesome-icon icon=\"plus\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<template #content>\n\t\t\t\t{{ $locale.baseText('nodeView.canvasAddButton.addATriggerNodeBeforeExecuting') }}\n\t\t\t</template>\n\t\t</n8n-tooltip>\n\t\t<p :class=\"$style.label\" v-text=\"$locale.baseText('nodeView.canvasAddButton.addFirstStep')\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { XYPosition } from '@/Interface';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nexport interface Props {\n\tshowTooltip: boolean;\n\tposition: XYPosition;\n}\n\nconst props = defineProps<Props>();\n\nconst nodeCreatorStore = useNodeCreatorStore();\nconst containerCssVars = computed(() => ({\n\t'--trigger-placeholder-left-position': `${props.position[0]}px`,\n\t'--trigger-placeholder-top-position': `${props.position[1]}px`,\n}));\n</script>\n\n<style lang=\"scss\" module>\n.canvasAddButton {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100px;\n\theight: 100px;\n\tposition: absolute;\n\ttop: var(--trigger-placeholder-top-position);\n\tleft: var(--trigger-placeholder-left-position);\n\t// We have to increase z-index to make sure it's higher than selecting box in NodeView\n\t// otherwise the clicks wouldn't register\n\tz-index: 101;\n\n\t&:hover .button svg path {\n\t\tfill: var(--color-primary);\n\t}\n}\n\n.button {\n\tbackground: var(--color-foreground-xlight);\n\tborder: 2px dashed var(--color-foreground-xdark);\n\tborder-radius: 8px;\n\tpadding: 0;\n\n\tmin-width: 100px;\n\tmin-height: 100px;\n\tcursor: pointer;\n\n\tsvg {\n\t\twidth: 26px !important;\n\t\theight: 40px;\n\t\tpath {\n\t\t\tfill: var(--color-foreground-xdark);\n\t\t}\n\t}\n}\n\n.label {\n\twidth: max-content;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-xloose);\n\tcolor: var(--color-text-dark);\n\tmargin-top: var(--spacing-2xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAIStore } from '@/stores/ai.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { computed } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nconst aiStore = useAIStore();\nconst locale = useI18n();\nconst telemetry = useTelemetry();\n\nconst emit = defineEmits<{ (event: 'optionSelected', option: string): void }>();\n\nconst aiAssistantChatOpen = computed(() => aiStore.assistantChatOpen);\n\nconst title = computed(() => {\n\treturn aiStore.nextStepPopupConfig.title;\n});\n\nconst options = computed(() => [\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.choose'),\n\t\ticon: '➕',\n\t\tkey: 'choose',\n\t\tdisabled: false,\n\t},\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.generate'),\n\t\ticon: '✨',\n\t\tkey: 'generate',\n\t\tdisabled: aiAssistantChatOpen.value,\n\t},\n]);\n\nconst position = computed(() => {\n\treturn [aiStore.nextStepPopupConfig.position[0], aiStore.nextStepPopupConfig.position[1]];\n});\n\nconst style = computed(() => {\n\treturn {\n\t\tleft: `${position.value[0]}px`,\n\t\ttop: `${position.value[1]}px`,\n\t};\n});\n\nconst close = () => {\n\taiStore.closeNextStepPopup();\n};\n\nconst onOptionSelected = (option: string) => {\n\tif (option === 'choose') {\n\t\temit('optionSelected', option);\n\t} else if (option === 'generate') {\n\t\ttelemetry.track('User clicked generate AI button', {}, { withPostHog: true });\n\t\taiStore.assistantChatOpen = true;\n\t}\n\tclose();\n};\n</script>\n\n<template>\n\t<div v-on-click-outside=\"close\" :class=\"$style.container\" :style=\"style\">\n\t\t<div :class=\"$style.title\">{{ title }}</div>\n\t\t<ul :class=\"$style.options\">\n\t\t\t<li\n\t\t\t\tv-for=\"option in options\"\n\t\t\t\t:key=\"option.key\"\n\t\t\t\t:class=\"{ [$style.option]: true, [$style.disabled]: option.disabled }\"\n\t\t\t\t@click=\"onOptionSelected(option.key)\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.icon\">\n\t\t\t\t\t{{ option.icon }}\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.label\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tposition: fixed;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 190px;\n\tfont-size: var(--font-size-2xs);\n\tbackground: var(--color-background-xlight);\n\tfilter: drop-shadow(0px 6px 16px #441c170f);\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-light);\n\tborder-radius: var(--border-radius-base);\n\n\t// Arrow border is created as the outer triange\n\t&:before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -11px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-foreground-light);\n\t\tposition: absolute;\n\t}\n\n\t// Arrow background is created as the inner triangle\n\t&:after {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -10px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-background-xlight);\n\t\tposition: absolute;\n\t}\n}\n\n.title {\n\tpadding: var(--spacing-xs);\n\tcolor: var(--color-text-base);\n\tfont-weight: var(--font-weight-bold);\n}\n\n.options {\n\tlist-style: none;\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-bottom: var(--spacing-2xs);\n}\n\n.option {\n\tdisplay: flex;\n\tpadding: var(--spacing-3xs) var(--spacing-xs);\n\tgap: var(--spacing-xs);\n\tcursor: pointer;\n\tcolor: var(--color-text-dark);\n\n\t&:hover {\n\t\tbackground: var(--color-background-base);\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n\n\t&.disabled {\n\t\tpointer-events: none;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n</style>\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_CATEGORY_AGENTS,\n\tAI_CATEGORY_CHAINS,\n\tAI_CATEGORY_DOCUMENT_LOADERS,\n\tAI_CATEGORY_LANGUAGE_MODELS,\n\tAI_CATEGORY_MEMORY,\n\tAI_CATEGORY_OUTPUTPARSER,\n\tAI_CATEGORY_RETRIEVERS,\n\tAI_CATEGORY_TEXT_SPLITTERS,\n\tAI_CATEGORY_TOOLS,\n\tAI_CATEGORY_VECTOR_STORES,\n\tAI_SUBCATEGORY,\n\tAI_CATEGORY_EMBEDDING,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_UNCATEGORIZED_CATEGORY,\n\tCONVERT_TO_FILE_NODE_TYPE,\n\tEXTRACT_FROM_FILE_NODE_TYPE,\n\tSET_NODE_TYPE,\n\tCODE_NODE_TYPE,\n\tDATETIME_NODE_TYPE,\n\tFILTER_NODE_TYPE,\n\tREMOVE_DUPLICATES_NODE_TYPE,\n\tSPLIT_OUT_NODE_TYPE,\n\tLIMIT_NODE_TYPE,\n\tSUMMARIZE_NODE_TYPE,\n\tAGGREGATE_NODE_TYPE,\n\tMERGE_NODE_TYPE,\n\tHTML_NODE_TYPE,\n\tMARKDOWN_NODE_TYPE,\n\tXML_NODE_TYPE,\n\tCRYPTO_NODE_TYPE,\n\tIF_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tHTTP_REQUEST_NODE_TYPE,\n\tHELPERS_SUBCATEGORY,\n\tRSS_READ_NODE_TYPE,\n\tEMAIL_SEND_NODE_TYPE,\n\tEDIT_IMAGE_NODE_TYPE,\n\tCOMPRESSION_NODE_TYPE,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport { useTemplatesStore } from '@/stores/templates.store';\n\nexport interface NodeViewItemSection {\n\tkey: string;\n\ttitle: string;\n\titems: string[];\n}\n\nexport interface NodeViewItem {\n\tkey: string;\n\ttype: string;\n\tproperties: {\n\t\tname?: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\ticonProps?: {\n\t\t\tcolor?: string;\n\t\t};\n\t\tconnectionType?: NodeConnectionType;\n\t\tpanelClass?: string;\n\t\tgroup?: string[];\n\t\tsections?: NodeViewItemSection[];\n\t\tdescription?: string;\n\t\ttag?: string;\n\t\tforceIncludeNodes?: string[];\n\t};\n\tcategory?: string | string[];\n}\n\ninterface NodeView {\n\tvalue: string;\n\ttitle: string;\n\tinfo?: string;\n\tsubtitle?: string;\n\titems: NodeViewItem[];\n}\n\nfunction getAiNodesBySubcategory(nodes: INodeTypeDescription[], subcategory: string) {\n\treturn nodes\n\t\t.filter(\n\t\t\t(node) => !node.hidden && node.codex?.subcategories?.[AI_SUBCATEGORY]?.includes(subcategory),\n\t\t)\n\t\t.map((node) => ({\n\t\t\tkey: node.name,\n\t\t\ttype: 'node',\n\t\t\tproperties: {\n\t\t\t\tgroup: [],\n\t\t\t\tname: node.name,\n\t\t\t\tdisplayName: node.displayName,\n\t\t\t\ttitle: node.displayName,\n\t\t\t\tdescription: node.description,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\ticon: node.icon!,\n\t\t\t\ticonData: node.name.toLowerCase().includes('openai')\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\t\ticon: 'openai',\n\t\t\t\t\t\t\tfileBuffer: '/static/open-ai.svg',\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t}))\n\t\t.sort((a, b) => a.properties.displayName.localeCompare(b.properties.displayName));\n}\n\nexport function AIView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst templatesStore = useTemplatesStore();\n\n\tconst chainNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_CHAINS);\n\tconst agentNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_AGENTS);\n\n\treturn {\n\t\tvalue: AI_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\tinfo: i18n.baseText('nodeCreator.aiPanel.infoBox', {\n\t\t\tinterpolate: { link: templatesStore.getWebsiteCategoryURL('ai') },\n\t\t}),\n\t\titems: [\n\t\t\t...chainNodes,\n\t\t\t...agentNodes,\n\t\t\t{\n\t\t\t\tkey: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.aiOtherNodesDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\nexport function AINodesView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\n\tfunction getAISubcategoryProperties(nodeConnectionType: NodeConnectionType) {\n\t\treturn {\n\t\t\tconnectionType: nodeConnectionType,\n\t\t\ticonProps: {\n\t\t\t\tcolor: `var(--node-type-${nodeConnectionType}-color)`,\n\t\t\t},\n\t\t\tpanelClass: `nodes-list-panel-${nodeConnectionType}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalue: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\t\ticon: 'file-import',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiDocument),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\t\ticon: 'language',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiLanguageModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_MEMORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_MEMORY,\n\t\t\t\t\ticon: 'brain',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiMemory),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\t\ticon: 'list',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiOutputParser),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_RETRIEVERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_RETRIEVERS,\n\t\t\t\t\ticon: 'search',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiRetriever),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\t\ticon: 'grip-lines-vertical',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTextSplitter),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TOOLS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TOOLS,\n\t\t\t\t\ticon: 'tools',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTool),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_EMBEDDING,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_EMBEDDING,\n\t\t\t\t\ticon: 'vector-square',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiEmbedding),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiVectorStore),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\t\ticon: 'code',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function TriggerView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'form',\n\t\t\t\t\t\tfileBuffer: '/static/form-grey.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\treturn view;\n}\n\nexport function RegularView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t\tforceIncludeNodes: [RSS_READ_NODE_TYPE, EMAIL_SEND_NODE_TYPE],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'addOrRemove',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.addOrRemove'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tFILTER_NODE_TYPE,\n\t\t\t\t\t\t\t\tREMOVE_DUPLICATES_NODE_TYPE,\n\t\t\t\t\t\t\t\tSPLIT_OUT_NODE_TYPE,\n\t\t\t\t\t\t\t\tLIMIT_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'combine',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.combine'),\n\t\t\t\t\t\t\titems: [SUMMARIZE_NODE_TYPE, AGGREGATE_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'convert',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.convert'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tHTML_NODE_TYPE,\n\t\t\t\t\t\t\t\tMARKDOWN_NODE_TYPE,\n\t\t\t\t\t\t\t\tXML_NODE_TYPE,\n\t\t\t\t\t\t\t\tCRYPTO_NODE_TYPE,\n\t\t\t\t\t\t\t\tEXTRACT_FROM_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCONVERT_TO_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCOMPRESSION_NODE_TYPE,\n\t\t\t\t\t\t\t\tEDIT_IMAGE_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [FILTER_NODE_TYPE, IF_NODE_TYPE, SPLIT_IN_BATCHES_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [CONVERT_TO_FILE_NODE_TYPE, EXTRACT_FROM_FILE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE, CODE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\tconst hasAINodes = (nodes ?? []).some((node) => node.codex?.categories?.includes(AI_SUBCATEGORY));\n\tif (hasAINodes)\n\t\tview.items.push({\n\t\t\tkey: AI_NODE_CREATOR_VIEW,\n\t\t\ttype: 'view',\n\t\t\tproperties: {\n\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.langchainAiNodes'),\n\t\t\t\ticon: 'robot',\n\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.nodesForAi'),\n\t\t\t\ttag: i18n.baseText('nodeCreator.aiPanel.newTag'),\n\t\t\t},\n\t\t});\n\n\tview.items.push({\n\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttype: 'view',\n\t\tproperties: {\n\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\ticon: 'bolt',\n\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t},\n\t});\n\n\treturn view;\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn await new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport {\n\tAI_CODE_NODE_TYPE,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tDEFAULT_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { computed, nextTick, ref } from 'vue';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport {\n\tflattenCreateElements,\n\tgroupItemsInSections,\n\tsearchNodes,\n\tsortNodeCreateElements,\n\tsubcategorizeItems,\n\ttransformNodeType,\n} from '../utils';\n\nimport type { NodeViewItem, NodeViewItemSection } from '@/components/Node/NodeCreator/viewsData';\nimport { AINodesView } from '@/components/Node/NodeCreator/viewsData';\nimport { useI18n } from '@/composables/useI18n';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { INodeInputFilter, NodeConnectionType } from 'n8n-workflow';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tinfo?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\tpreventBack?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n\tpanelClass?: string;\n\tsections?: NodeViewItemSection[];\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0\n\t\t\t\t\t? searchBaseItems.value\n\t\t\t\t\t: flattenCreateElements(stack.baselineItems ?? []);\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\tconst flatBaselineItems = flattenCreateElements(stack.baselineItems ?? []);\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: flatBaselineItems.length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tconst itemsBySubcategory = computed(() => subcategorizeItems(nodeCreatorStore.mergedNodes));\n\n\tasync function gotoCompatibleConnectionView(\n\t\tconnectionType: NodeConnectionType,\n\t\tisOutput?: boolean,\n\t\tfilter?: INodeInputFilter,\n\t) {\n\t\tconst i18n = useI18n();\n\n\t\tlet nodesByConnectionType: { [key: string]: string[] };\n\t\tlet relatedAIView: NodeViewItem | { properties: { title: string; icon: string } } | undefined;\n\n\t\tif (isOutput === true) {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByInputConnectionTypeNames;\n\t\t\trelatedAIView = {\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByOutputConnectionTypeNames;\n\n\t\t\trelatedAIView = AINodesView([]).items.find(\n\t\t\t\t(item) => item.properties.connectionType === connectionType,\n\t\t\t);\n\t\t}\n\n\t\tawait nextTick();\n\t\tpushViewStack({\n\t\t\ttitle: relatedAIView?.properties.title,\n\t\t\trootView: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\tmode: 'nodes',\n\t\t\titems: nodeCreatorStore.allNodeCreatorNodes,\n\t\t\tnodeIcon: {\n\t\t\t\ticonType: 'icon',\n\t\t\t\ticon: relatedAIView?.properties.icon,\n\t\t\t\tcolor: relatedAIView?.properties.iconProps?.color,\n\t\t\t},\n\t\t\tpanelClass: relatedAIView?.properties.panelClass,\n\t\t\tbaseFilter: (i: INodeCreateElement) => {\n\t\t\t\t// AI Code node could have any connection type so we don't want to display it\n\t\t\t\t// in the compatible connection view as it would be displayed in all of them\n\t\t\t\tif (i.key === AI_CODE_NODE_TYPE) return false;\n\t\t\t\tconst displayNode = nodesByConnectionType[connectionType].includes(i.key);\n\n\t\t\t\t// TODO: Filtering works currently fine for displaying compatible node when dropping\n\t\t\t\t// input connections. However, it does not work for output connections.\n\t\t\t\t// For that reason does it currently display nodes that are maybe not compatible\n\t\t\t\t// but then errors once it got selected by the user.\n\t\t\t\tif (displayNode && filter?.nodes?.length) {\n\t\t\t\t\treturn filter.nodes.includes(i.key);\n\t\t\t\t}\n\n\t\t\t\treturn displayNode;\n\t\t\t},\n\t\t\titemsMapper(item) {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\tsubcategory: connectionType,\n\t\t\t\t};\n\t\t\t},\n\t\t\tpreventBack: true,\n\t\t});\n\t}\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tlet stackItems = stack?.items ?? [];\n\n\t\tif (!stack?.items) {\n\t\t\tconst subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY;\n\t\t\tconst itemsInSubcategory = itemsBySubcategory.value[subcategory];\n\t\t\tconst sections = stack.sections;\n\n\t\t\tif (sections) {\n\t\t\t\tstackItems = groupItemsInSections(itemsInSubcategory, sections);\n\t\t\t} else {\n\t\t\t\tstackItems = itemsInSubcategory;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tstackItems = sortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tgotoCompatibleConnectionView,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","import type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nimport { getMousePosition } from '@/utils/nodeViewUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { MOUSE_EVENT_BUTTON, MOUSE_EVENT_BUTTONS } from '@/constants';\n\n/**\n * Composable for handling canvas panning interactions - it facilitates the movement of the\n * canvas element in response to mouse events\n */\nexport function useCanvasPanning(\n\telementRef: Ref<null | HTMLElement>,\n\toptions: {\n\t\t// @TODO To be refactored (unref) when migrating NodeView to composition API\n\t\tonMouseMoveEnd?: Ref<null | ((e: MouseEvent) => void)>;\n\t} = {},\n) {\n\tconst uiStore = useUIStore();\n\tconst moveLastPosition = ref([0, 0]);\n\tconst deviceSupport = useDeviceSupport();\n\n\t/**\n\t * Updates the canvas offset position based on the mouse movement\n\t */\n\tfunction panCanvas(e: MouseEvent) {\n\t\tconst offsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tconst nodeViewOffsetPositionX = offsetPosition[0] + (x - moveLastPosition.value[0]);\n\t\tconst nodeViewOffsetPositionY = offsetPosition[1] + (y - moveLastPosition.value[1]);\n\t\tuiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\n\t\t// Update the last position\n\t\tmoveLastPosition.value = [x, y];\n\n\t\treturn [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\t}\n\n\t/**\n\t * Initiates the panning process when specific conditions are met (middle mouse or ctrl key pressed)\n\t */\n\tfunction onMouseDown(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (!(deviceSupport.isCtrlKeyPressed(e) || moveButtonPressed)) {\n\t\t\t// We only care about it when the ctrl key is pressed at the same time.\n\t\t\t// So we exit when it is not pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent moving canvas on anything but middle button\n\t\tif (e.button !== MOUSE_EVENT_BUTTON.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tmoveLastPosition.value = [x, y];\n\n\t\tconst element = unref(elementRef);\n\t\telement?.addEventListener('mousemove', onMouseMove);\n\t}\n\n\t/**\n\t * Ends the panning process and removes the mousemove event listener\n\t */\n\tfunction onMouseUp(_: MouseEvent) {\n\t\tif (!uiStore.nodeViewMoveInProgress) {\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\n\t\tconst element = unref(elementRef);\n\t\telement?.removeEventListener('mousemove', onMouseMove);\n\n\t\tuiStore.nodeViewMoveInProgress = false;\n\n\t\t// Nothing else to do. Simply leave the node view at the current offset\n\t}\n\n\t/**\n\t * Handles the actual movement of the canvas during a mouse drag,\n\t * updating the position based on the current mouse position\n\t */\n\tfunction onMouseMove(e: MouseEvent) {\n\t\tconst element = unref(elementRef);\n\t\tif (e.target && !(element === e.target || element?.contains(e.target as Node))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Signal that moving canvas is active if middle button is pressed and mouse is moved\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.NONE) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tconst onMouseMoveEnd = unref(options.onMouseMoveEnd);\n\t\t\tonMouseMoveEnd?.(e);\n\t\t\treturn;\n\t\t}\n\n\t\tpanCanvas(e);\n\t}\n\n\treturn {\n\t\tmoveLastPosition,\n\t\tonMouseDown,\n\t\tonMouseUp,\n\t\tonMouseMove,\n\t\tpanCanvas,\n\t};\n}\n","<template>\n\t<div ref=\"nodeViewRootRef\" :class=\"$style['content']\">\n\t\t<div\n\t\t\tid=\"node-view-root\"\n\t\t\tclass=\"node-view-root do-not-select\"\n\t\t\tdata-test-id=\"node-view-root\"\n\t\t\t@dragover=\"onDragOver\"\n\t\t\t@drop=\"onDrop\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:tap=\"touchTap\"\n\t\t\t\tclass=\"node-view-wrapper\"\n\t\t\t\t:class=\"workflowClasses\"\n\t\t\t\tdata-test-id=\"node-view-wrapper\"\n\t\t\t\t@touchstart=\"mouseDown\"\n\t\t\t\t@touchend=\"mouseUp\"\n\t\t\t\t@touchmove=\"canvasPanning.onMouseMove\"\n\t\t\t\t@mousedown=\"mouseDown\"\n\t\t\t\t@mouseup=\"mouseUp\"\n\t\t\t\t@contextmenu=\"contextMenu.open\"\n\t\t\t\t@wheel=\"canvasStore.wheelScroll\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view-background\"\n\t\t\t\t\tclass=\"node-view-background\"\n\t\t\t\t\t:style=\"backgroundStyle\"\n\t\t\t\t\tdata-test-id=\"node-view-background\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view\"\n\t\t\t\t\tref=\"nodeViewRef\"\n\t\t\t\t\tclass=\"node-view\"\n\t\t\t\t\t:style=\"workflowStyle\"\n\t\t\t\t\tdata-test-id=\"node-view\"\n\t\t\t\t>\n\t\t\t\t\t<CanvasAddButton\n\t\t\t\t\t\tv-show=\"showCanvasAddButton\"\n\t\t\t\t\t\tref=\"canvasAddButton\"\n\t\t\t\t\t\t:style=\"canvasAddButtonStyle\"\n\t\t\t\t\t\t:show-tooltip=\"!containsTrigger && showTriggerMissingTooltip\"\n\t\t\t\t\t\t:position=\"canvasStore.canvasAddButtonPosition\"\n\t\t\t\t\t\tdata-test-id=\"canvas-add-button\"\n\t\t\t\t\t\t@click=\"onCanvasAddButtonCLick\"\n\t\t\t\t\t\t@hook:mounted=\"canvasStore.setRecenteredCanvasAddButtonPosition\"\n\t\t\t\t\t/>\n\t\t\t\t\t<Node\n\t\t\t\t\t\tv-for=\"nodeData in nodesToRender\"\n\t\t\t\t\t\t:key=\"`${nodeData.id}_node`\"\n\t\t\t\t\t\t:name=\"nodeData.name\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === nodeData.name\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:disable-pointer-events=\"!canOpenNDV\"\n\t\t\t\t\t\t:hide-node-issues=\"hideNodeIssues\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@run-workflow=\"onRunNode\"\n\t\t\t\t\t\t@moved=\"onNodeMoved\"\n\t\t\t\t\t\t@run=\"onNodeRun\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t@toggle-disable-node=\"(node) => toggleActivationNodes([node])\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #custom-tooltip>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-text=\"$locale.baseText('nodeView.placeholderNode.addTriggerNodeBeforeExecuting')\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Node>\n\t\t\t\t\t<Sticky\n\t\t\t\t\t\tv-for=\"stickyData in stickiesToRender\"\n\t\t\t\t\t\t:key=\"`${stickyData.id}_sticky`\"\n\t\t\t\t\t\t:name=\"stickyData.name\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === stickyData.name\"\n\t\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t\t:grid-size=\"GRID_SIZE\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeDetailsView\n\t\t\t\t:read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t@redraw-node=\"redrawNode\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t@stop-execution=\"stopExecution\"\n\t\t\t\t@save-keyboard-shortcut=\"onSaveKeyboardShortcut\"\n\t\t\t/>\n\t\t\t<Suspense>\n\t\t\t\t<div :class=\"$style.setupCredentialsButtonWrapper\">\n\t\t\t\t\t<SetupWorkflowCredentialsButton />\n\t\t\t\t</div>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NodeCreation\n\t\t\t\t\tv-if=\"!isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\t:create-node-active=\"createNodeActive\"\n\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t@toggle-node-creator=\"onToggleNodeCreator\"\n\t\t\t\t\t@add-nodes=\"onAddNodes\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<CanvasControls />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<ContextMenu @action=\"onContextMenuAction\" />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NextStepPopup v-show=\"isNextStepPopupVisible\" @option-selected=\"onNextStepSelected\" />\n\t\t\t</Suspense>\n\t\t\t<div v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"workflow-execute-wrapper\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isManualChatOnly\"\n\t\t\t\t\t@mouseenter=\"showTriggerMissingToltip(true)\"\n\t\t\t\t\t@mouseleave=\"showTriggerMissingToltip(false)\"\n\t\t\t\t\t@click=\"onRunContainerClick\"\n\t\t\t\t>\n\t\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t:shortcut=\"{ metaKey: true, keys: ['↵'] }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t:loading=\"workflowRunning\"\n\t\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\ticon=\"flask\"\n\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t:disabled=\"isExecutionDisabled\"\n\t\t\t\t\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t\t\t\t\t@click.stop=\"onRunWorkflow\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t</span>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"containsChatNodes\"\n\t\t\t\t\tlabel=\"Chat\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ticon=\"comment\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\tdata-test-id=\"workflow-chat-button\"\n\t\t\t\t\t@click.stop=\"onOpenChat\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && !executionWaitingForWebhook\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:title=\"\n\t\t\t\t\t\tstopExecutionInProgress\n\t\t\t\t\t\t\t? $locale.baseText('nodeView.stoppingCurrentExecution')\n\t\t\t\t\t\t\t: $locale.baseText('nodeView.stopCurrentExecution')\n\t\t\t\t\t\"\n\t\t\t\t\t:loading=\"stopExecutionInProgress\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t\t@click.stop=\"stopExecution\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && executionWaitingForWebhook === true\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.stopWaitingForWebhookCall')\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tdata-test-id=\"stop-execution-waiting-for-webhook-button\"\n\t\t\t\t\t@click.stop=\"stopWaitingForWebhook\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t!isReadOnlyRoute &&\n\t\t\t\t\t\t!readOnlyEnv &&\n\t\t\t\t\t\tworkflowExecution &&\n\t\t\t\t\t\t!workflowRunning &&\n\t\t\t\t\t\t!allTriggersDisabled\n\t\t\t\t\t\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.deletesTheCurrentExecutionData')\"\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tdata-test-id=\"clear-execution-data-button\"\n\t\t\t\t\t@click.stop=\"clearExecutionData\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, nextTick, ref } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\n\nimport type {\n\tEndpoint,\n\tConnection,\n\tConnectionEstablishedParams,\n\tBeforeDropParams,\n\tConnectionDetachedParams,\n\tConnectionMovedParams,\n\tComponentParameters,\n} from '@jsplumb/core';\nimport {\n\tEVENT_CONNECTION,\n\tEVENT_CONNECTION_DETACHED,\n\tEVENT_CONNECTION_MOVED,\n\tINTERCEPT_BEFORE_DROP,\n} from '@jsplumb/core';\nimport type { MessageBoxInputData, ElNotification } from 'element-plus';\n\nimport {\n\tFIRST_ONBOARDING_PROMPT_TIMEOUT,\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CLOSE,\n\tMODAL_CONFIRM,\n\tONBOARDING_CALL_SIGNUP_MODAL_KEY,\n\tONBOARDING_PROMPT_TIMEBOX,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tQUICKSTART_NOTE_NAME,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEnterpriseEditionFeature,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tCHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tWORKFLOW_LM_CHAT_MODAL_KEY,\n\tAI_NODE_CREATOR_VIEW,\n\tDRAG_EVENT_DATA_KEY,\n\tUPDATE_WEBHOOK_ID_NODE_TYPES,\n\tTIME,\n\tAI_ASSISTANT_LOCAL_STORAGE_KEY,\n} from '@/constants';\n\nimport useGlobalLinkActions from '@/composables/useGlobalLinkActions';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport useCanvasMouseSelect from '@/composables/useCanvasMouseSelect';\nimport { useExecutionDebugging } from '@/composables/useExecutionDebugging';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useDataSchema } from '@/composables/useDataSchema';\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { useUniqueNodeName } from '@/composables/useUniqueNodeName';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\n\nimport NodeDetailsView from '@/components/NodeDetailsView.vue';\nimport ContextMenu from '@/components/ContextMenu/ContextMenu.vue';\nimport Node from '@/components/Node.vue';\nimport Sticky from '@/components/Sticky.vue';\nimport CanvasAddButton from './CanvasAddButton.vue';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport NextStepPopup from '@/components/AIAssistantChat/NextStepPopup.vue';\nimport { v4 as uuid } from 'uuid';\nimport type {\n\tIConnection,\n\tIConnections,\n\tIDataObject,\n\tExecutionSummary,\n\tINode,\n\tINodeConnections,\n\tINodeCredentialsDetails,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tIPinData,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tNewConnectionInfo,\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\n\tAIAssistantConnectionInfo,\n} from '@/Interface';\n\nimport { type Route, type RawLocation, useRouter } from 'vue-router';\nimport { dataPinningEventBus, nodeViewEventBus } from '@/event-bus';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSegment } from '@/stores/segment.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsEEStore } from '@/stores/workflows.ee.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { getAccountAge } from '@/utils/userUtils';\nimport { getConnectionInfo, getNodeViewTab } from '@/utils/canvasUtils';\nimport {\n\tAddConnectionCommand,\n\tAddNodeCommand,\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n\thistoryBus,\n} from '@/models/history';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport {\n\tEVENT_ENDPOINT_MOUSEOVER,\n\tEVENT_ENDPOINT_MOUSEOUT,\n\tEVENT_DRAG_MOVE,\n\tEVENT_CONNECTION_DRAG,\n\tEVENT_CONNECTION_ABORT,\n\tEVENT_CONNECTION_MOUSEOUT,\n\tEVENT_CONNECTION_MOUSEOVER,\n\tready,\n} from '@jsplumb/browser-ui';\nimport type { N8nPlusEndpoint } from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport {\n\tN8nPlusEndpointType,\n\tEVENT_PLUS_ENDPOINT_CLICK,\n} from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport type { N8nAddInputEndpoint } from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport {\n\tEVENT_ADD_INPUT_ENDPOINT_CLICK,\n\tN8nAddInputEndpointType,\n} from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\nimport { getConnectorPaintStyleData, OVERLAY_ENDPOINT_ARROW_ID } from '@/utils/nodeViewUtils';\nimport { useViewStacks } from '@/components/Node/NodeCreator/composables/useViewStacks';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useCanvasPanning } from '@/composables/useCanvasPanning';\nimport { tryToParseNumber } from '@/utils/typesUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useAIStore } from '@/stores/ai.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { isJSPlumbEndpointElement } from '@/utils/typeGuards';\n\ninterface AddNodeOptions {\n\tposition?: XYPosition;\n\tdragAndDrop?: boolean;\n\tname?: string;\n}\n\nconst NodeCreation = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreation.vue'),\n);\nconst CanvasControls = defineAsyncComponent(\n\tasync () => await import('@/components/CanvasControls.vue'),\n);\nconst SetupWorkflowCredentialsButton = defineAsyncComponent(\n\tasync () =>\n\t\tawait import('@/components/SetupWorkflowCredentialsButton/SetupWorkflowCredentialsButton.vue'),\n);\n\nexport default defineComponent({\n\tname: 'NodeView',\n\tcomponents: {\n\t\tNodeDetailsView,\n\t\tNode,\n\t\tSticky,\n\t\tCanvasAddButton,\n\t\tKeyboardShortcutTooltip,\n\t\tNodeCreation,\n\t\tCanvasControls,\n\t\tContextMenu,\n\t\tSetupWorkflowCredentialsButton,\n\t\tNextStepPopup,\n\t},\n\tasync beforeRouteLeave(to, from, next) {\n\t\tif (\n\t\t\tgetNodeViewTab(to) === MAIN_HEADER_TABS.EXECUTIONS ||\n\t\t\tfrom.name === VIEWS.TEMPLATE_IMPORT ||\n\t\t\t(getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW && from.name === VIEWS.EXECUTION_DEBUG)\n\t\t) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t// Make sure workflow id is empty when leaving the editor\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\tif (from.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\t// Replace the current route with the new workflow route\n\t\t\t\t\t// before navigating to the new route when saving new workflow.\n\t\t\t\t\tawait this.$router.replace(\n\t\t\t\t\t\t{ name: VIEWS.WORKFLOW, params: { name: this.currentWorkflow } },\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// We can't use next() here since vue-router\n\t\t\t\t\t\t\t// would prevent the navigation with an error\n\t\t\t\t\t\t\tvoid this.$router.push(to as RawLocation);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tthis.resetWorkspace();\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\tnext();\n\t\t}\n\t},\n\tsetup() {\n\t\tconst nodeViewRootRef = ref(null);\n\t\tconst nodeViewRef = ref(null);\n\t\tconst onMouseMoveEnd = ref(null);\n\t\tconst router = useRouter();\n\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst locale = useI18n();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst dataSchema = useDataSchema();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst clipboard = useClipboard();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\t\tconst canvasPanning = useCanvasPanning(nodeViewRootRef, { onMouseMoveEnd });\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\tlocale,\n\t\t\tcontextMenu,\n\t\t\tdataSchema,\n\t\t\tnodeHelpers,\n\t\t\texternalHooks,\n\t\t\tclipboard,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcanvasPanning,\n\t\t\tnodeViewRootRef,\n\t\t\tnodeViewRef,\n\t\t\tonMouseMoveEnd,\n\t\t\tworkflowHelpers,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\tcallDebounced,\n\t\t\t...useCanvasMouseSelect(),\n\t\t\t...useGlobalLinkActions(),\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t...useUniqueNodeName(),\n\t\t\t...useExecutionDebugging(),\n\t\t};\n\t},\n\twatch: {\n\t\t// Listen to route changes and load the workflow accordingly\n\t\tasync $route(to: Route, from: Route) {\n\t\t\tthis.readOnlyEnvRouteCheck();\n\n\t\t\tconst currentTab = getNodeViewTab(to);\n\t\t\tconst nodeViewNotInitialized = !this.uiStore.nodeViewInitialized;\n\t\t\tlet workflowChanged =\n\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t// Both 'new' and __EMPTY__ are new workflow names, so ignore them when detecting if wf changed\n\t\t\t\t!(from.params.name === 'new' && this.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID) &&\n\t\t\t\t!(from.name === VIEWS.NEW_WORKFLOW) &&\n\t\t\t\t// Also ignore if workflow id changes when saving new workflow\n\t\t\t\tto.params.action !== 'workflowSave';\n\t\t\tconst isOpeningTemplate = to.name === VIEWS.TEMPLATE_IMPORT;\n\n\t\t\t// When entering this tab:\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW || isOpeningTemplate) {\n\t\t\t\tif (workflowChanged || nodeViewNotInitialized || isOpeningTemplate) {\n\t\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\t\tif (nodeViewNotInitialized) {\n\t\t\t\t\t\tconst previousDirtyState = this.uiStore.stateIsDirty;\n\t\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\t\tthis.uiStore.stateIsDirty = previousDirtyState;\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.all([this.loadCredentials(), this.initView()]);\n\t\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\t\tif (this.blankRedirect) {\n\t\t\t\t\t\tthis.blankRedirect = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.checkAndInitDebugMode();\n\t\t\t}\n\t\t\t// Also, when landing on executions tab, check if workflow data is changed\n\t\t\tif (currentTab === MAIN_HEADER_TABS.EXECUTIONS) {\n\t\t\t\tworkflowChanged =\n\t\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t\t!(to.params.name === 'new' && from.params.name === undefined);\n\t\t\t\tif (workflowChanged) {\n\t\t\t\t\t// This will trigger node view to update next time workflow tab is opened\n\t\t\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tactiveNode() {\n\t\t\t// When a node gets set as active deactivate the create-menu\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tcontainsTrigger(containsTrigger) {\n\t\t\t// Re-center CanvasAddButton if there's no triggers\n\t\t\tif (containsTrigger === false)\n\t\t\t\tthis.canvasStore.setRecenteredCanvasAddButtonPosition(this.getNodeViewOffsetPosition);\n\t\t},\n\t\tnodeViewScale(newScale) {\n\t\t\tconst elementRef = this.nodeViewRef as HTMLDivElement | undefined;\n\t\t\tif (elementRef) {\n\t\t\t\telementRef.style.transform = `scale(${newScale})`;\n\t\t\t}\n\t\t},\n\t},\n\terrorCaptured: (err, vm, info) => {\n\t\tconsole.error('errorCaptured');\n\t\tconsole.error(err);\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCanvasStore,\n\t\t\tuseTagsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseTemplatesStore,\n\t\t\tuseUIStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseEnvironmentsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t\tuseHistoryStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseCollaborationStore,\n\t\t\tusePushConnectionStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseExecutionsStore,\n\t\t\tuseAIStore,\n\t\t),\n\t\tnativelyNumberSuffixedDefaults(): string[] {\n\t\t\treturn this.nodeTypesStore.nativelyNumberSuffixedDefaults;\n\t\t},\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\texecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tisDemo(): boolean {\n\t\t\treturn this.$route.name === VIEWS.DEMO;\n\t\t},\n\t\tshowCanvasAddButton(): boolean {\n\t\t\treturn !this.isLoading && !this.containsTrigger && !this.isDemo && !this.readOnlyEnv;\n\t\t},\n\t\tlastSelectedNode(): INodeUi | null {\n\t\t\treturn this.uiStore.getLastSelectedNode;\n\t\t},\n\t\tnodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes;\n\t\t},\n\t\tnodesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tstickiesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type === STICKY_NODE_TYPE);\n\t\t},\n\t\trunButtonText(): string {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t\t\t}\n\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.waitingForTriggerEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executingWorkflow');\n\t\t},\n\t\tworkflowStyle(): object {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\t\t\treturn {\n\t\t\t\tleft: offsetPosition[0] + 'px',\n\t\t\t\ttop: offsetPosition[1] + 'px',\n\t\t\t};\n\t\t},\n\t\tcanvasAddButtonStyle(): object {\n\t\t\treturn {\n\t\t\t\t'pointer-events': this.createNodeActive ? 'none' : 'all',\n\t\t\t};\n\t\t},\n\t\tbackgroundStyle(): object {\n\t\t\treturn NodeViewUtils.getBackgroundStyles(\n\t\t\t\tthis.nodeViewScale,\n\t\t\t\tthis.uiStore.nodeViewOffsetPosition,\n\t\t\t\tthis.isExecutionPreview,\n\t\t\t);\n\t\t},\n\t\tworkflowClasses() {\n\t\t\tconst returnClasses = [];\n\t\t\tif (this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\tif (this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t\treturnClasses.push('move-in-process');\n\t\t\t\t} else {\n\t\t\t\t\treturnClasses.push('move-active');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.selectActive || this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\t// Makes sure that nothing gets selected while select or move is active\n\t\t\t\treturnClasses.push('do-not-select');\n\t\t\t}\n\n\t\t\tif (this.connectionDragScope.type) {\n\t\t\t\treturnClasses.push('connection-drag-scope-active');\n\t\t\t\treturnClasses.push(`connection-drag-scope-active-type-${this.connectionDragScope.type}`);\n\t\t\t\treturnClasses.push(\n\t\t\t\t\t`connection-drag-scope-active-connection-${this.connectionDragScope.connection}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn returnClasses;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tallTriggersDisabled(): boolean {\n\t\t\tconst disabledTriggerNodes = this.triggerNodes.filter((node) => node.disabled);\n\t\t\treturn disabledTriggerNodes.length === this.triggerNodes.length;\n\t\t},\n\t\ttriggerNodes(): INodeUi[] {\n\t\t\treturn this.nodes.filter(\n\t\t\t\t(node) => node.type === START_NODE_TYPE || this.nodeTypesStore.isTriggerNode(node.type),\n\t\t\t);\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\treturn this.triggerNodes.length > 0;\n\t\t},\n\t\tcontainsChatNodes(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.executionWaitingForWebhook &&\n\t\t\t\t!!this.nodes.find(\n\t\t\t\t\t(node) =>\n\t\t\t\t\t\t[MANUAL_CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.disabled !== true,\n\t\t\t\t)\n\t\t\t);\n\t\t},\n\t\tisManualChatOnly(): boolean {\n\t\t\treturn this.containsChatNodes && this.triggerNodes.length === 1;\n\t\t},\n\t\tisExecutionDisabled(): boolean {\n\t\t\tif (\n\t\t\t\tthis.containsChatNodes &&\n\t\t\t\tthis.triggerNodes.every((node) => node.disabled || node.type === CHAT_TRIGGER_NODE_TYPE)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !this.containsTrigger || this.allTriggersDisabled;\n\t\t},\n\t\tgetNodeViewOffsetPosition(): XYPosition {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tnodeViewScale(): number {\n\t\t\treturn this.canvasStore.nodeViewScale;\n\t\t},\n\t\tinstance(): BrowserJsPlumbInstance {\n\t\t\treturn this.canvasStore.jsPlumbInstance;\n\t\t},\n\t\tisLoading(): boolean {\n\t\t\treturn this.canvasStore.isLoading;\n\t\t},\n\t\tcurrentWorkflowObject(): Workflow {\n\t\t\treturn this.workflowsStore.getCurrentWorkflow();\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tisNextStepPopupVisible(): boolean {\n\t\t\treturn this.aiStore.nextStepPopupConfig.open;\n\t\t},\n\t\tshouldShowNextStepDialog(): boolean {\n\t\t\tconst userHasSeenAIAssistantExperiment =\n\t\t\t\tuseStorage(AI_ASSISTANT_LOCAL_STORAGE_KEY).value === 'true';\n\t\t\tconst experimentEnabled = this.aiStore.isAssistantExperimentEnabled;\n\t\t\tconst isCloudDeployment = this.settingsStore.isCloudDeployment;\n\t\t\treturn isCloudDeployment && experimentEnabled && !userHasSeenAIAssistantExperiment;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tGRID_SIZE: NodeViewUtils.GRID_SIZE,\n\t\t\tSTICKY_NODE_TYPE,\n\t\t\tcreateNodeActive: false,\n\t\t\tlastClickPosition: [450, 450] as XYPosition,\n\t\t\tctrlKeyPressed: false,\n\t\t\tmoveCanvasKeyPressed: false,\n\t\t\tstopExecutionInProgress: false,\n\t\t\tblankRedirect: false,\n\t\t\tcredentialsUpdated: false,\n\t\t\tpullConnActiveNodeName: null as string | null,\n\t\t\tpullConnActive: false,\n\t\t\tdropPrevented: false,\n\t\t\tconnectionDragScope: {\n\t\t\t\ttype: null,\n\t\t\t\tconnection: null,\n\t\t\t} as { type: string | null; connection: 'source' | 'target' | null },\n\t\t\trenamingActive: false,\n\t\t\tshowStickyButton: false,\n\t\t\tisExecutionPreview: false,\n\t\t\tshowTriggerMissingTooltip: false,\n\t\t\tworkflowData: null as INewWorkflowData | null,\n\t\t\tactiveConnection: null as null | Connection,\n\t\t\tisInsertingNodes: false,\n\t\t\tisProductionExecutionPreview: false,\n\t\t\tenterTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\texitTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\treadOnlyNotification: null as null | typeof ElNotification,\n\t\t\t// jsplumb automatically deletes all loose connections which is in turn recorded\n\t\t\t// in undo history as a user action.\n\t\t\t// This should prevent automatically removed connections from populating undo stack\n\t\t\tsuspendRecordingDetachedConnections: false,\n\t\t\tNODE_CREATOR_OPEN_SOURCES,\n\t\t\teventsAttached: false,\n\t\t\tunloadTimeout: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\tcanOpenNDV: true,\n\t\t\thideNodeIssues: false,\n\t\t};\n\t},\n\tasync mounted() {\n\t\t// To be refactored (unref) when migrating to composition API\n\t\tthis.onMouseMoveEnd = this.mouseUp;\n\n\t\tthis.resetWorkspace();\n\t\tthis.canvasStore.initInstance(this.nodeViewRef as HTMLElement);\n\t\tthis.titleReset();\n\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\t\tthis.canvasStore.startLoading();\n\n\t\tconst loadPromises = (() => {\n\t\t\tif (this.settingsStore.isPreviewMode && this.isDemo) return [];\n\t\t\tconst promises = [\n\t\t\t\tthis.loadActiveWorkflows(),\n\t\t\t\tthis.loadCredentials(),\n\t\t\t\tthis.loadCredentialTypes(),\n\t\t\t];\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables)) {\n\t\t\t\tpromises.push(this.loadVariables());\n\t\t\t}\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.ExternalSecrets)) {\n\t\t\t\tpromises.push(this.loadSecrets());\n\t\t\t}\n\t\t\treturn promises;\n\t\t})();\n\n\t\tif (this.nodeTypesStore.allNodeTypes.length === 0) {\n\t\t\tloadPromises.push(this.loadNodeTypes());\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all(loadPromises);\n\t\t} catch (error) {\n\t\t\tthis.showError(\n\t\t\t\terror,\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.title'),\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tready(async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tthis.bindCanvasEvents();\n\t\t\t\t} catch {} // This will break if mounted after jsplumb has been initiated from executions preview, so continue if it breaks\n\t\t\t\tawait this.initView();\n\t\t\t\tif (window.parent) {\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\tJSON.stringify({ command: 'n8nReady', version: this.rootStore.versionCli }),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.title'),\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.message') + ':',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.usersStore.showPersonalizationSurvey();\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t}, 0);\n\t\t});\n\n\t\t// TODO: This currently breaks since front-end hooks are still not updated to work with pinia store\n\t\tvoid this.externalHooks.run('nodeView.mount').catch((e) => {});\n\n\t\tif (\n\t\t\tthis.currentUser?.personalizationAnswers !== null &&\n\t\t\tthis.settingsStore.onboardingCallPromptEnabled &&\n\t\t\tthis.currentUser &&\n\t\t\tgetAccountAge(this.currentUser) <= ONBOARDING_PROMPT_TIMEBOX\n\t\t) {\n\t\t\tconst onboardingResponse = await this.uiStore.getNextOnboardingPrompt();\n\t\t\tconst promptTimeout =\n\t\t\t\tonboardingResponse?.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000;\n\n\t\t\tif (onboardingResponse?.title && onboardingResponse?.description) {\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\tmessage: onboardingResponse.description,\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tcustomClass: 'clickable',\n\t\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tthis.$telemetry.track('user clicked onboarding toast', {\n\t\t\t\t\t\t\t\tseq_num: onboardingResponse.toast_sequence_number,\n\t\t\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\t\t\tdescription: onboardingResponse.description,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, promptTimeout);\n\t\t\t}\n\t\t}\n\n\t\tsourceControlEventBus.on('pull', this.onSourceControlPull);\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openNodeDetail',\n\t\t\taction: ({ node }: { node: string }) => {\n\t\t\t\tthis.nodeSelectedByName(node, true);\n\t\t\t},\n\t\t});\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openSelectiveNodeCreator',\n\t\t\taction: this.openSelectiveNodeCreator,\n\t\t});\n\n\t\tthis.readOnlyEnvRouteCheck();\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tactivated() {\n\t\tconst openSideMenu = this.uiStore.addFirstStepOnLoad;\n\t\tif (openSideMenu) {\n\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t}\n\t\tthis.uiStore.addFirstStepOnLoad = false;\n\t\tthis.bindCanvasEvents();\n\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\tdocument.addEventListener('keyup', this.keyUp);\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\t\twindow.addEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.on('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.on('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.on('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.on('openChat', this.onOpenChat);\n\t\thistoryBus.on('nodeMove', this.onMoveNode);\n\t\thistoryBus.on('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.on('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.on('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.on('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.on('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.on('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.on('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.on('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.on('saveWorkflow', this.saveCurrentWorkflowExternal);\n\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tdeactivated() {\n\t\tthis.unbindCanvasEvents();\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\twindow.removeEventListener('beforeunload', this.onBeforeUnload);\n\t\twindow.removeEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.off('openChat', this.onOpenChat);\n\t\thistoryBus.off('nodeMove', this.onMoveNode);\n\t\thistoryBus.off('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.off('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.off('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.off('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.off('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.off('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.off('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.off('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.off('saveWorkflow', this.saveCurrentWorkflowExternal);\n\t},\n\tbeforeMount() {\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushConnect();\n\t\t}\n\t\tthis.collaborationStore.initialize();\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure the event listeners get removed again else we\n\t\t// could add up with them registered multiple times\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\tthis.unregisterCustomAction('showNodeCreator');\n\t\tthis.unregisterCustomAction('openNodeDetail');\n\t\tthis.unregisterCustomAction('openSelectiveNodeCreator');\n\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushDisconnect();\n\t\t}\n\t\tthis.collaborationStore.terminate();\n\n\t\tthis.resetWorkspace();\n\t\tthis.instance.unbind();\n\t\tthis.instance.destroy();\n\t\tthis.uiStore.stateIsDirty = false;\n\t\tthis.workflowsStore.resetChatMessages();\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\tsourceControlEventBus.off('pull', this.onSourceControlPull);\n\t},\n\tmethods: {\n\t\tasync openSelectiveNodeCreator({\n\t\t\tconnectiontype,\n\t\t\tnode,\n\t\t\tcreatorview,\n\t\t}: {\n\t\t\tconnectiontype: ConnectionTypes;\n\t\t\tnode: string;\n\t\t\tcreatorview?: string;\n\t\t}) {\n\t\t\tconst nodeName = node ?? this.ndvStore.activeNodeName;\n\t\t\tconst nodeData = nodeName ? this.workflowsStore.getNodeByName(nodeName) : null;\n\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tawait this.redrawNode(node);\n\t\t\t// Wait for UI to update\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (creatorview) {\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tcreateNodeActive: true,\n\t\t\t\t\t\tnodeCreatorView: creatorview,\n\t\t\t\t\t});\n\t\t\t\t} else if (connectiontype && nodeData) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\tendpointUuid: `${nodeData.id}-input${connectiontype}0`,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NOTICE_ERROR_MESSAGE,\n\t\t\t\t\t\toutputType: connectiontype,\n\t\t\t\t\t\tsourceId: nodeData.id,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\teditAllowedCheck(): boolean {\n\t\t\tif (this.readOnlyNotification?.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\tthis.readOnlyNotification = this.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${this.isReadOnlyRoute ? 'executions' : 'workflows'}.title`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t\t\t),\n\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${\n\t\t\t\t\t\t\t\t\tthis.isReadOnlyRoute ? 'executions' : 'workflows'\n\t\t\t\t\t\t\t\t}.message`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t\t\t),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tshowTriggerMissingToltip(isVisible: boolean) {\n\t\t\tthis.showTriggerMissingTooltip = isVisible;\n\t\t},\n\t\tonRunNode(nodeName: string, source: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst telemetryPayload = {\n\t\t\t\tnode_type: node ? node.type : null,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsource: 'canvas',\n\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onRunNode', telemetryPayload);\n\t\t\tvoid this.runWorkflow({ destinationNode: nodeName, source });\n\t\t},\n\t\tasync onOpenChat() {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked chat open button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onOpenChat', telemetryPayload);\n\t\t\tthis.uiStore.openModal(WORKFLOW_LM_CHAT_MODAL_KEY);\n\t\t},\n\t\tasync onRunWorkflow() {\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t\tthis.$telemetry.track('User clicked execute workflow button', telemetryPayload);\n\t\t\t\tvoid this.externalHooks.run('nodeView.onRunWorkflow', telemetryPayload);\n\t\t\t});\n\n\t\t\tawait this.runWorkflow({});\n\t\t\tthis.refreshEndpointsErrorsState();\n\t\t},\n\t\tresetEndpointsErrors() {\n\t\t\tconst allEndpoints = Object.values(this.instance.getManagedElements()).flatMap(\n\t\t\t\t(el) => el.endpoints,\n\t\t\t);\n\n\t\t\tallEndpoints\n\t\t\t\t.filter((endpoint) => endpoint?.endpoint.type === N8nAddInputEndpointType)\n\t\t\t\t.forEach((endpoint) => {\n\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\tif (n8nAddInputEndpoint && (endpoint?.connections ?? []).length > 0) {\n\t\t\t\t\t\tn8nAddInputEndpoint.resetError();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trefreshEndpointsErrorsState() {\n\t\t\tconst nodeIssues = this.workflowsStore.allNodes.filter((n) => n.issues);\n\t\t\t// Set input color to red if there are issues\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tnodeIssues.forEach((node) => {\n\t\t\t\tconst managedNode = this.instance.getManagedElement(node.id);\n\t\t\t\tconst endpoints = this.instance.getEndpoints(managedNode);\n\n\t\t\t\tObject.keys(node?.issues?.input ?? {}).forEach((connectionType) => {\n\t\t\t\t\tconst inputEndpointsWithIssues = endpoints.filter(\n\t\t\t\t\t\t(e) => e._defaultType.scope === connectionType,\n\t\t\t\t\t);\n\t\t\t\t\tinputEndpointsWithIssues.forEach((endpoint) => {\n\t\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\t\tif (n8nAddInputEndpoint) {\n\t\t\t\t\t\t\tn8nAddInputEndpoint.setError();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tonRunContainerClick() {\n\t\t\tif (this.containsTrigger && !this.allTriggersDisabled) return;\n\n\t\t\tconst message =\n\t\t\t\tthis.containsTrigger && this.allTriggersDisabled\n\t\t\t\t\t? this.$locale.baseText('nodeView.addOrEnableTriggerNode')\n\t\t\t\t\t: this.$locale.baseText('nodeView.addATriggerNodeFirst');\n\n\t\t\tthis.registerCustomAction({\n\t\t\t\tkey: 'showNodeCreator',\n\t\t\t\taction: () =>\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.NO_TRIGGER_EXECUTION_TOOLTIP),\n\t\t\t});\n\n\t\t\tconst notice = this.showMessage({\n\t\t\t\ttype: 'info',\n\t\t\t\ttitle: this.$locale.baseText('nodeView.cantExecuteNoTrigger'),\n\t\t\t\tmessage,\n\t\t\t\tduration: 3000,\n\t\t\t\tonClick: () =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// Close the creator panel if user clicked on the link\n\t\t\t\t\t\tif (this.createNodeActive) notice.close();\n\t\t\t\t\t}, 0),\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.workflowExecutionData = null;\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tasync onSaveKeyboardShortcut(e: KeyboardEvent) {\n\t\t\tlet saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflow },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.activeNode) {\n\t\t\t\t// If NDV is open, save will not work from editable input fields\n\t\t\t\t// so don't show success message if this is true\n\t\t\t\tif (e.target instanceof HTMLInputElement) {\n\t\t\t\t\tsaved = e.target.readOnly;\n\t\t\t\t} else {\n\t\t\t\t\tsaved = true;\n\t\t\t\t}\n\t\t\t\tif (saved) {\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('generic.workflowSaved'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync onCanvasAddButtonCLick(event: PointerEvent) {\n\t\t\tif (event) {\n\t\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\t\tconst newNodeButton = (event.target as HTMLElement).closest('button');\n\t\t\t\t\tif (newNodeButton) {\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = null;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.firstStep'),\n\t\t\t\t\t\t\tnewNodeButton,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonNextStepSelected(action: string) {\n\t\t\tif (action === 'choose') {\n\t\t\t\tconst lastConnectionInfo = this.aiStore.latestConnectionInfo as NewConnectionInfo;\n\t\t\t\tif (lastConnectionInfo === null) {\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNodeAfterSelected(lastConnectionInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowTriggerCreator(source: NodeCreatorOpenSource) {\n\t\t\tif (this.createNodeActive) return;\n\t\t\tthis.nodeCreatorStore.setSelectedView(TRIGGER_NODE_CREATOR_VIEW);\n\t\t\tthis.nodeCreatorStore.setShowScrim(true);\n\t\t\tthis.onToggleNodeCreator({ source, createNodeActive: true });\n\t\t},\n\t\tasync openExecution(executionId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tlet data: IExecutionResponse | undefined;\n\t\t\ttry {\n\t\t\t\tdata = await this.workflowsStore.getExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.openExecution.title'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data === undefined) {\n\t\t\t\tthrow new Error(`Execution with id \"${executionId}\" could not be found!`);\n\t\t\t}\n\t\t\tthis.workflowsStore.setWorkflowName({\n\t\t\t\tnewName: data.workflowData.name,\n\t\t\t\tsetStateDirty: false,\n\t\t\t});\n\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(data);\n\t\t\tif (data.workflowData.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflowData.pinData);\n\t\t\t}\n\n\t\t\tif (data.workflowData.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\townedBy: data.workflowData.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWith: data.workflowData.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(data.workflowData.usedCredentials);\n\t\t\t}\n\n\t\t\tawait this.addNodes(\n\t\t\t\tdeepCopy(data.workflowData.nodes),\n\t\t\t\tdeepCopy(data.workflowData.connections),\n\t\t\t);\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tvoid this.externalHooks.run('execution.open', {\n\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\tworkflowName: data.workflowData.name,\n\t\t\t\texecutionId,\n\t\t\t});\n\t\t\tthis.$telemetry.track('User opened read-only execution', {\n\t\t\t\tworkflow_id: data.workflowData.id,\n\t\t\t\texecution_mode: data.mode,\n\t\t\t\texecution_finished: data.finished,\n\t\t\t});\n\n\t\t\tif (!data.finished && data.data?.resultData?.error) {\n\t\t\t\t// Check if any node contains an error\n\t\t\t\tlet nodeErrorFound = false;\n\t\t\t\tif (data.data.resultData.runData) {\n\t\t\t\t\tconst runData = data.data.resultData.runData;\n\t\t\t\t\terrorCheck: for (const nodeName of Object.keys(runData)) {\n\t\t\t\t\t\tfor (const taskData of runData[nodeName]) {\n\t\t\t\t\t\t\tif (taskData.error) {\n\t\t\t\t\t\t\t\tnodeErrorFound = true;\n\t\t\t\t\t\t\t\tbreak errorCheck;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!nodeErrorFound && data.data.resultData.error.stack) {\n\t\t\t\t\t// Display some more information for now in console to make debugging easier\n\t\t\t\t\tconsole.error(`Execution ${executionId} error:`);\n\t\t\t\t\tconsole.error(data.data.resultData.error.stack);\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.workflowError'),\n\t\t\t\t\t\tmessage: data.data.resultData.error.message,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((data as ExecutionSummary).waitTill) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.thisExecutionHasntFinishedYet'),\n\t\t\t\t\tmessage: `<a data-action=\"reload\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.refresh',\n\t\t\t\t\t)}</a> ${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.toSeeTheLatestStatus',\n\t\t\t\t\t)}.<br/> <a href=\"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/\" target=\"_blank\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.moreInfo',\n\t\t\t\t\t)}</a>`,\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tduration: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync importWorkflowExact(data: { workflow: IWorkflowDataUpdate }) {\n\t\t\tif (!data.workflow.nodes || !data.workflow.connections) {\n\t\t\t\tthrow new Error('Invalid workflow object');\n\t\t\t}\n\t\t\tthis.resetWorkspace();\n\t\t\tdata.workflow.nodes = NodeViewUtils.getFixedNodesList(data.workflow.nodes);\n\n\t\t\tawait this.addNodes(data.workflow.nodes as INodeUi[], data.workflow.connections);\n\n\t\t\tif (data.workflow.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflow.pinData);\n\t\t\t}\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync openWorkflowTemplate(templateId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.canvasStore.setLoadingText(this.$locale.baseText('nodeView.loadingTemplate'));\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tlet data: IWorkflowTemplate | undefined;\n\t\t\ttry {\n\t\t\t\tvoid this.externalHooks.run('template.requested', { templateId });\n\t\t\t\tdata = await this.templatesStore.getFixedWorkflowTemplate(templateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.workflowTemplateWithIdCouldNotBeFound', {\n\t\t\t\t\t\t\tinterpolate: { templateId },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.couldntImportWorkflow'));\n\t\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track(\n\t\t\t\t'User inserted workflow template',\n\t\t\t\t{\n\t\t\t\t\tsource: 'workflow',\n\t\t\t\t\ttemplate_id: tryToParseNumber(templateId),\n\t\t\t\t\twf_template_repo_session_id: this.templatesStore.previousSessionId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\twithPostHog: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.blankRedirect = true;\n\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW, query: { templateId } });\n\n\t\t\tawait this.addNodes(data.workflow.nodes, data.workflow.connections);\n\t\t\tthis.workflowData = (await this.workflowsStore.getNewWorkflowData(data.name)) || {};\n\t\t\tthis.workflowsStore.addToWorkflowMetadata({ templateId });\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tvoid this.externalHooks.run('template.open', {\n\t\t\t\ttemplateId,\n\t\t\t\ttemplateName: data.name,\n\t\t\t\tworkflow: data.workflow,\n\t\t\t});\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync openWorkflow(workflow: IWorkflowDb) {\n\t\t\tthis.canvasStore.startLoading();\n\n\t\t\tconst selectedExecution = this.executionsStore.activeExecution;\n\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.addWorkflow(workflow);\n\t\t\tthis.workflowsStore.setActive(workflow.active || false);\n\t\t\tthis.workflowsStore.setWorkflowId(workflow.id);\n\t\t\tthis.workflowsStore.setWorkflowName({ newName: workflow.name, setStateDirty: false });\n\t\t\tthis.workflowsStore.setWorkflowSettings(workflow.settings || {});\n\t\t\tthis.workflowsStore.setWorkflowPinData(workflow.pinData || {});\n\t\t\tthis.workflowsStore.setWorkflowVersionId(workflow.versionId);\n\t\t\tthis.workflowsStore.setWorkflowMetadata(workflow.meta);\n\n\t\t\tif (workflow.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\townedBy: workflow.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWith: workflow.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(workflow.usedCredentials);\n\t\t\t}\n\n\t\t\tconst tags = (workflow.tags || []) as ITag[];\n\t\t\tconst tagIds = tags.map((tag) => tag.id);\n\t\t\tthis.workflowsStore.setWorkflowTagIds(tagIds || []);\n\t\t\tthis.tagsStore.upsertTags(tags);\n\n\t\t\tawait this.addNodes(workflow.nodes, workflow.connections);\n\n\t\t\tif (!this.credentialsUpdated) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t}\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tvoid this.externalHooks.run('workflow.open', {\n\t\t\t\tworkflowId: workflow.id,\n\t\t\t\tworkflowName: workflow.name,\n\t\t\t});\n\t\t\tif (selectedExecution?.workflowId !== workflow.id) {\n\t\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.executionsStore.activeExecution = selectedExecution;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t\tthis.collaborationStore.notifyWorkflowOpened(workflow.id);\n\t\t},\n\t\ttouchTap(e: MouseEvent | TouchEvent) {\n\t\t\tif (this.deviceSupport.isTouchDevice) {\n\t\t\t\tthis.mouseDown(e);\n\t\t\t}\n\t\t},\n\t\tmouseDown(e: MouseEvent | TouchEvent) {\n\t\t\t// Save the location of the mouse click\n\t\t\tthis.lastClickPosition = this.getMousePositionWithinNodeView(e);\n\t\t\tif (e instanceof MouseEvent && e.button === 1) {\n\t\t\t\tthis.aiStore.closeNextStepPopup();\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t}\n\n\t\t\tthis.mouseDownMouseSelect(e as MouseEvent, this.moveCanvasKeyPressed);\n\t\t\tthis.canvasPanning.onMouseDown(e as MouseEvent, this.moveCanvasKeyPressed);\n\n\t\t\t// Hide the node-creator\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tmouseUp(e: MouseEvent) {\n\t\t\tif (e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t\tthis.mouseUpMouseSelect(e);\n\t\t\tthis.canvasPanning.onMouseUp(e);\n\t\t},\n\t\tkeyUp(e: KeyboardEvent) {\n\t\t\tif (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = false;\n\t\t\t}\n\t\t\tif (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t},\n\t\tasync keyDown(e: KeyboardEvent) {\n\t\t\tthis.contextMenu.close();\n\t\t\tthis.aiStore.closeNextStepPopup();\n\n\t\t\tconst ctrlModifier = this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst shiftModifier = e.shiftKey && !e.altKey && !this.deviceSupport.isCtrlKeyPressed(e);\n\t\t\tconst ctrlAltModifier = this.deviceSupport.isCtrlKeyPressed(e) && e.altKey && !e.shiftKey;\n\t\t\tconst noModifierKeys = !this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst readOnly = this.isReadOnlyRoute || this.readOnlyEnv;\n\n\t\t\tif (e.key === 's' && ctrlModifier && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(this.onSaveKeyboardShortcut, { debounceTime: 1000 }, e);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\n\t\t\t// Check if the keys got emitted from a message box or from something\n\t\t\t// else which should ignore the default keybindings\n\t\t\tfor (const element of path) {\n\t\t\t\tif (\n\t\t\t\t\telement.className &&\n\t\t\t\t\ttypeof element.className === 'string' &&\n\t\t\t\t\telement.className.includes('ignore-key-press')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// el-dialog or el-message-box element is open\n\t\t\tif (window.document.body.classList.contains('el-popup-parent--hidden')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape' && noModifierKeys) {\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t\tif (this.activeNode) {\n\t\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// node modal is open\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedNodes = this.uiStore.getSelectedNodes\n\t\t\t\t.map((node) => node && this.workflowsStore.getNodeByName(node.name))\n\t\t\t\t.filter((node) => !!node) as INode[];\n\n\t\t\tif (e.key === 'd' && noModifierKeys && !readOnly) {\n\t\t\t\tvoid this.callDebounced(this.toggleActivationNodes, { debounceTime: 350 }, selectedNodes);\n\t\t\t} else if (e.key === 'd' && ctrlModifier && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid this.duplicateNodes(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'p' && noModifierKeys && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.togglePinNodes(selectedNodes, 'keyboard-shortcut');\n\t\t\t\t}\n\t\t\t} else if ((e.key === 'Delete' || e.key === 'Backspace') && noModifierKeys && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.deleteNodes, { debounceTime: 500 }, selectedNodes);\n\t\t\t} else if (e.key === 'Tab' && noModifierKeys && !readOnly) {\n\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.TAB,\n\t\t\t\t\tcreateNodeActive: !this.createNodeActive && !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && ctrlModifier && !readOnly) {\n\t\t\t\tvoid this.onRunWorkflow();\n\t\t\t} else if (e.key === 'S' && shiftModifier && !readOnly) {\n\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t} else if (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = true;\n\t\t\t} else if (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t} else if (e.key === 'F2' && noModifierKeys && !readOnly) {\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode !== null && lastSelectedNode.type !== STICKY_NODE_TYPE) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.renameNodePrompt,\n\t\t\t\t\t\t{ debounceTime: 1500 },\n\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'a' && ctrlModifier) {\n\t\t\t\t// Select all nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectAllNodes, { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'c' && ctrlModifier) {\n\t\t\t\tvoid this.callDebounced(this.copyNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'x' && ctrlModifier && !readOnly) {\n\t\t\t\t// Cut nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.cutNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'n' && ctrlAltModifier) {\n\t\t\t\t// Create a new workflow\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this.isDemo) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this.$router.currentRoute.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tnodeViewEventBus.emit('newWorkflow');\n\t\t\t\t} else {\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t}\n\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.keyDown.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && noModifierKeys) {\n\t\t\t\t// Activate the last selected node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\t\tif (lastSelectedNode !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastSelectedNode.type === STICKY_NODE_TYPE &&\n\t\t\t\t\t\t(this.isReadOnlyRoute || this.readOnlyEnv)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.ndvStore.activeNodeName = lastSelectedNode.name;\n\t\t\t\t}\n\t\t\t} else if (e.key === 'ArrowRight' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectDownstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowRight' && noModifierKeys) {\n\t\t\t\t// Set child node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t);\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (e.key === 'ArrowLeft' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectUpstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowLeft' && noModifierKeys) {\n\t\t\t\t// Set parent node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (['ArrowUp', 'ArrowDown'].includes(e.key) && noModifierKeys) {\n\t\t\t\t// Set sibling node as active\n\n\t\t\t\t// Check first if it has a parent node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (!Array.isArray(connections.main) || !connections.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parentNode = connections.main[0][0].node;\n\t\t\t\tconst connectionsParent = this.workflowsStore.outgoingConnectionsByNodeName(parentNode);\n\n\t\t\t\tif (!Array.isArray(connectionsParent.main) || !connectionsParent.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get all the sibling nodes and their x positions to know which one to set active\n\t\t\t\tlet siblingNode: INodeUi | null;\n\t\t\t\tlet lastCheckedNodePosition = e.key === 'ArrowUp' ? -99999999 : 99999999;\n\t\t\t\tlet nextSelectNode: string | null = null;\n\t\t\t\tfor (const ouputConnections of connectionsParent.main) {\n\t\t\t\t\tfor (const ouputConnection of ouputConnections) {\n\t\t\t\t\t\tif (ouputConnection.node === lastSelectedNode.name) {\n\t\t\t\t\t\t\t// Ignore current node\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsiblingNode = this.workflowsStore.getNodeByName(ouputConnection.node);\n\n\t\t\t\t\t\tif (siblingNode) {\n\t\t\t\t\t\t\tif (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\t// Get the next node on the left\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] <= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] > lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Get the next node on the right\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] >= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] < lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextSelectNode !== null) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\t\tnextSelectNode,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttoggleActivationNodes(nodes: INode[]) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.disableNodes(nodes, true);\n\t\t},\n\n\t\ttogglePinNodes(nodes: INode[], source: 'keyboard-shortcut' | 'context-menu') {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst nextStatePinned = nodes.some(\n\t\t\t\t(node) => !this.workflowsStore.pinDataByNodeName(node.name),\n\t\t\t);\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\tif (nextStatePinned) {\n\t\t\t\t\tconst dataToPin = this.dataSchema.getInputDataWithPinned(node);\n\t\t\t\t\tif (dataToPin.length !== 0) {\n\t\t\t\t\t\tpinnedDataForNode.setData(dataToPin, source);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpinnedDataForNode.unsetData(source);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\n\t\tdeleteNodes(nodes: INode[]) {\n\t\t\t// Copy \"selectedNodes\" as the nodes get deleted out of selection\n\t\t\t// when they get deleted and if we would use original it would mess\n\t\t\t// with the index and would so not delete all nodes\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tthis.removeNode(node.name, true, false);\n\t\t\t});\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}, 200);\n\t\t},\n\n\t\tselectAllNodes() {\n\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t});\n\t\t},\n\n\t\tselectUpstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all upstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'upstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\t\tselectDownstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all downstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\n\t\tpushDownstreamNodes(sourceNodeName: string, margin: number, recordHistory = false) {\n\t\t\tconst sourceNode = this.workflowsStore.nodesByName[sourceNodeName];\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tsourceNodeName,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tconst node = this.workflowsStore.nodesByName[nodeName];\n\t\t\t\tconst oldPosition = node.position;\n\n\t\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\t\tname: nodeName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t\tthis.onNodeMoved(node);\n\n\t\t\t\tif (\n\t\t\t\t\t(recordHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t\t) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\t\trecordHistory,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcutNodes(nodes: INode[]) {\n\t\t\tconst deleteCopiedNodes = !this.isReadOnlyRoute && !this.readOnlyEnv;\n\t\t\tthis.copyNodes(nodes, deleteCopiedNodes);\n\t\t\tif (deleteCopiedNodes) {\n\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t}\n\t\t},\n\n\t\tcopyNodes(nodes: INode[], isCut = false) {\n\t\t\tvoid this.getNodesToSave(nodes).then((data) => {\n\t\t\t\tconst workflowToCopy: IWorkflowToShare = {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t...(this.workflowsStore.workflow.meta ?? {}),\n\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t},\n\t\t\t\t\t...data,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowHelpers.removeForeignCredentialsFromWorkflow(\n\t\t\t\t\tworkflowToCopy,\n\t\t\t\t\tthis.credentialsStore.allCredentials,\n\t\t\t\t);\n\n\t\t\t\tconst nodeData = JSON.stringify(workflowToCopy, null, 2);\n\n\t\t\t\tvoid this.clipboard.copy(nodeData);\n\t\t\t\tif (data.nodes.length > 0) {\n\t\t\t\t\tif (!isCut) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: 'Copied!',\n\t\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.$telemetry.track('User copied nodes', {\n\t\t\t\t\t\tnode_types: data.nodes.map((node) => node.type),\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tasync stopExecution() {\n\t\t\tconst executionId = this.workflowsStore.activeExecutionId;\n\t\t\tif (executionId === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.stopExecutionInProgress = true;\n\t\t\t\tawait this.executionsStore.stopCurrentExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\t// Execution stop might fail when the execution has already finished. Let's treat this here.\n\t\t\t\tconst execution = await this.workflowsStore.getExecution(executionId);\n\n\t\t\t\tif (execution === undefined) {\n\t\t\t\t\t// execution finished but was not saved (e.g. due to low connectivity)\n\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution({\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tdata: { finished: true, stoppedAt: new Date() },\n\t\t\t\t\t});\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\t\t\tthis.titleSet(this.workflowsStore.workflowName, 'IDLE');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.unsaved.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeView.showMessage.stopExecutionCatch.unsaved.message',\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else if (execution?.finished) {\n\t\t\t\t\t// execution finished before it could be stopped\n\n\t\t\t\t\tconst executedData = {\n\t\t\t\t\t\tdata: execution.data,\n\t\t\t\t\t\tfinished: execution.finished,\n\t\t\t\t\t\tmode: execution.mode,\n\t\t\t\t\t\tstartedAt: execution.startedAt,\n\t\t\t\t\t\tstoppedAt: execution.stoppedAt,\n\t\t\t\t\t} as IRun;\n\t\t\t\t\tconst pushData = {\n\t\t\t\t\t\tdata: executedData,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tretryOf: execution.retryOf,\n\t\t\t\t\t} as IPushDataExecutionFinished;\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution(pushData);\n\t\t\t\t\tthis.titleSet(execution.workflowData.name, 'IDLE');\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.workflowsStore.setWorkflowExecutionData(executedData as IExecutionResponse);\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.message'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.stopExecution.title'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.stopExecutionInProgress = false;\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst trackProps = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\n\t\t\t\tthis.$telemetry.track('User clicked stop workflow execution', trackProps);\n\t\t\t});\n\t\t},\n\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.stopWaitingForWebhook.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * This method gets called when data got pasted into the window\n\t\t */\n\t\tasync onClipboardPasteEvent(plainTextData: string): Promise<void> {\n\t\t\tif (this.readOnlyEnv) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentTab = getNodeViewTab(this.$route);\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\t\tlet workflowData: IWorkflowDataUpdate | undefined;\n\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if it is an URL which could contain workflow data\n\t\t\t\tif (plainTextData.match(/^http[s]?:\\/\\/.*\\.json$/i)) {\n\t\t\t\t\t// Pasted data points to a possible workflow JSON file\n\n\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst importConfirm = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.message', {\n\t\t\t\t\t\t\tinterpolate: { plainTextData },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (importConfirm !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkflowData = await this.getWorkflowDataFromUrl(plainTextData);\n\t\t\t\t\tif (workflowData === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Pasted data is is possible workflow data\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check first if it is valid JSON\n\t\t\t\t\t\tworkflowData = JSON.parse(plainTextData);\n\n\t\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Is no valid JSON so ignore\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn await this.importWorkflowData(workflowData!, 'paste', false);\n\t\t\t}\n\t\t},\n\n\t\t// Returns the workflow data from a given URL. If no data gets found or\n\t\t// data is invalid it returns undefined and displays an error message by itself.\n\t\tasync getWorkflowDataFromUrl(url: string): Promise<IWorkflowDataUpdate | undefined> {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\n\t\t\tthis.canvasStore.startLoading();\n\t\t\ttry {\n\t\t\t\tworkflowData = await this.workflowsStore.getWorkflowFromUrl(url);\n\t\t\t} catch (error) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.getWorkflowDataFromUrl.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\treturn workflowData;\n\t\t},\n\n\t\t// Imports the given workflow data into the current workflow\n\t\tasync importWorkflowData(\n\t\t\tworkflowData: IWorkflowToShare,\n\t\t\tsource: string,\n\t\t\timportTags = true,\n\t\t): Promise<void> {\n\t\t\t// If it is JSON check if it looks on the first look like data we can use\n\t\t\tif (!workflowData.hasOwnProperty('nodes') || !workflowData.hasOwnProperty('connections')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst nodeIdMap: { [prev: string]: string } = {};\n\t\t\t\tif (workflowData.nodes) {\n\t\t\t\t\tworkflowData.nodes.forEach((node: INode) => {\n\t\t\t\t\t\t//generate new webhookId if workflow already contains a node with the same webhookId\n\t\t\t\t\t\tif (node.webhookId && UPDATE_WEBHOOK_ID_NODE_TYPES.includes(node.type)) {\n\t\t\t\t\t\t\tconst isDuplicate = Object.values(\n\t\t\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow().nodes,\n\t\t\t\t\t\t\t).some((n) => n.webhookId === node.webhookId);\n\t\t\t\t\t\t\tif (isDuplicate) {\n\t\t\t\t\t\t\t\tnode.webhookId = uuid();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// set all new ids when pasting/importing workflows\n\t\t\t\t\t\tif (node.id) {\n\t\t\t\t\t\t\tconst newId = uuid();\n\t\t\t\t\t\t\tnodeIdMap[newId] = node.id;\n\t\t\t\t\t\t\tnode.id = newId;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.id = uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.removeUnknownCredentials(workflowData);\n\n\t\t\t\tconst currInstanceId = this.rootStore.instanceId;\n\n\t\t\t\tconst nodeGraph = JSON.stringify(\n\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnodeIdMap,\n\t\t\t\t\t\t\tsourceInstanceId:\n\t\t\t\t\t\t\t\tworkflowData.meta && workflowData.meta.instanceId !== currInstanceId\n\t\t\t\t\t\t\t\t\t? workflowData.meta.instanceId\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\tisCloudDeployment: this.settingsStore.isCloudDeployment,\n\t\t\t\t\t\t},\n\t\t\t\t\t).nodeGraph,\n\t\t\t\t);\n\t\t\t\tif (source === 'paste') {\n\t\t\t\t\tthis.$telemetry.track('User pasted nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else if (source === 'duplicate') {\n\t\t\t\t\tthis.$telemetry.track('User duplicated nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.$telemetry.track('User imported workflow', {\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// By default we automatically deselect all the currently\n\t\t\t\t// selected nodes and select the new ones\n\t\t\t\tthis.deselectAllNodes();\n\n\t\t\t\t// Fix the node position as it could be totally offscreen\n\t\t\t\t// and the pasted nodes would so not be directly visible to\n\t\t\t\t// the user\n\t\t\t\tthis.workflowHelpers.updateNodePositions(\n\t\t\t\t\tworkflowData,\n\t\t\t\t\tNodeViewUtils.getNewNodePosition(this.nodes, this.lastClickPosition),\n\t\t\t\t);\n\n\t\t\t\tconst data = await this.addNodesToWorkflow(workflowData);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdata.nodes!.forEach((node: INodeUi) => {\n\t\t\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst tagsEnabled = this.settingsStore.areTagsEnabled;\n\t\t\t\tif (importTags && tagsEnabled && Array.isArray(workflowData.tags)) {\n\t\t\t\t\tconst allTags = await this.tagsStore.fetchAll();\n\t\t\t\t\tconst tagNames = new Set(allTags.map((tag) => tag.name));\n\n\t\t\t\t\tconst workflowTags = workflowData.tags as ITag[];\n\t\t\t\t\tconst notFound = workflowTags.filter((tag) => !tagNames.has(tag.name));\n\n\t\t\t\t\tconst creatingTagPromises: Array<Promise<ITag>> = [];\n\t\t\t\t\tfor (const tag of notFound) {\n\t\t\t\t\t\tconst creationPromise = this.tagsStore.create(tag.name).then((tag: ITag) => {\n\t\t\t\t\t\t\tallTags.push(tag);\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcreatingTagPromises.push(creationPromise);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creatingTagPromises);\n\n\t\t\t\t\tconst tagIds = workflowTags.reduce((accu: string[], imported: ITag) => {\n\t\t\t\t\t\tconst tag = allTags.find((tag) => tag.name === imported.name);\n\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\taccu.push(tag.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn accu;\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tthis.workflowsStore.addWorkflowTagIds(tagIds);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.importWorkflowData.title'));\n\t\t\t}\n\t\t},\n\n\t\tremoveUnknownCredentials(workflow: IWorkflowToShare) {\n\t\t\tif (!workflow?.nodes) return;\n\n\t\t\tfor (const node of workflow.nodes) {\n\t\t\t\tif (!node.credentials) continue;\n\n\t\t\t\tfor (const [name, credential] of Object.entries(node.credentials)) {\n\t\t\t\t\tif (credential.id === null) continue;\n\n\t\t\t\t\tif (!this.credentialsStore.getCredentialById(credential.id)) {\n\t\t\t\t\t\tdelete node.credentials[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonDragOver(event: DragEvent) {\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tasync onDrop(event: DragEvent) {\n\t\t\tif (!event.dataTransfer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst dropData = jsonParse<AddedNodesAndConnections>(\n\t\t\t\tevent.dataTransfer.getData(DRAG_EVENT_DATA_KEY),\n\t\t\t);\n\t\t\tif (dropData) {\n\t\t\t\tconst mousePosition = this.getMousePositionWithinNodeView(event);\n\t\t\t\tconst insertNodePosition = [\n\t\t\t\t\tmousePosition[0] - NodeViewUtils.NODE_SIZE / 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tmousePosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t] as XYPosition;\n\n\t\t\t\tawait this.onAddNodes(dropData, true, insertNodePosition);\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t}\n\t\t},\n\n\t\tnodeDeselectedByName(nodeName: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeDeselected(node);\n\t\t\t}\n\t\t},\n\n\t\tnodeSelectedByName(nodeName: string, setActive = false, deselectAllOthers?: boolean) {\n\t\t\tif (deselectAllOthers === true) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeSelected(node);\n\t\t\t\tthis.uiStore.lastSelectedNode = node.name;\n\t\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = null;\n\t\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid = null;\n\t\t\t\tthis.canvasStore.lastSelectedConnection = null;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\t\tif (setActive) {\n\t\t\t\t\tthis.ndvStore.activeNodeName = node.name;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowMaxNodeTypeError(nodeTypeData: INodeTypeDescription) {\n\t\t\tconst maxNodes = nodeTypeData.maxNodes;\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeData.displayName },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t},\n\n\t\tasync getNewNodeWithDefaultCredential(\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t\toverrides: Partial<INodeUi>,\n\t\t) {\n\t\t\tlet nodeVersion = nodeTypeData.defaultVersion;\n\n\t\t\tif (nodeVersion === undefined) {\n\t\t\t\tnodeVersion = Array.isArray(nodeTypeData.version)\n\t\t\t\t\t? nodeTypeData.version.slice(-1)[0]\n\t\t\t\t\t: nodeTypeData.version;\n\t\t\t}\n\n\t\t\tconst newNodeData: INodeUi = {\n\t\t\t\tid: uuid(),\n\t\t\t\tname: overrides.name ?? (nodeTypeData.defaults.name as string),\n\t\t\t\ttype: nodeTypeData.name,\n\t\t\t\ttypeVersion: nodeVersion,\n\t\t\t\tposition: [0, 0],\n\t\t\t\tparameters: {},\n\t\t\t};\n\n\t\t\tconst credentialPerType = nodeTypeData.credentials\n\t\t\t\t?.map((type) => this.credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t\t.flat();\n\n\t\t\tif (credentialPerType && credentialPerType.length === 1) {\n\t\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\t\tconst selectedCredentials = this.credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\t\tconst credentials = {\n\t\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t\t};\n\n\t\t\t\tawait this.loadNodesProperties(\n\t\t\t\t\t[newNodeData].map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t\t);\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\t\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType?.properties || [],\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnewNodeData,\n\t\t\t\t);\n\n\t\t\t\tif (nodeTypeData.credentials) {\n\t\t\t\t\tconst authentication = nodeTypeData.credentials.find(\n\t\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t\t);\n\t\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newNodeData;\n\t\t},\n\n\t\tasync injectNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tconst nodeTypeData: INodeTypeDescription | null =\n\t\t\t\tthis.nodeTypesStore.getNodeType(nodeTypeName);\n\n\t\t\tif (nodeTypeData === null) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\t\tinterpolate: { nodeTypeName },\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnodeTypeData.maxNodes !== undefined &&\n\t\t\t\tthis.workflowHelpers.getNodeTypeCount(nodeTypeName) >= nodeTypeData.maxNodes\n\t\t\t) {\n\t\t\t\tthis.showMaxNodeTypeError(nodeTypeData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newNodeData = await this.getNewNodeWithDefaultCredential(nodeTypeData, {\n\t\t\t\tname: options.name,\n\t\t\t});\n\n\t\t\t// when pulling new connection from node or injecting into a connection\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\tif (options.position) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\tthis.canvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\t\toptions.position,\n\t\t\t\t);\n\t\t\t} else if (lastSelectedNode) {\n\t\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t// set when injecting into a connection\n\t\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\t\tthis.pushDownstreamNodes(\n\t\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t\t\tNodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\ttrackHistory,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set when pulling connections\n\t\t\t\tif (this.canvasStore.newNodeInsertPosition) {\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, [\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\t} else {\n\t\t\t\t\tlet yOffset = 0;\n\t\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeData);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\t\tconst lastSelectedNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\t\tif (\n\t\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNodeWorkflow,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\t\tconst position =\n\t\t\t\t\tthis.nodeTypesStore.isTriggerNode(nodeTypeName) && !this.containsTrigger\n\t\t\t\t\t\t? this.canvasStore.canvasAddButtonPosition\n\t\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t\t(this.lastClickPosition as XYPosition);\n\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, position);\n\t\t\t}\n\n\t\t\tconst localizedName = this.locale.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\t\tnewNodeData.name = this.uniqueNodeName(localizedName);\n\n\t\t\tif (nodeTypeData.webhooks?.length) {\n\t\t\t\tnewNodeData.webhookId = uuid();\n\t\t\t}\n\n\t\t\tawait this.addNodes([newNodeData], undefined, trackHistory);\n\t\t\tthis.workflowsStore.setNodePristine(newNodeData.name, true);\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tif (nodeTypeName === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('nodeView.addNodeButton', { nodeTypeName });\n\t\t\t\tuseSegment().trackAddedTrigger(nodeTypeName);\n\t\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\t\tnode_type: nodeTypeName,\n\t\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\t\tis_auto_add: isAutoAdd,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t\t};\n\n\t\t\t\tif (lastSelectedNode) {\n\t\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t\t}\n\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t\t}\n\n\t\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.nodeSelectedByName(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\tshowDetail && nodeTypeName !== STICKY_NODE_TYPE,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn newNodeData;\n\t\t},\n\t\tgetConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOuputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t): IConnection | undefined {\n\t\t\tconst nodeConnections =\n\t\t\t\tthis.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];\n\t\t\tif (nodeConnections) {\n\t\t\t\tconst connections: IConnection[] | null = nodeConnections[sourceNodeOutputIndex];\n\n\t\t\t\tif (connections) {\n\t\t\t\t\treturn connections.find(\n\t\t\t\t\t\t(connection: IConnection) =>\n\t\t\t\t\t\t\tconnection.node === targetNodeName && connection.index === targetNodeOuputIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tconnectTwoNodes(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOutputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\n\t\t\tif (\n\t\t\t\tsourceNode &&\n\t\t\t\ttargetNode &&\n\t\t\t\t!this.checkNodeConnectionAllowed(sourceNode, targetNode, type)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.getConnection(\n\t\t\t\t\tsourceNodeName,\n\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\ttargetNodeName,\n\t\t\t\t\ttargetNodeOutputIndex,\n\t\t\t\t\ttype,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst connectionData = [\n\t\t\t\t{\n\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: sourceNodeOutputIndex,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: targetNodeOutputIndex,\n\t\t\t\t},\n\t\t\t] as [IConnection, IConnection];\n\n\t\t\tthis.__addConnection(connectionData);\n\t\t},\n\t\tasync addNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tconst lastSelectedNodeOutputIndex = this.uiStore.lastSelectedNodeOutputIndex;\n\t\t\tconst lastSelectedNodeEndpointUuid = this.uiStore.lastSelectedNodeEndpointUuid;\n\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst newNodeData = await this.injectNode(\n\t\t\t\tnodeTypeName,\n\t\t\t\toptions,\n\t\t\t\tshowDetail,\n\t\t\t\ttrackHistory,\n\t\t\t\tisAutoAdd,\n\t\t\t);\n\t\t\tif (!newNodeData) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst outputIndex = lastSelectedNodeOutputIndex || 0;\n\t\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid || '';\n\n\t\t\t// Handle connection of scoped_endpoint types\n\t\t\tif (lastSelectedNodeEndpointUuid && !isAutoAdd) {\n\t\t\t\tconst lastSelectedEndpoint = this.instance.getEndpoint(lastSelectedNodeEndpointUuid);\n\t\t\t\tif (\n\t\t\t\t\tlastSelectedEndpoint &&\n\t\t\t\t\tthis.checkNodeConnectionAllowed(\n\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\tnewNodeData,\n\t\t\t\t\t\tlastSelectedEndpoint.scope as NodeConnectionType,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst connectionType = lastSelectedEndpoint.scope as ConnectionTypes;\n\t\t\t\t\tconst newNodeElement = this.instance.getManagedElement(newNodeData.id);\n\t\t\t\t\tconst newNodeConnections = this.instance.getEndpoints(newNodeElement);\n\t\t\t\t\tconst viableConnection = newNodeConnections.find((conn) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tconn.scope === connectionType &&\n\t\t\t\t\t\t\tlastSelectedEndpoint.parameters.connection !== conn.parameters.connection\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.instance?.connect({\n\t\t\t\t\t\tuuids: [targetEndpoint, viableConnection?.uuid || ''],\n\t\t\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\tif (lastSelectedNode && !isAutoAdd) {\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\tif (lastSelectedConnection?.__meta) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(lastSelectedConnection, trackHistory);\n\n\t\t\t\t\tconst targetNodeName = lastSelectedConnection.__meta.targetNodeName;\n\t\t\t\t\tconst targetOutputIndex = lastSelectedConnection.__meta.targetOutputIndex;\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\t\tgetNodeCreatorFilter(nodeName: string, outputType?: NodeConnectionType) {\n\t\t\tlet filter;\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(nodeName);\n\t\t\tif (!workflowNode) return { nodes: [] };\n\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tworkflowNode?.type,\n\t\t\t\tworkflowNode.typeVersion,\n\t\t\t);\n\t\t\tif (nodeType) {\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\n\t\t\t\tconst filterFound = inputs.filter((input) => {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== outputType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}) as INodeInputConfiguration[];\n\n\t\t\t\tif (filterFound.length) {\n\t\t\t\t\tfilter = filterFound[0].filter;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filter;\n\t\t},\n\t\tinsertNodeAfterSelected(info: NewConnectionInfo) {\n\t\t\tconst type = info.outputType ?? NodeConnectionType.Main;\n\t\t\t// Get the node and set it as active that new nodes\n\t\t\t// which get created get automatically connected\n\t\t\t// to it.\n\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.sourceId);\n\t\t\tif (!sourceNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.lastSelectedNode = sourceNode.name;\n\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid =\n\t\t\t\tinfo.endpointUuid ?? info.connection?.target.jtk?.endpoint.uuid;\n\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = info.index;\n\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\tif (info.connection) {\n\t\t\t\tthis.canvasStore.lastSelectedConnection = info.connection;\n\t\t\t}\n\n\t\t\tthis.onToggleNodeCreator({\n\t\t\t\tsource: info.eventSource,\n\t\t\t\tcreateNodeActive: true,\n\t\t\t\tnodeCreatorView: info.nodeCreatorView,\n\t\t\t});\n\n\t\t\t// TODO: The animation is a bit glitchy because we're updating view stack immediately\n\t\t\t// after the node creator is opened\n\t\t\tconst isOutput = info.connection?.endpoints[0].parameters.connection === 'source';\n\t\t\tconst isScopedConnection =\n\t\t\t\ttype !== NodeConnectionType.Main && Object.values(NodeConnectionType).includes(type);\n\n\t\t\tif (isScopedConnection) {\n\t\t\t\tuseViewStacks()\n\t\t\t\t\t.gotoCompatibleConnectionView(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tisOutput,\n\t\t\t\t\t\tthis.getNodeCreatorFilter(sourceNode.name, type),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((e) => {});\n\t\t\t}\n\t\t},\n\t\tasync onEventConnectionAbort(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.dropPrevented) {\n\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(connection.parameters.nodeId);\n\t\t\t\t\tconst connectionType = connection.parameters.type ?? NodeConnectionType.Main;\n\t\t\t\t\tconst overrideTargetEndpoint = connection?.connector\n\t\t\t\t\t\t?.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (sourceNode) {\n\t\t\t\t\t\tconst isTarget = connection.parameters.connection === 'target';\n\t\t\t\t\t\tconst sourceNodeName = isTarget ? this.pullConnActiveNodeName : sourceNode.name;\n\t\t\t\t\t\tconst targetNodeName = isTarget ? sourceNode.name : this.pullConnActiveNodeName;\n\t\t\t\t\t\tconst outputIndex = connection.parameters.index;\n\t\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// When connection is aborted, we want to show the 'Next step' popup\n\t\t\t\tconst endpointId = `${connection.parameters.nodeId}-output${connection.parameters.index}`;\n\t\t\t\tconst endpoint = connection.instance.getEndpoint(endpointId);\n\t\t\t\t// First, show node creator if endpoint is not a plus endpoint\n\t\t\t\t// or if the AI Assistant experiment doesn't need to be shown to user\n\t\t\t\tif (!endpoint?.endpoint?.canvas || !this.shouldShowNextStepDialog) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\tconnection,\n\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Else render the popup\n\t\t\t\tconst endpointElement: HTMLElement = endpoint.endpoint.canvas;\n\t\t\t\t// Use observer to trigger the popup once the endpoint is rendered back again\n\t\t\t\t// after connection drag is aborted (so we can get it's position and dimensions)\n\t\t\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\t\t\t// Find the mutation in which the current endpoint becomes visible again\n\t\t\t\t\tconst endpointMutation = mutations.find((mutation) => {\n\t\t\t\t\t\tconst target = mutation.target;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisJSPlumbEndpointElement(target) &&\n\t\t\t\t\t\t\ttarget.jtk.endpoint.uuid === endpoint.uuid &&\n\t\t\t\t\t\t\ttarget.style.display === 'block'\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tif (endpointMutation) {\n\t\t\t\t\t\t// When found, display the popup\n\t\t\t\t\t\tconst newConnectionInfo: AIAssistantConnectionInfo = {\n\t\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = newConnectionInfo;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tobserver.observe(this.$refs.nodeViewRef as HTMLElement, {\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: ['style'],\n\t\t\t\t\tsubtree: true,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tcheckNodeConnectionAllowed(\n\t\t\tsourceNode: INodeUi,\n\t\t\ttargetNode: INodeUi,\n\t\t\ttargetInfoType: NodeConnectionType,\n\t\t): boolean {\n\t\t\tconst targetNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\ttargetNode.type,\n\t\t\t\ttargetNode.typeVersion,\n\t\t\t);\n\n\t\t\tif (targetNodeType?.inputs?.length) {\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\t\tif (targetNodeType) {\n\t\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType);\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs || []) {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== targetInfoType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tonInterceptBeforeDrop(info: BeforeDropParams) {\n\t\t\ttry {\n\t\t\t\tlet sourceInfo: ComponentParameters;\n\t\t\t\tlet targetInfo: ComponentParameters;\n\t\t\t\tif (info.connection.endpoints[0].parameters.connection === 'target') {\n\t\t\t\t\tsourceInfo = info.dropEndpoint.parameters;\n\t\t\t\t\ttargetInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t} else {\n\t\t\t\t\tsourceInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t\ttargetInfo = info.dropEndpoint.parameters;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsourceInfo.type !== targetInfo.type ||\n\t\t\t\t\tsourceInfo.connection === targetInfo.connection\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(sourceInfo.nodeId);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeById(targetInfo.nodeId);\n\n\t\t\t\tconst sourceNodeName = sourceNode?.name || '';\n\t\t\t\tconst targetNodeName = targetNode?.name || '';\n\n\t\t\t\tif (sourceNode && targetNode) {\n\t\t\t\t\tif (!this.checkNodeConnectionAllowed(sourceNode, targetNode, targetInfo.type)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check for duplicates\n\t\t\t\tif (\n\t\t\t\t\tthis.getConnection(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetInfo.index,\n\t\t\t\t\t\tsourceInfo.type,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tonEventConnection(info: ConnectionEstablishedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\t// so switch them around if necessary\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst sourceInfo = info.sourceEndpoint.parameters;\n\t\t\t\tconst targetInfo = info.targetEndpoint.parameters;\n\n\t\t\t\tconst sourceNodeName = this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name;\n\t\t\t\tconst targetNodeName = this.workflowsStore.getNodeById(targetInfo.nodeId)?.name;\n\n\t\t\t\tif (sourceNodeName && targetNodeName) {\n\t\t\t\t\tinfo.connection.__meta = {\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceOutputIndex: sourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex: targetInfo.index,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tNodeViewUtils.resetConnection(info.connection);\n\t\t\t\tNodeViewUtils.moveBackInputLabelPosition(info.targetEndpoint);\n\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tthis.dropPrevented = true;\n\t\t\t\tthis.workflowsStore.addConnection({ connection: connectionData });\n\n\t\t\t\tif (!this.isReadOnlyRoute && !this.readOnlyEnv) {\n\t\t\t\t\tNodeViewUtils.hideOutputNameLabel(info.sourceEndpoint);\n\t\t\t\t\tNodeViewUtils.addConnectionActionsOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\t\tsourceId: info.sourceEndpoint.parameters.nodeId,\n\t\t\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t\t\t\tconnection: info.connection,\n\t\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst endpointArrow = NodeViewUtils.getOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\tOVERLAY_ENDPOINT_ARROW_ID,\n\t\t\t\t\t);\n\t\t\t\t\tif (sourceInfo.type !== NodeConnectionType.Main) {\n\t\t\t\t\t\t// Not \"main\" connections get a different connection style\n\t\t\t\t\t\tinfo.connection.setPaintStyle(\n\t\t\t\t\t\t\tgetConnectorPaintStyleData(info.connection, info.sourceEndpoint.parameters.category),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendpointArrow?.setVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dropPrevented = false;\n\t\t\t\tif (!this.isLoading) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = true;\n\t\t\t\t\tif (!this.suspendRecordingDetachedConnections) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddConnectionCommand(connectionData));\n\t\t\t\t\t}\n\t\t\t\t\t// When we add multiple nodes, this event could be fired hundreds of times for large workflows.\n\t\t\t\t\t// And because the updateNodesInputIssues() method is quite expensive, we only call it if not in insert mode\n\t\t\t\t\tif (!this.isInsertingNodes) {\n\t\t\t\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\t\t\t\tthis.resetEndpointsErrors();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\t\t\t\tinfo.source,\n\t\t\t\t\t\t\t\tinfo.target,\n\t\t\t\t\t\t\t\tinfo.connection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t\t\t\t? (info.connection.connector.canvas as HTMLElement)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\taddConectionsTestData() {\n\t\t\tthis.instance.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\tconnection.source,\n\t\t\t\t\tconnection.target,\n\t\t\t\t\tconnection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t? (connection?.connector.canvas as HTMLElement)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tonDragMove() {\n\t\t\tconst totalNodes = this.nodes.length;\n\t\t\tvoid this.callDebounced(this.updateConnectionsOverlays, {\n\t\t\t\tdebounceTime: totalNodes > 20 ? 200 : 0,\n\t\t\t});\n\t\t},\n\t\tupdateConnectionsOverlays() {\n\t\t\tthis.instance?.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\n\t\t\t\tObject.values(connection.overlays).forEach((overlay) => {\n\t\t\t\t\tif (!overlay.canvas) return;\n\t\t\t\t\tthis.instance?.repaint(overlay.canvas);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tisConnectionActive(connection: Connection | null) {\n\t\t\tif (!connection?.id || !this.activeConnection?.id) return false;\n\n\t\t\treturn this.activeConnection?.id === connection.id;\n\t\t},\n\t\tonConnectionMouseOver(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer !== undefined) {\n\t\t\t\t\tclearTimeout(this.exitTimer);\n\t\t\t\t\tthis.exitTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\tthis.enterTimer ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\tthis.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.enterTimer = setTimeout(() => {\n\t\t\t\t\t// If there is already an active connection then hide it first\n\t\t\t\t\tif (this.activeConnection && !this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t}\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tNodeViewUtils.showConnectionActions(connection);\n\t\t\t\t\t\tthis.activeConnection = connection;\n\t\t\t\t\t}\n\t\t\t\t}, 150);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMouseOut(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer) return;\n\n\t\t\t\tif (this.enterTimer) {\n\t\t\t\t\tclearTimeout(this.enterTimer);\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\t!this.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.exitTimer = setTimeout(() => {\n\t\t\t\t\tthis.exitTimer = undefined;\n\n\t\t\t\t\tif (connection && this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMoved(info: ConnectionMovedParams) {\n\t\t\ttry {\n\t\t\t\t// When a connection gets moved from one node to another it for some reason\n\t\t\t\t// calls the \"connection\" event but not the \"connectionDetached\" one. So we listen\n\t\t\t\t// additionally to the \"connectionMoved\" event and then only delete the existing connection.\n\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.connection);\n\n\t\t\t\tconst sourceInfo = info.connection.parameters;\n\t\t\t\tconst targetInfo = info.originalEndpoint.parameters;\n\n\t\t\t\tconst connectionInfo = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(targetInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t] as [IConnection, IConnection];\n\n\t\t\t\tthis.__removeConnection(connectionInfo, false);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonEndpointMouseOver(endpoint: Endpoint, mouse) {\n\t\t\t// This event seems bugged. It gets called constantly even when the mouse is not over the endpoint\n\t\t\t// if the endpoint has a connection attached to it. So we need to check if the mouse is actually over\n\t\t\t// the endpoint.\n\t\t\tif (!endpoint.isTarget || mouse.target !== endpoint.endpoint.canvas) return;\n\t\t\tthis.instance.setHover(endpoint, true);\n\t\t},\n\t\tonEndpointMouseOut(endpoint: Endpoint) {\n\t\t\tif (!endpoint.isTarget) return;\n\t\t\tthis.instance.setHover(endpoint, false);\n\t\t},\n\t\tasync onConnectionDetached(info: ConnectionDetachedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.targetEndpoint);\n\t\t\t\tNodeViewUtils.showOutputNameLabel(info.sourceEndpoint, info.connection);\n\n\t\t\t\tinfo.connection.removeOverlays();\n\t\t\t\tthis.__removeConnectionByConnectionInfo(info, false, false);\n\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\t// establish new connection when dragging connection from one node to another\n\t\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.connection.parameters.nodeId);\n\t\t\t\t\tconst sourceNodeName = sourceNode.name;\n\t\t\t\t\tconst outputIndex = info.connection.parameters.index;\n\t\t\t\t\tconst overrideTargetEndpoint = info.connection.connector\n\t\t\t\t\t\t.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (connectionInfo) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t\t}\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tthis.pullConnActiveNodeName,\n\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\tawait this.$nextTick();\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t} else if (\n\t\t\t\t\t!this.historyStore.bulkInProgress &&\n\t\t\t\t\t!this.suspendRecordingDetachedConnections &&\n\t\t\t\t\tconnectionInfo\n\t\t\t\t) {\n\t\t\t\t\t// Ff connection being detached by user, save this in history\n\t\t\t\t\t// but skip if it's detached as a side effect of bulk undo/redo or node rename process\n\t\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionInfo, this);\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t\t}\n\n\t\t\t\tvoid this.nodeHelpers.updateNodesInputIssues();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDrag(connection: Connection) {\n\t\t\t// The overlays are visible by default so we need to hide the midpoint arrow\n\t\t\t// manually\n\t\t\tconnection.overlays['midpoint-arrow']?.setVisible(false);\n\t\t\ttry {\n\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\tthis.pullConnActive = true;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\tNodeViewUtils.hideConnectionActions(connection);\n\t\t\t\tNodeViewUtils.resetConnection(connection);\n\n\t\t\t\tconst scope = connection.scope as ConnectionTypes;\n\t\t\t\tconst scopedEndpoints = Array.from(\n\t\t\t\t\tdocument.querySelectorAll(`[data-jtk-scope-${scope}=true]`),\n\t\t\t\t);\n\t\t\t\tconst connectionType = connection.parameters.connection;\n\t\t\t\tconst requiredType = connectionType === 'source' ? 'target' : 'source';\n\n\t\t\t\tconst filteredEndpoints = scopedEndpoints.filter((el) => {\n\t\t\t\t\tconst endpoint = el.jtk.endpoint as Endpoint;\n\t\t\t\t\tif (!endpoint) return false;\n\n\t\t\t\t\t// Prevent snapping(but not connecting) to the same node\n\t\t\t\t\tconst isSameNode = endpoint.parameters.nodeId === connection.parameters.nodeId;\n\t\t\t\t\tconst endpointType = endpoint.parameters.connection;\n\n\t\t\t\t\treturn !isSameNode && endpointType === requiredType;\n\t\t\t\t});\n\n\t\t\t\tconst onMouseMove = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tif (!connection) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst intersectingEndpoints = filteredEndpoints\n\t\t\t\t\t\t.filter((element: Element) => {\n\t\t\t\t\t\t\tconst endpoint = element.jtk.endpoint as Endpoint;\n\n\t\t\t\t\t\t\tif (element.classList.contains('jtk-floating-endpoint')) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst isEndpointIntersect = NodeViewUtils.isElementIntersection(element, e, 50);\n\t\t\t\t\t\t\tconst isNodeElementIntersect = NodeViewUtils.isElementIntersection(\n\t\t\t\t\t\t\t\tendpoint.element,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\t30,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (isEndpointIntersect || isNodeElementIntersect) {\n\t\t\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t\t\t\t\t\tif (!nodeType) return false;\n\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\t\tconst aEndpointIntersect = NodeViewUtils.calculateElementIntersection(a, e, 50);\n\t\t\t\t\t\t\tconst bEndpointIntersect = NodeViewUtils.calculateElementIntersection(b, e, 50);\n\n\t\t\t\t\t\t\t// If both intersections are null, treat them as equal\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y && !bEndpointIntersect?.y) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If one intersection is null, sort the non-null one first\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y) return 1;\n\t\t\t\t\t\t\tif (!bEndpointIntersect?.y) return -1;\n\n\t\t\t\t\t\t\t// Otherwise, sort by ascending Y distance\n\t\t\t\t\t\t\treturn bEndpointIntersect.y - aEndpointIntersect.y;\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (intersectingEndpoints.length > 0) {\n\t\t\t\t\t\tconst intersectingEndpoint = intersectingEndpoints[0];\n\t\t\t\t\t\tconst endpoint = intersectingEndpoint.jtk.endpoint as Endpoint;\n\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\tthis.pullConnActiveNodeName = node?.name ?? null;\n\n\t\t\t\t\t\tNodeViewUtils.showDropConnectionState(connection, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNodeViewUtils.showPullConnectionState(connection);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst onMouseUp = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tthis.pullConnActive = false;\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = this.getMousePositionWithinNodeView(e);\n\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\twindow.removeEventListener('mousemove', onMouseMove);\n\t\t\t\t\twindow.removeEventListener('mouseup', onMouseUp);\n\n\t\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tconnection: null,\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener('mousemove', onMouseMove);\n\t\t\t\twindow.addEventListener('touchmove', onMouseMove);\n\t\t\t\twindow.addEventListener('mouseup', onMouseUp);\n\t\t\t\twindow.addEventListener('touchend', onMouseMove);\n\n\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\ttype: connection.parameters.type,\n\t\t\t\t\tconnection: connection.parameters.connection,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDragAbortDetached(connection: Connection) {\n\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t.flatMap((endpoints) => Object.values(endpoints))\n\t\t\t\t.filter((endpoint) => endpoint.endpoint.type === 'N8nPlus')\n\t\t\t\t.forEach((endpoint) => setTimeout(() => endpoint.instance.revalidate(endpoint.element), 0));\n\t\t},\n\t\tonPlusEndpointClick(endpoint: Endpoint) {\n\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\tif (endpoint?.__meta) {\n\t\t\t\t\tthis.aiStore.latestConnectionInfo = {\n\t\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\t\toutputType: endpoint.scope as NodeConnectionType,\n\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t};\n\t\t\t\t\tconst endpointElement = endpoint.endpoint.canvas;\n\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonAddInputEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.ADD_INPUT_ENDPOINT,\n\t\t\t\t\tnodeCreatorView: AI_NODE_CREATOR_VIEW,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbindCanvasEvents() {\n\t\t\tif (this.eventsAttached) return;\n\t\t\tthis.instance.bind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.bind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.bind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\t\t\tthis.instance.bind(\n\t\t\t\t[EVENT_CONNECTION_DRAG, EVENT_CONNECTION_ABORT, EVENT_CONNECTION_DETACHED],\n\t\t\t\tthis.onConnectionDragAbortDetached,\n\t\t\t);\n\t\t\tthis.instance.bind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.bind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\n\t\t\tthis.eventsAttached = true;\n\t\t},\n\t\tunbindCanvasEvents() {\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.unbind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.unbind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.unbind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tunbindEndpointEventListeners(bind = true) {\n\t\t\tif (this.instance) {\n\t\t\t\t// Get all the endpoints and unbind the events\n\t\t\t\tconst elements = this.instance.getManagedElements();\n\t\t\t\tfor (const element of Object.values(elements)) {\n\t\t\t\t\tconst endpoints = element.endpoints;\n\t\t\t\t\tfor (const endpoint of endpoints || []) {\n\t\t\t\t\t\tconst endpointInstance = endpoint?.endpoint;\n\t\t\t\t\t\tif (endpointInstance && endpointInstance.type === N8nPlusEndpointType) {\n\t\t\t\t\t\t\t(endpointInstance as N8nPlusEndpoint).unbindEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tonBeforeUnload(e: BeforeUnloadEvent) {\n\t\t\tif (this.isDemo || window.preventNodeViewBeforeUnload) {\n\t\t\t\treturn;\n\t\t\t} else if (this.uiStore.stateIsDirty) {\n\t\t\t\t// A bit hacky solution to detecting users leaving the page after prompt:\n\t\t\t\t// 1. Notify that workflow is closed straight away\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\t// 2. If user decided to stay on the page we notify that the workflow is opened again\n\t\t\t\tthis.unloadTimeout = setTimeout(() => {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowOpened(this.workflowsStore.workflowId);\n\t\t\t\t}, 5 * TIME.SECOND);\n\t\t\t\te.returnValue = true; //Gecko + IE\n\t\t\t\treturn true; //Gecko + Webkit, Safari, Chrome etc.\n\t\t\t} else {\n\t\t\t\tthis.canvasStore.startLoading(this.$locale.baseText('nodeView.redirecting'));\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonUnload() {\n\t\t\t// This will fire if users decides to leave the page after prompted\n\t\t\t// Clear the interval to prevent the notification from being sent\n\t\t\tclearTimeout(this.unloadTimeout);\n\t\t},\n\t\tasync newWorkflow(): Promise<void> {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tthis.workflowData = await this.workflowsStore.getNewWorkflowData();\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tthis.canvasStore.setZoomLevel(1, [0, 0]);\n\t\t\tawait this.tryToAddWelcomeSticky();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync tryToAddWelcomeSticky(): Promise<void> {\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync initView(): Promise<void> {\n\t\t\tif (this.$route.params.action === 'workflowSave') {\n\t\t\t\t// In case the workflow got saved we do not have to run init\n\t\t\t\t// as only the route changed but all the needed data is already loaded\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.blankRedirect) {\n\t\t\t\tthis.blankRedirect = false;\n\t\t\t} else if (this.$route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t\t\tconst templateId = this.$route.params.id;\n\t\t\t\tawait this.openWorkflowTemplate(templateId);\n\t\t\t} else {\n\t\t\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\t\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t\t\t\t} else if (confirmModal === MODAL_CLOSE) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Load a workflow\n\t\t\t\tlet workflowId = null as string | null;\n\t\t\t\tif (this.$route.params.name) {\n\t\t\t\t\tworkflowId = this.$route.params.name;\n\t\t\t\t}\n\t\t\t\tif (workflowId !== null) {\n\t\t\t\t\tlet workflow: IWorkflowDb | undefined = undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflow = await this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workflow) {\n\t\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t\t\tawait this.checkAndInitDebugMode();\n\n\t\t\t\t\t\tif (workflow.meta?.onboardingId) {\n\t\t\t\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t\t\t\t`User opened workflow from onboarding template with ID ${workflow.meta.onboardingId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tworkflow_id: workflow.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.$route.meta?.nodeView === true) {\n\t\t\t\t\t// Create new workflow\n\t\t\t\t\tawait this.newWorkflow();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\t\tdocument.addEventListener('keyup', this.keyUp);\n\n\t\t\twindow.addEventListener('beforeunload', this.onBeforeUnload);\n\t\t\twindow.addEventListener('unload', this.onUnload);\n\t\t\t// Once view is initialized, pick up all toast notifications\n\t\t\t// waiting in the store and display them\n\t\t\tthis.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n\t\t},\n\t\tgetOutputEndpointUUID(\n\t\t\tnodeName: string,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tindex: number,\n\t\t): string | null {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getOutputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\tgetInputEndpointUUID(nodeName: string, connectionType: ConnectionTypes, index: number) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getInputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\t__addConnection(connection: [IConnection, IConnection]) {\n\t\t\tconst outputUuid = this.getOutputEndpointUUID(\n\t\t\t\tconnection[0].node,\n\t\t\t\tconnection[0].type as ConnectionTypes,\n\t\t\t\tconnection[0].index,\n\t\t\t);\n\t\t\tconst inputUuid = this.getInputEndpointUUID(\n\t\t\t\tconnection[1].node,\n\t\t\t\tconnection[1].type as ConnectionTypes,\n\t\t\t\tconnection[1].index,\n\t\t\t);\n\t\t\tif (!outputUuid || !inputUuid) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst uuid: [string, string] = [outputUuid, inputUuid];\n\t\t\t// Create connections in DOM\n\t\t\tthis.instance?.connect({\n\t\t\t\tuuids: uuid,\n\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t});\n\t\t},\n\t\t__removeConnection(connection: [IConnection, IConnection], removeVisualConnection = false) {\n\t\t\tif (removeVisualConnection) {\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(connection[0].node);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeByName(connection[1].node);\n\n\t\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\tsourceNode.type,\n\t\t\t\t\tsourceNode.typeVersion,\n\t\t\t\t);\n\t\t\t\tconst sourceNodeOutput =\n\t\t\t\t\tsourceNodeType?.outputs?.[connection[0].index] || NodeConnectionType.Main;\n\t\t\t\tconst sourceNodeOutputName =\n\t\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: sourceNode.id,\n\t\t\t\t\ttarget: targetNode.id,\n\t\t\t\t});\n\n\t\t\t\tconnections.forEach((connectionInstance: Connection) => {\n\t\t\t\t\tif (connectionInstance.__meta) {\n\t\t\t\t\t\t// Only delete connections from specific indexes (if it can be determined by meta)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconnectionInstance.__meta.sourceOutputIndex === connection[0].index &&\n\t\t\t\t\t\t\tconnectionInstance.__meta.targetOutputIndex === connection[1].index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.workflowsStore.removeConnection({ connection });\n\t\t},\n\t\t__deleteJSPlumbConnection(connection: Connection, trackHistory = false) {\n\t\t\t// Make sure to remove the overlay else after the second move\n\t\t\t// it visibly stays behind free floating without a connection.\n\t\t\tconnection.removeOverlays();\n\n\t\t\tthis.pullConnActiveNodeName = null; // prevent new connections when connectionDetached is triggered\n\t\t\tthis.instance?.deleteConnection(connection); // on delete, triggers connectionDetached event which applies mutation to store\n\t\t\tif (trackHistory && connection.__meta) {\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.sourceOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.sourceNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.targetOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.targetNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionData, this);\n\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t}\n\t\t},\n\t\t__removeConnectionByConnectionInfo(info, removeVisualConnection = false, trackHistory = false) {\n\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\n\t\t\tif (connectionInfo) {\n\t\t\t\tif (removeVisualConnection) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection, trackHistory);\n\t\t\t\t} else if (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t}\n\t\t\t\tthis.workflowsStore.removeConnection({ connection: connectionInfo });\n\t\t\t}\n\t\t},\n\t\tasync duplicateNodes(nodes: INode[]): Promise<void> {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst workflowData = deepCopy(await this.getNodesToSave(nodes));\n\t\t\tawait this.importWorkflowData(workflowData, 'duplicate', false);\n\t\t},\n\t\tgetIncomingOutgoingConnections(nodeName: string): {\n\t\t\tincoming: Connection[];\n\t\t\toutgoing: Connection[];\n\t\t} {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\n\t\t\tif (node) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t});\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst incoming = this.instance?.getConnections({\n\t\t\t\t\ttarget: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\treturn {\n\t\t\t\t\tincoming,\n\t\t\t\t\toutgoing,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { incoming: [], outgoing: [] };\n\t\t},\n\t\tonNodeMoved(node: INodeUi) {\n\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\n\t\t\t[...incoming, ...outgoing].forEach((connection: Connection) => {\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t});\n\t\t},\n\t\tonNodeRun({\n\t\t\tname,\n\t\t\tdata,\n\t\t\twaiting,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tdata: ITaskData[] | null;\n\t\t\twaiting: boolean;\n\t\t}) {\n\t\t\tconst pinData = this.workflowsStore.pinnedWorkflowData;\n\n\t\t\tif (pinData?.[name]) {\n\t\t\t\tconst { outgoing } = this.getIncomingOutgoingConnections(name);\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tif (connection.__meta?.sourceNodeName === name) {\n\t\t\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(name) !== null;\n\t\t\t\t\t\tNodeViewUtils.addClassesToOverlays({\n\t\t\t\t\t\t\tconnection,\n\t\t\t\t\t\t\toverlayIds: [NodeViewUtils.OVERLAY_RUN_ITEMS_ID],\n\t\t\t\t\t\t\tclassNames: hasRun ? ['has-run'] : [],\n\t\t\t\t\t\t\tincludeConnector: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sourceNodeName = name;\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst sourceId = sourceNode !== null ? sourceNode.id : '';\n\n\t\t\tif (data === null || data.length === 0 || waiting) {\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t});\n\t\t\t\tconst endpoints = NodeViewUtils.getJSPlumbEndpoints(sourceNode, this.instance);\n\t\t\t\tendpoints.forEach((endpoint: Endpoint) => {\n\t\t\t\t\tif (endpoint.endpoint.type === 'N8nPlus') {\n\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.setSuccessOutput(data, sourceNode);\n\t\t},\n\t\tremoveNode(nodeName: string, trackHistory = false, trackBulk = true) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\t// \"requiredNodeTypes\" are also defined in cli/commands/run.ts\n\t\t\tconst requiredNodeTypes: string[] = [];\n\n\t\t\tif (requiredNodeTypes.includes(node.type)) {\n\t\t\t\t// The node is of the required type so check first\n\t\t\t\t// if any node of that type would be left when the\n\t\t\t\t// current one would get deleted.\n\t\t\t\tlet deleteAllowed = false;\n\t\t\t\tfor (const checkNode of this.nodes) {\n\t\t\t\t\tif (checkNode.name === node.name) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (requiredNodeTypes.includes(checkNode.type)) {\n\t\t\t\t\t\tdeleteAllowed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!deleteAllowed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.track('User deleted workflow note', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('node.deleteNode', { node });\n\t\t\t\tthis.$telemetry.track('User deleted node', {\n\t\t\t\t\tnode_type: node.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet waitForNewConnection = false;\n\t\t\t// connect nodes before/after deleted node\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\tif (nodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, nodeType);\n\t\t\t}\n\n\t\t\tif (outputs.length === 1 && inputs.length === 1) {\n\t\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\t\t\t\tif (incoming.length === 1 && outgoing.length === 1) {\n\t\t\t\t\tconst conn1 = incoming[0];\n\t\t\t\t\tconst conn2 = outgoing[0];\n\t\t\t\t\tif (conn1.__meta && conn2.__meta) {\n\t\t\t\t\t\twaitForNewConnection = true;\n\t\t\t\t\t\tconst sourceNodeName = conn1.__meta.sourceNodeName;\n\t\t\t\t\t\tconst sourceNodeOutputIndex = conn1.__meta.sourceOutputIndex;\n\t\t\t\t\t\tconst targetNodeName = conn2.__meta.targetNodeName;\n\t\t\t\t\t\tconst targetNodeOuputIndex = conn2.__meta.targetOutputIndex;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\ttargetNodeOuputIndex,\n\t\t\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (waitForNewConnection) {\n\t\t\t\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t\t\t\t\twaitForNewConnection = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100); // just to make it clear to users that this is a new connection\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\t// Suspend drawing\n\t\t\t\tthis.instance?.setSuspendDrawing(true);\n\t\t\t\t(this.instance?.endpointsByElement[node.id] || [])\n\t\t\t\t\t.flat()\n\t\t\t\t\t.forEach((endpoint) => this.instance?.deleteEndpoint(endpoint));\n\n\t\t\t\t// Remove the connections in data\n\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node);\n\t\t\t\tthis.workflowsStore.removeNode(node);\n\t\t\t\tthis.workflowsStore.clearNodeExecutionData(node.name);\n\n\t\t\t\tif (!waitForNewConnection) {\n\t\t\t\t\t// Now it can draw again\n\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t}\n\n\t\t\t\t// Remove node from selected index if found in it\n\t\t\t\tthis.uiStore.removeNodeFromSelection(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\t\t\t\t}\n\t\t\t}); // allow other events to finish like drag stop\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tconst recordingTimeout = waitForNewConnection ? 100 : 0;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t}, recordingTimeout);\n\t\t\t}\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeName: string) {\n\t\t\tthis.nodeSelectedByName(nodeName, true, true);\n\t\t},\n\t\tasync onOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tawait this.openSelectiveNodeCreator({\n\t\t\t\tconnectiontype: connectionType,\n\t\t\t\tnode,\n\t\t\t});\n\t\t},\n\t\tasync redrawNode(nodeName: string) {\n\t\t\t// TODO: Improve later\n\t\t\t// For now we redraw the node by simply renaming it. Can for sure be\n\t\t\t// done better later but should be fine for now.\n\t\t\tconst tempName = 'x____XXXX____x';\n\t\t\tawait this.renameNode(nodeName, tempName);\n\t\t\tawait this.renameNode(tempName, nodeName);\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\t\t\t// The name changed so we have to take care that\n\t\t\t\t// the connections get changed.\n\t\t\t\tvoid this.renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t\t\t}\n\t\t},\n\t\tasync renameNodePrompt(currentName: string) {\n\t\t\ttry {\n\t\t\t\tconst promptResponsePromise = this.prompt(\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.newName') + ':',\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.renameNode') + `: ${currentName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomClass: 'rename-prompt',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('nodeView.prompt.rename'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('nodeView.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('nodeView.prompt.invalidName'),\n\t\t\t\t\t\tinputValue: currentName,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Wait till it had time to display\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t// Get the input and select the text in it\n\t\t\t\tconst nameInput = document.querySelector('.rename-prompt .el-input__inner') as\n\t\t\t\t\t| HTMLInputElement\n\t\t\t\t\t| undefined;\n\t\t\t\tif (nameInput) {\n\t\t\t\t\tnameInput.focus();\n\t\t\t\t\tnameInput.select();\n\t\t\t\t}\n\n\t\t\t\tconst promptResponse = (await promptResponsePromise) as MessageBoxInputData;\n\n\t\t\t\tif (promptResponse?.action !== MODAL_CONFIRM) return;\n\n\t\t\t\tawait this.renameNode(currentName, promptResponse.value, true);\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync renameNode(currentName: string, newName: string, trackHistory = false) {\n\t\t\tif (currentName === newName) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\tconst activeNodeName = this.activeNode?.name;\n\t\t\tconst isActive = activeNodeName === currentName;\n\t\t\tif (isActive) {\n\t\t\t\tthis.renamingActive = true;\n\t\t\t}\n\n\t\t\tnewName = this.uniqueNodeName(newName);\n\n\t\t\t// Rename the node and update the connections\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow(true);\n\t\t\tworkflow.renameNode(currentName, newName);\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t\t}\n\n\t\t\t// Update also last selected node and execution data\n\t\t\tthis.workflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\t\t// Reset all nodes and connections to load the new ones\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\tthis.workflowsStore.removeAllConnections({ setStateDirty: false });\n\t\t\tthis.workflowsStore.removeAllNodes({ removePinData: false, setStateDirty: true });\n\n\t\t\t// Wait a tick that the old nodes had time to get removed\n\t\t\tawait this.$nextTick();\n\n\t\t\t// Add the new updated nodes\n\t\t\tawait this.addNodes(Object.values(workflow.nodes), workflow.connectionsBySourceNode, false);\n\n\t\t\t// Make sure that the node is selected again\n\t\t\tthis.deselectAllNodes();\n\t\t\tthis.nodeSelectedByName(newName);\n\n\t\t\tif (isActive) {\n\t\t\t\tthis.ndvStore.activeNodeName = newName;\n\t\t\t\tthis.renamingActive = false;\n\t\t\t}\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tdeleteEveryEndpoint() {\n\t\t\t// Check as it does not exist on first load\n\t\t\tif (this.instance) {\n\t\t\t\tthis.instance?.reset();\n\t\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t\t.flatMap((endpoint) => endpoint)\n\t\t\t\t\t.forEach((endpoint) => endpoint.destroy());\n\n\t\t\t\tthis.instance.deleteEveryConnection({ fireEvent: true });\n\t\t\t}\n\t\t},\n\t\tmatchCredentials(node: INodeUi) {\n\t\t\tif (!node.credentials) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.entries(node.credentials).forEach(\n\t\t\t\t([nodeCredentialType, nodeCredentials]: [string, INodeCredentialsDetails]) => {\n\t\t\t\t\tconst credentialOptions = this.credentialsStore.getCredentialsByType(nodeCredentialType);\n\n\t\t\t\t\t// Check if workflows applies old credentials style\n\t\t\t\t\tif (typeof nodeCredentials === 'string') {\n\t\t\t\t\t\tnodeCredentials = {\n\t\t\t\t\t\t\tid: null,\n\t\t\t\t\t\t\tname: nodeCredentials,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nodeCredentials.id) {\n\t\t\t\t\t\t// Check whether the id is matching with a credential\n\t\t\t\t\t\tconst credentialsId = nodeCredentials.id.toString(); // due to a fixed bug in the migration UpdateWorkflowCredentials (just sqlite) we have to cast to string and check later if it has been a number\n\t\t\t\t\t\tconst credentialsForId = credentialOptions.find(\n\t\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.id === credentialsId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (credentialsForId) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcredentialsForId.name !== nodeCredentials.name ||\n\t\t\t\t\t\t\t\ttypeof nodeCredentials.id === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.credentials![nodeCredentialType] = {\n\t\t\t\t\t\t\t\t\tid: credentialsForId.id,\n\t\t\t\t\t\t\t\t\tname: credentialsForId.name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No match for id found or old credentials type used\n\t\t\t\t\tnode.credentials![nodeCredentialType] = nodeCredentials;\n\n\t\t\t\t\t// check if only one option with the name would exist\n\t\t\t\t\tconst credentialsForName = credentialOptions.filter(\n\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.name === nodeCredentials.name,\n\t\t\t\t\t);\n\n\t\t\t\t\t// only one option exists for the name, take it\n\t\t\t\t\tif (credentialsForName.length === 1) {\n\t\t\t\t\t\tnode.credentials![nodeCredentialType].id = credentialsForName[0].id;\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tasync addNodes(nodes: INodeUi[], connections?: IConnections, trackHistory = false) {\n\t\t\tif (!nodes?.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isInsertingNodes = true;\n\t\t\t// Before proceeding we must check if all nodes contain the `properties` attribute.\n\t\t\t// Nodes are loaded without this information so we must make sure that all nodes\n\t\t\t// being added have this information.\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tnodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\t// Add the node to the node-list\n\t\t\tlet nodeType: INodeTypeDescription | null;\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (!node.id) {\n\t\t\t\t\tnode.id = uuid();\n\t\t\t\t}\n\n\t\t\t\tnodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t// Make sure that some properties always exist\n\t\t\t\tif (!node.hasOwnProperty('disabled')) {\n\t\t\t\t\tnode.disabled = false;\n\t\t\t\t}\n\n\t\t\t\tif (!node.hasOwnProperty('parameters')) {\n\t\t\t\t\tnode.parameters = {};\n\t\t\t\t}\n\n\t\t\t\t// Load the defaul parameter values because only values which differ\n\t\t\t\t// from the defaults get saved\n\t\t\t\tif (nodeType !== null) {\n\t\t\t\t\tlet nodeParameters = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\t\t\tnodeType.properties,\n\t\t\t\t\t\t\tnode.parameters,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\tthis.$locale.baseText('nodeView.thereWasAProblemLoadingTheNodeParametersOfNode') +\n\t\t\t\t\t\t\t\t`: \"${node.name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t\tnode.parameters = nodeParameters !== null ? nodeParameters : {};\n\n\t\t\t\t\t// if it's a webhook and the path is empty set the UUID as the default path\n\t\t\t\t\tif (\n\t\t\t\t\t\t[WEBHOOK_NODE_TYPE, FORM_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.parameters.path === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.parameters.path = node.webhookId as string;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check and match credentials, apply new format if old is used\n\t\t\t\tthis.matchCredentials(node);\n\t\t\t\tthis.workflowsStore.addNode(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddNodeCommand(node));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Wait for the nodes to be rendered\n\t\t\tawait this.$nextTick();\n\n\t\t\tthis.instance?.setSuspendDrawing(true);\n\n\t\t\tif (connections) {\n\t\t\t\tawait this.addConnections(connections);\n\t\t\t}\n\t\t\t// Add the node issues at the end as the node-connections are required\n\t\t\tthis.nodeHelpers.refreshNodeIssues();\n\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tthis.isInsertingNodes = false;\n\n\t\t\t// Now it can draw again\n\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t},\n\t\tasync addConnections(connections: IConnections) {\n\t\t\tconst batchedConnectionData: Array<[IConnection, IConnection]> = [];\n\n\t\t\tfor (const sourceNode in connections) {\n\t\t\t\tfor (const type in connections[sourceNode]) {\n\t\t\t\t\tconnections[sourceNode][type].forEach((outwardConnections, sourceIndex) => {\n\t\t\t\t\t\tif (outwardConnections) {\n\t\t\t\t\t\t\toutwardConnections.forEach((targetData) => {\n\t\t\t\t\t\t\t\tbatchedConnectionData.push([\n\t\t\t\t\t\t\t\t\t{ node: sourceNode, type, index: sourceIndex },\n\t\t\t\t\t\t\t\t\t{ node: targetData.node, type: targetData.type, index: targetData.index },\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process the connections in batches\n\t\t\tawait this.processConnectionBatch(batchedConnectionData);\n\t\t\tsetTimeout(this.addConectionsTestData, 0);\n\t\t},\n\n\t\tasync processConnectionBatch(batchedConnectionData: Array<[IConnection, IConnection]>) {\n\t\t\tconst batchSize = 100;\n\n\t\t\tfor (let i = 0; i < batchedConnectionData.length; i += batchSize) {\n\t\t\t\tconst batch = batchedConnectionData.slice(i, i + batchSize);\n\n\t\t\t\tbatch.forEach((connectionData) => {\n\t\t\t\t\tthis.__addConnection(connectionData);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync addNodesToWorkflow(data: IWorkflowDataUpdate): Promise<IWorkflowDataUpdate> {\n\t\t\t// Because nodes with the same name maybe already exist, it could\n\t\t\t// be needed that they have to be renamed. Also could it be possible\n\t\t\t// that nodes are not allowd to be created because they have a create\n\t\t\t// limit set. So we would then link the new nodes with the already existing ones.\n\t\t\t// In this object all that nodes get saved in the format:\n\t\t\t// old-name -> new-name\n\t\t\tconst nodeNameTable: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\t\t\tconst newNodeNames: string[] = [];\n\n\t\t\tif (!data.nodes) {\n\t\t\t\t// No nodes to add\n\t\t\t\tthrow new Error(this.$locale.baseText('nodeView.noNodesGivenToAdd'));\n\t\t\t}\n\n\t\t\t// Get how many of the nodes of the types which have\n\t\t\t// a max limit set already exist\n\t\t\tconst nodeTypesCount = this.workflowHelpers.getNodeTypesMaxCount();\n\n\t\t\tlet oldName: string;\n\t\t\tlet newName: string;\n\t\t\tconst createNodes: INode[] = [];\n\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tdata.nodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tif (nodeTypesCount[node.type] !== undefined) {\n\t\t\t\t\tif (nodeTypesCount[node.type].exist >= nodeTypesCount[node.type].max) {\n\t\t\t\t\t\t// Node is not allowed to be created so\n\t\t\t\t\t\t// do not add it to the create list but\n\t\t\t\t\t\t// add the name of the existing node\n\t\t\t\t\t\t// that this one gets linked up instead.\n\t\t\t\t\t\tnodeNameTable[node.name] = nodeTypesCount[node.type].nodeNames[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Node can be created but increment the\n\t\t\t\t\t\t// counter in case multiple ones are\n\t\t\t\t\t\t// supposed to be created\n\t\t\t\t\t\tnodeTypesCount[node.type].exist += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldName = node.name;\n\n\t\t\t\tconst localized = this.locale.localizeNodeName(node.name, node.type);\n\n\t\t\t\tnewName = this.uniqueNodeName(localized, newNodeNames);\n\n\t\t\t\tnewNodeNames.push(newName);\n\t\t\t\tnodeNameTable[oldName] = newName;\n\n\t\t\t\tcreateNodes.push(node);\n\t\t\t});\n\n\t\t\t// Get only the connections of the nodes that get created\n\t\t\tconst newConnections: IConnections = {};\n\t\t\tconst currentConnections = data.connections!;\n\t\t\tconst createNodeNames = createNodes.map((node) => node.name);\n\t\t\tlet sourceNode, type, sourceIndex, connectionIndex, connectionData;\n\t\t\tfor (sourceNode of Object.keys(currentConnections)) {\n\t\t\t\tif (!createNodeNames.includes(sourceNode)) {\n\t\t\t\t\t// Node does not get created so skip output connections\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connection: INodeConnections = {};\n\n\t\t\t\tfor (type of Object.keys(currentConnections[sourceNode])) {\n\t\t\t\t\tconnection[type] = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tsourceIndex = 0;\n\t\t\t\t\t\tsourceIndex < currentConnections[sourceNode][type].length;\n\t\t\t\t\t\tsourceIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst nodeSourceConnections = [];\n\t\t\t\t\t\tif (currentConnections[sourceNode][type][sourceIndex]) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\t\tconnectionIndex < currentConnections[sourceNode][type][sourceIndex].length;\n\t\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconnectionData = currentConnections[sourceNode][type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\t\tif (!createNodeNames.includes(connectionData.node)) {\n\t\t\t\t\t\t\t\t\t// Node does not get created so skip input connection\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeSourceConnections.push(connectionData);\n\t\t\t\t\t\t\t\t// Add connection\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnection[type].push(nodeSourceConnections);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewConnections[sourceNode] = connection;\n\t\t\t}\n\n\t\t\t// Create a workflow with the new nodes and connections that we can use\n\t\t\t// the rename method\n\t\t\tconst tempWorkflow: Workflow = this.workflowHelpers.getWorkflow(createNodes, newConnections);\n\n\t\t\t// Rename all the nodes of which the name changed\n\t\t\tfor (oldName in nodeNameTable) {\n\t\t\t\tif (oldName === nodeNameTable[oldName]) {\n\t\t\t\t\t// Name did not change so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempWorkflow.renameNode(oldName, nodeNameTable[oldName]);\n\t\t\t}\n\n\t\t\tif (data.pinData) {\n\t\t\t\tlet pinDataSuccess = true;\n\t\t\t\tfor (const nodeName of Object.keys(data.pinData)) {\n\t\t\t\t\t// Pin data limit reached\n\t\t\t\t\tif (!pinDataSuccess) {\n\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst node = tempWorkflow.nodes[nodeNameTable[nodeName]];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\t\t\tpinnedDataForNode.setData(data.pinData[nodeName], 'add-nodes');\n\t\t\t\t\t\tpinDataSuccess = true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpinDataSuccess = false;\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the nodes with the changed node names, expressions and connections\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tawait this.addNodes(\n\t\t\t\tObject.values(tempWorkflow.nodes),\n\t\t\t\ttempWorkflow.connectionsBySourceNode,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\treturn {\n\t\t\t\tnodes: Object.values(tempWorkflow.nodes),\n\t\t\t\tconnections: tempWorkflow.connectionsBySourceNode,\n\t\t\t};\n\t\t},\n\t\tasync getNodesToSave(nodes: INode[]): Promise<IWorkflowData> {\n\t\t\tconst data: IWorkflowData = {\n\t\t\t\tnodes: [],\n\t\t\t\tconnections: {},\n\t\t\t\tpinData: {},\n\t\t\t};\n\n\t\t\t// Get data of all the selected noes\n\t\t\tlet nodeData;\n\t\t\tconst exportNodeNames: string[] = [];\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tnodeData = this.workflowHelpers.getNodeDataToSave(node);\n\t\t\t\texportNodeNames.push(node.name);\n\n\t\t\t\tdata.nodes.push(nodeData);\n\n\t\t\t\tconst pinDataForNode = this.workflowsStore.pinDataByNodeName(node.name);\n\t\t\t\tif (pinDataForNode) {\n\t\t\t\t\tdata.pinData![node.name] = pinDataForNode;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnodeData.credentials &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\t\t\t\t\tnodeData.credentials = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(nodeData.credentials).filter(([_, credential]) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\t\t\t(!usedCredentials[credential.id] ||\n\t\t\t\t\t\t\t\t\tusedCredentials[credential.id]?.currentUserHasAccess)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get only connections of exported nodes and ignore all other ones\n\t\t\tlet connectionToKeep,\n\t\t\t\tconnections: INodeConnections,\n\t\t\t\ttype: string,\n\t\t\t\tconnectionIndex: number,\n\t\t\t\tsourceIndex: number,\n\t\t\t\tconnectionData: IConnection,\n\t\t\t\ttypeConnections: INodeConnections;\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tconnections = this.workflowsStore.outgoingConnectionsByNodeName(node.name);\n\t\t\t\tif (Object.keys(connections).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Keep only the connection to node which get also exported\n\t\t\t\ttypeConnections = {};\n\t\t\t\tfor (type of Object.keys(connections)) {\n\t\t\t\t\tfor (sourceIndex = 0; sourceIndex < connections[type].length; sourceIndex++) {\n\t\t\t\t\t\tconnectionToKeep = [];\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\tconnectionIndex < connections[type][sourceIndex].length;\n\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconnectionData = connections[type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\tif (exportNodeNames.indexOf(connectionData.node) !== -1) {\n\t\t\t\t\t\t\t\tconnectionToKeep.push(connectionData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (connectionToKeep.length) {\n\t\t\t\t\t\t\tif (!typeConnections.hasOwnProperty(type)) {\n\t\t\t\t\t\t\t\ttypeConnections[type] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttypeConnections[type][sourceIndex] = connectionToKeep;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(typeConnections).length) {\n\t\t\t\t\tdata.connections[node.name] = typeConnections;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn data;\n\t\t},\n\t\tresetWorkspace() {\n\t\t\tthis.workflowsStore.resetWorkflow();\n\n\t\t\tthis.onToggleNodeCreator({ createNodeActive: false });\n\t\t\tthis.nodeCreatorStore.setShowScrim(false);\n\t\t\tthis.canvasStore.resetZoom();\n\n\t\t\t// Reset nodes\n\t\t\tthis.unbindEndpointEventListeners();\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\t// Make sure that if there is a waiting test-webhook that it gets removed\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\ttry {\n\t\t\t\t\tvoid this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.workflowsStore.resetState();\n\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\tthis.uiStore.resetSelectedNodes();\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [0, 0];\n\n\t\t\tthis.credentialsUpdated = false;\n\t\t},\n\t\tasync loadActiveWorkflows(): Promise<void> {\n\t\t\tawait this.workflowsStore.fetchActiveWorkflows();\n\t\t},\n\t\tasync loadNodeTypes(): Promise<void> {\n\t\t\tawait this.nodeTypesStore.getNodeTypes();\n\t\t},\n\t\tasync loadCredentialTypes(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchCredentialTypes(true);\n\t\t},\n\t\tasync loadCredentials(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchAllCredentials();\n\t\t},\n\t\tasync loadVariables(): Promise<void> {\n\t\t\tawait this.environmentsStore.fetchAllVariables();\n\t\t},\n\t\tasync loadSecrets(): Promise<void> {\n\t\t\tawait this.externalSecretsStore.fetchAllSecrets();\n\t\t},\n\t\tasync loadNodesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\t\tconst allNodes: INodeTypeDescription[] = this.nodeTypesStore.allNodeTypes;\n\n\t\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tconst nodeVersions = Array.isArray(node.version) ? node.version : [node.version];\n\t\t\t\tif (\n\t\t\t\t\t!!nodeInfos.find((n) => n.name === node.name && nodeVersions.includes(n.version)) &&\n\t\t\t\t\t!node.hasOwnProperty('properties')\n\t\t\t\t) {\n\t\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tversion: Array.isArray(node.version) ? node.version.slice(-1)[0] : node.version,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t\t// Only call API if node information is actually missing\n\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\tawait this.nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\tasync onPostMessageReceived(message: MessageEvent) {\n\t\t\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(message.data);\n\t\t\t\tif (json && json.command === 'openWorkflow') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.importWorkflowExact(json);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = false;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json && json.command === 'openExecution') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\t\t\tthis.isProductionExecutionPreview = json.executionMode !== 'manual';\n\n\t\t\t\t\t\tawait this.openExecution(json.executionId);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = true;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\t\t\tthis.executionsStore.activeExecution = json.execution;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync onImportWorkflowDataEvent(data: IDataObject) {\n\t\t\tawait this.importWorkflowData(data.data as IWorkflowDataUpdate, 'file');\n\t\t},\n\t\tasync onImportWorkflowUrlEvent(data: IDataObject) {\n\t\t\tconst workflowData = await this.getWorkflowDataFromUrl(data.url as string);\n\t\t\tif (workflowData !== undefined) {\n\t\t\t\tawait this.importWorkflowData(workflowData, 'url');\n\t\t\t}\n\t\t},\n\t\taddPinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(nodeName) !== null;\n\t\t\t\tconst classNames = ['pinned'];\n\n\t\t\t\tif (hasRun) {\n\t\t\t\t\tclassNames.push('has-run');\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, {\n\t\t\t\t\t\ttotal: pinData[nodeName].length,\n\t\t\t\t\t\titerations: 0,\n\t\t\t\t\t\tclassNames,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremovePinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tthis.instance.setSuspendDrawing(true);\n\t\t\t\tconnections.forEach(NodeViewUtils.resetConnection);\n\t\t\t\tthis.instance.setSuspendDrawing(false, true);\n\t\t\t});\n\t\t},\n\t\tonToggleNodeCreator({ source, createNodeActive, nodeCreatorView }: ToggleNodeCreatorOptions) {\n\t\t\tif (createNodeActive === this.createNodeActive) return;\n\n\t\t\tif (!nodeCreatorView) {\n\t\t\t\tnodeCreatorView = this.containsTrigger\n\t\t\t\t\t? REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t: TRIGGER_NODE_CREATOR_VIEW;\n\t\t\t}\n\n\t\t\t// Default to the trigger tab in node creator if there's no trigger node yet\n\t\t\tthis.nodeCreatorStore.setSelectedView(nodeCreatorView);\n\n\t\t\tthis.createNodeActive = createNodeActive;\n\n\t\t\tlet mode;\n\t\t\tswitch (this.nodeCreatorStore.selectedView) {\n\t\t\t\tcase AI_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'ai';\n\t\t\t\t\tbreak;\n\t\t\t\tcase REGULAR_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'regular';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmode = 'regular';\n\t\t\t}\n\n\t\t\tif (createNodeActive) this.nodeCreatorStore.setOpenSource(source);\n\t\t\tvoid this.externalHooks.run('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t});\n\t\t\tthis.$telemetry.trackNodesPanel('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\tasync onAddNodes(\n\t\t\t{ nodes, connections }: AddedNodesAndConnections,\n\t\t\tdragAndDrop = false,\n\t\t\tposition?: XYPosition,\n\t\t) {\n\t\t\tlet currentPosition = position;\n\t\t\tfor (const { type, isAutoAdd, name, openDetail, position: nodePosition } of nodes) {\n\t\t\t\tawait this.addNode(\n\t\t\t\t\ttype,\n\t\t\t\t\t{ position: nodePosition ?? currentPosition, dragAndDrop, name },\n\t\t\t\t\topenDetail ?? false,\n\t\t\t\t\ttrue,\n\t\t\t\t\tisAutoAdd,\n\t\t\t\t);\n\n\t\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\t\tcurrentPosition = [\n\t\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tlastAddedNode.position[1],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst newNodesOffset = this.nodes.length - nodes.length;\n\t\t\tfor (const { from, to } of connections) {\n\t\t\t\tconst fromNode = this.nodes[newNodesOffset + from.nodeIndex];\n\t\t\t\tconst toNode = this.nodes[newNodesOffset + to.nodeIndex];\n\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tfromNode.name,\n\t\t\t\t\tfrom.outputIndex ?? 0,\n\t\t\t\t\ttoNode.name,\n\t\t\t\t\tto.inputIndex ?? 0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst lastNodeInputs = workflow.getParentNodesByDepth(lastAddedNode.name, 1);\n\n\t\t\t// If the last added node has multiple inputs, move them down\n\t\t\tif (lastNodeInputs.length > 1) {\n\t\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\t\tconst nodeUi = this.workflowsStore.getNodeByName(node.name);\n\t\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\t\tthis.onMoveNode({\n\t\t\t\t\t\tnodeName: nodeUi.name,\n\t\t\t\t\t\tposition: [nodeUi.position[0], nodeUi.position[1] + 100 * (index + 1)],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t},\n\n\t\tasync saveCurrentWorkflowExternal(callback: () => void) {\n\t\t\tawait this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tcallback?.();\n\t\t},\n\t\tsetSuspendRecordingDetachedConnections(suspend: boolean) {\n\t\t\tthis.suspendRecordingDetachedConnections = suspend;\n\t\t},\n\t\tonMoveNode({ nodeName, position }: { nodeName: string; position: XYPosition }): void {\n\t\t\tthis.workflowsStore.updateNodeProperties({ name: nodeName, properties: { position } });\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (node) {\n\t\t\t\t\tthis.instance?.repaintEverything();\n\t\t\t\t\tthis.onNodeMoved(node);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t},\n\t\tonRevertAddNode({ node }: { node: INodeUi }): void {\n\t\t\tthis.removeNode(node.name, false);\n\t\t},\n\t\tasync onRevertRemoveNode({ node }: { node: INodeUi }): Promise<void> {\n\t\t\tconst prevNode = this.workflowsStore.workflow.nodes.find((n) => n.id === node.id);\n\t\t\tif (prevNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For some reason, returning node to canvas with old id\n\t\t\t// makes it's endpoint to render at wrong position\n\t\t\tnode.id = uuid();\n\t\t\tawait this.addNodes([node]);\n\t\t},\n\t\tonRevertAddConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__removeConnection(connection, true);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertRemoveConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__addConnection(connection);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertNameChange({ currentName, newName }: { currentName: string; newName: string }) {\n\t\t\tawait this.renameNode(newName, currentName);\n\t\t},\n\t\tonRevertEnableToggle({ nodeName, isDisabled }: { nodeName: string; isDisabled: boolean }) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeHelpers.disableNodes([node]);\n\t\t\t}\n\t\t},\n\t\tonPageShow(e: PageTransitionEvent) {\n\t\t\t// Page was restored from the bfcache (back-forward cache)\n\t\t\tif (e.persisted) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\treadOnlyEnvRouteCheck() {\n\t\t\tif (\n\t\t\t\tthis.readOnlyEnv &&\n\t\t\t\t[VIEWS.NEW_WORKFLOW, VIEWS.TEMPLATE_IMPORT].includes(this.$route.name)\n\t\t\t) {\n\t\t\t\tvoid this.$nextTick(async () => {\n\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\t\tawait this.$router.replace({ name: VIEWS.WORKFLOWS });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync checkAndInitDebugMode() {\n\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\tthis.titleSet(this.workflowName, 'DEBUG');\n\t\t\t\tif (!this.workflowsStore.isInDebugMode) {\n\t\t\t\t\tawait this.applyExecutionData(this.$route.params.executionId as string);\n\t\t\t\t\tthis.workflowsStore.isInDebugMode = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonContextMenuAction(action: ContextMenuAction, nodes: INode[]): void {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'copy':\n\t\t\t\t\tthis.copyNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tvoid this.duplicateNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'execute':\n\t\t\t\t\tthis.onRunNode(nodes[0].name, 'NodeView.onContextMenuAction');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'open':\n\t\t\t\t\tthis.ndvStore.activeNodeName = nodes[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rename':\n\t\t\t\t\tvoid this.renameNodePrompt(nodes[0].name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_activation':\n\t\t\t\t\tthis.toggleActivationNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_pin':\n\t\t\t\t\tthis.togglePinNodes(nodes, 'context-menu');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_node':\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.CONTEXT_MENU,\n\t\t\t\t\t\tcreateNodeActive: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_sticky':\n\t\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select_all':\n\t\t\t\t\tthis.selectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'deselect_all':\n\t\t\t\t\tthis.deselectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n\tasync onSourceControlPull() {\n\t\tlet workflowId = null as string | null;\n\t\tif (this.$route.params.name) {\n\t\t\tworkflowId = this.$route.params.name;\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all([this.loadCredentials(), this.loadVariables(), this.tagsStore.fetchAll()]);\n\n\t\t\tif (workflowId !== null && !this.uiStore.stateIsDirty) {\n\t\t\t\tconst workflow: IWorkflowDb | undefined =\n\t\t\t\t\tawait this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\tif (workflow) {\n\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.node-view-root {\n\tposition: relative;\n\tflex: 1;\n\toverflow: hidden;\n\tbackground-color: var(--color-canvas-background);\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.node-view-wrapper {\n\tposition: fixed;\n}\n\n.node-view {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: 0 0;\n\tz-index: -1;\n}\n\n.node-view-background {\n\tbackground-color: var(--color-canvas-background);\n\tposition: absolute;\n\twidth: 10000px;\n\theight: 10000px;\n\tz-index: -2;\n}\n\n.move-active {\n\tcursor: grab;\n\tcursor: -moz-grab;\n\tcursor: -webkit-grab;\n\ttouch-action: none;\n}\n\n.move-in-process {\n\tcursor: grabbing;\n\tcursor: -moz-grabbing;\n\tcursor: -webkit-grabbing;\n\ttouch-action: none;\n}\n\n.workflow-execute-wrapper {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n/* Makes sure that when selected with mouse it does not select text */\n.do-not-select *,\n.jtk-drag-select * {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n</style>\n\n<style lang=\"scss\">\n.node-view-wrapper {\n\t--drag-scope-active-disabled-color: var(--color-foreground-dark);\n\n\t&.connection-drag-scope-active {\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t// Grey out incompatible node type endpoints\n\t\t\t&:not(.connection-drag-scope-active-type-#{$node-type}) {\n\t\t\t\t.diamond-output-endpoint,\n\t\t\t\t.jtk-connector,\n\t\t\t\t.add-input-endpoint {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\n\t\t\t\t.node-input-endpoint-label,\n\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.connection-drag-scope-active-type-#{$node-type} {\n\t\t\t\t// Dragging input\n\t\t\t\t&.connection-drag-scope-active-connection-target {\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t}\n\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t// Apply style to dragged compatible input endpoint\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-input-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Dragging output\n\t\t\t\t&.connection-drag-scope-active-connection-source {\n\t\t\t\t\t// Apply style to dragged compatible output endpoint\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.drop-add-node-label {\n\tcolor: var(--color-text-dark);\n\tfont-weight: 600;\n\tfont-size: 0.8em;\n\ttext-align: center;\n\tbackground-color: #ffffff55;\n}\n\n.connection-actions {\n\t&:hover {\n\t\tdisplay: block !important;\n\t}\n\n\t> button {\n\t\tcolor: var(--color-foreground-xdark);\n\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder-radius: var(--border-radius-base);\n\t\theight: var(--spacing-l);\n\t\twidth: var(--spacing-l);\n\t\tcursor: pointer;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\tposition: absolute;\n\t\ttop: -12px;\n\n\t\t&.add {\n\t\t\tright: 4px;\n\t\t}\n\n\t\t&.delete {\n\t\t\tleft: 4px;\n\t\t}\n\n\t\t&.delete-single {\n\t\t\tleft: -12px;\n\t\t}\n\n\t\tsvg {\n\t\t\tpointer-events: none;\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n\n<style module lang=\"scss\">\n.content {\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: auto;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.shake {\n\tanimation: 1s 200ms shake;\n}\n\n@keyframes shake {\n\t10%,\n\t90% {\n\t\ttransform: translate3d(-1px, 0, 0);\n\t}\n\n\t20%,\n\t80% {\n\t\ttransform: translate3d(2px, 0, 0);\n\t}\n\n\t30%,\n\t50%,\n\t70% {\n\t\ttransform: translate3d(-4px, 0, 0);\n\t}\n\n\t40%,\n\t60% {\n\t\ttransform: translate3d(4px, 0, 0);\n\t}\n}\n\n.setupCredentialsButtonWrapper {\n\tposition: absolute;\n\tleft: var(--spacing-l);\n\ttop: var(--spacing-l);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@mixin applyColorToConnection($partialSelector, $cssColorVarName, $labelCssColorVarName) {\n\t.jtk-connector#{$partialSelector}:not(.jtk-hover) {\n\t\tpath:not(.jtk-connector-outline) {\n\t\t\tstroke: var(#{$cssColorVarName});\n\t\t}\n\t\tpath[jtk-overlay-id='reverse-arrow'],\n\t\tpath[jtk-overlay-id='endpoint-arrow'],\n\t\tpath[jtk-overlay-id='midpoint-arrow'] {\n\t\t\tfill: var(#{$cssColorVarName});\n\t\t}\n\t}\n\n\t.connection-run-items-label#{$partialSelector} {\n\t\tcolor: var(#{$labelCssColorVarName});\n\t}\n}\n\n:deep(.node-view) {\n\t@include applyColorToConnection('.success', '--color-success-light', '--color-success');\n\t@include applyColorToConnection(\n\t\t'.success.pinned',\n\t\t'--color-foreground-xdark',\n\t\t'--color-foreground-xdark'\n\t);\n\t@include applyColorToConnection(\n\t\t'.success.pinned.has-run',\n\t\t'--color-secondary',\n\t\t'--color-secondary'\n\t);\n}\n</style>\n, IRun, IPushDataExecutionFinished\n"],"file":"assets/NodeView-QjQV3eFX.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["position","ref","isOpen","target","actions","actionCallback","useContextMenu","onAction","uiStore","useUIStore","nodeTypesStore","useNodeTypesStore","workflowsStore","useWorkflowsStore","sourceControlStore","useSourceControlStore","i18n","useI18n","isReadOnly","computed","targetNodes","selectedNodes","node","currentTarget","canAddNodeOfType","nodeType","sameTypeNodes","n","canDuplicateNode","NOT_DUPLICATABE_NODE_TYPES","hasPinData","close","open","event","menuTarget","getMousePosition","nodes","onlyStickies","STICKY_NODE_TYPE","i18nOptions","selectionActions","menuActions","usePinnedData","singleNodeActions","_dispatchAction","action","watch","useCanvasMouseSelect","selectActive","selectBox","isTouchDevice","isCtrlKeyPressed","useDeviceSupport","canvasStore","useCanvasStore","isContextMenuOpen","_setSelectBoxStyle","styles","_showSelectBox","y","getMousePositionWithinNodeView","_updateSelectBox","selectionBox","_getSelectionBox","_hideSelectBox","_getNodesInSelection","returnNodes","_createSelectBox","mouseUpMouseSelect","_mouseMoveSelect","e","deselectAllNodes","nodeSelected","mouseDownMouseSelect","moveButtonPressed","mousePosition","relativeX","relativeY","nodeViewScale","nodeViewOffsetPosition","getRelativePosition","nodeDeselected","instance","onMounted","useUniqueNodeName","numberSuffixedNames","acc","uniqueNodeName","originalName","extraNames","canvasNames","nsn","unique","index","remainder","lastChar","match","_b","_sfc_main$s","defineComponent","NodeIcon","inputRef","_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_ctx","_cache","args","_createVNode","_component_NodeIcon","_component_n8n_popover","editName","_withCtx","_createElementVNode","modelValue","_createTextVNode","_toDisplayString","$style","editable","_createBlock","_createCommentVNode","_withKeys","_withModifiers","_component_n8n_text","_component_n8n_input","$event","_component_n8n_button","_sfc_main$r","useExternalHooks","mapStores","useNDVStore","utmTags","primaryDocUrl","_d","_c","_a","NPM_PACKAGE_DOCS_BASE_URL","BUILTIN_NODES_DOCS_URL","isCommunityPackageName","options","COMMUNITY_NODES_INSTALLATION_DOCS_URL","pushCogRight","tab","NodeConnectionType","_component_n8n_tabs","onTooltipClick","_sfc_main$q","router","useRouter","clipboard","useClipboard","workflowHelpers","useWorkflowHelpers","useToast","OPEN_URL_PANEL_TRIGGER_NODE_TYPES","PRODUCTION_ONLY_TRIGGER_NODE_TYPES","webhook","webhookData","CHAT_TRIGGER_NODE_TYPE","FORM_TRIGGER_NODE_TYPE","webhookUrl","method","_withScopeId","_pushScopeId","_popScopeId","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_11","_hoisted_12","visibleWebhookUrls","isMinimized","_component_font_awesome_icon","_component_el_row","_component_el_col","showUrlFor","_component_n8n_radio_buttons","urlOptions","_Fragment","_renderList","_component_n8n_tooltip","getWebhookHttpMethod","_hoisted_9","copyWebhookUrl","getWebhookUrlDisplay","_hoisted_13","_hoisted_15","props","__props","nodeHelpers","useNodeHelpers","debounce","useDebounce","emit","__emit","possibleConnections","expandedGroups","shouldShowNodeInputIssues","nodeData","workflow","nodeInputIssues","issues","connectedNodes","connection","getINodesFromNames","getConnectionConfig","connectionType","c","isMultiConnection","connectionConfig","shouldShowConnectionTooltip","expandConnectionGroup","isExpanded","g","names","name","matchedNodeType","stringifiedIssues","NodeHelpers.nodeIssuesToString","hasInputIssues","isNodeInputConfiguration","getPossibleSubInputConnections","NodeHelpers.getNodeInputs","input","onNodeClick","nodeName","onPlusClick","connectionNodes","showNodeInputsIssues","__expose","_sfc_main$o","pinnedData","externalHooks","runWorkflow","stopCurrentExecution","useRunWorkflow","useMessage","triggeredNode","MANUAL_TRIGGER_NODE_TYPE","WEBHOOK_NODE_TYPE","waitingOnWebhook","executedNode","activeNode","error","nodeViewEventBus","shouldUnpinAndExecute","MODAL_CONFIRM","telemetryPayload","disabledHint","nodeRunning","disabled","buttonLabel","type","size","isListeningForEvents","isTriggerNode","$locale","_sfc_main$n","NodeTitle","NodeCredentials","ParameterInputList","NodeSettingsTabs","NodeWebhooks","NDVSubConnections","NodeExecuteButton","showMessage","useHistoryStore","useCredentialsStore","useWorkflowsEEStore","workflowNode","inputs","NodeHelpers.getConnectionTypes","shortNodeType","item","credential","nodeCredential","CUSTOM_NODES_DOCS_URL","MAIN_NODE_PANEL_WIDTH","newNode","oldNode","importCurlEventBus","parameters","parameter","parameterName","value","nameParts","lastNamePart","isArray","lastNameParts","removedNodeValue","remainingNodeValues","tempValue","get","removedArrayNodeValue","remainingArrayNodeValues","set","deepCopy","updateInformation","RenameNodeCommand","parameterData","newValue","nodeNameBefore","sendData","nodeParameters","NodeHelpers.getNodeParameters","oldNodeParameters","parameterPath","parameterPathArray","path","data","unset","key","SHOULD_CLEAR_NODE_OUTPUTS","nodeParameterValues","updatedParameter","prop","displayOptions","showCondition","hideCondition","hasValidOptions","isINodePropertyCollectionList","isINodePropertiesList","option","isINodePropertyOptionsList","displayParameter","foundNodeSettings","nodeSetting","_hoisted_10","_component_NodeTitle","_component_NodeExecuteButton","outputPanelEditMode","onStopExecution","nodeValid","openPanel","_component_NodeSettingsTabs","pushRef","isCommunityNode","_component_i18n_t","onMissingNodeTextClick","_hoisted_6","onMissingNodeLearnMoreLinkClick","hasForeignCredential","_component_n8n_notice","_withDirectives","_component_NodeWebhooks","nodeValuesInitialized","parametersNoneSetting","_component_ParameterInputList","nodeValues","valueChanged","onParameterBlur","hiddenIssuesInputs","parametersSetting","nodeSettings","_component_NDVSubConnections","blockUI","_sfc_main$m","draggablePosition","activeElement","_sfc_render","$props","$setup","$data","$options","isDragging","_renderSlot","_Teleport","_normalizeStyle","draggingEl","_sfc_main$l","Draggable","onDragStart","onDragEnd","canMoveLeft","moveNodeDirection","direction","matchedDirectionNode","onKeyDown","matchingDirection","rootName","connectionGroups","tooltipPositionMapper","onBeforeUnmount","SIDE_MARGIN","SIDE_PANELS_MARGIN","MIN_PANEL_WIDTH","PANEL_WIDTH","PANEL_WIDTH_LARGE","initialMainPanelWidth","_sfc_main$j","PanelDragButton","NDVFloatingNodes","callDebounced","ndvEventBus","supportedDirections","hasInput","outputPanelRelativeLeft","panelMinLeft","currentRelativeLeftDelta","multiplier","minRelativeWidth","windowWidth","isBelowMinLeft","isMaxRight","width","relativeWidth","mainPanelRelativeWidth","relativeLeft","mainPanelRelativeLeft","mainPanelRelativeRight","isMinLeft","isInputless","positionByName","px","x","relativeDistance","storedPanelWidthData","useStorage","LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH","parsedWidth","initialPosition","_component_NDVFloatingNodes","mainPanelStyles","relativeWidthToPx","mainPanelDimensions","onResizeDebounced","onResizeStart","onResizeEnd","hideInputAndOutput","isDraggable","canMoveRight","onDrag","sanitizeOptions","defaults","_sfc_main$i","sanitizeHtml","_sfc_main$h","VueJsonPretty","RunDataHtml","id","fileName","fileType","mimeType","isJSONData","isHTMLData","jsonParse","binaryUrl","fetchedData","binaryData","_component_VueJsonPretty","_component_RunDataHtml","_sfc_main$g","BinaryDataDisplayEmbed","workflowExecution","executionData","_component_BinaryDataDisplayEmbed","onFeedback","feedback","toast","telemetry","useTelemetry","ndvStore","rootStore","useRootStore","aiStore","useAIStore","isLoadingErrorDebugging","errorDebuggingMessage","errorDebuggingFeedback","displayCause","MAX_DISPLAY_DATA_SIZE","n8nVersion","baseUrl","instanceType","hasManyInputItems","nodeDefaultName","prepareRawMessages","returnData","errorMessage","getErrorMessage","message","parts","part","parsed","onDebugError","onDebugErrorRegenerate","onErrorDebuggingFeedback","nodeVersionTag","latestNodeVersion","getErrorDescription","interpolate","parameterDisplayName","addItemIndexSuffix","itemIndexSuffix","ITEM_INDEX_SUFFIX_TEXT","baseErrorMessage","fullPath","params","pathParts","currentParameterName","arrayMatch","currentParameter","copyErrorDetails","errorInfo","errorDetails","n8nDetails","_e","_f","copySuccess","locale","visible","RunDataTable","defineAsyncComponent","__vitePreload","RunDataJson","RunDataSchema","RunDataSearch","_sfc_main$c","BinaryDataDisplay","NodeErrorView","JsonEditor","RunDataPinButton","toRef","MAX_DISPLAY_ITEMS_AUTO_ALL","DATA_PINNING_DOCS_URL","DATA_EDITING_DOCS_URL","schemaView","isEmpty","HTML_NODE_TYPE","runData","taskData","pinOrLiveData","offset","executionDataToJson","capitalize","branches","i","totalItemsCount","itemsCount","items","outputName","appendBranchWord","NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND","prevNode","prevData","isEqual","newData","branchIndex","newSearch","NodeHelpers.getNodeOutputs","itemIndex","pinDataDiscoveryFlag","LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG","dataPinningEventBus","LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG","origin","inputData","clearJsonKey","TEST_PIN_DATA","source","pageSize","maxPage","displayMode","previous","dataContainerRef","dataDisplay","itemsLabel","runIndex","outputIndex","json","searchInObject","rawInputData","outputTypes","outputs","fileExtension","url","saveAs","bufferString","blob","d","outputConfiguration","isObject","jsonItems","run","canPinData","_component_n8n_callout","dataPinningDocsUrl","_component_n8n_link","isReadOnlyRoute","binaryDataDisplayVisible","_component_BinaryDataDisplay","binaryDataDisplayData","closeBinaryDataDisplay","buttons","_component_n8n_icon_button","editMode","_vShow","_component_RunDataPinButton","readOnlyEnv","isControlledPinDataTooltip","pinDataDiscoveryTooltipVisible","maxRunIndex","_component_n8n_select","_component_n8n_option","canLinkRuns","linkedRuns","showIOSearch","search","_component_RunDataSearch","paneType","isPaneActive","activatePane","maxOutputIndex","dataCount","isArtificialRecoveredEventItem","unfilteredDataCount","isExecuting","_component_n8n_spinner","executingMessage","_component_JsonEditor","_component_n8n_info_tip","dataEditingDocsUrl","_component_NodeErrorView","hasNodeRun","hasRunError","isPaneTypeInput","$slots","noDataInBranchMessage","dataSizeInMB","showTooMuchData","jsonData","showIoSearchNoMatchContent","_Suspense","_component_RunDataTable","currentPageOffset","$emit","onDisplayModeChange","_component_RunDataJson","inputDataPage","_component_RunDataSchema","mappingEnabled","binaryDataEntry","isViewable","displayBinaryData","isDownloadable","downloadBinaryData","isSchemaView","_component_el_pagination","_component_n8n_block_ui","_sfc_main$b","date","time","convertToDisplayDateComponents","runMetadata","OUTPUT_TYPE","_sfc_main$a","RunData","RunInfo","RunDataAi","storeToRefs","isSubNodeType","useNodeType","resultData","updatedAt","runAt","runDataRef","outputMode","_component_RunData","isNodeRunning","onRunIndexChange","onLinkRun","onUnlinkRun","_createSlots","hasAiMetadata","onUpdateOutputMode","runTaskData","_component_RunInfo","_component_RunDataAi","_sfc_main$8","WireMeUp","toIgnore","START_NODE_TYPE","CRON_NODE_TYPE","INTERVAL_NODE_TYPE","output","executingNode","val","curr","prev","connectedInputs","inputIndex","truncated","mappedNode","isExecutingPrevious","connectedCurrentNodeOutputs","currentNodeDepth","parentNodes","truncate","getMultipleNodesText","isActiveNodeConfig","readOnly","showDraggableHintWithDelay","onNodeExecute","_component_WireMeUp","isMappingMode","_resolveDynamicComponent","_sfc_main$7","CopyInput","createEventBus","hideContent","hideContentValue","getTriggerNodeServiceName","httpMethod","serviceName","VIEWS","WORKFLOW_SETTINGS_MODAL_KEY","_Transition","_component_n8n_pulse","isWebhookNode","webhookHttpMethod","_component_CopyInput","onTestLinkCopied","listeningHint","displayChatButton","header","_component_n8n_heading","activationHint","executionsHelp","_component_n8n_info_accordion","executionsHelpEventBus","onLinkClick","_sfc_main$6","NodeSettings","InputPanel","OutputPanel","NDVDraggablePanels","TriggerPanel","workflowActivate","ctx","useSettingsStore","override","isWebhookBasedNode","isPollingNode","outgoingConnections","parentNodeName","EXECUTABLE_TRIGGER_NODE_TYPES","BASE_NODE_SURVEY_URL","credentials","usedCredentials","foreignCredentials","EnterpriseEditionFeature","isTooltipVisible","pane","nodeTypeName","_component_el_dialog","showTriggerWaitingWarning","_component_n8n_icon","activeNodeType","onSwitchSelectedNode","_component_OutputPanel","outputRun","linked","blockUi","isProductionExecutionPreview","isOutputPaneActive","activateOutputPane","onLinkRunToOutput","onRunOutputIndexChange","openSettings","onOutputTableMounted","onOutputItemHover","onSearch","settingsEventBus","onWorkflowActivate","featureRequestUrl","showTriggerPanel","_component_TriggerPanel","_component_InputPanel","inputRun","isInputPaneActive","activateInputPane","onLinkRunToInput","onRunInputIndexChange","onInputTableMounted","onInputItemHover","contextMenu","dropdown","onActionSelect","onVisibleChange","createAddInputEndpointSpec","connectionName","color","multiple","NODE_CONNECTION_TYPE_ALLOW_MULTIPLE","createDiamondOutputEndpointSpec","getEndpointLabelLength","length","nodeBase","endpoint","canvas","nodeTypeData","rootTypeIndexData","typeIndexData","sortedInputs","b","inputConfiguration","inputName","rootCategoryInputName","rootTypeIndex","typeIndex","inputsOfSameRootType","thisInputName","nonMainInputs","requiredNonMainInputs","optionalNonMainInputs","spacerIndexes","anchorPosition","NodeViewUtils.getAnchorPosition","scope","NodeViewUtils.getEndpointScope","newEndpointData","NodeViewUtils.getInputEndpointUUID","NodeViewUtils.getInputEndpointStyle","NodeViewUtils.getScope","NodeViewUtils.getInputNameOverlay","leftGroupItemsCount","rightGroupItemsCount","insertSpacerBetweenGroups","NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS","minItemsCount","NODE_MIN_INPUT_ITEMS_COUNT","spacerIndex","maxLabelLength","outputConfigurations","endpointLabelLength","rootCategoryOutputName","outputsOfSameRootType","outputData","thisOutputName","NodeViewUtils.getOutputEndpointUUID","NodeViewUtils.getOutputEndpointStyle","overlaySpec","NodeViewUtils.getOutputNameOverlay","plusEndpointData","plusEndpoint","NO_OP_NODE_TYPE","createSupplementalConnectionType","deviceSupport","_sfc_main$4","TitledList","FontAwesomeIcon","workflowResultDataNode","eventTriggerDescription","classes","otherOutputs","spacerCount","mainOutputs","nodeExecutionRunData","executionRunData","lastNodeExecuted","waitDate","WAIT_TIME_UNLIMITED","returnStyles","borderColor","SIMULATE_NODE_TYPE","SIMULATE_TRIGGER_NODE_TYPE","icon","iconNodeType","oldValue","shouldShowTriggerTooltip","dataItemsCount","nodeSubtitle","CUSTOM_API_CALL_KEY","EnableNodeToggleCommand","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_21","_resolveDirective","isTouchActive","disablePointerEvents","_component_FontAwesomeIcon","hasIssues","hideNodeIssues","nodeIssues","waiting","showPinnedDataInfo","nodeExecutionStatus","workflowDataItems","_hoisted_14","showTriggerNodeTooltip","_hoisted_16","touchStart","showDisabledLinethrough","_directive_touch","_hoisted_18","nodeTitle","_hoisted_22","_hoisted_23","executeNode","_sfc_main$3","colorPopoverTrigger","forceActions","setForceActions","content","property","isString","isNumber","edit","link","isOnboardingNote","QUICKSTART_NOTE_NAME","isWelcomeVideo","height","dX","dY","_component_n8n_sticky","defaultText","isActive","gridSize","onEdit","onResize","onShowPopover","onHidePopover","_","showActions","SEQUENTIAL_BONUS","SEPARATOR_BONUS","CAMEL_BONUS","FIRST_LETTER_BONUS","LEADING_LETTER_PENALTY","MAX_LEADING_LETTER_PENALTY","UNMATCHED_LETTER_PENALTY","fuzzyMatchSimple","pattern","patternIdx","strIdx","patternChar","targetChar","fuzzyMatch","fuzzyMatchRecursive","patternCurIndex","targetCurrIndex","targetMatches","matches","maxMatches","nextMatch","recursionCount","recursionLimit","outScore","recursiveMatch","bestRecursiveMatches","bestRecursiveScore","firstMatch","recursiveMatches","recursiveResult","recursiveScore","matched","penalty","unmatched","currIdx","prevIdx","neighbor","getValue","obj","segments","result","sublimeSearch","filter","keys","results","accu","values","weight","v","itemMatch","a","transformNodeType","subcategory","createElement","uuidv4","CORE_NODES_CATEGORY","DEFAULT_SUBCATEGORY","subcategorizeItems","WHITE_LISTED_SUBCATEGORIES","AI_SUBCATEGORY","subcategories","category","sortNodeCreateElements","displayNameA","displayNameB","searchNodes","searchFilter","trimmedFilter","flattenCreateElements","groupItemsInSections","sections","itemsBySection","section","s","useNodeCreatorStore","defineStore","STORES","selectedView","TRIGGER_NODE_CREATOR_VIEW","mergedNodes","showScrim","openSource","allNodeCreatorNodes","setMergeNodes","setActions","setShowScrim","isVisible","setSelectedView","view","setOpenSource","nodeCreatorStore","containerCssVars","aiAssistantChatOpen","title","style","onOptionSelected","getAiNodesBySubcategory","AIView","_nodes","templatesStore","useTemplatesStore","chainNodes","AI_CATEGORY_CHAINS","agentNodes","AI_CATEGORY_AGENTS","AI_NODE_CREATOR_VIEW","AI_OTHERS_NODE_CREATOR_VIEW","AINodesView","getAISubcategoryProperties","nodeConnectionType","AI_CATEGORY_DOCUMENT_LOADERS","AI_CATEGORY_LANGUAGE_MODELS","AI_CATEGORY_MEMORY","AI_CATEGORY_OUTPUTPARSER","AI_CATEGORY_RETRIEVERS","AI_CATEGORY_TEXT_SPLITTERS","AI_CATEGORY_TOOLS","AI_CATEGORY_EMBEDDING","AI_CATEGORY_VECTOR_STORES","AI_UNCATEGORIZED_CATEGORY","TriggerView","EMAIL_IMAP_NODE_TYPE","SCHEDULE_TRIGGER_NODE_TYPE","EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE","OTHER_TRIGGER_NODES_SUBCATEGORY","RegularView","REGULAR_NODE_CREATOR_VIEW","RSS_READ_NODE_TYPE","EMAIL_SEND_NODE_TYPE","TRANSFORM_DATA_SUBCATEGORY","SET_NODE_TYPE","CODE_NODE_TYPE","DATETIME_NODE_TYPE","FILTER_NODE_TYPE","REMOVE_DUPLICATES_NODE_TYPE","SPLIT_OUT_NODE_TYPE","LIMIT_NODE_TYPE","SUMMARIZE_NODE_TYPE","AGGREGATE_NODE_TYPE","MERGE_NODE_TYPE","MARKDOWN_NODE_TYPE","XML_NODE_TYPE","CRYPTO_NODE_TYPE","EXTRACT_FROM_FILE_NODE_TYPE","CONVERT_TO_FILE_NODE_TYPE","COMPRESSION_NODE_TYPE","EDIT_IMAGE_NODE_TYPE","FLOWS_CONTROL_SUBCATEGORY","IF_NODE_TYPE","SPLIT_IN_BATCHES_NODE_TYPE","FILES_SUBCATEGORY","HELPERS_SUBCATEGORY","HTTP_REQUEST_NODE_TYPE","KEYBOARD_ID_ATTR","WATCHED_KEYS","useKeyboardNavigation","selectableItems","activeItemId","keysHooks","getItemType","element","getElementId","refreshSelectableItems","resolve","cleanupSelectableItems","el","executeKeyHooks","keyboardKey","activeItem","hook","pressedKey","activeItemIndex","isArrowDown","isArrowUp","nextItemIndex","setActiveItem","previousIndex","setActiveItemId","itemId","setActiveItemIndex","attachKeydownEvent","detachKeydownEvent","registerKeyHook","getActiveItemIndex","useViewStacks","viewStacks","activeStackItems","stack","extendItemsWithUUID","searchBaseItems","searchBase","activeViewStack","flatBaselineItems","activeViewStackMode","globalSearchItemsDiff","allNodes","itemsBySubcategory","gotoCompatibleConnectionView","isOutput","nodesByConnectionType","relatedAIView","nextTick","pushViewStack","AI_CODE_NODE_TYPE","displayNode","setStackBaselineItems","stackItems","itemsInSubcategory","matchedNodes","updateCurrentViewStack","uuid","newStackUuid","popViewStack","currentStack","matchedIndex","typedKey","resetViewStacks","useCanvasPanning","elementRef","moveLastPosition","panCanvas","offsetPosition","nodeViewOffsetPositionX","nodeViewOffsetPositionY","onMouseDown","MOUSE_EVENT_BUTTON","unref","onMouseMove","onMouseUp","MOUSE_EVENT_BUTTONS","onMouseMoveEnd","NodeCreation","CanvasControls","SetupWorkflowCredentialsButton","_sfc_main","NodeDetailsView","Node","Sticky","CanvasAddButton","KeyboardShortcutTooltip","ContextMenu","NextStepPopup","to","from","next","getNodeViewTab","MAIN_HEADER_TABS","confirmModal","PLACEHOLDER_EMPTY_WORKFLOW_ID","MODAL_CANCEL","nodeViewRootRef","nodeViewRef","dataSchema","useDataSchema","canvasPanning","useGlobalLinkActions","useTitleChange","useExecutionDebugging","currentTab","nodeViewNotInitialized","workflowChanged","isOpeningTemplate","previousDirtyState","containsTrigger","newScale","err","vm","info","useTagsStore","useUsersStore","useEnvironmentsStore","useExternalSecretsStore","useCollaborationStore","usePushConnectionStore","useExecutionsStore","NodeViewUtils.getBackgroundStyles","returnClasses","MANUAL_CHAT_TRIGGER_NODE_TYPE","userHasSeenAIAssistantExperiment","AI_ASSISTANT_LOCAL_STORAGE_KEY","experimentEnabled","NodeViewUtils.GRID_SIZE","NODE_CREATOR_OPEN_SOURCES","loadPromises","promises","ready","getAccountAge","ONBOARDING_PROMPT_TIMEBOX","onboardingResponse","promptTimeout","FIRST_ONBOARDING_PROMPT_TIMEOUT","ONBOARDING_CALL_SIGNUP_MODAL_KEY","sourceControlEventBus","historyBus","connectiontype","creatorview","WORKFLOW_LM_CHAT_MODAL_KEY","workflowData","TelemetryHelpers.generateNodesGraph","N8nAddInputEndpointType","n8nAddInputEndpoint","managedNode","endpoints","notice","saved","newNodeButton","lastConnectionInfo","executionId","nodeErrorFound","errorCheck","NodeViewUtils.getFixedNodesList","templateId","tryToParseNumber","selectedExecution","tags","tagIds","tag","ctrlModifier","shiftModifier","ctrlAltModifier","noModifierKeys","lastSelectedNode","connections","parentNode","connectionsParent","siblingNode","lastCheckedNodePosition","nextSelectNode","ouputConnections","ouputConnection","nextStatePinned","pinnedDataForNode","dataToPin","checkNodes","sourceNodeName","margin","recordHistory","sourceNode","oldPosition","MoveNodeCommand","deleteCopiedNodes","isCut","workflowToCopy","execution","executedData","pushData","trackProps","plainTextData","importTags","nodeIdMap","UPDATE_WEBHOOK_ID_NODE_TYPES","newId","currInstanceId","nodeGraph","NodeViewUtils.getNewNodePosition","tagsEnabled","allTags","tagNames","workflowTags","notFound","creatingTagPromises","creationPromise","imported","dropData","DRAG_EVENT_DATA_KEY","insertNodePosition","NodeViewUtils.NODE_SIZE","setActive","deselectAllOthers","maxNodes","overrides","nodeVersion","newNodeData","credentialPerType","defaultCredential","selectedCredentials","selected","authentication","authDisplayOptions","displayOption","optionValue","showDetail","trackHistory","isAutoAdd","lastSelectedConnection","diffX","NodeViewUtils.getConnectorLengths","NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES","NodeViewUtils.PUSH_NODES_OFFSET","yOffset","sourceNodeType","offsets","sourceNodeOutputs","sourceNodeOutputMainOutputs","sourceOutputIndex","lastSelectedNodeType","lastSelectedNodeWorkflow","lastSelectedInputs","scopedConnectionIndex","inputType","inputsTypes","pushOffset","localizedName","useSegment","trackProperties","sourceNodeOutputIndex","targetNodeName","targetNodeOuputIndex","nodeConnections","targetNodeOutputIndex","targetNode","connectionData","lastSelectedNodeOutputIndex","lastSelectedNodeEndpointUuid","targetEndpoint","lastSelectedEndpoint","newNodeElement","viableConnection","conn","targetOutputIndex","outputType","filterFound","overrideTargetEndpoint","isTarget","NodeViewUtils.resetConnectionAfterPull","endpointId","endpointElement","observer","mutations","mutation","isJSPlumbEndpointElement","newConnectionInfo","targetInfoType","targetNodeType","sourceInfo","targetInfo","tempEndpoint","NodeViewUtils.resetConnection","NodeViewUtils.moveBackInputLabelPosition","NodeViewUtils.hideOutputNameLabel","NodeViewUtils.addConnectionActionsOverlay","endpointArrow","NodeViewUtils.getOverlay","OVERLAY_ENDPOINT_ARROW_ID","getConnectorPaintStyleData","AddConnectionCommand","NodeViewUtils.addConnectionTestData","totalNodes","NodeViewUtils.showOrHideItemsLabel","NodeViewUtils.showOrHideMidpointArrow","overlay","NodeViewUtils.hideConnectionActions","NodeViewUtils.showConnectionActions","NodeViewUtils.resetInputLabelPosition","connectionInfo","mouse","getConnectionInfo","NodeViewUtils.showOutputNameLabel","RemoveConnectionCommand","removeCommand","scopedEndpoints","requiredType","filteredEndpoints","isSameNode","endpointType","intersectingEndpoints","isEndpointIntersect","NodeViewUtils.isElementIntersection","isNodeElementIntersect","aEndpointIntersect","NodeViewUtils.calculateElementIntersection","bEndpointIntersect","NodeViewUtils.showDropConnectionState","NodeViewUtils.showPullConnectionState","EVENT_CONNECTION_ABORT","INTERCEPT_BEFORE_DROP","EVENT_CONNECTION","EVENT_DRAG_MOVE","EVENT_CONNECTION_MOUSEOVER","EVENT_CONNECTION_MOUSEOUT","EVENT_CONNECTION_MOVED","EVENT_ENDPOINT_MOUSEOVER","EVENT_ENDPOINT_MOUSEOUT","EVENT_CONNECTION_DETACHED","EVENT_CONNECTION_DRAG","EVENT_PLUS_ENDPOINT_CLICK","EVENT_ADD_INPUT_ENDPOINT_CLICK","bind","elements","endpointInstance","N8nPlusEndpointType","TIME","MODAL_CLOSE","workflowId","outputUuid","inputUuid","removeVisualConnection","sourceNodeOutput","sourceNodeOutputName","connectionInstance","outgoing","incoming","pinData","hasRun","NodeViewUtils.addClassesToOverlays","NodeViewUtils.OVERLAY_RUN_ITEMS_ID","sourceId","NodeViewUtils.getJSPlumbEndpoints","trackBulk","requiredNodeTypes","deleteAllowed","checkNode","waitForNewConnection","conn1","conn2","RemoveNodeCommand","tempName","currentName","promptResponsePromise","nameInput","promptResponse","newName","nodeCredentialType","nodeCredentials","credentialOptions","credentialsId","credentialsForId","optionData","credentialsForName","AddNodeCommand","batchedConnectionData","outwardConnections","sourceIndex","targetData","nodeNameTable","newNodeNames","nodeTypesCount","oldName","createNodes","localized","newConnections","currentConnections","createNodeNames","connectionIndex","nodeSourceConnections","tempWorkflow","pinDataSuccess","exportNodeNames","pinDataForNode","connectionToKeep","typeConnections","nodeInfos","nodesToBeFetched","nodeVersions","classNames","NodeViewUtils.addConnectionOutputSuccess","createNodeActive","nodeCreatorView","mode","dragAndDrop","currentPosition","openDetail","nodePosition","lastAddedNode","newNodesOffset","fromNode","toNode","lastNodeInputs","nodeUi","callback","suspend","isDisabled","canvasAddButtonStyle","onCanvasAddButtonCLick","showCanvasAddButton","_component_Node","currentWorkflowObject","canOpenNDV","nodeDeselectedByName","nodeSelectedByName","onRunNode","onNodeMoved","onNodeRun","stickiesToRender","stickyData","_component_Sticky","GRID_SIZE","pullConnActive","renamingActive","redrawNode","stopExecution","onToggleNodeCreator","onAddNodes","_component_CanvasControls","_component_ContextMenu","isNextStepPopupVisible","isManualChatOnly","_component_KeyboardShortcutTooltip","workflowRunning","runButtonText","stopExecutionInProgress","executionWaitingForWebhook","allTriggersDisabled"],"ignoreList":[],"sources":["../../src/composables/useContextMenu.ts","../../src/composables/useCanvasMouseSelect.ts","../../src/composables/useUniqueNodeName.ts","../../src/components/NodeTitle.vue","../../src/components/NodeSettingsTabs.vue","../../src/components/NodeWebhooks.vue","../../src/components/NDVSubConnections.vue","../../src/components/NodeExecuteButton.vue","../../src/components/NodeSettings.vue","../../src/components/Draggable.vue","../../src/components/PanelDragButton.vue","../../src/components/NDVFloatingNodes.vue","../../src/components/NDVDraggablePanels.vue","../../src/components/RunDataHtml.vue","../../src/components/BinaryDataDisplayEmbed.vue","../../src/components/BinaryDataDisplay.vue","../../src/components/Feedback.vue","../../src/components/Error/NodeErrorView.vue","../../src/components/RunDataPinButton.vue","../../src/components/RunData.vue","../../src/components/RunInfo.vue","../../src/components/OutputPanel.vue","../../src/components/WireMeUp.vue","../../src/components/InputPanel.vue","../../src/components/TriggerPanel.vue","../../src/components/NodeDetailsView.vue","../../src/components/ContextMenu/ContextMenu.vue","../../src/mixins/nodeBase.ts","../../src/components/Node.vue","../../src/components/Sticky.vue","../../src/utils/sortUtils.ts","../../src/components/Node/NodeCreator/utils.ts","../../src/stores/nodeCreator.store.ts","../../src/views/CanvasAddButton.vue","../../src/components/AIAssistantChat/NextStepPopup.vue","../../src/components/Node/NodeCreator/viewsData.ts","../../src/components/Node/NodeCreator/composables/useKeyboardNavigation.ts","../../src/components/Node/NodeCreator/composables/useViewStacks.ts","../../src/composables/useCanvasPanning.ts","../../src/views/NodeView.vue"],"sourcesContent":["import type { ActionDropdownItem, XYPosition } from '@/Interface';\nimport { NOT_DUPLICATABE_NODE_TYPES, STICKY_NODE_TYPE } from '@/constants';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INode, INodeTypeDescription } from 'n8n-workflow';\nimport { computed, ref, watch } from 'vue';\nimport { getMousePosition } from '../utils/nodeViewUtils';\nimport { useI18n } from './useI18n';\nimport { usePinnedData } from './usePinnedData';\n\nexport type ContextMenuTarget =\n\t| { source: 'canvas' }\n\t| { source: 'node-right-click'; node: INode }\n\t| { source: 'node-button'; node: INode };\nexport type ContextMenuActionCallback = (action: ContextMenuAction, targets: INode[]) => void;\nexport type ContextMenuAction =\n\t| 'open'\n\t| 'copy'\n\t| 'toggle_activation'\n\t| 'duplicate'\n\t| 'execute'\n\t| 'rename'\n\t| 'toggle_pin'\n\t| 'delete'\n\t| 'select_all'\n\t| 'deselect_all'\n\t| 'add_node'\n\t| 'add_sticky'\n\t| 'change_color';\n\nconst position = ref<XYPosition>([0, 0]);\nconst isOpen = ref(false);\nconst target = ref<ContextMenuTarget>({ source: 'canvas' });\nconst actions = ref<ActionDropdownItem[]>([]);\nconst actionCallback = ref<ContextMenuActionCallback>(() => {});\n\nexport const useContextMenu = (onAction: ContextMenuActionCallback = () => {}) => {\n\tconst uiStore = useUIStore();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst sourceControlStore = useSourceControlStore();\n\n\tconst i18n = useI18n();\n\n\tconst isReadOnly = computed(\n\t\t() => sourceControlStore.preferences.branchReadOnly || uiStore.isReadOnlyView,\n\t);\n\n\tconst targetNodes = computed(() => {\n\t\tif (!isOpen.value) return [];\n\t\tconst selectedNodes = uiStore.selectedNodes.map((node) =>\n\t\t\tworkflowsStore.getNodeByName(node.name),\n\t\t) as INode[];\n\t\tconst currentTarget = target.value;\n\t\tif (currentTarget.source === 'canvas') {\n\t\t\treturn selectedNodes;\n\t\t} else if (currentTarget.source === 'node-right-click') {\n\t\t\tconst isNodeInSelection = selectedNodes.some((node) => node.name === currentTarget.node.name);\n\t\t\treturn isNodeInSelection ? selectedNodes : [currentTarget.node];\n\t\t}\n\n\t\treturn [currentTarget.node];\n\t});\n\n\tconst canAddNodeOfType = (nodeType: INodeTypeDescription) => {\n\t\tconst sameTypeNodes = workflowsStore.allNodes.filter((n) => n.type === nodeType.name);\n\t\treturn nodeType.maxNodes === undefined || sameTypeNodes.length < nodeType.maxNodes;\n\t};\n\n\tconst canDuplicateNode = (node: INode): boolean => {\n\t\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\tif (!nodeType) return false;\n\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(nodeType.name)) return false;\n\n\t\treturn canAddNodeOfType(nodeType);\n\t};\n\n\tconst hasPinData = (node: INode): boolean => {\n\t\treturn !!workflowsStore.pinDataByNodeName(node.name);\n\t};\n\tconst close = () => {\n\t\ttarget.value = { source: 'canvas' };\n\t\tisOpen.value = false;\n\t\tactions.value = [];\n\t\tposition.value = [0, 0];\n\t};\n\n\tconst open = (event: MouseEvent, menuTarget: ContextMenuTarget = { source: 'canvas' }) => {\n\t\tevent.stopPropagation();\n\n\t\tif (isOpen.value && menuTarget.source === target.value.source) {\n\t\t\t// Close context menu, let browser open native context menu\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tactionCallback.value = onAction;\n\t\ttarget.value = menuTarget;\n\t\tposition.value = getMousePosition(event);\n\t\tisOpen.value = true;\n\n\t\tconst nodes = targetNodes.value;\n\t\tconst onlyStickies = nodes.every((node) => node.type === STICKY_NODE_TYPE);\n\t\tconst i18nOptions = {\n\t\t\tadjustToNumber: nodes.length,\n\t\t\tinterpolate: {\n\t\t\t\tsubject: onlyStickies\n\t\t\t\t\t? i18n.baseText('contextMenu.sticky', { adjustToNumber: nodes.length })\n\t\t\t\t\t: i18n.baseText('contextMenu.node', { adjustToNumber: nodes.length }),\n\t\t\t},\n\t\t};\n\n\t\tconst selectionActions = [\n\t\t\t{\n\t\t\t\tid: 'select_all',\n\t\t\t\tdivided: true,\n\t\t\t\tlabel: i18n.baseText('contextMenu.selectAll'),\n\t\t\t\tshortcut: { metaKey: true, keys: ['A'] },\n\t\t\t\tdisabled: nodes.length === workflowsStore.allNodes.length,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'deselect_all',\n\t\t\t\tlabel: i18n.baseText('contextMenu.deselectAll'),\n\t\t\t\tdisabled: nodes.length === 0,\n\t\t\t},\n\t\t];\n\n\t\tif (nodes.length === 0) {\n\t\t\tactions.value = [\n\t\t\t\t{\n\t\t\t\t\tid: 'add_node',\n\t\t\t\t\tshortcut: { keys: ['Tab'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addNode'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'add_sticky',\n\t\t\t\t\tshortcut: { shiftKey: true, keys: ['s'] },\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.addSticky'),\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t];\n\t\t} else {\n\t\t\tconst menuActions: ActionDropdownItem[] = [\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_activation',\n\t\t\t\t\tlabel: nodes.every((node) => node.disabled)\n\t\t\t\t\t\t? i18n.baseText('contextMenu.activate', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.deactivate', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t\t!onlyStickies && {\n\t\t\t\t\tid: 'toggle_pin',\n\t\t\t\t\tlabel: nodes.every((node) => hasPinData(node))\n\t\t\t\t\t\t? i18n.baseText('contextMenu.unpin', i18nOptions)\n\t\t\t\t\t\t: i18n.baseText('contextMenu.pin', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['p'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every((n) => usePinnedData(n).canPinNode(true)),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'copy',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.copy', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['C'] },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 'duplicate',\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.duplicate', i18nOptions),\n\t\t\t\t\tshortcut: { metaKey: true, keys: ['D'] },\n\t\t\t\t\tdisabled: isReadOnly.value || !nodes.every(canDuplicateNode),\n\t\t\t\t},\n\t\t\t\t...selectionActions,\n\t\t\t\t{\n\t\t\t\t\tid: 'delete',\n\t\t\t\t\tdivided: true,\n\t\t\t\t\tlabel: i18n.baseText('contextMenu.delete', i18nOptions),\n\t\t\t\t\tshortcut: { keys: ['Del'] },\n\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t},\n\t\t\t].filter(Boolean) as ActionDropdownItem[];\n\n\t\t\tif (nodes.length === 1) {\n\t\t\t\tconst singleNodeActions = onlyStickies\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.editSticky'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'change_color',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.changeColor'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.open'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['↵'] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'execute',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.test'),\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: 'rename',\n\t\t\t\t\t\t\t\tlabel: i18n.baseText('contextMenu.rename'),\n\t\t\t\t\t\t\t\tshortcut: { keys: ['F2'] },\n\t\t\t\t\t\t\t\tdisabled: isReadOnly.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t\t// Add actions only available for a single node\n\t\t\t\tmenuActions.unshift(...singleNodeActions);\n\t\t\t}\n\n\t\t\tactions.value = menuActions;\n\t\t}\n\t};\n\n\tconst _dispatchAction = (action: ContextMenuAction) => {\n\t\tactionCallback.value(action, targetNodes.value);\n\t};\n\n\twatch(\n\t\t() => uiStore.nodeViewOffsetPosition,\n\t\t() => {\n\t\t\tclose();\n\t\t},\n\t);\n\n\treturn {\n\t\tisOpen,\n\t\tposition,\n\t\ttarget,\n\t\tactions,\n\t\ttargetNodes,\n\t\topen,\n\t\tclose,\n\t\t_dispatchAction,\n\t};\n};\n","import type { INodeUi, XYPosition } from '@/Interface';\n\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { getMousePosition, getRelativePosition } from '@/utils/nodeViewUtils';\nimport { ref, onMounted, computed } from 'vue';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useContextMenu } from './useContextMenu';\n\ninterface ExtendedHTMLSpanElement extends HTMLSpanElement {\n\tx: number;\n\ty: number;\n}\n\nexport default function useCanvasMouseSelect() {\n\tconst selectActive = ref(false);\n\tconst selectBox = ref(document.createElement('span') as ExtendedHTMLSpanElement);\n\n\tconst { isTouchDevice, isCtrlKeyPressed } = useDeviceSupport();\n\tconst uiStore = useUIStore();\n\tconst canvasStore = useCanvasStore();\n\tconst workflowsStore = useWorkflowsStore();\n\tconst { isOpen: isContextMenuOpen } = useContextMenu();\n\n\tfunction _setSelectBoxStyle(styles: Record<string, string>) {\n\t\tObject.assign(selectBox.value.style, styles);\n\t}\n\n\tfunction _showSelectBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\tselectBox.value = Object.assign(selectBox.value, { x, y });\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectBox.value.x + 'px',\n\t\t\ttop: selectBox.value.y + 'px',\n\t\t\tvisibility: 'visible',\n\t\t});\n\t\tselectActive.value = true;\n\t}\n\n\tfunction _updateSelectBox(event: MouseEvent) {\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t_setSelectBoxStyle({\n\t\t\tleft: selectionBox.x + 'px',\n\t\t\ttop: selectionBox.y + 'px',\n\t\t\twidth: selectionBox.width + 'px',\n\t\t\theight: selectionBox.height + 'px',\n\t\t});\n\t}\n\n\tfunction _hideSelectBox() {\n\t\tselectBox.value.x = 0;\n\t\tselectBox.value.y = 0;\n\n\t\t_setSelectBoxStyle({\n\t\t\tvisibility: 'hidden',\n\t\t\tleft: '0px',\n\t\t\ttop: '0px',\n\t\t\twidth: '0px',\n\t\t\theight: '0px',\n\t\t});\n\t\tselectActive.value = false;\n\t}\n\n\tfunction _getSelectionBox(event: MouseEvent) {\n\t\tconst [x, y] = getMousePositionWithinNodeView(event);\n\t\treturn {\n\t\t\tx: Math.min(x, selectBox.value.x),\n\t\t\ty: Math.min(y, selectBox.value.y),\n\t\t\twidth: Math.abs(x - selectBox.value.x),\n\t\t\theight: Math.abs(y - selectBox.value.y),\n\t\t};\n\t}\n\n\tfunction _getNodesInSelection(event: MouseEvent): INodeUi[] {\n\t\tconst returnNodes: INodeUi[] = [];\n\t\tconst selectionBox = _getSelectionBox(event);\n\n\t\t// Go through all nodes and check if they are selected\n\t\tworkflowsStore.allNodes.forEach((node: INodeUi) => {\n\t\t\t// TODO: Currently always uses the top left corner for checking. Should probably use the center instead\n\t\t\tif (\n\t\t\t\tnode.position[0] < selectionBox.x ||\n\t\t\t\tnode.position[0] > selectionBox.x + selectionBox.width\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnode.position[1] < selectionBox.y ||\n\t\t\t\tnode.position[1] > selectionBox.y + selectionBox.height\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturnNodes.push(node);\n\t\t});\n\n\t\treturn returnNodes;\n\t}\n\n\tfunction _createSelectBox() {\n\t\tselectBox.value.id = 'select-box';\n\t\t_setSelectBoxStyle({\n\t\t\tmargin: '0px auto',\n\t\t\tborder: '2px dotted #FF0000',\n\t\t\t// Positioned absolutely within #node-view. This is consistent with how nodes are positioned.\n\t\t\tposition: 'absolute',\n\t\t\tzIndex: '100',\n\t\t\tvisibility: 'hidden',\n\t\t});\n\n\t\tselectBox.value.addEventListener('mouseup', mouseUpMouseSelect);\n\n\t\tconst nodeViewEl = document.querySelector('#node-view') as HTMLDivElement;\n\t\tnodeViewEl.appendChild(selectBox.value);\n\t}\n\n\tfunction _mouseMoveSelect(e: MouseEvent) {\n\t\tif (e.buttons === 0) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tmouseUpMouseSelect(e);\n\t\t\treturn;\n\t\t}\n\n\t\t_updateSelectBox(e);\n\t}\n\n\tfunction mouseUpMouseSelect(e: MouseEvent) {\n\t\t// Ignore right-click\n\t\tif (e.button === 2 || isContextMenuOpen.value) return;\n\n\t\tif (!selectActive.value) {\n\t\t\tif (isTouchDevice && e.target instanceof HTMLElement) {\n\t\t\t\tif (e.target && e.target.id.includes('node-view')) {\n\t\t\t\t\t// Deselect all nodes\n\t\t\t\t\tdeselectAllNodes();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\t\tdocument.removeEventListener('mousemove', _mouseMoveSelect);\n\n\t\t// Deselect all nodes\n\t\tdeselectAllNodes();\n\n\t\t// Select the nodes which are in the selection box\n\t\tconst selectedNodes = _getNodesInSelection(e);\n\t\tselectedNodes.forEach((node) => {\n\t\t\tnodeSelected(node);\n\t\t});\n\n\t\tif (selectedNodes.length === 1) {\n\t\t\tuiStore.lastSelectedNode = selectedNodes[0].name;\n\t\t}\n\n\t\t_hideSelectBox();\n\t}\n\tfunction mouseDownMouseSelect(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (isCtrlKeyPressed(e) || moveButtonPressed || e.button === 2) {\n\t\t\t// We only care about it when the ctrl key is not pressed at the same time.\n\t\t\t// So we exit when it is pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\t\t_showSelectBox(e);\n\n\t\t// Leave like this.\n\t\t// Do not add an anonymous function because then remove would not work anymore\n\t\tdocument.addEventListener('mousemove', _mouseMoveSelect);\n\t}\n\n\tfunction getMousePositionWithinNodeView(event: MouseEvent | TouchEvent): XYPosition {\n\t\tconst mousePosition = getMousePosition(event);\n\n\t\tconst [relativeX, relativeY] = canvasStore.canvasPositionFromPagePosition(mousePosition);\n\t\tconst nodeViewScale = canvasStore.nodeViewScale;\n\t\tconst nodeViewOffsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\treturn getRelativePosition(relativeX, relativeY, nodeViewScale, nodeViewOffsetPosition);\n\t}\n\n\tfunction nodeDeselected(node: INodeUi) {\n\t\tuiStore.removeNodeFromSelection(node);\n\t\tinstance.value.removeFromDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction nodeSelected(node: INodeUi) {\n\t\tuiStore.addSelectedNode(node);\n\t\tinstance.value.addToDragSelection(instance.value.getManagedElement(node?.id));\n\t}\n\n\tfunction deselectAllNodes() {\n\t\tinstance.value.clearDragSelection();\n\t\tuiStore.resetSelectedNodes();\n\t\tuiStore.lastSelectedNode = null;\n\t\tuiStore.lastSelectedNodeOutputIndex = null;\n\n\t\tcanvasStore.lastSelectedConnection = null;\n\t\tcanvasStore.newNodeInsertPosition = null;\n\t}\n\n\tconst instance = computed(() => canvasStore.jsPlumbInstance);\n\n\tonMounted(() => {\n\t\t_createSelectBox();\n\t});\n\n\treturn {\n\t\tselectActive,\n\t\tgetMousePositionWithinNodeView,\n\t\tmouseUpMouseSelect,\n\t\tmouseDownMouseSelect,\n\t\tnodeDeselected,\n\t\tnodeSelected,\n\t\tdeselectAllNodes,\n\t};\n}\n","import { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\n\nexport function useUniqueNodeName() {\n\t/**\n\t * All in-store node name defaults ending with a number, e.g.\n\t * `AWS S3`, `Magento 2`, `MSG91`, `S3`, `SIGNL4`, `sms77`\n\t */\n\tfunction numberSuffixedNames() {\n\t\treturn useNodeTypesStore().allNodeTypes.reduce<string[]>((acc, nodeType) => {\n\t\t\tif (typeof nodeType.defaults.name !== 'string') {\n\t\t\t\tthrow new Error('Expected node name default to be a string');\n\t\t\t}\n\n\t\t\tif (/\\d$/.test(nodeType.defaults.name)) acc.push(nodeType.defaults.name);\n\n\t\t\treturn acc;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Create a unique node name from an original name, based on the names of\n\t * all nodes on canvas and any extra names that cannot be used.\n\t */\n\tfunction uniqueNodeName(originalName: string, extraNames: string[] = []) {\n\t\tconst { canvasNames } = useWorkflowsStore();\n\n\t\tconst isUnique = !canvasNames.has(originalName) && !extraNames.includes(originalName);\n\n\t\tif (isUnique) return originalName;\n\n\t\tconst nsn = numberSuffixedNames().find((nsn) => originalName.startsWith(nsn));\n\n\t\t// edge case, number suffix as part of name: S3 -> S31 -> S32\n\n\t\tif (nsn) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst remainder = originalName.split(nsn).pop();\n\n\t\t\tconst lastChar = remainder?.[remainder.length - 1];\n\n\t\t\tif (lastChar && Number.isInteger(Number(lastChar))) {\n\t\t\t\tindex = parseInt(lastChar, 10);\n\t\t\t\toriginalName = originalName.slice(0, -1);\n\t\t\t}\n\n\t\t\tunique = originalName;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = originalName + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// edge case, all-number name: 123 -> 123-1 -> 123-2\n\n\t\tif (/^\\d+-?\\d*$/.test(originalName)) {\n\t\t\tlet unique = '';\n\t\t\tlet index = 1;\n\n\t\t\tconst match = originalName.match(/(?<base>\\d+)-?(?<suffix>\\d*)/);\n\n\t\t\tif (!match?.groups) {\n\t\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t\t}\n\n\t\t\tif (match?.groups?.suffix !== '') {\n\t\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t\t}\n\n\t\t\tunique = match.groups.base;\n\n\t\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\t\tunique = match.groups.base + '-' + index++;\n\t\t\t}\n\n\t\t\treturn unique;\n\t\t}\n\n\t\t// normal case: A -> A1 -> A2\n\n\t\tlet unique = '';\n\t\tlet index = 1;\n\n\t\tconst match = originalName.match(/(?<base>.*\\D+)(?<suffix>\\d*)/);\n\n\t\tif (!match?.groups) {\n\t\t\tthrow new Error('Failed to find match for unique name');\n\t\t}\n\n\t\tif (match?.groups?.suffix !== '') {\n\t\t\tindex = parseInt(match.groups.suffix, 10);\n\t\t}\n\n\t\tunique = match.groups.base;\n\n\t\twhile (canvasNames.has(unique) || extraNames.includes(unique)) {\n\t\t\tunique = match.groups.base + index++;\n\t\t}\n\n\t\treturn unique;\n\t}\n\n\treturn { uniqueNodeName };\n}\n","<template>\n\t<span :class=\"$style.container\" data-test-id=\"node-title-container\" @click=\"onEdit\">\n\t\t<span :class=\"$style.iconWrapper\"><NodeIcon :node-type=\"nodeType\" :size=\"18\" /></span>\n\t\t<n8n-popover placement=\"right\" width=\"200\" :visible=\"editName\" :disabled=\"!editable\">\n\t\t\t<div\n\t\t\t\t:class=\"$style.editContainer\"\n\t\t\t\t@keydown.enter=\"onRename\"\n\t\t\t\t@keydown.stop\n\t\t\t\t@keydown.esc=\"editName = false\"\n\t\t\t>\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-base\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('ndv.title.renameNode')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-input ref=\"input\" v-model=\"newName\" size=\"small\" data-test-id=\"node-rename-input\" />\n\t\t\t\t<div :class=\"$style.editButtons\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.cancel')\"\n\t\t\t\t\t\t@click=\"editName = false\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.title.rename')\"\n\t\t\t\t\t\t@click=\"onRename\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<template #reference>\n\t\t\t\t<div :class=\"{ [$style.title]: true, [$style.hoverable]: editable }\">\n\t\t\t\t\t{{ modelValue }}\n\t\t\t\t\t<div :class=\"$style.editIconContainer\">\n\t\t\t\t\t\t<font-awesome-icon v-if=\"editable\" :class=\"$style.editIcon\" icon=\"pencil-alt\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</n8n-popover>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'NodeTitle',\n\tcomponents: {\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\teditName: false,\n\t\t\tnewName: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\teditable(): boolean {\n\t\t\treturn !this.readOnly && window === window.parent;\n\t\t},\n\t},\n\tmethods: {\n\t\tasync onEdit() {\n\t\t\tthis.newName = this.modelValue;\n\t\t\tthis.editName = true;\n\t\t\tawait this.$nextTick();\n\t\t\tconst inputRef = this.$refs.input as HTMLInputElement | undefined;\n\t\t\tif (inputRef) {\n\t\t\t\tinputRef.focus();\n\t\t\t}\n\t\t},\n\t\tonRename() {\n\t\t\tif (this.newName.trim() !== '') {\n\t\t\t\tthis.$emit('update:modelValue', this.newName.trim());\n\t\t\t}\n\n\t\t\tthis.editName = false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tfont-weight: var(--font-weight-bold);\n\tdisplay: flex;\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-compact);\n\toverflow-wrap: anywhere;\n\tpadding-right: var(--spacing-s);\n\toverflow: hidden;\n}\n\n.title {\n\tmax-height: 100px;\n\tdisplay: -webkit-box;\n\t-webkit-line-clamp: 5;\n\t-webkit-box-orient: vertical;\n\tcolor: var(--color-text-dark);\n}\n\n.hoverable {\n\t&:hover {\n\t\tcursor: pointer;\n\t\t.editIcon {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n\n.iconWrapper {\n\tdisplay: inline-flex;\n\tmargin-right: var(--spacing-2xs);\n}\n\n.editIcon {\n\tdisplay: none;\n\tfont-size: var(--font-size-xs);\n\tcolor: var(--color-text-base);\n\tposition: absolute;\n\tbottom: 0;\n}\n\n.editIconContainer {\n\tdisplay: inline-block;\n\tposition: relative;\n\twidth: 0;\n}\n\n.editButtons {\n\ttext-align: right;\n\tmargin-top: var(--spacing-s);\n\n\t> * {\n\t\tmargin-left: var(--spacing-4xs);\n\t}\n}\n\n.editContainer {\n\ttext-align: left;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-4xs);\n\t}\n}\n</style>\n","<template>\n\t<n8n-tabs\n\t\t:options=\"options\"\n\t\t:model-value=\"modelValue\"\n\t\t@update:model-value=\"onTabSelect\"\n\t\t@tooltip-click=\"onTooltipClick\"\n\t/>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tBUILTIN_NODES_DOCS_URL,\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tNPM_PACKAGE_DOCS_BASE_URL,\n} from '@/constants';\nimport type { INodeUi, ITab } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\n\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\n\nexport default defineComponent({\n\tname: 'NodeSettingsTabs',\n\tprops: {\n\t\tmodelValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t\tnodeType: {},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst externalHooks = useExternalHooks();\n\t\treturn {\n\t\t\texternalHooks,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore, useWorkflowsStore),\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdocumentationUrl(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\n\t\t\tif (!nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (nodeType.documentationUrl && nodeType.documentationUrl.startsWith('http')) {\n\t\t\t\treturn nodeType.documentationUrl;\n\t\t\t}\n\n\t\t\tconst utmTags =\n\t\t\t\t'?utm_source=n8n_app&utm_medium=node_settings_modal-credential_link' +\n\t\t\t\t'&utm_campaign=' +\n\t\t\t\tnodeType.name;\n\n\t\t\t// Built-in node documentation available via its codex entry\n\t\t\tconst primaryDocUrl = nodeType.codex?.resources?.primaryDocumentation?.[0]?.url;\n\t\t\tif (primaryDocUrl) {\n\t\t\t\treturn primaryDocUrl + utmTags;\n\t\t\t}\n\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\treturn `${NPM_PACKAGE_DOCS_BASE_URL}${nodeType.name.split('.')[0]}`;\n\t\t\t}\n\n\t\t\t// Fallback to the root of the node documentation\n\t\t\treturn BUILTIN_NODES_DOCS_URL + utmTags;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription | null;\n\t\t\tif (nodeType) {\n\t\t\t\treturn isCommunityPackageName(nodeType.name);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tpackageName(): string {\n\t\t\tconst nodeType = this.nodeType as INodeTypeDescription;\n\t\t\treturn nodeType.name.split('.')[0];\n\t\t},\n\t\toptions(): ITab[] {\n\t\t\tconst options: ITab[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.parameters'),\n\t\t\t\t\tvalue: 'params',\n\t\t\t\t},\n\t\t\t];\n\t\t\tif (this.documentationUrl) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: this.$locale.baseText('nodeSettings.docs'),\n\t\t\t\t\tvalue: 'docs',\n\t\t\t\t\thref: this.documentationUrl,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.isCommunityNode) {\n\t\t\t\toptions.push({\n\t\t\t\t\ticon: 'cube',\n\t\t\t\t\tvalue: 'communityNode',\n\t\t\t\t\talign: 'right',\n\t\t\t\t\ttooltip: this.$locale.baseText('generic.communityNode.tooltip', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdocUrl: COMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\t\t\t\t\tpackageName: this.packageName,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t}\n\t\t\t// If both tabs have align right, both will have excessive left margin\n\t\t\tconst pushCogRight = this.isCommunityNode ? false : true;\n\t\t\toptions.push({\n\t\t\t\ticon: 'cog',\n\t\t\t\tvalue: 'settings',\n\t\t\t\talign: pushCogRight ? 'right' : undefined,\n\t\t\t});\n\n\t\t\treturn options;\n\t\t},\n\t},\n\tmethods: {\n\t\tonTabSelect(tab: string) {\n\t\t\tif (tab === 'docs' && this.nodeType) {\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.onDocumentationUrlClick', {\n\t\t\t\t\tnodeType: this.nodeType as INodeTypeDescription,\n\t\t\t\t\tdocumentationUrl: this.documentationUrl,\n\t\t\t\t});\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'docs',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' && this.nodeType) {\n\t\t\t\tthis.$telemetry.track('User viewed node settings', {\n\t\t\t\t\tnode_type: (this.nodeType as INodeTypeDescription).name,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (tab === 'settings' || tab === 'params') {\n\t\t\t\tthis.$emit('update:modelValue', tab);\n\t\t\t}\n\t\t},\n\t\tonTooltipClick(tab: string, event: MouseEvent) {\n\t\t\tif (tab === 'communityNode' && (event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr docs link', { source: 'node details view' });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n#communityNode > div {\n\tcursor: auto;\n\n\t&:hover {\n\t\tcolor: unset;\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"webhooksNode.length && visibleWebhookUrls.length > 0\" class=\"webhooks\">\n\t\t<div\n\t\t\tclass=\"clickable headline\"\n\t\t\t:class=\"{ expanded: !isMinimized }\"\n\t\t\t:title=\"isMinimized ? baseText.clickToDisplay : baseText.clickToHide\"\n\t\t\t@click=\"isMinimized = !isMinimized\"\n\t\t>\n\t\t\t<font-awesome-icon icon=\"angle-right\" class=\"minimize-button minimize-icon\" />\n\t\t\t{{ baseText.toggleTitle }}\n\t\t</div>\n\t\t<el-collapse-transition>\n\t\t\t<div v-if=\"!isMinimized\" class=\"node-webhooks\">\n\t\t\t\t<div v-if=\"!isProductionOnly\" class=\"url-selection\">\n\t\t\t\t\t<el-row>\n\t\t\t\t\t\t<el-col :span=\"24\">\n\t\t\t\t\t\t\t<n8n-radio-buttons v-model=\"showUrlFor\" :options=\"urlOptions\" />\n\t\t\t\t\t\t</el-col>\n\t\t\t\t\t</el-row>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-for=\"(webhook, index) in visibleWebhookUrls\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"baseText.clickToCopy\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"isWebhookMethodVisible(webhook)\" class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"http-field\">\n\t\t\t\t\t\t\t<div class=\"http-method\">{{ getWebhookHttpMethod(webhook) }}<br /></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"url-field\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"webhook-wrapper\">\n\t\t\t\t\t\t<div class=\"url-field-full-width\">\n\t\t\t\t\t\t\t<div class=\"webhook-url left-ellipsis clickable\" @click=\"copyWebhookUrl(webhook)\">\n\t\t\t\t\t\t\t\t{{ getWebhookUrlDisplay(webhook) }}<br />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\t\t</el-collapse-transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { INodeTypeDescription, IWebhookDescription } from 'n8n-workflow';\nimport { defineComponent } from 'vue';\n\nimport { useToast } from '@/composables/useToast';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tOPEN_URL_PANEL_TRIGGER_NODE_TYPES,\n\tPRODUCTION_ONLY_TRIGGER_NODE_TYPES,\n} from '@/constants';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tname: 'NodeWebhooks',\n\tprops: [\n\t\t'node', // NodeUi\n\t\t'nodeType', // INodeTypeDescription\n\t],\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst clipboard = useClipboard();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\treturn {\n\t\t\tclipboard,\n\t\t\tworkflowHelpers,\n\t\t\t...useToast(),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisMinimized: this.nodeType && !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name),\n\t\t\tshowUrlFor: 'test',\n\t\t};\n\t},\n\tcomputed: {\n\t\tisProductionOnly(): boolean {\n\t\t\treturn this.nodeType && PRODUCTION_ONLY_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t\turlOptions(): Array<{ label: string; value: string }> {\n\t\t\treturn [\n\t\t\t\t...(this.isProductionOnly ? [] : [{ label: this.baseText.testUrl, value: 'test' }]),\n\t\t\t\t{\n\t\t\t\t\tlabel: this.baseText.productionUrl,\n\t\t\t\t\tvalue: 'production',\n\t\t\t\t},\n\t\t\t];\n\t\t},\n\t\tvisibleWebhookUrls(): IWebhookDescription[] {\n\t\t\treturn this.webhooksNode.filter((webhook) => {\n\t\t\t\tif (typeof webhook.ndvHideUrl === 'string') {\n\t\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideUrl');\n\t\t\t\t}\n\n\t\t\t\treturn !webhook.ndvHideUrl;\n\t\t\t});\n\t\t},\n\t\twebhooksNode(): IWebhookDescription[] {\n\t\t\tif (this.nodeType === null || this.nodeType.webhooks === undefined) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn (this.nodeType as INodeTypeDescription).webhooks!.filter(\n\t\t\t\t(webhookData) => webhookData.restartWebhook !== true,\n\t\t\t);\n\t\t},\n\t\tbaseText() {\n\t\t\tconst nodeType = this.nodeType.name;\n\t\t\tswitch (nodeType) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.chatTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.chatTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.chatTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.chatTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeWebhooks.clickToDisplayWebhookUrls.formTrigger',\n\t\t\t\t\t\t),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls.formTrigger'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls.formTrigger'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title.formTrigger'),\n\t\t\t\t\t\tcopyMessage: this.$locale.baseText('nodeWebhooks.showMessage.message.formTrigger'),\n\t\t\t\t\t};\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoggleTitle: this.$locale.baseText('nodeWebhooks.webhookUrls'),\n\t\t\t\t\t\tclickToDisplay: this.$locale.baseText('nodeWebhooks.clickToDisplayWebhookUrls'),\n\t\t\t\t\t\tclickToHide: this.$locale.baseText('nodeWebhooks.clickToHideWebhookUrls'),\n\t\t\t\t\t\tclickToCopy: this.$locale.baseText('nodeWebhooks.clickToCopyWebhookUrls'),\n\t\t\t\t\t\ttestUrl: this.$locale.baseText('nodeWebhooks.testUrl'),\n\t\t\t\t\t\tproductionUrl: this.$locale.baseText('nodeWebhooks.productionUrl'),\n\t\t\t\t\t\tcopyTitle: this.$locale.baseText('nodeWebhooks.showMessage.title'),\n\t\t\t\t\t\tcopyMessage: undefined,\n\t\t\t\t\t};\n\t\t\t}\n\t\t},\n\t},\n\twatch: {\n\t\tnode() {\n\t\t\tthis.isMinimized = !OPEN_URL_PANEL_TRIGGER_NODE_TYPES.includes(this.nodeType.name);\n\t\t},\n\t},\n\tmethods: {\n\t\tcopyWebhookUrl(webhookData: IWebhookDescription): void {\n\t\t\tconst webhookUrl = this.getWebhookUrlDisplay(webhookData);\n\t\t\tvoid this.clipboard.copy(webhookUrl);\n\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.baseText.copyTitle,\n\t\t\t\tmessage: this.baseText.copyMessage,\n\t\t\t\ttype: 'success',\n\t\t\t});\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'parameters',\n\t\t\t\ttype: `${this.showUrlFor} url`,\n\t\t\t});\n\t\t},\n\t\tgetWebhookUrlDisplay(webhookData: IWebhookDescription): string {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.workflowHelpers.getWebhookUrl(\n\t\t\t\t\twebhookData,\n\t\t\t\t\tthis.node,\n\t\t\t\t\tthis.isProductionOnly ? 'production' : this.showUrlFor,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tisWebhookMethodVisible(webhook: IWebhookDescription): boolean {\n\t\t\ttry {\n\t\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\t\tif (Array.isArray(method) && method.length !== 1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\n\t\t\tif (typeof webhook.ndvHideMethod === 'string') {\n\t\t\t\treturn !this.workflowHelpers.getWebhookExpressionValue(webhook, 'ndvHideMethod');\n\t\t\t}\n\n\t\t\treturn !webhook.ndvHideMethod;\n\t\t},\n\n\t\tgetWebhookHttpMethod(webhook: IWebhookDescription): string {\n\t\t\tconst method = this.workflowHelpers.getWebhookExpressionValue(webhook, 'httpMethod', false);\n\t\t\tif (Array.isArray(method)) {\n\t\t\t\treturn method[0];\n\t\t\t}\n\t\t\treturn method;\n\t\t},\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.webhooks {\n\tpadding-bottom: var(--spacing-xs);\n\tmargin: var(--spacing-xs) 0;\n\tborder-bottom: 1px solid var(--color-text-lighter);\n\n\t.headline {\n\t\tcolor: $color-primary;\n\t\tfont-weight: 600;\n\t\tfont-size: var(--font-size-2xs);\n\t}\n}\n\n.http-field {\n\tposition: absolute;\n\twidth: 50px;\n\tdisplay: inline-block;\n\ttop: calc(50% - 8px);\n}\n\n.http-method {\n\tbackground-color: var(--color-foreground-xdark);\n\twidth: 40px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 5px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tfont-size: var(--font-size-2xs);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-foreground-xlight);\n}\n\n.minimize-icon {\n\tfont-size: 1.3em;\n\tmargin-right: 0.5em;\n}\n\n.mode-selection-headline {\n\tline-height: 1.8em;\n}\n\n.node-webhooks {\n\tmargin-left: 1em;\n}\n\n.url-field {\n\tdisplay: inline-block;\n\twidth: calc(100% - 60px);\n\tmargin-left: 55px;\n}\n.url-field-full-width {\n\tdisplay: inline-block;\n\tmargin: 5px 10px;\n}\n\n.url-selection {\n\tmargin-top: var(--spacing-xs);\n}\n\n.minimize-button {\n\tdisplay: inline-block;\n\t-webkit-transition-duration: 0.5s;\n\t-moz-transition-duration: 0.5s;\n\t-o-transition-duration: 0.5s;\n\ttransition-duration: 0.5s;\n\n\t-webkit-transition-property: -webkit-transform;\n\t-moz-transition-property: -moz-transform;\n\t-o-transition-property: -o-transform;\n\ttransition-property: transform;\n}\n.expanded .minimize-button {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n\n.webhook-url {\n\tposition: relative;\n\ttop: 0;\n\twidth: 100%;\n\tfont-size: var(--font-size-2xs);\n\twhite-space: normal;\n\toverflow: visible;\n\ttext-overflow: initial;\n\tcolor: var(--color-text-dark);\n\ttext-align: left;\n\tdirection: ltr;\n\tword-break: break-all;\n}\n\n.webhook-wrapper {\n\tline-height: 1.5;\n\tposition: relative;\n\tmargin-top: var(--spacing-xs);\n\tbackground-color: var(--color-foreground-xlight);\n\tborder-radius: 3px;\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<div\n\t\t\t:class=\"$style.connections\"\n\t\t\t:style=\"`--possible-connections: ${possibleConnections.length}`\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for=\"connection in possibleConnections\"\n\t\t\t\t:key=\"connection.type\"\n\t\t\t\t:data-test-id=\"`subnode-connection-group-${connection.type}`\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.connectionType\">\n\t\t\t\t\t<span\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectionLabel]: true,\n\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\tv-text=\"`${connection.displayName}${connection.required ? ' *' : ''}`\"\n\t\t\t\t\t/>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-on-click-outside=\"() => expandConnectionGroup(connection.type, false)\"\n\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t[$style.connectedNodesWrapper]: true,\n\t\t\t\t\t\t\t[$style.connectedNodesWrapperExpanded]: expandedGroups.includes(connection.type),\n\t\t\t\t\t\t}\"\n\t\t\t\t\t\t:style=\"`--nodes-length: ${connectedNodes[connection.type].length}`\"\n\t\t\t\t\t\t@click=\"expandConnectionGroup(connection.type, true)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1 ? connection.maxConnections !== 1 : true\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.plusButton]: true,\n\t\t\t\t\t\t\t\t[$style.hasIssues]: hasInputIssues(connection.type),\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"onPlusClick(connection.type)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t\t\tshouldShowConnectionTooltip(connection.type) &&\n\t\t\t\t\t\t\t\t\tconnectedNodes[connection.type].length >= 1\n\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\tAdd {{ connection.displayName }}\n\t\t\t\t\t\t\t\t\t<template v-if=\"hasInputIssues(connection.type)\">\n\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t:items=\"nodeInputIssues[connection.type]\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t\t\t\ticon=\"plus\"\n\t\t\t\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t\t\t\t:data-test-id=\"`add-subnode-${connection.type}`\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"connectedNodes[connection.type].length > 0\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t[$style.connectedNodes]: true,\n\t\t\t\t\t\t\t\t[$style.connectedNodesMultiple]: connectedNodes[connection.type].length > 1,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tv-for=\"(node, index) in connectedNodes[connection.type]\"\n\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t:class=\"{ [$style.nodeWrapper]: true, [$style.hasIssues]: node.issues }\"\n\t\t\t\t\t\t\t\tdata-test-id=\"floating-subnode\"\n\t\t\t\t\t\t\t\t:data-node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t:style=\"`--node-index: ${index}`\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\t\t\t\t:key=\"node.node.name\"\n\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t:teleported=\"true\"\n\t\t\t\t\t\t\t\t\t:offset=\"10\"\n\t\t\t\t\t\t\t\t\t:show-after=\"300\"\n\t\t\t\t\t\t\t\t\t:disabled=\"shouldShowConnectionTooltip(connection.type)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t\t\t{{ node.node.name }}\n\t\t\t\t\t\t\t\t\t\t<template v-if=\"node.issues\">\n\t\t\t\t\t\t\t\t\t\t\t<TitledList\n\t\t\t\t\t\t\t\t\t\t\t\t:title=\"`${$locale.baseText('node.issues')}:`\"\n\t\t\t\t\t\t\t\t\t\t\t\t:items=\"node.issues\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\t\t\t\t\t@click=\"onNodeClick(node.node.name, connection.type)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t\t\t\t\t:node-type=\"node.nodeType\"\n\t\t\t\t\t\t\t\t\t\t\t:node-name=\"node.node.name\"\n\t\t\t\t\t\t\t\t\t\t\ttooltip-position=\"top\"\n\t\t\t\t\t\t\t\t\t\t\t:size=\"20\"\n\t\t\t\t\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, ref, watch } from 'vue';\nimport { NodeHelpers } from 'n8n-workflow';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\nimport type { ConnectionTypes, INodeInputConfiguration, INodeTypeDescription } from 'n8n-workflow';\nimport { useDebounce } from '@/composables/useDebounce';\n\ninterface Props {\n\trootNode: INodeUi;\n}\n\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst nodeHelpers = useNodeHelpers();\nconst { debounce } = useDebounce();\nconst emit = defineEmits(['switchSelectedNode', 'openConnectionNodeCreator']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n\tissues: string[];\n}\n\nconst possibleConnections = ref<INodeInputConfiguration[]>([]);\n\nconst expandedGroups = ref<ConnectionTypes[]>([]);\nconst shouldShowNodeInputIssues = ref(false);\n\nconst nodeType = computed(() =>\n\tnodeTypesStore.getNodeType(props.rootNode.type, props.rootNode.typeVersion),\n);\n\nconst nodeData = computed(() => workflowsStore.getNodeByName(props.rootNode.name));\n\nconst workflow = computed(() => workflowsStore.getCurrentWorkflow());\n\nconst nodeInputIssues = computed(() => {\n\tconst issues = nodeHelpers.getNodeIssues(nodeType.value, props.rootNode, workflow.value, [\n\t\t'typeUnknown',\n\t\t'parameters',\n\t\t'credentials',\n\t\t'execution',\n\t]);\n\treturn issues?.input ?? {};\n});\n\nconst connectedNodes = computed<Record<ConnectionTypes, NodeConfig[]>>(() => {\n\treturn possibleConnections.value.reduce(\n\t\t(acc, connection) => {\n\t\t\tconst nodes = getINodesFromNames(\n\t\t\t\tworkflow.value.getParentNodes(props.rootNode.name, connection.type),\n\t\t\t);\n\t\t\treturn { ...acc, [connection.type]: nodes };\n\t\t},\n\t\t{} as Record<ConnectionTypes, NodeConfig[]>,\n\t);\n});\n\nfunction getConnectionConfig(connectionType: ConnectionTypes) {\n\treturn possibleConnections.value.find((c) => c.type === connectionType);\n}\n\nfunction isMultiConnection(connectionType: ConnectionTypes) {\n\tconst connectionConfig = getConnectionConfig(connectionType);\n\treturn connectionConfig?.maxConnections !== 1;\n}\n\nfunction shouldShowConnectionTooltip(connectionType: ConnectionTypes) {\n\treturn isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType);\n}\n\nfunction expandConnectionGroup(connectionType: ConnectionTypes, isExpanded: boolean) {\n\t// If the connection is a single connection, we don't need to expand the group\n\tif (!isMultiConnection(connectionType)) {\n\t\treturn;\n\t}\n\n\tif (isExpanded) {\n\t\texpandedGroups.value = [...expandedGroups.value, connectionType];\n\t} else {\n\t\texpandedGroups.value = expandedGroups.value.filter((g) => g !== connectionType);\n\t}\n}\n\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst matchedNodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (matchedNodeType) {\n\t\t\t\t\tconst issues = nodeHelpers.getNodeIssues(matchedNodeType, node, workflow.value);\n\t\t\t\t\tconst stringifiedIssues = issues ? NodeHelpers.nodeIssuesToString(issues, node) : '';\n\t\t\t\t\treturn { node, nodeType: matchedNodeType, issues: stringifiedIssues };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\n\nfunction hasInputIssues(connectionType: ConnectionTypes) {\n\treturn (\n\t\tshouldShowNodeInputIssues.value && (nodeInputIssues.value[connectionType] ?? []).length > 0\n\t);\n}\n\nfunction isNodeInputConfiguration(\n\tconnectionConfig: ConnectionTypes | INodeInputConfiguration,\n): connectionConfig is INodeInputConfiguration {\n\tif (typeof connectionConfig === 'string') return false;\n\n\treturn 'type' in connectionConfig;\n}\n\nfunction getPossibleSubInputConnections(): INodeInputConfiguration[] {\n\tif (!nodeType.value || !props.rootNode) return [];\n\n\tconst inputs = NodeHelpers.getNodeInputs(workflow.value, props.rootNode, nodeType.value);\n\n\tconst nonMainInputs = inputs.filter((input): input is INodeInputConfiguration => {\n\t\tif (!isNodeInputConfiguration(input)) return false;\n\n\t\treturn input.type !== 'main';\n\t});\n\n\treturn nonMainInputs;\n}\n\nfunction onNodeClick(nodeName: string, connectionType: ConnectionTypes) {\n\tif (isMultiConnection(connectionType) && !expandedGroups.value.includes(connectionType)) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('switchSelectedNode', nodeName);\n}\n\nfunction onPlusClick(connectionType: ConnectionTypes) {\n\tconst connectionNodes = connectedNodes.value[connectionType];\n\tif (\n\t\tisMultiConnection(connectionType) &&\n\t\t!expandedGroups.value.includes(connectionType) &&\n\t\tconnectionNodes.length >= 1\n\t) {\n\t\texpandConnectionGroup(connectionType, true);\n\t\treturn;\n\t}\n\n\temit('openConnectionNodeCreator', props.rootNode.name, connectionType);\n}\n\nfunction showNodeInputsIssues() {\n\tshouldShowNodeInputIssues.value = false;\n\t// Reset animation\n\tsetTimeout(() => {\n\t\tshouldShowNodeInputIssues.value = true;\n\t}, 0);\n}\n\nwatch(\n\tnodeData,\n\tdebounce(\n\t\t() =>\n\t\t\tsetTimeout(() => {\n\t\t\t\texpandedGroups.value = [];\n\t\t\t\tpossibleConnections.value = getPossibleSubInputConnections();\n\t\t\t}, 0),\n\t\t{ debounceTime: 1000 },\n\t),\n\t{ immediate: true },\n);\n\ndefineExpose({\n\tshowNodeInputsIssues,\n});\n</script>\n\n<style lang=\"scss\" module>\n@keyframes horizontal-shake {\n\t0% {\n\t\ttransform: translateX(0);\n\t}\n\t25% {\n\t\ttransform: translateX(5px);\n\t}\n\t50% {\n\t\ttransform: translateX(-5px);\n\t}\n\t75% {\n\t\ttransform: translateX(5px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n.container {\n\t--node-size: 45px;\n\t--plus-button-size: 30px;\n\t--animation-duration: 150ms;\n\t--collapsed-offset: 10px;\n\tpadding-top: calc(var(--node-size) + var(--spacing-3xs));\n}\n.connections {\n\t// Make sure container has matching height if there's no connections\n\t// since the plus button is absolutely positioned\n\tmin-height: calc(var(--node-size) + var(--spacing-m));\n\tposition: absolute;\n\tbottom: calc((var(--node-size) / 2) * -1);\n\tleft: 0;\n\tright: 0;\n\tuser-select: none;\n\tjustify-content: space-between;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(var(--possible-connections), 1fr);\n}\n.connectionType {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\ttransition: all calc((var(--animation-duration) - 50ms)) ease;\n}\n.connectionLabel {\n\tmargin-bottom: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\tuser-select: none;\n\ttext-wrap: nowrap;\n\n\t&.hasIssues {\n\t\tcolor: var(--color-danger);\n\t}\n}\n.connectedNodesWrapper {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: space-between;\n\tposition: relative;\n}\n.plusButton {\n\ttransition: all var(--animation-duration) ease;\n\tposition: absolute;\n\ttop: var(--spacing-2xs);\n\n\t&.hasIssues {\n\t\tanimation: horizontal-shake 500ms;\n\t\tbutton {\n\t\t\t--button-font-color: var(--color-danger);\n\t\t\t--button-border-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:last-child) {\n\t\tz-index: 1;\n\t\tright: 100%;\n\t\tmargin-right: calc((var(--plus-button-size) * -1) * 0.9);\n\t\tpointer-events: none;\n\n\t\t.connectedNodesWrapperExpanded & {\n\t\t\t// left: 100%;\n\t\t\tmargin-right: var(--spacing-2xs);\n\t\t\topacity: 1;\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n}\n\n.connectedNodesMultiple {\n\ttransition: all var(--animation-duration) ease;\n}\n.connectedNodesWrapperExpanded {\n\tz-index: 1;\n}\n// Hide all other connection groups when one is expanded\n.connections:has(.connectedNodesWrapperExpanded)\n\t.connectionType:not(:has(.connectedNodesWrapperExpanded)) {\n\topacity: 0;\n\tpointer-events: none;\n\tvisibility: hidden;\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-xs);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: all var(--animation-duration) ease;\n\tposition: relative;\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n}\n.connectedNodes {\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-right: calc(\n\t\t(var(--nodes-length) - 1) * (-1 * (var(--node-size) - var(--collapsed-offset)))\n\t);\n\t.connectedNodesWrapperExpanded & {\n\t\tmargin-right: 0;\n\t\t// Negative margin to offset the absolutely positioned plus button\n\t\t// when the nodes are expanded to center the nodes\n\t\tmargin-right: calc((var(--spacing-2xs) + var(--plus-button-size)) * -1);\n\t}\n}\n.nodeWrapper {\n\ttransition: all var(--animation-duration) ease;\n\ttransform-origin: center;\n\tz-index: 1;\n\t.connectedNodesWrapperExpanded &:not(:first-child) {\n\t\tmargin-left: var(--spacing-2xs);\n\t}\n\t&.hasIssues {\n\t\t.connectedNode {\n\t\t\tborder-width: calc(var(--border-width-base) * 2);\n\t\t\tborder-color: var(--color-danger);\n\t\t}\n\t}\n\n\t&:not(:first-child) {\n\t\ttransform: translateX(\n\t\t\tcalc(var(--node-index) * (-1 * (var(--node-size) - var(--collapsed-offset))))\n\t\t);\n\t}\n\n\t.connectedNodesWrapperExpanded & {\n\t\ttransform: translateX(0);\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<n8n-tooltip placement=\"bottom\" :disabled=\"!disabledHint\">\n\t\t\t<template #content>\n\t\t\t\t<div>{{ disabledHint }}</div>\n\t\t\t</template>\n\t\t\t<div>\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-bind=\"$attrs\"\n\t\t\t\t\t:loading=\"nodeRunning && !isListeningForEvents && !isListeningForWorkflowEvents\"\n\t\t\t\t\t:disabled=\"disabled || !!disabledHint\"\n\t\t\t\t\t:label=\"buttonLabel\"\n\t\t\t\t\t:type=\"type\"\n\t\t\t\t\t:size=\"size\"\n\t\t\t\t\t:icon=\"!isListeningForEvents && !hideIcon ? 'flask' : undefined\"\n\t\t\t\t\t:transparent-background=\"transparent\"\n\t\t\t\t\t:title=\"!isTriggerNode ? $locale.baseText('ndv.execute.testNode.description') : ''\"\n\t\t\t\t\t@click=\"onClick\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tWEBHOOK_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tMODAL_CONFIRM,\n\tFORM_TRIGGER_NODE_TYPE,\n\tCHAT_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { nodeViewEventBus } from '@/event-bus';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useRouter } from 'vue-router';\n\nexport default defineComponent({\n\tinheritAttrs: false,\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tlabel: {\n\t\t\ttype: String,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tsize: {\n\t\t\ttype: String,\n\t\t},\n\t\ttransparent: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\ttelemetrySource: {\n\t\t\ttype: String,\n\t\t},\n\t\thideIcon: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\temits: ['stopExecution', 'execute'],\n\tsetup(props) {\n\t\tconst router = useRouter();\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst node = workflowsStore.getNodeByName(props.nodeName);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tpinnedData,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tnodeRunning(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\t(this.workflowsStore.isNodeExecuting(this.node.name) || triggeredNode === this.node.name)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tisManualTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === MANUAL_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === CHAT_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisChatChild(): boolean {\n\t\t\treturn this.workflowsStore.checkIfNodeHasChatParent(this.nodeName);\n\t\t},\n\t\tisFormTriggerNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === FORM_TRIGGER_NODE_TYPE);\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!this.nodeType?.group.includes('schedule');\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.nodeType && this.nodeType.name === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\n\t\t\treturn (\n\t\t\t\tthis.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tisListeningForWorkflowEvents(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.nodeRunning &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isScheduleTrigger &&\n\t\t\t\t!this.isManualTriggerNode\n\t\t\t);\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tdisabledHint(): string {\n\t\t\tif (this.isListeningForEvents) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.node.disabled) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.nodeIsDisabled');\n\t\t\t}\n\n\t\t\tif (this.isTriggerNode && this.hasIssues) {\n\t\t\t\tconst activeNode = this.ndvStore.activeNode;\n\t\t\t\tif (activeNode && activeNode.name !== this.nodeName) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.execute.fixPrevious');\n\t\t\t\t}\n\n\t\t\t\treturn this.$locale.baseText('ndv.execute.requiredFieldsMissing');\n\t\t\t}\n\n\t\t\tif (this.workflowRunning && !this.nodeRunning) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.workflowAlreadyRunning');\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tbuttonLabel(): string {\n\t\t\tif (this.isListeningForEvents || this.isListeningForWorkflowEvents) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.stopListening');\n\t\t\t}\n\n\t\t\tif (this.label) {\n\t\t\t\treturn this.label;\n\t\t\t}\n\n\t\t\tif (this.isChatNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testChat');\n\t\t\t}\n\n\t\t\tif (this.isWebhookNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.listenForTestEvent');\n\t\t\t}\n\n\t\t\tif (this.isFormTriggerNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.testStep');\n\t\t\t}\n\n\t\t\tif (this.isPollingTypeNode || this.nodeType?.mockManualExecution) {\n\t\t\t\treturn this.$locale.baseText('ndv.execute.fetchEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('ndv.execute.testNode');\n\t\t},\n\t},\n\tmethods: {\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('ndv.execute.stopWaitingForWebhook.error'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\tasync onClick() {\n\t\t\t// Show chat if it's a chat node or a child of a chat node with no input data\n\t\t\tif (this.isChatNode || (this.isChatChild && this.ndvStore.isNDVDataEmpty('input'))) {\n\t\t\t\tthis.ndvStore.setActiveNodeName(null);\n\t\t\t\tnodeViewEventBus.emit('openChat');\n\t\t\t} else if (this.isListeningForEvents) {\n\t\t\t\tawait this.stopWaitingForWebhook();\n\t\t\t} else if (this.isListeningForWorkflowEvents) {\n\t\t\t\tawait this.stopCurrentExecution();\n\t\t\t\tthis.$emit('stopExecution');\n\t\t\t} else {\n\t\t\t\tlet shouldUnpinAndExecute = false;\n\t\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\t\tconst confirmResult = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.description'),\n\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.unpinAndExecute.title'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.confirm'),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.unpinAndExecute.cancel'),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tshouldUnpinAndExecute = confirmResult === MODAL_CONFIRM;\n\n\t\t\t\t\tif (shouldUnpinAndExecute && this.node) {\n\t\t\t\t\t\tthis.pinnedData.unsetData('unpin-and-execute-modal');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!this.pinnedData.hasData.value || shouldUnpinAndExecute) {\n\t\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\t\tnode_type: this.nodeType ? this.nodeType.name : null,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tsource: this.telemetrySource,\n\t\t\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t\t\t};\n\t\t\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\t\t\tawait this.externalHooks.run('nodeExecuteButton.onClick', telemetryPayload);\n\n\t\t\t\t\tawait this.runWorkflow({\n\t\t\t\t\t\tdestinationNode: this.nodeName,\n\t\t\t\t\t\tsource: 'RunData.ExecuteNodeButton',\n\t\t\t\t\t});\n\t\t\t\t\tthis.$emit('execute');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<div\n\t\t:class=\"{\n\t\t\t'node-settings': true,\n\t\t\tdragging: dragging,\n\t\t}\"\n\t\t@keydown.stop\n\t>\n\t\t<div :class=\"$style.header\">\n\t\t\t<div class=\"header-side-menu\">\n\t\t\t\t<NodeTitle\n\t\t\t\t\tv-if=\"node\"\n\t\t\t\t\tclass=\"node-name\"\n\t\t\t\t\t:model-value=\"node.name\"\n\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t@update:model-value=\"nameChanged\"\n\t\t\t\t></NodeTitle>\n\t\t\t\t<div v-if=\"isExecutable\">\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tv-if=\"!blockUI && node && nodeValid\"\n\t\t\t\t\t\tdata-test-id=\"node-execute-button\"\n\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t:disabled=\"outputPanelEditMode.enabled && !isTriggerNode\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\ttelemetry-source=\"parameters\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeSettingsTabs\n\t\t\t\tv-if=\"node && nodeValid\"\n\t\t\t\tv-model=\"openPanel\"\n\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"node && !nodeValid\" class=\"node-is-not-valid\">\n\t\t\t<p :class=\"$style.warningIcon\">\n\t\t\t\t<font-awesome-icon icon=\"exclamation-triangle\" />\n\t\t\t</p>\n\t\t\t<div class=\"missingNodeTitleContainer mt-s mb-xs\">\n\t\t\t\t<n8n-text size=\"large\" color=\"text-dark\" bold>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.title') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-if=\"isCommunityNode\" :class=\"$style.descriptionContainer\">\n\t\t\t\t<div class=\"mb-l\">\n\t\t\t\t\t<i18n-t\n\t\t\t\t\t\tkeypath=\"nodeSettings.communityNodeUnknown.description\"\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\t@click=\"onMissingNodeTextClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #action>\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://www.npmjs.com/package/${node.type.split('.')[0]}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t>{{ node.type.split('.')[0] }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</div>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"COMMUNITY_NODES_INSTALLATION_DOCS_URL\"\n\t\t\t\t\t@click=\"onMissingNodeLearnMoreLinkClick\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('nodeSettings.communityNodeUnknown.installLink.text') }}\n\t\t\t\t</n8n-link>\n\t\t\t</div>\n\t\t\t<i18n-t v-else keypath=\"nodeSettings.nodeTypeUnknown.description\" tag=\"span\">\n\t\t\t\t<template #action>\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"CUSTOM_NODES_DOCS_URL\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\tv-text=\"$locale.baseText('nodeSettings.nodeTypeUnknown.description.customNode')\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</i18n-t>\n\t\t</div>\n\t\t<div v-if=\"node && nodeValid\" class=\"node-parameters-wrapper\" data-test-id=\"node-parameters\">\n\t\t\t<n8n-notice\n\t\t\t\tv-if=\"hasForeignCredential\"\n\t\t\t\t:content=\"\n\t\t\t\t\t$locale.baseText('nodeSettings.hasForeignCredential', {\n\t\t\t\t\t\tinterpolate: { owner: credentialOwnerName },\n\t\t\t\t\t})\n\t\t\t\t\"\n\t\t\t/>\n\t\t\t<div v-show=\"openPanel === 'params'\">\n\t\t\t\t<NodeWebhooks :node=\"node\" :node-type=\"nodeType\" />\n\n\t\t\t\t<ParameterInputList\n\t\t\t\t\tv-if=\"nodeValuesInitialized\"\n\t\t\t\t\t:parameters=\"parametersNoneSetting\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t>\n\t\t\t\t\t<NodeCredentials\n\t\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t\t:readonly=\"isReadOnly\"\n\t\t\t\t\t\t:show-all=\"true\"\n\t\t\t\t\t\t:hide-issues=\"hiddenIssuesInputs.includes('credentials')\"\n\t\t\t\t\t\t@credential-selected=\"credentialSelected\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@blur=\"onParameterBlur\"\n\t\t\t\t\t/>\n\t\t\t\t</ParameterInputList>\n\t\t\t\t<div v-if=\"parametersNoneSetting.length === 0\" class=\"no-parameters\">\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t{{ $locale.baseText('nodeSettings.thisNodeDoesNotHaveAnyParameters') }}\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"nodeHelpers.isCustomApiCallSelected(nodeValues)\"\n\t\t\t\t\tclass=\"parameter-item parameter-notice\"\n\t\t\t\t\tdata-test-id=\"node-parameters-http-notice\"\n\t\t\t\t>\n\t\t\t\t\t<n8n-notice\n\t\t\t\t\t\t:content=\"\n\t\t\t\t\t\t\t$locale.baseText('nodeSettings.useTheHttpRequestNode', {\n\t\t\t\t\t\t\t\tinterpolate: { nodeTypeDisplayName: nodeType.displayName },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-show=\"openPanel === 'settings'\">\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"parametersSetting\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"parameters\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<ParameterInputList\n\t\t\t\t\t:parameters=\"nodeSettings\"\n\t\t\t\t\t:hide-delete=\"true\"\n\t\t\t\t\t:node-values=\"nodeValues\"\n\t\t\t\t\t:is-read-only=\"isReadOnly\"\n\t\t\t\t\t:hidden-issues-inputs=\"hiddenIssuesInputs\"\n\t\t\t\t\tpath=\"\"\n\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t@parameter-blur=\"onParameterBlur\"\n\t\t\t\t/>\n\t\t\t\t<div class=\"node-version\" data-test-id=\"node-version\">\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeSettings.nodeVersion', {\n\t\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\t\tnode: nodeType?.displayName as string,\n\t\t\t\t\t\t\t\tversion: (node.typeVersion ?? latestVersion).toString(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t\t<span>({{ nodeVersionTag }})</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<NDVSubConnections\n\t\t\tv-if=\"node\"\n\t\t\tref=\"subConnections\"\n\t\t\t:root-node=\"node\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t/>\n\t\t<n8n-block-ui :show=\"blockUI\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type {\n\tINodeTypeDescription,\n\tINodeParameters,\n\tINodeProperties,\n\tNodeParameterValue,\n\tConnectionTypes,\n} from 'n8n-workflow';\nimport {\n\tNodeHelpers,\n\tNodeConnectionType,\n\tdeepCopy,\n\tisINodePropertyCollectionList,\n\tisINodePropertiesList,\n\tisINodePropertyOptionsList,\n\tdisplayParameter,\n} from 'n8n-workflow';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tIUsedCredential,\n} from '@/Interface';\n\nimport {\n\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\tCUSTOM_NODES_DOCS_URL,\n\tMAIN_NODE_PANEL_WIDTH,\n\tSHOULD_CLEAR_NODE_OUTPUTS,\n} from '@/constants';\n\nimport NodeTitle from '@/components/NodeTitle.vue';\nimport ParameterInputList from '@/components/ParameterInputList.vue';\nimport NodeCredentials from '@/components/NodeCredentials.vue';\nimport NodeSettingsTabs from '@/components/NodeSettingsTabs.vue';\nimport NodeWebhooks from '@/components/NodeWebhooks.vue';\nimport NDVSubConnections from '@/components/NDVSubConnections.vue';\nimport { get, set, unset } from 'lodash-es';\n\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport { isCommunityPackageName } from '@/utils/nodeTypesUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { RenameNodeCommand } from '@/models/history';\nimport useWorkflowsEEStore from '@/stores/workflows.ee.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport type { EventBus } from 'n8n-design-system';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { importCurlEventBus } from '@/event-bus';\nimport { useToast } from '@/composables/useToast';\n\nexport default defineComponent({\n\tname: 'NodeSettings',\n\tcomponents: {\n\t\tNodeTitle,\n\t\tNodeCredentials,\n\t\tParameterInputList,\n\t\tNodeSettingsTabs,\n\t\tNodeWebhooks,\n\t\tNDVSubConnections,\n\t\tNodeExecuteButton,\n\t},\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst { showMessage } = useToast();\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tshowMessage,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseHistoryStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseUIStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t),\n\t\tisReadOnly(): boolean {\n\t\t\treturn this.readOnly || this.hasForeignCredential;\n\t\t},\n\t\tisExecutable(): boolean {\n\t\t\tif (this.nodeType && this.node) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode!, this.nodeType);\n\t\t\t\tconst inputNames = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tif (!inputNames.includes(NodeConnectionType.Main) && !this.isTriggerNode) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.executable || this.hasForeignCredential;\n\t\t},\n\t\tnodeTypeName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.displayName`,\n\t\t\t\t\tfallback: this.nodeType.name,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tnodeTypeVersions(): number[] {\n\t\t\tif (!this.node) return [];\n\t\t\treturn this.nodeTypesStore.getNodeVersions(this.node.type);\n\t\t},\n\t\tlatestVersion(): number {\n\t\t\treturn Math.max(...this.nodeTypeVersions);\n\t\t},\n\t\tisLatestNodeVersion(): boolean {\n\t\t\treturn !this.node?.typeVersion || this.latestVersion === this.node.typeVersion;\n\t\t},\n\t\tnodeVersionTag(): string {\n\t\t\tif (!this.nodeType || this.nodeType.hidden) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.deprecated');\n\t\t\t}\n\n\t\t\tif (this.isLatestNodeVersion) {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.latest');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeSettings.latestVersion', {\n\t\t\t\tinterpolate: { version: this.latestVersion.toString() },\n\t\t\t});\n\t\t},\n\t\tnodeTypeDescription(): string {\n\t\t\tif (this.nodeType?.description) {\n\t\t\t\tconst shortNodeType = this.$locale.shortNodeType(this.nodeType.name);\n\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: `headers.${shortNodeType}.description`,\n\t\t\t\t\tfallback: this.nodeType.description,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('nodeSettings.noDescriptionFound');\n\t\t\t}\n\t\t},\n\t\theaderStyle(): object {\n\t\t\tif (!this.node) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t'background-color': this.node.color,\n\t\t\t};\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tparametersSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparametersNoneSetting(): INodeProperties[] {\n\t\t\treturn this.parameters.filter((item) => {\n\t\t\t\treturn !item.isNodeSetting;\n\t\t\t});\n\t\t},\n\t\tparameters(): INodeProperties[] {\n\t\t\tif (this.nodeType === null) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn this.nodeType.properties;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisCommunityNode(): boolean {\n\t\t\treturn isCommunityPackageName(this.node?.type);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node?.type);\n\t\t},\n\t\tworkflowOwnerName(): string {\n\t\t\treturn this.workflowsEEStore.getWorkflowOwnerName(`${this.workflowsStore.workflowId}`);\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t\tusedCredentials(): IUsedCredential[] {\n\t\t\treturn Object.values(this.workflowsStore.usedCredentials).filter((credential) => {\n\t\t\t\treturn Object.values(this.node?.credentials || []).find((nodeCredential) => {\n\t\t\t\t\treturn nodeCredential.id === credential.id;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tcredentialOwnerName(): string {\n\t\t\tconst credential = this.usedCredentials\n\t\t\t\t? Object.values(this.usedCredentials).find((credential) => {\n\t\t\t\t\t\treturn credential.id === this.foreignCredentials[0];\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\t\treturn this.credentialsStore.getCredentialOwnerName(credential);\n\t\t},\n\t},\n\tprops: {\n\t\teventBus: {\n\t\t\ttype: Object as PropType<EventBus>,\n\t\t},\n\t\tdragging: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tforeignCredentials: {\n\t\t\ttype: Array as PropType<string[]>,\n\t\t\tdefault: () => [],\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\texecutable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnodeValid: true,\n\t\t\tnodeColor: null,\n\t\t\topenPanel: 'params',\n\t\t\tnodeValues: {\n\t\t\t\tcolor: '#ff0000',\n\t\t\t\talwaysOutputData: false,\n\t\t\t\texecuteOnce: false,\n\t\t\t\tnotesInFlow: false,\n\t\t\t\tonError: 'stopWorkflow',\n\t\t\t\tretryOnFail: false,\n\t\t\t\tmaxTries: 3,\n\t\t\t\twaitBetweenTries: 1000,\n\t\t\t\tnotes: '',\n\t\t\t\tparameters: {},\n\t\t\t} as INodeParameters,\n\t\t\tnodeValuesInitialized: false, // Used to prevent nodeValues from being overwritten by defaults on reopening ndv\n\n\t\t\tnodeSettings: [] as INodeProperties[],\n\t\t\tCOMMUNITY_NODES_INSTALLATION_DOCS_URL,\n\t\t\tCUSTOM_NODES_DOCS_URL,\n\t\t\tMAIN_NODE_PANEL_WIDTH,\n\t\t\thiddenIssuesInputs: [] as string[],\n\t\t};\n\t},\n\twatch: {\n\t\tnode(newNode, oldNode) {\n\t\t\tthis.setNodeValues();\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.populateHiddenIssuesSet();\n\t\tthis.populateSettings();\n\t\tthis.setNodeValues();\n\t\tthis.eventBus?.on('openSettings', this.openSettings);\n\n\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node as INodeUi, this.nodeType);\n\t\timportCurlEventBus.on('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tbeforeUnmount() {\n\t\tthis.eventBus?.off('openSettings', this.openSettings);\n\t\timportCurlEventBus.off('setHttpNodeParameters', this.setHttpNodeParameters);\n\t},\n\tmethods: {\n\t\tsetHttpNodeParameters(parameters: Record<string, unknown>) {\n\t\t\ttry {\n\t\t\t\tthis.valueChanged({\n\t\t\t\t\tnode: this.node.name,\n\t\t\t\t\tname: 'parameters',\n\t\t\t\t\tvalue: parameters,\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t},\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tonOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', node, connectionType);\n\t\t},\n\t\tpopulateHiddenIssuesSet() {\n\t\t\tif (!this.node || !this.workflowsStore.isNodePristine(this.node.name)) return;\n\n\t\t\tthis.hiddenIssuesInputs.push('credentials');\n\t\t\tthis.parametersNoneSetting.forEach((parameter) => {\n\t\t\t\tthis.hiddenIssuesInputs.push(parameter.name);\n\t\t\t});\n\n\t\t\tthis.workflowsStore.setNodePristine(this.node.name, false);\n\t\t},\n\t\tpopulateSettings() {\n\t\t\tif (this.isExecutable && !this.isTriggerNode) {\n\t\t\t\tthis.nodeSettings.push(\n\t\t\t\t\t...([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.alwaysOutputData.displayName'),\n\t\t\t\t\t\t\tname: 'alwaysOutputData',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.alwaysOutputData.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.executeOnce.displayName'),\n\t\t\t\t\t\t\tname: 'executeOnce',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.executeOnce.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.retryOnFail.displayName'),\n\t\t\t\t\t\t\tname: 'retryOnFail',\n\t\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.retryOnFail.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.maxTries.displayName'),\n\t\t\t\t\t\t\tname: 'maxTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 2,\n\t\t\t\t\t\t\t\tmaxValue: 5,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 3,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.maxTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.waitBetweenTries.displayName'),\n\t\t\t\t\t\t\tname: 'waitBetweenTries',\n\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\t\tminValue: 0,\n\t\t\t\t\t\t\t\tmaxValue: 5000,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdefault: 1000,\n\t\t\t\t\t\t\tdisplayOptions: {\n\t\t\t\t\t\t\t\tshow: {\n\t\t\t\t\t\t\t\t\tretryOnFail: [true],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.waitBetweenTries.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.onError.displayName'),\n\t\t\t\t\t\t\tname: 'onError',\n\t\t\t\t\t\t\ttype: 'options',\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'stopWorkflow',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.stopWorkflow.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueRegularOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueRegularOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.displayName',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tvalue: 'continueErrorOutput',\n\t\t\t\t\t\t\t\t\tdescription: this.$locale.baseText(\n\t\t\t\t\t\t\t\t\t\t'nodeSettings.onError.options.continueErrorOutput.description',\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdefault: 'stopWorkflow',\n\t\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.onError.description'),\n\t\t\t\t\t\t},\n\t\t\t\t\t] as INodeProperties[]),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.nodeSettings.push(\n\t\t\t\t...([\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notes.displayName'),\n\t\t\t\t\t\tname: 'notes',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\ttypeOptions: {\n\t\t\t\t\t\t\trows: 5,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notes.description'),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: this.$locale.baseText('nodeSettings.notesInFlow.displayName'),\n\t\t\t\t\t\tname: 'notesInFlow',\n\t\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t\tnoDataExpression: true,\n\t\t\t\t\t\tdescription: this.$locale.baseText('nodeSettings.notesInFlow.description'),\n\t\t\t\t\t},\n\t\t\t\t] as INodeProperties[]),\n\t\t\t);\n\t\t},\n\t\tonParameterBlur(parameterName: string) {\n\t\t\tthis.hiddenIssuesInputs = this.hiddenIssuesInputs.filter((name) => name !== parameterName);\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\tthis.$emit('activate');\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.hiddenIssuesInputs = [];\n\t\t\t(this.$refs.subConnections as InstanceType<typeof NDVSubConnections>)?.showNodeInputsIssues();\n\t\t\tthis.$emit('execute');\n\t\t},\n\t\tsetValue(name: string, value: NodeParameterValue) {\n\t\t\tconst nameParts = name.split('.');\n\t\t\tlet lastNamePart: string | undefined = nameParts.pop();\n\n\t\t\tlet isArray = false;\n\t\t\tif (lastNamePart !== undefined && lastNamePart.includes('[')) {\n\t\t\t\t// It includes an index so we have to extract it\n\t\t\t\tconst lastNameParts = lastNamePart.match(/(.*)\\[(\\d+)\\]$/);\n\t\t\t\tif (lastNameParts) {\n\t\t\t\t\tnameParts.push(lastNameParts[1]);\n\t\t\t\t\tlastNamePart = lastNameParts[2];\n\t\t\t\t\tisArray = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the value so that everything updates correctly in the UI\n\t\t\tif (nameParts.length === 0) {\n\t\t\t\t// Data is on top level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = this.nodeValues;\n\t\t\t\t\tthis.nodeValues = remainingNodeValues;\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t[lastNamePart as string]: value,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Data is on lower level\n\t\t\t\tif (value === null) {\n\t\t\t\t\t// Property should be deleted\n\t\t\t\t\tlet tempValue = get(this.nodeValues, nameParts.join('.')) as\n\t\t\t\t\t\t| INodeParameters\n\t\t\t\t\t\t| INodeParameters[];\n\n\t\t\t\t\tconst { [lastNamePart]: removedNodeValue, ...remainingNodeValues } = tempValue;\n\t\t\t\t\ttempValue = remainingNodeValues;\n\n\t\t\t\t\tif (isArray && (tempValue as INodeParameters[]).length === 0) {\n\t\t\t\t\t\t// If a value from an array got delete and no values are left\n\t\t\t\t\t\t// delete also the parent\n\t\t\t\t\t\tlastNamePart = nameParts.pop();\n\t\t\t\t\t\ttempValue = get(this.nodeValues, nameParts.join('.')) as INodeParameters;\n\t\t\t\t\t\tconst { [lastNamePart]: removedArrayNodeValue, ...remainingArrayNodeValues } =\n\t\t\t\t\t\t\ttempValue;\n\t\t\t\t\t\ttempValue = remainingArrayNodeValues;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Value should be set\n\t\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tdeepCopy(value),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(\n\t\t\t\t\t\t\tget(this.nodeValues, nameParts.join('.')) as Record<string, unknown>,\n\t\t\t\t\t\t\tlastNamePart as string,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.nodeValues = { ...this.nodeValues };\n\t\t},\n\t\tcredentialSelected(updateInformation: INodeUpdatePropertiesInformation) {\n\t\t\t// Update the values on the node\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(updateInformation.name);\n\n\t\t\tif (node) {\n\t\t\t\t// Update the issues\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssues(node);\n\t\t\t}\n\n\t\t\tvoid this.externalHooks.run('nodeSettings.credentialSelected', { updateInformation });\n\t\t},\n\t\tnameChanged(name: string) {\n\t\t\tif (this.node) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(this.node.name, name));\n\t\t\t}\n\t\t\t// @ts-ignore\n\t\t\tthis.valueChanged({\n\t\t\t\tvalue: name,\n\t\t\t\tname: 'name',\n\t\t\t});\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tlet newValue: NodeParameterValue;\n\n\t\t\tif (parameterData.hasOwnProperty('value')) {\n\t\t\t\t// New value is given\n\t\t\t\tnewValue = parameterData.value as string | number;\n\t\t\t} else {\n\t\t\t\t// Get new value from nodeData where it is set already\n\t\t\t\tnewValue = get(this.nodeValues, parameterData.name) as NodeParameterValue;\n\t\t\t}\n\t\t\t// Save the node name before we commit the change because\n\t\t\t// we need the old name to rename the node properly\n\t\t\tconst nodeNameBefore = parameterData.node || this.node?.name;\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeNameBefore);\n\n\t\t\tif (node === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'onError') {\n\t\t\t\t// If that parameter changes, we need to redraw the connections, as the error output may need to be added or removed\n\t\t\t\tthis.$emit('redrawRequired');\n\t\t\t}\n\n\t\t\tif (parameterData.name === 'name') {\n\t\t\t\t// Name of node changed so we have to set also the new node name as active\n\n\t\t\t\t// Update happens in NodeView so emit event\n\t\t\t\tconst sendData = {\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t\toldValue: nodeNameBefore,\n\t\t\t\t\tname: parameterData.name,\n\t\t\t\t};\n\t\t\t\tthis.$emit('valueChanged', sendData);\n\t\t\t} else if (parameterData.name === 'parameters') {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\tfor (const parameterName of Object.keys(parameterData.value)) {\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tnewValue = parameterData.value[parameterName];\n\n\t\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t\t// actual parameter name\n\t\t\t\t\tconst parameterPath = parameterName.split('.').slice(1).join('.');\n\n\t\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t\t// the needed data like path and index\n\t\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t\t// Apply the new value\n\t\t\t\t\t//@ts-ignore\n\t\t\t\t\tif (parameterData[parameterName] === undefined && parameterPathArray !== null) {\n\t\t\t\t\t\t// Delete array item\n\t\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\t\tparameterPath,\n\t\t\t\t\t\tnewValue,\n\t\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\t\toldNodeParameters,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeParameters) {\n\t\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\t}\n\t\t\t} else if (parameterData.name.startsWith('parameters.')) {\n\t\t\t\t// A node parameter changed\n\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\tif (!nodeType) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tparameterData.type &&\n\t\t\t\t\tthis.workflowsStore.nodeHasOutputConnection(node.name) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.eventTypes.includes(parameterData.type) &&\n\t\t\t\t\tSHOULD_CLEAR_NODE_OUTPUTS[nodeType.name]?.parameterPaths.includes(parameterData.name)\n\t\t\t\t) {\n\t\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node, { preserveInputConnections: true });\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeSettings.outputCleared.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeSettings.outputCleared.message'),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get only the parameters which are different to the defaults\n\t\t\t\tlet nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnode.parameters,\n\t\t\t\t\tfalse,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\t\t\t\tconst oldNodeParameters = Object.assign({}, nodeParameters);\n\n\t\t\t\t// Copy the data because it is the data of vuex so make sure that\n\t\t\t\t// we do not edit it directly\n\t\t\t\tnodeParameters = deepCopy(nodeParameters);\n\n\t\t\t\t// Remove the 'parameters.' from the beginning to just have the\n\t\t\t\t// actual parameter name\n\t\t\t\tconst parameterPath = parameterData.name.split('.').slice(1).join('.');\n\n\t\t\t\t// Check if the path is supposed to change an array and if so get\n\t\t\t\t// the needed data like path and index\n\t\t\t\tconst parameterPathArray = parameterPath.match(/(.*)\\[(\\d+)\\]$/);\n\n\t\t\t\t// Apply the new value\n\t\t\t\tif (parameterData.value === undefined && parameterPathArray !== null) {\n\t\t\t\t\t// Delete array item\n\t\t\t\t\tconst path = parameterPathArray[1];\n\t\t\t\t\tconst index = parameterPathArray[2];\n\t\t\t\t\tconst data = get(nodeParameters, path);\n\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tdata.splice(parseInt(index, 10), 1);\n\t\t\t\t\t\tset(nodeParameters as object, path, data);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (newValue === undefined) {\n\t\t\t\t\t\tunset(nodeParameters as object, parameterPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tset(nodeParameters as object, parameterPath, newValue);\n\t\t\t\t\t}\n\t\t\t\t\t// If value is updated, remove parameter values that have invalid options\n\t\t\t\t\t// so getNodeParameters checks don't fail\n\t\t\t\t\tthis.removeMismatchedOptionValues(nodeType, nodeParameters, {\n\t\t\t\t\t\tname: parameterPath,\n\t\t\t\t\t\tvalue: newValue,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Get the parameters with the now new defaults according to the\n\t\t\t\t// from the user actually defined parameters\n\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType.properties,\n\t\t\t\t\tnodeParameters as INodeParameters,\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnode,\n\t\t\t\t);\n\n\t\t\t\tfor (const key of Object.keys(nodeParameters as object)) {\n\t\t\t\t\tif (nodeParameters && nodeParameters[key] !== null && nodeParameters[key] !== undefined) {\n\t\t\t\t\t\tthis.setValue(`parameters.${key}`, nodeParameters[key] as string);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update the data in vuex\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\n\t\t\t\tvoid this.externalHooks.run('nodeSettings.valueChanged', {\n\t\t\t\t\tparameterPath,\n\t\t\t\t\tnewValue,\n\t\t\t\t\tparameters: this.parameters,\n\t\t\t\t\toldNodeParameters,\n\t\t\t\t});\n\n\t\t\t\tthis.nodeHelpers.updateNodeParameterIssuesByName(node.name);\n\t\t\t\tthis.nodeHelpers.updateNodeCredentialIssuesByName(node.name);\n\t\t\t\tthis.$telemetry.trackNodeParametersValuesChange(nodeType.name, parameterData);\n\t\t\t} else {\n\t\t\t\t// A property on the node itself changed\n\n\t\t\t\t// Update data in settings\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t[parameterData.name]: newValue,\n\t\t\t\t};\n\n\t\t\t\t// Update data in vuex\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: node.name,\n\t\t\t\t\tkey: parameterData.name,\n\t\t\t\t\tvalue: newValue,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeValue(updateInformation);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Removes node values that are not valid options for the given parameter.\n\t\t * This can happen when there are multiple node parameters with the same name\n\t\t * but different options and display conditions\n\t\t * @param nodeType The node type description\n\t\t * @param nodeParameterValues Current node parameter values\n\t\t * @param updatedParameter The parameter that was updated. Will be used to determine which parameters to remove based on their display conditions and option values\n\t\t */\n\t\tremoveMismatchedOptionValues(\n\t\t\tnodeType: INodeTypeDescription,\n\t\t\tnodeParameterValues: INodeParameters | null,\n\t\t\tupdatedParameter: { name: string; value: NodeParameterValue },\n\t\t) {\n\t\t\tnodeType.properties.forEach((prop) => {\n\t\t\t\tconst displayOptions = prop.displayOptions;\n\t\t\t\t// Not processing parameters that are not set or don't have options\n\t\t\t\tif (!nodeParameterValues?.hasOwnProperty(prop.name) || !displayOptions || !prop.options) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Only process the parameters that depend on the updated parameter\n\t\t\t\tconst showCondition = displayOptions.show?.[updatedParameter.name];\n\t\t\t\tconst hideCondition = displayOptions.hide?.[updatedParameter.name];\n\t\t\t\tif (showCondition === undefined && hideCondition === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet hasValidOptions = true;\n\n\t\t\t\t// Every value should be a possible option\n\t\t\t\tif (isINodePropertyCollectionList(prop.options) || isINodePropertiesList(prop.options)) {\n\t\t\t\t\thasValidOptions = Object.keys(nodeParameterValues).every(\n\t\t\t\t\t\t(key) => (prop.options ?? []).find((option) => option.name === key) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t} else if (isINodePropertyOptionsList(prop.options)) {\n\t\t\t\t\thasValidOptions = !!prop.options.find(\n\t\t\t\t\t\t(option) => option.value === nodeParameterValues[prop.name],\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!hasValidOptions && displayParameter(nodeParameterValues, prop, this.node)) {\n\t\t\t\t\tunset(nodeParameterValues as object, prop.name);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Sets the values of the active node in the internal settings variables\n\t\t */\n\t\tsetNodeValues() {\n\t\t\t// No node selected\n\t\t\tif (!this.node) {\n\t\t\t\tthis.nodeValuesInitialized = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.nodeType !== null) {\n\t\t\t\tthis.nodeValid = true;\n\n\t\t\t\tconst foundNodeSettings = [];\n\t\t\t\tif (this.node.color) {\n\t\t\t\t\tfoundNodeSettings.push('color');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tcolor: this.node.color,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notes) {\n\t\t\t\t\tfoundNodeSettings.push('notes');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotes: this.node.notes,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.alwaysOutputData) {\n\t\t\t\t\tfoundNodeSettings.push('alwaysOutputData');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\talwaysOutputData: this.node.alwaysOutputData,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.executeOnce) {\n\t\t\t\t\tfoundNodeSettings.push('executeOnce');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\texecuteOnce: this.node.executeOnce,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.continueOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: 'continueRegularOutput',\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.onError) {\n\t\t\t\t\tfoundNodeSettings.push('onError');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tonError: this.node.onError,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.notesInFlow) {\n\t\t\t\t\tfoundNodeSettings.push('notesInFlow');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tnotesInFlow: this.node.notesInFlow,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.retryOnFail) {\n\t\t\t\t\tfoundNodeSettings.push('retryOnFail');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tretryOnFail: this.node.retryOnFail,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.maxTries) {\n\t\t\t\t\tfoundNodeSettings.push('maxTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\tmaxTries: this.node.maxTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.node.waitBetweenTries) {\n\t\t\t\t\tfoundNodeSettings.push('waitBetweenTries');\n\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\twaitBetweenTries: this.node.waitBetweenTries,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Set default node settings\n\t\t\t\tfor (const nodeSetting of this.nodeSettings) {\n\t\t\t\t\tif (!foundNodeSettings.includes(nodeSetting.name)) {\n\t\t\t\t\t\t// Set default value\n\t\t\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\t\t\t[nodeSetting.name]: nodeSetting.default,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.nodeValues = {\n\t\t\t\t\t...this.nodeValues,\n\t\t\t\t\tparameters: deepCopy(this.node.parameters),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.nodeValid = false;\n\t\t\t}\n\n\t\t\tthis.nodeValuesInitialized = true;\n\t\t},\n\t\tonMissingNodeTextClick(event: MouseEvent) {\n\t\t\tif ((event.target as Element).localName === 'a') {\n\t\t\t\tthis.$telemetry.track('user clicked cnr browse button', {\n\t\t\t\t\tsource: 'cnr missing node modal',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonMissingNodeLearnMoreLinkClick() {\n\t\t\tthis.$telemetry.track('user clicked cnr docs link', {\n\t\t\t\tsource: 'missing node modal source',\n\t\t\t\tpackage_name: this.node?.type.split('.')[0],\n\t\t\t\tnode_type: this.node?.type,\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.openPanel = 'settings';\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.header {\n\tbackground-color: var(--color-background-base);\n}\n\n.warningIcon {\n\tcolor: var(--color-text-lighter);\n\tfont-size: var(--font-size-2xl);\n}\n\n.descriptionContainer {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-settings {\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n\tbackground-color: var(--color-background-xlight);\n\theight: 100%;\n\twidth: 100%;\n\n\t.no-parameters {\n\t\tmargin-top: var(--spacing-xs);\n\t}\n\n\t.header-side-menu {\n\t\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-s) var(--spacing-s);\n\t\tfont-size: var(--font-size-l);\n\t\tdisplay: flex;\n\n\t\t.node-name {\n\t\t\tpadding-top: var(--spacing-5xs);\n\t\t\tflex-grow: 1;\n\t\t}\n\t}\n\n\t.node-is-not-valid {\n\t\theight: 75%;\n\t\tpadding: 10px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\ttext-align: center;\n\t\tline-height: var(--font-line-height-regular);\n\t}\n\n\t.node-parameters-wrapper {\n\t\toverflow-y: auto;\n\t\tpadding: 0 var(--spacing-m) var(--spacing-l) var(--spacing-m);\n\t\tflex-grow: 1;\n\t}\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.parameter-content {\n\tfont-size: 0.9em;\n\tmargin-right: -15px;\n\tmargin-left: -15px;\n\tinput {\n\t\twidth: calc(100% - 35px);\n\t\tpadding: 5px;\n\t}\n\tselect {\n\t\twidth: calc(100% - 20px);\n\t\tpadding: 5px;\n\t}\n\n\t&:before {\n\t\tdisplay: table;\n\t\tcontent: ' ';\n\t\tposition: relative;\n\t\tbox-sizing: border-box;\n\t\tclear: both;\n\t}\n}\n\n.parameter-wrapper {\n\tpadding: 0 1em;\n}\n\n.color-reset-button-wrapper {\n\tposition: relative;\n}\n.color-reset-button {\n\tposition: absolute;\n\tright: 7px;\n\ttop: -25px;\n}\n\n.node-version {\n\tborder-top: var(--border-base);\n\tfont-size: var(--font-size-xs);\n\tfont-size: var(--font-size-2xs);\n\tpadding: var(--spacing-xs) 0 var(--spacing-2xs) 0;\n\tcolor: var(--color-text-light);\n}\n\n.parameter-value {\n\tinput.expression {\n\t\tborder-style: dashed;\n\t\tborder-color: #ff9600;\n\t\tdisplay: inline-block;\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tbackground-color: #793300;\n\t}\n}\n</style>\n","<template>\n\t<component\n\t\t:is=\"tag\"\n\t\tref=\"wrapper\"\n\t\t:class=\"{ [$style.dragging]: isDragging }\"\n\t\t@mousedown=\"onDragStart\"\n\t>\n\t\t<slot :is-dragging=\"isDragging\"></slot>\n\n\t\t<Teleport to=\"body\">\n\t\t\t<div v-show=\"isDragging\" ref=\"draggable\" :class=\"$style.draggable\" :style=\"draggableStyle\">\n\t\t\t\t<slot name=\"preview\" :can-drop=\"canDrop\" :el=\"draggingEl\"></slot>\n\t\t\t</div>\n\t\t</Teleport>\n\t</component>\n</template>\n\n<script lang=\"ts\">\nimport type { XYPosition } from '@/Interface';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { mapStores } from 'pinia';\nimport { defineComponent } from 'vue';\n\nexport default defineComponent({\n\tname: 'Draggable',\n\tprops: {\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttype: {\n\t\t\ttype: String,\n\t\t},\n\t\tdata: {\n\t\t\ttype: String,\n\t\t},\n\t\ttag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'div',\n\t\t},\n\t\ttargetDataKey: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tdata() {\n\t\tconst draggablePosition = {\n\t\t\tx: -100,\n\t\t\ty: -100,\n\t\t};\n\n\t\treturn {\n\t\t\tisDragging: false,\n\t\t\tdraggablePosition,\n\t\t\tdraggingEl: null as null | HTMLElement,\n\t\t\tdraggableStyle: {\n\t\t\t\ttransform: `translate(${draggablePosition.x}px, ${draggablePosition.y}px)`,\n\t\t\t},\n\t\t\tanimationFrameId: 0,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tcanDrop(): boolean {\n\t\t\treturn this.ndvStore.canDraggableDrop;\n\t\t},\n\t\tstickyPosition(): XYPosition | null {\n\t\t\treturn this.ndvStore.draggableStickyPos;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggableStyle() {\n\t\t\tthis.draggableStyle = {\n\t\t\t\ttransform: `translate(${this.draggablePosition.x}px, ${this.draggablePosition.y}px)`,\n\t\t\t};\n\t\t},\n\t\tonDragStart(e: MouseEvent) {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.draggingEl = e.target as HTMLElement;\n\t\t\tif (this.targetDataKey && this.draggingEl.dataset?.target !== this.targetDataKey) {\n\t\t\t\tthis.draggingEl = this.draggingEl.closest(\n\t\t\t\t\t`[data-target=\"${this.targetDataKey}\"]`,\n\t\t\t\t) as HTMLElement;\n\t\t\t}\n\n\t\t\tif (this.targetDataKey && this.draggingEl?.dataset?.target !== this.targetDataKey) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.isDragging = false;\n\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\tthis.setDraggableStyle();\n\n\t\t\twindow.addEventListener('mousemove', this.onDrag);\n\t\t\twindow.addEventListener('mouseup', this.onDragEnd);\n\n\t\t\t// blur so that any focused inputs update value\n\t\t\tconst activeElement = document.activeElement as HTMLElement;\n\t\t\tif (activeElement) {\n\t\t\t\tactiveElement.blur();\n\t\t\t}\n\t\t},\n\t\tonDrag(e: MouseEvent) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.isDragging) {\n\t\t\t\tthis.isDragging = true;\n\n\t\t\t\tconst data =\n\t\t\t\t\tthis.targetDataKey && this.draggingEl ? this.draggingEl.dataset.value : this.data || '';\n\t\t\t\tthis.ndvStore.draggableStartDragging({\n\t\t\t\t\ttype: this.type,\n\t\t\t\t\tdata: data || '',\n\t\t\t\t\tdimensions: this.draggingEl?.getBoundingClientRect() ?? null,\n\t\t\t\t});\n\n\t\t\t\tthis.$emit('dragstart', this.draggingEl);\n\t\t\t\tdocument.body.style.cursor = 'grabbing';\n\t\t\t}\n\n\t\t\tthis.animationFrameId = window.requestAnimationFrame(() => {\n\t\t\t\tif (this.canDrop && this.stickyPosition) {\n\t\t\t\t\tthis.draggablePosition = { x: this.stickyPosition[0], y: this.stickyPosition[1] };\n\t\t\t\t} else {\n\t\t\t\t\tthis.draggablePosition = { x: e.pageX, y: e.pageY };\n\t\t\t\t}\n\t\t\t\tthis.setDraggableStyle();\n\t\t\t\tthis.$emit('drag', this.draggablePosition);\n\t\t\t});\n\t\t},\n\t\tonDragEnd() {\n\t\t\tif (this.disabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.style.cursor = 'unset';\n\t\t\twindow.removeEventListener('mousemove', this.onDrag);\n\t\t\twindow.removeEventListener('mouseup', this.onDragEnd);\n\t\t\twindow.cancelAnimationFrame(this.animationFrameId);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('dragend', this.draggingEl);\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggingEl = null;\n\t\t\t\tthis.ndvStore.draggableStopDragging();\n\t\t\t}, 0);\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragging {\n\tvisibility: visible;\n\tcursor: grabbing;\n}\n\n.draggable {\n\tposition: fixed;\n\tz-index: 9999999;\n\ttop: 0;\n\tleft: 0;\n}\n\n.draggable-data-transfer {\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","<template>\n\t<Draggable\n\t\ttype=\"panel-resize\"\n\t\t:class=\"$style.dragContainer\"\n\t\t@drag=\"onDrag\"\n\t\t@dragstart=\"onDragStart\"\n\t\t@dragend=\"onDragEnd\"\n\t>\n\t\t<template #default=\"{ isDragging }\">\n\t\t\t<div :class=\"{ [$style.dragButton]: true }\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveLeft\"\n\t\t\t\t\t:class=\"{ [$style.leftArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-left\" />\n\t\t\t\t</span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"canMoveRight\"\n\t\t\t\t\t:class=\"{ [$style.rightArrow]: true, [$style.visible]: isDragging }\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"arrow-right\" />\n\t\t\t\t</span>\n\t\t\t\t<div :class=\"$style.grid\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\t</Draggable>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport Draggable from './Draggable.vue';\n\nexport default defineComponent({\n\tcomponents: {\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tcanMoveRight: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanMoveLeft: {\n\t\t\ttype: Boolean,\n\t\t},\n\t},\n\tmethods: {\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tthis.$emit('drag', e);\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.$emit('dragstart');\n\t\t},\n\t\tonDragEnd() {\n\t\t\tthis.$emit('dragend');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dragContainer {\n\tpointer-events: all;\n}\n.dragButton {\n\tbackground-color: var(--color-background-base);\n\twidth: 64px;\n\theight: 21px;\n\tborder-top-left-radius: var(--border-radius-base);\n\tborder-top-right-radius: var(--border-radius-base);\n\tcursor: grab;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: visible;\n\tposition: relative;\n\tz-index: 3;\n\n\t&:hover {\n\t\t.leftArrow,\n\t\t.rightArrow {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.visible {\n\tvisibility: visible !important;\n}\n\n.arrow {\n\tposition: absolute;\n\tcolor: var(--color-background-xlight);\n\tfont-size: var(--font-size-3xs);\n\tvisibility: hidden;\n\ttop: 0;\n}\n\n.leftArrow {\n\tcomposes: arrow;\n\tleft: -16px;\n}\n\n.rightArrow {\n\tcomposes: arrow;\n\tright: -16px;\n}\n\n.grid {\n\t> div {\n\t\tdisplay: flex;\n\n\t\t&:first-child {\n\t\t\t> div {\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\t\t}\n\n\t\t> div {\n\t\t\theight: 2px;\n\t\t\twidth: 2px;\n\t\t\tborder-radius: 50%;\n\t\t\tbackground-color: var(--color-foreground-xdark);\n\t\t\tmargin-right: 4px;\n\n\t\t\t&:last-child {\n\t\t\t\tmargin-right: 0;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<aside :class=\"$style.floatingNodes\">\n\t\t<ul\n\t\t\tv-for=\"connectionGroup in connectionGroups\"\n\t\t\t:key=\"connectionGroup\"\n\t\t\t:class=\"[$style.nodesList, $style[connectionGroup]]\"\n\t\t>\n\t\t\t<template v-for=\"{ node, nodeType } in connectedNodes[connectionGroup]\">\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tv-if=\"node && nodeType\"\n\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t:placement=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t:teleported=\"false\"\n\t\t\t\t\t:offset=\"60\"\n\t\t\t\t>\n\t\t\t\t\t<template #content>{{ node.name }}</template>\n\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class=\"$style.connectedNode\"\n\t\t\t\t\t\tdata-test-id=\"floating-node\"\n\t\t\t\t\t\t:data-node-name=\"node.name\"\n\t\t\t\t\t\t:data-node-placement=\"connectionGroup\"\n\t\t\t\t\t\t@click=\"$emit('switchSelectedNode', node.name)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<NodeIcon\n\t\t\t\t\t\t\t:node-type=\"nodeType\"\n\t\t\t\t\t\t\t:node-name=\"node.name\"\n\t\t\t\t\t\t\t:tooltip-position=\"tooltipPositionMapper[connectionGroup]\"\n\t\t\t\t\t\t\t:size=\"35\"\n\t\t\t\t\t\t\tcircle\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</template>\n\t\t</ul>\n\t</aside>\n</template>\n\n<script setup lang=\"ts\">\nimport type { INodeUi } from '@/Interface';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { computed, onMounted, onBeforeUnmount } from 'vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport type { INodeTypeDescription } from 'n8n-workflow';\n\ninterface Props {\n\trootNode: INodeUi;\n}\nconst enum FloatingNodePosition {\n\ttop = 'outputSub',\n\tright = 'outputMain',\n\tleft = 'inputMain',\n}\nconst props = defineProps<Props>();\nconst workflowsStore = useWorkflowsStore();\nconst nodeTypesStore = useNodeTypesStore();\nconst workflow = workflowsStore.getCurrentWorkflow();\nconst emit = defineEmits(['switchSelectedNode']);\n\ninterface NodeConfig {\n\tnode: INodeUi;\n\tnodeType: INodeTypeDescription;\n}\nfunction moveNodeDirection(direction: FloatingNodePosition) {\n\tconst matchedDirectionNode = connectedNodes.value[direction][0];\n\tif (matchedDirectionNode) {\n\t\temit('switchSelectedNode', matchedDirectionNode.node.name);\n\t}\n}\n\nfunction onKeyDown(e: KeyboardEvent) {\n\tif (e.shiftKey && e.altKey && (e.ctrlKey || e.metaKey)) {\n\t\t/* eslint-disable @typescript-eslint/naming-convention */\n\t\tconst mapper = {\n\t\t\tArrowUp: FloatingNodePosition.top,\n\t\t\tArrowRight: FloatingNodePosition.right,\n\t\t\tArrowLeft: FloatingNodePosition.left,\n\t\t};\n\t\t/* eslint-enable @typescript-eslint/naming-convention */\n\n\t\tconst matchingDirection = mapper[e.key as keyof typeof mapper] || null;\n\t\tif (matchingDirection) {\n\t\t\tmoveNodeDirection(matchingDirection);\n\t\t}\n\t}\n}\nfunction getINodesFromNames(names: string[]): NodeConfig[] {\n\treturn names\n\t\t.map((name) => {\n\t\t\tconst node = workflowsStore.getNodeByName(name);\n\t\t\tif (node) {\n\t\t\t\tconst nodeType = nodeTypesStore.getNodeType(node.type);\n\t\t\t\tif (nodeType) {\n\t\t\t\t\treturn { node, nodeType };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\t.filter((n): n is NodeConfig => n !== null);\n}\nconst connectedNodes = computed<\n\tRecord<FloatingNodePosition, Array<{ node: INodeUi; nodeType: INodeTypeDescription }>>\n>(() => {\n\tconst rootName = props.rootNode.name;\n\treturn {\n\t\t[FloatingNodePosition.top]: getINodesFromNames(\n\t\t\tworkflow.getChildNodes(rootName, 'ALL_NON_MAIN'),\n\t\t),\n\t\t[FloatingNodePosition.right]: getINodesFromNames(workflow.getChildNodes(rootName, 'main', 1)),\n\t\t[FloatingNodePosition.left]: getINodesFromNames(workflow.getParentNodes(rootName, 'main', 1)),\n\t};\n});\n\nconst connectionGroups = [\n\tFloatingNodePosition.top,\n\tFloatingNodePosition.right,\n\tFloatingNodePosition.left,\n];\nconst tooltipPositionMapper = {\n\t[FloatingNodePosition.top]: 'bottom',\n\t[FloatingNodePosition.right]: 'left',\n\t[FloatingNodePosition.left]: 'right',\n};\n\nonMounted(() => {\n\tdocument.addEventListener('keydown', onKeyDown, true);\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('keydown', onKeyDown, true);\n});\ndefineExpose({\n\tmoveNodeDirection,\n});\n</script>\n\n<style lang=\"scss\" module>\n.floatingNodes {\n\tposition: fixed;\n\tbottom: 0;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 10;\n\tpointer-events: none;\n}\n.floatingNodes {\n\tright: 0;\n}\n\n.nodesList {\n\tlist-style: none;\n\tpadding: 0;\n\tposition: absolute;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-direction: column;\n\twidth: min-content;\n\tmargin: auto;\n\ttransform-origin: center;\n\tgap: var(--spacing-s);\n\ttransition: transform 0.2s ease-in-out;\n\n\t&.inputSub,\n\t&.outputSub {\n\t\tright: 0;\n\t\tleft: 0;\n\t\tflex-direction: row;\n\t}\n\t&.outputSub {\n\t\ttop: 0;\n\t}\n\t&.inputSub {\n\t\tbottom: 0;\n\t}\n\t&.outputMain,\n\t&.inputMain {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n\t&.outputMain {\n\t\tright: 0;\n\t}\n\t&.inputMain {\n\t\tleft: 0;\n\t}\n\n\t&.outputMain {\n\t\ttransform: translateX(50%);\n\t}\n\t&.outputSub {\n\t\ttransform: translateY(-50%);\n\t}\n\t&.inputMain {\n\t\ttransform: translateX(-50%);\n\t}\n\t&.inputSub {\n\t\ttransform: translateY(50%);\n\t}\n}\n.connectedNode {\n\tborder: var(--border-base);\n\tbackground-color: var(--color-canvas-node-background);\n\tborder-radius: 100%;\n\tpadding: var(--spacing-s);\n\tcursor: pointer;\n\tpointer-events: all;\n\ttransition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n\tposition: relative;\n\ttransform: scale(0.8);\n\tdisplay: flex;\n\tjustify-self: center;\n\talign-self: center;\n\n\t&::after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: -35%;\n\t\tright: -30%;\n\t\tbottom: -35%;\n\t\tleft: -30%;\n\t\tz-index: -1;\n\t}\n\t.outputMain &,\n\t.inputMain & {\n\t\tborder-radius: var(--border-radius-large);\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\t.outputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(-50%);\n\t\t}\n\t}\n\t.outputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(50%);\n\t\t}\n\t}\n\t.inputMain & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateX(50%);\n\t\t}\n\t}\n\t.inputSub & {\n\t\t&:hover {\n\t\t\ttransform: scale(1.2) translateY(-50%);\n\t\t}\n\t}\n}\n</style>\n","<template>\n\t<div>\n\t\t<NDVFloatingNodes\n\t\t\tv-if=\"activeNode\"\n\t\t\t:root-node=\"activeNode\"\n\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t/>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.inputPanel\" :style=\"inputPanelStyles\">\n\t\t\t<slot name=\"input\"></slot>\n\t\t</div>\n\t\t<div v-if=\"!hideInputAndOutput\" :class=\"$style.outputPanel\" :style=\"outputPanelStyles\">\n\t\t\t<slot name=\"output\"></slot>\n\t\t</div>\n\t\t<div :class=\"$style.mainPanel\" :style=\"mainPanelStyles\">\n\t\t\t<n8n-resize-wrapper\n\t\t\t\t:is-resizing-enabled=\"currentNodePaneType !== 'unknown'\"\n\t\t\t\t:width=\"relativeWidthToPx(mainPanelDimensions.relativeWidth)\"\n\t\t\t\t:min-width=\"MIN_PANEL_WIDTH\"\n\t\t\t\t:grid-size=\"20\"\n\t\t\t\t:supported-directions=\"supportedResizeDirections\"\n\t\t\t\t@resize=\"onResizeDebounced\"\n\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.dragButtonContainer\">\n\t\t\t\t\t<PanelDragButton\n\t\t\t\t\t\tv-if=\"!hideInputAndOutput && isDraggable\"\n\t\t\t\t\t\t:class=\"{ [$style.draggable]: true, [$style.visible]: isDragging }\"\n\t\t\t\t\t\t:can-move-left=\"canMoveLeft\"\n\t\t\t\t\t\t:can-move-right=\"canMoveRight\"\n\t\t\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t\t\t@drag=\"onDrag\"\n\t\t\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"{ [$style.mainPanelInner]: true, [$style.dragging]: isDragging }\">\n\t\t\t\t\t<slot name=\"main\" />\n\t\t\t\t</div>\n\t\t\t</n8n-resize-wrapper>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { get } from 'lodash-es';\nimport { useStorage } from '@/composables/useStorage';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport PanelDragButton from './PanelDragButton.vue';\n\nimport { LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH, MAIN_NODE_PANEL_WIDTH } from '@/constants';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { ndvEventBus } from '@/event-bus';\nimport NDVFloatingNodes from '@/components/NDVFloatingNodes.vue';\nimport { useDebounce } from '@/composables/useDebounce';\n\nconst SIDE_MARGIN = 24;\nconst SIDE_PANELS_MARGIN = 80;\nconst MIN_PANEL_WIDTH = 280;\nconst PANEL_WIDTH = 320;\nconst PANEL_WIDTH_LARGE = 420;\n\nconst initialMainPanelWidth: { [key: string]: number } = {\n\tregular: MAIN_NODE_PANEL_WIDTH,\n\tdragless: MAIN_NODE_PANEL_WIDTH,\n\tunknown: MAIN_NODE_PANEL_WIDTH,\n\tinputless: MAIN_NODE_PANEL_WIDTH,\n\twide: MAIN_NODE_PANEL_WIDTH * 2,\n};\n\nexport default defineComponent({\n\tname: 'NDVDraggablePanels',\n\tcomponents: {\n\t\tPanelDragButton,\n\t\tNDVFloatingNodes,\n\t},\n\tprops: {\n\t\tisDraggable: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideInputAndOutput: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tposition: {\n\t\t\ttype: Number,\n\t\t},\n\t\tnodeType: {\n\t\t\ttype: Object as PropType<INodeTypeDescription>,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\tsetup() {\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn { callDebounced };\n\t},\n\tdata(): {\n\t\twindowWidth: number;\n\t\tisDragging: boolean;\n\t\tMIN_PANEL_WIDTH: number;\n\t\tinitialized: boolean;\n\t} {\n\t\treturn {\n\t\t\twindowWidth: 1,\n\t\t\tisDragging: false,\n\t\t\tMIN_PANEL_WIDTH,\n\t\t\tinitialized: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.setTotalWidth();\n\n\t\t/*\n\t\t\tOnly set(or restore) initial position if `mainPanelDimensions`\n\t\t\tis at the default state({relativeLeft:1, relativeRight: 1, relativeWidth: 1}) to make sure we use store values if they are set\n\t\t*/\n\t\tif (\n\t\t\tthis.mainPanelDimensions.relativeLeft === 1 &&\n\t\t\tthis.mainPanelDimensions.relativeRight === 1\n\t\t) {\n\t\t\tthis.setMainPanelWidth();\n\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\tthis.restorePositionData();\n\t\t}\n\n\t\twindow.addEventListener('resize', this.setTotalWidth);\n\t\tthis.$emit('init', { position: this.mainPanelDimensions.relativeLeft });\n\t\tsetTimeout(() => {\n\t\t\tthis.initialized = true;\n\t\t}, 0);\n\n\t\tndvEventBus.on('setPositionByName', this.setPositionByName);\n\t},\n\tbeforeUnmount() {\n\t\twindow.removeEventListener('resize', this.setTotalWidth);\n\t\tndvEventBus.off('setPositionByName', this.setPositionByName);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNDVStore),\n\t\tmainPanelDimensions(): {\n\t\t\trelativeWidth: number;\n\t\t\trelativeLeft: number;\n\t\t\trelativeRight: number;\n\t\t} {\n\t\t\treturn this.ndvStore.getMainPanelDimensions(this.currentNodePaneType);\n\t\t},\n\t\tactiveNode() {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tsupportedResizeDirections(): string[] {\n\t\t\tconst supportedDirections = ['right'];\n\n\t\t\tif (this.isDraggable) supportedDirections.push('left');\n\t\t\treturn supportedDirections;\n\t\t},\n\t\tcurrentNodePaneType(): string {\n\t\t\tif (!this.hasInputSlot) return 'inputless';\n\t\t\tif (!this.isDraggable) return 'dragless';\n\t\t\tif (this.nodeType === null) return 'unknown';\n\t\t\treturn get(this, 'nodeType.parameterPane') || 'regular';\n\t\t},\n\t\thasInputSlot(): boolean {\n\t\t\treturn this.$slots.input !== undefined;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.pxToRelativeWidth(SIDE_PANELS_MARGIN);\n\t\t},\n\t\tminWindowWidth(): number {\n\t\t\treturn 2 * (SIDE_MARGIN + SIDE_PANELS_MARGIN) + MIN_PANEL_WIDTH;\n\t\t},\n\t\tminimumLeftPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\tif (!this.hasInputSlot) return this.pxToRelativeWidth(SIDE_MARGIN);\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tmaximumRightPosition(): number {\n\t\t\tif (this.windowWidth < this.minWindowWidth) return this.pxToRelativeWidth(1);\n\n\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 20) + this.inputPanelMargin;\n\t\t},\n\t\tcanMoveLeft(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeLeft > this.minimumLeftPosition;\n\t\t},\n\t\tcanMoveRight(): boolean {\n\t\t\treturn this.mainPanelDimensions.relativeRight > this.maximumRightPosition;\n\t\t},\n\t\tmainPanelStyles(): { left: string; right: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeLeft)}px`,\n\t\t\t\tright: `${this.relativeWidthToPx(this.mainPanelDimensions.relativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\tinputPanelStyles(): { right: string } {\n\t\t\treturn {\n\t\t\t\tright: `${this.relativeWidthToPx(this.calculatedPositions.inputPanelRelativeRight)}px`,\n\t\t\t};\n\t\t},\n\t\toutputPanelStyles(): { left: string; transform: string } {\n\t\t\treturn {\n\t\t\t\tleft: `${this.relativeWidthToPx(this.calculatedPositions.outputPanelRelativeLeft)}px`,\n\t\t\t\ttransform: `translateX(-${this.relativeWidthToPx(this.outputPanelRelativeTranslate)}px)`,\n\t\t\t};\n\t\t},\n\t\tcalculatedPositions(): { inputPanelRelativeRight: number; outputPanelRelativeLeft: number } {\n\t\t\tconst hasInput = this.$slots.input !== undefined;\n\t\t\tconst outputPanelRelativeLeft =\n\t\t\t\tthis.mainPanelDimensions.relativeLeft + this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst inputPanelRelativeRight = hasInput\n\t\t\t\t? 1 - outputPanelRelativeLeft + this.mainPanelDimensions.relativeWidth\n\t\t\t\t: 1 - this.pxToRelativeWidth(SIDE_MARGIN);\n\n\t\t\treturn {\n\t\t\t\tinputPanelRelativeRight,\n\t\t\t\toutputPanelRelativeLeft,\n\t\t\t};\n\t\t},\n\t\toutputPanelRelativeTranslate(): number {\n\t\t\tconst panelMinLeft = 1 - this.pxToRelativeWidth(MIN_PANEL_WIDTH + SIDE_MARGIN);\n\t\t\tconst currentRelativeLeftDelta =\n\t\t\t\tthis.calculatedPositions.outputPanelRelativeLeft - panelMinLeft;\n\t\t\treturn currentRelativeLeftDelta > 0 ? currentRelativeLeftDelta : 0;\n\t\t},\n\t\thasDoubleWidth(): boolean {\n\t\t\treturn get(this, 'nodeType.parameterPane') === 'wide';\n\t\t},\n\t\tfixedPanelWidth(): number {\n\t\t\tconst multiplier = this.hasDoubleWidth ? 2 : 1;\n\n\t\t\tif (this.windowWidth > 1700) {\n\t\t\t\treturn PANEL_WIDTH_LARGE * multiplier;\n\t\t\t}\n\n\t\t\treturn PANEL_WIDTH * multiplier;\n\t\t},\n\t\tisBelowMinWidthMainPanel(): boolean {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\treturn this.mainPanelDimensions.relativeWidth < minRelativeWidth;\n\t\t},\n\t},\n\twatch: {\n\t\twindowWidth(windowWidth) {\n\t\t\tconst minRelativeWidth = this.pxToRelativeWidth(MIN_PANEL_WIDTH);\n\t\t\t// Prevent the panel resizing below MIN_PANEL_WIDTH whhile maintaing position\n\t\t\tif (this.isBelowMinWidthMainPanel) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t}\n\n\t\t\tconst isBelowMinLeft = this.minimumLeftPosition > this.mainPanelDimensions.relativeLeft;\n\t\t\tconst isMaxRight = this.maximumRightPosition > this.mainPanelDimensions.relativeRight;\n\n\t\t\t// When user is resizing from non-supported view(sub ~488px) we need to refit the panels\n\t\t\tif (windowWidth > this.minWindowWidth && isBelowMinLeft && isMaxRight) {\n\t\t\t\tthis.setMainPanelWidth(minRelativeWidth);\n\t\t\t\tthis.setPositions(this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth));\n\t\t\t}\n\n\t\t\tthis.setPositions(this.mainPanelDimensions.relativeLeft);\n\t\t},\n\t},\n\tmethods: {\n\t\tonSwitchSelectedNode(node: string) {\n\t\t\tthis.$emit('switchSelectedNode', node);\n\t\t},\n\t\tgetInitialLeftPosition(width: number) {\n\t\t\tif (this.currentNodePaneType === 'dragless')\n\t\t\t\treturn this.pxToRelativeWidth(SIDE_MARGIN + 1 + this.fixedPanelWidth);\n\n\t\t\treturn this.hasInputSlot ? 0.5 - width / 2 : this.minimumLeftPosition;\n\t\t},\n\t\tsetMainPanelWidth(relativeWidth?: number) {\n\t\t\tconst mainPanelRelativeWidth =\n\t\t\t\trelativeWidth || this.pxToRelativeWidth(initialMainPanelWidth[this.currentNodePaneType]);\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeWidth: mainPanelRelativeWidth,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositions(relativeLeft: number) {\n\t\t\tconst mainPanelRelativeLeft =\n\t\t\t\trelativeLeft || 1 - this.calculatedPositions.inputPanelRelativeRight;\n\t\t\tconst mainPanelRelativeRight =\n\t\t\t\t1 - mainPanelRelativeLeft - this.mainPanelDimensions.relativeWidth;\n\n\t\t\tconst isMaxRight = this.maximumRightPosition > mainPanelRelativeRight;\n\t\t\tconst isMinLeft = this.minimumLeftPosition > mainPanelRelativeLeft;\n\t\t\tconst isInputless = this.currentNodePaneType === 'inputless';\n\n\t\t\tif (isMinLeft) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: this.minimumLeftPosition,\n\t\t\t\t\t\trelativeRight: 1 - this.mainPanelDimensions.relativeWidth - this.minimumLeftPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isMaxRight) {\n\t\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\trelativeLeft: 1 - this.mainPanelDimensions.relativeWidth - this.maximumRightPosition,\n\t\t\t\t\t\trelativeRight: this.maximumRightPosition,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setMainPanelDimensions({\n\t\t\t\tpanelType: this.currentNodePaneType,\n\t\t\t\tdimensions: {\n\t\t\t\t\trelativeLeft: isInputless ? this.minimumLeftPosition : mainPanelRelativeLeft,\n\t\t\t\t\trelativeRight: mainPanelRelativeRight,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tsetPositionByName(position: 'minLeft' | 'maxRight' | 'initial') {\n\t\t\tconst positionByName: Record<string, number> = {\n\t\t\t\tminLeft: this.minimumLeftPosition,\n\t\t\t\tmaxRight: this.maximumRightPosition,\n\t\t\t\tinitial: this.getInitialLeftPosition(this.mainPanelDimensions.relativeWidth),\n\t\t\t};\n\n\t\t\tthis.setPositions(positionByName[position]);\n\t\t},\n\t\tpxToRelativeWidth(px: number) {\n\t\t\treturn px / this.windowWidth;\n\t\t},\n\t\trelativeWidthToPx(relativeWidth: number) {\n\t\t\treturn relativeWidth * this.windowWidth;\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.setTotalWidth();\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tonResizeDebounced(data: { direction: string; x: number; width: number }) {\n\t\t\tif (this.initialized) {\n\t\t\t\tvoid this.callDebounced(this.onResize, { debounceTime: 10, trailing: true }, data);\n\t\t\t}\n\t\t},\n\t\tonResize({ direction, x, width }: { direction: string; x: number; width: number }) {\n\t\t\tconst relativeDistance = this.pxToRelativeWidth(x);\n\t\t\tconst relativeWidth = this.pxToRelativeWidth(width);\n\n\t\t\tif (direction === 'left' && relativeDistance <= this.minimumLeftPosition) return;\n\t\t\tif (direction === 'right' && 1 - relativeDistance <= this.maximumRightPosition) return;\n\t\t\tif (width <= MIN_PANEL_WIDTH) return;\n\n\t\t\tthis.setMainPanelWidth(relativeWidth);\n\t\t\tthis.setPositions(\n\t\t\t\tdirection === 'left' ? relativeDistance : this.mainPanelDimensions.relativeLeft,\n\t\t\t);\n\t\t},\n\t\trestorePositionData() {\n\t\t\tconst storedPanelWidthData = useStorage(\n\t\t\t\t`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`,\n\t\t\t).value;\n\n\t\t\tif (storedPanelWidthData) {\n\t\t\t\tconst parsedWidth = parseFloat(storedPanelWidthData);\n\t\t\t\tthis.setMainPanelWidth(parsedWidth);\n\t\t\t\tconst initialPosition = this.getInitialLeftPosition(parsedWidth);\n\n\t\t\t\tthis.setPositions(initialPosition);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tstorePositionData() {\n\t\t\tuseStorage(`${LOCAL_STORAGE_MAIN_PANEL_RELATIVE_WIDTH}_${this.currentNodePaneType}`).value =\n\t\t\t\tthis.mainPanelDimensions.relativeWidth.toString();\n\t\t},\n\t\tonDragStart() {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.$emit('dragstart', { position: this.mainPanelDimensions.relativeLeft });\n\t\t},\n\t\tonDrag(e: { x: number; y: number }) {\n\t\t\tconst relativeLeft = this.pxToRelativeWidth(e.x) - this.mainPanelDimensions.relativeWidth / 2;\n\n\t\t\tthis.setPositions(relativeLeft);\n\t\t},\n\t\tonDragEnd() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.$emit('dragend', {\n\t\t\t\t\twindowWidth: this.windowWidth,\n\t\t\t\t\tposition: this.mainPanelDimensions.relativeLeft,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t\tthis.storePositionData();\n\t\t},\n\t\tsetTotalWidth() {\n\t\t\tthis.windowWidth = window.innerWidth;\n\t\t},\n\t\tclose() {\n\t\t\tthis.$emit('close');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.dataPanel {\n\tposition: absolute;\n\theight: calc(100% - 2 * var(--spacing-l));\n\tposition: absolute;\n\ttop: var(--spacing-l);\n\tz-index: 0;\n\tmin-width: 280px;\n}\n\n.inputPanel {\n\tcomposes: dataPanel;\n\tleft: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: var(--border-radius-large) 0 0 var(--border-radius-large);\n\t}\n}\n\n.outputPanel {\n\tcomposes: dataPanel;\n\tright: var(--spacing-l);\n\n\t> * {\n\t\tborder-radius: 0 var(--border-radius-large) var(--border-radius-large) 0;\n\t}\n}\n\n.mainPanel {\n\tposition: absolute;\n\theight: 100%;\n\n\t&:hover {\n\t\t.draggable {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n.mainPanelInner {\n\theight: 100%;\n\tborder: var(--border-base);\n\tborder-radius: var(--border-radius-large);\n\tbox-shadow: 0 4px 16px rgb(50 61 85 / 10%);\n\toverflow: hidden;\n\n\t&.dragging {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0px 6px 16px rgba(255, 74, 51, 0.15);\n\t}\n}\n\n.draggable {\n\tvisibility: hidden;\n}\n\n.double-width {\n\tleft: 90%;\n}\n\n.dragButtonContainer {\n\tposition: absolute;\n\ttop: -12px;\n\twidth: 100%;\n\theight: 12px;\n\tdisplay: flex;\n\tjustify-content: center;\n\tpointer-events: none;\n\n\t.draggable {\n\t\tpointer-events: all;\n\t}\n\t&:hover .draggable {\n\t\tvisibility: visible;\n\t}\n}\n\n.visible {\n\tvisibility: visible;\n}\n</style>\n","<template>\n\t<iframe class=\"__html-display\" :srcdoc=\"sanitizedHtml\" />\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue';\nimport sanitizeHtml, { defaults, type IOptions as SanitizeOptions } from 'sanitize-html';\n\nconst sanitizeOptions: SanitizeOptions = {\n\tallowVulnerableTags: false,\n\tenforceHtmlBoundary: false,\n\tdisallowedTagsMode: 'discard',\n\tallowedTags: [...defaults.allowedTags, 'style', 'img', 'title'],\n\tallowedAttributes: {\n\t\t...defaults.allowedAttributes,\n\t\t'*': ['class', 'style'],\n\t},\n\ttransformTags: {\n\t\thead: '',\n\t},\n};\n\nexport default {\n\tname: 'RunDataHtml',\n\tprops: {\n\t\tinputHtml: {\n\t\t\ttype: String as PropType<string>,\n\t\t},\n\t},\n\tcomputed: {\n\t\tsanitizedHtml() {\n\t\t\treturn sanitizeHtml(this.inputHtml, sanitizeOptions);\n\t\t},\n\t},\n};\n</script>\n\n<style lang=\"scss\">\n.__html-display {\n\twidth: 100%;\n\theight: 100%;\n}\n</style>\n","<template>\n\t<span>\n\t\t<div v-if=\"isLoading\">Loading binary data...</div>\n\t\t<div v-else-if=\"error\">Error loading binary data</div>\n\t\t<span v-else>\n\t\t\t<video v-if=\"binaryData.fileType === 'video'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</video>\n\t\t\t<audio v-else-if=\"binaryData.fileType === 'audio'\" controls autoplay>\n\t\t\t\t<source :src=\"embedSource\" :type=\"binaryData.mimeType\" />\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.yourBrowserDoesNotSupport') }}\n\t\t\t</audio>\n\t\t\t<VueJsonPretty\n\t\t\t\tv-else-if=\"binaryData.fileType === 'json'\"\n\t\t\t\t:data=\"data\"\n\t\t\t\t:deep=\"3\"\n\t\t\t\t:show-length=\"true\"\n\t\t\t/>\n\t\t\t<RunDataHtml v-else-if=\"binaryData.fileType === 'html'\" :input-html=\"data\" />\n\t\t\t<embed v-else :src=\"embedSource\" class=\"binary-data\" :class=\"embedClass()\" />\n\t\t</span>\n\t</span>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData } from 'n8n-workflow';\nimport { jsonParse } from 'n8n-workflow';\nimport type { PropType } from 'vue';\nimport VueJsonPretty from 'vue-json-pretty';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport RunDataHtml from '@/components/RunDataHtml.vue';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplayEmbed',\n\tcomponents: {\n\t\tVueJsonPretty,\n\t\tRunDataHtml,\n\t},\n\tprops: {\n\t\tbinaryData: {\n\t\t\ttype: Object as PropType<IBinaryData>,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisLoading: true,\n\t\t\tembedSource: '',\n\t\t\terror: false,\n\t\t\tdata: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t},\n\tasync mounted() {\n\t\tconst { id, data, fileName, fileType, mimeType } = this.binaryData;\n\t\tconst isJSONData = fileType === 'json';\n\t\tconst isHTMLData = fileType === 'html';\n\n\t\tif (!id) {\n\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\tthis.data = jsonParse(atob(data));\n\t\t\t} else {\n\t\t\t\tthis.embedSource = 'data:' + mimeType + ';base64,' + data;\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst binaryUrl = this.workflowsStore.getBinaryUrl(id, 'view', fileName, mimeType);\n\t\t\t\tif (isJSONData || isHTMLData) {\n\t\t\t\t\tconst fetchedData = await fetch(binaryUrl, { credentials: 'include' });\n\t\t\t\t\tthis.data = await (isJSONData ? fetchedData.json() : fetchedData.text());\n\t\t\t\t} else {\n\t\t\t\t\tthis.embedSource = binaryUrl;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = true;\n\t\t\t}\n\t\t}\n\n\t\tthis.isLoading = false;\n\t},\n\tmethods: {\n\t\tembedClass(): string[] {\n\t\t\tconst { fileType } = this.binaryData;\n\t\t\treturn [fileType ?? 'other'];\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data {\n\tbackground-color: var(--color-foreground-xlight);\n\n\t&.image {\n\t\tmax-height: calc(100% - 1em);\n\t\tmax-width: calc(100% - 1em);\n\t}\n\n\t&.other,\n\t&.pdf {\n\t\theight: calc(100% - 1em);\n\t\twidth: calc(100% - 1em);\n\t}\n}\n</style>\n","<template>\n\t<div v-if=\"windowVisible\" :class=\"['binary-data-window', binaryData?.fileType]\">\n\t\t<n8n-button\n\t\t\tsize=\"small\"\n\t\t\tclass=\"binary-data-window-back\"\n\t\t\t:title=\"$locale.baseText('binaryDataDisplay.backToOverviewPage')\"\n\t\t\ticon=\"arrow-left\"\n\t\t\t:label=\"$locale.baseText('binaryDataDisplay.backToList')\"\n\t\t\t@click.stop=\"closeWindow\"\n\t\t/>\n\n\t\t<div class=\"binary-data-window-wrapper\">\n\t\t\t<div v-if=\"!binaryData\">\n\t\t\t\t{{ $locale.baseText('binaryDataDisplay.noDataFoundToDisplay') }}\n\t\t\t</div>\n\t\t\t<BinaryDataDisplayEmbed v-else :binary-data=\"binaryData\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { IBinaryData, IRunData } from 'n8n-workflow';\n\nimport BinaryDataDisplayEmbed from '@/components/BinaryDataDisplayEmbed.vue';\n\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\n\nexport default defineComponent({\n\tname: 'BinaryDataDisplay',\n\n\tcomponents: {\n\t\tBinaryDataDisplayEmbed,\n\t},\n\tprops: [\n\t\t'displayData', // IBinaryData\n\t\t'windowVisible', // boolean\n\t],\n\tsetup() {\n\t\tconst nodeHelpers = useNodeHelpers();\n\n\t\treturn {\n\t\t\tnodeHelpers,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useWorkflowsStore),\n\t\tbinaryData(): IBinaryData | null {\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.displayData.node,\n\t\t\t\tthis.displayData.runIndex,\n\t\t\t\tthis.displayData.outputIndex,\n\t\t\t);\n\n\t\t\tif (binaryData.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.displayData.index >= binaryData.length ||\n\t\t\t\tbinaryData[this.displayData.index][this.displayData.key] === undefined\n\t\t\t) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst binaryDataItem: IBinaryData = binaryData[this.displayData.index][this.displayData.key];\n\n\t\t\treturn binaryDataItem;\n\t\t},\n\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution;\n\t\t\tif (workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData = workflowExecution.data;\n\t\t\treturn executionData ? executionData.resultData.runData : null;\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseWindow() {\n\t\t\t// Handle the close externally as the visible parameter is an external prop\n\t\t\t// and is so not allowed to be changed here.\n\t\t\tthis.$emit('close');\n\t\t\treturn false;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n.binary-data-window {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tz-index: 10;\n\twidth: 100%;\n\theight: calc(100% - 50px);\n\tbackground-color: var(--color-run-data-background);\n\toverflow: hidden;\n\ttext-align: center;\n\n\t&.json {\n\t\toverflow: auto;\n\t}\n\n\t.binary-data-window-wrapper {\n\t\tmargin-top: 0.5em;\n\t\tpadding: 0 1em;\n\t\theight: calc(100% - 50px);\n\n\t\t.el-row,\n\t\t.el-col {\n\t\t\theight: 100%;\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { useI18n } from '@/composables/useI18n';\nimport type { PropType } from 'vue';\n\nconst emit = defineEmits<{\n\t(e: 'update:modelValue', feedback: 'positive' | 'negative'): void;\n}>();\n\ndefineProps({\n\tmodelValue: {\n\t\ttype: String as PropType<'positive' | 'negative' | undefined>,\n\t\tdefault: undefined,\n\t},\n});\n\nconst i18n = useI18n();\n\nfunction onFeedback(feedback: 'positive' | 'negative') {\n\temit('update:modelValue', feedback);\n}\n</script>\n<template>\n\t<div class=\"feedback\">\n\t\t<N8nText v-if=\"!modelValue\" class=\"mr-2xs\">\n\t\t\t{{ i18n.baseText('feedback.title') }}\n\t\t</N8nText>\n\t\t<N8nText v-else :color=\"modelValue === 'positive' ? 'success' : 'danger'\">\n\t\t\t<FontAwesomeIcon\n\t\t\t\t:icon=\"modelValue === 'positive' ? 'thumbs-up' : 'thumbs-down'\"\n\t\t\t\tclass=\"mr-2xs\"\n\t\t\t/>\n\t\t\t{{ i18n.baseText(`feedback.${modelValue}`) }}\n\t\t</N8nText>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.positive')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-positive\"\n\t\t\t\t@click=\"onFeedback('positive')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-up\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t\t<N8nTooltip v-if=\"!modelValue\" :content=\"i18n.baseText('feedback.negative')\">\n\t\t\t<span\n\t\t\t\tclass=\"feedback-button\"\n\t\t\t\tdata-test-id=\"feedback-button-negative\"\n\t\t\t\t@click=\"onFeedback('negative')\"\n\t\t\t>\n\t\t\t\t<FontAwesomeIcon icon=\"thumbs-down\" />\n\t\t\t</span>\n\t\t</N8nTooltip>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.feedback {\n\tdisplay: flex;\n\talign-items: center;\n\n\t.feedback-button {\n\t\tcursor: pointer;\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport Feedback from '@/components/Feedback.vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { PropType } from 'vue';\nimport { computed, ref } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { useToast } from '@/composables/useToast';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport type {\n\tIDataObject,\n\tINodeProperties,\n\tINodePropertyCollection,\n\tINodePropertyOptions,\n\tNodeApiError,\n\tNodeError,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { sanitizeHtml } from '@/utils/htmlUtils';\nimport { useAIStore } from '@/stores/ai.store';\nimport { MAX_DISPLAY_DATA_SIZE } from '@/constants';\nimport VueMarkdown from 'vue-markdown-render';\nimport type { BaseTextKey } from '@/plugins/i18n';\n\nconst props = defineProps({\n\terror: {\n\t\ttype: Object as PropType<NodeError | NodeApiError | NodeOperationError>,\n\t\trequired: true,\n\t},\n});\n\nconst clipboard = useClipboard();\nconst toast = useToast();\nconst i18n = useI18n();\nconst telemetry = useTelemetry();\n\nconst nodeTypesStore = useNodeTypesStore();\nconst ndvStore = useNDVStore();\nconst rootStore = useRootStore();\nconst aiStore = useAIStore();\n\nconst isLoadingErrorDebugging = ref(false);\nconst errorDebuggingMessage = ref('');\nconst errorDebuggingFeedback = ref<'positive' | 'negative' | undefined>();\n\nconst displayCause = computed(() => {\n\treturn JSON.stringify(props.error.cause).length < MAX_DISPLAY_DATA_SIZE;\n});\n\nconst parameters = computed<INodeProperties[]>(() => {\n\tconst node = ndvStore.activeNode;\n\tif (!node) {\n\t\treturn [];\n\t}\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\tif (nodeType === null) {\n\t\treturn [];\n\t}\n\n\treturn nodeType.properties;\n});\n\nconst n8nVersion = computed(() => {\n\tconst baseUrl = rootStore.urlBaseEditor;\n\tlet instanceType = 'Self Hosted';\n\n\tif (baseUrl.includes('n8n.cloud')) {\n\t\tinstanceType = 'Cloud';\n\t}\n\n\treturn rootStore.versionCli + ` (${instanceType})`;\n});\n\nconst hasManyInputItems = computed(() => {\n\treturn ndvStore.ndvInputData.length > 1;\n});\n\nconst nodeDefaultName = computed(() => {\n\tconst node = props.error?.node;\n\tif (!node) {\n\t\treturn 'Node';\n\t}\n\n\tconst nodeType = nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\treturn nodeType?.defaults?.name || node.name;\n});\n\nconst prepareRawMessages = computed(() => {\n\tconst returnData: Array<string | IDataObject> = [];\n\tif (!props.error.messages?.length) {\n\t\treturn [];\n\t}\n\tconst errorMessage = getErrorMessage();\n\n\tArray.from(new Set(props.error.messages)).forEach((message) => {\n\t\tconst isParsable = /^\\d{3} - \\{/.test(message);\n\t\tconst parts = isParsable ? message.split(' - ').map((part) => part.trim()) : [];\n\n\t\t//try to parse the message as JSON\n\t\tfor (const part of parts) {\n\t\t\ttry {\n\t\t\t\tconst parsed = JSON.parse(part);\n\t\t\t\tif (typeof parsed === 'object') {\n\t\t\t\t\treturnData.push(parsed);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {}\n\t\t}\n\t\t//if message is the same as error message, do not include it\n\t\tif (message === errorMessage) return;\n\t\treturnData.push(message);\n\t});\n\treturn returnData;\n});\n\nasync function onDebugError() {\n\ttry {\n\t\tisLoadingErrorDebugging.value = true;\n\t\ttelemetry.track(\n\t\t\t'User clicked AI error helper button',\n\t\t\t{\n\t\t\t\tnode_type: props.error.node?.type,\n\t\t\t\terror_title: props.error.message,\n\t\t\t},\n\t\t\t{ withPostHog: true },\n\t\t);\n\n\t\tconst { message } = await aiStore.debugError({ error: props.error });\n\t\terrorDebuggingMessage.value = message;\n\t} catch (error) {\n\t\ttoast.showError(error, i18n.baseText('generic.error'));\n\t} finally {\n\t\tisLoadingErrorDebugging.value = false;\n\t}\n}\n\nasync function onDebugErrorRegenerate() {\n\terrorDebuggingMessage.value = '';\n\terrorDebuggingFeedback.value = undefined;\n\tawait onDebugError();\n\ttelemetry.track('User regenerated error debugging AI hint', {\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\n}\n\nasync function onErrorDebuggingFeedback(feedback: 'positive' | 'negative') {\n\ttelemetry.track('User responded error debugging AI hint', {\n\t\thelpful: feedback === 'positive',\n\t\tnode_type: props.error.node?.type,\n\t\terror_title: props.error.message,\n\t});\n}\n\nfunction nodeVersionTag(nodeType: NodeError['node']): string {\n\tif (!nodeType || ('hidden' in nodeType && nodeType.hidden)) {\n\t\treturn i18n.baseText('nodeSettings.deprecated');\n\t}\n\n\tconst latestNodeVersion = Math.max(...nodeTypesStore.getNodeVersions(nodeType.type));\n\n\tif (latestNodeVersion === nodeType.typeVersion) {\n\t\treturn i18n.baseText('nodeSettings.latest');\n\t}\n\n\treturn i18n.baseText('nodeSettings.latestVersion', {\n\t\tinterpolate: { version: latestNodeVersion.toString() },\n\t});\n}\n\nfunction replacePlaceholders(parameter: string, message: string): string {\n\tconst parameterName = parameterDisplayName(parameter, false);\n\tconst parameterFullName = parameterDisplayName(parameter, true);\n\treturn message\n\t\t.replace(/%%PARAMETER%%/g, parameterName)\n\t\t.replace(/%%PARAMETER_FULL%%/g, parameterFullName);\n}\n\nfunction getErrorDescription(): string {\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\n\tif (isSubNodeError) {\n\t\treturn sanitizeHtml(\n\t\t\tprops.error.description +\n\t\t\t\ti18n.baseText('pushConnection.executionError.openNode', {\n\t\t\t\t\tinterpolate: { node: props.error.node.name },\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tif (props.error.context?.descriptionKey) {\n\t\tconst interpolate = {\n\t\t\tnodeCause: props.error.context.nodeCause as string,\n\t\t\trunIndex: (props.error.context.runIndex as string) ?? '0',\n\t\t\titemIndex: (props.error.context.itemIndex as string) ?? '0',\n\t\t};\n\t\treturn sanitizeHtml(\n\t\t\ti18n.baseText(\n\t\t\t\t`nodeErrorView.description.${props.error.context.descriptionKey as string}` as BaseTextKey,\n\t\t\t\t{ interpolate },\n\t\t\t),\n\t\t);\n\t}\n\n\tif (!props.error.context?.descriptionTemplate) {\n\t\treturn sanitizeHtml(props.error.description ?? '');\n\t}\n\n\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\treturn sanitizeHtml(\n\t\t(props.error.context.descriptionTemplate as string).replace(/%%PARAMETER%%/g, parameterName),\n\t);\n}\n\nfunction addItemIndexSuffix(message: string): string {\n\tlet itemIndexSuffix = '';\n\n\tconst ITEM_INDEX_SUFFIX_TEXT = '[item ';\n\n\tif (\n\t\thasManyInputItems.value &&\n\t\t!message.includes(ITEM_INDEX_SUFFIX_TEXT) &&\n\t\tprops.error?.context?.itemIndex !== undefined\n\t) {\n\t\titemIndexSuffix = ` [item ${props.error.context.itemIndex}]`;\n\t}\n\n\treturn message + itemIndexSuffix;\n}\n\nfunction getErrorMessage(): string {\n\tconst baseErrorMessage = '';\n\tlet message = '';\n\n\tconst isSubNodeError =\n\t\tprops.error.name === 'NodeOperationError' &&\n\t\t(props.error as NodeOperationError).functionality === 'configuration-node';\n\n\tif (isSubNodeError) {\n\t\tmessage = i18n.baseText('nodeErrorView.errorSubNode', {\n\t\t\tinterpolate: { node: props.error.node.name },\n\t\t});\n\t} else if (\n\t\tprops.error.message === props.error.description ||\n\t\t!props.error.context?.messageTemplate\n\t) {\n\t\tmessage = baseErrorMessage + props.error.message;\n\t} else {\n\t\tconst parameterName = parameterDisplayName(props.error.context.parameter as string);\n\n\t\tmessage =\n\t\t\tbaseErrorMessage +\n\t\t\t(props.error.context.messageTemplate as string).replace(/%%PARAMETER%%/g, parameterName);\n\t}\n\n\treturn addItemIndexSuffix(message);\n}\n\nfunction parameterDisplayName(path: string, fullPath = true) {\n\ttry {\n\t\tconst params = parameterName(parameters.value, path.split('.'));\n\t\tif (!params.length) {\n\t\t\tthrow new Error();\n\t\t}\n\n\t\tif (!fullPath) {\n\t\t\treturn params.pop()!.displayName;\n\t\t}\n\t\treturn params.map((parameter) => parameter.displayName).join(' > ');\n\t} catch (error) {\n\t\treturn `Could not find parameter \"${path}\"`;\n\t}\n}\n\nfunction parameterName(\n\tparams: Array<INodePropertyOptions | INodeProperties | INodePropertyCollection>,\n\tpathParts: string[],\n): Array<INodeProperties | INodePropertyCollection> {\n\tlet currentParameterName = pathParts.shift();\n\n\tif (currentParameterName === undefined) {\n\t\treturn [];\n\t}\n\n\tconst arrayMatch = currentParameterName.match(/(.*)\\[([\\d])\\]$/);\n\tif (arrayMatch !== null && arrayMatch.length > 0) {\n\t\tcurrentParameterName = arrayMatch[1];\n\t}\n\tconst currentParameter = params.find(\n\t\t(parameter) => parameter.name === currentParameterName,\n\t) as unknown as INodeProperties | INodePropertyCollection;\n\n\tif (currentParameter === undefined) {\n\t\tthrow new Error(`Could not find parameter \"${currentParameterName}\"`);\n\t}\n\n\tif (pathParts.length === 0) {\n\t\treturn [currentParameter];\n\t}\n\n\tif (currentParameter.hasOwnProperty('options')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...parameterName((currentParameter as INodeProperties).options!, pathParts),\n\t\t];\n\t}\n\n\tif (currentParameter.hasOwnProperty('values')) {\n\t\treturn [\n\t\t\tcurrentParameter,\n\t\t\t...parameterName((currentParameter as INodePropertyCollection).values, pathParts),\n\t\t];\n\t}\n\n\t// We can not resolve any deeper so lets stop here and at least return hopefully something useful\n\treturn [currentParameter];\n}\n\nfunction copyErrorDetails() {\n\tconst error = props.error;\n\n\tconst errorInfo: IDataObject = {\n\t\terrorMessage: getErrorMessage(),\n\t};\n\tif (error.description) {\n\t\terrorInfo.errorDescription = error.description;\n\t}\n\n\t//add error details\n\tconst errorDetails: IDataObject = {};\n\n\tif (error?.messages?.length) {\n\t\terrorDetails.rawErrorMessage = error.messages;\n\t}\n\n\tif ('httpCode' in error && error.httpCode) {\n\t\terrorDetails.httpCode = error.httpCode;\n\t}\n\n\tif (error.context && error.context.data) {\n\t\terrorDetails.errorData = error.context.data;\n\t}\n\n\tif (error.extra) {\n\t\terrorDetails.errorExtra = error.extra;\n\t}\n\n\terrorInfo.errorDetails = errorDetails;\n\n\t//add n8n details\n\tconst n8nDetails: IDataObject = {};\n\n\tif (error.node) {\n\t\tn8nDetails.nodeName = error.node.name;\n\t\tn8nDetails.nodeType = error.node.type;\n\t\tn8nDetails.nodeVersion = error.node.typeVersion;\n\n\t\tif (error.node?.parameters?.resource) {\n\t\t\tn8nDetails.resource = error.node.parameters.resource;\n\t\t}\n\t\tif (error?.node?.parameters?.operation) {\n\t\t\tn8nDetails.operation = error.node.parameters.operation;\n\t\t}\n\t}\n\n\tif (error.context) {\n\t\tif (error.context.itemIndex !== undefined) {\n\t\t\tn8nDetails.itemIndex = error.context.itemIndex;\n\t\t}\n\n\t\tif (error.context.runIndex !== undefined) {\n\t\t\tn8nDetails.runIndex = error.context.runIndex;\n\t\t}\n\n\t\tif (error.context.parameter !== undefined) {\n\t\t\tn8nDetails.parameter = error.context.parameter;\n\t\t}\n\n\t\tif (error.context.causeDetailed) {\n\t\t\tn8nDetails.causeDetailed = error.context.causeDetailed;\n\t\t}\n\t}\n\n\tif (error.timestamp) {\n\t\tn8nDetails.time = new Date(error.timestamp).toLocaleString();\n\t}\n\n\tn8nDetails.n8nVersion = n8nVersion.value;\n\n\tn8nDetails.binaryDataMode = rootStore.binaryDataMode;\n\n\tif (error.cause) {\n\t\tn8nDetails.cause = error.cause;\n\t}\n\n\tn8nDetails.stackTrace = error.stack?.split('\\n');\n\n\terrorInfo.n8nDetails = n8nDetails;\n\n\tvoid clipboard.copy(JSON.stringify(errorInfo, null, 2));\n\tcopySuccess();\n}\n\nfunction copySuccess() {\n\ttoast.showMessage({\n\t\ttitle: i18n.baseText('nodeErrorView.showMessage.title'),\n\t\ttype: 'info',\n\t});\n}\n</script>\n\n<template>\n\t<div class=\"node-error-view\">\n\t\t<div class=\"node-error-view__header\">\n\t\t\t<div class=\"node-error-view__header-message\">\n\t\t\t\t<div>\n\t\t\t\t\t{{ getErrorMessage() }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tv-if=\"error.description || error.context?.descriptionKey\"\n\t\t\t\tclass=\"node-error-view__header-description\"\n\t\t\t\tv-html=\"getErrorDescription()\"\n\t\t\t></div>\n\t\t</div>\n\n\t\t<N8nCard\n\t\t\tv-if=\"isLoadingErrorDebugging || errorDebuggingMessage\"\n\t\t\tclass=\"node-error-view__debugging mb-s\"\n\t\t>\n\t\t\t<span v-if=\"isLoadingErrorDebugging\">\n\t\t\t\t<N8nSpinner class=\"mr-3xs\" />\n\t\t\t\t{{ i18n.baseText('nodeErrorView.debugError.loading') }}\n\t\t\t</span>\n\t\t\t<VueMarkdown v-else :source=\"errorDebuggingMessage\" />\n\n\t\t\t<div v-if=\"errorDebuggingMessage\" class=\"node-error-view__feedback-toolbar\">\n\t\t\t\t<Feedback v-model=\"errorDebuggingFeedback\" @update:model-value=\"onErrorDebuggingFeedback\" />\n\t\t\t\t<N8nTooltip :content=\"i18n.baseText('nodeErrorView.debugError.feedback.reload')\">\n\t\t\t\t\t<span class=\"node-error-view__feedback-button\" @click=\"onDebugErrorRegenerate\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" />\n\t\t\t\t\t</span>\n\t\t\t\t</N8nTooltip>\n\t\t\t</div>\n\t\t</N8nCard>\n\n\t\t<div class=\"node-error-view__info\">\n\t\t\t<div class=\"node-error-view__info-header\">\n\t\t\t\t<p class=\"node-error-view__info-title\">\n\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.title') }}\n\t\t\t\t</p>\n\t\t\t\t<n8n-tooltip\n\t\t\t\t\tclass=\"item\"\n\t\t\t\t\t:content=\"i18n.baseText('nodeErrorView.copyToClipboard.tooltip')\"\n\t\t\t\t\tplacement=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"copy-button\">\n\t\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\t\ticon=\"copy\"\n\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t\t\ttext=\"true\"\n\t\t\t\t\t\t\ttransparent-background=\"transparent\"\n\t\t\t\t\t\t\t@click=\"copyErrorDetails\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-tooltip>\n\t\t\t</div>\n\n\t\t\t<div class=\"node-error-view__info-content\">\n\t\t\t\t<details\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t('httpCode' in error && error.httpCode) ||\n\t\t\t\t\t\tprepareRawMessages.length ||\n\t\t\t\t\t\terror?.context?.data ||\n\t\t\t\t\t\terror.extra\n\t\t\t\t\t\"\n\t\t\t\t\tclass=\"node-error-view__details\"\n\t\t\t\t>\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{\n\t\t\t\t\t\t\ti18n.baseText('nodeErrorView.details.from', {\n\t\t\t\t\t\t\t\tinterpolate: { node: `${nodeDefaultName}` },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div v-if=\"'httpCode' in error && error.httpCode\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.errorCode') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.httpCode }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"prepareRawMessages.length\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.rawMessages') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<div v-for=\"(msg, index) in prepareRawMessages\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t<pre><code>{{ msg }}</code></pre>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error?.context?.data\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorData') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.data }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.extra\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorExtra') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.extra }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div v-if=\"error.context && error.context.request\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.request') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<pre><code>{{ error.context.request }}</code></pre>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\n\t\t\t\t<details class=\"node-error-view__details\">\n\t\t\t\t\t<summary class=\"node-error-view__details-summary\">\n\t\t\t\t\t\t<font-awesome-icon class=\"node-error-view__details-icon\" icon=\"angle-right\" />\n\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.info') }}\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"node-error-view__details-content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.itemIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.itemIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.itemIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.runIndex !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.runIndex') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.context.runIndex }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.parameter !== undefined\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.inParameter') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ parameterDisplayName(`${error.context.parameter}`) }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.type\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeType') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ error.node.type }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.node && error.node.typeVersion\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.nodeVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>\n\t\t\t\t\t\t\t\t\t<span>{{ error.node.typeVersion + ' ' }}</span>\n\t\t\t\t\t\t\t\t\t<span>({{ nodeVersionTag(error.node) }})</span>\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.n8nVersion') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ n8nVersion }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.timestamp\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.time') }}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-value\">\n\t\t\t\t\t\t\t\t<code>{{ new Date(error.timestamp).toLocaleString() }}</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.cause && displayCause\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.errorCause') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.cause }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-if=\"error.context && error.context.causeDetailed\"\n\t\t\t\t\t\t\tclass=\"node-error-view__details-row\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.causeDetailed') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\t\tclass=\"node-error-view__details-value\"\n\t\t\t\t\t\t\t><code>{{ error.context.causeDetailed }}</code></pre>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div v-if=\"error.stack\" class=\"node-error-view__details-row\">\n\t\t\t\t\t\t\t<p class=\"node-error-view__details-label\">\n\t\t\t\t\t\t\t\t{{ i18n.baseText('nodeErrorView.details.stackTrace') }}\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t<pre class=\"node-error-view__details-value\"><code>{{ error.stack }}</code></pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</details>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style lang=\"scss\">\n.node-error-view {\n\t&__header {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto var(--spacing-s) auto;\n\t\tpadding-bottom: var(--spacing-3xs);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__header-title {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-danger-tint-1);\n\t\tfont-size: var(--font-size-3xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tbackground-color: var(--color-danger-tint-2);\n\t\tborder-radius: var(--border-radius-large) var(--border-radius-large) 0 0;\n\t\tcolor: var(--color-danger);\n\t}\n\n\t&__header-message {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tgap: var(--spacing-xs);\n\t\tpadding: var(--spacing-xs) var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tcolor: var(--color-ndv-output-error-message);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tfont-size: var(--font-size-s);\n\t}\n\n\t&__header-description {\n\t\tpadding: 0 var(--spacing-s) var(--spacing-3xs) var(--spacing-s);\n\t\tfont-size: var(--font-size-xs);\n\n\t\tul {\n\t\t\tpadding: var(--spacing-s) 0;\n\t\t\tpadding-left: var(--spacing-l);\n\t\t}\n\n\t\tcode {\n\t\t\tfont-size: var(--font-size-xs);\n\t\t\tcolor: var(--color-text-base);\n\t\t\tbackground: var(--color-background-base);\n\t\t\tpadding: var(--spacing-5xs);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t&__debugging {\n\t\tfont-size: var(--font-size-s);\n\n\t\tul,\n\t\tol,\n\t\tdl {\n\t\t\tpadding-left: var(--spacing-s);\n\t\t\tmargin-top: var(--spacing-2xs);\n\t\t\tmargin-bottom: var(--spacing-2xs);\n\t\t}\n\n\t\tpre {\n\t\t\tpadding: var(--spacing-s);\n\t\t\twidth: 100%;\n\t\t\toverflow: auto;\n\t\t\tbackground: var(--color-background-light);\n\t\t\tcode {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__feedback-toolbar {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tmargin-top: var(--spacing-s);\n\t\tpadding-top: var(--spacing-3xs);\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__feedback-button {\n\t\twidth: var(--spacing-2xl);\n\t\theight: var(--spacing-2xl);\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t\t&:hover {\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n\n\t&__info {\n\t\tmax-width: 960px;\n\t\tmargin: 0 auto;\n\t\tborder: 1px solid var(--color-foreground-base);\n\t\tborder-radius: var(--border-radius-large);\n\t}\n\n\t&__info-header {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tpadding: var(--spacing-3xs) var(--spacing-3xs) var(--spacing-3xs) var(--spacing-s);\n\t\tborder-bottom: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__info-title {\n\t\tfont-size: var(--font-size-2xs);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-dark);\n\t}\n\n\t&__info-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details:not(:last-child) {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n\n\t&__details[open] {\n\t\t.node-error-view__details {\n\t\t\t&-icon {\n\t\t\t\ttransform: rotate(90deg);\n\t\t\t\ttransition: transform 0.3s ease;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__details-summary {\n\t\tpadding: var(--spacing-5xs) 0;\n\t\tfont-size: var(--font-size-2xs);\n\t\tcolor: var(--color-text-dark);\n\t\tcursor: pointer;\n\t\tlist-style-type: none;\n\t\toutline: none;\n\t}\n\n\t&__details-content {\n\t\tpadding: var(--spacing-2xs) var(--spacing-s);\n\t}\n\n\t&__details-row {\n\t\tdisplay: flex;\n\t\tpadding: var(--spacing-4xs) 0;\n\t}\n\n\t&__details-row:not(:first-child) {\n\t\tborder-top: 1px solid var(--color-foreground-base);\n\t}\n\n\t&__details-icon {\n\t\tmargin-right: var(--spacing-xs);\n\t}\n\n\t&__details-label {\n\t\tflex-grow: 0;\n\t\tflex-shrink: 0;\n\t\twidth: 120px;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t}\n\n\t&__details-value {\n\t\tflex: 1;\n\t\toverflow: hidden;\n\t\tmargin-right: auto;\n\t\tcolor: var(--color-text);\n\t\tfont-size: var(--font-size-2xs);\n\t\tword-wrap: break-word;\n\n\t\tcode {\n\t\t\tcolor: var(--color-json-string);\n\t\t\twhite-space: normal;\n\t\t\tword-wrap: break-word;\n\t\t}\n\t}\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useI18n } from '@/composables/useI18n';\nimport type { usePinnedData } from '@/composables/usePinnedData';\n\nconst locale = useI18n();\n\ntype Props = {\n\ttooltipContentsVisibility: {\n\t\tbinaryDataTooltipContent: boolean;\n\t\tpinDataDiscoveryTooltipContent: boolean;\n\t};\n\tdataPinningDocsUrl: string;\n\tpinnedData: ReturnType<typeof usePinnedData>;\n\tdisabled: boolean;\n};\n\nconst props = defineProps<Props>();\n\nconst emit = defineEmits<{\n\t(event: 'togglePinData'): void;\n}>();\n\nconst visible = computed(() =>\n\tprops.tooltipContentsVisibility.pinDataDiscoveryTooltipContent ? true : undefined,\n);\n</script>\n\n<template>\n\t<n8n-tooltip placement=\"bottom-end\" :visible=\"visible\">\n\t\t<template #content>\n\t\t\t<div v-if=\"props.tooltipContentsVisibility.binaryDataTooltipContent\">\n\t\t\t\t{{ locale.baseText('ndv.pinData.pin.binary') }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"props.tooltipContentsVisibility.pinDataDiscoveryTooltipContent\">\n\t\t\t\t{{ locale.baseText('node.discovery.pinData.ndv') }}\n\t\t\t</div>\n\t\t\t<div v-else>\n\t\t\t\t<strong>{{ locale.baseText('ndv.pinData.pin.title') }}</strong>\n\t\t\t\t<n8n-text size=\"small\" tag=\"p\">\n\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.description') }}\n\n\t\t\t\t\t<n8n-link :to=\"props.dataPinningDocsUrl\" size=\"small\">\n\t\t\t\t\t\t{{ locale.baseText('ndv.pinData.pin.link') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t\t<n8n-icon-button\n\t\t\t:class=\"$style.pinDataButton\"\n\t\t\ttype=\"tertiary\"\n\t\t\t:active=\"props.pinnedData.hasData.value\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:disabled=\"props.disabled\"\n\t\t\tdata-test-id=\"ndv-pin-data\"\n\t\t\t@click=\"emit('togglePinData')\"\n\t\t/>\n\t</n8n-tooltip>\n</template>\n\n<style lang=\"scss\" module>\n.pinDataButton {\n\tmargin-left: var(--spacing-2xs);\n\tsvg {\n\t\ttransition: transform 0.3s ease;\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"['run-data', $style.container]\" @mouseover=\"activatePane\">\n\t\t<n8n-callout\n\t\t\tv-if=\"\n\t\t\t\tcanPinData && pinnedData.hasData.value && !editMode.enabled && !isProductionExecutionPreview\n\t\t\t\"\n\t\t\ttheme=\"secondary\"\n\t\t\ticon=\"thumbtack\"\n\t\t\t:class=\"$style.pinnedDataCallout\"\n\t\t>\n\t\t\t{{ $locale.baseText('runData.pindata.thisDataIsPinned') }}\n\t\t\t<span v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"ml-4xs\">\n\t\t\t\t<n8n-link\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tunderline\n\t\t\t\t\tbold\n\t\t\t\t\t@click.stop=\"onTogglePinData({ source: 'banner-link' })\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.unpin') }}\n\t\t\t\t</n8n-link>\n\t\t\t</span>\n\t\t\t<template #trailingContent>\n\t\t\t\t<n8n-link\n\t\t\t\t\t:to=\"dataPinningDocsUrl\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttheme=\"secondary\"\n\t\t\t\t\tbold\n\t\t\t\t\tunderline\n\t\t\t\t\t@click=\"onClickDataPinningDocsLink\"\n\t\t\t\t>\n\t\t\t\t\t{{ $locale.baseText('runData.pindata.learnMore') }}\n\t\t\t\t</n8n-link>\n\t\t\t</template>\n\t\t</n8n-callout>\n\n\t\t<BinaryDataDisplay\n\t\t\t:window-visible=\"binaryDataDisplayVisible\"\n\t\t\t:display-data=\"binaryDataDisplayData\"\n\t\t\t@close=\"closeBinaryDataDisplay\"\n\t\t/>\n\n\t\t<div :class=\"$style.header\">\n\t\t\t<slot name=\"header\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-show=\"!hasRunError\"\n\t\t\t\t:class=\"$style.displayModes\"\n\t\t\t\tdata-test-id=\"run-data-pane-header\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-show=\"\n\t\t\t\t\t\thasNodeRun && (inputData.length || binaryData.length || search) && !editMode.enabled\n\t\t\t\t\t\"\n\t\t\t\t\t:model-value=\"displayMode\"\n\t\t\t\t\t:options=\"buttons\"\n\t\t\t\t\tdata-test-id=\"ndv-run-data-display-mode\"\n\t\t\t\t\t@update:model-value=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"canPinData && !isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t\t\t:title=\"$locale.baseText('runData.editOutput')\"\n\t\t\t\t\t:circle=\"false\"\n\t\t\t\t\t:disabled=\"node.disabled\"\n\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\ticon=\"pencil-alt\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tdata-test-id=\"ndv-edit-pinned-data\"\n\t\t\t\t\t@click=\"enterEditMode({ origin: 'editIconButton' })\"\n\t\t\t\t/>\n\n\t\t\t\t<RunDataPinButton\n\t\t\t\t\tv-if=\"(canPinData || !!binaryData?.length) && rawInputData.length && !editMode.enabled\"\n\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t(!rawInputData.length && !pinnedData.hasData.value) ||\n\t\t\t\t\t\tisReadOnlyRoute ||\n\t\t\t\t\t\treadOnlyEnv ||\n\t\t\t\t\t\t!!binaryData?.length\n\t\t\t\t\t\"\n\t\t\t\t\t:tooltip-contents-visibility=\"{\n\t\t\t\t\t\tbinaryDataTooltipContent: !!binaryData?.length,\n\t\t\t\t\t\tpinDataDiscoveryTooltipContent:\n\t\t\t\t\t\t\tisControlledPinDataTooltip && pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t}\"\n\t\t\t\t\t:data-pinning-docs-url=\"dataPinningDocsUrl\"\n\t\t\t\t\t:pinned-data=\"pinnedData\"\n\t\t\t\t\t@toggle-pin-data=\"onTogglePinData({ source: 'pin-icon-click' })\"\n\t\t\t\t/>\n\n\t\t\t\t<div v-show=\"editMode.enabled\" :class=\"$style.editModeActions\">\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.cancel')\"\n\t\t\t\t\t\t@click=\"onClickCancelEdit\"\n\t\t\t\t\t/>\n\t\t\t\t\t<n8n-button\n\t\t\t\t\t\tclass=\"ml-2xs\"\n\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t:label=\"$locale.baseText('runData.editor.save')\"\n\t\t\t\t\t\t@click=\"onClickSaveEdit\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"maxRunIndex > 0\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.runSelector\"\n\t\t\tdata-test-id=\"run-selector\"\n\t\t>\n\t\t\t<div :class=\"$style.runSelectorWrapper\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"runIndex\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onRunIndexChange\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.run') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"option in maxRunIndex + 1\"\n\t\t\t\t\t\t:key=\"option\"\n\t\t\t\t\t\t:label=\"getRunLabel(option)\"\n\t\t\t\t\t\t:value=\"option - 1\"\n\t\t\t\t\t></n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<n8n-tooltip v-if=\"canLinkRuns\" placement=\"right\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t{{ $locale.baseText(linkedRuns ? 'runData.unlinking.hint' : 'runData.linking.hint') }}\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-icon-button\n\t\t\t\t\t\tclass=\"linkRun\"\n\t\t\t\t\t\t:icon=\"linkedRuns ? 'unlink' : 'link'\"\n\t\t\t\t\t\ttext\n\t\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t@click=\"toggleLinkRuns\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<slot name=\"run-info\"></slot>\n\t\t\t</div>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\t\t<slot name=\"before-data\" />\n\n\t\t<div\n\t\t\tv-if=\"maxOutputIndex > 0 && branches.length > 1\"\n\t\t\t:class=\"$style.tabs\"\n\t\t\tdata-test-id=\"branches\"\n\t\t>\n\t\t\t<n8n-tabs\n\t\t\t\t:model-value=\"currentOutputIndex\"\n\t\t\t\t:options=\"branches\"\n\t\t\t\t@update:model-value=\"onBranchChange\"\n\t\t\t/>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-else-if=\"\n\t\t\t\t!hasRunError &&\n\t\t\t\thasNodeRun &&\n\t\t\t\t((dataCount > 0 && maxRunIndex === 0) || search) &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled && !hasRunError\"\n\t\t\t:class=\"$style.itemsCount\"\n\t\t\tdata-test-id=\"ndv-items-count\"\n\t\t>\n\t\t\t<n8n-text v-if=\"search\">\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\tadjustToNumber: unfilteredDataCount,\n\t\t\t\t\t\tinterpolate: { matched: dataCount, total: unfilteredDataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<n8n-text v-else>\n\t\t\t\t{{\n\t\t\t\t\t$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\tadjustToNumber: dataCount,\n\t\t\t\t\t\tinterpolate: { count: dataCount },\n\t\t\t\t\t})\n\t\t\t\t}}\n\t\t\t</n8n-text>\n\t\t\t<RunDataSearch\n\t\t\t\tv-if=\"showIOSearch\"\n\t\t\t\tv-model=\"search\"\n\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t:is-area-active=\"isPaneActive\"\n\t\t\t\t@focus=\"activatePane\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div ref=\"dataContainer\" :class=\"$style.dataContainer\" data-test-id=\"ndv-data-container\">\n\t\t\t<div v-if=\"isExecuting\" :class=\"$style.center\" data-test-id=\"ndv-executing\">\n\t\t\t\t<div :class=\"$style.spinner\"><n8n-spinner type=\"ring\" /></div>\n\t\t\t\t<n8n-text>{{ executingMessage }}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"editMode.enabled\" :class=\"$style.editMode\">\n\t\t\t\t<div :class=\"[$style.editModeBody, 'ignore-key-press']\">\n\t\t\t\t\t<JsonEditor\n\t\t\t\t\t\t:model-value=\"editMode.value\"\n\t\t\t\t\t\t:fill-parent=\"true\"\n\t\t\t\t\t\t@update:model-value=\"ndvStore.setOutputPanelEditModeValue($event)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.editModeFooter\">\n\t\t\t\t\t<n8n-info-tip :bold=\"false\" :class=\"$style.editModeFooterInfotip\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.editor.copyDataInfo') }}\n\t\t\t\t\t\t<n8n-link :to=\"dataEditingDocsUrl\" size=\"small\">\n\t\t\t\t\t\t\t{{ $locale.baseText('generic.learnMore') }}\n\t\t\t\t\t\t</n8n-link>\n\t\t\t\t\t</n8n-info-tip>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"paneType === 'output' && hasSubworkflowExecutionError\"\n\t\t\t\t:class=\"$style.stretchVertically\"\n\t\t\t>\n\t\t\t\t<NodeErrorView :error=\"subworkflowExecutionError\" :class=\"$style.errorDisplay\" />\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"!hasNodeRun\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"node-not-run\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"paneType === 'input' && node.disabled\" :class=\"$style.center\">\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled', { interpolate: { nodeName: node.name } }) }}\n\t\t\t\t\t<n8n-link @click=\"enableNode\">\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.disabled.cta') }}\n\t\t\t\t\t</n8n-link>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && isArtificialRecoveredEventItem\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"recovered-artificial-output-data\"></slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && hasRunError\" :class=\"$style.stretchVertically\">\n\t\t\t\t<n8n-text v-if=\"isPaneTypeInput\" :class=\"$style.center\" size=\"large\" tag=\"p\" bold>\n\t\t\t\t\t{{\n\t\t\t\t\t\t$locale.baseText('nodeErrorView.inputPanel.previousNodeError.title', {\n\t\t\t\t\t\t\tinterpolate: { nodeName: node.name },\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t</n8n-text>\n\t\t\t\t<slot v-else-if=\"$slots['content']\" name=\"content\"></slot>\n\t\t\t\t<NodeErrorView\n\t\t\t\t\tv-else\n\t\t\t\t\t:error=\"workflowRunData[node.name][runIndex].error\"\n\t\t\t\t\t:class=\"$style.dataDisplay\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun && (!unfilteredDataCount || (search && !dataCount)) && branches.length > 1\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<div v-if=\"search\">\n\t\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</i18n-t>\n\t\t\t\t\t</n8n-text>\n\t\t\t\t</div>\n\t\t\t\t<n8n-text v-else>\n\t\t\t\t\t{{ noDataInBranchMessage }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !inputData.length && !search\" :class=\"$style.center\">\n\t\t\t\t<slot name=\"no-output-data\">xxx</slot>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"hasNodeRun && !showData\" :class=\"$style.center\">\n\t\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{ tooMuchDataTitle }}</n8n-text>\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\"\n\t\t\t\t\t><span\n\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t$locale.baseText('ndv.output.tooMuchData.message', {\n\t\t\t\t\t\t\t\tinterpolate: { size: dataSizeInMB },\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\"\n\t\t\t\t\t></span\n\t\t\t\t></n8n-text>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\toutline\n\t\t\t\t\t:label=\"$locale.baseText('ndv.output.tooMuchData.showDataAnyway')\"\n\t\t\t\t\t@click=\"showTooMuchData\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t@click=\"downloadJsonData()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- V-else slot named content which only renders if $slots.content is passed and hasNodeRun -->\n\t\t\t<slot v-else-if=\"hasNodeRun && $slots['content']\" name=\"content\"></slot>\n\n\t\t\t<div\n\t\t\t\tv-else-if=\"\n\t\t\t\t\thasNodeRun &&\n\t\t\t\t\tdisplayMode === 'table' &&\n\t\t\t\t\tbinaryData.length > 0 &&\n\t\t\t\t\tinputData.length === 1 &&\n\t\t\t\t\tObject.keys(jsonData[0] || {}).length === 0\n\t\t\t\t\"\n\t\t\t\t:class=\"$style.center\"\n\t\t\t>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.info') }}\n\t\t\t\t\t<a @click=\"switchToBinary\">\n\t\t\t\t\t\t{{ $locale.baseText('runData.switchToBinary.binary') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"showIoSearchNoMatchContent\" :class=\"$style.center\">\n\t\t\t\t<n8n-text tag=\"h3\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.search.noMatch.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t<i18n-t keypath=\"ndv.search.noMatch.description\" tag=\"span\">\n\t\t\t\t\t\t<template #link>\n\t\t\t\t\t\t\t<a href=\"#\" @click=\"onSearchClear\">\n\t\t\t\t\t\t\t\t{{ $locale.baseText('ndv.search.noMatch.description.link') }}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</i18n-t>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'table'\">\n\t\t\t\t<RunDataTable\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:page-offset=\"currentPageOffset\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:has-default-hover-state=\"paneType === 'input' && !search\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t\t@mounted=\"$emit('tableMounted', $event)\"\n\t\t\t\t\t@active-row-changed=\"onItemHover\"\n\t\t\t\t\t@display-mode-change=\"onDisplayModeChange\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && displayMode === 'json'\">\n\t\t\t\t<RunDataJson\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:edit-mode=\"editMode\"\n\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:input-data=\"inputDataPage\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isPaneTypeOutput && displayMode === 'html'\">\n\t\t\t\t<RunDataHtml :input-html=\"inputDataPage[0].json.html\" />\n\t\t\t</Suspense>\n\n\t\t\t<Suspense v-else-if=\"hasNodeRun && isSchemaView\">\n\t\t\t\t<RunDataSchema\n\t\t\t\t\t:data=\"jsonData\"\n\t\t\t\t\t:mapping-enabled=\"mappingEnabled\"\n\t\t\t\t\t:distance-from-active=\"distanceFromActive\"\n\t\t\t\t\t:node=\"node\"\n\t\t\t\t\t:pane-type=\"paneType\"\n\t\t\t\t\t:run-index=\"runIndex\"\n\t\t\t\t\t:total-runs=\"maxRunIndex\"\n\t\t\t\t\t:search=\"search\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary' && binaryData.length === 0\" :class=\"$style.center\">\n\t\t\t\t<n8n-text align=\"center\" tag=\"div\">{{\n\t\t\t\t\t$locale.baseText('runData.noBinaryDataFound')\n\t\t\t\t}}</n8n-text>\n\t\t\t</div>\n\n\t\t\t<div v-else-if=\"displayMode === 'binary'\" :class=\"$style.dataDisplay\">\n\t\t\t\t<div v-for=\"(binaryDataEntry, index) in binaryData\" :key=\"index\">\n\t\t\t\t\t<div v-if=\"binaryData.length > 1\" :class=\"$style.binaryIndex\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{{ index + 1 }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div :class=\"$style.binaryRow\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(binaryData, key) in binaryDataEntry\"\n\t\t\t\t\t\t\t:key=\"index + '_' + key\"\n\t\t\t\t\t\t\t:class=\"$style.binaryCell\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div :data-test-id=\"'ndv-binary-data_' + index\">\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryHeader\">\n\t\t\t\t\t\t\t\t\t{{ key }}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileName\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileName') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileName }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.directory\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.directory') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.directory }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileExtension\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileExtension') }}:</n8n-text\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileExtension }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.mimeType\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.mimeType') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.mimeType }}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-if=\"binaryData.fileSize\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<n8n-text size=\"small\" :bold=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ $locale.baseText('runData.fileSize') }}:\n\t\t\t\t\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div :class=\"$style.binaryValue\">{{ binaryData.fileSize }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div :class=\"$style.binaryButtonContainer\">\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isViewable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.showBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-view-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"displayBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t\t\t\tv-if=\"isDownloadable(index, key)\"\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$locale.baseText('runData.downloadBinaryData')\"\n\t\t\t\t\t\t\t\t\t\tdata-test-id=\"ndv-download-binary-data\"\n\t\t\t\t\t\t\t\t\t\t@click=\"downloadBinaryData(index, key)\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"\n\t\t\t\thasNodeRun &&\n\t\t\t\t!hasRunError &&\n\t\t\t\tbinaryData.length === 0 &&\n\t\t\t\tdataCount > pageSize &&\n\t\t\t\t!isSchemaView &&\n\t\t\t\t!isArtificialRecoveredEventItem\n\t\t\t\"\n\t\t\tv-show=\"!editMode.enabled\"\n\t\t\t:class=\"$style.pagination\"\n\t\t\tdata-test-id=\"ndv-data-pagination\"\n\t\t>\n\t\t\t<el-pagination\n\t\t\t\tbackground\n\t\t\t\t:hide-on-single-page=\"true\"\n\t\t\t\t:current-page=\"currentPage\"\n\t\t\t\t:pager-count=\"5\"\n\t\t\t\t:page-size=\"pageSize\"\n\t\t\t\tlayout=\"prev, pager, next\"\n\t\t\t\t:total=\"dataCount\"\n\t\t\t\t@update:current-page=\"onCurrentPageChange\"\n\t\t\t>\n\t\t\t</el-pagination>\n\n\t\t\t<div :class=\"$style.pageSizeSelector\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tsize=\"mini\"\n\t\t\t\t\t:model-value=\"pageSize\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onPageSizeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.output.pageSize') }}</template>\n\t\t\t\t\t<n8n-option v-for=\"size in pageSizes\" :key=\"size\" :label=\"size\" :value=\"size\">\n\t\t\t\t\t</n8n-option>\n\t\t\t\t\t<n8n-option :label=\"$locale.baseText('ndv.output.all')\" :value=\"dataCount\"> </n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</div>\n\t\t<n8n-block-ui :show=\"blockUI\" :class=\"$style.uiBlocker\" />\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, toRef } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport { saveAs } from 'file-saver';\nimport type {\n\tConnectionTypes,\n\tIBinaryData,\n\tIBinaryKeyData,\n\tIDataObject,\n\tINodeExecutionData,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n} from 'n8n-workflow';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\n\nimport type {\n\tIExecutionResponse,\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIRunDataDisplayMode,\n\tITab,\n\tNodePanelType,\n} from '@/Interface';\n\nimport {\n\tDATA_PINNING_DOCS_URL,\n\tDATA_EDITING_DOCS_URL,\n\tNODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMAX_DISPLAY_DATA_SIZE,\n\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\tTEST_PIN_DATA,\n\tHTML_NODE_TYPE,\n} from '@/constants';\n\nimport BinaryDataDisplay from '@/components/BinaryDataDisplay.vue';\nimport NodeErrorView from '@/components/Error/NodeErrorView.vue';\nimport JsonEditor from '@/components/JsonEditor/JsonEditor.vue';\n\nimport type { PinDataSource } from '@/composables/usePinnedData';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { clearJsonKey, isEmpty } from '@/utils/typesUtils';\nimport { executionDataToJson } from '@/utils/nodeTypesUtils';\nimport { searchInObject } from '@/utils/objectUtils';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useToast } from '@/composables/useToast';\nimport { isEqual, isObject } from 'lodash-es';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport RunDataPinButton from '@/components/RunDataPinButton.vue';\n\nconst RunDataTable = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataTable.vue'),\n);\nconst RunDataJson = defineAsyncComponent(async () => await import('@/components/RunDataJson.vue'));\nconst RunDataSchema = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSchema.vue'),\n);\nconst RunDataHtml = defineAsyncComponent(async () => await import('@/components/RunDataHtml.vue'));\nconst RunDataSearch = defineAsyncComponent(\n\tasync () => await import('@/components/RunDataSearch.vue'),\n);\n\nexport type EnterEditModeArgs = {\n\torigin: 'editIconButton' | 'insertTestDataLink';\n};\n\nexport default defineComponent({\n\tname: 'RunData',\n\tcomponents: {\n\t\tBinaryDataDisplay,\n\t\tNodeErrorView,\n\t\tJsonEditor,\n\t\tRunDataTable,\n\t\tRunDataJson,\n\t\tRunDataSchema,\n\t\tRunDataHtml,\n\t\tRunDataSearch,\n\t\tRunDataPinButton,\n\t},\n\tprops: {\n\t\tnode: {\n\t\t\ttype: Object as PropType<INodeUi>,\n\t\t\tdefault: null,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\ttooMuchDataTitle: {\n\t\t\ttype: String,\n\t\t},\n\t\tnoDataInBranchMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tisExecuting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\texecutingMessage: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tpaneType: {\n\t\t\ttype: String as PropType<NodePanelType>,\n\t\t\trequired: true,\n\t\t},\n\t\toverrideOutputs: {\n\t\t\ttype: Array as PropType<number[]>,\n\t\t},\n\t\tmappingEnabled: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdistanceFromActive: {\n\t\t\ttype: Number,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst node = toRef(props, 'node');\n\t\tconst pinnedData = usePinnedData(node, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode(props.paneType),\n\t\t});\n\n\t\treturn {\n\t\t\t...useToast(),\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconnectionType: NodeConnectionType.Main,\n\t\t\tbinaryDataPreviewActive: false,\n\t\t\tdataSize: 0,\n\t\t\tshowData: false,\n\t\t\toutputIndex: 0,\n\t\t\tbinaryDataDisplayVisible: false,\n\t\t\tbinaryDataDisplayData: null as IBinaryData | null,\n\n\t\t\tMAX_DISPLAY_DATA_SIZE,\n\t\t\tMAX_DISPLAY_ITEMS_AUTO_ALL,\n\t\t\tcurrentPage: 1,\n\t\t\tpageSize: 10,\n\t\t\tpageSizes: [10, 25, 50, 100],\n\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tisControlledPinDataTooltip: false,\n\t\t\tsearch: '',\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseRootStore,\n\t\t),\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tdataPinningDocsUrl(): string {\n\t\t\treturn DATA_PINNING_DOCS_URL;\n\t\t},\n\t\tdataEditingDocsUrl(): string {\n\t\t\treturn DATA_EDITING_DOCS_URL;\n\t\t},\n\t\tdisplayMode(): IRunDataDisplayMode {\n\t\t\treturn this.ndvStore.getPanelDisplayMode(this.paneType);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisSchemaView(): boolean {\n\t\t\treturn this.displayMode === 'schema';\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst canPinNode = usePinnedData(this.node).canPinNode(false);\n\n\t\t\treturn (\n\t\t\t\tcanPinNode &&\n\t\t\t\t!this.isPaneTypeInput &&\n\t\t\t\tthis.pinnedData.isValidNodeType.value &&\n\t\t\t\t!(this.binaryData && this.binaryData.length > 0)\n\t\t\t);\n\t\t},\n\t\tbuttons(): Array<{ label: string; value: string }> {\n\t\t\tconst defaults = [\n\t\t\t\t{ label: this.$locale.baseText('runData.table'), value: 'table' },\n\t\t\t\t{ label: this.$locale.baseText('runData.json'), value: 'json' },\n\t\t\t];\n\n\t\t\tif (this.binaryData.length) {\n\t\t\t\tdefaults.push({ label: this.$locale.baseText('runData.binary'), value: 'binary' });\n\t\t\t}\n\n\t\t\tconst schemaView = { label: this.$locale.baseText('runData.schema'), value: 'schema' };\n\t\t\tif (this.isPaneTypeInput && !isEmpty(this.jsonData)) {\n\t\t\t\tdefaults.unshift(schemaView);\n\t\t\t} else {\n\t\t\t\tdefaults.push(schemaView);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.isPaneTypeOutput &&\n\t\t\t\tthis.activeNode?.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate'\n\t\t\t) {\n\t\t\t\tdefaults.unshift({ label: 'HTML', value: 'html' });\n\t\t\t}\n\n\t\t\treturn defaults;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\t!this.isExecuting &&\n\t\t\t\t\tthis.node &&\n\t\t\t\t\t((this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name)) ||\n\t\t\t\t\t\tthis.pinnedData.hasData.value),\n\t\t\t);\n\t\t},\n\t\tisArtificialRecoveredEventItem(): boolean {\n\t\t\treturn !!this.rawInputData?.[0]?.json?.isArtificialRecoveredEventItem;\n\t\t},\n\t\tsubworkflowExecutionError(): Error | null {\n\t\t\treturn this.workflowsStore.subWorkflowExecutionError;\n\t\t},\n\t\thasSubworkflowExecutionError(): boolean {\n\t\t\treturn Boolean(this.subworkflowExecutionError);\n\t\t},\n\t\thasRunError(): boolean {\n\t\t\treturn Boolean(this.node && this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error);\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tdataCount(): number {\n\t\t\treturn this.getDataCount(this.runIndex, this.currentOutputIndex);\n\t\t},\n\t\tunfilteredDataCount(): number {\n\t\t\treturn this.pinnedData.data.value\n\t\t\t\t? this.pinnedData.data.value.length\n\t\t\t\t: this.rawInputData.length;\n\t\t},\n\t\tdataSizeInMB(): string {\n\t\t\treturn (this.dataSize / 1024 / 1000).toLocaleString();\n\t\t},\n\t\tmaxOutputIndex(): number {\n\t\t\tif (this.node === null || this.runIndex === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length < this.runIndex) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name][this.runIndex]) {\n\t\t\t\tconst taskData = runData[this.node.name][this.runIndex].data;\n\t\t\t\tif (taskData?.main) {\n\t\t\t\t\treturn taskData.main.length - 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tcurrentPageOffset(): number {\n\t\t\treturn this.pageSize * (this.currentPage - 1);\n\t\t},\n\t\tmaxRunIndex(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\trawInputData(): INodeExecutionData[] {\n\t\t\treturn this.getRawInputData(this.runIndex, this.currentOutputIndex, this.connectionType);\n\t\t},\n\t\tinputData(): INodeExecutionData[] {\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(this.rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData);\n\t\t},\n\t\tinputDataPage(): INodeExecutionData[] {\n\t\t\tconst offset = this.pageSize * (this.currentPage - 1);\n\t\t\treturn this.inputData.slice(offset, offset + this.pageSize);\n\t\t},\n\t\tjsonData(): IDataObject[] {\n\t\t\treturn executionDataToJson(this.inputData);\n\t\t},\n\t\tbinaryData(): IBinaryKeyData[] {\n\t\t\tif (!this.node) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst binaryData = this.nodeHelpers.getBinaryData(\n\t\t\t\tthis.workflowRunData,\n\t\t\t\tthis.node.name,\n\t\t\t\tthis.runIndex,\n\t\t\t\tthis.currentOutputIndex,\n\t\t\t);\n\t\t\treturn binaryData.filter((data) => Boolean(data && Object.keys(data).length));\n\t\t},\n\t\tcurrentOutputIndex(): number {\n\t\t\tif (this.overrideOutputs?.length && !this.overrideOutputs.includes(this.outputIndex)) {\n\t\t\t\treturn this.overrideOutputs[0];\n\t\t\t}\n\n\t\t\treturn this.outputIndex;\n\t\t},\n\t\tbranches(): ITab[] {\n\t\t\tconst capitalize = (name: string) => name.charAt(0).toLocaleUpperCase() + name.slice(1);\n\n\t\t\tconst branches: ITab[] = [];\n\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\tif (this.overrideOutputs && !this.overrideOutputs.includes(i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst totalItemsCount = this.getRawInputData(this.runIndex, i).length;\n\t\t\t\tconst itemsCount = this.getDataCount(this.runIndex, i);\n\t\t\t\tconst items = this.search\n\t\t\t\t\t? this.$locale.baseText('ndv.search.items', {\n\t\t\t\t\t\t\tadjustToNumber: totalItemsCount,\n\t\t\t\t\t\t\tinterpolate: { matched: itemsCount, total: totalItemsCount },\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.$locale.baseText('ndv.output.items', {\n\t\t\t\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t\t\t\t});\n\t\t\t\tlet outputName = this.getOutputName(i);\n\n\t\t\t\tif (`${outputName}` === `${i}`) {\n\t\t\t\t\toutputName = `${this.$locale.baseText('ndv.output')} ${outputName}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst appendBranchWord = NODE_TYPES_EXCLUDED_FROM_OUTPUT_NAME_APPEND.includes(\n\t\t\t\t\t\tthis.node?.type,\n\t\t\t\t\t)\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: ` ${this.$locale.baseText('ndv.output.branch')}`;\n\t\t\t\t\toutputName = capitalize(`${this.getOutputName(i)}${appendBranchWord}`);\n\t\t\t\t}\n\t\t\t\tbranches.push({\n\t\t\t\t\tlabel:\n\t\t\t\t\t\t(this.search && itemsCount) || totalItemsCount\n\t\t\t\t\t\t\t? `${outputName} (${items})`\n\t\t\t\t\t\t\t: outputName,\n\t\t\t\t\tvalue: i,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn branches;\n\t\t},\n\t\teditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.isPaneTypeInput\n\t\t\t\t? { enabled: false, value: '' }\n\t\t\t\t: this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisPaneTypeInput(): boolean {\n\t\t\treturn this.paneType === 'input';\n\t\t},\n\t\tisPaneTypeOutput(): boolean {\n\t\t\treturn this.paneType === 'output';\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tshowIOSearch(): boolean {\n\t\t\treturn this.hasNodeRun && !this.hasRunError;\n\t\t},\n\t\tshowIoSearchNoMatchContent(): boolean {\n\t\t\treturn this.hasNodeRun && !this.inputData.length && this.search;\n\t\t},\n\t},\n\twatch: {\n\t\tnode(newNode: INodeUi, prevNode: INodeUi) {\n\t\t\tif (newNode.id === prevNode.id) return;\n\t\t\tthis.init();\n\t\t},\n\t\thasNodeRun() {\n\t\t\tif (this.paneType === 'output') this.setDisplayMode();\n\t\t},\n\t\tinputDataPage: {\n\t\t\thandler(data: INodeExecutionData[]) {\n\t\t\t\tif (this.paneType && data) {\n\t\t\t\t\tthis.ndvStore.setNDVPanelDataIsEmpty({\n\t\t\t\t\t\tpanel: this.paneType as 'input' | 'output',\n\t\t\t\t\t\tisEmpty: data.every((item) => isEmpty(item.json)),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t\tdeep: true,\n\t\t},\n\t\tjsonData(data: IDataObject[], prevData: IDataObject[]) {\n\t\t\tif (isEqual(data, prevData)) return;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.showPinDataDiscoveryTooltip(data);\n\t\t},\n\t\tbinaryData(newData: IBinaryKeyData[], prevData: IBinaryKeyData[]) {\n\t\t\tif (newData.length && !prevData.length && this.displayMode !== 'binary') {\n\t\t\t\tthis.switchToBinary();\n\t\t\t} else if (!newData.length && this.displayMode === 'binary') {\n\t\t\t\tthis.onDisplayModeChange('table');\n\t\t\t}\n\t\t},\n\t\tcurrentOutputIndex(branchIndex: number) {\n\t\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\tbranchIndex,\n\t\t\t});\n\t\t},\n\t\tsearch(newSearch: string) {\n\t\t\tthis.$emit('search', newSearch);\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.init();\n\n\t\tif (!this.isPaneTypeInput) {\n\t\t\tthis.showPinDataDiscoveryTooltip(this.jsonData);\n\t\t}\n\t\tthis.ndvStore.setNDVBranchIndex({\n\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\tbranchIndex: this.currentOutputIndex,\n\t\t});\n\n\t\tif (this.paneType === 'output') {\n\t\t\tthis.setDisplayMode();\n\t\t\tthis.activatePane();\n\t\t}\n\n\t\tif (this.hasRunError) {\n\t\t\tconst error = this.workflowRunData?.[this.node.name]?.[this.runIndex]?.error;\n\t\t\tconst errorsToTrack = ['unknown error'];\n\n\t\t\tif (error && errorsToTrack.some((e) => error.message.toLowerCase().includes(e))) {\n\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t`User encountered an error: \"${error.message}\"`,\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.node.type,\n\t\t\t\t\t\terrorMessage: error.message,\n\t\t\t\t\t\tnodeVersion: this.node.typeVersion,\n\t\t\t\t\t\tn8nVersion: this.rootStore.versionCli,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\tbeforeUnmount() {\n\t\tthis.hidePinDataDiscoveryTooltip();\n\t},\n\tmethods: {\n\t\tgetResolvedNodeOutputs() {\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst workflow = this.workflowsStore.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(this.node.name);\n\n\t\t\t\tif (workflowNode) {\n\t\t\t\t\tconst outputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, this.nodeType);\n\t\t\t\t\treturn outputs;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tonItemHover(itemIndex: number | null) {\n\t\t\tif (itemIndex === null) {\n\t\t\t\tthis.$emit('itemHover', null);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.$emit('itemHover', {\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\titemIndex,\n\t\t\t});\n\t\t},\n\t\tonClickDataPinningDocsLink() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'data-pinning-docs',\n\t\t\t});\n\t\t},\n\t\tshowPinDataDiscoveryTooltip(value: IDataObject[]) {\n\t\t\tif (!this.isTriggerNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pinDataDiscoveryFlag = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value;\n\n\t\t\tif (value && value.length > 0 && !this.isReadOnlyRoute && !pinDataDiscoveryFlag) {\n\t\t\t\tthis.pinDataDiscoveryComplete();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isControlledPinDataTooltip = true;\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: true });\n\t\t\t\t}, 500); // Wait for NDV to open\n\t\t\t}\n\t\t},\n\t\thidePinDataDiscoveryTooltip() {\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.isControlledPinDataTooltip = false;\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tdataPinningEventBus.emit('data-pinning-discovery', { isTooltipVisible: false });\n\t\t\t}\n\t\t},\n\t\tpinDataDiscoveryComplete() {\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_NDV_FLAG).value = 'true';\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\t\t},\n\t\tenterEditMode({ origin }: EnterEditModeArgs) {\n\t\t\tconst inputData = this.pinnedData.data.value\n\t\t\t\t? clearJsonKey(this.pinnedData.data.value)\n\t\t\t\t: executionDataToJson(this.rawInputData);\n\n\t\t\tconst data = inputData.length > 0 ? inputData : TEST_PIN_DATA;\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(true);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue(JSON.stringify(data, null, 2));\n\n\t\t\tthis.$telemetry.track('User opened ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tclick_type: origin === 'editIconButton' ? 'button' : 'link',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tis_output_present: this.hasNodeRun || this.pinnedData.hasData.value,\n\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'undefined' : this.displayMode,\n\t\t\t\tis_data_pinned: this.pinnedData.hasData.value,\n\t\t\t});\n\t\t},\n\t\tonClickCancelEdit() {\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\tthis.ndvStore.setOutputPanelEditModeValue('');\n\t\t\tthis.onExitEditMode({ type: 'cancel' });\n\t\t},\n\t\tonClickSaveEdit() {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst { value } = this.editMode;\n\n\t\t\tthis.clearAllStickyNotifications();\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(clearJsonKey(value) as INodeExecutionData[], 'save-edit');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\n\t\t\tthis.onExitEditMode({ type: 'save' });\n\t\t},\n\t\tonExitEditMode({ type }: { type: 'save' | 'cancel' }) {\n\t\t\tthis.$telemetry.track('User closed ndv edit state', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: this.runIndex,\n\t\t\t\tview: this.displayMode,\n\t\t\t\ttype,\n\t\t\t});\n\t\t},\n\t\tasync onTogglePinData({ source }: { source: PinDataSource }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (source === 'pin-icon-click') {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\trun_index: this.runIndex,\n\t\t\t\t\tview: !this.hasNodeRun && !this.pinnedData.hasData.value ? 'none' : this.displayMode,\n\t\t\t\t};\n\n\t\t\t\tvoid this.externalHooks.run('runData.onTogglePinData', telemetryPayload);\n\t\t\t\tthis.$telemetry.track('User clicked pin data icon', telemetryPayload);\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.updateNodeParameterIssues(this.node);\n\n\t\t\tif (this.pinnedData.hasData.value) {\n\t\t\t\tthis.pinnedData.unsetData(source);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.pinnedData.setData(this.rawInputData, 'pin-icon-click');\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.maxRunIndex > 0) {\n\t\t\t\tthis.showToast({\n\t\t\t\t\ttitle: this.$locale.baseText('ndv.pinData.pin.multipleRuns.title', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tindex: `${this.runIndex}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t\tmessage: this.$locale.baseText('ndv.pinData.pin.multipleRuns.description'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t\tduration: 2000,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.hidePinDataDiscoveryTooltip();\n\t\t\tthis.pinDataDiscoveryComplete();\n\t\t},\n\t\tswitchToBinary() {\n\t\t\tthis.onDisplayModeChange('binary');\n\t\t},\n\t\tonBranchChange(value: number) {\n\t\t\tthis.outputIndex = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv branch', {\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tbranch_index: value,\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tnode_type_input_selection: this.nodeType ? this.nodeType.name : '',\n\t\t\t\tpane: this.paneType,\n\t\t\t});\n\t\t},\n\t\tshowTooMuchData() {\n\t\t\tthis.showData = true;\n\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\ttype: 'showTooMuchData',\n\t\t\t});\n\t\t},\n\t\ttoggleLinkRuns() {\n\t\t\tthis.linkedRuns ? this.unlinkRun() : this.linkRun();\n\t\t},\n\t\tlinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tunlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonCurrentPageChange(value) {\n\t\t\tthis.currentPage = value;\n\t\t\tthis.$telemetry.track('User changed ndv page', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonPageSizeChange(pageSize: number) {\n\t\t\tthis.pageSize = pageSize;\n\t\t\tconst maxPage = Math.ceil(this.dataCount / this.pageSize);\n\t\t\tif (maxPage < this.currentPage) {\n\t\t\t\tthis.currentPage = maxPage;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track('User changed ndv page size', {\n\t\t\t\tnode_type: this.activeNode?.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: this.paneType,\n\t\t\t\tpage_selected: this.currentPage,\n\t\t\t\tpage_size: this.pageSize,\n\t\t\t\titems_total: this.dataCount,\n\t\t\t});\n\t\t},\n\t\tonDisplayModeChange(displayMode: IRunDataDisplayMode) {\n\t\t\tconst previous = this.displayMode;\n\t\t\tthis.ndvStore.setPanelDisplayMode({ pane: this.paneType, mode: displayMode });\n\n\t\t\tconst dataContainerRef = this.$refs.dataContainer as Element | undefined;\n\t\t\tif (dataContainerRef) {\n\t\t\t\tconst dataDisplay = dataContainerRef.children[0];\n\n\t\t\t\tif (dataDisplay) {\n\t\t\t\t\tdataDisplay.scrollTo(0, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tvoid this.externalHooks.run('runData.displayModeChanged', {\n\t\t\t\tnewValue: displayMode,\n\t\t\t\toldValue: previous,\n\t\t\t});\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User changed ndv item view', {\n\t\t\t\t\tprevious_view: previous,\n\t\t\t\t\tnew_view: displayMode,\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: this.paneType,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tgetRunLabel(option: number) {\n\t\t\tlet itemsCount = 0;\n\t\t\tfor (let i = 0; i <= this.maxOutputIndex; i++) {\n\t\t\t\titemsCount += this.getPinDataOrLiveData(this.getRawInputData(option - 1, i)).length;\n\t\t\t}\n\t\t\tconst items = this.$locale.baseText('ndv.output.items', {\n\t\t\t\tadjustToNumber: itemsCount,\n\t\t\t\tinterpolate: { count: itemsCount },\n\t\t\t});\n\t\t\tconst itemsLabel = itemsCount > 0 ? ` (${items})` : '';\n\t\t\treturn option + this.$locale.baseText('ndv.output.of') + (this.maxRunIndex + 1) + itemsLabel;\n\t\t},\n\t\tgetRawInputData(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t): INodeExecutionData[] {\n\t\t\tlet inputData: INodeExecutionData[] = [];\n\n\t\t\tif (this.node) {\n\t\t\t\tinputData = this.nodeHelpers.getNodeInputData(\n\t\t\t\t\tthis.node,\n\t\t\t\t\trunIndex,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tthis.paneType,\n\t\t\t\t\tconnectionType,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (inputData.length === 0 || !Array.isArray(inputData)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn inputData;\n\t\t},\n\t\tgetPinDataOrLiveData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (this.pinnedData.data.value && !this.isProductionExecutionPreview) {\n\t\t\t\treturn Array.isArray(this.pinnedData.data.value)\n\t\t\t\t\t? this.pinnedData.data.value.map((value) => ({\n\t\t\t\t\t\t\tjson: value,\n\t\t\t\t\t\t}))\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tjson: this.pinnedData.data.value,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t];\n\t\t\t}\n\t\t\treturn inputData;\n\t\t},\n\t\tgetFilteredData(inputData: INodeExecutionData[]): INodeExecutionData[] {\n\t\t\tif (!this.search) {\n\t\t\t\treturn inputData;\n\t\t\t}\n\n\t\t\tthis.currentPage = 1;\n\t\t\treturn inputData.filter(({ json }) => searchInObject(json, this.search));\n\t\t},\n\t\tgetDataCount(\n\t\t\trunIndex: number,\n\t\t\toutputIndex: number,\n\t\t\tconnectionType: ConnectionTypes = NodeConnectionType.Main,\n\t\t) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (this.workflowRunData?.[this.node.name]?.[runIndex]?.hasOwnProperty('error')) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tconst rawInputData = this.getRawInputData(runIndex, outputIndex, connectionType);\n\t\t\tconst pinOrLiveData = this.getPinDataOrLiveData(rawInputData);\n\t\t\treturn this.getFilteredData(pinOrLiveData).length;\n\t\t},\n\t\tinit() {\n\t\t\t// Reset the selected output index every time another node gets selected\n\t\t\tthis.outputIndex = 0;\n\t\t\tthis.refreshDataSize();\n\t\t\tthis.closeBinaryDataDisplay();\n\t\t\tlet outputTypes: ConnectionTypes[] = [];\n\t\t\tif (this.nodeType !== null && this.node !== null) {\n\t\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\t\toutputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t}\n\t\t\tthis.connectionType = outputTypes.length === 0 ? NodeConnectionType.Main : outputTypes[0];\n\t\t\tif (this.binaryData.length > 0) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'binary',\n\t\t\t\t});\n\t\t\t} else if (this.displayMode === 'binary') {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: this.paneType as 'input' | 'output',\n\t\t\t\t\tmode: 'table',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcloseBinaryDataDisplay() {\n\t\t\tthis.binaryDataDisplayVisible = false;\n\t\t\tthis.binaryDataDisplayData = null;\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(null);\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tisViewable(index: number, key: string): boolean {\n\t\t\tconst { fileType } = this.binaryData[index][key];\n\t\t\treturn (\n\t\t\t\t!!fileType && ['image', 'audio', 'video', 'text', 'json', 'pdf', 'html'].includes(fileType)\n\t\t\t);\n\t\t},\n\t\tisDownloadable(index: number, key: string): boolean {\n\t\t\tconst { mimeType, fileName } = this.binaryData[index][key];\n\t\t\treturn !!(mimeType && fileName);\n\t\t},\n\t\tasync downloadBinaryData(index: number, key: string) {\n\t\t\tconst { id, data, fileName, fileExtension, mimeType } = this.binaryData[index][key];\n\n\t\t\tif (id) {\n\t\t\t\tconst url = this.workflowsStore.getBinaryUrl(id, 'download', fileName, mimeType);\n\t\t\t\tsaveAs(url, [fileName, fileExtension].join('.'));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst bufferString = 'data:' + mimeType + ';base64,' + data;\n\t\t\t\tconst blob = await fetch(bufferString).then(async (d) => await d.blob());\n\t\t\t\tsaveAs(blob, fileName);\n\t\t\t}\n\t\t},\n\t\tasync downloadJsonData() {\n\t\t\tconst fileName = this.node.name.replace(/[^\\w\\d]/g, '_');\n\t\t\tconst blob = new Blob([JSON.stringify(this.rawInputData, null, 2)], {\n\t\t\t\ttype: 'application/json',\n\t\t\t});\n\n\t\t\tsaveAs(blob, `${fileName}.json`);\n\t\t},\n\t\tdisplayBinaryData(index: number, key: string) {\n\t\t\tthis.binaryDataDisplayVisible = true;\n\n\t\t\tthis.binaryDataDisplayData = {\n\t\t\t\tnode: this.node.name,\n\t\t\t\trunIndex: this.runIndex,\n\t\t\t\toutputIndex: this.currentOutputIndex,\n\t\t\t\tindex,\n\t\t\t\tkey,\n\t\t\t};\n\t\t},\n\t\tgetOutputName(outputIndex: number) {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\tconst nodeType = this.nodeType;\n\t\t\tconst outputs = this.getResolvedNodeOutputs();\n\t\t\tconst outputConfiguration = outputs?.[outputIndex] as INodeOutputConfiguration;\n\n\t\t\tif (outputConfiguration && isObject(outputConfiguration)) {\n\t\t\t\treturn outputConfiguration?.displayName;\n\t\t\t}\n\t\t\tif (!nodeType?.outputNames || nodeType.outputNames.length <= outputIndex) {\n\t\t\t\treturn outputIndex + 1;\n\t\t\t}\n\n\t\t\treturn nodeType.outputNames[outputIndex];\n\t\t},\n\t\trefreshDataSize() {\n\t\t\t// Hide by default the data from being displayed\n\t\t\tthis.showData = false;\n\t\t\tconst jsonItems = this.inputDataPage.map((item) => item.json);\n\t\t\tthis.dataSize = JSON.stringify(jsonItems).length;\n\t\t\tif (this.dataSize < this.MAX_DISPLAY_DATA_SIZE) {\n\t\t\t\t// Data is reasonable small (< 200kb) so display it directly\n\t\t\t\tthis.showData = true;\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tenableNode() {\n\t\t\tif (this.node) {\n\t\t\t\tconst updateInformation = {\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tdisabled: !this.node.disabled,\n\t\t\t\t\t} as IDataObject,\n\t\t\t\t} as INodeUpdatePropertiesInformation;\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetDisplayMode() {\n\t\t\tif (!this.activeNode) return;\n\n\t\t\tconst shouldDisplayHtml =\n\t\t\t\tthis.activeNode.type === HTML_NODE_TYPE &&\n\t\t\t\tthis.activeNode.parameters.operation === 'generateHtmlTemplate';\n\n\t\t\tif (shouldDisplayHtml) {\n\t\t\t\tthis.ndvStore.setPanelDisplayMode({\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\tmode: 'html',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t\tonSearchClear() {\n\t\t\tthis.search = '';\n\t\t\tdocument.dispatchEvent(new KeyboardEvent('keyup', { key: '/' }));\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.infoIcon {\n\tcolor: var(--color-foreground-dark);\n}\n\n.center {\n\tdisplay: flex;\n\theight: 100%;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\n\t> * {\n\t\tmax-width: 316px;\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-run-data-background);\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.pinnedDataCallout {\n\tborder-radius: inherit;\n\tborder-bottom-right-radius: 0;\n\tborder-top: 0;\n\tborder-left: 0;\n\tborder-right: 0;\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n\tpadding: var(--spacing-s) var(--spacing-s) 0 var(--spacing-s);\n\tposition: relative;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tmin-height: calc(30px + var(--spacing-s));\n\n\t> *:first-child {\n\t\tflex-grow: 1;\n\t}\n}\n\n.dataContainer {\n\tposition: relative;\n\toverflow-y: auto;\n\theight: 100%;\n\n\t&:hover {\n\t\t.actions-group {\n\t\t\topacity: 1;\n\t\t}\n\t}\n}\n\n.dataDisplay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 0 var(--spacing-s) var(--spacing-3xl) var(--spacing-s);\n\tright: 0;\n\toverflow-y: auto;\n\tline-height: var(--font-line-height-xloose);\n\tword-break: normal;\n\theight: 100%;\n}\n\n.tabs {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.itemsCount {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n}\n\n.runSelector {\n\tpadding-left: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n\tdisplay: flex;\n\twidth: 100%;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.runSelectorWrapper {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.pagination {\n\twidth: 100%;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tbottom: 0;\n\tpadding: 5px;\n\toverflow-y: hidden;\n}\n\n.pageSizeSelector {\n\ttext-transform: capitalize;\n\tmax-width: 150px;\n\tflex: 0 1 auto;\n}\n\n.binaryIndex {\n\tdisplay: block;\n\tpadding: var(--spacing-2xs);\n\tfont-size: var(--font-size-2xs);\n\n\t> * {\n\t\tdisplay: inline-block;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t\tborder-radius: var(--border-radius-base);\n\t\ttext-align: center;\n\t\tbackground-color: var(--color-foreground-xdark);\n\t\tfont-weight: var(--font-weight-bold);\n\t\tcolor: var(--color-text-xlight);\n\t}\n}\n\n.binaryRow {\n\tdisplay: inline-flex;\n\tfont-size: var(--font-size-2xs);\n}\n\n.binaryCell {\n\tdisplay: inline-block;\n\twidth: 300px;\n\toverflow: hidden;\n\tbackground-color: var(--color-foreground-xlight);\n\tmargin-right: var(--spacing-s);\n\tmargin-bottom: var(--spacing-s);\n\tborder-radius: var(--border-radius-base);\n\tborder: var(--border-base);\n\tpadding: var(--spacing-s);\n}\n\n.binaryHeader {\n\tcolor: $color-primary;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: 1.2em;\n\tpadding-bottom: var(--spacing-2xs);\n\tmargin-bottom: var(--spacing-2xs);\n\tborder-bottom: 1px solid var(--color-text-light);\n}\n\n.binaryButtonContainer {\n\tmargin-top: 1.5em;\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: center;\n\n\t> * {\n\t\tflex-grow: 0;\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n.binaryValue {\n\twhite-space: initial;\n\tword-wrap: break-word;\n}\n\n.displayModes {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tflex-grow: 1;\n}\n.tooltipContain {\n\tmax-width: 240px;\n}\n\n.spinner {\n\t* {\n\t\tcolor: var(--color-primary);\n\t\tmin-height: 40px;\n\t\tmin-width: 40px;\n\t}\n\n\tdisplay: flex;\n\tjustify-content: center;\n\tmargin-bottom: var(--spacing-s);\n}\n\n.editMode {\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: stretch;\n\tpadding-left: var(--spacing-s);\n\tpadding-right: var(--spacing-s);\n}\n\n.editModeBody {\n\tflex: 1 1 auto;\n\tmax-height: 100%;\n\twidth: 100%;\n\toverflow: auto;\n}\n\n.editModeFooter {\n\tflex: 0 1 auto;\n\tdisplay: flex;\n\twidth: 100%;\n\tjustify-content: space-between;\n\talign-items: center;\n\tpadding-top: var(--spacing-s);\n\tpadding-bottom: var(--spacing-s);\n}\n\n.editModeFooterInfotip {\n\tdisplay: flex;\n\tflex: 1;\n\twidth: 100%;\n}\n\n.editModeActions {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\tmargin-left: var(--spacing-s);\n}\n\n.stretchVertically {\n\theight: 100%;\n}\n\n.uiBlocker {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.run-data {\n\t.code-node-editor {\n\t\theight: 100%;\n\t}\n}\n</style>\n\n<style lang=\"scss\" scoped>\n:deep(.highlight) {\n\tbackground-color: #f7dc55;\n\tcolor: black;\n\tborder-radius: var(--border-radius-base);\n\tpadding: 0 1px;\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n</style>\n","<template>\n\t<n8n-info-tip\n\t\tv-if=\"hasStaleData\"\n\t\ttheme=\"warning\"\n\t\ttype=\"tooltip\"\n\t\ttooltip-placement=\"right\"\n\t\tdata-test-id=\"node-run-info-stale\"\n\t>\n\t\t<span\n\t\t\tv-html=\"\n\t\t\t\t$locale.baseText(\n\t\t\t\t\thasPinData\n\t\t\t\t\t\t? 'ndv.output.staleDataWarning.pinData'\n\t\t\t\t\t\t: 'ndv.output.staleDataWarning.regular',\n\t\t\t\t)\n\t\t\t\"\n\t\t></span>\n\t</n8n-info-tip>\n\t<n8n-info-tip\n\t\tv-else-if=\"runMetadata\"\n\t\ttype=\"tooltip\"\n\t\t:theme=\"theme\"\n\t\t:data-test-id=\"`node-run-info-${theme}`\"\n\t\ttooltip-placement=\"right\"\n\t>\n\t\t<div>\n\t\t\t<n8n-text :bold=\"true\" size=\"small\"\n\t\t\t\t>{{\n\t\t\t\t\trunTaskData.error\n\t\t\t\t\t\t? $locale.baseText('runData.executionStatus.failed')\n\t\t\t\t\t\t: $locale.baseText('runData.executionStatus.success')\n\t\t\t\t}} </n8n-text\n\t\t\t><br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.startTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.startTime }}<br />\n\t\t\t<n8n-text :bold=\"true\" size=\"small\">{{\n\t\t\t\t$locale.baseText('runData.executionTime') + ':'\n\t\t\t}}</n8n-text>\n\t\t\t{{ runMetadata.executionTime }} {{ $locale.baseText('runData.ms') }}\n\t\t</div>\n\t</n8n-info-tip>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { ITaskData } from 'n8n-workflow';\nimport { convertToDisplayDateComponents } from '@/utils/formatters/dateFormatter';\n\nexport default defineComponent({\n\tprops: {\n\t\ttaskData: {}, // ITaskData\n\t\thasStaleData: Boolean,\n\t\thasPinData: Boolean,\n\t},\n\n\tcomputed: {\n\t\ttheme(): string {\n\t\t\treturn this.runTaskData?.error ? 'danger' : 'success';\n\t\t},\n\t\trunTaskData(): ITaskData {\n\t\t\treturn this.taskData as ITaskData;\n\t\t},\n\t\trunMetadata(): { executionTime: number; startTime: string } | null {\n\t\t\tif (!this.runTaskData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst { date, time } = convertToDisplayDateComponents(this.runTaskData.startTime);\n\t\t\treturn {\n\t\t\t\texecutionTime: this.runTaskData.executionTime,\n\t\t\t\tstartTime: `${date} at ${time}`,\n\t\t\t};\n\t\t},\n\t},\n});\n</script>\n","<template>\n\t<RunData\n\t\tref=\"runData\"\n\t\t:node=\"node\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.output.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.output.noOutputDataInBranch')\"\n\t\t:is-executing=\"isNodeRunning\"\n\t\t:executing-message=\"$locale.baseText('ndv.output.executing')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:block-u-i=\"blockUI\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"output\"\n\t\t:data-output-type=\"outputMode\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<template v-if=\"hasAiMetadata\">\n\t\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\t\tv-model=\"outputMode\"\n\t\t\t\t\t\t:options=\"outputTypes\"\n\t\t\t\t\t\t@update:model-value=\"onUpdateOutputMode\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<span v-else :class=\"$style.title\">\n\t\t\t\t\t{{ $locale.baseText(outputPanelEditMode.enabled ? 'ndv.output.edit' : 'ndv.output') }}\n\t\t\t\t</span>\n\t\t\t\t<RunInfo\n\t\t\t\t\tv-if=\"hasNodeRun && !pinnedData.hasData.value && runsCount === 1\"\n\t\t\t\t\tv-show=\"!outputPanelEditMode.enabled\"\n\t\t\t\t\t:task-data=\"runTaskData\"\n\t\t\t\t\t:has-stale-data=\"staleData\"\n\t\t\t\t\t:has-pin-data=\"pinnedData.hasData.value\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #node-not-run>\n\t\t\t<n8n-text v-if=\"workflowRunning && !isTriggerNode\" data-test-id=\"ndv-output-waiting\">{{\n\t\t\t\t$locale.baseText('ndv.output.waitingToRun')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text v-if=\"!workflowRunning\" data-test-id=\"ndv-output-run-node-hint\">\n\t\t\t\t<template v-if=\"isSubNodeType.value\">\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHintSubNode') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ $locale.baseText('ndv.output.runNodeHint') }}\n\t\t\t\t\t<span v-if=\"canPinData\" @click=\"insertTestData\">\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t{{ $locale.baseText('generic.or') }}\n\t\t\t\t\t\t<n8n-text tag=\"a\" size=\"medium\" color=\"primary\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.output.insertTestData') }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.output.noOutputData.title')\n\t\t\t}}</n8n-text>\n\t\t\t<n8n-text>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message') }}\n\t\t\t\t<a @click=\"openSettings\">{{\n\t\t\t\t\t$locale.baseText('ndv.output.noOutputData.message.settings')\n\t\t\t\t}}</a>\n\t\t\t\t{{ $locale.baseText('ndv.output.noOutputData.message.settingsOption') }}\n\t\t\t</n8n-text>\n\t\t</template>\n\n\t\t<template v-if=\"outputMode === 'logs'\" #content>\n\t\t\t<RunDataAi :node=\"node\" :run-index=\"runIndex\" />\n\t\t</template>\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template v-if=\"!pinnedData.hasData.value && runsCount > 1\" #run-info>\n\t\t\t<RunInfo :task-data=\"runTaskData\" />\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport type { IExecutionResponse, INodeUi } from '@/Interface';\nimport type { INodeTypeDescription, IRunData, IRunExecutionData, ITaskData } from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport RunInfo from './RunInfo.vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport RunDataAi from './RunDataAi/RunDataAi.vue';\nimport { ndvEventBus } from '@/event-bus';\nimport { useNodeType } from '@/composables/useNodeType';\nimport { usePinnedData } from '@/composables/usePinnedData';\n\ntype RunDataRef = InstanceType<typeof RunData>;\n\nconst OUTPUT_TYPE = {\n\tREGULAR: 'regular',\n\tLOGS: 'logs',\n};\n\nexport default defineComponent({\n\tname: 'OutputPanel',\n\tcomponents: { RunData, RunInfo, RunDataAi },\n\tprops: {\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\tblockUI: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst { isSubNodeType } = useNodeType({\n\t\t\tnode: activeNode,\n\t\t});\n\t\tconst pinnedData = usePinnedData(activeNode, {\n\t\t\trunIndex: props.runIndex,\n\t\t\tdisplayMode: ndvStore.getPanelDisplayMode('output'),\n\t\t});\n\n\t\treturn {\n\t\t\tpinnedData,\n\t\t\tisSubNodeType,\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\toutputMode: 'regular',\n\t\t\toutputTypes: [\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.regular'), value: OUTPUT_TYPE.REGULAR },\n\t\t\t\t{ label: this.$locale.baseText('ndv.output.outType.logs'), value: OUTPUT_TYPE.LOGS },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.node.type);\n\t\t},\n\t\thasAiMetadata(): boolean {\n\t\t\tif (this.node) {\n\t\t\t\tconst resultData = this.workflowsStore.getWorkflowResultDataByNodeName(this.node.name);\n\n\t\t\t\tif (!resultData || !Array.isArray(resultData) || resultData.length === 0) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn !!resultData[resultData.length - 1].metadata;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisScheduleTrigger(): boolean {\n\t\t\treturn !!(this.nodeType && this.nodeType.group.includes('schedule'));\n\t\t},\n\t\tisNodeRunning(): boolean {\n\t\t\treturn this.node && this.workflowsStore.isNodeExecuting(this.node.name);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (!executionData?.resultData?.runData) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn executionData.resultData.runData;\n\t\t},\n\t\thasNodeRun(): boolean {\n\t\t\tif (this.workflowsStore.subWorkflowExecutionError) return true;\n\n\t\t\treturn Boolean(\n\t\t\t\tthis.node && this.workflowRunData && this.workflowRunData.hasOwnProperty(this.node.name),\n\t\t\t);\n\t\t},\n\t\trunTaskData(): ITaskData | null {\n\t\t\tif (!this.node || this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst runData = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length <= this.runIndex) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn runData[this.node.name][this.runIndex];\n\t\t},\n\t\trunsCount(): number {\n\t\t\tif (this.node === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.node.name].length) {\n\t\t\t\treturn runData[this.node.name].length;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tstaleData(): boolean {\n\t\t\tif (!this.node) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst updatedAt = this.workflowsStore.getParametersLastUpdate(this.node.name);\n\t\t\tif (!updatedAt || !this.runTaskData) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst runAt = this.runTaskData.startTime;\n\t\t\treturn updatedAt > runAt;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tcanPinData(): boolean {\n\t\t\treturn this.pinnedData.isValidNodeType.value && !this.isReadOnly;\n\t\t},\n\t},\n\tmethods: {\n\t\tinsertTestData() {\n\t\t\tconst runDataRef = this.$refs.runData as RunDataRef | undefined;\n\t\t\tif (runDataRef) {\n\t\t\t\trunDataRef.enterEditMode({\n\t\t\t\t\torigin: 'insertTestDataLink',\n\t\t\t\t});\n\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tnode_type: this.node.type,\n\t\t\t\t\tpane: 'output',\n\t\t\t\t\ttype: 'insert-test-data',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.$emit('openSettings');\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tnode_type: this.node.type,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'output',\n\t\t\t\ttype: 'settings',\n\t\t\t});\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonUpdateOutputMode(outputMode: (typeof OUTPUT_TYPE)[string]) {\n\t\t\tif (outputMode === OUTPUT_TYPE.LOGS) {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'minLeft');\n\t\t\t} else {\n\t\t\t\tndvEventBus.emit('setPositionByName', 'initial');\n\t\t\t}\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n// The items count and displayModes are rendered in the RunData component\n// this is a workaround to hide it in the output panel(for ai type) to not add unnecessary one-time props\n:global([data-output-type='logs'] [class*='itemsCount']),\n:global([data-output-type='logs'] [class*='displayModes']) {\n\tdisplay: none;\n}\n.outputTypeSelect {\n\tmargin-bottom: var(--spacing-4xs);\n\twidth: fit-content;\n}\n.titleSection {\n\tdisplay: flex;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-s);\n}\n\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n</style>\n","<template>\n\t<svg\n\t\twidth=\"112\"\n\t\theight=\"80\"\n\t\tviewBox=\"0 0 112 80\"\n\t\tfill=\"none\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\txmlns:xlink=\"http://www.w3.org/1999/xlink\"\n\t>\n\t\t<mask\n\t\t\tid=\"mask0_489_46042\"\n\t\t\tstyle=\"mask-type: alpha\"\n\t\t\tmaskUnits=\"userSpaceOnUse\"\n\t\t\tx=\"0\"\n\t\t\ty=\"0\"\n\t\t\twidth=\"112\"\n\t\t\theight=\"80\"\n\t\t>\n\t\t\t<rect width=\"112\" height=\"80\" fill=\"url(#paint0_linear_489_46042)\" />\n\t\t</mask>\n\t\t<g mask=\"url(#mask0_489_46042)\">\n\t\t\t<rect x=\"-0.5\" width=\"112\" height=\"80\" fill=\"url(#pattern0)\" fill-opacity=\"0.6\" />\n\t\t</g>\n\t\t<defs>\n\t\t\t<pattern id=\"pattern0\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n\t\t\t\t<use xlink:href=\"#image0_489_46042\" transform=\"scale(0.00357143 0.005)\" />\n\t\t\t</pattern>\n\t\t\t<linearGradient\n\t\t\t\tid=\"paint0_linear_489_46042\"\n\t\t\t\tx1=\"90.5\"\n\t\t\t\ty1=\"40.4494\"\n\t\t\t\tx2=\"112.5\"\n\t\t\t\ty2=\"40.4494\"\n\t\t\t\tgradientUnits=\"userSpaceOnUse\"\n\t\t\t>\n\t\t\t\t<stop />\n\t\t\t\t<stop offset=\"1\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<image\n\t\t\t\tid=\"image0_489_46042\"\n\t\t\t\twidth=\"280\"\n\t\t\t\theight=\"200\"\n\t\t\t\txlink:href=\"data:image/png;base64,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\"\n\t\t\t/>\n\t\t</defs>\n\t</svg>\n</template>\n","<template>\n\t<RunData\n\t\t:node=\"currentNode\"\n\t\t:run-index=\"runIndex\"\n\t\t:linked-runs=\"linkedRuns\"\n\t\t:can-link-runs=\"!mappedNode && canLinkRuns\"\n\t\t:too-much-data-title=\"$locale.baseText('ndv.input.tooMuchData.title')\"\n\t\t:no-data-in-branch-message=\"$locale.baseText('ndv.input.noOutputDataInBranch')\"\n\t\t:is-executing=\"isExecutingPrevious\"\n\t\t:executing-message=\"$locale.baseText('ndv.input.executingPrevious')\"\n\t\t:push-ref=\"pushRef\"\n\t\t:override-outputs=\"connectedCurrentNodeOutputs\"\n\t\t:mapping-enabled=\"isMappingEnabled\"\n\t\t:distance-from-active=\"currentNodeDepth\"\n\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t:is-pane-active=\"isPaneActive\"\n\t\tpane-type=\"input\"\n\t\tdata-test-id=\"ndv-input-panel\"\n\t\t@activate-pane=\"activatePane\"\n\t\t@item-hover=\"$emit('itemHover', $event)\"\n\t\t@link-run=\"onLinkRun\"\n\t\t@unlink-run=\"onUnlinkRun\"\n\t\t@run-change=\"onRunIndexChange\"\n\t\t@table-mounted=\"$emit('tableMounted', $event)\"\n\t\t@search=\"$emit('search', $event)\"\n\t>\n\t\t<template #header>\n\t\t\t<div :class=\"$style.titleSection\">\n\t\t\t\t<n8n-select\n\t\t\t\t\tv-if=\"parentNodes.length\"\n\t\t\t\t\tteleported\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t:model-value=\"currentNodeName\"\n\t\t\t\t\t:no-data-text=\"$locale.baseText('ndv.input.noNodesFound')\"\n\t\t\t\t\t:placeholder=\"$locale.baseText('ndv.input.parentNodes')\"\n\t\t\t\t\tfilterable\n\t\t\t\t\tdata-test-id=\"ndv-input-select\"\n\t\t\t\t\t@update:model-value=\"onInputNodeChange\"\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>\n\t\t\t\t\t\t<span :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t\t</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"node of parentNodes\"\n\t\t\t\t\t\t:key=\"node.name\"\n\t\t\t\t\t\t:value=\"node.name\"\n\t\t\t\t\t\tclass=\"node-option\"\n\t\t\t\t\t\t:label=\"`${truncate(node.name)} ${getMultipleNodesText(node.name)}`\"\n\t\t\t\t\t\tdata-test-id=\"ndv-input-option\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span>{{ truncate(node.name) }} </span>\n\t\t\t\t\t\t<span v-if=\"getMultipleNodesText(node.name)\">{{\n\t\t\t\t\t\t\tgetMultipleNodesText(node.name)\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t<span v-else>{{\n\t\t\t\t\t\t\t$locale.baseText('ndv.input.nodeDistance', { adjustToNumber: node.depth })\n\t\t\t\t\t\t}}</span>\n\t\t\t\t\t</n8n-option>\n\t\t\t\t</n8n-select>\n\t\t\t\t<span v-else :class=\"$style.title\">{{ $locale.baseText('ndv.input') }}</span>\n\t\t\t\t<n8n-radio-buttons\n\t\t\t\t\tv-if=\"isActiveNodeConfig && !readOnly\"\n\t\t\t\t\t:options=\"inputModes\"\n\t\t\t\t\t:model-value=\"inputMode\"\n\t\t\t\t\t@update:model-value=\"onInputModeChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</template>\n\t\t<template v-if=\"isMappingMode\" #before-data>\n\t\t\t<!--\n\t\t\t\t\t\tHide the run linking buttons for both input and ouput panels when in 'Mapping Mode' because the run indices wouldn't match.\n\t\t\t\t\t\tAlthough this is not the most elegant solution, it's straightforward and simpler than introducing a new props and logic to handle this.\n\t\t\t\t-->\n\t\t\t<component :is=\"'style'\">button.linkRun { display: none }</component>\n\t\t\t<div :class=\"$style.mappedNode\">\n\t\t\t\t<n8n-select\n\t\t\t\t\t:model-value=\"mappedNode\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\tteleported\n\t\t\t\t\t@update:model-value=\"onMappedNodeSelected\"\n\t\t\t\t\t@click.stop\n\t\t\t\t>\n\t\t\t\t\t<template #prepend>{{ $locale.baseText('ndv.input.previousNode') }}</template>\n\t\t\t\t\t<n8n-option\n\t\t\t\t\t\tv-for=\"nodeName in rootNodesParents\"\n\t\t\t\t\t\t:key=\"nodeName\"\n\t\t\t\t\t\t:label=\"nodeName\"\n\t\t\t\t\t\t:value=\"nodeName\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-select>\n\t\t\t</div>\n\t\t</template>\n\t\t<template #node-not-run>\n\t\t\t<div\n\t\t\t\tv-if=\"(isActiveNodeConfig && rootNode) || parentNodes.length\"\n\t\t\t\t:class=\"$style.noOutputData\"\n\t\t\t>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.noOutputData.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-tooltip v-if=\"!readOnly\" :visible=\"showDraggableHint && showDraggableHintWithDelay\">\n\t\t\t\t\t<template #content>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-html=\"\n\t\t\t\t\t\t\t\t$locale.baseText('dataMapping.dragFromPreviousHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { name: focusedMappableInput },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\thide-icon\n\t\t\t\t\t\t:transparent=\"true\"\n\t\t\t\t\t\t:node-name=\"isActiveNodeConfig ? rootNode : currentNodeName\"\n\t\t\t\t\t\t:label=\"$locale.baseText('ndv.input.noOutputData.executePrevious')\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\tdata-test-id=\"execute-previous-node\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</n8n-tooltip>\n\t\t\t\t<n8n-text v-if=\"!readOnly\" tag=\"div\" size=\"small\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.noOutputData.hint') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t\t<div v-else :class=\"$style.notConnected\">\n\t\t\t\t<div>\n\t\t\t\t\t<WireMeUp />\n\t\t\t\t</div>\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('ndv.input.notConnected.title')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.message') }}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://docs.n8n.io/workflows/connections/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onConnectionHelpClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ $locale.baseText('ndv.input.notConnected.learnMore') }}\n\t\t\t\t\t</a>\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #no-output-data>\n\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t$locale.baseText('ndv.input.noOutputData')\n\t\t\t}}</n8n-text>\n\t\t</template>\n\n\t\t<template #recovered-artificial-output-data>\n\t\t\t<div :class=\"$style.recoveredOutputData\">\n\t\t\t\t<n8n-text tag=\"div\" :bold=\"true\" color=\"text-dark\" size=\"large\">{{\n\t\t\t\t\t$locale.baseText('executionDetails.executionFailed.recoveredNodeTitle')\n\t\t\t\t}}</n8n-text>\n\t\t\t\t<n8n-text>\n\t\t\t\t\t{{ $locale.baseText('executionDetails.executionFailed.recoveredNodeMessage') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</template>\n\t</RunData>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport type { INodeUi } from '@/Interface';\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tIConnectedNode,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tWorkflow,\n} from 'n8n-workflow';\nimport RunData from './RunData.vue';\nimport NodeExecuteButton from './NodeExecuteButton.vue';\nimport WireMeUp from './WireMeUp.vue';\nimport {\n\tCRON_NODE_TYPE,\n\tINTERVAL_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSTART_NODE_TYPE,\n} from '@/constants';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\n\ntype MappingMode = 'debugging' | 'mapping';\n\nexport default defineComponent({\n\tname: 'InputPanel',\n\tcomponents: { RunData, NodeExecuteButton, WireMeUp },\n\tprops: {\n\t\tcurrentNodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\trunIndex: {\n\t\t\ttype: Number,\n\t\t\trequired: true,\n\t\t},\n\t\tlinkedRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {},\n\t\tcanLinkRuns: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tisPaneActive: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowDraggableHintWithDelay: false,\n\t\t\tdraggableHintShown: false,\n\t\t\tinputMode: 'debugging' as MappingMode,\n\t\t\tmappedNode: null as string | null,\n\t\t\tinputModes: [\n\t\t\t\t{ value: 'mapping', label: this.$locale.baseText('ndv.input.mapping') },\n\t\t\t\t{ value: 'debugging', label: this.$locale.baseText('ndv.input.debugging') },\n\t\t\t],\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useWorkflowsStore, useUIStore),\n\t\tfocusedMappableInput(): string {\n\t\t\treturn this.ndvStore.focusedMappableInput;\n\t\t},\n\t\tisUserOnboarded(): boolean {\n\t\t\treturn this.ndvStore.isMappingOnboarded;\n\t\t},\n\t\tisMappingMode(): boolean {\n\t\t\treturn this.isActiveNodeConfig && this.inputMode === 'mapping';\n\t\t},\n\t\tshowDraggableHint(): boolean {\n\t\t\tconst toIgnore = [\n\t\t\t\tSTART_NODE_TYPE,\n\t\t\t\tMANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\tCRON_NODE_TYPE,\n\t\t\t\tINTERVAL_NODE_TYPE,\n\t\t\t];\n\t\t\tif (!this.currentNode || toIgnore.includes(this.currentNode.type)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn !!this.focusedMappableInput && !this.isUserOnboarded;\n\t\t},\n\t\tisActiveNodeConfig(): boolean {\n\t\t\tlet inputs = this.activeNodeType?.inputs ?? [];\n\t\t\tlet outputs = this.activeNodeType?.outputs ?? [];\n\t\t\tif (this.activeNode !== null && this.currentWorkflow !== null) {\n\t\t\t\tconst node = this.currentWorkflow.getNode(this.activeNode.name);\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.currentWorkflow, node!, this.activeNodeType!);\n\t\t\t} else {\n\t\t\t\t// If we can not figure out the node type we set no outputs\n\t\t\t\tif (!Array.isArray(inputs)) {\n\t\t\t\t\tinputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(outputs)) {\n\t\t\t\t\toutputs = [] as ConnectionTypes[];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tinputs.length === 0 ||\n\t\t\t\t(inputs.every((input) => this.filterOutConnectionType(input, NodeConnectionType.Main)) &&\n\t\t\t\t\toutputs.find((output) => this.filterOutConnectionType(output, NodeConnectionType.Main)))\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisMappingEnabled(): boolean {\n\t\t\tif (this.readOnly) return false;\n\n\t\t\t// Mapping is only enabled in mapping mode for config nodes and if node to map is selected\n\t\t\tif (this.isActiveNodeConfig) return this.isMappingMode && this.mappedNode !== null;\n\n\t\t\treturn true;\n\t\t},\n\t\tisExecutingPrevious(): boolean {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\t\t\tconst executingNode = this.workflowsStore.executingNode;\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\ttriggeredNode === this.activeNode.name &&\n\t\t\t\t!this.workflowsStore.isNodeExecuting(this.activeNode.name)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (executingNode.length || triggeredNode) {\n\t\t\t\treturn !!this.parentNodes.find(\n\t\t\t\t\t(node) => this.workflowsStore.isNodeExecuting(node.name) || node.name === triggeredNode,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): Workflow {\n\t\t\treturn this.workflow as Workflow;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\n\t\trootNode(): string {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst rootNodes = workflow.getChildNodes(this.activeNode.name, 'ALL_NON_MAIN');\n\n\t\t\treturn rootNodes[0];\n\t\t},\n\t\trootNodesParents(): string[] {\n\t\t\tconst workflow = this.currentWorkflow;\n\t\t\tconst parentNodes = [...workflow.getParentNodes(this.rootNode, 'main')].reverse();\n\n\t\t\treturn parentNodes;\n\t\t},\n\t\tcurrentNode(): INodeUi | null {\n\t\t\tif (this.isActiveNodeConfig) {\n\t\t\t\t// if we're mapping node we want to show the output of the mapped node\n\t\t\t\tif (this.mappedNode) {\n\t\t\t\t\treturn this.workflowsStore.getNodeByName(this.mappedNode);\n\t\t\t\t}\n\n\t\t\t\t// in debugging mode data does get set manually and is only for debugging\n\t\t\t\t// so we want to force the node to be the active node to make sure we show the correct data\n\t\t\t\treturn this.activeNode;\n\t\t\t}\n\n\t\t\treturn this.workflowsStore.getNodeByName(this.currentNodeName);\n\t\t},\n\t\tconnectedCurrentNodeOutputs(): number[] | undefined {\n\t\t\tconst search = this.parentNodes.find(({ name }) => name === this.currentNodeName);\n\t\t\tif (search) {\n\t\t\t\treturn search.indicies;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tparentNodes(): IConnectedNode[] {\n\t\t\tif (!this.activeNode) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tconst nodes: IConnectedNode[] = (this.workflow as Workflow).getParentNodesByDepth(\n\t\t\t\tthis.activeNode.name,\n\t\t\t);\n\n\t\t\treturn nodes.filter(\n\t\t\t\t({ name }, i) =>\n\t\t\t\t\tthis.activeNode &&\n\t\t\t\t\tname !== this.activeNode.name &&\n\t\t\t\t\tnodes.findIndex((node) => node.name === name) === i,\n\t\t\t);\n\t\t},\n\t\tcurrentNodeDepth(): number {\n\t\t\tconst node = this.parentNodes.find(\n\t\t\t\t(node) => this.currentNode && node.name === this.currentNode.name,\n\t\t\t);\n\t\t\treturn node ? node.depth : -1;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (!this.activeNode) return null;\n\n\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t},\n\t\tisMultiInputNode(): boolean {\n\t\t\treturn this.activeNodeType !== null && this.activeNodeType.inputs.length > 1;\n\t\t},\n\t},\n\twatch: {\n\t\tinputMode: {\n\t\t\thandler(val) {\n\t\t\t\tthis.onRunIndexChange(-1);\n\t\t\t\tif (val === 'mapping') {\n\t\t\t\t\tthis.onUnlinkRun();\n\t\t\t\t\tthis.mappedNode = this.rootNodesParents[0];\n\t\t\t\t} else {\n\t\t\t\t\tthis.mappedNode = null;\n\t\t\t\t}\n\t\t\t},\n\t\t\timmediate: true,\n\t\t},\n\t\tshowDraggableHint(curr: boolean, prev: boolean) {\n\t\t\tif (curr && !prev) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.draggableHintShown) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.showDraggableHintWithDelay = this.showDraggableHint;\n\t\t\t\t\tif (this.showDraggableHintWithDelay) {\n\t\t\t\t\t\tthis.draggableHintShown = true;\n\n\t\t\t\t\t\tthis.$telemetry.track('User viewed data mapping tooltip', {\n\t\t\t\t\t\t\ttype: 'unexecuted input pane',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 1000);\n\t\t\t} else if (!curr) {\n\t\t\t\tthis.showDraggableHintWithDelay = false;\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tfilterOutConnectionType(\n\t\t\titem: ConnectionTypes | INodeOutputConfiguration,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tif (!item) return false;\n\n\t\t\treturn typeof item === 'string' ? item !== type : item.type !== type;\n\t\t},\n\t\tonInputModeChange(val: MappingMode) {\n\t\t\tthis.inputMode = val;\n\t\t},\n\t\tonMappedNodeSelected(val: string) {\n\t\t\tthis.mappedNode = val;\n\n\t\t\tthis.onRunIndexChange(0);\n\t\t\tthis.onUnlinkRun();\n\t\t},\n\t\tgetMultipleNodesText(nodeName?: string): string {\n\t\t\tif (\n\t\t\t\t!nodeName ||\n\t\t\t\t!this.isMultiInputNode ||\n\t\t\t\t!this.activeNode ||\n\t\t\t\tthis.activeNodeType?.inputNames === undefined\n\t\t\t)\n\t\t\t\treturn '';\n\n\t\t\tconst activeNodeConnections =\n\t\t\t\tthis.currentWorkflow.connectionsByDestinationNode[this.activeNode.name].main || [];\n\t\t\t// Collect indexes of connected nodes\n\t\t\tconst connectedInputIndexes = activeNodeConnections.reduce((acc: number[], node, index) => {\n\t\t\t\tif (node[0] && node[0].node === nodeName) return [...acc, index];\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\n\t\t\t// Match connected input indexes to their names specified by active node\n\t\t\tconst connectedInputs = connectedInputIndexes.map(\n\t\t\t\t(inputIndex) => this.activeNodeType?.inputNames?.[inputIndex],\n\t\t\t);\n\n\t\t\tif (connectedInputs.length === 0) return '';\n\n\t\t\treturn `(${connectedInputs.join(' & ')})`;\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv button', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'executePrevious',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonRunIndexChange(run: number) {\n\t\t\tthis.$emit('runChange', run);\n\t\t},\n\t\tonLinkRun() {\n\t\t\tthis.$emit('linkRun');\n\t\t},\n\t\tonUnlinkRun() {\n\t\t\tthis.$emit('unlinkRun');\n\t\t},\n\t\tonInputNodeChange(value: string) {\n\t\t\tconst index = this.parentNodes.findIndex((node) => node.name === value) + 1;\n\t\t\tthis.$emit('changeInputNode', value, index);\n\t\t},\n\t\tonConnectionHelpClick() {\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: 'input',\n\t\t\t\t\ttype: 'not-connected-help',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\ttruncate(nodeName: string) {\n\t\t\tconst truncated = nodeName.substring(0, 30);\n\t\t\tif (truncated.length < nodeName.length) {\n\t\t\t\treturn `${truncated}...`;\n\t\t\t}\n\t\t\treturn truncated;\n\t\t},\n\t\tactivatePane() {\n\t\t\tthis.$emit('activatePane');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.mappedNode {\n\twidth: max-content;\n\tpadding: 0 var(--spacing-s) var(--spacing-s);\n}\n.titleSection {\n\tdisplay: flex;\n\tmax-width: 300px;\n\talign-items: center;\n\n\t> * {\n\t\tmargin-right: var(--spacing-2xs);\n\t}\n}\n.inputModeTab {\n\tmargin-left: auto;\n}\n.noOutputData {\n\tmax-width: 180px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.recoveredOutputData {\n\tmargin: auto;\n\tmax-width: 250px;\n\ttext-align: center;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n}\n\n.notConnected {\n\tmax-width: 300px;\n\n\t> *:first-child {\n\t\tmargin-bottom: var(--spacing-m);\n\t}\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.title {\n\ttext-transform: uppercase;\n\tcolor: var(--color-text-light);\n\tletter-spacing: 3px;\n\tfont-size: var(--font-size-s);\n\tfont-weight: var(--font-weight-bold);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.node-option {\n\tfont-weight: var(--font-weight-regular) !important;\n\n\tspan {\n\t\tcolor: var(--color-text-light);\n\t}\n\n\t&.selected > span {\n\t\tcolor: var(--color-primary);\n\t}\n}\n</style>\n","<template>\n\t<div :class=\"$style.container\">\n\t\t<transition name=\"fade\" mode=\"out-in\">\n\t\t\t<div v-if=\"hasIssues || hideContent\" key=\"empty\"></div>\n\t\t\t<div v-else-if=\"isListeningForEvents\" key=\"listening\">\n\t\t\t\t<n8n-pulse>\n\t\t\t\t\t<NodeIcon :node-type=\"nodeType\" :size=\"40\"></NodeIcon>\n\t\t\t\t</n8n-pulse>\n\t\t\t\t<div v-if=\"isWebhookNode\">\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.listening')\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text>\n\t\t\t\t\t\t\t{{\n\t\t\t\t\t\t\t\t$locale.baseText('ndv.trigger.webhookNode.requestHint', {\n\t\t\t\t\t\t\t\t\tinterpolate: { type: webhookHttpMethod },\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<CopyInput\n\t\t\t\t\t\t:value=\"webhookTestUrl\"\n\t\t\t\t\t\t:toast-title=\"$locale.baseText('ndv.trigger.copiedTestUrl')\"\n\t\t\t\t\t\tclass=\"mb-2xl\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\t:collapse=\"true\"\n\t\t\t\t\t\t:copy-button-text=\"$locale.baseText('generic.clickToCopy')\"\n\t\t\t\t\t\t@copy=\"onTestLinkCopied\"\n\t\t\t\t\t></CopyInput>\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else>\n\t\t\t\t\t<n8n-text tag=\"div\" size=\"large\" color=\"text-dark\" class=\"mb-2xs\" bold>{{\n\t\t\t\t\t\tlisteningTitle\n\t\t\t\t\t}}</n8n-text>\n\t\t\t\t\t<div :class=\"[$style.shake, 'mb-xs']\">\n\t\t\t\t\t\t<n8n-text tag=\"div\">\n\t\t\t\t\t\t\t{{ listeningHint }}\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayChatButton\">\n\t\t\t\t\t\t<n8n-button class=\"mb-xl\" @click=\"openWebhookUrl()\">\n\t\t\t\t\t\t\t{{ $locale.baseText('ndv.trigger.chatTrigger.openChat') }}\n\t\t\t\t\t\t</n8n-button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else key=\"default\">\n\t\t\t\t<div v-if=\"isActivelyPolling\" class=\"mb-xl\">\n\t\t\t\t\t<n8n-spinner type=\"ring\" />\n\t\t\t\t</div>\n\n\t\t\t\t<div :class=\"$style.action\">\n\t\t\t\t\t<div :class=\"$style.header\">\n\t\t\t\t\t\t<n8n-heading v-if=\"header\" tag=\"h1\" bold>\n\t\t\t\t\t\t\t{{ header }}\n\t\t\t\t\t\t</n8n-heading>\n\t\t\t\t\t\t<n8n-text v-if=\"subheader\">\n\t\t\t\t\t\t\t<span v-text=\"subheader\" />\n\t\t\t\t\t\t</n8n-text>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<NodeExecuteButton\n\t\t\t\t\t\tdata-test-id=\"trigger-execute-button\"\n\t\t\t\t\t\t:node-name=\"nodeName\"\n\t\t\t\t\t\tsize=\"medium\"\n\t\t\t\t\t\ttelemetry-source=\"inputs\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<n8n-text v-if=\"activationHint\" size=\"small\" @click=\"onLinkClick\">\n\t\t\t\t\t<span v-html=\"activationHint\"></span> \n\t\t\t\t</n8n-text>\n\t\t\t\t<n8n-link\n\t\t\t\t\tv-if=\"activationHint && executionsHelp\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t@click=\"expandExecutionHelp\"\n\t\t\t\t\t>{{ $locale.baseText('ndv.trigger.moreInfo') }}</n8n-link\n\t\t\t\t>\n\t\t\t\t<n8n-info-accordion\n\t\t\t\t\tv-if=\"executionsHelp\"\n\t\t\t\t\tref=\"help\"\n\t\t\t\t\t:class=\"$style.accordion\"\n\t\t\t\t\t:title=\"$locale.baseText('ndv.trigger.executionsHint.question')\"\n\t\t\t\t\t:description=\"executionsHelp\"\n\t\t\t\t\t:event-bus=\"executionsHelpEventBus\"\n\t\t\t\t\t@click:body=\"onLinkClick\"\n\t\t\t\t></n8n-info-accordion>\n\t\t\t</div>\n\t\t</transition>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport {\n\tCHAT_TRIGGER_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tWORKFLOW_SETTINGS_MODAL_KEY,\n\tFORM_TRIGGER_NODE_TYPE,\n} from '@/constants';\nimport type { INodeUi } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport NodeExecuteButton from '@/components/NodeExecuteButton.vue';\nimport CopyInput from '@/components/CopyInput.vue';\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nexport default defineComponent({\n\tname: 'TriggerPanel',\n\tcomponents: {\n\t\tNodeExecuteButton,\n\t\tCopyInput,\n\t\tNodeIcon,\n\t},\n\tprops: {\n\t\tnodeName: {\n\t\t\ttype: String,\n\t\t},\n\t\tpushRef: {\n\t\t\ttype: String,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\tworkflowHelpers,\n\t\t};\n\t},\n\tdata: () => {\n\t\treturn {\n\t\t\texecutionsHelpEventBus: createEventBus(),\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tnode(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.nodeName as string);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.node.type, this.node.typeVersion);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thideContent(): boolean {\n\t\t\tif (!this.nodeType?.triggerPanel) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.nodeType?.triggerPanel &&\n\t\t\t\tthis.nodeType?.triggerPanel.hasOwnProperty('hideContent')\n\t\t\t) {\n\t\t\t\tconst hideContent = this.nodeType?.triggerPanel.hideContent;\n\t\t\t\tif (typeof hideContent === 'boolean') {\n\t\t\t\t\treturn hideContent;\n\t\t\t\t}\n\n\t\t\t\tif (this.node) {\n\t\t\t\t\tconst hideContentValue = this.workflowHelpers\n\t\t\t\t\t\t.getCurrentWorkflow()\n\t\t\t\t\t\t.expression.getSimpleParameterValue(this.node, hideContent, 'internal', {});\n\n\t\t\t\t\tif (typeof hideContentValue === 'boolean') {\n\t\t\t\t\t\treturn hideContentValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node?.issues && (this.node.issues.parameters || this.node.issues.credentials),\n\t\t\t);\n\t\t},\n\t\tserviceName(): string {\n\t\t\tif (this.nodeType) {\n\t\t\t\treturn getTriggerNodeServiceName(this.nodeType);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tdisplayChatButton(): boolean {\n\t\t\treturn Boolean(\n\t\t\t\tthis.node &&\n\t\t\t\t\tthis.node.type === CHAT_TRIGGER_NODE_TYPE &&\n\t\t\t\t\tthis.node.parameters.mode !== 'webhook',\n\t\t\t);\n\t\t},\n\t\tisWebhookNode(): boolean {\n\t\t\treturn Boolean(this.node && this.node.type === WEBHOOK_NODE_TYPE);\n\t\t},\n\t\twebhookHttpMethod(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst httpMethod = this.workflowHelpers.getWebhookExpressionValue(\n\t\t\t\tthis.nodeType.webhooks[0],\n\t\t\t\t'httpMethod',\n\t\t\t\tfalse,\n\t\t\t);\n\n\t\t\tif (Array.isArray(httpMethod)) {\n\t\t\t\treturn httpMethod.join(', ');\n\t\t\t}\n\n\t\t\treturn httpMethod;\n\t\t},\n\t\twebhookTestUrl(): string | undefined {\n\t\t\tif (!this.node || !this.nodeType?.webhooks?.length) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn this.workflowHelpers.getWebhookUrl(this.nodeType.webhooks[0], this.node, 'test');\n\t\t},\n\t\tisWebhookBasedNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.webhooks?.length);\n\t\t},\n\t\tisPollingNode(): boolean {\n\t\t\treturn Boolean(this.nodeType?.polling);\n\t\t},\n\t\tisListeningForEvents(): boolean {\n\t\t\tconst waitingOnWebhook = this.workflowsStore.executionWaitingForWebhook;\n\t\t\tconst executedNode = this.workflowsStore.executedNode;\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\t!this.node.disabled &&\n\t\t\t\tthis.isWebhookBasedNode &&\n\t\t\t\twaitingOnWebhook &&\n\t\t\t\t(!executedNode || executedNode === this.nodeName)\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisActivelyPolling(): boolean {\n\t\t\tconst triggeredNode = this.workflowsStore.executedNode;\n\n\t\t\treturn this.workflowRunning && this.isPollingNode && this.nodeName === triggeredNode;\n\t\t},\n\t\tisWorkflowActive(): boolean {\n\t\t\treturn this.workflowsStore.isWorkflowActive;\n\t\t},\n\t\tlisteningTitle(): string {\n\t\t\treturn this.nodeType?.name === FORM_TRIGGER_NODE_TYPE\n\t\t\t\t? this.$locale.baseText('ndv.trigger.webhookNode.formTrigger.listening')\n\t\t\t\t: this.$locale.baseText('ndv.trigger.webhookNode.listening');\n\t\t},\n\t\tlisteningHint(): string {\n\t\t\tswitch (this.nodeType?.name) {\n\t\t\t\tcase CHAT_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.chatTrigger.serviceHint');\n\t\t\t\tcase FORM_TRIGGER_NODE_TYPE:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.formTrigger.serviceHint');\n\t\t\t\tdefault:\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.serviceHint', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\theader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingEvent');\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel && typeof this.nodeType.triggerPanel.header === 'string') {\n\t\t\t\treturn this.nodeType.triggerPanel.header;\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.action', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tsubheader(): string {\n\t\t\tconst serviceName = this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '';\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.fetchingHint', {\n\t\t\t\t\tinterpolate: { name: serviceName },\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\texecutionsHelp(): string {\n\t\t\tif (this.nodeType?.triggerPanel?.executionsHelp !== undefined) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.executionsHelp === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp;\n\t\t\t\t}\n\t\t\t\tif (!this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.inactive) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.inactive;\n\t\t\t\t}\n\t\t\t\tif (this.isWorkflowActive && this.nodeType.triggerPanel.executionsHelp.active) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.executionsHelp.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.executionsHelp.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tactivationHint(): string {\n\t\t\tif (this.isActivelyPolling) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tif (this.nodeType?.triggerPanel?.activationHint) {\n\t\t\t\tif (typeof this.nodeType.triggerPanel.activationHint === 'string') {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\t!this.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.inactive === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.inactive;\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tthis.isWorkflowActive &&\n\t\t\t\t\ttypeof this.nodeType.triggerPanel.activationHint.active === 'string'\n\t\t\t\t) {\n\t\t\t\t\treturn this.nodeType.triggerPanel.activationHint.active;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isWebhookBasedNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.webhookBasedNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.isPollingNode) {\n\t\t\t\tif (this.isWorkflowActive) {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.active', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn this.$locale.baseText('ndv.trigger.pollingNode.activationHint.inactive', {\n\t\t\t\t\t\tinterpolate: { service: this.serviceName },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t},\n\tmethods: {\n\t\texpandExecutionHelp() {\n\t\t\tif (this.$refs.help) {\n\t\t\t\tthis.executionsHelpEventBus.emit('expand');\n\t\t\t}\n\t\t},\n\t\topenWebhookUrl() {\n\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tpane: 'input',\n\t\t\t\ttype: 'open-chat',\n\t\t\t});\n\t\t\twindow.open(this.webhookTestUrl, '_blank', 'noreferrer');\n\t\t},\n\t\tonLinkClick(e: MouseEvent) {\n\t\t\tif (!e.target) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (target.localName !== 'a') return;\n\n\t\t\tif (target.dataset?.key) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (target.dataset.key === 'activate') {\n\t\t\t\t\tthis.$emit('activate');\n\t\t\t\t} else if (target.dataset.key === 'executions') {\n\t\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\t\tpane: 'input',\n\t\t\t\t\t\ttype: 'open-executions-log',\n\t\t\t\t\t});\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\tname: VIEWS.EXECUTIONS,\n\t\t\t\t\t});\n\t\t\t\t} else if (target.dataset.key === 'settings') {\n\t\t\t\t\tthis.uiStore.openModal(WORKFLOW_SETTINGS_MODAL_KEY);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonTestLinkCopied() {\n\t\t\tthis.$telemetry.track('User copied webhook URL', {\n\t\t\t\tpane: 'inputs',\n\t\t\t\ttype: 'test url',\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tthis.$emit('execute');\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" module>\n.container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: var(--color-background-base);\n\tdisplay: flex;\n\tflex-direction: column;\n\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: var(--spacing-s) var(--spacing-s) var(--spacing-xl) var(--spacing-s);\n\ttext-align: center;\n\toverflow: hidden;\n\n\t> * {\n\t\twidth: 100%;\n\t}\n}\n\n.header {\n\tmargin-bottom: var(--spacing-s);\n\n\t> * {\n\t\tmargin-bottom: var(--spacing-2xs);\n\t}\n}\n\n.action {\n\tmargin-bottom: var(--spacing-2xl);\n}\n\n.shake {\n\tanimation: shake 8s infinite;\n}\n\n@keyframes shake {\n\t90% {\n\t\ttransform: translateX(0);\n\t}\n\t92.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t95% {\n\t\ttransform: translateX(-6px);\n\t}\n\t97.5% {\n\t\ttransform: translateX(6px);\n\t}\n\t100% {\n\t\ttransform: translateX(0);\n\t}\n}\n\n.accordion {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 200ms;\n}\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n</style>\n","<template>\n\t<el-dialog\n\t\t:model-value=\"(!!activeNode || renaming) && !isActiveStickyNode\"\n\t\t:before-close=\"close\"\n\t\t:show-close=\"false\"\n\t\tclass=\"data-display-wrapper ndv-wrapper\"\n\t\toverlay-class=\"data-display-overlay\"\n\t\twidth=\"auto\"\n\t\tappend-to-body\n\t\tdata-test-id=\"ndv\"\n\t\t:data-has-output-connection=\"hasOutputConnection\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"bottom-start\"\n\t\t\t:visible=\"showTriggerWaitingWarning\"\n\t\t\t:disabled=\"!showTriggerWaitingWarning\"\n\t\t>\n\t\t\t<template #content>\n\t\t\t\t<div :class=\"$style.triggerWarning\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas.waitingForTriggerWarning') }}\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<div :class=\"$style.backToCanvas\" data-test-id=\"back-to-canvas\" @click=\"close\">\n\t\t\t\t<n8n-icon icon=\"arrow-left\" color=\"text-xlight\" size=\"medium\" />\n\t\t\t\t<n8n-text color=\"text-xlight\" size=\"medium\" :bold=\"true\">\n\t\t\t\t\t{{ $locale.baseText('ndv.backToCanvas') }}\n\t\t\t\t</n8n-text>\n\t\t\t</div>\n\t\t</n8n-tooltip>\n\n\t\t<div\n\t\t\tv-if=\"activeNode\"\n\t\t\tref=\"container\"\n\t\t\tclass=\"data-display\"\n\t\t\ttabindex=\"0\"\n\t\t\t@keydown.capture=\"onKeyDown\"\n\t\t>\n\t\t\t<div :class=\"$style.modalBackground\" @click=\"close\"></div>\n\t\t\t<NDVDraggablePanels\n\t\t\t\t:key=\"activeNode.name\"\n\t\t\t\t:is-trigger-node=\"isTriggerNode\"\n\t\t\t\t:hide-input-and-output=\"activeNodeType === null\"\n\t\t\t\t:position=\"isTriggerNode && !showTriggerPanel ? 0 : undefined\"\n\t\t\t\t:is-draggable=\"!isTriggerNode\"\n\t\t\t\t:has-double-width=\"activeNodeType?.parameterPane === 'wide'\"\n\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@close=\"close\"\n\t\t\t\t@init=\"onPanelsInit\"\n\t\t\t\t@dragstart=\"onDragStart\"\n\t\t\t\t@dragend=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<template v-if=\"showTriggerPanel || !isTriggerNode\" #input>\n\t\t\t\t\t<TriggerPanel\n\t\t\t\t\t\tv-if=\"showTriggerPanel\"\n\t\t\t\t\t\t:node-name=\"activeNode.name\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t/>\n\t\t\t\t\t<InputPanel\n\t\t\t\t\t\tv-else-if=\"!isTriggerNode\"\n\t\t\t\t\t\t:workflow=\"workflow\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"inputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:current-node-name=\"inputNodeName\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isInputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateInputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToInput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('input')\"\n\t\t\t\t\t\t@run-change=\"onRunInputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@change-input-node=\"onInputNodeChange\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@table-mounted=\"onInputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onInputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #output>\n\t\t\t\t\t<OutputPanel\n\t\t\t\t\t\tdata-test-id=\"output-panel\"\n\t\t\t\t\t\t:can-link-runs=\"canLinkRuns\"\n\t\t\t\t\t\t:run-index=\"outputRun\"\n\t\t\t\t\t\t:linked-runs=\"linked\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:is-read-only=\"readOnly || hasForeignCredential\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && isTriggerNode && !isExecutableTriggerNode\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:is-pane-active=\"isOutputPaneActive\"\n\t\t\t\t\t\t@activate-pane=\"activateOutputPane\"\n\t\t\t\t\t\t@link-run=\"onLinkRunToOutput\"\n\t\t\t\t\t\t@unlink-run=\"() => onUnlinkRun('output')\"\n\t\t\t\t\t\t@run-change=\"onRunOutputIndexChange\"\n\t\t\t\t\t\t@open-settings=\"openSettings\"\n\t\t\t\t\t\t@table-mounted=\"onOutputTableMounted\"\n\t\t\t\t\t\t@item-hover=\"onOutputItemHover\"\n\t\t\t\t\t\t@search=\"onSearch\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template #main>\n\t\t\t\t\t<NodeSettings\n\t\t\t\t\t\t:event-bus=\"settingsEventBus\"\n\t\t\t\t\t\t:dragging=\"isDragging\"\n\t\t\t\t\t\t:push-ref=\"pushRef\"\n\t\t\t\t\t\t:node-type=\"activeNodeType\"\n\t\t\t\t\t\t:foreign-credentials=\"foreignCredentials\"\n\t\t\t\t\t\t:read-only=\"readOnly\"\n\t\t\t\t\t\t:block-u-i=\"blockUi && showTriggerPanel\"\n\t\t\t\t\t\t:executable=\"!readOnly\"\n\t\t\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t\t\t@execute=\"onNodeExecute\"\n\t\t\t\t\t\t@stop-execution=\"onStopExecution\"\n\t\t\t\t\t\t@redraw-required=\"redrawRequired = true\"\n\t\t\t\t\t\t@activate=\"onWorkflowActivate\"\n\t\t\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t\t/>\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"featureRequestUrl\"\n\t\t\t\t\t\t:class=\"$style.featureRequest\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t@click=\"onFeatureRequestClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<font-awesome-icon icon=\"lightbulb\" />\n\t\t\t\t\t\t{{ $locale.baseText('ndv.featureRequest') }}\n\t\t\t\t\t</a>\n\t\t\t\t</template>\n\t\t\t</NDVDraggablePanels>\n\t\t</div>\n\t</el-dialog>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\nimport { createEventBus } from 'n8n-design-system/utils';\nimport type {\n\tINodeConnections,\n\tINodeTypeDescription,\n\tIRunData,\n\tIRunExecutionData,\n\tWorkflow,\n\tConnectionTypes,\n} from 'n8n-workflow';\nimport { jsonParse, NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type { IExecutionResponse, INodeUi, IUpdateInformation, TargetItem } from '@/Interface';\n\nimport NodeSettings from '@/components/NodeSettings.vue';\nimport NDVDraggablePanels from './NDVDraggablePanels.vue';\n\nimport OutputPanel from './OutputPanel.vue';\nimport InputPanel from './InputPanel.vue';\nimport TriggerPanel from './TriggerPanel.vue';\nimport {\n\tBASE_NODE_SURVEY_URL,\n\tEnterpriseEditionFeature,\n\tEXECUTABLE_TRIGGER_NODE_TYPES,\n\tMODAL_CONFIRM,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n} from '@/constants';\nimport { workflowActivate } from '@/mixins/workflowActivate';\nimport { dataPinningEventBus } from '@/event-bus';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useMessage } from '@/composables/useMessage';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useRouter } from 'vue-router';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\n\nexport default defineComponent({\n\tname: 'NodeDetailsView',\n\tcomponents: {\n\t\tNodeSettings,\n\t\tInputPanel,\n\t\tOutputPanel,\n\t\tNDVDraggablePanels,\n\t\tTriggerPanel,\n\t},\n\tmixins: [workflowActivate],\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\trenaming: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props, ctx) {\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst router = useRouter();\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\n\t\treturn {\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tworkflowHelpers,\n\t\t\t...useDeviceSupport(),\n\t\t\t...useMessage(),\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t...workflowActivate.setup?.(props, ctx),\n\t\t};\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsettingsEventBus: createEventBus(),\n\t\t\tredrawRequired: false,\n\t\t\trunInputIndex: -1,\n\t\t\trunOutputIndex: -1,\n\t\t\tisLinkingEnabled: true,\n\t\t\tselectedInput: undefined as string | undefined,\n\t\t\ttriggerWaitingWarningEnabled: false,\n\t\t\tisDragging: false,\n\t\t\tmainPanelPosition: 0,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tavgInputRowHeight: 0,\n\t\t\tavgOutputRowHeight: 0,\n\t\t\tisInputPaneActive: false,\n\t\t\tisOutputPaneActive: false,\n\t\t\tisPairedItemHoveringEnabled: true,\n\t\t};\n\t},\n\tmounted() {\n\t\tdataPinningEventBus.on('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tbeforeUnmount() {\n\t\tdataPinningEventBus.off('data-pinning-discovery', this.setIsTooltipVisible);\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore, useSettingsStore),\n\t\tpushRef(): string {\n\t\t\treturn this.ndvStore.pushRef;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tshowTriggerWaitingWarning(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.triggerWaitingWarningEnabled &&\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t!this.activeNodeType.group.includes('trigger') &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowsStore.executionWaitingForWebhook\n\t\t\t);\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\tinputNodeName(): string | undefined {\n\t\t\treturn this.selectedInput || this.parentNode;\n\t\t},\n\t\tinputNode(): INodeUi | null {\n\t\t\tif (this.inputNodeName) {\n\t\t\t\treturn this.workflowsStore.getNodeByName(this.inputNodeName);\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tactiveNodeType(): INodeTypeDescription | null {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn this.nodeTypesStore.getNodeType(this.activeNode.type, this.activeNode.typeVersion);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tshowTriggerPanel(): boolean {\n\t\t\tconst override = !!this.activeNodeType?.triggerPanel;\n\t\t\tif (typeof this.activeNodeType?.triggerPanel === 'boolean') {\n\t\t\t\treturn override;\n\t\t\t}\n\n\t\t\tconst isWebhookBasedNode = !!this.activeNodeType?.webhooks?.length;\n\t\t\tconst isPollingNode = this.activeNodeType?.polling;\n\n\t\t\treturn (\n\t\t\t\t!this.readOnly && this.isTriggerNode && (isWebhookBasedNode || isPollingNode || override)\n\t\t\t);\n\t\t},\n\t\tworkflow(): Workflow {\n\t\t\treturn this.workflowHelpers.getCurrentWorkflow();\n\t\t},\n\t\thasOutputConnection() {\n\t\t\tif (!this.activeNode) return false;\n\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\tthis.activeNode.name,\n\t\t\t) as INodeConnections;\n\n\t\t\t// Check if there's at-least one output connection\n\t\t\treturn (Object.values(outgoingConnections)?.[0]?.[0] ?? []).length > 0;\n\t\t},\n\t\tparentNodes(): string[] {\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn (\n\t\t\t\t\tthis.workflow.getParentNodesByDepth(this.activeNode.name, 1).map(({ name }) => name) || []\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\t\tparentNode(): string | undefined {\n\t\t\t// Return the first parent node that contains data\n\t\t\tfor (const parentNodeName of this.parentNodes) {\n\t\t\t\t// Check first for pinned data\n\t\t\t\tif (this.workflowsStore.pinnedWorkflowData[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\n\t\t\t\t// Check then the data of the current execution\n\t\t\t\tif (this.workflowRunData?.[parentNodeName]) {\n\t\t\t\t\treturn parentNodeName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.parentNodes[0];\n\t\t},\n\t\tisExecutableTriggerNode(): boolean {\n\t\t\tif (!this.activeNodeType) return false;\n\n\t\t\treturn EXECUTABLE_TRIGGER_NODE_TYPES.includes(this.activeNodeType.name);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.activeNodeType &&\n\t\t\t\t(this.activeNodeType.group.includes('trigger') ||\n\t\t\t\t\tthis.activeNodeType.name === START_NODE_TYPE)\n\t\t\t);\n\t\t},\n\t\tisActiveStickyNode(): boolean {\n\t\t\treturn !!this.ndvStore.activeNode && this.ndvStore.activeNode.type === STICKY_NODE_TYPE;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunData(): IRunData | null {\n\t\t\tif (this.workflowExecution === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst executionData: IRunExecutionData | undefined = this.workflowExecution.data;\n\t\t\tif (executionData?.resultData) {\n\t\t\t\treturn executionData.resultData.runData;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tmaxOutputRun(): number {\n\t\t\tif (this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (runData === null || !runData.hasOwnProperty(this.activeNode.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[this.activeNode.name].length) {\n\t\t\t\treturn runData[this.activeNode.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\toutputRun(): number {\n\t\t\tif (this.runOutputIndex === -1) {\n\t\t\t\treturn this.maxOutputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runOutputIndex, this.maxOutputRun);\n\t\t},\n\t\tmaxInputRun(): number {\n\t\t\tif (this.inputNode === null || this.activeNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst workflowNode = this.workflow.getNode(this.activeNode.name);\n\t\t\tconst outputs = NodeHelpers.getNodeOutputs(this.workflow, workflowNode, this.activeNodeType);\n\n\t\t\tlet node = this.inputNode;\n\n\t\t\tconst runData: IRunData | null = this.workflowRunData;\n\n\t\t\tif (outputs.some((output) => output !== NodeConnectionType.Main)) {\n\t\t\t\tnode = this.activeNode;\n\t\t\t}\n\n\t\t\tif (!node || !runData || !runData.hasOwnProperty(node.name)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif (runData[node.name].length) {\n\t\t\t\treturn runData[node.name].length - 1;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t},\n\t\tinputRun(): number {\n\t\t\tif (this.isLinkingEnabled && this.maxOutputRun === this.maxInputRun) {\n\t\t\t\treturn this.outputRun;\n\t\t\t}\n\t\t\tif (this.runInputIndex === -1) {\n\t\t\t\treturn this.maxInputRun;\n\t\t\t}\n\n\t\t\treturn Math.min(this.runInputIndex, this.maxInputRun);\n\t\t},\n\t\tcanLinkRuns(): boolean {\n\t\t\treturn this.maxOutputRun > 0 && this.maxOutputRun === this.maxInputRun;\n\t\t},\n\t\tlinked(): boolean {\n\t\t\treturn this.isLinkingEnabled && this.canLinkRuns;\n\t\t},\n\t\tinputPanelMargin(): number {\n\t\t\treturn this.isTriggerNode ? 0 : 80;\n\t\t},\n\t\tfeatureRequestUrl(): string {\n\t\t\tif (!this.activeNodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\treturn `${BASE_NODE_SURVEY_URL}${this.activeNodeType.name}`;\n\t\t},\n\t\toutputPanelEditMode(): { enabled: boolean; value: string } {\n\t\t\treturn this.ndvStore.outputPanelEditMode;\n\t\t},\n\t\tisWorkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tisExecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tblockUi(): boolean {\n\t\t\treturn this.isWorkflowRunning || this.isExecutionWaitingForWebhook;\n\t\t},\n\t\tforeignCredentials(): string[] {\n\t\t\tconst credentials = (this.activeNode || {}).credentials;\n\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\n\t\t\tconst foreignCredentials: string[] = [];\n\t\t\tif (\n\t\t\t\tcredentials &&\n\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t) {\n\t\t\t\tObject.values(credentials).forEach((credential) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\tusedCredentials[credential.id] &&\n\t\t\t\t\t\t!usedCredentials[credential.id].currentUserHasAccess\n\t\t\t\t\t) {\n\t\t\t\t\t\tforeignCredentials.push(credential.id);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn foreignCredentials;\n\t\t},\n\t\thasForeignCredential(): boolean {\n\t\t\treturn this.foreignCredentials.length > 0;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveNode(node: INodeUi | null, oldNode: INodeUi | null) {\n\t\t\tif (node && node.name !== oldNode?.name && !this.isActiveStickyNode) {\n\t\t\t\tthis.runInputIndex = -1;\n\t\t\t\tthis.runOutputIndex = -1;\n\t\t\t\tthis.isLinkingEnabled = true;\n\t\t\t\tthis.selectedInput = undefined;\n\t\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\t\tthis.avgOutputRowHeight = 0;\n\t\t\t\tthis.avgInputRowHeight = 0;\n\n\t\t\t\tsetTimeout(() => this.ndvStore.setNDVPushRef(), 0);\n\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeTypeChanged', {\n\t\t\t\t\tnodeSubtitle: this.nodeHelpers.getNodeSubtitle(\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tthis.activeNodeType,\n\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow(),\n\t\t\t\t\t),\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.activeNode) {\n\t\t\t\t\t\tconst outgoingConnections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\t\t\tthis.activeNode.name,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tthis.$telemetry.track('User opened node modal', {\n\t\t\t\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\t\t\tis_editable: !this.hasForeignCredential,\n\t\t\t\t\t\t\tparameters_pane_position: this.mainPanelPosition,\n\t\t\t\t\t\t\tinput_first_connector_runs: this.maxInputRun,\n\t\t\t\t\t\t\toutput_first_connector_runs: this.maxOutputRun,\n\t\t\t\t\t\t\tselected_view_inputs: this.isTriggerNode\n\t\t\t\t\t\t\t\t? 'trigger'\n\t\t\t\t\t\t\t\t: this.ndvStore.inputPanelDisplayMode,\n\t\t\t\t\t\t\tselected_view_outputs: this.ndvStore.outputPanelDisplayMode,\n\t\t\t\t\t\t\tinput_connectors: this.parentNodes.length,\n\t\t\t\t\t\t\toutput_connectors: outgoingConnections?.main?.length,\n\t\t\t\t\t\t\tinput_displayed_run_index: this.inputRun,\n\t\t\t\t\t\t\toutput_displayed_run_index: this.outputRun,\n\t\t\t\t\t\t\tdata_pinning_tooltip_presented: this.pinDataDiscoveryTooltipVisible,\n\t\t\t\t\t\t\tinput_displayed_row_height_avg: this.avgInputRowHeight,\n\t\t\t\t\t\t\toutput_displayed_row_height_avg: this.avgOutputRowHeight,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 2000); // wait for RunData to mount and present pindata discovery tooltip\n\t\t\t}\n\t\t\tif (window.top && !this.isActiveStickyNode) {\n\t\t\t\twindow.top.postMessage(JSON.stringify({ command: node ? 'openNDV' : 'closeNDV' }), '*');\n\t\t\t}\n\t\t},\n\t\tmaxOutputRun() {\n\t\t\tthis.runOutputIndex = -1;\n\t\t},\n\t\tmaxInputRun() {\n\t\t\tthis.runInputIndex = -1;\n\t\t},\n\t\tinputNodeName(nodeName: string | undefined) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputNodeName(nodeName);\n\t\t\t}, 0);\n\t\t},\n\t\tinputRun() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.ndvStore.setInputRunIndex(this.inputRun);\n\t\t\t}, 0);\n\t\t},\n\t},\n\tmethods: {\n\t\tsetIsTooltipVisible({ isTooltipVisible }: { isTooltipVisible: boolean }) {\n\t\t\tthis.pinDataDiscoveryTooltipVisible = isTooltipVisible;\n\t\t},\n\t\tonKeyDown(e: KeyboardEvent) {\n\t\t\tif (e.key === 's' && this.isCtrlKeyPressed(e)) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.readOnly) return;\n\n\t\t\t\tthis.$emit('saveKeyboardShortcut', e);\n\t\t\t}\n\t\t},\n\t\tonInputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.inputNodeName || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.inputNodeName,\n\t\t\t\trunIndex: this.inputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonOutputItemHover(e: { itemIndex: number; outputIndex: number } | null) {\n\t\t\tif (e === null || !this.activeNode || !this.isPairedItemHoveringEnabled) {\n\t\t\t\tthis.ndvStore.setHoveringItem(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst item: TargetItem = {\n\t\t\t\tnodeName: this.activeNode.name,\n\t\t\t\trunIndex: this.outputRun,\n\t\t\t\toutputIndex: e.outputIndex,\n\t\t\t\titemIndex: e.itemIndex,\n\t\t\t};\n\t\t\tthis.ndvStore.setHoveringItem(item);\n\t\t},\n\t\tonInputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgInputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonOutputTableMounted(e: { avgRowHeight: number }) {\n\t\t\tthis.avgOutputRowHeight = e.avgRowHeight;\n\t\t},\n\t\tonWorkflowActivate() {\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.activateCurrentWorkflow('ndv');\n\t\t\t}, 1000);\n\t\t},\n\t\tonFeatureRequestClick() {\n\t\t\twindow.open(this.featureRequestUrl, '_blank');\n\t\t\tif (this.activeNode) {\n\t\t\t\tthis.$telemetry.track('User clicked ndv link', {\n\t\t\t\t\tnode_type: this.activeNode.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\t\tpane: NodeConnectionType.Main,\n\t\t\t\t\ttype: 'i-wish-this-node-would',\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonPanelsInit(e: { position: number }) {\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragStart(e: { position: number }) {\n\t\t\tthis.isDragging = true;\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonDragEnd(e: { windowWidth: number; position: number }) {\n\t\t\tthis.isDragging = false;\n\t\t\tthis.$telemetry.track('User moved parameters pane', {\n\t\t\t\twindow_width: e.windowWidth,\n\t\t\t\tstart_position: this.mainPanelPosition,\n\t\t\t\tend_position: e.position,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.mainPanelPosition = e.position;\n\t\t},\n\t\tonLinkRunToInput() {\n\t\t\tthis.runOutputIndex = this.runInputIndex;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('input');\n\t\t},\n\t\tonLinkRunToOutput() {\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.trackLinking('output');\n\t\t},\n\t\tonUnlinkRun(pane: string) {\n\t\t\tthis.runInputIndex = this.runOutputIndex;\n\t\t\tthis.isLinkingEnabled = false;\n\t\t\tthis.trackLinking(pane);\n\t\t},\n\t\ttrackLinking(pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run linking', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tlinked: this.linked,\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonNodeExecute() {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.activeNode || !this.workflowRunning) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.triggerWaitingWarningEnabled = true;\n\t\t\t}, 1000);\n\t\t},\n\t\topenSettings() {\n\t\t\tthis.settingsEventBus.emit('openSettings');\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tthis.$emit('valueChanged', parameterData);\n\t\t},\n\t\tnodeTypeSelected(nodeTypeName: string) {\n\t\t\tthis.$emit('nodeTypeSelected', nodeTypeName);\n\t\t},\n\t\tonSwitchSelectedNode(nodeTypeName: string) {\n\t\t\tthis.$emit('switchSelectedNode', nodeTypeName);\n\t\t},\n\t\tonOpenConnectionNodeCreator(nodeTypeName: string, connectionType: ConnectionTypes) {\n\t\t\tthis.$emit('openConnectionNodeCreator', nodeTypeName, connectionType);\n\t\t},\n\t\tasync close() {\n\t\t\tif (this.isDragging) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.activeNode &&\n\t\t\t\t(typeof this.activeNodeType?.outputs === 'string' ||\n\t\t\t\t\ttypeof this.activeNodeType?.inputs === 'string' ||\n\t\t\t\t\tthis.redrawRequired)\n\t\t\t) {\n\t\t\t\t// TODO: We should keep track of if it actually changed and only do if required\n\t\t\t\t// Whenever a node with custom inputs and outputs gets closed redraw it in case\n\t\t\t\t// they changed\n\t\t\t\tconst nodeName = this.activeNode.name;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.$emit('redrawNode', nodeName);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\tif (this.outputPanelEditMode.enabled && this.activeNode) {\n\t\t\t\tconst shouldPinDataBeforeClosing = await this.confirm(\n\t\t\t\t\t'',\n\t\t\t\t\tthis.$locale.baseText('ndv.pinData.beforeClosing.title'),\n\t\t\t\t\t{\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.confirm'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('ndv.pinData.beforeClosing.cancel'),\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tif (shouldPinDataBeforeClosing === MODAL_CONFIRM) {\n\t\t\t\t\tconst { value } = this.outputPanelEditMode;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.pinnedData.setData(jsonParse(value), 'on-ndv-close-modal');\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.ndvStore.setOutputPanelEditModeEnabled(false);\n\t\t\t}\n\n\t\t\tawait this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\tthis.$telemetry.track('User closed node modal', {\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.triggerWaitingWarningEnabled = false;\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tthis.ndvStore.resetNDVPushRef();\n\t\t},\n\t\tonRunOutputIndexChange(run: number) {\n\t\t\tthis.runOutputIndex = run;\n\t\t\tthis.trackRunChange(run, 'output');\n\t\t},\n\t\tonRunInputIndexChange(run: number) {\n\t\t\tthis.runInputIndex = run;\n\t\t\tif (this.linked) {\n\t\t\t\tthis.runOutputIndex = run;\n\t\t\t}\n\t\t\tthis.trackRunChange(run, 'input');\n\t\t},\n\t\ttrackRunChange(run: number, pane: string) {\n\t\t\tthis.$telemetry.track('User changed ndv run dropdown', {\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\trun_index: run,\n\t\t\t\tnode_type: this.activeNodeType ? this.activeNodeType.name : '',\n\t\t\t\tpane,\n\t\t\t});\n\t\t},\n\t\tonInputNodeChange(value: string, index: number) {\n\t\t\tthis.runInputIndex = -1;\n\t\t\tthis.isLinkingEnabled = true;\n\t\t\tthis.selectedInput = value;\n\n\t\t\tthis.$telemetry.track('User changed ndv input dropdown', {\n\t\t\t\tnode_type: this.activeNode ? this.activeNode.type : '',\n\t\t\t\tpush_ref: this.pushRef,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tselection_value: index,\n\t\t\t\tinput_node_type: this.inputNode ? this.inputNode.type : '',\n\t\t\t});\n\t\t},\n\t\tonStopExecution() {\n\t\t\tthis.$emit('stopExecution');\n\t\t},\n\t\tactivateInputPane() {\n\t\t\tthis.isInputPaneActive = true;\n\t\t\tthis.isOutputPaneActive = false;\n\t\t},\n\t\tactivateOutputPane() {\n\t\t\tthis.isInputPaneActive = false;\n\t\t\tthis.isOutputPaneActive = true;\n\t\t},\n\t\tonSearch(search: string) {\n\t\t\tthis.isPairedItemHoveringEnabled = !search;\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\">\n// Hide notice(.ndv-connection-hint-notice) warning when node has output connection\n[data-has-output-connection='true'] .ndv-connection-hint-notice {\n\tdisplay: none;\n}\n.ndv-wrapper {\n\toverflow: visible;\n\tmargin-top: 0;\n}\n\n.data-display-wrapper {\n\theight: calc(100% - var(--spacing-l)) !important;\n\tmargin-top: var(--spacing-xl) !important;\n\tmargin-bottom: var(--spacing-xl) !important;\n\twidth: 100%;\n\tbackground: none;\n\tborder: none;\n\n\t.el-dialog__header {\n\t\tpadding: 0 !important;\n\t}\n\n\t.el-dialog__body {\n\t\tpadding: 0 !important;\n\t\theight: 100%;\n\t\tmin-height: 400px;\n\t\toverflow: visible;\n\t\tborder-radius: 8px;\n\t}\n}\n\n.data-display {\n\theight: 100%;\n\twidth: 100%;\n\tdisplay: flex;\n}\n</style>\n\n<style lang=\"scss\" module>\n$main-panel-width: 360px;\n\n.modalBackground {\n\theight: 100%;\n\twidth: 100%;\n}\n\n.triggerWarning {\n\tmax-width: 180px;\n}\n\n.backToCanvas {\n\tposition: fixed;\n\ttop: var(--spacing-xs);\n\tleft: var(--spacing-l);\n\n\tspan {\n\t\tcolor: var(--color-ndv-back-font);\n\t}\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n\n\t> * {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n\n@media (min-width: $breakpoint-lg) {\n\t.backToCanvas {\n\t\ttop: var(--spacing-xs);\n\t\tleft: var(--spacing-m);\n\t}\n}\n\n.featureRequest {\n\tposition: absolute;\n\tbottom: var(--spacing-4xs);\n\tleft: calc(100% + var(--spacing-s));\n\tcolor: var(--color-feature-request-font);\n\tfont-size: var(--font-size-2xs);\n\twhite-space: nowrap;\n\n\t* {\n\t\tmargin-right: var(--spacing-3xs);\n\t}\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { N8nActionDropdown } from 'n8n-design-system';\nimport type { INode } from 'n8n-workflow';\nimport { watch, ref } from 'vue';\n\nconst contextMenu = useContextMenu();\nconst { position, isOpen, actions, target } = contextMenu;\nconst dropdown = ref<InstanceType<typeof N8nActionDropdown>>();\nconst emit = defineEmits<{ (event: 'action', action: ContextMenuAction, nodes: INode[]): void }>();\n\nwatch(\n\tisOpen,\n\t() => {\n\t\tif (isOpen) {\n\t\t\tdropdown.value?.open();\n\t\t} else {\n\t\t\tdropdown.value?.close();\n\t\t}\n\t},\n\t{ flush: 'post' },\n);\n\nfunction onActionSelect(item: string) {\n\tconst action = item as ContextMenuAction;\n\tcontextMenu._dispatchAction(action);\n\temit('action', action, contextMenu.targetNodes.value);\n}\n\nfunction onVisibleChange(open: boolean) {\n\tif (!open) {\n\t\tcontextMenu.close();\n\t}\n}\n</script>\n\n<template>\n\t<Teleport v-if=\"isOpen\" to=\"body\">\n\t\t<div\n\t\t\t:class=\"$style.contextMenu\"\n\t\t\t:style=\"{\n\t\t\t\tleft: `${position[0]}px`,\n\t\t\t\ttop: `${position[1]}px`,\n\t\t\t}\"\n\t\t>\n\t\t\t<N8nActionDropdown\n\t\t\t\tref=\"dropdown\"\n\t\t\t\t:items=\"actions\"\n\t\t\t\tplacement=\"bottom-start\"\n\t\t\t\tdata-test-id=\"context-menu\"\n\t\t\t\t:hide-arrow=\"target.source !== 'node-button'\"\n\t\t\t\t@select=\"onActionSelect\"\n\t\t\t\t@visible-change=\"onVisibleChange\"\n\t\t\t>\n\t\t\t\t<template #activator>\n\t\t\t\t\t<div :class=\"$style.activator\"></div>\n\t\t\t\t</template>\n\t\t\t</N8nActionDropdown>\n\t\t</div>\n\t</Teleport>\n</template>\n\n<style module lang=\"scss\">\n.contextMenu {\n\tposition: fixed;\n}\n\n.activator {\n\tpointer-events: none;\n\topacity: 0;\n}\n</style>\n","import { defineComponent } from 'vue';\nimport type { PropType } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport type { INodeUi } from '@/Interface';\nimport {\n\tNO_OP_NODE_TYPE,\n\tNODE_CONNECTION_TYPE_ALLOW_MULTIPLE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNODE_MIN_INPUT_ITEMS_COUNT,\n} from '@/constants';\n\nimport { NodeHelpers, NodeConnectionType } from 'n8n-workflow';\nimport type {\n\tConnectionTypes,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeOutputConfiguration,\n\tWorkflow,\n} from 'n8n-workflow';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport type { Endpoint, EndpointOptions } from '@jsplumb/core';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport type { EndpointSpec } from '@jsplumb/common';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport type { N8nEndpointLabelLength } from '@/plugins/jsplumb/N8nPlusEndpointType';\n\nconst createAddInputEndpointSpec = (\n\tconnectionName: NodeConnectionType,\n\tcolor: string,\n): EndpointSpec => {\n\tconst multiple = NODE_CONNECTION_TYPE_ALLOW_MULTIPLE.includes(connectionName);\n\n\treturn {\n\t\ttype: 'N8nAddInput',\n\t\toptions: {\n\t\t\twidth: 24,\n\t\t\theight: 72,\n\t\t\tcolor,\n\t\t\tmultiple,\n\t\t},\n\t};\n};\n\nconst createDiamondOutputEndpointSpec = (): EndpointSpec => ({\n\ttype: 'Rectangle',\n\toptions: {\n\t\theight: 10,\n\t\twidth: 10,\n\t\tcssClass: 'diamond-output-endpoint',\n\t},\n});\n\nconst getEndpointLabelLength = (length: number): N8nEndpointLabelLength => {\n\tif (length <= 2) return 'small';\n\telse if (length <= 6) return 'medium';\n\treturn 'large';\n};\n\nexport const nodeBase = defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\tinputs: [] as Array<ConnectionTypes | INodeInputConfiguration>,\n\t\t\toutputs: [] as Array<ConnectionTypes | INodeOutputConfiguration>,\n\t\t};\n\t},\n\tmounted() {\n\t\t// Initialize the node\n\t\tif (this.data !== null) {\n\t\t\ttry {\n\t\t\t\tthis.__addNode(this.data);\n\t\t\t} catch (error) {\n\t\t\t\t// This breaks when new nodes are loaded into store but workflow tab is not currently active\n\t\t\t\t// Shouldn't affect anything\n\t\t\t}\n\t\t}\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useUIStore, useCanvasStore, useWorkflowsStore, useHistoryStore),\n\t\tdata(): INodeUi | null {\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tnodeId(): string {\n\t\t\treturn this.data?.id || '';\n\t\t},\n\t},\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\t\tinstance: {\n\t\t\ttype: Object as PropType<BrowserJsPlumbInstance>,\n\t\t},\n\t\tisReadOnly: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tisActive: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\thideActions: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tdisableSelecting: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tshowCustomTooltip: {\n\t\t\ttype: Boolean,\n\t\t},\n\t\tworkflow: {\n\t\t\ttype: Object as () => Workflow,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tmethods: {\n\t\t__addEndpointTestingData(endpoint: Endpoint, type: string, inputIndex: number) {\n\t\t\tif (window?.Cypress && 'canvas' in endpoint.endpoint) {\n\t\t\t\tconst canvas = endpoint.endpoint.canvas;\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-name', this.data.name);\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-input-index', inputIndex.toString());\n\t\t\t\tthis.instance.setAttribute(canvas, 'data-endpoint-type', type);\n\t\t\t}\n\t\t},\n\t\t__addInputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\t// Add Inputs\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tconst inputs: Array<ConnectionTypes | INodeInputConfiguration> =\n\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.data!, nodeTypeData) || [];\n\t\t\tthis.inputs = inputs;\n\n\t\t\tconst sortedInputs = [...inputs];\n\t\t\tsortedInputs.sort((a, b) => {\n\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\treturn 1;\n\t\t\t\t} else if (typeof b === 'string') {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tif (a.required && !b.required) {\n\t\t\t\t\treturn -1;\n\t\t\t\t} else if (!a.required && b.required) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\treturn 0;\n\t\t\t});\n\n\t\t\tsortedInputs.forEach((value, i) => {\n\t\t\t\tlet inputConfiguration: INodeInputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\tinputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tinputConfiguration = value;\n\t\t\t\t}\n\n\t\t\t\tconst inputName: ConnectionTypes = inputConfiguration.type;\n\n\t\t\t\tconst rootCategoryInputName =\n\t\t\t\t\tinputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for inputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryInputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryInputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(inputName)) {\n\t\t\t\t\ttypeIndexData[inputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[inputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryInputName];\n\t\t\t\tconst typeIndex = typeIndexData[inputName];\n\n\t\t\t\tconst inputsOfSameRootType = inputs.filter((inputData) => {\n\t\t\t\t\tconst thisInputName: string = typeof inputData === 'string' ? inputData : inputData.type;\n\t\t\t\t\treturn inputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisInputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisInputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\tconst nonMainInputs = inputsOfSameRootType.filter((inputData) => {\n\t\t\t\t\treturn inputData !== NodeConnectionType.Main;\n\t\t\t\t});\n\t\t\t\tconst requiredNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && inputData.required;\n\t\t\t\t});\n\t\t\t\tconst optionalNonMainInputs = nonMainInputs.filter((inputData) => {\n\t\t\t\t\treturn typeof inputData !== 'string' && !inputData.required;\n\t\t\t\t});\n\t\t\t\tconst spacerIndexes = this.getSpacerIndexes(\n\t\t\t\t\trequiredNonMainInputs.length,\n\t\t\t\t\toptionalNonMainInputs.length,\n\t\t\t\t);\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\tinputName,\n\t\t\t\t\t'input',\n\t\t\t\t\tinputsOfSameRootType.length,\n\t\t\t\t\tspacerIndexes,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(inputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getInputEndpointUUID(this.nodeId, inputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t// We potentially want to change that in the future to allow people to dynamically\n\t\t\t\t\t// activate and deactivate connected nodes\n\t\t\t\t\tmaxConnections: inputConfiguration.maxConnections ?? -1,\n\t\t\t\t\tendpoint: 'Rectangle',\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-foreground-xdark',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t'--color-primary',\n\t\t\t\t\t\tinputName,\n\t\t\t\t\t),\n\t\t\t\t\tscope: NodeViewUtils.getScope(scope),\n\t\t\t\t\tsource: inputName !== NodeConnectionType.Main,\n\t\t\t\t\ttarget: !this.isReadOnly && inputs.length > 1, // only enabled for nodes with multiple inputs.. otherwise attachment handled by connectionDrag event in NodeView,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'target',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: inputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\tenabled: !this.isReadOnly, // enabled in default case to allow dragging\n\t\t\t\t\tcssClass: 'rect-input-endpoint',\n\t\t\t\t\tdragAllowedWhenFull: true,\n\t\t\t\t\thoverClass: 'rect-input-endpoint-hover',\n\t\t\t\t\t...this.__getInputConnectionStyle(inputName, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance?.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t) as Endpoint;\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'input', typeIndex);\n\t\t\t\tif (inputConfiguration.displayName || nodeTypeData.inputNames?.[i]) {\n\t\t\t\t\t// Apply input names if they got set\n\t\t\t\t\tendpoint.addOverlay(\n\t\t\t\t\t\tNodeViewUtils.getInputNameOverlay(\n\t\t\t\t\t\t\tinputConfiguration.displayName || nodeTypeData.inputNames[i],\n\t\t\t\t\t\t\tinputName,\n\t\t\t\t\t\t\tinputConfiguration.required,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: inputsOfSameRootType.length,\n\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// TODO: Activate again if it makes sense. Currently makes problems when removing\n\t\t\t\t// connection on which the input has a name. It does not get hidden because\n\t\t\t\t// the endpoint to which it connects when letting it go over the node is\n\t\t\t\t// different to the regular one (have different ids). So that seems to make\n\t\t\t\t// problems when hiding the input-name.\n\n\t\t\t\t// if (index === 0 && inputName === NodeConnectionType.Main) {\n\t\t\t\t// \t// Make the first main-input the default one to connect to when connection gets dropped on node\n\t\t\t\t// \tthis.instance.makeTarget(this.nodeId, newEndpointData);\n\t\t\t\t// }\n\t\t\t});\n\t\t\tif (sortedInputs.length === 0) {\n\t\t\t\tthis.instance.manage(this.$refs[this.data.name] as Element);\n\t\t\t}\n\t\t},\n\t\tgetSpacerIndexes(\n\t\t\tleftGroupItemsCount: number,\n\t\t\trightGroupItemsCount: number,\n\t\t\tinsertSpacerBetweenGroups = NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\t\t\tminItemsCount = NODE_MIN_INPUT_ITEMS_COUNT,\n\t\t): number[] {\n\t\t\tconst spacerIndexes = [];\n\n\t\t\tif (leftGroupItemsCount > 0 && rightGroupItemsCount > 0) {\n\t\t\t\tif (insertSpacerBetweenGroups) {\n\t\t\t\t\tspacerIndexes.push(leftGroupItemsCount);\n\t\t\t\t} else if (leftGroupItemsCount + rightGroupItemsCount < minItemsCount) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tleftGroupItemsCount > 0 &&\n\t\t\t\t\tleftGroupItemsCount < minItemsCount &&\n\t\t\t\t\trightGroupItemsCount === 0\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - leftGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex + leftGroupItemsCount);\n\t\t\t\t\t}\n\t\t\t\t} else if (\n\t\t\t\t\tleftGroupItemsCount === 0 &&\n\t\t\t\t\trightGroupItemsCount > 0 &&\n\t\t\t\t\trightGroupItemsCount < minItemsCount\n\t\t\t\t) {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet spacerIndex = 0;\n\t\t\t\t\t\tspacerIndex < minItemsCount - rightGroupItemsCount;\n\t\t\t\t\t\tspacerIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tspacerIndexes.push(spacerIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spacerIndexes;\n\t\t},\n\t\t__addOutputEndpoints(node: INodeUi, nodeTypeData: INodeTypeDescription) {\n\t\t\tconst rootTypeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\t\t\tconst typeIndexData: {\n\t\t\t\t[key: string]: number;\n\t\t\t} = {};\n\n\t\t\tthis.outputs = NodeHelpers.getNodeOutputs(this.workflow, this.data, nodeTypeData) || [];\n\n\t\t\t// TODO: There are still a lot of references of \"main\" in NodesView and\n\t\t\t// other locations. So assume there will be more problems\n\t\t\tlet maxLabelLength = 0;\n\t\t\tconst outputConfigurations: INodeOutputConfiguration[] = [];\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tlet outputConfiguration: INodeOutputConfiguration;\n\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\toutputConfiguration = {\n\t\t\t\t\t\ttype: value,\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\toutputConfiguration = value;\n\t\t\t\t}\n\t\t\t\tif (nodeTypeData.outputNames?.[i]) {\n\t\t\t\t\toutputConfiguration.displayName = nodeTypeData.outputNames[i];\n\t\t\t\t}\n\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\tmaxLabelLength =\n\t\t\t\t\t\toutputConfiguration.displayName.length > maxLabelLength\n\t\t\t\t\t\t\t? outputConfiguration.displayName.length\n\t\t\t\t\t\t\t: maxLabelLength;\n\t\t\t\t}\n\n\t\t\t\toutputConfigurations.push(outputConfiguration);\n\t\t\t});\n\n\t\t\tconst endpointLabelLength = getEndpointLabelLength(maxLabelLength);\n\n\t\t\tthis.outputs.forEach((value, i) => {\n\t\t\t\tconst outputConfiguration = outputConfigurations[i];\n\n\t\t\t\tconst outputName: ConnectionTypes = outputConfiguration.type;\n\n\t\t\t\tconst rootCategoryOutputName =\n\t\t\t\t\toutputName === NodeConnectionType.Main ? NodeConnectionType.Main : 'other';\n\n\t\t\t\t// Increment the index for outputs with current name\n\t\t\t\tif (rootTypeIndexData.hasOwnProperty(rootCategoryOutputName)) {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName]++;\n\t\t\t\t} else {\n\t\t\t\t\trootTypeIndexData[rootCategoryOutputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tif (typeIndexData.hasOwnProperty(outputName)) {\n\t\t\t\t\ttypeIndexData[outputName]++;\n\t\t\t\t} else {\n\t\t\t\t\ttypeIndexData[outputName] = 0;\n\t\t\t\t}\n\n\t\t\t\tconst rootTypeIndex = rootTypeIndexData[rootCategoryOutputName];\n\t\t\t\tconst typeIndex = typeIndexData[outputName];\n\n\t\t\t\tconst outputsOfSameRootType = this.outputs.filter((outputData) => {\n\t\t\t\t\tconst thisOutputName: string =\n\t\t\t\t\t\ttypeof outputData === 'string' ? outputData : outputData.type;\n\t\t\t\t\treturn outputName === NodeConnectionType.Main\n\t\t\t\t\t\t? thisOutputName === NodeConnectionType.Main\n\t\t\t\t\t\t: thisOutputName !== NodeConnectionType.Main;\n\t\t\t\t});\n\n\t\t\t\t// Get the position of the anchor depending on how many it has\n\t\t\t\tconst anchorPosition = NodeViewUtils.getAnchorPosition(\n\t\t\t\t\toutputName,\n\t\t\t\t\t'output',\n\t\t\t\t\toutputsOfSameRootType.length,\n\t\t\t\t)[rootTypeIndex];\n\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(outputName as NodeConnectionType);\n\n\t\t\t\tconst newEndpointData: EndpointOptions = {\n\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\tendpoint: {\n\t\t\t\t\t\ttype: 'Dot',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tradius: nodeTypeData && outputsOfSameRootType.length > 2 ? 7 : 9,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(nodeTypeData, '--color-primary'),\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: true,\n\t\t\t\t\ttarget: outputName !== NodeConnectionType.Main,\n\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\tparameters: {\n\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t},\n\t\t\t\t\thoverClass: 'dot-output-endpoint-hover',\n\t\t\t\t\tconnectionsDirected: true,\n\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t...this.__getOutputConnectionStyle(outputName, outputConfiguration, nodeTypeData),\n\t\t\t\t};\n\n\t\t\t\tconst endpoint = this.instance.addEndpoint(\n\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\tnewEndpointData,\n\t\t\t\t);\n\n\t\t\t\tthis.__addEndpointTestingData(endpoint, 'output', typeIndex);\n\t\t\t\tif (outputConfiguration.displayName) {\n\t\t\t\t\t// Apply output names if they got set\n\t\t\t\t\tconst overlaySpec = NodeViewUtils.getOutputNameOverlay(\n\t\t\t\t\t\toutputConfiguration.displayName,\n\t\t\t\t\t\toutputName,\n\t\t\t\t\t\toutputConfiguration?.category,\n\t\t\t\t\t);\n\t\t\t\t\tendpoint.addOverlay(overlaySpec);\n\t\t\t\t}\n\n\t\t\t\tif (!Array.isArray(endpoint)) {\n\t\t\t\t\tendpoint.__meta = {\n\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (!this.isReadOnly && outputName === NodeConnectionType.Main) {\n\t\t\t\t\tconst plusEndpointData: EndpointOptions = {\n\t\t\t\t\t\tuuid: NodeViewUtils.getOutputEndpointUUID(this.nodeId, outputName, typeIndex),\n\t\t\t\t\t\tanchor: anchorPosition,\n\t\t\t\t\t\tmaxConnections: -1,\n\t\t\t\t\t\tendpoint: {\n\t\t\t\t\t\t\ttype: 'N8nPlus',\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tdimensions: 24,\n\t\t\t\t\t\t\t\tconnectedEndpoint: endpoint,\n\t\t\t\t\t\t\t\tshowOutputLabel: this.outputs.length === 1,\n\t\t\t\t\t\t\t\tsize: this.outputs.length >= 3 ? 'small' : 'medium',\n\t\t\t\t\t\t\t\tendpointLabelLength,\n\t\t\t\t\t\t\t\thoverMessage: this.$locale.baseText('nodeBase.clickToAddNodeOrDragToConnect'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsource: true,\n\t\t\t\t\t\ttarget: false,\n\t\t\t\t\t\tenabled: !this.isReadOnly,\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\thoverPaintStyle: {\n\t\t\t\t\t\t\toutlineStroke: 'none',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tparameters: {\n\t\t\t\t\t\t\tconnection: 'source',\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\ttype: outputName,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tcategory: outputConfiguration?.category,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: 'plus-draggable-endpoint',\n\t\t\t\t\t\tdragAllowedWhenFull: false,\n\t\t\t\t\t};\n\n\t\t\t\t\tif (outputConfiguration?.category) {\n\t\t\t\t\t\tplusEndpointData.cssClass = `${plusEndpointData.cssClass} ${outputConfiguration?.category}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst plusEndpoint = this.instance.addEndpoint(\n\t\t\t\t\t\tthis.$refs[this.data.name] as Element,\n\t\t\t\t\t\tplusEndpointData,\n\t\t\t\t\t);\n\t\t\t\t\tthis.__addEndpointTestingData(plusEndpoint, 'plus', typeIndex);\n\n\t\t\t\t\tif (!Array.isArray(plusEndpoint)) {\n\t\t\t\t\t\tplusEndpoint.__meta = {\n\t\t\t\t\t\t\tnodeName: node.name,\n\t\t\t\t\t\t\tnodeId: this.nodeId,\n\t\t\t\t\t\t\tindex: typeIndex,\n\t\t\t\t\t\t\tnodeType: node.type,\n\t\t\t\t\t\t\ttotalEndpoints: outputsOfSameRootType.length,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t__addNode(node: INodeUi) {\n\t\t\tconst nodeTypeData = (this.nodeTypesStore.getNodeType(node.type, node.typeVersion) ??\n\t\t\t\tthis.nodeTypesStore.getNodeType(NO_OP_NODE_TYPE)) as INodeTypeDescription;\n\n\t\t\tthis.__addInputEndpoints(node, nodeTypeData);\n\t\t\tthis.__addOutputEndpoints(node, nodeTypeData);\n\t\t},\n\t\t__getEndpointColor(connectionType: ConnectionTypes) {\n\t\t\treturn `--node-type-${connectionType}-color`;\n\t\t},\n\t\t__getInputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getInputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createAddInputEndpointSpec(\n\t\t\t\t\tconnectionName as NodeConnectionType,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\t__getOutputConnectionStyle(\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\toutputConfiguration: INodeOutputConfiguration,\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t): EndpointOptions {\n\t\t\tconst type = 'output';\n\n\t\t\tconst createSupplementalConnectionType = (\n\t\t\t\tconnectionName: ConnectionTypes,\n\t\t\t): EndpointOptions => ({\n\t\t\t\tendpoint: createDiamondOutputEndpointSpec(),\n\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t\thoverPaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\tnodeTypeData,\n\t\t\t\t\tthis.__getEndpointColor(connectionName),\n\t\t\t\t),\n\t\t\t});\n\n\t\t\tif (connectionType === NodeConnectionType.Main) {\n\t\t\t\tif (outputConfiguration.category === 'error') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpaintStyle: {\n\t\t\t\t\t\t\t...NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tfill: 'var(--color-danger)',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tpaintStyle: NodeViewUtils.getOutputEndpointStyle(\n\t\t\t\t\t\tnodeTypeData,\n\t\t\t\t\t\tthis.__getEndpointColor(NodeConnectionType.Main),\n\t\t\t\t\t),\n\t\t\t\t\tcssClass: `dot-${type}-endpoint`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!Object.values(NodeConnectionType).includes(connectionType as NodeConnectionType)) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\treturn createSupplementalConnectionType(connectionType);\n\t\t},\n\t\ttouchEnd(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\t\t\tif (deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tmouseLeftClick(e: MouseEvent) {\n\t\t\tconst deviceSupport = useDeviceSupport();\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\t\t\tfor (let index = 0; index < path.length; index++) {\n\t\t\t\tif (\n\t\t\t\t\tpath[index].className &&\n\t\t\t\t\ttypeof path[index].className === 'string' &&\n\t\t\t\t\tpath[index].className.includes('no-select-on-click')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!deviceSupport.isTouchDevice) {\n\t\t\t\tif (this.uiStore.isActionActive('dragActive')) {\n\t\t\t\t\tthis.uiStore.removeActiveAction('dragActive');\n\t\t\t\t} else {\n\t\t\t\t\tif (!deviceSupport.isCtrlKeyPressed(e)) {\n\t\t\t\t\t\tthis.$emit('deselectAllNodes');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.uiStore.isNodeSelected(this.data.name)) {\n\t\t\t\t\t\tthis.$emit('deselectNode', this.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.$emit('nodeSelected', this.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n});\n","<template>\n\t<div\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\t:class=\"nodeWrapperClass\"\n\t\t:style=\"nodeWrapperStyles\"\n\t\tdata-test-id=\"canvas-node\"\n\t\t:data-name=\"data.name\"\n\t\t:data-node-type=\"nodeType?.name\"\n\t\t@contextmenu=\"(e: MouseEvent) => openContextMenu(e, 'node-right-click')\"\n\t>\n\t\t<div v-show=\"isSelected\" class=\"select-background\"></div>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'node-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'menu-open': isContextMenuOpen,\n\t\t\t\t'disable-pointer-events': disablePointerEvents,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\t:class=\"nodeClass\"\n\t\t\t\t:style=\"nodeStyle\"\n\t\t\t\t@click.left=\"onClick\"\n\t\t\t>\n\t\t\t\t<i v-if=\"isTriggerNode\" class=\"trigger-icon\">\n\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<span v-html=\"$locale.baseText('node.thisIsATriggerNode')\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"bolt\" size=\"lg\" />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</i>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"!data.disabled\"\n\t\t\t\t\t:class=\"{ 'node-info-icon': true, 'shift-icon': shiftOutputCount }\"\n\t\t\t\t>\n\t\t\t\t\t<div v-if=\"hasIssues && !hideNodeIssues\" class=\"node-issues\" data-test-id=\"node-issues\">\n\t\t\t\t\t\t<n8n-tooltip :show-after=\"500\" placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<TitledList :title=\"`${$locale.baseText('node.issues')}:`\" :items=\"nodeIssues\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"exclamation-triangle\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else-if=\"waiting || nodeExecutionStatus === 'waiting'\" class=\"waiting\">\n\t\t\t\t\t\t<n8n-tooltip placement=\"bottom\">\n\t\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t\t<div v-text=\"waiting\"></div>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<FontAwesomeIcon icon=\"clock\" />\n\t\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span v-else-if=\"showPinnedDataInfo\" class=\"node-pin-data-icon\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"thumbtack\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"nodeExecutionStatus === 'unknown'\">\n\t\t\t\t\t\t<!-- Do nothing, unknown means the node never executed -->\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-else-if=\"workflowDataItems\" class=\"data-count\">\n\t\t\t\t\t\t<FontAwesomeIcon icon=\"check\" />\n\t\t\t\t\t\t<span v-if=\"workflowDataItems > 1\" class=\"items-count\"> {{ workflowDataItems }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-executing-info\" :title=\"$locale.baseText('node.nodeIsExecuting')\">\n\t\t\t\t\t<FontAwesomeIcon icon=\"sync-alt\" spin />\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"node-trigger-tooltip__wrapper\">\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:show-after=\"500\"\n\t\t\t\t\t\t:visible=\"showTriggerNodeTooltip\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t<div v-text=\"getTriggerNodeTooltip\"></div>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t\t<n8n-tooltip\n\t\t\t\t\t\tv-if=\"isTriggerNode\"\n\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t:visible=\"pinDataDiscoveryTooltipVisible\"\n\t\t\t\t\t\tpopper-class=\"node-trigger-tooltip__wrapper--item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #content>\n\t\t\t\t\t\t\t{{ $locale.baseText('node.discovery.pinData.canvas') }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<span />\n\t\t\t\t\t</n8n-tooltip>\n\t\t\t\t</div>\n\n\t\t\t\t<NodeIcon\n\t\t\t\t\tclass=\"node-icon\"\n\t\t\t\t\t:node-type=\"iconNodeType\"\n\t\t\t\t\t:size=\"40\"\n\t\t\t\t\t:shrink=\"false\"\n\t\t\t\t\t:color-default=\"iconColorDefault\"\n\t\t\t\t\t:disabled=\"data.disabled\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"showDisabledLinethrough\"\n\t\t\t\t:class=\"{\n\t\t\t\t\t'disabled-linethrough': true,\n\t\t\t\t\tsuccess: !['unknown'].includes(nodeExecutionStatus) && workflowDataItems > 0,\n\t\t\t\t}\"\n\t\t\t></div>\n\t\t</div>\n\t\t<div class=\"node-description\">\n\t\t\t<div class=\"node-name\" :title=\"nodeTitle\">\n\t\t\t\t<p data-test-id=\"canvas-node-box-title\">\n\t\t\t\t\t{{ nodeTitle }}\n\t\t\t\t</p>\n\t\t\t\t<p v-if=\"data.disabled\">({{ $locale.baseText('node.disabled') }})</p>\n\t\t\t</div>\n\t\t\t<div v-if=\"nodeSubtitle !== undefined\" class=\"node-subtitle\" :title=\"nodeSubtitle\">\n\t\t\t\t{{ nodeSubtitle }}\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\tv-if=\"!isReadOnly\"\n\t\t\tv-show=\"!hideActions\"\n\t\t\tclass=\"node-options no-select-on-click\"\n\t\t\t@contextmenu.stop\n\t\t\t@mousedown.stop\n\t\t>\n\t\t\t<div class=\"node-options-inner\">\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"!isConfigNode\"\n\t\t\t\t\tdata-test-id=\"execute-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"play\"\n\t\t\t\t\t:disabled=\"workflowRunning\"\n\t\t\t\t\t:title=\"$locale.baseText('node.testStep')\"\n\t\t\t\t\t@click=\"executeNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"disable-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\ttext\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ticon=\"power-off\"\n\t\t\t\t\t:title=\"nodeDisabledTitle\"\n\t\t\t\t\t@click=\"toggleDisableNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"delete-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t\t@click=\"deleteNode\"\n\t\t\t\t/>\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tdata-test-id=\"overflow-node-button\"\n\t\t\t\t\ttype=\"tertiary\"\n\t\t\t\t\tsize=\"small\"\n\t\t\t\t\ttext\n\t\t\t\t\ticon=\"ellipsis-h\"\n\t\t\t\t\t@click=\"(e: MouseEvent) => openContextMenu(e, 'node-button')\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from 'vue';\nimport { mapStores } from 'pinia';\nimport { useStorage } from '@/composables/useStorage';\nimport {\n\tCUSTOM_API_CALL_KEY,\n\tLOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tNODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS,\n\tNOT_DUPLICATABE_NODE_TYPES,\n\tSIMULATE_NODE_TYPE,\n\tSIMULATE_TRIGGER_NODE_TYPE,\n\tWAIT_TIME_UNLIMITED,\n} from '@/constants';\nimport { nodeBase } from '@/mixins/nodeBase';\nimport type {\n\tConnectionTypes,\n\tExecutionSummary,\n\tINodeInputConfiguration,\n\tINodeOutputConfiguration,\n\tINodeTypeDescription,\n\tITaskData,\n\tNodeOperationError,\n} from 'n8n-workflow';\nimport { NodeConnectionType, NodeHelpers } from 'n8n-workflow';\n\nimport NodeIcon from '@/components/NodeIcon.vue';\nimport TitledList from '@/components/TitledList.vue';\n\nimport { get } from 'lodash-es';\nimport { getTriggerNodeServiceName } from '@/utils/nodeTypesUtils';\nimport type { INodeUi, XYPosition } from '@/Interface';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { EnableNodeToggleCommand } from '@/models/history';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { type ContextMenuTarget, useContextMenu } from '@/composables/useContextMenu';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\n\nexport default defineComponent({\n\tname: 'Node',\n\tcomponents: {\n\t\tTitledList,\n\t\tFontAwesomeIcon,\n\t\tNodeIcon,\n\t},\n\tmixins: [nodeBase],\n\tprops: {\n\t\tisProductionExecutionPreview: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tdisablePointerEvents: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thideNodeIssues: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tsetup(props) {\n\t\tconst workflowsStore = useWorkflowsStore();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst node = workflowsStore.getNodeByName(props.name);\n\t\tconst pinnedData = usePinnedData(node);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\n\t\treturn {\n\t\t\tcontextMenu,\n\t\t\texternalHooks,\n\t\t\tnodeHelpers,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcallDebounced,\n\t\t};\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tshowPinnedDataInfo(): boolean {\n\t\t\treturn this.pinnedData.hasData.value && !this.isProductionExecutionPreview;\n\t\t},\n\t\tisDuplicatable(): boolean {\n\t\t\tif (!this.nodeType) return true;\n\t\t\tif (NOT_DUPLICATABE_NODE_TYPES.includes(this.nodeType.name)) return false;\n\t\t\treturn (\n\t\t\t\tthis.nodeType.maxNodes === undefined || this.sameTypeNodes.length < this.nodeType.maxNodes\n\t\t\t);\n\t\t},\n\t\tisScheduledGroup(): boolean {\n\t\t\treturn this.nodeType?.group.includes('schedule') === true;\n\t\t},\n\t\ticonColorDefault(): string | undefined {\n\t\t\tif (this.isConfigNode) {\n\t\t\t\treturn 'var(--color-text-base)';\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\tnodeRunData(): ITaskData[] {\n\t\t\treturn this.workflowsStore.getWorkflowResultDataByNodeName(this.data?.name || '') || [];\n\t\t},\n\t\thasIssues(): boolean {\n\t\t\tif (this.nodeExecutionStatus && ['crashed', 'error'].includes(this.nodeExecutionStatus))\n\t\t\t\treturn true;\n\t\t\tif (this.pinnedData.hasData.value) return false;\n\t\t\tif (this.data?.issues !== undefined && Object.keys(this.data.issues).length) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tworkflowDataItems(): number {\n\t\t\tconst workflowResultDataNode = this.nodeRunData;\n\t\t\tif (workflowResultDataNode === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn workflowResultDataNode.length;\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tgetTriggerNodeTooltip(): string | undefined {\n\t\t\tif (this.nodeType !== null && this.nodeType.hasOwnProperty('eventTriggerDescription')) {\n\t\t\t\tconst nodeName = this.$locale.shortNodeType(this.nodeType.name);\n\t\t\t\tconst { eventTriggerDescription } = this.nodeType;\n\t\t\t\treturn this.$locale\n\t\t\t\t\t.nodeText()\n\t\t\t\t\t.eventTriggerDescription(nodeName, eventTriggerDescription || '');\n\t\t\t} else {\n\t\t\t\treturn this.$locale.baseText('node.waitingForYouToCreateAnEventIn', {\n\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\tnodeType: this.nodeType ? getTriggerNodeServiceName(this.nodeType) : '',\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tisPollingTypeNode(): boolean {\n\t\t\treturn !!this.nodeType?.polling;\n\t\t},\n\t\tisExecuting(): boolean {\n\t\t\treturn this.workflowsStore.isNodeExecuting(this.data.name);\n\t\t},\n\t\tisSingleActiveTriggerNode(): boolean {\n\t\t\tconst nodes = this.workflowsStore.workflowTriggerNodes.filter((node: INodeUi) => {\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\t\t\t\treturn nodeType && nodeType.eventTriggerDescription !== '' && !node.disabled;\n\t\t\t});\n\n\t\t\treturn nodes.length === 1;\n\t\t},\n\t\tisManualTypeNode(): boolean {\n\t\t\treturn this.data.type === MANUAL_TRIGGER_NODE_TYPE;\n\t\t},\n\t\tisConfigNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigNode(this.workflow, this.data, this.data?.type ?? '');\n\t\t},\n\t\tisConfigurableNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isConfigurableNode(\n\t\t\t\tthis.workflow,\n\t\t\t\tthis.data,\n\t\t\t\tthis.data?.type ?? '',\n\t\t\t);\n\t\t},\n\t\tisTriggerNode(): boolean {\n\t\t\treturn this.nodeTypesStore.isTriggerNode(this.data?.type || '');\n\t\t},\n\t\tisTriggerNodeTooltipEmpty(): boolean {\n\t\t\treturn this.nodeType !== null ? this.nodeType.eventTriggerDescription === '' : false;\n\t\t},\n\t\tisNodeDisabled(): boolean | undefined {\n\t\t\treturn this.node && this.node.disabled;\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | undefined {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.nodesByName[this.name] as INodeUi | undefined;\n\t\t},\n\t\tsameTypeNodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node: INodeUi) => node.type === this.data.type);\n\t\t},\n\t\tnodeWrapperClass(): object {\n\t\t\tconst classes = {\n\t\t\t\t'node-wrapper': true,\n\t\t\t\t'node-wrapper--trigger': this.isTriggerNode,\n\t\t\t\t'node-wrapper--configurable': this.isConfigurableNode,\n\t\t\t\t'node-wrapper--config': this.isConfigNode,\n\t\t\t};\n\n\t\t\tif (this.outputs.length) {\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(this.outputs);\n\t\t\t\tconst otherOutputs = outputTypes.filter(\n\t\t\t\t\t(outputName) => outputName !== NodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t\tif (otherOutputs.length) {\n\t\t\t\t\totherOutputs.forEach((outputName) => {\n\t\t\t\t\t\tclasses[`node-wrapper--connection-type-${outputName}`] = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn classes;\n\t\t},\n\t\tnodeWrapperStyles(): object {\n\t\t\tconst styles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t};\n\n\t\t\tif (this.node && this.nodeType) {\n\t\t\t\tconst inputs =\n\t\t\t\t\tNodeHelpers.getNodeInputs(this.workflow, this.node, this.nodeType) ||\n\t\t\t\t\t([] as Array<ConnectionTypes | INodeInputConfiguration>);\n\t\t\t\tconst inputTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\tconst nonMainInputs = inputTypes.filter((input) => input !== NodeConnectionType.Main);\n\t\t\t\tif (nonMainInputs.length) {\n\t\t\t\t\tconst requiredNonMainInputs = inputs.filter(\n\t\t\t\t\t\t(input) => typeof input !== 'string' && input.required,\n\t\t\t\t\t);\n\n\t\t\t\t\tlet spacerCount = 0;\n\t\t\t\t\tif (NODE_INSERT_SPACER_BETWEEN_INPUT_GROUPS) {\n\t\t\t\t\t\tconst requiredNonMainInputsCount = requiredNonMainInputs.length;\n\t\t\t\t\t\tconst optionalNonMainInputsCount = nonMainInputs.length - requiredNonMainInputsCount;\n\t\t\t\t\t\tspacerCount = requiredNonMainInputsCount > 0 && optionalNonMainInputsCount > 0 ? 1 : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tstyles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount;\n\t\t\t\t}\n\n\t\t\t\tlet outputs = [] as Array<ConnectionTypes | INodeOutputConfiguration>;\n\t\t\t\tif (this.workflow.nodes[this.node.name]) {\n\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType);\n\t\t\t\t}\n\n\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\n\t\t\t\tconst mainOutputs = outputTypes.filter((output) => output === NodeConnectionType.Main);\n\t\t\t\tstyles['--node-main-output-count'] = mainOutputs.length;\n\t\t\t}\n\n\t\t\treturn styles;\n\t\t},\n\t\tnodeClass(): object {\n\t\t\treturn {\n\t\t\t\t'node-box': true,\n\t\t\t\tdisabled: this.data.disabled,\n\t\t\t\texecuting: this.isExecuting,\n\t\t\t};\n\t\t},\n\t\tnodeExecutionStatus(): string {\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\treturn nodeExecutionRunData.filter(Boolean)[0].executionStatus ?? '';\n\t\t\t}\n\t\t\treturn '';\n\t\t},\n\t\tnodeIssues(): string[] {\n\t\t\tconst issues: string[] = [];\n\t\t\tconst nodeExecutionRunData = this.workflowsStore.getWorkflowRunData?.[this.name];\n\t\t\tif (nodeExecutionRunData) {\n\t\t\t\tnodeExecutionRunData.forEach((executionRunData) => {\n\t\t\t\t\tif (executionRunData?.error) {\n\t\t\t\t\t\tissues.push(\n\t\t\t\t\t\t\t`${executionRunData.error.message}${\n\t\t\t\t\t\t\t\texecutionRunData.error.description ? ` (${executionRunData.error.description})` : ''\n\t\t\t\t\t\t\t}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (this.data?.issues !== undefined) {\n\t\t\t\tissues.push(...NodeHelpers.nodeIssuesToString(this.data.issues, this.data));\n\t\t\t}\n\t\t\treturn issues;\n\t\t},\n\t\tnodeDisabledTitle(): string {\n\t\t\treturn this.data.disabled\n\t\t\t\t? this.$locale.baseText('node.enable')\n\t\t\t\t: this.$locale.baseText('node.disable');\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\treturn this.node ? this.node.position : [0, 0];\n\t\t},\n\t\tshowDisabledLinethrough(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.isConfigurableNode &&\n\t\t\t\t!!(this.data.disabled && this.inputs.length === 1 && this.outputs.length === 1)\n\t\t\t);\n\t\t},\n\t\tshortNodeType(): string {\n\t\t\treturn this.$locale.shortNodeType(this.data.type);\n\t\t},\n\t\tnodeTitle(): string {\n\t\t\tif (this.data.name === 'Start') {\n\t\t\t\treturn this.$locale.headerText({\n\t\t\t\t\tkey: 'headers.start.displayName',\n\t\t\t\t\tfallback: 'Start',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn this.data.name;\n\t\t},\n\t\twaiting(): string | undefined {\n\t\t\tconst workflowExecution = this.workflowsStore.getWorkflowExecution as ExecutionSummary;\n\n\t\t\tif (workflowExecution?.waitTill) {\n\t\t\t\tconst lastNodeExecuted = get(workflowExecution, 'data.resultData.lastNodeExecuted');\n\t\t\t\tif (this.name === lastNodeExecuted) {\n\t\t\t\t\tconst waitDate = new Date(workflowExecution.waitTill);\n\t\t\t\t\tif (waitDate.toISOString() === WAIT_TIME_UNLIMITED) {\n\t\t\t\t\t\treturn this.$locale.baseText(\n\t\t\t\t\t\t\t'node.theNodeIsWaitingIndefinitelyForAnIncomingWebhookCall',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn this.$locale.baseText('node.nodeIsWaitingTill', {\n\t\t\t\t\t\tinterpolate: {\n\t\t\t\t\t\t\tdate: waitDate.toLocaleDateString(),\n\t\t\t\t\t\t\ttime: waitDate.toLocaleTimeString(),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tnodeStyle(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\n\t\t\tlet borderColor = '--color-foreground-xdark';\n\n\t\t\tif (this.isConfigurableNode || this.isConfigNode) {\n\t\t\t\tborderColor = '--color-foreground-dark';\n\t\t\t}\n\n\t\t\tif (this.data.disabled) {\n\t\t\t\tborderColor = '--color-foreground-base';\n\t\t\t} else if (!this.isExecuting) {\n\t\t\t\tif (this.hasIssues && !this.hideNodeIssues) {\n\t\t\t\t\t// Do not set red border if there is an issue with the configuration node\n\t\t\t\t\tif (\n\t\t\t\t\t\t(this.nodeRunData?.[0]?.error as NodeOperationError)?.functionality !==\n\t\t\t\t\t\t'configuration-node'\n\t\t\t\t\t) {\n\t\t\t\t\t\tborderColor = '--color-danger';\n\t\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\t}\n\t\t\t\t} else if (this.waiting || this.showPinnedDataInfo) {\n\t\t\t\t\tborderColor = '--color-canvas-node-pinned-border';\n\t\t\t\t} else if (this.nodeExecutionStatus === 'unknown') {\n\t\t\t\t\tborderColor = '--color-foreground-xdark';\n\t\t\t\t} else if (this.workflowDataItems) {\n\t\t\t\t\treturnStyles['border-width'] = '2px';\n\t\t\t\t\treturnStyles['border-style'] = 'solid';\n\t\t\t\t\tborderColor = '--color-success';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturnStyles['border-color'] = `var(${borderColor})`;\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tshiftOutputCount(): boolean {\n\t\t\treturn !!(this.nodeType && this.outputs.length > 2);\n\t\t},\n\t\tshouldShowTriggerTooltip(): boolean {\n\t\t\treturn (\n\t\t\t\t!!this.node &&\n\t\t\t\tthis.isTriggerNode &&\n\t\t\t\t!this.isPollingTypeNode &&\n\t\t\t\t!this.pinnedData.hasData.value &&\n\t\t\t\t!this.isNodeDisabled &&\n\t\t\t\tthis.workflowRunning &&\n\t\t\t\tthis.workflowDataItems === 0 &&\n\t\t\t\tthis.isSingleActiveTriggerNode &&\n\t\t\t\t!this.isTriggerNodeTooltipEmpty &&\n\t\t\t\t!this.hasIssues &&\n\t\t\t\t!this.dragging\n\t\t\t);\n\t\t},\n\t\tisContextMenuOpen(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.contextMenu.isOpen.value &&\n\t\t\t\tthis.contextMenu.target.value.source === 'node-button' &&\n\t\t\t\tthis.contextMenu.target.value.node.name === this.data?.name\n\t\t\t);\n\t\t},\n\t\ticonNodeType() {\n\t\t\tif (\n\t\t\t\tthis.data?.type === SIMULATE_NODE_TYPE ||\n\t\t\t\tthis.data?.type === SIMULATE_TRIGGER_NODE_TYPE\n\t\t\t) {\n\t\t\t\tconst icon = this.data.parameters?.icon as string;\n\t\t\t\tconst iconNodeType = this.workflow.expression.getSimpleParameterValue(\n\t\t\t\t\tthis.data,\n\t\t\t\t\ticon,\n\t\t\t\t\t'internal',\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t\tif (iconNodeType && typeof iconNodeType === 'string') {\n\t\t\t\t\treturn this.nodeTypesStore.getNodeType(iconNodeType);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.nodeType;\n\t\t},\n\t},\n\twatch: {\n\t\tisActive(newValue, oldValue) {\n\t\t\tif (!newValue && oldValue) {\n\t\t\t\tthis.setSubtitle();\n\t\t\t}\n\t\t},\n\t\tcanvasOffsetPosition() {\n\t\t\tif (this.showTriggerNodeTooltip) {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 200);\n\t\t\t}\n\n\t\t\tif (this.pinDataDiscoveryTooltipVisible) {\n\t\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t},\n\t\tshouldShowTriggerTooltip(shouldShowTriggerTooltip) {\n\t\t\tif (shouldShowTriggerTooltip) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.showTriggerNodeTooltip = this.shouldShowTriggerTooltip;\n\t\t\t\t}, 2500);\n\t\t\t} else {\n\t\t\t\tthis.showTriggerNodeTooltip = false;\n\t\t\t}\n\t\t},\n\t\tnodeRunData(newValue) {\n\t\t\tif (!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$emit('run', { name: this.data.name, data: newValue, waiting: !!this.waiting });\n\t\t},\n\t},\n\tcreated() {\n\t\tconst hasSeenPinDataTooltip = useStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value;\n\t\tif (!hasSeenPinDataTooltip) {\n\t\t\tthis.unwatchWorkflowDataItems = this.$watch('workflowDataItems', (dataItemsCount: number) => {\n\t\t\t\tthis.showPinDataDiscoveryTooltip(dataItemsCount);\n\t\t\t});\n\t\t}\n\t},\n\tmounted() {\n\t\tsetTimeout(() => {\n\t\t\tthis.setSubtitle();\n\t\t}, 0);\n\t\tif (this.nodeRunData) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.$emit('run', {\n\t\t\t\t\tname: this.data && this.data.name,\n\t\t\t\t\tdata: this.nodeRunData,\n\t\t\t\t\twaiting: !!this.waiting,\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisTouchActive: false,\n\t\t\tnodeSubtitle: '',\n\t\t\tshowTriggerNodeTooltip: false,\n\t\t\tpinDataDiscoveryTooltipVisible: false,\n\t\t\tdragging: false,\n\t\t\tunwatchWorkflowDataItems: () => {},\n\t\t};\n\t},\n\tmethods: {\n\t\tshowPinDataDiscoveryTooltip(dataItemsCount: number): void {\n\t\t\tif (\n\t\t\t\t!this.isTriggerNode ||\n\t\t\t\tthis.isManualTypeNode ||\n\t\t\t\tthis.isScheduledGroup ||\n\t\t\t\tthis.uiStore.isModalActive ||\n\t\t\t\tdataItemsCount === 0\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tuseStorage(LOCAL_STORAGE_PIN_DATA_DISCOVERY_CANVAS_FLAG).value = 'true';\n\n\t\t\tthis.pinDataDiscoveryTooltipVisible = true;\n\t\t\tthis.unwatchWorkflowDataItems();\n\t\t},\n\t\tsetSubtitle() {\n\t\t\t// why is this not a computed property? because it's a very expensive operation\n\t\t\t// it requires expressions to resolve each subtitle...\n\t\t\t// and ends up bogging down the UI with big workflows, for example when pasting a workflow or even opening a node...\n\t\t\t// so we only update it when necessary (when node is mounted and when it's opened and closed (isActive))\n\t\t\ttry {\n\t\t\t\tconst nodeSubtitle =\n\t\t\t\t\tthis.nodeHelpers.getNodeSubtitle(this.data, this.nodeType, this.workflow) || '';\n\n\t\t\t\tthis.nodeSubtitle = nodeSubtitle.includes(CUSTOM_API_CALL_KEY) ? '' : nodeSubtitle;\n\t\t\t} catch (e) {\n\t\t\t\t// avoid breaking UI if expression error occurs\n\t\t\t}\n\t\t},\n\t\tdisableNode() {\n\t\t\tif (this.data !== null) {\n\t\t\t\tthis.nodeHelpers.disableNodes([this.data]);\n\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\tnew EnableNodeToggleCommand(\n\t\t\t\t\t\tthis.data.name,\n\t\t\t\t\t\t!this.data.disabled,\n\t\t\t\t\t\tthis.data.disabled === true,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\t\tnode_type: this.data.type,\n\t\t\t\t\tbutton_name: 'disable',\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\texecuteNode() {\n\t\t\tthis.$emit('runWorkflow', this.data.name, 'Node.executeNode');\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'execute',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\n\t\tdeleteNode() {\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'delete',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\n\t\ttoggleDisableNode(event: MouseEvent) {\n\t\t\t(event.currentTarget as HTMLButtonElement).blur();\n\t\t\tthis.$telemetry.track('User clicked node hover button', {\n\t\t\t\tnode_type: this.data.type,\n\t\t\t\tbutton_name: 'disable',\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t\tthis.$emit('toggleDisableNode', this.data);\n\t\t},\n\n\t\tonClick(event: MouseEvent) {\n\t\t\tvoid this.callDebounced(this.onClickDebounced, { debounceTime: 50, trailing: true }, event);\n\t\t},\n\n\t\tonClickDebounced(event: MouseEvent) {\n\t\t\tconst isDoubleClick = event.detail >= 2;\n\t\t\tif (isDoubleClick) {\n\t\t\t\tthis.setNodeActive();\n\t\t\t} else {\n\t\t\t\tthis.mouseLeftClick(event);\n\t\t\t}\n\t\t},\n\n\t\tsetNodeActive() {\n\t\t\tthis.ndvStore.activeNodeName = this.data ? this.data.name : '';\n\t\t\tthis.pinDataDiscoveryTooltipVisible = false;\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.deviceSupport.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event: MouseEvent, source: ContextMenuTarget['source']) {\n\t\t\tif (this.data) {\n\t\t\t\tthis.contextMenu.open(event, { source, node: this.data });\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.context-menu {\n\tposition: absolute;\n}\n\n.node-wrapper {\n\t--node-width: 100px;\n\t/*\n\t\tSet the node height to 100px as a base.\n\t\tIncrease height by 20px for each output beyond the 4th one.\n\t\tmax(0, var(--node-main-output-count, 1) - 4) ensures that we only start counting after the 4th output.\n\t*/\n\t--node-height: calc(100px + max(0, var(--node-main-output-count, 1) - 4) * 20px);\n\n\t--configurable-node-min-input-count: 4;\n\t--configurable-node-input-width: 65px;\n\n\tposition: absolute;\n\twidth: var(--node-width);\n\theight: var(--node-height);\n\n\t.node-description {\n\t\tposition: absolute;\n\t\ttop: var(--node-height);\n\t\tleft: calc(var(--node-width) / 2 * -1);\n\t\tline-height: 1.5;\n\t\ttext-align: center;\n\t\tcursor: default;\n\t\tpadding: 8px;\n\t\twidth: 100%;\n\t\tmin-width: calc(var(--node-width) * 2);\n\t\tpointer-events: none; // prevent container from being draggable\n\n\t\t.node-name > p {\n\t\t\t// must be paragraph tag to have two lines in safari\n\t\t\ttext-overflow: ellipsis;\n\t\t\tdisplay: -webkit-box;\n\t\t\t-webkit-box-orient: vertical;\n\t\t\t-webkit-line-clamp: 2;\n\t\t\toverflow: hidden;\n\t\t\toverflow-wrap: anywhere;\n\t\t\tfont-weight: var(--font-weight-bold);\n\t\t\tline-height: var(--font-line-height-compact);\n\t\t}\n\n\t\t.node-subtitle {\n\t\t\twhite-space: nowrap;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\tfont-weight: 400;\n\t\t\tcolor: $custom-font-light;\n\t\t\tfont-size: 0.8em;\n\t\t}\n\t}\n\n\t&.touch-active,\n\t&:hover,\n\t&.menu-open {\n\t\t.node-options {\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t.node-options {\n\t\t:deep(.button) {\n\t\t\t--button-font-color: var(--color-text-light);\n\t\t\t--button-border-radius: 0;\n\t\t}\n\t\tcursor: default;\n\t\tposition: absolute;\n\t\tbottom: 100%;\n\t\tz-index: 11;\n\t\tmin-width: 100%;\n\t\tdisplay: flex;\n\t\tleft: calc(-1 * var(--spacing-4xs));\n\t\tright: calc(-1 * var(--spacing-4xs));\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tpadding-bottom: var(--spacing-2xs);\n\t\tfont-size: var(--font-size-s);\n\t\topacity: 0;\n\t\ttransition: opacity 100ms ease-in;\n\n\t\t&-inner {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbackground-color: var(--color-canvas-background);\n\t\t\tborder-radius: var(--border-radius-base);\n\t\t}\n\t}\n\n\t.node-default {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\t\t&.disable-pointer-events {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.node-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\tborder-radius: var(--border-radius-large);\n\t\t\tbackground-color: var(--color-canvas-node-background);\n\t\t\t--color-background-node-icon-badge: var(--color-canvas-node-background);\n\t\t\t&.executing {\n\t\t\t\tbackground-color: $node-background-executing !important;\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-executing-info {\n\t\t\tdisplay: none;\n\t\t\tposition: absolute;\n\t\t\tleft: 0px;\n\t\t\ttop: 0px;\n\t\t\tz-index: 12;\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfont-size: 3.75em;\n\t\t\tline-height: 1.65em;\n\t\t\ttext-align: center;\n\t\t\tcolor: hsla(var(--color-primary-h), var(--color-primary-s), var(--color-primary-l), 0.7);\n\t\t}\n\n\t\t.node-icon {\n\t\t\tposition: absolute;\n\t\t\ttop: calc(50% - 20px);\n\t\t\tleft: calc(50% - 20px);\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tposition: absolute;\n\t\t\tbottom: 6px;\n\t\t\tright: 6px;\n\n\t\t\t&.shift-icon {\n\t\t\t\tright: 12px;\n\t\t\t}\n\n\t\t\t.data-count {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--color-success);\n\t\t\t}\n\n\t\t\t.node-issues {\n\t\t\t\tcolor: var(--color-danger);\n\t\t\t}\n\n\t\t\t.items-count {\n\t\t\t\tfont-size: var(--font-size-s);\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t}\n\n\t\t.node-pin-data-icon {\n\t\t\tcolor: var(--color-secondary);\n\t\t\tmargin-right: 2px;\n\n\t\t\tsvg {\n\t\t\t\theight: 0.85rem;\n\t\t\t}\n\t\t}\n\n\t\t.waiting {\n\t\t\tcolor: var(--color-secondary);\n\t\t}\n\t}\n\n\t&--config {\n\t\t--configurable-node-input-width: 55px;\n\t\t--node-width: 75px;\n\t\t--node-height: 75px;\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tscale: 0.75;\n\t\t\t}\n\n\t\t\t.node-box {\n\t\t\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\t\t\tborder-radius: 50px;\n\n\t\t\t\t&.executing {\n\t\t\t\t\tbackground-color: $node-background-executing-other !important;\n\t\t\t\t}\n\n\t\t\t\t.node-executing-info {\n\t\t\t\t\tfont-size: 2.85em;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t&.node-wrapper--connection-type-#{$node-type} {\n\t\t\t\t.node-default .node-box {\n\t\t\t\t\tbackground: var(--node-type-#{$node-type}-background);\n\t\t\t\t}\n\n\t\t\t\t.node-description {\n\t\t\t\t\t.node-subtitle {\n\t\t\t\t\t\tcolor: var(--node-type-#{$node-type}-color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.node-info-icon {\n\t\t\tbottom: 4px !important;\n\t\t\tright: 50% !important;\n\t\t\ttransform: translateX(50%) scale(0.75);\n\t\t}\n\n\t\t&.node-wrapper--configurable {\n\t\t\t--configurable-node-icon-offset: 20px;\n\n\t\t\t.node-info-icon {\n\t\t\t\tbottom: 1px !important;\n\t\t\t\tright: 1px !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--configurable {\n\t\t--node-width: var(\n\t\t\t--configurable-node-width,\n\t\t\tcalc(\n\t\t\t\tmax(var(--configurable-node-input-count, 5), var(--configurable-node-min-input-count)) *\n\t\t\t\t\tvar(--configurable-node-input-width)\n\t\t\t)\n\t\t);\n\t\t--configurable-node-icon-offset: 40px;\n\t\t--configurable-node-icon-size: 30px;\n\n\t\t.node-description {\n\t\t\ttop: calc(50%);\n\t\t\ttransform: translateY(-50%);\n\t\t\tleft: calc(\n\t\t\t\tvar(--configurable-node-icon-offset) + var(--configurable-node-icon-size) + var(--spacing-s)\n\t\t\t);\n\t\t\ttext-align: left;\n\t\t\toverflow: auto;\n\t\t\twhite-space: normal;\n\t\t\tmin-width: unset;\n\t\t\tmax-width: calc(\n\t\t\t\tvar(--node-width) - var(--configurable-node-icon-offset) - var(\n\t\t\t\t\t\t--configurable-node-icon-size\n\t\t\t\t\t) - 2 * var(--spacing-s)\n\t\t\t);\n\t\t\t.node-name > p {\n\t\t\t\tcolor: var(--color-configurable-node-name);\n\t\t\t}\n\t\t}\n\n\t\t.node-default {\n\t\t\t.node-icon {\n\t\t\t\tleft: var(--configurable-node-icon-offset);\n\t\t\t}\n\n\t\t\t.node-executing-info {\n\t\t\t\tleft: -67px;\n\t\t\t}\n\t\t}\n\n\t\t&[data-node-type='@n8n/n8n-nodes-langchain.chatTrigger'] {\n\t\t\t--configurable-node-min-input-count: 1;\n\t\t\t--configurable-node-input-width: 176px;\n\t\t}\n\t}\n\n\t&--trigger .node-default .node-box {\n\t\tborder-radius: 32px 8px 8px 32px;\n\t}\n\n\t.trigger-icon {\n\t\tposition: absolute;\n\t\tright: 100%;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tmargin: auto;\n\t\tcolor: var(--color-primary);\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: fit-content;\n\t\t// Increase click radius of the bolt icon\n\t\tpadding: var(--spacing-2xs);\n\t}\n}\n\n.select-background {\n\t--node--selected--box-shadow-radius: 8px;\n\n\tdisplay: block;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\ttop: calc(var(--node--selected--box-shadow-radius) * -1) !important;\n\theight: calc(100% + 2 * var(--node--selected--box-shadow-radius));\n\twidth: calc(100% + 2 * var(--node--selected--box-shadow-radius)) !important;\n\n\t.node-wrapper--trigger & {\n\t\tborder-radius: 36px 8px 8px 36px;\n\t}\n\n\t.node-wrapper--config & {\n\t\t--node--selected--box-shadow-radius: 4px;\n\t\tborder-radius: 60px;\n\t}\n}\n\n.disabled-linethrough {\n\tborder: 1px solid var(--color-foreground-dark);\n\tposition: absolute;\n\ttop: 49px;\n\tleft: -3px;\n\twidth: 111px;\n\tpointer-events: none;\n\n\t&.success {\n\t\tborder-color: var(--color-success-light);\n\t}\n}\n</style>\n\n<style lang=\"scss\">\n.jtk-endpoint {\n\tz-index: 2;\n}\n\n.node-trigger-tooltip {\n\t&__wrapper {\n\t\ttop: -22px;\n\t\tleft: 50px;\n\t\tposition: relative;\n\n\t\t&--item {\n\t\t\tmax-width: 160px;\n\t\t\tposition: fixed;\n\t\t\tz-index: 0 !important;\n\t\t}\n\t}\n}\n.dot-output-endpoint:hover circle {\n\tfill: var(--color-primary);\n}\n/** connector */\n.jtk-connector {\n\tz-index: 3;\n}\n\n.jtk-floating-endpoint {\n\topacity: 0;\n}\n\n.jtk-connector path {\n\ttransition: stroke 0.1s ease-in-out;\n}\n\n.jtk-overlay {\n\tz-index: 3;\n}\n.jtk-connector {\n\tz-index: 4;\n}\n.node-input-endpoint-label,\n.node-output-endpoint-label,\n.connection-run-items-label {\n\tz-index: 5;\n}\n.jtk-connector.jtk-hover {\n\tz-index: 6;\n}\n\n.jtk-endpoint.plus-endpoint {\n\tz-index: 6;\n}\n.jtk-endpoint.dot-output-endpoint {\n\tz-index: 7;\n\toverflow: auto;\n}\n\n.disabled-linethrough {\n\tz-index: 8;\n}\n\n.jtk-drag-active.dot-output-endpoint,\n.jtk-drag-active.rect-input-endpoint {\n\tz-index: 9;\n}\n.rect-input-endpoint > * {\n\tpointer-events: none;\n}\n\n.connection-actions {\n\tz-index: 100;\n}\n\n.drop-add-node-label {\n\tz-index: 10;\n}\n</style>\n\n<style lang=\"scss\">\n:root {\n\t--endpoint-size-small: 14px;\n\t--endpoint-size-medium: 18px;\n\t--stalk-size: 40px;\n\t--stalk-medium-size: 60px;\n\t--stalk-large-size: 90px;\n\t--stalk-success-size: 87px;\n\t--stalk-success-size-without-label: 40px;\n\t--stalk-long-size: 127px;\n\t--plus-endpoint-box-size: 24px;\n\t--plus-endpoint-box-size-small: 17px;\n}\n\n.plus-svg-circle {\n\tz-index: 111;\n\tcircle {\n\t\tstroke: var(--color-foreground-xdark);\n\t\tstroke-width: 2px;\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\n\t&:hover {\n\t\tcircle {\n\t\t\tstroke: var(--color-primary);\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t}\n}\n.plus-stalk {\n\twidth: calc(var(--stalk-size) + 2px);\n\tborder: 1px solid var(--color-foreground-dark);\n\tmargin-left: calc(var(--stalk-size) / 2);\n\tz-index: 3;\n\t&.ep-success {\n\t\tborder-color: var(--color-success-light);\n\n\t\t&:after {\n\t\t\tcontent: attr(data-label);\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tbottom: 100%;\n\t\t\tmargin: auto;\n\t\t\tmargin-bottom: 2px;\n\t\t\ttext-align: center;\n\n\t\t\tline-height: 1.3em;\n\t\t\tfont-size: var(--font-size-s);\n\t\t\tfont-weight: var(--font-weight-regular);\n\t\t\tcolor: var(--color-success);\n\t\t}\n\t}\n}\n.connection-run-items-label {\n\t// Disable points events so that the label does not block the connection\n\t// mouse over event.\n\tpointer-events: none;\n\tspan {\n\t\tbackground-color: hsla(\n\t\t\tvar(--color-canvas-background-h),\n\t\t\tvar(--color-canvas-background-s),\n\t\t\tvar(--color-canvas-background-l),\n\t\t\t0.85\n\t\t);\n\t\tborder-radius: var(--border-radius-base);\n\t\tline-height: 1.3em;\n\t\tpadding: 0px 3px;\n\t\twhite-space: nowrap;\n\t\tfont-size: var(--font-size-s);\n\t\tfont-weight: var(--font-weight-regular);\n\t\tmargin-top: -15px;\n\n\t\t&.floating {\n\t\t\tposition: absolute;\n\t\t\ttop: -6px;\n\t\t\ttransform: translateX(-50%);\n\t\t}\n\t}\n}\n\n.connection-input-name-label {\n\tposition: relative;\n\n\tspan {\n\t\tposition: absolute;\n\t\ttop: -10px;\n\t\tleft: -60px;\n\t}\n}\n\n.plus-endpoint {\n\tcursor: pointer;\n\tz-index: 10;\n\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size) / 2) - 1px);\n\tg {\n\t\tfill: var(--color-background-xlight);\n\t\tpointer-events: none;\n\t}\n\n\t&:hover {\n\t\tpath {\n\t\t\tfill: var(--color-primary);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-primary);\n\t\t}\n\t}\n\tpath {\n\t\tfill: var(--color-foreground-xdark);\n\t}\n\trect {\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.error {\n\t\tpath {\n\t\t\tfill: var(--color-node-error-output-text-color);\n\t\t}\n\t\trect {\n\t\t\tstroke: var(--color-node-error-output-text-color);\n\t\t}\n\t}\n\n\t&.small {\n\t\tmargin-left: calc((var(--stalk-size) + var(--plus-endpoint-box-size-small) / 2));\n\t\tg {\n\t\t\ttransform: scale(0.75);\n\t\t\ttransform-origin: center;\n\t\t}\n\t\trect {\n\t\t\tstroke-width: 2.5;\n\t\t}\n\t}\n\t&:hover .plus-container {\n\t\tcolor: var(--color-primary);\n\t\tborder: 2px solid var(--color-primary);\n\t}\n\t&:hover .drop-hover-message {\n\t\tdisplay: block;\n\t}\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n}\n\n.diamond-output-endpoint {\n\t--diamond-output-endpoint--transition-duration: 0.15s;\n\n\ttransition: transform var(--diamond-output-endpoint--transition-duration) ease;\n\ttransform: rotate(45deg);\n\tz-index: 10;\n}\n\n.add-input-endpoint {\n\t--add-input-endpoint--transition-duration: 0.15s;\n\n\t&:not(.jtk-endpoint-connected) {\n\t\tcursor: pointer;\n\t}\n\n\t&.add-input-endpoint-multiple {\n\t\tz-index: 100;\n\t\tcursor: pointer;\n\t}\n\n\t&.jtk-endpoint-connected {\n\t\tz-index: 10;\n\t}\n\n\t&.add-input-endpoint-error {\n\t\t--endpoint-svg-color: var(--color-danger);\n\t}\n\n\t.add-input-endpoint-default {\n\t\ttransition: transform var(--add-input-endpoint--transition-duration) ease;\n\t}\n\n\t.add-input-endpoint-diamond {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-line {\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xlight);\n\t\tstroke: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-plus-icon {\n\t\tstroke: none;\n\t\ttransition: fill var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--svg-color, var(--color-primary));\n\t}\n\n\t.add-input-endpoint-connected-rectangle {\n\t\ttransition:\n\t\t\tfill var(--add-input-endpoint--transition-duration) ease,\n\t\t\tstroke var(--add-input-endpoint--transition-duration) ease;\n\t\tfill: var(--color-foreground-xdark);\n\t\tstroke: var(--color-foreground-xdark);\n\t}\n\n\t&.rect-input-endpoint-hover {\n\t\t.add-input-endpoint-plus-rectangle {\n\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t}\n\n\t\t.add-input-endpoint-plus-icon {\n\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t}\n\t}\n\n\t&.jtk-endpoint-connected:not(.add-input-endpoint-multiple) {\n\t\t.add-input-endpoint-unconnected {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.rect-input-endpoint-hover {\n\t\t\t.add-input-endpoint-connected-rectangle {\n\t\t\t\tfill: var(--svg-color, var(--color-primary));\n\t\t\t\tstroke: var(--svg-color, var(--color-primary));\n\t\t\t}\n\t\t}\n\t}\n}\n\n.node-input-endpoint-label,\n.node-output-endpoint-label {\n\t--node-endpoint-label--transition-duration: 0.15s;\n\n\tbackground-color: hsla(\n\t\tvar(--color-canvas-background-h),\n\t\tvar(--color-canvas-background-s),\n\t\tvar(--color-canvas-background-l),\n\t\t0.85\n\t);\n\tborder-radius: var(--border-radius-large);\n\tfont-size: var(--font-size-3xs);\n\tpadding: var(--spacing-5xs) var(--spacing-4xs);\n\twhite-space: nowrap;\n\ttransition: color var(--node-endpoint-label--transition-duration) ease;\n\n\t@each $node-type in $supplemental-node-types {\n\t\t&.node-connection-type-#{$node-type} {\n\t\t\tcolor: var(--node-type-supplemental-label-color);\n\t\t}\n\t}\n}\n\n.node-output-endpoint-label.node-connection-category-error {\n\tcolor: var(--color-node-error-output-text-color);\n}\n\n.node-output-endpoint-label {\n\tmargin-left: calc(var(--endpoint-size-small) + var(--spacing-2xs));\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-l) * -1);\n\t\tmargin-left: 0;\n\t}\n\n\t// Some nodes allow for dynamic connection labels\n\t// so we need to make sure the label does not overflow\n\t&.node-connection-type-main[data-endpoint-label-length] {\n\t\tmax-width: calc(var(--stalk-size) - var(--endpoint-size-small) - var(--spacing-4xs));\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\ttransform: translateY(-50%) !important;\n\t\tmargin-left: var(--endpoint-size-small);\n\t}\n}\n\n.node-input-endpoint-label {\n\ttext-align: right;\n\tmargin-left: -25px;\n\n\t&--moved {\n\t\tmargin-left: -40px;\n\t}\n\n\t&--data {\n\t\ttext-align: center;\n\t\tmargin-top: calc(var(--spacing-5xs) * -1);\n\t\tmargin-left: 0;\n\t}\n}\n\n.hover-message.jtk-overlay {\n\t--hover-message-width: 110px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-2xs);\n\tline-height: var(--font-line-height-regular);\n\tcolor: var(--color-text-light);\n\twidth: var(--hover-message-width);\n\tmargin-left: calc(\n\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size) +\n\t\t\tvar(--spacing-2xs)\n\t);\n\topacity: 0;\n\tpointer-events: none;\n\t&.small {\n\t\tmargin-left: calc(\n\t\t\t(var(--hover-message-width) / 2) + var(--stalk-size) + var(--plus-endpoint-box-size-small) +\n\t\t\t\tvar(--spacing-2xs)\n\t\t);\n\t}\n\t&.visible {\n\t\tpointer-events: all;\n\t\topacity: 1;\n\t}\n}\n\n.long-stalk {\n\t--stalk-size: var(--stalk-long-size);\n}\n.ep-success {\n\t--stalk-size: var(--stalk-success-size);\n}\n.ep-success--without-label {\n\t--stalk-size: var(--stalk-success-size-without-label);\n}\n\n[data-endpoint-label-length='medium'] {\n\t--stalk-size: var(--stalk-medium-size);\n}\n\n[data-endpoint-label-length='large'] {\n\t--stalk-size: var(--stalk-large-size);\n}\n</style>\n","<template>\n\t<div\n\t\t:id=\"nodeId\"\n\t\t:ref=\"data.name\"\n\t\tclass=\"sticky-wrapper\"\n\t\t:style=\"stickyPosition\"\n\t\t:data-name=\"data.name\"\n\t\tdata-test-id=\"sticky\"\n\t>\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'sticky-default': true,\n\t\t\t\t'touch-active': isTouchActive,\n\t\t\t\t'is-touch-device': deviceSupport.isTouchDevice,\n\t\t\t\t'is-read-only': isReadOnly,\n\t\t\t}\"\n\t\t\t:style=\"stickySize\"\n\t\t>\n\t\t\t<div v-show=\"isSelected\" class=\"select-sticky-background\" />\n\t\t\t<div\n\t\t\t\tv-touch:start=\"touchStart\"\n\t\t\t\tv-touch:end=\"touchEnd\"\n\t\t\t\tclass=\"sticky-box\"\n\t\t\t\t@click.left=\"mouseLeftClick\"\n\t\t\t\t@contextmenu=\"onContextMenu\"\n\t\t\t>\n\t\t\t\t<n8n-sticky\n\t\t\t\t\t:id=\"node.id\"\n\t\t\t\t\t:model-value=\"node.parameters.content\"\n\t\t\t\t\t:height=\"node.parameters.height\"\n\t\t\t\t\t:width=\"node.parameters.width\"\n\t\t\t\t\t:scale=\"nodeViewScale\"\n\t\t\t\t\t:background-color=\"node.parameters.color\"\n\t\t\t\t\t:read-only=\"isReadOnly\"\n\t\t\t\t\t:default-text=\"defaultText\"\n\t\t\t\t\t:edit-mode=\"isActive && !isReadOnly\"\n\t\t\t\t\t:grid-size=\"gridSize\"\n\t\t\t\t\t@edit=\"onEdit\"\n\t\t\t\t\t@resizestart=\"onResizeStart\"\n\t\t\t\t\t@resize=\"onResize\"\n\t\t\t\t\t@resizeend=\"onResizeEnd\"\n\t\t\t\t\t@markdown-click=\"onMarkdownClick\"\n\t\t\t\t\t@update:model-value=\"onInputChange\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-show=\"showActions\"\n\t\t\t\t:class=\"{ 'sticky-options': true, 'no-select-on-click': true, 'force-show': forceActions }\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tv-touch:tap=\"deleteNode\"\n\t\t\t\t\tclass=\"option\"\n\t\t\t\t\tdata-test-id=\"delete-sticky\"\n\t\t\t\t\t:title=\"$locale.baseText('node.delete')\"\n\t\t\t\t>\n\t\t\t\t\t<font-awesome-icon icon=\"trash\" />\n\t\t\t\t</div>\n\t\t\t\t<n8n-popover\n\t\t\t\t\teffect=\"dark\"\n\t\t\t\t\t:popper-style=\"{ width: '208px' }\"\n\t\t\t\t\ttrigger=\"click\"\n\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t@show=\"onShowPopover\"\n\t\t\t\t\t@hide=\"onHidePopover\"\n\t\t\t\t>\n\t\t\t\t\t<template #reference>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref=\"colorPopoverTrigger\"\n\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\tdata-test-id=\"change-sticky-color\"\n\t\t\t\t\t\t\t:title=\"$locale.baseText('node.changeColor')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<font-awesome-icon icon=\"palette\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</template>\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tv-for=\"(_, index) in Array.from({ length: 7 })\"\n\t\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t\t\tclass=\"color\"\n\t\t\t\t\t\t\tdata-test-id=\"color\"\n\t\t\t\t\t\t\t:class=\"`sticky-color-${index + 1}`\"\n\t\t\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t\t\t'border-width': '1px',\n\t\t\t\t\t\t\t\t'border-style': 'solid',\n\t\t\t\t\t\t\t\t'border-color': 'var(--color-foreground-xdark)',\n\t\t\t\t\t\t\t\t'background-color': `var(--color-sticky-background-${index + 1})`,\n\t\t\t\t\t\t\t\t'box-shadow':\n\t\t\t\t\t\t\t\t\t(index === 0 && node?.parameters.color === '') ||\n\t\t\t\t\t\t\t\t\tindex + 1 === node?.parameters.color\n\t\t\t\t\t\t\t\t\t\t? `0 0 0 1px var(--color-sticky-background-${index + 1})`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t@click=\"changeColor(index + 1)\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t</div>\n\t\t\t\t</n8n-popover>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue';\nimport { mapStores } from 'pinia';\n\nimport { nodeBase } from '@/mixins/nodeBase';\nimport { isNumber, isString } from '@/utils/typeGuards';\nimport type {\n\tINodeUi,\n\tINodeUpdatePropertiesInformation,\n\tIUpdateInformation,\n\tXYPosition,\n} from '@/Interface';\n\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { QUICKSTART_NOTE_NAME } from '@/constants';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { useContextMenu } from '@/composables/useContextMenu';\nimport { useDeviceSupport } from 'n8n-design-system';\n\nexport default defineComponent({\n\tname: 'Sticky',\n\tmixins: [nodeBase],\n\tprops: {\n\t\tnodeViewScale: {\n\t\t\ttype: Number,\n\t\t},\n\t\tgridSize: {\n\t\t\ttype: Number,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst colorPopoverTrigger = ref<HTMLDivElement>();\n\t\tconst forceActions = ref(false);\n\t\tconst setForceActions = (value: boolean) => {\n\t\t\tforceActions.value = value;\n\t\t};\n\t\tconst contextMenu = useContextMenu((action) => {\n\t\t\tif (action === 'change_color') {\n\t\t\t\tsetForceActions(true);\n\t\t\t\tcolorPopoverTrigger.value?.click();\n\t\t\t}\n\t\t});\n\n\t\treturn { deviceSupport, colorPopoverTrigger, contextMenu, forceActions, setForceActions };\n\t},\n\tcomputed: {\n\t\t...mapStores(useNodeTypesStore, useNDVStore, useUIStore, useWorkflowsStore),\n\t\tdefaultText(): string {\n\t\t\tif (!this.nodeType) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\tconst properties = this.nodeType.properties;\n\t\t\tconst content = properties.find((property) => property.name === 'content');\n\n\t\t\treturn content && isString(content.default) ? content.default : '';\n\t\t},\n\t\tisSelected(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.uiStore.getSelectedNodes.find((node: INodeUi) => node.name === this.data.name) !==\n\t\t\t\tundefined\n\t\t\t);\n\t\t},\n\t\tnodeType(): INodeTypeDescription | null {\n\t\t\treturn this.data && this.nodeTypesStore.getNodeType(this.data.type, this.data.typeVersion);\n\t\t},\n\t\tnode(): INodeUi | null {\n\t\t\t// same as this.data but reactive..\n\t\t\treturn this.workflowsStore.getNodeByName(this.name);\n\t\t},\n\t\tposition(): XYPosition {\n\t\t\tif (this.node) {\n\t\t\t\treturn this.node.position;\n\t\t\t} else {\n\t\t\t\treturn [0, 0];\n\t\t\t}\n\t\t},\n\t\theight(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.height) ? this.node.parameters.height : 0;\n\t\t},\n\t\twidth(): number {\n\t\t\treturn this.node && isNumber(this.node.parameters.width) ? this.node.parameters.width : 0;\n\t\t},\n\t\tstickySize(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\theight: this.height + 'px',\n\t\t\t\twidth: this.width + 'px',\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tstickyPosition(): object {\n\t\t\tconst returnStyles: {\n\t\t\t\t[key: string]: string | number;\n\t\t\t} = {\n\t\t\t\tleft: this.position[0] + 'px',\n\t\t\t\ttop: this.position[1] + 'px',\n\t\t\t\tzIndex: this.isActive ? 9999999 : -1 * Math.floor((this.height * this.width) / 1000),\n\t\t\t};\n\n\t\t\treturn returnStyles;\n\t\t},\n\t\tshowActions(): boolean {\n\t\t\treturn (\n\t\t\t\t!(this.hideActions || this.isReadOnly || this.workflowRunning || this.isResizing) ||\n\t\t\t\tthis.forceActions\n\t\t\t);\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisResizing: false,\n\t\t\tisTouchActive: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonShowPopover() {\n\t\t\tthis.setForceActions(true);\n\t\t},\n\t\tonHidePopover() {\n\t\t\tthis.setForceActions(false);\n\t\t},\n\t\tasync deleteNode() {\n\t\t\t// Wait a tick else vue causes problems because the data is gone\n\t\t\tawait this.$nextTick();\n\t\t\tthis.$emit('removeNode', this.data.name);\n\t\t},\n\t\tchangeColor(index: number) {\n\t\t\tthis.workflowsStore.updateNodeProperties({\n\t\t\t\tname: this.name,\n\t\t\t\tproperties: { parameters: { ...this.node.parameters, color: index } },\n\t\t\t});\n\t\t},\n\t\tonEdit(edit: boolean) {\n\t\t\tif (edit && !this.isActive && this.node) {\n\t\t\t\tthis.ndvStore.activeNodeName = this.node.name;\n\t\t\t} else if (this.isActive && !edit) {\n\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t}\n\t\t},\n\t\tonMarkdownClick(link: HTMLAnchorElement, event: Event) {\n\t\t\tif (link) {\n\t\t\t\tconst isOnboardingNote = this.name === QUICKSTART_NOTE_NAME;\n\t\t\t\tconst isWelcomeVideo = link.querySelector('img[alt=\"n8n quickstart video\"');\n\t\t\t\tconst type =\n\t\t\t\t\tisOnboardingNote && isWelcomeVideo\n\t\t\t\t\t\t? 'welcome_video'\n\t\t\t\t\t\t: isOnboardingNote && link.getAttribute('href') === '/templates'\n\t\t\t\t\t\t\t? 'templates'\n\t\t\t\t\t\t\t: 'other';\n\n\t\t\t\tthis.$telemetry.track('User clicked note link', { type });\n\t\t\t}\n\t\t},\n\t\tonInputChange(content: string) {\n\t\t\tthis.node.parameters.content = content;\n\t\t\tthis.setParameters({ content });\n\t\t},\n\t\tonResizeStart() {\n\t\t\tthis.isResizing = true;\n\t\t\tif (!this.isSelected && this.node) {\n\t\t\t\tthis.$emit('nodeSelected', this.node.name, false, true);\n\t\t\t}\n\t\t},\n\t\tonResize({ height, width, dX, dY }: { width: number; height: number; dX: number; dY: number }) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dX !== 0 || dY !== 0) {\n\t\t\t\tthis.setPosition([this.node.position[0] + (dX || 0), this.node.position[1] + (dY || 0)]);\n\t\t\t}\n\n\t\t\tthis.setParameters({ height, width });\n\t\t},\n\t\tonResizeEnd() {\n\t\t\tthis.isResizing = false;\n\t\t},\n\t\tsetParameters(params: { content?: string; height?: number; width?: number; color?: string }) {\n\t\t\tif (this.node) {\n\t\t\t\tconst nodeParameters = {\n\t\t\t\t\tcontent: isString(params.content) ? params.content : this.node.parameters.content,\n\t\t\t\t\theight: isNumber(params.height) ? params.height : this.node.parameters.height,\n\t\t\t\t\twidth: isNumber(params.width) ? params.width : this.node.parameters.width,\n\t\t\t\t\tcolor: isString(params.color) ? params.color : this.node.parameters.color,\n\t\t\t\t};\n\n\t\t\t\tconst updateInformation: IUpdateInformation = {\n\t\t\t\t\tkey: this.node.id,\n\t\t\t\t\tname: this.node.name,\n\t\t\t\t\tvalue: nodeParameters,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.setNodeParameters(updateInformation);\n\t\t\t}\n\t\t},\n\t\tsetPosition(position: XYPosition) {\n\t\t\tif (!this.node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\tname: this.node.name,\n\t\t\t\tproperties: {\n\t\t\t\t\tposition,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t},\n\t\ttouchStart() {\n\t\t\tif (this.deviceSupport.isTouchDevice && !this.isMacOs && !this.isTouchActive) {\n\t\t\t\tthis.isTouchActive = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isTouchActive = false;\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t},\n\t\tonContextMenu(e: MouseEvent): void {\n\t\t\tif (this.node && !this.isActive) {\n\t\t\t\tthis.contextMenu.open(e, { source: 'node-right-click', node: this.node });\n\t\t\t} else {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t},\n\t},\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.sticky-wrapper {\n\tposition: absolute;\n\n\t.sticky-default {\n\t\t.sticky-box {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t}\n\n\t\t&.touch-active,\n\t\t&:hover {\n\t\t\t.sticky-options {\n\t\t\t\tdisplay: flex;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t&.is-read-only {\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.sticky-options {\n\t\t\tdisplay: none;\n\t\t\tjustify-content: flex-start;\n\t\t\tposition: absolute;\n\t\t\ttop: -25px;\n\t\t\tleft: -8px;\n\t\t\theight: 26px;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: left;\n\t\t\tz-index: 10;\n\t\t\tcolor: #aaa;\n\t\t\ttext-align: center;\n\n\t\t\t.option {\n\t\t\t\twidth: 28px;\n\t\t\t\tdisplay: inline-block;\n\n\t\t\t\t&.touch {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\n\t\t\t\t&:hover {\n\t\t\t\t\tcolor: $color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.force-show {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t&.is-touch-device .sticky-options {\n\t\t\tleft: -25px;\n\t\t\twidth: 150px;\n\n\t\t\t.option.touch {\n\t\t\t\tdisplay: initial;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.select-sticky-background {\n\tdisplay: block;\n\tposition: absolute;\n\tbackground-color: var(--color-canvas-selected);\n\tborder-radius: var(--border-radius-xlarge);\n\toverflow: hidden;\n\theight: calc(100% + 16px);\n\twidth: calc(100% + 16px);\n\tleft: -8px;\n\ttop: -8px;\n\tz-index: 0;\n}\n\n.content {\n\tdisplay: flex;\n\tflex-direction: row;\n\twidth: fit-content;\n\tgap: var(--spacing-2xs);\n}\n\n.color {\n\twidth: 20px;\n\theight: 20px;\n\tborder-radius: 50%;\n\tborder-color: var(--color-primary-shade-1);\n\n\t&:hover {\n\t\tcursor: pointer;\n\t}\n}\n</style>\n","/*\n\tConstants and utility functions used for searching for node types in node creator component\n*/\n\n// based on https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.js\n\nconst SEQUENTIAL_BONUS = 60; // bonus for adjacent matches\nconst SEPARATOR_BONUS = 30; // bonus if match occurs after a separator\nconst CAMEL_BONUS = 30; // bonus if match is uppercase and prev is lower\nconst FIRST_LETTER_BONUS = 15; // bonus if the first letter is matched\n\nconst LEADING_LETTER_PENALTY = -20; // penalty applied for every letter in str before the first match\nconst MAX_LEADING_LETTER_PENALTY = -200; // maximum penalty for leading letters\nconst UNMATCHED_LETTER_PENALTY = -5;\n\n/**\n * Returns true if each character in pattern is found sequentially within target\n * @param {*} pattern string\n * @param {*} target string\n */\nfunction fuzzyMatchSimple(pattern: string, target: string): boolean {\n\tlet patternIdx = 0;\n\tlet strIdx = 0;\n\n\twhile (patternIdx < pattern.length && strIdx < target.length) {\n\t\tconst patternChar = pattern.charAt(patternIdx).toLowerCase();\n\t\tconst targetChar = target.charAt(strIdx).toLowerCase();\n\t\tif (patternChar === targetChar) {\n\t\t\tpatternIdx++;\n\t\t}\n\t\t++strIdx;\n\t}\n\n\treturn pattern.length !== 0 && target.length !== 0 && patternIdx === pattern.length;\n}\n\n/**\n * Does a fuzzy search to find pattern inside a string.\n * @param {*} pattern string pattern to search for\n * @param {*} target string string which is being searched\n * @returns [boolean, number] a boolean which tells if pattern was\n * found or not and a search score\n */\nfunction fuzzyMatch(pattern: string, target: string): { matched: boolean; outScore: number } {\n\tconst recursionCount = 0;\n\tconst recursionLimit = 5;\n\tconst matches: number[] = [];\n\tconst maxMatches = 256;\n\n\treturn fuzzyMatchRecursive(\n\t\tpattern,\n\t\ttarget,\n\t\t0 /* patternCurIndex */,\n\t\t0 /* strCurrIndex */,\n\t\tnull /* srcMatces */,\n\t\tmatches,\n\t\tmaxMatches,\n\t\t0 /* nextMatch */,\n\t\trecursionCount,\n\t\trecursionLimit,\n\t);\n}\n\nfunction fuzzyMatchRecursive(\n\tpattern: string,\n\ttarget: string,\n\tpatternCurIndex: number,\n\ttargetCurrIndex: number,\n\ttargetMatches: null | number[],\n\tmatches: number[],\n\tmaxMatches: number,\n\tnextMatch: number,\n\trecursionCount: number,\n\trecursionLimit: number,\n): { matched: boolean; outScore: number } {\n\tlet outScore = 0;\n\n\t// Return if recursion limit is reached.\n\tif (++recursionCount >= recursionLimit) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Return if we reached ends of strings.\n\tif (patternCurIndex === pattern.length || targetCurrIndex === target.length) {\n\t\treturn { matched: false, outScore };\n\t}\n\n\t// Recursion params\n\tlet recursiveMatch = false;\n\tlet bestRecursiveMatches: number[] = [];\n\tlet bestRecursiveScore = 0;\n\n\t// Loop through pattern and str looking for a match.\n\tlet firstMatch = true;\n\twhile (patternCurIndex < pattern.length && targetCurrIndex < target.length) {\n\t\t// Match found.\n\t\tif (pattern[patternCurIndex].toLowerCase() === target[targetCurrIndex].toLowerCase()) {\n\t\t\tif (nextMatch >= maxMatches) {\n\t\t\t\treturn { matched: false, outScore };\n\t\t\t}\n\n\t\t\tif (firstMatch && targetMatches) {\n\t\t\t\tmatches = [...targetMatches];\n\t\t\t\tfirstMatch = false;\n\t\t\t}\n\n\t\t\tconst recursiveMatches: number[] = [];\n\t\t\tconst recursiveResult = fuzzyMatchRecursive(\n\t\t\t\tpattern,\n\t\t\t\ttarget,\n\t\t\t\tpatternCurIndex,\n\t\t\t\ttargetCurrIndex + 1,\n\t\t\t\tmatches,\n\t\t\t\trecursiveMatches,\n\t\t\t\tmaxMatches,\n\t\t\t\tnextMatch,\n\t\t\t\trecursionCount,\n\t\t\t\trecursionLimit,\n\t\t\t);\n\n\t\t\tconst recursiveScore = recursiveResult.outScore;\n\t\t\tif (recursiveResult.matched) {\n\t\t\t\t// Pick best recursive score.\n\t\t\t\tif (!recursiveMatch || recursiveScore > bestRecursiveScore) {\n\t\t\t\t\tbestRecursiveMatches = [...recursiveMatches];\n\t\t\t\t\tbestRecursiveScore = recursiveScore;\n\t\t\t\t}\n\t\t\t\trecursiveMatch = true;\n\t\t\t}\n\n\t\t\tmatches[nextMatch++] = targetCurrIndex;\n\t\t\t++patternCurIndex;\n\t\t}\n\t\t++targetCurrIndex;\n\t}\n\n\tconst matched = patternCurIndex === pattern.length;\n\n\tif (matched) {\n\t\toutScore = 100;\n\n\t\t// Apply leading letter penalty\n\t\tlet penalty = LEADING_LETTER_PENALTY * matches[0];\n\t\tpenalty = penalty < MAX_LEADING_LETTER_PENALTY ? MAX_LEADING_LETTER_PENALTY : penalty;\n\t\toutScore += penalty;\n\n\t\t//Apply unmatched penalty\n\t\tconst unmatched = target.length - nextMatch;\n\t\toutScore += UNMATCHED_LETTER_PENALTY * unmatched;\n\n\t\t// Apply ordering bonuses\n\t\tfor (let i = 0; i < nextMatch; i++) {\n\t\t\tconst currIdx = matches[i];\n\n\t\t\tif (i > 0) {\n\t\t\t\tconst prevIdx = matches[i - 1];\n\t\t\t\tif (currIdx === prevIdx + 1) {\n\t\t\t\t\toutScore += SEQUENTIAL_BONUS;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for bonuses based on neighbor character value.\n\t\t\tif (currIdx > 0) {\n\t\t\t\t// Camel case\n\t\t\t\tconst neighbor = target[currIdx - 1];\n\t\t\t\tconst curr = target[currIdx];\n\t\t\t\tif (neighbor !== neighbor.toUpperCase() && curr !== curr.toLowerCase()) {\n\t\t\t\t\toutScore += CAMEL_BONUS;\n\t\t\t\t}\n\t\t\t\tconst isNeighbourSeparator = neighbor === '_' || neighbor === ' ';\n\t\t\t\tif (isNeighbourSeparator) {\n\t\t\t\t\toutScore += SEPARATOR_BONUS;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// First letter\n\t\t\t\toutScore += FIRST_LETTER_BONUS;\n\t\t\t}\n\t\t}\n\n\t\t// Return best result\n\t\tif (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {\n\t\t\t// Recursive score is better than \"this\"\n\t\t\tmatches = [...bestRecursiveMatches];\n\t\t\toutScore = bestRecursiveScore;\n\t\t\treturn { matched: true, outScore };\n\t\t} else if (matched) {\n\t\t\t// \"this\" score is better than recursive\n\t\t\treturn { matched: true, outScore };\n\t\t} else {\n\t\t\treturn { matched: false, outScore };\n\t\t}\n\t}\n\treturn { matched: false, outScore };\n}\n\n// prop = 'key'\n// prop = 'key1.key2'\n// prop = ['key1', 'key2']\nfunction getValue<T extends object>(obj: T, prop: string): unknown {\n\tif (obj.hasOwnProperty(prop)) {\n\t\treturn obj[prop as keyof T];\n\t}\n\n\tconst segments = prop.split('.');\n\n\tlet result = obj;\n\tlet i = 0;\n\twhile (result && i < segments.length) {\n\t\tconst key = segments[i] as keyof T;\n\t\tresult = result[key] as T;\n\t\ti++;\n\t}\n\treturn result;\n}\n\nexport function sublimeSearch<T extends object>(\n\tfilter: string,\n\tdata: Readonly<T[]>,\n\tkeys: Array<{ key: string; weight: number }>,\n): Array<{ score: number; item: T }> {\n\tconst results = data.reduce((accu: Array<{ score: number; item: T }>, item: T) => {\n\t\tlet values: Array<{ value: string; weight: number }> = [];\n\t\tkeys.forEach(({ key, weight }) => {\n\t\t\tconst value = getValue(item, key);\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tvalues = values.concat(value.map((v) => ({ value: v, weight })));\n\t\t\t} else if (typeof value === 'string') {\n\t\t\t\tvalues.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tweight,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// for each item, check every key and get maximum score\n\t\tconst itemMatch = values.reduce(\n\t\t\t(\n\t\t\t\taccu: null | { matched: boolean; outScore: number },\n\t\t\t\t{ value, weight }: { value: string; weight: number },\n\t\t\t) => {\n\t\t\t\tif (!fuzzyMatchSimple(filter, value)) {\n\t\t\t\t\treturn accu;\n\t\t\t\t}\n\n\t\t\t\tconst match = fuzzyMatch(filter, value);\n\t\t\t\tmatch.outScore *= weight;\n\n\t\t\t\tconst { matched, outScore } = match;\n\t\t\t\tif (!accu && matched) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tif (matched && accu && outScore > accu.outScore) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\treturn accu;\n\t\t\t},\n\t\t\tnull,\n\t\t);\n\n\t\tif (itemMatch) {\n\t\t\taccu.push({\n\t\t\t\tscore: itemMatch.outScore,\n\t\t\t\titem,\n\t\t\t});\n\t\t}\n\n\t\treturn accu;\n\t}, []);\n\n\tresults.sort((a, b) => {\n\t\treturn b.score - a.score;\n\t});\n\n\treturn results;\n}\n","import type {\n\tNodeCreateElement,\n\tActionCreateElement,\n\tSubcategorizedNodeTypes,\n\tSimplifiedNodeType,\n\tINodeCreateElement,\n\tSectionCreateElement,\n} from '@/Interface';\nimport { AI_SUBCATEGORY, CORE_NODES_CATEGORY, DEFAULT_SUBCATEGORY } from '@/constants';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { sublimeSearch } from '@/utils/sortUtils';\nimport { i18n } from '@/plugins/i18n';\nimport type { NodeViewItemSection } from './viewsData';\n\nexport function transformNodeType(\n\tnode: SimplifiedNodeType,\n\tsubcategory?: string,\n\ttype: 'node' | 'action' = 'node',\n): NodeCreateElement | ActionCreateElement {\n\tconst createElement = {\n\t\tuuid: uuidv4(),\n\t\tkey: node.name,\n\t\tsubcategory:\n\t\t\tsubcategory ?? node.codex?.subcategories?.[CORE_NODES_CATEGORY]?.[0] ?? DEFAULT_SUBCATEGORY,\n\t\tproperties: {\n\t\t\t...node,\n\t\t},\n\t\ttype,\n\t};\n\n\treturn type === 'action'\n\t\t? (createElement as ActionCreateElement)\n\t\t: (createElement as NodeCreateElement);\n}\n\nexport function subcategorizeItems(items: SimplifiedNodeType[]) {\n\tconst WHITE_LISTED_SUBCATEGORIES = [CORE_NODES_CATEGORY, AI_SUBCATEGORY];\n\treturn items.reduce((acc: SubcategorizedNodeTypes, item) => {\n\t\t// Only some subcategories are allowed\n\t\tlet subcategories: string[] = [DEFAULT_SUBCATEGORY];\n\n\t\tWHITE_LISTED_SUBCATEGORIES.forEach((category) => {\n\t\t\tif (item.codex?.categories?.includes(category)) {\n\t\t\t\tsubcategories = item.codex?.subcategories?.[category] ?? [];\n\t\t\t}\n\t\t});\n\n\t\tsubcategories.forEach((subcategory: string) => {\n\t\t\tif (!acc[subcategory]) {\n\t\t\t\tacc[subcategory] = [];\n\t\t\t}\n\t\t\tacc[subcategory].push(transformNodeType(item, subcategory));\n\t\t});\n\n\t\treturn acc;\n\t}, {});\n}\n\nexport function sortNodeCreateElements(nodes: INodeCreateElement[]) {\n\treturn nodes.sort((a, b) => {\n\t\tif (a.type !== 'node' || b.type !== 'node') return 0;\n\t\tconst displayNameA = a.properties?.displayName?.toLowerCase() || a.key;\n\t\tconst displayNameB = b.properties?.displayName?.toLowerCase() || b.key;\n\n\t\treturn displayNameA.localeCompare(displayNameB, undefined, { sensitivity: 'base' });\n\t});\n}\n\nexport function searchNodes(searchFilter: string, items: INodeCreateElement[]) {\n\t// In order to support the old search we need to remove the 'trigger' part\n\tconst trimmedFilter = searchFilter.toLowerCase().replace('trigger', '').trimEnd();\n\tconst result = (\n\t\tsublimeSearch<INodeCreateElement>(trimmedFilter, items, [\n\t\t\t{ key: 'properties.displayName', weight: 1.3 },\n\t\t\t{ key: 'properties.codex.alias', weight: 1 },\n\t\t]) || []\n\t).map(({ item }) => item);\n\n\treturn result;\n}\n\nexport function flattenCreateElements(items: INodeCreateElement[]): INodeCreateElement[] {\n\treturn items.map((item) => (item.type === 'section' ? item.children : item)).flat();\n}\n\nexport function groupItemsInSections(\n\titems: INodeCreateElement[],\n\tsections: NodeViewItemSection[],\n): INodeCreateElement[] {\n\tconst itemsBySection = items.reduce((acc: Record<string, INodeCreateElement[]>, item) => {\n\t\tconst section = sections.find((s) => s.items.includes(item.key));\n\t\tconst key = section?.key ?? 'other';\n\t\tacc[key] = [...(acc[key] ?? []), item];\n\t\treturn acc;\n\t}, {});\n\n\tconst result: SectionCreateElement[] = sections\n\t\t.map(\n\t\t\t(section): SectionCreateElement => ({\n\t\t\t\ttype: 'section',\n\t\t\t\tkey: section.key,\n\t\t\t\ttitle: section.title,\n\t\t\t\tchildren: sortNodeCreateElements(itemsBySection[section.key] ?? []),\n\t\t\t}),\n\t\t)\n\t\t.concat({\n\t\t\ttype: 'section',\n\t\t\tkey: 'other',\n\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.other'),\n\t\t\tchildren: sortNodeCreateElements(itemsBySection.other ?? []),\n\t\t})\n\t\t.filter((section) => section.children.length > 0);\n\n\tif (result.length <= 1) {\n\t\treturn items;\n\t}\n\n\treturn result;\n}\n","import { defineStore } from 'pinia';\nimport { STORES, TRIGGER_NODE_CREATOR_VIEW } from '@/constants';\nimport type {\n\tNodeFilterType,\n\tNodeCreatorOpenSource,\n\tSimplifiedNodeType,\n\tActionsRecord,\n} from '@/Interface';\n\nimport { computed, ref } from 'vue';\nimport { transformNodeType } from '@/components/Node/NodeCreator/utils';\n\nexport const useNodeCreatorStore = defineStore(STORES.NODE_CREATOR, () => {\n\tconst selectedView = ref<NodeFilterType>(TRIGGER_NODE_CREATOR_VIEW);\n\tconst mergedNodes = ref<SimplifiedNodeType[]>([]);\n\tconst actions = ref<ActionsRecord<typeof mergedNodes.value>>({});\n\n\tconst showScrim = ref(false);\n\tconst openSource = ref<NodeCreatorOpenSource>('');\n\n\tconst allNodeCreatorNodes = computed(() =>\n\t\tObject.values(mergedNodes.value).map((i) => transformNodeType(i)),\n\t);\n\n\tfunction setMergeNodes(nodes: SimplifiedNodeType[]) {\n\t\tmergedNodes.value = nodes;\n\t}\n\n\tfunction setActions(nodes: ActionsRecord<typeof mergedNodes.value>) {\n\t\tactions.value = nodes;\n\t}\n\n\tfunction setShowScrim(isVisible: boolean) {\n\t\tshowScrim.value = isVisible;\n\t}\n\n\tfunction setSelectedView(view: NodeFilterType) {\n\t\tselectedView.value = view;\n\t}\n\n\tfunction setOpenSource(view: NodeCreatorOpenSource) {\n\t\topenSource.value = view;\n\t}\n\n\treturn {\n\t\topenSource,\n\t\tselectedView,\n\t\tshowScrim,\n\t\tmergedNodes,\n\t\tactions,\n\t\tsetShowScrim,\n\t\tsetSelectedView,\n\t\tsetOpenSource,\n\t\tsetActions,\n\t\tsetMergeNodes,\n\t\tallNodeCreatorNodes,\n\t};\n});\n","<template>\n\t<div\n\t\tref=\"container\"\n\t\t:class=\"$style.canvasAddButton\"\n\t\t:style=\"containerCssVars\"\n\t\tdata-test-id=\"canvas-add-button\"\n\t>\n\t\t<n8n-tooltip\n\t\t\tplacement=\"top\"\n\t\t\t:visible=\"showTooltip\"\n\t\t\t:disabled=\"nodeCreatorStore.showScrim\"\n\t\t\t:popper-class=\"$style.tooltip\"\n\t\t\t:show-after=\"700\"\n\t\t>\n\t\t\t<button :class=\"$style.button\" data-test-id=\"canvas-plus-button\" @click=\"$emit('click')\">\n\t\t\t\t<font-awesome-icon icon=\"plus\" size=\"lg\" />\n\t\t\t</button>\n\t\t\t<template #content>\n\t\t\t\t{{ $locale.baseText('nodeView.canvasAddButton.addATriggerNodeBeforeExecuting') }}\n\t\t\t</template>\n\t\t</n8n-tooltip>\n\t\t<p :class=\"$style.label\" v-text=\"$locale.baseText('nodeView.canvasAddButton.addFirstStep')\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport type { XYPosition } from '@/Interface';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nexport interface Props {\n\tshowTooltip: boolean;\n\tposition: XYPosition;\n}\n\nconst props = defineProps<Props>();\n\nconst nodeCreatorStore = useNodeCreatorStore();\nconst containerCssVars = computed(() => ({\n\t'--trigger-placeholder-left-position': `${props.position[0]}px`,\n\t'--trigger-placeholder-top-position': `${props.position[1]}px`,\n}));\n</script>\n\n<style lang=\"scss\" module>\n.canvasAddButton {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100px;\n\theight: 100px;\n\tposition: absolute;\n\ttop: var(--trigger-placeholder-top-position);\n\tleft: var(--trigger-placeholder-left-position);\n\t// We have to increase z-index to make sure it's higher than selecting box in NodeView\n\t// otherwise the clicks wouldn't register\n\tz-index: 101;\n\n\t&:hover .button svg path {\n\t\tfill: var(--color-primary);\n\t}\n}\n\n.button {\n\tbackground: var(--color-foreground-xlight);\n\tborder: 2px dashed var(--color-foreground-xdark);\n\tborder-radius: 8px;\n\tpadding: 0;\n\n\tmin-width: 100px;\n\tmin-height: 100px;\n\tcursor: pointer;\n\n\tsvg {\n\t\twidth: 26px !important;\n\t\theight: 40px;\n\t\tpath {\n\t\t\tfill: var(--color-foreground-xdark);\n\t\t}\n\t}\n}\n\n.label {\n\twidth: max-content;\n\tfont-weight: var(--font-weight-bold);\n\tfont-size: var(--font-size-m);\n\tline-height: var(--font-line-height-xloose);\n\tcolor: var(--color-text-dark);\n\tmargin-top: var(--spacing-2xs);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAIStore } from '@/stores/ai.store';\nimport { useI18n } from '@/composables/useI18n';\nimport { computed } from 'vue';\nimport { useTelemetry } from '@/composables/useTelemetry';\n\nconst aiStore = useAIStore();\nconst locale = useI18n();\nconst telemetry = useTelemetry();\n\nconst emit = defineEmits<{ (event: 'optionSelected', option: string): void }>();\n\nconst aiAssistantChatOpen = computed(() => aiStore.assistantChatOpen);\n\nconst title = computed(() => {\n\treturn aiStore.nextStepPopupConfig.title;\n});\n\nconst options = computed(() => [\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.choose'),\n\t\ticon: '➕',\n\t\tkey: 'choose',\n\t\tdisabled: false,\n\t},\n\t{\n\t\tlabel: locale.baseText('nextStepPopup.option.generate'),\n\t\ticon: '✨',\n\t\tkey: 'generate',\n\t\tdisabled: aiAssistantChatOpen.value,\n\t},\n]);\n\nconst position = computed(() => {\n\treturn [aiStore.nextStepPopupConfig.position[0], aiStore.nextStepPopupConfig.position[1]];\n});\n\nconst style = computed(() => {\n\treturn {\n\t\tleft: `${position.value[0]}px`,\n\t\ttop: `${position.value[1]}px`,\n\t};\n});\n\nconst close = () => {\n\taiStore.closeNextStepPopup();\n};\n\nconst onOptionSelected = (option: string) => {\n\tif (option === 'choose') {\n\t\temit('optionSelected', option);\n\t} else if (option === 'generate') {\n\t\ttelemetry.track('User clicked generate AI button', {}, { withPostHog: true });\n\t\taiStore.assistantChatOpen = true;\n\t}\n\tclose();\n};\n</script>\n\n<template>\n\t<div v-on-click-outside=\"close\" :class=\"$style.container\" :style=\"style\">\n\t\t<div :class=\"$style.title\">{{ title }}</div>\n\t\t<ul :class=\"$style.options\">\n\t\t\t<li\n\t\t\t\tv-for=\"option in options\"\n\t\t\t\t:key=\"option.key\"\n\t\t\t\t:class=\"{ [$style.option]: true, [$style.disabled]: option.disabled }\"\n\t\t\t\t@click=\"onOptionSelected(option.key)\"\n\t\t\t>\n\t\t\t\t<div :class=\"$style.icon\">\n\t\t\t\t\t{{ option.icon }}\n\t\t\t\t</div>\n\t\t\t\t<div :class=\"$style.label\">\n\t\t\t\t\t{{ option.label }}\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<style module lang=\"scss\">\n.container {\n\tposition: fixed;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 190px;\n\tfont-size: var(--font-size-2xs);\n\tbackground: var(--color-background-xlight);\n\tfilter: drop-shadow(0px 6px 16px #441c170f);\n\tborder: var(--border-width-base) var(--border-style-base) var(--color-foreground-light);\n\tborder-radius: var(--border-radius-base);\n\n\t// Arrow border is created as the outer triange\n\t&:before {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -11px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-foreground-light);\n\t\tposition: absolute;\n\t}\n\n\t// Arrow background is created as the inner triangle\n\t&:after {\n\t\tcontent: '';\n\t\tposition: relative;\n\t\tleft: -10px;\n\t\ttop: calc(50% - 8px);\n\t\tborder-top: 10px solid transparent;\n\t\tborder-bottom: 10px solid transparent;\n\t\tborder-right: 10px solid var(--color-background-xlight);\n\t\tposition: absolute;\n\t}\n}\n\n.title {\n\tpadding: var(--spacing-xs);\n\tcolor: var(--color-text-base);\n\tfont-weight: var(--font-weight-bold);\n}\n\n.options {\n\tlist-style: none;\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding-bottom: var(--spacing-2xs);\n}\n\n.option {\n\tdisplay: flex;\n\tpadding: var(--spacing-3xs) var(--spacing-xs);\n\tgap: var(--spacing-xs);\n\tcursor: pointer;\n\tcolor: var(--color-text-dark);\n\n\t&:hover {\n\t\tbackground: var(--color-background-base);\n\t\tfont-weight: var(--font-weight-bold);\n\t}\n\n\t&.disabled {\n\t\tpointer-events: none;\n\t\tcolor: var(--color-text-light);\n\t}\n}\n</style>\n","import {\n\tCORE_NODES_CATEGORY,\n\tWEBHOOK_NODE_TYPE,\n\tOTHER_TRIGGER_NODES_SUBCATEGORY,\n\tEXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tMANUAL_TRIGGER_NODE_TYPE,\n\tSCHEDULE_TRIGGER_NODE_TYPE,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tTRANSFORM_DATA_SUBCATEGORY,\n\tFILES_SUBCATEGORY,\n\tFLOWS_CONTROL_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEMAIL_IMAP_NODE_TYPE,\n\tDEFAULT_SUBCATEGORY,\n\tAI_NODE_CREATOR_VIEW,\n\tAI_CATEGORY_AGENTS,\n\tAI_CATEGORY_CHAINS,\n\tAI_CATEGORY_DOCUMENT_LOADERS,\n\tAI_CATEGORY_LANGUAGE_MODELS,\n\tAI_CATEGORY_MEMORY,\n\tAI_CATEGORY_OUTPUTPARSER,\n\tAI_CATEGORY_RETRIEVERS,\n\tAI_CATEGORY_TEXT_SPLITTERS,\n\tAI_CATEGORY_TOOLS,\n\tAI_CATEGORY_VECTOR_STORES,\n\tAI_SUBCATEGORY,\n\tAI_CATEGORY_EMBEDDING,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tAI_UNCATEGORIZED_CATEGORY,\n\tCONVERT_TO_FILE_NODE_TYPE,\n\tEXTRACT_FROM_FILE_NODE_TYPE,\n\tSET_NODE_TYPE,\n\tCODE_NODE_TYPE,\n\tDATETIME_NODE_TYPE,\n\tFILTER_NODE_TYPE,\n\tREMOVE_DUPLICATES_NODE_TYPE,\n\tSPLIT_OUT_NODE_TYPE,\n\tLIMIT_NODE_TYPE,\n\tSUMMARIZE_NODE_TYPE,\n\tAGGREGATE_NODE_TYPE,\n\tMERGE_NODE_TYPE,\n\tHTML_NODE_TYPE,\n\tMARKDOWN_NODE_TYPE,\n\tXML_NODE_TYPE,\n\tCRYPTO_NODE_TYPE,\n\tIF_NODE_TYPE,\n\tSPLIT_IN_BATCHES_NODE_TYPE,\n\tHTTP_REQUEST_NODE_TYPE,\n\tHELPERS_SUBCATEGORY,\n\tRSS_READ_NODE_TYPE,\n\tEMAIL_SEND_NODE_TYPE,\n\tEDIT_IMAGE_NODE_TYPE,\n\tCOMPRESSION_NODE_TYPE,\n} from '@/constants';\nimport { useI18n } from '@/composables/useI18n';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { SimplifiedNodeType } from '@/Interface';\nimport type { INodeTypeDescription } from 'n8n-workflow';\nimport { NodeConnectionType } from 'n8n-workflow';\nimport { useTemplatesStore } from '@/stores/templates.store';\n\nexport interface NodeViewItemSection {\n\tkey: string;\n\ttitle: string;\n\titems: string[];\n}\n\nexport interface NodeViewItem {\n\tkey: string;\n\ttype: string;\n\tproperties: {\n\t\tname?: string;\n\t\ttitle: string;\n\t\ticon: string;\n\t\ticonProps?: {\n\t\t\tcolor?: string;\n\t\t};\n\t\tconnectionType?: NodeConnectionType;\n\t\tpanelClass?: string;\n\t\tgroup?: string[];\n\t\tsections?: NodeViewItemSection[];\n\t\tdescription?: string;\n\t\ttag?: string;\n\t\tforceIncludeNodes?: string[];\n\t};\n\tcategory?: string | string[];\n}\n\ninterface NodeView {\n\tvalue: string;\n\ttitle: string;\n\tinfo?: string;\n\tsubtitle?: string;\n\titems: NodeViewItem[];\n}\n\nfunction getAiNodesBySubcategory(nodes: INodeTypeDescription[], subcategory: string) {\n\treturn nodes\n\t\t.filter(\n\t\t\t(node) => !node.hidden && node.codex?.subcategories?.[AI_SUBCATEGORY]?.includes(subcategory),\n\t\t)\n\t\t.map((node) => ({\n\t\t\tkey: node.name,\n\t\t\ttype: 'node',\n\t\t\tproperties: {\n\t\t\t\tgroup: [],\n\t\t\t\tname: node.name,\n\t\t\t\tdisplayName: node.displayName,\n\t\t\t\ttitle: node.displayName,\n\t\t\t\tdescription: node.description,\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\ticon: node.icon!,\n\t\t\t\ticonData: node.name.toLowerCase().includes('openai')\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\t\ticon: 'openai',\n\t\t\t\t\t\t\tfileBuffer: '/static/open-ai.svg',\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t}))\n\t\t.sort((a, b) => a.properties.displayName.localeCompare(b.properties.displayName));\n}\n\nexport function AIView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\tconst nodeTypesStore = useNodeTypesStore();\n\tconst templatesStore = useTemplatesStore();\n\n\tconst chainNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_CHAINS);\n\tconst agentNodes = getAiNodesBySubcategory(nodeTypesStore.allLatestNodeTypes, AI_CATEGORY_AGENTS);\n\n\treturn {\n\t\tvalue: AI_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\tinfo: i18n.baseText('nodeCreator.aiPanel.infoBox', {\n\t\t\tinterpolate: { link: templatesStore.getWebsiteCategoryURL('ai') },\n\t\t}),\n\t\titems: [\n\t\t\t...chainNodes,\n\t\t\t...agentNodes,\n\t\t\t{\n\t\t\t\tkey: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\t\ttype: 'view',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.aiOtherNodesDescription'),\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\nexport function AINodesView(_nodes: SimplifiedNodeType[]): NodeView {\n\tconst i18n = useI18n();\n\n\tfunction getAISubcategoryProperties(nodeConnectionType: NodeConnectionType) {\n\t\treturn {\n\t\t\tconnectionType: nodeConnectionType,\n\t\t\ticonProps: {\n\t\t\t\tcolor: `var(--node-type-${nodeConnectionType}-color)`,\n\t\t\t},\n\t\t\tpanelClass: `nodes-list-panel-${nodeConnectionType}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tvalue: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiOtherNodes'),\n\t\tsubtitle: i18n.baseText('nodeCreator.aiPanel.selectAiNode'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_DOCUMENT_LOADERS,\n\t\t\t\t\ticon: 'file-import',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiDocument),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_LANGUAGE_MODELS,\n\t\t\t\t\ticon: 'language',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiLanguageModel),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_MEMORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_MEMORY,\n\t\t\t\t\ticon: 'brain',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiMemory),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_OUTPUTPARSER,\n\t\t\t\t\ticon: 'list',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiOutputParser),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_RETRIEVERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_RETRIEVERS,\n\t\t\t\t\ticon: 'search',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiRetriever),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TEXT_SPLITTERS,\n\t\t\t\t\ticon: 'grip-lines-vertical',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTextSplitter),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_TOOLS,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_TOOLS,\n\t\t\t\t\ticon: 'tools',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiTool),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_EMBEDDING,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_EMBEDDING,\n\t\t\t\t\ticon: 'vector-square',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiEmbedding),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_CATEGORY_VECTOR_STORES,\n\t\t\t\t\ticon: 'project-diagram',\n\t\t\t\t\t...getAISubcategoryProperties(NodeConnectionType.AiVectorStore),\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: AI_UNCATEGORIZED_CATEGORY,\n\t\t\t\t\ticon: 'code',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport function TriggerView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATrigger'),\n\t\tsubtitle: i18n.baseText('nodeCreator.triggerHelperPanel.selectATriggerDescription'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\tforceIncludeNodes: [WEBHOOK_NODE_TYPE, EMAIL_IMAP_NODE_TYPE],\n\t\t\t\t\ttitle: 'App Trigger Nodes',\n\t\t\t\t\ticon: 'satellite-dish',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: SCHEDULE_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.scheduleTriggerDescription'),\n\t\t\t\t\ticon: 'fa:clock',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: WEBHOOK_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: WEBHOOK_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.webhookTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'webhook',\n\t\t\t\t\t\tfileBuffer: '/static/webhook-icon.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: FORM_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.formTriggerDescription'),\n\t\t\t\t\ticonData: {\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\ticon: 'form',\n\t\t\t\t\t\tfileBuffer: '/static/form-grey.svg',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: MANUAL_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.manualTriggerDescription'),\n\t\t\t\t\ticon: 'fa:mouse-pointer',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\ttype: 'node',\n\t\t\t\tcategory: [CORE_NODES_CATEGORY],\n\t\t\t\tproperties: {\n\t\t\t\t\tgroup: [],\n\t\t\t\t\tname: EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE,\n\t\t\t\t\tdisplayName: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDisplayName'),\n\t\t\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.workflowTriggerDescription'),\n\t\t\t\t\ticon: 'fa:sign-out-alt',\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: OTHER_TRIGGER_NODES_SUBCATEGORY,\n\t\t\t\t\ticon: 'folder-open',\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\treturn view;\n}\n\nexport function RegularView(nodes: SimplifiedNodeType[]) {\n\tconst i18n = useI18n();\n\n\tconst view: NodeView = {\n\t\tvalue: REGULAR_NODE_CREATOR_VIEW,\n\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.whatHappensNext'),\n\t\titems: [\n\t\t\t{\n\t\t\t\tkey: DEFAULT_SUBCATEGORY,\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: 'App Regular Nodes',\n\t\t\t\t\ticon: 'globe',\n\t\t\t\t\tforceIncludeNodes: [RSS_READ_NODE_TYPE, EMAIL_SEND_NODE_TYPE],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: TRANSFORM_DATA_SUBCATEGORY,\n\t\t\t\t\ticon: 'pen',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [SET_NODE_TYPE, CODE_NODE_TYPE, DATETIME_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'addOrRemove',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.addOrRemove'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tFILTER_NODE_TYPE,\n\t\t\t\t\t\t\t\tREMOVE_DUPLICATES_NODE_TYPE,\n\t\t\t\t\t\t\t\tSPLIT_OUT_NODE_TYPE,\n\t\t\t\t\t\t\t\tLIMIT_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'combine',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.combine'),\n\t\t\t\t\t\t\titems: [SUMMARIZE_NODE_TYPE, AGGREGATE_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'convert',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.transform.convert'),\n\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\tHTML_NODE_TYPE,\n\t\t\t\t\t\t\t\tMARKDOWN_NODE_TYPE,\n\t\t\t\t\t\t\t\tXML_NODE_TYPE,\n\t\t\t\t\t\t\t\tCRYPTO_NODE_TYPE,\n\t\t\t\t\t\t\t\tEXTRACT_FROM_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCONVERT_TO_FILE_NODE_TYPE,\n\t\t\t\t\t\t\t\tCOMPRESSION_NODE_TYPE,\n\t\t\t\t\t\t\t\tEDIT_IMAGE_NODE_TYPE,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FLOWS_CONTROL_SUBCATEGORY,\n\t\t\t\t\ticon: 'code-branch',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [FILTER_NODE_TYPE, IF_NODE_TYPE, SPLIT_IN_BATCHES_NODE_TYPE, MERGE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: FILES_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: FILES_SUBCATEGORY,\n\t\t\t\t\ticon: 'file-alt',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [CONVERT_TO_FILE_NODE_TYPE, EXTRACT_FROM_FILE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'subcategory',\n\t\t\t\tkey: HELPERS_SUBCATEGORY,\n\t\t\t\tcategory: CORE_NODES_CATEGORY,\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: HELPERS_SUBCATEGORY,\n\t\t\t\t\ticon: 'toolbox',\n\t\t\t\t\tsections: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'popular',\n\t\t\t\t\t\t\ttitle: i18n.baseText('nodeCreator.sectionNames.popular'),\n\t\t\t\t\t\t\titems: [HTTP_REQUEST_NODE_TYPE, WEBHOOK_NODE_TYPE, CODE_NODE_TYPE],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n\n\tconst hasAINodes = (nodes ?? []).some((node) => node.codex?.categories?.includes(AI_SUBCATEGORY));\n\tif (hasAINodes)\n\t\tview.items.push({\n\t\t\tkey: AI_NODE_CREATOR_VIEW,\n\t\t\ttype: 'view',\n\t\t\tproperties: {\n\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.langchainAiNodes'),\n\t\t\t\ticon: 'robot',\n\t\t\t\tdescription: i18n.baseText('nodeCreator.aiPanel.nodesForAi'),\n\t\t\t\ttag: i18n.baseText('nodeCreator.aiPanel.newTag'),\n\t\t\t},\n\t\t});\n\n\tview.items.push({\n\t\tkey: TRIGGER_NODE_CREATOR_VIEW,\n\t\ttype: 'view',\n\t\tproperties: {\n\t\t\ttitle: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTrigger'),\n\t\t\ticon: 'bolt',\n\t\t\tdescription: i18n.baseText('nodeCreator.triggerHelperPanel.addAnotherTriggerDescription'),\n\t\t},\n\t});\n\n\treturn view;\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\n\nexport type KeyboardKey = (typeof WATCHED_KEYS)[number];\ninterface KeyHook {\n\tkeyboardKeys: KeyboardKey[];\n\tcondition?: (type: string, activeItemId: string) => boolean;\n\thandler: (activeItemId: string, keyboardKey: KeyboardKey) => void;\n}\n\nexport const KEYBOARD_ID_ATTR = 'data-keyboard-nav-id';\nexport const WATCHED_KEYS = [\n\t'ArrowUp',\n\t'ArrowDown',\n\t'ArrowLeft',\n\t'ArrowRight',\n\t'Enter',\n\t'Escape',\n\t'Tab',\n];\n\nexport const useKeyboardNavigation = defineStore('nodeCreatorKeyboardNavigation', () => {\n\tconst selectableItems = ref<Array<WeakRef<Element>>>([]);\n\tconst activeItemId = ref<string | null>(null);\n\t// Array of objects that contains key code and handler\n\tconst keysHooks = ref<Record<string, KeyHook>>({});\n\n\tfunction getItemType(element?: Element) {\n\t\treturn element?.getAttribute('data-keyboard-nav-type');\n\t}\n\tfunction getElementId(element?: Element) {\n\t\treturn element?.getAttribute(KEYBOARD_ID_ATTR) || undefined;\n\t}\n\tasync function refreshSelectableItems(): Promise<void> {\n\t\treturn await new Promise((resolve) => {\n\t\t\t// Wait for DOM to update\n\t\t\tcleanupSelectableItems();\n\t\t\tsetTimeout(() => {\n\t\t\t\tselectableItems.value = Array.from(\n\t\t\t\t\tdocument.querySelectorAll('[data-keyboard-nav-type]'),\n\t\t\t\t).map((el) => new WeakRef(el));\n\t\t\t\tresolve();\n\t\t\t}, 0);\n\t\t});\n\t}\n\n\tfunction executeKeyHooks(keyboardKey: KeyboardKey, activeItem: Element) {\n\t\tconst flatHooks = Object.values(keysHooks.value);\n\t\tconst hooks = flatHooks.filter((hook) => hook.keyboardKeys.includes(keyboardKey));\n\n\t\thooks.forEach((hook) => {\n\t\t\tif (!activeItemId.value) return;\n\n\t\t\tconst conditionPassed =\n\t\t\t\thook.condition === undefined ||\n\t\t\t\thook.condition(getItemType(activeItem) || '', activeItemId.value);\n\n\t\t\tif (conditionPassed && activeItemId.value) {\n\t\t\t\thook.handler(activeItemId.value, keyboardKey);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync function onKeyDown(e: KeyboardEvent) {\n\t\tconst pressedKey = e.key;\n\t\tif (!WATCHED_KEYS.includes(pressedKey)) return;\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tawait refreshSelectableItems();\n\t\tconst activeItemIndex = selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t\tconst activeItem = selectableItems.value[activeItemIndex]?.deref();\n\n\t\tconst isArrowDown = pressedKey === 'ArrowDown';\n\t\tconst isArrowUp = pressedKey === 'ArrowUp';\n\n\t\tif (!activeItem) return;\n\n\t\tif (isArrowDown) {\n\t\t\tconst nextItemIndex =\n\t\t\t\tactiveItemIndex < selectableItems.value.length - 1 ? activeItemIndex + 1 : 0;\n\n\t\t\tsetActiveItem(selectableItems.value[nextItemIndex]?.deref());\n\t\t}\n\t\tif (isArrowUp) {\n\t\t\tconst previousIndex =\n\t\t\t\tactiveItemIndex > 0 ? activeItemIndex - 1 : selectableItems.value.length - 1;\n\n\t\t\tsetActiveItem(selectableItems.value[previousIndex]?.deref());\n\t\t}\n\t\texecuteKeyHooks(pressedKey, activeItem);\n\t}\n\n\tfunction setActiveItemId(id: string) {\n\t\tactiveItemId.value = id;\n\t}\n\n\tfunction setActiveItem(item?: Element) {\n\t\tconst itemId = getElementId(item);\n\t\tif (!itemId) return;\n\n\t\tsetActiveItemId(itemId);\n\t\tif (item?.scrollIntoView) {\n\t\t\titem?.scrollIntoView({ block: 'center' });\n\t\t}\n\t}\n\n\tasync function setActiveItemIndex(index: number) {\n\t\tawait refreshSelectableItems();\n\n\t\tsetActiveItem(selectableItems.value[index]?.deref());\n\t}\n\n\tfunction attachKeydownEvent() {\n\t\tdocument.addEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction detachKeydownEvent() {\n\t\tcleanupSelectableItems();\n\t\tdocument.removeEventListener('keydown', onKeyDown, { capture: true });\n\t}\n\n\tfunction registerKeyHook(name: string, hook: KeyHook) {\n\t\thook.keyboardKeys.forEach((keyboardKey) => {\n\t\t\tif (WATCHED_KEYS.includes(keyboardKey)) {\n\t\t\t\tkeysHooks.value = { ...keysHooks.value, [name]: hook };\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Key ${keyboardKey} is not supported`);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction cleanupSelectableItems() {\n\t\t// Cleanup to make sure DOM elements get garbage collected\n\t\tselectableItems.value = [];\n\t}\n\n\tfunction getActiveItemIndex() {\n\t\treturn selectableItems.value.findIndex(\n\t\t\t(item) => getElementId(item?.deref()) === activeItemId.value,\n\t\t);\n\t}\n\n\treturn {\n\t\tactiveItemId,\n\t\tattachKeydownEvent,\n\t\trefreshSelectableItems,\n\t\tdetachKeydownEvent,\n\t\tregisterKeyHook,\n\t\tgetActiveItemIndex,\n\t\tsetActiveItemId,\n\t\tsetActiveItemIndex,\n\t};\n});\n","import type { INodeCreateElement, NodeFilterType, SimplifiedNodeType } from '@/Interface';\nimport {\n\tAI_CODE_NODE_TYPE,\n\tAI_OTHERS_NODE_CREATOR_VIEW,\n\tDEFAULT_SUBCATEGORY,\n\tTRIGGER_NODE_CREATOR_VIEW,\n} from '@/constants';\nimport { defineStore } from 'pinia';\nimport { v4 as uuid } from 'uuid';\nimport { computed, nextTick, ref } from 'vue';\n\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\n\nimport {\n\tflattenCreateElements,\n\tgroupItemsInSections,\n\tsearchNodes,\n\tsortNodeCreateElements,\n\tsubcategorizeItems,\n\ttransformNodeType,\n} from '../utils';\n\nimport type { NodeViewItem, NodeViewItemSection } from '@/components/Node/NodeCreator/viewsData';\nimport { AINodesView } from '@/components/Node/NodeCreator/viewsData';\nimport { useI18n } from '@/composables/useI18n';\nimport { useKeyboardNavigation } from './useKeyboardNavigation';\n\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport type { INodeInputFilter, NodeConnectionType } from 'n8n-workflow';\n\ninterface ViewStack {\n\tuuid?: string;\n\ttitle?: string;\n\tsubtitle?: string;\n\tsearch?: string;\n\tsubcategory?: string;\n\tinfo?: string;\n\tnodeIcon?: {\n\t\ticonType?: string;\n\t\ticon?: string;\n\t\tcolor?: string;\n\t};\n\ticonUrl?: string;\n\trootView?: NodeFilterType;\n\tactiveIndex?: number;\n\ttransitionDirection?: 'in' | 'out';\n\thasSearch?: boolean;\n\tpreventBack?: boolean;\n\titems?: INodeCreateElement[];\n\tbaselineItems?: INodeCreateElement[];\n\tsearchItems?: SimplifiedNodeType[];\n\tforceIncludeNodes?: string[];\n\tmode?: 'actions' | 'nodes';\n\tbaseFilter?: (item: INodeCreateElement) => boolean;\n\titemsMapper?: (item: INodeCreateElement) => INodeCreateElement;\n\tpanelClass?: string;\n\tsections?: NodeViewItemSection[];\n}\n\nexport const useViewStacks = defineStore('nodeCreatorViewStacks', () => {\n\tconst nodeCreatorStore = useNodeCreatorStore();\n\tconst { getActiveItemIndex } = useKeyboardNavigation();\n\n\tconst viewStacks = ref<ViewStack[]>([]);\n\n\tconst activeStackItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\n\t\tif (!stack?.baselineItems) {\n\t\t\treturn stack.items ? extendItemsWithUUID(stack.items) : [];\n\t\t}\n\n\t\tif (stack.search && searchBaseItems.value) {\n\t\t\tconst searchBase =\n\t\t\t\tsearchBaseItems.value.length > 0\n\t\t\t\t\t? searchBaseItems.value\n\t\t\t\t\t: flattenCreateElements(stack.baselineItems ?? []);\n\n\t\t\treturn extendItemsWithUUID(searchNodes(stack.search || '', searchBase));\n\t\t}\n\t\treturn extendItemsWithUUID(stack.baselineItems);\n\t});\n\n\tconst activeViewStack = computed<ViewStack>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack) return {};\n\n\t\tconst flatBaselineItems = flattenCreateElements(stack.baselineItems ?? []);\n\n\t\treturn {\n\t\t\t...stack,\n\t\t\titems: activeStackItems.value,\n\t\t\thasSearch: flatBaselineItems.length > 8 || stack?.hasSearch,\n\t\t};\n\t});\n\n\tconst activeViewStackMode = computed(\n\t\t() => activeViewStack.value.mode || TRIGGER_NODE_CREATOR_VIEW,\n\t);\n\n\tconst searchBaseItems = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.searchItems) return [];\n\n\t\treturn stack.searchItems.map((item) => transformNodeType(item, stack.subcategory));\n\t});\n\n\t// Generate a delta between the global search results(all nodes) and the stack search results\n\tconst globalSearchItemsDiff = computed<INodeCreateElement[]>(() => {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack?.search) return [];\n\n\t\tconst allNodes = nodeCreatorStore.mergedNodes.map((item) => transformNodeType(item));\n\t\tconst globalSearchResult = extendItemsWithUUID(searchNodes(stack.search || '', allNodes));\n\n\t\treturn globalSearchResult.filter((item) => {\n\t\t\treturn !activeStackItems.value.find((activeItem) => activeItem.key === item.key);\n\t\t});\n\t});\n\n\tconst itemsBySubcategory = computed(() => subcategorizeItems(nodeCreatorStore.mergedNodes));\n\n\tasync function gotoCompatibleConnectionView(\n\t\tconnectionType: NodeConnectionType,\n\t\tisOutput?: boolean,\n\t\tfilter?: INodeInputFilter,\n\t) {\n\t\tconst i18n = useI18n();\n\n\t\tlet nodesByConnectionType: { [key: string]: string[] };\n\t\tlet relatedAIView: NodeViewItem | { properties: { title: string; icon: string } } | undefined;\n\n\t\tif (isOutput === true) {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByInputConnectionTypeNames;\n\t\t\trelatedAIView = {\n\t\t\t\tproperties: {\n\t\t\t\t\ttitle: i18n.baseText('nodeCreator.aiPanel.aiNodes'),\n\t\t\t\t\ticon: 'robot',\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tnodesByConnectionType = useNodeTypesStore().visibleNodeTypesByOutputConnectionTypeNames;\n\n\t\t\trelatedAIView = AINodesView([]).items.find(\n\t\t\t\t(item) => item.properties.connectionType === connectionType,\n\t\t\t);\n\t\t}\n\n\t\tawait nextTick();\n\t\tpushViewStack({\n\t\t\ttitle: relatedAIView?.properties.title,\n\t\t\trootView: AI_OTHERS_NODE_CREATOR_VIEW,\n\t\t\tmode: 'nodes',\n\t\t\titems: nodeCreatorStore.allNodeCreatorNodes,\n\t\t\tnodeIcon: {\n\t\t\t\ticonType: 'icon',\n\t\t\t\ticon: relatedAIView?.properties.icon,\n\t\t\t\tcolor: relatedAIView?.properties.iconProps?.color,\n\t\t\t},\n\t\t\tpanelClass: relatedAIView?.properties.panelClass,\n\t\t\tbaseFilter: (i: INodeCreateElement) => {\n\t\t\t\t// AI Code node could have any connection type so we don't want to display it\n\t\t\t\t// in the compatible connection view as it would be displayed in all of them\n\t\t\t\tif (i.key === AI_CODE_NODE_TYPE) return false;\n\t\t\t\tconst displayNode = nodesByConnectionType[connectionType].includes(i.key);\n\n\t\t\t\t// TODO: Filtering works currently fine for displaying compatible node when dropping\n\t\t\t\t// input connections. However, it does not work for output connections.\n\t\t\t\t// For that reason does it currently display nodes that are maybe not compatible\n\t\t\t\t// but then errors once it got selected by the user.\n\t\t\t\tif (displayNode && filter?.nodes?.length) {\n\t\t\t\t\treturn filter.nodes.includes(i.key);\n\t\t\t\t}\n\n\t\t\t\treturn displayNode;\n\t\t\t},\n\t\t\titemsMapper(item) {\n\t\t\t\treturn {\n\t\t\t\t\t...item,\n\t\t\t\t\tsubcategory: connectionType,\n\t\t\t\t};\n\t\t\t},\n\t\t\tpreventBack: true,\n\t\t});\n\t}\n\n\tfunction setStackBaselineItems() {\n\t\tconst stack = viewStacks.value[viewStacks.value.length - 1];\n\t\tif (!stack || !activeViewStack.value.uuid) return;\n\n\t\tlet stackItems = stack?.items ?? [];\n\n\t\tif (!stack?.items) {\n\t\t\tconst subcategory = stack?.subcategory ?? DEFAULT_SUBCATEGORY;\n\t\t\tconst itemsInSubcategory = itemsBySubcategory.value[subcategory];\n\t\t\tconst sections = stack.sections;\n\n\t\t\tif (sections) {\n\t\t\t\tstackItems = groupItemsInSections(itemsInSubcategory, sections);\n\t\t\t} else {\n\t\t\t\tstackItems = itemsInSubcategory;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure that the nodes specified in `stack.forceIncludeNodes` are always included,\n\t\t// regardless of whether the subcategory is matched\n\t\tif ((stack.forceIncludeNodes ?? []).length > 0) {\n\t\t\tconst matchedNodes = nodeCreatorStore.mergedNodes\n\t\t\t\t.filter((item) => stack.forceIncludeNodes?.includes(item.name))\n\t\t\t\t.map((item) => transformNodeType(item, stack.subcategory));\n\n\t\t\tstackItems.push(...matchedNodes);\n\t\t}\n\n\t\tif (stack.baseFilter) {\n\t\t\tstackItems = stackItems.filter(stack.baseFilter);\n\t\t}\n\n\t\tif (stack.itemsMapper) {\n\t\t\tstackItems = stackItems.map(stack.itemsMapper);\n\t\t}\n\n\t\t// Sort only if non-root view\n\t\tif (!stack.items) {\n\t\t\tstackItems = sortNodeCreateElements(stackItems);\n\t\t}\n\n\t\tupdateCurrentViewStack({ baselineItems: stackItems });\n\t}\n\n\tfunction extendItemsWithUUID(items: INodeCreateElement[]) {\n\t\treturn items.map((item) => ({\n\t\t\t...item,\n\t\t\tuuid: `${item.key}-${uuid()}`,\n\t\t}));\n\t}\n\n\tfunction pushViewStack(stack: ViewStack) {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tupdateCurrentViewStack({ activeIndex: getActiveItemIndex() });\n\t\t}\n\n\t\tconst newStackUuid = uuid();\n\t\tviewStacks.value.push({\n\t\t\t...stack,\n\t\t\tuuid: newStackUuid,\n\t\t\ttransitionDirection: 'in',\n\t\t\tactiveIndex: 0,\n\t\t});\n\t\tsetStackBaselineItems();\n\t}\n\n\tfunction popViewStack() {\n\t\tif (activeViewStack.value.uuid) {\n\t\t\tviewStacks.value.pop();\n\t\t\tupdateCurrentViewStack({ transitionDirection: 'out' });\n\t\t}\n\t}\n\n\tfunction updateCurrentViewStack(stack: Partial<ViewStack>) {\n\t\tconst currentStack = viewStacks.value[viewStacks.value.length - 1];\n\t\tconst matchedIndex = viewStacks.value.findIndex((s) => s.uuid === currentStack.uuid);\n\t\tif (!currentStack) return;\n\n\t\t// For each key in the stack, update the matched stack\n\t\tObject.keys(stack).forEach((key) => {\n\t\t\tconst typedKey = key as keyof ViewStack;\n\t\t\tviewStacks.value[matchedIndex] = {\n\t\t\t\t...viewStacks.value[matchedIndex],\n\t\t\t\t[key]: stack[typedKey],\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction resetViewStacks() {\n\t\tviewStacks.value = [];\n\t}\n\n\treturn {\n\t\tviewStacks,\n\t\tactiveViewStack,\n\t\tactiveViewStackMode,\n\t\tglobalSearchItemsDiff,\n\t\tgotoCompatibleConnectionView,\n\t\tresetViewStacks,\n\t\tupdateCurrentViewStack,\n\t\tpushViewStack,\n\t\tpopViewStack,\n\t};\n});\n","import type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nimport { getMousePosition } from '@/utils/nodeViewUtils';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { MOUSE_EVENT_BUTTON, MOUSE_EVENT_BUTTONS } from '@/constants';\n\n/**\n * Composable for handling canvas panning interactions - it facilitates the movement of the\n * canvas element in response to mouse events\n */\nexport function useCanvasPanning(\n\telementRef: Ref<null | HTMLElement>,\n\toptions: {\n\t\t// @TODO To be refactored (unref) when migrating NodeView to composition API\n\t\tonMouseMoveEnd?: Ref<null | ((e: MouseEvent) => void)>;\n\t} = {},\n) {\n\tconst uiStore = useUIStore();\n\tconst moveLastPosition = ref([0, 0]);\n\tconst deviceSupport = useDeviceSupport();\n\n\t/**\n\t * Updates the canvas offset position based on the mouse movement\n\t */\n\tfunction panCanvas(e: MouseEvent) {\n\t\tconst offsetPosition = uiStore.nodeViewOffsetPosition;\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tconst nodeViewOffsetPositionX = offsetPosition[0] + (x - moveLastPosition.value[0]);\n\t\tconst nodeViewOffsetPositionY = offsetPosition[1] + (y - moveLastPosition.value[1]);\n\t\tuiStore.nodeViewOffsetPosition = [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\n\t\t// Update the last position\n\t\tmoveLastPosition.value = [x, y];\n\n\t\treturn [nodeViewOffsetPositionX, nodeViewOffsetPositionY];\n\t}\n\n\t/**\n\t * Initiates the panning process when specific conditions are met (middle mouse or ctrl key pressed)\n\t */\n\tfunction onMouseDown(e: MouseEvent, moveButtonPressed: boolean) {\n\t\tif (!(deviceSupport.isCtrlKeyPressed(e) || moveButtonPressed)) {\n\t\t\t// We only care about it when the ctrl key is pressed at the same time.\n\t\t\t// So we exit when it is not pressed.\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\t// If a node does currently get dragged we do not activate the selection\n\t\t\treturn;\n\t\t}\n\n\t\t// Prevent moving canvas on anything but middle button\n\t\tif (e.button !== MOUSE_EVENT_BUTTON.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tconst [x, y] = getMousePosition(e);\n\n\t\tmoveLastPosition.value = [x, y];\n\n\t\tconst element = unref(elementRef);\n\t\telement?.addEventListener('mousemove', onMouseMove);\n\t}\n\n\t/**\n\t * Ends the panning process and removes the mousemove event listener\n\t */\n\tfunction onMouseUp(_: MouseEvent) {\n\t\tif (!uiStore.nodeViewMoveInProgress) {\n\t\t\t// If it is not active return directly.\n\t\t\t// Else normal node dragging will not work.\n\t\t\treturn;\n\t\t}\n\n\t\tconst element = unref(elementRef);\n\t\telement?.removeEventListener('mousemove', onMouseMove);\n\n\t\tuiStore.nodeViewMoveInProgress = false;\n\n\t\t// Nothing else to do. Simply leave the node view at the current offset\n\t}\n\n\t/**\n\t * Handles the actual movement of the canvas during a mouse drag,\n\t * updating the position based on the current mouse position\n\t */\n\tfunction onMouseMove(e: MouseEvent) {\n\t\tconst element = unref(elementRef);\n\t\tif (e.target && !(element === e.target || element?.contains(e.target as Node))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (uiStore.isActionActive('dragActive')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Signal that moving canvas is active if middle button is pressed and mouse is moved\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.MIDDLE) {\n\t\t\tuiStore.nodeViewMoveInProgress = true;\n\t\t}\n\n\t\tif (e.buttons === MOUSE_EVENT_BUTTONS.NONE) {\n\t\t\t// Mouse button is not pressed anymore so stop selection mode\n\t\t\t// Happens normally when mouse leave the view pressed and then\n\t\t\t// comes back unpressed.\n\t\t\tconst onMouseMoveEnd = unref(options.onMouseMoveEnd);\n\t\t\tonMouseMoveEnd?.(e);\n\t\t\treturn;\n\t\t}\n\n\t\tpanCanvas(e);\n\t}\n\n\treturn {\n\t\tmoveLastPosition,\n\t\tonMouseDown,\n\t\tonMouseUp,\n\t\tonMouseMove,\n\t\tpanCanvas,\n\t};\n}\n","<template>\n\t<div ref=\"nodeViewRootRef\" :class=\"$style['content']\">\n\t\t<div\n\t\t\tid=\"node-view-root\"\n\t\t\tclass=\"node-view-root do-not-select\"\n\t\t\tdata-test-id=\"node-view-root\"\n\t\t\t@dragover=\"onDragOver\"\n\t\t\t@drop=\"onDrop\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-touch:tap=\"touchTap\"\n\t\t\t\tclass=\"node-view-wrapper\"\n\t\t\t\t:class=\"workflowClasses\"\n\t\t\t\tdata-test-id=\"node-view-wrapper\"\n\t\t\t\t@touchstart=\"mouseDown\"\n\t\t\t\t@touchend=\"mouseUp\"\n\t\t\t\t@touchmove=\"canvasPanning.onMouseMove\"\n\t\t\t\t@mousedown=\"mouseDown\"\n\t\t\t\t@mouseup=\"mouseUp\"\n\t\t\t\t@contextmenu=\"contextMenu.open\"\n\t\t\t\t@wheel=\"canvasStore.wheelScroll\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view-background\"\n\t\t\t\t\tclass=\"node-view-background\"\n\t\t\t\t\t:style=\"backgroundStyle\"\n\t\t\t\t\tdata-test-id=\"node-view-background\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tid=\"node-view\"\n\t\t\t\t\tref=\"nodeViewRef\"\n\t\t\t\t\tclass=\"node-view\"\n\t\t\t\t\t:style=\"workflowStyle\"\n\t\t\t\t\tdata-test-id=\"node-view\"\n\t\t\t\t>\n\t\t\t\t\t<CanvasAddButton\n\t\t\t\t\t\tv-show=\"showCanvasAddButton\"\n\t\t\t\t\t\tref=\"canvasAddButton\"\n\t\t\t\t\t\t:style=\"canvasAddButtonStyle\"\n\t\t\t\t\t\t:show-tooltip=\"!containsTrigger && showTriggerMissingTooltip\"\n\t\t\t\t\t\t:position=\"canvasStore.canvasAddButtonPosition\"\n\t\t\t\t\t\tdata-test-id=\"canvas-add-button\"\n\t\t\t\t\t\t@click=\"onCanvasAddButtonCLick\"\n\t\t\t\t\t\t@hook:mounted=\"canvasStore.setRecenteredCanvasAddButtonPosition\"\n\t\t\t\t\t/>\n\t\t\t\t\t<Node\n\t\t\t\t\t\tv-for=\"nodeData in nodesToRender\"\n\t\t\t\t\t\t:key=\"`${nodeData.id}_node`\"\n\t\t\t\t\t\t:name=\"nodeData.name\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === nodeData.name\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:disable-pointer-events=\"!canOpenNDV\"\n\t\t\t\t\t\t:hide-node-issues=\"hideNodeIssues\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@run-workflow=\"onRunNode\"\n\t\t\t\t\t\t@moved=\"onNodeMoved\"\n\t\t\t\t\t\t@run=\"onNodeRun\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t\t@toggle-disable-node=\"(node) => toggleActivationNodes([node])\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template #custom-tooltip>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-text=\"$locale.baseText('nodeView.placeholderNode.addTriggerNodeBeforeExecuting')\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</Node>\n\t\t\t\t\t<Sticky\n\t\t\t\t\t\tv-for=\"stickyData in stickiesToRender\"\n\t\t\t\t\t\t:key=\"`${stickyData.id}_sticky`\"\n\t\t\t\t\t\t:name=\"stickyData.name\"\n\t\t\t\t\t\t:workflow=\"currentWorkflowObject\"\n\t\t\t\t\t\t:is-read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t\t\t:instance=\"instance\"\n\t\t\t\t\t\t:is-active=\"!!activeNode && activeNode.name === stickyData.name\"\n\t\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t\t:grid-size=\"GRID_SIZE\"\n\t\t\t\t\t\t:hide-actions=\"pullConnActive\"\n\t\t\t\t\t\t@deselect-all-nodes=\"deselectAllNodes\"\n\t\t\t\t\t\t@deselect-node=\"nodeDeselectedByName\"\n\t\t\t\t\t\t@node-selected=\"nodeSelectedByName\"\n\t\t\t\t\t\t@remove-node=\"(name) => removeNode(name, true)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<NodeDetailsView\n\t\t\t\t:read-only=\"isReadOnlyRoute || readOnlyEnv\"\n\t\t\t\t:renaming=\"renamingActive\"\n\t\t\t\t:is-production-execution-preview=\"isProductionExecutionPreview\"\n\t\t\t\t@redraw-node=\"redrawNode\"\n\t\t\t\t@switch-selected-node=\"onSwitchSelectedNode\"\n\t\t\t\t@open-connection-node-creator=\"onOpenConnectionNodeCreator\"\n\t\t\t\t@value-changed=\"valueChanged\"\n\t\t\t\t@stop-execution=\"stopExecution\"\n\t\t\t\t@save-keyboard-shortcut=\"onSaveKeyboardShortcut\"\n\t\t\t/>\n\t\t\t<Suspense>\n\t\t\t\t<div :class=\"$style.setupCredentialsButtonWrapper\">\n\t\t\t\t\t<SetupWorkflowCredentialsButton />\n\t\t\t\t</div>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NodeCreation\n\t\t\t\t\tv-if=\"!isReadOnlyRoute && !readOnlyEnv\"\n\t\t\t\t\t:create-node-active=\"createNodeActive\"\n\t\t\t\t\t:node-view-scale=\"nodeViewScale\"\n\t\t\t\t\t@toggle-node-creator=\"onToggleNodeCreator\"\n\t\t\t\t\t@add-nodes=\"onAddNodes\"\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<CanvasControls />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<ContextMenu @action=\"onContextMenuAction\" />\n\t\t\t</Suspense>\n\t\t\t<Suspense>\n\t\t\t\t<NextStepPopup v-show=\"isNextStepPopupVisible\" @option-selected=\"onNextStepSelected\" />\n\t\t\t</Suspense>\n\t\t\t<div v-if=\"!isReadOnlyRoute && !readOnlyEnv\" class=\"workflow-execute-wrapper\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isManualChatOnly\"\n\t\t\t\t\t@mouseenter=\"showTriggerMissingToltip(true)\"\n\t\t\t\t\t@mouseleave=\"showTriggerMissingToltip(false)\"\n\t\t\t\t\t@click=\"onRunContainerClick\"\n\t\t\t\t>\n\t\t\t\t\t<KeyboardShortcutTooltip\n\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t:shortcut=\"{ metaKey: true, keys: ['↵'] }\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<n8n-button\n\t\t\t\t\t\t\t:loading=\"workflowRunning\"\n\t\t\t\t\t\t\t:label=\"runButtonText\"\n\t\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\t\ticon=\"flask\"\n\t\t\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\t\t\t:disabled=\"isExecutionDisabled\"\n\t\t\t\t\t\t\tdata-test-id=\"execute-workflow-button\"\n\t\t\t\t\t\t\t@click.stop=\"onRunWorkflow\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</KeyboardShortcutTooltip>\n\t\t\t\t</span>\n\n\t\t\t\t<n8n-button\n\t\t\t\t\tv-if=\"containsChatNodes\"\n\t\t\t\t\tlabel=\"Chat\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\ticon=\"comment\"\n\t\t\t\t\ttype=\"primary\"\n\t\t\t\t\tdata-test-id=\"workflow-chat-button\"\n\t\t\t\t\t@click.stop=\"onOpenChat\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && !executionWaitingForWebhook\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t:title=\"\n\t\t\t\t\t\tstopExecutionInProgress\n\t\t\t\t\t\t\t? $locale.baseText('nodeView.stoppingCurrentExecution')\n\t\t\t\t\t\t\t: $locale.baseText('nodeView.stopCurrentExecution')\n\t\t\t\t\t\"\n\t\t\t\t\t:loading=\"stopExecutionInProgress\"\n\t\t\t\t\tdata-test-id=\"stop-execution-button\"\n\t\t\t\t\t@click.stop=\"stopExecution\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"workflowRunning === true && executionWaitingForWebhook === true\"\n\t\t\t\t\tclass=\"stop-execution\"\n\t\t\t\t\ticon=\"stop\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.stopWaitingForWebhookCall')\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tdata-test-id=\"stop-execution-waiting-for-webhook-button\"\n\t\t\t\t\t@click.stop=\"stopWaitingForWebhook\"\n\t\t\t\t/>\n\n\t\t\t\t<n8n-icon-button\n\t\t\t\t\tv-if=\"\n\t\t\t\t\t\t!isReadOnlyRoute &&\n\t\t\t\t\t\t!readOnlyEnv &&\n\t\t\t\t\t\tworkflowExecution &&\n\t\t\t\t\t\t!workflowRunning &&\n\t\t\t\t\t\t!allTriggersDisabled\n\t\t\t\t\t\"\n\t\t\t\t\t:title=\"$locale.baseText('nodeView.deletesTheCurrentExecutionData')\"\n\t\t\t\t\ticon=\"trash\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tdata-test-id=\"clear-execution-data-button\"\n\t\t\t\t\t@click.stop=\"clearExecutionData\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { defineAsyncComponent, defineComponent, nextTick, ref } from 'vue';\nimport { mapStores, storeToRefs } from 'pinia';\n\nimport type {\n\tEndpoint,\n\tConnection,\n\tConnectionEstablishedParams,\n\tBeforeDropParams,\n\tConnectionDetachedParams,\n\tConnectionMovedParams,\n\tComponentParameters,\n} from '@jsplumb/core';\nimport {\n\tEVENT_CONNECTION,\n\tEVENT_CONNECTION_DETACHED,\n\tEVENT_CONNECTION_MOVED,\n\tINTERCEPT_BEFORE_DROP,\n} from '@jsplumb/core';\nimport type { MessageBoxInputData, ElNotification } from 'element-plus';\n\nimport {\n\tFIRST_ONBOARDING_PROMPT_TIMEOUT,\n\tMAIN_HEADER_TABS,\n\tMODAL_CANCEL,\n\tMODAL_CLOSE,\n\tMODAL_CONFIRM,\n\tONBOARDING_CALL_SIGNUP_MODAL_KEY,\n\tONBOARDING_PROMPT_TIMEBOX,\n\tPLACEHOLDER_EMPTY_WORKFLOW_ID,\n\tQUICKSTART_NOTE_NAME,\n\tSTART_NODE_TYPE,\n\tSTICKY_NODE_TYPE,\n\tVIEWS,\n\tWEBHOOK_NODE_TYPE,\n\tFORM_TRIGGER_NODE_TYPE,\n\tTRIGGER_NODE_CREATOR_VIEW,\n\tEnterpriseEditionFeature,\n\tREGULAR_NODE_CREATOR_VIEW,\n\tNODE_CREATOR_OPEN_SOURCES,\n\tCHAT_TRIGGER_NODE_TYPE,\n\tMANUAL_CHAT_TRIGGER_NODE_TYPE,\n\tWORKFLOW_LM_CHAT_MODAL_KEY,\n\tAI_NODE_CREATOR_VIEW,\n\tDRAG_EVENT_DATA_KEY,\n\tUPDATE_WEBHOOK_ID_NODE_TYPES,\n\tTIME,\n\tAI_ASSISTANT_LOCAL_STORAGE_KEY,\n} from '@/constants';\n\nimport useGlobalLinkActions from '@/composables/useGlobalLinkActions';\nimport { useNodeHelpers } from '@/composables/useNodeHelpers';\nimport useCanvasMouseSelect from '@/composables/useCanvasMouseSelect';\nimport { useExecutionDebugging } from '@/composables/useExecutionDebugging';\nimport { useTitleChange } from '@/composables/useTitleChange';\nimport { useDataSchema } from '@/composables/useDataSchema';\nimport { type ContextMenuAction, useContextMenu } from '@/composables/useContextMenu';\nimport { useUniqueNodeName } from '@/composables/useUniqueNodeName';\nimport { useI18n } from '@/composables/useI18n';\nimport { useMessage } from '@/composables/useMessage';\nimport { useToast } from '@/composables/useToast';\n\nimport NodeDetailsView from '@/components/NodeDetailsView.vue';\nimport ContextMenu from '@/components/ContextMenu/ContextMenu.vue';\nimport Node from '@/components/Node.vue';\nimport Sticky from '@/components/Sticky.vue';\nimport CanvasAddButton from './CanvasAddButton.vue';\nimport KeyboardShortcutTooltip from '@/components/KeyboardShortcutTooltip.vue';\nimport NextStepPopup from '@/components/AIAssistantChat/NextStepPopup.vue';\nimport { v4 as uuid } from 'uuid';\nimport type {\n\tIConnection,\n\tIConnections,\n\tIDataObject,\n\tExecutionSummary,\n\tINode,\n\tINodeConnections,\n\tINodeCredentialsDetails,\n\tINodeInputConfiguration,\n\tINodeTypeDescription,\n\tINodeTypeNameVersion,\n\tIPinData,\n\tITaskData,\n\tITelemetryTrackProperties,\n\tIWorkflowBase,\n\tWorkflow,\n\tConnectionTypes,\n\tINodeOutputConfiguration,\n} from 'n8n-workflow';\nimport {\n\tdeepCopy,\n\tjsonParse,\n\tNodeConnectionType,\n\tNodeHelpers,\n\tTelemetryHelpers,\n} from 'n8n-workflow';\nimport type {\n\tNewConnectionInfo,\n\tICredentialsResponse,\n\tIExecutionResponse,\n\tIWorkflowDb,\n\tIWorkflowData,\n\tINodeUi,\n\tIUpdateInformation,\n\tIWorkflowDataUpdate,\n\tXYPosition,\n\tITag,\n\tINewWorkflowData,\n\tIWorkflowTemplate,\n\tIWorkflowToShare,\n\tIUser,\n\tINodeUpdatePropertiesInformation,\n\tNodeCreatorOpenSource,\n\tAddedNodesAndConnections,\n\tToggleNodeCreatorOptions,\n\tAIAssistantConnectionInfo,\n} from '@/Interface';\n\nimport { type Route, type RawLocation, useRouter } from 'vue-router';\nimport { dataPinningEventBus, nodeViewEventBus } from '@/event-bus';\nimport { useCanvasStore } from '@/stores/canvas.store';\nimport { useCollaborationStore } from '@/stores/collaboration.store';\nimport { useCredentialsStore } from '@/stores/credentials.store';\nimport { useEnvironmentsStore } from '@/stores/environments.ee.store';\nimport { useExternalSecretsStore } from '@/stores/externalSecrets.ee.store';\nimport { useHistoryStore } from '@/stores/history.store';\nimport { useNDVStore } from '@/stores/ndv.store';\nimport { useNodeCreatorStore } from '@/stores/nodeCreator.store';\nimport { useNodeTypesStore } from '@/stores/nodeTypes.store';\nimport { usePushConnectionStore } from '@/stores/pushConnection.store';\nimport { useRootStore } from '@/stores/n8nRoot.store';\nimport { useSegment } from '@/stores/segment.store';\nimport { useSettingsStore } from '@/stores/settings.store';\nimport { useTagsStore } from '@/stores/tags.store';\nimport { useTemplatesStore } from '@/stores/templates.store';\nimport { useUIStore } from '@/stores/ui.store';\nimport { useUsersStore } from '@/stores/users.store';\nimport { useWorkflowsEEStore } from '@/stores/workflows.ee.store';\nimport { useWorkflowsStore } from '@/stores/workflows.store';\nimport * as NodeViewUtils from '@/utils/nodeViewUtils';\nimport { getAccountAge } from '@/utils/userUtils';\nimport { getConnectionInfo, getNodeViewTab } from '@/utils/canvasUtils';\nimport {\n\tAddConnectionCommand,\n\tAddNodeCommand,\n\tMoveNodeCommand,\n\tRemoveConnectionCommand,\n\tRemoveNodeCommand,\n\tRenameNodeCommand,\n\thistoryBus,\n} from '@/models/history';\nimport type { BrowserJsPlumbInstance } from '@jsplumb/browser-ui';\nimport {\n\tEVENT_ENDPOINT_MOUSEOVER,\n\tEVENT_ENDPOINT_MOUSEOUT,\n\tEVENT_DRAG_MOVE,\n\tEVENT_CONNECTION_DRAG,\n\tEVENT_CONNECTION_ABORT,\n\tEVENT_CONNECTION_MOUSEOUT,\n\tEVENT_CONNECTION_MOUSEOVER,\n\tready,\n} from '@jsplumb/browser-ui';\nimport type { N8nPlusEndpoint } from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport {\n\tN8nPlusEndpointType,\n\tEVENT_PLUS_ENDPOINT_CLICK,\n} from '@/plugins/jsplumb/N8nPlusEndpointType';\nimport type { N8nAddInputEndpoint } from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport {\n\tEVENT_ADD_INPUT_ENDPOINT_CLICK,\n\tN8nAddInputEndpointType,\n} from '@/plugins/jsplumb/N8nAddInputEndpointType';\nimport { sourceControlEventBus } from '@/event-bus/source-control';\nimport { getConnectorPaintStyleData, OVERLAY_ENDPOINT_ARROW_ID } from '@/utils/nodeViewUtils';\nimport { useViewStacks } from '@/components/Node/NodeCreator/composables/useViewStacks';\nimport { useExternalHooks } from '@/composables/useExternalHooks';\nimport { useClipboard } from '@/composables/useClipboard';\nimport { usePinnedData } from '@/composables/usePinnedData';\nimport { useSourceControlStore } from '@/stores/sourceControl.store';\nimport { useDeviceSupport } from 'n8n-design-system';\nimport { useDebounce } from '@/composables/useDebounce';\nimport { useExecutionsStore } from '@/stores/executions.store';\nimport { useCanvasPanning } from '@/composables/useCanvasPanning';\nimport { tryToParseNumber } from '@/utils/typesUtils';\nimport { useWorkflowHelpers } from '@/composables/useWorkflowHelpers';\nimport { useRunWorkflow } from '@/composables/useRunWorkflow';\nimport { useAIStore } from '@/stores/ai.store';\nimport { useStorage } from '@/composables/useStorage';\nimport { isJSPlumbEndpointElement } from '@/utils/typeGuards';\n\ninterface AddNodeOptions {\n\tposition?: XYPosition;\n\tdragAndDrop?: boolean;\n\tname?: string;\n}\n\nconst NodeCreation = defineAsyncComponent(\n\tasync () => await import('@/components/Node/NodeCreation.vue'),\n);\nconst CanvasControls = defineAsyncComponent(\n\tasync () => await import('@/components/CanvasControls.vue'),\n);\nconst SetupWorkflowCredentialsButton = defineAsyncComponent(\n\tasync () =>\n\t\tawait import('@/components/SetupWorkflowCredentialsButton/SetupWorkflowCredentialsButton.vue'),\n);\n\nexport default defineComponent({\n\tname: 'NodeView',\n\tcomponents: {\n\t\tNodeDetailsView,\n\t\tNode,\n\t\tSticky,\n\t\tCanvasAddButton,\n\t\tKeyboardShortcutTooltip,\n\t\tNodeCreation,\n\t\tCanvasControls,\n\t\tContextMenu,\n\t\tSetupWorkflowCredentialsButton,\n\t\tNextStepPopup,\n\t},\n\tasync beforeRouteLeave(to, from, next) {\n\t\tif (\n\t\t\tgetNodeViewTab(to) === MAIN_HEADER_TABS.EXECUTIONS ||\n\t\t\tfrom.name === VIEWS.TEMPLATE_IMPORT ||\n\t\t\t(getNodeViewTab(to) === MAIN_HEADER_TABS.WORKFLOW && from.name === VIEWS.EXECUTION_DEBUG)\n\t\t) {\n\t\t\tnext();\n\t\t\treturn;\n\t\t}\n\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t{\n\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t),\n\t\t\t\t\tshowClose: true,\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t// Make sure workflow id is empty when leaving the editor\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow({}, false);\n\t\t\t\tif (saved) {\n\t\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\t\t\t\t}\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\tif (from.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\t// Replace the current route with the new workflow route\n\t\t\t\t\t// before navigating to the new route when saving new workflow.\n\t\t\t\t\tawait this.$router.replace(\n\t\t\t\t\t\t{ name: VIEWS.WORKFLOW, params: { name: this.currentWorkflow } },\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t// We can't use next() here since vue-router\n\t\t\t\t\t\t\t// would prevent the navigation with an error\n\t\t\t\t\t\t\tvoid this.$router.push(to as RawLocation);\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t} else if (confirmModal === MODAL_CANCEL) {\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\t\tthis.resetWorkspace();\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\tnext();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.currentWorkflow);\n\t\t\tnext();\n\t\t}\n\t},\n\tsetup() {\n\t\tconst nodeViewRootRef = ref(null);\n\t\tconst nodeViewRef = ref(null);\n\t\tconst onMouseMoveEnd = ref(null);\n\t\tconst router = useRouter();\n\n\t\tconst ndvStore = useNDVStore();\n\t\tconst externalHooks = useExternalHooks();\n\t\tconst locale = useI18n();\n\t\tconst contextMenu = useContextMenu();\n\t\tconst dataSchema = useDataSchema();\n\t\tconst nodeHelpers = useNodeHelpers();\n\t\tconst clipboard = useClipboard();\n\t\tconst { activeNode } = storeToRefs(ndvStore);\n\t\tconst pinnedData = usePinnedData(activeNode);\n\t\tconst deviceSupport = useDeviceSupport();\n\t\tconst { callDebounced } = useDebounce();\n\t\tconst canvasPanning = useCanvasPanning(nodeViewRootRef, { onMouseMoveEnd });\n\t\tconst workflowHelpers = useWorkflowHelpers({ router });\n\t\tconst { runWorkflow, stopCurrentExecution } = useRunWorkflow({ router });\n\n\t\treturn {\n\t\t\tlocale,\n\t\t\tcontextMenu,\n\t\t\tdataSchema,\n\t\t\tnodeHelpers,\n\t\t\texternalHooks,\n\t\t\tclipboard,\n\t\t\tpinnedData,\n\t\t\tdeviceSupport,\n\t\t\tcanvasPanning,\n\t\t\tnodeViewRootRef,\n\t\t\tnodeViewRef,\n\t\t\tonMouseMoveEnd,\n\t\t\tworkflowHelpers,\n\t\t\trunWorkflow,\n\t\t\tstopCurrentExecution,\n\t\t\tcallDebounced,\n\t\t\t...useCanvasMouseSelect(),\n\t\t\t...useGlobalLinkActions(),\n\t\t\t...useTitleChange(),\n\t\t\t...useToast(),\n\t\t\t...useMessage(),\n\t\t\t...useUniqueNodeName(),\n\t\t\t...useExecutionDebugging(),\n\t\t};\n\t},\n\twatch: {\n\t\t// Listen to route changes and load the workflow accordingly\n\t\tasync $route(to: Route, from: Route) {\n\t\t\tthis.readOnlyEnvRouteCheck();\n\n\t\t\tconst currentTab = getNodeViewTab(to);\n\t\t\tconst nodeViewNotInitialized = !this.uiStore.nodeViewInitialized;\n\t\t\tlet workflowChanged =\n\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t// Both 'new' and __EMPTY__ are new workflow names, so ignore them when detecting if wf changed\n\t\t\t\t!(from.params.name === 'new' && this.currentWorkflow === PLACEHOLDER_EMPTY_WORKFLOW_ID) &&\n\t\t\t\t!(from.name === VIEWS.NEW_WORKFLOW) &&\n\t\t\t\t// Also ignore if workflow id changes when saving new workflow\n\t\t\t\tto.params.action !== 'workflowSave';\n\t\t\tconst isOpeningTemplate = to.name === VIEWS.TEMPLATE_IMPORT;\n\n\t\t\t// When entering this tab:\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW || isOpeningTemplate) {\n\t\t\t\tif (workflowChanged || nodeViewNotInitialized || isOpeningTemplate) {\n\t\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\t\tif (nodeViewNotInitialized) {\n\t\t\t\t\t\tconst previousDirtyState = this.uiStore.stateIsDirty;\n\t\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\t\tthis.uiStore.stateIsDirty = previousDirtyState;\n\t\t\t\t\t}\n\t\t\t\t\tawait Promise.all([this.loadCredentials(), this.initView()]);\n\t\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\t\tif (this.blankRedirect) {\n\t\t\t\t\t\tthis.blankRedirect = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.checkAndInitDebugMode();\n\t\t\t}\n\t\t\t// Also, when landing on executions tab, check if workflow data is changed\n\t\t\tif (currentTab === MAIN_HEADER_TABS.EXECUTIONS) {\n\t\t\t\tworkflowChanged =\n\t\t\t\t\tfrom.params.name !== to.params.name &&\n\t\t\t\t\t!(to.params.name === 'new' && from.params.name === undefined);\n\t\t\t\tif (workflowChanged) {\n\t\t\t\t\t// This will trigger node view to update next time workflow tab is opened\n\t\t\t\t\tthis.uiStore.nodeViewInitialized = false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tactiveNode() {\n\t\t\t// When a node gets set as active deactivate the create-menu\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tcontainsTrigger(containsTrigger) {\n\t\t\t// Re-center CanvasAddButton if there's no triggers\n\t\t\tif (containsTrigger === false)\n\t\t\t\tthis.canvasStore.setRecenteredCanvasAddButtonPosition(this.getNodeViewOffsetPosition);\n\t\t},\n\t\tnodeViewScale(newScale) {\n\t\t\tconst elementRef = this.nodeViewRef as HTMLDivElement | undefined;\n\t\t\tif (elementRef) {\n\t\t\t\telementRef.style.transform = `scale(${newScale})`;\n\t\t\t}\n\t\t},\n\t},\n\terrorCaptured: (err, vm, info) => {\n\t\tconsole.error('errorCaptured');\n\t\tconsole.error(err);\n\t},\n\tcomputed: {\n\t\t...mapStores(\n\t\t\tuseCanvasStore,\n\t\t\tuseTagsStore,\n\t\t\tuseCredentialsStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseNodeTypesStore,\n\t\t\tuseNDVStore,\n\t\t\tuseRootStore,\n\t\t\tuseSettingsStore,\n\t\t\tuseTemplatesStore,\n\t\t\tuseUIStore,\n\t\t\tuseWorkflowsStore,\n\t\t\tuseUsersStore,\n\t\t\tuseNodeCreatorStore,\n\t\t\tuseEnvironmentsStore,\n\t\t\tuseWorkflowsEEStore,\n\t\t\tuseHistoryStore,\n\t\t\tuseExternalSecretsStore,\n\t\t\tuseCollaborationStore,\n\t\t\tusePushConnectionStore,\n\t\t\tuseSourceControlStore,\n\t\t\tuseExecutionsStore,\n\t\t\tuseAIStore,\n\t\t),\n\t\tnativelyNumberSuffixedDefaults(): string[] {\n\t\t\treturn this.nodeTypesStore.nativelyNumberSuffixedDefaults;\n\t\t},\n\t\tcurrentUser(): IUser | null {\n\t\t\treturn this.usersStore.currentUser;\n\t\t},\n\t\tactiveNode(): INodeUi | null {\n\t\t\treturn this.ndvStore.activeNode;\n\t\t},\n\t\texecutionWaitingForWebhook(): boolean {\n\t\t\treturn this.workflowsStore.executionWaitingForWebhook;\n\t\t},\n\t\tisDemo(): boolean {\n\t\t\treturn this.$route.name === VIEWS.DEMO;\n\t\t},\n\t\tshowCanvasAddButton(): boolean {\n\t\t\treturn !this.isLoading && !this.containsTrigger && !this.isDemo && !this.readOnlyEnv;\n\t\t},\n\t\tlastSelectedNode(): INodeUi | null {\n\t\t\treturn this.uiStore.getLastSelectedNode;\n\t\t},\n\t\tnodes(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes;\n\t\t},\n\t\tnodesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type !== STICKY_NODE_TYPE);\n\t\t},\n\t\tstickiesToRender(): INodeUi[] {\n\t\t\treturn this.workflowsStore.allNodes.filter((node) => node.type === STICKY_NODE_TYPE);\n\t\t},\n\t\trunButtonText(): string {\n\t\t\tif (!this.workflowRunning) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executeWorkflow');\n\t\t\t}\n\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\treturn this.$locale.baseText('nodeView.runButtonText.waitingForTriggerEvent');\n\t\t\t}\n\n\t\t\treturn this.$locale.baseText('nodeView.runButtonText.executingWorkflow');\n\t\t},\n\t\tworkflowStyle(): object {\n\t\t\tconst offsetPosition = this.uiStore.nodeViewOffsetPosition;\n\t\t\treturn {\n\t\t\t\tleft: offsetPosition[0] + 'px',\n\t\t\t\ttop: offsetPosition[1] + 'px',\n\t\t\t};\n\t\t},\n\t\tcanvasAddButtonStyle(): object {\n\t\t\treturn {\n\t\t\t\t'pointer-events': this.createNodeActive ? 'none' : 'all',\n\t\t\t};\n\t\t},\n\t\tbackgroundStyle(): object {\n\t\t\treturn NodeViewUtils.getBackgroundStyles(\n\t\t\t\tthis.nodeViewScale,\n\t\t\t\tthis.uiStore.nodeViewOffsetPosition,\n\t\t\t\tthis.isExecutionPreview,\n\t\t\t);\n\t\t},\n\t\tworkflowClasses() {\n\t\t\tconst returnClasses = [];\n\t\t\tif (this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\tif (this.uiStore.nodeViewMoveInProgress) {\n\t\t\t\t\treturnClasses.push('move-in-process');\n\t\t\t\t} else {\n\t\t\t\t\treturnClasses.push('move-active');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.selectActive || this.ctrlKeyPressed || this.moveCanvasKeyPressed) {\n\t\t\t\t// Makes sure that nothing gets selected while select or move is active\n\t\t\t\treturnClasses.push('do-not-select');\n\t\t\t}\n\n\t\t\tif (this.connectionDragScope.type) {\n\t\t\t\treturnClasses.push('connection-drag-scope-active');\n\t\t\t\treturnClasses.push(`connection-drag-scope-active-type-${this.connectionDragScope.type}`);\n\t\t\t\treturnClasses.push(\n\t\t\t\t\t`connection-drag-scope-active-connection-${this.connectionDragScope.connection}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn returnClasses;\n\t\t},\n\t\tworkflowExecution(): IExecutionResponse | null {\n\t\t\treturn this.workflowsStore.getWorkflowExecution;\n\t\t},\n\t\tworkflowRunning(): boolean {\n\t\t\treturn this.uiStore.isActionActive('workflowRunning');\n\t\t},\n\t\tcurrentWorkflow(): string {\n\t\t\treturn this.$route.params.name || this.workflowsStore.workflowId;\n\t\t},\n\t\tworkflowName(): string {\n\t\t\treturn this.workflowsStore.workflowName;\n\t\t},\n\t\tallTriggersDisabled(): boolean {\n\t\t\tconst disabledTriggerNodes = this.triggerNodes.filter((node) => node.disabled);\n\t\t\treturn disabledTriggerNodes.length === this.triggerNodes.length;\n\t\t},\n\t\ttriggerNodes(): INodeUi[] {\n\t\t\treturn this.nodes.filter(\n\t\t\t\t(node) => node.type === START_NODE_TYPE || this.nodeTypesStore.isTriggerNode(node.type),\n\t\t\t);\n\t\t},\n\t\tcontainsTrigger(): boolean {\n\t\t\treturn this.triggerNodes.length > 0;\n\t\t},\n\t\tcontainsChatNodes(): boolean {\n\t\t\treturn (\n\t\t\t\t!this.executionWaitingForWebhook &&\n\t\t\t\t!!this.nodes.find(\n\t\t\t\t\t(node) =>\n\t\t\t\t\t\t[MANUAL_CHAT_TRIGGER_NODE_TYPE, CHAT_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.disabled !== true,\n\t\t\t\t)\n\t\t\t);\n\t\t},\n\t\tisManualChatOnly(): boolean {\n\t\t\treturn this.containsChatNodes && this.triggerNodes.length === 1;\n\t\t},\n\t\tisExecutionDisabled(): boolean {\n\t\t\tif (\n\t\t\t\tthis.containsChatNodes &&\n\t\t\t\tthis.triggerNodes.every((node) => node.disabled || node.type === CHAT_TRIGGER_NODE_TYPE)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !this.containsTrigger || this.allTriggersDisabled;\n\t\t},\n\t\tgetNodeViewOffsetPosition(): XYPosition {\n\t\t\treturn this.uiStore.nodeViewOffsetPosition;\n\t\t},\n\t\tnodeViewScale(): number {\n\t\t\treturn this.canvasStore.nodeViewScale;\n\t\t},\n\t\tinstance(): BrowserJsPlumbInstance {\n\t\t\treturn this.canvasStore.jsPlumbInstance;\n\t\t},\n\t\tisLoading(): boolean {\n\t\t\treturn this.canvasStore.isLoading;\n\t\t},\n\t\tcurrentWorkflowObject(): Workflow {\n\t\t\treturn this.workflowsStore.getCurrentWorkflow();\n\t\t},\n\t\treadOnlyEnv(): boolean {\n\t\t\treturn this.sourceControlStore.preferences.branchReadOnly;\n\t\t},\n\t\tisReadOnlyRoute() {\n\t\t\treturn this.$route?.meta?.readOnlyCanvas === true;\n\t\t},\n\t\tisNextStepPopupVisible(): boolean {\n\t\t\treturn this.aiStore.nextStepPopupConfig.open;\n\t\t},\n\t\tshouldShowNextStepDialog(): boolean {\n\t\t\tconst userHasSeenAIAssistantExperiment =\n\t\t\t\tuseStorage(AI_ASSISTANT_LOCAL_STORAGE_KEY).value === 'true';\n\t\t\tconst experimentEnabled = this.aiStore.isAssistantExperimentEnabled;\n\t\t\tconst isCloudDeployment = this.settingsStore.isCloudDeployment;\n\t\t\treturn isCloudDeployment && experimentEnabled && !userHasSeenAIAssistantExperiment;\n\t\t},\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tGRID_SIZE: NodeViewUtils.GRID_SIZE,\n\t\t\tSTICKY_NODE_TYPE,\n\t\t\tcreateNodeActive: false,\n\t\t\tlastClickPosition: [450, 450] as XYPosition,\n\t\t\tctrlKeyPressed: false,\n\t\t\tmoveCanvasKeyPressed: false,\n\t\t\tstopExecutionInProgress: false,\n\t\t\tblankRedirect: false,\n\t\t\tcredentialsUpdated: false,\n\t\t\tpullConnActiveNodeName: null as string | null,\n\t\t\tpullConnActive: false,\n\t\t\tdropPrevented: false,\n\t\t\tconnectionDragScope: {\n\t\t\t\ttype: null,\n\t\t\t\tconnection: null,\n\t\t\t} as { type: string | null; connection: 'source' | 'target' | null },\n\t\t\trenamingActive: false,\n\t\t\tshowStickyButton: false,\n\t\t\tisExecutionPreview: false,\n\t\t\tshowTriggerMissingTooltip: false,\n\t\t\tworkflowData: null as INewWorkflowData | null,\n\t\t\tactiveConnection: null as null | Connection,\n\t\t\tisInsertingNodes: false,\n\t\t\tisProductionExecutionPreview: false,\n\t\t\tenterTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\texitTimer: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\treadOnlyNotification: null as null | typeof ElNotification,\n\t\t\t// jsplumb automatically deletes all loose connections which is in turn recorded\n\t\t\t// in undo history as a user action.\n\t\t\t// This should prevent automatically removed connections from populating undo stack\n\t\t\tsuspendRecordingDetachedConnections: false,\n\t\t\tNODE_CREATOR_OPEN_SOURCES,\n\t\t\teventsAttached: false,\n\t\t\tunloadTimeout: undefined as undefined | ReturnType<typeof setTimeout>,\n\t\t\tcanOpenNDV: true,\n\t\t\thideNodeIssues: false,\n\t\t};\n\t},\n\tasync mounted() {\n\t\t// To be refactored (unref) when migrating to composition API\n\t\tthis.onMouseMoveEnd = this.mouseUp;\n\n\t\tthis.resetWorkspace();\n\t\tthis.canvasStore.initInstance(this.nodeViewRef as HTMLElement);\n\t\tthis.titleReset();\n\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\n\t\tthis.clipboard.onPaste.value = this.onClipboardPasteEvent;\n\n\t\tthis.canvasStore.startLoading();\n\n\t\tconst loadPromises = (() => {\n\t\t\tif (this.settingsStore.isPreviewMode && this.isDemo) return [];\n\t\t\tconst promises = [\n\t\t\t\tthis.loadActiveWorkflows(),\n\t\t\t\tthis.loadCredentials(),\n\t\t\t\tthis.loadCredentialTypes(),\n\t\t\t];\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Variables)) {\n\t\t\t\tpromises.push(this.loadVariables());\n\t\t\t}\n\t\t\tif (this.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.ExternalSecrets)) {\n\t\t\t\tpromises.push(this.loadSecrets());\n\t\t\t}\n\t\t\treturn promises;\n\t\t})();\n\n\t\tif (this.nodeTypesStore.allNodeTypes.length === 0) {\n\t\t\tloadPromises.push(this.loadNodeTypes());\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all(loadPromises);\n\t\t} catch (error) {\n\t\t\tthis.showError(\n\t\t\t\terror,\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.title'),\n\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted1.message') + ':',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tready(async () => {\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tthis.bindCanvasEvents();\n\t\t\t\t} catch {} // This will break if mounted after jsplumb has been initiated from executions preview, so continue if it breaks\n\t\t\t\tawait this.initView();\n\t\t\t\tif (window.parent) {\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\tJSON.stringify({ command: 'n8nReady', version: this.rootStore.versionCli }),\n\t\t\t\t\t\t'*',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.title'),\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.mounted2.message') + ':',\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tvoid this.usersStore.showPersonalizationSurvey();\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t}, 0);\n\t\t});\n\n\t\t// TODO: This currently breaks since front-end hooks are still not updated to work with pinia store\n\t\tvoid this.externalHooks.run('nodeView.mount').catch((e) => {});\n\n\t\tif (\n\t\t\tthis.currentUser?.personalizationAnswers !== null &&\n\t\t\tthis.settingsStore.onboardingCallPromptEnabled &&\n\t\t\tthis.currentUser &&\n\t\t\tgetAccountAge(this.currentUser) <= ONBOARDING_PROMPT_TIMEBOX\n\t\t) {\n\t\t\tconst onboardingResponse = await this.uiStore.getNextOnboardingPrompt();\n\t\t\tconst promptTimeout =\n\t\t\t\tonboardingResponse?.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000;\n\n\t\t\tif (onboardingResponse?.title && onboardingResponse?.description) {\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\ttype: 'info',\n\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\tmessage: onboardingResponse.description,\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\tcustomClass: 'clickable',\n\t\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\tthis.$telemetry.track('user clicked onboarding toast', {\n\t\t\t\t\t\t\t\tseq_num: onboardingResponse.toast_sequence_number,\n\t\t\t\t\t\t\t\ttitle: onboardingResponse.title,\n\t\t\t\t\t\t\t\tdescription: onboardingResponse.description,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}, promptTimeout);\n\t\t\t}\n\t\t}\n\n\t\tsourceControlEventBus.on('pull', this.onSourceControlPull);\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openNodeDetail',\n\t\t\taction: ({ node }: { node: string }) => {\n\t\t\t\tthis.nodeSelectedByName(node, true);\n\t\t\t},\n\t\t});\n\n\t\tthis.registerCustomAction({\n\t\t\tkey: 'openSelectiveNodeCreator',\n\t\t\taction: this.openSelectiveNodeCreator,\n\t\t});\n\n\t\tthis.readOnlyEnvRouteCheck();\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tactivated() {\n\t\tconst openSideMenu = this.uiStore.addFirstStepOnLoad;\n\t\tif (openSideMenu) {\n\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t}\n\t\tthis.uiStore.addFirstStepOnLoad = false;\n\t\tthis.bindCanvasEvents();\n\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\tdocument.addEventListener('keyup', this.keyUp);\n\t\twindow.addEventListener('message', this.onPostMessageReceived);\n\t\twindow.addEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.on('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.on('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.on('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.on('openChat', this.onOpenChat);\n\t\thistoryBus.on('nodeMove', this.onMoveNode);\n\t\thistoryBus.on('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.on('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.on('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.on('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.on('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.on('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.on('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.on('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.on('saveWorkflow', this.saveCurrentWorkflowExternal);\n\n\t\tthis.canvasStore.isDemo = this.isDemo;\n\t},\n\tdeactivated() {\n\t\tthis.unbindCanvasEvents();\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\twindow.removeEventListener('beforeunload', this.onBeforeUnload);\n\t\twindow.removeEventListener('pageshow', this.onPageShow);\n\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tnodeViewEventBus.off('openChat', this.onOpenChat);\n\t\thistoryBus.off('nodeMove', this.onMoveNode);\n\t\thistoryBus.off('revertAddNode', this.onRevertAddNode);\n\t\thistoryBus.off('revertRemoveNode', this.onRevertRemoveNode);\n\t\thistoryBus.off('revertAddConnection', this.onRevertAddConnection);\n\t\thistoryBus.off('revertRemoveConnection', this.onRevertRemoveConnection);\n\t\thistoryBus.off('revertRenameNode', this.onRevertNameChange);\n\t\thistoryBus.off('enableNodeToggle', this.onRevertEnableToggle);\n\n\t\tdataPinningEventBus.off('pin-data', this.addPinDataConnections);\n\t\tdataPinningEventBus.off('unpin-data', this.removePinDataConnections);\n\t\tnodeViewEventBus.off('saveWorkflow', this.saveCurrentWorkflowExternal);\n\t},\n\tbeforeMount() {\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushConnect();\n\t\t}\n\t\tthis.collaborationStore.initialize();\n\t},\n\tbeforeUnmount() {\n\t\t// Make sure the event listeners get removed again else we\n\t\t// could add up with them registered multiple times\n\t\tdocument.removeEventListener('keydown', this.keyDown);\n\t\tdocument.removeEventListener('keyup', this.keyUp);\n\t\tthis.unregisterCustomAction('showNodeCreator');\n\t\tthis.unregisterCustomAction('openNodeDetail');\n\t\tthis.unregisterCustomAction('openSelectiveNodeCreator');\n\n\t\tif (!this.isDemo) {\n\t\t\tthis.pushStore.pushDisconnect();\n\t\t}\n\t\tthis.collaborationStore.terminate();\n\n\t\tthis.resetWorkspace();\n\t\tthis.instance.unbind();\n\t\tthis.instance.destroy();\n\t\tthis.uiStore.stateIsDirty = false;\n\t\tthis.workflowsStore.resetChatMessages();\n\t\twindow.removeEventListener('message', this.onPostMessageReceived);\n\t\tnodeViewEventBus.off('newWorkflow', this.newWorkflow);\n\t\tnodeViewEventBus.off('importWorkflowData', this.onImportWorkflowDataEvent);\n\t\tnodeViewEventBus.off('importWorkflowUrl', this.onImportWorkflowUrlEvent);\n\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\tsourceControlEventBus.off('pull', this.onSourceControlPull);\n\t},\n\tmethods: {\n\t\tasync openSelectiveNodeCreator({\n\t\t\tconnectiontype,\n\t\t\tnode,\n\t\t\tcreatorview,\n\t\t}: {\n\t\t\tconnectiontype: ConnectionTypes;\n\t\t\tnode: string;\n\t\t\tcreatorview?: string;\n\t\t}) {\n\t\t\tconst nodeName = node ?? this.ndvStore.activeNodeName;\n\t\t\tconst nodeData = nodeName ? this.workflowsStore.getNodeByName(nodeName) : null;\n\n\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\tawait this.redrawNode(node);\n\t\t\t// Wait for UI to update\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (creatorview) {\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tcreateNodeActive: true,\n\t\t\t\t\t\tnodeCreatorView: creatorview,\n\t\t\t\t\t});\n\t\t\t\t} else if (connectiontype && nodeData) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\tendpointUuid: `${nodeData.id}-input${connectiontype}0`,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NOTICE_ERROR_MESSAGE,\n\t\t\t\t\t\toutputType: connectiontype,\n\t\t\t\t\t\tsourceId: nodeData.id,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\teditAllowedCheck(): boolean {\n\t\t\tif (this.readOnlyNotification?.visible) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\tthis.readOnlyNotification = this.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${this.isReadOnlyRoute ? 'executions' : 'workflows'}.title`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.title',\n\t\t\t\t\t),\n\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\tthis.readOnlyEnv\n\t\t\t\t\t\t\t? `readOnlyEnv.showMessage.${\n\t\t\t\t\t\t\t\t\tthis.isReadOnlyRoute ? 'executions' : 'workflows'\n\t\t\t\t\t\t\t\t}.message`\n\t\t\t\t\t\t\t: 'readOnly.showMessage.executions.message',\n\t\t\t\t\t),\n\t\t\t\t\ttype: 'info',\n\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t});\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tshowTriggerMissingToltip(isVisible: boolean) {\n\t\t\tthis.showTriggerMissingTooltip = isVisible;\n\t\t},\n\t\tonRunNode(nodeName: string, source: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tconst telemetryPayload = {\n\t\t\t\tnode_type: node ? node.type : null,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\tsource: 'canvas',\n\t\t\t\tpush_ref: this.ndvStore.pushRef,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked execute node button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onRunNode', telemetryPayload);\n\t\t\tvoid this.runWorkflow({ destinationNode: nodeName, source });\n\t\t},\n\t\tasync onOpenChat() {\n\t\t\tconst telemetryPayload = {\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t};\n\t\t\tthis.$telemetry.track('User clicked chat open button', telemetryPayload);\n\t\t\tvoid this.externalHooks.run('nodeView.onOpenChat', telemetryPayload);\n\t\t\tthis.uiStore.openModal(WORKFLOW_LM_CHAT_MODAL_KEY);\n\t\t},\n\t\tasync onRunWorkflow() {\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst telemetryPayload = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t\tthis.$telemetry.track('User clicked execute workflow button', telemetryPayload);\n\t\t\t\tvoid this.externalHooks.run('nodeView.onRunWorkflow', telemetryPayload);\n\t\t\t});\n\n\t\t\tawait this.runWorkflow({});\n\t\t\tthis.refreshEndpointsErrorsState();\n\t\t},\n\t\tresetEndpointsErrors() {\n\t\t\tconst allEndpoints = Object.values(this.instance.getManagedElements()).flatMap(\n\t\t\t\t(el) => el.endpoints,\n\t\t\t);\n\n\t\t\tallEndpoints\n\t\t\t\t.filter((endpoint) => endpoint?.endpoint.type === N8nAddInputEndpointType)\n\t\t\t\t.forEach((endpoint) => {\n\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\tif (n8nAddInputEndpoint && (endpoint?.connections ?? []).length > 0) {\n\t\t\t\t\t\tn8nAddInputEndpoint.resetError();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trefreshEndpointsErrorsState() {\n\t\t\tconst nodeIssues = this.workflowsStore.allNodes.filter((n) => n.issues);\n\t\t\t// Set input color to red if there are issues\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tnodeIssues.forEach((node) => {\n\t\t\t\tconst managedNode = this.instance.getManagedElement(node.id);\n\t\t\t\tconst endpoints = this.instance.getEndpoints(managedNode);\n\n\t\t\t\tObject.keys(node?.issues?.input ?? {}).forEach((connectionType) => {\n\t\t\t\t\tconst inputEndpointsWithIssues = endpoints.filter(\n\t\t\t\t\t\t(e) => e._defaultType.scope === connectionType,\n\t\t\t\t\t);\n\t\t\t\t\tinputEndpointsWithIssues.forEach((endpoint) => {\n\t\t\t\t\t\tconst n8nAddInputEndpoint = endpoint?.endpoint as N8nAddInputEndpoint;\n\t\t\t\t\t\tif (n8nAddInputEndpoint) {\n\t\t\t\t\t\t\tn8nAddInputEndpoint.setError();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tonRunContainerClick() {\n\t\t\tif (this.containsTrigger && !this.allTriggersDisabled) return;\n\n\t\t\tconst message =\n\t\t\t\tthis.containsTrigger && this.allTriggersDisabled\n\t\t\t\t\t? this.$locale.baseText('nodeView.addOrEnableTriggerNode')\n\t\t\t\t\t: this.$locale.baseText('nodeView.addATriggerNodeFirst');\n\n\t\t\tthis.registerCustomAction({\n\t\t\t\tkey: 'showNodeCreator',\n\t\t\t\taction: () =>\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.NO_TRIGGER_EXECUTION_TOOLTIP),\n\t\t\t});\n\n\t\t\tconst notice = this.showMessage({\n\t\t\t\ttype: 'info',\n\t\t\t\ttitle: this.$locale.baseText('nodeView.cantExecuteNoTrigger'),\n\t\t\t\tmessage,\n\t\t\t\tduration: 3000,\n\t\t\t\tonClick: () =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t// Close the creator panel if user clicked on the link\n\t\t\t\t\t\tif (this.createNodeActive) notice.close();\n\t\t\t\t\t}, 0),\n\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t});\n\t\t},\n\t\tclearExecutionData() {\n\t\t\tthis.workflowsStore.workflowExecutionData = null;\n\t\t\tthis.nodeHelpers.updateNodesExecutionIssues();\n\t\t},\n\t\tasync onSaveKeyboardShortcut(e: KeyboardEvent) {\n\t\t\tlet saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tif (saved) {\n\t\t\t\tawait this.settingsStore.fetchPromptsData();\n\n\t\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\t\tawait this.$router.replace({\n\t\t\t\t\t\tname: VIEWS.WORKFLOW,\n\t\t\t\t\t\tparams: { name: this.currentWorkflow },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.activeNode) {\n\t\t\t\t// If NDV is open, save will not work from editable input fields\n\t\t\t\t// so don't show success message if this is true\n\t\t\t\tif (e.target instanceof HTMLInputElement) {\n\t\t\t\t\tsaved = e.target.readOnly;\n\t\t\t\t} else {\n\t\t\t\t\tsaved = true;\n\t\t\t\t}\n\t\t\t\tif (saved) {\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('generic.workflowSaved'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tasync onCanvasAddButtonCLick(event: PointerEvent) {\n\t\t\tif (event) {\n\t\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\t\tconst newNodeButton = (event.target as HTMLElement).closest('button');\n\t\t\t\t\tif (newNodeButton) {\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = null;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.firstStep'),\n\t\t\t\t\t\t\tnewNodeButton,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonNextStepSelected(action: string) {\n\t\t\tif (action === 'choose') {\n\t\t\t\tconst lastConnectionInfo = this.aiStore.latestConnectionInfo as NewConnectionInfo;\n\t\t\t\tif (lastConnectionInfo === null) {\n\t\t\t\t\tthis.showTriggerCreator(NODE_CREATOR_OPEN_SOURCES.TRIGGER_PLACEHOLDER_BUTTON);\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNodeAfterSelected(lastConnectionInfo);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowTriggerCreator(source: NodeCreatorOpenSource) {\n\t\t\tif (this.createNodeActive) return;\n\t\t\tthis.nodeCreatorStore.setSelectedView(TRIGGER_NODE_CREATOR_VIEW);\n\t\t\tthis.nodeCreatorStore.setShowScrim(true);\n\t\t\tthis.onToggleNodeCreator({ source, createNodeActive: true });\n\t\t},\n\t\tasync openExecution(executionId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tlet data: IExecutionResponse | undefined;\n\t\t\ttry {\n\t\t\t\tdata = await this.workflowsStore.getExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.openExecution.title'));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data === undefined) {\n\t\t\t\tthrow new Error(`Execution with id \"${executionId}\" could not be found!`);\n\t\t\t}\n\t\t\tthis.workflowsStore.setWorkflowName({\n\t\t\t\tnewName: data.workflowData.name,\n\t\t\t\tsetStateDirty: false,\n\t\t\t});\n\t\t\tthis.workflowsStore.setWorkflowId(PLACEHOLDER_EMPTY_WORKFLOW_ID);\n\t\t\tthis.workflowsStore.setWorkflowExecutionData(data);\n\t\t\tif (data.workflowData.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflowData.pinData);\n\t\t\t}\n\n\t\t\tif (data.workflowData.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\townedBy: data.workflowData.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\t\tsharedWith: data.workflowData.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (data.workflowData.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(data.workflowData.usedCredentials);\n\t\t\t}\n\n\t\t\tawait this.addNodes(\n\t\t\t\tdeepCopy(data.workflowData.nodes),\n\t\t\t\tdeepCopy(data.workflowData.connections),\n\t\t\t);\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tvoid this.externalHooks.run('execution.open', {\n\t\t\t\tworkflowId: data.workflowData.id,\n\t\t\t\tworkflowName: data.workflowData.name,\n\t\t\t\texecutionId,\n\t\t\t});\n\t\t\tthis.$telemetry.track('User opened read-only execution', {\n\t\t\t\tworkflow_id: data.workflowData.id,\n\t\t\t\texecution_mode: data.mode,\n\t\t\t\texecution_finished: data.finished,\n\t\t\t});\n\n\t\t\tif (!data.finished && data.data?.resultData?.error) {\n\t\t\t\t// Check if any node contains an error\n\t\t\t\tlet nodeErrorFound = false;\n\t\t\t\tif (data.data.resultData.runData) {\n\t\t\t\t\tconst runData = data.data.resultData.runData;\n\t\t\t\t\terrorCheck: for (const nodeName of Object.keys(runData)) {\n\t\t\t\t\t\tfor (const taskData of runData[nodeName]) {\n\t\t\t\t\t\t\tif (taskData.error) {\n\t\t\t\t\t\t\t\tnodeErrorFound = true;\n\t\t\t\t\t\t\t\tbreak errorCheck;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!nodeErrorFound && data.data.resultData.error.stack) {\n\t\t\t\t\t// Display some more information for now in console to make debugging easier\n\t\t\t\t\tconsole.error(`Execution ${executionId} error:`);\n\t\t\t\t\tconsole.error(data.data.resultData.error.stack);\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.workflowError'),\n\t\t\t\t\t\tmessage: data.data.resultData.error.message,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((data as ExecutionSummary).waitTill) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.thisExecutionHasntFinishedYet'),\n\t\t\t\t\tmessage: `<a data-action=\"reload\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.refresh',\n\t\t\t\t\t)}</a> ${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.toSeeTheLatestStatus',\n\t\t\t\t\t)}.<br/> <a href=\"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/\" target=\"_blank\">${this.$locale.baseText(\n\t\t\t\t\t\t'nodeView.moreInfo',\n\t\t\t\t\t)}</a>`,\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tduration: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync importWorkflowExact(data: { workflow: IWorkflowDataUpdate }) {\n\t\t\tif (!data.workflow.nodes || !data.workflow.connections) {\n\t\t\t\tthrow new Error('Invalid workflow object');\n\t\t\t}\n\t\t\tthis.resetWorkspace();\n\t\t\tdata.workflow.nodes = NodeViewUtils.getFixedNodesList(data.workflow.nodes);\n\n\t\t\tawait this.addNodes(data.workflow.nodes as INodeUi[], data.workflow.connections);\n\n\t\t\tif (data.workflow.pinData) {\n\t\t\t\tthis.workflowsStore.setWorkflowPinData(data.workflow.pinData);\n\t\t\t}\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync openWorkflowTemplate(templateId: string) {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.canvasStore.setLoadingText(this.$locale.baseText('nodeView.loadingTemplate'));\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tlet data: IWorkflowTemplate | undefined;\n\t\t\ttry {\n\t\t\t\tvoid this.externalHooks.run('template.requested', { templateId });\n\t\t\t\tdata = await this.templatesStore.getFixedWorkflowTemplate(templateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.workflowTemplateWithIdCouldNotBeFound', {\n\t\t\t\t\t\t\tinterpolate: { templateId },\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.couldntImportWorkflow'));\n\t\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$telemetry.track(\n\t\t\t\t'User inserted workflow template',\n\t\t\t\t{\n\t\t\t\t\tsource: 'workflow',\n\t\t\t\t\ttemplate_id: tryToParseNumber(templateId),\n\t\t\t\t\twf_template_repo_session_id: this.templatesStore.previousSessionId,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\twithPostHog: true,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.blankRedirect = true;\n\t\t\tawait this.$router.replace({ name: VIEWS.NEW_WORKFLOW, query: { templateId } });\n\n\t\t\tawait this.addNodes(data.workflow.nodes, data.workflow.connections);\n\t\t\tthis.workflowData = (await this.workflowsStore.getNewWorkflowData(data.name)) || {};\n\t\t\tthis.workflowsStore.addToWorkflowMetadata({ templateId });\n\t\t\tawait this.$nextTick();\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tvoid this.externalHooks.run('template.open', {\n\t\t\t\ttemplateId,\n\t\t\t\ttemplateName: data.name,\n\t\t\t\tworkflow: data.workflow,\n\t\t\t});\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync openWorkflow(workflow: IWorkflowDb) {\n\t\t\tthis.canvasStore.startLoading();\n\n\t\t\tconst selectedExecution = this.executionsStore.activeExecution;\n\n\t\t\tthis.resetWorkspace();\n\n\t\t\tthis.workflowsStore.addWorkflow(workflow);\n\t\t\tthis.workflowsStore.setActive(workflow.active || false);\n\t\t\tthis.workflowsStore.setWorkflowId(workflow.id);\n\t\t\tthis.workflowsStore.setWorkflowName({ newName: workflow.name, setStateDirty: false });\n\t\t\tthis.workflowsStore.setWorkflowSettings(workflow.settings || {});\n\t\t\tthis.workflowsStore.setWorkflowPinData(workflow.pinData || {});\n\t\t\tthis.workflowsStore.setWorkflowVersionId(workflow.versionId);\n\t\t\tthis.workflowsStore.setWorkflowMetadata(workflow.meta);\n\n\t\t\tif (workflow.ownedBy) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowOwnedBy({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\townedBy: workflow.ownedBy,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.sharedWith) {\n\t\t\t\tthis.workflowsEEStore.setWorkflowSharedWith({\n\t\t\t\t\tworkflowId: workflow.id,\n\t\t\t\t\tsharedWith: workflow.sharedWith,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (workflow.usedCredentials) {\n\t\t\t\tthis.workflowsStore.setUsedCredentials(workflow.usedCredentials);\n\t\t\t}\n\n\t\t\tconst tags = (workflow.tags || []) as ITag[];\n\t\t\tconst tagIds = tags.map((tag) => tag.id);\n\t\t\tthis.workflowsStore.setWorkflowTagIds(tagIds || []);\n\t\t\tthis.tagsStore.upsertTags(tags);\n\n\t\t\tawait this.addNodes(workflow.nodes, workflow.connections);\n\n\t\t\tif (!this.credentialsUpdated) {\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t}\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t\tvoid this.externalHooks.run('workflow.open', {\n\t\t\t\tworkflowId: workflow.id,\n\t\t\t\tworkflowName: workflow.name,\n\t\t\t});\n\t\t\tif (selectedExecution?.workflowId !== workflow.id) {\n\t\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\t} else {\n\t\t\t\tthis.executionsStore.activeExecution = selectedExecution;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\t\t\tthis.collaborationStore.notifyWorkflowOpened(workflow.id);\n\t\t},\n\t\ttouchTap(e: MouseEvent | TouchEvent) {\n\t\t\tif (this.deviceSupport.isTouchDevice) {\n\t\t\t\tthis.mouseDown(e);\n\t\t\t}\n\t\t},\n\t\tmouseDown(e: MouseEvent | TouchEvent) {\n\t\t\t// Save the location of the mouse click\n\t\t\tthis.lastClickPosition = this.getMousePositionWithinNodeView(e);\n\t\t\tif (e instanceof MouseEvent && e.button === 1) {\n\t\t\t\tthis.aiStore.closeNextStepPopup();\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t}\n\n\t\t\tthis.mouseDownMouseSelect(e as MouseEvent, this.moveCanvasKeyPressed);\n\t\t\tthis.canvasPanning.onMouseDown(e as MouseEvent, this.moveCanvasKeyPressed);\n\n\t\t\t// Hide the node-creator\n\t\t\tthis.createNodeActive = false;\n\t\t},\n\t\tmouseUp(e: MouseEvent) {\n\t\t\tif (e.button === 1) {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t\tthis.mouseUpMouseSelect(e);\n\t\t\tthis.canvasPanning.onMouseUp(e);\n\t\t},\n\t\tkeyUp(e: KeyboardEvent) {\n\t\t\tif (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = false;\n\t\t\t}\n\t\t\tif (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = false;\n\t\t\t}\n\t\t},\n\t\tasync keyDown(e: KeyboardEvent) {\n\t\t\tthis.contextMenu.close();\n\t\t\tthis.aiStore.closeNextStepPopup();\n\n\t\t\tconst ctrlModifier = this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst shiftModifier = e.shiftKey && !e.altKey && !this.deviceSupport.isCtrlKeyPressed(e);\n\t\t\tconst ctrlAltModifier = this.deviceSupport.isCtrlKeyPressed(e) && e.altKey && !e.shiftKey;\n\t\t\tconst noModifierKeys = !this.deviceSupport.isCtrlKeyPressed(e) && !e.shiftKey && !e.altKey;\n\t\t\tconst readOnly = this.isReadOnlyRoute || this.readOnlyEnv;\n\n\t\t\tif (e.key === 's' && ctrlModifier && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (this.isReadOnlyRoute || this.readOnlyEnv) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(this.onSaveKeyboardShortcut, { debounceTime: 1000 }, e);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\tconst path = e.path || (e.composedPath && e.composedPath());\n\n\t\t\t// Check if the keys got emitted from a message box or from something\n\t\t\t// else which should ignore the default keybindings\n\t\t\tfor (const element of path) {\n\t\t\t\tif (\n\t\t\t\t\telement.className &&\n\t\t\t\t\ttypeof element.className === 'string' &&\n\t\t\t\t\telement.className.includes('ignore-key-press')\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// el-dialog or el-message-box element is open\n\t\t\tif (window.document.body.classList.contains('el-popup-parent--hidden')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === 'Escape' && noModifierKeys) {\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t\tif (this.activeNode) {\n\t\t\t\t\tvoid this.externalHooks.run('dataDisplay.nodeEditingFinished');\n\t\t\t\t\tthis.ndvStore.activeNodeName = null;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// node modal is open\n\t\t\tif (this.activeNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectedNodes = this.uiStore.getSelectedNodes\n\t\t\t\t.map((node) => node && this.workflowsStore.getNodeByName(node.name))\n\t\t\t\t.filter((node) => !!node) as INode[];\n\n\t\t\tif (e.key === 'd' && noModifierKeys && !readOnly) {\n\t\t\t\tvoid this.callDebounced(this.toggleActivationNodes, { debounceTime: 350 }, selectedNodes);\n\t\t\t} else if (e.key === 'd' && ctrlModifier && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvoid this.duplicateNodes(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'p' && noModifierKeys && !readOnly) {\n\t\t\t\tif (selectedNodes.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.togglePinNodes(selectedNodes, 'keyboard-shortcut');\n\t\t\t\t}\n\t\t\t} else if ((e.key === 'Delete' || e.key === 'Backspace') && noModifierKeys && !readOnly) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.deleteNodes, { debounceTime: 500 }, selectedNodes);\n\t\t\t} else if (e.key === 'Tab' && noModifierKeys && !readOnly) {\n\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.TAB,\n\t\t\t\t\tcreateNodeActive: !this.createNodeActive && !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && ctrlModifier && !readOnly) {\n\t\t\t\tvoid this.onRunWorkflow();\n\t\t\t} else if (e.key === 'S' && shiftModifier && !readOnly) {\n\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t} else if (e.key === this.deviceSupport.controlKeyCode) {\n\t\t\t\tthis.ctrlKeyPressed = true;\n\t\t\t} else if (e.key === ' ') {\n\t\t\t\tthis.moveCanvasKeyPressed = true;\n\t\t\t} else if (e.key === 'F2' && noModifierKeys && !readOnly) {\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode !== null && lastSelectedNode.type !== STICKY_NODE_TYPE) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.renameNodePrompt,\n\t\t\t\t\t\t{ debounceTime: 1500 },\n\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'a' && ctrlModifier) {\n\t\t\t\t// Select all nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectAllNodes, { debounceTime: 1000 });\n\t\t\t} else if (e.key === 'c' && ctrlModifier) {\n\t\t\t\tvoid this.callDebounced(this.copyNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'x' && ctrlModifier && !readOnly) {\n\t\t\t\t// Cut nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.cutNodes, { debounceTime: 1000 }, selectedNodes);\n\t\t\t} else if (e.key === 'n' && ctrlAltModifier) {\n\t\t\t\t// Create a new workflow\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this.isDemo) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this.$router.currentRoute.name === VIEWS.NEW_WORKFLOW) {\n\t\t\t\t\tnodeViewEventBus.emit('newWorkflow');\n\t\t\t\t} else {\n\t\t\t\t\tvoid this.$router.push({ name: VIEWS.NEW_WORKFLOW });\n\t\t\t\t}\n\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.keyDown.title'),\n\t\t\t\t\ttype: 'success',\n\t\t\t\t});\n\t\t\t} else if (e.key === 'Enter' && noModifierKeys) {\n\t\t\t\t// Activate the last selected node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\t\tif (lastSelectedNode !== null) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tlastSelectedNode.type === STICKY_NODE_TYPE &&\n\t\t\t\t\t\t(this.isReadOnlyRoute || this.readOnlyEnv)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.ndvStore.activeNodeName = lastSelectedNode.name;\n\t\t\t\t}\n\t\t\t} else if (e.key === 'ArrowRight' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectDownstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowRight' && noModifierKeys) {\n\t\t\t\t// Set child node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = this.workflowsStore.outgoingConnectionsByNodeName(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t);\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (e.key === 'ArrowLeft' && shiftModifier) {\n\t\t\t\t// Select all downstream nodes\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvoid this.callDebounced(this.selectUpstreamNodes, {\n\t\t\t\t\tdebounceTime: 1000,\n\t\t\t\t});\n\t\t\t} else if (e.key === 'ArrowLeft' && noModifierKeys) {\n\t\t\t\t// Set parent node active\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (connections.main === undefined || connections.main.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\tconnections.main[0][0].node,\n\t\t\t\t\tfalse,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t} else if (['ArrowUp', 'ArrowDown'].includes(e.key) && noModifierKeys) {\n\t\t\t\t// Set sibling node as active\n\n\t\t\t\t// Check first if it has a parent node\n\t\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\t\tif (lastSelectedNode === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\tif (!workflow.connectionsByDestinationNode.hasOwnProperty(lastSelectedNode.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connections = workflow.connectionsByDestinationNode[lastSelectedNode.name];\n\n\t\t\t\tif (!Array.isArray(connections.main) || !connections.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst parentNode = connections.main[0][0].node;\n\t\t\t\tconst connectionsParent = this.workflowsStore.outgoingConnectionsByNodeName(parentNode);\n\n\t\t\t\tif (!Array.isArray(connectionsParent.main) || !connectionsParent.main.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get all the sibling nodes and their x positions to know which one to set active\n\t\t\t\tlet siblingNode: INodeUi | null;\n\t\t\t\tlet lastCheckedNodePosition = e.key === 'ArrowUp' ? -99999999 : 99999999;\n\t\t\t\tlet nextSelectNode: string | null = null;\n\t\t\t\tfor (const ouputConnections of connectionsParent.main) {\n\t\t\t\t\tfor (const ouputConnection of ouputConnections) {\n\t\t\t\t\t\tif (ouputConnection.node === lastSelectedNode.name) {\n\t\t\t\t\t\t\t// Ignore current node\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsiblingNode = this.workflowsStore.getNodeByName(ouputConnection.node);\n\n\t\t\t\t\t\tif (siblingNode) {\n\t\t\t\t\t\t\tif (e.key === 'ArrowUp') {\n\t\t\t\t\t\t\t\t// Get the next node on the left\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] <= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] > lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Get the next node on the right\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] >= lastSelectedNode.position[1] &&\n\t\t\t\t\t\t\t\t\tsiblingNode.position[1] < lastCheckedNodePosition\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tnextSelectNode = siblingNode.name;\n\t\t\t\t\t\t\t\t\tlastCheckedNodePosition = siblingNode.position[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nextSelectNode !== null) {\n\t\t\t\t\tvoid this.callDebounced(\n\t\t\t\t\t\tthis.nodeSelectedByName,\n\t\t\t\t\t\t{ debounceTime: 100 },\n\t\t\t\t\t\tnextSelectNode,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\ttoggleActivationNodes(nodes: INode[]) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.disableNodes(nodes, true);\n\t\t},\n\n\t\ttogglePinNodes(nodes: INode[], source: 'keyboard-shortcut' | 'context-menu') {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst nextStatePinned = nodes.some(\n\t\t\t\t(node) => !this.workflowsStore.pinDataByNodeName(node.name),\n\t\t\t);\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\tif (nextStatePinned) {\n\t\t\t\t\tconst dataToPin = this.dataSchema.getInputDataWithPinned(node);\n\t\t\t\t\tif (dataToPin.length !== 0) {\n\t\t\t\t\t\tpinnedDataForNode.setData(dataToPin, source);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpinnedDataForNode.unsetData(source);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\n\t\tdeleteNodes(nodes: INode[]) {\n\t\t\t// Copy \"selectedNodes\" as the nodes get deleted out of selection\n\t\t\t// when they get deleted and if we would use original it would mess\n\t\t\t// with the index and would so not delete all nodes\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tthis.removeNode(node.name, true, false);\n\t\t\t});\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}, 200);\n\t\t},\n\n\t\tselectAllNodes() {\n\t\t\tthis.nodes.forEach((node) => {\n\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t});\n\t\t},\n\n\t\tselectUpstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all upstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'upstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\t\tselectDownstreamNodes() {\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tif (lastSelectedNode === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.deselectAllNodes();\n\n\t\t\t// Get all downstream nodes and select them\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tlastSelectedNode.name,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tthis.nodeSelectedByName(nodeName);\n\t\t\t}\n\n\t\t\t// At the end select the previously selected node again\n\t\t\tthis.nodeSelectedByName(lastSelectedNode.name);\n\t\t},\n\n\t\tpushDownstreamNodes(sourceNodeName: string, margin: number, recordHistory = false) {\n\t\t\tconst sourceNode = this.workflowsStore.nodesByName[sourceNodeName];\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\tconst checkNodes = this.workflowHelpers.getConnectedNodes(\n\t\t\t\t'downstream',\n\t\t\t\tworkflow,\n\t\t\t\tsourceNodeName,\n\t\t\t);\n\t\t\tfor (const nodeName of checkNodes) {\n\t\t\t\tconst node = this.workflowsStore.nodesByName[nodeName];\n\t\t\t\tconst oldPosition = node.position;\n\n\t\t\t\tif (node.position[0] < sourceNode.position[0]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst updateInformation: INodeUpdatePropertiesInformation = {\n\t\t\t\t\tname: nodeName,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tposition: [node.position[0] + margin, node.position[1]],\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tthis.workflowsStore.updateNodeProperties(updateInformation);\n\t\t\t\tthis.onNodeMoved(node);\n\n\t\t\t\tif (\n\t\t\t\t\t(recordHistory && oldPosition[0] !== updateInformation.properties.position[0]) ||\n\t\t\t\t\toldPosition[1] !== updateInformation.properties.position[1]\n\t\t\t\t) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(\n\t\t\t\t\t\tnew MoveNodeCommand(nodeName, oldPosition, updateInformation.properties.position),\n\t\t\t\t\t\trecordHistory,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcutNodes(nodes: INode[]) {\n\t\t\tconst deleteCopiedNodes = !this.isReadOnlyRoute && !this.readOnlyEnv;\n\t\t\tthis.copyNodes(nodes, deleteCopiedNodes);\n\t\t\tif (deleteCopiedNodes) {\n\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t}\n\t\t},\n\n\t\tcopyNodes(nodes: INode[], isCut = false) {\n\t\t\tvoid this.getNodesToSave(nodes).then((data) => {\n\t\t\t\tconst workflowToCopy: IWorkflowToShare = {\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t...(this.workflowsStore.workflow.meta ?? {}),\n\t\t\t\t\t\tinstanceId: this.rootStore.instanceId,\n\t\t\t\t\t},\n\t\t\t\t\t...data,\n\t\t\t\t};\n\n\t\t\t\tthis.workflowHelpers.removeForeignCredentialsFromWorkflow(\n\t\t\t\t\tworkflowToCopy,\n\t\t\t\t\tthis.credentialsStore.allCredentials,\n\t\t\t\t);\n\n\t\t\t\tconst nodeData = JSON.stringify(workflowToCopy, null, 2);\n\n\t\t\t\tvoid this.clipboard.copy(nodeData);\n\t\t\t\tif (data.nodes.length > 0) {\n\t\t\t\t\tif (!isCut) {\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: 'Copied!',\n\t\t\t\t\t\t\tmessage: '',\n\t\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.$telemetry.track('User copied nodes', {\n\t\t\t\t\t\tnode_types: data.nodes.map((node) => node.type),\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tasync stopExecution() {\n\t\t\tconst executionId = this.workflowsStore.activeExecutionId;\n\t\t\tif (executionId === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tthis.stopExecutionInProgress = true;\n\t\t\t\tawait this.executionsStore.stopCurrentExecution(executionId);\n\t\t\t} catch (error) {\n\t\t\t\t// Execution stop might fail when the execution has already finished. Let's treat this here.\n\t\t\t\tconst execution = await this.workflowsStore.getExecution(executionId);\n\n\t\t\t\tif (execution === undefined) {\n\t\t\t\t\t// execution finished but was not saved (e.g. due to low connectivity)\n\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution({\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tdata: { finished: true, stoppedAt: new Date() },\n\t\t\t\t\t});\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\t\t\tthis.titleSet(this.workflowsStore.workflowName, 'IDLE');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.unsaved.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText(\n\t\t\t\t\t\t\t'nodeView.showMessage.stopExecutionCatch.unsaved.message',\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else if (execution?.finished) {\n\t\t\t\t\t// execution finished before it could be stopped\n\n\t\t\t\t\tconst executedData = {\n\t\t\t\t\t\tdata: execution.data,\n\t\t\t\t\t\tfinished: execution.finished,\n\t\t\t\t\t\tmode: execution.mode,\n\t\t\t\t\t\tstartedAt: execution.startedAt,\n\t\t\t\t\t\tstoppedAt: execution.stoppedAt,\n\t\t\t\t\t} as IRun;\n\t\t\t\t\tconst pushData = {\n\t\t\t\t\t\tdata: executedData,\n\t\t\t\t\t\texecutionId,\n\t\t\t\t\t\tretryOf: execution.retryOf,\n\t\t\t\t\t} as IPushDataExecutionFinished;\n\t\t\t\t\tthis.workflowsStore.finishActiveExecution(pushData);\n\t\t\t\t\tthis.titleSet(execution.workflowData.name, 'IDLE');\n\t\t\t\t\tthis.workflowsStore.executingNode.length = 0;\n\t\t\t\t\tthis.workflowsStore.setWorkflowExecutionData(executedData as IExecutionResponse);\n\t\t\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.title'),\n\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.stopExecutionCatch.message'),\n\t\t\t\t\t\ttype: 'success',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.stopExecution.title'));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.stopExecutionInProgress = false;\n\t\t\tvoid this.workflowHelpers.getWorkflowDataToSave().then((workflowData) => {\n\t\t\t\tconst trackProps = {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tnode_graph_string: JSON.stringify(\n\t\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t\t{ isCloudDeployment: this.settingsStore.isCloudDeployment },\n\t\t\t\t\t\t).nodeGraph,\n\t\t\t\t\t),\n\t\t\t\t};\n\n\t\t\t\tthis.$telemetry.track('User clicked stop workflow execution', trackProps);\n\t\t\t});\n\t\t},\n\n\t\tasync stopWaitingForWebhook() {\n\t\t\ttry {\n\t\t\t\tawait this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.stopWaitingForWebhook.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * This method gets called when data got pasted into the window\n\t\t */\n\t\tasync onClipboardPasteEvent(plainTextData: string): Promise<void> {\n\t\t\tif (this.readOnlyEnv) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst currentTab = getNodeViewTab(this.$route);\n\t\t\tif (currentTab === MAIN_HEADER_TABS.WORKFLOW) {\n\t\t\t\tlet workflowData: IWorkflowDataUpdate | undefined;\n\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Check if it is an URL which could contain workflow data\n\t\t\t\tif (plainTextData.match(/^http[s]?:\\/\\/.*\\.json$/i)) {\n\t\t\t\t\t// Pasted data points to a possible workflow JSON file\n\n\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst importConfirm = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.message', {\n\t\t\t\t\t\t\tinterpolate: { plainTextData },\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.$locale.baseText('nodeView.confirmMessage.onClipboardPasteEvent.headline'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'nodeView.confirmMessage.onClipboardPasteEvent.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tdangerouslyUseHTMLString: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tif (importConfirm !== MODAL_CONFIRM) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tworkflowData = await this.getWorkflowDataFromUrl(plainTextData);\n\t\t\t\t\tif (workflowData === undefined) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Pasted data is is possible workflow data\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Check first if it is valid JSON\n\t\t\t\t\t\tworkflowData = JSON.parse(plainTextData);\n\n\t\t\t\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// Is no valid JSON so ignore\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn await this.importWorkflowData(workflowData!, 'paste', false);\n\t\t\t}\n\t\t},\n\n\t\t// Returns the workflow data from a given URL. If no data gets found or\n\t\t// data is invalid it returns undefined and displays an error message by itself.\n\t\tasync getWorkflowDataFromUrl(url: string): Promise<IWorkflowDataUpdate | undefined> {\n\t\t\tlet workflowData: IWorkflowDataUpdate;\n\n\t\t\tthis.canvasStore.startLoading();\n\t\t\ttry {\n\t\t\t\tworkflowData = await this.workflowsStore.getWorkflowFromUrl(url);\n\t\t\t} catch (error) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t\tthis.showError(\n\t\t\t\t\terror,\n\t\t\t\t\tthis.$locale.baseText('nodeView.showError.getWorkflowDataFromUrl.title'),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.canvasStore.stopLoading();\n\n\t\t\treturn workflowData;\n\t\t},\n\n\t\t// Imports the given workflow data into the current workflow\n\t\tasync importWorkflowData(\n\t\t\tworkflowData: IWorkflowToShare,\n\t\t\tsource: string,\n\t\t\timportTags = true,\n\t\t): Promise<void> {\n\t\t\t// If it is JSON check if it looks on the first look like data we can use\n\t\t\tif (!workflowData.hasOwnProperty('nodes') || !workflowData.hasOwnProperty('connections')) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst nodeIdMap: { [prev: string]: string } = {};\n\t\t\t\tif (workflowData.nodes) {\n\t\t\t\t\tworkflowData.nodes.forEach((node: INode) => {\n\t\t\t\t\t\t//generate new webhookId if workflow already contains a node with the same webhookId\n\t\t\t\t\t\tif (node.webhookId && UPDATE_WEBHOOK_ID_NODE_TYPES.includes(node.type)) {\n\t\t\t\t\t\t\tconst isDuplicate = Object.values(\n\t\t\t\t\t\t\t\tthis.workflowHelpers.getCurrentWorkflow().nodes,\n\t\t\t\t\t\t\t).some((n) => n.webhookId === node.webhookId);\n\t\t\t\t\t\t\tif (isDuplicate) {\n\t\t\t\t\t\t\t\tnode.webhookId = uuid();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// set all new ids when pasting/importing workflows\n\t\t\t\t\t\tif (node.id) {\n\t\t\t\t\t\t\tconst newId = uuid();\n\t\t\t\t\t\t\tnodeIdMap[newId] = node.id;\n\t\t\t\t\t\t\tnode.id = newId;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.id = uuid();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.removeUnknownCredentials(workflowData);\n\n\t\t\t\tconst currInstanceId = this.rootStore.instanceId;\n\n\t\t\t\tconst nodeGraph = JSON.stringify(\n\t\t\t\t\tTelemetryHelpers.generateNodesGraph(\n\t\t\t\t\t\tworkflowData as IWorkflowBase,\n\t\t\t\t\t\tthis.workflowHelpers.getNodeTypes(),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnodeIdMap,\n\t\t\t\t\t\t\tsourceInstanceId:\n\t\t\t\t\t\t\t\tworkflowData.meta && workflowData.meta.instanceId !== currInstanceId\n\t\t\t\t\t\t\t\t\t? workflowData.meta.instanceId\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\tisCloudDeployment: this.settingsStore.isCloudDeployment,\n\t\t\t\t\t\t},\n\t\t\t\t\t).nodeGraph,\n\t\t\t\t);\n\t\t\t\tif (source === 'paste') {\n\t\t\t\t\tthis.$telemetry.track('User pasted nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else if (source === 'duplicate') {\n\t\t\t\t\tthis.$telemetry.track('User duplicated nodes', {\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.$telemetry.track('User imported workflow', {\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\t\tnode_graph_string: nodeGraph,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// By default we automatically deselect all the currently\n\t\t\t\t// selected nodes and select the new ones\n\t\t\t\tthis.deselectAllNodes();\n\n\t\t\t\t// Fix the node position as it could be totally offscreen\n\t\t\t\t// and the pasted nodes would so not be directly visible to\n\t\t\t\t// the user\n\t\t\t\tthis.workflowHelpers.updateNodePositions(\n\t\t\t\t\tworkflowData,\n\t\t\t\t\tNodeViewUtils.getNewNodePosition(this.nodes, this.lastClickPosition),\n\t\t\t\t);\n\n\t\t\t\tconst data = await this.addNodesToWorkflow(workflowData);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdata.nodes!.forEach((node: INodeUi) => {\n\t\t\t\t\t\tthis.nodeSelectedByName(node.name);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst tagsEnabled = this.settingsStore.areTagsEnabled;\n\t\t\t\tif (importTags && tagsEnabled && Array.isArray(workflowData.tags)) {\n\t\t\t\t\tconst allTags = await this.tagsStore.fetchAll();\n\t\t\t\t\tconst tagNames = new Set(allTags.map((tag) => tag.name));\n\n\t\t\t\t\tconst workflowTags = workflowData.tags as ITag[];\n\t\t\t\t\tconst notFound = workflowTags.filter((tag) => !tagNames.has(tag.name));\n\n\t\t\t\t\tconst creatingTagPromises: Array<Promise<ITag>> = [];\n\t\t\t\t\tfor (const tag of notFound) {\n\t\t\t\t\t\tconst creationPromise = this.tagsStore.create(tag.name).then((tag: ITag) => {\n\t\t\t\t\t\t\tallTags.push(tag);\n\t\t\t\t\t\t\treturn tag;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcreatingTagPromises.push(creationPromise);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait Promise.all(creatingTagPromises);\n\n\t\t\t\t\tconst tagIds = workflowTags.reduce((accu: string[], imported: ITag) => {\n\t\t\t\t\t\tconst tag = allTags.find((tag) => tag.name === imported.name);\n\t\t\t\t\t\tif (tag) {\n\t\t\t\t\t\t\taccu.push(tag.id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn accu;\n\t\t\t\t\t}, []);\n\n\t\t\t\t\tthis.workflowsStore.addWorkflowTagIds(tagIds);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.showError(error, this.$locale.baseText('nodeView.showError.importWorkflowData.title'));\n\t\t\t}\n\t\t},\n\n\t\tremoveUnknownCredentials(workflow: IWorkflowToShare) {\n\t\t\tif (!workflow?.nodes) return;\n\n\t\t\tfor (const node of workflow.nodes) {\n\t\t\t\tif (!node.credentials) continue;\n\n\t\t\t\tfor (const [name, credential] of Object.entries(node.credentials)) {\n\t\t\t\t\tif (credential.id === null) continue;\n\n\t\t\t\t\tif (!this.credentialsStore.getCredentialById(credential.id)) {\n\t\t\t\t\t\tdelete node.credentials[name];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonDragOver(event: DragEvent) {\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tasync onDrop(event: DragEvent) {\n\t\t\tif (!event.dataTransfer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst dropData = jsonParse<AddedNodesAndConnections>(\n\t\t\t\tevent.dataTransfer.getData(DRAG_EVENT_DATA_KEY),\n\t\t\t);\n\t\t\tif (dropData) {\n\t\t\t\tconst mousePosition = this.getMousePositionWithinNodeView(event);\n\t\t\t\tconst insertNodePosition = [\n\t\t\t\t\tmousePosition[0] - NodeViewUtils.NODE_SIZE / 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tmousePosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t] as XYPosition;\n\n\t\t\t\tawait this.onAddNodes(dropData, true, insertNodePosition);\n\t\t\t\tthis.createNodeActive = false;\n\t\t\t}\n\t\t},\n\n\t\tnodeDeselectedByName(nodeName: string) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeDeselected(node);\n\t\t\t}\n\t\t},\n\n\t\tnodeSelectedByName(nodeName: string, setActive = false, deselectAllOthers?: boolean) {\n\t\t\tif (deselectAllOthers === true) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeSelected(node);\n\t\t\t\tthis.uiStore.lastSelectedNode = node.name;\n\t\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = null;\n\t\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid = null;\n\t\t\t\tthis.canvasStore.lastSelectedConnection = null;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\t\tif (setActive) {\n\t\t\t\t\tthis.ndvStore.activeNodeName = node.name;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tshowMaxNodeTypeError(nodeTypeData: INodeTypeDescription) {\n\t\t\tconst maxNodes = nodeTypeData.maxNodes;\n\t\t\tthis.showMessage({\n\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.title'),\n\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.showMaxNodeTypeError.message', {\n\t\t\t\t\tadjustToNumber: maxNodes,\n\t\t\t\t\tinterpolate: { nodeTypeDataDisplayName: nodeTypeData.displayName },\n\t\t\t\t}),\n\t\t\t\ttype: 'error',\n\t\t\t\tduration: 0,\n\t\t\t});\n\t\t},\n\n\t\tasync getNewNodeWithDefaultCredential(\n\t\t\tnodeTypeData: INodeTypeDescription,\n\t\t\toverrides: Partial<INodeUi>,\n\t\t) {\n\t\t\tlet nodeVersion = nodeTypeData.defaultVersion;\n\n\t\t\tif (nodeVersion === undefined) {\n\t\t\t\tnodeVersion = Array.isArray(nodeTypeData.version)\n\t\t\t\t\t? nodeTypeData.version.slice(-1)[0]\n\t\t\t\t\t: nodeTypeData.version;\n\t\t\t}\n\n\t\t\tconst newNodeData: INodeUi = {\n\t\t\t\tid: uuid(),\n\t\t\t\tname: overrides.name ?? (nodeTypeData.defaults.name as string),\n\t\t\t\ttype: nodeTypeData.name,\n\t\t\t\ttypeVersion: nodeVersion,\n\t\t\t\tposition: [0, 0],\n\t\t\t\tparameters: {},\n\t\t\t};\n\n\t\t\tconst credentialPerType = nodeTypeData.credentials\n\t\t\t\t?.map((type) => this.credentialsStore.getUsableCredentialByType(type.name))\n\t\t\t\t.flat();\n\n\t\t\tif (credentialPerType && credentialPerType.length === 1) {\n\t\t\t\tconst defaultCredential = credentialPerType[0];\n\n\t\t\t\tconst selectedCredentials = this.credentialsStore.getCredentialById(defaultCredential.id);\n\t\t\t\tconst selected = { id: selectedCredentials.id, name: selectedCredentials.name };\n\t\t\t\tconst credentials = {\n\t\t\t\t\t[defaultCredential.type]: selected,\n\t\t\t\t};\n\n\t\t\t\tawait this.loadNodesProperties(\n\t\t\t\t\t[newNodeData].map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t\t);\n\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(newNodeData.type, newNodeData.typeVersion);\n\t\t\t\tconst nodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\tnodeType?.properties || [],\n\t\t\t\t\t{},\n\t\t\t\t\ttrue,\n\t\t\t\t\tfalse,\n\t\t\t\t\tnewNodeData,\n\t\t\t\t);\n\n\t\t\t\tif (nodeTypeData.credentials) {\n\t\t\t\t\tconst authentication = nodeTypeData.credentials.find(\n\t\t\t\t\t\t(type) => type.name === defaultCredential.type,\n\t\t\t\t\t);\n\t\t\t\t\tif (authentication?.displayOptions?.hide) {\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst authDisplayOptions = authentication?.displayOptions?.show;\n\t\t\t\t\tif (!authDisplayOptions) {\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\t\t\t\t\t\treturn newNodeData;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Object.keys(authDisplayOptions).length === 1 && authDisplayOptions.authentication) {\n\t\t\t\t\t\t// ignore complex case when there's multiple dependencies\n\t\t\t\t\t\tnewNodeData.credentials = credentials;\n\n\t\t\t\t\t\tlet parameters: { [key: string]: string } = {};\n\t\t\t\t\t\tfor (const displayOption of Object.keys(authDisplayOptions)) {\n\t\t\t\t\t\t\tif (nodeParameters && !nodeParameters[displayOption]) {\n\t\t\t\t\t\t\t\tparameters = {};\n\t\t\t\t\t\t\t\tnewNodeData.credentials = undefined;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst optionValue = authDisplayOptions[displayOption]?.[0];\n\t\t\t\t\t\t\tif (optionValue && typeof optionValue === 'string') {\n\t\t\t\t\t\t\t\tparameters[displayOption] = optionValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnewNodeData.parameters = {\n\t\t\t\t\t\t\t\t...newNodeData.parameters,\n\t\t\t\t\t\t\t\t...parameters,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn newNodeData;\n\t\t},\n\n\t\tasync injectNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tconst nodeTypeData: INodeTypeDescription | null =\n\t\t\t\tthis.nodeTypesStore.getNodeType(nodeTypeName);\n\n\t\t\tif (nodeTypeData === null) {\n\t\t\t\tthis.showMessage({\n\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showMessage.addNodeButton.title'),\n\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showMessage.addNodeButton.message', {\n\t\t\t\t\t\tinterpolate: { nodeTypeName },\n\t\t\t\t\t}),\n\t\t\t\t\ttype: 'error',\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tnodeTypeData.maxNodes !== undefined &&\n\t\t\t\tthis.workflowHelpers.getNodeTypeCount(nodeTypeName) >= nodeTypeData.maxNodes\n\t\t\t) {\n\t\t\t\tthis.showMaxNodeTypeError(nodeTypeData);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst newNodeData = await this.getNewNodeWithDefaultCredential(nodeTypeData, {\n\t\t\t\tname: options.name,\n\t\t\t});\n\n\t\t\t// when pulling new connection from node or injecting into a connection\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\n\t\t\tif (options.position) {\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\tthis.canvasStore.getNodesWithPlaceholderNode(),\n\t\t\t\t\toptions.position,\n\t\t\t\t);\n\t\t\t} else if (lastSelectedNode) {\n\t\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t// set when injecting into a connection\n\t\t\t\t\tconst [diffX] = NodeViewUtils.getConnectorLengths(lastSelectedConnection);\n\t\t\t\t\tif (diffX <= NodeViewUtils.MAX_X_TO_PUSH_DOWNSTREAM_NODES) {\n\t\t\t\t\t\tthis.pushDownstreamNodes(\n\t\t\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\t\t\tNodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\ttrackHistory,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// set when pulling connections\n\t\t\t\tif (this.canvasStore.newNodeInsertPosition) {\n\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, [\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[0] + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\t\tthis.canvasStore.newNodeInsertPosition[1] - NodeViewUtils.NODE_SIZE / 2,\n\t\t\t\t\t]);\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\t} else {\n\t\t\t\t\tlet yOffset = 0;\n\t\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\n\t\t\t\t\tif (lastSelectedConnection) {\n\t\t\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (sourceNodeType) {\n\t\t\t\t\t\t\tconst offsets = [\n\t\t\t\t\t\t\t\t[-100, 100],\n\t\t\t\t\t\t\t\t[-140, 0, 140],\n\t\t\t\t\t\t\t\t[-240, -100, 100, 240],\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tconst sourceNodeOutputs = NodeHelpers.getNodeOutputs(\n\t\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\t\tsourceNodeType,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst sourceNodeOutputTypes = NodeHelpers.getConnectionTypes(sourceNodeOutputs);\n\n\t\t\t\t\t\t\tconst sourceNodeOutputMainOutputs = sourceNodeOutputTypes.filter(\n\t\t\t\t\t\t\t\t(output) => output === NodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (sourceNodeOutputMainOutputs.length > 1) {\n\t\t\t\t\t\t\t\tconst offset = offsets[sourceNodeOutputMainOutputs.length - 2];\n\t\t\t\t\t\t\t\tconst sourceOutputIndex = lastSelectedConnection.__meta\n\t\t\t\t\t\t\t\t\t? lastSelectedConnection.__meta.sourceOutputIndex\n\t\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\t\t\t\tyOffset = offset[sourceOutputIndex];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// It fails when the outputs are an expression. As those nodes have\n\t\t\t\t\t\t// normally no outputs by default and the only reason we need the\n\t\t\t\t\t\t// outputs here is to calculate the position, it is fine to assume\n\t\t\t\t\t\t// that they have no outputs and are so treated as a regular node\n\t\t\t\t\t\t// with only \"main\" outputs.\n\t\t\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, newNodeData, nodeTypeData);\n\t\t\t\t\t} catch (e) {}\n\t\t\t\t\tconst outputTypes = NodeHelpers.getConnectionTypes(outputs);\n\t\t\t\t\tconst lastSelectedNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\t\tlastSelectedNode.type,\n\t\t\t\t\t\tlastSelectedNode.typeVersion,\n\t\t\t\t\t);\n\n\t\t\t\t\t// If node has only scoped outputs, position it below the last selected node\n\t\t\t\t\tif (\n\t\t\t\t\t\toutputTypes.length > 0 &&\n\t\t\t\t\t\toutputTypes.every((outputName) => outputName !== NodeConnectionType.Main)\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst lastSelectedNodeWorkflow = workflow.getNode(lastSelectedNode.name);\n\t\t\t\t\t\tconst lastSelectedInputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNodeWorkflow,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst lastSelectedInputTypes = NodeHelpers.getConnectionTypes(lastSelectedInputs);\n\n\t\t\t\t\t\tconst scopedConnectionIndex = (lastSelectedInputTypes || [])\n\t\t\t\t\t\t\t.filter((input) => input !== NodeConnectionType.Main)\n\t\t\t\t\t\t\t.findIndex((inputType) => outputs[0] === inputType);\n\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tlastSelectedNode.position[0] +\n\t\t\t\t\t\t\t\t\t(NodeViewUtils.NODE_SIZE /\n\t\t\t\t\t\t\t\t\t\t(Math.max(lastSelectedNodeType?.inputs?.length ?? 1), 1)) *\n\t\t\t\t\t\t\t\t\t\tscopedConnectionIndex,\n\t\t\t\t\t\t\t\tlastSelectedNode.position[1] + NodeViewUtils.PUSH_NODES_OFFSET,\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Has only main outputs or no outputs at all\n\t\t\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(\n\t\t\t\t\t\t\tworkflow,\n\t\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\t\tlastSelectedNodeType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst inputsTypes = NodeHelpers.getConnectionTypes(inputs);\n\n\t\t\t\t\t\tlet pushOffset = NodeViewUtils.PUSH_NODES_OFFSET;\n\t\t\t\t\t\tif (!!inputsTypes.find((input) => input !== NodeConnectionType.Main)) {\n\t\t\t\t\t\t\t// If the node has scoped inputs, push it down a bit more\n\t\t\t\t\t\t\tpushOffset += 150;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a node is active then add the new node directly after the current one\n\t\t\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(\n\t\t\t\t\t\t\tthis.nodes,\n\t\t\t\t\t\t\t[lastSelectedNode.position[0] + pushOffset, lastSelectedNode.position[1] + yOffset],\n\t\t\t\t\t\t\t[100, 0],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If added node is a trigger and it's the first one added to the canvas\n\t\t\t\t// we place it at canvasAddButtonPosition to replace the canvas add button\n\t\t\t\tconst position =\n\t\t\t\t\tthis.nodeTypesStore.isTriggerNode(nodeTypeName) && !this.containsTrigger\n\t\t\t\t\t\t? this.canvasStore.canvasAddButtonPosition\n\t\t\t\t\t\t: // If no node is active find a free spot\n\t\t\t\t\t\t\t(this.lastClickPosition as XYPosition);\n\n\t\t\t\tnewNodeData.position = NodeViewUtils.getNewNodePosition(this.nodes, position);\n\t\t\t}\n\n\t\t\tconst localizedName = this.locale.localizeNodeName(newNodeData.name, newNodeData.type);\n\n\t\t\tnewNodeData.name = this.uniqueNodeName(localizedName);\n\n\t\t\tif (nodeTypeData.webhooks?.length) {\n\t\t\t\tnewNodeData.webhookId = uuid();\n\t\t\t}\n\n\t\t\tawait this.addNodes([newNodeData], undefined, trackHistory);\n\t\t\tthis.workflowsStore.setNodePristine(newNodeData.name, true);\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tif (nodeTypeName === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addSticky', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('nodeView.addNodeButton', { nodeTypeName });\n\t\t\t\tuseSegment().trackAddedTrigger(nodeTypeName);\n\t\t\t\tconst trackProperties: ITelemetryTrackProperties = {\n\t\t\t\t\tnode_type: nodeTypeName,\n\t\t\t\t\tnode_version: newNodeData.typeVersion,\n\t\t\t\t\tis_auto_add: isAutoAdd,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tdrag_and_drop: options.dragAndDrop,\n\t\t\t\t};\n\n\t\t\t\tif (lastSelectedNode) {\n\t\t\t\t\ttrackProperties.input_node_type = lastSelectedNode.type;\n\t\t\t\t}\n\n\t\t\t\tthis.$telemetry.trackNodesPanel('nodeView.addNodeButton', trackProperties);\n\t\t\t}\n\n\t\t\t// Automatically deselect all nodes and select the current one and also active\n\t\t\t// current node. But only if it's added manually by the user (not by undo/redo mechanism)\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.deselectAllNodes();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.nodeSelectedByName(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\tshowDetail && nodeTypeName !== STICKY_NODE_TYPE,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn newNodeData;\n\t\t},\n\t\tgetConnection(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOuputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t): IConnection | undefined {\n\t\t\tconst nodeConnections =\n\t\t\t\tthis.workflowsStore.outgoingConnectionsByNodeName(sourceNodeName)[type];\n\t\t\tif (nodeConnections) {\n\t\t\t\tconst connections: IConnection[] | null = nodeConnections[sourceNodeOutputIndex];\n\n\t\t\t\tif (connections) {\n\t\t\t\t\treturn connections.find(\n\t\t\t\t\t\t(connection: IConnection) =>\n\t\t\t\t\t\t\tconnection.node === targetNodeName && connection.index === targetNodeOuputIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t\tconnectTwoNodes(\n\t\t\tsourceNodeName: string,\n\t\t\tsourceNodeOutputIndex: number,\n\t\t\ttargetNodeName: string,\n\t\t\ttargetNodeOutputIndex: number,\n\t\t\ttype: ConnectionTypes,\n\t\t) {\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst targetNode = this.workflowsStore.getNodeByName(targetNodeName);\n\n\t\t\tif (\n\t\t\t\tsourceNode &&\n\t\t\t\ttargetNode &&\n\t\t\t\t!this.checkNodeConnectionAllowed(sourceNode, targetNode, type)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.getConnection(\n\t\t\t\t\tsourceNodeName,\n\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\ttargetNodeName,\n\t\t\t\t\ttargetNodeOutputIndex,\n\t\t\t\t\ttype,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst connectionData = [\n\t\t\t\t{\n\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: sourceNodeOutputIndex,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\ttype,\n\t\t\t\t\tindex: targetNodeOutputIndex,\n\t\t\t\t},\n\t\t\t] as [IConnection, IConnection];\n\n\t\t\tthis.__addConnection(connectionData);\n\t\t},\n\t\tasync addNode(\n\t\t\tnodeTypeName: string,\n\t\t\toptions: AddNodeOptions = {},\n\t\t\tshowDetail = true,\n\t\t\ttrackHistory = false,\n\t\t\tisAutoAdd = false,\n\t\t) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lastSelectedNode = this.lastSelectedNode;\n\t\t\tconst lastSelectedNodeOutputIndex = this.uiStore.lastSelectedNodeOutputIndex;\n\t\t\tconst lastSelectedNodeEndpointUuid = this.uiStore.lastSelectedNodeEndpointUuid;\n\t\t\tconst lastSelectedConnection = this.canvasStore.lastSelectedConnection;\n\n\t\t\tthis.historyStore.startRecordingUndo();\n\n\t\t\tconst newNodeData = await this.injectNode(\n\t\t\t\tnodeTypeName,\n\t\t\t\toptions,\n\t\t\t\tshowDetail,\n\t\t\t\ttrackHistory,\n\t\t\t\tisAutoAdd,\n\t\t\t);\n\t\t\tif (!newNodeData) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst outputIndex = lastSelectedNodeOutputIndex || 0;\n\t\t\tconst targetEndpoint = lastSelectedNodeEndpointUuid || '';\n\n\t\t\t// Handle connection of scoped_endpoint types\n\t\t\tif (lastSelectedNodeEndpointUuid && !isAutoAdd) {\n\t\t\t\tconst lastSelectedEndpoint = this.instance.getEndpoint(lastSelectedNodeEndpointUuid);\n\t\t\t\tif (\n\t\t\t\t\tlastSelectedEndpoint &&\n\t\t\t\t\tthis.checkNodeConnectionAllowed(\n\t\t\t\t\t\tlastSelectedNode,\n\t\t\t\t\t\tnewNodeData,\n\t\t\t\t\t\tlastSelectedEndpoint.scope as NodeConnectionType,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst connectionType = lastSelectedEndpoint.scope as ConnectionTypes;\n\t\t\t\t\tconst newNodeElement = this.instance.getManagedElement(newNodeData.id);\n\t\t\t\t\tconst newNodeConnections = this.instance.getEndpoints(newNodeElement);\n\t\t\t\t\tconst viableConnection = newNodeConnections.find((conn) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tconn.scope === connectionType &&\n\t\t\t\t\t\t\tlastSelectedEndpoint.parameters.connection !== conn.parameters.connection\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.instance?.connect({\n\t\t\t\t\t\tuuids: [targetEndpoint, viableConnection?.uuid || ''],\n\t\t\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If a node is last selected then connect between the active and its child ones\n\t\t\tif (lastSelectedNode && !isAutoAdd) {\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\tif (lastSelectedConnection?.__meta) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(lastSelectedConnection, trackHistory);\n\n\t\t\t\t\tconst targetNodeName = lastSelectedConnection.__meta.targetNodeName;\n\t\t\t\t\tconst targetOutputIndex = lastSelectedConnection.__meta.targetOutputIndex;\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Connect active node to the newly created one\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tlastSelectedNode.name,\n\t\t\t\t\toutputIndex,\n\t\t\t\t\tnewNodeData.name,\n\t\t\t\t\t0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t},\n\t\tgetNodeCreatorFilter(nodeName: string, outputType?: NodeConnectionType) {\n\t\t\tlet filter;\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(nodeName);\n\t\t\tif (!workflowNode) return { nodes: [] };\n\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\tworkflowNode?.type,\n\t\t\t\tworkflowNode.typeVersion,\n\t\t\t);\n\t\t\tif (nodeType) {\n\t\t\t\tconst inputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\n\t\t\t\tconst filterFound = inputs.filter((input) => {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== outputType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}) as INodeInputConfiguration[];\n\n\t\t\t\tif (filterFound.length) {\n\t\t\t\t\tfilter = filterFound[0].filter;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filter;\n\t\t},\n\t\tinsertNodeAfterSelected(info: NewConnectionInfo) {\n\t\t\tconst type = info.outputType ?? NodeConnectionType.Main;\n\t\t\t// Get the node and set it as active that new nodes\n\t\t\t// which get created get automatically connected\n\t\t\t// to it.\n\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.sourceId);\n\t\t\tif (!sourceNode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.uiStore.lastSelectedNode = sourceNode.name;\n\t\t\tthis.uiStore.lastSelectedNodeEndpointUuid =\n\t\t\t\tinfo.endpointUuid ?? info.connection?.target.jtk?.endpoint.uuid;\n\t\t\tthis.uiStore.lastSelectedNodeOutputIndex = info.index;\n\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\n\t\t\tif (info.connection) {\n\t\t\t\tthis.canvasStore.lastSelectedConnection = info.connection;\n\t\t\t}\n\n\t\t\tthis.onToggleNodeCreator({\n\t\t\t\tsource: info.eventSource,\n\t\t\t\tcreateNodeActive: true,\n\t\t\t\tnodeCreatorView: info.nodeCreatorView,\n\t\t\t});\n\n\t\t\t// TODO: The animation is a bit glitchy because we're updating view stack immediately\n\t\t\t// after the node creator is opened\n\t\t\tconst isOutput = info.connection?.endpoints[0].parameters.connection === 'source';\n\t\t\tconst isScopedConnection =\n\t\t\t\ttype !== NodeConnectionType.Main && Object.values(NodeConnectionType).includes(type);\n\n\t\t\tif (isScopedConnection) {\n\t\t\t\tuseViewStacks()\n\t\t\t\t\t.gotoCompatibleConnectionView(\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tisOutput,\n\t\t\t\t\t\tthis.getNodeCreatorFilter(sourceNode.name, type),\n\t\t\t\t\t)\n\t\t\t\t\t.catch((e) => {});\n\t\t\t}\n\t\t},\n\t\tasync onEventConnectionAbort(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.dropPrevented) {\n\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(connection.parameters.nodeId);\n\t\t\t\t\tconst connectionType = connection.parameters.type ?? NodeConnectionType.Main;\n\t\t\t\t\tconst overrideTargetEndpoint = connection?.connector\n\t\t\t\t\t\t?.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (sourceNode) {\n\t\t\t\t\t\tconst isTarget = connection.parameters.connection === 'target';\n\t\t\t\t\t\tconst sourceNodeName = isTarget ? this.pullConnActiveNodeName : sourceNode.name;\n\t\t\t\t\t\tconst targetNodeName = isTarget ? sourceNode.name : this.pullConnActiveNodeName;\n\t\t\t\t\t\tconst outputIndex = connection.parameters.index;\n\t\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\t\tconnectionType,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t\tthis.dropPrevented = false;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// When connection is aborted, we want to show the 'Next step' popup\n\t\t\t\tconst endpointId = `${connection.parameters.nodeId}-output${connection.parameters.index}`;\n\t\t\t\tconst endpoint = connection.instance.getEndpoint(endpointId);\n\t\t\t\t// First, show node creator if endpoint is not a plus endpoint\n\t\t\t\t// or if the AI Assistant experiment doesn't need to be shown to user\n\t\t\t\tif (!endpoint?.endpoint?.canvas || !this.shouldShowNextStepDialog) {\n\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\tconnection,\n\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Else render the popup\n\t\t\t\tconst endpointElement: HTMLElement = endpoint.endpoint.canvas;\n\t\t\t\t// Use observer to trigger the popup once the endpoint is rendered back again\n\t\t\t\t// after connection drag is aborted (so we can get it's position and dimensions)\n\t\t\t\tconst observer = new MutationObserver((mutations) => {\n\t\t\t\t\t// Find the mutation in which the current endpoint becomes visible again\n\t\t\t\t\tconst endpointMutation = mutations.find((mutation) => {\n\t\t\t\t\t\tconst target = mutation.target;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisJSPlumbEndpointElement(target) &&\n\t\t\t\t\t\t\ttarget.jtk.endpoint.uuid === endpoint.uuid &&\n\t\t\t\t\t\t\ttarget.style.display === 'block'\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t\tif (endpointMutation) {\n\t\t\t\t\t\t// When found, display the popup\n\t\t\t\t\t\tconst newConnectionInfo: AIAssistantConnectionInfo = {\n\t\t\t\t\t\t\tsourceId: connection.parameters.nodeId,\n\t\t\t\t\t\t\tindex: connection.parameters.index,\n\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_DROP,\n\t\t\t\t\t\t\toutputType: connection.parameters.type,\n\t\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.aiStore.latestConnectionInfo = newConnectionInfo;\n\t\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tobserver.observe(this.$refs.nodeViewRef as HTMLElement, {\n\t\t\t\t\tattributes: true,\n\t\t\t\t\tattributeFilter: ['style'],\n\t\t\t\t\tsubtree: true,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tcheckNodeConnectionAllowed(\n\t\t\tsourceNode: INodeUi,\n\t\t\ttargetNode: INodeUi,\n\t\t\ttargetInfoType: NodeConnectionType,\n\t\t): boolean {\n\t\t\tconst targetNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\ttargetNode.type,\n\t\t\t\ttargetNode.typeVersion,\n\t\t\t);\n\n\t\t\tif (targetNodeType?.inputs?.length) {\n\t\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\t\tconst workflowNode = workflow.getNode(targetNode.name);\n\t\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\t\tif (targetNodeType) {\n\t\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, targetNodeType);\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs || []) {\n\t\t\t\t\tif (typeof input === 'string' || input.type !== targetInfoType || !input.filter) {\n\t\t\t\t\t\t// No filters defined or wrong connection type\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (input.filter.nodes.length) {\n\t\t\t\t\t\tif (!input.filter.nodes.includes(sourceNode.type)) {\n\t\t\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\t\t\tthis.showToast({\n\t\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.title'),\n\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.nodeNodeCompatible.message', {\n\t\t\t\t\t\t\t\t\tinterpolate: { sourceNodeName: sourceNode.name, targetNodeName: targetNode.name },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t\t\tduration: 5000,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tonInterceptBeforeDrop(info: BeforeDropParams) {\n\t\t\ttry {\n\t\t\t\tlet sourceInfo: ComponentParameters;\n\t\t\t\tlet targetInfo: ComponentParameters;\n\t\t\t\tif (info.connection.endpoints[0].parameters.connection === 'target') {\n\t\t\t\t\tsourceInfo = info.dropEndpoint.parameters;\n\t\t\t\t\ttargetInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t} else {\n\t\t\t\t\tsourceInfo = info.connection.endpoints[0].parameters;\n\t\t\t\t\ttargetInfo = info.dropEndpoint.parameters;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsourceInfo.type !== targetInfo.type ||\n\t\t\t\t\tsourceInfo.connection === targetInfo.connection\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(sourceInfo.nodeId);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeById(targetInfo.nodeId);\n\n\t\t\t\tconst sourceNodeName = sourceNode?.name || '';\n\t\t\t\tconst targetNodeName = targetNode?.name || '';\n\n\t\t\t\tif (sourceNode && targetNode) {\n\t\t\t\t\tif (!this.checkNodeConnectionAllowed(sourceNode, targetNode, targetInfo.type)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check for duplicates\n\t\t\t\tif (\n\t\t\t\t\tthis.getConnection(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetInfo.index,\n\t\t\t\t\t\tsourceInfo.type,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.dropPrevented = true;\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\tonEventConnection(info: ConnectionEstablishedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\t// so switch them around if necessary\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst sourceInfo = info.sourceEndpoint.parameters;\n\t\t\t\tconst targetInfo = info.targetEndpoint.parameters;\n\n\t\t\t\tconst sourceNodeName = this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name;\n\t\t\t\tconst targetNodeName = this.workflowsStore.getNodeById(targetInfo.nodeId)?.name;\n\n\t\t\t\tif (sourceNodeName && targetNodeName) {\n\t\t\t\t\tinfo.connection.__meta = {\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\tsourceOutputIndex: sourceInfo.index,\n\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\ttargetOutputIndex: targetInfo.index,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tNodeViewUtils.resetConnection(info.connection);\n\t\t\t\tNodeViewUtils.moveBackInputLabelPosition(info.targetEndpoint);\n\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: sourceNodeName,\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: targetNodeName,\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\tthis.dropPrevented = true;\n\t\t\t\tthis.workflowsStore.addConnection({ connection: connectionData });\n\n\t\t\t\tif (!this.isReadOnlyRoute && !this.readOnlyEnv) {\n\t\t\t\t\tNodeViewUtils.hideOutputNameLabel(info.sourceEndpoint);\n\t\t\t\t\tNodeViewUtils.addConnectionActionsOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\t\t\t\tsourceId: info.sourceEndpoint.parameters.nodeId,\n\t\t\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t\t\t\tconnection: info.connection,\n\t\t\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.NODE_CONNECTION_ACTION,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tconst endpointArrow = NodeViewUtils.getOverlay(\n\t\t\t\t\t\tinfo.connection,\n\t\t\t\t\t\tOVERLAY_ENDPOINT_ARROW_ID,\n\t\t\t\t\t);\n\t\t\t\t\tif (sourceInfo.type !== NodeConnectionType.Main) {\n\t\t\t\t\t\t// Not \"main\" connections get a different connection style\n\t\t\t\t\t\tinfo.connection.setPaintStyle(\n\t\t\t\t\t\t\tgetConnectorPaintStyleData(info.connection, info.sourceEndpoint.parameters.category),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tendpointArrow?.setVisible(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dropPrevented = false;\n\t\t\t\tif (!this.isLoading) {\n\t\t\t\t\tthis.uiStore.stateIsDirty = true;\n\t\t\t\t\tif (!this.suspendRecordingDetachedConnections) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddConnectionCommand(connectionData));\n\t\t\t\t\t}\n\t\t\t\t\t// When we add multiple nodes, this event could be fired hundreds of times for large workflows.\n\t\t\t\t\t// And because the updateNodesInputIssues() method is quite expensive, we only call it if not in insert mode\n\t\t\t\t\tif (!this.isInsertingNodes) {\n\t\t\t\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\t\t\t\tthis.resetEndpointsErrors();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\t\t\t\tinfo.source,\n\t\t\t\t\t\t\t\tinfo.target,\n\t\t\t\t\t\t\t\tinfo.connection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t\t\t\t? (info.connection.connector.canvas as HTMLElement)\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\taddConectionsTestData() {\n\t\t\tthis.instance.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.addConnectionTestData(\n\t\t\t\t\tconnection.source,\n\t\t\t\t\tconnection.target,\n\t\t\t\t\tconnection?.connector?.hasOwnProperty('canvas')\n\t\t\t\t\t\t? (connection?.connector.canvas as HTMLElement)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t\tonDragMove() {\n\t\t\tconst totalNodes = this.nodes.length;\n\t\t\tvoid this.callDebounced(this.updateConnectionsOverlays, {\n\t\t\t\tdebounceTime: totalNodes > 20 ? 200 : 0,\n\t\t\t});\n\t\t},\n\t\tupdateConnectionsOverlays() {\n\t\t\tthis.instance?.connections.forEach((connection) => {\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\n\t\t\t\tObject.values(connection.overlays).forEach((overlay) => {\n\t\t\t\t\tif (!overlay.canvas) return;\n\t\t\t\t\tthis.instance?.repaint(overlay.canvas);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tisConnectionActive(connection: Connection | null) {\n\t\t\tif (!connection?.id || !this.activeConnection?.id) return false;\n\n\t\t\treturn this.activeConnection?.id === connection.id;\n\t\t},\n\t\tonConnectionMouseOver(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer !== undefined) {\n\t\t\t\t\tclearTimeout(this.exitTimer);\n\t\t\t\t\tthis.exitTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\tthis.enterTimer ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\tthis.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.enterTimer = setTimeout(() => {\n\t\t\t\t\t// If there is already an active connection then hide it first\n\t\t\t\t\tif (this.activeConnection && !this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t}\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t\tif (connection) {\n\t\t\t\t\t\tNodeViewUtils.showConnectionActions(connection);\n\t\t\t\t\t\tthis.activeConnection = connection;\n\t\t\t\t\t}\n\t\t\t\t}, 150);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMouseOut(connection: Connection) {\n\t\t\ttry {\n\t\t\t\tif (this.exitTimer) return;\n\n\t\t\t\tif (this.enterTimer) {\n\t\t\t\t\tclearTimeout(this.enterTimer);\n\t\t\t\t\tthis.enterTimer = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t// eslint-disable-next-line no-constant-binary-expression\n\t\t\t\t\tthis.isReadOnlyRoute ??\n\t\t\t\t\tthis.readOnlyEnv ??\n\t\t\t\t\t!connection ??\n\t\t\t\t\t!this.isConnectionActive(connection)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\n\t\t\t\tthis.exitTimer = setTimeout(() => {\n\t\t\t\t\tthis.exitTimer = undefined;\n\n\t\t\t\t\tif (connection && this.isConnectionActive(connection)) {\n\t\t\t\t\t\tNodeViewUtils.hideConnectionActions(this.activeConnection);\n\t\t\t\t\t\tthis.activeConnection = null;\n\t\t\t\t\t}\n\t\t\t\t}, 500);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionMoved(info: ConnectionMovedParams) {\n\t\t\ttry {\n\t\t\t\t// When a connection gets moved from one node to another it for some reason\n\t\t\t\t// calls the \"connection\" event but not the \"connectionDetached\" one. So we listen\n\t\t\t\t// additionally to the \"connectionMoved\" event and then only delete the existing connection.\n\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.connection);\n\n\t\t\t\tconst sourceInfo = info.connection.parameters;\n\t\t\t\tconst targetInfo = info.originalEndpoint.parameters;\n\n\t\t\t\tconst connectionInfo = [\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(sourceInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: sourceInfo.type,\n\t\t\t\t\t\tindex: sourceInfo.index,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tnode: this.workflowsStore.getNodeById(targetInfo.nodeId)?.name || '',\n\t\t\t\t\t\ttype: targetInfo.type,\n\t\t\t\t\t\tindex: targetInfo.index,\n\t\t\t\t\t},\n\t\t\t\t] as [IConnection, IConnection];\n\n\t\t\t\tthis.__removeConnection(connectionInfo, false);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonEndpointMouseOver(endpoint: Endpoint, mouse) {\n\t\t\t// This event seems bugged. It gets called constantly even when the mouse is not over the endpoint\n\t\t\t// if the endpoint has a connection attached to it. So we need to check if the mouse is actually over\n\t\t\t// the endpoint.\n\t\t\tif (!endpoint.isTarget || mouse.target !== endpoint.endpoint.canvas) return;\n\t\t\tthis.instance.setHover(endpoint, true);\n\t\t},\n\t\tonEndpointMouseOut(endpoint: Endpoint) {\n\t\t\tif (!endpoint.isTarget) return;\n\t\t\tthis.instance.setHover(endpoint, false);\n\t\t},\n\t\tasync onConnectionDetached(info: ConnectionDetachedParams) {\n\t\t\ttry {\n\t\t\t\tif (info.sourceEndpoint.parameters.connection === 'target') {\n\t\t\t\t\t// Allow that not \"main\" connections can also be dragged the other way around\n\t\t\t\t\tconst tempEndpoint = info.sourceEndpoint;\n\t\t\t\t\tinfo.sourceEndpoint = info.targetEndpoint;\n\t\t\t\t\tinfo.targetEndpoint = tempEndpoint;\n\t\t\t\t}\n\n\t\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\t\t\t\tNodeViewUtils.resetInputLabelPosition(info.targetEndpoint);\n\t\t\t\tNodeViewUtils.showOutputNameLabel(info.sourceEndpoint, info.connection);\n\n\t\t\t\tinfo.connection.removeOverlays();\n\t\t\t\tthis.__removeConnectionByConnectionInfo(info, false, false);\n\n\t\t\t\tif (this.pullConnActiveNodeName) {\n\t\t\t\t\t// establish new connection when dragging connection from one node to another\n\t\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t\t\tconst sourceNode = this.workflowsStore.getNodeById(info.connection.parameters.nodeId);\n\t\t\t\t\tconst sourceNodeName = sourceNode.name;\n\t\t\t\t\tconst outputIndex = info.connection.parameters.index;\n\t\t\t\t\tconst overrideTargetEndpoint = info.connection.connector\n\t\t\t\t\t\t.overrideTargetEndpoint as Endpoint | null;\n\n\t\t\t\t\tif (connectionInfo) {\n\t\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t\t}\n\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\toutputIndex,\n\t\t\t\t\t\tthis.pullConnActiveNodeName,\n\t\t\t\t\t\toverrideTargetEndpoint?.parameters?.index ?? 0,\n\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t);\n\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\tawait this.$nextTick();\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t} else if (\n\t\t\t\t\t!this.historyStore.bulkInProgress &&\n\t\t\t\t\t!this.suspendRecordingDetachedConnections &&\n\t\t\t\t\tconnectionInfo\n\t\t\t\t) {\n\t\t\t\t\t// Ff connection being detached by user, save this in history\n\t\t\t\t\t// but skip if it's detached as a side effect of bulk undo/redo or node rename process\n\t\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionInfo, this);\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t\t}\n\n\t\t\t\tvoid this.nodeHelpers.updateNodesInputIssues();\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDrag(connection: Connection) {\n\t\t\t// The overlays are visible by default so we need to hide the midpoint arrow\n\t\t\t// manually\n\t\t\tconnection.overlays['midpoint-arrow']?.setVisible(false);\n\t\t\ttry {\n\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\tthis.pullConnActive = true;\n\t\t\t\tthis.canvasStore.newNodeInsertPosition = null;\n\t\t\t\tNodeViewUtils.hideConnectionActions(connection);\n\t\t\t\tNodeViewUtils.resetConnection(connection);\n\n\t\t\t\tconst scope = connection.scope as ConnectionTypes;\n\t\t\t\tconst scopedEndpoints = Array.from(\n\t\t\t\t\tdocument.querySelectorAll(`[data-jtk-scope-${scope}=true]`),\n\t\t\t\t);\n\t\t\t\tconst connectionType = connection.parameters.connection;\n\t\t\t\tconst requiredType = connectionType === 'source' ? 'target' : 'source';\n\n\t\t\t\tconst filteredEndpoints = scopedEndpoints.filter((el) => {\n\t\t\t\t\tconst endpoint = el.jtk.endpoint as Endpoint;\n\t\t\t\t\tif (!endpoint) return false;\n\n\t\t\t\t\t// Prevent snapping(but not connecting) to the same node\n\t\t\t\t\tconst isSameNode = endpoint.parameters.nodeId === connection.parameters.nodeId;\n\t\t\t\t\tconst endpointType = endpoint.parameters.connection;\n\n\t\t\t\t\treturn !isSameNode && endpointType === requiredType;\n\t\t\t\t});\n\n\t\t\t\tconst onMouseMove = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tif (!connection) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst intersectingEndpoints = filteredEndpoints\n\t\t\t\t\t\t.filter((element: Element) => {\n\t\t\t\t\t\t\tconst endpoint = element.jtk.endpoint as Endpoint;\n\n\t\t\t\t\t\t\tif (element.classList.contains('jtk-floating-endpoint')) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst isEndpointIntersect = NodeViewUtils.isElementIntersection(element, e, 50);\n\t\t\t\t\t\t\tconst isNodeElementIntersect = NodeViewUtils.isElementIntersection(\n\t\t\t\t\t\t\t\tendpoint.element,\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\t30,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (isEndpointIntersect || isNodeElementIntersect) {\n\t\t\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t\t\t\t\t\tif (!nodeType) return false;\n\n\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\t\tconst aEndpointIntersect = NodeViewUtils.calculateElementIntersection(a, e, 50);\n\t\t\t\t\t\t\tconst bEndpointIntersect = NodeViewUtils.calculateElementIntersection(b, e, 50);\n\n\t\t\t\t\t\t\t// If both intersections are null, treat them as equal\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y && !bEndpointIntersect?.y) {\n\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If one intersection is null, sort the non-null one first\n\t\t\t\t\t\t\tif (!aEndpointIntersect?.y) return 1;\n\t\t\t\t\t\t\tif (!bEndpointIntersect?.y) return -1;\n\n\t\t\t\t\t\t\t// Otherwise, sort by ascending Y distance\n\t\t\t\t\t\t\treturn bEndpointIntersect.y - aEndpointIntersect.y;\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (intersectingEndpoints.length > 0) {\n\t\t\t\t\t\tconst intersectingEndpoint = intersectingEndpoints[0];\n\t\t\t\t\t\tconst endpoint = intersectingEndpoint.jtk.endpoint as Endpoint;\n\t\t\t\t\t\tconst node = this.workflowsStore.getNodeById(endpoint.parameters.nodeId);\n\n\t\t\t\t\t\tthis.pullConnActiveNodeName = node?.name ?? null;\n\n\t\t\t\t\t\tNodeViewUtils.showDropConnectionState(connection, endpoint);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tNodeViewUtils.showPullConnectionState(connection);\n\t\t\t\t\t\tthis.pullConnActiveNodeName = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst onMouseUp = (e: MouseEvent | TouchEvent) => {\n\t\t\t\t\tthis.pullConnActive = false;\n\t\t\t\t\tthis.canvasStore.newNodeInsertPosition = this.getMousePositionWithinNodeView(e);\n\t\t\t\t\tNodeViewUtils.resetConnectionAfterPull(connection);\n\t\t\t\t\twindow.removeEventListener('mousemove', onMouseMove);\n\t\t\t\t\twindow.removeEventListener('mouseup', onMouseUp);\n\n\t\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tconnection: null,\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\twindow.addEventListener('mousemove', onMouseMove);\n\t\t\t\twindow.addEventListener('touchmove', onMouseMove);\n\t\t\t\twindow.addEventListener('mouseup', onMouseUp);\n\t\t\t\twindow.addEventListener('touchend', onMouseMove);\n\n\t\t\t\tthis.connectionDragScope = {\n\t\t\t\t\ttype: connection.parameters.type,\n\t\t\t\t\tconnection: connection.parameters.connection,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t},\n\t\tonConnectionDragAbortDetached(connection: Connection) {\n\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t.flatMap((endpoints) => Object.values(endpoints))\n\t\t\t\t.filter((endpoint) => endpoint.endpoint.type === 'N8nPlus')\n\t\t\t\t.forEach((endpoint) => setTimeout(() => endpoint.instance.revalidate(endpoint.element), 0));\n\t\t},\n\t\tonPlusEndpointClick(endpoint: Endpoint) {\n\t\t\tif (this.shouldShowNextStepDialog) {\n\t\t\t\tif (endpoint?.__meta) {\n\t\t\t\t\tthis.aiStore.latestConnectionInfo = {\n\t\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\t\toutputType: endpoint.scope as NodeConnectionType,\n\t\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t\t};\n\t\t\t\t\tconst endpointElement = endpoint.endpoint.canvas;\n\t\t\t\t\tthis.aiStore.openNextStepPopup(\n\t\t\t\t\t\tthis.$locale.baseText('nextStepPopup.title.nextStep'),\n\t\t\t\t\t\tendpointElement,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.PLUS_ENDPOINT,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t\tstepName: endpoint.__meta.nodeName,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tonAddInputEndpointClick(endpoint: Endpoint) {\n\t\t\tif (endpoint?.__meta) {\n\t\t\t\tthis.insertNodeAfterSelected({\n\t\t\t\t\tsourceId: endpoint.__meta.nodeId,\n\t\t\t\t\tindex: endpoint.__meta.index,\n\t\t\t\t\teventSource: NODE_CREATOR_OPEN_SOURCES.ADD_INPUT_ENDPOINT,\n\t\t\t\t\tnodeCreatorView: AI_NODE_CREATOR_VIEW,\n\t\t\t\t\toutputType: endpoint.scope as ConnectionTypes,\n\t\t\t\t\tendpointUuid: endpoint.uuid,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tbindCanvasEvents() {\n\t\t\tif (this.eventsAttached) return;\n\t\t\tthis.instance.bind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.bind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.bind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.bind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.bind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.bind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\t\t\tthis.instance.bind(\n\t\t\t\t[EVENT_CONNECTION_DRAG, EVENT_CONNECTION_ABORT, EVENT_CONNECTION_DETACHED],\n\t\t\t\tthis.onConnectionDragAbortDetached,\n\t\t\t);\n\t\t\tthis.instance.bind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.bind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\n\t\t\tthis.eventsAttached = true;\n\t\t},\n\t\tunbindCanvasEvents() {\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onEventConnectionAbort);\n\n\t\t\tthis.instance.unbind(INTERCEPT_BEFORE_DROP, this.onInterceptBeforeDrop);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION, this.onEventConnection);\n\n\t\t\tthis.instance.unbind(EVENT_DRAG_MOVE, this.onDragMove);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOVER, this.onConnectionMouseOver);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOUSEOUT, this.onConnectionMouseOut);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_MOVED, this.onConnectionMoved);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOVER, this.onEndpointMouseOver);\n\t\t\tthis.instance.unbind(EVENT_ENDPOINT_MOUSEOUT, this.onEndpointMouseOut);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDrag);\n\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DRAG, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_ABORT, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_CONNECTION_DETACHED, this.onConnectionDragAbortDetached);\n\t\t\tthis.instance.unbind(EVENT_PLUS_ENDPOINT_CLICK, this.onPlusEndpointClick);\n\t\t\tthis.instance.unbind(EVENT_ADD_INPUT_ENDPOINT_CLICK, this.onAddInputEndpointClick);\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tunbindEndpointEventListeners(bind = true) {\n\t\t\tif (this.instance) {\n\t\t\t\t// Get all the endpoints and unbind the events\n\t\t\t\tconst elements = this.instance.getManagedElements();\n\t\t\t\tfor (const element of Object.values(elements)) {\n\t\t\t\t\tconst endpoints = element.endpoints;\n\t\t\t\t\tfor (const endpoint of endpoints || []) {\n\t\t\t\t\t\tconst endpointInstance = endpoint?.endpoint;\n\t\t\t\t\t\tif (endpointInstance && endpointInstance.type === N8nPlusEndpointType) {\n\t\t\t\t\t\t\t(endpointInstance as N8nPlusEndpoint).unbindEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.eventsAttached = false;\n\t\t},\n\t\tonBeforeUnload(e: BeforeUnloadEvent) {\n\t\t\tif (this.isDemo || window.preventNodeViewBeforeUnload) {\n\t\t\t\treturn;\n\t\t\t} else if (this.uiStore.stateIsDirty) {\n\t\t\t\t// A bit hacky solution to detecting users leaving the page after prompt:\n\t\t\t\t// 1. Notify that workflow is closed straight away\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\t// 2. If user decided to stay on the page we notify that the workflow is opened again\n\t\t\t\tthis.unloadTimeout = setTimeout(() => {\n\t\t\t\t\tthis.collaborationStore.notifyWorkflowOpened(this.workflowsStore.workflowId);\n\t\t\t\t}, 5 * TIME.SECOND);\n\t\t\t\te.returnValue = true; //Gecko + IE\n\t\t\t\treturn true; //Gecko + Webkit, Safari, Chrome etc.\n\t\t\t} else {\n\t\t\t\tthis.canvasStore.startLoading(this.$locale.baseText('nodeView.redirecting'));\n\t\t\t\tthis.collaborationStore.notifyWorkflowClosed(this.workflowsStore.workflowId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tonUnload() {\n\t\t\t// This will fire if users decides to leave the page after prompted\n\t\t\t// Clear the interval to prevent the notification from being sent\n\t\t\tclearTimeout(this.unloadTimeout);\n\t\t},\n\t\tasync newWorkflow(): Promise<void> {\n\t\t\tthis.canvasStore.startLoading();\n\t\t\tthis.resetWorkspace();\n\t\t\tthis.workflowData = await this.workflowsStore.getNewWorkflowData();\n\t\t\tthis.workflowsStore.currentWorkflowExecutions = [];\n\t\t\tthis.executionsStore.activeExecution = null;\n\n\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\tthis.canvasStore.setZoomLevel(1, [0, 0]);\n\t\t\tawait this.tryToAddWelcomeSticky();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.executionsStore.activeExecution = null;\n\t\t\tthis.canvasStore.stopLoading();\n\t\t},\n\t\tasync tryToAddWelcomeSticky(): Promise<void> {\n\t\t\tthis.canvasStore.zoomToFit();\n\t\t},\n\t\tasync initView(): Promise<void> {\n\t\t\tif (this.$route.params.action === 'workflowSave') {\n\t\t\t\t// In case the workflow got saved we do not have to run init\n\t\t\t\t// as only the route changed but all the needed data is already loaded\n\t\t\t\tthis.uiStore.stateIsDirty = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.blankRedirect) {\n\t\t\t\tthis.blankRedirect = false;\n\t\t\t} else if (this.$route.name === VIEWS.TEMPLATE_IMPORT) {\n\t\t\t\tconst templateId = this.$route.params.id;\n\t\t\t\tawait this.openWorkflowTemplate(templateId);\n\t\t\t} else {\n\t\t\t\tif (this.uiStore.stateIsDirty && !this.readOnlyEnv) {\n\t\t\t\t\tconst confirmModal = await this.confirm(\n\t\t\t\t\t\tthis.$locale.baseText('generic.unsavedWork.confirmMessage.message'),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('generic.unsavedWork.confirmMessage.headline'),\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.confirmButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tcancelButtonText: this.$locale.baseText(\n\t\t\t\t\t\t\t\t'generic.unsavedWork.confirmMessage.cancelButtonText',\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tshowClose: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (confirmModal === MODAL_CONFIRM) {\n\t\t\t\t\t\tconst saved = await this.workflowHelpers.saveCurrentWorkflow();\n\t\t\t\t\t\tif (saved) await this.settingsStore.fetchPromptsData();\n\t\t\t\t\t} else if (confirmModal === MODAL_CLOSE) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Load a workflow\n\t\t\t\tlet workflowId = null as string | null;\n\t\t\t\tif (this.$route.params.name) {\n\t\t\t\t\tworkflowId = this.$route.params.name;\n\t\t\t\t}\n\t\t\t\tif (workflowId !== null) {\n\t\t\t\t\tlet workflow: IWorkflowDb | undefined = undefined;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tworkflow = await this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.showError(error, this.$locale.baseText('openWorkflow.workflowNotFoundError'));\n\n\t\t\t\t\t\tvoid this.$router.push({\n\t\t\t\t\t\t\tname: VIEWS.NEW_WORKFLOW,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (workflow) {\n\t\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t\t\tawait this.checkAndInitDebugMode();\n\n\t\t\t\t\t\tif (workflow.meta?.onboardingId) {\n\t\t\t\t\t\t\tthis.$telemetry.track(\n\t\t\t\t\t\t\t\t`User opened workflow from onboarding template with ID ${workflow.meta.onboardingId}`,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tworkflow_id: workflow.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twithPostHog: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.$route.meta?.nodeView === true) {\n\t\t\t\t\t// Create new workflow\n\t\t\t\t\tawait this.newWorkflow();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.historyStore.reset();\n\t\t\tthis.uiStore.nodeViewInitialized = true;\n\t\t\tdocument.addEventListener('keydown', this.keyDown);\n\t\t\tdocument.addEventListener('keyup', this.keyUp);\n\n\t\t\twindow.addEventListener('beforeunload', this.onBeforeUnload);\n\t\t\twindow.addEventListener('unload', this.onUnload);\n\t\t\t// Once view is initialized, pick up all toast notifications\n\t\t\t// waiting in the store and display them\n\t\t\tthis.showNotificationForViews([VIEWS.WORKFLOW, VIEWS.NEW_WORKFLOW]);\n\t\t},\n\t\tgetOutputEndpointUUID(\n\t\t\tnodeName: string,\n\t\t\tconnectionType: ConnectionTypes,\n\t\t\tindex: number,\n\t\t): string | null {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getOutputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\tgetInputEndpointUUID(nodeName: string, connectionType: ConnectionTypes, index: number) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn NodeViewUtils.getInputEndpointUUID(node.id, connectionType, index);\n\t\t},\n\t\t__addConnection(connection: [IConnection, IConnection]) {\n\t\t\tconst outputUuid = this.getOutputEndpointUUID(\n\t\t\t\tconnection[0].node,\n\t\t\t\tconnection[0].type as ConnectionTypes,\n\t\t\t\tconnection[0].index,\n\t\t\t);\n\t\t\tconst inputUuid = this.getInputEndpointUUID(\n\t\t\t\tconnection[1].node,\n\t\t\t\tconnection[1].type as ConnectionTypes,\n\t\t\t\tconnection[1].index,\n\t\t\t);\n\t\t\tif (!outputUuid || !inputUuid) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst uuid: [string, string] = [outputUuid, inputUuid];\n\t\t\t// Create connections in DOM\n\t\t\tthis.instance?.connect({\n\t\t\t\tuuids: uuid,\n\t\t\t\tdetachable: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t\t});\n\t\t},\n\t\t__removeConnection(connection: [IConnection, IConnection], removeVisualConnection = false) {\n\t\t\tif (removeVisualConnection) {\n\t\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(connection[0].node);\n\t\t\t\tconst targetNode = this.workflowsStore.getNodeByName(connection[1].node);\n\n\t\t\t\tif (!sourceNode || !targetNode) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst sourceNodeType = this.nodeTypesStore.getNodeType(\n\t\t\t\t\tsourceNode.type,\n\t\t\t\t\tsourceNode.typeVersion,\n\t\t\t\t);\n\t\t\t\tconst sourceNodeOutput =\n\t\t\t\t\tsourceNodeType?.outputs?.[connection[0].index] || NodeConnectionType.Main;\n\t\t\t\tconst sourceNodeOutputName =\n\t\t\t\t\ttypeof sourceNodeOutput === 'string' ? sourceNodeOutput : sourceNodeOutput.name;\n\t\t\t\tconst scope = NodeViewUtils.getEndpointScope(sourceNodeOutputName);\n\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tscope,\n\t\t\t\t\tsource: sourceNode.id,\n\t\t\t\t\ttarget: targetNode.id,\n\t\t\t\t});\n\n\t\t\t\tconnections.forEach((connectionInstance: Connection) => {\n\t\t\t\t\tif (connectionInstance.__meta) {\n\t\t\t\t\t\t// Only delete connections from specific indexes (if it can be determined by meta)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconnectionInstance.__meta.sourceOutputIndex === connection[0].index &&\n\t\t\t\t\t\t\tconnectionInstance.__meta.targetOutputIndex === connection[1].index\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.__deleteJSPlumbConnection(connectionInstance);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.workflowsStore.removeConnection({ connection });\n\t\t},\n\t\t__deleteJSPlumbConnection(connection: Connection, trackHistory = false) {\n\t\t\t// Make sure to remove the overlay else after the second move\n\t\t\t// it visibly stays behind free floating without a connection.\n\t\t\tconnection.removeOverlays();\n\n\t\t\tthis.pullConnActiveNodeName = null; // prevent new connections when connectionDetached is triggered\n\t\t\tthis.instance?.deleteConnection(connection); // on delete, triggers connectionDetached event which applies mutation to store\n\t\t\tif (trackHistory && connection.__meta) {\n\t\t\t\tconst connectionData: [IConnection, IConnection] = [\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.sourceOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.sourceNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tindex: connection.__meta?.targetOutputIndex,\n\t\t\t\t\t\tnode: connection.__meta.targetNodeName,\n\t\t\t\t\t\ttype: NodeConnectionType.Main,\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t\tconst removeCommand = new RemoveConnectionCommand(connectionData, this);\n\t\t\t\tthis.historyStore.pushCommandToUndo(removeCommand);\n\t\t\t}\n\t\t},\n\t\t__removeConnectionByConnectionInfo(info, removeVisualConnection = false, trackHistory = false) {\n\t\t\tconst connectionInfo: [IConnection, IConnection] | null = getConnectionInfo(info);\n\n\t\t\tif (connectionInfo) {\n\t\t\t\tif (removeVisualConnection) {\n\t\t\t\t\tthis.__deleteJSPlumbConnection(info.connection, trackHistory);\n\t\t\t\t} else if (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveConnectionCommand(connectionInfo));\n\t\t\t\t}\n\t\t\t\tthis.workflowsStore.removeConnection({ connection: connectionInfo });\n\t\t\t}\n\t\t},\n\t\tasync duplicateNodes(nodes: INode[]): Promise<void> {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst workflowData = deepCopy(await this.getNodesToSave(nodes));\n\t\t\tawait this.importWorkflowData(workflowData, 'duplicate', false);\n\t\t},\n\t\tgetIncomingOutgoingConnections(nodeName: string): {\n\t\t\tincoming: Connection[];\n\t\t\toutgoing: Connection[];\n\t\t} {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\n\t\t\tif (node) {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t});\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst incoming = this.instance?.getConnections({\n\t\t\t\t\ttarget: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\treturn {\n\t\t\t\t\tincoming,\n\t\t\t\t\toutgoing,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { incoming: [], outgoing: [] };\n\t\t},\n\t\tonNodeMoved(node: INodeUi) {\n\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\n\t\t\t[...incoming, ...outgoing].forEach((connection: Connection) => {\n\t\t\t\tNodeViewUtils.showOrHideMidpointArrow(connection);\n\t\t\t\tNodeViewUtils.showOrHideItemsLabel(connection);\n\t\t\t});\n\t\t},\n\t\tonNodeRun({\n\t\t\tname,\n\t\t\tdata,\n\t\t\twaiting,\n\t\t}: {\n\t\t\tname: string;\n\t\t\tdata: ITaskData[] | null;\n\t\t\twaiting: boolean;\n\t\t}) {\n\t\t\tconst pinData = this.workflowsStore.pinnedWorkflowData;\n\n\t\t\tif (pinData?.[name]) {\n\t\t\t\tconst { outgoing } = this.getIncomingOutgoingConnections(name);\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tif (connection.__meta?.sourceNodeName === name) {\n\t\t\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(name) !== null;\n\t\t\t\t\t\tNodeViewUtils.addClassesToOverlays({\n\t\t\t\t\t\t\tconnection,\n\t\t\t\t\t\t\toverlayIds: [NodeViewUtils.OVERLAY_RUN_ITEMS_ID],\n\t\t\t\t\t\t\tclassNames: hasRun ? ['has-run'] : [],\n\t\t\t\t\t\t\tincludeConnector: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst sourceNodeName = name;\n\t\t\tconst sourceNode = this.workflowsStore.getNodeByName(sourceNodeName);\n\t\t\tconst sourceId = sourceNode !== null ? sourceNode.id : '';\n\n\t\t\tif (data === null || data.length === 0 || waiting) {\n\t\t\t\tconst outgoing = this.instance?.getConnections({\n\t\t\t\t\tsource: sourceId,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\toutgoing.forEach((connection: Connection) => {\n\t\t\t\t\tNodeViewUtils.resetConnection(connection);\n\t\t\t\t});\n\t\t\t\tconst endpoints = NodeViewUtils.getJSPlumbEndpoints(sourceNode, this.instance);\n\t\t\t\tendpoints.forEach((endpoint: Endpoint) => {\n\t\t\t\t\tif (endpoint.endpoint.type === 'N8nPlus') {\n\t\t\t\t\t\t(endpoint.endpoint as N8nPlusEndpoint).clearSuccessOutput();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.nodeHelpers.setSuccessOutput(data, sourceNode);\n\t\t},\n\t\tremoveNode(nodeName: string, trackHistory = false, trackBulk = true) {\n\t\t\tif (!this.editAllowedCheck()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (!node) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\t// \"requiredNodeTypes\" are also defined in cli/commands/run.ts\n\t\t\tconst requiredNodeTypes: string[] = [];\n\n\t\t\tif (requiredNodeTypes.includes(node.type)) {\n\t\t\t\t// The node is of the required type so check first\n\t\t\t\t// if any node of that type would be left when the\n\t\t\t\t// current one would get deleted.\n\t\t\t\tlet deleteAllowed = false;\n\t\t\t\tfor (const checkNode of this.nodes) {\n\t\t\t\t\tif (checkNode.name === node.name) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (requiredNodeTypes.includes(checkNode.type)) {\n\t\t\t\t\t\tdeleteAllowed = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!deleteAllowed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === STICKY_NODE_TYPE) {\n\t\t\t\tthis.$telemetry.track('User deleted workflow note', {\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t\tis_welcome_note: node.name === QUICKSTART_NOTE_NAME,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tvoid this.externalHooks.run('node.deleteNode', { node });\n\t\t\t\tthis.$telemetry.track('User deleted node', {\n\t\t\t\t\tnode_type: node.type,\n\t\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet waitForNewConnection = false;\n\t\t\t// connect nodes before/after deleted node\n\t\t\tconst nodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst workflowNode = workflow.getNode(node.name);\n\t\t\tlet inputs: Array<ConnectionTypes | INodeInputConfiguration> = [];\n\t\t\tlet outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];\n\t\t\tif (nodeType) {\n\t\t\t\tinputs = NodeHelpers.getNodeInputs(workflow, workflowNode, nodeType);\n\t\t\t\toutputs = NodeHelpers.getNodeOutputs(workflow, workflowNode, nodeType);\n\t\t\t}\n\n\t\t\tif (outputs.length === 1 && inputs.length === 1) {\n\t\t\t\tconst { incoming, outgoing } = this.getIncomingOutgoingConnections(node.name);\n\t\t\t\tif (incoming.length === 1 && outgoing.length === 1) {\n\t\t\t\t\tconst conn1 = incoming[0];\n\t\t\t\t\tconst conn2 = outgoing[0];\n\t\t\t\t\tif (conn1.__meta && conn2.__meta) {\n\t\t\t\t\t\twaitForNewConnection = true;\n\t\t\t\t\t\tconst sourceNodeName = conn1.__meta.sourceNodeName;\n\t\t\t\t\t\tconst sourceNodeOutputIndex = conn1.__meta.sourceOutputIndex;\n\t\t\t\t\t\tconst targetNodeName = conn2.__meta.targetNodeName;\n\t\t\t\t\t\tconst targetNodeOuputIndex = conn2.__meta.targetOutputIndex;\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\t\t\t\tsourceNodeName,\n\t\t\t\t\t\t\t\tsourceNodeOutputIndex,\n\t\t\t\t\t\t\t\ttargetNodeName,\n\t\t\t\t\t\t\t\ttargetNodeOuputIndex,\n\t\t\t\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (waitForNewConnection) {\n\t\t\t\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t\t\t\t\twaitForNewConnection = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100); // just to make it clear to users that this is a new connection\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvoid nextTick(() => {\n\t\t\t\t// Suspend drawing\n\t\t\t\tthis.instance?.setSuspendDrawing(true);\n\t\t\t\t(this.instance?.endpointsByElement[node.id] || [])\n\t\t\t\t\t.flat()\n\t\t\t\t\t.forEach((endpoint) => this.instance?.deleteEndpoint(endpoint));\n\n\t\t\t\t// Remove the connections in data\n\t\t\t\tthis.workflowsStore.removeAllNodeConnection(node);\n\t\t\t\tthis.workflowsStore.removeNode(node);\n\t\t\t\tthis.workflowsStore.clearNodeExecutionData(node.name);\n\n\t\t\t\tif (!waitForNewConnection) {\n\t\t\t\t\t// Now it can draw again\n\t\t\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t\t\t}\n\n\t\t\t\t// Remove node from selected index if found in it\n\t\t\t\tthis.uiStore.removeNodeFromSelection(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new RemoveNodeCommand(node));\n\t\t\t\t}\n\t\t\t}); // allow other events to finish like drag stop\n\n\t\t\tif (trackHistory && trackBulk) {\n\t\t\t\tconst recordingTimeout = waitForNewConnection ? 100 : 0;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t\t}, recordingTimeout);\n\t\t\t}\n\t\t},\n\t\tasync onSwitchSelectedNode(nodeName: string) {\n\t\t\tthis.nodeSelectedByName(nodeName, true, true);\n\t\t},\n\t\tasync onOpenConnectionNodeCreator(node: string, connectionType: ConnectionTypes) {\n\t\t\tawait this.openSelectiveNodeCreator({\n\t\t\t\tconnectiontype: connectionType,\n\t\t\t\tnode,\n\t\t\t});\n\t\t},\n\t\tasync redrawNode(nodeName: string) {\n\t\t\t// TODO: Improve later\n\t\t\t// For now we redraw the node by simply renaming it. Can for sure be\n\t\t\t// done better later but should be fine for now.\n\t\t\tconst tempName = 'x____XXXX____x';\n\t\t\tawait this.renameNode(nodeName, tempName);\n\t\t\tawait this.renameNode(tempName, nodeName);\n\t\t},\n\t\tvalueChanged(parameterData: IUpdateInformation) {\n\t\t\tif (parameterData.name === 'name' && parameterData.oldValue) {\n\t\t\t\t// The name changed so we have to take care that\n\t\t\t\t// the connections get changed.\n\t\t\t\tvoid this.renameNode(parameterData.oldValue as string, parameterData.value as string);\n\t\t\t}\n\t\t},\n\t\tasync renameNodePrompt(currentName: string) {\n\t\t\ttry {\n\t\t\t\tconst promptResponsePromise = this.prompt(\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.newName') + ':',\n\t\t\t\t\tthis.$locale.baseText('nodeView.prompt.renameNode') + `: ${currentName}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomClass: 'rename-prompt',\n\t\t\t\t\t\tconfirmButtonText: this.$locale.baseText('nodeView.prompt.rename'),\n\t\t\t\t\t\tcancelButtonText: this.$locale.baseText('nodeView.prompt.cancel'),\n\t\t\t\t\t\tinputErrorMessage: this.$locale.baseText('nodeView.prompt.invalidName'),\n\t\t\t\t\t\tinputValue: currentName,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\t// Wait till it had time to display\n\t\t\t\tawait this.$nextTick();\n\n\t\t\t\t// Get the input and select the text in it\n\t\t\t\tconst nameInput = document.querySelector('.rename-prompt .el-input__inner') as\n\t\t\t\t\t| HTMLInputElement\n\t\t\t\t\t| undefined;\n\t\t\t\tif (nameInput) {\n\t\t\t\t\tnameInput.focus();\n\t\t\t\t\tnameInput.select();\n\t\t\t\t}\n\n\t\t\t\tconst promptResponse = (await promptResponsePromise) as MessageBoxInputData;\n\n\t\t\t\tif (promptResponse?.action !== MODAL_CONFIRM) return;\n\n\t\t\t\tawait this.renameNode(currentName, promptResponse.value, true);\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync renameNode(currentName: string, newName: string, trackHistory = false) {\n\t\t\tif (currentName === newName) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\t}\n\n\t\t\tconst activeNodeName = this.activeNode?.name;\n\t\t\tconst isActive = activeNodeName === currentName;\n\t\t\tif (isActive) {\n\t\t\t\tthis.renamingActive = true;\n\t\t\t}\n\n\t\t\tnewName = this.uniqueNodeName(newName);\n\n\t\t\t// Rename the node and update the connections\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow(true);\n\t\t\tworkflow.renameNode(currentName, newName);\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.pushCommandToUndo(new RenameNodeCommand(currentName, newName));\n\t\t\t}\n\n\t\t\t// Update also last selected node and execution data\n\t\t\tthis.workflowsStore.renameNodeSelectedAndExecution({ old: currentName, new: newName });\n\n\t\t\t// Reset all nodes and connections to load the new ones\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\tthis.workflowsStore.removeAllConnections({ setStateDirty: false });\n\t\t\tthis.workflowsStore.removeAllNodes({ removePinData: false, setStateDirty: true });\n\n\t\t\t// Wait a tick that the old nodes had time to get removed\n\t\t\tawait this.$nextTick();\n\n\t\t\t// Add the new updated nodes\n\t\t\tawait this.addNodes(Object.values(workflow.nodes), workflow.connectionsBySourceNode, false);\n\n\t\t\t// Make sure that the node is selected again\n\t\t\tthis.deselectAllNodes();\n\t\t\tthis.nodeSelectedByName(newName);\n\n\t\t\tif (isActive) {\n\t\t\t\tthis.ndvStore.activeNodeName = newName;\n\t\t\t\tthis.renamingActive = false;\n\t\t\t}\n\n\t\t\tif (trackHistory) {\n\t\t\t\tthis.historyStore.stopRecordingUndo();\n\t\t\t}\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tdeleteEveryEndpoint() {\n\t\t\t// Check as it does not exist on first load\n\t\t\tif (this.instance) {\n\t\t\t\tthis.instance?.reset();\n\t\t\t\tObject.values(this.instance?.endpointsByElement)\n\t\t\t\t\t.flatMap((endpoint) => endpoint)\n\t\t\t\t\t.forEach((endpoint) => endpoint.destroy());\n\n\t\t\t\tthis.instance.deleteEveryConnection({ fireEvent: true });\n\t\t\t}\n\t\t},\n\t\tmatchCredentials(node: INodeUi) {\n\t\t\tif (!node.credentials) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.entries(node.credentials).forEach(\n\t\t\t\t([nodeCredentialType, nodeCredentials]: [string, INodeCredentialsDetails]) => {\n\t\t\t\t\tconst credentialOptions = this.credentialsStore.getCredentialsByType(nodeCredentialType);\n\n\t\t\t\t\t// Check if workflows applies old credentials style\n\t\t\t\t\tif (typeof nodeCredentials === 'string') {\n\t\t\t\t\t\tnodeCredentials = {\n\t\t\t\t\t\t\tid: null,\n\t\t\t\t\t\t\tname: nodeCredentials,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nodeCredentials.id) {\n\t\t\t\t\t\t// Check whether the id is matching with a credential\n\t\t\t\t\t\tconst credentialsId = nodeCredentials.id.toString(); // due to a fixed bug in the migration UpdateWorkflowCredentials (just sqlite) we have to cast to string and check later if it has been a number\n\t\t\t\t\t\tconst credentialsForId = credentialOptions.find(\n\t\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.id === credentialsId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (credentialsForId) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tcredentialsForId.name !== nodeCredentials.name ||\n\t\t\t\t\t\t\t\ttypeof nodeCredentials.id === 'number'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tnode.credentials![nodeCredentialType] = {\n\t\t\t\t\t\t\t\t\tid: credentialsForId.id,\n\t\t\t\t\t\t\t\t\tname: credentialsForId.name,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// No match for id found or old credentials type used\n\t\t\t\t\tnode.credentials![nodeCredentialType] = nodeCredentials;\n\n\t\t\t\t\t// check if only one option with the name would exist\n\t\t\t\t\tconst credentialsForName = credentialOptions.filter(\n\t\t\t\t\t\t(optionData: ICredentialsResponse) => optionData.name === nodeCredentials.name,\n\t\t\t\t\t);\n\n\t\t\t\t\t// only one option exists for the name, take it\n\t\t\t\t\tif (credentialsForName.length === 1) {\n\t\t\t\t\t\tnode.credentials![nodeCredentialType].id = credentialsForName[0].id;\n\t\t\t\t\t\tthis.credentialsUpdated = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\tasync addNodes(nodes: INodeUi[], connections?: IConnections, trackHistory = false) {\n\t\t\tif (!nodes?.length) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.isInsertingNodes = true;\n\t\t\t// Before proceeding we must check if all nodes contain the `properties` attribute.\n\t\t\t// Nodes are loaded without this information so we must make sure that all nodes\n\t\t\t// being added have this information.\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tnodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\t// Add the node to the node-list\n\t\t\tlet nodeType: INodeTypeDescription | null;\n\t\t\tnodes.forEach((node) => {\n\t\t\t\tif (!node.id) {\n\t\t\t\t\tnode.id = uuid();\n\t\t\t\t}\n\n\t\t\t\tnodeType = this.nodeTypesStore.getNodeType(node.type, node.typeVersion);\n\n\t\t\t\t// Make sure that some properties always exist\n\t\t\t\tif (!node.hasOwnProperty('disabled')) {\n\t\t\t\t\tnode.disabled = false;\n\t\t\t\t}\n\n\t\t\t\tif (!node.hasOwnProperty('parameters')) {\n\t\t\t\t\tnode.parameters = {};\n\t\t\t\t}\n\n\t\t\t\t// Load the defaul parameter values because only values which differ\n\t\t\t\t// from the defaults get saved\n\t\t\t\tif (nodeType !== null) {\n\t\t\t\t\tlet nodeParameters = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnodeParameters = NodeHelpers.getNodeParameters(\n\t\t\t\t\t\t\tnodeType.properties,\n\t\t\t\t\t\t\tnode.parameters,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tnode,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\tthis.$locale.baseText('nodeView.thereWasAProblemLoadingTheNodeParametersOfNode') +\n\t\t\t\t\t\t\t\t`: \"${node.name}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t}\n\t\t\t\t\tnode.parameters = nodeParameters !== null ? nodeParameters : {};\n\n\t\t\t\t\t// if it's a webhook and the path is empty set the UUID as the default path\n\t\t\t\t\tif (\n\t\t\t\t\t\t[WEBHOOK_NODE_TYPE, FORM_TRIGGER_NODE_TYPE].includes(node.type) &&\n\t\t\t\t\t\tnode.parameters.path === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\tnode.parameters.path = node.webhookId as string;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check and match credentials, apply new format if old is used\n\t\t\t\tthis.matchCredentials(node);\n\t\t\t\tthis.workflowsStore.addNode(node);\n\t\t\t\tif (trackHistory) {\n\t\t\t\t\tthis.historyStore.pushCommandToUndo(new AddNodeCommand(node));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Wait for the nodes to be rendered\n\t\t\tawait this.$nextTick();\n\n\t\t\tthis.instance?.setSuspendDrawing(true);\n\n\t\t\tif (connections) {\n\t\t\t\tawait this.addConnections(connections);\n\t\t\t}\n\t\t\t// Add the node issues at the end as the node-connections are required\n\t\t\tthis.nodeHelpers.refreshNodeIssues();\n\t\t\tthis.nodeHelpers.updateNodesInputIssues();\n\t\t\tthis.resetEndpointsErrors();\n\t\t\tthis.isInsertingNodes = false;\n\n\t\t\t// Now it can draw again\n\t\t\tthis.instance?.setSuspendDrawing(false, true);\n\t\t},\n\t\tasync addConnections(connections: IConnections) {\n\t\t\tconst batchedConnectionData: Array<[IConnection, IConnection]> = [];\n\n\t\t\tfor (const sourceNode in connections) {\n\t\t\t\tfor (const type in connections[sourceNode]) {\n\t\t\t\t\tconnections[sourceNode][type].forEach((outwardConnections, sourceIndex) => {\n\t\t\t\t\t\tif (outwardConnections) {\n\t\t\t\t\t\t\toutwardConnections.forEach((targetData) => {\n\t\t\t\t\t\t\t\tbatchedConnectionData.push([\n\t\t\t\t\t\t\t\t\t{ node: sourceNode, type, index: sourceIndex },\n\t\t\t\t\t\t\t\t\t{ node: targetData.node, type: targetData.type, index: targetData.index },\n\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Process the connections in batches\n\t\t\tawait this.processConnectionBatch(batchedConnectionData);\n\t\t\tsetTimeout(this.addConectionsTestData, 0);\n\t\t},\n\n\t\tasync processConnectionBatch(batchedConnectionData: Array<[IConnection, IConnection]>) {\n\t\t\tconst batchSize = 100;\n\n\t\t\tfor (let i = 0; i < batchedConnectionData.length; i += batchSize) {\n\t\t\t\tconst batch = batchedConnectionData.slice(i, i + batchSize);\n\n\t\t\t\tbatch.forEach((connectionData) => {\n\t\t\t\t\tthis.__addConnection(connectionData);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tasync addNodesToWorkflow(data: IWorkflowDataUpdate): Promise<IWorkflowDataUpdate> {\n\t\t\t// Because nodes with the same name maybe already exist, it could\n\t\t\t// be needed that they have to be renamed. Also could it be possible\n\t\t\t// that nodes are not allowd to be created because they have a create\n\t\t\t// limit set. So we would then link the new nodes with the already existing ones.\n\t\t\t// In this object all that nodes get saved in the format:\n\t\t\t// old-name -> new-name\n\t\t\tconst nodeNameTable: {\n\t\t\t\t[key: string]: string;\n\t\t\t} = {};\n\t\t\tconst newNodeNames: string[] = [];\n\n\t\t\tif (!data.nodes) {\n\t\t\t\t// No nodes to add\n\t\t\t\tthrow new Error(this.$locale.baseText('nodeView.noNodesGivenToAdd'));\n\t\t\t}\n\n\t\t\t// Get how many of the nodes of the types which have\n\t\t\t// a max limit set already exist\n\t\t\tconst nodeTypesCount = this.workflowHelpers.getNodeTypesMaxCount();\n\n\t\t\tlet oldName: string;\n\t\t\tlet newName: string;\n\t\t\tconst createNodes: INode[] = [];\n\n\t\t\tawait this.loadNodesProperties(\n\t\t\t\tdata.nodes.map((node) => ({ name: node.type, version: node.typeVersion })),\n\t\t\t);\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tif (nodeTypesCount[node.type] !== undefined) {\n\t\t\t\t\tif (nodeTypesCount[node.type].exist >= nodeTypesCount[node.type].max) {\n\t\t\t\t\t\t// Node is not allowed to be created so\n\t\t\t\t\t\t// do not add it to the create list but\n\t\t\t\t\t\t// add the name of the existing node\n\t\t\t\t\t\t// that this one gets linked up instead.\n\t\t\t\t\t\tnodeNameTable[node.name] = nodeTypesCount[node.type].nodeNames[0];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Node can be created but increment the\n\t\t\t\t\t\t// counter in case multiple ones are\n\t\t\t\t\t\t// supposed to be created\n\t\t\t\t\t\tnodeTypesCount[node.type].exist += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toldName = node.name;\n\n\t\t\t\tconst localized = this.locale.localizeNodeName(node.name, node.type);\n\n\t\t\t\tnewName = this.uniqueNodeName(localized, newNodeNames);\n\n\t\t\t\tnewNodeNames.push(newName);\n\t\t\t\tnodeNameTable[oldName] = newName;\n\n\t\t\t\tcreateNodes.push(node);\n\t\t\t});\n\n\t\t\t// Get only the connections of the nodes that get created\n\t\t\tconst newConnections: IConnections = {};\n\t\t\tconst currentConnections = data.connections!;\n\t\t\tconst createNodeNames = createNodes.map((node) => node.name);\n\t\t\tlet sourceNode, type, sourceIndex, connectionIndex, connectionData;\n\t\t\tfor (sourceNode of Object.keys(currentConnections)) {\n\t\t\t\tif (!createNodeNames.includes(sourceNode)) {\n\t\t\t\t\t// Node does not get created so skip output connections\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst connection: INodeConnections = {};\n\n\t\t\t\tfor (type of Object.keys(currentConnections[sourceNode])) {\n\t\t\t\t\tconnection[type] = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tsourceIndex = 0;\n\t\t\t\t\t\tsourceIndex < currentConnections[sourceNode][type].length;\n\t\t\t\t\t\tsourceIndex++\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst nodeSourceConnections = [];\n\t\t\t\t\t\tif (currentConnections[sourceNode][type][sourceIndex]) {\n\t\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\t\tconnectionIndex < currentConnections[sourceNode][type][sourceIndex].length;\n\t\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconnectionData = currentConnections[sourceNode][type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\t\tif (!createNodeNames.includes(connectionData.node)) {\n\t\t\t\t\t\t\t\t\t// Node does not get created so skip input connection\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnodeSourceConnections.push(connectionData);\n\t\t\t\t\t\t\t\t// Add connection\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconnection[type].push(nodeSourceConnections);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewConnections[sourceNode] = connection;\n\t\t\t}\n\n\t\t\t// Create a workflow with the new nodes and connections that we can use\n\t\t\t// the rename method\n\t\t\tconst tempWorkflow: Workflow = this.workflowHelpers.getWorkflow(createNodes, newConnections);\n\n\t\t\t// Rename all the nodes of which the name changed\n\t\t\tfor (oldName in nodeNameTable) {\n\t\t\t\tif (oldName === nodeNameTable[oldName]) {\n\t\t\t\t\t// Name did not change so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttempWorkflow.renameNode(oldName, nodeNameTable[oldName]);\n\t\t\t}\n\n\t\t\tif (data.pinData) {\n\t\t\t\tlet pinDataSuccess = true;\n\t\t\t\tfor (const nodeName of Object.keys(data.pinData)) {\n\t\t\t\t\t// Pin data limit reached\n\t\t\t\t\tif (!pinDataSuccess) {\n\t\t\t\t\t\tthis.showError(\n\t\t\t\t\t\t\tnew Error(this.$locale.baseText('ndv.pinData.error.tooLarge.description')),\n\t\t\t\t\t\t\tthis.$locale.baseText('ndv.pinData.error.tooLarge.title'),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst node = tempWorkflow.nodes[nodeNameTable[nodeName]];\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pinnedDataForNode = usePinnedData(node);\n\t\t\t\t\t\tpinnedDataForNode.setData(data.pinData[nodeName], 'add-nodes');\n\t\t\t\t\t\tpinDataSuccess = true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpinDataSuccess = false;\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the nodes with the changed node names, expressions and connections\n\t\t\tthis.historyStore.startRecordingUndo();\n\t\t\tawait this.addNodes(\n\t\t\t\tObject.values(tempWorkflow.nodes),\n\t\t\t\ttempWorkflow.connectionsBySourceNode,\n\t\t\t\ttrue,\n\t\t\t);\n\n\t\t\tthis.historyStore.stopRecordingUndo();\n\n\t\t\tthis.uiStore.stateIsDirty = true;\n\n\t\t\treturn {\n\t\t\t\tnodes: Object.values(tempWorkflow.nodes),\n\t\t\t\tconnections: tempWorkflow.connectionsBySourceNode,\n\t\t\t};\n\t\t},\n\t\tasync getNodesToSave(nodes: INode[]): Promise<IWorkflowData> {\n\t\t\tconst data: IWorkflowData = {\n\t\t\t\tnodes: [],\n\t\t\t\tconnections: {},\n\t\t\t\tpinData: {},\n\t\t\t};\n\n\t\t\t// Get data of all the selected noes\n\t\t\tlet nodeData;\n\t\t\tconst exportNodeNames: string[] = [];\n\n\t\t\tfor (const node of nodes) {\n\t\t\t\tnodeData = this.workflowHelpers.getNodeDataToSave(node);\n\t\t\t\texportNodeNames.push(node.name);\n\n\t\t\t\tdata.nodes.push(nodeData);\n\n\t\t\t\tconst pinDataForNode = this.workflowsStore.pinDataByNodeName(node.name);\n\t\t\t\tif (pinDataForNode) {\n\t\t\t\t\tdata.pinData![node.name] = pinDataForNode;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnodeData.credentials &&\n\t\t\t\t\tthis.settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing)\n\t\t\t\t) {\n\t\t\t\t\tconst usedCredentials = this.workflowsStore.usedCredentials;\n\t\t\t\t\tnodeData.credentials = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(nodeData.credentials).filter(([_, credential]) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tcredential.id &&\n\t\t\t\t\t\t\t\t(!usedCredentials[credential.id] ||\n\t\t\t\t\t\t\t\t\tusedCredentials[credential.id]?.currentUserHasAccess)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get only connections of exported nodes and ignore all other ones\n\t\t\tlet connectionToKeep,\n\t\t\t\tconnections: INodeConnections,\n\t\t\t\ttype: string,\n\t\t\t\tconnectionIndex: number,\n\t\t\t\tsourceIndex: number,\n\t\t\t\tconnectionData: IConnection,\n\t\t\t\ttypeConnections: INodeConnections;\n\n\t\t\tdata.nodes.forEach((node) => {\n\t\t\t\tconnections = this.workflowsStore.outgoingConnectionsByNodeName(node.name);\n\t\t\t\tif (Object.keys(connections).length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Keep only the connection to node which get also exported\n\t\t\t\ttypeConnections = {};\n\t\t\t\tfor (type of Object.keys(connections)) {\n\t\t\t\t\tfor (sourceIndex = 0; sourceIndex < connections[type].length; sourceIndex++) {\n\t\t\t\t\t\tconnectionToKeep = [];\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tconnectionIndex = 0;\n\t\t\t\t\t\t\tconnectionIndex < connections[type][sourceIndex].length;\n\t\t\t\t\t\t\tconnectionIndex++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconnectionData = connections[type][sourceIndex][connectionIndex];\n\t\t\t\t\t\t\tif (exportNodeNames.indexOf(connectionData.node) !== -1) {\n\t\t\t\t\t\t\t\tconnectionToKeep.push(connectionData);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (connectionToKeep.length) {\n\t\t\t\t\t\t\tif (!typeConnections.hasOwnProperty(type)) {\n\t\t\t\t\t\t\t\ttypeConnections[type] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttypeConnections[type][sourceIndex] = connectionToKeep;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (Object.keys(typeConnections).length) {\n\t\t\t\t\tdata.connections[node.name] = typeConnections;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn data;\n\t\t},\n\t\tresetWorkspace() {\n\t\t\tthis.workflowsStore.resetWorkflow();\n\n\t\t\tthis.onToggleNodeCreator({ createNodeActive: false });\n\t\t\tthis.nodeCreatorStore.setShowScrim(false);\n\t\t\tthis.canvasStore.resetZoom();\n\n\t\t\t// Reset nodes\n\t\t\tthis.unbindEndpointEventListeners();\n\t\t\tthis.deleteEveryEndpoint();\n\n\t\t\t// Make sure that if there is a waiting test-webhook that it gets removed\n\t\t\tif (this.executionWaitingForWebhook) {\n\t\t\t\ttry {\n\t\t\t\t\tvoid this.workflowsStore.removeTestWebhook(this.workflowsStore.workflowId);\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t\tthis.workflowsStore.resetState();\n\t\t\tthis.uiStore.removeActiveAction('workflowRunning');\n\n\t\t\tthis.uiStore.resetSelectedNodes();\n\t\t\tthis.uiStore.nodeViewOffsetPosition = [0, 0];\n\n\t\t\tthis.credentialsUpdated = false;\n\t\t},\n\t\tasync loadActiveWorkflows(): Promise<void> {\n\t\t\tawait this.workflowsStore.fetchActiveWorkflows();\n\t\t},\n\t\tasync loadNodeTypes(): Promise<void> {\n\t\t\tawait this.nodeTypesStore.getNodeTypes();\n\t\t},\n\t\tasync loadCredentialTypes(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchCredentialTypes(true);\n\t\t},\n\t\tasync loadCredentials(): Promise<void> {\n\t\t\tawait this.credentialsStore.fetchAllCredentials();\n\t\t},\n\t\tasync loadVariables(): Promise<void> {\n\t\t\tawait this.environmentsStore.fetchAllVariables();\n\t\t},\n\t\tasync loadSecrets(): Promise<void> {\n\t\t\tawait this.externalSecretsStore.fetchAllSecrets();\n\t\t},\n\t\tasync loadNodesProperties(nodeInfos: INodeTypeNameVersion[]): Promise<void> {\n\t\t\tconst allNodes: INodeTypeDescription[] = this.nodeTypesStore.allNodeTypes;\n\n\t\t\tconst nodesToBeFetched: INodeTypeNameVersion[] = [];\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tconst nodeVersions = Array.isArray(node.version) ? node.version : [node.version];\n\t\t\t\tif (\n\t\t\t\t\t!!nodeInfos.find((n) => n.name === node.name && nodeVersions.includes(n.version)) &&\n\t\t\t\t\t!node.hasOwnProperty('properties')\n\t\t\t\t) {\n\t\t\t\t\tnodesToBeFetched.push({\n\t\t\t\t\t\tname: node.name,\n\t\t\t\t\t\tversion: Array.isArray(node.version) ? node.version.slice(-1)[0] : node.version,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (nodesToBeFetched.length > 0) {\n\t\t\t\t// Only call API if node information is actually missing\n\t\t\t\tthis.canvasStore.startLoading();\n\t\t\t\tawait this.nodeTypesStore.getNodesInformation(nodesToBeFetched);\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\tasync onPostMessageReceived(message: MessageEvent) {\n\t\t\tif (!message || typeof message.data !== 'string' || !message.data?.includes?.('\"command\"')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(message.data);\n\t\t\t\tif (json && json.command === 'openWorkflow') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.importWorkflowExact(json);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = false;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('openWorkflow.workflowImportError'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json && json.command === 'openExecution') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// If this NodeView is used in preview mode (in iframe) it will not have access to the main app store\n\t\t\t\t\t\t// so everything it needs has to be sent using post messages and passed down to child components\n\t\t\t\t\t\tthis.isProductionExecutionPreview = json.executionMode !== 'manual';\n\n\t\t\t\t\t\tawait this.openExecution(json.executionId);\n\t\t\t\t\t\tthis.canOpenNDV = json.canOpenNDV ?? true;\n\t\t\t\t\t\tthis.hideNodeIssues = json.hideNodeIssues ?? false;\n\t\t\t\t\t\tthis.isExecutionPreview = true;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (window.top) {\n\t\t\t\t\t\t\twindow.top.postMessage(\n\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\tcommand: 'error',\n\t\t\t\t\t\t\t\t\tmessage: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMessage({\n\t\t\t\t\t\t\ttitle: this.$locale.baseText('nodeView.showError.openExecution.title'),\n\t\t\t\t\t\t\tmessage: (e as Error).message,\n\t\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (json?.command === 'setActiveExecution') {\n\t\t\t\t\tthis.executionsStore.activeExecution = json.execution;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\t\t},\n\t\tasync onImportWorkflowDataEvent(data: IDataObject) {\n\t\t\tawait this.importWorkflowData(data.data as IWorkflowDataUpdate, 'file');\n\t\t},\n\t\tasync onImportWorkflowUrlEvent(data: IDataObject) {\n\t\t\tconst workflowData = await this.getWorkflowDataFromUrl(data.url as string);\n\t\t\tif (workflowData !== undefined) {\n\t\t\t\tawait this.importWorkflowData(workflowData, 'url');\n\t\t\t}\n\t\t},\n\t\taddPinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst hasRun = this.workflowsStore.getWorkflowResultDataByNodeName(nodeName) !== null;\n\t\t\t\tconst classNames = ['pinned'];\n\n\t\t\t\tif (hasRun) {\n\t\t\t\t\tclassNames.push('has-run');\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tconnections.forEach((connection) => {\n\t\t\t\t\tNodeViewUtils.addConnectionOutputSuccess(connection, {\n\t\t\t\t\t\ttotal: pinData[nodeName].length,\n\t\t\t\t\t\titerations: 0,\n\t\t\t\t\t\tclassNames,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\tremovePinDataConnections(pinData: IPinData) {\n\t\t\tObject.keys(pinData).forEach((nodeName) => {\n\t\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst connections = this.instance?.getConnections({\n\t\t\t\t\tsource: node.id,\n\t\t\t\t}) as Connection[];\n\n\t\t\t\tthis.instance.setSuspendDrawing(true);\n\t\t\t\tconnections.forEach(NodeViewUtils.resetConnection);\n\t\t\t\tthis.instance.setSuspendDrawing(false, true);\n\t\t\t});\n\t\t},\n\t\tonToggleNodeCreator({ source, createNodeActive, nodeCreatorView }: ToggleNodeCreatorOptions) {\n\t\t\tif (createNodeActive === this.createNodeActive) return;\n\n\t\t\tif (!nodeCreatorView) {\n\t\t\t\tnodeCreatorView = this.containsTrigger\n\t\t\t\t\t? REGULAR_NODE_CREATOR_VIEW\n\t\t\t\t\t: TRIGGER_NODE_CREATOR_VIEW;\n\t\t\t}\n\n\t\t\t// Default to the trigger tab in node creator if there's no trigger node yet\n\t\t\tthis.nodeCreatorStore.setSelectedView(nodeCreatorView);\n\n\t\t\tthis.createNodeActive = createNodeActive;\n\n\t\t\tlet mode;\n\t\t\tswitch (this.nodeCreatorStore.selectedView) {\n\t\t\t\tcase AI_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'ai';\n\t\t\t\t\tbreak;\n\t\t\t\tcase REGULAR_NODE_CREATOR_VIEW:\n\t\t\t\t\tmode = 'regular';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tmode = 'regular';\n\t\t\t}\n\n\t\t\tif (createNodeActive) this.nodeCreatorStore.setOpenSource(source);\n\t\t\tvoid this.externalHooks.run('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t});\n\t\t\tthis.$telemetry.trackNodesPanel('nodeView.createNodeActiveChanged', {\n\t\t\t\tsource,\n\t\t\t\tmode,\n\t\t\t\tcreateNodeActive,\n\t\t\t\tworkflow_id: this.workflowsStore.workflowId,\n\t\t\t});\n\t\t},\n\t\tasync onAddNodes(\n\t\t\t{ nodes, connections }: AddedNodesAndConnections,\n\t\t\tdragAndDrop = false,\n\t\t\tposition?: XYPosition,\n\t\t) {\n\t\t\tlet currentPosition = position;\n\t\t\tfor (const { type, isAutoAdd, name, openDetail, position: nodePosition } of nodes) {\n\t\t\t\tawait this.addNode(\n\t\t\t\t\ttype,\n\t\t\t\t\t{ position: nodePosition ?? currentPosition, dragAndDrop, name },\n\t\t\t\t\topenDetail ?? false,\n\t\t\t\t\ttrue,\n\t\t\t\t\tisAutoAdd,\n\t\t\t\t);\n\n\t\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\t\tcurrentPosition = [\n\t\t\t\t\tlastAddedNode.position[0] + NodeViewUtils.NODE_SIZE * 2 + NodeViewUtils.GRID_SIZE,\n\t\t\t\t\tlastAddedNode.position[1],\n\t\t\t\t];\n\t\t\t}\n\n\t\t\tconst newNodesOffset = this.nodes.length - nodes.length;\n\t\t\tfor (const { from, to } of connections) {\n\t\t\t\tconst fromNode = this.nodes[newNodesOffset + from.nodeIndex];\n\t\t\t\tconst toNode = this.nodes[newNodesOffset + to.nodeIndex];\n\n\t\t\t\tthis.connectTwoNodes(\n\t\t\t\t\tfromNode.name,\n\t\t\t\t\tfrom.outputIndex ?? 0,\n\t\t\t\t\ttoNode.name,\n\t\t\t\t\tto.inputIndex ?? 0,\n\t\t\t\t\tNodeConnectionType.Main,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst lastAddedNode = this.nodes[this.nodes.length - 1];\n\t\t\tconst workflow = this.workflowHelpers.getCurrentWorkflow();\n\t\t\tconst lastNodeInputs = workflow.getParentNodesByDepth(lastAddedNode.name, 1);\n\n\t\t\t// If the last added node has multiple inputs, move them down\n\t\t\tif (lastNodeInputs.length > 1) {\n\t\t\t\tlastNodeInputs.slice(1).forEach((node, index) => {\n\t\t\t\t\tconst nodeUi = this.workflowsStore.getNodeByName(node.name);\n\t\t\t\t\tif (!nodeUi) return;\n\n\t\t\t\t\tthis.onMoveNode({\n\t\t\t\t\t\tnodeName: nodeUi.name,\n\t\t\t\t\t\tposition: [nodeUi.position[0], nodeUi.position[1] + 100 * (index + 1)],\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.addPinDataConnections(this.workflowsStore.pinnedWorkflowData || ({} as IPinData));\n\t\t},\n\n\t\tasync saveCurrentWorkflowExternal(callback: () => void) {\n\t\t\tawait this.workflowHelpers.saveCurrentWorkflow();\n\t\t\tcallback?.();\n\t\t},\n\t\tsetSuspendRecordingDetachedConnections(suspend: boolean) {\n\t\t\tthis.suspendRecordingDetachedConnections = suspend;\n\t\t},\n\t\tonMoveNode({ nodeName, position }: { nodeName: string; position: XYPosition }): void {\n\t\t\tthis.workflowsStore.updateNodeProperties({ name: nodeName, properties: { position } });\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (node) {\n\t\t\t\t\tthis.instance?.repaintEverything();\n\t\t\t\t\tthis.onNodeMoved(node);\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t},\n\t\tonRevertAddNode({ node }: { node: INodeUi }): void {\n\t\t\tthis.removeNode(node.name, false);\n\t\t},\n\t\tasync onRevertRemoveNode({ node }: { node: INodeUi }): Promise<void> {\n\t\t\tconst prevNode = this.workflowsStore.workflow.nodes.find((n) => n.id === node.id);\n\t\t\tif (prevNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For some reason, returning node to canvas with old id\n\t\t\t// makes it's endpoint to render at wrong position\n\t\t\tnode.id = uuid();\n\t\t\tawait this.addNodes([node]);\n\t\t},\n\t\tonRevertAddConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__removeConnection(connection, true);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertRemoveConnection({ connection }: { connection: [IConnection, IConnection] }) {\n\t\t\tthis.suspendRecordingDetachedConnections = true;\n\t\t\tthis.__addConnection(connection);\n\t\t\tthis.suspendRecordingDetachedConnections = false;\n\t\t},\n\t\tasync onRevertNameChange({ currentName, newName }: { currentName: string; newName: string }) {\n\t\t\tawait this.renameNode(newName, currentName);\n\t\t},\n\t\tonRevertEnableToggle({ nodeName, isDisabled }: { nodeName: string; isDisabled: boolean }) {\n\t\t\tconst node = this.workflowsStore.getNodeByName(nodeName);\n\t\t\tif (node) {\n\t\t\t\tthis.nodeHelpers.disableNodes([node]);\n\t\t\t}\n\t\t},\n\t\tonPageShow(e: PageTransitionEvent) {\n\t\t\t// Page was restored from the bfcache (back-forward cache)\n\t\t\tif (e.persisted) {\n\t\t\t\tthis.canvasStore.stopLoading();\n\t\t\t}\n\t\t},\n\t\treadOnlyEnvRouteCheck() {\n\t\t\tif (\n\t\t\t\tthis.readOnlyEnv &&\n\t\t\t\t[VIEWS.NEW_WORKFLOW, VIEWS.TEMPLATE_IMPORT].includes(this.$route.name)\n\t\t\t) {\n\t\t\t\tvoid this.$nextTick(async () => {\n\t\t\t\t\tthis.resetWorkspace();\n\t\t\t\t\tthis.uiStore.stateIsDirty = false;\n\n\t\t\t\t\tawait this.$router.replace({ name: VIEWS.WORKFLOWS });\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tasync checkAndInitDebugMode() {\n\t\t\tif (this.$route.name === VIEWS.EXECUTION_DEBUG) {\n\t\t\t\tthis.titleSet(this.workflowName, 'DEBUG');\n\t\t\t\tif (!this.workflowsStore.isInDebugMode) {\n\t\t\t\t\tawait this.applyExecutionData(this.$route.params.executionId as string);\n\t\t\t\t\tthis.workflowsStore.isInDebugMode = true;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tonContextMenuAction(action: ContextMenuAction, nodes: INode[]): void {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'copy':\n\t\t\t\t\tthis.copyNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'delete':\n\t\t\t\t\tthis.deleteNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'duplicate':\n\t\t\t\t\tvoid this.duplicateNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'execute':\n\t\t\t\t\tthis.onRunNode(nodes[0].name, 'NodeView.onContextMenuAction');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'open':\n\t\t\t\t\tthis.ndvStore.activeNodeName = nodes[0].name;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'rename':\n\t\t\t\t\tvoid this.renameNodePrompt(nodes[0].name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_activation':\n\t\t\t\t\tthis.toggleActivationNodes(nodes);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'toggle_pin':\n\t\t\t\t\tthis.togglePinNodes(nodes, 'context-menu');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_node':\n\t\t\t\t\tthis.onToggleNodeCreator({\n\t\t\t\t\t\tsource: NODE_CREATOR_OPEN_SOURCES.CONTEXT_MENU,\n\t\t\t\t\t\tcreateNodeActive: !this.isReadOnlyRoute && !this.readOnlyEnv,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add_sticky':\n\t\t\t\t\tvoid this.onAddNodes({ nodes: [{ type: STICKY_NODE_TYPE }], connections: [] });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'select_all':\n\t\t\t\t\tthis.selectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'deselect_all':\n\t\t\t\t\tthis.deselectAllNodes();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t},\n\tasync onSourceControlPull() {\n\t\tlet workflowId = null as string | null;\n\t\tif (this.$route.params.name) {\n\t\t\tworkflowId = this.$route.params.name;\n\t\t}\n\n\t\ttry {\n\t\t\tawait Promise.all([this.loadCredentials(), this.loadVariables(), this.tagsStore.fetchAll()]);\n\n\t\t\tif (workflowId !== null && !this.uiStore.stateIsDirty) {\n\t\t\t\tconst workflow: IWorkflowDb | undefined =\n\t\t\t\t\tawait this.workflowsStore.fetchWorkflow(workflowId);\n\t\t\t\tif (workflow) {\n\t\t\t\t\tthis.titleSet(workflow.name, 'IDLE');\n\t\t\t\t\tawait this.openWorkflow(workflow);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t},\n});\n</script>\n\n<style scoped lang=\"scss\">\n.node-view-root {\n\tposition: relative;\n\tflex: 1;\n\toverflow: hidden;\n\tbackground-color: var(--color-canvas-background);\n\twidth: 100%;\n\theight: 100%;\n\tposition: relative;\n}\n\n.node-view-wrapper {\n\tposition: fixed;\n}\n\n.node-view {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\ttransform-origin: 0 0;\n\tz-index: -1;\n}\n\n.node-view-background {\n\tbackground-color: var(--color-canvas-background);\n\tposition: absolute;\n\twidth: 10000px;\n\theight: 10000px;\n\tz-index: -2;\n}\n\n.move-active {\n\tcursor: grab;\n\tcursor: -moz-grab;\n\tcursor: -webkit-grab;\n\ttouch-action: none;\n}\n\n.move-in-process {\n\tcursor: grabbing;\n\tcursor: -moz-grabbing;\n\tcursor: -webkit-grabbing;\n\ttouch-action: none;\n}\n\n.workflow-execute-wrapper {\n\tposition: absolute;\n\tdisplay: flex;\n\tjustify-content: center;\n\talign-items: center;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\tbottom: var(--spacing-l);\n\twidth: auto;\n\n\t@media (max-width: $breakpoint-2xs) {\n\t\tbottom: 150px;\n\t}\n\n\tbutton {\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t\tmargin-left: 0.625rem;\n\n\t\t&:first-child {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n}\n\n/* Makes sure that when selected with mouse it does not select text */\n.do-not-select *,\n.jtk-drag-select * {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n</style>\n\n<style lang=\"scss\">\n.node-view-wrapper {\n\t--drag-scope-active-disabled-color: var(--color-foreground-dark);\n\n\t&.connection-drag-scope-active {\n\t\t@each $node-type in $supplemental-node-types {\n\t\t\t// Grey out incompatible node type endpoints\n\t\t\t&:not(.connection-drag-scope-active-type-#{$node-type}) {\n\t\t\t\t.diamond-output-endpoint,\n\t\t\t\t.jtk-connector,\n\t\t\t\t.add-input-endpoint {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\n\t\t\t\t.node-input-endpoint-label,\n\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t&.connection-drag-scope-active-type-#{$node-type} {\n\t\t\t\t// Dragging input\n\t\t\t\t&.connection-drag-scope-active-connection-target {\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t}\n\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t// Apply style to dragged compatible input endpoint\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-input-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Dragging output\n\t\t\t\t&.connection-drag-scope-active-connection-source {\n\t\t\t\t\t// Apply style to dragged compatible output endpoint\n\t\t\t\t\t.diamond-output-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t&.jtk-dragging {\n\t\t\t\t\t\t\ttransform: scale(1.5) rotate(45deg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Apply style to non-dragged compatible input endpoints\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply style to compatible output endpoints\n\t\t\t\t\t.add-input-endpoint[data-jtk-scope-#{$node-type}='true'] {\n\t\t\t\t\t\t.add-input-endpoint-default {\n\t\t\t\t\t\t\ttransform: translate(-5px, -5px) scale(1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.node-output-endpoint-label {\n\t\t\t\t\t\t&:not(.jtk-dragging) {\n\t\t\t\t\t\t\t--node-type-#{$node-type}-color: var(--drag-scope-active-disabled-color);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n.drop-add-node-label {\n\tcolor: var(--color-text-dark);\n\tfont-weight: 600;\n\tfont-size: 0.8em;\n\ttext-align: center;\n\tbackground-color: #ffffff55;\n}\n\n.connection-actions {\n\t&:hover {\n\t\tdisplay: block !important;\n\t}\n\n\t> button {\n\t\tcolor: var(--color-foreground-xdark);\n\t\tborder: 2px solid var(--color-foreground-xdark);\n\t\tbackground-color: var(--color-background-xlight);\n\t\tborder-radius: var(--border-radius-base);\n\t\theight: var(--spacing-l);\n\t\twidth: var(--spacing-l);\n\t\tcursor: pointer;\n\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\tposition: absolute;\n\t\ttop: -12px;\n\n\t\t&.add {\n\t\t\tright: 4px;\n\t\t}\n\n\t\t&.delete {\n\t\t\tleft: 4px;\n\t\t}\n\n\t\t&.delete-single {\n\t\t\tleft: -12px;\n\t\t}\n\n\t\tsvg {\n\t\t\tpointer-events: none;\n\t\t\tfont-size: var(--font-size-2xs);\n\t\t}\n\n\t\t&:hover {\n\t\t\tborder-color: var(--color-primary);\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n</style>\n\n<style module lang=\"scss\">\n.content {\n\tposition: relative;\n\tdisplay: flex;\n\toverflow: auto;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.shake {\n\tanimation: 1s 200ms shake;\n}\n\n@keyframes shake {\n\t10%,\n\t90% {\n\t\ttransform: translate3d(-1px, 0, 0);\n\t}\n\n\t20%,\n\t80% {\n\t\ttransform: translate3d(2px, 0, 0);\n\t}\n\n\t30%,\n\t50%,\n\t70% {\n\t\ttransform: translate3d(-4px, 0, 0);\n\t}\n\n\t40%,\n\t60% {\n\t\ttransform: translate3d(4px, 0, 0);\n\t}\n}\n\n.setupCredentialsButtonWrapper {\n\tposition: absolute;\n\tleft: var(--spacing-l);\n\ttop: var(--spacing-l);\n}\n</style>\n\n<style lang=\"scss\" scoped>\n@mixin applyColorToConnection($partialSelector, $cssColorVarName, $labelCssColorVarName) {\n\t.jtk-connector#{$partialSelector}:not(.jtk-hover) {\n\t\tpath:not(.jtk-connector-outline) {\n\t\t\tstroke: var(#{$cssColorVarName});\n\t\t}\n\t\tpath[jtk-overlay-id='reverse-arrow'],\n\t\tpath[jtk-overlay-id='endpoint-arrow'],\n\t\tpath[jtk-overlay-id='midpoint-arrow'] {\n\t\t\tfill: var(#{$cssColorVarName});\n\t\t}\n\t}\n\n\t.connection-run-items-label#{$partialSelector} {\n\t\tcolor: var(#{$labelCssColorVarName});\n\t}\n}\n\n:deep(.node-view) {\n\t@include applyColorToConnection('.success', '--color-success-light', '--color-success');\n\t@include applyColorToConnection(\n\t\t'.success.pinned',\n\t\t'--color-foreground-xdark',\n\t\t'--color-foreground-xdark'\n\t);\n\t@include applyColorToConnection(\n\t\t'.success.pinned.has-run',\n\t\t'--color-secondary',\n\t\t'--color-secondary'\n\t);\n}\n</style>\n, IRun, IPushDataExecutionFinished\n"],"file":"assets/NodeView-kA0j8oya.js"}
|