<mxfile host="app.diagrams.net" modified="2026-06-02T12:00:00.000Z" agent="Claude" version="24.7.17">
  <diagram id="azure-cloud" name="Azure Cloud Architecture">
    <mxGraphModel dx="1600" dy="1000" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1800" pageHeight="1200" math="0" shadow="0">
      <root>
        <mxCell id="0"/>
        <mxCell id="1" parent="0"/>

        <!-- Title -->
        <mxCell id="title" value="Azure Cloud Architecture — Portfolio Website" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;fontSize=20;fontStyle=1;fontColor=#1F2937;" vertex="1" parent="1">
          <mxGeometry x="450" y="15" width="700" height="40" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- USERS                -->
        <!-- ==================== -->
        <mxCell id="user_icon" value="" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3E;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;shape=mxgraph.aws4.users;" vertex="1" parent="1">
          <mxGeometry x="40" y="460" width="50" height="50" as="geometry"/>
        </mxCell>
        <mxCell id="user_label" value="&lt;b&gt;Visitors&lt;/b&gt;&lt;br&gt;Web Browser" style="text;html=1;strokeColor=none;fillColor=none;align=center;fontSize=10;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="15" y="515" width="100" height="35" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- AZURE CLOUD          -->
        <!-- ==================== -->
        <mxCell id="azure_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EBF5FB;strokeColor=#0078D4;strokeWidth=2;arcSize=3;" vertex="1" parent="1">
          <mxGeometry x="160" y="60" width="1600" height="1290" as="geometry"/>
        </mxCell>
        <mxCell id="azure_label" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYTY4NWNjOGMtMzJiYS00ZDU0LTkxZGEtM2ExMjVjYjU4ZGVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48dGl0bGU+SWNvbi1nZW5lcmFsLTc8L3RpdGxlPjxnPjxnPjxwYXRoIGQ9Ik0uNSwxNS4wOGEuMTYuMTYsMCwwLDAsLjA4LjE0bDEuMTYuNjVMMy43LDE3YS4xNy4xNywwLDAsMCwuMjMtLjA2bC42Ni0xLjEyYS4xNi4xNiwwLDAsMC0uMDYtLjIxbC0yLjMtMS4zYS4xNy4xNywwLDAsMS0uMDgtLjE0VjMuODVhLjE2LjE2LDAsMCwxLC4wOC0uMTRsMi4zLTEuM2EuMTYuMTYsMCwwLDAsLjA2LS4yMUwzLjkzLDEuMDhBLjE3LjE3LDAsMCwwLDMuNywxTDEuNzgsMi4xMWwtMS4yLjY3YS4xNi4xNiwwLDAsMC0uMDguMTRWMTUuMDhaIiBmaWxsPSIjOTQ5NDk0IiAvPjxwYXRoIGQ9Ik0yLjE0LDMuNzdsLjA2LS4wNiwyLjMtMS4zYS4xNC4xNCwwLDAsMCwuMDYtLjIxTDMuOSwxLjA4QS4xNS4xNSwwLDAsMCwzLjY4LDFMMS43NSwyLjExLjU2LDIuNzhzLS4wNSwwLS4wNi4wNmwuOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTQuNSwxNS41OWwtMi4zLTEuM2EuMjIuMjIsMCwwLDEtLjA3LS4wOWwtMS42MiwxLC4wNSwwLDEuMTUuNjUsMiwxLjExYS4xNS4xNSwwLDAsMCwuMjItLjA2bC42Ni0xLjEyQS4xNC4xNCwwLDAsMCw0LjUsMTUuNTlaIiBmaWxsPSIjYTNhM2EzIiAvPjwvZz48cGF0aCBkPSJNMTcuNSwxNS4wOGEuMTYuMTYsMCwwLDEtLjA4LjE0bC0xLjE2LjY1TDE0LjMsMTdhLjE3LjE3LDAsMCwxLS4yMy0uMDZsLS42Ni0xLjEyYS4xNi4xNiwwLDAsMSwuMDYtLjIxbDIuMy0xLjNhLjE3LjE3LDAsMCwwLC4wOC0uMTRWMy44NWEuMTYuMTYsMCwwLDAtLjA4LS4xNGwtMi4zLTEuM2EuMTYuMTYsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTcuMTcsMCwwLDEsMTQuMywxbDEuOTIsMS4wOSwxLjIuNjdhLjE2LjE2LDAsMCwxLC4wOC4xNFYxNS4wOFoiIGZpbGw9IiM5NDk0OTQiIC8+PHBhdGggZD0iTTE1Ljg2LDMuNzdsLS4wNi0uMDYtMi4zLTEuM2EuMTQuMTQsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTUuMTUsMCwwLDEsMTQuMzIsMWwxLjkzLDEuMDksMS4xOS42N3MwLDAsLjA2LjA2bC0uOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTEzLjUsMTUuNTlsMi4zLTEuM2EuMjIuMjIsMCwwLDAsLjA3LS4wOWwxLjYyLDEsMCwwLTEuMTUuNjUtMiwxLjExYS4xNS4xNSwwLDAsMS0uMjItLjA2bC0uNjYtMS4xMkEuMTQuMTQsMCwwLDEsMTMuNSwxNS41OVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDE0LjMxIDEyLjA3IDguOTkgMTUuMTYgOC45OSA5LjAxIDE0LjMxIDUuOTMiIGZpbGw9IiMzMmJlZGQiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDkgOS4wMiAzLjY4IDUuOTMgOSAyLjg0IDE0LjMxIDUuOTMiIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSI4Ljk5IDkuMDIgOC45OSAxNS4xNiAzLjY4IDEyLjA3IDMuNjggNS45MyA4Ljk5IDkuMDIiIGZpbGw9IiM1MGU2ZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIzLjY4IDEyLjA3IDguOTkgOS4wMSA4Ljk5IDE1LjE2IDMuNjggMTIuMDciIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSAxMi4wNyA4Ljk5IDkuMDEgOC45OSAxNS4xNiAxNC4zMSAxMi4wNyIgZmlsbD0iIzUwZTZmZiIgLz48L2c+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="175" y="68" width="30" height="30" as="geometry"/>
        </mxCell>
        <mxCell id="azure_text" value="&lt;b&gt;Microsoft Azure&lt;/b&gt; — West Europe" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=13;fontColor=#0078D4;fontStyle=0;" vertex="1" parent="1">
          <mxGeometry x="210" y="70" width="300" height="28" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- PRODUCTION RG        -->
        <!-- ==================== -->
        <mxCell id="prod_rg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFF7ED;strokeColor=#EA580C;strokeWidth=2;arcSize=3;" vertex="1" parent="1">
          <mxGeometry x="190" y="120" width="1360" height="550" as="geometry"/>
        </mxCell>
        <mxCell id="prod_rg_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYTY4NWNjOGMtMzJiYS00ZDU0LTkxZGEtM2ExMjVjYjU4ZGVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48dGl0bGU+SWNvbi1nZW5lcmFsLTc8L3RpdGxlPjxnPjxnPjxwYXRoIGQ9Ik0uNSwxNS4wOGEuMTYuMTYsMCwwLDAsLjA4LjE0bDEuMTYuNjVMMy43LDE3YS4xNy4xNywwLDAsMCwuMjMtLjA2bC42Ni0xLjEyYS4xNi4xNiwwLDAsMC0uMDYtLjIxbC0yLjMtMS4zYS4xNy4xNywwLDAsMS0uMDgtLjE0VjMuODVhLjE2LjE2LDAsMCwxLC4wOC0uMTRsMi4zLTEuM2EuMTYuMTYsMCwwLDAsLjA2LS4yMUwzLjkzLDEuMDhBLjE3LjE3LDAsMCwwLDMuNywxTDEuNzgsMi4xMWwtMS4yLjY3YS4xNi4xNiwwLDAsMC0uMDguMTRWMTUuMDhaIiBmaWxsPSIjOTQ5NDk0IiAvPjxwYXRoIGQ9Ik0yLjE0LDMuNzdsLjA2LS4wNiwyLjMtMS4zYS4xNC4xNCwwLDAsMCwuMDYtLjIxTDMuOSwxLjA4QS4xNS4xNSwwLDAsMCwzLjY4LDFMMS43NSwyLjExLjU2LDIuNzhzLS4wNSwwLS4wNi4wNmwuOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTQuNSwxNS41OWwtMi4zLTEuM2EuMjIuMjIsMCwwLDEtLjA3LS4wOWwtMS42MiwxLC4wNSwwLDEuMTUuNjUsMiwxLjExYS4xNS4xNSwwLDAsMCwuMjItLjA2bC42Ni0xLjEyQS4xNC4xNCwwLDAsMCw0LjUsMTUuNTlaIiBmaWxsPSIjYTNhM2EzIiAvPjwvZz48cGF0aCBkPSJNMTcuNSwxNS4wOGEuMTYuMTYsMCwwLDEtLjA4LjE0bC0xLjE2LjY1TDE0LjMsMTdhLjE3LjE3LDAsMCwxLS4yMy0uMDZsLS42Ni0xLjEyYS4xNi4xNiwwLDAsMSwuMDYtLjIxbDIuMy0xLjNhLjE3LjE3LDAsMCwwLC4wOC0uMTRWMy44NWEuMTYuMTYsMCwwLDAtLjA4LS4xNGwtMi4zLTEuM2EuMTYuMTYsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTcuMTcsMCwwLDEsMTQuMywxbDEuOTIsMS4wOSwxLjIuNjdhLjE2LjE2LDAsMCwxLC4wOC4xNFYxNS4wOFoiIGZpbGw9IiM5NDk0OTQiIC8+PHBhdGggZD0iTTE1Ljg2LDMuNzdsLS4wNi0uMDYtMi4zLTEuM2EuMTQuMTQsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTUuMTUsMCwwLDEsMTQuMzIsMWwxLjkzLDEuMDksMS4xOS42N3MwLDAsLjA2LjA2bC0uOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTEzLjUsMTUuNTlsMi4zLTEuM2EuMjIuMjIsMCwwLDAsLjA3LS4wOWwxLjYyLDEsMCwwLTEuMTUuNjUtMiwxLjExYS4xNS4xNSwwLDAsMS0uMjItLjA2bC0uNjYtMS4xMkEuMTQuMTQsMCwwLDEsMTMuNSwxNS41OVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDE0LjMxIDEyLjA3IDguOTkgMTUuMTYgOC45OSA5LjAxIDE0LjMxIDUuOTMiIGZpbGw9IiMzMmJlZGQiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDkgOS4wMiAzLjY4IDUuOTMgOSAyLjg0IDE0LjMxIDUuOTMiIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSI4Ljk5IDkuMDIgOC45OSAxNS4xNiAzLjY4IDEyLjA3IDMuNjggNS45MyA4Ljk5IDkuMDIiIGZpbGw9IiM1MGU2ZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIzLjY4IDEyLjA3IDguOTkgOS4wMSA4Ljk5IDE1LjE2IDMuNjggMTIuMDciIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSAxMi4wNyA4Ljk5IDkuMDEgOC45OSAxNS4xNiAxNC4zMSAxMi4wNyIgZmlsbD0iIzUwZTZmZiIgLz48L2c+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="205" y="128" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="prod_rg_label" value="&lt;b&gt;dna-prod-portfolio-westeurope-rg&lt;/b&gt;  (Production)" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#C2410C;" vertex="1" parent="1">
          <mxGeometry x="234" y="128" width="350" height="24" as="geometry"/>
        </mxCell>

        <!-- Container Apps Environment -->
        <mxCell id="cae_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFEDD5;strokeColor=#FB923C;strokeWidth=1;arcSize=4;" vertex="1" parent="1">
          <mxGeometry x="210" y="170" width="930" height="290" as="geometry"/>
        </mxCell>
        <mxCell id="cae_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYmViNDQwZjUtZDAxNy00ZGRhLTk4OWEtZGRkNDI1ZmNlMDJlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImY3NTQzOTA0LTRhODktNDM1ZS05NmNkLTExNTIxYzgyOWZhYSIgeDE9IjkiIHkxPSIxMS45NSIgeDI9IjkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwMDc4ZDQiIC8+PHN0b3Agb2Zmc2V0PSIwLjE2IiBzdG9wLWNvbG9yPSIjMTM4MGRhIiAvPjxzdG9wIG9mZnNldD0iMC41MyIgc3RvcC1jb2xvcj0iIzNjOTFlNSIgLz48c3RvcCBvZmZzZXQ9IjAuODIiIHN0b3AtY29sb3I9IiM1NTljZWMiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNWVhMGVmIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLWNvbnRhaW5lcnMtMTA0PC90aXRsZT48cGF0aCBkPSJNMTcuNDMsOC4yMWEzLjc4LDMuNzgsMCwwLDAtMy4yOS0zLjY0QTQuNzcsNC43NywwLDAsMCw5LjIyLDAsNC45MSw0LjkxLDAsMCwwLDQuNTQsMy4xOWE0LjUyLDQuNTIsMCwwLDAtNCw0LjM1QTQuNiw0LjYsMCwwLDAsNS4zMiwxMmwuNDIsMGg3LjY4bC4yMSwwQTMuODQsMy44NCwwLDAsMCwxNy40Myw4LjIxWiIgZmlsbD0idXJsKCNmNzU0MzkwNC00YTg5LTQzNWUtOTZjZC0xMTUyMWM4MjlmYWEpIiAvPjxwYXRoIGQ9Ik02LjM2LDYuNDYsOSwzLjg3YS4zLjMsMCwwLDEsLjQzLDBMMTIsNi40NmEuMTMuMTMsMCwwLDEtLjEuMjNIMTAuMjhhLjE1LjE1LDAsMCwwLS4xNC4xNHYzLjI0YS4xMS4xMSwwLDAsMS0uMTEuMTFIOC4yOWEuMTEuMTEsMCwwLDEtLjExLS4xMVY2LjgzYS4xNC4xNCwwLDAsMC0uMTMtLjE0SDYuNDVBLjEzLjEzLDAsMCwxLDYuMzYsNi40NloiIGZpbGw9IiNmMmYyZjIiIC8+PHBhdGggZD0iTTE0LDExLjM3YS4xMy4xMywwLDAsMC0uMDktLjEzTDkuMTYsOS42NUg5VjE4aC4xM2w0LjcxLTEuODhBLjEzLjEzLDAsMCwwLDE0LDE2WiIgZmlsbD0iI2E2N2FmNCIgLz48cGF0aCBkPSJNOSw5LjY4bC00LjUxLjgzYS4xNC4xNCwwLDAsMC0uMTIuMTN2Ni4yM2EuMTUuMTUsMCwwLDAsLjExLjE0TDksMThhLjEzLjEzLDAsMCwwLC4xNi0uMTN2LThBLjE0LjE0LDAsMCwwLDksOS42OFoiIGZpbGw9IiM1NTJmOTkiIC8+PHBvbHlnb24gcG9pbnRzPSI2LjkyIDEwLjkyIDYuOTIgMTYuNzMgOC40OSAxNi45OCA4LjQ5IDEwLjY1IDYuOTIgMTAuOTIiIGZpbGw9IiNiNzdhZjQiIG9wYWNpdHk9IjAuNzUiIC8+PHBvbHlnb24gcG9pbnRzPSI0Ljk4IDExLjI0IDQuOTggMTYuMzIgNi4zNSAxNi42IDYuMzUgMTEuMDEgNC45OCAxMS4yNCIgZmlsbD0iI2I3N2FmNCIgb3BhY2l0eT0iMC43NSIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="225" y="178" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="cae_label" value="&lt;b&gt;Container Apps Environment&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#9A3412;" vertex="1" parent="1">
          <mxGeometry x="254" y="178" width="230" height="24" as="geometry"/>
        </mxCell>

        <!-- Frontend Container App -->
        <mxCell id="fe_ca" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F97316;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="230" y="215" width="270" height="220" as="geometry"/>
        </mxCell>
        <mxCell id="fe_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjIiB4MT0iMTAuMTMiIHkxPSIxNS40NSIgeDI9IjEwLjEzIiB5Mj0iMTEuOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2NjYyIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmY2ZjZmMiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImJkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCIgeDE9IjE0LjE4IiB5MT0iMTEuMTUiIHgyPSIxNC4xOCIgeTI9IjcuMzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjY2MiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmNmY2ZjIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLXdlYi00MTwvdGl0bGU+PHBhdGggaWQ9ImVlNzVkZDA2LTFhY2EtNGY3Ni05ZDExLWQwNWEyODQwMjBhZCIgZD0iTTE0LjIxLDE1LjcyQTguNSw4LjUsMCwwLDEsMy43OSwyLjI4bC4wOS0uMDZhOC41LDguNSwwLDAsMSwxMC4zMywxMy41IiBmaWxsPSJ1cmwoI2UyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMikiIC8+PHBhdGggZD0iTTYuNjksNy4yM0ExMywxMywwLDAsMSwxNS42LDMuNjVhOC40Nyw4LjQ3LDAsMCwwLTEuNDktMS40NCwxNC4zNCwxNC4zNCwwLDAsMC00LjY5LDEuMUExMi41NCwxMi41NCwwLDAsMCw1LjM0LDYuMTMsMi43NiwyLjc2LDAsMCwxLDYuNjksNy4yM1oiIGZpbGw9IiNmZmYiIG9wYWNpdHk9IjAuNiIgLz48cGF0aCBkPSJNMi40OCwxMC42NWExNy44NiwxNy44NiwwLDAsMC0uODMsMi42Miw3LjgyLDcuODIsMCwwLDAsLjYyLjkyYy4xOC4yMy4zNS40NC41NS42NUExNy45NCwxNy45NCwwLDAsMSwzLjksMTEuMzcsMi43NiwyLjc2LDAsMCwxLDIuNDgsMTAuNjVaIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIC8+PHBhdGggZD0iTTMuNDYsNi4xMWExMiwxMiwwLDAsMS0uNjktMi45NCw4LjE1LDguMTUsMCwwLDAtMS4xLDEuNDVBMTIuNjksMTIuNjksMCwwLDAsMi4yNCw3LDIuNjksMi42OSwwLDAsMSwzLjQ2LDYuMTFaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjQuMzgiIGN5PSI4LjY4IiByPSIyLjczIiBmaWxsPSJ1cmwoI2JkZDIxM2RkLWQzMTMtNDczYy04ZmY0LTAxMzNmZDNhOTAzMykiIC8+PHBhdGggZD0iTTguMzYsMTMuNjdBMS43NywxLjc3LDAsMCwxLDguOSwxMi40YTExLjg4LDExLjg4LDAsMCwxLTIuNTMtMS44NiwyLjc0LDIuNzQsMCwwLDEtMS40OS44MywxMy4xLDEzLjEsMCwwLDAsMS40NSwxLjI4QTEyLjEyLDEyLjEyLDAsMCwwLDguMzgsMTMuOSwxLjc5LDEuNzksMCwwLDEsOC4zNiwxMy42N1oiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PHBhdGggZD0iTTE0LjY2LDEzLjg4YTEyLDEyLDAsMCwxLTIuNzYtLjMyLjQxLjQxLDAsMCwxLDAsLjExLDEuNzUsMS43NSwwLDAsMS0uNTEsMS4yNCwxMy42OSwxMy42OSwwLDAsMCwzLjQyLjI0QTguMjEsOC4yMSwwLDAsMCwxNiwxMy44MSwxMS41LDExLjUsMCwwLDEsMTQuNjYsMTMuODhaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjEwLjEzIiBjeT0iMTMuNjciIHI9IjEuNzgiIGZpbGw9InVybCgjYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjKSIgLz48cGF0aCBkPSJNMTIuMzIsOC45M2ExLjgzLDEuODMsMCwwLDEsLjYxLTFBMjUuNSwyNS41LDAsMCwxLDguNDcsMy43OWExNi45MSwxNi45MSwwLDAsMS0yLTIuOTIsNy42NCw3LjY0LDAsMCwwLTEuMDkuNDJBMTguMTQsMTguMTQsMCwwLDAsNy41Myw0LjQ3LDI2LjQ0LDI2LjQ0LDAsMCwwLDEyLjMyLDguOTNaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjciIC8+PGNpcmNsZSBjeD0iMTQuMTgiIGN5PSI5LjI3IiByPSIxLjg5IiBmaWxsPSJ1cmwoI2JkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCkiIC8+PHBhdGggZD0iTTE3LjM1LDEwLjU0LDE3LDEwLjM3bDAsMC0uMy0uMTYtLjA2LDBMMTYuMzgsMTBsLS4wNywwTDE2LDkuOGExLjc2LDEuNzYsMCwwLDEtLjY0LjkyYy4xMi4wOC4yNS4xNS4zOC4yMmwuMDguMDUuMzUuMTksMCwwLC44Ni40NWgwYTguNjMsOC42MywwLDAsMCwuMjktMS4xMVoiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PGNpcmNsZSBjeD0iNC4zOCIgY3k9IjguNjgiIHI9IjIuNzMiIGZpbGw9InVybCgjYmRkMjEzZGQtZDMxMy00NzNjLThmZjQtMDEzM2ZkM2E5MDMzKSIgLz48Y2lyY2xlIGN4PSIxMC4xMyIgY3k9IjEzLjY3IiByPSIxLjc4IiBmaWxsPSJ1cmwoI2FmY2M2M2M1LTM2NDktNDQ3Ni1hNzQyLWJjYjUzYTU2OWYzYykiIC8+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="245" y="225" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="fe_title" value="&lt;b&gt;Frontend Container App&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#9A3412;" vertex="1" parent="1">
          <mxGeometry x="278" y="228" width="200" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="fe_name" value="dna-prd-portfolio-we-ca-fe" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#6B7280;fontStyle=2;" vertex="1" parent="1">
          <mxGeometry x="245" y="255" width="230" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="fe_details" value="React 19 + TypeScript + Vite&lt;br&gt;nginx reverse proxy&lt;br&gt;Tailwind CSS + shadcn/ui&lt;br&gt;VITE_DOCS_URL baked at build&lt;br&gt;&lt;br&gt;Port 80 (HTTP) / 443 (HTTPS)&lt;br&gt;Auto-scale: 1–5 replicas&lt;br&gt;100 concurrent req/replica" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="245" y="278" width="240" height="100" as="geometry"/>
        </mxCell>
        <mxCell id="fe_domain" value="www.sven-relijveld.com" style="text;html=1;strokeColor=#16A34A;fillColor=#DCFCE7;rounded=1;arcSize=15;fontSize=9;fontStyle=1;align=center;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="245" y="400" width="240" height="22" as="geometry"/>
        </mxCell>

        <!-- Backend Container App -->
        <mxCell id="be_ca" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F97316;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="540" y="215" width="270" height="220" as="geometry"/>
        </mxCell>
        <mxCell id="be_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjIiB4MT0iMTAuMTMiIHkxPSIxNS40NSIgeDI9IjEwLjEzIiB5Mj0iMTEuOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2NjYyIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmY2ZjZmMiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImJkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCIgeDE9IjE0LjE4IiB5MT0iMTEuMTUiIHgyPSIxNC4xOCIgeTI9IjcuMzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjY2MiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmNmY2ZjIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLXdlYi00MTwvdGl0bGU+PHBhdGggaWQ9ImVlNzVkZDA2LTFhY2EtNGY3Ni05ZDExLWQwNWEyODQwMjBhZCIgZD0iTTE0LjIxLDE1LjcyQTguNSw4LjUsMCwwLDEsMy43OSwyLjI4bC4wOS0uMDZhOC41LDguNSwwLDAsMSwxMC4zMywxMy41IiBmaWxsPSJ1cmwoI2UyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMikiIC8+PHBhdGggZD0iTTYuNjksNy4yM0ExMywxMywwLDAsMSwxNS42LDMuNjVhOC40Nyw4LjQ3LDAsMCwwLTEuNDktMS40NCwxNC4zNCwxNC4zNCwwLDAsMC00LjY5LDEuMUExMi41NCwxMi41NCwwLDAsMCw1LjM0LDYuMTMsMi43NiwyLjc2LDAsMCwxLDYuNjksNy4yM1oiIGZpbGw9IiNmZmYiIG9wYWNpdHk9IjAuNiIgLz48cGF0aCBkPSJNMi40OCwxMC42NWExNy44NiwxNy44NiwwLDAsMC0uODMsMi42Miw3LjgyLDcuODIsMCwwLDAsLjYyLjkyYy4xOC4yMy4zNS40NC41NS42NUExNy45NCwxNy45NCwwLDAsMSwzLjksMTEuMzcsMi43NiwyLjc2LDAsMCwxLDIuNDgsMTAuNjVaIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIC8+PHBhdGggZD0iTTMuNDYsNi4xMWExMiwxMiwwLDAsMS0uNjktMi45NCw4LjE1LDguMTUsMCwwLDAtMS4xLDEuNDVBMTIuNjksMTIuNjksMCwwLDAsMi4yNCw3LDIuNjksMi42OSwwLDAsMSwzLjQ2LDYuMTFaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjQuMzgiIGN5PSI4LjY4IiByPSIyLjczIiBmaWxsPSJ1cmwoI2JkZDIxM2RkLWQzMTMtNDczYy04ZmY0LTAxMzNmZDNhOTAzMykiIC8+PHBhdGggZD0iTTguMzYsMTMuNjdBMS43NywxLjc3LDAsMCwxLDguOSwxMi40YTExLjg4LDExLjg4LDAsMCwxLTIuNTMtMS44NiwyLjc0LDIuNzQsMCwwLDEtMS40OS44MywxMy4xLDEzLjEsMCwwLDAsMS40NSwxLjI4QTEyLjEyLDEyLjEyLDAsMCwwLDguMzgsMTMuOSwxLjc5LDEuNzksMCwwLDEsOC4zNiwxMy42N1oiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PHBhdGggZD0iTTE0LjY2LDEzLjg4YTEyLDEyLDAsMCwxLTIuNzYtLjMyLjQxLjQxLDAsMCwxLDAsLjExLDEuNzUsMS43NSwwLDAsMS0uNTEsMS4yNCwxMy42OSwxMy42OSwwLDAsMCwzLjQyLjI0QTguMjEsOC4yMSwwLDAsMCwxNiwxMy44MSwxMS41LDExLjUsMCwwLDEsMTQuNjYsMTMuODhaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjEwLjEzIiBjeT0iMTMuNjciIHI9IjEuNzgiIGZpbGw9InVybCgjYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjKSIgLz48cGF0aCBkPSJNMTIuMzIsOC45M2ExLjgzLDEuODMsMCwwLDEsLjYxLTFBMjUuNSwyNS41LDAsMCwxLDguNDcsMy43OWExNi45MSwxNi45MSwwLDAsMS0yLTIuOTIsNy42NCw3LjY0LDAsMCwwLTEuMDkuNDJBMTguMTQsMTguMTQsMCwwLDAsNy41Myw0LjQ3LDI2LjQ0LDI2LjQ0LDAsMCwwLDEyLjMyLDguOTNaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjciIC8+PGNpcmNsZSBjeD0iMTQuMTgiIGN5PSI5LjI3IiByPSIxLjg5IiBmaWxsPSJ1cmwoI2JkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCkiIC8+PHBhdGggZD0iTTE3LjM1LDEwLjU0LDE3LDEwLjM3bDAsMC0uMy0uMTYtLjA2LDBMMTYuMzgsMTBsLS4wNywwTDE2LDkuOGExLjc2LDEuNzYsMCwwLDEtLjY0LjkyYy4xMi4wOC4yNS4xNS4zOC4yMmwuMDguMDUuMzUuMTksMCwwLC44Ni40NWgwYTguNjMsOC42MywwLDAsMCwuMjktMS4xMVoiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PGNpcmNsZSBjeD0iNC4zOCIgY3k9IjguNjgiIHI9IjIuNzMiIGZpbGw9InVybCgjYmRkMjEzZGQtZDMxMy00NzNjLThmZjQtMDEzM2ZkM2E5MDMzKSIgLz48Y2lyY2xlIGN4PSIxMC4xMyIgY3k9IjEzLjY3IiByPSIxLjc4IiBmaWxsPSJ1cmwoI2FmY2M2M2M1LTM2NDktNDQ3Ni1hNzQyLWJjYjUzYTU2OWYzYykiIC8+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="555" y="225" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="be_title" value="&lt;b&gt;Backend Container App&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#9A3412;" vertex="1" parent="1">
          <mxGeometry x="588" y="228" width="200" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="be_name" value="dna-prd-portfolio-we-ca-be" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#6B7280;fontStyle=2;" vertex="1" parent="1">
          <mxGeometry x="555" y="255" width="230" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="be_details" value="FastAPI + Python 3.11&lt;br&gt;Uvicorn ASGI server&lt;br&gt;slowapi rate limiting&lt;br&gt;&lt;br&gt;/api/contact, /api/download-cv&lt;br&gt;/api/projects, /api/experience&lt;br&gt;/api/skills, /api/health&lt;br&gt;Port 8000" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="555" y="278" width="240" height="120" as="geometry"/>
        </mxCell>

        <!-- Proxy arrow -->
        <mxCell id="e_proxy" value="/api/*" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#F97316;strokeWidth=2;fontSize=9;fontStyle=1;fontColor=#C2410C;" edge="1" source="fe_ca" target="be_ca" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- CMS Container App (Prod) -->
        <mxCell id="cms_ca" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#F97316;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="850" y="215" width="270" height="220" as="geometry"/>
        </mxCell>
        <mxCell id="cms_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48dGl0bGU+SWNvbi13ZWItNDE8L3RpdGxlPjxwYXRoIGlkPSJlZTc1ZGQwNi0xYWNhLTRmNzYtOWQxMS1kMDVhMjg0MDIwYWQiIGQ9Ik0xNC4yMSwxNS43MkE4LjUsOC41LDAsMCwxLDMuNzksMi4yOGwuMDktLjA2YTguNSw4LjUsMCwwLDEsMTAuMzMsMTMuNSIgZmlsbD0idXJsKCNlMmNmODc0Ni1jOWE4LTRlZWUtODZjMi00OTUxOTgzYzYwMzIpIiAvPjwvc3ZnPg==;" vertex="1" parent="1">
          <mxGeometry x="865" y="225" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="cms_title" value="&lt;b&gt;CMS Container App&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#9A3412;" vertex="1" parent="1">
          <mxGeometry x="898" y="228" width="200" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="cms_name" value="dna-prd-portfolio-we-ca-cms" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#6B7280;fontStyle=2;" vertex="1" parent="1">
          <mxGeometry x="865" y="255" width="240" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="cms_details" value="Strapi v5 / Node 22&lt;br&gt;Headless CMS&lt;br&gt;REST + GraphQL API&lt;br&gt;Azure Files volume mount&lt;br&gt;&lt;br&gt;Port 1337&lt;br&gt;min: 0, max: 1 replica" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="865" y="278" width="240" height="110" as="geometry"/>
        </mxCell>
        <mxCell id="cms_domain" value="cms.sven-relijveld.com" style="text;html=1;strokeColor=#16A34A;fillColor=#DCFCE7;rounded=1;arcSize=15;fontSize=9;fontStyle=1;align=center;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="865" y="400" width="240" height="22" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- PROD SERVICES ROW    -->
        <!-- ==================== -->

        <!-- ACR -->
        <mxCell id="acr_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#3B82F6;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="210" y="490" width="190" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="acr_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iZTlmN2JhNzMtNTZiOC00ODY0LTk2ZmYtZGNlODBiZWY3MjlhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImJkZjI3ZGM2LTAyNWMtNDgwNS04YmZkLTNhMDVkZWZkM2ZiZCIgeDE9IjguNjM3IiB5MT0iLTEuOTkxIiB4Mj0iOC42MzciIHkyPSIxNi43MzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJmY2Q2YzZjNy1lMmViLTRhMzItYjkxNC0zYTg0ODU1ODVhMWIiIHgxPSIxMi45NiIgeTE9IjguNTYxIiB4Mj0iMTIuOTYiIHkyPSI2LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLCAwLCAwLCAtMSwgMCwgMjApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMzMzMTMyIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzViNWE1YyIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNNy40Myw4LjE3OGwyLjU4OS0xLjU3Myw3LjI1NSwyLjczMUEzLjY2NCwzLjY2NCwwLDAsMCwxNi4yMyw3LjQ5bC0uMDEtLjA1QTQuMTk0LDQuMTk0LDAsMCwwLDE0LDYuMzJhNC45MSw0LjkxLDAsMCwwLTUuMS00LjdBNS4wNzEsNS4wNzEsMCwwLDAsNC4wNiw0LjkxLDQuNjIxLDQuNjIxLDAsMCwwLDAsOS4zOWE0LjczLDQuNzMsMCwwLDAsNC44OSw0LjU0SDcuNDNaIiBmaWxsPSJ1cmwoI2JkZjI3ZGM2LTAyNWMtNDgwNS04YmZkLTNhMDVkZWZkM2ZiZCkiIC8+PHBvbHlnb24gcG9pbnRzPSIxMC4wNyA3LjE1OSAxMC4wOCAxMS40MzkgMTcuOTkgMTMuMTE5IDE3Ljk5IDEwLjEzOSAxMC4wNyA3LjE1OSIgZmlsbD0iIzc2NzY3NiIgLz48cG9seWxpbmUgcG9pbnRzPSIxMC4wNyA3LjE1OSA3LjkzIDguNDU5IDcuOTMgMTIuNDM5IDEwLjA4IDExLjQzOSIgZmlsbD0iIzk5OSIgLz48cG9seWdvbiBwb2ludHM9IjEzLjY4IDExLjQ5OSAxNC40IDExLjY5OSAxNC40IDkuMzY5IDEzLjY4IDkuMTE5IDEzLjY4IDExLjQ5OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEyLjk2IDguODg5IDEyLjI0IDguNjI5IDEyLjI0IDExLjExOSAxMi45NiAxMS4zMTkgMTIuOTYgOC44ODkiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxNS4xMiAxMS44ODkgMTUuODIgMTIuMDc5IDE1Ljg0IDkuODU5IDE1LjEyIDkuNjE5IDE1LjEyIDExLjg4OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEwLjgxIDEwLjc0OSAxMS41MyAxMC45MjkgMTEuNTMgOC4zOTkgMTAuODEgOC4xNTkgMTAuODEgMTAuNzQ5IiBmaWxsPSIjYTNhM2EzIiAvPjxwb2x5Z29uIHBvaW50cz0iMTcuMjcgMTAuMzQ5IDE2LjU1IDEwLjA5OSAxNi41NSAxMi4yNjkgMTcuMjcgMTIuNDY5IDE3LjI3IDEwLjM0OSIgZmlsbD0iI2EzYTNhMyIgLz48cGF0aCBpZD0iZWYwZDFiNTQtYTFlNy00Y2I5LWE0ZTUtOGE4NTE4ZTdjMTI3IiBkPSJNOC42NiwxMS4zNjlsLS4zNi4yMVY4Ljc0OWwuMzYtLjE5Wm0uNzEtMy4yMkw5LDguMzg5djIuNzVsLjM3LS4yWiIgZmlsbD0iI2IzYjNiMyIgLz48cG9seWdvbiBwb2ludHM9IjE3Ljk5IDEzLjExOSAxNS44MyAxMy44NTkgNy45MyAxMi40MzkgMTAuMDggMTEuNDM5IDE3Ljk5IDEzLjExOSIgZmlsbD0idXJsKCNmY2Q2YzZjNy1lMmViLTRhMzItYjkxNC0zYTg0ODU1ODVhMWIpIiAvPjxwb2x5Z29uIHBvaW50cz0iMTcuOTkgMTYuMTY5IDEwLjA0IDE3LjY3OSAxMC4wOCAxMi4wODkgMTcuOTkgMTMuNTU5IDE3Ljk5IDE2LjE2OSIgZmlsbD0iIzc2NzY3NiIgLz48cG9seWdvbiBwb2ludHM9IjEwLjgxIDE2Ljc1OSAxMC44MSAxMy4yMDkgMTEuNTMgMTMuMjk5IDExLjUzIDE2LjYzOSAxMC44MSAxNi43NTkiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxMi45NiAxNi4zOTkgMTIuMjQgMTYuNTI5IDEyLjI0IDEzLjM4OSAxMi45NiAxMy40OTkgMTIuOTYgMTYuMzk5IDEyLjk2IDE2LjM5OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEzLjY4IDE2LjI4OSAxMy42OCAxMy41NjkgMTQuNCAxMy42NTkgMTQuNCAxNi4xNTkgMTMuNjggMTYuMjg5IiBmaWxsPSIjYTNhM2EzIiAvPjxwb2x5Z29uIHBvaW50cz0iMTUuODMgMTUuOTA5IDE1LjEyIDE2LjAzOSAxNS4xMiAxMy43NDkgMTUuODMgMTMuODU5IDE1LjgzIDE1LjkwOSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjE3LjI5IDE1LjY3OSAxNi41NSAxNS44MDkgMTYuNTUgMTMuOTI5IDE3LjI0IDE0LjAxOSAxNy4yOSAxNS42NzkiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggaWQ9ImI5ZjI1ZWI0LTRjODgtNDVjMi1iYzRkLWY5OTI3NTdkN2UwZSIgZD0iTTcuOTMsMTYuNHYtMy4yNmwyLjE2LTF2NS42WiIgZmlsbD0iIzk5OSIgLz48cGF0aCBpZD0iZWI5MjAwYTctNDY5My00NDI3LWJkYWUtYjMzY2U5MGZmN2YyIiBkPSJNOC42MSwxNi4zODlsLS4zMi0uMTZ2LTIuNzZsLjMyLS4xNVptLjc3LTMuNDUtLjM4LjE5djMuNDhsLjM3LjE5di0zLjg2WiIgZmlsbD0iI2IzYjNiMyIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="225" y="500" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="acr_title" value="&lt;b&gt;Container Registry&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#1D4ED8;" vertex="1" parent="1">
          <mxGeometry x="258" y="503" width="130" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="acr_details" value="dnaprodportfolio&lt;br&gt;westeuropeacr&lt;br&gt;&lt;br&gt;portfolio-frontend:&amp;lt;sha&amp;gt;&lt;br&gt;portfolio-backend:&amp;lt;sha&amp;gt;&lt;br&gt;portfolio-cms:&amp;lt;sha&amp;gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="225" y="530" width="160" height="100" as="geometry"/>
        </mxCell>

        <!-- Key Vault -->
        <mxCell id="kv_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D97706;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="420" y="490" width="190" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="kv_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYmM5MzE2OWEtMjRjNC00Njg2LTlmMzctYzdlNGY1M2IzZDM0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImZiMTE0YzkzLTdjMTYtNDU0MC04OTlhLTA3OTYwNDE2MjllNiIgY3g9IjkiIGN5PSI5IiByPSI4LjUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIwLjU2IiBzdG9wLWNvbG9yPSIjNWM5ZmVlIiAvPjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0iIzU1OWNlZCIgLz48c3RvcCBvZmZzZXQ9IjAuNzgiIHN0b3AtY29sb3I9IiM0YTk3ZTkiIC8+PHN0b3Agb2Zmc2V0PSIwLjg2IiBzdG9wLWNvbG9yPSIjMzk5MGU0IiAvPjxzdG9wIG9mZnNldD0iMC45MyIgc3RvcC1jb2xvcj0iIzIzODdkZSIgLz48c3RvcCBvZmZzZXQ9IjAuOTkiIHN0b3AtY29sb3I9IiMwODdiZDYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PHJhZGlhbEdyYWRpZW50IGlkPSJlYzQ3OGJkMy01YjM4LTRlN2YtYjY2MS0xMWYzNTU1NzhiZmYiIGN4PSIzOC45NSIgY3k9IjE4Mi4wNyIgcj0iOS44OCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguNzEgLTE2My4yNCkgc2NhbGUoMC45NCAwLjk0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMC4yNyIgc3RvcC1jb2xvcj0iI2ZmZDcwZiIgLz48c3RvcCBvZmZzZXQ9IjAuNDkiIHN0b3AtY29sb3I9IiNmZmNiMTIiIC8+PHN0b3Agb2Zmc2V0PSIwLjg4IiBzdG9wLWNvbG9yPSIjZmVhYzE5IiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZlYTExYiIgLz48L3JhZGlhbEdyYWRpZW50PjwvZGVmcz48dGl0bGU+SWNvbi1zZWN1cml0eS0yNDU8L3RpdGxlPjxwYXRoIGlkPSJhYWNmODMxMS1hMzE3LTQwMGYtYjYxMy03NGJkMDBkYTVjZTMiIGQ9Ik05LC41QTguNSw4LjUsMCwxLDAsMTcuNSw5LDguNTEsOC41MSwwLDAsMCw5LC41Wk05LDE2LjM0QTcuMzQsNy4zNCwwLDEsMSwxNi4zNCw5LDcuMzQsNy4zNCwwLDAsMSw5LDE2LjM0WiIgZmlsbD0idXJsKCNmYjExNGM5My03YzE2LTQ1NDAtODk5YS0wNzk2MDQxNjI5ZTYpIiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI3LjM0IiBmaWxsPSIjZmZmIiAvPjxnPjxwYXRoIGlkPSJiZDk4M2M0MS1kYjczLTQwZWMtYTRmNC1kYTEyMTNmYzk5MjQiIGQ9Ik0xMy40NCw3LjMzYTEuODQsMS44NCwwLDAsMCwwLTIuNTloMEwxMC4yOSwxLjU4YTEuODMsMS44MywwLDAsMC0yLjU4LDBoMEw0LjU2LDQuNzRhMS44NCwxLjg0LDAsMCwwLDAsMi41OUw3LjE4LDEwYS41MS41MSwwLDAsMSwuMTUuMzZ2NC44OGEuNjMuNjMsMCwwLDAsLjE4LjQ0bDEuMiwxLjJhLjQxLjQxLDAsMCwwLC41OCwwbDEuMTYtMS4xNmgwbC42OC0uNjhhLjI1LjI1LDAsMCwwLDAtLjM0bC0uNDktLjQ5YS4yNy4yNywwLDAsMSwwLS4zN2wuNDktLjQ5YS4yNS4yNSwwLDAsMCwwLS4zNGwtLjQ5LS40OWEuMjcuMjcsMCwwLDEsMC0uMzdsLjQ5LS40OWEuMjUuMjUsMCwwLDAsMC0uMzRsLS42OC0uNjl2LS4yNVpNOSwyLjM1QTEsMSwwLDAsMSw5LDQuNDIsMSwxLDAsMSwxLDksMi4zNVoiIGZpbGw9InVybCgjZWM0NzhiZDMtNWIzOC00ZTdmLWI2NjEtMTFmMzU1NTc4YmZmKSIgLz48cGF0aCBpZD0iYWQyZTdlNDQtOWJmZC00Nzc1LThiZjQtOGVmMjZhNTQ0OTIxIiBkPSJNOC4xOCwxNS4zaDBhLjIzLjIzLDAsMCwwLC4zOC0uMTd2LTRhLjI0LjI0LDAsMCwwLS4xMS0uMmgwYS4yMi4yMiwwLDAsMC0uMzQuMnY0QS4yOC4yOCwwLDAsMCw4LjE4LDE1LjNaIiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjxyZWN0IGlkPSJhOTk2ZmJmZi0zOTM2LTRiMjQtYjQwNy0zNjkzMzZjMTQzYmEiIHg9IjYuNDgiIHk9IjUuNzkiIHdpZHRoPSI1LjE3IiBoZWlnaHQ9IjAuNjEiIHJ4PSIwLjI4IiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjxyZWN0IGlkPSJiYjEyZDMxYy0zMzUyLTRhMTgtODdkZC1hMTY5YTRhODcyMWQiIHg9IjYuNDgiIHk9IjYuNzgiIHdpZHRoPSI1LjE3IiBoZWlnaHQ9IjAuNjEiIHJ4PSIwLjI4IiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjwvZz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="435" y="500" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="kv_title" value="&lt;b&gt;Key Vault&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#92400E;" vertex="1" parent="1">
          <mxGeometry x="468" y="503" width="120" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="kv_details" value="dna-prod-portfolio-we-kv&lt;br&gt;&lt;br&gt;email-address&lt;br&gt;email-password&lt;br&gt;entra-client-secret&lt;br&gt;swa-api-token&lt;br&gt;database-url&lt;br&gt;api-admin-token" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="435" y="530" width="160" height="100" as="geometry"/>
        </mxCell>

        <!-- Log Analytics + App Insights -->
        <mxCell id="log_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#16A34A;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="630" y="490" width="190" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="log_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjM4OGU5NDQtNTUwOS00OWM5LTg0ZDctZjM4YmZmYTk5NWIyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImE5OTdlMjAzLTFkN2QtNGNiOS1iMTMxLTVkYzQ0ZTAyOWI0NiIgeDE9IjUuMjMiIHkxPSIxNy40NSIgeDI9IjUuMjMiIHkyPSI4LjA5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMTk4OGQ5IiAvPjxzdG9wIG9mZnNldD0iMC45IiBzdG9wLWNvbG9yPSIjNTRhZWYwIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJlMTIyZTlkOC1hZWU1LTRmMWEtYTYwZS1iMWVhZTM1NWRhYTUiIHgxPSIxMS41IiB5MT0iMTIuNDUiIHgyPSIxMS41IiB5Mj0iMC41NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE5OGFiMyIgLz48c3RvcCBvZmZzZXQ9IjAuMDEiIHN0b3AtY29sb3I9IiMxOThiYjQiIC8+PHN0b3Agb2Zmc2V0PSIwLjQ0IiBzdG9wLWNvbG9yPSIjMjdiMmQ3IiAvPjxzdG9wIG9mZnNldD0iMC43OSIgc3RvcC1jb2xvcj0iIzJmY2JlZCIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMmQ0ZjUiIC8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPkljb24tbWFuYWdlLTMwNzwvdGl0bGU+PHBhdGggZD0iTTUuNTksMTMuMTNIOS45MXY0LjMySDUuNTlaTTEuMTUsMTcuNDVINC44N1YxMy4xM0guNTV2My43MkEuNi42LDAsMCwwLDEuMTUsMTcuNDVabS0uNi01SDQuODdWOC4wOUguNTVaIiBmaWxsPSJ1cmwoI2E5OTdlMjAzLTFkN2QtNGNiOS1iMTMxLTVkYzQ0ZTAyOWI0NikiIC8+PHBhdGggZD0iTTExLjUuNTVhNS44OSw1Ljg5LDAsMCwxLDUuOTUsNiw1Ljg5LDUuODksMCwwLDEtNS45NSw1Ljk1SDUuNTVWNi41QTUuODksNS44OSwwLDAsMSwxMS41LjU1WiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJ1cmwoI2UxMjJlOWQ4LWFlZTUtNGYxYS1hNjBlLWIxZWFlMzU1ZGFhNSkiIC8+PHJlY3QgeD0iNy41OSIgeT0iNS42NSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iNC4wOCIgZmlsbD0iI2ZmZiIgLz48cmVjdCB4PSIxMC4zMSIgeT0iNy4wMSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iMi43MiIgZmlsbD0iI2ZmZiIgLz48cmVjdCB4PSIxMy4wMyIgeT0iNC4yOSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iNS40NCIgZmlsbD0iI2ZmZiIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="645" y="500" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="log_title" value="&lt;b&gt;Log Analytics&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="678" y="503" width="130" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="ai_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjZmNmQ5OWUtZjMzMC00ODFkLTgzNmYtZWE1OGNjNDIyMTdmIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImE3YTFjNDMxLTZjNmQtNGE4Zi05YTY5LThkYTQzN2U1YjBjNSIgY3g9IjkiIGN5PSI3LjM1IiByPSI2LjQyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjYjc3YWY0IiAvPjxzdG9wIG9mZnNldD0iMC4yMSIgc3RvcC1jb2xvcj0iI2IzNzhmMiIgLz48c3RvcCBvZmZzZXQ9IjAuNDMiIHN0b3AtY29sb3I9IiNhNjcyZWQiIC8+PHN0b3Agb2Zmc2V0PSIwLjY1IiBzdG9wLWNvbG9yPSIjOTI2N2U0IiAvPjxzdG9wIG9mZnNldD0iMC44OCIgc3RvcC1jb2xvcj0iIzc1NTlkOCIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM2MjRmZDAiIC8+PC9yYWRpYWxHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImVjMGM0ZjBkLTVjOGUtNDg4Mi05NmExLTg5ZDYxODA4ZWI0OSIgeDE9IjkuMDIiIHkxPSIzLjkxIiB4Mj0iOS4wOCIgeTI9IjExLjQ5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZjJmMmYyIiAvPjxzdG9wIG9mZnNldD0iMC4yMyIgc3RvcC1jb2xvcj0iI2YxZjFmMiIgc3RvcC1vcGFjaXR5PSIwLjk5IiAvPjxzdG9wIG9mZnNldD0iMC4zNyIgc3RvcC1jb2xvcj0iI2VkZWRmMSIgc3RvcC1vcGFjaXR5PSIwLjk1IiAvPjxzdG9wIG9mZnNldD0iMC40OCIgc3RvcC1jb2xvcj0iI2U3ZTVmMCIgc3RvcC1vcGFjaXR5PSIwLjg5IiAvPjxzdG9wIG9mZnNldD0iMC41OCIgc3RvcC1jb2xvcj0iI2RlZGJlZSIgc3RvcC1vcGFjaXR5PSIwLjgxIiAvPjxzdG9wIG9mZnNldD0iMC42NyIgc3RvcC1jb2xvcj0iI2QzY2VlYiIgc3RvcC1vcGFjaXR5PSIwLjciIC8+PHN0b3Agb2Zmc2V0PSIwLjc2IiBzdG9wLWNvbG9yPSIjYzRiZWU4IiBzdG9wLW9wYWNpdHk9IjAuNTciIC8+PHN0b3Agb2Zmc2V0PSIwLjg0IiBzdG9wLWNvbG9yPSIjYjRhYmU1IiBzdG9wLW9wYWNpdHk9IjAuNDEiIC8+PHN0b3Agb2Zmc2V0PSIwLjkyIiBzdG9wLWNvbG9yPSIjYTA5NWUxIiBzdG9wLW9wYWNpdHk9IjAuMjIiIC8+PHN0b3Agb2Zmc2V0PSIwLjk5IiBzdG9wLWNvbG9yPSIjOGI3ZGRjIiBzdG9wLW9wYWNpdHk9IjAuMDIiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjODk3YmRjIiBzdG9wLW9wYWNpdHk9IjAiIC8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPkljb24tbWFuYWdlLTMxMDwvdGl0bGU+PHBhdGggZD0iTTEwLjIzLDE3LjM5bC44MS0uODdWMTQuMkg3djIuMzJsLjgxLjg3QS4zMi4zMiwwLDAsMCw4LDE3LjVoMkEuMzIuMzIsMCwwLDAsMTAuMjMsMTcuMzlaIiBmaWxsPSIjY2VjZWNlIiAvPjxwYXRoIGQ9Ik05LC41QTUuODksNS44OSwwLDAsMCwzLjA5LDcuMDdjLjI3LDIuNDcsMi42MiwzLjYyLDMuMjksNi43NWEuNDkuNDksMCwwLDAsLjQ3LjM4aDQuM2EuNDkuNDksMCwwLDAsLjQ3LS4zOGMuNjctMy4xMywzLTQuMjgsMy4yOS02Ljc1QTUuODksNS44OSwwLDAsMCw5LC41Wk03LDE0LjIiIGZpbGw9InVybCgjYTdhMWM0MzEtNmM2ZC00YThmLTlhNjktOGRhNDM3ZTViMGM1KSIgLz48cGF0aCBkPSJNMTEuNDYsMy43OWExLjQsMS40LDAsMCwwLTEuMzUsMS40NFY2SDhWNS4yM0ExLjQxLDEuNDEsMCwwLDAsNi41OSwzLjc5LDEuNCwxLjQsMCwwLDAsNS4yNCw1LjIzLDEuNDEsMS40MSwwLDAsMCw2LjU5LDYuNjhoLjY0djZhLjM2LjM2LDAsMCwwLC43Miwwdi02aDIuMTZ2NmEuMzYuMzYsMCwxLDAsLjcyLDB2LTZoLjYzYTEuNCwxLjQsMCwwLDAsMS4zNS0xLjQ1QTEuNCwxLjQsMCwwLDAsMTEuNDYsMy43OVpNNy4yMyw2SDYuNTVhLjc0Ljc0LDAsMCwxLS42OC0uNzcuNzQuNzQsMCwwLDEsLjY4LS43Ny43NC43NCwwLDAsMSwuNjguNzdabTQuMjgsMGgtLjY4VjUuMTlhLjY4LjY4LDAsMSwxLDEuMzUsMEEuNzMuNzMsMCwwLDEsMTEuNTEsNloiIGZpbGw9InVybCgjZWMwYzRmMGQtNWM4ZS00ODgyLTk2YTEtODlkNjE4MDhlYjQ5KSIgLz48cG9seWdvbiBwb2ludHM9IjYuOTYgMTUuOCAxMS4wNCAxNS4wMSAxMS4wNCAxNC41NiA2Ljk2IDE1LjM2IDYuOTYgMTUuOCIgZmlsbD0iIzk5OSIgLz48cG9seWdvbiBwb2ludHM9IjExLjA0IDE2LjExIDExLjA0IDE1LjY3IDYuOTYgMTYuNDggNi45NiAxNi41MiA3LjI3IDE2Ljg2IDExLjA0IDE2LjExIiBmaWxsPSIjOTk5IiAvPjwvc3ZnPg==;" vertex="1" parent="1">
          <mxGeometry x="645" y="540" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="log_details" value="Application Insights&lt;br&gt;&lt;br&gt;Metrics, traces, logs&lt;br&gt;Performance monitoring&lt;br&gt;Error tracking" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="674" y="540" width="140" height="90" as="geometry"/>
        </mxCell>

        <!-- DNS Zone -->
        <mxCell id="dns_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#0078D4;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="840" y="490" width="190" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="dns_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYTU0MmNmMzktMmJhNi00MjA2LTgyNzgtNmE0ZjFjMjQ1MmY1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImU3NTc5ZjRkLTM2YTMtNDY5My1hNzI2LTdhNjA1MGFjNTY3MSIgY3g9Ii02ODExLjQiIGN5PSI2NzI5LjY5IiByPSIxNyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgwLjUsIDAsIDAsIC0wLjUsIDM0MTQuOTEsIDMzNzQuMDUpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwLjE4IiBzdG9wLWNvbG9yPSIjNWVhMGVmIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwNzhkNCIgLz48L3JhZGlhbEdyYWRpZW50PjwvZGVmcz48dGl0bGU+SWNvbi1uZXR3b3JraW5nLTY0PC90aXRsZT48cGF0aCBpZD0iZjU3ZTEwNWQtNmQyZC00YWQ3LWI4YzMtYzEwNjg0YzlmOWI4IiBkPSJNMTQuMjEsMTUuNzJBOC41LDguNSwwLDAsMSwzLjc5LDIuMjhsLjA5LS4wNmE4LjUsOC41LDAsMCwxLDEwLjMzLDEzLjUiIGZpbGw9InVybCgjZTc1NzlmNGQtMzZhMy00NjkzLWE3MjYtN2E2MDUwYWM1NjcxKSIgLz48cGF0aCBkPSJNOSwxLjMxQTcuNjksNy42OSwwLDEsMCwxNi42OSw5LDcuNyw3LjcsMCwwLDAsOSwxLjMxWk0xNC4xNSwzLjlBNy4zNyw3LjM3LDAsMCwxLDEyLDQuNyw4LjgzLDguODMsMCwwLDAsMTAuNzUsMiw3LjIsNy4yLDAsMCwxLDE0LjE1LDMuOVpNOSwxLjc0YTYuNTksNi41OSwwLDAsMSwxLjA5LjA5aDBhNy40OCw3LjQ4LDAsMCwxLDEuNTMsMywxNS4xMiwxNS4xMiwwLDAsMS01LjQ1LDBBNy4zOCw3LjM4LDAsMCwxLDcuNjgsMS44OWwwLDBBNy4zNCw3LjM0LDAsMCwxLDksMS43NFpNNywyQTguNzIsOC43MiwwLDAsMCw1LjczLDQuNjhhNS41OCw1LjU4LDAsMCwxLTEuOS0uNzdBNy4zNSw3LjM1LDAsMCwxLDcsMlpNMy43MiwxNGE1LjI3LDUuMjcsMCwwLDEsMS43OC0uNzYsNy4wOCw3LjA4LDAsMCwwLDEuMzUsMi43MkE3LjI1LDcuMjUsMCwwLDEsMy43MiwxNFptNi40MSwyLjJBNy4wOCw3LjA4LDAsMCwxLDksMTYuMjZhNi44Myw2LjgzLDAsMCwxLTEuNDQtLjE1bDAsMGE2LDYsMCwwLDEtMS42Ny0zLDE0LjczLDE0LjczLDAsMCwxLDUuODgsMCw2LDYsMCwwLDEtMS42OSwzWm0uNzMtLjE2YTcuMTMsNy4xMywwLDAsMCwxLjM4LTIuOCw2LjY4LDYuNjgsMCwwLDEsMiwuODNBNy4xMyw3LjEzLDAsMCwxLDEwLjg2LDE2Wm0xLjQ4LTMuMjJjLjA4LS4zNi4xNS0uNzMuMi0xLjEybC0uNDYuMTFjLS4wNS4zMS0uMS42Mi0uMTcuOTFhMTUuMjMsMTUuMjMsMCwwLDAtNi4wOSwwYy0uMDctLjI3LS4xMi0uNTYtLjE3LS44NmEuMjguMjgsMCwwLDEsMC0uMDlsLS40Ni0uMTNhMi4zNiwyLjM2LDAsMCwwLDAsLjI4YzAsLjMyLjExLjYyLjE3LjkxYTUuOSw1LjksMCwwLDAtMiwuODUsNy4yNCw3LjI0LDAsMCwxLC4xMS05LjQsNi4yOSw2LjI5LDAsMCwwLDIuMDguODZjLS4wNy4yNC0uMTMuNS0uMTguNzZzMCwuMjUtLjA4LjM3bC40Ny0uMTEsMC0uMTdjLjA2LS4yNi4xMi0uNTEuMTktLjc1QTE0Ljg5LDE0Ljg5LDAsMCwwLDksNS40OGExNSwxNSwwLDAsMCwyLjc4LS4yNmMuMDcuMjcuMTQuNTYuMi44NWwuNDYuMTFxLS4xMS0uNTQtLjI0LTFhNy43Myw3LjczLDAsMCwwLDIuMy0uOTEsNy4yMiw3LjIyLDAsMCwxLC4wNiw5LjQ5QTcuMjgsNy4yOCwwLDAsMCwxMi4zNCwxMi43OVoiIGZpbGw9IiM1ZWEwZWYiIC8+PHBhdGggZD0iTTMuNjksN2E3LjkyLDcuOTIsMCwwLDEsMS4xNi0uMDgsMi40NCwyLjQ0LDAsMCwxLDEuNzEuNTJBMiwyLDAsMCwxLDcuMTUsOC45YTIuMjEsMi4yMSwwLDAsMS0uNjEsMS42NCwyLjYsMi42LDAsMCwxLTEuODYuNjEsOS4xNyw5LjE3LDAsMCwxLTEtLjA1Wm0uNTUsMy43M2E0LDQsMCwwLDAsLjU1LDBBMS42MiwxLjYyLDAsMCwwLDYuNTgsOC45MiwxLjUsMS41LDAsMCwwLDQuODcsNy4zYTMuMTcsMy4xNywwLDAsMC0uNjMsMFoiIGZpbGw9IiNmZmYiIC8+PHBhdGggZD0iTTcuODYsMTEuMTFWNi45aC41OUw5LjgsOWExMi4xOCwxMi4xOCwwLDAsMSwuNzYsMS4zN2gwYy0uMDUtLjU2LS4wNi0xLjA3LS4wNi0xLjczVjYuOUgxMXY0LjIxaC0uNTVMOS4xMyw5Yy0uMjktLjQ3LS41Ny0xLS43OS0xLjRoMGMwLC41MywwLDEsMCwxLjc0djEuOFoiIGZpbGw9IiNmZmYiIC8+PHBhdGggZD0iTTExLjg5LDEwLjQ1YTIsMiwwLDAsMCwxLC4yN2MuNTYsMCwuODgtLjI5Ljg4LS43MnMtLjIyLS42Mi0uNzktLjgzLTEuMTItLjYtMS4xMi0xLjJhMS4yMiwxLjIyLDAsMCwxLDEuMzctMS4xNCwyLDIsMCwwLDEsLjkzLjJMMTQsNy40OGExLjYzLDEuNjMsMCwwLDAtLjgtLjJjLS41OCwwLS44LjM0LS44LjYzcy4yNi41OS44NC44MSwxLjA4LjYyLDEuMDgsMS4yNC0uNDgsMS4yMS0xLjQ4LDEuMjFhMi4xNiwyLjE2LDAsMCwxLTEuMDctLjI3WiIgZmlsbD0iI2ZmZiIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="855" y="500" width="28" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="dns_title" value="&lt;b&gt;Azure DNS Zone&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#0078D4;" vertex="1" parent="1">
          <mxGeometry x="888" y="503" width="130" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="dns_details" value="sven-relijveld.com&lt;br&gt;&lt;br&gt;www → Frontend CA&lt;br&gt;dev → Dev Frontend CA&lt;br&gt;docs → Prod SWA&lt;br&gt;dev-docs → Dev SWA&lt;br&gt;cms → CMS CA (prod)&lt;br&gt;cms.dev → CMS CA (dev)&lt;br&gt;Managed TLS certs" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="855" y="530" width="160" height="120" as="geometry"/>
        </mxCell>

        <!-- Azure Files — CMS Uploads (Prod) -->
        <mxCell id="cms_storage_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#0078D4;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="1050" y="490" width="190" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="cms_storage_title" value="&lt;b&gt;Azure Files — CMS Uploads&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#0078D4;" vertex="1" parent="1">
          <mxGeometry x="1065" y="500" width="165" height="30" as="geometry"/>
        </mxCell>
        <mxCell id="cms_storage_details" value="dnaprdportfoliowesteuropesacms&lt;br&gt;&lt;br&gt;Azure Files share&lt;br&gt;Persistent volume mount&lt;br&gt;for Strapi media uploads&lt;br&gt;(public/ directory)" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="1065" y="533" width="165" height="100" as="geometry"/>
        </mxCell>

        <!-- CMS CA → Azure Files volume -->
        <mxCell id="e_cms_storage" value="volume mount" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#0078D4;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#0078D4;" edge="1" source="cms_ca" target="cms_storage_box" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- ENTRA ID             -->
        <!-- ==================== -->
        <mxCell id="entra_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F0FDF4;strokeColor=#16A34A;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="1290" y="120" width="440" height="220" as="geometry"/>
        </mxCell>
        <mxCell id="entra_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0idXVpZC0zMTg3MWJiMC01NTE3LTRhZWUtYjJiYS01YTM4NDhiYTYxNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiB2aWV3Qm94PSIwIDAgMTggMTgiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0idXVpZC0xMGQzMDNkYy1kYmM2LTRmZDYtOWI1MS00ZDJjN2VmMWFmOTMiIHgxPSIxMC45MDEiIHkxPSI0LjM4NSIgeDI9IjEwLjkwMSIgeTI9IjE4Ljc4MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjA4NSIgc3RvcC1jb2xvcj0iI2VmNzEwMCIgLz48c3RvcCBvZmZzZXQ9Ii45OTkiIHN0b3AtY29sb3I9IiNmNzhkMWUiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9InV1aWQtNmJiZTc0NWYtYjQ5NS00NmNhLWE3ZjYtNmQ0OWQ1N2VlMDI5IiB4MT0iLTc5LjQ1MiIgeTE9Ijc3OC42NTciIHgyPSItNzkuNDUyIiB5Mj0iNzg2LjM3OCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg5NCA3OTUuNTE2KSBzY2FsZSgxIC0xKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzAwNzhkNCIgLz48c3RvcCBvZmZzZXQ9Ii4wNiIgc3RvcC1jb2xvcj0iIzBhN2NkNyIgLz48c3RvcCBvZmZzZXQ9Ii4zNCIgc3RvcC1jb2xvcj0iIzJlOGNlMSIgLz48c3RvcCBvZmZzZXQ9Ii41OSIgc3RvcC1jb2xvcj0iIzQ4OTdlOSIgLz48c3RvcCBvZmZzZXQ9Ii44MiIgc3RvcC1jb2xvcj0iIzU4OWVlZCIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PGc+PHBvbHlnb24gcG9pbnRzPSI0LjYzNiA5Ljk4NSA0LjY4OCAxMC4wMTcgOSAxMi43MTMgOS4wMDEgMTIuNzEzIDkuMDAxIDEyLjcxMyA5LjAwMSA1LjA2MiA5IDUuMDYxIDQuNjM2IDkuOTg1IiBmaWxsPSIjZmZiMzRkIiBpc29sYXRpb249Imlzb2xhdGUiIG9wYWNpdHk9Ii45IiBzdHJva2Utd2lkdGg9IjAiIC8+PHBhdGggZD0ibTEwLjE0NiwxLjI5NGMtLjI5OS0uMzM4LS43MjItLjUwNy0xLjE0NS0uNTA3aDBjLS40MjQtLjAwMS0uODQ3LjE2OC0xLjE0Ny41MDZoLS4wMDFMLjM1Myw5Ljc1M2MtLjU3OS42NTQtLjQyOCwxLjY0Mi4zMjMsMi4xMTEsMCwwLDIuNzc2LDEuNzM1LDMuMTI2LDEuOTU0LjM4OC4yNDIsMS4wMzMuNTExLDEuNzE1LjUxMS42MjEsMCwxLjE5OC0uMTgsMS42NzYtLjQ4NywwLDAsMCwwLC4wMDIsMGwxLjgwNS0xLjEyOC00LjM2NC0yLjcyOCw0LjM2NS00LjkyNC4xMDktLjEyM2MuNTUtLjYyNywxLjM3Ny0xLjAyNiwyLjMwMi0xLjAyNi40NzIsMCwuOTE2LjEwNywxLjMxMy4yOTFsLTIuNTc5LTIuOTA5WiIgZmlsbD0iI2ZhYTIxZCIgc3Ryb2tlLXdpZHRoPSIwIiAvPjxwb2x5Z29uIHBvaW50cz0iMTMuMzY1IDkuOTg1IDEzLjM2NSA5Ljk4NSAxMy4zNjUgOS45ODUgOS4wMDEgNS4wNjIgOS4wMDEgMTIuNzEyIDEzLjM2NSA5Ljk4NSIgZmlsbD0iI2Y3OGQxZSIgc3Ryb2tlLXdpZHRoPSIwIiAvPjxwYXRoIGQ9Im0xNy42NDcsOS43NTNsLTQuOTIxLTUuNTUxYy0uMzk3LS4xODUtLjg0Mi0uMjkxLTEuMzEzLS4yOTEtLjkyNSwwLTEuNzUyLjM5OS0yLjMwMiwxLjAyNmwtLjEwOS4xMjMsNC4zNjQsNC45MjQtNC4yNjYsMi42NjYtLjA5OS4wNjJ2LjAwM3MtLjAwMS0uMDAyLS4wMDEtLjAwMmwtMS44MDUsMS4xMjhzLS4wMDIsMC0uMDAyLDBjLS40NzguMzA3LTEuMDU1LjQ4Ny0xLjY3Ni40ODctLjY4MiwwLTEuMzI3LS4yNjktMS43MTUtLjUxMWw0LjM3NCwyLjczNGMuMjUuMTU2LjUzOC4yMzQuODI0LjIzNGgwcy4wMDEsMCwuMDAxLDBjLjI4NywwLC41NzMtLjA3OC44MjMtLjIzNGwxLjczLTEuMDgxaDBzNS43Ny0zLjYwNyw1Ljc3LTMuNjA3aDBjLjc1MS0uNDY4LjkwMi0xLjQ1Ni4zMjMtMi4xMVoiIGZpbGw9InVybCgjdXVpZC0xMGQzMDNkYy1kYmM2LTRmZDYtOWI1MS00ZDJjN2VmMWFmOTMpIiBzdHJva2Utd2lkdGg9IjAiIC8+PC9nPjxwYXRoIGQ9Im0xOCwxMi43MjFjMCwyLjI2NS0yLjczOSw0LjA4OC0zLjMzOCw0LjQ2LS4wNjguMDQ0LS4xNTYuMDQ0LS4yMjQsMC0uNTk5LS4zNjctMy4zMzgtMi4xOS0zLjMzOC00LjQ2di0yLjcyNWMwLS4xMTkuMDkzLS4yMTUuMjEtLjIxOCwyLjEzNC0uMDU1LDEuNjQyLS45OTEsMy4yNDEtLjk5MXMxLjEwNi45MzcsMy4yNDEuOTkxYy4xMTcuMDAzLjIxLjEuMjEuMjE4djIuNzI1WiIgZmlsbD0iIzAwNzhkNCIgc3Ryb2tlLXdpZHRoPSIwIiAvPjxwYXRoIGQ9Im0xNy43MTcsMTIuNzQxYzAsMi4wODEtMi41MTUsMy43NTEtMy4wNjUsNC4wODgtLjA2My4wMzktLjE0Mi4wMzktLjIwNSwwLS41NTEtLjMzNy0zLjA2NS0yLjAwNy0zLjA2NS00LjA4OHYtMi40NzhjLS4wMTktLjExMS4wNTQtLjIxNi4xNjMtLjIzNS4wMTEtLjAwMi4wMjEtLjAwMy4wMzItLjAwMywxLjk1OS0uMDM1LDEuNTExLS44ODcsMi45NzMtLjg4N3MxLjAxNC44NTIsMi45NzMuODg3Yy4xMDcuMDAzLjE5Mi4wOS4xOTUuMTk4djIuNTE3WiIgZmlsbD0idXJsKCN1dWlkLTZiYmU3NDVmLWI0OTUtNDZjYS1hN2Y2LTZkNDlkNTdlZTAyOSkiIHN0cm9rZS13aWR0aD0iMCIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="1305" y="128" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="entra_label" value="&lt;b&gt;Microsoft Entra ID&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="1334" y="128" width="200" height="24" as="geometry"/>
        </mxCell>

        <mxCell id="entra_oidc" value="&lt;b&gt;App Registration&lt;/b&gt;&lt;br&gt;github-actions-portfolio-oidc&lt;br&gt;&lt;br&gt;Federated credentials:&lt;br&gt;main, PRs, tags, dev, prod, shared" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DCFCE7;strokeColor=#86EFAC;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="165" width="190" height="100" as="geometry"/>
        </mxCell>

        <mxCell id="entra_sso" value="&lt;b&gt;SSO App Registration&lt;/b&gt;&lt;br&gt;Dev EasyAuth&lt;br&gt;&lt;br&gt;Protects dev environment&lt;br&gt;with Entra SSO login" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DCFCE7;strokeColor=#86EFAC;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1520" y="165" width="190" height="100" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- STATIC WEB APP       -->
        <!-- ==================== -->
        <mxCell id="swa_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EDE9FE;strokeColor=#7C3AED;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="1290" y="370" width="440" height="200" as="geometry"/>
        </mxCell>
        <mxCell id="swa_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImU2YWQ0ZGY5LTBhYjctNGI0OS05NzA2LTYyMGI0MjM4MGYwYiIgeDE9IjkiIHkxPSIxNi4yMzYiIHgyPSI5IiB5Mj0iNS41OTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwMDViYTEiIC8+PHN0b3Agb2Zmc2V0PSIwLjc3NSIgc3RvcC1jb2xvcj0iIzAwNzhkNCIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48ZyBpZD0iZTc4ODViOWMtOTcxNC00Mjc2LWJkNDEtNTkxY2I3ZTA4NmE1Ij48cGF0aCBkPSJNMCw1LjZIMThhMCwwLDAsMCwxLDAsMFYxNS42MzVhLjYuNiwwLDAsMS0uNi42SC42YS42LjYsMCwwLDEtLjYtLjZWNS42QTAsMCwwLDAsMSwwLDUuNloiIGZpbGw9InVybCgjZTZhZDRkZjktMGFiNy00YjQ5LTk3MDYtNjIwYjQyMzgwZjBiKSIgLz48cmVjdCB4PSIxLjMwOSIgeT0iNi42NTciIHdpZHRoPSIxNS41MjciIGhlaWdodD0iOC41MTQiIHJ4PSIwLjYiIGZpbGw9IiM1ZWEwZWYiIG9wYWNpdHk9IjAuNiIgLz48cGF0aCBkPSJNLjYsMS43NjRIMTcuNGEuNi42LDAsMCwxLC42LjZWNS42YTAsMCwwLDAsMSwwLDBIMGEwLDAsMCwwLDEsMCwwVjIuMzY1QS42LjYsMCwwLDEsLjYsMS43NjRaIiBmaWxsPSIjMDA1YmExIiAvPjxwYXRoIGQ9Ik03LjEwOSwxMy4yMTdsLS4zMjEuMzJhLjE0NC4xNDQsMCwwLDEtLjIwNSwwTDQuMjU4LDExLjIwNWEuMjkuMjksMCwwLDEsMC0uNDFsLjMyMS0uMzJMNy4xMSwxMy4wMTJBLjE0NS4xNDUsMCwwLDEsNy4xMDksMTMuMjE3Wm0zLjY1MywwLC4zMjEuMzJhLjE0NC4xNDQsMCwwLDAsLjIwNSwwbDIuMzI1LTIuMzMyYS4yOS4yOSwwLDAsMCwwLS40MWwtLjMyMi0uMzItMi41MywyLjUzN0EuMTQ1LjE0NSwwLDAsMCwxMC43NjIsMTMuMjE3WiIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC44IiAvPjxwYXRoIGQ9Ik02LjgzMSw4LjQzM2wuMzIuMzIxYS4xNDQuMTQ0LDAsMCwxLDAsLjIwNUw0LjU3NiwxMS41MjdsLS4zMi0uMzIyYS4yODkuMjg5LDAsMCwxLDAtLjQxbDIuMzctMi4zNjNBLjE0NS4xNDUsMCwwLDEsNi44MzEsOC40MzNabTQuMjA3LDAtLjMyLjMyMWEuMTQ0LjE0NCwwLDAsMCwwLC4yMDVsMi41NzUsMi41NjguMzItLjMyMWEuMjkyLjI5MiwwLDAsMCwwLS40MTFsLTIuMzctMi4zNjJBLjE0NC4xNDQsMCwwLDAsMTEuMDM4LDguNDM0WiIgZmlsbD0iI2ZmZiIgLz48cGF0aCBkPSJNOC4xNTksMTQuMzYzLDcuNjQ2LDE0LjJhLjEwNS4xMDUsMCwwLDEtLjA2Ny0uMTMxTDkuNjY5LDcuNTRhLjEuMSwwLDAsMSwuMTMtLjA2N2wuNTEzLjE2NGEuMS4xLDAsMCwxLC4wNjcuMTNMOC4yODksMTQuM0EuMS4xLDAsMCwxLDguMTU5LDE0LjM2M1oiIGZpbGw9IiNmZmYiIC8+PHBhdGggZD0iTTMuMTY2LDMuODQ3YS43Ni43NiwwLDEsMS0uNzYtLjc2QS43Ni43NiwwLDAsMSwzLjE2NiwzLjg0N1pNNC44LDMuMDg3YS43Ni43NiwwLDEsMCwuNzYuNzZBLjc2Ljc2LDAsMCwwLDQuOCwzLjA4N1ptMi4zOTMsMGEuNzYuNzYsMCwxLDAsLjc2Ljc2QS43Ni43NiwwLDAsMCw3LjE5MSwzLjA4N1oiIGZpbGw9IiNmZmYiIC8+PC9nPjwvc3ZnPg==;" vertex="1" parent="1">
          <mxGeometry x="1305" y="378" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="swa_label" value="&lt;b&gt;Azure Static Web App — Documentation&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#5B21B6;" vertex="1" parent="1">
          <mxGeometry x="1334" y="378" width="350" height="24" as="geometry"/>
        </mxCell>

        <mxCell id="swa_prod" value="&lt;b&gt;Production Slot&lt;/b&gt;&lt;br&gt;docs.sven-relijveld.com&lt;br&gt;&lt;br&gt;MkDocs Material&lt;br&gt;Architecture, API ref, ADRs" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DDD6FE;strokeColor=#8B5CF6;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="415" width="190" height="100" as="geometry"/>
        </mxCell>

        <mxCell id="swa_dev" value="&lt;b&gt;Dev Slot&lt;/b&gt;&lt;br&gt;dev-docs.sven-relijveld.com&lt;br&gt;&lt;br&gt;Preview docs&lt;br&gt;--env production flag" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DDD6FE;strokeColor=#8B5CF6;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1520" y="415" width="190" height="100" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- DEV RESOURCE GROUP   -->
        <!-- ==================== -->
        <mxCell id="dev_rg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F0FDF4;strokeColor=#16A34A;strokeWidth=2;arcSize=3;" vertex="1" parent="1">
          <mxGeometry x="190" y="700" width="1140" height="430" as="geometry"/>
        </mxCell>
        <mxCell id="dev_rg_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYTY4NWNjOGMtMzJiYS00ZDU0LTkxZGEtM2ExMjVjYjU4ZGVkIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48dGl0bGU+SWNvbi1nZW5lcmFsLTc8L3RpdGxlPjxnPjxnPjxwYXRoIGQ9Ik0uNSwxNS4wOGEuMTYuMTYsMCwwLDAsLjA4LjE0bDEuMTYuNjVMMy43LDE3YS4xNy4xNywwLDAsMCwuMjMtLjA2bC42Ni0xLjEyYS4xNi4xNiwwLDAsMC0uMDYtLjIxbC0yLjMtMS4zYS4xNy4xNywwLDAsMS0uMDgtLjE0VjMuODVhLjE2LjE2LDAsMCwxLC4wOC0uMTRsMi4zLTEuM2EuMTYuMTYsMCwwLDAsLjA2LS4yMUwzLjkzLDEuMDhBLjE3LjE3LDAsMCwwLDMuNywxTDEuNzgsMi4xMWwtMS4yLjY3YS4xNi4xNiwwLDAsMC0uMDguMTRWMTUuMDhaIiBmaWxsPSIjOTQ5NDk0IiAvPjxwYXRoIGQ9Ik0yLjE0LDMuNzdsLjA2LS4wNiwyLjMtMS4zYS4xNC4xNCwwLDAsMCwuMDYtLjIxTDMuOSwxLjA4QS4xNS4xNSwwLDAsMCwzLjY4LDFMMS43NSwyLjExLjU2LDIuNzhzLS4wNSwwLS4wNi4wNmwuOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTQuNSwxNS41OWwtMi4zLTEuM2EuMjIuMjIsMCwwLDEtLjA3LS4wOWwtMS42MiwxLC4wNSwwLDEuMTUuNjUsMiwxLjExYS4xNS4xNSwwLDAsMCwuMjItLjA2bC42Ni0xLjEyQS4xNC4xNCwwLDAsMCw0LjUsMTUuNTlaIiBmaWxsPSIjYTNhM2EzIiAvPjwvZz48cGF0aCBkPSJNMTcuNSwxNS4wOGEuMTYuMTYsMCwwLDEtLjA4LjE0bC0xLjE2LjY1TDE0LjMsMTdhLjE3LjE3LDAsMCwxLS4yMy0uMDZsLS42Ni0xLjEyYS4xNi4xNiwwLDAsMSwuMDYtLjIxbDIuMy0xLjNhLjE3LjE3LDAsMCwwLC4wOC0uMTRWMy44NWEuMTYuMTYsMCwwLDAtLjA4LS4xNGwtMi4zLTEuM2EuMTYuMTYsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTcuMTcsMCwwLDEsMTQuMywxbDEuOTIsMS4wOSwxLjIuNjdhLjE2LjE2LDAsMCwxLC4wOC4xNFYxNS4wOFoiIGZpbGw9IiM5NDk0OTQiIC8+PHBhdGggZD0iTTE1Ljg2LDMuNzdsLS4wNi0uMDYtMi4zLTEuM2EuMTQuMTQsMCwwLDEtLjA2LS4yMWwuNjYtMS4xMkEuMTUuMTUsMCwwLDEsMTQuMzIsMWwxLjkzLDEuMDksMS4xOS42N3MwLDAsLjA2LjA2bC0uOS41MVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggZD0iTTEzLjUsMTUuNTlsMi4zLTEuM2EuMjIuMjIsMCwwLDAsLjA3LS4wOWwxLjYyLDEsMCwwLTEuMTUuNjUtMiwxLjExYS4xNS4xNSwwLDAsMS0uMjItLjA2bC0uNjYtMS4xMkEuMTQuMTQsMCwwLDEsMTMuNSwxNS41OVoiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDE0LjMxIDEyLjA3IDguOTkgMTUuMTYgOC45OSA5LjAxIDE0LjMxIDUuOTMiIGZpbGw9IiMzMmJlZGQiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSA1LjkzIDkgOS4wMiAzLjY4IDUuOTMgOSAyLjg0IDE0LjMxIDUuOTMiIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSI4Ljk5IDkuMDIgOC45OSAxNS4xNiAzLjY4IDEyLjA3IDMuNjggNS45MyA4Ljk5IDkuMDIiIGZpbGw9IiM1MGU2ZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIzLjY4IDEyLjA3IDguOTkgOS4wMSA4Ljk5IDE1LjE2IDMuNjggMTIuMDciIGZpbGw9IiM5Y2ViZmYiIC8+PHBvbHlnb24gcG9pbnRzPSIxNC4zMSAxMi4wNyA4Ljk5IDkuMDEgOC45OSAxNS4xNiAxNC4zMSAxMi4wNyIgZmlsbD0iIzUwZTZmZiIgLz48L2c+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="205" y="708" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="dev_rg_label" value="&lt;b&gt;dna-dev-portfolio-westeurope-rg&lt;/b&gt;  (Dev / Preview)" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="234" y="708" width="350" height="24" as="geometry"/>
        </mxCell>

        <!-- Dev CAE -->
        <mxCell id="dev_cae_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DCFCE7;strokeColor=#4ADE80;strokeWidth=1;arcSize=4;" vertex="1" parent="1">
          <mxGeometry x="210" y="750" width="890" height="190" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cae_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYmViNDQwZjUtZDAxNy00ZGRhLTk4OWEtZGRkNDI1ZmNlMDJlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImY3NTQzOTA0LTRhODktNDM1ZS05NmNkLTExNTIxYzgyOWZhYSIgeDE9IjkiIHkxPSIxMS45NSIgeDI9IjkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwMDc4ZDQiIC8+PHN0b3Agb2Zmc2V0PSIwLjE2IiBzdG9wLWNvbG9yPSIjMTM4MGRhIiAvPjxzdG9wIG9mZnNldD0iMC41MyIgc3RvcC1jb2xvcj0iIzNjOTFlNSIgLz48c3RvcCBvZmZzZXQ9IjAuODIiIHN0b3AtY29sb3I9IiM1NTljZWMiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNWVhMGVmIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLWNvbnRhaW5lcnMtMTA0PC90aXRsZT48cGF0aCBkPSJNMTcuNDMsOC4yMWEzLjc4LDMuNzgsMCwwLDAtMy4yOS0zLjY0QTQuNzcsNC43NywwLDAsMCw5LjIyLDAsNC45MSw0LjkxLDAsMCwwLDQuNTQsMy4xOWE0LjUyLDQuNTIsMCwwLDAtNCw0LjM1QTQuNiw0LjYsMCwwLDAsNS4zMiwxMmwuNDIsMGg3LjY4bC4yMSwwQTMuODQsMy44NCwwLDAsMCwxNy40Myw4LjIxWiIgZmlsbD0idXJsKCNmNzU0MzkwNC00YTg5LTQzNWUtOTZjZC0xMTUyMWM4MjlmYWEpIiAvPjxwYXRoIGQ9Ik02LjM2LDYuNDYsOSwzLjg3YS4zLjMsMCwwLDEsLjQzLDBMMTIsNi40NmEuMTMuMTMsMCwwLDEtLjEuMjNIMTAuMjhhLjE1LjE1LDAsMCwwLS4xNC4xNHYzLjI0YS4xMS4xMSwwLDAsMS0uMTEuMTFIOC4yOWEuMTEuMTEsMCwwLDEtLjExLS4xMVY2LjgzYS4xNC4xNCwwLDAsMC0uMTMtLjE0SDYuNDVBLjEzLjEzLDAsMCwxLDYuMzYsNi40NloiIGZpbGw9IiNmMmYyZjIiIC8+PHBhdGggZD0iTTE0LDExLjM3YS4xMy4xMywwLDAsMC0uMDktLjEzTDkuMTYsOS42NUg5VjE4aC4xM2w0LjcxLTEuODhBLjEzLjEzLDAsMCwwLDE0LDE2WiIgZmlsbD0iI2E2N2FmNCIgLz48cGF0aCBkPSJNOSw5LjY4bC00LjUxLjgzYS4xNC4xNCwwLDAsMC0uMTIuMTN2Ni4yM2EuMTUuMTUsMCwwLDAsLjExLjE0TDksMThhLjEzLjEzLDAsMCwwLC4xNi0uMTN2LThBLjE0LjE0LDAsMCwwLDksOS42OFoiIGZpbGw9IiM1NTJmOTkiIC8+PHBvbHlnb24gcG9pbnRzPSI2LjkyIDEwLjkyIDYuOTIgMTYuNzMgOC40OSAxNi45OCA4LjQ5IDEwLjY1IDYuOTIgMTAuOTIiIGZpbGw9IiNiNzdhZjQiIG9wYWNpdHk9IjAuNzUiIC8+PHBvbHlnb24gcG9pbnRzPSI0Ljk4IDExLjI0IDQuOTggMTYuMzIgNi4zNSAxNi42IDYuMzUgMTEuMDEgNC45OCAxMS4yNCIgZmlsbD0iI2I3N2FmNCIgb3BhY2l0eT0iMC43NSIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="225" y="758" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cae_label" value="&lt;b&gt;Container Apps Environment (Dev)&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="254" y="758" width="260" height="24" as="geometry"/>
        </mxCell>

        <!-- Dev Frontend -->
        <mxCell id="dev_fe" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4ADE80;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="230" y="795" width="250" height="120" as="geometry"/>
        </mxCell>
        <mxCell id="dev_fe_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjIiB4MT0iMTAuMTMiIHkxPSIxNS40NSIgeDI9IjEwLjEzIiB5Mj0iMTEuOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2NjYyIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmY2ZjZmMiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImJkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCIgeDE9IjE0LjE4IiB5MT0iMTEuMTUiIHgyPSIxNC4xOCIgeTI9IjcuMzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjY2MiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmNmY2ZjIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLXdlYi00MTwvdGl0bGU+PHBhdGggaWQ9ImVlNzVkZDA2LTFhY2EtNGY3Ni05ZDExLWQwNWEyODQwMjBhZCIgZD0iTTE0LjIxLDE1LjcyQTguNSw4LjUsMCwwLDEsMy43OSwyLjI4bC4wOS0uMDZhOC41LDguNSwwLDAsMSwxMC4zMywxMy41IiBmaWxsPSJ1cmwoI2UyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMikiIC8+PHBhdGggZD0iTTYuNjksNy4yM0ExMywxMywwLDAsMSwxNS42LDMuNjVhOC40Nyw4LjQ3LDAsMCwwLTEuNDktMS40NCwxNC4zNCwxNC4zNCwwLDAsMC00LjY5LDEuMUExMi41NCwxMi41NCwwLDAsMCw1LjM0LDYuMTMsMi43NiwyLjc2LDAsMCwxLDYuNjksNy4yM1oiIGZpbGw9IiNmZmYiIG9wYWNpdHk9IjAuNiIgLz48cGF0aCBkPSJNMi40OCwxMC42NWExNy44NiwxNy44NiwwLDAsMC0uODMsMi42Miw3LjgyLDcuODIsMCwwLDAsLjYyLjkyYy4xOC4yMy4zNS40NC41NS42NUExNy45NCwxNy45NCwwLDAsMSwzLjksMTEuMzcsMi43NiwyLjc2LDAsMCwxLDIuNDgsMTAuNjVaIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIC8+PHBhdGggZD0iTTMuNDYsNi4xMWExMiwxMiwwLDAsMS0uNjktMi45NCw4LjE1LDguMTUsMCwwLDAtMS4xLDEuNDVBMTIuNjksMTIuNjksMCwwLDAsMi4yNCw3LDIuNjksMi42OSwwLDAsMSwzLjQ2LDYuMTFaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjQuMzgiIGN5PSI4LjY4IiByPSIyLjczIiBmaWxsPSJ1cmwoI2JkZDIxM2RkLWQzMTMtNDczYy04ZmY0LTAxMzNmZDNhOTAzMykiIC8+PHBhdGggZD0iTTguMzYsMTMuNjdBMS43NywxLjc3LDAsMCwxLDguOSwxMi40YTExLjg4LDExLjg4LDAsMCwxLTIuNTMtMS44NiwyLjc0LDIuNzQsMCwwLDEtMS40OS44MywxMy4xLDEzLjEsMCwwLDAsMS40NSwxLjI4QTEyLjEyLDEyLjEyLDAsMCwwLDguMzgsMTMuOSwxLjc5LDEuNzksMCwwLDEsOC4zNiwxMy42N1oiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PHBhdGggZD0iTTE0LjY2LDEzLjg4YTEyLDEyLDAsMCwxLTIuNzYtLjMyLjQxLjQxLDAsMCwxLDAsLjExLDEuNzUsMS43NSwwLDAsMS0uNTEsMS4yNCwxMy42OSwxMy42OSwwLDAsMCwzLjQyLjI0QTguMjEsOC4yMSwwLDAsMCwxNiwxMy44MSwxMS41LDExLjUsMCwwLDEsMTQuNjYsMTMuODhaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjEwLjEzIiBjeT0iMTMuNjciIHI9IjEuNzgiIGZpbGw9InVybCgjYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjKSIgLz48cGF0aCBkPSJNMTIuMzIsOC45M2ExLjgzLDEuODMsMCwwLDEsLjYxLTFBMjUuNSwyNS41LDAsMCwxLDguNDcsMy43OWExNi45MSwxNi45MSwwLDAsMS0yLTIuOTIsNy42NCw3LjY0LDAsMCwwLTEuMDkuNDJBMTguMTQsMTguMTQsMCwwLDAsNy41Myw0LjQ3LDI2LjQ0LDI2LjQ0LDAsMCwwLDEyLjMyLDguOTNaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjciIC8+PGNpcmNsZSBjeD0iMTQuMTgiIGN5PSI5LjI3IiByPSIxLjg5IiBmaWxsPSJ1cmwoI2JkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCkiIC8+PHBhdGggZD0iTTE3LjM1LDEwLjU0LDE3LDEwLjM3bDAsMC0uMy0uMTYtLjA2LDBMMTYuMzgsMTBsLS4wNywwTDE2LDkuOGExLjc2LDEuNzYsMCwwLDEtLjY0LjkyYy4xMi4wOC4yNS4xNS4zOC4yMmwuMDguMDUuMzUuMTksMCwwLC44Ni40NWgwYTguNjMsOC42MywwLDAsMCwuMjktMS4xMVoiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PGNpcmNsZSBjeD0iNC4zOCIgY3k9IjguNjgiIHI9IjIuNzMiIGZpbGw9InVybCgjYmRkMjEzZGQtZDMxMy00NzNjLThmZjQtMDEzM2ZkM2E5MDMzKSIgLz48Y2lyY2xlIGN4PSIxMC4xMyIgY3k9IjEzLjY3IiByPSIxLjc4IiBmaWxsPSJ1cmwoI2FmY2M2M2M1LTM2NDktNDQ3Ni1hNzQyLWJjYjUzYTU2OWYzYykiIC8+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="245" y="805" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="dev_fe_title" value="&lt;b&gt;Frontend CA (dev)&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="274" y="808" width="180" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="dev_fe_details" value="EasyAuth (Entra SSO)&lt;br&gt;dev.sven-relijveld.com&lt;br&gt;Scale-to-zero (min 0)" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="245" y="835" width="220" height="60" as="geometry"/>
        </mxCell>

        <!-- Dev Backend -->
        <mxCell id="dev_be" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4ADE80;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="520" y="795" width="250" height="120" as="geometry"/>
        </mxCell>
        <mxCell id="dev_be_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjIiB4MT0iMTAuMTMiIHkxPSIxNS40NSIgeDI9IjEwLjEzIiB5Mj0iMTEuOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2NjYyIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmY2ZjZmMiIC8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImJkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCIgeDE9IjE0LjE4IiB5MT0iMTEuMTUiIHgyPSIxNC4xOCIgeTI9IjcuMzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNjY2MiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmNmY2ZjIiAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5JY29uLXdlYi00MTwvdGl0bGU+PHBhdGggaWQ9ImVlNzVkZDA2LTFhY2EtNGY3Ni05ZDExLWQwNWEyODQwMjBhZCIgZD0iTTE0LjIxLDE1LjcyQTguNSw4LjUsMCwwLDEsMy43OSwyLjI4bC4wOS0uMDZhOC41LDguNSwwLDAsMSwxMC4zMywxMy41IiBmaWxsPSJ1cmwoI2UyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMikiIC8+PHBhdGggZD0iTTYuNjksNy4yM0ExMywxMywwLDAsMSwxNS42LDMuNjVhOC40Nyw4LjQ3LDAsMCwwLTEuNDktMS40NCwxNC4zNCwxNC4zNCwwLDAsMC00LjY5LDEuMUExMi41NCwxMi41NCwwLDAsMCw1LjM0LDYuMTMsMi43NiwyLjc2LDAsMCwxLDYuNjksNy4yM1oiIGZpbGw9IiNmZmYiIG9wYWNpdHk9IjAuNiIgLz48cGF0aCBkPSJNMi40OCwxMC42NWExNy44NiwxNy44NiwwLDAsMC0uODMsMi42Miw3LjgyLDcuODIsMCwwLDAsLjYyLjkyYy4xOC4yMy4zNS40NC41NS42NUExNy45NCwxNy45NCwwLDAsMSwzLjksMTEuMzcsMi43NiwyLjc2LDAsMCwxLDIuNDgsMTAuNjVaIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIwLjYiIC8+PHBhdGggZD0iTTMuNDYsNi4xMWExMiwxMiwwLDAsMS0uNjktMi45NCw4LjE1LDguMTUsMCwwLDAtMS4xLDEuNDVBMTIuNjksMTIuNjksMCwwLDAsMi4yNCw3LDIuNjksMi42OSwwLDAsMSwzLjQ2LDYuMTFaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjQuMzgiIGN5PSI4LjY4IiByPSIyLjczIiBmaWxsPSJ1cmwoI2JkZDIxM2RkLWQzMTMtNDczYy04ZmY0LTAxMzNmZDNhOTAzMykiIC8+PHBhdGggZD0iTTguMzYsMTMuNjdBMS43NywxLjc3LDAsMCwxLDguOSwxMi40YTExLjg4LDExLjg4LDAsMCwxLTIuNTMtMS44NiwyLjc0LDIuNzQsMCwwLDEtMS40OS44MywxMy4xLDEzLjEsMCwwLDAsMS40NSwxLjI4QTEyLjEyLDEyLjEyLDAsMCwwLDguMzgsMTMuOSwxLjc5LDEuNzksMCwwLDEsOC4zNiwxMy42N1oiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PHBhdGggZD0iTTE0LjY2LDEzLjg4YTEyLDEyLDAsMCwxLTIuNzYtLjMyLjQxLjQxLDAsMCwxLDAsLjExLDEuNzUsMS43NSwwLDAsMS0uNTEsMS4yNCwxMy42OSwxMy42OSwwLDAsMCwzLjQyLjI0QTguMjEsOC4yMSwwLDAsMCwxNiwxMy44MSwxMS41LDExLjUsMCwwLDEsMTQuNjYsMTMuODhaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjU1IiAvPjxjaXJjbGUgY3g9IjEwLjEzIiBjeT0iMTMuNjciIHI9IjEuNzgiIGZpbGw9InVybCgjYWZjYzYzYzUtMzY0OS00NDc2LWE3NDItYmNiNTNhNTY5ZjNjKSIgLz48cGF0aCBkPSJNMTIuMzIsOC45M2ExLjgzLDEuODMsMCwwLDEsLjYxLTFBMjUuNSwyNS41LDAsMCwxLDguNDcsMy43OWExNi45MSwxNi45MSwwLDAsMS0yLTIuOTIsNy42NCw3LjY0LDAsMCwwLTEuMDkuNDJBMTguMTQsMTguMTQsMCwwLDAsNy41Myw0LjQ3LDI2LjQ0LDI2LjQ0LDAsMCwwLDEyLjMyLDguOTNaIiBmaWxsPSIjZjJmMmYyIiBvcGFjaXR5PSIwLjciIC8+PGNpcmNsZSBjeD0iMTQuMTgiIGN5PSI5LjI3IiByPSIxLjg5IiBmaWxsPSJ1cmwoI2JkODczZjBiLTk5NTQtNGFhNS1hM2RmLTlmNGM2NGU4NzI5ZCkiIC8+PHBhdGggZD0iTTE3LjM1LDEwLjU0LDE3LDEwLjM3bDAsMC0uMy0uMTYtLjA2LDBMMTYuMzgsMTBsLS4wNywwTDE2LDkuOGExLjc2LDEuNzYsMCwwLDEtLjY0LjkyYy4xMi4wOC4yNS4xNS4zOC4yMmwuMDguMDUuMzUuMTksMCwwLC44Ni40NWgwYTguNjMsOC42MywwLDAsMCwuMjktMS4xMVoiIGZpbGw9IiNmMmYyZjIiIG9wYWNpdHk9IjAuNTUiIC8+PGNpcmNsZSBjeD0iNC4zOCIgY3k9IjguNjgiIHI9IjIuNzMiIGZpbGw9InVybCgjYmRkMjEzZGQtZDMxMy00NzNjLThmZjQtMDEzM2ZkM2E5MDMzKSIgLz48Y2lyY2xlIGN4PSIxMC4xMyIgY3k9IjEzLjY3IiByPSIxLjc4IiBmaWxsPSJ1cmwoI2FmY2M2M2M1LTM2NDktNDQ3Ni1hNzQyLWJjYjUzYTU2OWYzYykiIC8+PC9zdmc+;" vertex="1" parent="1">
          <mxGeometry x="535" y="805" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="dev_be_title" value="&lt;b&gt;Backend CA (dev)&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="564" y="808" width="180" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="dev_be_details" value="FastAPI + Python 3.11&lt;br&gt;Scale-to-zero (min 0)&lt;br&gt;PR image tags: pr-N-sha" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="535" y="835" width="220" height="60" as="geometry"/>
        </mxCell>

        <!-- Dev proxy arrow -->
        <mxCell id="e_dev_proxy" value="/api/*" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#4ADE80;strokeWidth=2;fontSize=9;fontStyle=1;fontColor=#15803D;" edge="1" source="dev_fe" target="dev_be" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- Dev CMS Container App -->
        <mxCell id="dev_cms_ca" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#4ADE80;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="810" y="795" width="260" height="120" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cms_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjcwYWNmMGEtMzRiNC00YmRmLTkwMjQtNzQ5NjA0M2ZmOTE1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImUyY2Y4NzQ2LWM5YTgtNGVlZS04NmMyLTQ5NTE5ODNjNjAzMiIgY3g9IjEzNDI4LjgxIiBjeT0iMzUxOC44NiIgcj0iNTYuNjciIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIwMDUuMzMgLTUxOC44Mykgc2NhbGUoMC4xNSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiZGQyMTNkZC1kMzEzLTQ3M2MtOGZmNC0wMTMzZmQzYTkwMzMiIHgxPSI0LjQiIHkxPSIxMS40OCIgeDI9IjQuMzciIHkyPSI3LjUzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjY2NjIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48dGl0bGU+SWNvbi13ZWItNDE8L3RpdGxlPjxwYXRoIGlkPSJlZTc1ZGQwNi0xYWNhLTRmNzYtOWQxMS1kMDVhMjg0MDIwYWQiIGQ9Ik0xNC4yMSwxNS43MkE4LjUsOC41LDAsMCwxLDMuNzksMi4yOGwuMDktLjA2YTguNSw4LjUsMCwwLDEsMTAuMzMsMTMuNSIgZmlsbD0idXJsKCNlMmNmODc0Ni1jOWE4LTRlZWUtODZjMi00OTUxOTgzYzYwMzIpIiAvPjwvc3ZnPg==;" vertex="1" parent="1">
          <mxGeometry x="825" y="805" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cms_title" value="&lt;b&gt;CMS CA (dev)&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#15803D;" vertex="1" parent="1">
          <mxGeometry x="854" y="808" width="180" height="18" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cms_details" value="dna-dev-portfolio-we-ca-cms&lt;br&gt;Strapi v5 / Node 22&lt;br&gt;Scale-to-zero (min 0)&lt;br&gt;cms.dev.sven-relijveld.com" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="825" y="835" width="230" height="60" as="geometry"/>
        </mxCell>

        <!-- Dev services row -->
        <mxCell id="dev_acr" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#3B82F6;strokeWidth=1;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="210" y="970" width="190" height="80" as="geometry"/>
        </mxCell>
        <mxCell id="dev_acr_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iZTlmN2JhNzMtNTZiOC00ODY0LTk2ZmYtZGNlODBiZWY3MjlhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImJkZjI3ZGM2LTAyNWMtNDgwNS04YmZkLTNhMDVkZWZkM2ZiZCIgeDE9IjguNjM3IiB5MT0iLTEuOTkxIiB4Mj0iOC42MzciIHkyPSIxNi43MzkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJmY2Q2YzZjNy1lMmViLTRhMzItYjkxNC0zYTg0ODU1ODVhMWIiIHgxPSIxMi45NiIgeTE9IjguNTYxIiB4Mj0iMTIuOTYiIHkyPSI2LjE0MSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLCAwLCAwLCAtMSwgMCwgMjApIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMzMzMTMyIiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzViNWE1YyIgLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cGF0aCBkPSJNNy40Myw4LjE3OGwyLjU4OS0xLjU3Myw3LjI1NSwyLjczMUEzLjY2NCwzLjY2NCwwLDAsMCwxNi4yMyw3LjQ5bC0uMDEtLjA1QTQuMTk0LDQuMTk0LDAsMCwwLDE0LDYuMzJhNC45MSw0LjkxLDAsMCwwLTUuMS00LjdBNS4wNzEsNS4wNzEsMCwwLDAsNC4wNiw0LjkxLDQuNjIxLDQuNjIxLDAsMCwwLDAsOS4zOWE0LjczLDQuNzMsMCwwLDAsNC44OSw0LjU0SDcuNDNaIiBmaWxsPSJ1cmwoI2JkZjI3ZGM2LTAyNWMtNDgwNS04YmZkLTNhMDVkZWZkM2ZiZCkiIC8+PHBvbHlnb24gcG9pbnRzPSIxMC4wNyA3LjE1OSAxMC4wOCAxMS40MzkgMTcuOTkgMTMuMTE5IDE3Ljk5IDEwLjEzOSAxMC4wNyA3LjE1OSIgZmlsbD0iIzc2NzY3NiIgLz48cG9seWxpbmUgcG9pbnRzPSIxMC4wNyA3LjE1OSA3LjkzIDguNDU5IDcuOTMgMTIuNDM5IDEwLjA4IDExLjQzOSIgZmlsbD0iIzk5OSIgLz48cG9seWdvbiBwb2ludHM9IjEzLjY4IDExLjQ5OSAxNC40IDExLjY5OSAxNC40IDkuMzY5IDEzLjY4IDkuMTE5IDEzLjY4IDExLjQ5OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEyLjk2IDguODg5IDEyLjI0IDguNjI5IDEyLjI0IDExLjExOSAxMi45NiAxMS4zMTkgMTIuOTYgOC44ODkiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxNS4xMiAxMS44ODkgMTUuODIgMTIuMDc5IDE1Ljg0IDkuODU5IDE1LjEyIDkuNjE5IDE1LjEyIDExLjg4OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEwLjgxIDEwLjc0OSAxMS41MyAxMC45MjkgMTEuNTMgOC4zOTkgMTAuODEgOC4xNTkgMTAuODEgMTAuNzQ5IiBmaWxsPSIjYTNhM2EzIiAvPjxwb2x5Z29uIHBvaW50cz0iMTcuMjcgMTAuMzQ5IDE2LjU1IDEwLjA5OSAxNi41NSAxMi4yNjkgMTcuMjcgMTIuNDY5IDE3LjI3IDEwLjM0OSIgZmlsbD0iI2EzYTNhMyIgLz48cGF0aCBpZD0iZWYwZDFiNTQtYTFlNy00Y2I5LWE0ZTUtOGE4NTE4ZTdjMTI3IiBkPSJNOC42NiwxMS4zNjlsLS4zNi4yMVY4Ljc0OWwuMzYtLjE5Wm0uNzEtMy4yMkw5LDguMzg5djIuNzVsLjM3LS4yWiIgZmlsbD0iI2IzYjNiMyIgLz48cG9seWdvbiBwb2ludHM9IjE3Ljk5IDEzLjExOSAxNS44MyAxMy44NTkgNy45MyAxMi40MzkgMTAuMDggMTEuNDM5IDE3Ljk5IDEzLjExOSIgZmlsbD0idXJsKCNmY2Q2YzZjNy1lMmViLTRhMzItYjkxNC0zYTg0ODU1ODVhMWIpIiAvPjxwb2x5Z29uIHBvaW50cz0iMTcuOTkgMTYuMTY5IDEwLjA0IDE3LjY3OSAxMC4wOCAxMi4wODkgMTcuOTkgMTMuNTU5IDE3Ljk5IDE2LjE2OSIgZmlsbD0iIzc2NzY3NiIgLz48cG9seWdvbiBwb2ludHM9IjEwLjgxIDE2Ljc1OSAxMC44MSAxMy4yMDkgMTEuNTMgMTMuMjk5IDExLjUzIDE2LjYzOSAxMC44MSAxNi43NTkiIGZpbGw9IiNhM2EzYTMiIC8+PHBvbHlnb24gcG9pbnRzPSIxMi45NiAxNi4zOTkgMTIuMjQgMTYuNTI5IDEyLjI0IDEzLjM4OSAxMi45NiAxMy40OTkgMTIuOTYgMTYuMzk5IDEyLjk2IDE2LjM5OSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjEzLjY4IDE2LjI4OSAxMy42OCAxMy41NjkgMTQuNCAxMy42NTkgMTQuNCAxNi4xNTkgMTMuNjggMTYuMjg5IiBmaWxsPSIjYTNhM2EzIiAvPjxwb2x5Z29uIHBvaW50cz0iMTUuODMgMTUuOTA5IDE1LjEyIDE2LjAzOSAxNS4xMiAxMy43NDkgMTUuODMgMTMuODU5IDE1LjgzIDE1LjkwOSIgZmlsbD0iI2EzYTNhMyIgLz48cG9seWdvbiBwb2ludHM9IjE3LjI5IDE1LjY3OSAxNi41NSAxNS44MDkgMTYuNTUgMTMuOTI5IDE3LjI0IDE0LjAxOSAxNy4yOSAxNS42NzkiIGZpbGw9IiNhM2EzYTMiIC8+PHBhdGggaWQ9ImI5ZjI1ZWI0LTRjODgtNDVjMi1iYzRkLWY5OTI3NTdkN2UwZSIgZD0iTTcuOTMsMTYuNHYtMy4yNmwyLjE2LTF2NS42WiIgZmlsbD0iIzk5OSIgLz48cGF0aCBpZD0iZWI5MjAwYTctNDY5My00NDI3LWJkYWUtYjMzY2U5MGZmN2YyIiBkPSJNOC42MSwxNi4zODlsLS4zMi0uMTZ2LTIuNzZsLjMyLS4xNVptLjc3LTMuNDUtLjM4LjE5djMuNDhsLjM3LjE5di0zLjg2WiIgZmlsbD0iI2IzYjNiMyIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="225" y="980" width="22" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="dev_acr_label" value="&lt;b&gt;ACR (dev)&lt;/b&gt;&lt;br&gt;dnadevportfoliowesteuropeacr" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="252" y="978" width="140" height="35" as="geometry"/>
        </mxCell>

        <mxCell id="dev_kv" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#D97706;strokeWidth=1;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="420" y="970" width="190" height="80" as="geometry"/>
        </mxCell>
        <mxCell id="dev_kv_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYmM5MzE2OWEtMjRjNC00Njg2LTlmMzctYzdlNGY1M2IzZDM0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImZiMTE0YzkzLTdjMTYtNDU0MC04OTlhLTA3OTYwNDE2MjllNiIgY3g9IjkiIGN5PSI5IiByPSI4LjUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAuMTgiIHN0b3AtY29sb3I9IiM1ZWEwZWYiIC8+PHN0b3Agb2Zmc2V0PSIwLjU2IiBzdG9wLWNvbG9yPSIjNWM5ZmVlIiAvPjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0iIzU1OWNlZCIgLz48c3RvcCBvZmZzZXQ9IjAuNzgiIHN0b3AtY29sb3I9IiM0YTk3ZTkiIC8+PHN0b3Agb2Zmc2V0PSIwLjg2IiBzdG9wLWNvbG9yPSIjMzk5MGU0IiAvPjxzdG9wIG9mZnNldD0iMC45MyIgc3RvcC1jb2xvcj0iIzIzODdkZSIgLz48c3RvcCBvZmZzZXQ9IjAuOTkiIHN0b3AtY29sb3I9IiMwODdiZDYiIC8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDA3OGQ0IiAvPjwvcmFkaWFsR3JhZGllbnQ+PHJhZGlhbEdyYWRpZW50IGlkPSJlYzQ3OGJkMy01YjM4LTRlN2YtYjY2MS0xMWYzNTU1NzhiZmYiIGN4PSIzOC45NSIgY3k9IjE4Mi4wNyIgcj0iOS44OCIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMjguNzEgLTE2My4yNCkgc2NhbGUoMC45NCAwLjk0KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMC4yNyIgc3RvcC1jb2xvcj0iI2ZmZDcwZiIgLz48c3RvcCBvZmZzZXQ9IjAuNDkiIHN0b3AtY29sb3I9IiNmZmNiMTIiIC8+PHN0b3Agb2Zmc2V0PSIwLjg4IiBzdG9wLWNvbG9yPSIjZmVhYzE5IiAvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZlYTExYiIgLz48L3JhZGlhbEdyYWRpZW50PjwvZGVmcz48dGl0bGU+SWNvbi1zZWN1cml0eS0yNDU8L3RpdGxlPjxwYXRoIGlkPSJhYWNmODMxMS1hMzE3LTQwMGYtYjYxMy03NGJkMDBkYTVjZTMiIGQ9Ik05LC41QTguNSw4LjUsMCwxLDAsMTcuNSw5LDguNTEsOC41MSwwLDAsMCw5LC41Wk05LDE2LjM0QTcuMzQsNy4zNCwwLDEsMSwxNi4zNCw5LDcuMzQsNy4zNCwwLDAsMSw5LDE2LjM0WiIgZmlsbD0idXJsKCNmYjExNGM5My03YzE2LTQ1NDAtODk5YS0wNzk2MDQxNjI5ZTYpIiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI3LjM0IiBmaWxsPSIjZmZmIiAvPjxnPjxwYXRoIGlkPSJiZDk4M2M0MS1kYjczLTQwZWMtYTRmNC1kYTEyMTNmYzk5MjQiIGQ9Ik0xMy40NCw3LjMzYTEuODQsMS44NCwwLDAsMCwwLTIuNTloMEwxMC4yOSwxLjU4YTEuODMsMS44MywwLDAsMC0yLjU4LDBoMEw0LjU2LDQuNzRhMS44NCwxLjg0LDAsMCwwLDAsMi41OUw3LjE4LDEwYS41MS41MSwwLDAsMSwuMTUuMzZ2NC44OGEuNjMuNjMsMCwwLDAsLjE4LjQ0bDEuMiwxLjJhLjQxLjQxLDAsMCwwLC41OCwwbDEuMTYtMS4xNmgwbC42OC0uNjhhLjI1LjI1LDAsMCwwLDAtLjM0bC0uNDktLjQ5YS4yNy4yNywwLDAsMSwwLS4zN2wuNDktLjQ5YS4yNS4yNSwwLDAsMCwwLS4zNGwtLjQ5LS40OWEuMjcuMjcsMCwwLDEsMC0uMzdsLjQ5LS40OWEuMjUuMjUsMCwwLDAsMC0uMzRsLS42OC0uNjl2LS4yNVpNOSwyLjM1QTEsMSwwLDAsMSw5LDQuNDIsMSwxLDAsMSwxLDksMi4zNVoiIGZpbGw9InVybCgjZWM0NzhiZDMtNWIzOC00ZTdmLWI2NjEtMTFmMzU1NTc4YmZmKSIgLz48cGF0aCBpZD0iYWQyZTdlNDQtOWJmZC00Nzc1LThiZjQtOGVmMjZhNTQ0OTIxIiBkPSJNOC4xOCwxNS4zaDBhLjIzLjIzLDAsMCwwLC4zOC0uMTd2LTRhLjI0LjI0LDAsMCwwLS4xMS0uMmgwYS4yMi4yMiwwLDAsMC0uMzQuMnY0QS4yOC4yOCwwLDAsMCw4LjE4LDE1LjNaIiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjxyZWN0IGlkPSJhOTk2ZmJmZi0zOTM2LTRiMjQtYjQwNy0zNjkzMzZjMTQzYmEiIHg9IjYuNDgiIHk9IjUuNzkiIHdpZHRoPSI1LjE3IiBoZWlnaHQ9IjAuNjEiIHJ4PSIwLjI4IiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjxyZWN0IGlkPSJiYjEyZDMxYy0zMzUyLTRhMTgtODdkZC1hMTY5YTRhODcyMWQiIHg9IjYuNDgiIHk9IjYuNzgiIHdpZHRoPSI1LjE3IiBoZWlnaHQ9IjAuNjEiIHJ4PSIwLjI4IiBmaWxsPSIjZmY5MzAwIiBvcGFjaXR5PSIwLjc1IiAvPjwvZz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="435" y="980" width="22" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="dev_kv_label" value="&lt;b&gt;Key Vault (dev)&lt;/b&gt;&lt;br&gt;Entra client secret" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="462" y="978" width="140" height="35" as="geometry"/>
        </mxCell>

        <mxCell id="dev_log" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#16A34A;strokeWidth=1;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="630" y="970" width="190" height="80" as="geometry"/>
        </mxCell>
        <mxCell id="dev_log_icon" value="" style="sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=data:image/svg+xml,PHN2ZyBpZD0iYjM4OGU5NDQtNTUwOS00OWM5LTg0ZDctZjM4YmZmYTk5NWIyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImE5OTdlMjAzLTFkN2QtNGNiOS1iMTMxLTVkYzQ0ZTAyOWI0NiIgeDE9IjUuMjMiIHkxPSIxNy40NSIgeDI9IjUuMjMiIHkyPSI4LjA5IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMTk4OGQ5IiAvPjxzdG9wIG9mZnNldD0iMC45IiBzdG9wLWNvbG9yPSIjNTRhZWYwIiAvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJlMTIyZTlkOC1hZWU1LTRmMWEtYTYwZS1iMWVhZTM1NWRhYTUiIHgxPSIxMS41IiB5MT0iMTIuNDUiIHgyPSIxMS41IiB5Mj0iMC41NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzE5OGFiMyIgLz48c3RvcCBvZmZzZXQ9IjAuMDEiIHN0b3AtY29sb3I9IiMxOThiYjQiIC8+PHN0b3Agb2Zmc2V0PSIwLjQ0IiBzdG9wLWNvbG9yPSIjMjdiMmQ3IiAvPjxzdG9wIG9mZnNldD0iMC43OSIgc3RvcC1jb2xvcj0iIzJmY2JlZCIgLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMmQ0ZjUiIC8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPkljb24tbWFuYWdlLTMwNzwvdGl0bGU+PHBhdGggZD0iTTUuNTksMTMuMTNIOS45MXY0LjMySDUuNTlaTTEuMTUsMTcuNDVINC44N1YxMy4xM0guNTV2My43MkEuNi42LDAsMCwwLDEuMTUsMTcuNDVabS0uNi01SDQuODdWOC4wOUguNTVaIiBmaWxsPSJ1cmwoI2E5OTdlMjAzLTFkN2QtNGNiOS1iMTMxLTVkYzQ0ZTAyOWI0NikiIC8+PHBhdGggZD0iTTExLjUuNTVhNS44OSw1Ljg5LDAsMCwxLDUuOTUsNiw1Ljg5LDUuODksMCwwLDEtNS45NSw1Ljk1SDUuNTVWNi41QTUuODksNS44OSwwLDAsMSwxMS41LjU1WiIgZmlsbC1ydWxlPSJldmVub2RkIiBmaWxsPSJ1cmwoI2UxMjJlOWQ4LWFlZTUtNGYxYS1hNjBlLWIxZWFlMzU1ZGFhNSkiIC8+PHJlY3QgeD0iNy41OSIgeT0iNS42NSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iNC4wOCIgZmlsbD0iI2ZmZiIgLz48cmVjdCB4PSIxMC4zMSIgeT0iNy4wMSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iMi43MiIgZmlsbD0iI2ZmZiIgLz48cmVjdCB4PSIxMy4wMyIgeT0iNC4yOSIgd2lkdGg9IjEuMzYiIGhlaWdodD0iNS40NCIgZmlsbD0iI2ZmZiIgLz48L3N2Zz4=;" vertex="1" parent="1">
          <mxGeometry x="645" y="980" width="22" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="dev_log_label" value="&lt;b&gt;Log Analytics (dev)&lt;/b&gt;&lt;br&gt;+ App Insights" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="672" y="978" width="140" height="35" as="geometry"/>
        </mxCell>

        <!-- Azure Files — CMS Uploads (Dev) -->
        <mxCell id="dev_cms_storage_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#3B82F6;strokeWidth=1;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="840" y="970" width="210" height="80" as="geometry"/>
        </mxCell>
        <mxCell id="dev_cms_storage_label" value="&lt;b&gt;Azure Files (dev)&lt;/b&gt;&lt;br&gt;dnadevportfoliowesteuropesacms&lt;br&gt;CMS uploads volume" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="855" y="975" width="185" height="55" as="geometry"/>
        </mxCell>

        <!-- Dev CMS CA → Azure Files volume -->
        <mxCell id="e_dev_cms_storage" value="volume mount" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#3B82F6;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#1D4ED8;" edge="1" source="dev_cms_ca" target="dev_cms_storage_box" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- EXTERNAL SERVICES    -->
        <!-- ==================== -->
        <mxCell id="ext_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FEF2F2;strokeColor=#EF4444;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="1290" y="610" width="440" height="200" as="geometry"/>
        </mxCell>
        <mxCell id="ext_label" value="&lt;b&gt;External Services&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#DC2626;" vertex="1" parent="1">
          <mxGeometry x="1305" y="618" width="200" height="24" as="geometry"/>
        </mxCell>

        <mxCell id="gmail_box" value="&lt;b&gt;Gmail SMTP&lt;/b&gt;&lt;br&gt;smtp.gmail.com:587&lt;br&gt;TLS / App Password&lt;br&gt;&lt;br&gt;Contact form notifications&lt;br&gt;and confirmations" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FEE2E2;strokeColor=#EF4444;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="655" width="190" height="120" as="geometry"/>
        </mxCell>

        <mxCell id="ghpages_box" value="&lt;b&gt;GitHub Pages&lt;/b&gt;&lt;br&gt;svenrelijveld1995.github.io&lt;br&gt;/portfolio/&lt;br&gt;&lt;br&gt;Backup docs hosting" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FEE2E2;strokeColor=#EF4444;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1520" y="655" width="190" height="120" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- GITHUB ACTIONS       -->
        <!-- ==================== -->
        <mxCell id="gh_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#F9FAFB;strokeColor=#374151;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="1290" y="850" width="440" height="350" as="geometry"/>
        </mxCell>
        <mxCell id="gh_icon" value="" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3E;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.general_saml_token;" vertex="1" parent="1">
          <mxGeometry x="1305" y="858" width="24" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="gh_label" value="&lt;b&gt;GitHub Actions&lt;/b&gt; — CI/CD" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#111827;" vertex="1" parent="1">
          <mxGeometry x="1334" y="858" width="200" height="24" as="geometry"/>
        </mxCell>

        <mxCell id="gh_wf1" value="deploy-infrastructure.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="895" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf2" value="deploy-application.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="930" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf3" value="deploy-docs.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="965" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf4" value="deploy-pr-preview.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="1000" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf5" value="smoke-test-prod.yml (3x/day)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1530" y="895" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf6" value="validate-infrastructure.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1530" y="930" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf7" value="test.yml (parallel: api/unit/typecheck)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1530" y="965" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf8" value="cost-report.yml (weekly)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="1000" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_wf9" value="generate-cv.yml" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E5E7EB;strokeColor=#9CA3AF;fontSize=9;align=center;" vertex="1" parent="1">
          <mxGeometry x="1530" y="1000" width="180" height="28" as="geometry"/>
        </mxCell>
        <mxCell id="gh_oidc_note" value="OIDC Auth — passwordless deploys (no stored secrets)" style="text;html=1;strokeColor=#D97706;fillColor=#FEF3C7;rounded=1;arcSize=10;fontSize=9;fontStyle=2;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="1110" width="400" height="25" as="geometry"/>
        </mxCell>
        <mxCell id="gh_bicep_note" value="Bicep IaC — subscription-level deployments with module nesting" style="text;html=1;strokeColor=#3B82F6;fillColor=#DBEAFE;rounded=1;arcSize=10;fontSize=9;fontStyle=2;align=center;" vertex="1" parent="1">
          <mxGeometry x="1310" y="1140" width="400" height="25" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- KEY CONNECTORS       -->
        <!-- ==================== -->

        <!-- Users → Frontend -->
        <mxCell id="e_user_fe" value="HTTPS" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#0078D4;strokeWidth=2;fontSize=10;fontStyle=1;fontColor=#0078D4;" edge="1" source="user_icon" target="fe_ca" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="65" y="325"/>
              <mxPoint x="160" y="325"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- Users → SWA -->
        <mxCell id="e_user_swa" value="HTTPS" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#7C3AED;strokeWidth=2;fontSize=10;fontStyle=1;fontColor=#7C3AED;" edge="1" source="user_icon" target="swa_prod" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="65" y="465"/>
              <mxPoint x="1405" y="465"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- Backend → Gmail -->
        <mxCell id="e_be_gmail" value="SMTP:587" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#EF4444;strokeWidth=1.5;fontSize=9;fontStyle=1;fontColor=#DC2626;" edge="1" source="be_ca" target="gmail_box" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1060" y="325"/>
              <mxPoint x="1060" y="715"/>
              <mxPoint x="1310" y="715"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- Backend → KV -->
        <mxCell id="e_be_kv" value="secrets" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#D97706;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#92400E;" edge="1" source="be_ca" target="kv_box" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- POSTGRESQL           -->
        <!-- ==================== -->
        <mxCell id="psql_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeColor=#1D4ED8;strokeWidth=1.5;arcSize=8;" vertex="1" parent="1">
          <mxGeometry x="850" y="165" width="380" height="155" as="geometry"/>
        </mxCell>
        <mxCell id="psql_title" value="&lt;b&gt;PostgreSQL Flexible Server (Prod)&lt;/b&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=10;fontColor=#1D4ED8;" vertex="1" parent="1">
          <mxGeometry x="865" y="168" width="350" height="22" as="geometry"/>
        </mxCell>
        <mxCell id="psql_details" value="dna-prod-portfolio-we-psql&lt;br&gt;PostgreSQL 16 Flexible Server&lt;br&gt;AAD-only auth (no password)&lt;br&gt;Managed Identity connection&lt;br&gt;&lt;br&gt;DB: portfolio (3 tables)&lt;br&gt;DATABASE_URL from Key Vault" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="865" y="192" width="350" height="115" as="geometry"/>
        </mxCell>

        <!-- ==================== -->
        <!-- COST MANAGEMENT      -->
        <!-- ==================== -->
        <mxCell id="cost_mgmt_box" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ECFDF5;strokeColor=#059669;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="1290" y="825" width="440" height="0" as="geometry"/>
        </mxCell>
        <mxCell id="cost_mgmt_bg" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ECFDF5;strokeColor=#059669;strokeWidth=1.5;arcSize=5;" vertex="1" parent="1">
          <mxGeometry x="160" y="1200" width="560" height="100" as="geometry"/>
        </mxCell>
        <mxCell id="cost_mgmt_label" value="&lt;b&gt;Azure Cost Management&lt;/b&gt; [Subscription scope]" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=11;fontColor=#065F46;" vertex="1" parent="1">
          <mxGeometry x="175" y="1208" width="400" height="24" as="geometry"/>
        </mxCell>
        <mxCell id="cost_mgmt_details" value="Queried weekly by cost-report.yml workflow&lt;br&gt;via Cost Management Reader role (Bicep-assigned)&lt;br&gt;→ renders docs/infrastructure/cost-dashboard.md" style="text;html=1;strokeColor=none;fillColor=none;align=left;fontSize=9;fontColor=#374151;" vertex="1" parent="1">
          <mxGeometry x="175" y="1232" width="530" height="55" as="geometry"/>
        </mxCell>

        <!-- Version note -->
        <mxCell id="version_note" value="v0.19.0-alpha: Added CMS Container App (Strapi v5) + Azure Files volumes for prod and dev." style="text;html=1;strokeColor=#D97706;fillColor=#FEF3C7;rounded=1;arcSize=10;fontSize=9;fontStyle=2;align=center;" vertex="1" parent="1">
          <mxGeometry x="175" y="1300" width="560" height="25" as="geometry"/>
        </mxCell>

        <!-- Backend → PostgreSQL -->
        <mxCell id="e_be_psql" value="MI / asyncpg" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#1D4ED8;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#1D4ED8;" edge="1" source="be_ca" target="psql_box" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="675" y="340"/>
              <mxPoint x="675" y="245"/>
              <mxPoint x="850" y="245"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- GitHub → Cost Management -->
        <mxCell id="e_gh_cost" value="queries weekly" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#059669;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#065F46;" edge="1" source="gh_bg" target="cost_mgmt_bg" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1290" y="1200"/>
              <mxPoint x="1150" y="1200"/>
              <mxPoint x="720" y="1200"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- ACR → FE -->
        <mxCell id="e_acr_fe" value="pull" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#3B82F6;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#1D4ED8;" edge="1" source="acr_box" target="fe_ca" parent="1">
          <mxGeometry relative="1" as="geometry"/>
        </mxCell>

        <!-- GH → Entra (OIDC) -->
        <mxCell id="e_gh_entra" value="OIDC" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#16A34A;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#15803D;" edge="1" source="gh_bg" target="entra_oidc" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1770" y="995"/>
              <mxPoint x="1770" y="215"/>
              <mxPoint x="1500" y="215"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- GH → ACR (push) -->
        <mxCell id="e_gh_acr" value="docker push" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#3B82F6;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#1D4ED8;" edge="1" source="gh_bg" target="acr_box" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1280" y="995"/>
              <mxPoint x="1280" y="560"/>
              <mxPoint x="400" y="560"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- GH → SWA (deploy) -->
        <mxCell id="e_gh_swa" value="swa deploy" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#7C3AED;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#5B21B6;" edge="1" source="gh_bg" target="swa_bg" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1510" y="850"/>
              <mxPoint x="1510" y="570"/>
            </Array>
          </mxGeometry>
        </mxCell>

        <!-- Dev EasyAuth → Entra SSO -->
        <mxCell id="e_dev_entra" value="OAuth2" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#16A34A;strokeWidth=1.5;dashed=1;fontSize=9;fontStyle=1;fontColor=#15803D;" edge="1" source="dev_fe" target="entra_sso" parent="1">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="355" y="950"/>
              <mxPoint x="1100" y="950"/>
              <mxPoint x="1100" y="215"/>
              <mxPoint x="1520" y="215"/>
            </Array>
          </mxGeometry>
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
