You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2025/02/12 22:41:31 UTC

(camel-karavan) 05/05: Designer updates

This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit a00110fee73bc6087d00a2732259899433b59c60
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Wed Feb 12 17:40:52 2025 -0500

    Designer updates
---
 karavan-app/src/main/webui/package-lock.json       |   13 +-
 karavan-app/src/main/webui/package.json            |    1 +
 .../src/main/webui/src/designer/DesignerStore.ts   |   87 +-
 .../main/webui/src/designer/KaravanDesigner.tsx    |   83 +-
 .../webui/src/designer/beans/BeansDesigner.tsx     |   81 +-
 .../webui/src/designer/icons/ComponentIcons.tsx    |    3 +-
 .../webui/src/designer/kamelet/KameletDesigner.tsx |  101 +-
 .../src/main/webui/src/designer/karavan.css        |   23 +-
 .../webui/src/designer/property/DslProperties.css  |   82 +-
 .../webui/src/designer/property/DslProperties.tsx  |    1 +
 .../src/designer/property/MainPropertiesPanel.tsx  |   88 +
 .../src/designer/property/PropertiesHeader.tsx     |   20 +-
 .../property/property/ComponentPropertyField.tsx   |   13 +-
 .../designer/property/property/DataFormatField.tsx |    1 +
 .../property/property/DslPropertyField.tsx         |   25 +-
 .../designer/property/property/ExpressionField.tsx |    4 +-
 .../property/property/KameletPropertyField.tsx     |    7 +-
 .../main/webui/src/designer/rest/RestDesigner.tsx  |   84 +-
 .../webui/src/designer/route/RouteDesigner.tsx     |   59 +-
 .../src/designer/route/element/DslElement.css      |   24 +
 .../src/designer/route/element/DslElement.tsx      |   68 +-
 .../designer/route/element/DslElementHeader.tsx    |   71 +-
 .../webui/src/knowledgebase/KnowledgebasePage.tsx  |   30 +-
 karavan-space/package-lock.json                    | 7860 ++++++++++++++++++++
 karavan-space/package.json                         |    1 +
 karavan-space/public/metadata/components.json      |  700 +-
 karavan-space/public/metadata/kamelets.yaml        |  601 +-
 karavan-space/public/metadata/spiBeans.json        |  277 +-
 karavan-space/src/designer/DesignerStore.ts        |   87 +-
 karavan-space/src/designer/KaravanDesigner.tsx     |   83 +-
 karavan-space/src/designer/beans/BeansDesigner.tsx |   81 +-
 .../src/designer/icons/ComponentIcons.tsx          |    3 +-
 .../src/designer/kamelet/KameletDesigner.tsx       |  101 +-
 karavan-space/src/designer/karavan.css             |   23 +-
 .../src/designer/property/DslProperties.css        |   82 +-
 .../src/designer/property/DslProperties.tsx        |    1 +
 .../src/designer/property/MainPropertiesPanel.tsx  |   88 +
 .../src/designer/property/PropertiesHeader.tsx     |   20 +-
 .../property/property/ComponentPropertyField.tsx   |   13 +-
 .../designer/property/property/DataFormatField.tsx |    1 +
 .../property/property/DslPropertyField.tsx         |   25 +-
 .../designer/property/property/ExpressionField.tsx |    4 +-
 .../property/property/KameletPropertyField.tsx     |    7 +-
 karavan-space/src/designer/rest/RestDesigner.tsx   |   84 +-
 karavan-space/src/designer/route/RouteDesigner.tsx |   59 +-
 .../src/designer/route/element/DslElement.css      |   24 +
 .../src/designer/route/element/DslElement.tsx      |   68 +-
 .../designer/route/element/DslElementHeader.tsx    |   71 +-
 karavan-space/src/designer/utils/CamelUi.tsx       |    2 +-
 .../src/knowledgebase/KnowledgebasePage.tsx        |   30 +-
 50 files changed, 9893 insertions(+), 1472 deletions(-)

diff --git a/karavan-app/src/main/webui/package-lock.json b/karavan-app/src/main/webui/package-lock.json
index 255aecbb..3db73f11 100644
--- a/karavan-app/src/main/webui/package-lock.json
+++ b/karavan-app/src/main/webui/package-lock.json
@@ -28,6 +28,7 @@
         "react": "18.3.1",
         "react-dom": "18.3.1",
         "react-hook-form": "^7.54.2",
+        "react-resizable-panels": "^2.1.7",
         "react-router-dom": "^6.28.2",
         "rxjs": "7.8.1",
         "usehooks-ts": "^3.1.0",
