-
1
-
2
-
3
-
4
<?xml version="1.0" encoding="UTF-8"?>
<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="761px" height="577px" viewBox="-0.5 -0.5 761 577" content="<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" scale="1" border="0" version="26.1.0"> <diagram name="Page-1" id="OkK6BvIz9H3dHL7W3ds0"> <mxGraphModel dx="2440" dy="1359" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="f4uEDvzRM5RpCF_URP4V-41" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="Jth4lL2z7hU5_HQBh-La-2" target="f4uEDvzRM5RpCF_URP4V-40"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-42" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-41"> <mxGeometry x="-0.4901" y="-1" relative="1" as="geometry"> <mxPoint x="20" y="10" as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-2" value="UI Components" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="80" y="105" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;dashed=1;" parent="1" source="Jth4lL2z7hU5_HQBh-La-3" target="Jth4lL2z7hU5_HQBh-La-2" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-9" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-8" vertex="1" connectable="0"> <mxGeometry y="2" relative="1" as="geometry"> <mxPoint x="2" y="-3" as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="Jth4lL2z7hU5_HQBh-La-3" target="Jth4lL2z7hU5_HQBh-La-4" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="140" y="400" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-13" value="Bundle" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-11" vertex="1" connectable="0"> <mxGeometry x="-0.1" y="-2" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-3" value="&lt;div&gt;Desktop UI&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="80" y="200" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-5" value="Desktop App" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="30" y="304" width="290" height="276" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="Jth4lL2z7hU5_HQBh-La-5" source="Jth4lL2z7hU5_HQBh-La-4" target="Jth4lL2z7hU5_HQBh-La-17" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="140" y="130" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-4" value="Desktop Bundle" style="rounded=0;whiteSpace=wrap;html=1;" parent="Jth4lL2z7hU5_HQBh-La-5" vertex="1"> <mxGeometry x="50" y="15" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;startArrow=classic;startFill=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="Jth4lL2z7hU5_HQBh-La-5" source="Jth4lL2z7hU5_HQBh-La-15" target="Jth4lL2z7hU5_HQBh-La-17" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="80" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-15" value="&lt;div&gt;Desktop Backend&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="Jth4lL2z7hU5_HQBh-La-5" vertex="1"> <mxGeometry x="50" y="196" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-17" value="&lt;div&gt;Wails&lt;/div&gt;&lt;div&gt;(Go framework)&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="Jth4lL2z7hU5_HQBh-La-5" vertex="1"> <mxGeometry x="50" y="106" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-36" value="&lt;div&gt;SQLite&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="Jth4lL2z7hU5_HQBh-La-5"> <mxGeometry x="200" y="186" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="Jth4lL2z7hU5_HQBh-La-5" source="Jth4lL2z7hU5_HQBh-La-15" target="f4uEDvzRM5RpCF_URP4V-36"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;dashed=1;" parent="1" source="Jth4lL2z7hU5_HQBh-La-27" target="Jth4lL2z7hU5_HQBh-La-2" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-29" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-28" vertex="1" connectable="0"> <mxGeometry x="-0.0481" relative="1" as="geometry"> <mxPoint x="-2" as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="Jth4lL2z7hU5_HQBh-La-27" target="Jth4lL2z7hU5_HQBh-La-30" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="259.9999999999998" y="140" as="sourcePoint" /> <mxPoint x="419.9999999999998" y="55.000000000000114" as="targetPoint" /> <Array as="points"> <mxPoint x="340" y="60" /> <mxPoint x="550" y="60" /> </Array> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-32" value="Bundle" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-31" vertex="1" connectable="0"> <mxGeometry x="-0.125" y="-3" relative="1" as="geometry"> <mxPoint x="3" y="-3" as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-27" value="&lt;div&gt;PWA UI&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="105" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-47" value="PWA" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="440" y="90" width="350" height="240" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-30" value="PWA Bundle" style="rounded=0;whiteSpace=wrap;html=1;" parent="Jth4lL2z7hU5_HQBh-La-47" vertex="1"> <mxGeometry x="50" y="15" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-18" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;startArrow=classic;startFill=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" edge="1" parent="Jth4lL2z7hU5_HQBh-La-47" source="Jth4lL2z7hU5_HQBh-La-35" target="f4uEDvzRM5RpCF_URP4V-16"> <mxGeometry relative="1" as="geometry"> <mxPoint x="170" y="220" as="sourcePoint" /> <mxPoint x="220" y="220" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-19" value="Message" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rotation=0;" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-18"> <mxGeometry x="-0.0551" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-35" value="Backend Worker" style="rounded=1;whiteSpace=wrap;html=1;" parent="Jth4lL2z7hU5_HQBh-La-47" vertex="1"> <mxGeometry x="50" y="140" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" parent="Jth4lL2z7hU5_HQBh-La-47" source="Jth4lL2z7hU5_HQBh-La-30" target="Jth4lL2z7hU5_HQBh-La-35" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-37" value="&lt;div&gt;Message&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-36" vertex="1" connectable="0"> <mxGeometry x="0.0316" y="1" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-38" value="&lt;div&gt;IndexedDB&lt;/div&gt;&lt;div&gt;/ OPFS&lt;br&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="Jth4lL2z7hU5_HQBh-La-47" vertex="1"> <mxGeometry x="260" y="15" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-39" value="Write" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.078;entryY=0.893;entryDx=0;entryDy=0;entryPerimeter=0;" parent="Jth4lL2z7hU5_HQBh-La-47" source="f4uEDvzRM5RpCF_URP4V-16" target="Jth4lL2z7hU5_HQBh-La-38" edge="1"> <mxGeometry relative="1" as="geometry"> <mxPoint x="240" y="140" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-40" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.855;exitY=1;exitDx=0;exitDy=-4.35;exitPerimeter=0;entryX=0.712;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" parent="Jth4lL2z7hU5_HQBh-La-47" source="Jth4lL2z7hU5_HQBh-La-38" target="f4uEDvzRM5RpCF_URP4V-16" edge="1"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="Jth4lL2z7hU5_HQBh-La-41" value="Read" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="Jth4lL2z7hU5_HQBh-La-40" vertex="1" connectable="0"> <mxGeometry x="0.032" y="1" relative="1" as="geometry"> <mxPoint x="1" y="-1" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-16" value="SQLite Worker" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="Jth4lL2z7hU5_HQBh-La-47"> <mxGeometry x="220" y="140" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-2" value="Web App" style="swimlane;horizontal=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="500" y="380" width="290" height="200" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;" edge="1" parent="f4uEDvzRM5RpCF_URP4V-2" source="f4uEDvzRM5RpCF_URP4V-5" target="f4uEDvzRM5RpCF_URP4V-10"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-28" value="RPC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-27"> <mxGeometry x="-0.3407" relative="1" as="geometry"> <mxPoint y="10" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-5" value="Web Bundle" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="f4uEDvzRM5RpCF_URP4V-2"> <mxGeometry x="50" y="15" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="f4uEDvzRM5RpCF_URP4V-2" source="f4uEDvzRM5RpCF_URP4V-10" target="f4uEDvzRM5RpCF_URP4V-5"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-7" value="Serve" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-6"> <mxGeometry x="-0.1111" y="-2" relative="1" as="geometry"> <mxPoint as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-10" value="&lt;div&gt;Web Backend&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="f4uEDvzRM5RpCF_URP4V-2"> <mxGeometry x="50" y="120" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-29" value="&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;div&gt;/ SQLite&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="f4uEDvzRM5RpCF_URP4V-2"> <mxGeometry x="200" y="110" width="70" height="80" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="f4uEDvzRM5RpCF_URP4V-2" source="f4uEDvzRM5RpCF_URP4V-10" target="f4uEDvzRM5RpCF_URP4V-29"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="f4uEDvzRM5RpCF_URP4V-31" target="Jth4lL2z7hU5_HQBh-La-15"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="384" y="620" /> <mxPoint x="140" y="620" /> </Array> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-33" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-32"> <mxGeometry x="-0.2636" y="-2" relative="1" as="geometry"> <mxPoint x="-108" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="f4uEDvzRM5RpCF_URP4V-31" target="f4uEDvzRM5RpCF_URP4V-10"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="444" y="620" /> <mxPoint x="610" y="620" /> </Array> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-35" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-34"> <mxGeometry x="-0.2275" relative="1" as="geometry"> <mxPoint x="86" y="11" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;jumpStyle=none;dashed=1;" edge="1" parent="1" source="f4uEDvzRM5RpCF_URP4V-31" target="Jth4lL2z7hU5_HQBh-La-35"> <mxGeometry relative="1" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-39" value="Import" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-38"> <mxGeometry x="-0.2012" y="3" relative="1" as="geometry"> <mxPoint x="17" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-31" value="Backend Core" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="354" y="400" width="120" height="60" as="geometry" /> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;jumpStyle=arc;jumpSize=10;" edge="1" parent="1" source="f4uEDvzRM5RpCF_URP4V-40" target="f4uEDvzRM5RpCF_URP4V-5"> <mxGeometry relative="1" as="geometry"> <Array as="points"> <mxPoint x="370" y="360" /> <mxPoint x="610" y="360" /> </Array> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-44" value="Bundle" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="f4uEDvzRM5RpCF_URP4V-43"> <mxGeometry x="0.3511" y="1" relative="1" as="geometry"> <mxPoint x="-154" y="-49" as="offset" /> </mxGeometry> </mxCell> <mxCell id="f4uEDvzRM5RpCF_URP4V-40" value="&lt;div&gt;Web UI&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="280" y="200" width="120" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="f4uEDvzRM5RpCF_URP4V-41"><g><path d="M 170 112 L 244.17 144.45" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 248.98 146.55 L 241.16 146.95 L 244.17 144.45 L 243.97 140.54 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-42"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 132px; margin-left: 211px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="211" y="136" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-2"><g><rect x="50" y="52" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 82px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">UI Components</div></div></div></foreignObject><text x="110" y="86" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">UI Components</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-8"><g><path d="M 110 140.63 L 110 112" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 145.88 L 106.5 138.88 L 110 140.63 L 113.5 138.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-9"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 127px; margin-left: 111px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="111" y="130" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-11"><g><path d="M 110 207 L 110 259.63" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 264.88 L 106.5 257.88 L 110 259.63 L 113.5 257.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-13"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 235px; margin-left: 109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Bundle</div></div></div></foreignObject><text x="109" y="238" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Bundle</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-3"><g><rect x="50" y="147" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 177px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Desktop UI</div></div></div></div></foreignObject><text x="110" y="181" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Desktop UI</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-5"><g><path d="M 23 251 L 0 251 L 0 527 L 23 527" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 23 251 L 290 251 L 290 527 L 23 527" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 23 251 L 23 527" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)rotate(-90 11.5 389)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 274px; height: 1px; padding-top: 389px; margin-left: -125px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Desktop App</div></div></div></foreignObject><text x="12" y="393" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">Desktop App</text></switch></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-22"><g><path d="M 110 332.37 L 110 350.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 327.12 L 113.5 334.12 L 110 332.37 L 106.5 334.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 355.88 L 106.5 348.88 L 110 350.63 L 113.5 348.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-4"><g><rect x="50" y="266" width="120" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 296px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Desktop Bundle</div></div></div></foreignObject><text x="110" y="300" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Desktop Bundle</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-19"><g><path d="M 110 440.63 L 110 423.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 445.88 L 106.5 438.88 L 110 440.63 L 113.5 438.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 418.12 L 113.5 425.12 L 110 423.37 L 106.5 425.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-15"><g><rect x="50" y="447" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 477px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Desktop Backend</div></div></div></div></foreignObject><text x="110" y="481" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Desktop Backend</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-17"><g><rect x="50" y="357" width="120" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 387px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Wails</div><div>(Go framework)</div></div></div></div></foreignObject><text x="110" y="391" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Wails...</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-36"><g><path d="M 200 452 C 200 443.72 215.67 437 235 437 C 244.28 437 253.18 438.58 259.75 441.39 C 266.31 444.21 270 448.02 270 452 L 270 502 C 270 510.28 254.33 517 235 517 C 215.67 517 200 510.28 200 502 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 270 452 C 270 460.28 254.33 467 235 467 C 215.67 467 200 460.28 200 452" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 490px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>SQLite</div></div></div></div></foreignObject><text x="235" y="494" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">SQLite</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-37"><g><path d="M 170 477 L 193.63 477" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 198.88 477 L 191.88 480.5 L 193.63 477 L 191.88 473.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-28"><g><path d="M 243.63 82 L 170 82" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 248.88 82 L 241.88 85.5 L 243.63 82 L 241.88 78.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-29"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 83px; margin-left: 211px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="211" y="86" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-31"><g><path d="M 310 52 L 310 6.94 L 520 6.94 L 520 45.63" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 520 50.88 L 516.5 43.88 L 520 45.63 L 523.5 43.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-32"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 8px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Bundle</div></div></div></foreignObject><text x="400" y="11" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Bundle</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-27"><g><rect x="250" y="52" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 82px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>PWA UI</div></div></div></div></foreignObject><text x="310" y="86" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">PWA UI</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-47"><g><path d="M 433 37 L 410 37 L 410 277 L 433 277" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 433 37 L 760 37 L 760 277 L 433 277" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 433 37 L 433 277" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)rotate(-90 421.5 156.99999999999977)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 157px; margin-left: 303px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">PWA</div></div></div></foreignObject><text x="422" y="161" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">PWA</text></switch></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-30"><g><rect x="460" y="52" width="120" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 82px; margin-left: 461px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">PWA Bundle</div></div></div></foreignObject><text x="520" y="86" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">PWA Bundle</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-18"><g><path d="M 550 243.37 L 550 256.94 L 690 256.94 L 690 243.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 550 238.12 L 553.5 245.12 L 550 243.37 L 546.5 245.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 690 238.12 L 693.5 245.12 L 690 243.37 L 686.5 245.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-19"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 258px; margin-left: 615px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Message</div></div></div></foreignObject><text x="615" y="261" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Message</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-35"><g><rect x="460" y="177" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 207px; margin-left: 461px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Backend Worker</div></div></div></foreignObject><text x="520" y="211" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Backend Worker</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-36"><g><path d="M 520 118.37 L 520 170.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 520 113.12 L 523.5 120.12 L 520 118.37 L 516.5 120.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 520 175.88 L 516.5 168.88 L 520 170.63 L 523.5 168.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-37"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 146px; margin-left: 522px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; "><div>Message</div></div></div></div></foreignObject><text x="522" y="149" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Message</text></switch></g></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-38"><g><path d="M 670 67 C 670 58.72 685.67 52 705 52 C 714.28 52 723.18 53.58 729.75 56.39 C 736.31 59.21 740 63.02 740 67 L 740 117 C 740 125.28 724.33 132 705 132 C 685.67 132 670 125.28 670 117 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 740 67 C 740 75.28 724.33 82 705 82 C 685.67 82 670 75.28 670 67" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 105px; margin-left: 671px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>IndexedDB</div><div>/ OPFS<br /></div></div></div></div></foreignObject><text x="705" y="109" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">IndexedDB...</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-39"><g><path d="M 660 177 L 673.69 129.56" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 675.15 124.51 L 676.57 132.21 L 673.69 129.56 L 669.85 130.27 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 150px; margin-left: 668px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Write</div></div></div></foreignObject><text x="668" y="153" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Write</text></switch></g></g></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-40"><g><path d="M 729.85 127.65 L 717.22 170.89" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 715.75 175.93 L 714.36 168.23 L 717.22 170.89 L 721.08 170.19 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="Jth4lL2z7hU5_HQBh-La-41"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 153px; margin-left: 725px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Read</div></div></div></foreignObject><text x="725" y="157" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Read</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-16"><g><rect x="630" y="177" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 207px; margin-left: 631px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">SQLite Worker</div></div></div></foreignObject><text x="690" y="211" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">SQLite Worker</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-2"><g><path d="M 493 327 L 470 327 L 470 527 L 493 527" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 493 327 L 760 327 L 760 527 L 493 527" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 493 327 L 493 527" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)rotate(-90 481.5 427)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 427px; margin-left: 383px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Web App</div></div></div></foreignObject><text x="482" y="431" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle" font-weight="bold">Web App</text></switch></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-27"><g><path d="M 610 408.37 L 610 440.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 610 403.12 L 613.5 410.12 L 610 408.37 L 606.5 410.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 610 445.88 L 606.5 438.88 L 610 440.63 L 613.5 438.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-28"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 428px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">RPC</div></div></div></foreignObject><text x="611" y="431" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">RPC</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-5"><g><rect x="520" y="342" width="120" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 372px; margin-left: 521px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Web Bundle</div></div></div></foreignObject><text x="580" y="376" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Web Bundle</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-6"><g><path d="M 550 447 L 550 408.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 550 403.12 L 553.5 410.12 L 550 408.37 L 546.5 410.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-7"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 428px; margin-left: 553px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Serve</div></div></div></foreignObject><text x="553" y="431" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Serve</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-10"><g><rect x="520" y="447" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 477px; margin-left: 521px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Web Backend</div></div></div></div></foreignObject><text x="580" y="481" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Web Backend</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-29"><g><path d="M 670 452 C 670 443.72 685.67 437 705 437 C 714.28 437 723.18 438.58 729.75 441.39 C 736.31 444.21 740 448.02 740 452 L 740 502 C 740 510.28 724.33 517 705 517 C 685.67 517 670 510.28 670 502 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 740 452 C 740 460.28 724.33 467 705 467 C 685.67 467 670 460.28 670 452" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 490px; margin-left: 671px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>PostgreSQL</div><div>/ SQLite</div></div></div></div></foreignObject><text x="705" y="494" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">PostgreSQL...</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-30"><g><path d="M 640 477 L 663.63 477" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 668.88 477 L 661.88 480.5 L 663.63 477 L 661.88 473.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-32"><g><path d="M 354 407 L 354 567.06 L 110 567.06 L 110 513.37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 110 508.12 L 113.5 515.12 L 110 513.37 L 106.5 515.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-33"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 566px; margin-left: 236px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="236" y="569" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-34"><g><path d="M 414 407 L 414 567.06 L 580 567.06 L 580 513.37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 580 508.12 L 583.5 515.12 L 580 513.37 L 576.5 515.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-35"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 568px; margin-left: 501px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="501" y="571" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-38"><g><path d="M 414 347 L 414 292 L 490 292 L 490 243.37" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 490 238.12 L 493.5 245.12 L 490 243.37 L 486.5 245.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-39"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 290px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Import</div></div></div></foreignObject><text x="451" y="293" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Import</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-31"><g><rect x="324" y="347" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 377px; margin-left: 325px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Backend Core</div></div></div></foreignObject><text x="384" y="381" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Backend Core</text></switch></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-43"><g><path d="M 340 207 L 340 306.94 L 409 306.94 C 409 300.44 419 300.44 419 306.94 L 419 306.94 L 580 306.94 L 580 335.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 580 340.88 L 576.5 333.88 L 580 335.63 L 583.5 333.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-44"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 258px; margin-left: 340px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; background-color: light-dark(#ffffff, var(--ge-dark-color, #121212)); white-space: nowrap; ">Bundle</div></div></div></foreignObject><text x="340" y="261" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="11px" text-anchor="middle">Bundle</text></switch></g></g></g></g><g data-cell-id="f4uEDvzRM5RpCF_URP4V-40"><g><rect x="250" y="147" width="120" height="60" rx="9" ry="9" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 177px; margin-left: 251px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Web UI</div></div></div></div></foreignObject><text x="310" y="181" fill="light-dark(#000000, #ffffff)" font-family=""Helvetica"" font-size="12px" text-anchor="middle">Web UI</text></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>