<mxfile host="app.diagrams.net" modified="2026-04-22T10:50:00.000Z" agent="Codex" version="25.0.2">
  <diagram id="payroll-bpjs-thr-engine" name="Payroll-BPJS-THR Engine">
    <mxGraphModel dx="1788" dy="980" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2400" pageHeight="1800" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <mxCell id="title" value="Payroll + BPJS + THR Engine" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=24;fontStyle=1;fontColor=#0f172a;" vertex="1" parent="1">
          <mxGeometry x="40" y="20" width="560" height="30" as="geometry" />
        </mxCell>
        <mxCell id="sub" value="Operational flow for payroll cycle, BPJS calculation, payment history, and THR lifecycle." style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=12;fontColor=#475569;" vertex="1" parent="1">
          <mxGeometry x="40" y="52" width="1100" height="20" as="geometry" />
        </mxCell>

        <mxCell id="lane1" value="A. Payroll Input Sources" style="swimlane;html=1;rounded=1;fillColor=#f8fafc;strokeColor=#cbd5e1;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="100" width="2280" height="210" as="geometry" />
        </mxCell>
        <mxCell id="lane2" value="B. Regular Payroll Engine" style="swimlane;html=1;rounded=1;fillColor=#eff6ff;strokeColor=#bfdbfe;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="330" width="2280" height="350" as="geometry" />
        </mxCell>
        <mxCell id="lane3" value="C. BPJS Calculation Layer" style="swimlane;html=1;rounded=1;fillColor=#f0fdf4;strokeColor=#bbf7d0;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="700" width="2280" height="250" as="geometry" />
        </mxCell>
        <mxCell id="lane4" value="D. THR Engine" style="swimlane;html=1;rounded=1;fillColor=#fffbeb;strokeColor=#fde68a;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="970" width="2280" height="300" as="geometry" />
        </mxCell>
        <mxCell id="lane5" value="E. Output &amp; Reporting" style="swimlane;html=1;rounded=1;fillColor=#faf5ff;strokeColor=#d8b4fe;fontSize=16;fontStyle=1;startSize=32;" vertex="1" parent="1">
          <mxGeometry x="40" y="1290" width="2280" height="230" as="geometry" />
        </mxCell>

        <mxCell id="n1" value="master_profil_bulan_karyawans&#xa;assignment + salary cycle" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="90" y="160" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n2" value="master_profil_gaji&#xa;+ detail components" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="360" y="160" width="190" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n3" value="component overrides&#xa;per assignment" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="590" y="160" width="180" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n4" value="attendance_daily_reviews&#xa;approved hours, billed hours, hk, alpha, late, overtime" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="810" y="150" width="260" height="84" as="geometry" />
        </mxCell>
        <mxCell id="n5" value="approved SPL&#xa;normal + special overtime bonus" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1110" y="160" width="220" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n6" value="reimbursement approved&#xa;+ insentif dinas" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1370" y="160" width="190" height="64" as="geometry" />
        </mxCell>
        <mxCell id="n7" value="karyawan master&#xa;NPWP + bank account + hire date" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#64748b;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1600" y="160" width="220" height="64" as="geometry" />
        </mxCell>

        <mxCell id="n8" value="Pick assignment(s) + pay date" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dbeafe;strokeColor=#2563eb;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="110" y="410" width="200" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n9" value="resolveBillingPeriodByAssignment()&#xa;daily / weekly / biweekly / triweekly / monthly" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="370" y="400" width="290" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n10" value="attendanceSummary()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="720" y="410" width="170" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n11" value="resolveBaseSalaryMonthly()&#xa;+ resolve employee earnings components" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="940" y="400" width="280" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n12" value="calculatePayrollBreakdown()&#xa;gross, absence deduction, late deduction, overtime, special bonus, reimburse, pph21, bpjs, net" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bfdbfe;strokeColor=#1d4ed8;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1280" y="390" width="330" height="94" as="geometry" />
        </mxCell>
        <mxCell id="n13" value="markPaid() / markPaidBulk()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1660" y="410" width="190" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n14" value="Create payroll_payment_histories" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bfdbfe;strokeColor=#1d4ed8;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1900" y="410" width="220" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n15" value="Mark insentif dinas paid salary" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#2563eb;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1900" y="500" width="220" height="54" as="geometry" />
        </mxCell>

        <mxCell id="n16" value="BpjsCalculator::calculateForEmployee()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#15803d;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="230" y="780" width="250" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n17" value="master_karyawan_bpjs_profiles&#xa;+ profile_components" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="560" y="770" width="220" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n18" value="master_bpjs&#xa;+ rate histories + ceiling histories" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="840" y="770" width="240" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n19" value="Result: company_total + employee_total + detail rows&#xa;deduct_to_payroll = true hanya bagian employee tertentu" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#15803d;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1140" y="770" width="330" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n20" value="syncPaymentBpjsDetails()&#xa;insert payroll_payment_bpjs_details" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#16a34a;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1540" y="780" width="250" height="54" as="geometry" />
        </mxCell>

        <mxCell id="n21" value="THR generate(year, profil_bulan_id)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fef3c7;strokeColor=#d97706;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="120" y="1060" width="220" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n22" value="Read active assignments in profil bulan" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="390" y="1060" width="220" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n23" value="resolveBaseSalaryMonthly()&#xa;+ thr_prorate_factor / months" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="660" y="1050" width="240" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n24" value="Create thr_requests + thr_request_details&#xa;status draft" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fde68a;strokeColor=#d97706;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="960" y="1050" width="260" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n25" value="submit()" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1280" y="1060" width="120" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n26" value="approve()&#xa;approved_nominal per detail&#xa;header totals recomputed" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fde68a;strokeColor=#d97706;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1450" y="1050" width="220" height="74" as="geometry" />
        </mxCell>
        <mxCell id="n27" value="payDetail()&#xa;partial / full payment" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#d97706;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1730" y="1060" width="180" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n28" value="Create thr_payment_histories&#xa;update detail paid / outstanding&#xa;update header status paid/partial_paid" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fde68a;strokeColor=#d97706;fontSize=13;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1970" y="1040" width="290" height="94" as="geometry" />
        </mxCell>

        <mxCell id="n29" value="Payroll detail" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="200" y="1380" width="150" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n30" value="Slip print / slip excel" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="420" y="1380" width="180" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n31" value="Export excel / pdf" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="660" y="1380" width="170" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n32" value="Tax proof" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="900" y="1380" width="130" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n33" value="Report bulanan" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1090" y="1380" width="150" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n34" value="THR details + report year" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#7c3aed;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="1310" y="1380" width="190" height="54" as="geometry" />
        </mxCell>
        <mxCell id="n35" value="Note: payroll reguler dan THR memakai history masing-masing. THR tidak masuk payroll_payment_histories, tapi punya header/detail/payment sendiri." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8fafc;strokeColor=#94a3b8;fontSize=12;fontColor=#334155;" vertex="1" parent="1">
          <mxGeometry x="1600" y="1370" width="650" height="70" as="geometry" />
        </mxCell>

        <mxCell id="e1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n1" target="n8"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n8" target="n9"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n4" target="n10"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n2" target="n11"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n3" target="n11"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n9" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n10" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n11" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n5" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n6" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n7" target="n12"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n12" target="n13"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n13" target="n14"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#2563eb;" edge="1" parent="1" source="n14" target="n15"><mxGeometry relative="1" as="geometry" /></mxCell>

        <mxCell id="e15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n12" target="n16"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n17" target="n16"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n18" target="n16"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n16" target="n19"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n19" target="n20"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#16a34a;" edge="1" parent="1" source="n20" target="n14"><mxGeometry relative="1" as="geometry" /></mxCell>

        <mxCell id="e21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n21" target="n22"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n22" target="n23"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n23" target="n24"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n24" target="n25"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n25" target="n26"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n26" target="n27"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#d97706;" edge="1" parent="1" source="n27" target="n28"><mxGeometry relative="1" as="geometry" /></mxCell>

        <mxCell id="e28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n14" target="n29"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n14" target="n30"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n14" target="n31"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n14" target="n32"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n14" target="n33"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=#7c3aed;" edge="1" parent="1" source="n28" target="n34"><mxGeometry relative="1" as="geometry" /></mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