@@ -55,7 +56,7 @@
       }
     },
     "../../../../karavan-core": {
-      "version": "4.8.3",
+      "version": "4.10.0",
       "license": "Apache-2.0",
       "dependencies": {
         "@types/js-yaml": "^4.0.9",
@@ -6331,6 +6332,16 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/react-resizable-panels": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz",
+      "integrity": "sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+        "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      }
+    },
     "node_modules/react-router": {
       "version": "6.28.2",
       "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.2.tgz",
diff --git a/karavan-app/src/main/webui/package.json b/karavan-app/src/main/webui/package.json
index af5edb52..dc58c360 100644
--- a/karavan-app/src/main/webui/package.json
+++ b/karavan-app/src/main/webui/package.json
@@ -52,6 +52,7 @@
     "react": "18.3.1",
     "react-dom": "18.3.1",
     "react-hook-form": "^7.54.2",
+    "react-resizable-panels": "^2.1.7",
     "react-router-dom": "^6.28.2",
     "rxjs": "7.8.1",
     "usehooks-ts": "^3.1.0",
diff --git a/karavan-app/src/main/webui/src/designer/DesignerStore.ts b/karavan-app/src/main/webui/src/designer/DesignerStore.ts
index 7535b93b..420de52a 100644
--- a/karavan-app/src/main/webui/src/designer/DesignerStore.ts
+++ b/karavan-app/src/main/webui/src/designer/DesignerStore.ts
@@ -36,12 +36,15 @@ interface IntegrationState {
     setVariables: (variables: string[]) => void;
     addVariable: (variable: string) => void;
     getVariables: () => string[];
+    key: string;
+    setKey: (key: string) => void;
 }
 
 export const useIntegrationStore = createWithEqualityFn<IntegrationState>((set, get) => ({
     integration: Integration.createNew("demo", "plain"),
     propertyOnly: false,
     json: '{}',
+    key: '',
     setIntegration: (integration: Integration, propertyOnly: boolean) => {
         set((state: IntegrationState) => {
             const json = JSON.stringify(integration);
@@ -89,6 +92,9 @@ export const useIntegrationStore = createWithEqualityFn<IntegrationState>((set,
         currentVariables.concat(otherVariables);
         return currentVariables;
     },
+    setKey: (key: string) => {
+        set({key: key});
+    },
 }), shallow)
 
 
@@ -197,27 +203,35 @@ export const useConnectionsStore = createWithEqualityFn<ConnectionsState>((set)
 }), shallow)
 
 type DesignerState = {
-    dark: boolean;
-    notificationBadge: boolean;
-    notificationMessage: [string, string];
-    shiftKeyPressed: boolean;
-    showDeleteConfirmation: boolean;
-    showMoveConfirmation: boolean;
-    deleteMessage: string;
-    selectedStep?: CamelElement;
-    selectedUuids: string[];
-    clipboardSteps: CamelElement[];
-    width: number,
-    height: number,
-    top: number,
-    left: number,
-    moveElements: [string | undefined, string | undefined],
-    propertyPlaceholders: string[],
+    isDebugging: boolean
+    dark: boolean
+    notificationBadge: boolean
+    notificationMessage: [string, string]
+    shiftKeyPressed: boolean
+    showDeleteConfirmation: boolean
+    showMoveConfirmation: boolean
+    deleteMessage: string
+    selectedStep?: CamelElement
+    selectedUuids: string[]
+    passedNodeIds: string[]
+    passedRouteId?: string
+    failedRouteId?: string
+    suspendedNodeId?: string
+    failed: boolean
+    clipboardSteps: CamelElement[]
+    width: number
+    height: number
+    top: number
+    left: number
+    moveElements: [string | undefined, string | undefined]
+    propertyPlaceholders: string[]
     parameterPlaceholders: [string, string][], // route template parameters
-    beans: BeanFactoryDefinition[]
+    beans: BeanFactoryDefinition[],
+    tab?: "routes" | "rest" | "beans" | "kamelet" | "code"
 }
 
 const designerState: DesignerState = {
+    isDebugging: false,
     notificationBadge: false,
     notificationMessage: ['', ''],
     dark: false,
@@ -226,6 +240,11 @@ const designerState: DesignerState = {
     showMoveConfirmation: false,
     deleteMessage: '',
     selectedUuids: [],
+    passedNodeIds: [],
+    passedRouteId: undefined,
+    failedRouteId: undefined,
+    suspendedNodeId: undefined,
+    failed: false,
     clipboardSteps: [],
     width: 0,
     height: 0,
@@ -234,17 +253,23 @@ const designerState: DesignerState = {
     moveElements: [undefined, undefined],
     propertyPlaceholders: [],
     parameterPlaceholders: [],
-    beans: []
+    beans: [],
 };
 
 type DesignerAction = {
     setDark: (dark: boolean) => void;
+    setDebugging: (isDebugging: boolean) => void;
     setShiftKeyPressed: (shiftKeyPressed: boolean) => void;
     setShowDeleteConfirmation: (showDeleteConfirmation: boolean) => void;
     setShowMoveConfirmation: (showMoveConfirmation: boolean) => void;
     setDeleteMessage: (deleteMessage: string) => void;
     setSelectedStep: (selectedStep?: CamelElement) => void;
     setSelectedUuids: (selectedUuids: string[]) => void;
+    setPassedNodeIds: (passedNodeIds: string[]) => void;
+    setPassedRouteId: (passedRouteId?: string) => void;
+    setFailedRouteId: (failedRouteId?: string) => void;
+    setSuspendedNodeId: (suspendedNodeId?: string) => void;
+    setFailed: (failed: boolean) => void;
     setClipboardSteps: (clipboardSteps: CamelElement[]) => void;
     setPosition: (width: number, height: number, top: number, left: number) => void;
     reset: () => void;
@@ -253,6 +278,7 @@ type DesignerAction = {
     setPropertyPlaceholders: (propertyPlaceholders: string[]) => void;
     setParameterPlaceholders: (parameterPlaceholders: [string, string][]) => void;
     setBeans: (beans: BeanFactoryDefinition[]) => void;
+    setTab: (tab?: "routes" | "rest" | "beans" | "kamelet" | "code") => void;
 }
 
 export const useDesignerStore = createWithEqualityFn<DesignerState & DesignerAction>((set) => ({
@@ -260,6 +286,12 @@ export const useDesignerStore = createWithEqualityFn<DesignerState & DesignerAct
     setDark: (dark: boolean) => {
         set({dark: dark})
     },
+    setDebugging: (isDebugging: boolean) => {
+        set({isDebugging: isDebugging})
+    },
+    setFailed: (failed: boolean) => {
+        set({failed: failed})
+    },
     setShiftKeyPressed: (shiftKeyPressed: boolean) => {
         set({shiftKeyPressed: shiftKeyPressed})
     },
@@ -282,6 +314,22 @@ export const useDesignerStore = createWithEqualityFn<DesignerState & DesignerAct
             return state;
         })
     },
+    setPassedNodeIds: (passedNodeIds: string[]) => {
+        set((state: DesignerState) => {
+            state.passedNodeIds.length = 0;
+            state.passedNodeIds.push(...passedNodeIds);
+            return state;
+        })
+    },
+    setPassedRouteId: (passedRouteId?: string) => {
+        set({passedRouteId: passedRouteId})
+    },
+    setFailedRouteId: (failedRouteId?: string) => {
+        set({failedRouteId: failedRouteId})
+    },
+    setSuspendedNodeId: (suspendedNodeId?: string) => {
+        set({suspendedNodeId: suspendedNodeId})
+    },
     setClipboardSteps: (clipboardSteps: CamelElement[]) => {
         set((state: DesignerState) => {
             state.clipboardSteps.length = 0;
@@ -324,4 +372,7 @@ export const useDesignerStore = createWithEqualityFn<DesignerState & DesignerAct
             return {beans: [...beans]};
         })
     },
+    setTab: (tab?: "routes" | "rest" | "beans" | "kamelet" | "code")  => {
+        set({tab: tab})
+    },
 }), shallow)
\ No newline at end of file
diff --git a/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx b/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
index c4fa3c32..7b29c57a 100644
--- a/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
+++ b/karavan-app/src/main/webui/src/designer/KaravanDesigner.tsx
@@ -44,6 +44,8 @@ import {KameletDesigner} from "./kamelet/KameletDesigner";
 import {BeanFactoryDefinition} from "karavan-core/lib/model/CamelDefinition";
 import {VariableUtil} from "karavan-core/lib/api/VariableUtil";
 import {ErrorBoundaryState, ErrorBoundaryWrapper} from "./ErrorBoundaryWrapper";
+import {Panel, PanelGroup, PanelResizeHandle} from 'react-resizable-panels';
+import {MainPropertiesPanel} from "./property/MainPropertiesPanel";
 
 interface Props {
     onSave: (filename: string, yaml: string, propertyOnly: boolean) => void
@@ -59,14 +61,14 @@ interface Props {
     propertyPlaceholders: string[]
     beans: BeanFactoryDefinition[]
     files: IntegrationFile[]
+    mainRightPanel?: React.ReactNode
 }
 
 export function KaravanDesigner(props: Props) {
 
-    const [tab, setTab] = useState<string>('routes');
-    const [setDark, setSelectedStep, reset, badge, message, setPropertyPlaceholders, setBeans] =
+    const [setDark, setSelectedStep, reset, badge, message, setPropertyPlaceholders, setBeans, tab, setTab] =
         useDesignerStore((s) =>
-            [s.setDark, s.setSelectedStep, s.reset, s.notificationBadge, s.notificationMessage, s.setPropertyPlaceholders, s.setBeans], shallow)
+            [s.setDark, s.setSelectedStep, s.reset, s.notificationBadge, s.notificationMessage, s.setPropertyPlaceholders, s.setBeans, s.tab, s.setTab], shallow)
     const [integration, setIntegration, resetFiles, setVariables] = useIntegrationStore((s) =>
         [s.integration, s.setIntegration, s.resetFiles, s.setVariables], shallow)
 
@@ -121,6 +123,7 @@ export function KaravanDesigner(props: Props) {
                 return Integration.createNew(filename, 'plain');
             }
         } catch (e) {
+            console.error(e)
             EventBus.sendAlert("Error parsing YAML", (e as Error).message, 'danger')
             return Integration.createNew(filename, 'plain');
         }
@@ -136,6 +139,7 @@ export function KaravanDesigner(props: Props) {
             const clone = CamelUtil.cloneIntegration(integration);
             return CamelDefinitionYaml.integrationToYaml(clone);
         } catch (e) {
+            console.error(e)
             EventBus.sendAlert('Error parsing Yaml', (e as Error).message, 'danger');
             return '';
         }
@@ -182,32 +186,53 @@ export function KaravanDesigner(props: Props) {
         }
     }, [state]);
 
+    function getMainPart() {
+        return (
+            <PageSection variant={props.dark ? PageSectionVariants.darker : PageSectionVariants.light} className="page" isFilled padding={{default: 'noPadding'}}>
+                <div className={"main-tabs-wrapper"}>
+                    <Tabs className="main-tabs"
+                          activeKey={tab}
+                          onSelect={(event, tabIndex: string | number) => {
+                              const tab = tabIndex.toString() as "routes" | "rest" | "beans" | "kamelet" | "code";
+                              if (["routes", "rest", "beans", "kamelet", "code"].includes(tab)) {
+                                  setTab(tab);
+                              } else {
+                                  setTab(undefined); // Handle unexpected values
+                              }
+                              setSelectedStep(undefined);
+                          }}
+                          style={{width: "100%"}}>
+                        {isKamelet && <Tab eventKey='kamelet' title={getTab("Definitions", "Kamelet Definitions", "kamelet")}></Tab>}
+                        <Tab eventKey='routes' title={getTab("Routes", "Integration flows", "routes")}></Tab>
+                        {!isKamelet && <Tab eventKey='rest' title={getTab("REST", "REST services", "rest")}></Tab>}
+                        <Tab eventKey='beans' title={getTab("Beans", "Beans Configuration", "beans")}></Tab>
+                        {props.showCodeTab && <Tab eventKey='code' title={getTab("YAML", "YAML Code", "code", true)}></Tab>}
+                    </Tabs>
+                </div>
+                <ErrorBoundaryWrapper onError={handleError}>
+                    {tab === 'kamelet' && <KameletDesigner/>}
+                    {tab === 'routes' && <RouteDesigner/>}
+                    {tab === 'rest' && <RestDesigner/>}
+                    {tab === 'beans' && <BeansDesigner/>}
+                    {tab === 'code' && <CodeEditor/>}
+                </ErrorBoundaryWrapper>
+            </PageSection>
+        )
+    }
+
     return (
-        <PageSection variant={props.dark ? PageSectionVariants.darker : PageSectionVariants.light}
-                     className="page"
-                     isFilled padding={{default: 'noPadding'}}>
-            <div className={"main-tabs-wrapper"}>
-                <Tabs className="main-tabs"
-                      activeKey={tab}
-                      onSelect={(event, tabIndex) => {
-                          setTab(tabIndex.toString());
-                          setSelectedStep(undefined);
-                      }}
-                      style={{width: "100%"}}>
-                    {isKamelet && <Tab eventKey='kamelet' title={getTab("Definitions", "Kamelet Definitions", "kamelet")}></Tab>}
-                    <Tab eventKey='routes' title={getTab("Routes", "Integration flows", "routes")}></Tab>
-                    {!isKamelet && <Tab eventKey='rest' title={getTab("REST", "REST services", "rest")}></Tab>}
-                    <Tab eventKey='beans' title={getTab("Beans", "Beans Configuration", "beans")}></Tab>
-                    {props.showCodeTab && <Tab eventKey='code' title={getTab("YAML", "YAML Code", "code", true)}></Tab>}
-                </Tabs>
-            </div>
-            <ErrorBoundaryWrapper onError={handleError}>
-                {tab === 'kamelet' && <KameletDesigner/>}
-                {tab === 'routes' && <RouteDesigner/>}
-                {tab === 'rest' && <RestDesigner/>}
-                {tab === 'beans' && <BeansDesigner/>}
-                {tab === 'code' && <CodeEditor/>}
-            </ErrorBoundaryWrapper>
-        </PageSection>
+        (tab !== 'code' && tab !== 'kamelet')
+        ? <PanelGroup direction="horizontal" style={{backgroundColor: 'white'}}>
+            <Panel minSize={10} defaultSize={70}>
+                {getMainPart()}
+            </Panel>
+            <PanelResizeHandle className='resize-handler'/>
+            <Panel minSize={10} defaultSize={30}>
+                {props.mainRightPanel || <MainPropertiesPanel/>}
+            </Panel>
+        </PanelGroup>
+        : <PanelGroup direction="horizontal" style={{backgroundColor: 'white'}}>
+                {getMainPart()}
+            </PanelGroup>
     )
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx b/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
index 4fb029e5..c2b193ea 100644
--- a/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
+++ b/karavan-app/src/main/webui/src/designer/beans/BeansDesigner.tsx
@@ -16,11 +16,7 @@
  */
 import React, {useEffect} from 'react';
 import {
-    Button,
-    Drawer,
-    DrawerContent,
-    DrawerContentBody,
-    DrawerPanelContent, Flex, FlexItem, Gallery, GalleryItem,
+    Button, Flex, FlexItem, Gallery, GalleryItem,
     Modal,
     PageSection,
 } from '@patternfly/react-core';
@@ -34,7 +30,6 @@ import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
 import {BeanCard} from "./BeanCard";
 import {useDesignerStore, useIntegrationStore} from "../DesignerStore";
 import {shallow} from "zustand/shallow";
-import {DslProperties} from "../property/DslProperties";
 
 export function BeansDesigner() {
 
@@ -100,55 +95,37 @@ export function BeansDesigner() {
         setSelectedStep(bean);
     }
 
-    function getPropertiesPanel() {
-        return (
-            <DrawerPanelContent isResizable
-                                hasNoBorder
-                                defaultSize={'800px'}
-                                maxSize={'800px'}
-                                minSize={'400px'}>
-                <DslProperties designerType={'beans'}/>
-            </DrawerPanelContent>
-        )
-    }
-
     const beans = CamelUi.getBeans(integration);
     return (
         <PageSection className="bean-designer" isFilled padding={{default: 'noPadding'}}>
-            <Drawer isExpanded isInline>
-                <DrawerContent panelContent={getPropertiesPanel()}>
-                    <DrawerContentBody>
-                        <Gallery className="gallery"
-                                 hasGutter
-                                 maxWidths={{
-                                     default: '100%',
-                                 }}
-                        >
-                            {beans?.map((bean, index) => (
-                                <GalleryItem key={bean.uuid + index}>
-                                    <BeanCard bean={bean}
-                                              selectedStep={selectedStep}
-                                              selectElement={selectBean}
-                                              deleteElement={onShowDeleteConfirmation}
-                                    />
-                                </GalleryItem>
-                            ))}
-                            <GalleryItem>
-                                <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentCenter"}}>
-                                    <FlexItem>
-                                        <Button
-                                            variant={beans?.length === 0 ? "primary" : "secondary"}
-                                            data-click="ADD_REST"
-                                            icon={<PlusIcon/>}
-                                            onClick={e => createBean()}>Create bean
-                                        </Button>
-                                    </FlexItem>
-                                </Flex>
-                            </GalleryItem>
-                        </Gallery>
-                    </DrawerContentBody>
-                </DrawerContent>
-            </Drawer>
+            <Gallery className="gallery"
+                     hasGutter
+                     maxWidths={{
+                         default: '100%',
+                     }}
+            >
+                {beans?.map((bean, index) => (
+                    <GalleryItem key={bean.uuid + index}>
+                        <BeanCard bean={bean}
+                                  selectedStep={selectedStep}
+                                  selectElement={selectBean}
+                                  deleteElement={onShowDeleteConfirmation}
+                        />
+                    </GalleryItem>
+                ))}
+                <GalleryItem>
+                    <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentCenter"}}>
+                        <FlexItem>
+                            <Button
+                                variant={beans?.length === 0 ? "primary" : "secondary"}
+                                data-click="ADD_REST"
+                                icon={<PlusIcon/>}
+                                onClick={e => createBean()}>Create bean
+                            </Button>
+                        </FlexItem>
+                    </Flex>
+                </GalleryItem>
+            </Gallery>
             {getDeleteConfirmation()}
         </PageSection>
     )
diff --git a/karavan-app/src/main/webui/src/designer/icons/ComponentIcons.tsx b/karavan-app/src/main/webui/src/designer/icons/ComponentIcons.tsx
index c7f9c3ea..a4bd3898 100644
--- a/karavan-app/src/main/webui/src/designer/icons/ComponentIcons.tsx
+++ b/karavan-app/src/main/webui/src/designer/icons/ComponentIcons.tsx
@@ -22,6 +22,7 @@ export function SalesforceIcon() {
                 xmlns="http://www.w3.org/2000/svg"
                 xmlnsXlink="http://www.w3.org/1999/xlink"
                 viewBox="0 0 273 191"
+                width="32px" height="32px"
                 className="icon"
             >
                 <defs>
@@ -47,7 +48,7 @@ export function SalesforceIcon() {
 }
 export function SlackIcon() {
     return (
-        <svg xmlns="http://www.w3.org/2000/svg" width={127} height={127} className="icon">
+        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127 127" width={32} height={32} className="icon">
             <g fill="none">
                 <path
                     fill="#E01E5A"
diff --git a/karavan-app/src/main/webui/src/designer/kamelet/KameletDesigner.tsx b/karavan-app/src/main/webui/src/designer/kamelet/KameletDesigner.tsx
index 5bf69f60..0e76f808 100644
--- a/karavan-app/src/main/webui/src/designer/kamelet/KameletDesigner.tsx
+++ b/karavan-app/src/main/webui/src/designer/kamelet/KameletDesigner.tsx
@@ -16,113 +16,22 @@
  */
 import React from 'react';
 import {
-    Button,
-    Drawer,
-    DrawerContent,
-    DrawerContentBody,
-    DrawerPanelContent,
-    Modal,
     PageSection,
 } from '@patternfly/react-core';
 import '../karavan.css';
 import './kamelet.css';
-import {BeanFactoryDefinition} from "karavan-core/lib/model/CamelDefinition";
-import {CamelDefinitionApiExt} from "karavan-core/lib/api/CamelDefinitionApiExt";
-import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
-import {useDesignerStore, useIntegrationStore} from "../DesignerStore";
-import {shallow} from "zustand/shallow";
 import {KameletAnnotationsPanel} from "./KameletAnnotationsPanel";
 import {KameletDefinitionsPanel} from "./KameletDefinitionsPanel";
-import {KameletProperties} from "./KameletProperties";
 
 export function KameletDesigner() {
 
-    const [integration, setIntegration] = useIntegrationStore((s) => [s.integration, s.setIntegration], shallow)
-    const [dark, selectedStep, showDeleteConfirmation, setShowDeleteConfirmation, setSelectedStep] = useDesignerStore((s) =>
-        [s.dark, s.selectedStep, s.showDeleteConfirmation, s.setShowDeleteConfirmation, s.setSelectedStep], shallow)
-
-
-    function onShowDeleteConfirmation(bean: BeanFactoryDefinition) {
-        setSelectedStep(bean);
-        setShowDeleteConfirmation(true);
-    }
-
-    function deleteBean() {
-        const i = CamelDefinitionApiExt.deleteBeanFromIntegration(integration, selectedStep as BeanFactoryDefinition);
-        setIntegration(i, false);
-        setShowDeleteConfirmation(false);
-        setSelectedStep(undefined);
-    }
-
-    function changeBean(bean: BeanFactoryDefinition) {
-        const clone = CamelUtil.cloneIntegration(integration);
-        const i = CamelDefinitionApiExt.addBeanToIntegration(clone, bean);
-        setIntegration(i, false);
-        setSelectedStep(bean);
-    }
-
-    function getDeleteConfirmation() {
-        return (<Modal
-            className="modal-delete"
-            title="Confirmation"
-            isOpen={showDeleteConfirmation}
-            onClose={() => setShowDeleteConfirmation(false)}
-            actions={[
-                <Button key="confirm" variant="primary" onClick={e => deleteBean()}>Delete</Button>,
-                <Button key="cancel" variant="link"
-                        onClick={e => setShowDeleteConfirmation(false)}>Cancel</Button>
-            ]}
-            onEscapePress={e => setShowDeleteConfirmation(false)}>
-            <div>
-                Delete bean from integration?
-            </div>
-        </Modal>)
-    }
-
-    function selectBean(bean?: BeanFactoryDefinition) {
-        setSelectedStep(bean);
-    }
-
-    function unselectBean(evt: React.MouseEvent<HTMLDivElement, MouseEvent>) {
-        if ((evt.target as any).dataset.click === 'BEANS') {
-            evt.stopPropagation()
-            setSelectedStep(undefined);
-        }
-    };
-
-    function createBean() {
-        changeBean(new BeanFactoryDefinition());
-    }
-
-    function getPropertiesPanel() {
-        return (
-            <DrawerPanelContent isResizable
-                                hasNoBorder
-                                defaultSize={'400px'}
-                                maxSize={'800px'}
-                                minSize={'400px'}>
-                <KameletProperties integration={integration}
-                                dark={dark}
-                                onChange={changeBean}
-                                onClone={changeBean}/>
-            </DrawerPanelContent>
-        )
-    }
-
     return (
         <PageSection className="kamelet-designer" isFilled padding={{default: 'noPadding'}}>
-            <Drawer isExpanded isInline>
-                <DrawerContent panelContent={getPropertiesPanel()}>
-                    <DrawerContentBody>
-                        <PageSection className="main">
-                            <KameletAnnotationsPanel/>
-                            <div style={{height:"20px"}}/>
-                            <KameletDefinitionsPanel/>
-                        </PageSection>
-                    </DrawerContentBody>
-                </DrawerContent>
-            </Drawer>
-            {getDeleteConfirmation()}
+            <PageSection className="main">
+                <KameletAnnotationsPanel/>
+                <div style={{height:"20px"}}/>
+                <KameletDefinitionsPanel/>
+            </PageSection>
         </PageSection>
     )
 }
diff --git a/karavan-app/src/main/webui/src/designer/karavan.css b/karavan-app/src/main/webui/src/designer/karavan.css
index 870cb9a4..31a26584 100644
--- a/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-app/src/main/webui/src/designer/karavan.css
@@ -269,7 +269,7 @@
 .karavan .dsl-page .dsl-page-columns {
     display: block;
     height: 100%;
-    background: #fafafa;
+    background: white;
     padding-bottom: 66px;
 }
 
@@ -320,12 +320,7 @@
     min-width: 0px;
 }
 
-.karavan
-.page
-.main-tabs-wrapper
-.main-tabs
-.pf-v5-c-tabs__link
-.pf-v5-c-tabs__item-icon {
+.karavan .page .main-tabs-wrapper .main-tabs .pf-v5-c-tabs__link .pf-v5-c-tabs__item-icon {
     height: 24px;
     margin-right: 0;
 }
@@ -342,20 +337,6 @@
     margin-right: 16px;
 }
 
-/*Properties*/
-.karavan .dsl-page .properties {
-    padding: 10px 10px 10px 10px;
-    background: transparent;
-    width: 100%;
-    height: 100%;
-    overflow: auto;
-    display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-    margin-bottom: 20px;
-    padding-bottom: 30px;
-}
-
 .karavan .pf-v5-c-drawer__splitter {
     width: 2px;
     background-color: #fcfcfc;
diff --git a/karavan-app/src/main/webui/src/designer/property/DslProperties.css b/karavan-app/src/main/webui/src/designer/property/DslProperties.css
index 6e867105..af8212a2 100644
--- a/karavan-app/src/main/webui/src/designer/property/DslProperties.css
+++ b/karavan-app/src/main/webui/src/designer/property/DslProperties.css
@@ -14,6 +14,78 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+/*Properties*/
+
+.karavan .main-properties {
+    width: 100%;
+    height: 100%;
+    padding-bottom: 40px;
+}
+
+.karavan .main-properties .main-tabs-wrapper {
+    /*display: flex;*/
+    /*flex-direction: row;*/
+    /*justify-content: space-between;*/
+    /*align-items: center;*/
+    /*position: relative;*/
+}
+
+.karavan .main-properties .main-tabs-wrapper::before {
+    content: "";
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    border: solid;
+    border-width: 0 0 var(--pf-v5-global--BorderWidth--sm) 0;
+    border-bottom-color: var(--pf-v5-global--BorderColor--100);
+}
+
+.karavan .main-properties .main-tabs-wrapper .main-tabs .top-menu-item {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    width: 100%;
+}
+
+.karavan .main-properties .main-tabs-wrapper .main-tabs .top-menu-item .count {
+    background: var(--pf-v5-global--active-color--100);
+    color: white;
+    height: fit-content;
+    margin-top: auto;
+    margin-bottom: auto;
+    min-width: 0;
+}
+
+.karavan .main-properties .main-tabs-wrapper .main-tabs .pf-v5-c-tabs__link .pf-v5-c-tabs__item-icon {
+    height: 24px;
+    margin-right: 0;
+}
+
+.karavan .main-properties .main-tabs-wrapper .main-tabs .pf-v5-c-tabs__item-text {
+    font-weight: bold;
+    margin-top: auto;
+    margin-bottom: auto;
+    margin-right: 6px;
+}
+
+.karavan .main-properties .main-tabs-wrapper .hide-log {
+    white-space: nowrap;
+    margin-right: 16px;
+}
+
+.karavan .properties {
+    padding: 10px 10px 10px 10px;
+    background-color: white;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    /*display: flex;*/
+    /*flex-direction: column;*/
+    /*justify-content: space-between;*/
+}
+
 .karavan .properties .headers {
     grid-row-gap: 10px;
     row-gap: 10px;
@@ -25,6 +97,7 @@
     display: flex;
     flex-direction: row;
     /*justify-content: space-between;*/
+    align-items: center;
     gap: 10px;
 }
 
@@ -273,7 +346,13 @@
 }
 
 .karavan .properties .value-changed {
-    background-color: yellow;
+    /*box-shadow: gold 0px 0px 0px 2px;*/
+    /*border-radius: 3px;*/
+}
+
+.karavan .properties .value-changed-label {
+    background-color: #FFFF00BF;
+    transition: background-color 0.5s ease;
 }
 
 .karavan .properties .value-sensitive-invalid {
@@ -285,3 +364,4 @@
     padding-right: 6px;
 }
 
+
diff --git a/karavan-app/src/main/webui/src/designer/property/DslProperties.tsx b/karavan-app/src/main/webui/src/designer/property/DslProperties.tsx
index 52b36ef7..57ca064e 100644
--- a/karavan-app/src/main/webui/src/designer/property/DslProperties.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/DslProperties.tsx
@@ -119,6 +119,7 @@ export function DslProperties(props: Props) {
         const dslName = selectedStep?.dslName;
         return CamelDefinitionApiExt.getElementProperties(dslName)
             .filter((p: PropertyMeta) => p.name !== 'uri') // do not show uri
+            .filter((p: PropertyMeta) => p.name !== 'id') // do not show id
             // .filer((p: PropertyMeta) => (showAdvanced && p.label.includes('advanced')) || (!showAdvanced && !p.label.includes('advanced')))
             .filter((p: PropertyMeta) => !p.isObject || (p.isObject && !CamelUi.dslHasSteps(p.type)) || (p.name === 'onWhen'))
             .filter((p: PropertyMeta) => !(dslName === 'RestDefinition' && ['get', 'post', 'put', 'patch', 'delete', 'head'].includes(p.name)))
diff --git a/karavan-app/src/main/webui/src/designer/property/MainPropertiesPanel.tsx b/karavan-app/src/main/webui/src/designer/property/MainPropertiesPanel.tsx
new file mode 100644
index 00000000..e373d92a
--- /dev/null
+++ b/karavan-app/src/main/webui/src/designer/property/MainPropertiesPanel.tsx
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, {useEffect, useState} from 'react';
+import {Tab, Tabs, TabTitleIcon, TabTitleText,} from '@patternfly/react-core';
+import "@patternfly/patternfly/patternfly.css";
+import './DslProperties.css';
+import {DslProperties} from "./DslProperties";
+import {getDesignerIcon} from "../icons/KaravanIcons";
+import {useDesignerStore} from "../DesignerStore";
+import {shallow} from "zustand/shallow";
+
+export function MainPropertiesPanel() {
+
+    const [tab] = useDesignerStore((s) =>  [s.tab], shallow)
+
+    const [lastStatus, setLastStatus] = useState<boolean>(false);
+    const [activeTabKey, setActiveTabKey] = React.useState<string | number>();
+    const handleTabClick = (event: React.MouseEvent<any> | React.KeyboardEvent | MouseEvent, tabIndex: string | number) => {
+        setActiveTabKey(tabIndex);
+    };
+
+    useEffect(() => {
+        if (!lastStatus) {
+            setActiveTabKey('properties');
+            setLastStatus(true);
+        }
+    }, [])
+
+    function getTab(title: string, icon: string, error: boolean = false) {
+        const color = error ? "red" : "initial";
+        return (
+            <div className="top-menu-item" style={{color: color}}>
+                <TabTitleIcon>{getDesignerIcon(icon)}</TabTitleIcon>
+                <TabTitleText>{title}</TabTitleText>
+            </div>
+        )
+    }
+
+    function getPropertiesPanelTabs() {
+        return (
+            <div className={"main-tabs-wrapper"}>
+                <Tabs className="main-tabs"
+                      activeKey={activeTabKey}
+                      onSelect={handleTabClick}
+                      isFilled
+                      aria-label="PropertyTypes"
+                      role="proeprty-type"
+                >
+                    <Tab eventKey={'properties'} title={getTab('Properties', 'properties')} aria-label="Properties"/>
+                </Tabs>
+            </div>
+        )
+    }
+
+    function getPropertiesPanel() {
+        if (tab === "routes") {
+            return <DslProperties designerType={"routes"}/>
+        } else if (tab === "rest") {
+            return <DslProperties designerType={"rest"}/>
+        } else if (tab === "beans") {
+            return <DslProperties designerType={"beans"}/>
+        } else {
+            return <></>
+        }
+    }
+
+    return (
+        <div className='main-properties'>
+            {getPropertiesPanelTabs()}
+            {activeTabKey === 'properties' && getPropertiesPanel() }
+        </div>
+    )
+}
diff --git a/karavan-app/src/main/webui/src/designer/property/PropertiesHeader.tsx b/karavan-app/src/main/webui/src/designer/property/PropertiesHeader.tsx
index ac7a3b3d..4e99422c 100644
--- a/karavan-app/src/main/webui/src/designer/property/PropertiesHeader.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/PropertiesHeader.tsx
@@ -25,12 +25,11 @@ import {
     MenuToggle,
     DropdownList,
     DropdownItem, Flex, Popover, FlexItem, Badge, ClipboardCopy,
-    Switch, Tooltip,
+    Switch, Tooltip, Label, Button,
 } from '@patternfly/react-core';
-import '../karavan.css';
 import './DslProperties.css';
 import "@patternfly/patternfly/patternfly.css";
-import {CamelUi} from "../utils/CamelUi";
+import {CamelUi, RouteToCreate} from "../utils/CamelUi";
 import {useDesignerStore} from "../DesignerStore";
 import {shallow} from "zustand/shallow";
 import {usePropertiesHook} from "./usePropertiesHook";
@@ -47,7 +46,7 @@ interface Props {
 
 export function PropertiesHeader(props: Props) {
 
-    const {saveAsRoute, convertStep} = usePropertiesHook(props.designerType);
+    const {saveAsRoute, convertStep, onPropertyChange} = usePropertiesHook(props.designerType);
     const {openSelectorToReplaceFrom} = useRouteDesignerHook();
 
     const [selectedStep, dark] = useDesignerStore((s) => [s.selectedStep, s.dark], shallow)
@@ -299,10 +298,23 @@ export function PropertiesHeader(props: Props) {
         )
     }
 
+    function getIdInput() {
+        return (
+            (selectedStep as any)?.id !== undefined
+                ? <Label isEditable color='blue' isCompact onEditComplete={(event, newText) => onPropertyChange("id", newText)}>
+                    {(selectedStep as any)?.id || ''}
+                    </Label>
+                : <Button variant="link" onClick={event => onPropertyChange("id", "rc-" + Math.floor(1000 + Math.random() * 9000).toString())}>
+                    Add Id
+                </Button>
+        )
+    }
+
     return (
         <div className="headers">
             <div className="top">
                 <Title headingLevel="h1" size="md">{title}</Title>
+                {getIdInput()}
                 {getHeaderMenu()}
                 {isStepComponent && getComponentStepTypeSwitch()}
             </div>
diff --git a/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx b/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
index f6227cc1..48f2308e 100644
--- a/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/property/ComponentPropertyField.tsx
@@ -123,6 +123,7 @@ export function ComponentPropertyField(props: Props) {
         }
         return (
             <Select
+                className={valueChangedClassName}
                 id={id} name={id}
                 variant={SelectVariant.typeahead}
                 aria-label={property.name}
@@ -175,7 +176,7 @@ export function ComponentPropertyField(props: Props) {
             selectOptions.push(...uris.map((value: string) =>
                 <SelectOption key={value} value={value ? value.trim() : value}/>));
         }
-        return <InputGroup id={id} name={id}>
+        return <InputGroup id={id} name={id} className={valueChangedClassName}>
             <InputGroupItem isFill>
                 <Select
                     id={id} name={id}
@@ -254,7 +255,7 @@ export function ComponentPropertyField(props: Props) {
         const inInfrastructure = InfrastructureAPI.infrastructure !== 'local';
         const noInfraSelectorButton = ["uri", "id", "description", "group"].includes(property.name);
         const icon = InfrastructureAPI.infrastructure === 'kubernetes' ? KubernetesIcon("infra-button") : <DockerIcon/>
-        return <InputGroup>
+        return <InputGroup  className={valueChangedClassName}>
             {inInfrastructure && !showEditor && !noInfraSelectorButton &&
                 <Tooltip position="bottom-end"
                          content={"Select from " + capitalize((InfrastructureAPI.infrastructure))}>
@@ -310,7 +311,7 @@ export function ComponentPropertyField(props: Props) {
 
     function getSpecialStringInput(property: ComponentProperty) {
         return (
-            <InputGroup>
+            <InputGroup  className={valueChangedClassName}>
                 <InputGroupItem isFill>
                     <TextInput
                         className="text-field" isRequired
@@ -346,6 +347,7 @@ export function ComponentPropertyField(props: Props) {
         }
         return (
             <Select
+                className={valueChangedClassName}
                 id={id} name={id}
                 variant={SelectVariant.single}
                 aria-label={property.name}
@@ -368,7 +370,7 @@ export function ComponentPropertyField(props: Props) {
         const isDisabled = textValue?.toString().includes("{") || textValue?.toString().includes("}")
         const isChecked = textValue !== undefined ? Boolean(textValue) : (property.defaultValue !== undefined && ['true', true].includes(property.defaultValue))
         return (
-            <TextInputGroup className="input-group">
+            <TextInputGroup className={"input-group " + valueChangedClassName}>
                 <InputGroupItem>
                     <Switch
                         id={id} name={id}
@@ -411,7 +413,7 @@ export function ComponentPropertyField(props: Props) {
 
 
     function getLabel(property: ComponentProperty, value: any) {
-        const labelClassName = PropertyUtil.hasComponentPropertyValueChanged(property, value) ? 'value-changed' : 'transparent';
+        const labelClassName = PropertyUtil.hasComponentPropertyValueChanged(property, value) ? 'value-changed-label' : '';
         return (
             <div style={{display: "flex", flexDirection: 'row', alignItems: 'center', gap: '3px'}}>
                 <Text className={labelClassName}>{property.displayName}</Text>
@@ -436,6 +438,7 @@ export function ComponentPropertyField(props: Props) {
     const property: ComponentProperty = props.property;
     const value = props.value;
     const validated = (property.secret && !isSensitiveFieldValid(value)) ? ValidatedOptions.error : ValidatedOptions.default;
+    const valueChangedClassName = PropertyUtil.hasComponentPropertyValueChanged(property, value) ? 'value-changed' : '';
     return (
         <FormGroup
             key={id}
diff --git a/karavan-app/src/main/webui/src/designer/property/property/DataFormatField.tsx b/karavan-app/src/main/webui/src/designer/property/property/DataFormatField.tsx
index 8e0801f0..47fb3a69 100644
--- a/karavan-app/src/main/webui/src/designer/property/property/DataFormatField.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/property/DataFormatField.tsx
@@ -151,6 +151,7 @@ export function DataFormatField(props: Props) {
                     <span className="pf-v5-c-form__label-required" aria-hidden="true"> *</span>
                 </label>
                 <Select
+                    // className='value-changed'
                     variant={SelectVariant.typeahead}
                     aria-label={"dataFormat"}
                     onToggle={() => {
diff --git a/karavan-app/src/main/webui/src/designer/property/property/DslPropertyField.tsx b/karavan-app/src/main/webui/src/designer/property/property/DslPropertyField.tsx
index 18090154..3aa4dfa0 100644
--- a/karavan-app/src/main/webui/src/designer/property/property/DslPropertyField.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/property/DslPropertyField.tsx
@@ -41,7 +41,7 @@ import {
     ValidatedOptions,
     FormHelperText,
     HelperText,
-    HelperTextItem
+    HelperTextItem, Label
 } from '@patternfly/react-core';
 import {
     Select,
@@ -220,7 +220,7 @@ export function DslPropertyField(props: Props) {
     }
 
     function getLabel(property: PropertyMeta, value: any, isKamelet: boolean) {
-        const labelClassName = PropertyUtil.hasDslPropertyValueChanged(property, value) ? 'value-changed' : '';
+        const labelClassName = PropertyUtil.hasDslPropertyValueChanged(property, value) ? 'value-changed-label' : '';
         if (!isMultiValueField(property) && property.isObject && !property.isArray && !["ExpressionDefinition"].includes(property.type)) {
             const tooltip = value ? "Delete " + property.name : "Add " + property.name;
             const className = value ? "change-button delete-button" : "change-button add-button";
@@ -298,7 +298,7 @@ export function DslPropertyField(props: Props) {
     }
 
     function getVariableInput(property: PropertyMeta) {
-        return <InputGroup>
+        return <InputGroup className={valueChangedClassName}>
             <InputGroupItem>
                 <ToggleGroup aria-label="Variable type">
                     <ToggleGroupItem text="global:" key='global' buttonId={"global-variable-" + property.name}
@@ -363,7 +363,7 @@ export function DslPropertyField(props: Props) {
 
     function getSpecialStringInput(property: PropertyMeta) {
         return (
-            <InputGroup>
+            <InputGroup className={valueChangedClassName}>
                 <InputGroupItem isFill>
                     <TextInput
                         ref={ref}
@@ -408,7 +408,7 @@ export function DslPropertyField(props: Props) {
         const isNumber = ['integer', 'number', 'duration'].includes(property.type);
         const uriReadOnly = isUriReadOnly(property);
         const showEditorButton = !uriReadOnly && !isNumber && !property.secret && !['id', 'description'].includes(property.name);
-        return <InputGroup>
+        return <InputGroup className={valueChangedClassName}>
             {inInfrastructure && !showEditor && !noInfraSelectorButton &&
                 <InputGroupItem>
                     <Tooltip position="bottom-end"
@@ -516,7 +516,7 @@ export function DslPropertyField(props: Props) {
             })
         }
         return (
-            <InputGroup>
+            <InputGroup className={valueChangedClassName}>
                 <InputGroupItem isFill>
                     <SelectField
                         id={property.name}
@@ -556,7 +556,7 @@ export function DslPropertyField(props: Props) {
     function getTextArea(property: PropertyMeta, value: any) {
         const {dslLanguage} = props;
         return (
-            <InputGroup>
+            <InputGroup className={valueChangedClassName}>
                 <InputGroupItem isFill>
                     <TextArea
                         className="text-field" isRequired
@@ -628,7 +628,7 @@ export function DslPropertyField(props: Props) {
             isChecked = property.defaultValue === 'true';
         }
         return (
-            <TextInputGroup className="input-group">
+            <TextInputGroup className={"input-group " + valueChangedClassName}>
                 <InputGroupItem>
                     <Switch
                         isDisabled={isDisabled}
@@ -681,6 +681,7 @@ export function DslPropertyField(props: Props) {
         }
         return (
             <Select
+                className={valueChangedClassName}
                 variant={SelectVariant.single}
                 aria-label={property.name}
                 onToggle={(_event, isExpanded) => {
@@ -706,6 +707,7 @@ export function DslPropertyField(props: Props) {
         }
         return (
             <Select
+                className={valueChangedClassName}
                 variant={SelectVariant.single}
                 aria-label={property.name}
                 onToggle={(_event, isExpanded) => {
@@ -739,6 +741,7 @@ export function DslPropertyField(props: Props) {
     function getMediaTypeSelect(property: PropertyMeta, value: any) {
         return (
             <Select
+                className={valueChangedClassName}
                 placeholderText="Select Media Type"
                 variant={SelectVariant.typeahead}
                 aria-label={property.name}
@@ -793,7 +796,7 @@ export function DslPropertyField(props: Props) {
                 <SelectOption key={value} value={value.trim()}/>));
         }
         return (
-            <InputGroup id={property.name} name={property.name}>
+            <InputGroup className={valueChangedClassName} id={property.name} name={property.name}>
                 <InputGroupItem isFill>
                     <Select
                         placeholderText="Select or type an URI"
@@ -807,6 +810,7 @@ export function DslPropertyField(props: Props) {
                             propertyChanged(property.name, (!isPlaceholder ? value : undefined), undefined)
                         }}
                         selections={value}
+                        createText=""
                         isOpen={isSelectOpen(property.name)}
                         isCreatable={true}
                         isInputFilterPersisted={true}
@@ -890,7 +894,7 @@ export function DslPropertyField(props: Props) {
     function getMultiValueField(property: PropertyMeta, value: any) {
         return (
             <div>
-                <TextInputGroup className="input-group">
+                <TextInputGroup className={"input-group " + valueChangedClassName}>
                     <TextInputGroupMain value={arrayValues.get(property.name) || ''}
                                         onChange={(e, v) => arrayChanged(property.name, v)}
                                         onKeyUp={e => {
@@ -1124,6 +1128,7 @@ export function DslPropertyField(props: Props) {
     const beanConstructors = element?.dslName === 'BeanFactoryDefinition' && property.name === 'constructors'
     const beanProperties = element?.dslName === 'BeanFactoryDefinition' && property.name === 'properties'
     const isSpi = property.javaType.startsWith("org.apache.camel.spi") || property.javaType.startsWith("org.apache.camel.AggregationStrategy");
+    const valueChangedClassName = PropertyUtil.hasDslPropertyValueChanged(property, value) ? 'value-changed' : '';
     return (
         <>
             <FormGroup
diff --git a/karavan-app/src/main/webui/src/designer/property/property/ExpressionField.tsx b/karavan-app/src/main/webui/src/designer/property/property/ExpressionField.tsx
index 25793d4b..97631695 100644
--- a/karavan-app/src/main/webui/src/designer/property/property/ExpressionField.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/property/ExpressionField.tsx
@@ -138,13 +138,15 @@ export function ExpressionField(props: Props) {
         selectOptions.push(s);
     })
     const exp = getExpressionProps();
+    const valueChangedClassName = PropertyUtil.hasDslPropertyValueChanged(property, value) ? 'value-changed' : '';
     return (
         <div>
             <label className="pf-v5-c-form__label" htmlFor="expression">
-                <span className="pf-v5-c-form__label-text">Language</span>
+                <span className="pf-v5-c-form__label-text value-changed-label">Language</span>
                 <span className="pf-v5-c-form__label-required" aria-hidden="true"> *</span>
             </label>
             <Select
+                className={valueChangedClassName}
                 variant={SelectVariant.typeahead}
                 aria-label={property.name}
                 onToggle={(_event, isExpanded) => {
diff --git a/karavan-app/src/main/webui/src/designer/property/property/KameletPropertyField.tsx b/karavan-app/src/main/webui/src/designer/property/property/KameletPropertyField.tsx
index b91289c1..08e6dd65 100644
--- a/karavan-app/src/main/webui/src/designer/property/property/KameletPropertyField.tsx
+++ b/karavan-app/src/main/webui/src/designer/property/property/KameletPropertyField.tsx
@@ -141,7 +141,7 @@ export function KameletPropertyField(props: Props) {
             selectOptions.push(...property.enum.map((value: string) =>
                 <SelectOption key={value} value={value ? value.trim() : value}/>));
         }
-        return <InputGroup>
+        return <InputGroup className={valueChangedClassName}>
             {showInfraSelectorButton  &&
                 <Tooltip position="bottom-end" content={"Select from " + capitalize(InfrastructureAPI.infrastructure)}>
                     <Button variant="control" onClick={e => openInfrastructureSelector(property.id)}>
@@ -239,13 +239,14 @@ export function KameletPropertyField(props: Props) {
     }
 
     function getLabel(property: Property, value: any) {
-        const labelClassName = hasValueChanged(property, value) ? 'value-changed' : 'transparent';
+        const labelClassName = hasValueChanged(property, value) ? 'value-changed-label' : '';
         return (
             <div style={{display: "flex", flexDirection: 'row', alignItems: 'center', gap: '3px'}}>
                 <Text className={labelClassName}>{property.title}</Text>
             </div>
         )
     }
+
     function getValidationHelper() {
         return (
             validated !== ValidatedOptions.default
@@ -265,6 +266,7 @@ export function KameletPropertyField(props: Props) {
     const validated = (property.format === 'password' && !isSensitiveFieldValid(value)) ? ValidatedOptions.error : ValidatedOptions.default;
     const prefix = "parameters";
     const id = prefix + "-" + property.id;
+    const valueChangedClassName = hasValueChanged(property, value) ? 'value-changed' : '';
     return (
         <div>
             <FormGroup
@@ -293,6 +295,7 @@ export function KameletPropertyField(props: Props) {
                 {/*{property.type === 'string' && getStringInput()}*/}
                 {['string','integer', 'int', 'number'].includes(property.type) && getSpecialStringInput()}
                 {property.type === 'boolean' && <Switch
+                    className={valueChangedClassName}
                     id={id} name={id}
                     value={value?.toString()}
                     aria-label={id}
diff --git a/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx b/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
index d9b71d4f..3e89cf9e 100644
--- a/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
+++ b/karavan-app/src/main/webui/src/designer/rest/RestDesigner.tsx
@@ -16,13 +16,12 @@
  */
 import React, {useEffect} from 'react';
 import {
-    Button, Drawer, DrawerContent, DrawerContentBody, DrawerPanelContent, Flex, FlexItem, Gallery, GalleryItem, Modal,
+    Button, Flex, FlexItem, Gallery, GalleryItem, Modal,
     PageSection
 } from '@patternfly/react-core';
 import './rest.css';
 import '../karavan.css';
 import {CamelElement} from "karavan-core/lib/model/IntegrationDefinition";
-import {DslProperties} from "../property/DslProperties";
 import {RestCard} from "./RestCard";
 import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
 import {
@@ -197,59 +196,44 @@ export function RestDesigner() {
         </>)
     }
 
-
-    function getPropertiesPanel() {
-        return (
-            <DrawerPanelContent isResizable hasNoBorder defaultSize={'400px'} maxSize={'800px'} minSize={'100px'}>
-                <DslProperties designerType={'rest'}/>
-            </DrawerPanelContent>
-        )
-    }
-
     const data = integration.spec.flows?.filter(f => f.dslName === 'RestDefinition');
     const configData = integration.spec.flows?.filter(f => f.dslName === 'RestConfigurationDefinition');
     const config = configData && Array.isArray(configData) ? configData[0] : undefined;
     return (
         <PageSection className="rest-designer" isFilled padding={{default: 'noPadding'}}>
-            <Drawer isExpanded isInline>
-                <DrawerContent panelContent={getPropertiesPanel()}>
-                    <DrawerContentBody>
-                        <Gallery className="gallery"
-                                 hasGutter
-                                 maxWidths={{
-                                     default: '100%',
-                                 }}
-                        >
-                            {config && getRestConfigurationCard(config)}
-                            {data && getRestCards(data)}
-                            <GalleryItem>
-                                <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentCenter"}}>
-                                    <FlexItem>
-                                        <Button
-                                            variant={data?.length === 0 ? "primary" : "secondary"}
-                                            data-click="ADD_REST"
-                                            icon={<PlusIcon/>}
-                                            onClick={e => createRest()}>Create service
-                                        </Button>
-                                    </FlexItem>
-                                    <FlexItem>
-                                        {config === undefined &&
-                                            <GalleryItem>
-                                                <Button
-                                                    variant="secondary"
-                                                    data-click="ADD_REST_REST_CONFIG"
-                                                    icon={<PlusIcon/>}
-                                                    onClick={e => createRestConfiguration()}>Create configuration
-                                                </Button>
-                                            </GalleryItem>
-                                        }
-                                    </FlexItem>
-                                </Flex>
-                            </GalleryItem>
-                        </Gallery>
-                    </DrawerContentBody>
-                </DrawerContent>
-            </Drawer>
+            <Gallery className="gallery"
+                     hasGutter
+                     maxWidths={{
+                         default: '100%',
+                     }}
+            >
+                {config && getRestConfigurationCard(config)}
+                {data && getRestCards(data)}
+                <GalleryItem>
+                    <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentCenter"}}>
+                        <FlexItem>
+                            <Button
+                                variant={data?.length === 0 ? "primary" : "secondary"}
+                                data-click="ADD_REST"
+                                icon={<PlusIcon/>}
+                                onClick={e => createRest()}>Create service
+                            </Button>
+                        </FlexItem>
+                        <FlexItem>
+                            {config === undefined &&
+                                <GalleryItem>
+                                    <Button
+                                        variant="secondary"
+                                        data-click="ADD_REST_REST_CONFIG"
+                                        icon={<PlusIcon/>}
+                                        onClick={e => createRestConfiguration()}>Create configuration
+                                    </Button>
+                                </GalleryItem>
+                            }
+                        </FlexItem>
+                    </Flex>
+                </GalleryItem>
+            </Gallery>
             {getSelectorModal()}
             {getDeleteConfirmation()}
         </PageSection>
diff --git a/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx b/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
index 6898bd85..8ec4f91c 100644
--- a/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
+++ b/karavan-app/src/main/webui/src/designer/route/RouteDesigner.tsx
@@ -16,15 +16,10 @@
  */
 import React, {useCallback, useEffect, useRef} from 'react';
 import {
-    Drawer,
-    DrawerPanelContent,
-    DrawerContent,
-    DrawerContentBody,
-    Button
+    Button,
 } from '@patternfly/react-core';
 import '../karavan.css';
 import {DslSelector} from "../selector/DslSelector";
-import {DslProperties} from "../property/DslProperties";
 import {DslConnections} from "./DslConnections";
 import PlusIcon from "@patternfly/react-icons/dist/esm/icons/plus-icon";
 import {DslElement} from "./element/DslElement";
@@ -34,7 +29,6 @@ import {useConnectionsStore, useDesignerStore, useIntegrationStore, useSelectorS
 import {shallow} from "zustand/shallow";
 import useResizeObserver from "./useResizeObserver";
 import {Command, EventBus} from "../utils/EventBus";
-import useMutationsObserver from "./useDrawerMutationsObserver";
 import {DeleteConfirmation} from "./DeleteConfirmation";
 import {DslElementMoveModal} from "./element/DslElementMoveModal";
 import {RouteTemplateElement} from "./element/RouteTemplateElement";
@@ -45,14 +39,16 @@ export function RouteDesigner() {
         isSourceKamelet, isActionKamelet, isKamelet, isSinkKamelet, createRouteTemplate} = useRouteDesignerHook();
 
     const [integration] = useIntegrationStore((state) => [state.integration], shallow)
-    const [showDeleteConfirmation, setPosition, width, height, top, left, showMoveConfirmation, setShowMoveConfirmation] =
+    const [showDeleteConfirmation, setPosition, width, height, top, left, showMoveConfirmation, setShowMoveConfirmation, passedIds, selectedStep, isDebugging] =
         useDesignerStore((s) =>
-        [s.showDeleteConfirmation, s.setPosition, s.width, s.height, s.top, s.left, s.showMoveConfirmation, s.setShowMoveConfirmation], shallow)
+        [s.showDeleteConfirmation, s.setPosition, s.width, s.height, s.top, s.left, s.showMoveConfirmation, s.setShowMoveConfirmation, s.passedNodeIds, s.selectedStep, s.isDebugging], shallow)
 
     const [showSelector] = useSelectorStore((s) => [s.showSelector], shallow)
 
     const [clearSteps] = useConnectionsStore((s) => [s.clearSteps], shallow)
 
+    const [key, setKey] = React.useState<string | number>();
+
     const onChangeGraphSize = useCallback((target: HTMLDivElement)  => {
         changeGraphSize();
     }, [])
@@ -68,19 +64,28 @@ export function RouteDesigner() {
     }
 
     const firstRef = useResizeObserver(onChangeGraphSize);
-    const secondRef = useMutationsObserver(onChangeGraphSize);
     const printerRef = useRef<HTMLDivElement | null>(null);
     const flowRef = useRef<HTMLDivElement | null>(null);
 
+    useEffect(() => {
+        if (selectedStep === undefined) {
+            setKey(Math.random.toString())
+        }
+    }, []);
+
     useEffect(()=> {
         const interval = setInterval(() => {
             changeGraphSize();
         }, 300);
         const commandSub = EventBus.onCommand()?.subscribe((command: Command) => onCommand(command, printerRef));
-        if (flowRef.current === null) {
-            clearSteps();
-        } else {
-            changeGraphSize();
+        try {
+            if (flowRef.current === null) {
+                clearSteps();
+            } else {
+                changeGraphSize();
+            }
+        } catch (error) {
+            console.error(error);
         }
         return ()=> {
             clearInterval(interval)
@@ -88,20 +93,6 @@ export function RouteDesigner() {
         }
     }, [showSelector, integration])
 
-    function getPropertiesPanel() {
-        return (
-            <DrawerPanelContent style={{transform: "initial"}}
-                                isResizable
-                                hasNoBorder
-                                defaultSize={'400px'}
-                                maxSize={'800px'}
-                                minSize={'400px'}
-            >
-                <DslProperties designerType={'routes'}/>
-            </DrawerPanelContent>
-        )
-    }
-
     function getGraphButtons() {
         const routes = CamelUi.getRoutes(integration);
         const showNewRoute = (isKamelet() && routes.length === 0) || !isKamelet();
@@ -188,20 +179,16 @@ export function RouteDesigner() {
                                         parent={undefined}/>
                         )
                     })}
-                    {getGraphButtons()}
+                    {!isDebugging && getGraphButtons()}
                 </div>
             </div>)
     }
 
     const hasFlows = integration?.spec?.flows !== undefined;
     return (
-        <div className="dsl-page" ref={firstRef}>
-            <div className="dsl-page-columns" ref={secondRef}>
-                <Drawer isExpanded isInline>
-                    <DrawerContent panelContent={getPropertiesPanel()}>
-                        <DrawerContentBody>{hasFlows && getGraph()}</DrawerContentBody>
-                    </DrawerContent>
-                </Drawer>
+        <div className="dsl-page" ref={firstRef} key={key}>
+            <div className="dsl-page-columns">
+                {hasFlows && getGraph()}
             </div>
             {showSelector && <DslSelector/>}
             {showDeleteConfirmation && <DeleteConfirmation/>}
diff --git a/karavan-app/src/main/webui/src/designer/route/element/DslElement.css b/karavan-app/src/main/webui/src/designer/route/element/DslElement.css
index 4705b76a..791acdb3 100644
--- a/karavan-app/src/main/webui/src/designer/route/element/DslElement.css
+++ b/karavan-app/src/main/webui/src/designer/route/element/DslElement.css
@@ -161,10 +161,34 @@
     width: 30px;
     height: 30px;
 }
+
 .karavan .step-element .header-icon-diamond .icon {
     transform: rotate(-45deg);
 }
 
+.karavan .step-element .element-border-passed {
+    border-width: 2px;
+    background-color: var(--pf-v5-global--palette--green-100);
+    border-color: var(--pf-v5-global--palette--green-400);
+}
+
+.karavan .step-element .header-icon-border-passed {
+    border-width: 2px;
+    background-color: var(--pf-v5-global--palette--green-100);
+    border-color: var(--pf-v5-global--palette--green-400);
+}
+
+.karavan .step-element .header-icon-border-current {
+    border-width: 2px;
+    background-color: var(--pf-v5-global--palette--gold-100);
+    border-color: var(--pf-v5-global--palette--gold-400);
+}
+
+.karavan .step-element .header-icon-border-failed {
+    border-width: 2px;
+    background-color: var(--pf-v5-global--palette--red-100);
+    border-color: var(--pf-v5-global--palette--red-200);
+}
 
 .karavan .step-element .route-icons {
     position: absolute;
diff --git a/karavan-app/src/main/webui/src/designer/route/element/DslElement.tsx b/karavan-app/src/main/webui/src/designer/route/element/DslElement.tsx
index cf5e4200..9a351d1d 100644
--- a/karavan-app/src/main/webui/src/designer/route/element/DslElement.tsx
+++ b/karavan-app/src/main/webui/src/designer/route/element/DslElement.tsx
@@ -15,7 +15,6 @@
  * limitations under the License.
  */
 import React, {CSSProperties, useState} from 'react';
-import {Tooltip,} from '@patternfly/react-core';
 import '../../karavan.css';
 import './DslElement.css';
 import {CamelElement} from "karavan-core/lib/model/IntegrationDefinition";
@@ -53,9 +52,9 @@ export function DslElement(props: Props) {
 
     const [integration] = useIntegrationStore((s) => [s.integration], shallow)
 
-    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, setMoveElements] =
+    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, setMoveElements, passedRouteId, failedRouteId, isDebugging] =
         useDesignerStore((s) =>
-            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.setMoveElements], shallow)
+            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.setMoveElements, s.passedRouteId, s.failedRouteId, s.isDebugging], shallow)
     const [isDragging, setIsDragging] = useState<boolean>(false);
 
     const [isDraggedOver, setIsDraggedOver] = useState<boolean>(false);
@@ -65,13 +64,13 @@ export function DslElement(props: Props) {
         if (isInsert && props.parent) {
             openSelector(props.parent.uuid, props.parent.dslName, showSteps, props.position);
         } else {
-            openSelector(props.step.uuid, props.step.dslName, showSteps);
+            openSelector(step.uuid, step.dslName, showSteps);
         }
     }
 
     function onSelectElement(evt: React.MouseEvent) {
         evt.stopPropagation();
-        selectElement(props.step);
+        selectElement(step);
     }
 
     function dragElement(event: React.DragEvent<HTMLDivElement>, element: CamelElement) {
@@ -91,11 +90,10 @@ export function DslElement(props: Props) {
     }
 
     function isElementSelected(): boolean {
-        return selectedUuids.includes(props.step.uuid);
+        return selectedUuids.includes(step.uuid);
     }
 
     function hasBorder(): boolean {
-        const step = props.step;
         if (['FilterDefinition', 'RouteDefinition', 'RouteConfigurationDefinition'].includes(step.dslName)) {
             return true;
         }
@@ -108,25 +106,24 @@ export function DslElement(props: Props) {
         ].includes(step.dslName)) {
             return false;
         }
-        return props.step?.hasSteps();
+        return step?.hasSteps();
     }
 
     function isNotDraggable(): boolean {
-        return ['FromDefinition', 'RouteConfigurationDefinition', 'RouteDefinition', 'WhenDefinition', 'OtherwiseDefinition'].includes(props.step.dslName);
+        return ['FromDefinition', 'RouteConfigurationDefinition', 'RouteDefinition', 'WhenDefinition', 'OtherwiseDefinition'].includes(step.dslName);
     }
 
     function isAddStepButtonLeft(): boolean {
         return ['MulticastDefinition', 'LoadBalanceDefinition']
-            .includes(props.step.dslName);
+            .includes(step.dslName);
     }
 
     function isHorizontal(): boolean {
-        return ['MulticastDefinition', 'LoadBalanceDefinition'].includes(props.step.dslName);
+        return ['MulticastDefinition', 'LoadBalanceDefinition'].includes(step.dslName);
     }
 
 
     function isInStepWithChildren() {
-        const step: CamelElement = props.step;
         const children = CamelDefinitionApiExt.getElementChildrenDefinition(step.dslName);
         return children.filter((c: ChildElement) => c.name === 'steps' || c.multiple).length > 0 && props.inSteps;
     }
@@ -170,7 +167,6 @@ export function DslElement(props: Props) {
     }
 
     function getChildElements() {
-        const step: CamelElement = props.step;
         let children: ChildElement[] = CamelDefinitionApiExt.getElementChildrenDefinition(step.dslName);
         const notOnlySteps = children.filter(c => c.name === 'steps').length === 1
             && children.filter(c => c.multiple && c.name !== 'steps').length > 0;
@@ -194,7 +190,6 @@ export function DslElement(props: Props) {
     }
 
     function getChildDslElements(child: ChildElement, index: number, notOnlySteps: boolean) {
-        const step = props.step;
         const children: CamelElement[] = CamelDefinitionApiExt.getElementChildren(step, child);
         if (children.length > 0) {
             return (
@@ -241,7 +236,7 @@ export function DslElement(props: Props) {
     function getAddStepButton() {
         const {step} = props;
         const hideAddButton = step.dslName === 'StepDefinition' && !CamelDisplayUtil.isStepDefinitionExpanded(integration, step.uuid, selectedUuids.at(0));
-        if (hideAddButton) return (<></>)
+        if (hideAddButton || isDebugging) return (<></>)
         else return (
             <button type="button"
                     aria-label="Add"
@@ -252,26 +247,47 @@ export function DslElement(props: Props) {
         )
     }
 
-    const element: CamelElement = props.step;
+    function getBorderColor() {
+        if (step.dslName === 'RouteDefinition' && (step as any).id === failedRouteId) {
+            return 'var(--pf-v5-global--danger-color--100)';
+        } else if (step.dslName === 'RouteDefinition' && (step as any).id === passedRouteId) {
+            return "var(--pf-v5-global--palette--green-400)";
+        } else {
+            return isElementSelected() ? "var(--step-border-color-selected)" : "var(--step-border-color)";
+        }
+    }
+
+    function getBorderWidth() {
+        if (step.dslName === 'RouteDefinition' && (step as any).id === passedRouteId) {
+            return "2px";
+        } else if (step.dslName === 'RouteDefinition' && (step as any).id === failedRouteId) {
+            return "2px";
+        } else {
+            return '1px';
+        }
+    }
+
+    const step: CamelElement = props.step;
     const className = "step-element"
-        + (!props.step.showChildren ? " hidden-step" : "")
-        + ((element as any).disabled ? " disabled " : "");
+        + (!step.showChildren ? " hidden-step" : "")
+        + ((step as any).disabled ? " disabled " : "");
     return (
-        <div key={"root" + element.uuid}
+        <div key={"root" + step.uuid}
              className={className}
              ref={el => sendPosition(el)}
              style={{
+                 borderWidth: getBorderWidth(),
                  borderStyle: hasBorder() ? "dashed" : "none",
-                 borderColor: isElementSelected() ? "var(--step-border-color-selected)" : "var(--step-border-color)",
+                 borderColor:  getBorderColor(),
                  marginTop: isInStepWithChildren() ? "16px" : "8px",
-                 zIndex: element.dslName === 'ToDefinition' ? 20 : 10,
+                 zIndex: step.dslName === 'ToDefinition' ? 20 : 10,
                  boxShadow: isDraggedOver ? "0px 0px 1px 2px var(--step-border-color-selected)" : "none",
              }}
              onMouseOver={event => event.stopPropagation()}
              onClick={event => onSelectElement(event)}
              onDragStart={event => {
                  event.stopPropagation();
-                 event.dataTransfer.setData("text/plain", element.uuid);
+                 event.dataTransfer.setData("text/plain", step.uuid);
                  (event.target as any).style.opacity = .5;
                  setIsDragging(true);
              }}
@@ -282,14 +298,14 @@ export function DslElement(props: Props) {
              onDragOver={event => {
                  event.preventDefault();
                  event.stopPropagation();
-                 if (element.dslName !== 'FromDefinition' && !isDragging) {
+                 if (step.dslName !== 'FromDefinition' && !isDragging) {
                      setIsDraggedOver(true);
                  }
              }}
              onDragEnter={event => {
                  event.preventDefault();
                  event.stopPropagation();
-                 if (element.dslName !== 'FromDefinition') {
+                 if (step.dslName !== 'FromDefinition') {
                      setIsDraggedOver(true);
                  }
              }}
@@ -298,11 +314,11 @@ export function DslElement(props: Props) {
                  event.stopPropagation();
                  setIsDraggedOver(false);
              }}
-             onDrop={event => dragElement(event, element)}
+             onDrop={event => dragElement(event, step)}
              draggable={!isNotDraggable()}
         >
             <DslElementHeader headerRef={headerRef}
-                              step={props.step}
+                              step={step}
                               parent={props.parent}
                               nextStep={props.nextStep}
                               prevStep={props.prevStep}
diff --git a/karavan-app/src/main/webui/src/designer/route/element/DslElementHeader.tsx b/karavan-app/src/main/webui/src/designer/route/element/DslElementHeader.tsx
index aae10161..db181cff 100644
--- a/karavan-app/src/main/webui/src/designer/route/element/DslElementHeader.tsx
+++ b/karavan-app/src/main/webui/src/designer/route/element/DslElementHeader.tsx
@@ -55,9 +55,9 @@ export function DslElementHeader(props: Props) {
 
     const [integration] = useIntegrationStore((s) => [s.integration], shallow)
 
-    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, setMoveElements] =
+    const [selectedUuids, selectedStep, showMoveConfirmation, setShowMoveConfirmation, setMoveElements, passedIds, passedRouteId, failed, failedRouteId, suspendedNodeId, isDebugging] =
         useDesignerStore((s) =>
-            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.setMoveElements], shallow)
+            [s.selectedUuids, s.selectedStep, s.showMoveConfirmation, s.setShowMoveConfirmation, s.setMoveElements, s.passedNodeIds, s.passedRouteId, s.failed, s.failedRouteId, s.suspendedNodeId, s.isDebugging], shallow)
 
     const step: CamelElement = props.step;
 
@@ -66,27 +66,27 @@ export function DslElementHeader(props: Props) {
         if (isInsert && props.parent) {
             openSelector(props.parent.uuid, props.parent.dslName, showSteps, props.position);
         } else {
-            openSelector(props.step.uuid, props.step.dslName, showSteps);
+            openSelector(step.uuid, step.dslName, showSteps);
         }
     }
 
     function onDeleteElement(evt: React.MouseEvent) {
         evt.stopPropagation();
-        onShowDeleteConfirmation(props.step.uuid);
+        onShowDeleteConfirmation(step.uuid);
     }
 
     function isElementSelected(): boolean {
-        return selectedUuids.includes(props.step.uuid);
+        return selectedUuids.includes(step.uuid);
     }
 
     function isWide(): boolean {
         return ['RouteConfigurationDefinition', 'RouteTemplateDefinition', 'RouteDefinition', 'ChoiceDefinition', 'MulticastDefinition',
             'LoadBalanceDefinition', 'TryDefinition', 'CircuitBreakerDefinition']
-            .includes(props.step.dslName);
+            .includes(step.dslName);
     }
 
     function isHorizontal(): boolean {
-        return ['MulticastDefinition', 'LoadBalanceDefinition'].includes(props.step.dslName);
+        return ['MulticastDefinition', 'LoadBalanceDefinition'].includes(step.dslName);
     }
 
     function getChildrenInfo(step: CamelElement): [boolean, number, boolean, number, number] {
@@ -111,7 +111,7 @@ export function DslElementHeader(props: Props) {
 
     function getHasWideChildrenElement(childrenInfo: [boolean, number, boolean, number, number]) {
         const [hasStepsField, stepsChildrenCount, hasNonStepsFields, nonStepChildrenCount, childrenCount] = childrenInfo;
-        if (props.step.dslName === 'SetHeadersDefinition') return false;
+        if (step.dslName === 'SetHeadersDefinition') return false;
         else if (isHorizontal() && stepsChildrenCount > 1) return true;
         else if (hasStepsField && stepsChildrenCount > 0 && hasNonStepsFields && nonStepChildrenCount > 0) return true;
         else if (!hasStepsField && hasNonStepsFields && childrenCount > 1) return true;
@@ -123,18 +123,19 @@ export function DslElementHeader(props: Props) {
         const style: CSSProperties = {
             width: isWide() ? "100%" : "",
             fontWeight: isElementSelected() ? "bold" : "normal",
+            borderWidth: getBorderWidth(),
+            borderColor: getBorderColor(),
         };
         return style;
     }
 
     function getAvailableModels() { // TODO: make static list-of-values instead
-        const step: CamelElement = props.step
         return CamelUi.getSelectorModelsForParent(step.dslName, false);
     }
 
     const availableModels = useMemo(
         () => getAvailableModels(),
-        [props.step.dslName]
+        [step.dslName]
     );
 
     function hasElements(rc: RouteConfigurationDefinition): boolean {
@@ -154,9 +155,36 @@ export function DslElementHeader(props: Props) {
         } else {
             classes.push('header-icon-circle');
         }
+        const passed = passedIds.includes((step as any).id);
+        if (step.dslName === 'FromDefinition') {
+        }
+        if (passed) {
+            classes.push("header-icon-border-passed");
+        }
+        if (suspendedNodeId === (step as any).id) {
+            classes.push(failed ? "header-icon-border-failed" : "header-icon-border-current")
+        }
         return classes.join(" ");
     }
 
+    function getBorderColor() {
+        if (step.dslName === 'RouteDefinition' && (step as any).id === failedRouteId) {
+            return 'var(--pf-v5-global--danger-color--100)';
+        } else if (step.dslName === 'RouteDefinition' && (step as any).id === passedRouteId) {
+            return "var(--pf-v5-global--palette--green-400)";
+        } else {
+            return isElementSelected() ? "var(--step-border-color-selected)" : "var(--step-border-color)";
+        }
+    }
+
+    function getBorderWidth() {
+        if (step.dslName === 'RouteDefinition' && (step as any).id === passedRouteId) {
+            return "2px";
+        } else {
+            return '1px';
+        }
+    }
+
     function getHeaderClasses(): string {
         const classes: string[] = [];
         if (step.dslName === 'RouteDefinition') {
@@ -182,7 +210,6 @@ export function DslElementHeader(props: Props) {
     }
 
     function getHeader() {
-        const step: CamelElement = props.step;
         const parent = props.parent;
         const inRouteConfiguration = parent !== undefined && parent.dslName === 'RouteConfigurationDefinition';
         const showAddButton = !['CatchDefinition', 'RouteTemplateDefinition', 'RouteDefinition'].includes(step.dslName) && availableModels.length > 0;
@@ -191,11 +218,11 @@ export function DslElementHeader(props: Props) {
             && !inRouteConfiguration;
         const showDeleteButton = !('RouteDefinition' === step.dslName && 'RouteTemplateDefinition' === parent?.dslName);
         const headerClasses = getHeaderClasses();
-        const childrenInfo = getChildrenInfo(props.step) || [];
+        const childrenInfo = getChildrenInfo(step) || [];
         const hasWideChildrenElement = getHasWideChildrenElement(childrenInfo)
         return (
             <div className={"dsl-element " + headerClasses} style={getHeaderStyle()} ref={props.headerRef}>
-                {!['RouteConfigurationDefinition', 'RouteTemplateDefinition', 'RouteDefinition'].includes(props.step.dslName) &&
+                {!['RouteConfigurationDefinition', 'RouteTemplateDefinition', 'RouteDefinition'].includes(step.dslName) &&
                     <div
                         className={getHeaderIconClasses()}
                         style={isWide() ? {width: ""} : {}}>
@@ -220,9 +247,9 @@ export function DslElementHeader(props: Props) {
                     {hasWideChildrenElement && <div className="spacer"/>}
                     {getHeaderTextWithTooltip(step, hasWideChildrenElement)}
                 </div>
-                {showInsertButton && getInsertElementButton()}
-                {showDeleteButton && getDeleteButton()}
-                {showAddButton && getAddElementButton()}
+                {!isDebugging && showInsertButton && getInsertElementButton()}
+                {!isDebugging && showDeleteButton && getDeleteButton()}
+                {!isDebugging && showAddButton && getAddElementButton()}
             </div>
         )
     }
@@ -235,7 +262,7 @@ export function DslElementHeader(props: Props) {
         } else {
             let description: string = (step as any).description;
             description = description !== undefined && description?.length > 32 ? description.substring(0, 32).concat("...") : description;
-            return description ? description : CamelUi.getElementTitle(props.step);
+            return description ? description : CamelUi.getElementTitle(step);
         }
     }
 
@@ -269,8 +296,8 @@ export function DslElementHeader(props: Props) {
     }
 
     function getHeaderTooltip(): string | React.JSX.Element | undefined {
-        if (CamelUi.isShowExpressionTooltip(props.step)) {
-            const et =  CamelUi.getExpressionTooltip(props.step);
+        if (CamelUi.isShowExpressionTooltip(step)) {
+            const et =  CamelUi.getExpressionTooltip(step);
             const exp = et[1];
             return (
                 <div>
@@ -279,7 +306,7 @@ export function DslElementHeader(props: Props) {
                 </div>
             )
         }
-        if (CamelUi.isShowUriTooltip(props.step)) return  CamelUi.getUriTooltip(props.step);
+        if (CamelUi.isShowUriTooltip(step)) return  CamelUi.getUriTooltip(step);
         return undefined;
     }
 
@@ -287,7 +314,7 @@ export function DslElementHeader(props: Props) {
     function getAddElementButton() {
         return (
             <Tooltip position={"bottom"}
-                     content={<div>{"Add DSL element to " + CamelDisplayUtil.getTitle(props.step)}</div>}>
+                     content={<div>{"Add DSL element to " + CamelDisplayUtil.getTitle(step)}</div>}>
                 <button
                     type="button"
                     aria-label="Add"
@@ -321,7 +348,7 @@ export function DslElementHeader(props: Props) {
     }
 
     const tooltip = getHeaderTooltip();
-    if (tooltip !== undefined && !props.isDragging) {
+    if (tooltip !== undefined && !props.isDragging && !isDebugging) {
         return getHeaderWithTooltip(tooltip);
     }
     return getHeader();
diff --git a/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx b/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx
index 8734dbad..a8c3a089 100644
--- a/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx
+++ b/karavan-app/src/main/webui/src/knowledgebase/KnowledgebasePage.tsx
@@ -69,27 +69,27 @@ export const KnowledgebasePage = (props: Props) => {
         return <Toolbar id="toolbar-group-types">
             <ToolbarContent>
                 <Flex>
-                {tab === 'kamelets' && <FlexItem>
-                    <Switch
-                        label="Custom only"
-                        isChecked={customOnly}
-                        onChange={(_event, checked) => setCustomOnly(checked)}
-                    />
-                </FlexItem>}
-                <FlexItem>
-                    <TextInput className="text-field" type="search" id="search" name="search"
-                               value={filter}
-                               onChange={(_event, value) => setFilter(value)}
-                               autoComplete="off"
-                               placeholder="Search by name"/>
-                </FlexItem>
+                    {tab === 'kamelets' && <FlexItem>
+                        <Switch
+                            label="Custom only"
+                            isChecked={customOnly}
+                            onChange={(_event, checked) => setCustomOnly(checked)}
+                        />
+                    </FlexItem>}
+                    <FlexItem>
+                        <TextInput className="text-field" type="search" id="search" name="search"
+                                   value={filter}
+                                   onChange={(_event, value) => setFilter(value)}
+                                   autoComplete="off"
+                                   placeholder="Search by name"/>
+                    </FlexItem>
                 </Flex>
             </ToolbarContent>
         </Toolbar>
     }
 
     let kameletList: KameletModel[] = KameletApi.getKamelets().filter(kamelet =>
-            kamelet.spec.definition.title.toLowerCase().includes(filter.toLowerCase()));
+        kamelet.spec.definition.title.toLowerCase().includes(filter.toLowerCase()));
     if (customOnly) kameletList = kameletList.filter(k => KameletApi.getCustomKameletNames().includes(k.metadata.name));
 
     const components = ComponentApi.getComponents().filter(c => {
diff --git a/karavan-space/package-lock.json b/karavan-space/package-lock.json
new file mode 100644
index 00000000..5e79ab3c
--- /dev/null
+++ b/karavan-space/package-lock.json
@@ -0,0 +1,7860 @@
+{
+  "name": "karavan-space",
+  "version": "4.10.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "karavan-space",
+      "version": "4.10.0",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@monaco-editor/react": "^4.6.0",
+        "@patternfly/patternfly": "^5.4.0",
+        "@patternfly/react-core": "^5.4.0",
+        "@patternfly/react-table": "^5.4.0",
+        "@patternfly/react-topology": "^5.4.0",
+        "@types/js-yaml": "4.0.9",
+        "@types/uuid": "9.0.8",
+        "axios": "1.7.7",
+        "html-to-image": "1.11.11",
+        "karavan-core": "file:../karavan-core",
+        "netlify-auth-providers": "^1.0.0-alpha5",
+        "octokit": "^4.0.2",
+        "react": "18.3.1",
+        "react-dom": "18.3.1",
+        "react-resizable-panels": "^2.1.7",
+        "rxjs": "7.8.1",
+        "usehooks-ts": "^3.1.0",
+        "uuid": "10.0.0",
+        "zustand": "^4.5.5"
+      },
+      "devDependencies": {
+        "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
+        "@svgr/webpack": "^7.0.0",
+        "@types/dagre": "^0.7.52",
+        "@types/netlify-auth-providers": "^1.0.2",
+        "@types/node": "20.14.2",
+        "@types/react": "^18.3.3",
+        "@types/react-dom": "^18.3.0",
+        "@typescript-eslint/eslint-plugin": "^5.62.0",
+        "@typescript-eslint/parser": "^5.62.0",
+        "@vitejs/plugin-react": "^4.3.1",
+        "eslint": "^8.39.0",
+        "monaco-editor": "0.49.0",
+        "typescript": "4.9.5",
+        "vite": "^5.4.8",
+        "vite-plugin-svgr": "^4.2.0",
+        "vite-tsconfig-paths": "^5.0.1"
+      }
+    },
+    "../karavan-core": {
+      "version": "4.10.0",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/js-yaml": "^4.0.9",
+        "@types/uuid": "^10.0.0",
+        "tsconfig-paths": "^4.2.0",
+        "uuid": "10.0.0"
+      },
+      "devDependencies": {
+        "@types/chai": "^4.3.16",
+        "@types/dagre": "^0.7.52",
+        "@types/mocha": "^10.0.7",
+        "@types/node": "20.14.9",
+        "chai": "^5.1.1",
+        "cross-env": "^7.0.3",
+        "fs": "^0.0.1-security",
+        "mocha": "^10.5.2",
+        "ts-node": "^10.9.2",
+        "tsc-alias": "^1.8.10",
+        "typescript": "4.9.5"
+      }
+    },
+    "../karavan-core/node_modules/@cspotcode/source-map-support": {
+      "version": "0.8.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "0.3.9"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../karavan-core/node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "../karavan-core/node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.9",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.0.3",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
+    "../karavan-core/node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/@tsconfig/node10": {
+      "version": "1.0.11",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@tsconfig/node12": {
+      "version": "1.0.11",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@tsconfig/node14": {
+      "version": "1.0.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@tsconfig/node16": {
+      "version": "1.0.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@types/chai": {
+      "version": "4.3.16",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@types/dagre": {
+      "version": "0.7.52",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@types/js-yaml": {
+      "version": "4.0.9",
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@types/mocha": {
+      "version": "10.0.7",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/@types/node": {
+      "version": "20.14.9",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "../karavan-core/node_modules/@types/uuid": {
+      "version": "10.0.0",
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/acorn": {
+      "version": "8.11.3",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "../karavan-core/node_modules/acorn-walk": {
+      "version": "8.3.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "../karavan-core/node_modules/ansi-colors": {
+      "version": "4.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "../karavan-core/node_modules/anymatch": {
+      "version": "3.1.3",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/arg": {
+      "version": "4.1.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/argparse": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "../karavan-core/node_modules/array-union": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/assertion-error": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../karavan-core/node_modules/balanced-match": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "../karavan-core/node_modules/braces": {
+      "version": "3.0.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/browser-stdout": {
+      "version": "1.3.1",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/camelcase": {
+      "version": "6.3.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/chai": {
+      "version": "5.1.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assertion-error": "^2.0.1",
+        "check-error": "^2.1.1",
+        "deep-eql": "^5.0.1",
+        "loupe": "^3.1.0",
+        "pathval": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../karavan-core/node_modules/chalk": {
+      "version": "4.1.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "../karavan-core/node_modules/chalk/node_modules/supports-color": {
+      "version": "7.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/check-error": {
+      "version": "2.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 16"
+      }
+    },
+    "../karavan-core/node_modules/chokidar": {
+      "version": "3.5.3",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "../karavan-core/node_modules/cliui": {
+      "version": "7.0.4",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "../karavan-core/node_modules/color-convert": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "../karavan-core/node_modules/color-name": {
+      "version": "1.1.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/commander": {
+      "version": "9.5.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || >=14"
+      }
+    },
+    "../karavan-core/node_modules/create-require": {
+      "version": "1.1.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/cross-env": {
+      "version": "7.0.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cross-spawn": "^7.0.1"
+      },
+      "bin": {
+        "cross-env": "src/bin/cross-env.js",
+        "cross-env-shell": "src/bin/cross-env-shell.js"
+      },
+      "engines": {
+        "node": ">=10.14",
+        "npm": ">=6",
+        "yarn": ">=1"
+      }
+    },
+    "../karavan-core/node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/debug": {
+      "version": "4.3.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "../karavan-core/node_modules/debug/node_modules/ms": {
+      "version": "2.1.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/decamelize": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/deep-eql": {
+      "version": "5.0.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/diff": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.3.1"
+      }
+    },
+    "../karavan-core/node_modules/dir-glob": {
+      "version": "3.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/escalade": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/fast-glob": {
+      "version": "3.3.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "../karavan-core/node_modules/fastq": {
+      "version": "1.17.1",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "../karavan-core/node_modules/fill-range": {
+      "version": "7.1.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/find-up": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/flat": {
+      "version": "5.0.2",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "bin": {
+        "flat": "cli.js"
+      }
+    },
+    "../karavan-core/node_modules/fs": {
+      "version": "0.0.1-security",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/fsevents": {
+      "version": "2.3.3",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "../karavan-core/node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "../karavan-core/node_modules/get-func-name": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "../karavan-core/node_modules/glob": {
+      "version": "8.1.0",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^5.0.1",
+        "once": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "../karavan-core/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "../karavan-core/node_modules/globby": {
+      "version": "11.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/has-flag": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/he": {
+      "version": "1.2.0",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "../karavan-core/node_modules/ignore": {
+      "version": "5.3.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "../karavan-core/node_modules/inflight": {
+      "version": "1.0.6",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "../karavan-core/node_modules/inherits": {
+      "version": "2.0.4",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/is-extglob": {
+      "version": "2.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "../karavan-core/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/is-glob": {
+      "version": "4.0.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "../karavan-core/node_modules/is-number": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "../karavan-core/node_modules/is-plain-obj": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/isexe": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "../karavan-core/node_modules/json5": {
+      "version": "2.2.3",
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/locate-path": {
+      "version": "6.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/log-symbols": {
+      "version": "4.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/loupe": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "get-func-name": "^2.0.1"
+      }
+    },
+    "../karavan-core/node_modules/make-error": {
+      "version": "1.3.6",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/merge2": {
+      "version": "1.4.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/micromatch": {
+      "version": "4.0.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "../karavan-core/node_modules/minimatch": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "../karavan-core/node_modules/minimist": {
+      "version": "1.2.8",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "../karavan-core/node_modules/mocha": {
+      "version": "10.5.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-colors": "4.1.1",
+        "browser-stdout": "1.3.1",
+        "chokidar": "^3.5.3",
+        "debug": "4.3.4",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "8.1.0",
+        "he": "1.2.0",
+        "js-yaml": "4.1.0",
+        "log-symbols": "4.1.0",
+        "minimatch": "5.0.1",
+        "ms": "2.1.3",
+        "serialize-javascript": "6.0.0",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "workerpool": "6.2.1",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
+      },
+      "bin": {
+        "_mocha": "bin/_mocha",
+        "mocha": "bin/mocha.js"
+      },
+      "engines": {
+        "node": ">= 14.0.0"
+      }
+    },
+    "../karavan-core/node_modules/ms": {
+      "version": "2.1.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/mylas": {
+      "version": "2.1.13",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/raouldeheer"
+      }
+    },
+    "../karavan-core/node_modules/normalize-path": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "../karavan-core/node_modules/once": {
+      "version": "1.4.0",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "../karavan-core/node_modules/p-limit": {
+      "version": "3.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/p-locate": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/path-exists": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/path-key": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/path-type": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/pathval": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 14.16"
+      }
+    },
+    "../karavan-core/node_modules/picomatch": {
+      "version": "2.3.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "../karavan-core/node_modules/plimit-lit": {
+      "version": "1.6.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "queue-lit": "^1.5.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../karavan-core/node_modules/queue-lit": {
+      "version": "1.5.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../karavan-core/node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/randombytes": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "../karavan-core/node_modules/readdirp": {
+      "version": "3.6.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "../karavan-core/node_modules/require-directory": {
+      "version": "2.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "../karavan-core/node_modules/reusify": {
+      "version": "1.0.4",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "../karavan-core/node_modules/run-parallel": {
+      "version": "1.2.0",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "../karavan-core/node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/serialize-javascript": {
+      "version": "6.0.0",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "../karavan-core/node_modules/shebang-command": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/slash": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/string-width": {
+      "version": "4.2.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "../karavan-core/node_modules/strip-bom": {
+      "version": "3.0.0",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "../karavan-core/node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "../karavan-core/node_modules/supports-color": {
+      "version": "8.1.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "../karavan-core/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "../karavan-core/node_modules/ts-node": {
+      "version": "10.9.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@cspotcode/source-map-support": "^0.8.0",
+        "@tsconfig/node10": "^1.0.7",
+        "@tsconfig/node12": "^1.0.7",
+        "@tsconfig/node14": "^1.0.0",
+        "@tsconfig/node16": "^1.0.2",
+        "acorn": "^8.4.1",
+        "acorn-walk": "^8.1.1",
+        "arg": "^4.1.0",
+        "create-require": "^1.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "v8-compile-cache-lib": "^3.0.1",
+        "yn": "3.1.1"
+      },
+      "bin": {
+        "ts-node": "dist/bin.js",
+        "ts-node-cwd": "dist/bin-cwd.js",
+        "ts-node-esm": "dist/bin-esm.js",
+        "ts-node-script": "dist/bin-script.js",
+        "ts-node-transpile-only": "dist/bin-transpile.js",
+        "ts-script": "dist/bin-script-deprecated.js"
+      },
+      "peerDependencies": {
+        "@swc/core": ">=1.2.50",
+        "@swc/wasm": ">=1.2.50",
+        "@types/node": "*",
+        "typescript": ">=2.7"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "@swc/wasm": {
+          "optional": true
+        }
+      }
+    },
+    "../karavan-core/node_modules/ts-node/node_modules/diff": {
+      "version": "4.0.2",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.3.1"
+      }
+    },
+    "../karavan-core/node_modules/tsc-alias": {
+      "version": "1.8.10",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chokidar": "^3.5.3",
+        "commander": "^9.0.0",
+        "globby": "^11.0.4",
+        "mylas": "^2.1.9",
+        "normalize-path": "^3.0.0",
+        "plimit-lit": "^1.2.6"
+      },
+      "bin": {
+        "tsc-alias": "dist/bin/index.js"
+      }
+    },
+    "../karavan-core/node_modules/tsconfig-paths": {
+      "version": "4.2.0",
+      "license": "MIT",
+      "dependencies": {
+        "json5": "^2.2.2",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/typescript": {
+      "version": "4.9.5",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    },
+    "../karavan-core/node_modules/undici-types": {
+      "version": "5.26.5",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/uuid": {
+      "version": "10.0.0",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "../karavan-core/node_modules/v8-compile-cache-lib": {
+      "version": "3.0.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "../karavan-core/node_modules/which": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "../karavan-core/node_modules/workerpool": {
+      "version": "6.2.1",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "../karavan-core/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "../karavan-core/node_modules/wrappy": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "ISC"
+    },
+    "../karavan-core/node_modules/y18n": {
+      "version": "5.0.8",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "../karavan-core/node_modules/yargs": {
+      "version": "16.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "../karavan-core/node_modules/yargs-parser": {
+      "version": "20.2.4",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "../karavan-core/node_modules/yargs-unparser": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "camelcase": "^6.0.0",
+        "decamelize": "^4.0.0",
+        "flat": "^5.0.2",
+        "is-plain-obj": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "../karavan-core/node_modules/yn": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "../karavan-core/node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.25.0",
+        "@babel/helper-compilation-targets": "^7.25.2",
+        "@babel/helper-module-transforms": "^7.25.2",
+        "@babel/helpers": "^7.25.0",
+        "@babel/parser": "^7.25.0",
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.2",
+        "@babel/types": "^7.25.2",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.25.6",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.25.2",
+        "@babel/helper-validator-option": "^7.24.8",
+        "browserslist": "^4.23.1",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/traverse": "^7.25.4",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "regexpu-core": "^5.3.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider": {
+      "version": "0.6.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.22.6",
+        "@babel/helper-plugin-utils": "^7.22.5",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.24.8",
+        "@babel/types": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-remap-async-to-generator": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-wrap-function": "^7.25.0",
+        "@babel/traverse": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.24.8",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-wrap-function": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.0",
+        "@babel/types": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.25.0",
+        "@babel/types": "^7.25.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.25.6"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.25.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.18.6",
+        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-static-block": {
+      "version": "7.14.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-assertions": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-private-property-in-object": {
+      "version": "7.14.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.14.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+      "version": "7.18.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+        "@babel/helper-plugin-utils": "^7.18.6"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-generator-functions": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-remap-async-to-generator": "^7.25.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/traverse": "^7.25.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-properties": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.25.4",
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-class-static-block": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.12.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.25.2",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-replace-supers": "^7.25.0",
+        "@babel/traverse": "^7.25.4",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dynamic-import": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-export-namespace-from": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.25.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.24.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/traverse": "^7.25.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-json-strings": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-member-expression-literals": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-amd": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-commonjs": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.8",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-simple-access": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-systemjs": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "@babel/traverse": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-umd": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-new-target": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-numeric-separator": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-rest-spread": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-catch-binding": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-optional-chaining": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-methods": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.25.4",
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-private-property-in-object": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-constant-elements": {
+      "version": "7.25.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-display-name": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/types": "^7.25.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-development": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/plugin-transform-react-jsx": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-self": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-source": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-pure-annotations": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "regenerator-transform": "^0.15.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.24.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.25.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.25.0",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-syntax-typescript": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-property-regex": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.25.2",
+        "@babel/helper-plugin-utils": "^7.24.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.25.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.25.4",
+        "@babel/helper-compilation-targets": "^7.25.2",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/helper-validator-option": "^7.24.8",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
+        "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
+        "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-class-static-block": "^7.14.5",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-import-assertions": "^7.24.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+        "@babel/plugin-syntax-top-level-await": "^7.14.5",
+        "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+        "@babel/plugin-transform-arrow-functions": "^7.24.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.25.4",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.25.0",
+        "@babel/plugin-transform-class-properties": "^7.25.4",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.25.4",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.8",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.25.1",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.25.2",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.25.0",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.8",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.25.4",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.8",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.25.4",
+        "@babel/preset-modules": "0.1.6-no-external-plugins",
+        "babel-plugin-polyfill-corejs2": "^0.4.10",
+        "babel-plugin-polyfill-corejs3": "^0.10.6",
+        "babel-plugin-polyfill-regenerator": "^0.6.1",
+        "core-js-compat": "^3.37.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": {
+      "version": "7.21.0-placeholder-for-preset-env.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.6-no-external-plugins",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/@babel/preset-react": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-transform-react-display-name": "^7.24.7",
+        "@babel/plugin-transform-react-jsx": "^7.24.7",
+        "@babel/plugin-transform-react-jsx-development": "^7.24.7",
+        "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-typescript": {
+      "version": "7.24.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-typescript": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/regjsgen": {
+      "version": "0.8.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.25.6",
+      "license": "MIT",
+      "dependencies": {
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.25.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/parser": "^7.25.0",
+        "@babel/types": "^7.25.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.25.6",
+        "@babel/parser": "^7.25.6",
+        "@babel/template": "^7.25.0",
+        "@babel/types": "^7.25.6",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.25.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.24.8",
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@dagrejs/dagre": {
+      "version": "1.1.2",
+      "license": "MIT",
+      "dependencies": {
+        "@dagrejs/graphlib": "2.2.2"
+      }
+    },
+    "node_modules/@dagrejs/graphlib": {
+      "version": "2.2.2",
+      "license": "MIT",
+      "engines": {
+        "node": ">17.0.0"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.21.5",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.11.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/eslintrc/node_modules/globals": {
+      "version": "13.24.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "8.57.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.13.0",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^2.0.3",
+        "debug": "^4.3.1",
+        "minimatch": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "2.0.3",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@monaco-editor/loader": {
+      "version": "1.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "state-local": "^1.0.6"
+      },
+      "peerDependencies": {
+        "monaco-editor": ">= 0.21.0 < 1"
+      }
+    },
+    "node_modules/@monaco-editor/react": {
+      "version": "4.6.0",
+      "license": "MIT",
+      "dependencies": {
+        "@monaco-editor/loader": "^1.4.0"
+      },
+      "peerDependencies": {
+        "monaco-editor": ">= 0.25.0 < 1",
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@octokit/app": {
+      "version": "15.1.0",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-app": "^7.0.0",
+        "@octokit/auth-unauthenticated": "^6.0.0",
+        "@octokit/core": "^6.1.2",
+        "@octokit/oauth-app": "^7.0.0",
+        "@octokit/plugin-paginate-rest": "^11.0.0",
+        "@octokit/types": "^13.0.0",
+        "@octokit/webhooks": "^13.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-app": {
+      "version": "7.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^8.1.0",
+        "@octokit/auth-oauth-user": "^5.1.0",
+        "@octokit/request": "^9.1.1",
+        "@octokit/request-error": "^6.1.1",
+        "@octokit/types": "^13.4.1",
+        "lru-cache": "^10.0.0",
+        "universal-github-app-jwt": "^2.2.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-app/node_modules/lru-cache": {
+      "version": "10.4.3",
+      "license": "ISC"
+    },
+    "node_modules/@octokit/auth-oauth-app": {
+      "version": "8.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-device": "^7.0.0",
+        "@octokit/auth-oauth-user": "^5.0.1",
+        "@octokit/request": "^9.0.0",
+        "@octokit/types": "^13.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-oauth-device": {
+      "version": "7.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/oauth-methods": "^5.0.0",
+        "@octokit/request": "^9.0.0",
+        "@octokit/types": "^13.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-oauth-user": {
+      "version": "5.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-device": "^7.0.1",
+        "@octokit/oauth-methods": "^5.0.0",
+        "@octokit/request": "^9.0.1",
+        "@octokit/types": "^13.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-token": {
+      "version": "5.1.1",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/auth-unauthenticated": {
+      "version": "6.1.0",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request-error": "^6.0.1",
+        "@octokit/types": "^13.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/core": {
+      "version": "6.1.2",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-token": "^5.0.0",
+        "@octokit/graphql": "^8.0.0",
+        "@octokit/request": "^9.0.0",
+        "@octokit/request-error": "^6.0.1",
+        "@octokit/types": "^13.0.0",
+        "before-after-hook": "^3.0.2",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/endpoint": {
+      "version": "10.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^13.0.0",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/graphql": {
+      "version": "8.1.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request": "^9.0.0",
+        "@octokit/types": "^13.0.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/oauth-app": {
+      "version": "7.1.3",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/auth-oauth-app": "^8.0.0",
+        "@octokit/auth-oauth-user": "^5.0.1",
+        "@octokit/auth-unauthenticated": "^6.0.0-beta.1",
+        "@octokit/core": "^6.0.0",
+        "@octokit/oauth-authorization-url": "^7.0.0",
+        "@octokit/oauth-methods": "^5.0.0",
+        "@types/aws-lambda": "^8.10.83",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/oauth-authorization-url": {
+      "version": "7.1.1",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/oauth-methods": {
+      "version": "5.1.2",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/oauth-authorization-url": "^7.0.0",
+        "@octokit/request": "^9.1.0",
+        "@octokit/request-error": "^6.1.0",
+        "@octokit/types": "^13.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/openapi-types": {
+      "version": "22.2.0",
+      "license": "MIT"
+    },
+    "node_modules/@octokit/openapi-webhooks-types": {
+      "version": "8.3.0",
+      "license": "MIT"
+    },
+    "node_modules/@octokit/plugin-paginate-graphql": {
+      "version": "5.2.3",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-paginate-rest": {
+      "version": "11.3.3",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^13.5.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-rest-endpoint-methods": {
+      "version": "13.2.4",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^13.5.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-retry": {
+      "version": "7.1.2",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/request-error": "^6.0.0",
+        "@octokit/types": "^13.0.0",
+        "bottleneck": "^2.15.3"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=6"
+      }
+    },
+    "node_modules/@octokit/plugin-throttling": {
+      "version": "9.3.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^13.0.0",
+        "bottleneck": "^2.15.3"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": "^6.0.0"
+      }
+    },
+    "node_modules/@octokit/request": {
+      "version": "9.1.3",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/endpoint": "^10.0.0",
+        "@octokit/request-error": "^6.0.1",
+        "@octokit/types": "^13.1.0",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/request-error": {
+      "version": "6.1.5",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/types": "^13.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/types": {
+      "version": "13.5.1",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/openapi-types": "^22.2.0"
+      }
+    },
+    "node_modules/@octokit/webhooks": {
+      "version": "13.3.0",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/openapi-webhooks-types": "8.3.0",
+        "@octokit/request-error": "^6.0.1",
+        "@octokit/webhooks-methods": "^5.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/webhooks-methods": {
+      "version": "5.1.0",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@patternfly/patternfly": {
+      "version": "5.4.0",
+      "license": "MIT"
+    },
+    "node_modules/@patternfly/react-core": {
+      "version": "5.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "@patternfly/react-icons": "^5.4.0",
+        "@patternfly/react-styles": "^5.4.0",
+        "@patternfly/react-tokens": "^5.4.0",
+        "focus-trap": "7.5.4",
+        "react-dropzone": "^14.2.3",
+        "tslib": "^2.6.3"
+      },
+      "peerDependencies": {
+        "react": "^17 || ^18",
+        "react-dom": "^17 || ^18"
+      }
+    },
+    "node_modules/@patternfly/react-icons": {
+      "version": "5.4.0",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^17 || ^18",
+        "react-dom": "^17 || ^18"
+      }
+    },
+    "node_modules/@patternfly/react-styles": {
+      "version": "5.4.0",
+      "license": "MIT"
+    },
+    "node_modules/@patternfly/react-table": {
+      "version": "5.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "@patternfly/react-core": "^5.4.0",
+        "@patternfly/react-icons": "^5.4.0",
+        "@patternfly/react-styles": "^5.4.0",
+        "@patternfly/react-tokens": "^5.4.0",
+        "lodash": "^4.17.21",
+        "tslib": "^2.6.3"
+      },
+      "peerDependencies": {
+        "react": "^17 || ^18",
+        "react-dom": "^17 || ^18"
+      }
+    },
+    "node_modules/@patternfly/react-tokens": {
+      "version": "5.4.0",
+      "license": "MIT"
+    },
+    "node_modules/@patternfly/react-topology": {
+      "version": "5.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "@dagrejs/dagre": "1.1.2",
+        "@patternfly/react-core": "^5.1.1",
+        "@patternfly/react-icons": "^5.1.1",
+        "@patternfly/react-styles": "^5.1.1",
+        "@types/d3": "^7.4.0",
+        "@types/d3-force": "^1.2.1",
+        "@types/react-measure": "^2.0.6",
+        "d3": "^7.8.0",
+        "mobx": "^6.9.0",
+        "mobx-react": "^7.6.0",
+        "point-in-svg-path": "^1.0.1",
+        "popper.js": "^1.16.1",
+        "react-measure": "^2.3.0",
+        "tslib": "^2.0.0",
+        "webcola": "3.4.0"
+      },
+      "peerDependencies": {
+        "react": "^17 || ^18",
+        "react-dom": "^17 || ^18"
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.22.4",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-transform-svg-component": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/babel-preset": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0",
+        "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0",
+        "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0",
+        "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0",
+        "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0",
+        "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0",
+        "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0",
+        "@svgr/babel-plugin-transform-svg-component": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@svgr/core": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@svgr/babel-preset": "^7.0.0",
+        "camelcase": "^6.2.0",
+        "cosmiconfig": "^8.1.3"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/hast-util-to-babel-ast": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.21.3",
+        "entities": "^4.4.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/plugin-jsx": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@svgr/babel-preset": "^7.0.0",
+        "@svgr/hast-util-to-babel-ast": "^7.0.0",
+        "svg-parser": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/plugin-svgo": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cosmiconfig": "^8.1.3",
+        "deepmerge": "^4.3.1",
+        "svgo": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@svgr/core": "*"
+      }
+    },
+    "node_modules/@svgr/webpack": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+        "@babel/preset-env": "^7.20.2",
+        "@babel/preset-react": "^7.18.6",
+        "@babel/preset-typescript": "^7.21.0",
+        "@svgr/core": "^7.0.0",
+        "@svgr/plugin-jsx": "^7.0.0",
+        "@svgr/plugin-svgo": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@trysound/sax": {
+      "version": "0.2.0",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/@types/aws-lambda": {
+      "version": "8.10.145",
+      "license": "MIT"
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "node_modules/@types/babel__generator": {
+      "version": "7.6.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__template": {
+      "version": "7.4.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__traverse": {
+      "version": "7.20.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.20.7"
+      }
+    },
+    "node_modules/@types/d3": {
+      "version": "7.4.3",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/d3-axis": "*",
+        "@types/d3-brush": "*",
+        "@types/d3-chord": "*",
+        "@types/d3-color": "*",
+        "@types/d3-contour": "*",
+        "@types/d3-delaunay": "*",
+        "@types/d3-dispatch": "*",
+        "@types/d3-drag": "*",
+        "@types/d3-dsv": "*",
+        "@types/d3-ease": "*",
+        "@types/d3-fetch": "*",
+        "@types/d3-force": "*",
+        "@types/d3-format": "*",
+        "@types/d3-geo": "*",
+        "@types/d3-hierarchy": "*",
+        "@types/d3-interpolate": "*",
+        "@types/d3-path": "*",
+        "@types/d3-polygon": "*",
+        "@types/d3-quadtree": "*",
+        "@types/d3-random": "*",
+        "@types/d3-scale": "*",
+        "@types/d3-scale-chromatic": "*",
+        "@types/d3-selection": "*",
+        "@types/d3-shape": "*",
+        "@types/d3-time": "*",
+        "@types/d3-time-format": "*",
+        "@types/d3-timer": "*",
+        "@types/d3-transition": "*",
+        "@types/d3-zoom": "*"
+      }
+    },
+    "node_modules/@types/d3-array": {
+      "version": "3.2.1",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-axis": {
+      "version": "3.0.6",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-brush": {
+      "version": "3.0.6",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-chord": {
+      "version": "3.0.6",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-color": {
+      "version": "3.1.3",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-contour": {
+      "version": "3.0.6",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-array": "*",
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-delaunay": {
+      "version": "6.0.4",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-dispatch": {
+      "version": "3.0.6",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-drag": {
+      "version": "3.0.7",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-dsv": {
+      "version": "3.0.7",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-ease": {
+      "version": "3.0.2",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-fetch": {
+      "version": "3.0.7",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-dsv": "*"
+      }
+    },
+    "node_modules/@types/d3-force": {
+      "version": "1.2.7",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-format": {
+      "version": "3.0.4",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-geo": {
+      "version": "3.1.0",
+      "license": "MIT",
+      "dependencies": {
+        "@types/geojson": "*"
+      }
+    },
+    "node_modules/@types/d3-hierarchy": {
+      "version": "3.1.7",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-interpolate": {
+      "version": "3.0.4",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-color": "*"
+      }
+    },
+    "node_modules/@types/d3-path": {
+      "version": "3.1.0",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-polygon": {
+      "version": "3.0.2",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-quadtree": {
+      "version": "3.0.6",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-random": {
+      "version": "3.0.3",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-scale": {
+      "version": "4.0.8",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-time": "*"
+      }
+    },
+    "node_modules/@types/d3-scale-chromatic": {
+      "version": "3.0.3",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-selection": {
+      "version": "3.0.10",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-shape": {
+      "version": "3.1.6",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-path": "*"
+      }
+    },
+    "node_modules/@types/d3-time": {
+      "version": "3.0.3",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-time-format": {
+      "version": "4.0.3",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-timer": {
+      "version": "3.0.2",
+      "license": "MIT"
+    },
+    "node_modules/@types/d3-transition": {
+      "version": "3.0.8",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/d3-zoom": {
+      "version": "3.0.8",
+      "license": "MIT",
+      "dependencies": {
+        "@types/d3-interpolate": "*",
+        "@types/d3-selection": "*"
+      }
+    },
+    "node_modules/@types/dagre": {
+      "version": "0.7.52",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.5",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.14",
+      "license": "MIT"
+    },
+    "node_modules/@types/js-yaml": {
+      "version": "4.0.9",
+      "license": "MIT"
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/netlify-auth-providers": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/node": {
+      "version": "20.14.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.13",
+      "license": "MIT"
+    },
+    "node_modules/@types/react": {
+      "version": "18.3.9",
+      "license": "MIT",
+      "dependencies": {
+        "@types/prop-types": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/react-dom": {
+      "version": "18.3.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/react-measure": {
+      "version": "2.0.12",
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/semver": {
+      "version": "7.5.8",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/uuid": {
+      "version": "9.0.8",
+      "license": "MIT"
+    },
+    "node_modules/@typescript-eslint/eslint-plugin": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/regexpp": "^4.4.0",
+        "@typescript-eslint/scope-manager": "5.62.0",
+        "@typescript-eslint/type-utils": "5.62.0",
+        "@typescript-eslint/utils": "5.62.0",
+        "debug": "^4.3.4",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "natural-compare-lite": "^1.4.0",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^5.0.0",
+        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+      "version": "7.6.3",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "5.62.0",
+        "@typescript-eslint/types": "5.62.0",
+        "@typescript-eslint/typescript-estree": "5.62.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "5.62.0",
+        "@typescript-eslint/visitor-keys": "5.62.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/typescript-estree": "5.62.0",
+        "@typescript-eslint/utils": "5.62.0",
+        "debug": "^4.3.4",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "@typescript-eslint/types": "5.62.0",
+        "@typescript-eslint/visitor-keys": "5.62.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+      "version": "7.6.3",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@typescript-eslint/utils": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@types/json-schema": "^7.0.9",
+        "@types/semver": "^7.3.12",
+        "@typescript-eslint/scope-manager": "5.62.0",
+        "@typescript-eslint/types": "5.62.0",
+        "@typescript-eslint/typescript-estree": "5.62.0",
+        "eslint-scope": "^5.1.1",
+        "semver": "^7.3.7"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/utils/node_modules/semver": {
+      "version": "7.6.3",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.62.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "5.62.0",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.2.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/@vitejs/plugin-react": {
+      "version": "4.3.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.24.5",
+        "@babel/plugin-transform-react-jsx-self": "^7.24.5",
+        "@babel/plugin-transform-react-jsx-source": "^7.24.1",
+        "@types/babel__core": "^7.20.5",
+        "react-refresh": "^0.14.2"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.2.0 || ^5.0.0"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.12.1",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/array-union": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "license": "MIT"
+    },
+    "node_modules/attr-accept": {
+      "version": "2.2.2",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/axios": {
+      "version": "1.7.7",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs2": {
+      "version": "0.4.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.22.6",
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "semver": "^6.3.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.10.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
+        "core-js-compat": "^3.38.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-regenerator": {
+      "version": "0.6.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.6.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/before-after-hook": {
+      "version": "3.0.2",
+      "license": "Apache-2.0"
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/bottleneck": {
+      "version": "2.19.5",
+      "license": "MIT"
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.24.0",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001663",
+        "electron-to-chromium": "^1.5.28",
+        "node-releases": "^2.0.18",
+        "update-browserslist-db": "^1.1.0"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "6.3.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001664",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "7.2.0",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/core-js-compat": {
+      "version": "3.38.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.23.3"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/cosmiconfig": {
+      "version": "8.3.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "import-fresh": "^3.3.0",
+        "js-yaml": "^4.1.0",
+        "parse-json": "^5.2.0",
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/d-fischer"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.9.5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/css-select": {
+      "version": "5.1.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^6.1.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "nth-check": "^2.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-tree": {
+      "version": "2.3.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mdn-data": "2.0.30",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+      }
+    },
+    "node_modules/css-what": {
+      "version": "6.1.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/csso": {
+      "version": "5.0.5",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "css-tree": "~2.2.0"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/css-tree": {
+      "version": "2.2.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mdn-data": "2.0.28",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+        "npm": ">=7.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/mdn-data": {
+      "version": "2.0.28",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "license": "MIT"
+    },
+    "node_modules/d3": {
+      "version": "7.9.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "3",
+        "d3-axis": "3",
+        "d3-brush": "3",
+        "d3-chord": "3",
+        "d3-color": "3",
+        "d3-contour": "4",
+        "d3-delaunay": "6",
+        "d3-dispatch": "3",
+        "d3-drag": "3",
+        "d3-dsv": "3",
+        "d3-ease": "3",
+        "d3-fetch": "3",
+        "d3-force": "3",
+        "d3-format": "3",
+        "d3-geo": "3",
+        "d3-hierarchy": "3",
+        "d3-interpolate": "3",
+        "d3-path": "3",
+        "d3-polygon": "3",
+        "d3-quadtree": "3",
+        "d3-random": "3",
+        "d3-scale": "4",
+        "d3-scale-chromatic": "3",
+        "d3-selection": "3",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-array": {
+      "version": "3.2.4",
+      "license": "ISC",
+      "dependencies": {
+        "internmap": "1 - 2"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-axis": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-brush": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-color": {
+      "version": "3.1.0",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-contour": {
+      "version": "4.0.2",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-delaunay": {
+      "version": "6.0.4",
+      "license": "ISC",
+      "dependencies": {
+        "delaunator": "5"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dispatch": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-drag": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-dsv": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "bin": {
+        "csv2json": "bin/dsv2json.js",
+        "csv2tsv": "bin/dsv2dsv.js",
+        "dsv2dsv": "bin/dsv2dsv.js",
+        "dsv2json": "bin/dsv2json.js",
+        "json2csv": "bin/json2dsv.js",
+        "json2dsv": "bin/json2dsv.js",
+        "json2tsv": "bin/json2dsv.js",
+        "tsv2csv": "bin/dsv2dsv.js",
+        "tsv2json": "bin/dsv2json.js"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-ease": {
+      "version": "3.0.1",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-fetch": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dsv": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-force": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-format": {
+      "version": "3.1.0",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-geo": {
+      "version": "3.1.1",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2.5.0 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-hierarchy": {
+      "version": "3.1.2",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-interpolate": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-path": {
+      "version": "3.1.0",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-quadtree": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-random": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2.10.0 - 3",
+        "d3-format": "1 - 3",
+        "d3-interpolate": "1.2.0 - 3",
+        "d3-time": "2.1.1 - 3",
+        "d3-time-format": "2 - 4"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-scale-chromatic": {
+      "version": "3.1.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-shape": {
+      "version": "3.2.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-path": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time": {
+      "version": "3.1.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-array": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-time": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-timer": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
+      }
+    },
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.7",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/delaunator": {
+      "version": "5.0.1",
+      "license": "ISC",
+      "dependencies": {
+        "robust-predicates": "^3.0.2"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
+      }
+    },
+    "node_modules/domutils": {
+      "version": "3.1.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
+      }
+    },
+    "node_modules/dot-case": {
+      "version": "3.0.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.29",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.21.5",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.57.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.57.1",
+        "@humanwhocodes/config-array": "^0.13.0",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/eslint/node_modules/chalk": {
+      "version": "4.1.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/eslint/node_modules/color-convert": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/eslint/node_modules/color-name": {
+      "version": "1.1.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint/node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/estraverse": {
+      "version": "5.3.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/eslint/node_modules/globals": {
+      "version": "13.24.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint/node_modules/has-flag": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/eslint/node_modules/supports-color": {
+      "version": "7.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/espree": {
+      "version": "9.6.1",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esquery/node_modules/estraverse": {
+      "version": "5.3.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/file-selector": {
+      "version": "0.6.0",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.4.0"
+      },
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.1",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/focus-trap": {
+      "version": "7.5.4",
+      "license": "MIT",
+      "dependencies": {
+        "tabbable": "^6.2.0"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-node-dimensions": {
+      "version": "1.2.1",
+      "license": "MIT"
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/globby": {
+      "version": "11.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/globrex": {
+      "version": "0.1.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/html-to-image": {
+      "version": "1.11.11",
+      "license": "MIT"
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.3.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/internmap": {
+      "version": "2.0.3",
+      "license": "ISC",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-core-module": {
+      "version": "2.15.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/karavan-core": {
+      "resolved": "../karavan-core",
+      "link": true
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "license": "MIT"
+    },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "license": "MIT"
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lower-case": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/mdn-data": {
+      "version": "2.0.30",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/mobx": {
+      "version": "6.13.3",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      }
+    },
+    "node_modules/mobx-react": {
+      "version": "7.6.0",
+      "license": "MIT",
+      "dependencies": {
+        "mobx-react-lite": "^3.4.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      },
+      "peerDependencies": {
+        "mobx": "^6.1.0",
+        "react": "^16.8.0 || ^17 || ^18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mobx-react-lite": {
+      "version": "3.4.3",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mobx"
+      },
+      "peerDependencies": {
+        "mobx": "^6.1.0",
+        "react": "^16.8.0 || ^17 || ^18"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/monaco-editor": {
+      "version": "0.49.0",
+      "license": "MIT"
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.8",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/natural-compare-lite": {
+      "version": "1.4.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/netlify-auth-providers": {
+      "version": "1.0.0-alpha5",
+      "license": "MIT"
+    },
+    "node_modules/no-case": {
+      "version": "3.0.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.18",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nth-check": {
+      "version": "2.1.1",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/octokit": {
+      "version": "4.0.2",
+      "license": "MIT",
+      "dependencies": {
+        "@octokit/app": "^15.0.0",
+        "@octokit/core": "^6.0.0",
+        "@octokit/oauth-app": "^7.0.0",
+        "@octokit/plugin-paginate-graphql": "^5.0.0",
+        "@octokit/plugin-paginate-rest": "^11.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "^13.0.0",
+        "@octokit/plugin-retry": "^7.0.0",
+        "@octokit/plugin-throttling": "^9.0.0",
+        "@octokit/request-error": "^6.0.0",
+        "@octokit/types": "^13.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.0",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/point-in-svg-path": {
+      "version": "1.0.2",
+      "license": "ISC",
+      "engines": {
+        "node": ">=8.x.x"
+      }
+    },
+    "node_modules/popper.js": {
+      "version": "1.16.1",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.47",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "license": "MIT"
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/react": {
+      "version": "18.3.1",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.3.1",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
+      },
+      "peerDependencies": {
+        "react": "^18.3.1"
+      }
+    },
+    "node_modules/react-dropzone": {
+      "version": "14.2.3",
+      "license": "MIT",
+      "dependencies": {
+        "attr-accept": "^2.2.2",
+        "file-selector": "^0.6.0",
+        "prop-types": "^15.8.1"
+      },
+      "engines": {
+        "node": ">= 10.13"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8 || 18.0.0"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "16.13.1",
+      "license": "MIT"
+    },
+    "node_modules/react-measure": {
+      "version": "2.5.2",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.2.0",
+        "get-node-dimensions": "^1.2.1",
+        "prop-types": "^15.6.2",
+        "resize-observer-polyfill": "^1.5.0"
+      },
+      "peerDependencies": {
+        "react": ">0.13.0",
+        "react-dom": ">0.13.0"
+      }
+    },
+    "node_modules/react-refresh": {
+      "version": "0.14.2",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-resizable-panels": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz",
+      "integrity": "sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+        "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+      }
+    },
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "10.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "regenerate": "^1.4.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "license": "MIT"
+    },
+    "node_modules/regenerator-transform": {
+      "version": "0.15.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "node_modules/regexpu-core": {
+      "version": "5.3.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/regjsgen": "^0.8.0",
+        "regenerate": "^1.4.2",
+        "regenerate-unicode-properties": "^10.1.0",
+        "regjsparser": "^0.9.1",
+        "unicode-match-property-ecmascript": "^2.0.0",
+        "unicode-match-property-value-ecmascript": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regjsparser": {
+      "version": "0.9.1",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "jsesc": "~0.5.0"
+      },
+      "bin": {
+        "regjsparser": "bin/parser"
+      }
+    },
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "0.5.0",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      }
+    },
+    "node_modules/resize-observer-polyfill": {
+      "version": "1.5.1",
+      "license": "MIT"
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/robust-predicates": {
+      "version": "3.0.2",
+      "license": "Unlicense"
+    },
+    "node_modules/rollup": {
+      "version": "4.22.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.5"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.22.4",
+        "@rollup/rollup-android-arm64": "4.22.4",
+        "@rollup/rollup-darwin-arm64": "4.22.4",
+        "@rollup/rollup-darwin-x64": "4.22.4",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.22.4",
+        "@rollup/rollup-linux-arm-musleabihf": "4.22.4",
+        "@rollup/rollup-linux-arm64-gnu": "4.22.4",
+        "@rollup/rollup-linux-arm64-musl": "4.22.4",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4",
+        "@rollup/rollup-linux-riscv64-gnu": "4.22.4",
+        "@rollup/rollup-linux-s390x-gnu": "4.22.4",
+        "@rollup/rollup-linux-x64-gnu": "4.22.4",
+        "@rollup/rollup-linux-x64-musl": "4.22.4",
+        "@rollup/rollup-win32-arm64-msvc": "4.22.4",
+        "@rollup/rollup-win32-ia32-msvc": "4.22.4",
+        "@rollup/rollup-win32-x64-msvc": "4.22.4",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/rw": {
+      "version": "1.3.3",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.1",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "license": "MIT"
+    },
+    "node_modules/scheduler": {
+      "version": "0.23.2",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "6.3.1",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/snake-case": {
+      "version": "3.0.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/state-local": {
+      "version": "1.0.7",
+      "license": "MIT"
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/svg-parser": {
+      "version": "2.0.4",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/svgo": {
+      "version": "3.3.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@trysound/sax": "0.2.0",
+        "commander": "^7.2.0",
+        "css-select": "^5.1.0",
+        "css-tree": "^2.3.1",
+        "css-what": "^6.1.0",
+        "csso": "^5.0.5",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "svgo": "bin/svgo"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/svgo"
+      }
+    },
+    "node_modules/tabbable": {
+      "version": "6.2.0",
+      "license": "MIT"
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.7.0",
+      "license": "0BSD"
+    },
+    "node_modules/tsutils": {
+      "version": "3.21.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^1.8.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      },
+      "peerDependencies": {
+        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+      }
+    },
+    "node_modules/tsutils/node_modules/tslib": {
+      "version": "1.14.1",
+      "dev": true,
+      "license": "0BSD"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "4.9.5",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/unicode-canonical-property-names-ecmascript": {
+      "version": "2.0.1",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-ecmascript": {
+      "version": "2.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "unicode-canonical-property-names-ecmascript": "^2.0.0",
+        "unicode-property-aliases-ecmascript": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-value-ecmascript": {
+      "version": "2.2.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-property-aliases-ecmascript": {
+      "version": "2.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/universal-github-app-jwt": {
+      "version": "2.2.0",
+      "license": "MIT"
+    },
+    "node_modules/universal-user-agent": {
+      "version": "7.0.2",
+      "license": "ISC"
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.0",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/use-sync-external-store": {
+      "version": "1.2.2",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/usehooks-ts": {
+      "version": "3.1.0",
+      "license": "MIT",
+      "dependencies": {
+        "lodash.debounce": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=16.15.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0  || ^17 || ^18"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "10.0.0",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.4.14",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
+      "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-plugin-svgr": {
+      "version": "4.2.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.0.5",
+        "@svgr/core": "^8.1.0",
+        "@svgr/plugin-jsx": "^8.1.0"
+      },
+      "peerDependencies": {
+        "vite": "^2.6.0 || 3 || 4 || 5"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+      "version": "8.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-transform-svg-component": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-preset": {
+      "version": "8.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+        "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+        "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+        "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+        "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+        "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+        "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+        "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/core": {
+      "version": "8.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@svgr/babel-preset": "8.1.0",
+        "camelcase": "^6.2.0",
+        "cosmiconfig": "^8.1.3",
+        "snake-case": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/hast-util-to-babel-ast": {
+      "version": "8.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.21.3",
+        "entities": "^4.4.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/vite-plugin-svgr/node_modules/@svgr/plugin-jsx": {
+      "version": "8.1.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.21.3",
+        "@svgr/babel-preset": "8.1.0",
+        "@svgr/hast-util-to-babel-ast": "8.0.0",
+        "svg-parser": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      },
+      "peerDependencies": {
+        "@svgr/core": "*"
+      }
+    },
+    "node_modules/vite-tsconfig-paths": {
+      "version": "5.0.1",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.1.1",
+        "globrex": "^0.1.2",
+        "tsconfck": "^3.0.3"
+      },
+      "peerDependencies": {
+        "vite": "*"
+      },
+      "peerDependenciesMeta": {
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-tsconfig-paths/node_modules/tsconfck": {
+      "version": "3.1.3",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "tsconfck": "bin/tsconfck.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
+      },
+      "peerDependencies": {
+        "typescript": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite-tsconfig-paths/node_modules/typescript": {
+      "version": "5.6.2",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "peer": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/webcola": {
+      "version": "3.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "d3-dispatch": "^1.0.3",
+        "d3-drag": "^1.0.4",
+        "d3-shape": "^1.3.5",
+        "d3-timer": "^1.0.5"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-dispatch": {
+      "version": "1.0.6",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/webcola/node_modules/d3-drag": {
+      "version": "1.2.5",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-dispatch": "1",
+        "d3-selection": "1"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-path": {
+      "version": "1.0.9",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/webcola/node_modules/d3-selection": {
+      "version": "1.4.2",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/webcola/node_modules/d3-shape": {
+      "version": "1.3.7",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "d3-path": "1"
+      }
+    },
+    "node_modules/webcola/node_modules/d3-timer": {
+      "version": "1.0.10",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zustand": {
+      "version": "4.5.5",
+      "license": "MIT",
+      "dependencies": {
+        "use-sync-external-store": "1.2.2"
+      },
+      "engines": {
+        "node": ">=12.7.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8",
+        "immer": ">=9.0.6",
+        "react": ">=16.8"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "immer": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    }
+  }
+}
diff --git a/karavan-space/package.json b/karavan-space/package.json
index 9e812e0d..15765509 100644
--- a/karavan-space/package.json
+++ b/karavan-space/package.json
@@ -48,6 +48,7 @@
     "octokit": "^4.0.2",
     "react": "18.3.1",
     "react-dom": "18.3.1",
+    "react-resizable-panels": "^2.1.7",
     "rxjs": "7.8.1",
     "usehooks-ts": "^3.1.0",
     "uuid": "10.0.0",
diff --git a/karavan-space/public/metadata/components.json b/karavan-space/public/metadata/components.json
index 9b9844a9..2863b6b9 100644
--- a/karavan-space/public/metadata/components.json
+++ b/karavan-space/public/metadata/components.json
@@ -1,697 +1,701 @@
 [
-{"component":{"kind":"component","name":"activemq","title":"ActiveMQ 5.x","description":"Send messages to (or consume from) Apache ActiveMQ 5.x. This component extends the Camel JMS component.","deprecated":false,"firstVersion":"1.0.0","label":"messaging","javaType":"org.apache.camel.component.activemq.ActiveMQComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-activemq","version":"4.8.2","scheme":"activemq","extendsScheme":"jms","syntax":"activemq:destina [...]
+{"component":{"kind":"component","name":"activemq","title":"ActiveMQ 5.x","description":"Send messages to (or consume from) Apache ActiveMQ 5.x. This component extends the Camel JMS component.","deprecated":false,"firstVersion":"1.0.0","label":"messaging","javaType":"org.apache.camel.component.activemq.ActiveMQComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-activemq","version":"4.10.0-SNAPSHOT","scheme":"activemq","extendsScheme":"jms","syntax":"active [...]
 ,
-{"component":{"kind":"component","name":"activemq6","title":"ActiveMQ 6.x","description":"Send messages to (or consume from) Apache ActiveMQ 6.x. This component extends the Camel JMS component.","deprecated":false,"firstVersion":"4.7.0","label":"messaging","javaType":"org.apache.camel.component.activemq6.ActiveMQComponent","supportLevel":"Preview","groupId":"org.apache.camel","artifactId":"camel-activemq6","version":"4.8.2","scheme":"activemq6","extendsScheme":"jms","syntax":"activemq6:d [...]
+{"component":{"kind":"component","name":"activemq6","title":"ActiveMQ 6.x","description":"Send messages to (or consume from) Apache ActiveMQ 6.x. This component extends the Camel JMS component.","deprecated":false,"firstVersion":"4.7.0","label":"messaging","javaType":"org.apache.camel.component.activemq6.ActiveMQComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-activemq6","version":"4.10.0-SNAPSHOT","scheme":"activemq6","extendsScheme":"jms","syntax":"ac [...]
 ,
-{"component":{"kind":"component","name":"amqp","title":"AMQP","description":"Messaging with AMQP protocol using Apache QPid Client.","deprecated":false,"firstVersion":"1.2.0","label":"messaging","javaType":"org.apache.camel.component.amqp.AMQPComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-amqp","version":"4.8.2","scheme":"amqp","extendsScheme":"jms","syntax":"amqp:destinationType:destinationName","async":true,"api":false,"consumerOnly":false,"producer [...]
+{"component":{"kind":"component","name":"amqp","title":"AMQP","description":"Messaging with AMQP protocol using Apache QPid Client.","deprecated":false,"firstVersion":"1.2.0","label":"messaging","javaType":"org.apache.camel.component.amqp.AMQPComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-amqp","version":"4.10.0-SNAPSHOT","scheme":"amqp","extendsScheme":"jms","syntax":"amqp:destinationType:destinationName","async":true,"api":false,"consumerOnly":false [...]
 ,
-{"component":{"kind":"component","name":"arangodb","title":"ArangoDb","description":"Perform operations on ArangoDb when used as a Document Database, or as a Graph Database","deprecated":false,"firstVersion":"3.5.0","label":"database","javaType":"org.apache.camel.component.arangodb.ArangoDbComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-arangodb","version":"4.8.2","scheme":"arangodb","extendsScheme":"","syntax":"arangodb:database","async":false,"api":f [...]
+{"component":{"kind":"component","name":"arangodb","title":"ArangoDb","description":"Perform operations on ArangoDb when used as a Document Database, or as a Graph Database","deprecated":false,"firstVersion":"3.5.0","label":"database","javaType":"org.apache.camel.component.arangodb.ArangoDbComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-arangodb","version":"4.10.0-SNAPSHOT","scheme":"arangodb","extendsScheme":"","syntax":"arangodb:database","async":fal [...]
 ,
-{"component":{"kind":"component","name":"as2","title":"AS2","description":"Transfer data securely and reliably using the AS2 protocol (RFC4130).","deprecated":false,"firstVersion":"2.22.0","label":"file","javaType":"org.apache.camel.component.as2.AS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-as2","version":"4.8.2","scheme":"as2","extendsScheme":"","syntax":"as2:apiName/methodName","async":false,"api":true,"apiSyntax":"apiName/methodName","consumer [...]
+{"component":{"kind":"component","name":"as2","title":"AS2","description":"Transfer data securely and reliably using the AS2 protocol (RFC4130).","deprecated":false,"firstVersion":"2.22.0","label":"file","javaType":"org.apache.camel.component.as2.AS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-as2","version":"4.10.0-SNAPSHOT","scheme":"as2","extendsScheme":"","syntax":"as2:apiName/methodName","async":false,"api":true,"apiSyntax":"apiName/methodName" [...]
 ,
-{"component":{"kind":"component","name":"asterisk","title":"Asterisk","description":"Interact with Asterisk PBX Server (VoIP).","deprecated":false,"firstVersion":"2.18.0","label":"mobile","javaType":"org.apache.camel.component.asterisk.AsteriskComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-asterisk","version":"4.8.2","scheme":"asterisk","extendsScheme":"","syntax":"asterisk:name","async":false,"api":false,"consumerOnly":false,"producerOnly":false,"len [...]
+{"component":{"kind":"component","name":"asterisk","title":"Asterisk","description":"Interact with Asterisk PBX Server (VoIP).","deprecated":false,"firstVersion":"2.18.0","label":"mobile","javaType":"org.apache.camel.component.asterisk.AsteriskComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-asterisk","version":"4.10.0-SNAPSHOT","scheme":"asterisk","extendsScheme":"","syntax":"asterisk:name","async":false,"api":false,"consumerOnly":false,"producerOnly": [...]
 ,
-{"component":{"kind":"component","name":"atmosphere-websocket","title":"Atmosphere Websocket","description":"Expose WebSocket endpoints using the Atmosphere framework.","deprecated":false,"firstVersion":"2.14.0","label":"http,networking","javaType":"org.apache.camel.component.atmosphere.websocket.WebsocketComponent","supportLevel":"Stable","metadata":{"protocol":"http"},"groupId":"org.apache.camel","artifactId":"camel-atmosphere-websocket","version":"4.8.2","scheme":"atmosphere-websocket [...]
+{"component":{"kind":"component","name":"atmosphere-websocket","title":"Atmosphere Websocket","description":"Expose WebSocket endpoints using the Atmosphere framework.","deprecated":false,"firstVersion":"2.14.0","label":"http,networking","javaType":"org.apache.camel.component.atmosphere.websocket.WebsocketComponent","supportLevel":"Stable","metadata":{"protocol":"http"},"groupId":"org.apache.camel","artifactId":"camel-atmosphere-websocket","version":"4.10.0-SNAPSHOT","scheme":"atmosphere [...]
 ,
-{"component":{"kind":"component","name":"atom","title":"Atom","description":"Poll Atom RSS feeds.","deprecated":false,"firstVersion":"1.2.0","label":"document","javaType":"org.apache.camel.component.atom.AtomComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-atom","version":"4.8.2","scheme":"atom","extendsScheme":"","syntax":"atom:feedUri","async":false,"api":false,"consumerOnly":true,"producerOnly":false,"lenientProperties":true,"remote":true},"headers": [...]
+{"component":{"kind":"component","name":"atom","title":"Atom","description":"Poll Atom RSS feeds.","deprecated":false,"firstVersion":"1.2.0","label":"document","javaType":"org.apache.camel.component.atom.AtomComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-atom","version":"4.10.0-SNAPSHOT","scheme":"atom","extendsScheme":"","syntax":"atom:feedUri","async":false,"api":false,"consumerOnly":true,"producerOnly":false,"lenientProperties":true,"browsable":fal [...]
 ,
-{"component":{"kind":"component","name":"avro","title":"Avro RPC","description":"Produce or consume Apache Avro RPC services.","deprecated":false,"firstVersion":"2.10.0","label":"rpc","javaType":"org.apache.camel.component.avro.AvroComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-avro-rpc","version":"4.8.2","scheme":"avro","extendsScheme":"","syntax":"avro:transport:host:port/messageName","async":true,"api":false,"consumerOnly":false,"producerOnly":fals [...]
+{"component":{"kind":"component","name":"avro","title":"Avro RPC","description":"Produce or consume Apache Avro RPC services.","deprecated":false,"firstVersion":"2.10.0","label":"rpc","javaType":"org.apache.camel.component.avro.AvroComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-avro-rpc","version":"4.10.0-SNAPSHOT","scheme":"avro","extendsScheme":"","syntax":"avro:transport:host:port/messageName","async":true,"api":false,"consumerOnly":false,"producer [...]
 ,
-{"component":{"kind":"component","name":"aws-bedrock","title":"AWS Bedrock","description":"Invoke Model of AWS Bedrock service.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.runtime.BedrockComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.8.2","scheme":"aws-bedrock","extendsScheme":"","syntax":"aws-bedrock:label","async":false,"api":false,"consumerOnly":false,"p [...]
+{"component":{"kind":"component","name":"aws-bedrock","title":"AWS Bedrock","description":"Invoke Model of AWS Bedrock service.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.runtime.BedrockComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.10.0-SNAPSHOT","scheme":"aws-bedrock","extendsScheme":"","syntax":"aws-bedrock:label","async":false,"api":false,"consumerOnly [...]
 ,
-{"component":{"kind":"component","name":"aws-bedrock-agent","title":"AWS Bedrock Agent","description":"Operate on AWS Bedrock through its Agent.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.agent.BedrockAgentComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.8.2","scheme":"aws-bedrock-agent","extendsScheme":"","syntax":"aws-bedrock-agent:label","async":false,"ap [...]
+{"component":{"kind":"component","name":"aws-bedrock-agent","title":"AWS Bedrock Agent","description":"Operate on AWS Bedrock through its Agent.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.agent.BedrockAgentComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.10.0-SNAPSHOT","scheme":"aws-bedrock-agent","extendsScheme":"","syntax":"aws-bedrock-agent:label","async" [...]
 ,
-{"component":{"kind":"component","name":"aws-bedrock-agent-runtime","title":"AWS Bedrock Agent Runtime","description":"Invoke Model of AWS Bedrock Agent Runtime service.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.agentruntime.BedrockAgentRuntimeComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.8.2","scheme":"aws-bedrock-agent-runtime","extendsScheme":"","synt [...]
+{"component":{"kind":"component","name":"aws-bedrock-agent-runtime","title":"AWS Bedrock Agent Runtime","description":"Invoke Model of AWS Bedrock Agent Runtime service.","deprecated":false,"firstVersion":"4.5.0","label":"ai,cloud","javaType":"org.apache.camel.component.aws2.bedrock.agentruntime.BedrockAgentRuntimeComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-bedrock","version":"4.10.0-SNAPSHOT","scheme":"aws-bedrock-agent-runtime","extendsScheme [...]
 ,
-{"component":{"kind":"component","name":"aws-cloudtrail","title":"AWS Cloudtrail","description":"Consume events from Amazon Cloudtrail using AWS SDK version 2.x.","deprecated":false,"firstVersion":"3.19.0","label":"cloud,management,monitoring","javaType":"org.apache.camel.component.aws.cloudtrail.CloudtrailComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-cloudtrail","version":"4.8.2","scheme":"aws-cloudtrail","extendsScheme":"","syntax":"aws-cloudtr [...]
+{"component":{"kind":"component","name":"aws-cloudtrail","title":"AWS Cloudtrail","description":"Consume events from Amazon Cloudtrail using AWS SDK version 2.x.","deprecated":false,"firstVersion":"3.19.0","label":"cloud,management,monitoring","javaType":"org.apache.camel.component.aws.cloudtrail.CloudtrailComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-cloudtrail","version":"4.10.0-SNAPSHOT","scheme":"aws-cloudtrail","extendsScheme":"","syntax":"a [...]
 ,
-{"component":{"kind":"component","name":"aws-config","title":"AWS Config Service","description":"Manage AWS Config service.","deprecated":false,"firstVersion":"4.3.0","label":"cloud,management","javaType":"org.apache.camel.component.aws.config.AWSConfigComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-config","version":"4.8.2","scheme":"aws-config","extendsScheme":"","syntax":"aws-config:label","async":false,"api":false,"consumerOnly":false,"producer [...]
+{"component":{"kind":"component","name":"aws-config","title":"AWS Config Service","description":"Manage AWS Config service.","deprecated":false,"firstVersion":"4.3.0","label":"cloud,management","javaType":"org.apache.camel.component.aws.config.AWSConfigComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws-config","version":"4.10.0-SNAPSHOT","scheme":"aws-config","extendsScheme":"","syntax":"aws-config:label","async":false,"api":false,"consumerOnly":false [...]
 ,
-{"component":{"kind":"component","name":"aws-secrets-manager","title":"AWS Secrets Manager","description":"Manage secrets using AWS Secrets Manager.","deprecated":false,"firstVersion":"3.9.0","label":"cloud,management","javaType":"org.apache.camel.component.aws.secretsmanager.SecretsManagerComponent","supportLevel":"Stable","metadata":{"vault":"aws-secrets-manager"},"groupId":"org.apache.camel","artifactId":"camel-aws-secrets-manager","version":"4.8.2","scheme":"aws-secrets-manager","ext [...]
+{"component":{"kind":"component","name":"aws-secrets-manager","title":"AWS Secrets Manager","description":"Manage secrets using AWS Secrets Manager.","deprecated":false,"firstVersion":"3.9.0","label":"cloud,management","javaType":"org.apache.camel.component.aws.secretsmanager.SecretsManagerComponent","supportLevel":"Stable","metadata":{"vault":"aws-secrets-manager"},"groupId":"org.apache.camel","artifactId":"camel-aws-secrets-manager","version":"4.10.0-SNAPSHOT","scheme":"aws-secrets-man [...]
 ,
-{"component":{"kind":"component","name":"aws2-athena","title":"AWS Athena","description":"Access AWS Athena.","deprecated":false,"firstVersion":"3.4.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.athena.Athena2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-athena","version":"4.8.2","scheme":"aws2-athena","extendsScheme":"","syntax":"aws2-athena:label","async":false,"api":false,"consumerOnly":false,"producerOnly":true,"len [...]
+{"component":{"kind":"component","name":"aws2-athena","title":"AWS Athena","description":"Access AWS Athena.","deprecated":false,"firstVersion":"3.4.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.athena.Athena2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-athena","version":"4.10.0-SNAPSHOT","scheme":"aws2-athena","extendsScheme":"","syntax":"aws2-athena:label","async":false,"api":false,"consumerOnly":false,"producerOnly" [...]
 ,
-{"component":{"kind":"component","name":"aws2-cw","title":"AWS CloudWatch","description":"Sending metrics to AWS CloudWatch.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,monitoring","javaType":"org.apache.camel.component.aws2.cw.Cw2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-cw","version":"4.8.2","scheme":"aws2-cw","extendsScheme":"","syntax":"aws2-cw:namespace","async":false,"api":false,"consumerOnly":false,"producerOnly":true,"l [...]
+{"component":{"kind":"component","name":"aws2-cw","title":"AWS CloudWatch","description":"Sending metrics to AWS CloudWatch.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,monitoring","javaType":"org.apache.camel.component.aws2.cw.Cw2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-cw","version":"4.10.0-SNAPSHOT","scheme":"aws2-cw","extendsScheme":"","syntax":"aws2-cw:namespace","async":false,"api":false,"consumerOnly":false,"producerOnl [...]
 ,
-{"component":{"kind":"component","name":"aws2-ddb","title":"AWS DynamoDB","description":"Store and retrieve data from AWS DynamoDB.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.ddb.Ddb2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ddb","version":"4.8.2","scheme":"aws2-ddb","extendsScheme":"","syntax":"aws2-ddb:tableName","async":false,"api":false,"consumerOnly":false,"producerOnl [...]
+{"component":{"kind":"component","name":"aws2-ddb","title":"AWS DynamoDB","description":"Store and retrieve data from AWS DynamoDB.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.ddb.Ddb2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ddb","version":"4.10.0-SNAPSHOT","scheme":"aws2-ddb","extendsScheme":"","syntax":"aws2-ddb:tableName","async":false,"api":false,"consumerOnly":false,"p [...]
 ,
-{"component":{"kind":"component","name":"aws2-ddbstream","title":"AWS DynamoDB Streams","description":"Receive messages from AWS DynamoDB Stream.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.ddbstream.Ddb2StreamComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ddb","version":"4.8.2","scheme":"aws2-ddbstream","extendsScheme":"","syntax":"aws2-ddbstream:tableName","async":false,"api": [...]
+{"component":{"kind":"component","name":"aws2-ddbstream","title":"AWS DynamoDB Streams","description":"Receive messages from AWS DynamoDB Stream.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.ddbstream.Ddb2StreamComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ddb","version":"4.10.0-SNAPSHOT","scheme":"aws2-ddbstream","extendsScheme":"","syntax":"aws2-ddbstream:tableName","async":fa [...]
 ,
-{"component":{"kind":"component","name":"aws2-ec2","title":"AWS Elastic Compute Cloud (EC2)","description":"Manage AWS EC2 instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.ec2.AWS2EC2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ec2","version":"4.8.2","scheme":"aws2-ec2","extendsScheme":"","syntax":"aws2-ec2:label","async":false,"api":false,"consumerOnly":false,"producer [...]
+{"component":{"kind":"component","name":"aws2-ec2","title":"AWS Elastic Compute Cloud (EC2)","description":"Manage AWS EC2 instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.ec2.AWS2EC2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ec2","version":"4.10.0-SNAPSHOT","scheme":"aws2-ec2","extendsScheme":"","syntax":"aws2-ec2:label","async":false,"api":false,"consumerOnly":false [...]
 ,
-{"component":{"kind":"component","name":"aws2-ecs","title":"AWS Elastic Container Service (ECS)","description":"Manage AWS ECS cluster instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.ecs.ECS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ecs","version":"4.8.2","scheme":"aws2-ecs","extendsScheme":"","syntax":"aws2-ecs:label","async":false,"api":false,"consumerOnly":false, [...]
+{"component":{"kind":"component","name":"aws2-ecs","title":"AWS Elastic Container Service (ECS)","description":"Manage AWS ECS cluster instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.ecs.ECS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ecs","version":"4.10.0-SNAPSHOT","scheme":"aws2-ecs","extendsScheme":"","syntax":"aws2-ecs:label","async":false,"api":false,"consumerOn [...]
 ,
-{"component":{"kind":"component","name":"aws2-eks","title":"AWS Elastic Kubernetes Service (EKS)","description":"Manage AWS EKS cluster instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.eks.EKS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-eks","version":"4.8.2","scheme":"aws2-eks","extendsScheme":"","syntax":"aws2-eks:label","async":false,"api":false,"consumerOnly":false [...]
+{"component":{"kind":"component","name":"aws2-eks","title":"AWS Elastic Kubernetes Service (EKS)","description":"Manage AWS EKS cluster instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.eks.EKS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-eks","version":"4.10.0-SNAPSHOT","scheme":"aws2-eks","extendsScheme":"","syntax":"aws2-eks:label","async":false,"api":false,"consumerO [...]
 ,
-{"component":{"kind":"component","name":"aws2-eventbridge","title":"AWS Eventbridge","description":"Send events to AWS Eventbridge cluster instances.","deprecated":false,"firstVersion":"3.6.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.eventbridge.EventbridgeComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-eventbridge","version":"4.8.2","scheme":"aws2-eventbridge","extendsScheme":"","syntax":"aws2-eventbridge://eventbusN [...]
+{"component":{"kind":"component","name":"aws2-eventbridge","title":"AWS Eventbridge","description":"Send events to AWS Eventbridge cluster instances.","deprecated":false,"firstVersion":"3.6.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.eventbridge.EventbridgeComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-eventbridge","version":"4.10.0-SNAPSHOT","scheme":"aws2-eventbridge","extendsScheme":"","syntax":"aws2-eventbridge:/ [...]
 ,
-{"component":{"kind":"component","name":"aws2-iam","title":"AWS Identity and Access Management (IAM)","description":"Manage AWS IAM instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.iam.IAM2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-iam","version":"4.8.2","scheme":"aws2-iam","extendsScheme":"","syntax":"aws2-iam:label","async":false,"api":false,"consumerOnly":false,"pr [...]
+{"component":{"kind":"component","name":"aws2-iam","title":"AWS Identity and Access Management (IAM)","description":"Manage AWS IAM instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.iam.IAM2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-iam","version":"4.10.0-SNAPSHOT","scheme":"aws2-iam","extendsScheme":"","syntax":"aws2-iam:label","async":false,"api":false,"consumerOnly" [...]
 ,
-{"component":{"kind":"component","name":"aws2-kinesis","title":"AWS Kinesis","description":"Consume and produce records from and to AWS Kinesis Streams.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.kinesis.Kinesis2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kinesis","version":"4.8.2","scheme":"aws2-kinesis","extendsScheme":"","syntax":"aws2-kinesis:streamName","async":false,"a [...]
+{"component":{"kind":"component","name":"aws2-kinesis","title":"AWS Kinesis","description":"Consume and produce records from and to AWS Kinesis Streams.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.kinesis.Kinesis2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kinesis","version":"4.10.0-SNAPSHOT","scheme":"aws2-kinesis","extendsScheme":"","syntax":"aws2-kinesis:streamName","async [...]
 ,
-{"component":{"kind":"component","name":"aws2-kinesis-firehose","title":"AWS Kinesis Firehose","description":"Produce data to AWS Kinesis Firehose streams.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.firehose.KinesisFirehose2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kinesis","version":"4.8.2","scheme":"aws2-kinesis-firehose","extendsScheme":"","syntax":"aws2-kinesis-firehos [...]
+{"component":{"kind":"component","name":"aws2-kinesis-firehose","title":"AWS Kinesis Firehose","description":"Produce data to AWS Kinesis Firehose streams.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.firehose.KinesisFirehose2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kinesis","version":"4.10.0-SNAPSHOT","scheme":"aws2-kinesis-firehose","extendsScheme":"","syntax":"aws2-kines [...]
 ,
-{"component":{"kind":"component","name":"aws2-kms","title":"AWS Key Management Service (KMS)","description":"Manage keys stored in AWS KMS instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.kms.KMS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kms","version":"4.8.2","scheme":"aws2-kms","extendsScheme":"","syntax":"aws2-kms:label","async":false,"api":false,"consumerOnly":fa [...]
+{"component":{"kind":"component","name":"aws2-kms","title":"AWS Key Management Service (KMS)","description":"Manage keys stored in AWS KMS instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.kms.KMS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-kms","version":"4.10.0-SNAPSHOT","scheme":"aws2-kms","extendsScheme":"","syntax":"aws2-kms:label","async":false,"api":false,"consum [...]
 ,
-{"component":{"kind":"component","name":"aws2-lambda","title":"AWS Lambda","description":"Manage and invoke AWS Lambda functions.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,serverless","javaType":"org.apache.camel.component.aws2.lambda.Lambda2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-lambda","version":"4.8.2","scheme":"aws2-lambda","extendsScheme":"","syntax":"aws2-lambda:function","async":false,"api":false,"consumerOnly":fals [...]
+{"component":{"kind":"component","name":"aws2-lambda","title":"AWS Lambda","description":"Manage and invoke AWS Lambda functions.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,serverless","javaType":"org.apache.camel.component.aws2.lambda.Lambda2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-lambda","version":"4.10.0-SNAPSHOT","scheme":"aws2-lambda","extendsScheme":"","syntax":"aws2-lambda:function","async":false,"api":false,"consumer [...]
 ,
-{"component":{"kind":"component","name":"aws2-mq","title":"AWS MQ","description":"Send messages to AWS MQ.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.mq.MQ2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-mq","version":"4.8.2","scheme":"aws2-mq","extendsScheme":"","syntax":"aws2-mq:label","async":false,"api":false,"consumerOnly":false,"producerOnly":true,"lenientProperties":false [...]
+{"component":{"kind":"component","name":"aws2-mq","title":"AWS MQ","description":"Send messages to AWS MQ.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.mq.MQ2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-mq","version":"4.10.0-SNAPSHOT","scheme":"aws2-mq","extendsScheme":"","syntax":"aws2-mq:label","async":false,"api":false,"consumerOnly":false,"producerOnly":true,"lenientPropert [...]
 ,
-{"component":{"kind":"component","name":"aws2-msk","title":"AWS Managed Streaming for Apache Kafka (MSK)","description":"Manage AWS MSK instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.msk.MSK2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-msk","version":"4.8.2","scheme":"aws2-msk","extendsScheme":"","syntax":"aws2-msk:label","async":false,"api":false,"consumerOnly":false [...]
+{"component":{"kind":"component","name":"aws2-msk","title":"AWS Managed Streaming for Apache Kafka (MSK)","description":"Manage AWS MSK instances.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.msk.MSK2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-msk","version":"4.10.0-SNAPSHOT","scheme":"aws2-msk","extendsScheme":"","syntax":"aws2-msk:label","async":false,"api":false,"consumerO [...]
 ,
-{"component":{"kind":"component","name":"aws2-redshift-data","title":"AWS RedshiftData","description":"Perform operations on AWS Redshift using Redshift Data API.","deprecated":false,"firstVersion":"4.1.0","label":"cloud,serverless,database,bigdata","javaType":"org.apache.camel.component.aws2.redshift.data.RedshiftData2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-redshift","version":"4.8.2","scheme":"aws2-redshift-data","extendsScheme":"","synt [...]
+{"component":{"kind":"component","name":"aws2-redshift-data","title":"AWS RedshiftData","description":"Perform operations on AWS Redshift using Redshift Data API.","deprecated":false,"firstVersion":"4.1.0","label":"cloud,serverless,database,bigdata","javaType":"org.apache.camel.component.aws2.redshift.data.RedshiftData2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-redshift","version":"4.10.0-SNAPSHOT","scheme":"aws2-redshift-data","extendsScheme [...]
 ,
-{"component":{"kind":"component","name":"aws2-s3","title":"AWS S3 Storage Service","description":"Store and retrieve objects from AWS S3 Storage Service.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,file","javaType":"org.apache.camel.component.aws2.s3.AWS2S3Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-s3","version":"4.8.2","scheme":"aws2-s3","extendsScheme":"","syntax":"aws2-s3://bucketNameOrArn","async":false,"api":false,"consumer [...]
+{"component":{"kind":"component","name":"aws2-s3","title":"AWS S3 Storage Service","description":"Store and retrieve objects from AWS S3 Storage Service.","deprecated":false,"firstVersion":"3.2.0","label":"cloud,file","javaType":"org.apache.camel.component.aws2.s3.AWS2S3Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-s3","version":"4.10.0-SNAPSHOT","scheme":"aws2-s3","extendsScheme":"","syntax":"aws2-s3://bucketNameOrArn","async":false,"api":false [...]
 ,
-{"component":{"kind":"component","name":"aws2-ses","title":"AWS Simple Email Service (SES)","description":"Send e-mails through AWS SES service.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,mail","javaType":"org.apache.camel.component.aws2.ses.Ses2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ses","version":"4.8.2","scheme":"aws2-ses","extendsScheme":"","syntax":"aws2-ses:from","async":false,"api":false,"consumerOnly":false,"produce [...]
+{"component":{"kind":"component","name":"aws2-ses","title":"AWS Simple Email Service (SES)","description":"Send e-mails through AWS SES service.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,mail","javaType":"org.apache.camel.component.aws2.ses.Ses2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-ses","version":"4.10.0-SNAPSHOT","scheme":"aws2-ses","extendsScheme":"","syntax":"aws2-ses:from","async":false,"api":false,"consumerOnly":fals [...]
 ,
-{"component":{"kind":"component","name":"aws2-sns","title":"AWS Simple Notification System (SNS)","description":"Send messages to AWS Simple Notification Topic.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging,mobile","javaType":"org.apache.camel.component.aws2.sns.Sns2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sns","version":"4.8.2","scheme":"aws2-sns","extendsScheme":"","syntax":"aws2-sns:topicNameOrArn","async":false,"ap [...]
+{"component":{"kind":"component","name":"aws2-sns","title":"AWS Simple Notification System (SNS)","description":"Send messages to AWS Simple Notification Topic.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging,mobile","javaType":"org.apache.camel.component.aws2.sns.Sns2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sns","version":"4.10.0-SNAPSHOT","scheme":"aws2-sns","extendsScheme":"","syntax":"aws2-sns:topicNameOrArn","async" [...]
 ,
-{"component":{"kind":"component","name":"aws2-sqs","title":"AWS Simple Queue Service (SQS)","description":"Send and receive messages to/from AWS SQS.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.sqs.Sqs2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sqs","version":"4.8.2","scheme":"aws2-sqs","extendsScheme":"","syntax":"aws2-sqs:queueNameOrArn","async":false,"api":false,"consumer [...]
+{"component":{"kind":"component","name":"aws2-sqs","title":"AWS Simple Queue Service (SQS)","description":"Send and receive messages to/from AWS SQS.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,messaging","javaType":"org.apache.camel.component.aws2.sqs.Sqs2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sqs","version":"4.10.0-SNAPSHOT","scheme":"aws2-sqs","extendsScheme":"","syntax":"aws2-sqs:queueNameOrArn","async":false,"api":false [...]
 ,
-{"component":{"kind":"component","name":"aws2-step-functions","title":"AWS StepFunctions","description":"Manage and invoke AWS Step functions.","deprecated":false,"firstVersion":"4.0.0","label":"cloud,serverless","javaType":"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-step-functions","version":"4.8.2","scheme":"aws2-step-functions","extendsScheme":"","syntax":"aws2-step-functions:labe [...]
+{"component":{"kind":"component","name":"aws2-step-functions","title":"AWS StepFunctions","description":"Manage and invoke AWS Step functions.","deprecated":false,"firstVersion":"4.0.0","label":"cloud,serverless","javaType":"org.apache.camel.component.aws2.stepfunctions.StepFunctions2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-step-functions","version":"4.10.0-SNAPSHOT","scheme":"aws2-step-functions","extendsScheme":"","syntax":"aws2-step-func [...]
 ,
-{"component":{"kind":"component","name":"aws2-sts","title":"AWS Security Token Service (STS)","description":"Manage AWS STS cluster instances.","deprecated":false,"firstVersion":"3.5.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.sts.STS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sts","version":"4.8.2","scheme":"aws2-sts","extendsScheme":"","syntax":"aws2-sts:label","async":false,"api":false,"consumerOnly":false,"pr [...]
+{"component":{"kind":"component","name":"aws2-sts","title":"AWS Security Token Service (STS)","description":"Manage AWS STS cluster instances.","deprecated":false,"firstVersion":"3.5.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.sts.STS2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-sts","version":"4.10.0-SNAPSHOT","scheme":"aws2-sts","extendsScheme":"","syntax":"aws2-sts:label","async":false,"api":false,"consumerOnly" [...]
 ,
-{"component":{"kind":"component","name":"aws2-timestream","title":"AWS Timestream","description":"Write records and execute queries on AWS time-series database","deprecated":false,"firstVersion":"4.1.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.timestream.Timestream2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-timestream","version":"4.8.2","scheme":"aws2-timestream","extendsScheme":"","syntax":"aws2-timestream:clientT [...]
+{"component":{"kind":"component","name":"aws2-timestream","title":"AWS Timestream","description":"Write records and execute queries on AWS time-series database","deprecated":false,"firstVersion":"4.1.0","label":"cloud,database","javaType":"org.apache.camel.component.aws2.timestream.Timestream2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-timestream","version":"4.10.0-SNAPSHOT","scheme":"aws2-timestream","extendsScheme":"","syntax":"aws2-timestre [...]
 ,
-{"component":{"kind":"component","name":"aws2-translate","title":"AWS Translate","description":"Translate texts using AWS Translate and AWS SDK version 2.x.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.translate.Translate2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-translate","version":"4.8.2","scheme":"aws2-translate","extendsScheme":"","syntax":"aws2-translate:label","async [...]
+{"component":{"kind":"component","name":"aws2-translate","title":"AWS Translate","description":"Translate texts using AWS Translate and AWS SDK version 2.x.","deprecated":false,"firstVersion":"3.1.0","label":"cloud,management","javaType":"org.apache.camel.component.aws2.translate.Translate2Component","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-aws2-translate","version":"4.10.0-SNAPSHOT","scheme":"aws2-translate","extendsScheme":"","syntax":"aws2-translate:lab [...]
 ,
-{"component":{"kind":"component","name":"azure-cosmosdb","title":"Azure CosmosDB","description":"To read and write records to the CosmosDB database on Azure cloud platform.","deprecated":false,"firstVersion":"3.10.0","label":"cloud,database","javaType":"org.apache.camel.component.azure.cosmosdb.CosmosDbComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-cosmosdb","version":"4.8.2","scheme":"azure-cosmosdb","extendsScheme":"","syntax":"azure-cosmosdb: [...]
+{"component":{"kind":"component","name":"azure-cosmosdb","title":"Azure CosmosDB","description":"To read and write records to the CosmosDB database on Azure cloud platform.","deprecated":false,"firstVersion":"3.10.0","label":"cloud,database","javaType":"org.apache.camel.component.azure.cosmosdb.CosmosDbComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-cosmosdb","version":"4.10.0-SNAPSHOT","scheme":"azure-cosmosdb","extendsScheme":"","syntax":"azure [...]
 ,
-{"component":{"kind":"component","name":"azure-eventhubs","title":"Azure Event Hubs","description":"Send and receive events to/from Azure Event Hubs using AMQP protocol.","deprecated":false,"firstVersion":"3.5.0","label":"cloud,messaging","javaType":"org.apache.camel.component.azure.eventhubs.EventHubsComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-eventhubs","version":"4.8.2","scheme":"azure-eventhubs","extendsScheme":"","syntax":"azure-eventhub [...]
+{"component":{"kind":"component","name":"azure-eventhubs","title":"Azure Event Hubs","description":"Send and receive events to/from Azure Event Hubs using AMQP protocol.","deprecated":false,"firstVersion":"3.5.0","label":"cloud,messaging","javaType":"org.apache.camel.component.azure.eventhubs.EventHubsComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-eventhubs","version":"4.10.0-SNAPSHOT","scheme":"azure-eventhubs","extendsScheme":"","syntax":"azur [...]
 ,
-{"component":{"kind":"component","name":"azure-files","title":"Azure Files","description":"Send and receive files to Azure storage file share","deprecated":false,"firstVersion":"3.22.0","label":"cloud,file","javaType":"org.apache.camel.component.file.azure.FilesComponent","supportLevel":"Preview","groupId":"org.apache.camel","artifactId":"camel-azure-files","version":"4.8.2","scheme":"azure-files","extendsScheme":"file","syntax":"azure-files:account/share","async":false,"api":false,"cons [...]
+{"component":{"kind":"component","name":"azure-files","title":"Azure Files","description":"Send and receive files to Azure storage file share","deprecated":false,"firstVersion":"3.22.0","label":"cloud,file","javaType":"org.apache.camel.component.file.azure.FilesComponent","supportLevel":"Preview","groupId":"org.apache.camel","artifactId":"camel-azure-files","version":"4.10.0-SNAPSHOT","scheme":"azure-files","extendsScheme":"file","syntax":"azure-files:account/share","async":false,"api":f [...]
 ,
-{"component":{"kind":"component","name":"azure-key-vault","title":"Azure Key Vault","description":"Manage secrets and keys in Azure Key Vault Service","deprecated":false,"firstVersion":"3.17.0","label":"cloud,cloud","javaType":"org.apache.camel.component.azure.key.vault.KeyVaultComponent","supportLevel":"Stable","metadata":{"vault":"azure-key-vault"},"groupId":"org.apache.camel","artifactId":"camel-azure-key-vault","version":"4.8.2","scheme":"azure-key-vault","extendsScheme":"","syntax": [...]
+{"component":{"kind":"component","name":"azure-key-vault","title":"Azure Key Vault","description":"Manage secrets and keys in Azure Key Vault Service","deprecated":false,"firstVersion":"3.17.0","label":"cloud,cloud","javaType":"org.apache.camel.component.azure.key.vault.KeyVaultComponent","supportLevel":"Stable","metadata":{"vault":"azure-key-vault"},"groupId":"org.apache.camel","artifactId":"camel-azure-key-vault","version":"4.10.0-SNAPSHOT","scheme":"azure-key-vault","extendsScheme":"" [...]
 ,
-{"component":{"kind":"component","name":"azure-servicebus","title":"Azure ServiceBus","description":"Send and receive messages to/from Azure Service Bus.","deprecated":false,"firstVersion":"3.12.0","label":"cloud,messaging","javaType":"org.apache.camel.component.azure.servicebus.ServiceBusComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-servicebus","version":"4.8.2","scheme":"azure-servicebus","extendsScheme":"","syntax":"azure-servicebus:topicOrQ [...]
+{"component":{"kind":"component","name":"azure-servicebus","title":"Azure ServiceBus","description":"Send and receive messages to/from Azure Service Bus.","deprecated":false,"firstVersion":"3.12.0","label":"cloud,messaging","javaType":"org.apache.camel.component.azure.servicebus.ServiceBusComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-servicebus","version":"4.10.0-SNAPSHOT","scheme":"azure-servicebus","extendsScheme":"","syntax":"azure-servicebu [...]
 ,
-{"component":{"kind":"component","name":"azure-storage-blob","title":"Azure Storage Blob Service","description":"Store and retrieve blobs from Azure Storage Blob Service.","deprecated":false,"firstVersion":"3.3.0","label":"cloud,file","javaType":"org.apache.camel.component.azure.storage.blob.BlobComponent","supportLevel":"Stable","groupId":"org.apache.camel","artifactId":"camel-azure-storage-blob","version":"4.8.2","scheme":"azure-storage-blob","extendsScheme":"","syntax":"azure-storage- [...]
... 6095 lines suppressed ...