@ours.network/messenger-server 1.0.28 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -8
- package/dist/chunks/{chunk-2JJTF5OK.js → chunk-3EUXH4PV.js} +1 -1
- package/dist/chunks/{server-423DCFTU.js → server-WOE26ICL.js} +1 -1
- package/dist/cli.js +2 -2
- package/dist/web/assets/{abnfDiagram-N423BO3Z-CmqtXm9e.js → abnfDiagram-N423BO3Z-C-iag_Nj.js} +2 -2
- package/dist/web/assets/{abnfDiagram-N423BO3Z-CmqtXm9e.js.map → abnfDiagram-N423BO3Z-C-iag_Nj.js.map} +1 -1
- package/dist/web/assets/{arc-ByTkPL8X.js → arc-Bcm2sZNj.js} +2 -2
- package/dist/web/assets/{arc-ByTkPL8X.js.map → arc-Bcm2sZNj.js.map} +1 -1
- package/dist/web/assets/{architectureDiagram-T3A2C74G-Deystmq0.js → architectureDiagram-T3A2C74G-Cf8AnIVp.js} +2 -2
- package/dist/web/assets/{architectureDiagram-T3A2C74G-Deystmq0.js.map → architectureDiagram-T3A2C74G-Cf8AnIVp.js.map} +1 -1
- package/dist/web/assets/{blockDiagram-VBNYF7ZC-H1NKSUCA.js → blockDiagram-VBNYF7ZC-Ch9RzKmh.js} +2 -2
- package/dist/web/assets/{blockDiagram-VBNYF7ZC-H1NKSUCA.js.map → blockDiagram-VBNYF7ZC-Ch9RzKmh.js.map} +1 -1
- package/dist/web/assets/{browser-Cya_kJEb.js → browser-mCqw9EMW.js} +2 -2
- package/dist/web/assets/{browser-Cya_kJEb.js.map → browser-mCqw9EMW.js.map} +1 -1
- package/dist/web/assets/{c4Diagram-5PPSVZJV-Bo53j4MW.js → c4Diagram-5PPSVZJV-vFBfClLI.js} +2 -2
- package/dist/web/assets/{c4Diagram-5PPSVZJV-Bo53j4MW.js.map → c4Diagram-5PPSVZJV-vFBfClLI.js.map} +1 -1
- package/dist/web/assets/channel-B7e1tuOt.js +2 -0
- package/dist/web/assets/{channel-DxwvuvRo.js.map → channel-B7e1tuOt.js.map} +1 -1
- package/dist/web/assets/{chunk-2GRJ4B5K-RanroX_6.js → chunk-2GRJ4B5K-CovDVQb1.js} +2 -2
- package/dist/web/assets/{chunk-2GRJ4B5K-RanroX_6.js.map → chunk-2GRJ4B5K-CovDVQb1.js.map} +1 -1
- package/dist/web/assets/{chunk-2Q5K7J3B-Ezr8zlMo.js → chunk-2Q5K7J3B-DMq4JEsX.js} +2 -2
- package/dist/web/assets/{chunk-2Q5K7J3B-Ezr8zlMo.js.map → chunk-2Q5K7J3B-DMq4JEsX.js.map} +1 -1
- package/dist/web/assets/{chunk-5RXB4S5H-DlPCHTE4.js → chunk-5RXB4S5H-CrraHros.js} +2 -2
- package/dist/web/assets/{chunk-5RXB4S5H-DlPCHTE4.js.map → chunk-5RXB4S5H-CrraHros.js.map} +1 -1
- package/dist/web/assets/{chunk-5VM5RSS4-DZLOUoM5.js → chunk-5VM5RSS4-Dtkchtl6.js} +2 -2
- package/dist/web/assets/{chunk-5VM5RSS4-DZLOUoM5.js.map → chunk-5VM5RSS4-Dtkchtl6.js.map} +1 -1
- package/dist/web/assets/{chunk-6Q2QTUOP-CBTgQ4oE.js → chunk-6Q2QTUOP-C7hewS6C.js} +2 -2
- package/dist/web/assets/{chunk-6Q2QTUOP-CBTgQ4oE.js.map → chunk-6Q2QTUOP-C7hewS6C.js.map} +1 -1
- package/dist/web/assets/{chunk-GF5L2VYU-DRgJDmMS.js → chunk-GF5L2VYU-lRYUPE4E.js} +2 -2
- package/dist/web/assets/{chunk-GF5L2VYU-DRgJDmMS.js.map → chunk-GF5L2VYU-lRYUPE4E.js.map} +1 -1
- package/dist/web/assets/{chunk-JWPE2WC7-CUm26Y4N.js → chunk-JWPE2WC7-DmDsLF1N.js} +2 -2
- package/dist/web/assets/{chunk-JWPE2WC7-CUm26Y4N.js.map → chunk-JWPE2WC7-DmDsLF1N.js.map} +1 -1
- package/dist/web/assets/{chunk-KBJHAD2P-Db_Ma2dA.js → chunk-KBJHAD2P-C4tA-lat.js} +2 -2
- package/dist/web/assets/{chunk-KBJHAD2P-Db_Ma2dA.js.map → chunk-KBJHAD2P-C4tA-lat.js.map} +1 -1
- package/dist/web/assets/{chunk-RYQCIY6F-CxvcRvu9.js → chunk-RYQCIY6F-CWf-qdbG.js} +2 -2
- package/dist/web/assets/{chunk-RYQCIY6F-CxvcRvu9.js.map → chunk-RYQCIY6F-CWf-qdbG.js.map} +1 -1
- package/dist/web/assets/{chunk-XXDRQBXY-914wTtt6.js → chunk-XXDRQBXY-C0-3Uouc.js} +2 -2
- package/dist/web/assets/{chunk-XXDRQBXY-914wTtt6.js.map → chunk-XXDRQBXY-C0-3Uouc.js.map} +1 -1
- package/dist/web/assets/classDiagram-JCYQIIEL-D0TeT53t.js +2 -0
- package/dist/web/assets/{classDiagram-JCYQIIEL-1vxBWvib.js.map → classDiagram-JCYQIIEL-D0TeT53t.js.map} +1 -1
- package/dist/web/assets/classDiagram-v2-OCEON4UE-D0TeT53t.js +2 -0
- package/dist/web/assets/{classDiagram-v2-OCEON4UE-1vxBWvib.js.map → classDiagram-v2-OCEON4UE-D0TeT53t.js.map} +1 -1
- package/dist/web/assets/{cose-bilkent-JH36ORCC-t8VumxtG.js → cose-bilkent-JH36ORCC-C8vPfGok.js} +2 -2
- package/dist/web/assets/{cose-bilkent-JH36ORCC-t8VumxtG.js.map → cose-bilkent-JH36ORCC-C8vPfGok.js.map} +1 -1
- package/dist/web/assets/{cynefin-VYW2F7L2-CZDH3BfG.js → cynefin-VYW2F7L2-Qz363tl0.js} +2 -2
- package/dist/web/assets/{cynefin-VYW2F7L2-CZDH3BfG.js.map → cynefin-VYW2F7L2-Qz363tl0.js.map} +1 -1
- package/dist/web/assets/{cynefinDiagram-MW4NZA55-CesdgGzK.js → cynefinDiagram-MW4NZA55-CCZz9fIq.js} +2 -2
- package/dist/web/assets/{cynefinDiagram-MW4NZA55-CesdgGzK.js.map → cynefinDiagram-MW4NZA55-CCZz9fIq.js.map} +1 -1
- package/dist/web/assets/{dagre-VZM6K2ZE-DCNmE9mb.js → dagre-VZM6K2ZE-TEwK45KH.js} +2 -2
- package/dist/web/assets/{dagre-VZM6K2ZE-DCNmE9mb.js.map → dagre-VZM6K2ZE-TEwK45KH.js.map} +1 -1
- package/dist/web/assets/{diagram-7IWD3JNH-BOx306BC.js → diagram-7IWD3JNH-CpCoKfEC.js} +2 -2
- package/dist/web/assets/{diagram-7IWD3JNH-BOx306BC.js.map → diagram-7IWD3JNH-CpCoKfEC.js.map} +1 -1
- package/dist/web/assets/{diagram-B4RE2ZJO-CV9ZFWWL.js → diagram-B4RE2ZJO-CJS8Rz4d.js} +2 -2
- package/dist/web/assets/{diagram-B4RE2ZJO-CV9ZFWWL.js.map → diagram-B4RE2ZJO-CJS8Rz4d.js.map} +1 -1
- package/dist/web/assets/{diagram-LBJQPF4R-bjbi1Pep.js → diagram-LBJQPF4R-Dp-7zIWd.js} +2 -2
- package/dist/web/assets/{diagram-LBJQPF4R-bjbi1Pep.js.map → diagram-LBJQPF4R-Dp-7zIWd.js.map} +1 -1
- package/dist/web/assets/{diagram-Q27KOJAE-CbRDe3Sg.js → diagram-Q27KOJAE-BeOOSo_Y.js} +2 -2
- package/dist/web/assets/{diagram-Q27KOJAE-CbRDe3Sg.js.map → diagram-Q27KOJAE-BeOOSo_Y.js.map} +1 -1
- package/dist/web/assets/{diagram-UB23O5K3-BUSN8Wb8.js → diagram-UB23O5K3-wtVvpUaS.js} +2 -2
- package/dist/web/assets/{diagram-UB23O5K3-BUSN8Wb8.js.map → diagram-UB23O5K3-wtVvpUaS.js.map} +1 -1
- package/dist/web/assets/{ebnfDiagram-BXEA7PRR-Bjagp_OX.js → ebnfDiagram-BXEA7PRR-BUZU6kcO.js} +2 -2
- package/dist/web/assets/{ebnfDiagram-BXEA7PRR-Bjagp_OX.js.map → ebnfDiagram-BXEA7PRR-BUZU6kcO.js.map} +1 -1
- package/dist/web/assets/{erDiagram-JOGREHBK-Bnj6Bfea.js → erDiagram-JOGREHBK-BeLhinfN.js} +2 -2
- package/dist/web/assets/{erDiagram-JOGREHBK-Bnj6Bfea.js.map → erDiagram-JOGREHBK-BeLhinfN.js.map} +1 -1
- package/dist/web/assets/{flowDiagram-UKHOOZJN-BH0DcCTE.js → flowDiagram-UKHOOZJN-BWAl9KvX.js} +2 -2
- package/dist/web/assets/{flowDiagram-UKHOOZJN-BH0DcCTE.js.map → flowDiagram-UKHOOZJN-BWAl9KvX.js.map} +1 -1
- package/dist/web/assets/{ganttDiagram-PKOTCBZU-Ca_J4VWY.js → ganttDiagram-PKOTCBZU-BQM681Qz.js} +2 -2
- package/dist/web/assets/{ganttDiagram-PKOTCBZU-Ca_J4VWY.js.map → ganttDiagram-PKOTCBZU-BQM681Qz.js.map} +1 -1
- package/dist/web/assets/{gitGraphDiagram-DS77QQ5N-N0g6rh8s.js → gitGraphDiagram-DS77QQ5N-B90O3LS2.js} +2 -2
- package/dist/web/assets/{gitGraphDiagram-DS77QQ5N-N0g6rh8s.js.map → gitGraphDiagram-DS77QQ5N-B90O3LS2.js.map} +1 -1
- package/dist/web/assets/index-C65oKF4f.js +332 -0
- package/dist/web/assets/index-C65oKF4f.js.map +1 -0
- package/dist/web/assets/{index-BeN854Pj.css → index-SAASLXJR.css} +1 -1
- package/dist/web/assets/{infoDiagram-6WML65LV-z0g90Wql.js → infoDiagram-6WML65LV-DL7wlrUp.js} +2 -2
- package/dist/web/assets/{infoDiagram-6WML65LV-z0g90Wql.js.map → infoDiagram-6WML65LV-DL7wlrUp.js.map} +1 -1
- package/dist/web/assets/{ishikawaDiagram-WSZJBQD7-BSf65bRg.js → ishikawaDiagram-WSZJBQD7-CGJ65gLl.js} +2 -2
- package/dist/web/assets/{ishikawaDiagram-WSZJBQD7-BSf65bRg.js.map → ishikawaDiagram-WSZJBQD7-CGJ65gLl.js.map} +1 -1
- package/dist/web/assets/{journeyDiagram-NVQOT4AX-C4bPrPEZ.js → journeyDiagram-NVQOT4AX-CWln_1Vi.js} +2 -2
- package/dist/web/assets/{journeyDiagram-NVQOT4AX-C4bPrPEZ.js.map → journeyDiagram-NVQOT4AX-CWln_1Vi.js.map} +1 -1
- package/dist/web/assets/{jsQR-udnxLlXb.js → jsQR-C-e-dPgH.js} +2 -2
- package/dist/web/assets/{jsQR-udnxLlXb.js.map → jsQR-C-e-dPgH.js.map} +1 -1
- package/dist/web/assets/{kanban-definition-27J2QSJJ-DwIk-_Kb.js → kanban-definition-27J2QSJJ-Ch_LASS_.js} +2 -2
- package/dist/web/assets/{kanban-definition-27J2QSJJ-DwIk-_Kb.js.map → kanban-definition-27J2QSJJ-Ch_LASS_.js.map} +1 -1
- package/dist/web/assets/{linear-jf0h1LD6.js → linear-DLAFoEik.js} +2 -2
- package/dist/web/assets/{linear-jf0h1LD6.js.map → linear-DLAFoEik.js.map} +1 -1
- package/dist/web/assets/{mermaid.core-I6IW-yFT.js → mermaid.core-11YjnhKz.js} +5 -5
- package/dist/web/assets/{mermaid.core-I6IW-yFT.js.map → mermaid.core-11YjnhKz.js.map} +1 -1
- package/dist/web/assets/{mindmap-definition-FAOFIHXS-DIOz61sO.js → mindmap-definition-FAOFIHXS-j-6HQbPv.js} +2 -2
- package/dist/web/assets/{mindmap-definition-FAOFIHXS-DIOz61sO.js.map → mindmap-definition-FAOFIHXS-j-6HQbPv.js.map} +1 -1
- package/dist/web/assets/{pegDiagram-VL7TDLO6-Dhund2ye.js → pegDiagram-VL7TDLO6-1XHHRMUK.js} +2 -2
- package/dist/web/assets/{pegDiagram-VL7TDLO6-Dhund2ye.js.map → pegDiagram-VL7TDLO6-1XHHRMUK.js.map} +1 -1
- package/dist/web/assets/{pieDiagram-7S7Q4E2Y-BXwlCLfp.js → pieDiagram-7S7Q4E2Y-Cu-3GzNo.js} +2 -2
- package/dist/web/assets/{pieDiagram-7S7Q4E2Y-BXwlCLfp.js.map → pieDiagram-7S7Q4E2Y-Cu-3GzNo.js.map} +1 -1
- package/dist/web/assets/{quadrantDiagram-CIZ2JOQS-CWIG722H.js → quadrantDiagram-CIZ2JOQS-DkP9Oaqo.js} +2 -2
- package/dist/web/assets/{quadrantDiagram-CIZ2JOQS-CWIG722H.js.map → quadrantDiagram-CIZ2JOQS-DkP9Oaqo.js.map} +1 -1
- package/dist/web/assets/{railroadDiagram-AXF67PYL-BqpzvWch.js → railroadDiagram-AXF67PYL-BFaH77uW.js} +2 -2
- package/dist/web/assets/{railroadDiagram-AXF67PYL-BqpzvWch.js.map → railroadDiagram-AXF67PYL-BFaH77uW.js.map} +1 -1
- package/dist/web/assets/{requirementDiagram-LRYGKXZP-CdQYqyY3.js → requirementDiagram-LRYGKXZP-D4D1Up4W.js} +2 -2
- package/dist/web/assets/{requirementDiagram-LRYGKXZP-CdQYqyY3.js.map → requirementDiagram-LRYGKXZP-D4D1Up4W.js.map} +1 -1
- package/dist/web/assets/{sankeyDiagram-W5VNT64P-CjygBsyf.js → sankeyDiagram-W5VNT64P-BrHCAjc9.js} +2 -2
- package/dist/web/assets/{sankeyDiagram-W5VNT64P-CjygBsyf.js.map → sankeyDiagram-W5VNT64P-BrHCAjc9.js.map} +1 -1
- package/dist/web/assets/{sequenceDiagram-SI44F4Z6-CNHyT-7s.js → sequenceDiagram-SI44F4Z6-CWxNfjdi.js} +2 -2
- package/dist/web/assets/{sequenceDiagram-SI44F4Z6-CNHyT-7s.js.map → sequenceDiagram-SI44F4Z6-CWxNfjdi.js.map} +1 -1
- package/dist/web/assets/{sizeCapture-X5ZJPWSS-CWKmVg5k.js → sizeCapture-X5ZJPWSS-ePEYSWdD.js} +2 -2
- package/dist/web/assets/{sizeCapture-X5ZJPWSS-CWKmVg5k.js.map → sizeCapture-X5ZJPWSS-ePEYSWdD.js.map} +1 -1
- package/dist/web/assets/{stateDiagram-OKZ733FA-JLEZh7rE.js → stateDiagram-OKZ733FA-BLfZi2Ah.js} +2 -2
- package/dist/web/assets/{stateDiagram-OKZ733FA-JLEZh7rE.js.map → stateDiagram-OKZ733FA-BLfZi2Ah.js.map} +1 -1
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-CtzDIhSY.js +2 -0
- package/dist/web/assets/{stateDiagram-v2-UEYNNEHI-CerzA_PO.js.map → stateDiagram-v2-UEYNNEHI-CtzDIhSY.js.map} +1 -1
- package/dist/web/assets/{swimlanes-SLNWSIFB-C1lOy4R9.js → swimlanes-SLNWSIFB-HnXWSaTr.js} +3 -3
- package/dist/web/assets/{swimlanes-SLNWSIFB-C1lOy4R9.js.map → swimlanes-SLNWSIFB-HnXWSaTr.js.map} +1 -1
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-DEnvqxAR.js +9 -0
- package/dist/web/assets/{swimlanesDiagram-ULZ7WXOC-Bn8fWNMY.js.map → swimlanesDiagram-ULZ7WXOC-DEnvqxAR.js.map} +1 -1
- package/dist/web/assets/{timeline-definition-Z64GVDOM-QFTjVz-z.js → timeline-definition-Z64GVDOM-D4kboPkf.js} +2 -2
- package/dist/web/assets/{timeline-definition-Z64GVDOM-QFTjVz-z.js.map → timeline-definition-Z64GVDOM-D4kboPkf.js.map} +1 -1
- package/dist/web/assets/{vennDiagram-T6HMQDX7-CeJkPnQF.js → vennDiagram-T6HMQDX7-CmUlC-yb.js} +2 -2
- package/dist/web/assets/{vennDiagram-T6HMQDX7-CeJkPnQF.js.map → vennDiagram-T6HMQDX7-CmUlC-yb.js.map} +1 -1
- package/dist/web/assets/{wardleyDiagram-T6FBY63Y-NWi7Y8OK.js → wardleyDiagram-T6FBY63Y-DoLIyOSu.js} +2 -2
- package/dist/web/assets/{wardleyDiagram-T6FBY63Y-NWi7Y8OK.js.map → wardleyDiagram-T6FBY63Y-DoLIyOSu.js.map} +1 -1
- package/dist/web/assets/{xychartDiagram-ELKLHX3M-1LhXU_ZK.js → xychartDiagram-ELKLHX3M-BII0rBQD.js} +2 -2
- package/dist/web/assets/{xychartDiagram-ELKLHX3M-1LhXU_ZK.js.map → xychartDiagram-ELKLHX3M-BII0rBQD.js.map} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/dist/web/version.json +1 -1
- package/package.json +5 -3
- package/dist/web/assets/channel-DxwvuvRo.js +0 -2
- package/dist/web/assets/classDiagram-JCYQIIEL-1vxBWvib.js +0 -2
- package/dist/web/assets/classDiagram-v2-OCEON4UE-1vxBWvib.js +0 -2
- package/dist/web/assets/index-km-YMg5Y.js +0 -332
- package/dist/web/assets/index-km-YMg5Y.js.map +0 -1
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-CerzA_PO.js +0 -2
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-Bn8fWNMY.js +0 -9
package/dist/web/assets/{swimlanes-SLNWSIFB-C1lOy4R9.js.map → swimlanes-SLNWSIFB-HnXWSaTr.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["createGraphWithElements","element","data4Layout","graph","graphlib.Graph","edgesToProcess","config","getConfig2","rootGroups","clusters","edgePaths","edgeLabels2","nodesGroup","nodeElements","hasDom","node","childNodeEl","insertNode","boundingBox","edge","existingEdge","captureNodeSizes","__vitePreload","__name","ROUNDED_CORNER_RADIUS","CORNER_EPSILON","ENDPOINT_EPSILON","buildSegmentList","points","segments","i","segmentIntersection","a1","a2","b1","b2","dxA","dyA","dxB","dyB","denom","dx","dy","tA","tB","isHorizontalSeg","seg","findEdgeIntersections","edges","crossings","edgeA","segmentsA","j","edgeB","segmentsB","si","segA","sj","segB","hit","aHoriz","bHoriz","fmt","n","rounded","pointToString","p","getArcSweepFlag","MIN_JUMP_RADIUS","applyMarkerOffsets","out","startOff","markerOffsets","a","b","ang","endOff","emitJump","jump","ux","uy","sweep","style","cx","cy","pre","post","computeRoundedCorner","prev","curr","next","radius","dx1","dy1","dx2","dy2","len1","len2","nx1","ny1","nx2","ny2","dot","clamped","angle","cutLen","rewriteEdgePath","jumps","rawPoints","bySeg","segLen","list","parts","segStartConsumed","corner","segEndStop","upcomingCorner","segJumps","k","gap","half","isStraightPath","d","curveSupportsLineHops","curve","decodeDataPoints","raw","json","parsed","pts","applyLineJumpsToSvg","edgePathsGroup","groupNode","edgeMeta","e","renderedEdges","pathById","escapedId","pathEl","jumpsByEdge","c","renderedEdge","curveHint","currentD","originalStyle","dasharrayMatch","preservedOValueS","preservedOValueE","newD","newLen","onLen","newDasharray","cleaned","adjustLayout","groups","insertCluster","positionNode","nodeById","startNode","endNode","paths","insertEdge","insertEdgeLabel","positionEdgeLabel","lineHopsConfig","jumpStyle","edgeGeometries","path","siteConfig","getConfig","subGraphTitleTotalMargin","getSubGraphTitleMargins","el","edgeLabels","x","y","pos","utils_default","log","terminalLabels","DEFAULT_SWIMLANE_ID","TOP_LANE_TITLE_BAND_HEIGHT","MIN_TOP_LANE_HORIZONTAL_PADDING","topLaneHorizontalPadding","lane","assignTopLaneTitleRect","width","height","contentTop","top","headerBottom","titleHeight","bottom","prepareLayoutForSwimlanes","layout","direction","nodes","looseNodes","defaultLane","toGraphView","src","dst","allNodes","groupNodes","nonGroupNodes","writeBackToLayoutData","g","ordered","coords","opts","nodeMap","layerGap","nodeGap","layerIndex","layer","orderIndex","id","groupBounds","topLevelGroups","group","children","minX","maxX","minY","maxY","child","cw","ch","pad","horizontalPad","verticalPad","w","h","globalMinY","globalMaxY","maxPad","contentHeight","verticalMargin","laneHeight","centerY","sortedLanes","ax","bx","laneIds","centers","baseWidths","contentWidth","count","laneWidths","u","lowerBound","upperBound","baseW","finalWidth","EDGE_LABEL_LOG_PREFIX","createEdgeLabelNodes","data","nodesToAdd","layoutOnlyEdges","sourceNode","targetNode","labelNodeId","labelLane","labelNode","toLabelVirtual","fromLabelVirtual","newNodes","newEdges","EPS","measuredNodeRect","rectFromCenterSize","nodeBoundsInfoFor","measured","samePoint","epsilon","sameX","sameY","isHorizontalSegment","isVerticalSegment","overlapLength","sameAxisSegmentOverlapLength","orthogonalSegmentsForPoints","result","horizontal","vertical","countOrthogonalBends","bends","dedupeConsecutivePoints","point","last","classifyThreeSegmentRoute","p0","p1","p2","p3","segmentBoundsOverlapRect","rect","buffer","segMinX","segMaxX","segMinY","segMaxY","pointInsideRect","rectContainsRect","outer","inner","rectsOverlap","inflateRect","margin","rectOfNodeBounds","portForRectSide","side","buildOrthogonalPortPath","srcSide","dstSide","anchor","srcH","dstH","midX","intX","intY","midY","sameDirSrc2","sameDirDst2","sameDirSrc","sameDirDst","buildSameSideTrackPath","track","collectRealNodeBounds","nodeInfoById","realNodeRects","info","collectNodeRectEntries","labelNodeRects","entry","collectLayoutNodeRects","includeEdgeLabels","getNodePairGeometry","srcId","dstId","srcInfo","dstInfo","segmentHitsAnyRect","rects","excludeIds","shrink","orthogonalSegmentsCross","endpointTolerance","s1H","s1V","s2H","s2V","horiz","vert","hY","hX1","hX2","vX","vY1","vY2","matchesHorizEndpoint","matchesVertEndpoint","sameAxisSegmentsOverlap","segmentConflictsWithAnyEdge","excludeEdge","skipDegenerateOther","other","oa","ob","orthogonalSegmentsStrictlyCross","aVert","bVert","hXmin","hXmax","vYmin","vYmax","strictlyBetween","value","lo","hi","isCollinearIntermediate","cur","simplifyPolylineOnce","changed","orthogonalizePolyline","prevPrev","deduped","simplifyPolyline","work","guard","EPS2","INSIDE_EPS","CORNER_CLEARANCE","endpointContextFor","nodeByIdMap","minPoints","candidate","segmentEnterPoint","outside","inside","r","clipEndpoint","atStart","step","outsideIndex","insideIndex","clipEdgeEndpointsToNodeBoundaries","context","clearStraightEndpointCornerConnections","snapEndpointToBoundary","endpoint","useApproachSide","toTop","firstDistinctAdjacent","endpointIndex","index","cornerClearanceRange","min","max","clampToCornerClearance","intersectRanges","ranges","range","clearanceRangeForSide","terminalSideForSegment","adjacent","yWithin","xWithin","isHorizontalSide","straightClearanceRange","start","end","srcRect","dstRect","clearStraightEndpointCornerAxis","current","cornerClearedEndpoint","moveCollinearEndpointRun","adjusted","horizontalTerminal","clearEndpointCornerConnection","borderSideForSegment","leavesOutward","from","to","collapseOwnBorderStub","side2","snapAndCollapseEndpoints","snapped","straightCleared","prepareEdgeEndpointsForRenderer","input","newPts","duplicated","buildNodeMap","resolveTopLevelGroupId","parentId","topLevelGroupId","parent","groupDepth","depth","boundsForChildren","applyGroupBounds","bounds","recomputeNestedGroupBounds","groupsByDepth","mirrorAxis","axis","contentNodes","mirror","titleRect","applyBtDirectionTransform","applyLrDirectionTransform","x0","y0","titleBandSize","totalWidth","totalHeight","avgWidth","avgHeight","horizontalScaleFactor","newX","newY","laneNodes","childrenByLane","laneId","bucket","laneBounds","globalMinXChild","globalMaxXChild","fullContentWidth","horizontalMargin","bodyWidth","laneWidth","laneLeft","centerX","laneTop","laneBottom","EPS3","MIN_PORT_SPACING","PORT_SHIFT","TRY_DELTAS","portSwapToLShape","route","isHVH","nodePair","collinearX","collinearY","delta","np0","np1","np2","newSrcY","newSrcX","firstSegDegenerate","secondSegDegenerate","firstSegConflicts","secondSegConflicts","collapseShortTerminalStub","labelRects","rawPts","nLast","endPt","penultPt","prevPt","lastDx","lastDy","lastLen","penultDx","penultDy","lastIsHoriz","lastIsVert","penultIsHoriz","penultIsVert","dstCx","dstCy","newPrev","newEnd","approachFromBelow","approachFromLeft","ownSegmentKey","selfSegments","segmentCrossesOtherEdge","oPts","beforePrev","endpointIds","labelId","lw","lh","bestMidX","bestMidY","bestLen","isHoriz","isVert","EPS_LOCAL","MIN_SHARED","segmentsFor","orthogonallyAligned","separateSharedRenderedTerminalLanes","rectIntersect","terminalLaneFor","nodeId","boundary","railEnd","projectedOverlapLength","sameTerminalFace","exactTerminalLaneConflict","nearTerminalLaneConflict","shared","faceSpan","shiftedCandidate","shift","shiftedBoundary","shiftedRailEnd","railEndIsAdjacent2","rest","railEndIsAdjacent","before","previous","laneIsStraightCollinearConnector","startId","endId","startX","startY","endX","endY","shifts","iteration","lanes","fixed","first","second","fixingNearConflict","candidates","aPreservesStraight","bPreservesStraight","nextLane","collapseRedundantRectangularDoglegs","candidateIsSafe","sourceId","targetId","candidateSegments","segment","otherPoints","candidateSegment","otherSegment","withoutDogleg","p4","terminalVerticalDogleg","terminalHorizontalDogleg","p5","verticalDogleg","horizontalDogleg","liftObstacleHuggingSameSideRails","visibleEdges","pointsFor","replacementEdge","replacement","strictCrossingCount","firstSegments","secondSegments","firstSegment","secondSegment","middleRail","middle","blockingRectsFor","rail","candidateByMovingRail","coord","simplified","currentCrossings","blockers","liftTopLaneTitleBandsAboveRails","validTitleRect","topLaneTitleFor","rawDirection","titleWidth","horizontalSegmentIntersectsTitle","topDelta","shiftLeftLaneTitleBandsLeftOfRails","leftLaneTitleFor","verticalSegmentIntersectsTitle","leftDelta","segmentLeft","swapDestinationTerminalTailsToReduceCrossings","replacementPointsFor","replacements","crossingCount","totalBends","sum","terminalTailFor","tailStart","terminal","candidateWithDestinationTail","tail","firstTurn","connector","pathHasNodeHit","pathHasSharedTrack","edgesByDestination","currentBends","bestReplacements","bestCrossings","bestBends","destinationEdges","firstTail","secondTail","firstCandidate","secondCandidate","candidateCrossings","candidateBends","reassignCrossingExternalRailChannels","endpointRectsFor","srcNode","dstNode","externalRailForSegment","endpointRects","leftBound","rightBound","topBound","bottomBound","collectExternalRails","rails","railsInteract","connectedComponents","seen","queue","component","uniqueCoordsFor","coordinateAssignmentsFor","assignments","used","visit","assignment","replacementsForAssignment","draftByEdge","firstChanged","bestDisplacement","candidateDisplacement","shortcutRedundantOrthogonalJogs","pathLength","segmentRunsAlongRectBorder","shortcutCandidatesAt","isVHV","corners","rawCandidates","key","bestEdge","bestPath","bestLength","currentPoints","currentLength","candidateLength","resolveRenderedOrthogonalCrossings","realNodes","sides","outsideTracks","edgeIndex","outwardTracksForSide","outward","tracks","channel","crossingCountBetweenSegments","crossingCountBetweenPaths","crossingSnapshot","pairs","edgeSet","edgeOrder","addEdge","firstPoints","pairCount","crossingCountWithReplacements","currentAffected","pair","replacementAffected","crossingComponents","snapshot","neighbors","firstNeighbors","secondNeighbors","components","endpointIdsFor","pairSearchGroups","componentSet","componentEndpointIds","crossingCountWithSingleReplacement","currentCrossingsByEdge","totalLength","pathHasSegmentConflict","pathSegments","pathHitsNode","pushOrthogonalCandidate","sideIsHorizontal","localTrackForSameSide","addSameSideCandidates","trackSeeds","seed","addHorizontalToVerticalCandidates","xTrack","yTrack","addVerticalToHorizontalCandidates","addHorizontalPairCandidates","yTracks","srcTrack","dstTrack","addVerticalPairCandidates","xTracks","dedupeCandidatePaths","buildCandidatesForSides","base","srcHorizontal","dstHorizontal","addVerticalDepartureOuterTrackCandidates","departure","externalXTracks","externalYTracks","targetYTracks","targetTrack","addHorizontalDepartureOuterTrackCandidates","targetXTracks","terminalPreservingOuterTrackCandidates","candidatePathsFor","srcPort","currentSegmentsByEdge","sharedTrackConflictsFor","baseSegments","conflicts","otherSegments","pairCandidatesFor","crossingCountByEdge","pairCrossingCount","firstEdge","secondEdge","conflictsOnlyWith","conflict","candidatesShareTrack","pairCandidatesAreCompatible","scorePairReplacement","pairScoreIsBetter","best","bestScoreForOptionPair","pairBest","score","bestPairedReplacement","baseBendsByEdge","baseLengthByEdge","optionsByEdge","scoringContext","crossingEdgeSet","options","option","currentEdgeBends","candidateHitsNode","candidateHasSegmentConflict","pairedReplacement","EPS4","MIN_SHARED2","simplifyDetouredEdges","ANCHOR","buildOrthogonalPathCandidates","pathConflictCount","currentEdge","includeIncidentEdges","currentStart","currentEnd","otherStart","otherEnd","otherPts","pathSegment","BEND_THRESHOLD","nearestSideOfRect","pt","dTop","dBottom","dLeft","dRight","bestDist","faceClaims","addFaceClaim","edgeId","claims","eId","faceIsClaimed","ignoreEdgeId","currentCrossingConflicts","currentNonIncidentConflicts","bestCrossingConflicts","dstPort","pathBends","pathCrossingConflicts","refreshSrc","refreshDst","EPS5","MARKER_CLEARANCE_LENGTH","MARKER_CLEARANCE_HALF_WIDTH","markerClearanceRectFor","terminalIndex","tip","x2","y2","normalizeRect","labelOverlapsOwnMarker","visiblePts","startMarker","endMarker","marker","anchorLabelsToPolyline","allEdgeSegments","foreignNodeRects","laneGroups","isGroup","rect2","LABEL_PLACEMENT_BUFFER","LABEL_LANE_MARGIN","LABEL_ENDPOINT_CLEARANCE","labelOverlapsForeignNode","buffered","nr","labelOverlapsForeignEdge","s","labelOverlapsAnything","placedLabelRects","findContainingLane","laneRect","overlapsPlacedLabel","placed","middleSegments","poolBase","labelLongAxis","rankSegments","pool","aLongAxis","bLongAxis","aFits","bFits","firstVisibleSegment","lastVisibleSegment","ALONG_SEGMENT_TS","anchorAtT","t","clamp","pointInsideRectInclusive","placementForAnchor","centeredRect","centeredLane","containingLane","clampedAnchor","clampedRect","distanceAlongSegment","labelClearsTerminalEndpoints","requiredDistance","tryPool","rankedPool","placement","findLaneContainingFallback","requireEndpointClearance","allowForeignEdgeOverlap","chosen","chosenRect","priorIdx","EPS6","MIN_PORT_SPACING2","PORT_SHIFT2","LABEL_CLEARANCE_BUFFER","pairKey","straightenCollinearSiblingDetours","labelDimById","labelClearanceFor","thisEdge","thisSrcId","thisDstId","targetPair","maxHalf","consider","dim","oSrc","oDst","targetSrc","targetDst","dstBelow","dstEast","labelShift","effectiveShift","deltas","shiftedSrc","shiftedDst","nudgeSharedInteriorSubpaths","segmentsFor2","allSegments","hasCrowdedParallelTrack","ownLabelIds","nodeCenter","sourceDetourContextFor","sourceRect","targetRect","verticalSourceDetour","sourceCenter","targetCenter","targetBelow","sourcePortY","stubY","railX","horizontalSourceDetour","targetRight","sourcePortX","stubX","railY","sourceDetourCandidate","direct","detoured","segmentsIntersect","d1x","d1y","d2x","d2y","cross","eps","validateSwimlanesLayout","issues","nodeRects","edgeSegments","edgeStart","edgeEnd","ownLabelId","crossingPairs","pairKey2","overlaps","issue","postProcessSwimlaneLayout","finalizeRenderedEdges","normalizeGraph","incoming","v","buildSuccessorMap","succs","buildSortedSuccessorMap","successors","buildInDegreeMap","indeg","sortedZeroInDegreeNodes","degree","buildPredecessorSuccessorMaps","includeEdge","preds","buildLayersFromRanks","order","rankOf","maxRank","layers","topoSortIfAcyclic","adj","buildLayerIndex","m","countInversions","values","tmp","left","right","mid","inversions","removeCycles_DFS","gn","arr","color","reversed","dfs","nodesSorted","toReverse","acycEdges","buildTopLaneMap","cache","resolve","createTopLaneResolver","topLaneMap","buildTopLaneOrder","resolveTopLaneOrder","preferredOrder","sourceOrder","sourceLaneIds","resolved","PRECISION","LAYERING","COORDINATES","buildDrivingTree","laneOf","rankHint","topoOrder","topoIndex","idx","chooseParent","rootSet","roots","ta","tb","adjacency","buildAdjacency","adjacencyList","set","componentOf","assignComponents","blocks","computeBlocks","nodeBlocks","block","preorder","postorder","walk","root","ctx","laneNode","laneA","laneB","sameLaneA","sameLaneB","rankA","rankB","idxA","idxB","componentId","stack","discovery","low","edgeStack","time","popBlock","computeSubtreeCrossCounts","tree","indexOf","parentIdx","currentIdx","childList","childIdx","maxLog","up","lcaIndex","aIdx","bIdx","diff","upA","upB","ownCounts","ru","rv","upperIdx","lowerIdx","lca","crossCounts","mergeInto","target","source","visited","accumulator","childMap","parentLayer","map","childLayer","annotateMinimumLayers","minLayer","annotate","minL","compareByRankThenId","childMin","ra","rb","emitNodesInTreeOrder","orderChildren","emitted","emit","deduplicateLayers","createChildOrderer","future","present","crossMap","ca","cb","ma","mb","item","buildMultitreeLayerOrder","rootsSorted","countCrossingsBetweenAdjacent","upper","lower","upperSet","lowerSet","li","vs","totalCrossings","expanded","rUpper","rLower","L","optimizeRanksByCrossings","initialRank","maxPasses","pass","nodesByRank","lb","old","trialLayers","adjustCrossLaneSources","topLaneOf","laneV","outEdges","hasSameLaneSucc","crossLaneCount","laneDst","crossLaneIncoming","hasSameLanePred","laneSrc","newRank","assignLayers_LongestPath","gAcyclic","compact","incAll","inc","laneU","mx","assignLayers_Gravity","revOrder","clampFeasible","desired","ub","iters","relaxOrder","nodeOrder","ps","ss","predAvg","succAvg","it","forwardChanged","backwardChanged","topoSortByGenerationIfAcyclic","frontier","nextFrontier","assignLayers_LaneAwareCompact","nextFree","edgeWeight","nf","makeProperLayering","layering","l","dummy","dummySeq","addDummyAt","dn","edgesSorted","rU","rV","lastIndex","graphWithDummies","median","barycenter","acc","neighborPositionsFor","targetNodes","fixedIndex","neighborPositions","currentOrderTieBreak","currentLayerIndex","ia","ib","countCrossingsBetweenAdjacent2","upperIndex","lowerIndex","sortByHeuristic","sa","sb","reorderLayer","fixedLayer","targetLayer","laneOrder","currIndex","byLane","nodesInLane","sorted","nullNodes","nid","bc","bestIdx","rid","rBc","transposeImprove","layerSet","nextSet","edgesIn","edgesOut","crossingScore","improved","bestScore","nextScore","orderLayers","gWithDummies","assignCoordinates","laneGap","isHorizontal","getNode","getWidth","getHeight","laneOrderGlobal","layerHeights","extraLayerGaps","thisLayerMaxWidth","nextLayerMaxWidth","thisLayerMaxHeight","nextLayerMaxHeight","normalSpacing","requiredSpacing","extraNeeded","lanesUsedSet","hasNullLane","lanesUsed","laneOrderColumns","perLane","nullIds","ids","total","totalNull","widths","cursor","yOffset","layerH","extraGap","byRef","chainEdges","ref","involved","vid","AUTOMATIC_LANE_ORDERING_RESTARTS","hashString","hash","mulberry32","state","deterministicShuffle","shuffled","random","sourceDistance","sourceIndex","distance","laneArrangementCost","weights","position","cost","weight","ai","bi","buildWeightedLaneEdges","existing","greedySwitch","startOrder","sweeps","maxSweeps","nextCost","isBetterCandidate","seedForRestart","restartIndex","weightSignature","optimizeTopLaneOrder","restarts","sugiyamaLayout","ignoreCrossLaneEdges","optimizeRanksByCrossings2","g0","cycleRes","properLayering","coordinates","EPS7","NODE_PADDING","HORIZONTAL_PIPE_MARGIN","VERTICAL_PIPE_MARGIN","ROUTING_MARGIN","ANCHOR_OFFSET","TRACK_SPACING","chooseOrthogonalSide","fallback","absDx","absDy","sharedLineEndpointCoord","line","nextLine","pointOnLine","along","routeEdgesOrthogonal","originalEdges","oe","laneByNodeId","pipes","isLR","assignLane","obstacles","padding","getOrAddPipe","orientation","spanMin","spanMax","pipe","portForSide","getOrthogonalPort","isSource","allRoutedSegments","edgeSegmentIndices","straightIntraLaneEdges","CROSSING_PENALTY","crossingPenalty","edgeIdx","isVertical","penalties","routingOrder","srcLane","dstLane","crossLane","aDist","bDist","isSegmentBlocked","excludeStart","excludeEnd","obs","portGroups","incidentEdgeTotals","determineSide","sideInfoByIdx","preferenceStrength","secondarySide","sourceSideGroups","sideLoad","loadKey","secondary","primaryLoad","secondaryLoad","isDiamondNode","shape","inSidesByNode","inSides","srcKey","dstCoord","dstKey","srcCoord","portOffsets","MIN_PORT_SPACING3","role","sideLength","effectiveLength","spacing","startOffset","offset","offsetKey","edgeHasLabelNode","faceHasLabelNode","applyPortOffset","basePort","portsForEdge","sideInfo","srcTarget","dstTarget","pSrcPort","pDstPort","srcOffset","dstOffset","srcPortSide","dstPortSide","pSrcAnchor","pDstAnchor","srcPortIsVertical","dstPortIsVertical","isBottom","isRight","isPointInObstacle","excludeNodeIds","obstacleDetour","port","opposite","portIsVertical","leavesPositiveSide2","leavesPositiveSide","goDown","srcHandleWaypoints","srcCheck","detour","gapY","gapX","dstHandleWaypoints","dstCheck","hpMargin","anchorsSameX","anchorsSameY","hasPortOffset","srcFaceTotal","dstFaceTotal","faceContested","srcIncidentTotal","dstIncidentTotal","contestedFaceHasLabel","srcContestAllowsCenteredStraight","dstContestAllowsCenteredStraight","fastPathOrientation","fastPathCoord","fastPathFrom","fastPathTo","fastPathPipe","srcPipe","dstPipe","bbMinX","bbMaxX","bbMinY","bbMaxY","pathMinX","pathMaxX","pathMinY","pathMaxY","hMargin","vMargin","hPipes","vPipes","getKey","startKey","endKey","gScore","cameFrom","arrivalDir","openSet","openList","foundPath","checkSegmentBlocked","cornerHV","seg1HV_blocked","seg2HV_blocked","pathHV_blocked","cornerVH","seg1VH_blocked","seg2VH_blocked","currKey","currPt","sortedVPipes","vIdx","hPipesSorted","hIdx","neighbor","nKey","dist","penalty","dirPenalty","destDx","destDy","moveDx","moveDy","bendPenalty","currentDir","moveDir","stepCost","tentativeG","wentRight","wentLeft","pathX","detourObstacles","visualMaxX","obsCenterX","visualRight","visualMinX","visualLeft","findBestReturnY","detourX","goingDown","relevantObs","obsInXRange","obsInYRange","filteredObs","obsAtDetourX","bestY","trySimplifyWithDetourX","corner1","corner2","corner3","seg1Blocked","seg2Blocked","seg3Blocked","seg4Blocked","simplified2","fullPoints","C","B","A","signAB","signAC","dir1","dir2","rSeg","segmentsOverlap","s1","s2","trySwapSegmentsAcrossTracks","t1","t2","canS1GoT2","canS2GoT1","createNewTrack","moveSegmentToTrack","trackIdx","oldTrack","moveSegmentChainToTrack","indices","getAdjacentSegmentsAlongEdge","idxInList","haveAnyCrossing","findAvailableTrack","segmentsConflict","adj1","adj2","resolveTrackConflict","move","avail","resolveHandleConflicts","handles","h1","h2","destInfoCache","getDestInfo","info2","dest","candidateA","candidateB","deviation","fixSourceHandleCrossings","edgesBySource","getEdgeDistance","grp","infoA","infoB","distA","distB","lenA","lenB","distA2","distB2","ei","fixTargetHandleCrossings","edgesByTarget","getDist","scoreA","scoreB","fixPipeCrossings","pipeSegments","ix","iterations","MAX_ITER","segmentCoords","currentCluster","clusterEnd","cluster","usedTracks","trackScores","leftTracks","rightTracks","neutralTracks","assignCoord","trackIndex","effectiveCoord","leftCount","bestTrack","leftIdx","rightIdx","neutralAssigned","dir","magnitude","rightCount","newPoints","lines","prevAlong","prevTrackCoord","hasNextLine","junction","endAlong","filtered","re","orig","nodeBoundaryClamp","minD","getSwimlaneDirection","runSwimlaneLayoutCore","automaticLaneOrdering","render","svg","markers_default","clear3","clear2","clear","clear4","transformedData"],"ignoreList":[0],"sources":["../../../node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-SLNWSIFB.mjs"],"sourcesContent":["import {\n clear as clear4\n} from \"./chunk-RYQCIY6F.mjs\";\nimport {\n clear as clear2,\n edgeLabels,\n insertEdge,\n insertEdgeLabel,\n markers_default,\n terminalLabels\n} from \"./chunk-7Z6QIM7H.mjs\";\nimport {\n clear,\n clear2 as clear3,\n insertCluster,\n insertNode,\n positionNode\n} from \"./chunk-QR6OTTB3.mjs\";\nimport \"./chunk-W5SLKNZC.mjs\";\nimport {\n markerOffsets\n} from \"./chunk-7BUUIJ7U.mjs\";\nimport {\n getSubGraphTitleMargins\n} from \"./chunk-UBXNYLIW.mjs\";\nimport \"./chunk-WRU74C26.mjs\";\nimport \"./chunk-4I5QYGJK.mjs\";\nimport {\n utils_default\n} from \"./chunk-NSK5VX7P.mjs\";\nimport {\n getConfig,\n getConfig2\n} from \"./chunk-I66GZJ75.mjs\";\nimport {\n log\n} from \"./chunk-X3CZISLH.mjs\";\nimport {\n __name\n} from \"./chunk-Y2CYZVJY.mjs\";\n\n// src/rendering-util/createGraph.ts\nimport * as graphlib from \"dagre-d3-es/src/graphlib/index.js\";\nasync function createGraphWithElements(element, data4Layout) {\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true\n });\n const edgesToProcess = [...data4Layout.edges];\n const config = getConfig2();\n const rootGroups = element.insert(\"g\").attr(\"class\", \"root\");\n const clusters = rootGroups.insert(\"g\").attr(\"class\", \"clusters\");\n const edgePaths = rootGroups.insert(\"g\").attr(\"class\", \"edges edgePath\");\n const edgeLabels2 = rootGroups.insert(\"g\").attr(\"class\", \"edgeLabels\");\n const nodesGroup = rootGroups.insert(\"g\").attr(\"class\", \"nodes\");\n const nodeElements = /* @__PURE__ */ new Map();\n const hasDom = element.node() != null;\n await Promise.all(\n data4Layout.nodes.map(async (node) => {\n if (node.isGroup) {\n graph.setNode(node.id, { ...node });\n } else {\n if (hasDom) {\n const childNodeEl = await insertNode(nodesGroup, node, { config, dir: node.dir });\n const boundingBox = childNodeEl.node()?.getBBox() ?? { width: 0, height: 0 };\n nodeElements.set(node.id, childNodeEl);\n node.width = boundingBox.width;\n node.height = boundingBox.height;\n }\n graph.setNode(node.id, { ...node });\n }\n })\n );\n for (const edge of edgesToProcess) {\n graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);\n const edgeExists = data4Layout.edges.some((existingEdge) => existingEdge.id === edge.id);\n if (!edgeExists) {\n data4Layout.edges.push(edge);\n }\n }\n if (globalThis.mermaidCaptureSizes) {\n const { captureNodeSizes } = await import(\"./sizeCapture-X5ZJPWSS.mjs\");\n captureNodeSizes(element, data4Layout);\n }\n return {\n graph,\n groups: { clusters, edgePaths, edgeLabels: edgeLabels2, nodes: nodesGroup, rootGroups },\n nodeElements\n };\n}\n__name(createGraphWithElements, \"createGraphWithElements\");\n\n// src/rendering-util/rendering-elements/lineJump.ts\nvar ROUNDED_CORNER_RADIUS = 5;\nvar CORNER_EPSILON = 1e-5;\nvar ENDPOINT_EPSILON = 1e-6;\nfunction buildSegmentList(points) {\n const segments = [];\n for (let i = 0; i < points.length - 1; i++) {\n segments.push({ a: points[i], b: points[i + 1] });\n }\n return segments;\n}\n__name(buildSegmentList, \"buildSegmentList\");\nfunction segmentIntersection(a1, a2, b1, b2) {\n const dxA = a2.x - a1.x;\n const dyA = a2.y - a1.y;\n const dxB = b2.x - b1.x;\n const dyB = b2.y - b1.y;\n const denom = dxA * dyB - dyA * dxB;\n if (denom === 0) {\n return null;\n }\n const dx = b1.x - a1.x;\n const dy = b1.y - a1.y;\n const tA = (dx * dyB - dy * dxB) / denom;\n const tB = (dx * dyA - dy * dxA) / denom;\n if (tA <= ENDPOINT_EPSILON || tA >= 1 - ENDPOINT_EPSILON || tB <= ENDPOINT_EPSILON || tB >= 1 - ENDPOINT_EPSILON) {\n return null;\n }\n return {\n point: { x: a1.x + tA * dxA, y: a1.y + tA * dyA },\n tA,\n tB\n };\n}\n__name(segmentIntersection, \"segmentIntersection\");\nfunction isHorizontalSeg(seg) {\n return Math.abs(seg.b.x - seg.a.x) >= Math.abs(seg.b.y - seg.a.y);\n}\n__name(isHorizontalSeg, \"isHorizontalSeg\");\nfunction findEdgeIntersections(edges) {\n const crossings = [];\n for (let i = 0; i < edges.length; i++) {\n const edgeA = edges[i];\n const segmentsA = buildSegmentList(edgeA.points);\n for (let j = i + 1; j < edges.length; j++) {\n const edgeB = edges[j];\n const segmentsB = buildSegmentList(edgeB.points);\n for (const [si, segA] of segmentsA.entries()) {\n for (const [sj, segB] of segmentsB.entries()) {\n const hit = segmentIntersection(segA.a, segA.b, segB.a, segB.b);\n if (!hit) {\n continue;\n }\n const aHoriz = isHorizontalSeg(segA);\n const bHoriz = isHorizontalSeg(segB);\n const orthogonalPair = aHoriz !== bHoriz;\n const jumpOnA = orthogonalPair ? aHoriz : false;\n if (jumpOnA) {\n crossings.push({\n jumpEdgeId: edgeA.id,\n otherEdgeId: edgeB.id,\n segIndex: si,\n t: hit.tA,\n point: hit.point\n });\n } else {\n crossings.push({\n jumpEdgeId: edgeB.id,\n otherEdgeId: edgeA.id,\n segIndex: sj,\n t: hit.tB,\n point: hit.point\n });\n }\n }\n }\n }\n }\n return crossings;\n}\n__name(findEdgeIntersections, \"findEdgeIntersections\");\nfunction fmt(n) {\n const rounded = Math.round(n * 1e3) / 1e3;\n return Number.isInteger(rounded) ? `${rounded}` : `${rounded}`;\n}\n__name(fmt, \"fmt\");\nfunction pointToString(p) {\n return `${fmt(p.x)},${fmt(p.y)}`;\n}\n__name(pointToString, \"pointToString\");\nfunction getArcSweepFlag(seg) {\n const dx = seg.b.x - seg.a.x;\n const dy = seg.b.y - seg.a.y;\n if (Math.abs(dx) >= Math.abs(dy)) {\n return dx >= 0 ? 1 : 0;\n }\n return dy >= 0 ? 1 : 0;\n}\n__name(getArcSweepFlag, \"getArcSweepFlag\");\nvar MIN_JUMP_RADIUS = 1e-3;\nfunction applyMarkerOffsets(points, edge) {\n if (points.length < 2) {\n return points.map((p) => ({ ...p }));\n }\n const out = points.map((p) => ({ ...p }));\n const startOff = edge.arrowTypeStart && markerOffsets[edge.arrowTypeStart];\n if (startOff) {\n const a = points[0];\n const b = points[1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[0].x = a.x + startOff * Math.cos(ang);\n out[0].y = a.y + startOff * Math.sin(ang);\n }\n const endOff = edge.arrowTypeEnd && markerOffsets[edge.arrowTypeEnd];\n if (endOff) {\n const n = points.length;\n const a = points[n - 2];\n const b = points[n - 1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[n - 1].x = b.x - endOff * Math.cos(ang);\n out[n - 1].y = b.y - endOff * Math.sin(ang);\n }\n return out;\n}\n__name(applyMarkerOffsets, \"applyMarkerOffsets\");\nfunction emitJump(jump, ux, uy, sweep, style) {\n const cx = jump.point.x;\n const cy = jump.point.y;\n const pre = { x: cx - ux * jump.r, y: cy - uy * jump.r };\n const post = { x: cx + ux * jump.r, y: cy + uy * jump.r };\n const out = [`L${pointToString(pre)}`];\n if (style === \"arc\") {\n out.push(`A${fmt(jump.r)},${fmt(jump.r)} 0 0 ${sweep} ${pointToString(post)}`);\n } else {\n out.push(`M${pointToString(post)}`);\n }\n return out;\n}\n__name(emitJump, \"emitJump\");\nfunction computeRoundedCorner(prev, curr, next, radius) {\n const dx1 = curr.x - prev.x;\n const dy1 = curr.y - prev.y;\n const dx2 = next.x - curr.x;\n const dy2 = next.y - curr.y;\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n if (len1 < CORNER_EPSILON || len2 < CORNER_EPSILON) {\n return null;\n }\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n const dot = nx1 * nx2 + ny1 * ny2;\n const clamped = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clamped);\n if (angle < CORNER_EPSILON || Math.abs(Math.PI - angle) < CORNER_EPSILON) {\n return null;\n }\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n return {\n startX: curr.x - nx1 * cutLen,\n startY: curr.y - ny1 * cutLen,\n endX: curr.x + nx2 * cutLen,\n endY: curr.y + ny2 * cutLen,\n ctrlX: curr.x,\n ctrlY: curr.y,\n cutLen\n };\n}\n__name(computeRoundedCorner, \"computeRoundedCorner\");\nfunction rewriteEdgePath(edge, jumps, config) {\n const rawPoints = edge.points;\n if (rawPoints.length < 2) {\n return \"\";\n }\n const points = applyMarkerOffsets(rawPoints, edge);\n const rounded = edge.curve === \"rounded\";\n const segments = buildSegmentList(points);\n const bySeg = /* @__PURE__ */ new Map();\n for (const j of jumps) {\n const seg = segments[j.segIndex];\n if (!seg) {\n continue;\n }\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const list = bySeg.get(j.segIndex) ?? [];\n list.push({\n t: j.t,\n point: j.point,\n d: j.t * segLen,\n r: config.jumpRadius\n });\n bySeg.set(j.segIndex, list);\n }\n const parts = [`M${pointToString(points[0])}`];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const ux = segLen === 0 ? 0 : (seg.b.x - seg.a.x) / segLen;\n const uy = segLen === 0 ? 0 : (seg.b.y - seg.a.y) / segLen;\n const sweep = getArcSweepFlag(seg);\n let segStartConsumed = 0;\n if (rounded && i > 0) {\n const corner = computeRoundedCorner(\n points[i - 1],\n points[i],\n points[i + 1] ?? points[i],\n ROUNDED_CORNER_RADIUS\n );\n if (corner) {\n segStartConsumed = corner.cutLen;\n }\n }\n let segEndStop = segLen;\n let upcomingCorner = null;\n if (rounded && i < segments.length - 1) {\n upcomingCorner = computeRoundedCorner(\n points[i],\n points[i + 1],\n points[i + 2] ?? points[i + 1],\n ROUNDED_CORNER_RADIUS\n );\n if (upcomingCorner) {\n segEndStop = segLen - upcomingCorner.cutLen;\n }\n }\n const segJumps = [...bySeg.get(i) ?? []].sort((a, b) => a.t - b.t);\n for (const j of segJumps) {\n j.r = Math.min(j.r, j.d - segStartConsumed, segEndStop - j.d);\n }\n for (let k = 0; k < segJumps.length - 1; k++) {\n const gap = segJumps[k + 1].d - segJumps[k].d;\n if (segJumps[k].r + segJumps[k + 1].r > gap) {\n const half = gap / 2;\n segJumps[k].r = Math.min(segJumps[k].r, half);\n segJumps[k + 1].r = Math.min(segJumps[k + 1].r, half);\n }\n }\n for (const j of segJumps) {\n if (j.r < MIN_JUMP_RADIUS) {\n continue;\n }\n parts.push(...emitJump(j, ux, uy, sweep, config.jumpStyle));\n }\n if (rounded && upcomingCorner) {\n parts.push(`L${fmt(upcomingCorner.startX)},${fmt(upcomingCorner.startY)}`);\n parts.push(\n `Q${fmt(upcomingCorner.ctrlX)},${fmt(upcomingCorner.ctrlY)} ${fmt(upcomingCorner.endX)},${fmt(upcomingCorner.endY)}`\n );\n } else {\n parts.push(`L${pointToString(seg.b)}`);\n }\n }\n return parts.join(\" \");\n}\n__name(rewriteEdgePath, \"rewriteEdgePath\");\nfunction isStraightPath(d) {\n return /^[\\d\\s+,.LMelm-]*$/.test(d);\n}\n__name(isStraightPath, \"isStraightPath\");\nfunction curveSupportsLineHops(curve) {\n if (!curve) {\n return true;\n }\n return curve === \"linear\" || curve === \"rounded\" || curve === \"step\" || curve === \"stepBefore\" || curve === \"stepAfter\";\n}\n__name(curveSupportsLineHops, \"curveSupportsLineHops\");\nfunction decodeDataPoints(raw) {\n if (!raw) {\n return null;\n }\n try {\n const json = typeof atob === \"function\" ? atob(raw) : Buffer.from(raw, \"base64\").toString();\n const parsed = JSON.parse(json);\n if (!Array.isArray(parsed)) {\n return null;\n }\n const pts = [];\n for (const p of parsed) {\n if (p && typeof p.x === \"number\" && typeof p.y === \"number\") {\n pts.push({ x: p.x, y: p.y });\n }\n }\n return pts.length >= 2 ? pts : null;\n } catch {\n return null;\n }\n}\n__name(decodeDataPoints, \"decodeDataPoints\");\nfunction applyLineJumpsToSvg(edgePathsGroup, edges, config) {\n if (!config.enabled) {\n return;\n }\n const groupNode = edgePathsGroup.node();\n if (!groupNode) {\n return;\n }\n const edgeMeta = /* @__PURE__ */ new Map();\n for (const e of edges) {\n edgeMeta.set(e.id, e);\n }\n const renderedEdges = [];\n const pathById = /* @__PURE__ */ new Map();\n for (const e of edges) {\n const escapedId = typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(e.id) : e.id;\n const pathEl = groupNode.querySelector(`path[data-id=\"${escapedId}\"]`);\n if (!pathEl) {\n continue;\n }\n pathById.set(e.id, pathEl);\n const decoded = decodeDataPoints(pathEl.getAttribute(\"data-points\"));\n const points = decoded ?? e.points;\n renderedEdges.push({ ...e, points });\n }\n const crossings = findEdgeIntersections(renderedEdges);\n if (crossings.length === 0) {\n return;\n }\n const jumpsByEdge = /* @__PURE__ */ new Map();\n for (const c of crossings) {\n const list = jumpsByEdge.get(c.jumpEdgeId) ?? [];\n list.push(c);\n jumpsByEdge.set(c.jumpEdgeId, list);\n }\n for (const renderedEdge of renderedEdges) {\n const jumps = jumpsByEdge.get(renderedEdge.id);\n if (!jumps || jumps.length === 0) {\n continue;\n }\n const meta = edgeMeta.get(renderedEdge.id);\n const curveHint = meta?.curve;\n if (curveHint !== void 0 && !curveSupportsLineHops(curveHint)) {\n continue;\n }\n const pathEl = pathById.get(renderedEdge.id);\n if (!pathEl) {\n continue;\n }\n if (curveHint === void 0) {\n const currentD = pathEl.getAttribute(\"d\") ?? \"\";\n if (!isStraightPath(currentD)) {\n continue;\n }\n }\n const originalStyle = pathEl.getAttribute(\"style\") ?? \"\";\n const dasharrayMatch = /stroke-dasharray\\s*:\\s*0\\s+([\\d.]+)\\s+[\\d.]+\\s+([\\d.]+)/.exec(\n originalStyle\n );\n const preservedOValueS = dasharrayMatch ? Number.parseFloat(dasharrayMatch[1]) : null;\n const preservedOValueE = dasharrayMatch ? Number.parseFloat(dasharrayMatch[2]) : null;\n const newD = rewriteEdgePath(renderedEdge, jumps, config);\n pathEl.setAttribute(\"d\", newD);\n if (preservedOValueS !== null && preservedOValueE !== null && typeof pathEl.getTotalLength === \"function\") {\n const newLen = pathEl.getTotalLength();\n const onLen = Math.max(0, newLen - preservedOValueS - preservedOValueE);\n const newDasharray = `0 ${preservedOValueS} ${onLen} ${preservedOValueE}`;\n const cleaned = originalStyle.replace(/stroke-dasharray\\s*:[^;]*;?/g, `stroke-dasharray: ${newDasharray};`).replace(/;\\s*;+/g, \";\");\n pathEl.setAttribute(\"style\", cleaned);\n }\n }\n}\n__name(applyLineJumpsToSvg, \"applyLineJumpsToSvg\");\n\n// src/rendering-util/layout-algorithms/swimlanes/adjustLayout.ts\nasync function adjustLayout(data4Layout, groups) {\n for (const node of data4Layout.nodes) {\n if (node.isGroup) {\n await insertCluster(groups.clusters, node);\n } else {\n positionNode(node);\n }\n }\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data4Layout.nodes) {\n if (node?.id) {\n nodeById.set(node.id, node);\n }\n }\n for (const edge of data4Layout.edges) {\n const startNode = edge.start ? nodeById.get(edge.start) ?? {} : {};\n const endNode = edge.end ? nodeById.get(edge.end) ?? {} : {};\n const paths = insertEdge(\n groups.edgePaths,\n { ...edge },\n {},\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n if (edge.label) {\n await insertEdgeLabel(groups.rootGroups, edge);\n }\n if (edge.label) {\n positionEdgeLabel(edge, paths);\n }\n }\n const lineHopsConfig = data4Layout.config?.swimlane?.lineHops;\n if (lineHopsConfig !== false) {\n const jumpStyle = lineHopsConfig === \"gap\" ? \"gap\" : \"arc\";\n const edgeGeometries = data4Layout.edges.filter((e) => Array.isArray(e.points) && e.points.length >= 2).map((e) => ({\n id: e.id,\n points: e.points,\n curve: e.curve,\n arrowTypeStart: e.arrowTypeStart,\n arrowTypeEnd: e.arrowTypeEnd\n }));\n applyLineJumpsToSvg(groups.edgePaths, edgeGeometries, {\n enabled: true,\n jumpRadius: 6,\n jumpStyle\n });\n }\n}\n__name(adjustLayout, \"adjustLayout\");\nfunction positionEdgeLabel(edge, paths) {\n const path = paths?.updatedPath ?? paths?.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins({\n flowchart: siteConfig.flowchart ?? {}\n });\n if (edge.label) {\n const el = edgeLabels.get(edge.id);\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcLabelPosition(path);\n log.debug(\n \"Moving label \" + edge.label + \" from (\",\n x,\n \",\",\n y,\n \") to (\",\n pos.x,\n \",\",\n pos.y,\n \") abc88\"\n );\n if (paths) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr(\"transform\", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n if (edge?.startLabelLeft) {\n const el = terminalLabels.get(edge.id).startLeft;\n let x = edge?.x;\n let y = edge?.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, \"start_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.startLabelRight) {\n const el = terminalLabels.get(edge.id).startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(\n edge.arrowTypeStart ? 10 : 0,\n \"start_right\",\n path\n );\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels.get(edge.id).endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelRight) {\n const el = terminalLabels.get(edge.id).endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_right\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n}\n__name(positionEdgeLabel, \"positionEdgeLabel\");\n\n// src/rendering-util/layout-algorithms/swimlanes/helpers.ts\nvar DEFAULT_SWIMLANE_ID = \"__swimlane_default__\";\nvar TOP_LANE_TITLE_BAND_HEIGHT = 21;\nvar MIN_TOP_LANE_HORIZONTAL_PADDING = 20;\nfunction topLaneHorizontalPadding(lane) {\n return Math.max(lane.padding ?? MIN_TOP_LANE_HORIZONTAL_PADDING, MIN_TOP_LANE_HORIZONTAL_PADDING);\n}\n__name(topLaneHorizontalPadding, \"topLaneHorizontalPadding\");\nfunction assignTopLaneTitleRect(lane) {\n const { x, y, width, height } = lane;\n const contentTop = lane.swimlaneContentTop;\n if (typeof x !== \"number\" || typeof y !== \"number\" || typeof width !== \"number\" || typeof height !== \"number\" || typeof contentTop !== \"number\" || !Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(contentTop) || width <= 0 || height <= 0) {\n delete lane.groupTitleRect;\n return;\n }\n const top = y - height / 2;\n const headerBottom = Math.min(contentTop, y + height / 2);\n const titleHeight = Math.min(TOP_LANE_TITLE_BAND_HEIGHT, Math.max(0, headerBottom - top));\n const bottom = top + titleHeight;\n if (bottom <= top) {\n delete lane.groupTitleRect;\n return;\n }\n lane.groupTitleRect = {\n left: x - width / 2,\n right: x + width / 2,\n top,\n bottom\n };\n}\n__name(assignTopLaneTitleRect, \"assignTopLaneTitleRect\");\nfunction prepareLayoutForSwimlanes(layout) {\n const direction = layout.direction;\n const nodes = layout.nodes ??= [];\n for (const node of layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n node.shape = \"swimlane\";\n if (direction) {\n node.direction = direction;\n }\n }\n }\n const looseNodes = nodes.filter((node) => !node.isGroup && !node.parentId);\n if (looseNodes.length === 0) {\n return;\n }\n let defaultLane = nodes.find((node) => node.id === DEFAULT_SWIMLANE_ID);\n if (!defaultLane) {\n defaultLane = {\n id: DEFAULT_SWIMLANE_ID,\n label: \"\",\n isGroup: true,\n shape: \"swimlane\",\n padding: 20,\n ...direction ? { direction } : {}\n };\n nodes.push(defaultLane);\n } else if (defaultLane.isGroup) {\n defaultLane.shape = \"swimlane\";\n if (direction) {\n defaultLane.direction = direction;\n }\n }\n for (const node of looseNodes) {\n node.parentId = DEFAULT_SWIMLANE_ID;\n }\n}\n__name(prepareLayoutForSwimlanes, \"prepareLayoutForSwimlanes\");\nfunction toGraphView(layout) {\n const nodeById = /* @__PURE__ */ new Map();\n for (const n of layout.nodes ?? []) {\n nodeById.set(n.id, n);\n }\n const edges = [];\n for (const e of layout.edges ?? []) {\n const src = typeof e.start === \"string\" ? e.start : void 0;\n const dst = typeof e.end === \"string\" ? e.end : void 0;\n if (!src || !dst) {\n continue;\n }\n if (e.labelNodeId) {\n continue;\n }\n edges.push({ id: e.id, src, dst, ref: e });\n }\n const allNodes = layout.nodes ?? [];\n const groupNodes = allNodes.filter((n) => n.isGroup);\n const nonGroupNodes = allNodes.filter((n) => !n.isGroup);\n const nodesInGroupOrder = [...groupNodes].reverse();\n const nodes = [...nodesInGroupOrder, ...nonGroupNodes].map((n) => n.id);\n return { nodes, edges, layout, nodeById };\n}\n__name(toGraphView, \"toGraphView\");\nfunction writeBackToLayoutData(g, ordered, coords, opts) {\n const { layout } = g;\n const nodeMap = g.nodeById;\n const layerGap = opts?.layerGap ?? 100;\n const nodeGap = opts?.nodeGap ?? 40;\n let layerIndex = 0;\n for (const layer of ordered.layers) {\n let orderIndex = 0;\n for (const id of layer) {\n const node = nodeMap.get(id);\n if (!node) {\n orderIndex++;\n continue;\n }\n node.layer = layerIndex;\n node.order = orderIndex;\n const x = coords.x[id] ?? orderIndex * nodeGap;\n const y = coords.y[id] ?? layerIndex * layerGap;\n node.x = x;\n node.y = y;\n orderIndex++;\n }\n layerIndex++;\n }\n const allNodes = layout.nodes ?? [];\n const groupBounds = /* @__PURE__ */ new Map();\n const topLevelGroups = [];\n for (const group of allNodes) {\n if (!group?.isGroup) {\n continue;\n }\n if (!group.parentId) {\n topLevelGroups.push(group);\n }\n const children = allNodes.filter((n) => n.parentId === group.id);\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x ?? coords.x[child.id];\n const cy = child.y ?? coords.y[child.id];\n const cw = child.width ?? 0;\n const ch = child.height ?? 0;\n if (cx != null && cy != null) {\n minX = Math.min(minX, cx - cw / 2);\n maxX = Math.max(maxX, cx + cw / 2);\n minY = Math.min(minY, cy - ch / 2);\n maxY = Math.max(maxY, cy + ch / 2);\n }\n }\n if (minX === Infinity || minY === Infinity) {\n group.x = group.x ?? 0;\n group.y = group.y ?? 0;\n group.width = group.width ?? 0;\n group.height = group.height ?? 0;\n } else {\n const pad = group.padding ?? 20;\n const horizontalPad = group.parentId ? pad : 2 * topLaneHorizontalPadding(group);\n const verticalPad = pad;\n const w = Math.max(0, maxX - minX) + horizontalPad;\n const h = Math.max(0, maxY - minY) + verticalPad;\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n group.x = cx;\n group.y = cy;\n group.width = w;\n group.height = h;\n groupBounds.set(group.id, { minX, maxX, minY, maxY });\n }\n }\n if (topLevelGroups.length > 0 && groupBounds.size > 0) {\n let globalMinY = Infinity;\n let globalMaxY = -Infinity;\n let maxPad = 0;\n for (const lane of topLevelGroups) {\n const pad = lane.padding ?? 20;\n if (pad > maxPad) {\n maxPad = pad;\n }\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n globalMinY = Math.min(globalMinY, b.minY);\n globalMaxY = Math.max(globalMaxY, b.maxY);\n }\n if (globalMinY !== Infinity && globalMaxY !== -Infinity) {\n const contentHeight = Math.max(0, globalMaxY - globalMinY);\n const minHeaderMargin = 36;\n const verticalMargin = Math.max(maxPad, minHeaderMargin);\n const laneHeight = contentHeight + 2 * verticalMargin;\n const centerY = (globalMinY + globalMaxY) / 2;\n for (const lane of topLevelGroups) {\n lane.y = centerY;\n lane.height = laneHeight;\n lane.swimlaneContentTop = globalMinY;\n }\n const sortedLanes = [...topLevelGroups].sort((a, b) => {\n const ax = a.x ?? 0;\n const bx = b.x ?? 0;\n return ax - bx;\n });\n const laneIds = [];\n const centers = [];\n const baseWidths = [];\n for (const lane of sortedLanes) {\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n const contentWidth = Math.max(0, b.maxX - b.minX) + 2 * topLaneHorizontalPadding(lane);\n const cx = (b.minX + b.maxX) / 2;\n laneIds.push(lane.id);\n centers.push(cx);\n baseWidths.push(contentWidth);\n }\n const count = laneIds.length;\n if (count > 0) {\n const laneWidths = /* @__PURE__ */ new Map();\n if (count === 1) {\n laneWidths.set(laneIds[0], baseWidths[0]);\n } else {\n const d = [];\n for (let i = 0; i < count - 1; i++) {\n d.push(centers[i + 1] - centers[i]);\n }\n const u = new Array(count);\n u[0] = 0;\n for (let i = 0; i < count - 1; i++) {\n u[i + 1] = 2 * d[i] - u[i];\n }\n let lowerBound = 0;\n let upperBound = Number.POSITIVE_INFINITY;\n for (let i = 0; i < count; i++) {\n const baseW = baseWidths[i];\n if (i % 2 === 0) {\n lowerBound = Math.max(lowerBound, baseW - u[i]);\n } else {\n upperBound = Math.min(upperBound, u[i] - baseW);\n }\n }\n let x = lowerBound;\n if (lowerBound <= upperBound) {\n x = (lowerBound + upperBound) / 2;\n } else {\n x = lowerBound;\n }\n for (let i = 0; i < count; i++) {\n const w = u[i] + (i % 2 === 0 ? x : -x);\n const finalWidth = Math.max(baseWidths[i], w);\n laneWidths.set(laneIds[i], finalWidth);\n }\n }\n for (const lane of topLevelGroups) {\n const w = laneWidths.get(lane.id);\n if (w != null) {\n lane.width = w;\n }\n assignTopLaneTitleRect(lane);\n }\n }\n }\n }\n}\n__name(writeBackToLayoutData, \"writeBackToLayoutData\");\n\n// src/rendering-util/layout-algorithms/swimlanes/edgeLabelNodes.ts\nvar EDGE_LABEL_LOG_PREFIX = \"[EdgeLabelNodes]\";\nfunction createEdgeLabelNodes(data) {\n const nodesToAdd = [];\n const layoutOnlyEdges = [];\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data.nodes) {\n nodeById.set(node.id, node);\n }\n for (const edge of data.edges) {\n if (!edge.label || edge.label.length === 0) {\n continue;\n }\n if (edge.isLayoutOnly) {\n continue;\n }\n if (edge.labelNodeId) {\n continue;\n }\n const sourceNode = edge.start ? nodeById.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeById.get(edge.end) : void 0;\n if (!sourceNode || !targetNode) {\n log.warn(EDGE_LABEL_LOG_PREFIX, `Edge ${edge.id} has missing source or target node`);\n continue;\n }\n const labelNodeId = `edge-label-${edge.start}-${edge.end}-${edge.id}`;\n const isCrossLane = sourceNode.parentId !== targetNode.parentId;\n const labelLane = isCrossLane ? targetNode.parentId : sourceNode.parentId;\n const labelNode = {\n id: labelNodeId,\n label: edge.label,\n edgeStart: edge.start ?? \"\",\n edgeEnd: edge.end ?? \"\",\n shape: \"labelRect\",\n width: 0,\n // populated when rendered / applied from fixture\n height: 0,\n isEdgeLabel: true,\n isDummy: true,\n parentId: labelLane,\n isGroup: false,\n labelStyle: Array.isArray(edge.labelStyle) ? edge.labelStyle[0] : edge.labelStyle ?? \"\",\n ...sourceNode.dir ? { dir: sourceNode.dir } : {}\n };\n nodesToAdd.push(labelNode);\n edge.labelNodeId = labelNodeId;\n edge.label = void 0;\n edge.text = void 0;\n const toLabelVirtual = {\n id: `${edge.id}-to-label`,\n start: edge.start,\n end: labelNodeId,\n type: \"normal\",\n isLayoutOnly: true\n };\n const fromLabelVirtual = {\n id: `${edge.id}-from-label`,\n start: labelNodeId,\n end: edge.end,\n type: \"normal\",\n isLayoutOnly: true\n };\n layoutOnlyEdges.push(toLabelVirtual, fromLabelVirtual);\n }\n const newNodes = [...data.nodes, ...nodesToAdd];\n const newEdges = [...data.edges, ...layoutOnlyEdges];\n return {\n ...data,\n nodes: newNodes,\n edges: newEdges\n };\n}\n__name(createEdgeLabelNodes, \"createEdgeLabelNodes\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/geometry.ts\nvar EPS = 1e-3;\nfunction measuredNodeRect(node) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n return width > 0 && height > 0 ? { cx, cy, rect: rectFromCenterSize(cx, cy, width, height) } : void 0;\n}\n__name(measuredNodeRect, \"measuredNodeRect\");\nfunction nodeBoundsInfoFor(node) {\n if (node.isGroup) {\n return void 0;\n }\n const measured = measuredNodeRect(node);\n if (!measured) {\n return void 0;\n }\n const id = String(node.id ?? \"\");\n return {\n id,\n cx: measured.cx,\n cy: measured.cy,\n rect: measured.rect\n };\n}\n__name(nodeBoundsInfoFor, \"nodeBoundsInfoFor\");\nfunction samePoint(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon && Math.abs(a.y - b.y) < epsilon;\n}\n__name(samePoint, \"samePoint\");\nfunction sameX(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon;\n}\n__name(sameX, \"sameX\");\nfunction sameY(a, b, epsilon = EPS) {\n return Math.abs(a.y - b.y) < epsilon;\n}\n__name(sameY, \"sameY\");\nfunction isHorizontalSegment(a, b, epsilon = EPS) {\n return sameY(a, b, epsilon) && Math.abs(a.x - b.x) > epsilon;\n}\n__name(isHorizontalSegment, \"isHorizontalSegment\");\nfunction isVerticalSegment(a, b, epsilon = EPS) {\n return sameX(a, b, epsilon) && Math.abs(a.y - b.y) > epsilon;\n}\n__name(isVerticalSegment, \"isVerticalSegment\");\nfunction overlapLength(a1, a2, b1, b2) {\n return Math.max(\n 0,\n Math.min(Math.max(a1, a2), Math.max(b1, b2)) - Math.max(Math.min(a1, a2), Math.min(b1, b2))\n );\n}\n__name(overlapLength, \"overlapLength\");\nfunction sameAxisSegmentOverlapLength(a, b, epsilon = EPS) {\n if (a.horizontal && b.horizontal && sameY(a.a, b.a, epsilon)) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x);\n }\n if (a.vertical && b.vertical && sameX(a.a, b.a, epsilon)) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y);\n }\n return 0;\n}\n__name(sameAxisSegmentOverlapLength, \"sameAxisSegmentOverlapLength\");\nfunction orthogonalSegmentsForPoints(points, epsilon = EPS) {\n const result = [];\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n const horizontal = isHorizontalSegment(a, b, epsilon);\n const vertical = isVerticalSegment(a, b, epsilon);\n if (horizontal || vertical) {\n result.push({ index: i, a, b, horizontal, vertical });\n }\n }\n return result;\n}\n__name(orthogonalSegmentsForPoints, \"orthogonalSegmentsForPoints\");\nfunction countOrthogonalBends(points, epsilon = EPS) {\n const segments = orthogonalSegmentsForPoints(points, epsilon);\n let bends = 0;\n for (let i = 1; i < segments.length; i++) {\n if (segments[i - 1].horizontal !== segments[i].horizontal) {\n bends++;\n }\n }\n return bends;\n}\n__name(countOrthogonalBends, \"countOrthogonalBends\");\nfunction dedupeConsecutivePoints(points, epsilon = EPS) {\n const result = [];\n for (const point of points) {\n const last = result.length > 0 ? result[result.length - 1] : void 0;\n if (!last || !samePoint(last, point, epsilon)) {\n result.push({ x: point.x, y: point.y });\n }\n }\n return result;\n}\n__name(dedupeConsecutivePoints, \"dedupeConsecutivePoints\");\nfunction classifyThreeSegmentRoute(points, epsilon = EPS) {\n if (!points || points.length !== 4) {\n return void 0;\n }\n const [p0, p1, p2, p3] = points;\n const isHVH = isHorizontalSegment(p0, p1, epsilon) && isVerticalSegment(p1, p2, epsilon) && isHorizontalSegment(p2, p3, epsilon);\n if (isHVH) {\n return { kind: \"HVH\", p0, p1, p2, p3 };\n }\n const isVHV = isVerticalSegment(p0, p1, epsilon) && isHorizontalSegment(p1, p2, epsilon) && isVerticalSegment(p2, p3, epsilon);\n return isVHV ? { kind: \"VHV\", p0, p1, p2, p3 } : void 0;\n}\n__name(classifyThreeSegmentRoute, \"classifyThreeSegmentRoute\");\nfunction segmentBoundsOverlapRect(a, b, rect, buffer = 0) {\n const segMinX = Math.min(a.x, b.x);\n const segMaxX = Math.max(a.x, b.x);\n const segMinY = Math.min(a.y, b.y);\n const segMaxY = Math.max(a.y, b.y);\n return segMaxX > rect.left - buffer && segMinX < rect.right + buffer && segMaxY > rect.top - buffer && segMinY < rect.bottom + buffer;\n}\n__name(segmentBoundsOverlapRect, \"segmentBoundsOverlapRect\");\nfunction pointInsideRect(point, rect, buffer = 0) {\n return point.x > rect.left + buffer && point.x < rect.right - buffer && point.y > rect.top + buffer && point.y < rect.bottom - buffer;\n}\n__name(pointInsideRect, \"pointInsideRect\");\nfunction rectContainsRect(outer, inner) {\n return outer.left <= inner.left && outer.right >= inner.right && outer.top <= inner.top && outer.bottom >= inner.bottom;\n}\n__name(rectContainsRect, \"rectContainsRect\");\nfunction rectsOverlap(a, b) {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n__name(rectsOverlap, \"rectsOverlap\");\nfunction inflateRect(rect, margin) {\n return {\n left: rect.left - margin,\n right: rect.right + margin,\n top: rect.top - margin,\n bottom: rect.bottom + margin\n };\n}\n__name(inflateRect, \"inflateRect\");\nfunction rectFromCenterSize(cx, cy, width, height) {\n return {\n left: cx - width / 2,\n right: cx + width / 2,\n top: cy - height / 2,\n bottom: cy + height / 2\n };\n}\n__name(rectFromCenterSize, \"rectFromCenterSize\");\nfunction rectOfNodeBounds(node) {\n return measuredNodeRect(node)?.rect;\n}\n__name(rectOfNodeBounds, \"rectOfNodeBounds\");\nfunction portForRectSide(node, side) {\n switch (side) {\n case \"top\":\n return { x: node.cx, y: node.rect.top };\n case \"bottom\":\n return { x: node.cx, y: node.rect.bottom };\n case \"left\":\n return { x: node.rect.left, y: node.cy };\n case \"right\":\n return { x: node.rect.right, y: node.cy };\n }\n}\n__name(portForRectSide, \"portForRectSide\");\nfunction buildOrthogonalPortPath(src, srcSide, dst, dstSide, anchor, epsilon = EPS) {\n const srcH = srcSide === \"left\" || srcSide === \"right\";\n const dstH = dstSide === \"left\" || dstSide === \"right\";\n if (srcH && dstH) {\n const opposingDir = srcSide === \"right\" && dstSide === \"left\" && src.x < dst.x || srcSide === \"left\" && dstSide === \"right\" && src.x > dst.x;\n if (opposingDir) {\n if (sameY(src, dst, epsilon)) {\n return [src, dst];\n }\n const midX = (src.x + dst.x) / 2;\n return [src, { x: midX, y: src.y }, { x: midX, y: dst.y }, dst];\n }\n if (srcSide === dstSide) {\n if (sameY(src, dst, epsilon)) {\n return void 0;\n }\n const intX = srcSide === \"left\" ? Math.min(src.x, dst.x) - anchor : Math.max(src.x, dst.x) + anchor;\n return [src, { x: intX, y: src.y }, { x: intX, y: dst.y }, dst];\n }\n return void 0;\n }\n if (!srcH && !dstH) {\n if (srcSide === dstSide) {\n if (sameX(src, dst, epsilon)) {\n return void 0;\n }\n const intY = srcSide === \"top\" ? Math.min(src.y, dst.y) - anchor : Math.max(src.y, dst.y) + anchor;\n return [src, { x: src.x, y: intY }, { x: dst.x, y: intY }, dst];\n }\n const sameDir = srcSide === \"bottom\" && dstSide === \"top\" && src.y < dst.y || srcSide === \"top\" && dstSide === \"bottom\" && src.y > dst.y;\n if (!sameDir) {\n return void 0;\n }\n if (sameX(src, dst, epsilon)) {\n return [src, dst];\n }\n const midY = (src.y + dst.y) / 2;\n return [src, { x: src.x, y: midY }, { x: dst.x, y: midY }, dst];\n }\n if (srcH && !dstH) {\n const sameDirSrc2 = srcSide === \"right\" && dst.x > src.x || srcSide === \"left\" && dst.x < src.x;\n const sameDirDst2 = dstSide === \"top\" && src.y < dst.y || dstSide === \"bottom\" && src.y > dst.y;\n return sameDirSrc2 && sameDirDst2 ? [src, { x: dst.x, y: src.y }, dst] : void 0;\n }\n const sameDirSrc = srcSide === \"bottom\" && dst.y > src.y || srcSide === \"top\" && dst.y < src.y;\n const sameDirDst = dstSide === \"left\" && src.x < dst.x || dstSide === \"right\" && src.x > dst.x;\n return sameDirSrc && sameDirDst ? [src, { x: src.x, y: dst.y }, dst] : void 0;\n}\n__name(buildOrthogonalPortPath, \"buildOrthogonalPortPath\");\nfunction buildSameSideTrackPath(src, side, dst, track) {\n return side === \"left\" || side === \"right\" ? [src, { x: track, y: src.y }, { x: track, y: dst.y }, dst] : [src, { x: src.x, y: track }, { x: dst.x, y: track }, dst];\n}\n__name(buildSameSideTrackPath, \"buildSameSideTrackPath\");\nfunction collectRealNodeBounds(nodes) {\n const nodeInfoById = /* @__PURE__ */ new Map();\n const realNodeRects = [];\n for (const node of nodes) {\n if (node.isEdgeLabel) {\n continue;\n }\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n nodeInfoById.set(info.id, info);\n realNodeRects.push({ id: info.id, rect: info.rect });\n }\n return { nodeInfoById, realNodeRects };\n}\n__name(collectRealNodeBounds, \"collectRealNodeBounds\");\nfunction collectNodeRectEntries(nodes) {\n const realNodeRects = [];\n const labelNodeRects = [];\n for (const node of nodes) {\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n const entry = { id: info.id, rect: info.rect };\n if (node.isEdgeLabel) {\n labelNodeRects.push(entry);\n } else {\n realNodeRects.push(entry);\n }\n }\n return { realNodeRects, labelNodeRects };\n}\n__name(collectNodeRectEntries, \"collectNodeRectEntries\");\nfunction collectLayoutNodeRects(nodes, { includeEdgeLabels = true } = {}) {\n const result = [];\n for (const node of nodes) {\n if (node.isGroup || !includeEdgeLabels && node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n result.push({\n nodeId: node.id,\n ...rectFromCenterSize(cx, cy, width, height)\n });\n }\n return result;\n}\n__name(collectLayoutNodeRects, \"collectLayoutNodeRects\");\nfunction getNodePairGeometry(edge, nodeInfoById, epsilon = EPS) {\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n return void 0;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n return void 0;\n }\n return {\n srcId,\n dstId,\n srcInfo,\n dstInfo,\n collinearX: Math.abs(srcInfo.cx - dstInfo.cx) < epsilon,\n collinearY: Math.abs(srcInfo.cy - dstInfo.cy) < epsilon\n };\n}\n__name(getNodePairGeometry, \"getNodePairGeometry\");\nfunction segmentHitsAnyRect(a, b, rects, excludeIds = [], shrink = 0) {\n for (const entry of rects) {\n if (excludeIds.includes(entry.id)) {\n continue;\n }\n if (segmentBoundsOverlapRect(a, b, entry.rect, -shrink)) {\n return true;\n }\n }\n return false;\n}\n__name(segmentHitsAnyRect, \"segmentHitsAnyRect\");\nfunction orthogonalSegmentsCross(a1, b1, a2, b2, epsilon = EPS, endpointTolerance = 1e-6) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1H && s2H || s1V && s2V) {\n return false;\n }\n if (!(s1H || s1V) || !(s2H || s2V)) {\n return false;\n }\n const horiz = s1H ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = s1V ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const hY = horiz.a.y;\n const hX1 = Math.min(horiz.a.x, horiz.b.x);\n const hX2 = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vY1 = Math.min(vert.a.y, vert.b.y);\n const vY2 = Math.max(vert.a.y, vert.b.y);\n if (vX < hX1 || vX > hX2 || hY < vY1 || hY > vY2) {\n return false;\n }\n const matchesHorizEndpoint = Math.abs(vX - horiz.a.x) < endpointTolerance && Math.abs(hY - horiz.a.y) < endpointTolerance || Math.abs(vX - horiz.b.x) < endpointTolerance && Math.abs(hY - horiz.b.y) < endpointTolerance;\n const matchesVertEndpoint = Math.abs(vX - vert.a.x) < endpointTolerance && Math.abs(hY - vert.a.y) < endpointTolerance || Math.abs(vX - vert.b.x) < endpointTolerance && Math.abs(hY - vert.b.y) < endpointTolerance;\n return !(matchesHorizEndpoint && matchesVertEndpoint);\n}\n__name(orthogonalSegmentsCross, \"orthogonalSegmentsCross\");\nfunction sameAxisSegmentsOverlap(a1, b1, a2, b2, epsilon = EPS) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1V && s2V && sameX(a1, a2, epsilon)) {\n return overlapLength(a1.y, b1.y, a2.y, b2.y) > epsilon;\n }\n if (s1H && s2H && sameY(a1, a2, epsilon)) {\n return overlapLength(a1.x, b1.x, a2.x, b2.x) > epsilon;\n }\n return false;\n}\n__name(sameAxisSegmentsOverlap, \"sameAxisSegmentsOverlap\");\nfunction segmentConflictsWithAnyEdge(a, b, edges, excludeEdge, {\n epsilon = EPS,\n skipDegenerateOther = false\n} = {}) {\n for (const other of edges) {\n if (other === excludeEdge || other.isLayoutOnly) {\n continue;\n }\n const points = other.points;\n if (!points || points.length < 2) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n const oa = points[i];\n const ob = points[i + 1];\n if (skipDegenerateOther && samePoint(oa, ob, epsilon)) {\n continue;\n }\n if (orthogonalSegmentsCross(a, b, oa, ob, epsilon) || sameAxisSegmentsOverlap(a, b, oa, ob, epsilon)) {\n return true;\n }\n }\n }\n return false;\n}\n__name(segmentConflictsWithAnyEdge, \"segmentConflictsWithAnyEdge\");\nfunction orthogonalSegmentsStrictlyCross(a1, b1, a2, b2, epsilon = EPS) {\n const aHoriz = sameY(a1, b1, epsilon);\n const aVert = sameX(a1, b1, epsilon);\n const bHoriz = sameY(a2, b2, epsilon);\n const bVert = sameX(a2, b2, epsilon);\n if (!(aHoriz && bVert || aVert && bHoriz)) {\n return false;\n }\n const horiz = aHoriz ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = aHoriz ? { a: a2, b: b2 } : { a: a1, b: b1 };\n const hY = horiz.a.y;\n const hXmin = Math.min(horiz.a.x, horiz.b.x);\n const hXmax = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vYmin = Math.min(vert.a.y, vert.b.y);\n const vYmax = Math.max(vert.a.y, vert.b.y);\n return vX > hXmin + epsilon && vX < hXmax - epsilon && hY > vYmin + epsilon && hY < vYmax - epsilon;\n}\n__name(orthogonalSegmentsStrictlyCross, \"orthogonalSegmentsStrictlyCross\");\nfunction strictlyBetween(value, a, b) {\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n return value > lo + EPS && value < hi - EPS;\n}\n__name(strictlyBetween, \"strictlyBetween\");\nfunction isCollinearIntermediate(prev, cur, next) {\n if (sameX(prev, cur) && sameX(cur, next)) {\n return strictlyBetween(cur.y, prev.y, next.y);\n }\n if (sameY(prev, cur) && sameY(cur, next)) {\n return strictlyBetween(cur.x, prev.x, next.x);\n }\n return false;\n}\n__name(isCollinearIntermediate, \"isCollinearIntermediate\");\nfunction simplifyPolylineOnce(points) {\n let changed = false;\n const out = [];\n for (let i = 0; i < points.length; i++) {\n const prev = out[out.length - 1];\n const cur = points[i];\n const next = i + 1 < points.length ? points[i + 1] : void 0;\n if (prev && next) {\n if (samePoint(prev, next)) {\n i++;\n changed = true;\n continue;\n }\n if (isCollinearIntermediate(prev, cur, next)) {\n changed = true;\n continue;\n }\n }\n out.push(cur);\n }\n return { points: out, changed };\n}\n__name(simplifyPolylineOnce, \"simplifyPolylineOnce\");\nfunction orthogonalizePolyline(pts) {\n const cleaned = [pts[0]];\n for (let i = 1; i < pts.length; i++) {\n const prev = cleaned[cleaned.length - 1];\n const curr = pts[i];\n if (!sameX(prev, curr) && !sameY(prev, curr)) {\n const prevPrev = cleaned.length >= 2 ? cleaned[cleaned.length - 2] : void 0;\n const incomingVertical = prevPrev ? sameX(prevPrev, prev) : false;\n const corner = incomingVertical ? { x: prev.x, y: curr.y } : { x: curr.x, y: prev.y };\n cleaned.push(corner);\n }\n cleaned.push(curr);\n }\n const deduped = [];\n for (const p of cleaned) {\n const last = deduped[deduped.length - 1];\n if (!last || !samePoint(last, p)) {\n deduped.push(p);\n }\n }\n return deduped;\n}\n__name(orthogonalizePolyline, \"orthogonalizePolyline\");\nfunction simplifyPolyline(pts) {\n if (pts.length < 3) {\n return pts;\n }\n let work = [...pts];\n for (let guard = 0; guard < 32; guard++) {\n const result = simplifyPolylineOnce(work);\n work = result.points;\n if (!result.changed) {\n break;\n }\n }\n return work;\n}\n__name(simplifyPolyline, \"simplifyPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/endpointClip.ts\nvar EPS2 = 1e-3;\nvar INSIDE_EPS = 0.5;\nvar CORNER_CLEARANCE = 4;\nfunction endpointContextFor(edge, nodeByIdMap, minPoints) {\n const candidate = edge;\n if (candidate.isLayoutOnly || !candidate.points || candidate.points.length < minPoints) {\n return void 0;\n }\n const src = candidate.start ? nodeByIdMap.get(candidate.start) : void 0;\n const dst = candidate.end ? nodeByIdMap.get(candidate.end) : void 0;\n return {\n edge: candidate,\n points: candidate.points,\n srcRect: src ? rectOfNodeBounds(src) : void 0,\n dstRect: dst ? rectOfNodeBounds(dst) : void 0\n };\n}\n__name(endpointContextFor, \"endpointContextFor\");\nfunction segmentEnterPoint(outside, inside, r) {\n if (sameY(outside, inside, EPS2)) {\n const x = outside.x < r.left ? r.left : r.right;\n return { x, y: outside.y };\n }\n if (sameX(outside, inside, EPS2)) {\n const y = outside.y < r.top ? r.top : r.bottom;\n return { x: outside.x, y };\n }\n return {\n x: Math.min(r.right, Math.max(r.left, outside.x)),\n y: Math.min(r.bottom, Math.max(r.top, outside.y))\n };\n}\n__name(segmentEnterPoint, \"segmentEnterPoint\");\nfunction clipEndpoint(points, rect, atStart) {\n const step = atStart ? 1 : -1;\n let outsideIndex = atStart ? 0 : points.length - 1;\n while (outsideIndex >= 0 && outsideIndex < points.length && pointInsideRect(points[outsideIndex], rect, INSIDE_EPS)) {\n outsideIndex += step;\n }\n if (outsideIndex < 0 || outsideIndex >= points.length) {\n return points;\n }\n const insideIndex = outsideIndex - step;\n if (insideIndex < 0 || insideIndex >= points.length) {\n return points;\n }\n const entry = segmentEnterPoint(points[outsideIndex], points[insideIndex], rect);\n return atStart ? [entry, ...points.slice(outsideIndex)] : [...points.slice(0, outsideIndex + 1), entry];\n}\n__name(clipEndpoint, \"clipEndpoint\");\nfunction clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n let next = [...context.points];\n if (context.srcRect) {\n next = clipEndpoint(next, context.srcRect, true);\n }\n if (context.dstRect) {\n next = clipEndpoint(next, context.dstRect, false);\n }\n next = simplifyPolyline(orthogonalizePolyline(next));\n next = clearStraightEndpointCornerConnections(next, context.srcRect, context.dstRect);\n context.edge.points = simplifyPolyline(orthogonalizePolyline(next));\n }\n}\n__name(clipEdgeEndpointsToNodeBoundaries, \"clipEdgeEndpointsToNodeBoundaries\");\nfunction snapEndpointToBoundary(inner, endpoint, r, useApproachSide = false) {\n if (sameY(inner, endpoint, EPS2)) {\n if (endpoint.y < r.top - EPS2 || endpoint.y > r.bottom + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.x < r.left - EPS2) {\n return { x: r.left, y: inner.y };\n }\n if (inner.x > r.right + EPS2) {\n return { x: r.right, y: inner.y };\n }\n }\n const toLeft = Math.abs(endpoint.x - r.left) <= Math.abs(endpoint.x - r.right);\n return { x: toLeft ? r.left : r.right, y: inner.y };\n }\n if (sameX(inner, endpoint, EPS2)) {\n if (endpoint.x < r.left - EPS2 || endpoint.x > r.right + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.y < r.top - EPS2) {\n return { x: inner.x, y: r.top };\n }\n if (inner.y > r.bottom + EPS2) {\n return { x: inner.x, y: r.bottom };\n }\n }\n const toTop = Math.abs(endpoint.y - r.top) <= Math.abs(endpoint.y - r.bottom);\n return { x: inner.x, y: toTop ? r.top : r.bottom };\n }\n return endpoint;\n}\n__name(snapEndpointToBoundary, \"snapEndpointToBoundary\");\nfunction firstDistinctAdjacent(points, endpointIndex, step) {\n const endpoint = points[endpointIndex];\n for (let index = endpointIndex + step; index >= 0 && index < points.length; index += step) {\n const candidate = points[index];\n if (!samePoint(candidate, endpoint, EPS2)) {\n return candidate;\n }\n }\n return points[endpointIndex + step];\n}\n__name(firstDistinctAdjacent, \"firstDistinctAdjacent\");\nfunction cornerClearanceRange(min, max) {\n const lo = min + CORNER_CLEARANCE;\n const hi = max - CORNER_CLEARANCE;\n return lo <= hi ? { lo, hi } : { lo: (min + max) / 2, hi: (min + max) / 2 };\n}\n__name(cornerClearanceRange, \"cornerClearanceRange\");\nfunction clampToCornerClearance(value, min, max) {\n const { lo, hi } = cornerClearanceRange(min, max);\n return Math.min(hi, Math.max(lo, value));\n}\n__name(clampToCornerClearance, \"clampToCornerClearance\");\nfunction intersectRanges(ranges) {\n const lo = Math.max(...ranges.map((range) => range.lo));\n const hi = Math.min(...ranges.map((range) => range.hi));\n if (lo > hi) {\n return void 0;\n }\n return { lo, hi };\n}\n__name(intersectRanges, \"intersectRanges\");\nfunction clearanceRangeForSide(r, side) {\n return side === \"left\" || side === \"right\" ? cornerClearanceRange(r.top, r.bottom) : cornerClearanceRange(r.left, r.right);\n}\n__name(clearanceRangeForSide, \"clearanceRangeForSide\");\nfunction terminalSideForSegment(endpoint, adjacent, r) {\n const yWithin = endpoint.y >= r.top - EPS2 && endpoint.y <= r.bottom + EPS2;\n const xWithin = endpoint.x >= r.left - EPS2 && endpoint.x <= r.right + EPS2;\n if (sameY(endpoint, adjacent, EPS2) && yWithin) {\n if (Math.abs(endpoint.x - r.left) < EPS2) {\n return \"left\";\n }\n if (Math.abs(endpoint.x - r.right) < EPS2) {\n return \"right\";\n }\n }\n if (sameX(endpoint, adjacent, EPS2) && xWithin) {\n if (Math.abs(endpoint.y - r.top) < EPS2) {\n return \"top\";\n }\n if (Math.abs(endpoint.y - r.bottom) < EPS2) {\n return \"bottom\";\n }\n }\n return void 0;\n}\n__name(terminalSideForSegment, \"terminalSideForSegment\");\nfunction isHorizontalSide(side) {\n return side === \"left\" || side === \"right\";\n}\n__name(isHorizontalSide, \"isHorizontalSide\");\nfunction straightClearanceRange(start, end, srcRect, dstRect, horizontal) {\n const ranges = [];\n const srcSide = srcRect ? terminalSideForSegment(start, end, srcRect) : void 0;\n const dstSide = dstRect ? terminalSideForSegment(end, start, dstRect) : void 0;\n if (srcRect && srcSide && isHorizontalSide(srcSide) === horizontal) {\n ranges.push(clearanceRangeForSide(srcRect, srcSide));\n }\n if (dstRect && dstSide && isHorizontalSide(dstSide) === horizontal) {\n ranges.push(clearanceRangeForSide(dstRect, dstSide));\n }\n return ranges.length > 0 ? intersectRanges(ranges) : void 0;\n}\n__name(straightClearanceRange, \"straightClearanceRange\");\nfunction clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, horizontal) {\n const range = straightClearanceRange(start, end, srcRect, dstRect, horizontal);\n if (!range) {\n return void 0;\n }\n const current = horizontal ? start.y : start.x;\n const next = Math.min(range.hi, Math.max(range.lo, current));\n if (Math.abs(next - current) < EPS2) {\n return void 0;\n }\n return horizontal ? [\n { x: start.x, y: next },\n { x: end.x, y: next }\n ] : [\n { x: next, y: start.y },\n { x: next, y: end.y }\n ];\n}\n__name(clearStraightEndpointCornerAxis, \"clearStraightEndpointCornerAxis\");\nfunction clearStraightEndpointCornerConnections(points, srcRect, dstRect) {\n if (points.length !== 2) {\n return points;\n }\n const [start, end] = points;\n if (sameY(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, true) ?? points;\n }\n if (sameX(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, false) ?? points;\n }\n return points;\n}\n__name(clearStraightEndpointCornerConnections, \"clearStraightEndpointCornerConnections\");\nfunction cornerClearedEndpoint(endpoint, r, side) {\n return isHorizontalSide(side) ? { x: endpoint.x, y: clampToCornerClearance(endpoint.y, r.top, r.bottom) } : { x: clampToCornerClearance(endpoint.x, r.left, r.right), y: endpoint.y };\n}\n__name(cornerClearedEndpoint, \"cornerClearedEndpoint\");\nfunction moveCollinearEndpointRun(points, endpointIndex, step, endpoint, adjusted, horizontalTerminal) {\n const next = points.map((point) => ({ ...point }));\n for (let index = endpointIndex; index >= 0 && index < points.length; index += step) {\n const point = points[index];\n if (horizontalTerminal && !sameY(point, endpoint, EPS2)) {\n break;\n }\n if (!horizontalTerminal && !sameX(point, endpoint, EPS2)) {\n break;\n }\n if (horizontalTerminal) {\n next[index].y = adjusted.y;\n } else {\n next[index].x = adjusted.x;\n }\n }\n return next;\n}\n__name(moveCollinearEndpointRun, \"moveCollinearEndpointRun\");\nfunction clearEndpointCornerConnection(points, r, atStart) {\n if (points.length < 2) {\n return points;\n }\n const endpointIndex = atStart ? 0 : points.length - 1;\n const step = atStart ? 1 : -1;\n const endpoint = points[endpointIndex];\n const adjacent = firstDistinctAdjacent(points, endpointIndex, step);\n if (!adjacent) {\n return points;\n }\n const side = terminalSideForSegment(endpoint, adjacent, r);\n if (!side) {\n return points;\n }\n const horizontalTerminal = isHorizontalSide(side);\n const adjusted = cornerClearedEndpoint(endpoint, r, side);\n if (samePoint(endpoint, adjusted, EPS2)) {\n return points;\n }\n return moveCollinearEndpointRun(\n points,\n endpointIndex,\n step,\n endpoint,\n adjusted,\n horizontalTerminal\n );\n}\n__name(clearEndpointCornerConnection, \"clearEndpointCornerConnection\");\nfunction borderSideForSegment(a, b, r) {\n const xWithin = Math.min(a.x, b.x) >= r.left - EPS2 && Math.max(a.x, b.x) <= r.right + EPS2;\n const yWithin = Math.min(a.y, b.y) >= r.top - EPS2 && Math.max(a.y, b.y) <= r.bottom + EPS2;\n if (Math.abs(a.y - r.top) < EPS2 && Math.abs(b.y - r.top) < EPS2 && xWithin) {\n return \"top\";\n }\n if (Math.abs(a.y - r.bottom) < EPS2 && Math.abs(b.y - r.bottom) < EPS2 && xWithin) {\n return \"bottom\";\n }\n if (Math.abs(a.x - r.left) < EPS2 && Math.abs(b.x - r.left) < EPS2 && yWithin) {\n return \"left\";\n }\n if (Math.abs(a.x - r.right) < EPS2 && Math.abs(b.x - r.right) < EPS2 && yWithin) {\n return \"right\";\n }\n return void 0;\n}\n__name(borderSideForSegment, \"borderSideForSegment\");\nfunction leavesOutward(side, from, to, r) {\n switch (side) {\n case \"top\":\n return sameX(from, to, EPS2) && to.y < r.top - EPS2;\n case \"bottom\":\n return sameX(from, to, EPS2) && to.y > r.bottom + EPS2;\n case \"left\":\n return sameY(from, to, EPS2) && to.x < r.left - EPS2;\n case \"right\":\n return sameY(from, to, EPS2) && to.x > r.right + EPS2;\n }\n}\n__name(leavesOutward, \"leavesOutward\");\nfunction collapseOwnBorderStub(points, r, atStart) {\n if (points.length < 3) {\n return points;\n }\n if (atStart) {\n const side2 = borderSideForSegment(points[0], points[1], r);\n if (side2 && leavesOutward(side2, points[1], points[2], r)) {\n return points.slice(1);\n }\n return points;\n }\n const last = points.length - 1;\n const side = borderSideForSegment(points[last - 1], points[last], r);\n if (side && leavesOutward(side, points[last - 1], points[last - 2], r)) {\n return points.slice(0, last);\n }\n return points;\n}\n__name(collapseOwnBorderStub, \"collapseOwnBorderStub\");\nfunction snapAndCollapseEndpoints(points, srcRect, dstRect) {\n let next = points;\n if (srcRect) {\n const adjacent = firstDistinctAdjacent(next, 0, 1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[0], srcRect);\n if (snapped !== next[0]) {\n next = [snapped, ...next.slice(1)];\n }\n }\n next = collapseOwnBorderStub(next, srcRect, true);\n }\n if (dstRect) {\n const last = next.length - 1;\n const adjacent = firstDistinctAdjacent(next, last, -1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[last], dstRect, true);\n if (snapped !== next[last]) {\n next = [...next.slice(0, last), snapped];\n }\n }\n next = collapseOwnBorderStub(next, dstRect, false);\n }\n const straightCleared = clearStraightEndpointCornerConnections(next, srcRect, dstRect);\n if (straightCleared !== next || next.length === 2) {\n return straightCleared;\n }\n if (srcRect) {\n next = clearEndpointCornerConnection(next, srcRect, true);\n }\n if (dstRect) {\n next = clearEndpointCornerConnection(next, dstRect, false);\n }\n return next;\n}\n__name(snapAndCollapseEndpoints, \"snapAndCollapseEndpoints\");\nfunction prepareEdgeEndpointsForRenderer(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n const input = dedupeConsecutivePoints(context.points, EPS2);\n const newPts = snapAndCollapseEndpoints(input, context.srcRect, context.dstRect);\n if (newPts.length < 3) {\n context.edge.points = newPts;\n continue;\n }\n const duplicated = [\n newPts[0],\n { ...newPts[0] },\n ...newPts.slice(1, -1),\n newPts[newPts.length - 1],\n { ...newPts[newPts.length - 1] }\n ];\n context.edge.points = duplicated;\n }\n}\n__name(prepareEdgeEndpointsForRenderer, \"prepareEdgeEndpointsForRenderer\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/lrTransform.ts\nfunction buildNodeMap(nodes) {\n return new Map(nodes.map((node) => [node.id, node]));\n}\n__name(buildNodeMap, \"buildNodeMap\");\nfunction resolveTopLevelGroupId(node, nodeById) {\n let parentId = node.parentId;\n let topLevelGroupId = null;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n topLevelGroupId = parent.id;\n parentId = parent.parentId;\n }\n return topLevelGroupId;\n}\n__name(resolveTopLevelGroupId, \"resolveTopLevelGroupId\");\nfunction groupDepth(group, nodeById) {\n let depth = 0;\n let parentId = group.parentId;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n depth++;\n parentId = parent.parentId;\n }\n return depth;\n}\n__name(groupDepth, \"groupDepth\");\nfunction boundsForChildren(children) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x;\n const cy = child.y;\n if (typeof cx !== \"number\" || typeof cy !== \"number\") {\n continue;\n }\n const w = child.width ?? 0;\n const h = child.height ?? 0;\n minX = Math.min(minX, cx - w / 2);\n maxX = Math.max(maxX, cx + w / 2);\n minY = Math.min(minY, cy - h / 2);\n maxY = Math.max(maxY, cy + h / 2);\n }\n if (minX === Infinity || minY === Infinity) {\n return null;\n }\n return { minX, maxX, minY, maxY };\n}\n__name(boundsForChildren, \"boundsForChildren\");\nfunction applyGroupBounds(group, bounds) {\n const pad = group.padding ?? 20;\n group.x = (bounds.minX + bounds.maxX) / 2;\n group.y = (bounds.minY + bounds.maxY) / 2;\n group.width = Math.max(0, bounds.maxX - bounds.minX) + pad;\n group.height = Math.max(0, bounds.maxY - bounds.minY) + pad;\n}\n__name(applyGroupBounds, \"applyGroupBounds\");\nfunction recomputeNestedGroupBounds(nodes) {\n const nodeById = buildNodeMap(nodes);\n const groupsByDepth = nodes.filter((node) => node.isGroup && node.parentId).sort((a, b) => groupDepth(b, nodeById) - groupDepth(a, nodeById));\n for (const group of groupsByDepth) {\n const children = nodes.filter((node) => node.parentId === group.id);\n const bounds = boundsForChildren(children);\n if (bounds) {\n applyGroupBounds(group, bounds);\n }\n }\n}\n__name(recomputeNestedGroupBounds, \"recomputeNestedGroupBounds\");\nfunction mirrorAxis(layout, axis) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((node) => !node.isGroup);\n let min = Infinity;\n let max = -Infinity;\n for (const node of contentNodes) {\n const value = node[axis];\n if (typeof value !== \"number\") {\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return false;\n }\n const mirror = /* @__PURE__ */ __name((value) => min + max - value, \"mirror\");\n for (const node of nodes) {\n const value = node[axis];\n if (typeof value === \"number\") {\n node[axis] = mirror(value);\n }\n const titleRect = node.groupTitleRect;\n if (titleRect) {\n node.groupTitleRect = axis === \"x\" ? {\n ...titleRect,\n left: mirror(titleRect.right),\n right: mirror(titleRect.left)\n } : {\n ...titleRect,\n top: mirror(titleRect.bottom),\n bottom: mirror(titleRect.top)\n };\n }\n }\n for (const edge of edges) {\n for (const point of edge.points ?? []) {\n point[axis] = mirror(point[axis]);\n }\n }\n return true;\n}\n__name(mirrorAxis, \"mirrorAxis\");\nfunction applyBtDirectionTransform(layout) {\n const nodes = layout.nodes ?? [];\n if (!nodes.some((node) => !node.isGroup)) {\n return true;\n }\n return mirrorAxis(layout, \"y\");\n}\n__name(applyBtDirectionTransform, \"applyBtDirectionTransform\");\nfunction applyLrDirectionTransform(layout, direction = \"LR\") {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n let minX = Infinity;\n let minY = Infinity;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n if (x0 < minX) {\n minX = x0;\n }\n if (y0 < minY) {\n minY = y0;\n }\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) {\n return false;\n }\n const titleBandSize = 36;\n let totalWidth = 0;\n let totalHeight = 0;\n for (const n of contentNodes) {\n totalWidth += n.width ?? 0;\n totalHeight += n.height ?? 0;\n }\n const avgWidth = totalWidth / contentNodes.length;\n const avgHeight = totalHeight / contentNodes.length;\n const horizontalScaleFactor = avgHeight > 0 ? Math.max(1, avgWidth / avgHeight) : 1;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n n.x = newX;\n n.y = newY;\n }\n for (const e of edges) {\n if (!e.points) {\n continue;\n }\n for (const p of e.points) {\n const x0 = p.x;\n const y0 = p.y;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n p.x = newX;\n p.y = newY;\n }\n }\n recomputeNestedGroupBounds(nodes);\n const laneNodes = nodes.filter((n) => n.isGroup && !n.parentId);\n if (laneNodes.length === 0) {\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n }\n const nodeById = buildNodeMap(nodes);\n const childrenByLane = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n if (n.isGroup) {\n continue;\n }\n const laneId = resolveTopLevelGroupId(n, nodeById);\n if (!laneId) {\n continue;\n }\n const bucket = childrenByLane.get(laneId) ?? [];\n bucket.push(n);\n childrenByLane.set(laneId, bucket);\n }\n let maxPad = 0;\n for (const lane of laneNodes) {\n const pad = lane.padding ?? 0;\n if (pad > maxPad) {\n maxPad = pad;\n }\n }\n const laneBounds = [];\n let globalMinXChild = Infinity;\n let globalMaxXChild = -Infinity;\n for (const lane of laneNodes) {\n const children = childrenByLane.get(lane.id) ?? [];\n const bounds = boundsForChildren(children);\n if (!bounds) {\n continue;\n }\n globalMinXChild = Math.min(globalMinXChild, bounds.minX);\n globalMaxXChild = Math.max(globalMaxXChild, bounds.maxX);\n laneBounds.push({\n lane,\n contentTop: bounds.minY,\n contentBottom: bounds.maxY,\n centerY: (bounds.minY + bounds.maxY) / 2\n });\n }\n if (globalMinXChild === Infinity || globalMaxXChild === -Infinity) {\n return true;\n }\n const fullContentWidth = Math.max(0, globalMaxXChild - globalMinXChild);\n const horizontalMargin = Math.max(maxPad, 10);\n const bodyWidth = fullContentWidth + 2 * horizontalMargin;\n const laneWidth = titleBandSize + bodyWidth;\n const bodyCenter = (globalMinXChild + globalMaxXChild) / 2;\n const bodyLeft = bodyCenter - bodyWidth / 2;\n const laneLeft = bodyLeft - titleBandSize;\n const centerX = laneLeft + laneWidth / 2;\n const verticalMargin = Math.max(maxPad, titleBandSize);\n laneBounds.sort((a, b) => a.centerY - b.centerY);\n for (let i = 0; i < laneBounds.length; i++) {\n const curr = laneBounds[i];\n let laneTop;\n let laneBottom;\n if (i === 0) {\n laneTop = curr.contentTop - verticalMargin;\n } else {\n const prev = laneBounds[i - 1];\n laneTop = (prev.contentBottom + curr.contentTop) / 2;\n }\n if (i === laneBounds.length - 1) {\n laneBottom = curr.contentBottom + verticalMargin;\n } else {\n const next = laneBounds[i + 1];\n laneBottom = (curr.contentBottom + next.contentTop) / 2;\n }\n const laneHeight = Math.max(0, laneBottom - laneTop);\n const centerY = (laneTop + laneBottom) / 2;\n curr.lane.x = centerX;\n curr.lane.y = centerY;\n curr.lane.width = laneWidth;\n curr.lane.height = laneHeight;\n curr.lane.swimlaneContentTop = curr.contentTop;\n curr.lane.groupTitleRect = {\n left: laneLeft,\n right: laneLeft + titleBandSize,\n top: laneTop,\n bottom: laneBottom\n };\n }\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n}\n__name(applyLrDirectionTransform, \"applyLrDirectionTransform\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/portSwap.ts\nvar EPS3 = 1e-6;\nvar MIN_PORT_SPACING = 8;\nvar PORT_SHIFT = MIN_PORT_SPACING;\nvar TRY_DELTAS = [0, PORT_SHIFT, -PORT_SHIFT, 2 * PORT_SHIFT, -2 * PORT_SHIFT];\nfunction portSwapToLShape(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 4) {\n continue;\n }\n const route = classifyThreeSegmentRoute(dedupeConsecutivePoints(pts, EPS3), EPS3);\n if (!route) {\n continue;\n }\n const { p3 } = route;\n const isHVH = route.kind === \"HVH\";\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS3);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX || collinearY) {\n continue;\n }\n let newPts;\n const srcRect = srcInfo.rect;\n for (const delta of TRY_DELTAS) {\n let np0;\n let np1;\n let np2;\n if (isHVH) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n const newSrcY = dstBelow ? srcRect.bottom : srcRect.top;\n const newSrcX = srcInfo.cx + delta;\n if (newSrcX <= srcRect.left + EPS3 || newSrcX >= srcRect.right - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: newSrcX, y: p3.y };\n np2 = { x: p3.x, y: p3.y };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n const newSrcX = dstEast ? srcRect.right : srcRect.left;\n const newSrcY = srcInfo.cy + delta;\n if (newSrcY <= srcRect.top + EPS3 || newSrcY >= srcRect.bottom - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: p3.x, y: newSrcY };\n np2 = { x: p3.x, y: p3.y };\n }\n const firstSegDegenerate = samePoint(np0, np1, EPS3);\n const secondSegDegenerate = samePoint(np1, np2, EPS3);\n if (firstSegDegenerate && secondSegDegenerate) {\n continue;\n }\n if (!firstSegDegenerate && segmentHitsAnyRect(np0, np1, realNodeRects, [srcId], 1)) {\n continue;\n }\n if (!secondSegDegenerate && segmentHitsAnyRect(np1, np2, realNodeRects, [dstId], 1)) {\n continue;\n }\n const firstSegConflicts = !firstSegDegenerate && segmentConflictsWithAnyEdge(np0, np1, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n const secondSegConflicts = !secondSegDegenerate && segmentConflictsWithAnyEdge(np1, np2, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n if (firstSegConflicts || secondSegConflicts) {\n continue;\n }\n if (firstSegDegenerate) {\n newPts = [np1, np2];\n } else if (secondSegDegenerate) {\n newPts = [np0, np1];\n } else {\n newPts = [np0, np1, np2];\n }\n break;\n }\n if (newPts) {\n edge.points = newPts;\n }\n }\n}\n__name(portSwapToLShape, \"portSwapToLShape\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/terminalStub.ts\nfunction collapseShortTerminalStub(edges, nodeByIdMap) {\n const MIN_STUB = 10;\n const EPS_LOCAL2 = 1e-3;\n const BUFFER = 2;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const rawPts = edge.points;\n if (!rawPts || rawPts.length < 4) {\n continue;\n }\n const pts = dedupeConsecutivePoints(rawPts, EPS_LOCAL2);\n if (pts.length < 4) {\n continue;\n }\n const nLast = pts.length - 1;\n const endPt = pts[nLast];\n const penultPt = pts[nLast - 1];\n const prevPt = pts[nLast - 2];\n const lastDx = endPt.x - penultPt.x;\n const lastDy = endPt.y - penultPt.y;\n const lastLen = Math.hypot(lastDx, lastDy);\n if (lastLen >= MIN_STUB || lastLen < EPS_LOCAL2) {\n continue;\n }\n const penultDx = penultPt.x - prevPt.x;\n const penultDy = penultPt.y - prevPt.y;\n const penultLen = Math.hypot(penultDx, penultDy);\n if (penultLen < EPS_LOCAL2) {\n continue;\n }\n const lastIsHoriz = isHorizontalSegment(penultPt, endPt, EPS_LOCAL2);\n const lastIsVert = isVerticalSegment(penultPt, endPt, EPS_LOCAL2);\n const penultIsHoriz = isHorizontalSegment(prevPt, penultPt, EPS_LOCAL2);\n const penultIsVert = isVerticalSegment(prevPt, penultPt, EPS_LOCAL2);\n if (!(lastIsHoriz && penultIsVert || lastIsVert && penultIsHoriz)) {\n continue;\n }\n const dstId = edge.end;\n const srcId = edge.start;\n const dst = dstId ? nodeByIdMap.get(dstId) : void 0;\n if (!dst) {\n continue;\n }\n const dstCx = dst.x ?? 0;\n const dstCy = dst.y ?? 0;\n const dstRect = rectOfNodeBounds(dst);\n if (!dstRect) {\n continue;\n }\n let newPrev;\n let newEnd;\n if (penultIsVert) {\n const approachFromBelow = penultDy < 0;\n newPrev = { x: dstCx, y: prevPt.y };\n newEnd = { x: dstCx, y: approachFromBelow ? dstRect.bottom : dstRect.top };\n } else {\n const approachFromLeft = penultDx > 0;\n newPrev = { x: prevPt.x, y: dstCy };\n newEnd = { x: approachFromLeft ? dstRect.right : dstRect.left, y: dstCy };\n }\n if (segmentHitsAnyRect(newPrev, newEnd, realNodeRects, dstId ? [dstId] : [], -BUFFER)) {\n continue;\n }\n if (segmentHitsAnyRect(newPrev, newEnd, labelRects, [], -BUFFER)) {\n continue;\n }\n if (srcId) {\n const src = nodeByIdMap.get(srcId);\n const srcRect = src ? rectOfNodeBounds(src) : void 0;\n if (srcRect && pointInsideRect(newPrev, srcRect, BUFFER)) {\n continue;\n }\n }\n const ownSegmentKey = /* @__PURE__ */ __name((a, b) => `${a.x.toFixed(3)},${a.y.toFixed(3)}|${b.x.toFixed(3)},${b.y.toFixed(3)}`, \"ownSegmentKey\");\n const selfSegments = /* @__PURE__ */ new Set();\n for (let i = 0; i < pts.length - 1; i++) {\n selfSegments.add(ownSegmentKey(pts[i], pts[i + 1]));\n }\n const segmentCrossesOtherEdge = /* @__PURE__ */ __name((from, to) => {\n for (const other of edges) {\n if (other === edge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oPts = other.points;\n if (!oPts || oPts.length < 2) {\n continue;\n }\n for (let i = 0; i < oPts.length - 1; i++) {\n const a = oPts[i];\n const b = oPts[i + 1];\n if (selfSegments.has(ownSegmentKey(a, b))) {\n continue;\n }\n if (orthogonalSegmentsStrictlyCross(from, to, a, b, EPS_LOCAL2)) {\n return true;\n }\n }\n }\n return false;\n }, \"segmentCrossesOtherEdge\");\n if (segmentCrossesOtherEdge(newPrev, newEnd)) {\n continue;\n }\n if (nLast - 3 >= 0) {\n const beforePrev = pts[nLast - 3];\n const endpointIds = [srcId, dstId].filter((id) => Boolean(id));\n if (segmentHitsAnyRect(beforePrev, newPrev, realNodeRects, endpointIds, -BUFFER)) {\n continue;\n }\n if (segmentCrossesOtherEdge(beforePrev, newPrev)) {\n continue;\n }\n }\n const head = pts.slice(0, nLast - 2);\n const newPts = [...head, newPrev, newEnd];\n edge.points = newPts;\n const labelId = edge.labelNodeId;\n if (labelId) {\n const labelNode = nodeByIdMap.get(labelId);\n if (labelNode) {\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw > 0 && lh > 0) {\n let bestMidX;\n let bestMidY;\n let bestLen = -1;\n for (let i = 0; i < newPts.length - 1; i++) {\n const a = newPts[i];\n const b = newPts[i + 1];\n const segLen = Math.hypot(b.x - a.x, b.y - a.y);\n const isHoriz = sameY(a, b, EPS_LOCAL2);\n const isVert = sameX(a, b, EPS_LOCAL2);\n const fits = isHoriz && segLen >= lw + 2 || isVert && segLen >= lh + 2;\n if (!fits) {\n continue;\n }\n if (segLen > bestLen) {\n bestLen = segLen;\n bestMidX = (a.x + b.x) / 2;\n bestMidY = (a.y + b.y) / 2;\n }\n }\n if (bestMidX !== void 0 && bestMidY !== void 0) {\n labelNode.x = bestMidX;\n labelNode.y = bestMidY;\n }\n }\n }\n }\n }\n}\n__name(collapseShortTerminalStub, \"collapseShortTerminalStub\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/materializedGeometry.ts\nvar EPS_LOCAL = 1e-3;\nvar MIN_SHARED = 8;\nvar segmentsFor = orthogonalSegmentsForPoints;\nvar orthogonallyAligned = /* @__PURE__ */ __name((a, b) => sameX(a, b, EPS_LOCAL) || sameY(a, b, EPS_LOCAL), \"orthogonallyAligned\");\nfunction separateSharedRenderedTerminalLanes(edges, nodeByIdMap) {\n const MIN_FACE_CLEARANCE = 16;\n const TRACK_SHIFT = 7;\n const rectIntersect = /* @__PURE__ */ __name((node, point) => {\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n const dx = point.x - x;\n const dy = point.y - y;\n let w = (node.width ?? 0) / 2;\n let h = (node.height ?? 0) / 2;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n if (dy < 0) {\n h = -h;\n }\n return { x: x + (dy === 0 ? 0 : h * dx / dy), y: y + h };\n }\n if (dx < 0) {\n w = -w;\n }\n return { x: x + w, y: y + (dx === 0 ? 0 : w * dy / dx) };\n }, \"rectIntersect\");\n const terminalLaneFor = /* @__PURE__ */ __name((edge, atStart) => {\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const nodeId = atStart ? edge.start : edge.end;\n const node = nodeId ? nodeByIdMap.get(nodeId) : void 0;\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (!node || !nodeId || !rect) {\n return void 0;\n }\n const endpoint = atStart ? points[0] : points[points.length - 1];\n const adjacent = atStart ? points[1] : points[points.length - 2];\n const boundary = rectIntersect(node, endpoint);\n let railEnd = endpoint;\n if (orthogonallyAligned(adjacent, boundary)) {\n railEnd = adjacent;\n }\n if (sameX(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"V\",\n coord: boundary.x,\n min: Math.min(boundary.y, railEnd.y),\n max: Math.max(boundary.y, railEnd.y),\n boundary,\n railEnd,\n rect\n };\n }\n if (sameY(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"H\",\n coord: boundary.y,\n min: Math.min(boundary.x, railEnd.x),\n max: Math.max(boundary.x, railEnd.x),\n boundary,\n railEnd,\n rect\n };\n }\n return void 0;\n }, \"terminalLaneFor\");\n const projectedOverlapLength = /* @__PURE__ */ __name((a, b) => Math.max(0, Math.min(a.max, b.max) - Math.max(a.min, b.min)), \"projectedOverlapLength\");\n const sameTerminalFace = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n if (a.orientation === \"H\") {\n const aOnHorizontalFace = Math.abs(a.boundary.x - a.rect.left) < 1 || Math.abs(a.boundary.x - a.rect.right) < 1;\n return aOnHorizontalFace && sameX(a.boundary, b.boundary, 1);\n }\n const aOnVerticalFace = Math.abs(a.boundary.y - a.rect.top) < 1 || Math.abs(a.boundary.y - a.rect.bottom) < 1;\n return aOnVerticalFace && sameY(a.boundary, b.boundary, 1);\n }, \"sameTerminalFace\");\n const exactTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n return shared >= MIN_SHARED && Math.abs(a.coord - b.coord) < 0.5;\n }, \"exactTerminalLaneConflict\");\n const nearTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation || a.orientation !== \"H\" || a.atStart === b.atStart) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n if (shared < MIN_SHARED) {\n return false;\n }\n const faceSpan = a.rect.bottom - a.rect.top;\n if (shared < faceSpan || shared > 2 * faceSpan) {\n return false;\n }\n return sameTerminalFace(a, b) && Math.abs(a.coord - b.coord) < MIN_FACE_CLEARANCE;\n }, \"nearTerminalLaneConflict\");\n const shiftedCandidate = /* @__PURE__ */ __name((lane, shift) => {\n const points = dedupeConsecutivePoints(lane.edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const shiftedBoundary = lane.orientation === \"V\" ? { x: lane.boundary.x + shift, y: lane.boundary.y } : { x: lane.boundary.x, y: lane.boundary.y + shift };\n const shiftedRailEnd = lane.orientation === \"V\" ? { x: lane.railEnd.x + shift, y: lane.railEnd.y } : { x: lane.railEnd.x, y: lane.railEnd.y + shift };\n const boundaryStaysOnSameFace = /* @__PURE__ */ __name(() => {\n if (Math.abs(lane.boundary.y - lane.rect.top) < 1 || Math.abs(lane.boundary.y - lane.rect.bottom) < 1) {\n return sameY(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.x >= lane.rect.left + 1 && shiftedBoundary.x <= lane.rect.right - 1;\n }\n if (Math.abs(lane.boundary.x - lane.rect.left) < 1 || Math.abs(lane.boundary.x - lane.rect.right) < 1) {\n return sameX(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.y >= lane.rect.top + 1 && shiftedBoundary.y <= lane.rect.bottom - 1;\n }\n return false;\n }, \"boundaryStaysOnSameFace\");\n if (!boundaryStaysOnSameFace()) {\n return void 0;\n }\n if (lane.atStart) {\n const railEndIsAdjacent2 = points.length > 1 && samePoint(points[1], lane.railEnd, EPS_LOCAL);\n const rest = points.slice(railEndIsAdjacent2 ? 2 : 1);\n const next = rest[0];\n if (next && !orthogonallyAligned(next, shiftedRailEnd)) {\n return void 0;\n }\n return [shiftedBoundary, shiftedRailEnd, ...rest];\n }\n const railEndIsAdjacent = points.length > 1 && samePoint(points[points.length - 2], lane.railEnd, EPS_LOCAL);\n const before = points.slice(0, railEndIsAdjacent ? -2 : -1);\n const previous = before[before.length - 1];\n if (previous && !orthogonallyAligned(previous, shiftedRailEnd)) {\n return void 0;\n }\n return [...before, shiftedRailEnd, shiftedBoundary];\n }, \"shiftedCandidate\");\n const laneIsStraightCollinearConnector = /* @__PURE__ */ __name((lane) => {\n const edge = lane.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 2) {\n return false;\n }\n const startId = edge.start;\n const endId = edge.end;\n const start = startId ? nodeByIdMap.get(startId) : void 0;\n const end = endId ? nodeByIdMap.get(endId) : void 0;\n if (!start || !end) {\n return false;\n }\n const startX = start.x ?? 0;\n const startY = start.y ?? 0;\n const endX = end.x ?? 0;\n const endY = end.y ?? 0;\n const [a, b] = points;\n return sameY(a, b, EPS_LOCAL) && Math.abs(startY - endY) < 1 && Math.abs(startX - endX) > 1 || sameX(a, b, EPS_LOCAL) && Math.abs(startX - endX) < 1 && Math.abs(startY - endY) > 1;\n }, \"laneIsStraightCollinearConnector\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < 8; iteration++) {\n const lanes = edges.filter((edge) => !edge.isLayoutOnly).flatMap((edge) => [terminalLaneFor(edge, true), terminalLaneFor(edge, false)]).filter((lane) => Boolean(lane));\n let fixed = false;\n for (let i = 0; i < lanes.length && !fixed; i++) {\n for (let j = i + 1; j < lanes.length && !fixed; j++) {\n const first = lanes[i];\n const second = lanes[j];\n if (first.edge === second.edge || !(exactTerminalLaneConflict(first, second) || nearTerminalLaneConflict(first, second))) {\n continue;\n }\n const fixingNearConflict = !exactTerminalLaneConflict(first, second);\n const candidates = [first, second].sort((a, b) => {\n const aPreservesStraight = laneIsStraightCollinearConnector(a);\n const bPreservesStraight = laneIsStraightCollinearConnector(b);\n if (aPreservesStraight !== bPreservesStraight) {\n return Number(aPreservesStraight) - Number(bPreservesStraight);\n }\n return Number(!b.atStart) - Number(!a.atStart);\n });\n for (const lane of candidates) {\n for (const shift of shifts) {\n const candidate = shiftedCandidate(lane, shift);\n if (!candidate) {\n continue;\n }\n const nextLane = terminalLaneFor({ ...lane.edge, points: candidate }, lane.atStart);\n if (!nextLane || lanes.some(\n (other) => other.edge !== lane.edge && (exactTerminalLaneConflict(nextLane, other) || fixingNearConflict && nearTerminalLaneConflict(nextLane, other))\n )) {\n continue;\n }\n lane.edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(separateSharedRenderedTerminalLanes, \"separateSharedRenderedTerminalLanes\");\nfunction collapseRedundantRectangularDoglegs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(dedupeConsecutivePoints(otherPoints))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const withoutDogleg = /* @__PURE__ */ __name((points, i) => {\n if (i + 4 >= points.length) {\n return void 0;\n }\n const p0 = points[i];\n const p1 = points[i + 1];\n const p2 = points[i + 2];\n const p3 = points[i + 3];\n const p4 = points[i + 4];\n const terminalVerticalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && sameX(p0, p3, EPS_LOCAL) && sameX(p0, p4, EPS_LOCAL) && sameX(p1, p2, EPS_LOCAL) && (p1.x - p0.x) * (p3.x - p2.x) < 0;\n const terminalHorizontalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && sameY(p0, p3, EPS_LOCAL) && sameY(p0, p4, EPS_LOCAL) && sameY(p1, p2, EPS_LOCAL) && (p1.y - p0.y) * (p3.y - p2.y) < 0;\n if (terminalVerticalDogleg || terminalHorizontalDogleg) {\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p4, ...points.slice(i + 5)]);\n }\n if (i + 5 >= points.length) {\n return void 0;\n }\n const p5 = points[i + 5];\n const verticalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && isVerticalSegment(p4, p5) && sameX(p0, p4, EPS_LOCAL) && sameX(p0, p5, EPS_LOCAL) && sameX(p2, p3, EPS_LOCAL) && (p2.x - p1.x) * (p4.x - p3.x) < 0;\n const horizontalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && isHorizontalSegment(p4, p5) && sameY(p0, p4, EPS_LOCAL) && sameY(p0, p5, EPS_LOCAL) && sameY(p2, p3, EPS_LOCAL) && (p2.y - p1.y) * (p4.y - p3.y) < 0;\n if (!verticalDogleg && !horizontalDogleg) {\n return void 0;\n }\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p5, ...points.slice(i + 6)]);\n }, \"withoutDogleg\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n let fixed = false;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (let i = 0; i <= points.length - 5; i++) {\n const candidate = withoutDogleg(points, i);\n if (!candidate || !candidateIsSafe(edge, candidate)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(collapseRedundantRectangularDoglegs, \"collapseRedundantRectangularDoglegs\");\nfunction liftObstacleHuggingSameSideRails(edges, nodeByIdMap) {\n const BUFFER = 2;\n const CLEARANCE = 20;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const middleRail = /* @__PURE__ */ __name((points) => {\n const segments = segmentsFor(points);\n if (segments.length !== 3) {\n return void 0;\n }\n const middle = segments[1];\n if (segments[0].horizontal === middle.horizontal || segments[2].horizontal === middle.horizontal) {\n return void 0;\n }\n return {\n index: middle.index,\n horizontal: middle.horizontal,\n vertical: middle.vertical,\n segment: middle\n };\n }, \"middleRail\");\n const blockingRectsFor = /* @__PURE__ */ __name((edge, rail) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n return realNodeRects.filter((entry) => {\n if (endpointIds.includes(entry.id)) {\n return false;\n }\n const rect = entry.rect;\n if (rail.horizontal) {\n const xOverlap = overlapLength(rail.a.x, rail.b.x, rect.left, rect.right);\n return xOverlap >= MIN_SHARED && rail.a.y >= rect.top - BUFFER && rail.a.y <= rect.bottom + BUFFER;\n }\n const yOverlap = overlapLength(rail.a.y, rail.b.y, rect.top, rect.bottom);\n return yOverlap >= MIN_SHARED && rail.a.x >= rect.left - BUFFER && rail.a.x <= rect.right + BUFFER;\n });\n }, \"blockingRectsFor\");\n const candidateByMovingRail = /* @__PURE__ */ __name((points, rail, coord) => {\n const candidate = points.map((point) => ({ ...point }));\n if (rail.horizontal) {\n candidate[rail.index].y = coord;\n candidate[rail.index + 1].y = coord;\n } else if (rail.vertical) {\n candidate[rail.index].x = coord;\n candidate[rail.index + 1].x = coord;\n } else {\n return void 0;\n }\n const simplified = simplifyPolyline(dedupeConsecutivePoints(candidate));\n return segmentsFor(simplified).length === simplified.length - 1 ? simplified : void 0;\n }, \"candidateByMovingRail\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let fixed = false;\n for (const edge of visibleEdges) {\n const points = pointsFor(edge);\n const rail = middleRail(points);\n if (!rail) {\n continue;\n }\n const blockers = blockingRectsFor(edge, rail.segment);\n if (blockers.length === 0) {\n continue;\n }\n const coords = rail.horizontal ? [\n Math.min(...blockers.map((entry) => entry.rect.top)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.bottom)) + CLEARANCE\n ] : [\n Math.min(...blockers.map((entry) => entry.rect.left)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.right)) + CLEARANCE\n ];\n for (const coord of coords) {\n const candidate = candidateByMovingRail(points, rail.segment, coord);\n if (!candidate || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(liftObstacleHuggingSameSideRails, \"liftObstacleHuggingSameSideRails\");\nfunction liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const topLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n const direction = typeof rawDirection === \"string\" ? rawDirection.toUpperCase() : \"\";\n if (direction === \"LR\" || direction === \"RL\" || direction === \"BT\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const y = node.y;\n const height = node.height;\n if (!rect || typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleHeight <= 0 || titleWidth < titleHeight) {\n return void 0;\n }\n return { node, rect };\n }, \"topLaneTitleFor\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(topLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let topDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (!horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n continue;\n }\n topDelta = Math.max(topDelta, lane.rect.bottom - segment.a.y + CLEARANCE);\n }\n }\n }\n if (topDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const y = lane.node.y;\n const height = lane.node.height;\n if (typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n continue;\n }\n lane.node.y = y - topDelta / 2;\n lane.node.height = height + topDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n top: lane.rect.top - topDelta,\n bottom: lane.rect.bottom - topDelta\n };\n }\n}\n__name(liftTopLaneTitleBandsAboveRails, \"liftTopLaneTitleBandsAboveRails\");\nfunction shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const leftLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n if (rawDirection !== \"LR\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const x = node.x;\n const width = node.width;\n if (!rect || typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleWidth <= 0 || titleHeight < titleWidth) {\n return void 0;\n }\n return { node, rect };\n }, \"leftLaneTitleFor\");\n const verticalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.vertical) {\n return false;\n }\n const x = segment.a.x;\n if (x <= rect.left + EPS_LOCAL || x >= rect.right - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }, \"verticalSegmentIntersectsTitle\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(leftLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let leftDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (verticalSegmentIntersectsTitle(segment, lane.rect)) {\n leftDelta = Math.max(leftDelta, lane.rect.right - segment.a.x + CLEARANCE);\n } else if (horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n const segmentLeft = Math.min(segment.a.x, segment.b.x);\n leftDelta = Math.max(leftDelta, lane.rect.right - segmentLeft + CLEARANCE);\n }\n }\n }\n }\n if (leftDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const x = lane.node.x;\n const width = lane.node.width;\n if (typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n continue;\n }\n lane.node.x = x - leftDelta / 2;\n lane.node.width = width + leftDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n left: lane.rect.left - leftDelta,\n right: lane.rect.right - leftDelta\n };\n }\n}\n__name(shiftLeftLaneTitleBandsLeftOfRails, \"shiftLeftLaneTitleBandsLeftOfRails\");\nfunction swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 4;\n const { realNodeRects } = collectNodeRectEntries(nodeByIdMap.values());\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"crossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const terminalTailFor = /* @__PURE__ */ __name((edge) => {\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n return void 0;\n }\n const tailStart = points[points.length - 2];\n const terminal = points[points.length - 1];\n if (!isHorizontalSegment(tailStart, terminal, EPS_LOCAL) && !isVerticalSegment(tailStart, terminal, EPS_LOCAL)) {\n return void 0;\n }\n return { tailStart, terminal };\n }, \"terminalTailFor\");\n const candidateWithDestinationTail = /* @__PURE__ */ __name((edge, tail) => {\n const points = replacementPointsFor(edge);\n if (points.length < 3) {\n return void 0;\n }\n const start = points[0];\n const firstTurn = points[1];\n let connector;\n if (isHorizontalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: firstTurn.x, y: tail.tailStart.y };\n } else if (isVerticalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: tail.tailStart.x, y: firstTurn.y };\n } else {\n return void 0;\n }\n const candidate = simplifyPolyline(\n dedupeConsecutivePoints([start, firstTurn, connector, tail.tailStart, tail.terminal])\n );\n return segmentsFor(candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"candidateWithDestinationTail\");\n const pathHasNodeHit = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return true;\n }\n }\n return false;\n }, \"pathHasNodeHit\");\n const pathHasSharedTrack = /* @__PURE__ */ __name((edge, path, replacements) => {\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(path)) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSharedTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, path, replacements) => !pathHasNodeHit(edge, path) && !pathHasSharedTrack(edge, path, replacements), \"candidateIsSafe\");\n const edgesByDestination = /* @__PURE__ */ __name(() => {\n const result = /* @__PURE__ */ new Map();\n for (const edge of visibleEdges) {\n const dstId = edge.end;\n if (!dstId || !nodeByIdMap.has(dstId)) {\n continue;\n }\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n continue;\n }\n const bucket = result.get(dstId) ?? [];\n bucket.push(edge);\n result.set(dstId, bucket);\n }\n return result;\n }, \"edgesByDestination\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = crossingCount();\n if (currentCrossings === 0) {\n return;\n }\n const currentBends = totalBends();\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = currentBends;\n for (const destinationEdges of edgesByDestination().values()) {\n for (let i = 0; i < destinationEdges.length; i++) {\n for (let j = i + 1; j < destinationEdges.length; j++) {\n const first = destinationEdges[i];\n const second = destinationEdges[j];\n const firstTail = terminalTailFor(first);\n const secondTail = terminalTailFor(second);\n if (!firstTail || !secondTail) {\n continue;\n }\n const firstCandidate = candidateWithDestinationTail(first, secondTail);\n const secondCandidate = candidateWithDestinationTail(second, firstTail);\n if (!firstCandidate || !secondCandidate) {\n continue;\n }\n const replacements = /* @__PURE__ */ new Map([\n [first, firstCandidate],\n [second, secondCandidate]\n ]);\n if (!candidateIsSafe(first, firstCandidate, replacements) || !candidateIsSafe(second, secondCandidate, replacements)) {\n continue;\n }\n const candidateCrossings = crossingCount(replacements);\n const candidateBends = totalBends(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(swapDestinationTerminalTailsToReduceCrossings, \"swapDestinationTerminalTailsToReduceCrossings\");\nfunction reassignCrossingExternalRailChannels(edges, nodeByIdMap) {\n const BUFFER = 2;\n const RAIL_CHANNEL_GAP = 12;\n const MAX_ITERATIONS = 4;\n const MAX_EXHAUSTIVE_COMPONENT = 6;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeByIdMap.get(srcId) : void 0;\n const dstNode = dstId ? nodeByIdMap.get(dstId) : void 0;\n const src = srcNode ? rectOfNodeBounds(srcNode) : void 0;\n const dst = dstNode ? rectOfNodeBounds(dstNode) : void 0;\n return src && dst ? { src, dst } : void 0;\n }, \"endpointRectsFor\");\n const externalRailForSegment = /* @__PURE__ */ __name((edge, points, segment) => {\n if (segment.index <= 0 || segment.index + 1 >= points.length - 1) {\n return void 0;\n }\n const endpointRects = endpointRectsFor(edge);\n if (!endpointRects) {\n return void 0;\n }\n if (segment.vertical) {\n const coord = segment.a.x;\n const leftBound = Math.min(endpointRects.src.left, endpointRects.dst.left);\n const rightBound = Math.max(endpointRects.src.right, endpointRects.dst.right);\n const side = coord < leftBound - EPS_LOCAL ? \"left\" : coord > rightBound + EPS_LOCAL ? \"right\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"vertical\",\n side,\n coord,\n min: Math.min(segment.a.y, segment.b.y),\n max: Math.max(segment.a.y, segment.b.y)\n };\n }\n if (segment.horizontal) {\n const coord = segment.a.y;\n const topBound = Math.min(endpointRects.src.top, endpointRects.dst.top);\n const bottomBound = Math.max(endpointRects.src.bottom, endpointRects.dst.bottom);\n const side = coord < topBound - EPS_LOCAL ? \"top\" : coord > bottomBound + EPS_LOCAL ? \"bottom\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"horizontal\",\n side,\n coord,\n min: Math.min(segment.a.x, segment.b.x),\n max: Math.max(segment.a.x, segment.b.x)\n };\n }\n return void 0;\n }, \"externalRailForSegment\");\n const collectExternalRails = /* @__PURE__ */ __name(() => {\n const rails = [];\n for (const edge of visibleEdges) {\n const points = replacementPointsFor(edge);\n for (const segment of segmentsFor(points)) {\n const rail = externalRailForSegment(edge, points, segment);\n if (rail) {\n rails.push(rail);\n }\n }\n }\n return rails;\n }, \"collectExternalRails\");\n const railsInteract = /* @__PURE__ */ __name((a, b) => a.edge !== b.edge && a.axis === b.axis && a.side === b.side && overlapLength(a.min, a.max, b.min, b.max) >= MIN_SHARED, \"railsInteract\");\n const connectedComponents = /* @__PURE__ */ __name((rails) => {\n const result = [];\n const seen = /* @__PURE__ */ new Set();\n for (const rail of rails) {\n if (seen.has(rail)) {\n continue;\n }\n const queue = [rail];\n const component = [];\n seen.add(rail);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of rails) {\n if (!seen.has(next) && railsInteract(current, next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n if (component.length > 1) {\n result.push(component);\n }\n }\n return result;\n }, \"connectedComponents\");\n const uniqueCoordsFor = /* @__PURE__ */ __name((component) => {\n const coords = [];\n for (const rail of component) {\n if (!coords.some((coord) => Math.abs(coord - rail.coord) < EPS_LOCAL)) {\n coords.push(rail.coord);\n }\n }\n while (coords.length < component.length) {\n const min = Math.min(...coords);\n const max = Math.max(...coords);\n const side = component[0].side;\n coords.push(\n side === \"left\" || side === \"top\" ? min - RAIL_CHANNEL_GAP * (component.length - coords.length) : max + RAIL_CHANNEL_GAP * (component.length - coords.length)\n );\n }\n return coords;\n }, \"uniqueCoordsFor\");\n const coordinateAssignmentsFor = /* @__PURE__ */ __name((component) => {\n const current = component.map((rail) => rail.coord);\n const coords = uniqueCoordsFor(component);\n const assignments = [];\n if (component.length <= MAX_EXHAUSTIVE_COMPONENT) {\n const used = new Array(coords.length).fill(false);\n const next = [];\n const visit = /* @__PURE__ */ __name(() => {\n if (next.length === component.length) {\n if (next.some((coord, index) => Math.abs(coord - current[index]) >= EPS_LOCAL)) {\n assignments.push([...next]);\n }\n return;\n }\n for (const [i, coord] of coords.entries()) {\n if (used[i]) {\n continue;\n }\n used[i] = true;\n next.push(coord);\n visit();\n next.pop();\n used[i] = false;\n }\n }, \"visit\");\n visit();\n return assignments;\n }\n for (let i = 0; i < current.length; i++) {\n for (let j = i + 1; j < current.length; j++) {\n const assignment = [...current];\n [assignment[i], assignment[j]] = [assignment[j], assignment[i]];\n assignments.push(assignment);\n }\n }\n return assignments;\n }, \"coordinateAssignmentsFor\");\n const replacementsForAssignment = /* @__PURE__ */ __name((component, assignment) => {\n const draftByEdge = /* @__PURE__ */ new Map();\n for (const [i, rail] of component.entries()) {\n const coord = assignment[i];\n const points = draftByEdge.get(rail.edge) ?? rail.points.map((point) => ({ x: point.x, y: point.y }));\n if (rail.axis === \"vertical\") {\n points[rail.segmentIndex].x = coord;\n points[rail.segmentIndex + 1].x = coord;\n } else {\n points[rail.segmentIndex].y = coord;\n points[rail.segmentIndex + 1].y = coord;\n }\n draftByEdge.set(rail.edge, points);\n }\n const replacements = /* @__PURE__ */ new Map();\n for (const [edge, points] of draftByEdge) {\n const simplified = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(simplified).length !== simplified.length - 1) {\n return void 0;\n }\n replacements.set(edge, simplified);\n }\n return replacements;\n }, \"replacementsForAssignment\");\n const candidateIsSafe = /* @__PURE__ */ __name((replacements) => {\n for (const [edge, points] of replacements) {\n const endpointIds = [\n edge.start,\n edge.end\n ].filter((id) => Boolean(id));\n for (const segment of segmentsFor(points)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n }\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = replacements.has(first);\n const firstSegments = segmentsFor(replacementPointsFor(first, replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !replacements.has(second)) {\n continue;\n }\n const secondSegments = segmentsFor(replacementPointsFor(second, replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n if (currentCrossings === 0) {\n return;\n }\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = totalBends();\n let bestDisplacement = Number.POSITIVE_INFINITY;\n for (const component of connectedComponents(collectExternalRails())) {\n for (const assignment of coordinateAssignmentsFor(component)) {\n const replacements = replacementsForAssignment(component, assignment);\n if (!replacements || !candidateIsSafe(replacements)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n const candidateBends = totalBends(replacements);\n const candidateDisplacement = component.reduce(\n (sum, rail, index) => sum + Math.abs(assignment[index] - rail.coord),\n 0\n );\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateDisplacement >= bestDisplacement)) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestDisplacement = candidateDisplacement;\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(reassignCrossingExternalRailChannels, \"reassignCrossingExternalRailChannels\");\nfunction shortcutRedundantOrthogonalJogs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const pathLength = /* @__PURE__ */ __name((points) => segmentsFor(points).reduce((sum, segment) => {\n const dx = segment.a.x - segment.b.x;\n const dy = segment.a.y - segment.b.y;\n return sum + Math.hypot(dx, dy);\n }, 0), \"pathLength\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const segmentRunsAlongRectBorder = /* @__PURE__ */ __name((segment, rect) => {\n if (segment.horizontal) {\n const y = segment.a.y;\n const onBorder = Math.abs(y - rect.top) < 1 || Math.abs(y - rect.bottom) < 1;\n return onBorder && overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }\n if (segment.vertical) {\n const x = segment.a.x;\n const onBorder = Math.abs(x - rect.left) < 1 || Math.abs(x - rect.right) < 1;\n return onBorder && overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }\n return false;\n }, \"segmentRunsAlongRectBorder\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const rects = [];\n for (const id of endpointIds) {\n const node = nodeByIdMap.get(id);\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (rect) {\n rects.push(rect);\n }\n }\n return rects;\n }, \"endpointRectsFor\");\n const shortcutCandidatesAt = /* @__PURE__ */ __name((points, index) => {\n if (index + 3 >= points.length) {\n return [];\n }\n const p0 = points[index];\n const p1 = points[index + 1];\n const p2 = points[index + 2];\n const p3 = points[index + 3];\n const isHVH = isHorizontalSegment(p0, p1, EPS_LOCAL) && isVerticalSegment(p1, p2, EPS_LOCAL) && isHorizontalSegment(p2, p3, EPS_LOCAL);\n const isVHV = isVerticalSegment(p0, p1, EPS_LOCAL) && isHorizontalSegment(p1, p2, EPS_LOCAL) && isVerticalSegment(p2, p3, EPS_LOCAL);\n if (!isHVH && !isVHV) {\n return [];\n }\n const outerSegmentsOppose = isHVH ? Math.sign(p1.x - p0.x) !== Math.sign(p3.x - p2.x) : Math.sign(p1.y - p0.y) !== Math.sign(p3.y - p2.y);\n if (!outerSegmentsOppose) {\n return [];\n }\n const corners = sameX(p0, p3, EPS_LOCAL) || sameY(p0, p3, EPS_LOCAL) ? [] : [\n { x: p0.x, y: p3.y },\n { x: p3.x, y: p0.y }\n ];\n const rawCandidates = corners.length === 0 ? [[...points.slice(0, index + 1), ...points.slice(index + 3)]] : corners.map((corner) => [\n ...points.slice(0, index + 1),\n corner,\n ...points.slice(index + 3)\n ]);\n const seen = /* @__PURE__ */ new Set();\n return rawCandidates.map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (segmentsFor(candidate).length !== candidate.length - 1) {\n return false;\n }\n if (!candidate.some((point) => samePoint(point, p3, EPS_LOCAL))) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"shortcutCandidatesAt\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const endpointRects = endpointRectsFor(edge);\n for (const segment of segmentsFor(candidate)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n if (endpointRects.some((rect) => segmentRunsAlongRectBorder(segment, rect))) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(candidate)) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n let bestLength = Number.POSITIVE_INFINITY;\n for (const edge of visibleEdges) {\n const currentPoints = pointsFor(edge);\n const currentBends = countOrthogonalBends(currentPoints, EPS_LOCAL);\n const currentLength = pathLength(currentPoints);\n for (let index = 0; index <= currentPoints.length - 4; index++) {\n for (const candidate of shortcutCandidatesAt(currentPoints, index)) {\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n const candidateLength = pathLength(candidate);\n const improvesShape = candidateBends < currentBends || candidateBends === currentBends && candidateLength < currentLength - EPS_LOCAL;\n if (!improvesShape || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(edge, candidate);\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateLength >= bestLength)) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestLength = candidateLength;\n }\n }\n }\n if (!bestEdge || !bestPath) {\n return;\n }\n bestEdge.points = bestPath;\n }\n}\n__name(shortcutRedundantOrthogonalJogs, \"shortcutRedundantOrthogonalJogs\");\nfunction resolveRenderedOrthogonalCrossings(edges, nodeByIdMap) {\n const ANCHOR = 20;\n const EXTRA_CHANNEL_COUNT = 2;\n const MAX_ITERATIONS = 4;\n const MAX_PAIR_CANDIDATES_PER_EDGE = 48;\n const realNodes = [];\n for (const node of nodeByIdMap.values()) {\n if (node.isGroup || node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const rect = rectOfNodeBounds(node);\n if (!rect) {\n continue;\n }\n realNodes.push({\n id: String(node.id ?? \"\"),\n cx,\n cy,\n rect\n });\n }\n if (realNodes.length === 0) {\n return;\n }\n const nodeInfoById = new Map(realNodes.map((node) => [node.id, node]));\n const realNodeRects = realNodes.map((node) => ({ id: node.id, rect: node.rect }));\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const outsideTracks = {\n top: Math.min(...realNodes.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodes.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodes.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodes.map((node) => node.rect.right)) + ANCHOR\n };\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const edgeIndex = new Map(visibleEdges.map((edge, index) => [edge, index]));\n const outwardTracksForSide = /* @__PURE__ */ __name((side) => {\n const outward = side === \"left\" || side === \"top\" ? -1 : 1;\n const tracks = [];\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n tracks.push(outsideTracks[side] + outward * ANCHOR * channel);\n }\n return tracks;\n }, \"outwardTracksForSide\");\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCountBetweenSegments = /* @__PURE__ */ __name((firstSegments, secondSegments) => {\n let count = 0;\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n return count;\n }, \"crossingCountBetweenSegments\");\n const crossingCountBetweenPaths = /* @__PURE__ */ __name((first, second) => crossingCountBetweenSegments(segmentsFor(first), segmentsFor(second)), \"crossingCountBetweenPaths\");\n const crossingSnapshot = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n const pairs = [];\n const edgeSet = /* @__PURE__ */ new Set();\n const edgeOrder = [];\n const addEdge = /* @__PURE__ */ __name((edge) => {\n if (!edgeSet.has(edge)) {\n edgeSet.add(edge);\n edgeOrder.push(edge);\n }\n }, \"addEdge\");\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n const pairCount = crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n if (pairCount > 0) {\n count += pairCount;\n pairs.push({ first, second, count: pairCount });\n addEdge(first);\n addEdge(second);\n }\n }\n }\n edgeOrder.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n return {\n count,\n pairs,\n edgeSet,\n edges: edgeOrder\n };\n }, \"crossingSnapshot\");\n const crossingCountWithReplacements = /* @__PURE__ */ __name((current, replacements) => {\n const changed = new Set(replacements.keys());\n if (changed.size === 0) {\n return current.count;\n }\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (changed.has(pair.first) || changed.has(pair.second)) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = changed.has(first);\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !changed.has(second)) {\n continue;\n }\n replacementAffected += crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n }\n }\n return current.count - currentAffected + replacementAffected;\n }, \"crossingCountWithReplacements\");\n const crossingComponents = /* @__PURE__ */ __name((snapshot) => {\n const neighbors = /* @__PURE__ */ new Map();\n for (const pair of snapshot.pairs) {\n const firstNeighbors = neighbors.get(pair.first) ?? /* @__PURE__ */ new Set();\n firstNeighbors.add(pair.second);\n neighbors.set(pair.first, firstNeighbors);\n const secondNeighbors = neighbors.get(pair.second) ?? /* @__PURE__ */ new Set();\n secondNeighbors.add(pair.first);\n neighbors.set(pair.second, secondNeighbors);\n }\n const components = [];\n const seen = /* @__PURE__ */ new Set();\n for (const edge of snapshot.edges) {\n if (seen.has(edge)) {\n continue;\n }\n const queue = [edge];\n const component = [];\n seen.add(edge);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of neighbors.get(current) ?? []) {\n if (!seen.has(next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n component.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n if (component.length > 1) {\n components.push(component);\n }\n }\n return components;\n }, \"crossingComponents\");\n const endpointIdsFor = /* @__PURE__ */ __name((edge) => [edge.start, edge.end].filter(\n (id) => Boolean(id)\n ), \"endpointIdsFor\");\n const pairSearchGroups = /* @__PURE__ */ __name((snapshot) => {\n const groups = [];\n for (const component of crossingComponents(snapshot)) {\n const componentSet = new Set(component);\n const componentEndpointIds = new Set(component.flatMap((edge) => endpointIdsFor(edge)));\n const group = [...component];\n for (const edge of visibleEdges) {\n if (componentSet.has(edge)) {\n continue;\n }\n if (endpointIdsFor(edge).some((id) => componentEndpointIds.has(id))) {\n group.push(edge);\n }\n }\n group.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n groups.push(group);\n }\n return groups;\n }, \"pairSearchGroups\");\n const crossingCountWithSingleReplacement = /* @__PURE__ */ __name((current, edge, replacement) => crossingCountWithReplacements(\n current,\n /* @__PURE__ */ new Map([[edge, replacement]])\n ), \"crossingCountWithSingleReplacement\");\n const currentCrossingsByEdge = /* @__PURE__ */ __name((current) => {\n const result = /* @__PURE__ */ new Map();\n for (const pair of current.pairs) {\n result.set(pair.first, (result.get(pair.first) ?? 0) + pair.count);\n result.set(pair.second, (result.get(pair.second) ?? 0) + pair.count);\n }\n return result;\n }, \"currentCrossingsByEdge\");\n const pathLength = /* @__PURE__ */ __name((points) => points.slice(1).reduce((sum, point, index) => {\n const previous = points[index];\n return sum + Math.abs(point.x - previous.x) + Math.abs(point.y - previous.y);\n }, 0), \"pathLength\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const totalLength = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + pathLength(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalLength\");\n const pathHasSegmentConflict = /* @__PURE__ */ __name((edge, path, replacements = /* @__PURE__ */ new Map()) => {\n const pathSegments = segmentsFor(path);\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of pathSegments) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSegmentConflict\");\n const pathHitsNode = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -2)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pushOrthogonalCandidate = /* @__PURE__ */ __name((candidates, points) => {\n const candidate = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(candidate).length === candidate.length - 1) {\n candidates.push(candidate);\n }\n }, \"pushOrthogonalCandidate\");\n const sideIsHorizontal = /* @__PURE__ */ __name((side) => side === \"left\" || side === \"right\", \"sideIsHorizontal\");\n const localTrackForSameSide = /* @__PURE__ */ __name((src, side, dst) => {\n switch (side) {\n case \"left\":\n return Math.min(src.x, dst.x) - ANCHOR;\n case \"right\":\n return Math.max(src.x, dst.x) + ANCHOR;\n case \"top\":\n return Math.min(src.y, dst.y) - ANCHOR;\n case \"bottom\":\n return Math.max(src.y, dst.y) + ANCHOR;\n }\n }, \"localTrackForSameSide\");\n const addSameSideCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst) => {\n const outward = srcSide === \"left\" || srcSide === \"top\" ? -1 : 1;\n const trackSeeds = [localTrackForSameSide(src, srcSide, dst), outsideTracks[srcSide]];\n for (const seed of trackSeeds) {\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n pushOrthogonalCandidate(\n candidates,\n buildSameSideTrackPath(src, srcSide, dst, seed + outward * ANCHOR * channel)\n );\n }\n }\n }, \"addSameSideCandidates\");\n const addHorizontalToVerticalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const xTrack of outwardTracksForSide(srcSide)) {\n for (const yTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: xTrack, y: src.y },\n { x: xTrack, y: yTrack },\n { x: dst.x, y: yTrack },\n dst\n ]);\n }\n }\n }, \"addHorizontalToVerticalCandidates\");\n const addVerticalToHorizontalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const yTrack of outwardTracksForSide(srcSide)) {\n for (const xTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: yTrack },\n { x: xTrack, y: yTrack },\n { x: xTrack, y: dst.y },\n dst\n ]);\n }\n }\n }, \"addVerticalToHorizontalCandidates\");\n const addHorizontalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const yTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const yTrack of yTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: srcTrack, y: src.y },\n { x: srcTrack, y: yTrack },\n { x: dstTrack, y: yTrack },\n { x: dstTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalPairCandidates\");\n const addVerticalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const xTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const xTrack of xTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: srcTrack },\n { x: xTrack, y: srcTrack },\n { x: xTrack, y: dstTrack },\n { x: dst.x, y: dstTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalPairCandidates\");\n const dedupeCandidatePaths = /* @__PURE__ */ __name((candidates) => {\n const seen = /* @__PURE__ */ new Set();\n return candidates.map((candidate) => dedupeConsecutivePoints(candidate)).filter((candidate) => {\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"dedupeCandidatePaths\");\n const buildCandidatesForSides = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const candidates = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS_LOCAL);\n if (base) {\n pushOrthogonalCandidate(candidates, base);\n }\n if (srcSide === dstSide) {\n addSameSideCandidates(candidates, src, srcSide, dst);\n }\n const srcHorizontal = sideIsHorizontal(srcSide);\n const dstHorizontal = sideIsHorizontal(dstSide);\n if (srcHorizontal && !dstHorizontal) {\n addHorizontalToVerticalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (!srcHorizontal && dstHorizontal) {\n addVerticalToHorizontalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (srcHorizontal) {\n addHorizontalPairCandidates(candidates, src, srcSide, dst, dstSide);\n } else {\n addVerticalPairCandidates(candidates, src, srcSide, dst, dstSide);\n }\n return dedupeCandidatePaths(candidates);\n }, \"buildCandidatesForSides\");\n const addVerticalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetYTracks = side === \"top\" || side === \"bottom\" ? outwardTracksForSide(side) : externalYTracks;\n for (const track of externalXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: dst.y },\n dst\n ]);\n for (const targetTrack of targetYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: targetTrack },\n { x: dst.x, y: targetTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalDepartureOuterTrackCandidates\");\n const addHorizontalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetXTracks = side === \"left\" || side === \"right\" ? outwardTracksForSide(side) : externalXTracks;\n for (const track of externalYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: dst.x, y: track },\n dst\n ]);\n for (const targetTrack of targetXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: targetTrack, y: track },\n { x: targetTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalDepartureOuterTrackCandidates\");\n const terminalPreservingOuterTrackCandidates = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcId || !dstNode) {\n return [];\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 4) {\n return [];\n }\n const first = points[0];\n const departure = points[1];\n const candidates = [];\n if (isVerticalSegment(first, departure, EPS_LOCAL)) {\n addVerticalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n } else if (isHorizontalSegment(first, departure, EPS_LOCAL)) {\n addHorizontalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n }\n return candidates;\n }, \"terminalPreservingOuterTrackCandidates\");\n const candidatePathsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeInfoById.get(srcId) : void 0;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcNode || !dstNode) {\n return [];\n }\n const candidates = [];\n for (const srcSide of sides) {\n const srcPort = portForRectSide(srcNode, srcSide);\n for (const dstSide of sides) {\n candidates.push(\n ...buildCandidatesForSides(srcPort, srcSide, portForRectSide(dstNode, dstSide), dstSide)\n );\n }\n }\n candidates.push(...terminalPreservingOuterTrackCandidates(edge));\n return candidates;\n }, \"candidatePathsFor\");\n const currentSegmentsByEdge = /* @__PURE__ */ __name(() => new Map(visibleEdges.map((edge) => [edge, segmentsFor(replacementPointsFor(edge))])), \"currentSegmentsByEdge\");\n const sharedTrackConflictsFor = /* @__PURE__ */ __name((edge, candidateSegments, baseSegments) => {\n const conflicts = /* @__PURE__ */ new Set();\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n if (candidateSegments.some(\n (candidateSegment) => otherSegments.some(\n (otherSegment) => sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED\n )\n )) {\n conflicts.add(other);\n }\n }\n return conflicts;\n }, \"sharedTrackConflictsFor\");\n const pairCandidatesFor = /* @__PURE__ */ __name((edge, current, baseSegments, crossingCountByEdge) => {\n const seen = /* @__PURE__ */ new Set();\n const candidates = candidatePathsFor(edge).map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (pathHitsNode(edge, candidate)) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n }).map((candidate) => {\n const candidateSegments = segmentsFor(candidate);\n let replacementAffected = 0;\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n replacementAffected += crossingCountBetweenSegments(\n candidateSegments,\n baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other))\n );\n }\n return {\n candidate,\n candidateSegments,\n crossings: current.count - (crossingCountByEdge.get(edge) ?? 0) + replacementAffected,\n bends: countOrthogonalBends(candidate, EPS_LOCAL),\n totalBends: countOrthogonalBends(candidate),\n length: pathLength(candidate)\n };\n }).filter(({ crossings }) => crossings <= current.count).sort((a, b) => a.crossings - b.crossings || a.bends - b.bends || a.length - b.length);\n return candidates.slice(0, MAX_PAIR_CANDIDATES_PER_EDGE).map((candidate) => {\n return {\n path: candidate.candidate,\n segments: candidate.candidateSegments,\n sharedTrackConflicts: sharedTrackConflictsFor(\n edge,\n candidate.candidateSegments,\n baseSegments\n ),\n totalBends: candidate.totalBends,\n length: candidate.length\n };\n });\n }, \"pairCandidatesFor\");\n const pairCrossingCount = /* @__PURE__ */ __name((current, firstEdge, firstCandidate, secondEdge, secondCandidate, baseSegments) => {\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (pair.first === firstEdge || pair.second === firstEdge || pair.first === secondEdge || pair.second === secondEdge) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = crossingCountBetweenSegments(\n firstCandidate.segments,\n secondCandidate.segments\n );\n for (const other of visibleEdges) {\n if (other === firstEdge || other === secondEdge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n replacementAffected += crossingCountBetweenSegments(firstCandidate.segments, otherSegments) + crossingCountBetweenSegments(secondCandidate.segments, otherSegments);\n }\n return current.count - currentAffected + replacementAffected;\n }, \"pairCrossingCount\");\n const conflictsOnlyWith = /* @__PURE__ */ __name((candidate, edge) => {\n for (const conflict of candidate.sharedTrackConflicts) {\n if (conflict !== edge) {\n return false;\n }\n }\n return true;\n }, \"conflictsOnlyWith\");\n const candidatesShareTrack = /* @__PURE__ */ __name((firstCandidate, secondCandidate) => firstCandidate.segments.some(\n (firstSegment) => secondCandidate.segments.some(\n (secondSegment) => sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED\n )\n ), \"candidatesShareTrack\");\n const pairCandidatesAreCompatible = /* @__PURE__ */ __name((first, firstCandidate, second, secondCandidate) => conflictsOnlyWith(firstCandidate, second.edge) && conflictsOnlyWith(secondCandidate, first.edge) && !candidatesShareTrack(firstCandidate, secondCandidate), \"pairCandidatesAreCompatible\");\n const scorePairReplacement = /* @__PURE__ */ __name((context, first, firstCandidate, second, secondCandidate) => {\n const crossings = pairCrossingCount(\n context.current,\n first.edge,\n firstCandidate,\n second.edge,\n secondCandidate,\n context.baseSegments\n );\n if (crossings >= context.current.count) {\n return void 0;\n }\n return {\n replacements: /* @__PURE__ */ new Map([\n [first.edge, firstCandidate.path],\n [second.edge, secondCandidate.path]\n ]),\n crossings,\n bends: context.currentBends - (context.baseBendsByEdge.get(first.edge) ?? 0) - (context.baseBendsByEdge.get(second.edge) ?? 0) + firstCandidate.totalBends + secondCandidate.totalBends,\n length: context.currentLength - (context.baseLengthByEdge.get(first.edge) ?? 0) - (context.baseLengthByEdge.get(second.edge) ?? 0) + firstCandidate.length + secondCandidate.length\n };\n }, \"scorePairReplacement\");\n const pairScoreIsBetter = /* @__PURE__ */ __name((candidate, best) => candidate.crossings < best.crossings || candidate.crossings === best.crossings && (candidate.bends < best.bends || candidate.bends === best.bends && candidate.length < best.length), \"pairScoreIsBetter\");\n const bestScoreForOptionPair = /* @__PURE__ */ __name((context, first, second, best) => {\n let pairBest = best;\n for (const firstCandidate of first.candidates) {\n for (const secondCandidate of second.candidates) {\n if (!pairCandidatesAreCompatible(first, firstCandidate, second, secondCandidate)) {\n continue;\n }\n const score = scorePairReplacement(context, first, firstCandidate, second, secondCandidate);\n if (score && pairScoreIsBetter(score, pairBest)) {\n pairBest = score;\n }\n }\n }\n return pairBest;\n }, \"bestScoreForOptionPair\");\n const bestPairedReplacement = /* @__PURE__ */ __name((current) => {\n const currentBends = totalBends();\n const currentLength = totalLength();\n const baseSegments = currentSegmentsByEdge();\n const crossingCountByEdge = currentCrossingsByEdge(current);\n const baseBendsByEdge = new Map(\n visibleEdges.map((edge) => [edge, countOrthogonalBends(replacementPointsFor(edge))])\n );\n const baseLengthByEdge = new Map(\n visibleEdges.map((edge) => [edge, pathLength(replacementPointsFor(edge))])\n );\n const optionsByEdge = /* @__PURE__ */ new Map();\n const groups = pairSearchGroups(current);\n for (const group of groups) {\n for (const edge of group) {\n if (optionsByEdge.has(edge)) {\n continue;\n }\n const candidates = pairCandidatesFor(edge, current, baseSegments, crossingCountByEdge);\n if (candidates.length > 0) {\n optionsByEdge.set(edge, { edge, candidates });\n }\n }\n }\n let best = {\n replacements: /* @__PURE__ */ new Map(),\n crossings: current.count,\n bends: currentBends,\n length: currentLength\n };\n const scoringContext = {\n current,\n currentBends,\n currentLength,\n baseBendsByEdge,\n baseLengthByEdge,\n baseSegments\n };\n for (const group of groups) {\n const crossingEdgeSet = new Set(group.filter((edge) => current.edgeSet.has(edge)));\n const options = group.map((edge) => optionsByEdge.get(edge)).filter((option) => Boolean(option));\n for (let i = 0; i < options.length; i++) {\n const first = options[i];\n for (let j = i + 1; j < options.length; j++) {\n const second = options[j];\n if (!crossingEdgeSet.has(first.edge) && !crossingEdgeSet.has(second.edge)) {\n continue;\n }\n best = bestScoreForOptionPair(scoringContext, first, second, best);\n }\n }\n }\n return best.replacements.size > 0 ? best.replacements : void 0;\n }, \"bestPairedReplacement\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const current = crossingSnapshot();\n const currentCrossings = current.count;\n if (currentCrossings === 0) {\n return;\n }\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n for (const edge of current.edges) {\n const currentEdgeBends = countOrthogonalBends(replacementPointsFor(edge), EPS_LOCAL);\n for (const candidate of candidatePathsFor(edge)) {\n const candidateHitsNode = pathHitsNode(edge, candidate);\n const candidateHasSegmentConflict = !candidateHitsNode && pathHasSegmentConflict(edge, candidate);\n const candidateCrossings = crossingCountWithSingleReplacement(current, edge, candidate);\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n if (candidateHitsNode || candidateHasSegmentConflict) {\n continue;\n }\n const improvesCurrentEdge = candidateCrossings < currentCrossings || candidateCrossings === currentCrossings && candidateBends < currentEdgeBends;\n if (!improvesCurrentEdge) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n if (bestEdge && bestPath) {\n bestEdge.points = bestPath;\n continue;\n }\n const pairedReplacement = bestPairedReplacement(current);\n if (!pairedReplacement) {\n return;\n }\n for (const [edge, points] of pairedReplacement) {\n edge.points = points;\n }\n }\n}\n__name(resolveRenderedOrthogonalCrossings, \"resolveRenderedOrthogonalCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/detourSimplification.ts\nvar EPS4 = 1e-3;\nvar MIN_SHARED2 = 8;\nfunction simplifyDetouredEdges(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const ANCHOR = 20;\n const outsideTracks = {\n top: Math.min(...realNodeRects.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodeRects.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodeRects.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodeRects.map((node) => node.rect.right)) + ANCHOR\n };\n const buildOrthogonalPathCandidates = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const paths = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS4);\n if (base) {\n paths.push(base);\n }\n if (srcSide === dstSide) {\n paths.push(buildSameSideTrackPath(src, srcSide, dst, outsideTracks[srcSide]));\n }\n return paths;\n }, \"buildOrthogonalPathCandidates\");\n const pathHitsNode = /* @__PURE__ */ __name((pts, excludeIds) => {\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n if (segmentHitsAnyRect(a, b, realNodeRects, excludeIds, 1)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pathConflictCount = /* @__PURE__ */ __name((path, currentEdge, includeIncidentEdges = false) => {\n let conflicts = 0;\n const pathSegments = orthogonalSegmentsForPoints(path, EPS4);\n const currentStart = currentEdge.start;\n const currentEnd = currentEdge.end;\n for (const other of edges) {\n if (other === currentEdge || other.isLayoutOnly) {\n continue;\n }\n const otherStart = other.start;\n const otherEnd = other.end;\n if (!includeIncidentEdges && currentStart && currentEnd && (otherStart === currentStart || otherStart === currentEnd || otherEnd === currentStart || otherEnd === currentEnd)) {\n continue;\n }\n const otherPts = other.points;\n if (!otherPts || otherPts.length < 2) {\n continue;\n }\n for (const pathSegment of pathSegments) {\n for (const otherSegment of orthogonalSegmentsForPoints(otherPts, EPS4)) {\n if (orthogonalSegmentsCross(\n pathSegment.a,\n pathSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS4,\n EPS4\n )) {\n conflicts++;\n continue;\n }\n if (sameAxisSegmentOverlapLength(pathSegment, otherSegment, EPS4) >= MIN_SHARED2) {\n conflicts++;\n }\n }\n }\n }\n return conflicts;\n }, \"pathConflictCount\");\n const BEND_THRESHOLD = 4;\n const nearestSideOfRect = /* @__PURE__ */ __name((pt, info) => {\n const dTop = Math.abs(pt.y - info.rect.top);\n const dBottom = Math.abs(pt.y - info.rect.bottom);\n const dLeft = Math.abs(pt.x - info.rect.left);\n const dRight = Math.abs(pt.x - info.rect.right);\n let best = \"top\";\n let bestDist = dTop;\n if (dBottom < bestDist) {\n best = \"bottom\";\n bestDist = dBottom;\n }\n if (dLeft < bestDist) {\n best = \"left\";\n bestDist = dLeft;\n }\n if (dRight < bestDist) {\n best = \"right\";\n bestDist = dRight;\n }\n return best;\n }, \"nearestSideOfRect\");\n const faceClaims = /* @__PURE__ */ new Map();\n const addFaceClaim = /* @__PURE__ */ __name((nodeId, side, edgeId) => {\n const claims = faceClaims.get(nodeId) ?? [];\n claims.push({ side, edgeId });\n faceClaims.set(nodeId, claims);\n }, \"addFaceClaim\");\n for (const e of edges) {\n if (e.isLayoutOnly) {\n continue;\n }\n const pts = e.points ?? [];\n if (pts.length < 1) {\n continue;\n }\n const eId = e.id ?? \"\";\n const startId = e.start;\n const endId = e.end;\n if (startId) {\n const info = nodeInfoById.get(startId);\n if (info) {\n addFaceClaim(startId, nearestSideOfRect(pts[0], info), eId);\n }\n }\n if (endId) {\n const info = nodeInfoById.get(endId);\n if (info) {\n addFaceClaim(endId, nearestSideOfRect(pts[pts.length - 1], info), eId);\n }\n }\n }\n const faceIsClaimed = /* @__PURE__ */ __name((nodeId, side, ignoreEdgeId) => {\n return faceClaims.get(nodeId)?.some((c) => c.edgeId !== ignoreEdgeId && c.side === side) ?? false;\n }, \"faceIsClaimed\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const currentBends = countOrthogonalBends(pts, EPS4);\n if (currentBends < BEND_THRESHOLD) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n continue;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n continue;\n }\n const edgeId = edge.id ?? \"\";\n const currentCrossingConflicts = pathConflictCount(pts, edge, true);\n const currentNonIncidentConflicts = pathConflictCount(pts, edge);\n let bestPath;\n let bestCrossingConflicts = currentCrossingConflicts;\n let bestBends = currentBends;\n for (const srcSide of sides) {\n if (faceIsClaimed(srcId, srcSide, edgeId)) {\n continue;\n }\n const srcPort = portForRectSide(srcInfo, srcSide);\n for (const dstSide of sides) {\n if (faceIsClaimed(dstId, dstSide, edgeId)) {\n continue;\n }\n const dstPort = portForRectSide(dstInfo, dstSide);\n for (const path of buildOrthogonalPathCandidates(srcPort, srcSide, dstPort, dstSide)) {\n if (pathHitsNode(path, [srcId, dstId])) {\n continue;\n }\n const pathBends = countOrthogonalBends(path, EPS4);\n if (currentCrossingConflicts > 0) {\n const pathCrossingConflicts = pathConflictCount(path, edge, true);\n if (pathCrossingConflicts > bestCrossingConflicts || pathCrossingConflicts === bestCrossingConflicts && pathBends >= bestBends) {\n continue;\n }\n bestCrossingConflicts = pathCrossingConflicts;\n bestBends = pathBends;\n bestPath = path;\n continue;\n }\n if (pathConflictCount(path, edge) > currentNonIncidentConflicts) {\n continue;\n }\n if (pathBends < bestBends) {\n bestBends = pathBends;\n bestPath = path;\n }\n }\n }\n }\n if (bestPath) {\n edge.points = bestPath;\n const refreshSrc = faceClaims.get(srcId);\n if (refreshSrc) {\n faceClaims.set(\n srcId,\n refreshSrc.filter((c) => c.edgeId !== edgeId)\n );\n }\n const refreshDst = faceClaims.get(dstId);\n if (refreshDst) {\n faceClaims.set(\n dstId,\n refreshDst.filter((c) => c.edgeId !== edgeId)\n );\n }\n addFaceClaim(srcId, nearestSideOfRect(bestPath[0], srcInfo), edgeId);\n addFaceClaim(dstId, nearestSideOfRect(bestPath[bestPath.length - 1], dstInfo), edgeId);\n }\n }\n}\n__name(simplifyDetouredEdges, \"simplifyDetouredEdges\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/labelAnchoring.ts\nvar EPS5 = 1e-3;\nvar MARKER_CLEARANCE_LENGTH = 10;\nvar MARKER_CLEARANCE_HALF_WIDTH = 7;\nfunction markerClearanceRectFor(pts, atStart) {\n const terminalIndex = atStart ? 0 : pts.length - 1;\n const step = atStart ? 1 : -1;\n const tip = pts[terminalIndex];\n const inner = pts[terminalIndex + step];\n if (!tip || !inner) {\n return void 0;\n }\n const dx = inner.x - tip.x;\n const dy = inner.y - tip.y;\n const len = Math.abs(dx) + Math.abs(dy);\n if (len < EPS5) {\n return void 0;\n }\n if (Math.abs(dy) <= EPS5) {\n const x2 = tip.x + Math.sign(dx) * MARKER_CLEARANCE_LENGTH;\n return {\n left: Math.min(tip.x, x2),\n right: Math.max(tip.x, x2),\n top: tip.y - MARKER_CLEARANCE_HALF_WIDTH,\n bottom: tip.y + MARKER_CLEARANCE_HALF_WIDTH\n };\n }\n if (Math.abs(dx) <= EPS5) {\n const y2 = tip.y + Math.sign(dy) * MARKER_CLEARANCE_LENGTH;\n return {\n left: tip.x - MARKER_CLEARANCE_HALF_WIDTH,\n right: tip.x + MARKER_CLEARANCE_HALF_WIDTH,\n top: Math.min(tip.y, y2),\n bottom: Math.max(tip.y, y2)\n };\n }\n return {\n left: Math.min(tip.x, inner.x),\n right: Math.max(tip.x, inner.x),\n top: Math.min(tip.y, inner.y),\n bottom: Math.max(tip.y, inner.y)\n };\n}\n__name(markerClearanceRectFor, \"markerClearanceRectFor\");\nfunction normalizeRect(rect) {\n return {\n left: Math.min(rect.left, rect.right),\n right: Math.max(rect.left, rect.right),\n top: Math.min(rect.top, rect.bottom),\n bottom: Math.max(rect.top, rect.bottom)\n };\n}\n__name(normalizeRect, \"normalizeRect\");\nfunction labelOverlapsOwnMarker(rect, pts) {\n const visiblePts = dedupeConsecutivePoints(pts);\n const startMarker = markerClearanceRectFor(visiblePts, true);\n const endMarker = markerClearanceRectFor(visiblePts, false);\n return [startMarker, endMarker].some(\n (marker) => marker && rectsOverlap(rect, normalizeRect(marker))\n );\n}\n__name(labelOverlapsOwnMarker, \"labelOverlapsOwnMarker\");\nfunction anchorLabelsToPolyline(edges, nodeByIdMap) {\n const allEdgeSegments = [];\n for (const other of edges) {\n if (other.isLayoutOnly) {\n continue;\n }\n const pts = other.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n for (let i = 0; i < pts.length - 1; i++) {\n allEdgeSegments.push({ edgeId: other.id, p1: pts[i], p2: pts[i + 1] });\n }\n }\n const foreignNodeRects = [];\n const laneGroups = [];\n for (const n of nodeByIdMap.values()) {\n const isGroup = n.isGroup;\n const parentId = n.parentId;\n if (isGroup && !parentId) {\n const rect2 = rectOfNodeBounds(n);\n if (rect2) {\n laneGroups.push({\n id: n.id,\n rect: rect2\n });\n }\n continue;\n }\n if (isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n continue;\n }\n const rect = rectOfNodeBounds(n);\n if (!rect) {\n continue;\n }\n foreignNodeRects.push({\n nodeId: n.id,\n rect\n });\n }\n const LABEL_PLACEMENT_BUFFER = 3;\n const LABEL_LANE_MARGIN = 1;\n const LABEL_ENDPOINT_CLEARANCE = 12;\n const labelOverlapsForeignNode = /* @__PURE__ */ __name((labelId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const { nodeId, rect: nr } of foreignNodeRects) {\n if (nodeId === labelId) {\n continue;\n }\n if (rectsOverlap(buffered, nr)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignNode\");\n const labelOverlapsForeignEdge = /* @__PURE__ */ __name((edgeId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const s of allEdgeSegments) {\n if (s.edgeId === edgeId) {\n continue;\n }\n if (segmentBoundsOverlapRect(s.p1, s.p2, buffered)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignEdge\");\n const labelOverlapsAnything = /* @__PURE__ */ __name((labelId, edgeId, rect) => labelOverlapsForeignNode(labelId, rect) || labelOverlapsForeignEdge(edgeId, rect), \"labelOverlapsAnything\");\n const placedLabelRects = [];\n const findContainingLane = /* @__PURE__ */ __name((rect) => {\n for (const { id, rect: laneRect } of laneGroups) {\n if (rectContainsRect(laneRect, rect)) {\n return id;\n }\n }\n return void 0;\n }, \"findContainingLane\");\n const overlapsPlacedLabel = /* @__PURE__ */ __name((labelId, rect) => placedLabelRects.some(\n (placed) => placed.labelId !== labelId && rectsOverlap(rect, placed.rect)\n ), \"overlapsPlacedLabel\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const labelId = edge.labelNodeId;\n if (!labelId) {\n continue;\n }\n const labelNode = nodeByIdMap.get(labelId);\n if (!labelNode) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw <= 0 || lh <= 0) {\n continue;\n }\n const segments = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n if (dx < EPS5 && dy < EPS5) {\n continue;\n }\n if (dx >= EPS5 && dy >= EPS5) {\n continue;\n }\n segments.push({\n idx: i,\n length: dx + dy,\n orientation: dx >= EPS5 ? \"horizontal\" : \"vertical\",\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2\n });\n }\n if (segments.length === 0) {\n continue;\n }\n const middleSegments = segments.length >= 3 ? segments.filter((s) => s.idx > 0 && s.idx < segments.length - 1) : segments;\n const poolBase = middleSegments.length > 0 ? middleSegments : segments;\n const labelLongAxis = lw >= lh ? \"horizontal\" : \"vertical\";\n const rankSegments = /* @__PURE__ */ __name((pool) => {\n return [...pool].sort((a, b) => {\n const aLongAxis = a.orientation === labelLongAxis;\n const bLongAxis = b.orientation === labelLongAxis;\n if (aLongAxis !== bLongAxis) {\n return aLongAxis ? -1 : 1;\n }\n const aFits = a.length >= (a.orientation === \"horizontal\" ? lw : lh) + 2;\n const bFits = b.length >= (b.orientation === \"horizontal\" ? lw : lh) + 2;\n if (aFits !== bFits) {\n return aFits ? -1 : 1;\n }\n return b.length - a.length;\n });\n }, \"rankSegments\");\n const firstVisibleSegment = segments[0];\n const lastVisibleSegment = segments[segments.length - 1];\n const ALONG_SEGMENT_TS = [0.5, 0.25, 0.75, 0.05, 0.95, 0.15, 0.85, 0.1, 0.9];\n const anchorAtT = /* @__PURE__ */ __name((seg, t) => {\n const a = pts[seg.idx];\n const b = pts[seg.idx + 1];\n return {\n midX: a.x + (b.x - a.x) * t,\n midY: a.y + (b.y - a.y) * t\n };\n }, \"anchorAtT\");\n const clamp = /* @__PURE__ */ __name((value, min, max) => Math.min(max, Math.max(min, value)), \"clamp\");\n const pointInsideRectInclusive = /* @__PURE__ */ __name((point, rect) => point.midX >= rect.left - EPS5 && point.midX <= rect.right + EPS5 && point.midY >= rect.top - EPS5 && point.midY <= rect.bottom + EPS5, \"pointInsideRectInclusive\");\n const placementForAnchor = /* @__PURE__ */ __name((anchor) => {\n const centeredRect = rectFromCenterSize(anchor.midX, anchor.midY, lw, lh);\n const centeredLane = findContainingLane(centeredRect);\n if (centeredLane) {\n return { laneId: centeredLane, anchor, rect: centeredRect };\n }\n const containingLane = laneGroups.find(({ rect }) => pointInsideRectInclusive(anchor, rect));\n if (!containingLane) {\n return void 0;\n }\n const minX = containingLane.rect.left + lw / 2 + LABEL_LANE_MARGIN;\n const maxX = containingLane.rect.right - lw / 2 - LABEL_LANE_MARGIN;\n const minY = containingLane.rect.top + lh / 2 + LABEL_LANE_MARGIN;\n const maxY = containingLane.rect.bottom - lh / 2 - LABEL_LANE_MARGIN;\n if (minX > maxX || minY > maxY) {\n return void 0;\n }\n const clampedAnchor = {\n midX: clamp(anchor.midX, minX, maxX),\n midY: clamp(anchor.midY, minY, maxY)\n };\n const clampedRect = rectFromCenterSize(clampedAnchor.midX, clampedAnchor.midY, lw, lh);\n return pointInsideRectInclusive(anchor, clampedRect) ? { laneId: containingLane.id, anchor: clampedAnchor, rect: clampedRect } : void 0;\n }, \"placementForAnchor\");\n const distanceAlongSegment = /* @__PURE__ */ __name((seg, anchor, endpoint) => seg.orientation === \"horizontal\" ? Math.abs(anchor.midX - endpoint.x) : Math.abs(anchor.midY - endpoint.y), \"distanceAlongSegment\");\n const labelClearsTerminalEndpoints = /* @__PURE__ */ __name((seg, anchor) => {\n const labelHalfExtent = seg.orientation === \"horizontal\" ? lw / 2 : lh / 2;\n const requiredDistance = labelHalfExtent + LABEL_ENDPOINT_CLEARANCE;\n if (seg === firstVisibleSegment) {\n const start = pts[seg.idx];\n if (distanceAlongSegment(seg, anchor, start) + EPS5 < requiredDistance) {\n return false;\n }\n }\n if (seg === lastVisibleSegment) {\n const end = pts[seg.idx + 1];\n if (distanceAlongSegment(seg, anchor, end) + EPS5 < requiredDistance) {\n return false;\n }\n }\n return true;\n }, \"labelClearsTerminalEndpoints\");\n const tryPool = /* @__PURE__ */ __name((pool) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n for (const t of ALONG_SEGMENT_TS) {\n const anchor = anchorAtT(seg, t);\n if (!labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (!placement) {\n continue;\n }\n if (labelOverlapsOwnMarker(placement.rect, pts)) {\n continue;\n }\n if (overlapsPlacedLabel(labelId, placement.rect)) {\n continue;\n }\n if (!labelOverlapsAnything(labelId, edge.id, placement.rect)) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n }\n return void 0;\n }, \"tryPool\");\n const findLaneContainingFallback = /* @__PURE__ */ __name((pool, requireEndpointClearance, allowForeignEdgeOverlap = false) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n const anchor = { midX: seg.midX, midY: seg.midY };\n if (requireEndpointClearance && !labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (placement && !labelOverlapsOwnMarker(placement.rect, pts) && !overlapsPlacedLabel(labelId, placement.rect) && !labelOverlapsForeignNode(labelId, placement.rect) && (allowForeignEdgeOverlap || !labelOverlapsForeignEdge(edge.id, placement.rect))) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n return void 0;\n }, \"findLaneContainingFallback\");\n const chosen = tryPool(poolBase) ?? (poolBase.length < segments.length ? tryPool(segments) : void 0) ?? findLaneContainingFallback(segments, true) ?? findLaneContainingFallback(segments, false) ?? findLaneContainingFallback(segments, false, true);\n if (chosen) {\n labelNode.x = chosen.anchor.midX;\n labelNode.y = chosen.anchor.midY;\n labelNode.parentId = chosen.laneId;\n const chosenRect = rectFromCenterSize(chosen.anchor.midX, chosen.anchor.midY, lw, lh);\n const priorIdx = placedLabelRects.findIndex((placed) => placed.labelId === labelId);\n if (priorIdx >= 0) {\n placedLabelRects[priorIdx] = { labelId, rect: chosenRect };\n } else {\n placedLabelRects.push({ labelId, rect: chosenRect });\n }\n }\n }\n}\n__name(anchorLabelsToPolyline, \"anchorLabelsToPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/siblingSharedFaceRouting.ts\nvar EPS6 = 1e-6;\nvar MIN_PORT_SPACING2 = 8;\nvar PORT_SHIFT2 = MIN_PORT_SPACING2 / 2;\nvar LABEL_CLEARANCE_BUFFER = 3;\nfunction pairKey(a, b) {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n__name(pairKey, \"pairKey\");\nfunction straightenCollinearSiblingDetours(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const labelDimById = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n const id = n.id;\n if (n.isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n labelDimById.set(id, {\n w: n.width ?? 0,\n h: n.height ?? 0\n });\n continue;\n }\n }\n const labelClearanceFor = /* @__PURE__ */ __name((thisEdge, thisSrcId, thisDstId, axis) => {\n const targetPair = pairKey(thisSrcId, thisDstId);\n let maxHalf = 0;\n const consider = /* @__PURE__ */ __name((labelId) => {\n if (!labelId) {\n return;\n }\n const dim = labelDimById.get(labelId);\n if (!dim) {\n return;\n }\n const half = axis === \"x\" ? dim.w / 2 : dim.h / 2;\n if (half > maxHalf) {\n maxHalf = half;\n }\n }, \"consider\");\n consider(thisEdge.labelNodeId);\n for (const other of edges) {\n if (other === thisEdge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oSrc = other.start;\n const oDst = other.end;\n if (!oSrc || !oDst) {\n continue;\n }\n if (pairKey(oSrc, oDst) !== targetPair) {\n continue;\n }\n consider(other.labelNodeId);\n }\n return maxHalf > 0 ? maxHalf + LABEL_CLEARANCE_BUFFER : 0;\n }, \"labelClearanceFor\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!classifyThreeSegmentRoute(pts, EPS6)) {\n continue;\n }\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS6);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX === collinearY) {\n continue;\n }\n let targetSrc;\n let targetDst;\n if (collinearX) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n targetSrc = { x: srcInfo.cx, y: dstBelow ? srcInfo.rect.bottom : srcInfo.rect.top };\n targetDst = { x: dstInfo.cx, y: dstBelow ? dstInfo.rect.top : dstInfo.rect.bottom };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n targetSrc = { x: dstEast ? srcInfo.rect.right : srcInfo.rect.left, y: srcInfo.cy };\n targetDst = { x: dstEast ? dstInfo.rect.left : dstInfo.rect.right, y: dstInfo.cy };\n }\n if (segmentHitsAnyRect(targetSrc, targetDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n const shiftAxis = collinearX ? \"x\" : \"y\";\n const labelShift = labelClearanceFor(edge, srcId, dstId, shiftAxis);\n const effectiveShift = labelShift > PORT_SHIFT2 ? labelShift : PORT_SHIFT2;\n const deltas = [0, effectiveShift, -effectiveShift];\n for (const delta of deltas) {\n const shiftedSrc = { ...targetSrc };\n const shiftedDst = { ...targetDst };\n if (collinearX) {\n shiftedSrc.x += delta;\n shiftedDst.x += delta;\n if (shiftedSrc.x <= srcInfo.rect.left || shiftedSrc.x >= srcInfo.rect.right) {\n continue;\n }\n if (shiftedDst.x <= dstInfo.rect.left || shiftedDst.x >= dstInfo.rect.right) {\n continue;\n }\n } else {\n shiftedSrc.y += delta;\n shiftedDst.y += delta;\n if (shiftedSrc.y <= srcInfo.rect.top || shiftedSrc.y >= srcInfo.rect.bottom) {\n continue;\n }\n if (shiftedDst.y <= dstInfo.rect.top || shiftedDst.y >= dstInfo.rect.bottom) {\n continue;\n }\n }\n if (segmentHitsAnyRect(shiftedSrc, shiftedDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n if (segmentConflictsWithAnyEdge(shiftedSrc, shiftedDst, edges, edge, { epsilon: EPS6 })) {\n continue;\n }\n edge.points = [shiftedSrc, shiftedDst];\n break;\n }\n }\n}\n__name(straightenCollinearSiblingDetours, \"straightenCollinearSiblingDetours\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/sharedTrackNudging.ts\nfunction nudgeSharedInteriorSubpaths(edges, nodeByIdMap) {\n const EPS_LOCAL2 = 1e-3;\n const MIN_SHARED3 = 8;\n const TRACK_SHIFT = 7;\n const MIN_TRACK_GAP = TRACK_SHIFT;\n const SOURCE_DETOUR_STUB = 20;\n const BUFFER = 2;\n const MAX_ITERATIONS = 12;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const segmentsFor2 = /* @__PURE__ */ __name((edge, points) => {\n return orthogonalSegmentsForPoints(points, EPS_LOCAL2).map((segment) => ({\n ...segment,\n edge,\n interior: segment.index >= 1 && segment.index <= points.length - 3\n }));\n }, \"segmentsFor\");\n const allSegments = /* @__PURE__ */ __name(() => {\n const result = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n result.push(...segmentsFor2(edge, dedupeConsecutivePoints(points)));\n }\n return result;\n }, \"allSegments\");\n const hasCrowdedParallelTrack = /* @__PURE__ */ __name((a, b) => {\n if (a.horizontal && b.horizontal) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x) >= MIN_SHARED3 && Math.abs(a.a.y - b.a.y) < MIN_TRACK_GAP;\n }\n if (a.vertical && b.vertical) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y) >= MIN_SHARED3 && Math.abs(a.a.x - b.a.x) < MIN_TRACK_GAP;\n }\n return false;\n }, \"hasCrowdedParallelTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor2(edge, candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n const ownLabelIds = edge.labelNodeId ? [edge.labelNodeId] : [];\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, ownLabelIds, -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor2(other, dedupeConsecutivePoints(otherPoints))) {\n if (hasCrowdedParallelTrack(candidateSegment, otherSegment)) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL2\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const shiftedCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const points = dedupeConsecutivePoints(segment.edge.points ?? []);\n if (points.length < 4 || segment.index >= points.length - 1) {\n return void 0;\n }\n const candidate = points.map((p) => ({ ...p }));\n if (segment.horizontal) {\n candidate[segment.index].y += shift;\n candidate[segment.index + 1].y += shift;\n } else if (segment.vertical) {\n candidate[segment.index].x += shift;\n candidate[segment.index + 1].x += shift;\n } else {\n return void 0;\n }\n return segmentsFor2(segment.edge, candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"shiftedCandidate\");\n const nodeCenter = /* @__PURE__ */ __name((node, rect) => ({\n x: node.x ?? (rect.left + rect.right) / 2,\n y: node.y ?? (rect.top + rect.bottom) / 2\n }), \"nodeCenter\");\n const sourceDetourContextFor = /* @__PURE__ */ __name((segment) => {\n const edge = segment.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 4 || segment.index !== 1) {\n return void 0;\n }\n const sourceNode = edge.start ? nodeByIdMap.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeByIdMap.get(edge.end) : void 0;\n const sourceRect = sourceNode ? rectOfNodeBounds(sourceNode) : void 0;\n const targetRect = targetNode ? rectOfNodeBounds(targetNode) : void 0;\n const tail = points.slice(segment.index + 2);\n if (!sourceNode || !targetNode || !sourceRect || !targetRect || tail.length === 0) {\n return void 0;\n }\n return {\n sourceCenter: nodeCenter(sourceNode, sourceRect),\n targetCenter: nodeCenter(targetNode, targetRect),\n sourceRect,\n tail\n };\n }, \"sourceDetourContextFor\");\n const verticalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetBelow = targetCenter.y >= sourceCenter.y;\n const sourcePortY = targetBelow ? sourceRect.bottom : sourceRect.top;\n const stubY = sourcePortY + (targetBelow ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetBelow && segment.b.y <= stubY + EPS_LOCAL2 || !targetBelow && segment.b.y >= stubY - EPS_LOCAL2) {\n return void 0;\n }\n const railX = segment.a.x + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourceCenter.x, y: sourcePortY },\n { x: sourceCenter.x, y: stubY },\n { x: railX, y: stubY },\n { x: railX, y: segment.b.y },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"verticalSourceDetour\");\n const horizontalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetRight = targetCenter.x >= sourceCenter.x;\n const sourcePortX = targetRight ? sourceRect.right : sourceRect.left;\n const stubX = sourcePortX + (targetRight ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetRight && segment.b.x <= stubX + EPS_LOCAL2 || !targetRight && segment.b.x >= stubX - EPS_LOCAL2) {\n return void 0;\n }\n const railY = segment.a.y + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourcePortX, y: sourceCenter.y },\n { x: stubX, y: sourceCenter.y },\n { x: stubX, y: railY },\n { x: segment.b.x, y: railY },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"horizontalSourceDetour\");\n const sourceDetourCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const context = sourceDetourContextFor(segment);\n if (!context) {\n return void 0;\n }\n if (segment.vertical) {\n return verticalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n if (segment.horizontal) {\n return horizontalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n return void 0;\n }, \"sourceDetourCandidate\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const segments = allSegments();\n let fixed = false;\n for (let i = 0; i < segments.length && !fixed; i++) {\n for (let j = i + 1; j < segments.length && !fixed; j++) {\n const first = segments[i];\n const second = segments[j];\n if (first.edge === second.edge || !hasCrowdedParallelTrack(first, second)) {\n continue;\n }\n const candidates = [first, second].filter((segment) => segment.interior);\n for (const segment of candidates) {\n for (const shift of shifts) {\n const direct = shiftedCandidate(segment, shift);\n if (direct && candidateIsSafe(segment.edge, direct)) {\n segment.edge.points = direct;\n fixed = true;\n break;\n }\n const detoured = sourceDetourCandidate(segment, shift);\n if (detoured && candidateIsSafe(segment.edge, detoured)) {\n segment.edge.points = detoured;\n fixed = true;\n break;\n }\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(nudgeSharedInteriorSubpaths, \"nudgeSharedInteriorSubpaths\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/validation.ts\nfunction segmentsIntersect(p1, p2, p3, p4) {\n const d1x = p2.x - p1.x;\n const d1y = p2.y - p1.y;\n const d2x = p4.x - p3.x;\n const d2y = p4.y - p3.y;\n const cross = d1x * d2y - d1y * d2x;\n if (Math.abs(cross) < 1e-10) {\n return false;\n }\n const dx = p3.x - p1.x;\n const dy = p3.y - p1.y;\n const t = (dx * d2y - dy * d2x) / cross;\n const u = (dx * d1y - dy * d1x) / cross;\n const eps = 0.01;\n return t > eps && t < 1 - eps && u > eps && u < 1 - eps;\n}\n__name(segmentsIntersect, \"segmentsIntersect\");\nfunction validateSwimlanesLayout(layout) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const issues = [];\n if (!edges.length || !nodes.length) {\n return issues;\n }\n const nodeRects = collectLayoutNodeRects(nodes);\n const epsilon = 1;\n const edgeSegments = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n const edgeStart = edge.start;\n const edgeEnd = edge.end;\n const ownLabelId = edge.labelNodeId;\n const edgeId = edge.id ?? `${edgeStart}->${edgeEnd}`;\n for (const rect of nodeRects) {\n if (rect.nodeId === edgeStart || rect.nodeId === edgeEnd) {\n continue;\n }\n if (ownLabelId && rect.nodeId === ownLabelId) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n if (segmentBoundsOverlapRect(points[i], points[i + 1], rect, -epsilon)) {\n issues.push({\n type: \"edge-node-overlap\",\n edgeId,\n targetId: rect.nodeId,\n detail: `segment ${i} passes through node \"${rect.nodeId}\"`\n });\n break;\n }\n }\n }\n for (let i = 0; i < points.length - 1; i++) {\n edgeSegments.push({\n edgeId,\n start: edgeStart,\n end: edgeEnd,\n p1: points[i],\n p2: points[i + 1]\n });\n }\n }\n const crossingPairs = /* @__PURE__ */ new Set();\n for (let i = 0; i < edgeSegments.length; i++) {\n for (let j = i + 1; j < edgeSegments.length; j++) {\n const a = edgeSegments[i];\n const b = edgeSegments[j];\n if (a.edgeId === b.edgeId) {\n continue;\n }\n if (a.start === b.start || a.start === b.end || a.end === b.start || a.end === b.end) {\n continue;\n }\n if (segmentsIntersect(a.p1, a.p2, b.p1, b.p2)) {\n const pairKey2 = a.edgeId < b.edgeId ? `${a.edgeId}|${b.edgeId}` : `${b.edgeId}|${a.edgeId}`;\n if (!crossingPairs.has(pairKey2)) {\n crossingPairs.add(pairKey2);\n issues.push({\n type: \"edge-edge-crossing\",\n edgeId: a.edgeId,\n targetId: b.edgeId,\n detail: `edges \"${a.edgeId}\" and \"${b.edgeId}\" cross`\n });\n }\n }\n }\n }\n if (issues.length > 0) {\n const overlaps = issues.filter((i) => i.type === \"edge-node-overlap\").length;\n const crossings = issues.filter((i) => i.type === \"edge-edge-crossing\").length;\n log.warn(\n `[SWIMLANE_VALIDATE] ${issues.length} issue(s) detected: ${overlaps} edge-node overlap(s), ${crossings} edge crossing(s)`\n );\n for (const issue of issues) {\n log.warn(`[SWIMLANE_VALIDATE] ${issue.type}: ${issue.detail}`);\n }\n }\n return issues;\n}\n__name(validateSwimlanesLayout, \"validateSwimlanesLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/postProcessing.ts\nfunction postProcessSwimlaneLayout(layout, direction) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n if ((direction === \"LR\" || direction === \"RL\") && contentNodes.length > 0 && !applyLrDirectionTransform(layout, direction)) {\n return;\n }\n if (direction === \"BT\" && contentNodes.length > 0 && !applyBtDirectionTransform(layout)) {\n return;\n }\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n edge.points = simplifyPolyline(\n orthogonalizePolyline(pts)\n );\n }\n simplifyDetouredEdges(edges, nodes);\n straightenCollinearSiblingDetours(edges, nodes);\n portSwapToLShape(edges, nodes);\n const nodeByIdMap = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n nodeByIdMap.set(String(n.id), n);\n }\n anchorLabelsToPolyline(edges, nodeByIdMap);\n clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap);\n collapseShortTerminalStub(edges, nodeByIdMap);\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n separateSharedRenderedTerminalLanes(edges, nodeByIdMap);\n collapseRedundantRectangularDoglegs(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap);\n const finalizeRenderedEdges = /* @__PURE__ */ __name(() => {\n resolveRenderedOrthogonalCrossings(edges, nodeByIdMap);\n reassignCrossingExternalRailChannels(edges, nodeByIdMap);\n shortcutRedundantOrthogonalJogs(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n }, \"finalizeRenderedEdges\");\n finalizeRenderedEdges();\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n finalizeRenderedEdges();\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n}\n__name(postProcessSwimlaneLayout, \"postProcessSwimlaneLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase0.helpers.ts\nfunction normalizeGraph(g) {\n const nodeById = new Map(g.nodeById);\n const seen = /* @__PURE__ */ new Set();\n const edges = [];\n for (const e of g.edges) {\n if (!nodeById.has(e.src) || !nodeById.has(e.dst)) {\n continue;\n }\n const key = `${e.id}:${e.src}->${e.dst}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n edges.push(e);\n }\n const nodes = [...nodeById.keys()];\n return { nodes, edges, layout: g.layout, nodeById };\n}\n__name(normalizeGraph, \"normalizeGraph\");\nfunction incoming(g, v) {\n return g.edges.filter((e) => e.dst === v);\n}\n__name(incoming, \"incoming\");\nfunction buildSuccessorMap(g) {\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n succs.set(v, []);\n }\n for (const e of g.edges) {\n succs.get(e.src).push(e.dst);\n }\n return succs;\n}\n__name(buildSuccessorMap, \"buildSuccessorMap\");\nfunction buildSortedSuccessorMap(g) {\n const succs = buildSuccessorMap(g);\n for (const successors of succs.values()) {\n successors.sort((a, b) => a.localeCompare(b));\n }\n return succs;\n}\n__name(buildSortedSuccessorMap, \"buildSortedSuccessorMap\");\nfunction buildInDegreeMap(g) {\n const indeg = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n indeg.set(v, 0);\n }\n for (const e of g.edges) {\n indeg.set(e.dst, (indeg.get(e.dst) ?? 0) + 1);\n }\n return indeg;\n}\n__name(buildInDegreeMap, \"buildInDegreeMap\");\nfunction sortedZeroInDegreeNodes(indeg) {\n return [...indeg.entries()].filter(([, degree]) => degree === 0).map(([id]) => id).sort((a, b) => a.localeCompare(b));\n}\n__name(sortedZeroInDegreeNodes, \"sortedZeroInDegreeNodes\");\nfunction buildPredecessorSuccessorMaps(g, includeEdge = () => true) {\n const preds = /* @__PURE__ */ new Map();\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n preds.set(v, []);\n succs.set(v, []);\n }\n for (const e of g.edges) {\n if (!includeEdge(e)) {\n continue;\n }\n succs.get(e.src).push(e.dst);\n preds.get(e.dst).push(e.src);\n }\n return { preds, succs };\n}\n__name(buildPredecessorSuccessorMaps, \"buildPredecessorSuccessorMaps\");\nfunction buildLayersFromRanks(g, order, rankOf, opts) {\n let maxRank = 0;\n for (const v of g.nodes) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n maxRank = Math.max(maxRank, rankOf[v] ?? 0);\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n for (const v of order) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n layers[Math.max(0, rankOf[v] ?? 0)].push(v);\n }\n return layers;\n}\n__name(buildLayersFromRanks, \"buildLayersFromRanks\");\nfunction topoSortIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const queue = sortedZeroInDegreeNodes(indeg);\n const order = [];\n const adj = buildSortedSuccessorMap(g);\n while (queue.length) {\n const u = queue.shift();\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n let i = 0;\n while (i < queue.length && queue[i] < v) {\n i++;\n }\n queue.splice(i, 0, v);\n }\n }\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortIfAcyclic, \"topoSortIfAcyclic\");\nfunction buildLayerIndex(layer) {\n const m = /* @__PURE__ */ new Map();\n let index = 0;\n for (const id of layer) {\n m.set(id, index);\n index++;\n }\n return m;\n}\n__name(buildLayerIndex, \"buildLayerIndex\");\nfunction countInversions(values) {\n const tmp = new Array(values.length);\n const count = /* @__PURE__ */ __name((left, right) => {\n if (right - left <= 1) {\n return 0;\n }\n const mid = left + right >> 1;\n let inversions = count(left, mid) + count(mid, right);\n let i = left;\n let j = mid;\n let k = left;\n while (i < mid || j < right) {\n if (j >= right || i < mid && values[i] <= values[j]) {\n tmp[k++] = values[i++];\n } else {\n tmp[k++] = values[j++];\n inversions += mid - i;\n }\n }\n for (let t = left; t < right; t++) {\n values[t] = tmp[t];\n }\n return inversions;\n }, \"count\");\n return count(0, values.length);\n}\n__name(countInversions, \"countInversions\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase1.cycles.ts\nfunction removeCycles_DFS(g) {\n const gn = normalizeGraph(g);\n const adj = /* @__PURE__ */ new Map();\n for (const v of gn.nodes) {\n adj.set(v, []);\n }\n for (const e of gn.edges) {\n adj.get(e.src).push(e);\n }\n for (const arr of adj.values()) {\n arr.sort((a, b) => a.dst === b.dst ? a.id.localeCompare(b.id) : a.dst.localeCompare(b.dst));\n }\n const color = /* @__PURE__ */ Object.create(null);\n for (const v of gn.nodes) {\n color[v] = 0;\n }\n const reversed = [];\n const dfs = /* @__PURE__ */ __name((u) => {\n color[u] = 1;\n for (const e of adj.get(u) ?? []) {\n const v = e.dst;\n if (color[v] === 0) {\n dfs(v);\n } else if (color[v] === 1) {\n reversed.push(e);\n }\n }\n color[u] = 2;\n }, \"dfs\");\n const nodesSorted = [...gn.nodes].sort((a, b) => a.localeCompare(b));\n for (const v of nodesSorted) {\n if (color[v] === 0) {\n dfs(v);\n }\n }\n const toReverse = new Set(reversed.map((e) => `${e.id}:${e.src}->${e.dst}`));\n const acycEdges = gn.edges.map(\n (e) => toReverse.has(`${e.id}:${e.src}->${e.dst}`) ? { id: e.id, src: e.dst, dst: e.src, weight: e.weight, ref: e.ref } : e\n );\n const acyclic = {\n nodes: [...gn.nodes],\n edges: acycEdges,\n layout: gn.layout,\n nodeById: new Map(gn.nodeById)\n };\n return { acyclic, reversed };\n}\n__name(removeCycles_DFS, \"removeCycles_DFS\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.options.ts\nfunction buildTopLaneMap(g) {\n const cache = /* @__PURE__ */ new Map();\n const resolve = /* @__PURE__ */ __name((id) => {\n if (cache.has(id)) {\n return cache.get(id);\n }\n const node = g.nodeById.get(id);\n if (!node) {\n cache.set(id, null);\n return null;\n }\n const parentId = node.parentId;\n if (!parentId) {\n cache.set(id, null);\n return null;\n }\n const parentLane = resolve(parentId);\n const lane = parentLane ?? parentId;\n cache.set(id, lane);\n return lane;\n }, \"resolve\");\n for (const id of g.nodes) {\n resolve(id);\n }\n return cache;\n}\n__name(buildTopLaneMap, \"buildTopLaneMap\");\nfunction createTopLaneResolver(g) {\n const topLaneMap = buildTopLaneMap(g);\n return (id) => topLaneMap.get(id) ?? null;\n}\n__name(createTopLaneResolver, \"createTopLaneResolver\");\nfunction buildTopLaneOrder(g) {\n const lanes = [];\n for (const node of g.layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n lanes.push(node.id);\n }\n }\n return [...new Set(lanes)].reverse();\n}\n__name(buildTopLaneOrder, \"buildTopLaneOrder\");\nfunction resolveTopLaneOrder(g, preferredOrder) {\n const sourceOrder = buildTopLaneOrder(g);\n if (!preferredOrder || preferredOrder.length === 0) {\n return sourceOrder;\n }\n const sourceLaneIds = new Set(sourceOrder);\n const seen = /* @__PURE__ */ new Set();\n const resolved = [];\n for (const laneId of preferredOrder) {\n if (!sourceLaneIds.has(laneId) || seen.has(laneId)) {\n continue;\n }\n seen.add(laneId);\n resolved.push(laneId);\n }\n for (const laneId of sourceOrder) {\n if (seen.has(laneId)) {\n continue;\n }\n resolved.push(laneId);\n }\n return resolved;\n}\n__name(resolveTopLaneOrder, \"resolveTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/config.ts\nvar PRECISION = {\n /** Epsilon for floating-point comparisons */\n EPSILON: 1e-6\n};\nvar LAYERING = {\n /** Default number of iterations for gravity-based layering */\n GRAVITY_ITERATIONS: 8,\n /** Maximum number of passes for crossing-based rank optimization */\n MAX_CROSSING_OPTIMIZATION_PASSES: 4,\n /** Whether to compact single-input nodes by default */\n DEFAULT_COMPACT_SINGLE_INPUT: true\n};\nvar COORDINATES = {\n /** Default vertical gap between layers (px) */\n DEFAULT_LAYER_GAP: 100,\n /** Default horizontal gap between nodes (px) */\n DEFAULT_NODE_GAP: 40\n};\n\n// src/rendering-util/layout-algorithms/swimlanes/driving-tree.ts\nfunction buildDrivingTree(graph, opts) {\n const g = normalizeGraph(graph);\n const laneOf = opts?.laneOf ?? (() => null);\n const rankHint = opts?.rankHint;\n const { preds } = buildPredecessorSuccessorMaps(g);\n for (const arr of preds.values()) {\n arr.sort((a, b) => a.localeCompare(b));\n }\n const topoOrder = topoSortIfAcyclic(g) ?? [...g.nodes].sort((a, b) => a.localeCompare(b));\n const topoIndex = /* @__PURE__ */ new Map();\n for (const [idx, id] of topoOrder.entries()) {\n topoIndex.set(id, idx);\n }\n const parent = /* @__PURE__ */ new Map();\n const children = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n children.set(node, []);\n }\n for (const node of topoOrder) {\n const candidates = (preds.get(node) ?? []).filter((p) => parent.has(p));\n if (candidates.length > 0) {\n const chosen = chooseParent(node, candidates, {\n laneOf,\n rankHint,\n topoIndex\n });\n parent.set(node, chosen);\n children.get(chosen).push(node);\n } else if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n for (const node of g.nodes) {\n if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n const rootSet = /* @__PURE__ */ new Set();\n for (const node of g.nodes) {\n if ((parent.get(node) ?? null) === null) {\n rootSet.add(node);\n }\n }\n const roots = [...rootSet].sort((a, b) => {\n const ta = topoIndex.get(a) ?? 0;\n const tb = topoIndex.get(b) ?? 0;\n if (ta === tb) {\n return a.localeCompare(b);\n }\n return ta - tb;\n });\n const adjacency = buildAdjacency(g);\n const adjacencyList = /* @__PURE__ */ new Map();\n for (const [node, set] of adjacency.entries()) {\n adjacencyList.set(\n node,\n [...set].sort((a, b) => a.localeCompare(b))\n );\n }\n const componentOf = assignComponents(adjacencyList);\n const blocks = computeBlocks(adjacencyList);\n const nodeBlocks = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n nodeBlocks.set(node, []);\n }\n for (const block of blocks) {\n for (const node of block.nodes) {\n const list = nodeBlocks.get(node);\n if (list) {\n list.push(block.id);\n } else {\n nodeBlocks.set(node, [block.id]);\n }\n }\n }\n const preorder = [];\n const postorder = [];\n const seen = /* @__PURE__ */ new Set();\n const walk = /* @__PURE__ */ __name((node) => {\n if (seen.has(node)) {\n return;\n }\n seen.add(node);\n preorder.push(node);\n for (const child of children.get(node) ?? []) {\n walk(child);\n }\n postorder.push(node);\n }, \"walk\");\n for (const root of roots) {\n walk(root);\n }\n for (const node of topoOrder) {\n walk(node);\n }\n return {\n parent,\n children,\n roots,\n componentOf,\n blocks,\n nodeBlocks,\n adjacency: adjacencyList,\n preorder,\n postorder,\n topologicalOrder: topoOrder\n };\n}\n__name(buildDrivingTree, \"buildDrivingTree\");\nfunction chooseParent(node, candidates, ctx) {\n const laneNode = ctx.laneOf(node);\n const sorted = [...candidates].sort((a, b) => {\n const laneA = ctx.laneOf(a);\n const laneB = ctx.laneOf(b);\n const sameLaneA = laneA != null && laneA === laneNode;\n const sameLaneB = laneB != null && laneB === laneNode;\n if (sameLaneA !== sameLaneB) {\n return sameLaneA ? -1 : 1;\n }\n const rankA = ctx.rankHint?.[a];\n const rankB = ctx.rankHint?.[b];\n if (rankA != null && rankB != null && rankA !== rankB) {\n return rankB - rankA;\n }\n const idxA = ctx.topoIndex.get(a) ?? 0;\n const idxB = ctx.topoIndex.get(b) ?? 0;\n if (idxA !== idxB) {\n return idxA - idxB;\n }\n return a.localeCompare(b);\n });\n return sorted[0];\n}\n__name(chooseParent, \"chooseParent\");\nfunction buildAdjacency(g) {\n const adjacency = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n adjacency.set(node, /* @__PURE__ */ new Set());\n }\n for (const e of g.edges) {\n adjacency.get(e.src).add(e.dst);\n adjacency.get(e.dst).add(e.src);\n }\n return adjacency;\n}\n__name(buildAdjacency, \"buildAdjacency\");\nfunction assignComponents(adjacency) {\n const componentOf = /* @__PURE__ */ new Map();\n let componentId = 0;\n for (const node of adjacency.keys()) {\n if (componentOf.has(node)) {\n continue;\n }\n const stack = [node];\n while (stack.length > 0) {\n const cur = stack.pop();\n if (componentOf.has(cur)) {\n continue;\n }\n componentOf.set(cur, componentId);\n for (const next of adjacency.get(cur) ?? []) {\n if (!componentOf.has(next)) {\n stack.push(next);\n }\n }\n }\n componentId++;\n }\n return componentOf;\n}\n__name(assignComponents, \"assignComponents\");\nfunction computeBlocks(adjacency) {\n const discovery = /* @__PURE__ */ new Map();\n const low = /* @__PURE__ */ new Map();\n const edgeStack = [];\n const blocks = [];\n let time = 0;\n const visit = /* @__PURE__ */ __name((node, parent) => {\n discovery.set(node, ++time);\n low.set(node, time);\n for (const next of adjacency.get(node) ?? []) {\n if (next === parent) {\n continue;\n }\n if (!discovery.has(next)) {\n edgeStack.push([node, next]);\n visit(next, node);\n low.set(node, Math.min(low.get(node) ?? time, low.get(next) ?? time));\n if ((low.get(next) ?? 0) >= (discovery.get(node) ?? 0)) {\n blocks.push(popBlock(node, next, edgeStack, blocks.length));\n }\n } else if ((discovery.get(next) ?? 0) < (discovery.get(node) ?? 0)) {\n edgeStack.push([node, next]);\n low.set(node, Math.min(low.get(node) ?? time, discovery.get(next) ?? time));\n }\n }\n }, \"visit\");\n for (const node of adjacency.keys()) {\n if (!discovery.has(node)) {\n visit(node, null);\n }\n }\n return blocks;\n}\n__name(computeBlocks, \"computeBlocks\");\nfunction popBlock(u, v, stack, id) {\n const edges = [];\n const nodes = /* @__PURE__ */ new Set();\n while (stack.length > 0) {\n const edge = stack.pop();\n edges.push(edge);\n nodes.add(edge[0]);\n nodes.add(edge[1]);\n if (edge[0] === u && edge[1] === v || edge[0] === v && edge[1] === u) {\n break;\n }\n }\n return { id, edges, nodes: [...nodes] };\n}\n__name(popBlock, \"popBlock\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossCounts.ts\nfunction computeSubtreeCrossCounts(g, rankOf, tree) {\n const nodes = [...g.nodes];\n const indexOf = /* @__PURE__ */ new Map();\n for (const [i, node] of nodes.entries()) {\n indexOf.set(node, i);\n }\n const n = nodes.length;\n const parentIdx = new Array(n).fill(-1);\n const depth = new Array(n).fill(0);\n const queue = [];\n const seen = /* @__PURE__ */ new Set();\n for (const node of nodes) {\n const parentId = tree.parent.get(node) ?? null;\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n if (parentId == null) {\n parentIdx[idx] = -1;\n depth[idx] = 0;\n if (!seen.has(node)) {\n seen.add(node);\n queue.push(node);\n }\n }\n }\n while (queue.length > 0) {\n const current = queue.shift();\n const currentIdx = indexOf.get(current);\n if (currentIdx == null) {\n continue;\n }\n const childList = tree.children.get(current) ?? [];\n for (const child of childList) {\n if (seen.has(child)) {\n continue;\n }\n const childIdx = indexOf.get(child);\n if (childIdx == null) {\n continue;\n }\n parentIdx[childIdx] = currentIdx;\n depth[childIdx] = depth[currentIdx] + 1;\n seen.add(child);\n queue.push(child);\n }\n }\n for (const node of nodes) {\n if (seen.has(node)) {\n continue;\n }\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n parentIdx[idx] = -1;\n depth[idx] = 0;\n seen.add(node);\n }\n const maxLog = Math.max(1, Math.ceil(Math.log2(Math.max(1, n))) + 1);\n const up = Array.from({ length: maxLog }, () => new Array(n).fill(-1));\n for (let i = 0; i < n; i++) {\n up[0][i] = parentIdx[i];\n }\n for (let k = 1; k < maxLog; k++) {\n for (let i = 0; i < n; i++) {\n const prev = up[k - 1][i];\n up[k][i] = prev === -1 ? -1 : up[k - 1][prev];\n }\n }\n const lcaIndex = /* @__PURE__ */ __name((aIdx, bIdx) => {\n if (aIdx === -1 || bIdx === -1) {\n return -1;\n }\n if (depth[aIdx] < depth[bIdx]) {\n [aIdx, bIdx] = [bIdx, aIdx];\n }\n const diff = depth[aIdx] - depth[bIdx];\n for (let k = 0; k < maxLog; k++) {\n if (diff >> k & 1) {\n aIdx = up[k][aIdx];\n if (aIdx === -1) {\n return -1;\n }\n }\n }\n if (aIdx === bIdx) {\n return aIdx;\n }\n for (let k = maxLog - 1; k >= 0; k--) {\n const upA = up[k][aIdx];\n const upB = up[k][bIdx];\n if (upA === -1 || upB === -1) {\n continue;\n }\n if (upA !== upB) {\n aIdx = upA;\n bIdx = upB;\n }\n }\n return up[0][aIdx];\n }, \"lcaIndex\");\n const ownCounts = Array.from({ length: n }, () => /* @__PURE__ */ new Map());\n for (const edge of g.edges) {\n let src = edge.src;\n let dst = edge.dst;\n let ru = rankOf[src];\n let rv = rankOf[dst];\n if (ru == null || rv == null) {\n continue;\n }\n if (ru > rv) {\n [src, dst] = [dst, src];\n [ru, rv] = [rv, ru];\n }\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n const upperIdx = indexOf.get(src);\n const lowerIdx = indexOf.get(dst);\n if (upperIdx == null || lowerIdx == null) {\n continue;\n }\n const lca = lcaIndex(upperIdx, lowerIdx);\n if (lca === -1) {\n continue;\n }\n const bucket = ownCounts[lca];\n for (let layer = ru; layer < rv; layer++) {\n bucket.set(layer, (bucket.get(layer) ?? 0) + 1);\n }\n }\n const crossCounts = /* @__PURE__ */ new Map();\n const mergeInto = /* @__PURE__ */ __name((target, source) => {\n if (source.size === 0) {\n return;\n }\n for (const [layer, value] of source) {\n target.set(layer, (target.get(layer) ?? 0) + value);\n }\n }, \"mergeInto\");\n const visited = /* @__PURE__ */ new Set();\n const dfs = /* @__PURE__ */ __name((node) => {\n const idx = indexOf.get(node);\n visited.add(node);\n const base = idx == null ? void 0 : ownCounts[idx];\n const accumulator = base ? new Map(base) : /* @__PURE__ */ new Map();\n const childList = tree.children.get(node) ?? [];\n for (const child of childList) {\n const childMap = dfs(child);\n const parentLayer = rankOf[node];\n if (parentLayer != null) {\n let map = crossCounts.get(node);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n crossCounts.set(node, map);\n }\n let value = childMap.get(parentLayer) ?? 0;\n const childLayer = rankOf[child];\n if (childLayer != null && childLayer > parentLayer) {\n value += 1;\n }\n map.set(child, value);\n }\n mergeInto(accumulator, childMap);\n }\n return accumulator;\n }, \"dfs\");\n for (const root of tree.roots) {\n if (!visited.has(root)) {\n dfs(root);\n }\n }\n for (const node of nodes) {\n if (!visited.has(node)) {\n dfs(node);\n }\n }\n return crossCounts;\n}\n__name(computeSubtreeCrossCounts, \"computeSubtreeCrossCounts\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.core.ts\nfunction annotateMinimumLayers(nodes, children, rankOf) {\n const minLayer = /* @__PURE__ */ new Map();\n const annotate = /* @__PURE__ */ __name((node) => {\n let minL = rankOf[node] ?? 0;\n const childList = [...children.get(node) ?? []];\n childList.sort(compareByRankThenId(rankOf));\n for (const child of childList) {\n annotate(child);\n const childMin = minLayer.get(child);\n if (childMin != null) {\n minL = Math.min(minL, childMin);\n }\n }\n minLayer.set(node, minL);\n }, \"annotate\");\n for (const node of nodes) {\n annotate(node);\n }\n return minLayer;\n}\n__name(annotateMinimumLayers, \"annotateMinimumLayers\");\nfunction compareByRankThenId(rankOf) {\n return (a, b) => {\n const ra = rankOf[a] ?? 0;\n const rb = rankOf[b] ?? 0;\n return ra === rb ? a.localeCompare(b) : ra - rb;\n };\n}\n__name(compareByRankThenId, \"compareByRankThenId\");\nfunction emitNodesInTreeOrder(roots, allNodes, rankOf, orderChildren) {\n let maxRank = 0;\n for (const node of allNodes) {\n const r = rankOf[node] ?? 0;\n if (r > maxRank) {\n maxRank = r;\n }\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n const emitted = /* @__PURE__ */ new Set();\n const emit = /* @__PURE__ */ __name((node) => {\n if (emitted.has(node)) {\n return;\n }\n emitted.add(node);\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n for (const child of orderChildren(node)) {\n emit(child);\n }\n }, \"emit\");\n for (const root of roots) {\n emit(root);\n }\n for (const node of allNodes) {\n if (!emitted.has(node)) {\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n emitted.add(node);\n }\n }\n return layers;\n}\n__name(emitNodesInTreeOrder, \"emitNodesInTreeOrder\");\nfunction deduplicateLayers(layers) {\n const result = [];\n for (const layer of layers) {\n const seen = /* @__PURE__ */ new Set();\n const deduped = [];\n for (const id of layer) {\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(id);\n }\n result.push(deduped);\n }\n return result;\n}\n__name(deduplicateLayers, \"deduplicateLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.order.ts\nfunction createChildOrderer(children, rankOf, crossCounts, minLayer) {\n return (node) => {\n const raw = children.get(node) ?? [];\n if (raw.length === 0) {\n return [];\n }\n const layer = rankOf[node] ?? 0;\n const future = [];\n const present = [];\n const crossMap = crossCounts.get(node);\n for (const child of raw) {\n const minL = minLayer.get(child) ?? layer;\n if (minL > layer) {\n future.push({ child, min: minL });\n } else {\n present.push(child);\n }\n }\n future.sort((a, b) => {\n if (a.min === b.min) {\n return a.child.localeCompare(b.child);\n }\n return a.min - b.min;\n });\n present.sort((a, b) => {\n const ca = crossMap?.get(a) ?? 0;\n const cb = crossMap?.get(b) ?? 0;\n if (ca !== cb) {\n return ca - cb;\n }\n const ma = minLayer.get(a) ?? layer;\n const mb = minLayer.get(b) ?? layer;\n if (ma !== mb) {\n return ma - mb;\n }\n return a.localeCompare(b);\n });\n return [...future.map((item) => item.child), ...present];\n };\n}\n__name(createChildOrderer, \"createChildOrderer\");\nfunction buildMultitreeLayerOrder(g, rankOf, laneOf) {\n const tree = buildDrivingTree(g, {\n rankHint: rankOf,\n laneOf\n });\n const { children, roots } = tree;\n for (const node of g.nodes) {\n if (!children.has(node)) {\n children.set(node, []);\n }\n }\n const crossCounts = computeSubtreeCrossCounts(g, rankOf, tree);\n const rootsSorted = [...roots].sort(compareByRankThenId(rankOf));\n const minLayer = annotateMinimumLayers(rootsSorted, children, rankOf);\n const orderChildren = createChildOrderer(children, rankOf, crossCounts, minLayer);\n let layers = emitNodesInTreeOrder(rootsSorted, g.nodes, rankOf, orderChildren);\n layers = deduplicateLayers(layers);\n return layers;\n}\n__name(buildMultitreeLayerOrder, \"buildMultitreeLayerOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossOptimization.ts\nfunction countCrossingsBetweenAdjacent(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const li = buildLayerIndex(lower);\n const vs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n vs.push(li.get(e.dst));\n }\n }\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent, \"countCrossingsBetweenAdjacent\");\nfunction totalCrossings(layers, edges, rankOf) {\n const expanded = [];\n for (const e of edges) {\n const ru = rankOf[e.src];\n const rv = rankOf[e.dst];\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n let upper = e.src;\n let lower = e.dst;\n let rUpper = ru;\n let rLower = rv;\n if (ru > rv) {\n upper = e.dst;\n lower = e.src;\n rUpper = rv;\n rLower = ru;\n }\n for (let L = rUpper; L < rLower; L++) {\n expanded.push({ id: `${e.id}@${L}`, src: upper, dst: lower, ref: e.ref });\n }\n }\n let sum = 0;\n for (let i = 0; i + 1 < layers.length; i++) {\n sum += countCrossingsBetweenAdjacent(layers[i], layers[i + 1], expanded);\n }\n return sum;\n}\n__name(totalCrossings, \"totalCrossings\");\nfunction optimizeRanksByCrossings(g, initialRank) {\n const rankOf = { ...initialRank };\n const { preds } = buildPredecessorSuccessorMaps(g);\n const laneOf = createTopLaneResolver(g);\n const layers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n let best = totalCrossings(layers, g.edges, rankOf);\n const maxPasses = LAYERING.MAX_CROSSING_OPTIMIZATION_PASSES;\n for (let pass = 0; pass < maxPasses; pass++) {\n let changed = false;\n const nodesByRank = [...g.nodes].sort((a, b) => (rankOf[b] ?? 0) - (rankOf[a] ?? 0));\n for (const v of nodesByRank) {\n const r = rankOf[v] ?? 0;\n if (r === 0) {\n continue;\n }\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if (lb >= r) {\n continue;\n }\n const old = r;\n rankOf[v] = lb;\n const trialLayers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n const score = totalCrossings(trialLayers, g.edges, rankOf);\n if (score < best) {\n best = score;\n changed = true;\n } else {\n rankOf[v] = old;\n }\n }\n if (!changed) {\n break;\n }\n }\n return rankOf;\n}\n__name(optimizeRanksByCrossings, \"optimizeRanksByCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossLaneAdjust.ts\nfunction adjustCrossLaneSources(g, rankOf) {\n const topLaneOf = createTopLaneResolver(g);\n const nodesByRank = [...g.nodes].sort(\n (a, b) => (rankOf[a] ?? 0) - (rankOf[b] ?? 0) || a.localeCompare(b)\n );\n for (const v of nodesByRank) {\n const laneV = topLaneOf(v);\n if (!laneV) {\n continue;\n }\n const outEdges = g.edges.filter((e) => e.src === v);\n if (outEdges.length === 0) {\n continue;\n }\n let hasSameLaneSucc = false;\n let crossLaneCount = 0;\n for (const e of outEdges) {\n const laneDst = topLaneOf(e.dst);\n if (laneDst == null || laneDst === laneV) {\n hasSameLaneSucc = true;\n } else {\n crossLaneCount++;\n }\n }\n if (crossLaneCount === 0 || hasSameLaneSucc) {\n continue;\n }\n let crossLaneIncoming = 0;\n let hasSameLanePred = false;\n for (const e of g.edges) {\n if (e.dst !== v) {\n continue;\n }\n const laneSrc = topLaneOf(e.src);\n if (!laneSrc) {\n continue;\n }\n if (laneSrc === laneV) {\n hasSameLanePred = true;\n } else {\n crossLaneIncoming++;\n }\n }\n if (crossLaneIncoming > 0 || !hasSameLanePred) {\n continue;\n }\n const current = rankOf[v] ?? 0;\n const target = current + crossLaneCount;\n let lb = 0;\n for (const e of g.edges) {\n if (e.dst === v) {\n lb = Math.max(lb, (rankOf[e.src] ?? 0) + 1);\n }\n }\n const newRank = Math.max(current, lb, target);\n if (newRank !== current) {\n rankOf[v] = newRank;\n }\n }\n}\n__name(adjustCrossLaneSources, \"adjustCrossLaneSources\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.longestPath.ts\nfunction assignLayers_LongestPath(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const compact = opts?.compactSingleInput ?? false;\n const topLaneOf = createTopLaneResolver(g);\n let rankOf = /* @__PURE__ */ Object.create(null);\n for (const v of order) {\n const incAll = incoming(g, v);\n const inc = opts?.ignoreCrossLaneEdges ? incAll.filter((e) => {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(v);\n if (!laneSrc || !laneDst) {\n return true;\n }\n return laneSrc === laneDst;\n }) : incAll;\n if (inc.length === 0) {\n rankOf[v] = 0;\n } else if (compact && inc.length === 1) {\n const u = inc[0].src;\n const laneU = topLaneOf(u);\n const laneV = topLaneOf(v);\n if (laneU !== laneV) {\n rankOf[v] = rankOf[u] ?? 0;\n } else {\n rankOf[v] = (rankOf[u] ?? 0) + 1;\n }\n } else {\n let mx = -Infinity;\n for (const e of inc) {\n mx = Math.max(mx, (rankOf[e.src] ?? 0) + 1);\n }\n rankOf[v] = mx === -Infinity ? 0 : mx;\n }\n }\n if (opts?.optimizeRanksByCrossings ?? false) {\n rankOf = optimizeRanksByCrossings(g, rankOf);\n }\n if (opts?.ignoreCrossLaneEdges) {\n adjustCrossLaneSources(g, rankOf);\n }\n const layers = buildMultitreeLayerOrder(g, rankOf, topLaneOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LongestPath, \"assignLayers_LongestPath\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.gravity.ts\nfunction assignLayers_Gravity(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const base = assignLayers_LongestPath(g, {\n compactSingleInput: opts?.compactSingleInput,\n ignoreCrossLaneEdges: opts?.ignoreCrossLaneEdges,\n optimizeRanksByCrossings: opts?.optimizeRanksByCrossings\n });\n const rankOf = { ...base.rankOf };\n const topLaneOf = createTopLaneResolver(g);\n const { preds, succs } = buildPredecessorSuccessorMaps(g, (e) => {\n if (opts?.ignoreCrossLaneEdges) {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(e.dst);\n if (laneSrc && laneDst && laneSrc !== laneDst) {\n return false;\n }\n }\n return true;\n });\n const order = topoSortIfAcyclic(g) ?? [...g.nodes];\n const revOrder = [...order].reverse();\n const clampFeasible = /* @__PURE__ */ __name((v, desired) => {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n let ub = Number.POSITIVE_INFINITY;\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n }\n if (!Number.isFinite(ub)) {\n ub = Math.max(lb, desired);\n }\n return Math.min(Math.max(desired, lb), ub);\n }, \"clampFeasible\");\n const iters = LAYERING.GRAVITY_ITERATIONS;\n const relaxOrder = /* @__PURE__ */ __name((nodeOrder) => {\n let changed = false;\n for (const v of nodeOrder) {\n const ps = preds.get(v) ?? [];\n const ss = succs.get(v) ?? [];\n if (ps.length === 0 && ss.length === 0) {\n continue;\n }\n const predAvg = ps.length > 0 ? ps.reduce((a, u) => a + (rankOf[u] ?? 0) + 1, 0) / ps.length : rankOf[v] ?? 0;\n const succAvg = ss.length > 0 ? ss.reduce((a, w) => a + (rankOf[w] ?? 0) - 1, 0) / ss.length : rankOf[v] ?? 0;\n const desired = Math.round((predAvg + succAvg) / 2);\n const clamped = clampFeasible(v, desired);\n if (clamped !== rankOf[v]) {\n rankOf[v] = clamped;\n changed = true;\n }\n }\n return changed;\n }, \"relaxOrder\");\n for (let it = 0; it < iters; it++) {\n const forwardChanged = relaxOrder(order);\n const backwardChanged = relaxOrder(revOrder);\n if (!forwardChanged && !backwardChanged) {\n break;\n }\n }\n for (const v of order) {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if ((rankOf[v] ?? 0) < lb) {\n rankOf[v] = lb;\n }\n }\n for (const v of revOrder) {\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n const ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n if ((rankOf[v] ?? 0) > ub) {\n rankOf[v] = ub;\n }\n }\n }\n const layers = buildLayersFromRanks(g, order, rankOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_Gravity, \"assignLayers_Gravity\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.laneAwareCompact.ts\nfunction topoSortByGenerationIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const adj = buildSortedSuccessorMap(g);\n let frontier = sortedZeroInDegreeNodes(indeg);\n const order = [];\n while (frontier.length > 0) {\n const nextFrontier = [];\n for (const u of frontier) {\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n nextFrontier.push(v);\n }\n }\n }\n frontier = nextFrontier.sort((a, b) => a.localeCompare(b));\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortByGenerationIfAcyclic, \"topoSortByGenerationIfAcyclic\");\nfunction assignLayers_LaneAwareCompact(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = opts?.direction === \"LR\" ? topoSortByGenerationIfAcyclic(g) ?? [...g.nodes].sort() : topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const topLaneOf = createTopLaneResolver(g);\n const laneOf = /* @__PURE__ */ __name((id) => topLaneOf(id) ?? id, \"laneOf\");\n const rankOf = /* @__PURE__ */ Object.create(null);\n const nextFree = /* @__PURE__ */ new Map();\n const edgeWeight = /* @__PURE__ */ __name((u, v) => {\n const ignoreCrossLane = opts?.ignoreCrossLaneEdges ?? true;\n if (ignoreCrossLane) {\n return laneOf(u) === laneOf(v) ? 1 : 0;\n }\n return 1;\n }, \"edgeWeight\");\n for (const v of order) {\n const node = g.nodeById.get(v);\n if (node?.isGroup) {\n continue;\n }\n const preds = incoming(g, v);\n let base = 0;\n if (preds.length > 0) {\n for (const e of preds) {\n const u = e.src;\n const ru = rankOf[u] ?? 0;\n base = Math.max(base, ru + edgeWeight(u, v));\n }\n }\n const lane = laneOf(v);\n const nf = nextFree.get(lane) ?? 0;\n const L = Math.max(base, nf);\n rankOf[v] = L;\n nextFree.set(lane, L + 1);\n }\n const layers = buildLayersFromRanks(g, order, rankOf, { skipGroups: true });\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LaneAwareCompact, \"assignLayers_LaneAwareCompact\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.dummies.ts\nfunction makeProperLayering(layering, gAcyclic) {\n const g = normalizeGraph(gAcyclic);\n const { rankOf } = layering;\n const layers = layering.layers.map((l) => [...l]);\n const dummy = new Set(layering.dummy ? [...layering.dummy] : []);\n let dummySeq = 0;\n const nodeById = new Map(g.nodeById);\n const addDummyAt = /* @__PURE__ */ __name((L) => {\n const id = `placeholder-${dummySeq++}`;\n const dn = { id, isGroup: false, isDummy: true, width: 0, height: 0 };\n nodeById.set(id, dn);\n dummy.add(id);\n while (layers.length <= L) {\n layers.push([]);\n }\n layers[L].push(id);\n rankOf[id] = L;\n return id;\n }, \"addDummyAt\");\n const edgesSorted = [...g.edges].sort(\n (a, b) => a.id === b.id ? a.src === b.src ? a.dst.localeCompare(b.dst) : a.src.localeCompare(b.src) : a.id.localeCompare(b.id)\n );\n const newEdges = [];\n for (const e of edgesSorted) {\n const rU = rankOf[e.src] ?? 0;\n const rV = rankOf[e.dst] ?? 0;\n if (rV - rU <= 1) {\n newEdges.push(e);\n continue;\n }\n let prev = e.src;\n for (let L = rU + 1, k = 0; L < rV; L++, k++) {\n const d = addDummyAt(L);\n newEdges.push({ id: `${e.id}#${k}`, src: prev, dst: d, weight: e.weight, ref: e.ref });\n prev = d;\n }\n const lastIndex = rV - rU - 2;\n newEdges.push({\n id: `${e.id}#${Math.max(lastIndex + 1, 0)}`,\n src: prev,\n dst: e.dst,\n weight: e.weight,\n ref: e.ref\n });\n }\n const nodes = [...g.nodes, ...[...dummy].filter((id) => !g.nodes.includes(id))];\n const graphWithDummies = { nodes, edges: newEdges, layout: g.layout, nodeById };\n return { layering: { layers, rankOf, dummy }, graphWithDummies };\n}\n__name(makeProperLayering, \"makeProperLayering\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase3.ordering.ts\nfunction median(values) {\n const n = values.length;\n if (n === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const a = [...values].sort((x, y) => x - y);\n if (n % 2 === 1) {\n return a[(n - 1) / 2];\n }\n return 0.5 * (a[n / 2 - 1] + a[n / 2]);\n}\n__name(median, \"median\");\nfunction barycenter(values) {\n if (values.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const s = values.reduce((acc, v) => acc + v, 0);\n return s / values.length;\n}\n__name(barycenter, \"barycenter\");\nfunction neighborPositionsFor(targetNodes, fixedIndex, edges, direction) {\n const neighborPositions = /* @__PURE__ */ new Map();\n for (const v of targetNodes) {\n neighborPositions.set(v, []);\n }\n for (const e of edges) {\n if (direction === \"down\") {\n if (fixedIndex.has(e.src) && neighborPositions.has(e.dst)) {\n neighborPositions.get(e.dst).push(fixedIndex.get(e.src));\n }\n } else if (fixedIndex.has(e.dst) && neighborPositions.has(e.src)) {\n neighborPositions.get(e.src).push(fixedIndex.get(e.dst));\n }\n }\n return neighborPositions;\n}\n__name(neighborPositionsFor, \"neighborPositionsFor\");\nfunction currentOrderTieBreak(a, b, currentLayerIndex) {\n const ia = currentLayerIndex.get(a) ?? 0;\n const ib = currentLayerIndex.get(b) ?? 0;\n return ia !== ib ? ia - ib : a.localeCompare(b);\n}\n__name(currentOrderTieBreak, \"currentOrderTieBreak\");\nfunction countCrossingsBetweenAdjacent2(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const upperIndex = buildLayerIndex(upper);\n const lowerIndex = buildLayerIndex(lower);\n const pairs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n pairs.push({ u: upperIndex.get(e.src), v: lowerIndex.get(e.dst) });\n }\n }\n pairs.sort((a, b) => a.u === b.u ? a.v - b.v : a.u - b.u);\n const vs = pairs.map((p) => p.v);\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent2, \"countCrossingsBetweenAdjacent\");\nfunction sortByHeuristic(nodes, neighborPositions, currentLayerIndex) {\n return [...nodes].sort((a, b) => {\n const sa = median(neighborPositions.get(a) ?? []);\n const sb = median(neighborPositions.get(b) ?? []);\n if (sa === sb) {\n return currentOrderTieBreak(a, b, currentLayerIndex);\n }\n if (!isFinite(sa)) {\n return 1;\n }\n if (!isFinite(sb)) {\n return -1;\n }\n return sa - sb;\n });\n}\n__name(sortByHeuristic, \"sortByHeuristic\");\nfunction reorderLayer(fixedLayer, targetLayer, edges, direction, topLaneOf, laneOrder) {\n const fixedIndex = buildLayerIndex(fixedLayer);\n const currIndex = buildLayerIndex(targetLayer);\n const neighborPositions = neighborPositionsFor(targetLayer, fixedIndex, edges, direction);\n if (!topLaneOf || !laneOrder || laneOrder.length === 0) {\n return sortByHeuristic(targetLayer, neighborPositions, currIndex);\n }\n const byLane = /* @__PURE__ */ new Map();\n for (const id of targetLayer) {\n const lane = topLaneOf(id);\n const arr = byLane.get(lane) ?? [];\n arr.push(id);\n byLane.set(lane, arr);\n }\n const result = [];\n for (const lane of laneOrder) {\n const nodesInLane = byLane.get(lane);\n if (!nodesInLane || nodesInLane.length === 0) {\n continue;\n }\n const sorted = sortByHeuristic(nodesInLane, neighborPositions, currIndex);\n result.push(...sorted);\n }\n const nullNodes = byLane.get(null);\n if (nullNodes && nullNodes.length > 0) {\n const sorted = sortByHeuristic(nullNodes, neighborPositions, currIndex);\n for (const nid of sorted) {\n const bc = barycenter(neighborPositions.get(nid) ?? []);\n let bestIdx = result.length;\n if (isFinite(bc)) {\n for (const [i, rid] of result.entries()) {\n const rBc = barycenter(neighborPositions.get(rid) ?? []);\n if (bc < rBc) {\n bestIdx = i;\n break;\n }\n }\n }\n result.splice(bestIdx, 0, nid);\n }\n }\n return result;\n}\n__name(reorderLayer, \"reorderLayer\");\nfunction transposeImprove(upper, current, edges, next, topLaneOf) {\n const best = [...current];\n const upperSet = new Set(upper);\n const layerSet = new Set(current);\n const nextSet = next ? new Set(next) : null;\n const edgesIn = edges.filter((e) => upperSet.has(e.src) && layerSet.has(e.dst));\n const edgesOut = nextSet ? edges.filter((e) => layerSet.has(e.src) && nextSet.has(e.dst)) : void 0;\n const crossingScore = /* @__PURE__ */ __name((order) => {\n let score = countCrossingsBetweenAdjacent2(upper, order, edgesIn);\n if (edgesOut && next) {\n score += countCrossingsBetweenAdjacent2(order, next, edgesOut);\n }\n return score;\n }, \"crossingScore\");\n const laneOf = topLaneOf ? /* @__PURE__ */ new Map() : null;\n if (topLaneOf && laneOf) {\n for (const id of current) {\n laneOf.set(id, topLaneOf(id));\n }\n }\n let improved = true;\n let bestScore = crossingScore(best);\n while (improved) {\n improved = false;\n for (let i = 0; i + 1 < best.length; i++) {\n if (laneOf) {\n const laneA = laneOf.get(best[i]);\n const laneB = laneOf.get(best[i + 1]);\n if (laneA !== laneB) {\n continue;\n }\n }\n const prev = bestScore;\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n const nextScore = crossingScore(best);\n if (nextScore < prev) {\n bestScore = nextScore;\n improved = true;\n } else {\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n }\n }\n }\n return best;\n}\n__name(transposeImprove, \"transposeImprove\");\nfunction orderLayers(layering, gWithDummies, opts) {\n const layers = layering.layers.map((l) => [...l]);\n const edges = gWithDummies.edges;\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrder = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n for (let s = 0; s < 3; s++) {\n for (let i = 1; i < layers.length; i++) {\n layers[i] = reorderLayer(layers[i - 1], layers[i], edges, \"down\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i - 1], layers[i], edges, layers[i + 1], topLaneOf);\n }\n for (let i = layers.length - 2; i >= 0; i--) {\n layers[i] = reorderLayer(layers[i + 1], layers[i], edges, \"up\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i + 1], layers[i], edges, layers[i - 1], topLaneOf);\n }\n }\n return { layers };\n}\n__name(orderLayers, \"orderLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase4.coordinates.ts\nfunction assignCoordinates(ordered, gWithDummies, opts) {\n const layerGap = opts?.layerGap ?? COORDINATES.DEFAULT_LAYER_GAP;\n const nodeGap = opts?.nodeGap ?? COORDINATES.DEFAULT_NODE_GAP;\n const laneGap = opts?.laneGap ?? nodeGap * 2;\n const direction = opts?.direction ?? \"TB\";\n const isHorizontal = direction === \"LR\" || direction === \"RL\";\n const layers = ordered.layers;\n const x = /* @__PURE__ */ Object.create(null);\n const y = /* @__PURE__ */ Object.create(null);\n const getNode = /* @__PURE__ */ __name((id) => gWithDummies.nodeById.get(id), \"getNode\");\n const getWidth = /* @__PURE__ */ __name((id) => getNode(id)?.width ?? 0, \"getWidth\");\n const getHeight = /* @__PURE__ */ __name((id) => getNode(id)?.height ?? 0, \"getHeight\");\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrderGlobal = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n const layerHeights = layers.map(\n (layer) => layer.reduce((m, v) => Math.max(m, getHeight(v)), 0)\n );\n const extraLayerGaps = [];\n if (isHorizontal) {\n for (let i = 0; i + 1 < layers.length; i++) {\n const thisLayerMaxWidth = layers[i].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const nextLayerMaxWidth = layers[i + 1].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const thisLayerMaxHeight = layerHeights[i];\n const nextLayerMaxHeight = layerHeights[i + 1];\n const normalSpacing = thisLayerMaxHeight / 2 + nextLayerMaxHeight / 2;\n const requiredSpacing = (thisLayerMaxWidth + nextLayerMaxWidth) / 2;\n const extraNeeded = Math.max(0, requiredSpacing - normalSpacing - layerGap);\n extraLayerGaps.push(extraNeeded);\n }\n }\n const lanesUsedSet = /* @__PURE__ */ new Set();\n for (const layer of layers) {\n for (const id of layer) {\n lanesUsedSet.add(topLaneOf(id));\n }\n }\n const hasNullLane = lanesUsedSet.has(null);\n const lanesUsed = laneOrderGlobal.filter((L) => lanesUsedSet.has(L));\n const laneOrderColumns = [...hasNullLane ? [null] : [], ...lanesUsed];\n const laneWidth = /* @__PURE__ */ Object.create(null);\n for (const L of lanesUsed) {\n laneWidth[L] = 0;\n }\n if (hasNullLane) {\n laneWidth.null = 0;\n }\n for (const layer of layers) {\n const perLane = /* @__PURE__ */ Object.create(null);\n const nullIds = [];\n for (const id of layer) {\n const L = topLaneOf(id);\n if (L === null) {\n nullIds.push(id);\n } else {\n (perLane[L] ||= []).push(id);\n }\n }\n for (const [L, ids] of Object.entries(perLane)) {\n const total = ids.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, ids.length - 1);\n laneWidth[L] = Math.max(laneWidth[L] ?? 0, total);\n }\n if (hasNullLane && nullIds.length) {\n const totalNull = nullIds.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, nullIds.length - 1);\n laneWidth.null = Math.max(laneWidth.null ?? 0, totalNull);\n }\n }\n const centerX = /* @__PURE__ */ new Map();\n {\n const widths = laneOrderColumns.map(\n (L) => (L === null ? laneWidth.null : laneWidth[L]) ?? 0\n );\n const totalW = widths.reduce((a, b) => a + b, 0) + laneGap * Math.max(0, laneOrderColumns.length - 1);\n let cursor = -totalW / 2;\n for (let i = 0; i < laneOrderColumns.length; i++) {\n const L = laneOrderColumns[i];\n const w = widths[i] ?? 0;\n const cx = cursor + w / 2;\n centerX.set(L, cx);\n cursor += w;\n if (i < laneOrderColumns.length - 1) {\n cursor += laneGap;\n }\n }\n }\n let yOffset = 0;\n for (const [li, layer] of layers.entries()) {\n const layerH = layerHeights[li] ?? 0;\n const byLane = /* @__PURE__ */ new Map();\n for (const id of layer) {\n const laneId = topLaneOf(id);\n const arr = byLane.get(laneId) ?? [];\n arr.push(id);\n byLane.set(laneId, arr);\n }\n for (const L of laneOrderColumns) {\n const nodesInLane = byLane.get(L) ?? [];\n if (nodesInLane.length === 0) {\n continue;\n }\n const cx = centerX.get(L);\n if (nodesInLane.length === 1) {\n const id = nodesInLane[0];\n x[id] = cx;\n y[id] = yOffset + layerH / 2;\n } else {\n const widths = nodesInLane.map((id) => getWidth(id));\n const total = widths.reduce((a, b) => a + b, 0) + nodeGap * (nodesInLane.length - 1);\n let start = cx - total / 2;\n for (const [i, id] of nodesInLane.entries()) {\n const w = widths[i];\n x[id] = start + w / 2;\n y[id] = yOffset + layerH / 2;\n start += w + nodeGap;\n }\n }\n }\n const extraGap = extraLayerGaps[li] ?? 0;\n yOffset += layerH + layerGap + extraGap;\n }\n const byRef = /* @__PURE__ */ new Map();\n for (const e of gWithDummies.edges) {\n const rid = e.ref.id;\n if (!byRef.has(rid)) {\n byRef.set(rid, []);\n }\n byRef.get(rid).push(e);\n }\n for (const [, chainEdges] of byRef) {\n if (chainEdges.length === 0) {\n continue;\n }\n const ref = chainEdges[0].ref;\n const src = ref.start;\n const dst = ref.end;\n if (src == null || dst == null) {\n continue;\n }\n const midX = Math.round(((x[src] ?? 0) + (x[dst] ?? 0)) / 2);\n const involved = /* @__PURE__ */ new Set();\n for (const e of chainEdges) {\n involved.add(e.src);\n involved.add(e.dst);\n }\n for (const vid of involved) {\n if (vid === src || vid === dst) {\n continue;\n }\n const node = gWithDummies.nodeById.get(vid);\n if (node?.isDummy) {\n x[vid] = midX;\n }\n }\n }\n return { x, y };\n}\n__name(assignCoordinates, \"assignCoordinates\");\n\n// src/rendering-util/layout-algorithms/swimlanes/laneOrdering.ts\nvar AUTOMATIC_LANE_ORDERING_RESTARTS = 8;\nfunction hashString(input) {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n__name(hashString, \"hashString\");\nfunction mulberry32(seed) {\n let state = seed >>> 0;\n return () => {\n state += 1831565813;\n let t = state;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296;\n };\n}\n__name(mulberry32, \"mulberry32\");\nfunction deterministicShuffle(order, seed) {\n const shuffled = [...order];\n const random = mulberry32(seed);\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n return shuffled;\n}\n__name(deterministicShuffle, \"deterministicShuffle\");\nfunction sourceDistance(order, sourceIndex) {\n let distance = 0;\n for (const [index, laneId] of order.entries()) {\n distance += Math.abs(index - (sourceIndex.get(laneId) ?? index));\n }\n return distance;\n}\n__name(sourceDistance, \"sourceDistance\");\nfunction laneArrangementCost(order, weights) {\n const position = /* @__PURE__ */ new Map();\n for (const [index, laneId] of order.entries()) {\n position.set(laneId, index);\n }\n let cost = 0;\n for (const { a, b, weight } of weights) {\n const ai = position.get(a);\n const bi = position.get(b);\n if (ai == null || bi == null) {\n continue;\n }\n cost += weight * Math.abs(ai - bi);\n }\n return cost;\n}\n__name(laneArrangementCost, \"laneArrangementCost\");\nfunction buildWeightedLaneEdges(g) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return [];\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n const topLaneOf = createTopLaneResolver(g);\n const weights = /* @__PURE__ */ new Map();\n for (const edge of g.layout.edges ?? []) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const src = typeof edge.start === \"string\" ? edge.start : void 0;\n const dst = typeof edge.end === \"string\" ? edge.end : void 0;\n if (!src || !dst || !g.nodeById.has(src) || !g.nodeById.has(dst)) {\n continue;\n }\n const laneA = topLaneOf(src);\n const laneB = topLaneOf(dst);\n if (!laneA || !laneB || laneA === laneB) {\n continue;\n }\n const ia = sourceIndex.get(laneA);\n const ib = sourceIndex.get(laneB);\n if (ia == null || ib == null) {\n continue;\n }\n const [a, b] = ia <= ib ? [laneA, laneB] : [laneB, laneA];\n const key = `${a}\\0${b}`;\n const existing = weights.get(key);\n if (existing) {\n existing.weight++;\n } else {\n weights.set(key, { a, b, weight: 1 });\n }\n }\n return [...weights.values()];\n}\n__name(buildWeightedLaneEdges, \"buildWeightedLaneEdges\");\nfunction greedySwitch(startOrder, weights, sourceIndex) {\n const order = [...startOrder];\n let cost = laneArrangementCost(order, weights);\n let changed = true;\n let sweeps = 0;\n const maxSweeps = Math.max(1, order.length);\n while (changed && sweeps < maxSweeps) {\n changed = false;\n sweeps++;\n for (let i = 0; i + 1 < order.length; i++) {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n const nextCost = laneArrangementCost(order, weights);\n if (nextCost < cost) {\n cost = nextCost;\n changed = true;\n } else {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n }\n }\n }\n return {\n order,\n cost,\n sourceDistance: sourceDistance(order, sourceIndex)\n };\n}\n__name(greedySwitch, \"greedySwitch\");\nfunction isBetterCandidate(candidate, best) {\n if (candidate.cost !== best.cost) {\n return candidate.cost < best.cost;\n }\n return candidate.sourceDistance < best.sourceDistance;\n}\n__name(isBetterCandidate, \"isBetterCandidate\");\nfunction seedForRestart(sourceOrder, weights, restartIndex) {\n const weightSignature = [...weights].sort((a, b) => a.a === b.a ? a.b.localeCompare(b.b) : a.a.localeCompare(b.a)).map(({ a, b, weight }) => `${a}:${b}:${weight}`).join(\"|\");\n return hashString(`${sourceOrder.join(\"|\")}#${weightSignature}#${restartIndex}`);\n}\n__name(seedForRestart, \"seedForRestart\");\nfunction optimizeTopLaneOrder(g, opts = {}) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return sourceOrder;\n }\n const weights = buildWeightedLaneEdges(g);\n if (weights.length === 0) {\n return sourceOrder;\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n let best = greedySwitch(sourceOrder, weights, sourceIndex);\n const restarts = Math.max(0, opts.restarts ?? AUTOMATIC_LANE_ORDERING_RESTARTS);\n for (let i = 0; i < restarts; i++) {\n const seed = seedForRestart(sourceOrder, weights, i);\n const start = deterministicShuffle(sourceOrder, seed);\n const candidate = greedySwitch(start, weights, sourceIndex);\n if (isBetterCandidate(candidate, best)) {\n best = candidate;\n }\n }\n return best.order;\n}\n__name(optimizeTopLaneOrder, \"optimizeTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/pipeline.ts\nfunction sugiyamaLayout(g, opts) {\n const ignoreCrossLaneEdges = opts?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = opts?.optimizeRanksByCrossings ?? true;\n const g0 = normalizeGraph(g);\n const laneOrder = opts?.automaticLaneOrdering ? optimizeTopLaneOrder(g0, { restarts: AUTOMATIC_LANE_ORDERING_RESTARTS }) : void 0;\n const cycleRes = removeCycles_DFS(g0);\n const gAcyclic = cycleRes.acyclic;\n const layering = ignoreCrossLaneEdges ? assignLayers_LaneAwareCompact(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: true,\n direction: opts?.direction\n }) : assignLayers_Gravity(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: false,\n optimizeRanksByCrossings: optimizeRanksByCrossings2\n });\n const { layering: properLayering, graphWithDummies } = makeProperLayering(layering, gAcyclic);\n const ordered = orderLayers(properLayering, graphWithDummies, { laneOrder });\n const coordinates = assignCoordinates(ordered, graphWithDummies, {\n layerGap: opts?.layerGap,\n nodeGap: opts?.nodeGap,\n direction: opts?.direction,\n laneOrder\n });\n return {\n acyclic: gAcyclic,\n reversed: cycleRes.reversed,\n layering: properLayering,\n ordered,\n coordinates\n };\n}\n__name(sugiyamaLayout, \"sugiyamaLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/orthogonalRouter/router.ts\nvar EPS7 = PRECISION.EPSILON;\nvar NODE_PADDING = 8;\nvar HORIZONTAL_PIPE_MARGIN = 15;\nvar VERTICAL_PIPE_MARGIN = 15;\nvar ROUTING_MARGIN = 25;\nvar ANCHOR_OFFSET = 20;\nvar TRACK_SPACING = 10;\nfunction chooseOrthogonalSide(node, target, fallback) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const dx = target.x - cx;\n const dy = target.y - cy;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n if (absDx < EPS7 && absDy < EPS7) {\n return fallback;\n }\n const verticalBias = 3;\n if (absDy > EPS7 && absDy * verticalBias >= absDx) {\n return dy > 0 ? \"bottom\" : \"top\";\n }\n if (absDx > EPS7) {\n return dx > 0 ? \"right\" : \"left\";\n }\n return fallback;\n}\n__name(chooseOrthogonalSide, \"chooseOrthogonalSide\");\nfunction sharedLineEndpointCoord(line, nextLine) {\n return Math.abs(line.to - nextLine.from) < EPS7 || Math.abs(line.to - nextLine.to) < EPS7 ? line.to : line.from;\n}\n__name(sharedLineEndpointCoord, \"sharedLineEndpointCoord\");\nfunction pointOnLine(line, along) {\n return line.orient === \"vertical\" ? { x: line.coord, y: along } : { x: along, y: line.coord };\n}\n__name(pointOnLine, \"pointOnLine\");\nfunction routeEdgesOrthogonal(data, direction) {\n const nodes = data.nodes ?? [];\n const originalEdges = data.edges ?? [];\n const edges = [];\n for (const oe of originalEdges) {\n if (oe.isLayoutOnly) {\n continue;\n }\n edges.push({\n ...oe,\n __originalEdge: oe\n });\n }\n const nodeById = /* @__PURE__ */ new Map();\n const laneByNodeId = /* @__PURE__ */ new Map();\n const pipes = [];\n const isLR = direction === \"LR\";\n for (const n of nodes) {\n nodeById.set(n.id, n);\n }\n const topLevelGroups = nodes.filter((n) => n.isGroup && !n.parentId);\n for (const group of topLevelGroups) {\n const lane = { id: group.id };\n const assignLane = /* @__PURE__ */ __name((n) => {\n laneByNodeId.set(n.id, lane);\n nodes.filter((child) => child.parentId === n.id).forEach(assignLane);\n }, \"assignLane\");\n assignLane(group);\n }\n const obstacles = nodes.filter((n) => !n.isGroup && !n.isEdgeLabel).map((n) => {\n const w = n.width ?? 10;\n const h = n.height ?? 10;\n const x = n.x ?? 0;\n const y = n.y ?? 0;\n const padding = NODE_PADDING;\n return {\n nodeId: n.id,\n minX: x - w / 2 - padding,\n maxX: x + w / 2 + padding,\n minY: y - h / 2 - padding,\n maxY: y + h / 2 + padding,\n // For LR: TB x becomes LR y, so visual Y extent should be based on height\n visualXHalfExtent: isLR ? h / 2 + padding : w / 2 + padding\n };\n });\n const getOrAddPipe = /* @__PURE__ */ __name((orientation, coord, spanMin, spanMax) => {\n let pipe = pipes.find((p) => p.orientation === orientation && Math.abs(p.coord - coord) < 1);\n if (!pipe) {\n pipe = {\n id: `pipe-${orientation}-${coord.toFixed(0)}`,\n orientation,\n coord,\n spanMin,\n spanMax,\n tracks: []\n };\n pipes.push(pipe);\n }\n pipe.spanMin = Math.min(pipe.spanMin, spanMin);\n pipe.spanMax = Math.max(pipe.spanMax, spanMax);\n return pipe;\n }, \"getOrAddPipe\");\n const portForSide = /* @__PURE__ */ __name((node, side) => {\n const w = node.width ?? 10;\n const h = node.height ?? 10;\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n switch (side) {\n case \"top\":\n return { x: cx, y: cy - h / 2 };\n case \"bottom\":\n return { x: cx, y: cy + h / 2 };\n case \"left\":\n return { x: cx - w / 2, y: cy };\n case \"right\":\n return { x: cx + w / 2, y: cy };\n }\n }, \"portForSide\");\n const getOrthogonalPort = /* @__PURE__ */ __name((node, target, isSource) => portForSide(node, chooseOrthogonalSide(node, target, isSource ? \"bottom\" : \"top\")), \"getOrthogonalPort\");\n const allRoutedSegments = [];\n const edgeSegmentIndices = [];\n const straightIntraLaneEdges = /* @__PURE__ */ new Set();\n const CROSSING_PENALTY = 1e3;\n const crossingPenalty = /* @__PURE__ */ __name((edgeIdx, from, to) => {\n if (allRoutedSegments.length === 0) {\n return 0;\n }\n const isHorizontal = Math.abs(from.y - to.y) < EPS7;\n const isVertical = Math.abs(from.x - to.x) < EPS7;\n if (!isHorizontal && !isVertical) {\n return 0;\n }\n let penalties = 0;\n if (isHorizontal) {\n const y = from.y;\n const minX = Math.min(from.x, to.x) - EPS7;\n const maxX = Math.max(from.x, to.x) + EPS7;\n if (maxX <= minX) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"vertical\") {\n continue;\n }\n if (seg.pipe.coord < minX || seg.pipe.coord > maxX) {\n continue;\n }\n if (seg.from - EPS7 <= y && seg.to + EPS7 >= y) {\n penalties += CROSSING_PENALTY;\n }\n }\n } else if (isVertical) {\n const x = from.x;\n const minY = Math.min(from.y, to.y) - EPS7;\n const maxY = Math.max(from.y, to.y) + EPS7;\n if (maxY <= minY) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"horizontal\") {\n continue;\n }\n if (seg.pipe.coord < minY || seg.pipe.coord > maxY) {\n continue;\n }\n if (seg.from - EPS7 <= x && seg.to + EPS7 >= x) {\n penalties += CROSSING_PENALTY;\n }\n }\n }\n return penalties;\n }, \"crossingPenalty\");\n const routingOrder = edges.map((edge, idx) => {\n if (!edge.start || !edge.end) {\n return { idx, crossLane: 0, dx: 0, dy: 0 };\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n const srcLane = laneByNodeId.get(edge.start);\n const dstLane = laneByNodeId.get(edge.end);\n const crossLane = srcLane && dstLane && srcLane.id !== dstLane.id ? 1 : 0;\n const dx = srcNode && dstNode ? Math.abs((dstNode.x ?? 0) - (srcNode.x ?? 0)) : 0;\n const dy = srcNode && dstNode ? Math.abs((dstNode.y ?? 0) - (srcNode.y ?? 0)) : 0;\n return { idx, crossLane, dx, dy };\n }).sort((a, b) => {\n if (a.crossLane !== b.crossLane) {\n return b.crossLane - a.crossLane;\n }\n const aDist = a.dx + a.dy;\n const bDist = b.dx + b.dy;\n if (Math.abs(aDist - bDist) > 1) {\n return aDist - bDist;\n }\n return a.idx - b.idx;\n }).map((entry) => entry.idx);\n const isSegmentBlocked = /* @__PURE__ */ __name((p1, p2, excludeStart, excludeEnd) => {\n const segMinX = Math.min(p1.x, p2.x);\n const segMaxX = Math.max(p1.x, p2.x);\n const segMinY = Math.min(p1.y, p2.y);\n const segMaxY = Math.max(p1.y, p2.y);\n const blockingObs = obstacles.find((obs) => {\n if (excludeStart && obs.nodeId === excludeStart) {\n return false;\n }\n if (excludeEnd && obs.nodeId === excludeEnd) {\n return false;\n }\n if (Math.abs(p1.x - p2.x) > EPS7) {\n return obs.minY < p1.y && obs.maxY > p1.y && obs.maxX > segMinX && obs.minX < segMaxX;\n } else {\n return obs.minX < p1.x && obs.maxX > p1.x && obs.maxY > segMinY && obs.minY < segMaxY;\n }\n });\n return !!blockingObs;\n }, \"isSegmentBlocked\");\n const portGroups = /* @__PURE__ */ new Map();\n const incidentEdgeTotals = /* @__PURE__ */ new Map();\n for (const edge of edges) {\n if (!edge.start || !edge.end || edge.start === edge.end) {\n continue;\n }\n incidentEdgeTotals.set(edge.start, (incidentEdgeTotals.get(edge.start) ?? 0) + 1);\n incidentEdgeTotals.set(edge.end, (incidentEdgeTotals.get(edge.end) ?? 0) + 1);\n }\n const determineSide = /* @__PURE__ */ __name((node, target) => chooseOrthogonalSide(node, target, \"bottom\"), \"determineSide\");\n const sideInfoByIdx = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (!e.start || !e.end || e.start === e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const dx = (dst.x ?? 0) - (src.x ?? 0);\n const dy = (dst.y ?? 0) - (src.y ?? 0);\n sideInfoByIdx.set(i, {\n edgeIdx: i,\n srcId: e.start,\n dstId: e.end,\n srcSide: determineSide(src, { x: dst.x ?? 0, y: dst.y ?? 0 }),\n dstSide: determineSide(dst, { x: src.x ?? 0, y: src.y ?? 0 }),\n absDx: Math.abs(dx),\n absDy: Math.abs(dy),\n dxSign: Math.sign(dx),\n dySign: Math.sign(dy)\n });\n }\n const preferenceStrength = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.absDx === 0 ? Infinity : info.absDy / info.absDx;\n }\n return info.absDy === 0 ? Infinity : info.absDx / info.absDy;\n }, \"preferenceStrength\");\n const secondarySide = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.dxSign >= 0 ? \"right\" : \"left\";\n }\n return info.dySign >= 0 ? \"bottom\" : \"top\";\n }, \"secondarySide\");\n const sourceSideGroups = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n const key = `${info.srcId}:${info.srcSide}`;\n if (!sourceSideGroups.has(key)) {\n sourceSideGroups.set(key, []);\n }\n sourceSideGroups.get(key).push(info);\n }\n const sideLoad = /* @__PURE__ */ new Map();\n const loadKey = /* @__PURE__ */ __name((nodeId, side) => `${nodeId}:${side}`, \"loadKey\");\n for (const info of sideInfoByIdx.values()) {\n sideLoad.set(\n loadKey(info.srcId, info.srcSide),\n (sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0) + 1\n );\n sideLoad.set(\n loadKey(info.dstId, info.dstSide),\n (sideLoad.get(loadKey(info.dstId, info.dstSide)) ?? 0) + 1\n );\n }\n for (const group of sourceSideGroups.values()) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => {\n const sa = preferenceStrength(a);\n const sb = preferenceStrength(b);\n if (Math.abs(sa - sb) > 1e-9) {\n return sb - sa;\n }\n return a.edgeIdx - b.edgeIdx;\n });\n for (let g = 1; g < group.length; g++) {\n const info = group[g];\n const secondary = secondarySide(info);\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n const secondaryLoad = sideLoad.get(loadKey(info.srcId, secondary)) ?? 0;\n if (secondaryLoad >= primaryLoad) {\n continue;\n }\n sideLoad.set(loadKey(info.srcId, info.srcSide), primaryLoad - 1);\n sideLoad.set(loadKey(info.srcId, secondary), secondaryLoad + 1);\n info.srcSide = secondary;\n }\n }\n const isDiamondNode = /* @__PURE__ */ __name((node) => {\n const shape = node?.shape;\n return shape === \"question\" || shape === \"diamond\";\n }, \"isDiamondNode\");\n const inSidesByNode = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n if (!inSidesByNode.has(info.dstId)) {\n inSidesByNode.set(info.dstId, /* @__PURE__ */ new Set());\n }\n inSidesByNode.get(info.dstId).add(info.dstSide);\n }\n for (const info of sideInfoByIdx.values()) {\n if (!isDiamondNode(nodeById.get(info.srcId))) {\n continue;\n }\n const inSides = inSidesByNode.get(info.srcId);\n if (!inSides?.has(info.srcSide)) {\n continue;\n }\n const secondary = secondarySide(info);\n if (inSides.has(secondary) || (sideLoad.get(loadKey(info.srcId, secondary)) ?? 0) > 0) {\n continue;\n }\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n sideLoad.set(loadKey(info.srcId, info.srcSide), Math.max(0, primaryLoad - 1));\n sideLoad.set(loadKey(info.srcId, secondary), 1);\n info.srcSide = secondary;\n }\n for (const info of sideInfoByIdx.values()) {\n const { edgeIdx: i, srcId, dstId, srcSide, dstSide } = info;\n const src = nodeById.get(srcId);\n const dst = nodeById.get(dstId);\n const srcKey = `${srcId}:${srcSide}:src`;\n const dstCoord = srcSide === \"top\" || srcSide === \"bottom\" ? dst.x ?? 0 : dst.y ?? 0;\n if (!portGroups.has(srcKey)) {\n portGroups.set(srcKey, []);\n }\n portGroups.get(srcKey).push({ edgeIdx: i, oppositeCoord: dstCoord });\n const dstKey = `${dstId}:${dstSide}:dst`;\n const srcCoord = dstSide === \"top\" || dstSide === \"bottom\" ? src.x ?? 0 : src.y ?? 0;\n if (!portGroups.has(dstKey)) {\n portGroups.set(dstKey, []);\n }\n portGroups.get(dstKey).push({ edgeIdx: i, oppositeCoord: srcCoord });\n }\n const portOffsets = /* @__PURE__ */ new Map();\n const MIN_PORT_SPACING3 = 8;\n for (const [key, group] of portGroups) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => a.oppositeCoord - b.oppositeCoord);\n const parts = key.split(\":\");\n const nodeId = parts.slice(0, -2).join(\":\");\n const side = parts[parts.length - 2];\n const role = parts[parts.length - 1];\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n const isVerticalSide = side === \"left\" || side === \"right\";\n const sideLength = isVerticalSide ? node.height ?? 10 : node.width ?? 10;\n const shape = node.shape;\n const isDiamond = shape === \"question\" || shape === \"diamond\";\n const effectiveLength = isDiamond ? sideLength * 0.3 : sideLength;\n const MAX_PORT_SPACING = 20;\n const spacing = Math.min(\n MAX_PORT_SPACING,\n Math.max(MIN_PORT_SPACING3, effectiveLength / (group.length + 1))\n );\n const totalSpan = spacing * (group.length - 1);\n const startOffset = -totalSpan / 2;\n for (const [j, element] of group.entries()) {\n const offset = startOffset + j * spacing;\n const offsetKey = `${element.edgeIdx}:${role}`;\n portOffsets.set(offsetKey, offset);\n }\n }\n const edgeHasLabelNode = /* @__PURE__ */ __name((edgeIdx) => Boolean(edges[edgeIdx]?.labelNodeId), \"edgeHasLabelNode\");\n const faceHasLabelNode = /* @__PURE__ */ __name((nodeId, side) => {\n if (!nodeId) {\n return false;\n }\n return (portGroups.get(`${nodeId}:${side}:src`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n ) || (portGroups.get(`${nodeId}:${side}:dst`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n );\n }, \"faceHasLabelNode\");\n const applyPortOffset = /* @__PURE__ */ __name((basePort, side, offset) => {\n if (side === \"top\" || side === \"bottom\") {\n return { x: basePort.x + offset, y: basePort.y };\n } else {\n return { x: basePort.x, y: basePort.y + offset };\n }\n }, \"applyPortOffset\");\n const portsForEdge = /* @__PURE__ */ __name((edgeIndex, src, dst) => {\n const sideInfo = sideInfoByIdx.get(edgeIndex);\n const srcTarget = { x: dst.x ?? 0, y: dst.y ?? 0 };\n const dstTarget = { x: src.x ?? 0, y: src.y ?? 0 };\n const srcSide = sideInfo?.srcSide ?? determineSide(src, srcTarget);\n const dstSide = sideInfo?.dstSide ?? determineSide(dst, dstTarget);\n let pSrcPort = sideInfo ? portForSide(src, sideInfo.srcSide) : getOrthogonalPort(src, srcTarget, true);\n let pDstPort = sideInfo ? portForSide(dst, sideInfo.dstSide) : getOrthogonalPort(dst, dstTarget, false);\n const srcOffset = portOffsets.get(`${edgeIndex}:src`);\n const dstOffset = portOffsets.get(`${edgeIndex}:dst`);\n if (srcOffset !== void 0) {\n pSrcPort = applyPortOffset(pSrcPort, srcSide, srcOffset);\n }\n if (dstOffset !== void 0) {\n pDstPort = applyPortOffset(pDstPort, dstSide, dstOffset);\n }\n return { pSrcPort, pDstPort, srcSide, dstSide };\n }, \"portsForEdge\");\n for (const i of routingOrder) {\n const e = edges[i];\n edgeSegmentIndices[i] = [];\n if (!e.start || !e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n if (e.start === e.end) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const {\n pSrcPort,\n pDstPort,\n srcSide: srcPortSide,\n dstSide: dstPortSide\n } = portsForEdge(i, src, dst);\n const pSrcAnchor = { ...pSrcPort };\n const pDstAnchor = { ...pDstPort };\n const srcPortIsVertical = srcPortSide === \"top\" || srcPortSide === \"bottom\";\n const dstPortIsVertical = dstPortSide === \"top\" || dstPortSide === \"bottom\";\n if (srcPortIsVertical) {\n const isBottom = pSrcPort.y > (src.y ?? 0);\n pSrcAnchor.y = isBottom ? pSrcPort.y + ANCHOR_OFFSET : pSrcPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pSrcPort.x > (src.x ?? 0);\n pSrcAnchor.x = isRight ? pSrcPort.x + ANCHOR_OFFSET : pSrcPort.x - ANCHOR_OFFSET;\n }\n if (dstPortIsVertical) {\n const isBottom = pDstPort.y > (dst.y ?? 0);\n pDstAnchor.y = isBottom ? pDstPort.y + ANCHOR_OFFSET : pDstPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pDstPort.x > (dst.x ?? 0);\n pDstAnchor.x = isRight ? pDstPort.x + ANCHOR_OFFSET : pDstPort.x - ANCHOR_OFFSET;\n }\n const isPointInObstacle = /* @__PURE__ */ __name((pt, excludeNodeIds) => {\n for (const obs of obstacles) {\n if (excludeNodeIds.includes(obs.nodeId)) {\n continue;\n }\n if (pt.x > obs.minX && pt.x < obs.maxX && pt.y > obs.minY && pt.y < obs.maxY) {\n return { inside: true, obstacle: obs };\n }\n }\n return { inside: false };\n }, \"isPointInObstacle\");\n const obstacleDetour = /* @__PURE__ */ __name((port, node, opposite, obs, portIsVertical) => {\n if (portIsVertical) {\n const leavesPositiveSide2 = port.y > (node.y ?? 0);\n const goRight = (opposite.x ?? 0) >= port.x;\n return {\n x: goRight ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: leavesPositiveSide2 ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide: leavesPositiveSide2\n };\n }\n const leavesPositiveSide = port.x > (node.x ?? 0);\n const goDown = (opposite.y ?? 0) >= port.y;\n return {\n x: leavesPositiveSide ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: goDown ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide\n };\n }, \"obstacleDetour\");\n let srcHandleWaypoints = [];\n const endpointIds = [e.start, e.end];\n const srcCheck = isPointInObstacle(pSrcAnchor, endpointIds);\n if (srcCheck.inside && srcCheck.obstacle) {\n const obs = srcCheck.obstacle;\n if (srcPortIsVertical) {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, true);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n const gapY = detour.leavesPositiveSide ? Math.min(obs.minY - 2, pSrcPort.y + ANCHOR_OFFSET) : Math.max(obs.maxY + 2, pSrcPort.y - ANCHOR_OFFSET);\n srcHandleWaypoints = [\n { x: pSrcPort.x, y: gapY },\n // Orthogonal step in the gap\n { x: detour.x, y: gapY },\n // Horizontal detour\n { x: detour.x, y: detour.y }\n // Down past obstacle\n ];\n } else {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, false);\n const gapX = detour.leavesPositiveSide ? Math.min(obs.minX - 2, pSrcPort.x + ANCHOR_OFFSET) : Math.max(obs.maxX + 2, pSrcPort.x - ANCHOR_OFFSET);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n srcHandleWaypoints = [\n { x: gapX, y: pSrcPort.y },\n // Orthogonal step in the gap\n { x: gapX, y: detour.y },\n // Vertical detour\n { x: detour.x, y: detour.y }\n // Horizontal past obstacle\n ];\n }\n }\n let dstHandleWaypoints = [];\n const dstCheck = isPointInObstacle(pDstAnchor, endpointIds);\n if (dstCheck.inside && dstCheck.obstacle) {\n const obs = dstCheck.obstacle;\n if (dstPortIsVertical) {\n const detour = obstacleDetour(pDstPort, dst, src, obs, true);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: pDstPort.x, y: detour.y }\n // Go sideways to port's X\n // Then orthogonally to port\n ];\n } else {\n const detour = obstacleDetour(pDstPort, dst, src, obs, false);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: detour.x, y: pDstPort.y }\n // Go vertically to port's Y\n ];\n }\n }\n if (srcHandleWaypoints.length === 0 && dstHandleWaypoints.length === 0) {\n const hpMargin = HORIZONTAL_PIPE_MARGIN;\n const anchorsSameX = Math.abs(pSrcAnchor.x - pDstAnchor.x) < hpMargin;\n const anchorsSameY = Math.abs(pSrcAnchor.y - pDstAnchor.y) < hpMargin;\n const hasPortOffset = portOffsets.get(`${i}:src`) !== void 0 || portOffsets.get(`${i}:dst`) !== void 0;\n const srcFaceTotal = (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:dst`)?.length ?? 0);\n const dstFaceTotal = (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:dst`)?.length ?? 0);\n const faceContested = srcFaceTotal > 1 || dstFaceTotal > 1;\n const srcIncidentTotal = incidentEdgeTotals.get(e.start ?? \"\") ?? 0;\n const dstIncidentTotal = incidentEdgeTotals.get(e.end ?? \"\") ?? 0;\n const contestedFaceHasLabel = srcFaceTotal > 1 && faceHasLabelNode(e.start, srcPortSide) || dstFaceTotal > 1 && faceHasLabelNode(e.end, dstPortSide);\n const srcContestAllowsCenteredStraight = srcFaceTotal <= 1 || srcIncidentTotal <= 2;\n const dstContestAllowsCenteredStraight = dstFaceTotal <= 1 || dstIncidentTotal <= 2;\n const canPreserveSimpleContestedStraight = faceContested && !contestedFaceHasLabel && srcContestAllowsCenteredStraight && dstContestAllowsCenteredStraight;\n if ((anchorsSameX || anchorsSameY) && !hasPortOffset && (!faceContested || canPreserveSimpleContestedStraight)) {\n const directBlocked = isSegmentBlocked(pSrcPort, pDstPort, e.start, e.end);\n if (!directBlocked) {\n e.points = [{ ...pSrcPort }, { ...pSrcAnchor }, { ...pDstAnchor }, { ...pDstPort }];\n straightIntraLaneEdges.add(i);\n const fastPathOrientation = anchorsSameY ? \"horizontal\" : \"vertical\";\n const fastPathCoord = anchorsSameY ? pSrcPort.y : pSrcPort.x;\n const fastPathFrom = anchorsSameY ? Math.min(pSrcPort.x, pDstPort.x) : Math.min(pSrcPort.y, pDstPort.y);\n const fastPathTo = anchorsSameY ? Math.max(pSrcPort.x, pDstPort.x) : Math.max(pSrcPort.y, pDstPort.y);\n const fastPathPipe = {\n id: `fast-path-${fastPathOrientation}-${fastPathCoord.toFixed(0)}-${i}`,\n orientation: fastPathOrientation,\n coord: fastPathCoord,\n spanMin: fastPathFrom,\n spanMax: fastPathTo,\n tracks: []\n };\n allRoutedSegments.push({\n edgeIndex: i,\n segmentIndex: 0,\n orientation: fastPathOrientation,\n pipe: fastPathPipe,\n trackIndex: 0,\n from: fastPathFrom,\n to: fastPathTo\n });\n continue;\n }\n }\n }\n const srcPipe = getOrAddPipe(\"vertical\", pSrcAnchor.x, pSrcAnchor.y, pSrcAnchor.y);\n pSrcAnchor.x = srcPipe.coord;\n const dstPipe = getOrAddPipe(\"vertical\", pDstAnchor.x, pDstAnchor.y, pDstAnchor.y);\n pDstAnchor.x = dstPipe.coord;\n let bbMinX = Math.min(pSrcAnchor.x, pDstAnchor.x) - 50;\n let bbMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x) + 50;\n let bbMinY = Math.min(pSrcAnchor.y, pDstAnchor.y) - 50;\n let bbMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y) + 50;\n for (const obs of obstacles) {\n const pathMinX = Math.min(pSrcAnchor.x, pDstAnchor.x);\n const pathMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x);\n const pathMinY = Math.min(pSrcAnchor.y, pDstAnchor.y);\n const pathMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y);\n const obsBlocksPath = obs.minX < pathMaxX && obs.maxX > pathMinX && obs.minY < pathMaxY && obs.maxY > pathMinY;\n if (obsBlocksPath) {\n bbMinX = Math.min(bbMinX, obs.minX - ROUTING_MARGIN);\n bbMaxX = Math.max(bbMaxX, obs.maxX + ROUTING_MARGIN);\n bbMinY = Math.min(bbMinY, obs.minY - ROUTING_MARGIN);\n bbMaxY = Math.max(bbMaxY, obs.maxY + ROUTING_MARGIN);\n }\n }\n for (const obs of obstacles) {\n if (obs.maxX < bbMinX || obs.minX > bbMaxX || obs.maxY < bbMinY || obs.minY > bbMaxY) {\n continue;\n }\n const hMargin = HORIZONTAL_PIPE_MARGIN;\n getOrAddPipe(\"horizontal\", obs.minY - hMargin, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", obs.maxY + hMargin, bbMinX, bbMaxX);\n const vMargin = VERTICAL_PIPE_MARGIN;\n getOrAddPipe(\"vertical\", obs.minX - vMargin, bbMinY, bbMaxY);\n getOrAddPipe(\"vertical\", obs.maxX + vMargin, bbMinY, bbMaxY);\n }\n getOrAddPipe(\"horizontal\", pSrcAnchor.y, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", pDstAnchor.y, bbMinX, bbMaxX);\n const hPipes = pipes.filter(\n (p) => p.orientation === \"horizontal\" && p.coord >= bbMinY && p.coord <= bbMaxY\n );\n const vPipes = pipes.filter(\n (p) => p.orientation === \"vertical\" && p.coord >= bbMinX && p.coord <= bbMaxX\n );\n const getKey = /* @__PURE__ */ __name((x, y) => `${x.toFixed(1)},${y.toFixed(1)}`, \"getKey\");\n const startKey = getKey(pSrcAnchor.x, pSrcAnchor.y);\n const endKey = getKey(pDstAnchor.x, pDstAnchor.y);\n const gScore = /* @__PURE__ */ new Map();\n const cameFrom = /* @__PURE__ */ new Map();\n const arrivalDir = /* @__PURE__ */ new Map();\n const openSet = /* @__PURE__ */ new Set();\n const openList = [];\n gScore.set(startKey, 0);\n arrivalDir.set(startKey, \"n\");\n openList.push({\n key: startKey,\n f: Math.hypot(pDstAnchor.x - pSrcAnchor.x, pDstAnchor.y - pSrcAnchor.y),\n pt: pSrcAnchor\n });\n openSet.add(startKey);\n let foundPath = [];\n const checkSegmentBlocked = /* @__PURE__ */ __name((p1, p2) => {\n return isSegmentBlocked(p1, p2, e.start, e.end);\n }, \"checkSegmentBlocked\");\n const cornerHV = { x: pDstAnchor.x, y: pSrcAnchor.y };\n const seg1HV_blocked = checkSegmentBlocked(pSrcAnchor, cornerHV);\n const seg2HV_blocked = checkSegmentBlocked(cornerHV, pDstAnchor);\n const pathHV_blocked = seg1HV_blocked || seg2HV_blocked;\n const cornerVH = { x: pSrcAnchor.x, y: pDstAnchor.y };\n const seg1VH_blocked = checkSegmentBlocked(pSrcAnchor, cornerVH);\n const seg2VH_blocked = checkSegmentBlocked(cornerVH, pDstAnchor);\n const pathVH_blocked = seg1VH_blocked || seg2VH_blocked;\n if (!pathHV_blocked) {\n if (Math.abs(pSrcAnchor.y - pDstAnchor.y) < EPS7 || Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerHV, pDstAnchor];\n }\n } else if (!pathVH_blocked) {\n if (Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerVH, pDstAnchor];\n }\n }\n if (foundPath.length === 0) {\n while (openList.length > 0) {\n openList.sort((a, b) => a.f - b.f);\n const current = openList.shift();\n openSet.delete(current.key);\n if (current.key === endKey) {\n let currKey = endKey;\n let currPt = pDstAnchor;\n foundPath = [currPt];\n while (cameFrom.has(currKey)) {\n const prev = cameFrom.get(currKey);\n foundPath.unshift(prev);\n currPt = prev;\n currKey = getKey(prev.x, prev.y);\n }\n break;\n }\n const cx = current.pt.x;\n const cy = current.pt.y;\n const sortedVPipes = vPipes.sort((a, b) => a.coord - b.coord);\n const vIdx = sortedVPipes.findIndex((p) => Math.abs(p.coord - cx) < 1);\n const hPipesSorted = hPipes.sort((a, b) => a.coord - b.coord);\n const hIdx = hPipesSorted.findIndex((p) => Math.abs(p.coord - cy) < 1);\n const neighbors = [];\n if (vIdx > 0) {\n neighbors.push({ x: sortedVPipes[vIdx - 1].coord, y: cy });\n }\n if (vIdx >= 0 && vIdx < sortedVPipes.length - 1) {\n neighbors.push({ x: sortedVPipes[vIdx + 1].coord, y: cy });\n }\n if (hIdx > 0) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx - 1].coord });\n }\n if (hIdx >= 0 && hIdx < hPipesSorted.length - 1) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx + 1].coord });\n }\n for (const neighbor of neighbors) {\n const minX = Math.min(cx, neighbor.x);\n const maxX = Math.max(cx, neighbor.x);\n const minY = Math.min(cy, neighbor.y);\n const maxY = Math.max(cy, neighbor.y);\n const blocked = obstacles.some((obs) => {\n if (obs.nodeId === e.start || obs.nodeId === e.end) {\n return false;\n }\n if (minX !== maxX) {\n return obs.minY < cy && obs.maxY > cy && obs.maxX > minX && obs.minX < maxX;\n } else {\n return obs.minX < cx && obs.maxX > cx && obs.maxY > minY && obs.minY < maxY;\n }\n });\n if (blocked) {\n continue;\n }\n const nKey = getKey(neighbor.x, neighbor.y);\n const dist = Math.abs(neighbor.x - cx) + Math.abs(neighbor.y - cy);\n const penalty = crossingPenalty(i, current.pt, neighbor);\n let dirPenalty = 0;\n const destDx = pDstAnchor.x - pSrcAnchor.x;\n const destDy = pDstAnchor.y - pSrcAnchor.y;\n const moveDx = neighbor.x - cx;\n const moveDy = neighbor.y - cy;\n if (destDy > 10 && moveDy < -5 || destDy < -10 && moveDy > 5) {\n dirPenalty = Math.abs(moveDy) * 100;\n }\n if (destDx > 10 && moveDx < -5 || destDx < -10 && moveDx > 5) {\n dirPenalty += Math.abs(moveDx) * 50;\n }\n let bendPenalty = 0;\n const currentDir = arrivalDir.get(current.key) ?? \"n\";\n const moveDir = Math.abs(moveDx) > EPS7 ? \"h\" : \"v\";\n if (currentDir !== \"n\" && currentDir !== moveDir) {\n bendPenalty = 50;\n }\n const stepCost = dist + penalty + dirPenalty + bendPenalty;\n const tentativeG = (gScore.get(current.key) ?? Infinity) + stepCost;\n const h = Math.abs(pDstAnchor.x - neighbor.x) + Math.abs(pDstAnchor.y - neighbor.y);\n if (tentativeG < (gScore.get(nKey) ?? Infinity)) {\n cameFrom.set(nKey, current.pt);\n gScore.set(nKey, tentativeG);\n arrivalDir.set(nKey, moveDir);\n if (!openSet.has(nKey)) {\n openList.push({ key: nKey, f: tentativeG + h, pt: neighbor });\n openSet.add(nKey);\n } else {\n const idx = openList.findIndex((x) => x.key === nKey);\n if (idx !== -1) {\n openList[idx].f = tentativeG + h;\n }\n }\n }\n }\n }\n }\n if (foundPath.length === 0) {\n foundPath = [pSrcAnchor, { x: pSrcAnchor.x, y: pDstAnchor.y }, pDstAnchor];\n }\n if (foundPath.length > 4) {\n const start = foundPath[0];\n const end = foundPath[foundPath.length - 1];\n let minX = Math.min(start.x, end.x);\n let maxX = Math.max(start.x, end.x);\n let minY = Math.min(start.y, end.y);\n let maxY = Math.max(start.y, end.y);\n for (const pt of foundPath) {\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n minY = Math.min(minY, pt.y);\n maxY = Math.max(maxY, pt.y);\n }\n const wentRight = maxX > Math.max(start.x, end.x);\n const wentLeft = minX < Math.min(start.x, end.x);\n if (isLR) {\n const margin = VERTICAL_PIPE_MARGIN;\n if (wentRight) {\n const pathX = Math.max(start.x, end.x);\n const pathMinY = Math.min(start.y, end.y);\n const pathMaxY = Math.max(start.y, end.y);\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < pathX && obs.maxX > pathX && // obstacle's x-range contains the path x\n obs.minY < pathMaxY && obs.maxY > pathMinY\n // obstacle's y-range overlaps with path y-range\n );\n if (detourObstacles.length > 0) {\n let visualMaxX = Math.max(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n if (obs.visualXHalfExtent === void 0 || isNaN(obs.visualXHalfExtent)) {\n continue;\n }\n const visualRight = obsCenterX + obs.visualXHalfExtent + margin;\n visualMaxX = Math.max(visualMaxX, visualRight);\n }\n if (!isNaN(visualMaxX)) {\n maxX = visualMaxX;\n }\n }\n }\n if (wentLeft) {\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < Math.min(start.x, end.x) + margin && // obstacle extends past the direct path\n obs.minY < Math.max(start.y, end.y) && obs.maxY > Math.min(start.y, end.y)\n // obstacle is in Y range\n );\n if (detourObstacles.length > 0) {\n let visualMinX = Math.min(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n const visualLeft = obsCenterX - obs.visualXHalfExtent - margin;\n visualMinX = Math.min(visualMinX, visualLeft);\n }\n minX = visualMinX;\n }\n }\n }\n const findBestReturnY = /* @__PURE__ */ __name((detourX) => {\n const goingDown = end.y > start.y;\n const relevantObs = obstacles.filter((obs) => {\n const obsInXRange = Math.min(start.x, end.x) < obs.maxX && Math.max(start.x, end.x) > obs.minX;\n const obsInYRange = Math.min(start.y, end.y) < obs.maxY && Math.max(start.y, end.y) > obs.minY;\n return obsInXRange && obsInYRange;\n });\n let filteredObs = relevantObs;\n if (isLR && relevantObs.length > 0) {\n const obsAtDetourX = relevantObs.filter(\n (obs) => obs.minX < detourX && obs.maxX > detourX\n );\n if (obsAtDetourX.length > 0) {\n filteredObs = obsAtDetourX;\n }\n }\n if (filteredObs.length === 0) {\n return end.y;\n }\n const margin = HORIZONTAL_PIPE_MARGIN;\n if (goingDown) {\n const lowestObsBottom = Math.max(...filteredObs.map((obs) => obs.maxY));\n const bestY = lowestObsBottom + margin;\n if (bestY < end.y - EPS7) {\n return bestY;\n }\n } else {\n const highestObsTop = Math.min(...filteredObs.map((obs) => obs.minY));\n const bestY = highestObsTop - margin;\n if (bestY > end.y + EPS7) {\n return bestY;\n }\n }\n return end.y;\n }, \"findBestReturnY\");\n const trySimplifyWithDetourX = /* @__PURE__ */ __name((detourX) => {\n const bestY = findBestReturnY(detourX);\n const corner1 = { x: detourX, y: start.y };\n const corner2 = { x: detourX, y: bestY };\n const corner3 = { x: end.x, y: bestY };\n const seg1Blocked = checkSegmentBlocked(start, corner1);\n const seg2Blocked = checkSegmentBlocked(corner1, corner2);\n const seg3Blocked = checkSegmentBlocked(corner2, corner3);\n const seg4Blocked = bestY !== end.y ? checkSegmentBlocked(corner3, end) : false;\n if (!seg1Blocked && !seg2Blocked && !seg3Blocked && !seg4Blocked) {\n if (Math.abs(bestY - end.y) < EPS7) {\n return [start, corner1, corner2, end];\n }\n return [start, corner1, corner2, corner3, end];\n }\n return null;\n }, \"trySimplifyWithDetourX\");\n const simplified2 = wentRight && !wentLeft ? trySimplifyWithDetourX(maxX) : wentLeft && !wentRight ? trySimplifyWithDetourX(minX) : null;\n if (simplified2) {\n foundPath = simplified2;\n }\n }\n const fullPoints = [\n pSrcPort,\n ...srcHandleWaypoints,\n ...foundPath,\n ...dstHandleWaypoints.reverse(),\n // Reverse because they're stored anchor->waypoint->port\n pDstPort\n ];\n if (fullPoints.length >= 3) {\n const C = fullPoints[fullPoints.length - 1];\n const B = fullPoints[fullPoints.length - 2];\n const A = fullPoints[fullPoints.length - 3];\n const isHoriz = Math.abs(A.y - B.y) < EPS7 && Math.abs(B.y - C.y) < EPS7;\n const isVert = Math.abs(A.x - B.x) < EPS7 && Math.abs(B.x - C.x) < EPS7;\n if (isHoriz) {\n const signAB = Math.sign(B.x - A.x);\n const signAC = Math.sign(C.x - A.x);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.x - A.x) > Math.abs(C.x - A.x)) {\n fullPoints.splice(-2, 1);\n }\n } else if (isVert) {\n const signAB = Math.sign(B.y - A.y);\n const signAC = Math.sign(C.y - A.y);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.y - A.y) > Math.abs(C.y - A.y)) {\n fullPoints.splice(-2, 1);\n }\n }\n }\n const simplified = [fullPoints[0]];\n for (let k = 1; k < fullPoints.length - 1; k++) {\n if (k === 1) {\n simplified.push(fullPoints[k]);\n continue;\n }\n const prev = simplified[simplified.length - 1];\n const curr = fullPoints[k];\n const next = fullPoints[k + 1];\n if (Math.abs(prev.y - curr.y) < EPS7 && Math.abs(curr.y - next.y) < EPS7) {\n const dir1 = curr.x > prev.x;\n const dir2 = next.x > curr.x;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n if (Math.abs(prev.x - curr.x) < EPS7 && Math.abs(curr.x - next.x) < EPS7) {\n const dir1 = curr.y > prev.y;\n const dir2 = next.y > curr.y;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n simplified.push(curr);\n }\n simplified.push(fullPoints[fullPoints.length - 1]);\n for (let k = 0; k < simplified.length - 1; k++) {\n const p1 = simplified[k];\n const p2 = simplified[k + 1];\n const orientation = Math.abs(p1.x - p2.x) < EPS7 ? \"vertical\" : \"horizontal\";\n const coord = orientation === \"vertical\" ? p1.x : p1.y;\n const from = orientation === \"vertical\" ? Math.min(p1.y, p2.y) : Math.min(p1.x, p2.x);\n const to = orientation === \"vertical\" ? Math.max(p1.y, p2.y) : Math.max(p1.x, p2.x);\n const pipe = getOrAddPipe(orientation, coord, from, to);\n const rSeg = {\n edgeIndex: i,\n segmentIndex: k,\n orientation,\n pipe,\n trackIndex: 0,\n // Initial track\n from,\n to\n };\n allRoutedSegments.push(rSeg);\n edgeSegmentIndices[i].push(allRoutedSegments.length - 1);\n if (!pipe.tracks[0]) {\n pipe.tracks[0] = { index: 0, coord: pipe.coord, segments: [] };\n }\n pipe.tracks[0].segments.push({\n edgeIndex: i,\n segmentIndex: k,\n from,\n to\n });\n }\n }\n const segmentsOverlap = /* @__PURE__ */ __name((s1, s2) => {\n return s1.from < s2.to && s2.from < s1.to;\n }, \"segmentsOverlap\");\n const trySwapSegmentsAcrossTracks = /* @__PURE__ */ __name((s1, s2, t1, t2) => {\n const canS1GoT2 = !t2.segments.some(\n (r) => (r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex) && segmentsOverlap(r, s1)\n );\n const canS2GoT1 = !t1.segments.some(\n (r) => (r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex) && segmentsOverlap(r, s2)\n );\n if (canS1GoT2 && canS2GoT1) {\n s1.trackIndex = t2.index;\n s2.trackIndex = t1.index;\n t1.segments = [\n ...t1.segments.filter(\n (r) => r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex\n ),\n {\n edgeIndex: s2.edgeIndex,\n segmentIndex: s2.segmentIndex,\n from: s2.from,\n to: s2.to\n }\n ];\n t2.segments = [\n ...t2.segments.filter(\n (r) => r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex\n ),\n {\n edgeIndex: s1.edgeIndex,\n segmentIndex: s1.segmentIndex,\n from: s1.from,\n to: s1.to\n }\n ];\n return true;\n }\n return false;\n }, \"trySwapSegmentsAcrossTracks\");\n const createNewTrack = /* @__PURE__ */ __name((pipe) => {\n const idx = pipe.tracks.length;\n pipe.tracks[idx] = { index: idx, coord: pipe.coord, segments: [] };\n return idx;\n }, \"createNewTrack\");\n const moveSegmentToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const oldTrack = seg.pipe.tracks[seg.trackIndex];\n oldTrack.segments = oldTrack.segments.filter(\n (r) => r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex\n );\n seg.trackIndex = trackIdx;\n const newTrack = seg.pipe.tracks[trackIdx];\n newTrack.segments.push({\n edgeIndex: seg.edgeIndex,\n segmentIndex: seg.segmentIndex,\n from: seg.from,\n to: seg.to\n });\n }, \"moveSegmentToTrack\");\n const moveSegmentChainToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n for (const idx of indices) {\n const s = allRoutedSegments[idx];\n if (s.pipe === seg.pipe) {\n moveSegmentToTrack(s, trackIdx);\n }\n }\n }, \"moveSegmentChainToTrack\");\n const getAdjacentSegmentsAlongEdge = /* @__PURE__ */ __name((seg) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n const idxInList = indices.indexOf(allRoutedSegments.indexOf(seg));\n const adj = [];\n if (idxInList > 0) {\n adj.push(allRoutedSegments[indices[idxInList - 1]]);\n }\n if (idxInList < indices.length - 1) {\n adj.push(allRoutedSegments[indices[idxInList + 1]]);\n }\n return adj;\n }, \"getAdjacentSegmentsAlongEdge\");\n const haveAnyCrossing = /* @__PURE__ */ __name((segA, segB) => {\n if (segA.orientation === segB.orientation) {\n return false;\n }\n const h = segA.orientation === \"horizontal\" ? segA : segB;\n const v = segA.orientation === \"horizontal\" ? segB : segA;\n return v.pipe.coord > h.from && v.pipe.coord < h.to && h.pipe.coord > v.from && h.pipe.coord < v.to;\n }, \"haveAnyCrossing\");\n const findAvailableTrack = /* @__PURE__ */ __name((pipe, seg) => {\n for (const track of pipe.tracks) {\n const overlap = track.segments.some(\n (r) => (r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex) && segmentsOverlap(r, seg)\n );\n if (!overlap) {\n return track.index;\n }\n }\n return -1;\n }, \"findAvailableTrack\");\n const segmentsConflict = /* @__PURE__ */ __name((s1, s2) => {\n if (s1.trackIndex === s2.trackIndex) {\n return segmentsOverlap(s1, s2);\n }\n const adj1 = getAdjacentSegmentsAlongEdge(s1);\n const adj2 = getAdjacentSegmentsAlongEdge(s2);\n return adj1.some((a1) => adj2.some((a2) => haveAnyCrossing(a1, a2)));\n }, \"segmentsConflict\");\n const resolveTrackConflict = /* @__PURE__ */ __name((s1, s2, move) => {\n if (trySwapSegmentsAcrossTracks(\n s1,\n s2,\n s1.pipe.tracks[s1.trackIndex],\n s2.pipe.tracks[s2.trackIndex]\n )) {\n return;\n }\n const avail = findAvailableTrack(s1.pipe, s2);\n move(s2, avail !== -1 ? avail : createNewTrack(s1.pipe));\n }, \"resolveTrackConflict\");\n const resolveHandleConflicts = /* @__PURE__ */ __name((handles) => {\n let crossings = 0;\n for (let i = 0; i < handles.length; i++) {\n for (let j = i + 1; j < handles.length; j++) {\n const h1 = handles[i];\n const h2 = handles[j];\n if (h1.pipe !== h2.pipe) {\n continue;\n }\n if (segmentsConflict(h1, h2)) {\n crossings++;\n resolveTrackConflict(h1, h2, moveSegmentChainToTrack);\n }\n }\n }\n return crossings;\n }, \"resolveHandleConflicts\");\n const destInfoCache = /* @__PURE__ */ new Map();\n const getDestInfo = /* @__PURE__ */ __name((edgeIdx) => {\n if (destInfoCache.has(edgeIdx)) {\n return destInfoCache.get(edgeIdx);\n }\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length === 0) {\n const info2 = { dest: 0, deviation: 0, base: 0, delta: 0 };\n destInfoCache.set(edgeIdx, info2);\n return info2;\n }\n const firstSeg = allRoutedSegments[indices[0]];\n const base = firstSeg.pipe.coord;\n let dest = base;\n for (let idx = 1; idx < indices.length; idx++) {\n const seg = allRoutedSegments[indices[idx]];\n if (seg.orientation === \"horizontal\") {\n const candidateA = seg.from;\n const candidateB = seg.to;\n dest = Math.abs(candidateA - base) > Math.abs(candidateB - base) ? candidateA : candidateB;\n break;\n }\n }\n const deviation = Math.abs(dest - base);\n const info = { dest, deviation, base, delta: dest - base };\n destInfoCache.set(edgeIdx, info);\n return info;\n }, \"getDestInfo\");\n const fixSourceHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesBySource = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (edgeSegmentIndices[i].length === 0) {\n continue;\n }\n if (!e.start) {\n continue;\n }\n if (!edgesBySource.has(e.start)) {\n edgesBySource.set(e.start, []);\n }\n edgesBySource.get(e.start).push(i);\n }\n const getEdgeDistance = /* @__PURE__ */ __name((edgeIdx) => {\n const edge = edges[edgeIdx];\n if (!edge.start || !edge.end) {\n return 0;\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n if (!srcNode || !dstNode) {\n return 0;\n }\n const dx = (dstNode.x ?? 0) - (srcNode.x ?? 0);\n const dy = (dstNode.y ?? 0) - (srcNode.y ?? 0);\n return Math.abs(dx) + Math.abs(dy);\n }, \"getEdgeDistance\");\n for (const grp of edgesBySource.values()) {\n grp.sort((a, b) => {\n const infoA = getDestInfo(a);\n const infoB = getDestInfo(b);\n if (Math.abs(infoA.deviation - infoB.deviation) > 1) {\n return infoA.deviation - infoB.deviation;\n }\n if (Math.abs(infoA.dest - infoB.dest) > 1) {\n return infoA.dest - infoB.dest;\n }\n const distA = getEdgeDistance(a);\n const distB = getEdgeDistance(b);\n if (Math.abs(distA - distB) > 1) {\n return distB - distA;\n }\n const lenA = edgeSegmentIndices[a].length;\n const lenB = edgeSegmentIndices[b].length;\n if (lenA !== lenB) {\n return lenA - lenB;\n }\n if (lenA === 1) {\n const idxA = edgeSegmentIndices[a][0];\n const idxB = edgeSegmentIndices[b][0];\n if (allRoutedSegments[idxA] && allRoutedSegments[idxB]) {\n const segA = allRoutedSegments[idxA];\n const segB = allRoutedSegments[idxB];\n const distA2 = Math.abs(segA.to - segA.from);\n const distB2 = Math.abs(segB.to - segB.from);\n if (Math.abs(distA2 - distB2) > 1) {\n return distA2 - distB2;\n }\n }\n }\n return 0;\n });\n const handles = grp.map((ei) => allRoutedSegments[edgeSegmentIndices[ei][0]]);\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixSourceHandleCrossings\");\n const fixTargetHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesByTarget = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i];\n if (indices.length === 0) {\n continue;\n }\n if (!e.end) {\n continue;\n }\n if (!edgesByTarget.has(e.end)) {\n edgesByTarget.set(e.end, []);\n }\n edgesByTarget.get(e.end).push(i);\n }\n for (const grp of edgesByTarget.values()) {\n grp.sort((a, b) => {\n const getDist = /* @__PURE__ */ __name((edgeIdx) => {\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length < 2) {\n return 0;\n }\n const prev = allRoutedSegments[indices[indices.length - 2]];\n return Math.abs(prev.to - prev.from);\n }, \"getDist\");\n const scoreA = getDist(a);\n const scoreB = getDist(b);\n if (Math.abs(scoreA - scoreB) > 0.1) {\n return scoreA - scoreB;\n }\n return a - b;\n });\n const handles = grp.map(\n (ei) => allRoutedSegments[edgeSegmentIndices[ei][edgeSegmentIndices[ei].length - 1]]\n );\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixTargetHandleCrossings\");\n const fixPipeCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n for (const pipe of pipes) {\n const pipeSegments = [];\n for (const t of pipe.tracks) {\n for (const ref of t.segments) {\n const idx = edgeSegmentIndices[ref.edgeIndex].find(\n (ix) => allRoutedSegments[ix].segmentIndex === ref.segmentIndex\n );\n if (idx !== void 0) {\n pipeSegments.push(allRoutedSegments[idx]);\n }\n }\n }\n pipeSegments.sort((a, b) => a.edgeIndex - b.edgeIndex || a.segmentIndex - b.segmentIndex);\n for (let i = 0; i < pipeSegments.length; i++) {\n for (let j = i + 1; j < pipeSegments.length; j++) {\n const s1 = pipeSegments[i];\n const s2 = pipeSegments[j];\n if (segmentsConflict(s1, s2)) {\n crossings++;\n resolveTrackConflict(s1, s2, moveSegmentToTrack);\n }\n }\n }\n }\n return crossings;\n }, \"fixPipeCrossings\");\n let iterations = 0;\n const MAX_ITER = 10;\n while (iterations < MAX_ITER) {\n let changed = 0;\n changed += fixSourceHandleCrossings();\n changed += fixTargetHandleCrossings();\n changed += fixPipeCrossings();\n if (changed === 0) {\n break;\n }\n iterations++;\n }\n const segmentCoords = /* @__PURE__ */ new Map();\n for (const pipe of pipes) {\n const segments = [];\n pipe.tracks.forEach((t) => {\n t.segments.forEach((s) => {\n segments.push({\n edgeIndex: s.edgeIndex,\n segmentIndex: s.segmentIndex,\n trackIndex: t.index,\n from: s.from,\n to: s.to\n });\n });\n });\n segments.sort((a, b) => a.from - b.from);\n const clusters = [];\n if (segments.length > 0) {\n let currentCluster = [segments[0]];\n let clusterEnd = segments[0].to;\n for (let k = 1; k < segments.length; k++) {\n const s = segments[k];\n if (s.from < clusterEnd) {\n currentCluster.push(s);\n clusterEnd = Math.max(clusterEnd, s.to);\n } else {\n clusters.push(currentCluster);\n currentCluster = [s];\n clusterEnd = s.to;\n }\n }\n clusters.push(currentCluster);\n }\n for (const cluster of clusters) {\n const usedTracks = /* @__PURE__ */ new Set();\n cluster.forEach((s) => usedTracks.add(s.trackIndex));\n const trackScores = /* @__PURE__ */ new Map();\n cluster.forEach((s) => {\n const info = getDestInfo(s.edgeIndex);\n trackScores.set(s.trackIndex, (trackScores.get(s.trackIndex) ?? 0) + info.delta);\n });\n const leftTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) < -1);\n const rightTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) > 1);\n const neutralTracks = [...usedTracks].filter((t) => Math.abs(trackScores.get(t) ?? 0) <= 1);\n leftTracks.sort((a, b) => (trackScores.get(b) ?? 0) - (trackScores.get(a) ?? 0));\n rightTracks.sort((a, b) => (trackScores.get(a) ?? 0) - (trackScores.get(b) ?? 0));\n const assignCoord = /* @__PURE__ */ __name((trackIndex, coord) => {\n cluster.filter((s) => s.trackIndex === trackIndex).forEach((s) => {\n const effectiveCoord = straightIntraLaneEdges.has(s.edgeIndex) ? pipe.coord : coord;\n segmentCoords.set(`${s.edgeIndex}-${s.segmentIndex}`, effectiveCoord);\n });\n }, \"assignCoord\");\n let leftCount = 0;\n for (const trackIndex of leftTracks) {\n leftCount++;\n assignCoord(trackIndex, pipe.coord - leftCount * TRACK_SPACING);\n }\n if (neutralTracks.length === 0 && usedTracks.size > 0) {\n const bestTrack = [...usedTracks].sort(\n (a, b) => Math.abs(trackScores.get(a) ?? 0) - Math.abs(trackScores.get(b) ?? 0)\n )[0];\n const leftIdx = leftTracks.indexOf(bestTrack);\n if (leftIdx !== -1) {\n leftTracks.splice(leftIdx, 1);\n }\n const rightIdx = rightTracks.indexOf(bestTrack);\n if (rightIdx !== -1) {\n rightTracks.splice(rightIdx, 1);\n }\n neutralTracks.push(bestTrack);\n }\n let neutralAssigned = 0;\n for (const trackIndex of neutralTracks) {\n if (neutralAssigned === 0) {\n assignCoord(trackIndex, pipe.coord);\n } else {\n const dir = neutralAssigned % 2 === 1 ? 1 : -1;\n const magnitude = Math.ceil(neutralAssigned / 2);\n assignCoord(trackIndex, pipe.coord + dir * magnitude * TRACK_SPACING * 0.5);\n }\n neutralAssigned++;\n }\n let rightCount = 0;\n for (const trackIndex of rightTracks) {\n rightCount++;\n assignCoord(trackIndex, pipe.coord + rightCount * TRACK_SPACING);\n }\n }\n }\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i] ?? [];\n if (indices.length === 0) {\n continue;\n }\n const newPoints = [];\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n const { pSrcPort, pDstPort } = portsForEdge(i, src, dst);\n const lines = indices.map((idx) => {\n const s = allRoutedSegments[idx];\n const coord = segmentCoords.get(`${s.edgeIndex}-${s.segmentIndex}`) ?? s.pipe.coord;\n return {\n orient: s.orientation,\n coord,\n from: s.from,\n to: s.to\n };\n });\n newPoints.push(pSrcPort);\n for (let k = 0; k < lines.length; k++) {\n const line = lines[k];\n const prevPt = newPoints[newPoints.length - 1];\n const prevAlong = line.orient === \"vertical\" ? prevPt.y : prevPt.x;\n const prevTrackCoord = line.orient === \"vertical\" ? prevPt.x : prevPt.y;\n const nextLine = lines[k + 1];\n const hasNextLine = k < lines.length - 1;\n if (Math.abs(prevTrackCoord - line.coord) > EPS7) {\n newPoints.push(pointOnLine(line, prevAlong));\n }\n if (hasNextLine && nextLine.orient === line.orient) {\n if (Math.abs(line.coord - nextLine.coord) > EPS7) {\n const junction = line.orient === \"vertical\" ? (prevAlong + nextLine.from) / 2 : sharedLineEndpointCoord(line, nextLine);\n newPoints.push(pointOnLine(line, junction), pointOnLine(nextLine, junction));\n } else if (k === 0 || k === lines.length - 2) {\n newPoints.push(pointOnLine(line, sharedLineEndpointCoord(line, nextLine)));\n }\n } else if (hasNextLine) {\n newPoints.push(pointOnLine(line, nextLine.coord));\n } else {\n const endAlong = Math.abs(line.from - prevAlong) < Math.abs(line.to - prevAlong) ? line.to : line.from;\n newPoints.push(pointOnLine(line, endAlong));\n }\n }\n const last = newPoints[newPoints.length - 1];\n if (Math.abs(last.x - pDstPort.x) > EPS7 || Math.abs(last.y - pDstPort.y) > EPS7) {\n newPoints.push(pDstPort);\n }\n const filtered = [];\n if (newPoints.length > 0) {\n filtered.push(newPoints[0]);\n }\n for (let k = 1; k < newPoints.length; k++) {\n const p = newPoints[k];\n const prev = filtered[filtered.length - 1];\n if (Math.abs(p.x - prev.x) > EPS7 || Math.abs(p.y - prev.y) > EPS7) {\n filtered.push(p);\n }\n }\n e.points = filtered;\n }\n for (const re of edges) {\n const orig = re.__originalEdge;\n if (orig && re.points) {\n orig.points = re.points;\n }\n }\n data.edges = (data.edges ?? []).filter((e) => !e.isLayoutOnly);\n const nodeBoundaryClamp = /* @__PURE__ */ __name((p, node) => {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const w = node.width ?? 0;\n const h = node.height ?? 0;\n if (w <= 0 || h <= 0) {\n return p;\n }\n const left = cx - w / 2;\n const right = cx + w / 2;\n const top = cy - h / 2;\n const bottom = cy + h / 2;\n if (p.x < left || p.x > right || p.y < top || p.y > bottom) {\n return p;\n }\n const dLeft = p.x - left;\n const dRight = right - p.x;\n const dTop = p.y - top;\n const dBottom = bottom - p.y;\n const minD = Math.min(dLeft, dRight, dTop, dBottom);\n if (minD === dLeft) {\n return { x: left, y: p.y };\n }\n if (minD === dRight) {\n return { x: right, y: p.y };\n }\n if (minD === dTop) {\n return { x: p.x, y: top };\n }\n return { x: p.x, y: bottom };\n }, \"nodeBoundaryClamp\");\n for (const edge of data.edges) {\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n const src = srcId ? nodeById.get(srcId) : void 0;\n const dst = dstId ? nodeById.get(dstId) : void 0;\n if (src) {\n pts[0] = nodeBoundaryClamp(pts[0], src);\n }\n if (dst) {\n pts[pts.length - 1] = nodeBoundaryClamp(pts[pts.length - 1], dst);\n }\n }\n return data;\n}\n__name(routeEdgesOrthogonal, \"routeEdgesOrthogonal\");\n\n// src/rendering-util/layout-algorithms/swimlanes/layoutCore.ts\nfunction getSwimlaneDirection(data4Layout) {\n return data4Layout.direction ?? \"TB\";\n}\n__name(getSwimlaneDirection, \"getSwimlaneDirection\");\nfunction runSwimlaneLayoutCore(data4Layout) {\n const g = toGraphView(data4Layout);\n const nodeGap = data4Layout.config.flowchart?.nodeSpacing ?? 40;\n const layerGap = data4Layout.config.flowchart?.rankSpacing ?? 100;\n const ignoreCrossLaneEdges = data4Layout.config.swimlane?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = data4Layout.config.swimlane?.optimizeRanksByCrossings ?? true;\n const automaticLaneOrdering = data4Layout.config.swimlane?.automaticLaneOrdering ?? false;\n const direction = getSwimlaneDirection(data4Layout);\n const { ordered, coordinates } = sugiyamaLayout(g, {\n nodeGap,\n layerGap,\n ignoreCrossLaneEdges,\n optimizeRanksByCrossings: optimizeRanksByCrossings2,\n automaticLaneOrdering,\n direction\n });\n writeBackToLayoutData(g, ordered, coordinates, { nodeGap, layerGap });\n for (const edge of data4Layout.edges ?? []) {\n delete edge.points;\n }\n routeEdgesOrthogonal(data4Layout, direction);\n for (const edge of data4Layout.edges ?? []) {\n if (!edge.curve || edge.curve === \"basis\") {\n edge.curve = \"rounded\";\n }\n }\n postProcessSwimlaneLayout(data4Layout, direction);\n validateSwimlanesLayout(data4Layout);\n return direction;\n}\n__name(runSwimlaneLayoutCore, \"runSwimlaneLayoutCore\");\n\n// src/rendering-util/layout-algorithms/swimlanes/index.ts\nasync function render(data4Layout, svg) {\n const element = svg.select(\"g\");\n markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clear3();\n clear2();\n clear();\n clear4();\n prepareLayoutForSwimlanes(data4Layout);\n const transformedData = createEdgeLabelNodes(data4Layout);\n data4Layout.nodes = transformedData.nodes;\n data4Layout.edges = transformedData.edges;\n const { groups } = await createGraphWithElements(element, data4Layout);\n runSwimlaneLayoutCore(data4Layout);\n await adjustLayout(data4Layout, groups);\n}\n__name(render, \"render\");\nexport {\n render\n};\n"],"file":"assets/swimlanes-SLNWSIFB-C1lOy4R9.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["createGraphWithElements","element","data4Layout","graph","graphlib.Graph","edgesToProcess","config","getConfig2","rootGroups","clusters","edgePaths","edgeLabels2","nodesGroup","nodeElements","hasDom","node","childNodeEl","insertNode","boundingBox","edge","existingEdge","captureNodeSizes","__vitePreload","__name","ROUNDED_CORNER_RADIUS","CORNER_EPSILON","ENDPOINT_EPSILON","buildSegmentList","points","segments","i","segmentIntersection","a1","a2","b1","b2","dxA","dyA","dxB","dyB","denom","dx","dy","tA","tB","isHorizontalSeg","seg","findEdgeIntersections","edges","crossings","edgeA","segmentsA","j","edgeB","segmentsB","si","segA","sj","segB","hit","aHoriz","bHoriz","fmt","n","rounded","pointToString","p","getArcSweepFlag","MIN_JUMP_RADIUS","applyMarkerOffsets","out","startOff","markerOffsets","a","b","ang","endOff","emitJump","jump","ux","uy","sweep","style","cx","cy","pre","post","computeRoundedCorner","prev","curr","next","radius","dx1","dy1","dx2","dy2","len1","len2","nx1","ny1","nx2","ny2","dot","clamped","angle","cutLen","rewriteEdgePath","jumps","rawPoints","bySeg","segLen","list","parts","segStartConsumed","corner","segEndStop","upcomingCorner","segJumps","k","gap","half","isStraightPath","d","curveSupportsLineHops","curve","decodeDataPoints","raw","json","parsed","pts","applyLineJumpsToSvg","edgePathsGroup","groupNode","edgeMeta","e","renderedEdges","pathById","escapedId","pathEl","jumpsByEdge","c","renderedEdge","curveHint","currentD","originalStyle","dasharrayMatch","preservedOValueS","preservedOValueE","newD","newLen","onLen","newDasharray","cleaned","adjustLayout","groups","insertCluster","positionNode","nodeById","startNode","endNode","paths","insertEdge","insertEdgeLabel","positionEdgeLabel","lineHopsConfig","jumpStyle","edgeGeometries","path","siteConfig","getConfig","subGraphTitleTotalMargin","getSubGraphTitleMargins","el","edgeLabels","x","y","pos","utils_default","log","terminalLabels","DEFAULT_SWIMLANE_ID","TOP_LANE_TITLE_BAND_HEIGHT","MIN_TOP_LANE_HORIZONTAL_PADDING","topLaneHorizontalPadding","lane","assignTopLaneTitleRect","width","height","contentTop","top","headerBottom","titleHeight","bottom","prepareLayoutForSwimlanes","layout","direction","nodes","looseNodes","defaultLane","toGraphView","src","dst","allNodes","groupNodes","nonGroupNodes","writeBackToLayoutData","g","ordered","coords","opts","nodeMap","layerGap","nodeGap","layerIndex","layer","orderIndex","id","groupBounds","topLevelGroups","group","children","minX","maxX","minY","maxY","child","cw","ch","pad","horizontalPad","verticalPad","w","h","globalMinY","globalMaxY","maxPad","contentHeight","verticalMargin","laneHeight","centerY","sortedLanes","ax","bx","laneIds","centers","baseWidths","contentWidth","count","laneWidths","u","lowerBound","upperBound","baseW","finalWidth","EDGE_LABEL_LOG_PREFIX","createEdgeLabelNodes","data","nodesToAdd","layoutOnlyEdges","sourceNode","targetNode","labelNodeId","labelLane","labelNode","toLabelVirtual","fromLabelVirtual","newNodes","newEdges","EPS","measuredNodeRect","rectFromCenterSize","nodeBoundsInfoFor","measured","samePoint","epsilon","sameX","sameY","isHorizontalSegment","isVerticalSegment","overlapLength","sameAxisSegmentOverlapLength","orthogonalSegmentsForPoints","result","horizontal","vertical","countOrthogonalBends","bends","dedupeConsecutivePoints","point","last","classifyThreeSegmentRoute","p0","p1","p2","p3","segmentBoundsOverlapRect","rect","buffer","segMinX","segMaxX","segMinY","segMaxY","pointInsideRect","rectContainsRect","outer","inner","rectsOverlap","inflateRect","margin","rectOfNodeBounds","portForRectSide","side","buildOrthogonalPortPath","srcSide","dstSide","anchor","srcH","dstH","midX","intX","intY","midY","sameDirSrc2","sameDirDst2","sameDirSrc","sameDirDst","buildSameSideTrackPath","track","collectRealNodeBounds","nodeInfoById","realNodeRects","info","collectNodeRectEntries","labelNodeRects","entry","collectLayoutNodeRects","includeEdgeLabels","getNodePairGeometry","srcId","dstId","srcInfo","dstInfo","segmentHitsAnyRect","rects","excludeIds","shrink","orthogonalSegmentsCross","endpointTolerance","s1H","s1V","s2H","s2V","horiz","vert","hY","hX1","hX2","vX","vY1","vY2","matchesHorizEndpoint","matchesVertEndpoint","sameAxisSegmentsOverlap","segmentConflictsWithAnyEdge","excludeEdge","skipDegenerateOther","other","oa","ob","orthogonalSegmentsStrictlyCross","aVert","bVert","hXmin","hXmax","vYmin","vYmax","strictlyBetween","value","lo","hi","isCollinearIntermediate","cur","simplifyPolylineOnce","changed","orthogonalizePolyline","prevPrev","deduped","simplifyPolyline","work","guard","EPS2","INSIDE_EPS","CORNER_CLEARANCE","endpointContextFor","nodeByIdMap","minPoints","candidate","segmentEnterPoint","outside","inside","r","clipEndpoint","atStart","step","outsideIndex","insideIndex","clipEdgeEndpointsToNodeBoundaries","context","clearStraightEndpointCornerConnections","snapEndpointToBoundary","endpoint","useApproachSide","toTop","firstDistinctAdjacent","endpointIndex","index","cornerClearanceRange","min","max","clampToCornerClearance","intersectRanges","ranges","range","clearanceRangeForSide","terminalSideForSegment","adjacent","yWithin","xWithin","isHorizontalSide","straightClearanceRange","start","end","srcRect","dstRect","clearStraightEndpointCornerAxis","current","cornerClearedEndpoint","moveCollinearEndpointRun","adjusted","horizontalTerminal","clearEndpointCornerConnection","borderSideForSegment","leavesOutward","from","to","collapseOwnBorderStub","side2","snapAndCollapseEndpoints","snapped","straightCleared","prepareEdgeEndpointsForRenderer","input","newPts","duplicated","buildNodeMap","resolveTopLevelGroupId","parentId","topLevelGroupId","parent","groupDepth","depth","boundsForChildren","applyGroupBounds","bounds","recomputeNestedGroupBounds","groupsByDepth","mirrorAxis","axis","contentNodes","mirror","titleRect","applyBtDirectionTransform","applyLrDirectionTransform","x0","y0","titleBandSize","totalWidth","totalHeight","avgWidth","avgHeight","horizontalScaleFactor","newX","newY","laneNodes","childrenByLane","laneId","bucket","laneBounds","globalMinXChild","globalMaxXChild","fullContentWidth","horizontalMargin","bodyWidth","laneWidth","laneLeft","centerX","laneTop","laneBottom","EPS3","MIN_PORT_SPACING","PORT_SHIFT","TRY_DELTAS","portSwapToLShape","route","isHVH","nodePair","collinearX","collinearY","delta","np0","np1","np2","newSrcY","newSrcX","firstSegDegenerate","secondSegDegenerate","firstSegConflicts","secondSegConflicts","collapseShortTerminalStub","labelRects","rawPts","nLast","endPt","penultPt","prevPt","lastDx","lastDy","lastLen","penultDx","penultDy","lastIsHoriz","lastIsVert","penultIsHoriz","penultIsVert","dstCx","dstCy","newPrev","newEnd","approachFromBelow","approachFromLeft","ownSegmentKey","selfSegments","segmentCrossesOtherEdge","oPts","beforePrev","endpointIds","labelId","lw","lh","bestMidX","bestMidY","bestLen","isHoriz","isVert","EPS_LOCAL","MIN_SHARED","segmentsFor","orthogonallyAligned","separateSharedRenderedTerminalLanes","rectIntersect","terminalLaneFor","nodeId","boundary","railEnd","projectedOverlapLength","sameTerminalFace","exactTerminalLaneConflict","nearTerminalLaneConflict","shared","faceSpan","shiftedCandidate","shift","shiftedBoundary","shiftedRailEnd","railEndIsAdjacent2","rest","railEndIsAdjacent","before","previous","laneIsStraightCollinearConnector","startId","endId","startX","startY","endX","endY","shifts","iteration","lanes","fixed","first","second","fixingNearConflict","candidates","aPreservesStraight","bPreservesStraight","nextLane","collapseRedundantRectangularDoglegs","candidateIsSafe","sourceId","targetId","candidateSegments","segment","otherPoints","candidateSegment","otherSegment","withoutDogleg","p4","terminalVerticalDogleg","terminalHorizontalDogleg","p5","verticalDogleg","horizontalDogleg","liftObstacleHuggingSameSideRails","visibleEdges","pointsFor","replacementEdge","replacement","strictCrossingCount","firstSegments","secondSegments","firstSegment","secondSegment","middleRail","middle","blockingRectsFor","rail","candidateByMovingRail","coord","simplified","currentCrossings","blockers","liftTopLaneTitleBandsAboveRails","validTitleRect","topLaneTitleFor","rawDirection","titleWidth","horizontalSegmentIntersectsTitle","topDelta","shiftLeftLaneTitleBandsLeftOfRails","leftLaneTitleFor","verticalSegmentIntersectsTitle","leftDelta","segmentLeft","swapDestinationTerminalTailsToReduceCrossings","replacementPointsFor","replacements","crossingCount","totalBends","sum","terminalTailFor","tailStart","terminal","candidateWithDestinationTail","tail","firstTurn","connector","pathHasNodeHit","pathHasSharedTrack","edgesByDestination","currentBends","bestReplacements","bestCrossings","bestBends","destinationEdges","firstTail","secondTail","firstCandidate","secondCandidate","candidateCrossings","candidateBends","reassignCrossingExternalRailChannels","endpointRectsFor","srcNode","dstNode","externalRailForSegment","endpointRects","leftBound","rightBound","topBound","bottomBound","collectExternalRails","rails","railsInteract","connectedComponents","seen","queue","component","uniqueCoordsFor","coordinateAssignmentsFor","assignments","used","visit","assignment","replacementsForAssignment","draftByEdge","firstChanged","bestDisplacement","candidateDisplacement","shortcutRedundantOrthogonalJogs","pathLength","segmentRunsAlongRectBorder","shortcutCandidatesAt","isVHV","corners","rawCandidates","key","bestEdge","bestPath","bestLength","currentPoints","currentLength","candidateLength","resolveRenderedOrthogonalCrossings","realNodes","sides","outsideTracks","edgeIndex","outwardTracksForSide","outward","tracks","channel","crossingCountBetweenSegments","crossingCountBetweenPaths","crossingSnapshot","pairs","edgeSet","edgeOrder","addEdge","firstPoints","pairCount","crossingCountWithReplacements","currentAffected","pair","replacementAffected","crossingComponents","snapshot","neighbors","firstNeighbors","secondNeighbors","components","endpointIdsFor","pairSearchGroups","componentSet","componentEndpointIds","crossingCountWithSingleReplacement","currentCrossingsByEdge","totalLength","pathHasSegmentConflict","pathSegments","pathHitsNode","pushOrthogonalCandidate","sideIsHorizontal","localTrackForSameSide","addSameSideCandidates","trackSeeds","seed","addHorizontalToVerticalCandidates","xTrack","yTrack","addVerticalToHorizontalCandidates","addHorizontalPairCandidates","yTracks","srcTrack","dstTrack","addVerticalPairCandidates","xTracks","dedupeCandidatePaths","buildCandidatesForSides","base","srcHorizontal","dstHorizontal","addVerticalDepartureOuterTrackCandidates","departure","externalXTracks","externalYTracks","targetYTracks","targetTrack","addHorizontalDepartureOuterTrackCandidates","targetXTracks","terminalPreservingOuterTrackCandidates","candidatePathsFor","srcPort","currentSegmentsByEdge","sharedTrackConflictsFor","baseSegments","conflicts","otherSegments","pairCandidatesFor","crossingCountByEdge","pairCrossingCount","firstEdge","secondEdge","conflictsOnlyWith","conflict","candidatesShareTrack","pairCandidatesAreCompatible","scorePairReplacement","pairScoreIsBetter","best","bestScoreForOptionPair","pairBest","score","bestPairedReplacement","baseBendsByEdge","baseLengthByEdge","optionsByEdge","scoringContext","crossingEdgeSet","options","option","currentEdgeBends","candidateHitsNode","candidateHasSegmentConflict","pairedReplacement","EPS4","MIN_SHARED2","simplifyDetouredEdges","ANCHOR","buildOrthogonalPathCandidates","pathConflictCount","currentEdge","includeIncidentEdges","currentStart","currentEnd","otherStart","otherEnd","otherPts","pathSegment","BEND_THRESHOLD","nearestSideOfRect","pt","dTop","dBottom","dLeft","dRight","bestDist","faceClaims","addFaceClaim","edgeId","claims","eId","faceIsClaimed","ignoreEdgeId","currentCrossingConflicts","currentNonIncidentConflicts","bestCrossingConflicts","dstPort","pathBends","pathCrossingConflicts","refreshSrc","refreshDst","EPS5","MARKER_CLEARANCE_LENGTH","MARKER_CLEARANCE_HALF_WIDTH","markerClearanceRectFor","terminalIndex","tip","x2","y2","normalizeRect","labelOverlapsOwnMarker","visiblePts","startMarker","endMarker","marker","anchorLabelsToPolyline","allEdgeSegments","foreignNodeRects","laneGroups","isGroup","rect2","LABEL_PLACEMENT_BUFFER","LABEL_LANE_MARGIN","LABEL_ENDPOINT_CLEARANCE","labelOverlapsForeignNode","buffered","nr","labelOverlapsForeignEdge","s","labelOverlapsAnything","placedLabelRects","findContainingLane","laneRect","overlapsPlacedLabel","placed","middleSegments","poolBase","labelLongAxis","rankSegments","pool","aLongAxis","bLongAxis","aFits","bFits","firstVisibleSegment","lastVisibleSegment","ALONG_SEGMENT_TS","anchorAtT","t","clamp","pointInsideRectInclusive","placementForAnchor","centeredRect","centeredLane","containingLane","clampedAnchor","clampedRect","distanceAlongSegment","labelClearsTerminalEndpoints","requiredDistance","tryPool","rankedPool","placement","findLaneContainingFallback","requireEndpointClearance","allowForeignEdgeOverlap","chosen","chosenRect","priorIdx","EPS6","MIN_PORT_SPACING2","PORT_SHIFT2","LABEL_CLEARANCE_BUFFER","pairKey","straightenCollinearSiblingDetours","labelDimById","labelClearanceFor","thisEdge","thisSrcId","thisDstId","targetPair","maxHalf","consider","dim","oSrc","oDst","targetSrc","targetDst","dstBelow","dstEast","labelShift","effectiveShift","deltas","shiftedSrc","shiftedDst","nudgeSharedInteriorSubpaths","segmentsFor2","allSegments","hasCrowdedParallelTrack","ownLabelIds","nodeCenter","sourceDetourContextFor","sourceRect","targetRect","verticalSourceDetour","sourceCenter","targetCenter","targetBelow","sourcePortY","stubY","railX","horizontalSourceDetour","targetRight","sourcePortX","stubX","railY","sourceDetourCandidate","direct","detoured","segmentsIntersect","d1x","d1y","d2x","d2y","cross","eps","validateSwimlanesLayout","issues","nodeRects","edgeSegments","edgeStart","edgeEnd","ownLabelId","crossingPairs","pairKey2","overlaps","issue","postProcessSwimlaneLayout","finalizeRenderedEdges","normalizeGraph","incoming","v","buildSuccessorMap","succs","buildSortedSuccessorMap","successors","buildInDegreeMap","indeg","sortedZeroInDegreeNodes","degree","buildPredecessorSuccessorMaps","includeEdge","preds","buildLayersFromRanks","order","rankOf","maxRank","layers","topoSortIfAcyclic","adj","buildLayerIndex","m","countInversions","values","tmp","left","right","mid","inversions","removeCycles_DFS","gn","arr","color","reversed","dfs","nodesSorted","toReverse","acycEdges","buildTopLaneMap","cache","resolve","createTopLaneResolver","topLaneMap","buildTopLaneOrder","resolveTopLaneOrder","preferredOrder","sourceOrder","sourceLaneIds","resolved","PRECISION","LAYERING","COORDINATES","buildDrivingTree","laneOf","rankHint","topoOrder","topoIndex","idx","chooseParent","rootSet","roots","ta","tb","adjacency","buildAdjacency","adjacencyList","set","componentOf","assignComponents","blocks","computeBlocks","nodeBlocks","block","preorder","postorder","walk","root","ctx","laneNode","laneA","laneB","sameLaneA","sameLaneB","rankA","rankB","idxA","idxB","componentId","stack","discovery","low","edgeStack","time","popBlock","computeSubtreeCrossCounts","tree","indexOf","parentIdx","currentIdx","childList","childIdx","maxLog","up","lcaIndex","aIdx","bIdx","diff","upA","upB","ownCounts","ru","rv","upperIdx","lowerIdx","lca","crossCounts","mergeInto","target","source","visited","accumulator","childMap","parentLayer","map","childLayer","annotateMinimumLayers","minLayer","annotate","minL","compareByRankThenId","childMin","ra","rb","emitNodesInTreeOrder","orderChildren","emitted","emit","deduplicateLayers","createChildOrderer","future","present","crossMap","ca","cb","ma","mb","item","buildMultitreeLayerOrder","rootsSorted","countCrossingsBetweenAdjacent","upper","lower","upperSet","lowerSet","li","vs","totalCrossings","expanded","rUpper","rLower","L","optimizeRanksByCrossings","initialRank","maxPasses","pass","nodesByRank","lb","old","trialLayers","adjustCrossLaneSources","topLaneOf","laneV","outEdges","hasSameLaneSucc","crossLaneCount","laneDst","crossLaneIncoming","hasSameLanePred","laneSrc","newRank","assignLayers_LongestPath","gAcyclic","compact","incAll","inc","laneU","mx","assignLayers_Gravity","revOrder","clampFeasible","desired","ub","iters","relaxOrder","nodeOrder","ps","ss","predAvg","succAvg","it","forwardChanged","backwardChanged","topoSortByGenerationIfAcyclic","frontier","nextFrontier","assignLayers_LaneAwareCompact","nextFree","edgeWeight","nf","makeProperLayering","layering","l","dummy","dummySeq","addDummyAt","dn","edgesSorted","rU","rV","lastIndex","graphWithDummies","median","barycenter","acc","neighborPositionsFor","targetNodes","fixedIndex","neighborPositions","currentOrderTieBreak","currentLayerIndex","ia","ib","countCrossingsBetweenAdjacent2","upperIndex","lowerIndex","sortByHeuristic","sa","sb","reorderLayer","fixedLayer","targetLayer","laneOrder","currIndex","byLane","nodesInLane","sorted","nullNodes","nid","bc","bestIdx","rid","rBc","transposeImprove","layerSet","nextSet","edgesIn","edgesOut","crossingScore","improved","bestScore","nextScore","orderLayers","gWithDummies","assignCoordinates","laneGap","isHorizontal","getNode","getWidth","getHeight","laneOrderGlobal","layerHeights","extraLayerGaps","thisLayerMaxWidth","nextLayerMaxWidth","thisLayerMaxHeight","nextLayerMaxHeight","normalSpacing","requiredSpacing","extraNeeded","lanesUsedSet","hasNullLane","lanesUsed","laneOrderColumns","perLane","nullIds","ids","total","totalNull","widths","cursor","yOffset","layerH","extraGap","byRef","chainEdges","ref","involved","vid","AUTOMATIC_LANE_ORDERING_RESTARTS","hashString","hash","mulberry32","state","deterministicShuffle","shuffled","random","sourceDistance","sourceIndex","distance","laneArrangementCost","weights","position","cost","weight","ai","bi","buildWeightedLaneEdges","existing","greedySwitch","startOrder","sweeps","maxSweeps","nextCost","isBetterCandidate","seedForRestart","restartIndex","weightSignature","optimizeTopLaneOrder","restarts","sugiyamaLayout","ignoreCrossLaneEdges","optimizeRanksByCrossings2","g0","cycleRes","properLayering","coordinates","EPS7","NODE_PADDING","HORIZONTAL_PIPE_MARGIN","VERTICAL_PIPE_MARGIN","ROUTING_MARGIN","ANCHOR_OFFSET","TRACK_SPACING","chooseOrthogonalSide","fallback","absDx","absDy","sharedLineEndpointCoord","line","nextLine","pointOnLine","along","routeEdgesOrthogonal","originalEdges","oe","laneByNodeId","pipes","isLR","assignLane","obstacles","padding","getOrAddPipe","orientation","spanMin","spanMax","pipe","portForSide","getOrthogonalPort","isSource","allRoutedSegments","edgeSegmentIndices","straightIntraLaneEdges","CROSSING_PENALTY","crossingPenalty","edgeIdx","isVertical","penalties","routingOrder","srcLane","dstLane","crossLane","aDist","bDist","isSegmentBlocked","excludeStart","excludeEnd","obs","portGroups","incidentEdgeTotals","determineSide","sideInfoByIdx","preferenceStrength","secondarySide","sourceSideGroups","sideLoad","loadKey","secondary","primaryLoad","secondaryLoad","isDiamondNode","shape","inSidesByNode","inSides","srcKey","dstCoord","dstKey","srcCoord","portOffsets","MIN_PORT_SPACING3","role","sideLength","effectiveLength","spacing","startOffset","offset","offsetKey","edgeHasLabelNode","faceHasLabelNode","applyPortOffset","basePort","portsForEdge","sideInfo","srcTarget","dstTarget","pSrcPort","pDstPort","srcOffset","dstOffset","srcPortSide","dstPortSide","pSrcAnchor","pDstAnchor","srcPortIsVertical","dstPortIsVertical","isBottom","isRight","isPointInObstacle","excludeNodeIds","obstacleDetour","port","opposite","portIsVertical","leavesPositiveSide2","leavesPositiveSide","goDown","srcHandleWaypoints","srcCheck","detour","gapY","gapX","dstHandleWaypoints","dstCheck","hpMargin","anchorsSameX","anchorsSameY","hasPortOffset","srcFaceTotal","dstFaceTotal","faceContested","srcIncidentTotal","dstIncidentTotal","contestedFaceHasLabel","srcContestAllowsCenteredStraight","dstContestAllowsCenteredStraight","fastPathOrientation","fastPathCoord","fastPathFrom","fastPathTo","fastPathPipe","srcPipe","dstPipe","bbMinX","bbMaxX","bbMinY","bbMaxY","pathMinX","pathMaxX","pathMinY","pathMaxY","hMargin","vMargin","hPipes","vPipes","getKey","startKey","endKey","gScore","cameFrom","arrivalDir","openSet","openList","foundPath","checkSegmentBlocked","cornerHV","seg1HV_blocked","seg2HV_blocked","pathHV_blocked","cornerVH","seg1VH_blocked","seg2VH_blocked","currKey","currPt","sortedVPipes","vIdx","hPipesSorted","hIdx","neighbor","nKey","dist","penalty","dirPenalty","destDx","destDy","moveDx","moveDy","bendPenalty","currentDir","moveDir","stepCost","tentativeG","wentRight","wentLeft","pathX","detourObstacles","visualMaxX","obsCenterX","visualRight","visualMinX","visualLeft","findBestReturnY","detourX","goingDown","relevantObs","obsInXRange","obsInYRange","filteredObs","obsAtDetourX","bestY","trySimplifyWithDetourX","corner1","corner2","corner3","seg1Blocked","seg2Blocked","seg3Blocked","seg4Blocked","simplified2","fullPoints","C","B","A","signAB","signAC","dir1","dir2","rSeg","segmentsOverlap","s1","s2","trySwapSegmentsAcrossTracks","t1","t2","canS1GoT2","canS2GoT1","createNewTrack","moveSegmentToTrack","trackIdx","oldTrack","moveSegmentChainToTrack","indices","getAdjacentSegmentsAlongEdge","idxInList","haveAnyCrossing","findAvailableTrack","segmentsConflict","adj1","adj2","resolveTrackConflict","move","avail","resolveHandleConflicts","handles","h1","h2","destInfoCache","getDestInfo","info2","dest","candidateA","candidateB","deviation","fixSourceHandleCrossings","edgesBySource","getEdgeDistance","grp","infoA","infoB","distA","distB","lenA","lenB","distA2","distB2","ei","fixTargetHandleCrossings","edgesByTarget","getDist","scoreA","scoreB","fixPipeCrossings","pipeSegments","ix","iterations","MAX_ITER","segmentCoords","currentCluster","clusterEnd","cluster","usedTracks","trackScores","leftTracks","rightTracks","neutralTracks","assignCoord","trackIndex","effectiveCoord","leftCount","bestTrack","leftIdx","rightIdx","neutralAssigned","dir","magnitude","rightCount","newPoints","lines","prevAlong","prevTrackCoord","hasNextLine","junction","endAlong","filtered","re","orig","nodeBoundaryClamp","minD","getSwimlaneDirection","runSwimlaneLayoutCore","automaticLaneOrdering","render","svg","markers_default","clear3","clear2","clear","clear4","transformedData"],"ignoreList":[0],"sources":["../../../node_modules/mermaid/dist/chunks/mermaid.core/swimlanes-SLNWSIFB.mjs"],"sourcesContent":["import {\n clear as clear4\n} from \"./chunk-RYQCIY6F.mjs\";\nimport {\n clear as clear2,\n edgeLabels,\n insertEdge,\n insertEdgeLabel,\n markers_default,\n terminalLabels\n} from \"./chunk-7Z6QIM7H.mjs\";\nimport {\n clear,\n clear2 as clear3,\n insertCluster,\n insertNode,\n positionNode\n} from \"./chunk-QR6OTTB3.mjs\";\nimport \"./chunk-W5SLKNZC.mjs\";\nimport {\n markerOffsets\n} from \"./chunk-7BUUIJ7U.mjs\";\nimport {\n getSubGraphTitleMargins\n} from \"./chunk-UBXNYLIW.mjs\";\nimport \"./chunk-WRU74C26.mjs\";\nimport \"./chunk-4I5QYGJK.mjs\";\nimport {\n utils_default\n} from \"./chunk-NSK5VX7P.mjs\";\nimport {\n getConfig,\n getConfig2\n} from \"./chunk-I66GZJ75.mjs\";\nimport {\n log\n} from \"./chunk-X3CZISLH.mjs\";\nimport {\n __name\n} from \"./chunk-Y2CYZVJY.mjs\";\n\n// src/rendering-util/createGraph.ts\nimport * as graphlib from \"dagre-d3-es/src/graphlib/index.js\";\nasync function createGraphWithElements(element, data4Layout) {\n const graph = new graphlib.Graph({\n multigraph: true,\n compound: true\n });\n const edgesToProcess = [...data4Layout.edges];\n const config = getConfig2();\n const rootGroups = element.insert(\"g\").attr(\"class\", \"root\");\n const clusters = rootGroups.insert(\"g\").attr(\"class\", \"clusters\");\n const edgePaths = rootGroups.insert(\"g\").attr(\"class\", \"edges edgePath\");\n const edgeLabels2 = rootGroups.insert(\"g\").attr(\"class\", \"edgeLabels\");\n const nodesGroup = rootGroups.insert(\"g\").attr(\"class\", \"nodes\");\n const nodeElements = /* @__PURE__ */ new Map();\n const hasDom = element.node() != null;\n await Promise.all(\n data4Layout.nodes.map(async (node) => {\n if (node.isGroup) {\n graph.setNode(node.id, { ...node });\n } else {\n if (hasDom) {\n const childNodeEl = await insertNode(nodesGroup, node, { config, dir: node.dir });\n const boundingBox = childNodeEl.node()?.getBBox() ?? { width: 0, height: 0 };\n nodeElements.set(node.id, childNodeEl);\n node.width = boundingBox.width;\n node.height = boundingBox.height;\n }\n graph.setNode(node.id, { ...node });\n }\n })\n );\n for (const edge of edgesToProcess) {\n graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);\n const edgeExists = data4Layout.edges.some((existingEdge) => existingEdge.id === edge.id);\n if (!edgeExists) {\n data4Layout.edges.push(edge);\n }\n }\n if (globalThis.mermaidCaptureSizes) {\n const { captureNodeSizes } = await import(\"./sizeCapture-X5ZJPWSS.mjs\");\n captureNodeSizes(element, data4Layout);\n }\n return {\n graph,\n groups: { clusters, edgePaths, edgeLabels: edgeLabels2, nodes: nodesGroup, rootGroups },\n nodeElements\n };\n}\n__name(createGraphWithElements, \"createGraphWithElements\");\n\n// src/rendering-util/rendering-elements/lineJump.ts\nvar ROUNDED_CORNER_RADIUS = 5;\nvar CORNER_EPSILON = 1e-5;\nvar ENDPOINT_EPSILON = 1e-6;\nfunction buildSegmentList(points) {\n const segments = [];\n for (let i = 0; i < points.length - 1; i++) {\n segments.push({ a: points[i], b: points[i + 1] });\n }\n return segments;\n}\n__name(buildSegmentList, \"buildSegmentList\");\nfunction segmentIntersection(a1, a2, b1, b2) {\n const dxA = a2.x - a1.x;\n const dyA = a2.y - a1.y;\n const dxB = b2.x - b1.x;\n const dyB = b2.y - b1.y;\n const denom = dxA * dyB - dyA * dxB;\n if (denom === 0) {\n return null;\n }\n const dx = b1.x - a1.x;\n const dy = b1.y - a1.y;\n const tA = (dx * dyB - dy * dxB) / denom;\n const tB = (dx * dyA - dy * dxA) / denom;\n if (tA <= ENDPOINT_EPSILON || tA >= 1 - ENDPOINT_EPSILON || tB <= ENDPOINT_EPSILON || tB >= 1 - ENDPOINT_EPSILON) {\n return null;\n }\n return {\n point: { x: a1.x + tA * dxA, y: a1.y + tA * dyA },\n tA,\n tB\n };\n}\n__name(segmentIntersection, \"segmentIntersection\");\nfunction isHorizontalSeg(seg) {\n return Math.abs(seg.b.x - seg.a.x) >= Math.abs(seg.b.y - seg.a.y);\n}\n__name(isHorizontalSeg, \"isHorizontalSeg\");\nfunction findEdgeIntersections(edges) {\n const crossings = [];\n for (let i = 0; i < edges.length; i++) {\n const edgeA = edges[i];\n const segmentsA = buildSegmentList(edgeA.points);\n for (let j = i + 1; j < edges.length; j++) {\n const edgeB = edges[j];\n const segmentsB = buildSegmentList(edgeB.points);\n for (const [si, segA] of segmentsA.entries()) {\n for (const [sj, segB] of segmentsB.entries()) {\n const hit = segmentIntersection(segA.a, segA.b, segB.a, segB.b);\n if (!hit) {\n continue;\n }\n const aHoriz = isHorizontalSeg(segA);\n const bHoriz = isHorizontalSeg(segB);\n const orthogonalPair = aHoriz !== bHoriz;\n const jumpOnA = orthogonalPair ? aHoriz : false;\n if (jumpOnA) {\n crossings.push({\n jumpEdgeId: edgeA.id,\n otherEdgeId: edgeB.id,\n segIndex: si,\n t: hit.tA,\n point: hit.point\n });\n } else {\n crossings.push({\n jumpEdgeId: edgeB.id,\n otherEdgeId: edgeA.id,\n segIndex: sj,\n t: hit.tB,\n point: hit.point\n });\n }\n }\n }\n }\n }\n return crossings;\n}\n__name(findEdgeIntersections, \"findEdgeIntersections\");\nfunction fmt(n) {\n const rounded = Math.round(n * 1e3) / 1e3;\n return Number.isInteger(rounded) ? `${rounded}` : `${rounded}`;\n}\n__name(fmt, \"fmt\");\nfunction pointToString(p) {\n return `${fmt(p.x)},${fmt(p.y)}`;\n}\n__name(pointToString, \"pointToString\");\nfunction getArcSweepFlag(seg) {\n const dx = seg.b.x - seg.a.x;\n const dy = seg.b.y - seg.a.y;\n if (Math.abs(dx) >= Math.abs(dy)) {\n return dx >= 0 ? 1 : 0;\n }\n return dy >= 0 ? 1 : 0;\n}\n__name(getArcSweepFlag, \"getArcSweepFlag\");\nvar MIN_JUMP_RADIUS = 1e-3;\nfunction applyMarkerOffsets(points, edge) {\n if (points.length < 2) {\n return points.map((p) => ({ ...p }));\n }\n const out = points.map((p) => ({ ...p }));\n const startOff = edge.arrowTypeStart && markerOffsets[edge.arrowTypeStart];\n if (startOff) {\n const a = points[0];\n const b = points[1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[0].x = a.x + startOff * Math.cos(ang);\n out[0].y = a.y + startOff * Math.sin(ang);\n }\n const endOff = edge.arrowTypeEnd && markerOffsets[edge.arrowTypeEnd];\n if (endOff) {\n const n = points.length;\n const a = points[n - 2];\n const b = points[n - 1];\n const ang = Math.atan2(b.y - a.y, b.x - a.x);\n out[n - 1].x = b.x - endOff * Math.cos(ang);\n out[n - 1].y = b.y - endOff * Math.sin(ang);\n }\n return out;\n}\n__name(applyMarkerOffsets, \"applyMarkerOffsets\");\nfunction emitJump(jump, ux, uy, sweep, style) {\n const cx = jump.point.x;\n const cy = jump.point.y;\n const pre = { x: cx - ux * jump.r, y: cy - uy * jump.r };\n const post = { x: cx + ux * jump.r, y: cy + uy * jump.r };\n const out = [`L${pointToString(pre)}`];\n if (style === \"arc\") {\n out.push(`A${fmt(jump.r)},${fmt(jump.r)} 0 0 ${sweep} ${pointToString(post)}`);\n } else {\n out.push(`M${pointToString(post)}`);\n }\n return out;\n}\n__name(emitJump, \"emitJump\");\nfunction computeRoundedCorner(prev, curr, next, radius) {\n const dx1 = curr.x - prev.x;\n const dy1 = curr.y - prev.y;\n const dx2 = next.x - curr.x;\n const dy2 = next.y - curr.y;\n const len1 = Math.hypot(dx1, dy1);\n const len2 = Math.hypot(dx2, dy2);\n if (len1 < CORNER_EPSILON || len2 < CORNER_EPSILON) {\n return null;\n }\n const nx1 = dx1 / len1;\n const ny1 = dy1 / len1;\n const nx2 = dx2 / len2;\n const ny2 = dy2 / len2;\n const dot = nx1 * nx2 + ny1 * ny2;\n const clamped = Math.max(-1, Math.min(1, dot));\n const angle = Math.acos(clamped);\n if (angle < CORNER_EPSILON || Math.abs(Math.PI - angle) < CORNER_EPSILON) {\n return null;\n }\n const cutLen = Math.min(radius / Math.sin(angle / 2), len1 / 2, len2 / 2);\n return {\n startX: curr.x - nx1 * cutLen,\n startY: curr.y - ny1 * cutLen,\n endX: curr.x + nx2 * cutLen,\n endY: curr.y + ny2 * cutLen,\n ctrlX: curr.x,\n ctrlY: curr.y,\n cutLen\n };\n}\n__name(computeRoundedCorner, \"computeRoundedCorner\");\nfunction rewriteEdgePath(edge, jumps, config) {\n const rawPoints = edge.points;\n if (rawPoints.length < 2) {\n return \"\";\n }\n const points = applyMarkerOffsets(rawPoints, edge);\n const rounded = edge.curve === \"rounded\";\n const segments = buildSegmentList(points);\n const bySeg = /* @__PURE__ */ new Map();\n for (const j of jumps) {\n const seg = segments[j.segIndex];\n if (!seg) {\n continue;\n }\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const list = bySeg.get(j.segIndex) ?? [];\n list.push({\n t: j.t,\n point: j.point,\n d: j.t * segLen,\n r: config.jumpRadius\n });\n bySeg.set(j.segIndex, list);\n }\n const parts = [`M${pointToString(points[0])}`];\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const segLen = Math.hypot(seg.b.x - seg.a.x, seg.b.y - seg.a.y);\n const ux = segLen === 0 ? 0 : (seg.b.x - seg.a.x) / segLen;\n const uy = segLen === 0 ? 0 : (seg.b.y - seg.a.y) / segLen;\n const sweep = getArcSweepFlag(seg);\n let segStartConsumed = 0;\n if (rounded && i > 0) {\n const corner = computeRoundedCorner(\n points[i - 1],\n points[i],\n points[i + 1] ?? points[i],\n ROUNDED_CORNER_RADIUS\n );\n if (corner) {\n segStartConsumed = corner.cutLen;\n }\n }\n let segEndStop = segLen;\n let upcomingCorner = null;\n if (rounded && i < segments.length - 1) {\n upcomingCorner = computeRoundedCorner(\n points[i],\n points[i + 1],\n points[i + 2] ?? points[i + 1],\n ROUNDED_CORNER_RADIUS\n );\n if (upcomingCorner) {\n segEndStop = segLen - upcomingCorner.cutLen;\n }\n }\n const segJumps = [...bySeg.get(i) ?? []].sort((a, b) => a.t - b.t);\n for (const j of segJumps) {\n j.r = Math.min(j.r, j.d - segStartConsumed, segEndStop - j.d);\n }\n for (let k = 0; k < segJumps.length - 1; k++) {\n const gap = segJumps[k + 1].d - segJumps[k].d;\n if (segJumps[k].r + segJumps[k + 1].r > gap) {\n const half = gap / 2;\n segJumps[k].r = Math.min(segJumps[k].r, half);\n segJumps[k + 1].r = Math.min(segJumps[k + 1].r, half);\n }\n }\n for (const j of segJumps) {\n if (j.r < MIN_JUMP_RADIUS) {\n continue;\n }\n parts.push(...emitJump(j, ux, uy, sweep, config.jumpStyle));\n }\n if (rounded && upcomingCorner) {\n parts.push(`L${fmt(upcomingCorner.startX)},${fmt(upcomingCorner.startY)}`);\n parts.push(\n `Q${fmt(upcomingCorner.ctrlX)},${fmt(upcomingCorner.ctrlY)} ${fmt(upcomingCorner.endX)},${fmt(upcomingCorner.endY)}`\n );\n } else {\n parts.push(`L${pointToString(seg.b)}`);\n }\n }\n return parts.join(\" \");\n}\n__name(rewriteEdgePath, \"rewriteEdgePath\");\nfunction isStraightPath(d) {\n return /^[\\d\\s+,.LMelm-]*$/.test(d);\n}\n__name(isStraightPath, \"isStraightPath\");\nfunction curveSupportsLineHops(curve) {\n if (!curve) {\n return true;\n }\n return curve === \"linear\" || curve === \"rounded\" || curve === \"step\" || curve === \"stepBefore\" || curve === \"stepAfter\";\n}\n__name(curveSupportsLineHops, \"curveSupportsLineHops\");\nfunction decodeDataPoints(raw) {\n if (!raw) {\n return null;\n }\n try {\n const json = typeof atob === \"function\" ? atob(raw) : Buffer.from(raw, \"base64\").toString();\n const parsed = JSON.parse(json);\n if (!Array.isArray(parsed)) {\n return null;\n }\n const pts = [];\n for (const p of parsed) {\n if (p && typeof p.x === \"number\" && typeof p.y === \"number\") {\n pts.push({ x: p.x, y: p.y });\n }\n }\n return pts.length >= 2 ? pts : null;\n } catch {\n return null;\n }\n}\n__name(decodeDataPoints, \"decodeDataPoints\");\nfunction applyLineJumpsToSvg(edgePathsGroup, edges, config) {\n if (!config.enabled) {\n return;\n }\n const groupNode = edgePathsGroup.node();\n if (!groupNode) {\n return;\n }\n const edgeMeta = /* @__PURE__ */ new Map();\n for (const e of edges) {\n edgeMeta.set(e.id, e);\n }\n const renderedEdges = [];\n const pathById = /* @__PURE__ */ new Map();\n for (const e of edges) {\n const escapedId = typeof CSS !== \"undefined\" && CSS.escape ? CSS.escape(e.id) : e.id;\n const pathEl = groupNode.querySelector(`path[data-id=\"${escapedId}\"]`);\n if (!pathEl) {\n continue;\n }\n pathById.set(e.id, pathEl);\n const decoded = decodeDataPoints(pathEl.getAttribute(\"data-points\"));\n const points = decoded ?? e.points;\n renderedEdges.push({ ...e, points });\n }\n const crossings = findEdgeIntersections(renderedEdges);\n if (crossings.length === 0) {\n return;\n }\n const jumpsByEdge = /* @__PURE__ */ new Map();\n for (const c of crossings) {\n const list = jumpsByEdge.get(c.jumpEdgeId) ?? [];\n list.push(c);\n jumpsByEdge.set(c.jumpEdgeId, list);\n }\n for (const renderedEdge of renderedEdges) {\n const jumps = jumpsByEdge.get(renderedEdge.id);\n if (!jumps || jumps.length === 0) {\n continue;\n }\n const meta = edgeMeta.get(renderedEdge.id);\n const curveHint = meta?.curve;\n if (curveHint !== void 0 && !curveSupportsLineHops(curveHint)) {\n continue;\n }\n const pathEl = pathById.get(renderedEdge.id);\n if (!pathEl) {\n continue;\n }\n if (curveHint === void 0) {\n const currentD = pathEl.getAttribute(\"d\") ?? \"\";\n if (!isStraightPath(currentD)) {\n continue;\n }\n }\n const originalStyle = pathEl.getAttribute(\"style\") ?? \"\";\n const dasharrayMatch = /stroke-dasharray\\s*:\\s*0\\s+([\\d.]+)\\s+[\\d.]+\\s+([\\d.]+)/.exec(\n originalStyle\n );\n const preservedOValueS = dasharrayMatch ? Number.parseFloat(dasharrayMatch[1]) : null;\n const preservedOValueE = dasharrayMatch ? Number.parseFloat(dasharrayMatch[2]) : null;\n const newD = rewriteEdgePath(renderedEdge, jumps, config);\n pathEl.setAttribute(\"d\", newD);\n if (preservedOValueS !== null && preservedOValueE !== null && typeof pathEl.getTotalLength === \"function\") {\n const newLen = pathEl.getTotalLength();\n const onLen = Math.max(0, newLen - preservedOValueS - preservedOValueE);\n const newDasharray = `0 ${preservedOValueS} ${onLen} ${preservedOValueE}`;\n const cleaned = originalStyle.replace(/stroke-dasharray\\s*:[^;]*;?/g, `stroke-dasharray: ${newDasharray};`).replace(/;\\s*;+/g, \";\");\n pathEl.setAttribute(\"style\", cleaned);\n }\n }\n}\n__name(applyLineJumpsToSvg, \"applyLineJumpsToSvg\");\n\n// src/rendering-util/layout-algorithms/swimlanes/adjustLayout.ts\nasync function adjustLayout(data4Layout, groups) {\n for (const node of data4Layout.nodes) {\n if (node.isGroup) {\n await insertCluster(groups.clusters, node);\n } else {\n positionNode(node);\n }\n }\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data4Layout.nodes) {\n if (node?.id) {\n nodeById.set(node.id, node);\n }\n }\n for (const edge of data4Layout.edges) {\n const startNode = edge.start ? nodeById.get(edge.start) ?? {} : {};\n const endNode = edge.end ? nodeById.get(edge.end) ?? {} : {};\n const paths = insertEdge(\n groups.edgePaths,\n { ...edge },\n {},\n data4Layout.type,\n startNode,\n endNode,\n data4Layout.diagramId\n );\n if (edge.label) {\n await insertEdgeLabel(groups.rootGroups, edge);\n }\n if (edge.label) {\n positionEdgeLabel(edge, paths);\n }\n }\n const lineHopsConfig = data4Layout.config?.swimlane?.lineHops;\n if (lineHopsConfig !== false) {\n const jumpStyle = lineHopsConfig === \"gap\" ? \"gap\" : \"arc\";\n const edgeGeometries = data4Layout.edges.filter((e) => Array.isArray(e.points) && e.points.length >= 2).map((e) => ({\n id: e.id,\n points: e.points,\n curve: e.curve,\n arrowTypeStart: e.arrowTypeStart,\n arrowTypeEnd: e.arrowTypeEnd\n }));\n applyLineJumpsToSvg(groups.edgePaths, edgeGeometries, {\n enabled: true,\n jumpRadius: 6,\n jumpStyle\n });\n }\n}\n__name(adjustLayout, \"adjustLayout\");\nfunction positionEdgeLabel(edge, paths) {\n const path = paths?.updatedPath ?? paths?.originalPath;\n const siteConfig = getConfig();\n const { subGraphTitleTotalMargin } = getSubGraphTitleMargins({\n flowchart: siteConfig.flowchart ?? {}\n });\n if (edge.label) {\n const el = edgeLabels.get(edge.id);\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcLabelPosition(path);\n log.debug(\n \"Moving label \" + edge.label + \" from (\",\n x,\n \",\",\n y,\n \") to (\",\n pos.x,\n \",\",\n pos.y,\n \") abc88\"\n );\n if (paths) {\n x = pos.x;\n y = pos.y;\n }\n }\n el.attr(\"transform\", `translate(${x}, ${y + subGraphTitleTotalMargin / 2})`);\n }\n if (edge?.startLabelLeft) {\n const el = terminalLabels.get(edge.id).startLeft;\n let x = edge?.x;\n let y = edge?.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeStart ? 10 : 0, \"start_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.startLabelRight) {\n const el = terminalLabels.get(edge.id).startRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(\n edge.arrowTypeStart ? 10 : 0,\n \"start_right\",\n path\n );\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelLeft) {\n const el = terminalLabels.get(edge.id).endLeft;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_left\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n if (edge.endLabelRight) {\n const el = terminalLabels.get(edge.id).endRight;\n let x = edge.x;\n let y = edge.y;\n if (path) {\n const pos = utils_default.calcTerminalLabelPosition(edge.arrowTypeEnd ? 10 : 0, \"end_right\", path);\n x = pos.x;\n y = pos.y;\n }\n el.attr(\"transform\", `translate(${x}, ${y})`);\n }\n}\n__name(positionEdgeLabel, \"positionEdgeLabel\");\n\n// src/rendering-util/layout-algorithms/swimlanes/helpers.ts\nvar DEFAULT_SWIMLANE_ID = \"__swimlane_default__\";\nvar TOP_LANE_TITLE_BAND_HEIGHT = 21;\nvar MIN_TOP_LANE_HORIZONTAL_PADDING = 20;\nfunction topLaneHorizontalPadding(lane) {\n return Math.max(lane.padding ?? MIN_TOP_LANE_HORIZONTAL_PADDING, MIN_TOP_LANE_HORIZONTAL_PADDING);\n}\n__name(topLaneHorizontalPadding, \"topLaneHorizontalPadding\");\nfunction assignTopLaneTitleRect(lane) {\n const { x, y, width, height } = lane;\n const contentTop = lane.swimlaneContentTop;\n if (typeof x !== \"number\" || typeof y !== \"number\" || typeof width !== \"number\" || typeof height !== \"number\" || typeof contentTop !== \"number\" || !Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(contentTop) || width <= 0 || height <= 0) {\n delete lane.groupTitleRect;\n return;\n }\n const top = y - height / 2;\n const headerBottom = Math.min(contentTop, y + height / 2);\n const titleHeight = Math.min(TOP_LANE_TITLE_BAND_HEIGHT, Math.max(0, headerBottom - top));\n const bottom = top + titleHeight;\n if (bottom <= top) {\n delete lane.groupTitleRect;\n return;\n }\n lane.groupTitleRect = {\n left: x - width / 2,\n right: x + width / 2,\n top,\n bottom\n };\n}\n__name(assignTopLaneTitleRect, \"assignTopLaneTitleRect\");\nfunction prepareLayoutForSwimlanes(layout) {\n const direction = layout.direction;\n const nodes = layout.nodes ??= [];\n for (const node of layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n node.shape = \"swimlane\";\n if (direction) {\n node.direction = direction;\n }\n }\n }\n const looseNodes = nodes.filter((node) => !node.isGroup && !node.parentId);\n if (looseNodes.length === 0) {\n return;\n }\n let defaultLane = nodes.find((node) => node.id === DEFAULT_SWIMLANE_ID);\n if (!defaultLane) {\n defaultLane = {\n id: DEFAULT_SWIMLANE_ID,\n label: \"\",\n isGroup: true,\n shape: \"swimlane\",\n padding: 20,\n ...direction ? { direction } : {}\n };\n nodes.push(defaultLane);\n } else if (defaultLane.isGroup) {\n defaultLane.shape = \"swimlane\";\n if (direction) {\n defaultLane.direction = direction;\n }\n }\n for (const node of looseNodes) {\n node.parentId = DEFAULT_SWIMLANE_ID;\n }\n}\n__name(prepareLayoutForSwimlanes, \"prepareLayoutForSwimlanes\");\nfunction toGraphView(layout) {\n const nodeById = /* @__PURE__ */ new Map();\n for (const n of layout.nodes ?? []) {\n nodeById.set(n.id, n);\n }\n const edges = [];\n for (const e of layout.edges ?? []) {\n const src = typeof e.start === \"string\" ? e.start : void 0;\n const dst = typeof e.end === \"string\" ? e.end : void 0;\n if (!src || !dst) {\n continue;\n }\n if (e.labelNodeId) {\n continue;\n }\n edges.push({ id: e.id, src, dst, ref: e });\n }\n const allNodes = layout.nodes ?? [];\n const groupNodes = allNodes.filter((n) => n.isGroup);\n const nonGroupNodes = allNodes.filter((n) => !n.isGroup);\n const nodesInGroupOrder = [...groupNodes].reverse();\n const nodes = [...nodesInGroupOrder, ...nonGroupNodes].map((n) => n.id);\n return { nodes, edges, layout, nodeById };\n}\n__name(toGraphView, \"toGraphView\");\nfunction writeBackToLayoutData(g, ordered, coords, opts) {\n const { layout } = g;\n const nodeMap = g.nodeById;\n const layerGap = opts?.layerGap ?? 100;\n const nodeGap = opts?.nodeGap ?? 40;\n let layerIndex = 0;\n for (const layer of ordered.layers) {\n let orderIndex = 0;\n for (const id of layer) {\n const node = nodeMap.get(id);\n if (!node) {\n orderIndex++;\n continue;\n }\n node.layer = layerIndex;\n node.order = orderIndex;\n const x = coords.x[id] ?? orderIndex * nodeGap;\n const y = coords.y[id] ?? layerIndex * layerGap;\n node.x = x;\n node.y = y;\n orderIndex++;\n }\n layerIndex++;\n }\n const allNodes = layout.nodes ?? [];\n const groupBounds = /* @__PURE__ */ new Map();\n const topLevelGroups = [];\n for (const group of allNodes) {\n if (!group?.isGroup) {\n continue;\n }\n if (!group.parentId) {\n topLevelGroups.push(group);\n }\n const children = allNodes.filter((n) => n.parentId === group.id);\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x ?? coords.x[child.id];\n const cy = child.y ?? coords.y[child.id];\n const cw = child.width ?? 0;\n const ch = child.height ?? 0;\n if (cx != null && cy != null) {\n minX = Math.min(minX, cx - cw / 2);\n maxX = Math.max(maxX, cx + cw / 2);\n minY = Math.min(minY, cy - ch / 2);\n maxY = Math.max(maxY, cy + ch / 2);\n }\n }\n if (minX === Infinity || minY === Infinity) {\n group.x = group.x ?? 0;\n group.y = group.y ?? 0;\n group.width = group.width ?? 0;\n group.height = group.height ?? 0;\n } else {\n const pad = group.padding ?? 20;\n const horizontalPad = group.parentId ? pad : 2 * topLaneHorizontalPadding(group);\n const verticalPad = pad;\n const w = Math.max(0, maxX - minX) + horizontalPad;\n const h = Math.max(0, maxY - minY) + verticalPad;\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n group.x = cx;\n group.y = cy;\n group.width = w;\n group.height = h;\n groupBounds.set(group.id, { minX, maxX, minY, maxY });\n }\n }\n if (topLevelGroups.length > 0 && groupBounds.size > 0) {\n let globalMinY = Infinity;\n let globalMaxY = -Infinity;\n let maxPad = 0;\n for (const lane of topLevelGroups) {\n const pad = lane.padding ?? 20;\n if (pad > maxPad) {\n maxPad = pad;\n }\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n globalMinY = Math.min(globalMinY, b.minY);\n globalMaxY = Math.max(globalMaxY, b.maxY);\n }\n if (globalMinY !== Infinity && globalMaxY !== -Infinity) {\n const contentHeight = Math.max(0, globalMaxY - globalMinY);\n const minHeaderMargin = 36;\n const verticalMargin = Math.max(maxPad, minHeaderMargin);\n const laneHeight = contentHeight + 2 * verticalMargin;\n const centerY = (globalMinY + globalMaxY) / 2;\n for (const lane of topLevelGroups) {\n lane.y = centerY;\n lane.height = laneHeight;\n lane.swimlaneContentTop = globalMinY;\n }\n const sortedLanes = [...topLevelGroups].sort((a, b) => {\n const ax = a.x ?? 0;\n const bx = b.x ?? 0;\n return ax - bx;\n });\n const laneIds = [];\n const centers = [];\n const baseWidths = [];\n for (const lane of sortedLanes) {\n const b = groupBounds.get(lane.id);\n if (!b) {\n continue;\n }\n const contentWidth = Math.max(0, b.maxX - b.minX) + 2 * topLaneHorizontalPadding(lane);\n const cx = (b.minX + b.maxX) / 2;\n laneIds.push(lane.id);\n centers.push(cx);\n baseWidths.push(contentWidth);\n }\n const count = laneIds.length;\n if (count > 0) {\n const laneWidths = /* @__PURE__ */ new Map();\n if (count === 1) {\n laneWidths.set(laneIds[0], baseWidths[0]);\n } else {\n const d = [];\n for (let i = 0; i < count - 1; i++) {\n d.push(centers[i + 1] - centers[i]);\n }\n const u = new Array(count);\n u[0] = 0;\n for (let i = 0; i < count - 1; i++) {\n u[i + 1] = 2 * d[i] - u[i];\n }\n let lowerBound = 0;\n let upperBound = Number.POSITIVE_INFINITY;\n for (let i = 0; i < count; i++) {\n const baseW = baseWidths[i];\n if (i % 2 === 0) {\n lowerBound = Math.max(lowerBound, baseW - u[i]);\n } else {\n upperBound = Math.min(upperBound, u[i] - baseW);\n }\n }\n let x = lowerBound;\n if (lowerBound <= upperBound) {\n x = (lowerBound + upperBound) / 2;\n } else {\n x = lowerBound;\n }\n for (let i = 0; i < count; i++) {\n const w = u[i] + (i % 2 === 0 ? x : -x);\n const finalWidth = Math.max(baseWidths[i], w);\n laneWidths.set(laneIds[i], finalWidth);\n }\n }\n for (const lane of topLevelGroups) {\n const w = laneWidths.get(lane.id);\n if (w != null) {\n lane.width = w;\n }\n assignTopLaneTitleRect(lane);\n }\n }\n }\n }\n}\n__name(writeBackToLayoutData, \"writeBackToLayoutData\");\n\n// src/rendering-util/layout-algorithms/swimlanes/edgeLabelNodes.ts\nvar EDGE_LABEL_LOG_PREFIX = \"[EdgeLabelNodes]\";\nfunction createEdgeLabelNodes(data) {\n const nodesToAdd = [];\n const layoutOnlyEdges = [];\n const nodeById = /* @__PURE__ */ new Map();\n for (const node of data.nodes) {\n nodeById.set(node.id, node);\n }\n for (const edge of data.edges) {\n if (!edge.label || edge.label.length === 0) {\n continue;\n }\n if (edge.isLayoutOnly) {\n continue;\n }\n if (edge.labelNodeId) {\n continue;\n }\n const sourceNode = edge.start ? nodeById.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeById.get(edge.end) : void 0;\n if (!sourceNode || !targetNode) {\n log.warn(EDGE_LABEL_LOG_PREFIX, `Edge ${edge.id} has missing source or target node`);\n continue;\n }\n const labelNodeId = `edge-label-${edge.start}-${edge.end}-${edge.id}`;\n const isCrossLane = sourceNode.parentId !== targetNode.parentId;\n const labelLane = isCrossLane ? targetNode.parentId : sourceNode.parentId;\n const labelNode = {\n id: labelNodeId,\n label: edge.label,\n edgeStart: edge.start ?? \"\",\n edgeEnd: edge.end ?? \"\",\n shape: \"labelRect\",\n width: 0,\n // populated when rendered / applied from fixture\n height: 0,\n isEdgeLabel: true,\n isDummy: true,\n parentId: labelLane,\n isGroup: false,\n labelStyle: Array.isArray(edge.labelStyle) ? edge.labelStyle[0] : edge.labelStyle ?? \"\",\n ...sourceNode.dir ? { dir: sourceNode.dir } : {}\n };\n nodesToAdd.push(labelNode);\n edge.labelNodeId = labelNodeId;\n edge.label = void 0;\n edge.text = void 0;\n const toLabelVirtual = {\n id: `${edge.id}-to-label`,\n start: edge.start,\n end: labelNodeId,\n type: \"normal\",\n isLayoutOnly: true\n };\n const fromLabelVirtual = {\n id: `${edge.id}-from-label`,\n start: labelNodeId,\n end: edge.end,\n type: \"normal\",\n isLayoutOnly: true\n };\n layoutOnlyEdges.push(toLabelVirtual, fromLabelVirtual);\n }\n const newNodes = [...data.nodes, ...nodesToAdd];\n const newEdges = [...data.edges, ...layoutOnlyEdges];\n return {\n ...data,\n nodes: newNodes,\n edges: newEdges\n };\n}\n__name(createEdgeLabelNodes, \"createEdgeLabelNodes\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/geometry.ts\nvar EPS = 1e-3;\nfunction measuredNodeRect(node) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n return width > 0 && height > 0 ? { cx, cy, rect: rectFromCenterSize(cx, cy, width, height) } : void 0;\n}\n__name(measuredNodeRect, \"measuredNodeRect\");\nfunction nodeBoundsInfoFor(node) {\n if (node.isGroup) {\n return void 0;\n }\n const measured = measuredNodeRect(node);\n if (!measured) {\n return void 0;\n }\n const id = String(node.id ?? \"\");\n return {\n id,\n cx: measured.cx,\n cy: measured.cy,\n rect: measured.rect\n };\n}\n__name(nodeBoundsInfoFor, \"nodeBoundsInfoFor\");\nfunction samePoint(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon && Math.abs(a.y - b.y) < epsilon;\n}\n__name(samePoint, \"samePoint\");\nfunction sameX(a, b, epsilon = EPS) {\n return Math.abs(a.x - b.x) < epsilon;\n}\n__name(sameX, \"sameX\");\nfunction sameY(a, b, epsilon = EPS) {\n return Math.abs(a.y - b.y) < epsilon;\n}\n__name(sameY, \"sameY\");\nfunction isHorizontalSegment(a, b, epsilon = EPS) {\n return sameY(a, b, epsilon) && Math.abs(a.x - b.x) > epsilon;\n}\n__name(isHorizontalSegment, \"isHorizontalSegment\");\nfunction isVerticalSegment(a, b, epsilon = EPS) {\n return sameX(a, b, epsilon) && Math.abs(a.y - b.y) > epsilon;\n}\n__name(isVerticalSegment, \"isVerticalSegment\");\nfunction overlapLength(a1, a2, b1, b2) {\n return Math.max(\n 0,\n Math.min(Math.max(a1, a2), Math.max(b1, b2)) - Math.max(Math.min(a1, a2), Math.min(b1, b2))\n );\n}\n__name(overlapLength, \"overlapLength\");\nfunction sameAxisSegmentOverlapLength(a, b, epsilon = EPS) {\n if (a.horizontal && b.horizontal && sameY(a.a, b.a, epsilon)) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x);\n }\n if (a.vertical && b.vertical && sameX(a.a, b.a, epsilon)) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y);\n }\n return 0;\n}\n__name(sameAxisSegmentOverlapLength, \"sameAxisSegmentOverlapLength\");\nfunction orthogonalSegmentsForPoints(points, epsilon = EPS) {\n const result = [];\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n const horizontal = isHorizontalSegment(a, b, epsilon);\n const vertical = isVerticalSegment(a, b, epsilon);\n if (horizontal || vertical) {\n result.push({ index: i, a, b, horizontal, vertical });\n }\n }\n return result;\n}\n__name(orthogonalSegmentsForPoints, \"orthogonalSegmentsForPoints\");\nfunction countOrthogonalBends(points, epsilon = EPS) {\n const segments = orthogonalSegmentsForPoints(points, epsilon);\n let bends = 0;\n for (let i = 1; i < segments.length; i++) {\n if (segments[i - 1].horizontal !== segments[i].horizontal) {\n bends++;\n }\n }\n return bends;\n}\n__name(countOrthogonalBends, \"countOrthogonalBends\");\nfunction dedupeConsecutivePoints(points, epsilon = EPS) {\n const result = [];\n for (const point of points) {\n const last = result.length > 0 ? result[result.length - 1] : void 0;\n if (!last || !samePoint(last, point, epsilon)) {\n result.push({ x: point.x, y: point.y });\n }\n }\n return result;\n}\n__name(dedupeConsecutivePoints, \"dedupeConsecutivePoints\");\nfunction classifyThreeSegmentRoute(points, epsilon = EPS) {\n if (!points || points.length !== 4) {\n return void 0;\n }\n const [p0, p1, p2, p3] = points;\n const isHVH = isHorizontalSegment(p0, p1, epsilon) && isVerticalSegment(p1, p2, epsilon) && isHorizontalSegment(p2, p3, epsilon);\n if (isHVH) {\n return { kind: \"HVH\", p0, p1, p2, p3 };\n }\n const isVHV = isVerticalSegment(p0, p1, epsilon) && isHorizontalSegment(p1, p2, epsilon) && isVerticalSegment(p2, p3, epsilon);\n return isVHV ? { kind: \"VHV\", p0, p1, p2, p3 } : void 0;\n}\n__name(classifyThreeSegmentRoute, \"classifyThreeSegmentRoute\");\nfunction segmentBoundsOverlapRect(a, b, rect, buffer = 0) {\n const segMinX = Math.min(a.x, b.x);\n const segMaxX = Math.max(a.x, b.x);\n const segMinY = Math.min(a.y, b.y);\n const segMaxY = Math.max(a.y, b.y);\n return segMaxX > rect.left - buffer && segMinX < rect.right + buffer && segMaxY > rect.top - buffer && segMinY < rect.bottom + buffer;\n}\n__name(segmentBoundsOverlapRect, \"segmentBoundsOverlapRect\");\nfunction pointInsideRect(point, rect, buffer = 0) {\n return point.x > rect.left + buffer && point.x < rect.right - buffer && point.y > rect.top + buffer && point.y < rect.bottom - buffer;\n}\n__name(pointInsideRect, \"pointInsideRect\");\nfunction rectContainsRect(outer, inner) {\n return outer.left <= inner.left && outer.right >= inner.right && outer.top <= inner.top && outer.bottom >= inner.bottom;\n}\n__name(rectContainsRect, \"rectContainsRect\");\nfunction rectsOverlap(a, b) {\n return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;\n}\n__name(rectsOverlap, \"rectsOverlap\");\nfunction inflateRect(rect, margin) {\n return {\n left: rect.left - margin,\n right: rect.right + margin,\n top: rect.top - margin,\n bottom: rect.bottom + margin\n };\n}\n__name(inflateRect, \"inflateRect\");\nfunction rectFromCenterSize(cx, cy, width, height) {\n return {\n left: cx - width / 2,\n right: cx + width / 2,\n top: cy - height / 2,\n bottom: cy + height / 2\n };\n}\n__name(rectFromCenterSize, \"rectFromCenterSize\");\nfunction rectOfNodeBounds(node) {\n return measuredNodeRect(node)?.rect;\n}\n__name(rectOfNodeBounds, \"rectOfNodeBounds\");\nfunction portForRectSide(node, side) {\n switch (side) {\n case \"top\":\n return { x: node.cx, y: node.rect.top };\n case \"bottom\":\n return { x: node.cx, y: node.rect.bottom };\n case \"left\":\n return { x: node.rect.left, y: node.cy };\n case \"right\":\n return { x: node.rect.right, y: node.cy };\n }\n}\n__name(portForRectSide, \"portForRectSide\");\nfunction buildOrthogonalPortPath(src, srcSide, dst, dstSide, anchor, epsilon = EPS) {\n const srcH = srcSide === \"left\" || srcSide === \"right\";\n const dstH = dstSide === \"left\" || dstSide === \"right\";\n if (srcH && dstH) {\n const opposingDir = srcSide === \"right\" && dstSide === \"left\" && src.x < dst.x || srcSide === \"left\" && dstSide === \"right\" && src.x > dst.x;\n if (opposingDir) {\n if (sameY(src, dst, epsilon)) {\n return [src, dst];\n }\n const midX = (src.x + dst.x) / 2;\n return [src, { x: midX, y: src.y }, { x: midX, y: dst.y }, dst];\n }\n if (srcSide === dstSide) {\n if (sameY(src, dst, epsilon)) {\n return void 0;\n }\n const intX = srcSide === \"left\" ? Math.min(src.x, dst.x) - anchor : Math.max(src.x, dst.x) + anchor;\n return [src, { x: intX, y: src.y }, { x: intX, y: dst.y }, dst];\n }\n return void 0;\n }\n if (!srcH && !dstH) {\n if (srcSide === dstSide) {\n if (sameX(src, dst, epsilon)) {\n return void 0;\n }\n const intY = srcSide === \"top\" ? Math.min(src.y, dst.y) - anchor : Math.max(src.y, dst.y) + anchor;\n return [src, { x: src.x, y: intY }, { x: dst.x, y: intY }, dst];\n }\n const sameDir = srcSide === \"bottom\" && dstSide === \"top\" && src.y < dst.y || srcSide === \"top\" && dstSide === \"bottom\" && src.y > dst.y;\n if (!sameDir) {\n return void 0;\n }\n if (sameX(src, dst, epsilon)) {\n return [src, dst];\n }\n const midY = (src.y + dst.y) / 2;\n return [src, { x: src.x, y: midY }, { x: dst.x, y: midY }, dst];\n }\n if (srcH && !dstH) {\n const sameDirSrc2 = srcSide === \"right\" && dst.x > src.x || srcSide === \"left\" && dst.x < src.x;\n const sameDirDst2 = dstSide === \"top\" && src.y < dst.y || dstSide === \"bottom\" && src.y > dst.y;\n return sameDirSrc2 && sameDirDst2 ? [src, { x: dst.x, y: src.y }, dst] : void 0;\n }\n const sameDirSrc = srcSide === \"bottom\" && dst.y > src.y || srcSide === \"top\" && dst.y < src.y;\n const sameDirDst = dstSide === \"left\" && src.x < dst.x || dstSide === \"right\" && src.x > dst.x;\n return sameDirSrc && sameDirDst ? [src, { x: src.x, y: dst.y }, dst] : void 0;\n}\n__name(buildOrthogonalPortPath, \"buildOrthogonalPortPath\");\nfunction buildSameSideTrackPath(src, side, dst, track) {\n return side === \"left\" || side === \"right\" ? [src, { x: track, y: src.y }, { x: track, y: dst.y }, dst] : [src, { x: src.x, y: track }, { x: dst.x, y: track }, dst];\n}\n__name(buildSameSideTrackPath, \"buildSameSideTrackPath\");\nfunction collectRealNodeBounds(nodes) {\n const nodeInfoById = /* @__PURE__ */ new Map();\n const realNodeRects = [];\n for (const node of nodes) {\n if (node.isEdgeLabel) {\n continue;\n }\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n nodeInfoById.set(info.id, info);\n realNodeRects.push({ id: info.id, rect: info.rect });\n }\n return { nodeInfoById, realNodeRects };\n}\n__name(collectRealNodeBounds, \"collectRealNodeBounds\");\nfunction collectNodeRectEntries(nodes) {\n const realNodeRects = [];\n const labelNodeRects = [];\n for (const node of nodes) {\n const info = nodeBoundsInfoFor(node);\n if (!info) {\n continue;\n }\n const entry = { id: info.id, rect: info.rect };\n if (node.isEdgeLabel) {\n labelNodeRects.push(entry);\n } else {\n realNodeRects.push(entry);\n }\n }\n return { realNodeRects, labelNodeRects };\n}\n__name(collectNodeRectEntries, \"collectNodeRectEntries\");\nfunction collectLayoutNodeRects(nodes, { includeEdgeLabels = true } = {}) {\n const result = [];\n for (const node of nodes) {\n if (node.isGroup || !includeEdgeLabels && node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const width = node.width ?? 0;\n const height = node.height ?? 0;\n result.push({\n nodeId: node.id,\n ...rectFromCenterSize(cx, cy, width, height)\n });\n }\n return result;\n}\n__name(collectLayoutNodeRects, \"collectLayoutNodeRects\");\nfunction getNodePairGeometry(edge, nodeInfoById, epsilon = EPS) {\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n return void 0;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n return void 0;\n }\n return {\n srcId,\n dstId,\n srcInfo,\n dstInfo,\n collinearX: Math.abs(srcInfo.cx - dstInfo.cx) < epsilon,\n collinearY: Math.abs(srcInfo.cy - dstInfo.cy) < epsilon\n };\n}\n__name(getNodePairGeometry, \"getNodePairGeometry\");\nfunction segmentHitsAnyRect(a, b, rects, excludeIds = [], shrink = 0) {\n for (const entry of rects) {\n if (excludeIds.includes(entry.id)) {\n continue;\n }\n if (segmentBoundsOverlapRect(a, b, entry.rect, -shrink)) {\n return true;\n }\n }\n return false;\n}\n__name(segmentHitsAnyRect, \"segmentHitsAnyRect\");\nfunction orthogonalSegmentsCross(a1, b1, a2, b2, epsilon = EPS, endpointTolerance = 1e-6) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1H && s2H || s1V && s2V) {\n return false;\n }\n if (!(s1H || s1V) || !(s2H || s2V)) {\n return false;\n }\n const horiz = s1H ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = s1V ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const hY = horiz.a.y;\n const hX1 = Math.min(horiz.a.x, horiz.b.x);\n const hX2 = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vY1 = Math.min(vert.a.y, vert.b.y);\n const vY2 = Math.max(vert.a.y, vert.b.y);\n if (vX < hX1 || vX > hX2 || hY < vY1 || hY > vY2) {\n return false;\n }\n const matchesHorizEndpoint = Math.abs(vX - horiz.a.x) < endpointTolerance && Math.abs(hY - horiz.a.y) < endpointTolerance || Math.abs(vX - horiz.b.x) < endpointTolerance && Math.abs(hY - horiz.b.y) < endpointTolerance;\n const matchesVertEndpoint = Math.abs(vX - vert.a.x) < endpointTolerance && Math.abs(hY - vert.a.y) < endpointTolerance || Math.abs(vX - vert.b.x) < endpointTolerance && Math.abs(hY - vert.b.y) < endpointTolerance;\n return !(matchesHorizEndpoint && matchesVertEndpoint);\n}\n__name(orthogonalSegmentsCross, \"orthogonalSegmentsCross\");\nfunction sameAxisSegmentsOverlap(a1, b1, a2, b2, epsilon = EPS) {\n const s1H = sameY(a1, b1, epsilon);\n const s1V = sameX(a1, b1, epsilon);\n const s2H = sameY(a2, b2, epsilon);\n const s2V = sameX(a2, b2, epsilon);\n if (s1V && s2V && sameX(a1, a2, epsilon)) {\n return overlapLength(a1.y, b1.y, a2.y, b2.y) > epsilon;\n }\n if (s1H && s2H && sameY(a1, a2, epsilon)) {\n return overlapLength(a1.x, b1.x, a2.x, b2.x) > epsilon;\n }\n return false;\n}\n__name(sameAxisSegmentsOverlap, \"sameAxisSegmentsOverlap\");\nfunction segmentConflictsWithAnyEdge(a, b, edges, excludeEdge, {\n epsilon = EPS,\n skipDegenerateOther = false\n} = {}) {\n for (const other of edges) {\n if (other === excludeEdge || other.isLayoutOnly) {\n continue;\n }\n const points = other.points;\n if (!points || points.length < 2) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n const oa = points[i];\n const ob = points[i + 1];\n if (skipDegenerateOther && samePoint(oa, ob, epsilon)) {\n continue;\n }\n if (orthogonalSegmentsCross(a, b, oa, ob, epsilon) || sameAxisSegmentsOverlap(a, b, oa, ob, epsilon)) {\n return true;\n }\n }\n }\n return false;\n}\n__name(segmentConflictsWithAnyEdge, \"segmentConflictsWithAnyEdge\");\nfunction orthogonalSegmentsStrictlyCross(a1, b1, a2, b2, epsilon = EPS) {\n const aHoriz = sameY(a1, b1, epsilon);\n const aVert = sameX(a1, b1, epsilon);\n const bHoriz = sameY(a2, b2, epsilon);\n const bVert = sameX(a2, b2, epsilon);\n if (!(aHoriz && bVert || aVert && bHoriz)) {\n return false;\n }\n const horiz = aHoriz ? { a: a1, b: b1 } : { a: a2, b: b2 };\n const vert = aHoriz ? { a: a2, b: b2 } : { a: a1, b: b1 };\n const hY = horiz.a.y;\n const hXmin = Math.min(horiz.a.x, horiz.b.x);\n const hXmax = Math.max(horiz.a.x, horiz.b.x);\n const vX = vert.a.x;\n const vYmin = Math.min(vert.a.y, vert.b.y);\n const vYmax = Math.max(vert.a.y, vert.b.y);\n return vX > hXmin + epsilon && vX < hXmax - epsilon && hY > vYmin + epsilon && hY < vYmax - epsilon;\n}\n__name(orthogonalSegmentsStrictlyCross, \"orthogonalSegmentsStrictlyCross\");\nfunction strictlyBetween(value, a, b) {\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n return value > lo + EPS && value < hi - EPS;\n}\n__name(strictlyBetween, \"strictlyBetween\");\nfunction isCollinearIntermediate(prev, cur, next) {\n if (sameX(prev, cur) && sameX(cur, next)) {\n return strictlyBetween(cur.y, prev.y, next.y);\n }\n if (sameY(prev, cur) && sameY(cur, next)) {\n return strictlyBetween(cur.x, prev.x, next.x);\n }\n return false;\n}\n__name(isCollinearIntermediate, \"isCollinearIntermediate\");\nfunction simplifyPolylineOnce(points) {\n let changed = false;\n const out = [];\n for (let i = 0; i < points.length; i++) {\n const prev = out[out.length - 1];\n const cur = points[i];\n const next = i + 1 < points.length ? points[i + 1] : void 0;\n if (prev && next) {\n if (samePoint(prev, next)) {\n i++;\n changed = true;\n continue;\n }\n if (isCollinearIntermediate(prev, cur, next)) {\n changed = true;\n continue;\n }\n }\n out.push(cur);\n }\n return { points: out, changed };\n}\n__name(simplifyPolylineOnce, \"simplifyPolylineOnce\");\nfunction orthogonalizePolyline(pts) {\n const cleaned = [pts[0]];\n for (let i = 1; i < pts.length; i++) {\n const prev = cleaned[cleaned.length - 1];\n const curr = pts[i];\n if (!sameX(prev, curr) && !sameY(prev, curr)) {\n const prevPrev = cleaned.length >= 2 ? cleaned[cleaned.length - 2] : void 0;\n const incomingVertical = prevPrev ? sameX(prevPrev, prev) : false;\n const corner = incomingVertical ? { x: prev.x, y: curr.y } : { x: curr.x, y: prev.y };\n cleaned.push(corner);\n }\n cleaned.push(curr);\n }\n const deduped = [];\n for (const p of cleaned) {\n const last = deduped[deduped.length - 1];\n if (!last || !samePoint(last, p)) {\n deduped.push(p);\n }\n }\n return deduped;\n}\n__name(orthogonalizePolyline, \"orthogonalizePolyline\");\nfunction simplifyPolyline(pts) {\n if (pts.length < 3) {\n return pts;\n }\n let work = [...pts];\n for (let guard = 0; guard < 32; guard++) {\n const result = simplifyPolylineOnce(work);\n work = result.points;\n if (!result.changed) {\n break;\n }\n }\n return work;\n}\n__name(simplifyPolyline, \"simplifyPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/endpointClip.ts\nvar EPS2 = 1e-3;\nvar INSIDE_EPS = 0.5;\nvar CORNER_CLEARANCE = 4;\nfunction endpointContextFor(edge, nodeByIdMap, minPoints) {\n const candidate = edge;\n if (candidate.isLayoutOnly || !candidate.points || candidate.points.length < minPoints) {\n return void 0;\n }\n const src = candidate.start ? nodeByIdMap.get(candidate.start) : void 0;\n const dst = candidate.end ? nodeByIdMap.get(candidate.end) : void 0;\n return {\n edge: candidate,\n points: candidate.points,\n srcRect: src ? rectOfNodeBounds(src) : void 0,\n dstRect: dst ? rectOfNodeBounds(dst) : void 0\n };\n}\n__name(endpointContextFor, \"endpointContextFor\");\nfunction segmentEnterPoint(outside, inside, r) {\n if (sameY(outside, inside, EPS2)) {\n const x = outside.x < r.left ? r.left : r.right;\n return { x, y: outside.y };\n }\n if (sameX(outside, inside, EPS2)) {\n const y = outside.y < r.top ? r.top : r.bottom;\n return { x: outside.x, y };\n }\n return {\n x: Math.min(r.right, Math.max(r.left, outside.x)),\n y: Math.min(r.bottom, Math.max(r.top, outside.y))\n };\n}\n__name(segmentEnterPoint, \"segmentEnterPoint\");\nfunction clipEndpoint(points, rect, atStart) {\n const step = atStart ? 1 : -1;\n let outsideIndex = atStart ? 0 : points.length - 1;\n while (outsideIndex >= 0 && outsideIndex < points.length && pointInsideRect(points[outsideIndex], rect, INSIDE_EPS)) {\n outsideIndex += step;\n }\n if (outsideIndex < 0 || outsideIndex >= points.length) {\n return points;\n }\n const insideIndex = outsideIndex - step;\n if (insideIndex < 0 || insideIndex >= points.length) {\n return points;\n }\n const entry = segmentEnterPoint(points[outsideIndex], points[insideIndex], rect);\n return atStart ? [entry, ...points.slice(outsideIndex)] : [...points.slice(0, outsideIndex + 1), entry];\n}\n__name(clipEndpoint, \"clipEndpoint\");\nfunction clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n let next = [...context.points];\n if (context.srcRect) {\n next = clipEndpoint(next, context.srcRect, true);\n }\n if (context.dstRect) {\n next = clipEndpoint(next, context.dstRect, false);\n }\n next = simplifyPolyline(orthogonalizePolyline(next));\n next = clearStraightEndpointCornerConnections(next, context.srcRect, context.dstRect);\n context.edge.points = simplifyPolyline(orthogonalizePolyline(next));\n }\n}\n__name(clipEdgeEndpointsToNodeBoundaries, \"clipEdgeEndpointsToNodeBoundaries\");\nfunction snapEndpointToBoundary(inner, endpoint, r, useApproachSide = false) {\n if (sameY(inner, endpoint, EPS2)) {\n if (endpoint.y < r.top - EPS2 || endpoint.y > r.bottom + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.x < r.left - EPS2) {\n return { x: r.left, y: inner.y };\n }\n if (inner.x > r.right + EPS2) {\n return { x: r.right, y: inner.y };\n }\n }\n const toLeft = Math.abs(endpoint.x - r.left) <= Math.abs(endpoint.x - r.right);\n return { x: toLeft ? r.left : r.right, y: inner.y };\n }\n if (sameX(inner, endpoint, EPS2)) {\n if (endpoint.x < r.left - EPS2 || endpoint.x > r.right + EPS2) {\n return endpoint;\n }\n if (useApproachSide) {\n if (inner.y < r.top - EPS2) {\n return { x: inner.x, y: r.top };\n }\n if (inner.y > r.bottom + EPS2) {\n return { x: inner.x, y: r.bottom };\n }\n }\n const toTop = Math.abs(endpoint.y - r.top) <= Math.abs(endpoint.y - r.bottom);\n return { x: inner.x, y: toTop ? r.top : r.bottom };\n }\n return endpoint;\n}\n__name(snapEndpointToBoundary, \"snapEndpointToBoundary\");\nfunction firstDistinctAdjacent(points, endpointIndex, step) {\n const endpoint = points[endpointIndex];\n for (let index = endpointIndex + step; index >= 0 && index < points.length; index += step) {\n const candidate = points[index];\n if (!samePoint(candidate, endpoint, EPS2)) {\n return candidate;\n }\n }\n return points[endpointIndex + step];\n}\n__name(firstDistinctAdjacent, \"firstDistinctAdjacent\");\nfunction cornerClearanceRange(min, max) {\n const lo = min + CORNER_CLEARANCE;\n const hi = max - CORNER_CLEARANCE;\n return lo <= hi ? { lo, hi } : { lo: (min + max) / 2, hi: (min + max) / 2 };\n}\n__name(cornerClearanceRange, \"cornerClearanceRange\");\nfunction clampToCornerClearance(value, min, max) {\n const { lo, hi } = cornerClearanceRange(min, max);\n return Math.min(hi, Math.max(lo, value));\n}\n__name(clampToCornerClearance, \"clampToCornerClearance\");\nfunction intersectRanges(ranges) {\n const lo = Math.max(...ranges.map((range) => range.lo));\n const hi = Math.min(...ranges.map((range) => range.hi));\n if (lo > hi) {\n return void 0;\n }\n return { lo, hi };\n}\n__name(intersectRanges, \"intersectRanges\");\nfunction clearanceRangeForSide(r, side) {\n return side === \"left\" || side === \"right\" ? cornerClearanceRange(r.top, r.bottom) : cornerClearanceRange(r.left, r.right);\n}\n__name(clearanceRangeForSide, \"clearanceRangeForSide\");\nfunction terminalSideForSegment(endpoint, adjacent, r) {\n const yWithin = endpoint.y >= r.top - EPS2 && endpoint.y <= r.bottom + EPS2;\n const xWithin = endpoint.x >= r.left - EPS2 && endpoint.x <= r.right + EPS2;\n if (sameY(endpoint, adjacent, EPS2) && yWithin) {\n if (Math.abs(endpoint.x - r.left) < EPS2) {\n return \"left\";\n }\n if (Math.abs(endpoint.x - r.right) < EPS2) {\n return \"right\";\n }\n }\n if (sameX(endpoint, adjacent, EPS2) && xWithin) {\n if (Math.abs(endpoint.y - r.top) < EPS2) {\n return \"top\";\n }\n if (Math.abs(endpoint.y - r.bottom) < EPS2) {\n return \"bottom\";\n }\n }\n return void 0;\n}\n__name(terminalSideForSegment, \"terminalSideForSegment\");\nfunction isHorizontalSide(side) {\n return side === \"left\" || side === \"right\";\n}\n__name(isHorizontalSide, \"isHorizontalSide\");\nfunction straightClearanceRange(start, end, srcRect, dstRect, horizontal) {\n const ranges = [];\n const srcSide = srcRect ? terminalSideForSegment(start, end, srcRect) : void 0;\n const dstSide = dstRect ? terminalSideForSegment(end, start, dstRect) : void 0;\n if (srcRect && srcSide && isHorizontalSide(srcSide) === horizontal) {\n ranges.push(clearanceRangeForSide(srcRect, srcSide));\n }\n if (dstRect && dstSide && isHorizontalSide(dstSide) === horizontal) {\n ranges.push(clearanceRangeForSide(dstRect, dstSide));\n }\n return ranges.length > 0 ? intersectRanges(ranges) : void 0;\n}\n__name(straightClearanceRange, \"straightClearanceRange\");\nfunction clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, horizontal) {\n const range = straightClearanceRange(start, end, srcRect, dstRect, horizontal);\n if (!range) {\n return void 0;\n }\n const current = horizontal ? start.y : start.x;\n const next = Math.min(range.hi, Math.max(range.lo, current));\n if (Math.abs(next - current) < EPS2) {\n return void 0;\n }\n return horizontal ? [\n { x: start.x, y: next },\n { x: end.x, y: next }\n ] : [\n { x: next, y: start.y },\n { x: next, y: end.y }\n ];\n}\n__name(clearStraightEndpointCornerAxis, \"clearStraightEndpointCornerAxis\");\nfunction clearStraightEndpointCornerConnections(points, srcRect, dstRect) {\n if (points.length !== 2) {\n return points;\n }\n const [start, end] = points;\n if (sameY(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, true) ?? points;\n }\n if (sameX(start, end, EPS2)) {\n return clearStraightEndpointCornerAxis(start, end, srcRect, dstRect, false) ?? points;\n }\n return points;\n}\n__name(clearStraightEndpointCornerConnections, \"clearStraightEndpointCornerConnections\");\nfunction cornerClearedEndpoint(endpoint, r, side) {\n return isHorizontalSide(side) ? { x: endpoint.x, y: clampToCornerClearance(endpoint.y, r.top, r.bottom) } : { x: clampToCornerClearance(endpoint.x, r.left, r.right), y: endpoint.y };\n}\n__name(cornerClearedEndpoint, \"cornerClearedEndpoint\");\nfunction moveCollinearEndpointRun(points, endpointIndex, step, endpoint, adjusted, horizontalTerminal) {\n const next = points.map((point) => ({ ...point }));\n for (let index = endpointIndex; index >= 0 && index < points.length; index += step) {\n const point = points[index];\n if (horizontalTerminal && !sameY(point, endpoint, EPS2)) {\n break;\n }\n if (!horizontalTerminal && !sameX(point, endpoint, EPS2)) {\n break;\n }\n if (horizontalTerminal) {\n next[index].y = adjusted.y;\n } else {\n next[index].x = adjusted.x;\n }\n }\n return next;\n}\n__name(moveCollinearEndpointRun, \"moveCollinearEndpointRun\");\nfunction clearEndpointCornerConnection(points, r, atStart) {\n if (points.length < 2) {\n return points;\n }\n const endpointIndex = atStart ? 0 : points.length - 1;\n const step = atStart ? 1 : -1;\n const endpoint = points[endpointIndex];\n const adjacent = firstDistinctAdjacent(points, endpointIndex, step);\n if (!adjacent) {\n return points;\n }\n const side = terminalSideForSegment(endpoint, adjacent, r);\n if (!side) {\n return points;\n }\n const horizontalTerminal = isHorizontalSide(side);\n const adjusted = cornerClearedEndpoint(endpoint, r, side);\n if (samePoint(endpoint, adjusted, EPS2)) {\n return points;\n }\n return moveCollinearEndpointRun(\n points,\n endpointIndex,\n step,\n endpoint,\n adjusted,\n horizontalTerminal\n );\n}\n__name(clearEndpointCornerConnection, \"clearEndpointCornerConnection\");\nfunction borderSideForSegment(a, b, r) {\n const xWithin = Math.min(a.x, b.x) >= r.left - EPS2 && Math.max(a.x, b.x) <= r.right + EPS2;\n const yWithin = Math.min(a.y, b.y) >= r.top - EPS2 && Math.max(a.y, b.y) <= r.bottom + EPS2;\n if (Math.abs(a.y - r.top) < EPS2 && Math.abs(b.y - r.top) < EPS2 && xWithin) {\n return \"top\";\n }\n if (Math.abs(a.y - r.bottom) < EPS2 && Math.abs(b.y - r.bottom) < EPS2 && xWithin) {\n return \"bottom\";\n }\n if (Math.abs(a.x - r.left) < EPS2 && Math.abs(b.x - r.left) < EPS2 && yWithin) {\n return \"left\";\n }\n if (Math.abs(a.x - r.right) < EPS2 && Math.abs(b.x - r.right) < EPS2 && yWithin) {\n return \"right\";\n }\n return void 0;\n}\n__name(borderSideForSegment, \"borderSideForSegment\");\nfunction leavesOutward(side, from, to, r) {\n switch (side) {\n case \"top\":\n return sameX(from, to, EPS2) && to.y < r.top - EPS2;\n case \"bottom\":\n return sameX(from, to, EPS2) && to.y > r.bottom + EPS2;\n case \"left\":\n return sameY(from, to, EPS2) && to.x < r.left - EPS2;\n case \"right\":\n return sameY(from, to, EPS2) && to.x > r.right + EPS2;\n }\n}\n__name(leavesOutward, \"leavesOutward\");\nfunction collapseOwnBorderStub(points, r, atStart) {\n if (points.length < 3) {\n return points;\n }\n if (atStart) {\n const side2 = borderSideForSegment(points[0], points[1], r);\n if (side2 && leavesOutward(side2, points[1], points[2], r)) {\n return points.slice(1);\n }\n return points;\n }\n const last = points.length - 1;\n const side = borderSideForSegment(points[last - 1], points[last], r);\n if (side && leavesOutward(side, points[last - 1], points[last - 2], r)) {\n return points.slice(0, last);\n }\n return points;\n}\n__name(collapseOwnBorderStub, \"collapseOwnBorderStub\");\nfunction snapAndCollapseEndpoints(points, srcRect, dstRect) {\n let next = points;\n if (srcRect) {\n const adjacent = firstDistinctAdjacent(next, 0, 1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[0], srcRect);\n if (snapped !== next[0]) {\n next = [snapped, ...next.slice(1)];\n }\n }\n next = collapseOwnBorderStub(next, srcRect, true);\n }\n if (dstRect) {\n const last = next.length - 1;\n const adjacent = firstDistinctAdjacent(next, last, -1);\n if (adjacent) {\n const snapped = snapEndpointToBoundary(adjacent, next[last], dstRect, true);\n if (snapped !== next[last]) {\n next = [...next.slice(0, last), snapped];\n }\n }\n next = collapseOwnBorderStub(next, dstRect, false);\n }\n const straightCleared = clearStraightEndpointCornerConnections(next, srcRect, dstRect);\n if (straightCleared !== next || next.length === 2) {\n return straightCleared;\n }\n if (srcRect) {\n next = clearEndpointCornerConnection(next, srcRect, true);\n }\n if (dstRect) {\n next = clearEndpointCornerConnection(next, dstRect, false);\n }\n return next;\n}\n__name(snapAndCollapseEndpoints, \"snapAndCollapseEndpoints\");\nfunction prepareEdgeEndpointsForRenderer(edges, nodeByIdMap) {\n for (const edge of edges) {\n const context = endpointContextFor(edge, nodeByIdMap, 2);\n if (!context) {\n continue;\n }\n const input = dedupeConsecutivePoints(context.points, EPS2);\n const newPts = snapAndCollapseEndpoints(input, context.srcRect, context.dstRect);\n if (newPts.length < 3) {\n context.edge.points = newPts;\n continue;\n }\n const duplicated = [\n newPts[0],\n { ...newPts[0] },\n ...newPts.slice(1, -1),\n newPts[newPts.length - 1],\n { ...newPts[newPts.length - 1] }\n ];\n context.edge.points = duplicated;\n }\n}\n__name(prepareEdgeEndpointsForRenderer, \"prepareEdgeEndpointsForRenderer\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/lrTransform.ts\nfunction buildNodeMap(nodes) {\n return new Map(nodes.map((node) => [node.id, node]));\n}\n__name(buildNodeMap, \"buildNodeMap\");\nfunction resolveTopLevelGroupId(node, nodeById) {\n let parentId = node.parentId;\n let topLevelGroupId = null;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n topLevelGroupId = parent.id;\n parentId = parent.parentId;\n }\n return topLevelGroupId;\n}\n__name(resolveTopLevelGroupId, \"resolveTopLevelGroupId\");\nfunction groupDepth(group, nodeById) {\n let depth = 0;\n let parentId = group.parentId;\n while (parentId) {\n const parent = nodeById.get(parentId);\n if (!parent?.isGroup) {\n break;\n }\n depth++;\n parentId = parent.parentId;\n }\n return depth;\n}\n__name(groupDepth, \"groupDepth\");\nfunction boundsForChildren(children) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n for (const child of children) {\n const cx = child.x;\n const cy = child.y;\n if (typeof cx !== \"number\" || typeof cy !== \"number\") {\n continue;\n }\n const w = child.width ?? 0;\n const h = child.height ?? 0;\n minX = Math.min(minX, cx - w / 2);\n maxX = Math.max(maxX, cx + w / 2);\n minY = Math.min(minY, cy - h / 2);\n maxY = Math.max(maxY, cy + h / 2);\n }\n if (minX === Infinity || minY === Infinity) {\n return null;\n }\n return { minX, maxX, minY, maxY };\n}\n__name(boundsForChildren, \"boundsForChildren\");\nfunction applyGroupBounds(group, bounds) {\n const pad = group.padding ?? 20;\n group.x = (bounds.minX + bounds.maxX) / 2;\n group.y = (bounds.minY + bounds.maxY) / 2;\n group.width = Math.max(0, bounds.maxX - bounds.minX) + pad;\n group.height = Math.max(0, bounds.maxY - bounds.minY) + pad;\n}\n__name(applyGroupBounds, \"applyGroupBounds\");\nfunction recomputeNestedGroupBounds(nodes) {\n const nodeById = buildNodeMap(nodes);\n const groupsByDepth = nodes.filter((node) => node.isGroup && node.parentId).sort((a, b) => groupDepth(b, nodeById) - groupDepth(a, nodeById));\n for (const group of groupsByDepth) {\n const children = nodes.filter((node) => node.parentId === group.id);\n const bounds = boundsForChildren(children);\n if (bounds) {\n applyGroupBounds(group, bounds);\n }\n }\n}\n__name(recomputeNestedGroupBounds, \"recomputeNestedGroupBounds\");\nfunction mirrorAxis(layout, axis) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((node) => !node.isGroup);\n let min = Infinity;\n let max = -Infinity;\n for (const node of contentNodes) {\n const value = node[axis];\n if (typeof value !== \"number\") {\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\n return false;\n }\n const mirror = /* @__PURE__ */ __name((value) => min + max - value, \"mirror\");\n for (const node of nodes) {\n const value = node[axis];\n if (typeof value === \"number\") {\n node[axis] = mirror(value);\n }\n const titleRect = node.groupTitleRect;\n if (titleRect) {\n node.groupTitleRect = axis === \"x\" ? {\n ...titleRect,\n left: mirror(titleRect.right),\n right: mirror(titleRect.left)\n } : {\n ...titleRect,\n top: mirror(titleRect.bottom),\n bottom: mirror(titleRect.top)\n };\n }\n }\n for (const edge of edges) {\n for (const point of edge.points ?? []) {\n point[axis] = mirror(point[axis]);\n }\n }\n return true;\n}\n__name(mirrorAxis, \"mirrorAxis\");\nfunction applyBtDirectionTransform(layout) {\n const nodes = layout.nodes ?? [];\n if (!nodes.some((node) => !node.isGroup)) {\n return true;\n }\n return mirrorAxis(layout, \"y\");\n}\n__name(applyBtDirectionTransform, \"applyBtDirectionTransform\");\nfunction applyLrDirectionTransform(layout, direction = \"LR\") {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n let minX = Infinity;\n let minY = Infinity;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n if (x0 < minX) {\n minX = x0;\n }\n if (y0 < minY) {\n minY = y0;\n }\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) {\n return false;\n }\n const titleBandSize = 36;\n let totalWidth = 0;\n let totalHeight = 0;\n for (const n of contentNodes) {\n totalWidth += n.width ?? 0;\n totalHeight += n.height ?? 0;\n }\n const avgWidth = totalWidth / contentNodes.length;\n const avgHeight = totalHeight / contentNodes.length;\n const horizontalScaleFactor = avgHeight > 0 ? Math.max(1, avgWidth / avgHeight) : 1;\n for (const n of contentNodes) {\n const x0 = n.x ?? 0;\n const y0 = n.y ?? 0;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n n.x = newX;\n n.y = newY;\n }\n for (const e of edges) {\n if (!e.points) {\n continue;\n }\n for (const p of e.points) {\n const x0 = p.x;\n const y0 = p.y;\n const newX = (y0 - minY) * horizontalScaleFactor + titleBandSize;\n const newY = x0 - minX;\n p.x = newX;\n p.y = newY;\n }\n }\n recomputeNestedGroupBounds(nodes);\n const laneNodes = nodes.filter((n) => n.isGroup && !n.parentId);\n if (laneNodes.length === 0) {\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n }\n const nodeById = buildNodeMap(nodes);\n const childrenByLane = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n if (n.isGroup) {\n continue;\n }\n const laneId = resolveTopLevelGroupId(n, nodeById);\n if (!laneId) {\n continue;\n }\n const bucket = childrenByLane.get(laneId) ?? [];\n bucket.push(n);\n childrenByLane.set(laneId, bucket);\n }\n let maxPad = 0;\n for (const lane of laneNodes) {\n const pad = lane.padding ?? 0;\n if (pad > maxPad) {\n maxPad = pad;\n }\n }\n const laneBounds = [];\n let globalMinXChild = Infinity;\n let globalMaxXChild = -Infinity;\n for (const lane of laneNodes) {\n const children = childrenByLane.get(lane.id) ?? [];\n const bounds = boundsForChildren(children);\n if (!bounds) {\n continue;\n }\n globalMinXChild = Math.min(globalMinXChild, bounds.minX);\n globalMaxXChild = Math.max(globalMaxXChild, bounds.maxX);\n laneBounds.push({\n lane,\n contentTop: bounds.minY,\n contentBottom: bounds.maxY,\n centerY: (bounds.minY + bounds.maxY) / 2\n });\n }\n if (globalMinXChild === Infinity || globalMaxXChild === -Infinity) {\n return true;\n }\n const fullContentWidth = Math.max(0, globalMaxXChild - globalMinXChild);\n const horizontalMargin = Math.max(maxPad, 10);\n const bodyWidth = fullContentWidth + 2 * horizontalMargin;\n const laneWidth = titleBandSize + bodyWidth;\n const bodyCenter = (globalMinXChild + globalMaxXChild) / 2;\n const bodyLeft = bodyCenter - bodyWidth / 2;\n const laneLeft = bodyLeft - titleBandSize;\n const centerX = laneLeft + laneWidth / 2;\n const verticalMargin = Math.max(maxPad, titleBandSize);\n laneBounds.sort((a, b) => a.centerY - b.centerY);\n for (let i = 0; i < laneBounds.length; i++) {\n const curr = laneBounds[i];\n let laneTop;\n let laneBottom;\n if (i === 0) {\n laneTop = curr.contentTop - verticalMargin;\n } else {\n const prev = laneBounds[i - 1];\n laneTop = (prev.contentBottom + curr.contentTop) / 2;\n }\n if (i === laneBounds.length - 1) {\n laneBottom = curr.contentBottom + verticalMargin;\n } else {\n const next = laneBounds[i + 1];\n laneBottom = (curr.contentBottom + next.contentTop) / 2;\n }\n const laneHeight = Math.max(0, laneBottom - laneTop);\n const centerY = (laneTop + laneBottom) / 2;\n curr.lane.x = centerX;\n curr.lane.y = centerY;\n curr.lane.width = laneWidth;\n curr.lane.height = laneHeight;\n curr.lane.swimlaneContentTop = curr.contentTop;\n curr.lane.groupTitleRect = {\n left: laneLeft,\n right: laneLeft + titleBandSize,\n top: laneTop,\n bottom: laneBottom\n };\n }\n if (direction === \"RL\") {\n mirrorAxis(layout, \"x\");\n }\n return true;\n}\n__name(applyLrDirectionTransform, \"applyLrDirectionTransform\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/portSwap.ts\nvar EPS3 = 1e-6;\nvar MIN_PORT_SPACING = 8;\nvar PORT_SHIFT = MIN_PORT_SPACING;\nvar TRY_DELTAS = [0, PORT_SHIFT, -PORT_SHIFT, 2 * PORT_SHIFT, -2 * PORT_SHIFT];\nfunction portSwapToLShape(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 4) {\n continue;\n }\n const route = classifyThreeSegmentRoute(dedupeConsecutivePoints(pts, EPS3), EPS3);\n if (!route) {\n continue;\n }\n const { p3 } = route;\n const isHVH = route.kind === \"HVH\";\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS3);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX || collinearY) {\n continue;\n }\n let newPts;\n const srcRect = srcInfo.rect;\n for (const delta of TRY_DELTAS) {\n let np0;\n let np1;\n let np2;\n if (isHVH) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n const newSrcY = dstBelow ? srcRect.bottom : srcRect.top;\n const newSrcX = srcInfo.cx + delta;\n if (newSrcX <= srcRect.left + EPS3 || newSrcX >= srcRect.right - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: newSrcX, y: p3.y };\n np2 = { x: p3.x, y: p3.y };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n const newSrcX = dstEast ? srcRect.right : srcRect.left;\n const newSrcY = srcInfo.cy + delta;\n if (newSrcY <= srcRect.top + EPS3 || newSrcY >= srcRect.bottom - EPS3) {\n continue;\n }\n np0 = { x: newSrcX, y: newSrcY };\n np1 = { x: p3.x, y: newSrcY };\n np2 = { x: p3.x, y: p3.y };\n }\n const firstSegDegenerate = samePoint(np0, np1, EPS3);\n const secondSegDegenerate = samePoint(np1, np2, EPS3);\n if (firstSegDegenerate && secondSegDegenerate) {\n continue;\n }\n if (!firstSegDegenerate && segmentHitsAnyRect(np0, np1, realNodeRects, [srcId], 1)) {\n continue;\n }\n if (!secondSegDegenerate && segmentHitsAnyRect(np1, np2, realNodeRects, [dstId], 1)) {\n continue;\n }\n const firstSegConflicts = !firstSegDegenerate && segmentConflictsWithAnyEdge(np0, np1, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n const secondSegConflicts = !secondSegDegenerate && segmentConflictsWithAnyEdge(np1, np2, edges, edge, {\n epsilon: EPS3,\n skipDegenerateOther: true\n });\n if (firstSegConflicts || secondSegConflicts) {\n continue;\n }\n if (firstSegDegenerate) {\n newPts = [np1, np2];\n } else if (secondSegDegenerate) {\n newPts = [np0, np1];\n } else {\n newPts = [np0, np1, np2];\n }\n break;\n }\n if (newPts) {\n edge.points = newPts;\n }\n }\n}\n__name(portSwapToLShape, \"portSwapToLShape\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/terminalStub.ts\nfunction collapseShortTerminalStub(edges, nodeByIdMap) {\n const MIN_STUB = 10;\n const EPS_LOCAL2 = 1e-3;\n const BUFFER = 2;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const rawPts = edge.points;\n if (!rawPts || rawPts.length < 4) {\n continue;\n }\n const pts = dedupeConsecutivePoints(rawPts, EPS_LOCAL2);\n if (pts.length < 4) {\n continue;\n }\n const nLast = pts.length - 1;\n const endPt = pts[nLast];\n const penultPt = pts[nLast - 1];\n const prevPt = pts[nLast - 2];\n const lastDx = endPt.x - penultPt.x;\n const lastDy = endPt.y - penultPt.y;\n const lastLen = Math.hypot(lastDx, lastDy);\n if (lastLen >= MIN_STUB || lastLen < EPS_LOCAL2) {\n continue;\n }\n const penultDx = penultPt.x - prevPt.x;\n const penultDy = penultPt.y - prevPt.y;\n const penultLen = Math.hypot(penultDx, penultDy);\n if (penultLen < EPS_LOCAL2) {\n continue;\n }\n const lastIsHoriz = isHorizontalSegment(penultPt, endPt, EPS_LOCAL2);\n const lastIsVert = isVerticalSegment(penultPt, endPt, EPS_LOCAL2);\n const penultIsHoriz = isHorizontalSegment(prevPt, penultPt, EPS_LOCAL2);\n const penultIsVert = isVerticalSegment(prevPt, penultPt, EPS_LOCAL2);\n if (!(lastIsHoriz && penultIsVert || lastIsVert && penultIsHoriz)) {\n continue;\n }\n const dstId = edge.end;\n const srcId = edge.start;\n const dst = dstId ? nodeByIdMap.get(dstId) : void 0;\n if (!dst) {\n continue;\n }\n const dstCx = dst.x ?? 0;\n const dstCy = dst.y ?? 0;\n const dstRect = rectOfNodeBounds(dst);\n if (!dstRect) {\n continue;\n }\n let newPrev;\n let newEnd;\n if (penultIsVert) {\n const approachFromBelow = penultDy < 0;\n newPrev = { x: dstCx, y: prevPt.y };\n newEnd = { x: dstCx, y: approachFromBelow ? dstRect.bottom : dstRect.top };\n } else {\n const approachFromLeft = penultDx > 0;\n newPrev = { x: prevPt.x, y: dstCy };\n newEnd = { x: approachFromLeft ? dstRect.right : dstRect.left, y: dstCy };\n }\n if (segmentHitsAnyRect(newPrev, newEnd, realNodeRects, dstId ? [dstId] : [], -BUFFER)) {\n continue;\n }\n if (segmentHitsAnyRect(newPrev, newEnd, labelRects, [], -BUFFER)) {\n continue;\n }\n if (srcId) {\n const src = nodeByIdMap.get(srcId);\n const srcRect = src ? rectOfNodeBounds(src) : void 0;\n if (srcRect && pointInsideRect(newPrev, srcRect, BUFFER)) {\n continue;\n }\n }\n const ownSegmentKey = /* @__PURE__ */ __name((a, b) => `${a.x.toFixed(3)},${a.y.toFixed(3)}|${b.x.toFixed(3)},${b.y.toFixed(3)}`, \"ownSegmentKey\");\n const selfSegments = /* @__PURE__ */ new Set();\n for (let i = 0; i < pts.length - 1; i++) {\n selfSegments.add(ownSegmentKey(pts[i], pts[i + 1]));\n }\n const segmentCrossesOtherEdge = /* @__PURE__ */ __name((from, to) => {\n for (const other of edges) {\n if (other === edge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oPts = other.points;\n if (!oPts || oPts.length < 2) {\n continue;\n }\n for (let i = 0; i < oPts.length - 1; i++) {\n const a = oPts[i];\n const b = oPts[i + 1];\n if (selfSegments.has(ownSegmentKey(a, b))) {\n continue;\n }\n if (orthogonalSegmentsStrictlyCross(from, to, a, b, EPS_LOCAL2)) {\n return true;\n }\n }\n }\n return false;\n }, \"segmentCrossesOtherEdge\");\n if (segmentCrossesOtherEdge(newPrev, newEnd)) {\n continue;\n }\n if (nLast - 3 >= 0) {\n const beforePrev = pts[nLast - 3];\n const endpointIds = [srcId, dstId].filter((id) => Boolean(id));\n if (segmentHitsAnyRect(beforePrev, newPrev, realNodeRects, endpointIds, -BUFFER)) {\n continue;\n }\n if (segmentCrossesOtherEdge(beforePrev, newPrev)) {\n continue;\n }\n }\n const head = pts.slice(0, nLast - 2);\n const newPts = [...head, newPrev, newEnd];\n edge.points = newPts;\n const labelId = edge.labelNodeId;\n if (labelId) {\n const labelNode = nodeByIdMap.get(labelId);\n if (labelNode) {\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw > 0 && lh > 0) {\n let bestMidX;\n let bestMidY;\n let bestLen = -1;\n for (let i = 0; i < newPts.length - 1; i++) {\n const a = newPts[i];\n const b = newPts[i + 1];\n const segLen = Math.hypot(b.x - a.x, b.y - a.y);\n const isHoriz = sameY(a, b, EPS_LOCAL2);\n const isVert = sameX(a, b, EPS_LOCAL2);\n const fits = isHoriz && segLen >= lw + 2 || isVert && segLen >= lh + 2;\n if (!fits) {\n continue;\n }\n if (segLen > bestLen) {\n bestLen = segLen;\n bestMidX = (a.x + b.x) / 2;\n bestMidY = (a.y + b.y) / 2;\n }\n }\n if (bestMidX !== void 0 && bestMidY !== void 0) {\n labelNode.x = bestMidX;\n labelNode.y = bestMidY;\n }\n }\n }\n }\n }\n}\n__name(collapseShortTerminalStub, \"collapseShortTerminalStub\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/materializedGeometry.ts\nvar EPS_LOCAL = 1e-3;\nvar MIN_SHARED = 8;\nvar segmentsFor = orthogonalSegmentsForPoints;\nvar orthogonallyAligned = /* @__PURE__ */ __name((a, b) => sameX(a, b, EPS_LOCAL) || sameY(a, b, EPS_LOCAL), \"orthogonallyAligned\");\nfunction separateSharedRenderedTerminalLanes(edges, nodeByIdMap) {\n const MIN_FACE_CLEARANCE = 16;\n const TRACK_SHIFT = 7;\n const rectIntersect = /* @__PURE__ */ __name((node, point) => {\n const x = node.x ?? 0;\n const y = node.y ?? 0;\n const dx = point.x - x;\n const dy = point.y - y;\n let w = (node.width ?? 0) / 2;\n let h = (node.height ?? 0) / 2;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n if (dy < 0) {\n h = -h;\n }\n return { x: x + (dy === 0 ? 0 : h * dx / dy), y: y + h };\n }\n if (dx < 0) {\n w = -w;\n }\n return { x: x + w, y: y + (dx === 0 ? 0 : w * dy / dx) };\n }, \"rectIntersect\");\n const terminalLaneFor = /* @__PURE__ */ __name((edge, atStart) => {\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const nodeId = atStart ? edge.start : edge.end;\n const node = nodeId ? nodeByIdMap.get(nodeId) : void 0;\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (!node || !nodeId || !rect) {\n return void 0;\n }\n const endpoint = atStart ? points[0] : points[points.length - 1];\n const adjacent = atStart ? points[1] : points[points.length - 2];\n const boundary = rectIntersect(node, endpoint);\n let railEnd = endpoint;\n if (orthogonallyAligned(adjacent, boundary)) {\n railEnd = adjacent;\n }\n if (sameX(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"V\",\n coord: boundary.x,\n min: Math.min(boundary.y, railEnd.y),\n max: Math.max(boundary.y, railEnd.y),\n boundary,\n railEnd,\n rect\n };\n }\n if (sameY(boundary, railEnd, EPS_LOCAL)) {\n return {\n edge,\n edgeId: String(edge.id ?? \"\"),\n nodeId,\n atStart,\n orientation: \"H\",\n coord: boundary.y,\n min: Math.min(boundary.x, railEnd.x),\n max: Math.max(boundary.x, railEnd.x),\n boundary,\n railEnd,\n rect\n };\n }\n return void 0;\n }, \"terminalLaneFor\");\n const projectedOverlapLength = /* @__PURE__ */ __name((a, b) => Math.max(0, Math.min(a.max, b.max) - Math.max(a.min, b.min)), \"projectedOverlapLength\");\n const sameTerminalFace = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n if (a.orientation === \"H\") {\n const aOnHorizontalFace = Math.abs(a.boundary.x - a.rect.left) < 1 || Math.abs(a.boundary.x - a.rect.right) < 1;\n return aOnHorizontalFace && sameX(a.boundary, b.boundary, 1);\n }\n const aOnVerticalFace = Math.abs(a.boundary.y - a.rect.top) < 1 || Math.abs(a.boundary.y - a.rect.bottom) < 1;\n return aOnVerticalFace && sameY(a.boundary, b.boundary, 1);\n }, \"sameTerminalFace\");\n const exactTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n return shared >= MIN_SHARED && Math.abs(a.coord - b.coord) < 0.5;\n }, \"exactTerminalLaneConflict\");\n const nearTerminalLaneConflict = /* @__PURE__ */ __name((a, b) => {\n if (a.nodeId !== b.nodeId || a.orientation !== b.orientation || a.orientation !== \"H\" || a.atStart === b.atStart) {\n return false;\n }\n const shared = projectedOverlapLength(a, b);\n if (shared < MIN_SHARED) {\n return false;\n }\n const faceSpan = a.rect.bottom - a.rect.top;\n if (shared < faceSpan || shared > 2 * faceSpan) {\n return false;\n }\n return sameTerminalFace(a, b) && Math.abs(a.coord - b.coord) < MIN_FACE_CLEARANCE;\n }, \"nearTerminalLaneConflict\");\n const shiftedCandidate = /* @__PURE__ */ __name((lane, shift) => {\n const points = dedupeConsecutivePoints(lane.edge.points ?? []);\n if (points.length < 2) {\n return void 0;\n }\n const shiftedBoundary = lane.orientation === \"V\" ? { x: lane.boundary.x + shift, y: lane.boundary.y } : { x: lane.boundary.x, y: lane.boundary.y + shift };\n const shiftedRailEnd = lane.orientation === \"V\" ? { x: lane.railEnd.x + shift, y: lane.railEnd.y } : { x: lane.railEnd.x, y: lane.railEnd.y + shift };\n const boundaryStaysOnSameFace = /* @__PURE__ */ __name(() => {\n if (Math.abs(lane.boundary.y - lane.rect.top) < 1 || Math.abs(lane.boundary.y - lane.rect.bottom) < 1) {\n return sameY(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.x >= lane.rect.left + 1 && shiftedBoundary.x <= lane.rect.right - 1;\n }\n if (Math.abs(lane.boundary.x - lane.rect.left) < 1 || Math.abs(lane.boundary.x - lane.rect.right) < 1) {\n return sameX(shiftedBoundary, lane.boundary, EPS_LOCAL) && shiftedBoundary.y >= lane.rect.top + 1 && shiftedBoundary.y <= lane.rect.bottom - 1;\n }\n return false;\n }, \"boundaryStaysOnSameFace\");\n if (!boundaryStaysOnSameFace()) {\n return void 0;\n }\n if (lane.atStart) {\n const railEndIsAdjacent2 = points.length > 1 && samePoint(points[1], lane.railEnd, EPS_LOCAL);\n const rest = points.slice(railEndIsAdjacent2 ? 2 : 1);\n const next = rest[0];\n if (next && !orthogonallyAligned(next, shiftedRailEnd)) {\n return void 0;\n }\n return [shiftedBoundary, shiftedRailEnd, ...rest];\n }\n const railEndIsAdjacent = points.length > 1 && samePoint(points[points.length - 2], lane.railEnd, EPS_LOCAL);\n const before = points.slice(0, railEndIsAdjacent ? -2 : -1);\n const previous = before[before.length - 1];\n if (previous && !orthogonallyAligned(previous, shiftedRailEnd)) {\n return void 0;\n }\n return [...before, shiftedRailEnd, shiftedBoundary];\n }, \"shiftedCandidate\");\n const laneIsStraightCollinearConnector = /* @__PURE__ */ __name((lane) => {\n const edge = lane.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 2) {\n return false;\n }\n const startId = edge.start;\n const endId = edge.end;\n const start = startId ? nodeByIdMap.get(startId) : void 0;\n const end = endId ? nodeByIdMap.get(endId) : void 0;\n if (!start || !end) {\n return false;\n }\n const startX = start.x ?? 0;\n const startY = start.y ?? 0;\n const endX = end.x ?? 0;\n const endY = end.y ?? 0;\n const [a, b] = points;\n return sameY(a, b, EPS_LOCAL) && Math.abs(startY - endY) < 1 && Math.abs(startX - endX) > 1 || sameX(a, b, EPS_LOCAL) && Math.abs(startX - endX) < 1 && Math.abs(startY - endY) > 1;\n }, \"laneIsStraightCollinearConnector\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < 8; iteration++) {\n const lanes = edges.filter((edge) => !edge.isLayoutOnly).flatMap((edge) => [terminalLaneFor(edge, true), terminalLaneFor(edge, false)]).filter((lane) => Boolean(lane));\n let fixed = false;\n for (let i = 0; i < lanes.length && !fixed; i++) {\n for (let j = i + 1; j < lanes.length && !fixed; j++) {\n const first = lanes[i];\n const second = lanes[j];\n if (first.edge === second.edge || !(exactTerminalLaneConflict(first, second) || nearTerminalLaneConflict(first, second))) {\n continue;\n }\n const fixingNearConflict = !exactTerminalLaneConflict(first, second);\n const candidates = [first, second].sort((a, b) => {\n const aPreservesStraight = laneIsStraightCollinearConnector(a);\n const bPreservesStraight = laneIsStraightCollinearConnector(b);\n if (aPreservesStraight !== bPreservesStraight) {\n return Number(aPreservesStraight) - Number(bPreservesStraight);\n }\n return Number(!b.atStart) - Number(!a.atStart);\n });\n for (const lane of candidates) {\n for (const shift of shifts) {\n const candidate = shiftedCandidate(lane, shift);\n if (!candidate) {\n continue;\n }\n const nextLane = terminalLaneFor({ ...lane.edge, points: candidate }, lane.atStart);\n if (!nextLane || lanes.some(\n (other) => other.edge !== lane.edge && (exactTerminalLaneConflict(nextLane, other) || fixingNearConflict && nearTerminalLaneConflict(nextLane, other))\n )) {\n continue;\n }\n lane.edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(separateSharedRenderedTerminalLanes, \"separateSharedRenderedTerminalLanes\");\nfunction collapseRedundantRectangularDoglegs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(dedupeConsecutivePoints(otherPoints))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const withoutDogleg = /* @__PURE__ */ __name((points, i) => {\n if (i + 4 >= points.length) {\n return void 0;\n }\n const p0 = points[i];\n const p1 = points[i + 1];\n const p2 = points[i + 2];\n const p3 = points[i + 3];\n const p4 = points[i + 4];\n const terminalVerticalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && sameX(p0, p3, EPS_LOCAL) && sameX(p0, p4, EPS_LOCAL) && sameX(p1, p2, EPS_LOCAL) && (p1.x - p0.x) * (p3.x - p2.x) < 0;\n const terminalHorizontalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && sameY(p0, p3, EPS_LOCAL) && sameY(p0, p4, EPS_LOCAL) && sameY(p1, p2, EPS_LOCAL) && (p1.y - p0.y) * (p3.y - p2.y) < 0;\n if (terminalVerticalDogleg || terminalHorizontalDogleg) {\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p4, ...points.slice(i + 5)]);\n }\n if (i + 5 >= points.length) {\n return void 0;\n }\n const p5 = points[i + 5];\n const verticalDogleg = isVerticalSegment(p0, p1) && isHorizontalSegment(p1, p2) && isVerticalSegment(p2, p3) && isHorizontalSegment(p3, p4) && isVerticalSegment(p4, p5) && sameX(p0, p4, EPS_LOCAL) && sameX(p0, p5, EPS_LOCAL) && sameX(p2, p3, EPS_LOCAL) && (p2.x - p1.x) * (p4.x - p3.x) < 0;\n const horizontalDogleg = isHorizontalSegment(p0, p1) && isVerticalSegment(p1, p2) && isHorizontalSegment(p2, p3) && isVerticalSegment(p3, p4) && isHorizontalSegment(p4, p5) && sameY(p0, p4, EPS_LOCAL) && sameY(p0, p5, EPS_LOCAL) && sameY(p2, p3, EPS_LOCAL) && (p2.y - p1.y) * (p4.y - p3.y) < 0;\n if (!verticalDogleg && !horizontalDogleg) {\n return void 0;\n }\n return dedupeConsecutivePoints([...points.slice(0, i + 1), p5, ...points.slice(i + 6)]);\n }, \"withoutDogleg\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n let fixed = false;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (let i = 0; i <= points.length - 5; i++) {\n const candidate = withoutDogleg(points, i);\n if (!candidate || !candidateIsSafe(edge, candidate)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(collapseRedundantRectangularDoglegs, \"collapseRedundantRectangularDoglegs\");\nfunction liftObstacleHuggingSameSideRails(edges, nodeByIdMap) {\n const BUFFER = 2;\n const CLEARANCE = 20;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const middleRail = /* @__PURE__ */ __name((points) => {\n const segments = segmentsFor(points);\n if (segments.length !== 3) {\n return void 0;\n }\n const middle = segments[1];\n if (segments[0].horizontal === middle.horizontal || segments[2].horizontal === middle.horizontal) {\n return void 0;\n }\n return {\n index: middle.index,\n horizontal: middle.horizontal,\n vertical: middle.vertical,\n segment: middle\n };\n }, \"middleRail\");\n const blockingRectsFor = /* @__PURE__ */ __name((edge, rail) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n return realNodeRects.filter((entry) => {\n if (endpointIds.includes(entry.id)) {\n return false;\n }\n const rect = entry.rect;\n if (rail.horizontal) {\n const xOverlap = overlapLength(rail.a.x, rail.b.x, rect.left, rect.right);\n return xOverlap >= MIN_SHARED && rail.a.y >= rect.top - BUFFER && rail.a.y <= rect.bottom + BUFFER;\n }\n const yOverlap = overlapLength(rail.a.y, rail.b.y, rect.top, rect.bottom);\n return yOverlap >= MIN_SHARED && rail.a.x >= rect.left - BUFFER && rail.a.x <= rect.right + BUFFER;\n });\n }, \"blockingRectsFor\");\n const candidateByMovingRail = /* @__PURE__ */ __name((points, rail, coord) => {\n const candidate = points.map((point) => ({ ...point }));\n if (rail.horizontal) {\n candidate[rail.index].y = coord;\n candidate[rail.index + 1].y = coord;\n } else if (rail.vertical) {\n candidate[rail.index].x = coord;\n candidate[rail.index + 1].x = coord;\n } else {\n return void 0;\n }\n const simplified = simplifyPolyline(dedupeConsecutivePoints(candidate));\n return segmentsFor(simplified).length === simplified.length - 1 ? simplified : void 0;\n }, \"candidateByMovingRail\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const candidateSegments = segmentsFor(candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let fixed = false;\n for (const edge of visibleEdges) {\n const points = pointsFor(edge);\n const rail = middleRail(points);\n if (!rail) {\n continue;\n }\n const blockers = blockingRectsFor(edge, rail.segment);\n if (blockers.length === 0) {\n continue;\n }\n const coords = rail.horizontal ? [\n Math.min(...blockers.map((entry) => entry.rect.top)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.bottom)) + CLEARANCE\n ] : [\n Math.min(...blockers.map((entry) => entry.rect.left)) - CLEARANCE,\n Math.max(...blockers.map((entry) => entry.rect.right)) + CLEARANCE\n ];\n for (const coord of coords) {\n const candidate = candidateByMovingRail(points, rail.segment, coord);\n if (!candidate || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n edge.points = candidate;\n fixed = true;\n break;\n }\n if (fixed) {\n break;\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(liftObstacleHuggingSameSideRails, \"liftObstacleHuggingSameSideRails\");\nfunction liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const topLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n const direction = typeof rawDirection === \"string\" ? rawDirection.toUpperCase() : \"\";\n if (direction === \"LR\" || direction === \"RL\" || direction === \"BT\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const y = node.y;\n const height = node.height;\n if (!rect || typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleHeight <= 0 || titleWidth < titleHeight) {\n return void 0;\n }\n return { node, rect };\n }, \"topLaneTitleFor\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(topLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let topDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (!horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n continue;\n }\n topDelta = Math.max(topDelta, lane.rect.bottom - segment.a.y + CLEARANCE);\n }\n }\n }\n if (topDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const y = lane.node.y;\n const height = lane.node.height;\n if (typeof y !== \"number\" || typeof height !== \"number\" || !Number.isFinite(y) || !Number.isFinite(height) || height <= 0) {\n continue;\n }\n lane.node.y = y - topDelta / 2;\n lane.node.height = height + topDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n top: lane.rect.top - topDelta,\n bottom: lane.rect.bottom - topDelta\n };\n }\n}\n__name(liftTopLaneTitleBandsAboveRails, \"liftTopLaneTitleBandsAboveRails\");\nfunction shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap) {\n const CLEARANCE = 4;\n const validTitleRect = /* @__PURE__ */ __name((node) => {\n const rect = node.groupTitleRect;\n if (!rect || typeof rect.left !== \"number\" || typeof rect.right !== \"number\" || typeof rect.top !== \"number\" || typeof rect.bottom !== \"number\" || !Number.isFinite(rect.left) || !Number.isFinite(rect.right) || !Number.isFinite(rect.top) || !Number.isFinite(rect.bottom) || rect.right <= rect.left || rect.bottom <= rect.top) {\n return void 0;\n }\n return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.bottom };\n }, \"validTitleRect\");\n const leftLaneTitleFor = /* @__PURE__ */ __name((node) => {\n if (!node.isGroup || node.parentId) {\n return void 0;\n }\n const rawDirection = node.direction;\n if (rawDirection !== \"LR\") {\n return void 0;\n }\n const rect = validTitleRect(node);\n const x = node.x;\n const width = node.width;\n if (!rect || typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n return void 0;\n }\n const titleWidth = rect.right - rect.left;\n const titleHeight = rect.bottom - rect.top;\n if (titleWidth <= 0 || titleHeight < titleWidth) {\n return void 0;\n }\n return { node, rect };\n }, \"leftLaneTitleFor\");\n const verticalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.vertical) {\n return false;\n }\n const x = segment.a.x;\n if (x <= rect.left + EPS_LOCAL || x >= rect.right - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }, \"verticalSegmentIntersectsTitle\");\n const horizontalSegmentIntersectsTitle = /* @__PURE__ */ __name((segment, rect) => {\n if (!segment.horizontal) {\n return false;\n }\n const y = segment.a.y;\n if (y <= rect.top + EPS_LOCAL || y >= rect.bottom - EPS_LOCAL) {\n return false;\n }\n return overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }, \"horizontalSegmentIntersectsTitle\");\n const lanes = [...nodeByIdMap.values()].map(leftLaneTitleFor).filter((lane) => Boolean(lane));\n if (lanes.length === 0) {\n return;\n }\n let leftDelta = 0;\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n for (const segment of segmentsFor(points)) {\n for (const lane of lanes) {\n if (verticalSegmentIntersectsTitle(segment, lane.rect)) {\n leftDelta = Math.max(leftDelta, lane.rect.right - segment.a.x + CLEARANCE);\n } else if (horizontalSegmentIntersectsTitle(segment, lane.rect)) {\n const segmentLeft = Math.min(segment.a.x, segment.b.x);\n leftDelta = Math.max(leftDelta, lane.rect.right - segmentLeft + CLEARANCE);\n }\n }\n }\n }\n if (leftDelta <= EPS_LOCAL) {\n return;\n }\n for (const lane of lanes) {\n const x = lane.node.x;\n const width = lane.node.width;\n if (typeof x !== \"number\" || typeof width !== \"number\" || !Number.isFinite(x) || !Number.isFinite(width) || width <= 0) {\n continue;\n }\n lane.node.x = x - leftDelta / 2;\n lane.node.width = width + leftDelta;\n lane.node.groupTitleRect = {\n ...lane.rect,\n left: lane.rect.left - leftDelta,\n right: lane.rect.right - leftDelta\n };\n }\n}\n__name(shiftLeftLaneTitleBandsLeftOfRails, \"shiftLeftLaneTitleBandsLeftOfRails\");\nfunction swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 4;\n const { realNodeRects } = collectNodeRectEntries(nodeByIdMap.values());\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"crossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const terminalTailFor = /* @__PURE__ */ __name((edge) => {\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n return void 0;\n }\n const tailStart = points[points.length - 2];\n const terminal = points[points.length - 1];\n if (!isHorizontalSegment(tailStart, terminal, EPS_LOCAL) && !isVerticalSegment(tailStart, terminal, EPS_LOCAL)) {\n return void 0;\n }\n return { tailStart, terminal };\n }, \"terminalTailFor\");\n const candidateWithDestinationTail = /* @__PURE__ */ __name((edge, tail) => {\n const points = replacementPointsFor(edge);\n if (points.length < 3) {\n return void 0;\n }\n const start = points[0];\n const firstTurn = points[1];\n let connector;\n if (isHorizontalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: firstTurn.x, y: tail.tailStart.y };\n } else if (isVerticalSegment(start, firstTurn, EPS_LOCAL)) {\n connector = { x: tail.tailStart.x, y: firstTurn.y };\n } else {\n return void 0;\n }\n const candidate = simplifyPolyline(\n dedupeConsecutivePoints([start, firstTurn, connector, tail.tailStart, tail.terminal])\n );\n return segmentsFor(candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"candidateWithDestinationTail\");\n const pathHasNodeHit = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return true;\n }\n }\n return false;\n }, \"pathHasNodeHit\");\n const pathHasSharedTrack = /* @__PURE__ */ __name((edge, path, replacements) => {\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(path)) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSharedTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, path, replacements) => !pathHasNodeHit(edge, path) && !pathHasSharedTrack(edge, path, replacements), \"candidateIsSafe\");\n const edgesByDestination = /* @__PURE__ */ __name(() => {\n const result = /* @__PURE__ */ new Map();\n for (const edge of visibleEdges) {\n const dstId = edge.end;\n if (!dstId || !nodeByIdMap.has(dstId)) {\n continue;\n }\n const points = replacementPointsFor(edge);\n if (points.length < 4) {\n continue;\n }\n const bucket = result.get(dstId) ?? [];\n bucket.push(edge);\n result.set(dstId, bucket);\n }\n return result;\n }, \"edgesByDestination\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = crossingCount();\n if (currentCrossings === 0) {\n return;\n }\n const currentBends = totalBends();\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = currentBends;\n for (const destinationEdges of edgesByDestination().values()) {\n for (let i = 0; i < destinationEdges.length; i++) {\n for (let j = i + 1; j < destinationEdges.length; j++) {\n const first = destinationEdges[i];\n const second = destinationEdges[j];\n const firstTail = terminalTailFor(first);\n const secondTail = terminalTailFor(second);\n if (!firstTail || !secondTail) {\n continue;\n }\n const firstCandidate = candidateWithDestinationTail(first, secondTail);\n const secondCandidate = candidateWithDestinationTail(second, firstTail);\n if (!firstCandidate || !secondCandidate) {\n continue;\n }\n const replacements = /* @__PURE__ */ new Map([\n [first, firstCandidate],\n [second, secondCandidate]\n ]);\n if (!candidateIsSafe(first, firstCandidate, replacements) || !candidateIsSafe(second, secondCandidate, replacements)) {\n continue;\n }\n const candidateCrossings = crossingCount(replacements);\n const candidateBends = totalBends(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(swapDestinationTerminalTailsToReduceCrossings, \"swapDestinationTerminalTailsToReduceCrossings\");\nfunction reassignCrossingExternalRailChannels(edges, nodeByIdMap) {\n const BUFFER = 2;\n const RAIL_CHANNEL_GAP = 12;\n const MAX_ITERATIONS = 4;\n const MAX_EXHAUSTIVE_COMPONENT = 6;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(replacementPointsFor(visibleEdges[i], replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(replacementPointsFor(visibleEdges[j], replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeByIdMap.get(srcId) : void 0;\n const dstNode = dstId ? nodeByIdMap.get(dstId) : void 0;\n const src = srcNode ? rectOfNodeBounds(srcNode) : void 0;\n const dst = dstNode ? rectOfNodeBounds(dstNode) : void 0;\n return src && dst ? { src, dst } : void 0;\n }, \"endpointRectsFor\");\n const externalRailForSegment = /* @__PURE__ */ __name((edge, points, segment) => {\n if (segment.index <= 0 || segment.index + 1 >= points.length - 1) {\n return void 0;\n }\n const endpointRects = endpointRectsFor(edge);\n if (!endpointRects) {\n return void 0;\n }\n if (segment.vertical) {\n const coord = segment.a.x;\n const leftBound = Math.min(endpointRects.src.left, endpointRects.dst.left);\n const rightBound = Math.max(endpointRects.src.right, endpointRects.dst.right);\n const side = coord < leftBound - EPS_LOCAL ? \"left\" : coord > rightBound + EPS_LOCAL ? \"right\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"vertical\",\n side,\n coord,\n min: Math.min(segment.a.y, segment.b.y),\n max: Math.max(segment.a.y, segment.b.y)\n };\n }\n if (segment.horizontal) {\n const coord = segment.a.y;\n const topBound = Math.min(endpointRects.src.top, endpointRects.dst.top);\n const bottomBound = Math.max(endpointRects.src.bottom, endpointRects.dst.bottom);\n const side = coord < topBound - EPS_LOCAL ? \"top\" : coord > bottomBound + EPS_LOCAL ? \"bottom\" : void 0;\n if (!side) {\n return void 0;\n }\n return {\n edge,\n points,\n segmentIndex: segment.index,\n axis: \"horizontal\",\n side,\n coord,\n min: Math.min(segment.a.x, segment.b.x),\n max: Math.max(segment.a.x, segment.b.x)\n };\n }\n return void 0;\n }, \"externalRailForSegment\");\n const collectExternalRails = /* @__PURE__ */ __name(() => {\n const rails = [];\n for (const edge of visibleEdges) {\n const points = replacementPointsFor(edge);\n for (const segment of segmentsFor(points)) {\n const rail = externalRailForSegment(edge, points, segment);\n if (rail) {\n rails.push(rail);\n }\n }\n }\n return rails;\n }, \"collectExternalRails\");\n const railsInteract = /* @__PURE__ */ __name((a, b) => a.edge !== b.edge && a.axis === b.axis && a.side === b.side && overlapLength(a.min, a.max, b.min, b.max) >= MIN_SHARED, \"railsInteract\");\n const connectedComponents = /* @__PURE__ */ __name((rails) => {\n const result = [];\n const seen = /* @__PURE__ */ new Set();\n for (const rail of rails) {\n if (seen.has(rail)) {\n continue;\n }\n const queue = [rail];\n const component = [];\n seen.add(rail);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of rails) {\n if (!seen.has(next) && railsInteract(current, next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n if (component.length > 1) {\n result.push(component);\n }\n }\n return result;\n }, \"connectedComponents\");\n const uniqueCoordsFor = /* @__PURE__ */ __name((component) => {\n const coords = [];\n for (const rail of component) {\n if (!coords.some((coord) => Math.abs(coord - rail.coord) < EPS_LOCAL)) {\n coords.push(rail.coord);\n }\n }\n while (coords.length < component.length) {\n const min = Math.min(...coords);\n const max = Math.max(...coords);\n const side = component[0].side;\n coords.push(\n side === \"left\" || side === \"top\" ? min - RAIL_CHANNEL_GAP * (component.length - coords.length) : max + RAIL_CHANNEL_GAP * (component.length - coords.length)\n );\n }\n return coords;\n }, \"uniqueCoordsFor\");\n const coordinateAssignmentsFor = /* @__PURE__ */ __name((component) => {\n const current = component.map((rail) => rail.coord);\n const coords = uniqueCoordsFor(component);\n const assignments = [];\n if (component.length <= MAX_EXHAUSTIVE_COMPONENT) {\n const used = new Array(coords.length).fill(false);\n const next = [];\n const visit = /* @__PURE__ */ __name(() => {\n if (next.length === component.length) {\n if (next.some((coord, index) => Math.abs(coord - current[index]) >= EPS_LOCAL)) {\n assignments.push([...next]);\n }\n return;\n }\n for (const [i, coord] of coords.entries()) {\n if (used[i]) {\n continue;\n }\n used[i] = true;\n next.push(coord);\n visit();\n next.pop();\n used[i] = false;\n }\n }, \"visit\");\n visit();\n return assignments;\n }\n for (let i = 0; i < current.length; i++) {\n for (let j = i + 1; j < current.length; j++) {\n const assignment = [...current];\n [assignment[i], assignment[j]] = [assignment[j], assignment[i]];\n assignments.push(assignment);\n }\n }\n return assignments;\n }, \"coordinateAssignmentsFor\");\n const replacementsForAssignment = /* @__PURE__ */ __name((component, assignment) => {\n const draftByEdge = /* @__PURE__ */ new Map();\n for (const [i, rail] of component.entries()) {\n const coord = assignment[i];\n const points = draftByEdge.get(rail.edge) ?? rail.points.map((point) => ({ x: point.x, y: point.y }));\n if (rail.axis === \"vertical\") {\n points[rail.segmentIndex].x = coord;\n points[rail.segmentIndex + 1].x = coord;\n } else {\n points[rail.segmentIndex].y = coord;\n points[rail.segmentIndex + 1].y = coord;\n }\n draftByEdge.set(rail.edge, points);\n }\n const replacements = /* @__PURE__ */ new Map();\n for (const [edge, points] of draftByEdge) {\n const simplified = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(simplified).length !== simplified.length - 1) {\n return void 0;\n }\n replacements.set(edge, simplified);\n }\n return replacements;\n }, \"replacementsForAssignment\");\n const candidateIsSafe = /* @__PURE__ */ __name((replacements) => {\n for (const [edge, points] of replacements) {\n const endpointIds = [\n edge.start,\n edge.end\n ].filter((id) => Boolean(id));\n for (const segment of segmentsFor(points)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n }\n }\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = replacements.has(first);\n const firstSegments = segmentsFor(replacementPointsFor(first, replacements));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !replacements.has(second)) {\n continue;\n }\n const secondSegments = segmentsFor(replacementPointsFor(second, replacements));\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n if (currentCrossings === 0) {\n return;\n }\n let bestReplacements;\n let bestCrossings = currentCrossings;\n let bestBends = totalBends();\n let bestDisplacement = Number.POSITIVE_INFINITY;\n for (const component of connectedComponents(collectExternalRails())) {\n for (const assignment of coordinateAssignmentsFor(component)) {\n const replacements = replacementsForAssignment(component, assignment);\n if (!replacements || !candidateIsSafe(replacements)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(replacements);\n if (candidateCrossings >= currentCrossings) {\n continue;\n }\n const candidateBends = totalBends(replacements);\n const candidateDisplacement = component.reduce(\n (sum, rail, index) => sum + Math.abs(assignment[index] - rail.coord),\n 0\n );\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateDisplacement >= bestDisplacement)) {\n continue;\n }\n bestReplacements = replacements;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestDisplacement = candidateDisplacement;\n }\n }\n if (!bestReplacements) {\n return;\n }\n for (const [edge, points] of bestReplacements) {\n edge.points = points;\n }\n }\n}\n__name(reassignCrossingExternalRailChannels, \"reassignCrossingExternalRailChannels\");\nfunction shortcutRedundantOrthogonalJogs(edges, nodeByIdMap) {\n const BUFFER = 2;\n const MAX_ITERATIONS = 8;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const pointsFor = /* @__PURE__ */ __name((edge, replacementEdge, replacement) => dedupeConsecutivePoints(\n edge === replacementEdge ? replacement ?? [] : edge.points ?? []\n ), \"pointsFor\");\n const pathLength = /* @__PURE__ */ __name((points) => segmentsFor(points).reduce((sum, segment) => {\n const dx = segment.a.x - segment.b.x;\n const dy = segment.a.y - segment.b.y;\n return sum + Math.hypot(dx, dy);\n }, 0), \"pathLength\");\n const strictCrossingCount = /* @__PURE__ */ __name((replacementEdge, replacement) => {\n let count = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const firstSegments = segmentsFor(pointsFor(visibleEdges[i], replacementEdge, replacement));\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const secondSegments = segmentsFor(\n pointsFor(visibleEdges[j], replacementEdge, replacement)\n );\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n }\n }\n return count;\n }, \"strictCrossingCount\");\n const segmentRunsAlongRectBorder = /* @__PURE__ */ __name((segment, rect) => {\n if (segment.horizontal) {\n const y = segment.a.y;\n const onBorder = Math.abs(y - rect.top) < 1 || Math.abs(y - rect.bottom) < 1;\n return onBorder && overlapLength(segment.a.x, segment.b.x, rect.left, rect.right) >= MIN_SHARED;\n }\n if (segment.vertical) {\n const x = segment.a.x;\n const onBorder = Math.abs(x - rect.left) < 1 || Math.abs(x - rect.right) < 1;\n return onBorder && overlapLength(segment.a.y, segment.b.y, rect.top, rect.bottom) >= MIN_SHARED;\n }\n return false;\n }, \"segmentRunsAlongRectBorder\");\n const endpointRectsFor = /* @__PURE__ */ __name((edge) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const rects = [];\n for (const id of endpointIds) {\n const node = nodeByIdMap.get(id);\n const rect = node ? rectOfNodeBounds(node) : void 0;\n if (rect) {\n rects.push(rect);\n }\n }\n return rects;\n }, \"endpointRectsFor\");\n const shortcutCandidatesAt = /* @__PURE__ */ __name((points, index) => {\n if (index + 3 >= points.length) {\n return [];\n }\n const p0 = points[index];\n const p1 = points[index + 1];\n const p2 = points[index + 2];\n const p3 = points[index + 3];\n const isHVH = isHorizontalSegment(p0, p1, EPS_LOCAL) && isVerticalSegment(p1, p2, EPS_LOCAL) && isHorizontalSegment(p2, p3, EPS_LOCAL);\n const isVHV = isVerticalSegment(p0, p1, EPS_LOCAL) && isHorizontalSegment(p1, p2, EPS_LOCAL) && isVerticalSegment(p2, p3, EPS_LOCAL);\n if (!isHVH && !isVHV) {\n return [];\n }\n const outerSegmentsOppose = isHVH ? Math.sign(p1.x - p0.x) !== Math.sign(p3.x - p2.x) : Math.sign(p1.y - p0.y) !== Math.sign(p3.y - p2.y);\n if (!outerSegmentsOppose) {\n return [];\n }\n const corners = sameX(p0, p3, EPS_LOCAL) || sameY(p0, p3, EPS_LOCAL) ? [] : [\n { x: p0.x, y: p3.y },\n { x: p3.x, y: p0.y }\n ];\n const rawCandidates = corners.length === 0 ? [[...points.slice(0, index + 1), ...points.slice(index + 3)]] : corners.map((corner) => [\n ...points.slice(0, index + 1),\n corner,\n ...points.slice(index + 3)\n ]);\n const seen = /* @__PURE__ */ new Set();\n return rawCandidates.map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (segmentsFor(candidate).length !== candidate.length - 1) {\n return false;\n }\n if (!candidate.some((point) => samePoint(point, p3, EPS_LOCAL))) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"shortcutCandidatesAt\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate, currentCrossings) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n const endpointRects = endpointRectsFor(edge);\n for (const segment of segmentsFor(candidate)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, [], -BUFFER)) {\n return false;\n }\n if (endpointRects.some((rect) => segmentRunsAlongRectBorder(segment, rect))) {\n return false;\n }\n }\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of segmentsFor(candidate)) {\n for (const otherSegment of segmentsFor(pointsFor(other))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return false;\n }\n }\n }\n }\n return strictCrossingCount(edge, candidate) <= currentCrossings;\n }, \"candidateIsSafe\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const currentCrossings = strictCrossingCount();\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n let bestLength = Number.POSITIVE_INFINITY;\n for (const edge of visibleEdges) {\n const currentPoints = pointsFor(edge);\n const currentBends = countOrthogonalBends(currentPoints, EPS_LOCAL);\n const currentLength = pathLength(currentPoints);\n for (let index = 0; index <= currentPoints.length - 4; index++) {\n for (const candidate of shortcutCandidatesAt(currentPoints, index)) {\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n const candidateLength = pathLength(candidate);\n const improvesShape = candidateBends < currentBends || candidateBends === currentBends && candidateLength < currentLength - EPS_LOCAL;\n if (!improvesShape || !candidateIsSafe(edge, candidate, currentCrossings)) {\n continue;\n }\n const candidateCrossings = strictCrossingCount(edge, candidate);\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && (candidateBends > bestBends || candidateBends === bestBends && candidateLength >= bestLength)) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n bestLength = candidateLength;\n }\n }\n }\n if (!bestEdge || !bestPath) {\n return;\n }\n bestEdge.points = bestPath;\n }\n}\n__name(shortcutRedundantOrthogonalJogs, \"shortcutRedundantOrthogonalJogs\");\nfunction resolveRenderedOrthogonalCrossings(edges, nodeByIdMap) {\n const ANCHOR = 20;\n const EXTRA_CHANNEL_COUNT = 2;\n const MAX_ITERATIONS = 4;\n const MAX_PAIR_CANDIDATES_PER_EDGE = 48;\n const realNodes = [];\n for (const node of nodeByIdMap.values()) {\n if (node.isGroup || node.isEdgeLabel) {\n continue;\n }\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const rect = rectOfNodeBounds(node);\n if (!rect) {\n continue;\n }\n realNodes.push({\n id: String(node.id ?? \"\"),\n cx,\n cy,\n rect\n });\n }\n if (realNodes.length === 0) {\n return;\n }\n const nodeInfoById = new Map(realNodes.map((node) => [node.id, node]));\n const realNodeRects = realNodes.map((node) => ({ id: node.id, rect: node.rect }));\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const outsideTracks = {\n top: Math.min(...realNodes.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodes.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodes.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodes.map((node) => node.rect.right)) + ANCHOR\n };\n const visibleEdges = edges.filter((edge) => !edge.isLayoutOnly);\n const edgeIndex = new Map(visibleEdges.map((edge, index) => [edge, index]));\n const outwardTracksForSide = /* @__PURE__ */ __name((side) => {\n const outward = side === \"left\" || side === \"top\" ? -1 : 1;\n const tracks = [];\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n tracks.push(outsideTracks[side] + outward * ANCHOR * channel);\n }\n return tracks;\n }, \"outwardTracksForSide\");\n const replacementPointsFor = /* @__PURE__ */ __name((edge, replacements = /* @__PURE__ */ new Map()) => dedupeConsecutivePoints(\n replacements.get(edge) ?? edge.points ?? []\n ), \"replacementPointsFor\");\n const crossingCountBetweenSegments = /* @__PURE__ */ __name((firstSegments, secondSegments) => {\n let count = 0;\n for (const firstSegment of firstSegments) {\n for (const secondSegment of secondSegments) {\n if (orthogonalSegmentsStrictlyCross(\n firstSegment.a,\n firstSegment.b,\n secondSegment.a,\n secondSegment.b,\n EPS_LOCAL\n )) {\n count++;\n }\n }\n }\n return count;\n }, \"crossingCountBetweenSegments\");\n const crossingCountBetweenPaths = /* @__PURE__ */ __name((first, second) => crossingCountBetweenSegments(segmentsFor(first), segmentsFor(second)), \"crossingCountBetweenPaths\");\n const crossingSnapshot = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => {\n let count = 0;\n const pairs = [];\n const edgeSet = /* @__PURE__ */ new Set();\n const edgeOrder = [];\n const addEdge = /* @__PURE__ */ __name((edge) => {\n if (!edgeSet.has(edge)) {\n edgeSet.add(edge);\n edgeOrder.push(edge);\n }\n }, \"addEdge\");\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n const pairCount = crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n if (pairCount > 0) {\n count += pairCount;\n pairs.push({ first, second, count: pairCount });\n addEdge(first);\n addEdge(second);\n }\n }\n }\n edgeOrder.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n return {\n count,\n pairs,\n edgeSet,\n edges: edgeOrder\n };\n }, \"crossingSnapshot\");\n const crossingCountWithReplacements = /* @__PURE__ */ __name((current, replacements) => {\n const changed = new Set(replacements.keys());\n if (changed.size === 0) {\n return current.count;\n }\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (changed.has(pair.first) || changed.has(pair.second)) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = 0;\n for (let i = 0; i < visibleEdges.length; i++) {\n const first = visibleEdges[i];\n const firstChanged = changed.has(first);\n const firstPoints = replacementPointsFor(first, replacements);\n for (let j = i + 1; j < visibleEdges.length; j++) {\n const second = visibleEdges[j];\n if (!firstChanged && !changed.has(second)) {\n continue;\n }\n replacementAffected += crossingCountBetweenPaths(\n firstPoints,\n replacementPointsFor(second, replacements)\n );\n }\n }\n return current.count - currentAffected + replacementAffected;\n }, \"crossingCountWithReplacements\");\n const crossingComponents = /* @__PURE__ */ __name((snapshot) => {\n const neighbors = /* @__PURE__ */ new Map();\n for (const pair of snapshot.pairs) {\n const firstNeighbors = neighbors.get(pair.first) ?? /* @__PURE__ */ new Set();\n firstNeighbors.add(pair.second);\n neighbors.set(pair.first, firstNeighbors);\n const secondNeighbors = neighbors.get(pair.second) ?? /* @__PURE__ */ new Set();\n secondNeighbors.add(pair.first);\n neighbors.set(pair.second, secondNeighbors);\n }\n const components = [];\n const seen = /* @__PURE__ */ new Set();\n for (const edge of snapshot.edges) {\n if (seen.has(edge)) {\n continue;\n }\n const queue = [edge];\n const component = [];\n seen.add(edge);\n while (queue.length > 0) {\n const current = queue.pop();\n component.push(current);\n for (const next of neighbors.get(current) ?? []) {\n if (!seen.has(next)) {\n seen.add(next);\n queue.push(next);\n }\n }\n }\n component.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n if (component.length > 1) {\n components.push(component);\n }\n }\n return components;\n }, \"crossingComponents\");\n const endpointIdsFor = /* @__PURE__ */ __name((edge) => [edge.start, edge.end].filter(\n (id) => Boolean(id)\n ), \"endpointIdsFor\");\n const pairSearchGroups = /* @__PURE__ */ __name((snapshot) => {\n const groups = [];\n for (const component of crossingComponents(snapshot)) {\n const componentSet = new Set(component);\n const componentEndpointIds = new Set(component.flatMap((edge) => endpointIdsFor(edge)));\n const group = [...component];\n for (const edge of visibleEdges) {\n if (componentSet.has(edge)) {\n continue;\n }\n if (endpointIdsFor(edge).some((id) => componentEndpointIds.has(id))) {\n group.push(edge);\n }\n }\n group.sort((a, b) => (edgeIndex.get(a) ?? 0) - (edgeIndex.get(b) ?? 0));\n groups.push(group);\n }\n return groups;\n }, \"pairSearchGroups\");\n const crossingCountWithSingleReplacement = /* @__PURE__ */ __name((current, edge, replacement) => crossingCountWithReplacements(\n current,\n /* @__PURE__ */ new Map([[edge, replacement]])\n ), \"crossingCountWithSingleReplacement\");\n const currentCrossingsByEdge = /* @__PURE__ */ __name((current) => {\n const result = /* @__PURE__ */ new Map();\n for (const pair of current.pairs) {\n result.set(pair.first, (result.get(pair.first) ?? 0) + pair.count);\n result.set(pair.second, (result.get(pair.second) ?? 0) + pair.count);\n }\n return result;\n }, \"currentCrossingsByEdge\");\n const pathLength = /* @__PURE__ */ __name((points) => points.slice(1).reduce((sum, point, index) => {\n const previous = points[index];\n return sum + Math.abs(point.x - previous.x) + Math.abs(point.y - previous.y);\n }, 0), \"pathLength\");\n const totalBends = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + countOrthogonalBends(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalBends\");\n const totalLength = /* @__PURE__ */ __name((replacements = /* @__PURE__ */ new Map()) => visibleEdges.reduce(\n (sum, edge) => sum + pathLength(replacementPointsFor(edge, replacements)),\n 0\n ), \"totalLength\");\n const pathHasSegmentConflict = /* @__PURE__ */ __name((edge, path, replacements = /* @__PURE__ */ new Map()) => {\n const pathSegments = segmentsFor(path);\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n for (const candidateSegment of pathSegments) {\n for (const otherSegment of segmentsFor(replacementPointsFor(other, replacements))) {\n if (sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED) {\n return true;\n }\n }\n }\n }\n return false;\n }, \"pathHasSegmentConflict\");\n const pathHitsNode = /* @__PURE__ */ __name((edge, path) => {\n const endpointIds = [edge.start, edge.end].filter(\n (id) => Boolean(id)\n );\n for (const segment of segmentsFor(path)) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -2)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pushOrthogonalCandidate = /* @__PURE__ */ __name((candidates, points) => {\n const candidate = simplifyPolyline(dedupeConsecutivePoints(points));\n if (segmentsFor(candidate).length === candidate.length - 1) {\n candidates.push(candidate);\n }\n }, \"pushOrthogonalCandidate\");\n const sideIsHorizontal = /* @__PURE__ */ __name((side) => side === \"left\" || side === \"right\", \"sideIsHorizontal\");\n const localTrackForSameSide = /* @__PURE__ */ __name((src, side, dst) => {\n switch (side) {\n case \"left\":\n return Math.min(src.x, dst.x) - ANCHOR;\n case \"right\":\n return Math.max(src.x, dst.x) + ANCHOR;\n case \"top\":\n return Math.min(src.y, dst.y) - ANCHOR;\n case \"bottom\":\n return Math.max(src.y, dst.y) + ANCHOR;\n }\n }, \"localTrackForSameSide\");\n const addSameSideCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst) => {\n const outward = srcSide === \"left\" || srcSide === \"top\" ? -1 : 1;\n const trackSeeds = [localTrackForSameSide(src, srcSide, dst), outsideTracks[srcSide]];\n for (const seed of trackSeeds) {\n for (let channel = 0; channel <= EXTRA_CHANNEL_COUNT; channel++) {\n pushOrthogonalCandidate(\n candidates,\n buildSameSideTrackPath(src, srcSide, dst, seed + outward * ANCHOR * channel)\n );\n }\n }\n }, \"addSameSideCandidates\");\n const addHorizontalToVerticalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const xTrack of outwardTracksForSide(srcSide)) {\n for (const yTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: xTrack, y: src.y },\n { x: xTrack, y: yTrack },\n { x: dst.x, y: yTrack },\n dst\n ]);\n }\n }\n }, \"addHorizontalToVerticalCandidates\");\n const addVerticalToHorizontalCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n for (const yTrack of outwardTracksForSide(srcSide)) {\n for (const xTrack of outwardTracksForSide(dstSide)) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: yTrack },\n { x: xTrack, y: yTrack },\n { x: xTrack, y: dst.y },\n dst\n ]);\n }\n }\n }, \"addVerticalToHorizontalCandidates\");\n const addHorizontalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const yTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const yTrack of yTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: srcTrack, y: src.y },\n { x: srcTrack, y: yTrack },\n { x: dstTrack, y: yTrack },\n { x: dstTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalPairCandidates\");\n const addVerticalPairCandidates = /* @__PURE__ */ __name((candidates, src, srcSide, dst, dstSide) => {\n const xTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n for (const srcTrack of outwardTracksForSide(srcSide)) {\n for (const dstTrack of outwardTracksForSide(dstSide)) {\n for (const xTrack of xTracks) {\n pushOrthogonalCandidate(candidates, [\n src,\n { x: src.x, y: srcTrack },\n { x: xTrack, y: srcTrack },\n { x: xTrack, y: dstTrack },\n { x: dst.x, y: dstTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalPairCandidates\");\n const dedupeCandidatePaths = /* @__PURE__ */ __name((candidates) => {\n const seen = /* @__PURE__ */ new Set();\n return candidates.map((candidate) => dedupeConsecutivePoints(candidate)).filter((candidate) => {\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }, \"dedupeCandidatePaths\");\n const buildCandidatesForSides = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const candidates = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS_LOCAL);\n if (base) {\n pushOrthogonalCandidate(candidates, base);\n }\n if (srcSide === dstSide) {\n addSameSideCandidates(candidates, src, srcSide, dst);\n }\n const srcHorizontal = sideIsHorizontal(srcSide);\n const dstHorizontal = sideIsHorizontal(dstSide);\n if (srcHorizontal && !dstHorizontal) {\n addHorizontalToVerticalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (!srcHorizontal && dstHorizontal) {\n addVerticalToHorizontalCandidates(candidates, src, srcSide, dst, dstSide);\n } else if (srcHorizontal) {\n addHorizontalPairCandidates(candidates, src, srcSide, dst, dstSide);\n } else {\n addVerticalPairCandidates(candidates, src, srcSide, dst, dstSide);\n }\n return dedupeCandidatePaths(candidates);\n }, \"buildCandidatesForSides\");\n const addVerticalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetYTracks = side === \"top\" || side === \"bottom\" ? outwardTracksForSide(side) : externalYTracks;\n for (const track of externalXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: dst.y },\n dst\n ]);\n for (const targetTrack of targetYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: track, y: departure.y },\n { x: track, y: targetTrack },\n { x: dst.x, y: targetTrack },\n dst\n ]);\n }\n }\n }\n }, \"addVerticalDepartureOuterTrackCandidates\");\n const addHorizontalDepartureOuterTrackCandidates = /* @__PURE__ */ __name((candidates, first, departure, dstNode) => {\n const externalXTracks = [...outwardTracksForSide(\"left\"), ...outwardTracksForSide(\"right\")];\n const externalYTracks = [...outwardTracksForSide(\"top\"), ...outwardTracksForSide(\"bottom\")];\n for (const side of sides) {\n const dst = portForRectSide(dstNode, side);\n const targetXTracks = side === \"left\" || side === \"right\" ? outwardTracksForSide(side) : externalXTracks;\n for (const track of externalYTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: dst.x, y: track },\n dst\n ]);\n for (const targetTrack of targetXTracks) {\n pushOrthogonalCandidate(candidates, [\n first,\n departure,\n { x: departure.x, y: track },\n { x: targetTrack, y: track },\n { x: targetTrack, y: dst.y },\n dst\n ]);\n }\n }\n }\n }, \"addHorizontalDepartureOuterTrackCandidates\");\n const terminalPreservingOuterTrackCandidates = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcId || !dstNode) {\n return [];\n }\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length < 4) {\n return [];\n }\n const first = points[0];\n const departure = points[1];\n const candidates = [];\n if (isVerticalSegment(first, departure, EPS_LOCAL)) {\n addVerticalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n } else if (isHorizontalSegment(first, departure, EPS_LOCAL)) {\n addHorizontalDepartureOuterTrackCandidates(candidates, first, departure, dstNode);\n }\n return candidates;\n }, \"terminalPreservingOuterTrackCandidates\");\n const candidatePathsFor = /* @__PURE__ */ __name((edge) => {\n const srcId = edge.start;\n const dstId = edge.end;\n const srcNode = srcId ? nodeInfoById.get(srcId) : void 0;\n const dstNode = dstId ? nodeInfoById.get(dstId) : void 0;\n if (!srcNode || !dstNode) {\n return [];\n }\n const candidates = [];\n for (const srcSide of sides) {\n const srcPort = portForRectSide(srcNode, srcSide);\n for (const dstSide of sides) {\n candidates.push(\n ...buildCandidatesForSides(srcPort, srcSide, portForRectSide(dstNode, dstSide), dstSide)\n );\n }\n }\n candidates.push(...terminalPreservingOuterTrackCandidates(edge));\n return candidates;\n }, \"candidatePathsFor\");\n const currentSegmentsByEdge = /* @__PURE__ */ __name(() => new Map(visibleEdges.map((edge) => [edge, segmentsFor(replacementPointsFor(edge))])), \"currentSegmentsByEdge\");\n const sharedTrackConflictsFor = /* @__PURE__ */ __name((edge, candidateSegments, baseSegments) => {\n const conflicts = /* @__PURE__ */ new Set();\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n if (candidateSegments.some(\n (candidateSegment) => otherSegments.some(\n (otherSegment) => sameAxisSegmentOverlapLength(candidateSegment, otherSegment, 0.5) >= MIN_SHARED\n )\n )) {\n conflicts.add(other);\n }\n }\n return conflicts;\n }, \"sharedTrackConflictsFor\");\n const pairCandidatesFor = /* @__PURE__ */ __name((edge, current, baseSegments, crossingCountByEdge) => {\n const seen = /* @__PURE__ */ new Set();\n const candidates = candidatePathsFor(edge).map((candidate) => simplifyPolyline(dedupeConsecutivePoints(candidate))).filter((candidate) => {\n if (pathHitsNode(edge, candidate)) {\n return false;\n }\n const key = candidate.map((point) => `${point.x.toFixed(3)},${point.y.toFixed(3)}`).join(\"|\");\n if (seen.has(key) || candidate.length < 2) {\n return false;\n }\n seen.add(key);\n return true;\n }).map((candidate) => {\n const candidateSegments = segmentsFor(candidate);\n let replacementAffected = 0;\n for (const other of visibleEdges) {\n if (other === edge) {\n continue;\n }\n replacementAffected += crossingCountBetweenSegments(\n candidateSegments,\n baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other))\n );\n }\n return {\n candidate,\n candidateSegments,\n crossings: current.count - (crossingCountByEdge.get(edge) ?? 0) + replacementAffected,\n bends: countOrthogonalBends(candidate, EPS_LOCAL),\n totalBends: countOrthogonalBends(candidate),\n length: pathLength(candidate)\n };\n }).filter(({ crossings }) => crossings <= current.count).sort((a, b) => a.crossings - b.crossings || a.bends - b.bends || a.length - b.length);\n return candidates.slice(0, MAX_PAIR_CANDIDATES_PER_EDGE).map((candidate) => {\n return {\n path: candidate.candidate,\n segments: candidate.candidateSegments,\n sharedTrackConflicts: sharedTrackConflictsFor(\n edge,\n candidate.candidateSegments,\n baseSegments\n ),\n totalBends: candidate.totalBends,\n length: candidate.length\n };\n });\n }, \"pairCandidatesFor\");\n const pairCrossingCount = /* @__PURE__ */ __name((current, firstEdge, firstCandidate, secondEdge, secondCandidate, baseSegments) => {\n let currentAffected = 0;\n for (const pair of current.pairs) {\n if (pair.first === firstEdge || pair.second === firstEdge || pair.first === secondEdge || pair.second === secondEdge) {\n currentAffected += pair.count;\n }\n }\n let replacementAffected = crossingCountBetweenSegments(\n firstCandidate.segments,\n secondCandidate.segments\n );\n for (const other of visibleEdges) {\n if (other === firstEdge || other === secondEdge) {\n continue;\n }\n const otherSegments = baseSegments.get(other) ?? segmentsFor(replacementPointsFor(other));\n replacementAffected += crossingCountBetweenSegments(firstCandidate.segments, otherSegments) + crossingCountBetweenSegments(secondCandidate.segments, otherSegments);\n }\n return current.count - currentAffected + replacementAffected;\n }, \"pairCrossingCount\");\n const conflictsOnlyWith = /* @__PURE__ */ __name((candidate, edge) => {\n for (const conflict of candidate.sharedTrackConflicts) {\n if (conflict !== edge) {\n return false;\n }\n }\n return true;\n }, \"conflictsOnlyWith\");\n const candidatesShareTrack = /* @__PURE__ */ __name((firstCandidate, secondCandidate) => firstCandidate.segments.some(\n (firstSegment) => secondCandidate.segments.some(\n (secondSegment) => sameAxisSegmentOverlapLength(firstSegment, secondSegment, 0.5) >= MIN_SHARED\n )\n ), \"candidatesShareTrack\");\n const pairCandidatesAreCompatible = /* @__PURE__ */ __name((first, firstCandidate, second, secondCandidate) => conflictsOnlyWith(firstCandidate, second.edge) && conflictsOnlyWith(secondCandidate, first.edge) && !candidatesShareTrack(firstCandidate, secondCandidate), \"pairCandidatesAreCompatible\");\n const scorePairReplacement = /* @__PURE__ */ __name((context, first, firstCandidate, second, secondCandidate) => {\n const crossings = pairCrossingCount(\n context.current,\n first.edge,\n firstCandidate,\n second.edge,\n secondCandidate,\n context.baseSegments\n );\n if (crossings >= context.current.count) {\n return void 0;\n }\n return {\n replacements: /* @__PURE__ */ new Map([\n [first.edge, firstCandidate.path],\n [second.edge, secondCandidate.path]\n ]),\n crossings,\n bends: context.currentBends - (context.baseBendsByEdge.get(first.edge) ?? 0) - (context.baseBendsByEdge.get(second.edge) ?? 0) + firstCandidate.totalBends + secondCandidate.totalBends,\n length: context.currentLength - (context.baseLengthByEdge.get(first.edge) ?? 0) - (context.baseLengthByEdge.get(second.edge) ?? 0) + firstCandidate.length + secondCandidate.length\n };\n }, \"scorePairReplacement\");\n const pairScoreIsBetter = /* @__PURE__ */ __name((candidate, best) => candidate.crossings < best.crossings || candidate.crossings === best.crossings && (candidate.bends < best.bends || candidate.bends === best.bends && candidate.length < best.length), \"pairScoreIsBetter\");\n const bestScoreForOptionPair = /* @__PURE__ */ __name((context, first, second, best) => {\n let pairBest = best;\n for (const firstCandidate of first.candidates) {\n for (const secondCandidate of second.candidates) {\n if (!pairCandidatesAreCompatible(first, firstCandidate, second, secondCandidate)) {\n continue;\n }\n const score = scorePairReplacement(context, first, firstCandidate, second, secondCandidate);\n if (score && pairScoreIsBetter(score, pairBest)) {\n pairBest = score;\n }\n }\n }\n return pairBest;\n }, \"bestScoreForOptionPair\");\n const bestPairedReplacement = /* @__PURE__ */ __name((current) => {\n const currentBends = totalBends();\n const currentLength = totalLength();\n const baseSegments = currentSegmentsByEdge();\n const crossingCountByEdge = currentCrossingsByEdge(current);\n const baseBendsByEdge = new Map(\n visibleEdges.map((edge) => [edge, countOrthogonalBends(replacementPointsFor(edge))])\n );\n const baseLengthByEdge = new Map(\n visibleEdges.map((edge) => [edge, pathLength(replacementPointsFor(edge))])\n );\n const optionsByEdge = /* @__PURE__ */ new Map();\n const groups = pairSearchGroups(current);\n for (const group of groups) {\n for (const edge of group) {\n if (optionsByEdge.has(edge)) {\n continue;\n }\n const candidates = pairCandidatesFor(edge, current, baseSegments, crossingCountByEdge);\n if (candidates.length > 0) {\n optionsByEdge.set(edge, { edge, candidates });\n }\n }\n }\n let best = {\n replacements: /* @__PURE__ */ new Map(),\n crossings: current.count,\n bends: currentBends,\n length: currentLength\n };\n const scoringContext = {\n current,\n currentBends,\n currentLength,\n baseBendsByEdge,\n baseLengthByEdge,\n baseSegments\n };\n for (const group of groups) {\n const crossingEdgeSet = new Set(group.filter((edge) => current.edgeSet.has(edge)));\n const options = group.map((edge) => optionsByEdge.get(edge)).filter((option) => Boolean(option));\n for (let i = 0; i < options.length; i++) {\n const first = options[i];\n for (let j = i + 1; j < options.length; j++) {\n const second = options[j];\n if (!crossingEdgeSet.has(first.edge) && !crossingEdgeSet.has(second.edge)) {\n continue;\n }\n best = bestScoreForOptionPair(scoringContext, first, second, best);\n }\n }\n }\n return best.replacements.size > 0 ? best.replacements : void 0;\n }, \"bestPairedReplacement\");\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const current = crossingSnapshot();\n const currentCrossings = current.count;\n if (currentCrossings === 0) {\n return;\n }\n let bestEdge;\n let bestPath;\n let bestCrossings = currentCrossings;\n let bestBends = Number.POSITIVE_INFINITY;\n for (const edge of current.edges) {\n const currentEdgeBends = countOrthogonalBends(replacementPointsFor(edge), EPS_LOCAL);\n for (const candidate of candidatePathsFor(edge)) {\n const candidateHitsNode = pathHitsNode(edge, candidate);\n const candidateHasSegmentConflict = !candidateHitsNode && pathHasSegmentConflict(edge, candidate);\n const candidateCrossings = crossingCountWithSingleReplacement(current, edge, candidate);\n const candidateBends = countOrthogonalBends(candidate, EPS_LOCAL);\n if (candidateHitsNode || candidateHasSegmentConflict) {\n continue;\n }\n const improvesCurrentEdge = candidateCrossings < currentCrossings || candidateCrossings === currentCrossings && candidateBends < currentEdgeBends;\n if (!improvesCurrentEdge) {\n continue;\n }\n if (candidateCrossings > bestCrossings || candidateCrossings === bestCrossings && candidateBends >= bestBends) {\n continue;\n }\n bestEdge = edge;\n bestPath = candidate;\n bestCrossings = candidateCrossings;\n bestBends = candidateBends;\n }\n }\n if (bestEdge && bestPath) {\n bestEdge.points = bestPath;\n continue;\n }\n const pairedReplacement = bestPairedReplacement(current);\n if (!pairedReplacement) {\n return;\n }\n for (const [edge, points] of pairedReplacement) {\n edge.points = points;\n }\n }\n}\n__name(resolveRenderedOrthogonalCrossings, \"resolveRenderedOrthogonalCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/detourSimplification.ts\nvar EPS4 = 1e-3;\nvar MIN_SHARED2 = 8;\nfunction simplifyDetouredEdges(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const sides = [\"top\", \"bottom\", \"left\", \"right\"];\n const ANCHOR = 20;\n const outsideTracks = {\n top: Math.min(...realNodeRects.map((node) => node.rect.top)) - ANCHOR,\n bottom: Math.max(...realNodeRects.map((node) => node.rect.bottom)) + ANCHOR,\n left: Math.min(...realNodeRects.map((node) => node.rect.left)) - ANCHOR,\n right: Math.max(...realNodeRects.map((node) => node.rect.right)) + ANCHOR\n };\n const buildOrthogonalPathCandidates = /* @__PURE__ */ __name((src, srcSide, dst, dstSide) => {\n const paths = [];\n const base = buildOrthogonalPortPath(src, srcSide, dst, dstSide, ANCHOR, EPS4);\n if (base) {\n paths.push(base);\n }\n if (srcSide === dstSide) {\n paths.push(buildSameSideTrackPath(src, srcSide, dst, outsideTracks[srcSide]));\n }\n return paths;\n }, \"buildOrthogonalPathCandidates\");\n const pathHitsNode = /* @__PURE__ */ __name((pts, excludeIds) => {\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n if (segmentHitsAnyRect(a, b, realNodeRects, excludeIds, 1)) {\n return true;\n }\n }\n return false;\n }, \"pathHitsNode\");\n const pathConflictCount = /* @__PURE__ */ __name((path, currentEdge, includeIncidentEdges = false) => {\n let conflicts = 0;\n const pathSegments = orthogonalSegmentsForPoints(path, EPS4);\n const currentStart = currentEdge.start;\n const currentEnd = currentEdge.end;\n for (const other of edges) {\n if (other === currentEdge || other.isLayoutOnly) {\n continue;\n }\n const otherStart = other.start;\n const otherEnd = other.end;\n if (!includeIncidentEdges && currentStart && currentEnd && (otherStart === currentStart || otherStart === currentEnd || otherEnd === currentStart || otherEnd === currentEnd)) {\n continue;\n }\n const otherPts = other.points;\n if (!otherPts || otherPts.length < 2) {\n continue;\n }\n for (const pathSegment of pathSegments) {\n for (const otherSegment of orthogonalSegmentsForPoints(otherPts, EPS4)) {\n if (orthogonalSegmentsCross(\n pathSegment.a,\n pathSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS4,\n EPS4\n )) {\n conflicts++;\n continue;\n }\n if (sameAxisSegmentOverlapLength(pathSegment, otherSegment, EPS4) >= MIN_SHARED2) {\n conflicts++;\n }\n }\n }\n }\n return conflicts;\n }, \"pathConflictCount\");\n const BEND_THRESHOLD = 4;\n const nearestSideOfRect = /* @__PURE__ */ __name((pt, info) => {\n const dTop = Math.abs(pt.y - info.rect.top);\n const dBottom = Math.abs(pt.y - info.rect.bottom);\n const dLeft = Math.abs(pt.x - info.rect.left);\n const dRight = Math.abs(pt.x - info.rect.right);\n let best = \"top\";\n let bestDist = dTop;\n if (dBottom < bestDist) {\n best = \"bottom\";\n bestDist = dBottom;\n }\n if (dLeft < bestDist) {\n best = \"left\";\n bestDist = dLeft;\n }\n if (dRight < bestDist) {\n best = \"right\";\n bestDist = dRight;\n }\n return best;\n }, \"nearestSideOfRect\");\n const faceClaims = /* @__PURE__ */ new Map();\n const addFaceClaim = /* @__PURE__ */ __name((nodeId, side, edgeId) => {\n const claims = faceClaims.get(nodeId) ?? [];\n claims.push({ side, edgeId });\n faceClaims.set(nodeId, claims);\n }, \"addFaceClaim\");\n for (const e of edges) {\n if (e.isLayoutOnly) {\n continue;\n }\n const pts = e.points ?? [];\n if (pts.length < 1) {\n continue;\n }\n const eId = e.id ?? \"\";\n const startId = e.start;\n const endId = e.end;\n if (startId) {\n const info = nodeInfoById.get(startId);\n if (info) {\n addFaceClaim(startId, nearestSideOfRect(pts[0], info), eId);\n }\n }\n if (endId) {\n const info = nodeInfoById.get(endId);\n if (info) {\n addFaceClaim(endId, nearestSideOfRect(pts[pts.length - 1], info), eId);\n }\n }\n }\n const faceIsClaimed = /* @__PURE__ */ __name((nodeId, side, ignoreEdgeId) => {\n return faceClaims.get(nodeId)?.some((c) => c.edgeId !== ignoreEdgeId && c.side === side) ?? false;\n }, \"faceIsClaimed\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const currentBends = countOrthogonalBends(pts, EPS4);\n if (currentBends < BEND_THRESHOLD) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n if (!srcId || !dstId) {\n continue;\n }\n const srcInfo = nodeInfoById.get(srcId);\n const dstInfo = nodeInfoById.get(dstId);\n if (!srcInfo || !dstInfo) {\n continue;\n }\n const edgeId = edge.id ?? \"\";\n const currentCrossingConflicts = pathConflictCount(pts, edge, true);\n const currentNonIncidentConflicts = pathConflictCount(pts, edge);\n let bestPath;\n let bestCrossingConflicts = currentCrossingConflicts;\n let bestBends = currentBends;\n for (const srcSide of sides) {\n if (faceIsClaimed(srcId, srcSide, edgeId)) {\n continue;\n }\n const srcPort = portForRectSide(srcInfo, srcSide);\n for (const dstSide of sides) {\n if (faceIsClaimed(dstId, dstSide, edgeId)) {\n continue;\n }\n const dstPort = portForRectSide(dstInfo, dstSide);\n for (const path of buildOrthogonalPathCandidates(srcPort, srcSide, dstPort, dstSide)) {\n if (pathHitsNode(path, [srcId, dstId])) {\n continue;\n }\n const pathBends = countOrthogonalBends(path, EPS4);\n if (currentCrossingConflicts > 0) {\n const pathCrossingConflicts = pathConflictCount(path, edge, true);\n if (pathCrossingConflicts > bestCrossingConflicts || pathCrossingConflicts === bestCrossingConflicts && pathBends >= bestBends) {\n continue;\n }\n bestCrossingConflicts = pathCrossingConflicts;\n bestBends = pathBends;\n bestPath = path;\n continue;\n }\n if (pathConflictCount(path, edge) > currentNonIncidentConflicts) {\n continue;\n }\n if (pathBends < bestBends) {\n bestBends = pathBends;\n bestPath = path;\n }\n }\n }\n }\n if (bestPath) {\n edge.points = bestPath;\n const refreshSrc = faceClaims.get(srcId);\n if (refreshSrc) {\n faceClaims.set(\n srcId,\n refreshSrc.filter((c) => c.edgeId !== edgeId)\n );\n }\n const refreshDst = faceClaims.get(dstId);\n if (refreshDst) {\n faceClaims.set(\n dstId,\n refreshDst.filter((c) => c.edgeId !== edgeId)\n );\n }\n addFaceClaim(srcId, nearestSideOfRect(bestPath[0], srcInfo), edgeId);\n addFaceClaim(dstId, nearestSideOfRect(bestPath[bestPath.length - 1], dstInfo), edgeId);\n }\n }\n}\n__name(simplifyDetouredEdges, \"simplifyDetouredEdges\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/labelAnchoring.ts\nvar EPS5 = 1e-3;\nvar MARKER_CLEARANCE_LENGTH = 10;\nvar MARKER_CLEARANCE_HALF_WIDTH = 7;\nfunction markerClearanceRectFor(pts, atStart) {\n const terminalIndex = atStart ? 0 : pts.length - 1;\n const step = atStart ? 1 : -1;\n const tip = pts[terminalIndex];\n const inner = pts[terminalIndex + step];\n if (!tip || !inner) {\n return void 0;\n }\n const dx = inner.x - tip.x;\n const dy = inner.y - tip.y;\n const len = Math.abs(dx) + Math.abs(dy);\n if (len < EPS5) {\n return void 0;\n }\n if (Math.abs(dy) <= EPS5) {\n const x2 = tip.x + Math.sign(dx) * MARKER_CLEARANCE_LENGTH;\n return {\n left: Math.min(tip.x, x2),\n right: Math.max(tip.x, x2),\n top: tip.y - MARKER_CLEARANCE_HALF_WIDTH,\n bottom: tip.y + MARKER_CLEARANCE_HALF_WIDTH\n };\n }\n if (Math.abs(dx) <= EPS5) {\n const y2 = tip.y + Math.sign(dy) * MARKER_CLEARANCE_LENGTH;\n return {\n left: tip.x - MARKER_CLEARANCE_HALF_WIDTH,\n right: tip.x + MARKER_CLEARANCE_HALF_WIDTH,\n top: Math.min(tip.y, y2),\n bottom: Math.max(tip.y, y2)\n };\n }\n return {\n left: Math.min(tip.x, inner.x),\n right: Math.max(tip.x, inner.x),\n top: Math.min(tip.y, inner.y),\n bottom: Math.max(tip.y, inner.y)\n };\n}\n__name(markerClearanceRectFor, \"markerClearanceRectFor\");\nfunction normalizeRect(rect) {\n return {\n left: Math.min(rect.left, rect.right),\n right: Math.max(rect.left, rect.right),\n top: Math.min(rect.top, rect.bottom),\n bottom: Math.max(rect.top, rect.bottom)\n };\n}\n__name(normalizeRect, \"normalizeRect\");\nfunction labelOverlapsOwnMarker(rect, pts) {\n const visiblePts = dedupeConsecutivePoints(pts);\n const startMarker = markerClearanceRectFor(visiblePts, true);\n const endMarker = markerClearanceRectFor(visiblePts, false);\n return [startMarker, endMarker].some(\n (marker) => marker && rectsOverlap(rect, normalizeRect(marker))\n );\n}\n__name(labelOverlapsOwnMarker, \"labelOverlapsOwnMarker\");\nfunction anchorLabelsToPolyline(edges, nodeByIdMap) {\n const allEdgeSegments = [];\n for (const other of edges) {\n if (other.isLayoutOnly) {\n continue;\n }\n const pts = other.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n for (let i = 0; i < pts.length - 1; i++) {\n allEdgeSegments.push({ edgeId: other.id, p1: pts[i], p2: pts[i + 1] });\n }\n }\n const foreignNodeRects = [];\n const laneGroups = [];\n for (const n of nodeByIdMap.values()) {\n const isGroup = n.isGroup;\n const parentId = n.parentId;\n if (isGroup && !parentId) {\n const rect2 = rectOfNodeBounds(n);\n if (rect2) {\n laneGroups.push({\n id: n.id,\n rect: rect2\n });\n }\n continue;\n }\n if (isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n continue;\n }\n const rect = rectOfNodeBounds(n);\n if (!rect) {\n continue;\n }\n foreignNodeRects.push({\n nodeId: n.id,\n rect\n });\n }\n const LABEL_PLACEMENT_BUFFER = 3;\n const LABEL_LANE_MARGIN = 1;\n const LABEL_ENDPOINT_CLEARANCE = 12;\n const labelOverlapsForeignNode = /* @__PURE__ */ __name((labelId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const { nodeId, rect: nr } of foreignNodeRects) {\n if (nodeId === labelId) {\n continue;\n }\n if (rectsOverlap(buffered, nr)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignNode\");\n const labelOverlapsForeignEdge = /* @__PURE__ */ __name((edgeId, rect) => {\n const buffered = inflateRect(rect, LABEL_PLACEMENT_BUFFER);\n for (const s of allEdgeSegments) {\n if (s.edgeId === edgeId) {\n continue;\n }\n if (segmentBoundsOverlapRect(s.p1, s.p2, buffered)) {\n return true;\n }\n }\n return false;\n }, \"labelOverlapsForeignEdge\");\n const labelOverlapsAnything = /* @__PURE__ */ __name((labelId, edgeId, rect) => labelOverlapsForeignNode(labelId, rect) || labelOverlapsForeignEdge(edgeId, rect), \"labelOverlapsAnything\");\n const placedLabelRects = [];\n const findContainingLane = /* @__PURE__ */ __name((rect) => {\n for (const { id, rect: laneRect } of laneGroups) {\n if (rectContainsRect(laneRect, rect)) {\n return id;\n }\n }\n return void 0;\n }, \"findContainingLane\");\n const overlapsPlacedLabel = /* @__PURE__ */ __name((labelId, rect) => placedLabelRects.some(\n (placed) => placed.labelId !== labelId && rectsOverlap(rect, placed.rect)\n ), \"overlapsPlacedLabel\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const labelId = edge.labelNodeId;\n if (!labelId) {\n continue;\n }\n const labelNode = nodeByIdMap.get(labelId);\n if (!labelNode) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const lw = labelNode.width ?? 0;\n const lh = labelNode.height ?? 0;\n if (lw <= 0 || lh <= 0) {\n continue;\n }\n const segments = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const a = pts[i];\n const b = pts[i + 1];\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n if (dx < EPS5 && dy < EPS5) {\n continue;\n }\n if (dx >= EPS5 && dy >= EPS5) {\n continue;\n }\n segments.push({\n idx: i,\n length: dx + dy,\n orientation: dx >= EPS5 ? \"horizontal\" : \"vertical\",\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2\n });\n }\n if (segments.length === 0) {\n continue;\n }\n const middleSegments = segments.length >= 3 ? segments.filter((s) => s.idx > 0 && s.idx < segments.length - 1) : segments;\n const poolBase = middleSegments.length > 0 ? middleSegments : segments;\n const labelLongAxis = lw >= lh ? \"horizontal\" : \"vertical\";\n const rankSegments = /* @__PURE__ */ __name((pool) => {\n return [...pool].sort((a, b) => {\n const aLongAxis = a.orientation === labelLongAxis;\n const bLongAxis = b.orientation === labelLongAxis;\n if (aLongAxis !== bLongAxis) {\n return aLongAxis ? -1 : 1;\n }\n const aFits = a.length >= (a.orientation === \"horizontal\" ? lw : lh) + 2;\n const bFits = b.length >= (b.orientation === \"horizontal\" ? lw : lh) + 2;\n if (aFits !== bFits) {\n return aFits ? -1 : 1;\n }\n return b.length - a.length;\n });\n }, \"rankSegments\");\n const firstVisibleSegment = segments[0];\n const lastVisibleSegment = segments[segments.length - 1];\n const ALONG_SEGMENT_TS = [0.5, 0.25, 0.75, 0.05, 0.95, 0.15, 0.85, 0.1, 0.9];\n const anchorAtT = /* @__PURE__ */ __name((seg, t) => {\n const a = pts[seg.idx];\n const b = pts[seg.idx + 1];\n return {\n midX: a.x + (b.x - a.x) * t,\n midY: a.y + (b.y - a.y) * t\n };\n }, \"anchorAtT\");\n const clamp = /* @__PURE__ */ __name((value, min, max) => Math.min(max, Math.max(min, value)), \"clamp\");\n const pointInsideRectInclusive = /* @__PURE__ */ __name((point, rect) => point.midX >= rect.left - EPS5 && point.midX <= rect.right + EPS5 && point.midY >= rect.top - EPS5 && point.midY <= rect.bottom + EPS5, \"pointInsideRectInclusive\");\n const placementForAnchor = /* @__PURE__ */ __name((anchor) => {\n const centeredRect = rectFromCenterSize(anchor.midX, anchor.midY, lw, lh);\n const centeredLane = findContainingLane(centeredRect);\n if (centeredLane) {\n return { laneId: centeredLane, anchor, rect: centeredRect };\n }\n const containingLane = laneGroups.find(({ rect }) => pointInsideRectInclusive(anchor, rect));\n if (!containingLane) {\n return void 0;\n }\n const minX = containingLane.rect.left + lw / 2 + LABEL_LANE_MARGIN;\n const maxX = containingLane.rect.right - lw / 2 - LABEL_LANE_MARGIN;\n const minY = containingLane.rect.top + lh / 2 + LABEL_LANE_MARGIN;\n const maxY = containingLane.rect.bottom - lh / 2 - LABEL_LANE_MARGIN;\n if (minX > maxX || minY > maxY) {\n return void 0;\n }\n const clampedAnchor = {\n midX: clamp(anchor.midX, minX, maxX),\n midY: clamp(anchor.midY, minY, maxY)\n };\n const clampedRect = rectFromCenterSize(clampedAnchor.midX, clampedAnchor.midY, lw, lh);\n return pointInsideRectInclusive(anchor, clampedRect) ? { laneId: containingLane.id, anchor: clampedAnchor, rect: clampedRect } : void 0;\n }, \"placementForAnchor\");\n const distanceAlongSegment = /* @__PURE__ */ __name((seg, anchor, endpoint) => seg.orientation === \"horizontal\" ? Math.abs(anchor.midX - endpoint.x) : Math.abs(anchor.midY - endpoint.y), \"distanceAlongSegment\");\n const labelClearsTerminalEndpoints = /* @__PURE__ */ __name((seg, anchor) => {\n const labelHalfExtent = seg.orientation === \"horizontal\" ? lw / 2 : lh / 2;\n const requiredDistance = labelHalfExtent + LABEL_ENDPOINT_CLEARANCE;\n if (seg === firstVisibleSegment) {\n const start = pts[seg.idx];\n if (distanceAlongSegment(seg, anchor, start) + EPS5 < requiredDistance) {\n return false;\n }\n }\n if (seg === lastVisibleSegment) {\n const end = pts[seg.idx + 1];\n if (distanceAlongSegment(seg, anchor, end) + EPS5 < requiredDistance) {\n return false;\n }\n }\n return true;\n }, \"labelClearsTerminalEndpoints\");\n const tryPool = /* @__PURE__ */ __name((pool) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n for (const t of ALONG_SEGMENT_TS) {\n const anchor = anchorAtT(seg, t);\n if (!labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (!placement) {\n continue;\n }\n if (labelOverlapsOwnMarker(placement.rect, pts)) {\n continue;\n }\n if (overlapsPlacedLabel(labelId, placement.rect)) {\n continue;\n }\n if (!labelOverlapsAnything(labelId, edge.id, placement.rect)) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n }\n return void 0;\n }, \"tryPool\");\n const findLaneContainingFallback = /* @__PURE__ */ __name((pool, requireEndpointClearance, allowForeignEdgeOverlap = false) => {\n const rankedPool = rankSegments(pool);\n for (const seg of rankedPool) {\n const anchor = { midX: seg.midX, midY: seg.midY };\n if (requireEndpointClearance && !labelClearsTerminalEndpoints(seg, anchor)) {\n continue;\n }\n const placement = placementForAnchor(anchor);\n if (placement && !labelOverlapsOwnMarker(placement.rect, pts) && !overlapsPlacedLabel(labelId, placement.rect) && !labelOverlapsForeignNode(labelId, placement.rect) && (allowForeignEdgeOverlap || !labelOverlapsForeignEdge(edge.id, placement.rect))) {\n return { laneId: placement.laneId, anchor: placement.anchor };\n }\n }\n return void 0;\n }, \"findLaneContainingFallback\");\n const chosen = tryPool(poolBase) ?? (poolBase.length < segments.length ? tryPool(segments) : void 0) ?? findLaneContainingFallback(segments, true) ?? findLaneContainingFallback(segments, false) ?? findLaneContainingFallback(segments, false, true);\n if (chosen) {\n labelNode.x = chosen.anchor.midX;\n labelNode.y = chosen.anchor.midY;\n labelNode.parentId = chosen.laneId;\n const chosenRect = rectFromCenterSize(chosen.anchor.midX, chosen.anchor.midY, lw, lh);\n const priorIdx = placedLabelRects.findIndex((placed) => placed.labelId === labelId);\n if (priorIdx >= 0) {\n placedLabelRects[priorIdx] = { labelId, rect: chosenRect };\n } else {\n placedLabelRects.push({ labelId, rect: chosenRect });\n }\n }\n }\n}\n__name(anchorLabelsToPolyline, \"anchorLabelsToPolyline\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/siblingSharedFaceRouting.ts\nvar EPS6 = 1e-6;\nvar MIN_PORT_SPACING2 = 8;\nvar PORT_SHIFT2 = MIN_PORT_SPACING2 / 2;\nvar LABEL_CLEARANCE_BUFFER = 3;\nfunction pairKey(a, b) {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n__name(pairKey, \"pairKey\");\nfunction straightenCollinearSiblingDetours(edges, nodes) {\n const { nodeInfoById, realNodeRects } = collectRealNodeBounds(nodes);\n const labelDimById = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n const id = n.id;\n if (n.isGroup) {\n continue;\n }\n if (n.isEdgeLabel) {\n labelDimById.set(id, {\n w: n.width ?? 0,\n h: n.height ?? 0\n });\n continue;\n }\n }\n const labelClearanceFor = /* @__PURE__ */ __name((thisEdge, thisSrcId, thisDstId, axis) => {\n const targetPair = pairKey(thisSrcId, thisDstId);\n let maxHalf = 0;\n const consider = /* @__PURE__ */ __name((labelId) => {\n if (!labelId) {\n return;\n }\n const dim = labelDimById.get(labelId);\n if (!dim) {\n return;\n }\n const half = axis === \"x\" ? dim.w / 2 : dim.h / 2;\n if (half > maxHalf) {\n maxHalf = half;\n }\n }, \"consider\");\n consider(thisEdge.labelNodeId);\n for (const other of edges) {\n if (other === thisEdge) {\n continue;\n }\n if (other.isLayoutOnly) {\n continue;\n }\n const oSrc = other.start;\n const oDst = other.end;\n if (!oSrc || !oDst) {\n continue;\n }\n if (pairKey(oSrc, oDst) !== targetPair) {\n continue;\n }\n consider(other.labelNodeId);\n }\n return maxHalf > 0 ? maxHalf + LABEL_CLEARANCE_BUFFER : 0;\n }, \"labelClearanceFor\");\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!classifyThreeSegmentRoute(pts, EPS6)) {\n continue;\n }\n const nodePair = getNodePairGeometry(edge, nodeInfoById, EPS6);\n if (!nodePair) {\n continue;\n }\n const { srcId, dstId, srcInfo, dstInfo, collinearX, collinearY } = nodePair;\n if (collinearX === collinearY) {\n continue;\n }\n let targetSrc;\n let targetDst;\n if (collinearX) {\n const dstBelow = dstInfo.cy > srcInfo.cy;\n targetSrc = { x: srcInfo.cx, y: dstBelow ? srcInfo.rect.bottom : srcInfo.rect.top };\n targetDst = { x: dstInfo.cx, y: dstBelow ? dstInfo.rect.top : dstInfo.rect.bottom };\n } else {\n const dstEast = dstInfo.cx > srcInfo.cx;\n targetSrc = { x: dstEast ? srcInfo.rect.right : srcInfo.rect.left, y: srcInfo.cy };\n targetDst = { x: dstEast ? dstInfo.rect.left : dstInfo.rect.right, y: dstInfo.cy };\n }\n if (segmentHitsAnyRect(targetSrc, targetDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n const shiftAxis = collinearX ? \"x\" : \"y\";\n const labelShift = labelClearanceFor(edge, srcId, dstId, shiftAxis);\n const effectiveShift = labelShift > PORT_SHIFT2 ? labelShift : PORT_SHIFT2;\n const deltas = [0, effectiveShift, -effectiveShift];\n for (const delta of deltas) {\n const shiftedSrc = { ...targetSrc };\n const shiftedDst = { ...targetDst };\n if (collinearX) {\n shiftedSrc.x += delta;\n shiftedDst.x += delta;\n if (shiftedSrc.x <= srcInfo.rect.left || shiftedSrc.x >= srcInfo.rect.right) {\n continue;\n }\n if (shiftedDst.x <= dstInfo.rect.left || shiftedDst.x >= dstInfo.rect.right) {\n continue;\n }\n } else {\n shiftedSrc.y += delta;\n shiftedDst.y += delta;\n if (shiftedSrc.y <= srcInfo.rect.top || shiftedSrc.y >= srcInfo.rect.bottom) {\n continue;\n }\n if (shiftedDst.y <= dstInfo.rect.top || shiftedDst.y >= dstInfo.rect.bottom) {\n continue;\n }\n }\n if (segmentHitsAnyRect(shiftedSrc, shiftedDst, realNodeRects, [srcId, dstId], 1)) {\n continue;\n }\n if (segmentConflictsWithAnyEdge(shiftedSrc, shiftedDst, edges, edge, { epsilon: EPS6 })) {\n continue;\n }\n edge.points = [shiftedSrc, shiftedDst];\n break;\n }\n }\n}\n__name(straightenCollinearSiblingDetours, \"straightenCollinearSiblingDetours\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/sharedTrackNudging.ts\nfunction nudgeSharedInteriorSubpaths(edges, nodeByIdMap) {\n const EPS_LOCAL2 = 1e-3;\n const MIN_SHARED3 = 8;\n const TRACK_SHIFT = 7;\n const MIN_TRACK_GAP = TRACK_SHIFT;\n const SOURCE_DETOUR_STUB = 20;\n const BUFFER = 2;\n const MAX_ITERATIONS = 12;\n const { realNodeRects, labelNodeRects: labelRects } = collectNodeRectEntries(\n nodeByIdMap.values()\n );\n const segmentsFor2 = /* @__PURE__ */ __name((edge, points) => {\n return orthogonalSegmentsForPoints(points, EPS_LOCAL2).map((segment) => ({\n ...segment,\n edge,\n interior: segment.index >= 1 && segment.index <= points.length - 3\n }));\n }, \"segmentsFor\");\n const allSegments = /* @__PURE__ */ __name(() => {\n const result = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n result.push(...segmentsFor2(edge, dedupeConsecutivePoints(points)));\n }\n return result;\n }, \"allSegments\");\n const hasCrowdedParallelTrack = /* @__PURE__ */ __name((a, b) => {\n if (a.horizontal && b.horizontal) {\n return overlapLength(a.a.x, a.b.x, b.a.x, b.b.x) >= MIN_SHARED3 && Math.abs(a.a.y - b.a.y) < MIN_TRACK_GAP;\n }\n if (a.vertical && b.vertical) {\n return overlapLength(a.a.y, a.b.y, b.a.y, b.b.y) >= MIN_SHARED3 && Math.abs(a.a.x - b.a.x) < MIN_TRACK_GAP;\n }\n return false;\n }, \"hasCrowdedParallelTrack\");\n const candidateIsSafe = /* @__PURE__ */ __name((edge, candidate) => {\n const sourceId = edge.start;\n const targetId = edge.end;\n const candidateSegments = segmentsFor2(edge, candidate);\n if (candidateSegments.length !== candidate.length - 1) {\n return false;\n }\n const endpointIds = [sourceId, targetId].filter((id) => Boolean(id));\n const ownLabelIds = edge.labelNodeId ? [edge.labelNodeId] : [];\n for (const segment of candidateSegments) {\n if (segmentHitsAnyRect(segment.a, segment.b, realNodeRects, endpointIds, -BUFFER)) {\n return false;\n }\n if (segmentHitsAnyRect(segment.a, segment.b, labelRects, ownLabelIds, -BUFFER)) {\n return false;\n }\n }\n for (const other of edges) {\n if (other === edge || other.isLayoutOnly) {\n continue;\n }\n const otherPoints = other.points;\n if (!otherPoints || otherPoints.length < 2) {\n continue;\n }\n for (const candidateSegment of candidateSegments) {\n for (const otherSegment of segmentsFor2(other, dedupeConsecutivePoints(otherPoints))) {\n if (hasCrowdedParallelTrack(candidateSegment, otherSegment)) {\n return false;\n }\n if (orthogonalSegmentsStrictlyCross(\n candidateSegment.a,\n candidateSegment.b,\n otherSegment.a,\n otherSegment.b,\n EPS_LOCAL2\n )) {\n return false;\n }\n }\n }\n }\n return true;\n }, \"candidateIsSafe\");\n const shiftedCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const points = dedupeConsecutivePoints(segment.edge.points ?? []);\n if (points.length < 4 || segment.index >= points.length - 1) {\n return void 0;\n }\n const candidate = points.map((p) => ({ ...p }));\n if (segment.horizontal) {\n candidate[segment.index].y += shift;\n candidate[segment.index + 1].y += shift;\n } else if (segment.vertical) {\n candidate[segment.index].x += shift;\n candidate[segment.index + 1].x += shift;\n } else {\n return void 0;\n }\n return segmentsFor2(segment.edge, candidate).length === candidate.length - 1 ? candidate : void 0;\n }, \"shiftedCandidate\");\n const nodeCenter = /* @__PURE__ */ __name((node, rect) => ({\n x: node.x ?? (rect.left + rect.right) / 2,\n y: node.y ?? (rect.top + rect.bottom) / 2\n }), \"nodeCenter\");\n const sourceDetourContextFor = /* @__PURE__ */ __name((segment) => {\n const edge = segment.edge;\n const points = dedupeConsecutivePoints(edge.points ?? []);\n if (points.length !== 4 || segment.index !== 1) {\n return void 0;\n }\n const sourceNode = edge.start ? nodeByIdMap.get(edge.start) : void 0;\n const targetNode = edge.end ? nodeByIdMap.get(edge.end) : void 0;\n const sourceRect = sourceNode ? rectOfNodeBounds(sourceNode) : void 0;\n const targetRect = targetNode ? rectOfNodeBounds(targetNode) : void 0;\n const tail = points.slice(segment.index + 2);\n if (!sourceNode || !targetNode || !sourceRect || !targetRect || tail.length === 0) {\n return void 0;\n }\n return {\n sourceCenter: nodeCenter(sourceNode, sourceRect),\n targetCenter: nodeCenter(targetNode, targetRect),\n sourceRect,\n tail\n };\n }, \"sourceDetourContextFor\");\n const verticalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetBelow = targetCenter.y >= sourceCenter.y;\n const sourcePortY = targetBelow ? sourceRect.bottom : sourceRect.top;\n const stubY = sourcePortY + (targetBelow ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetBelow && segment.b.y <= stubY + EPS_LOCAL2 || !targetBelow && segment.b.y >= stubY - EPS_LOCAL2) {\n return void 0;\n }\n const railX = segment.a.x + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourceCenter.x, y: sourcePortY },\n { x: sourceCenter.x, y: stubY },\n { x: railX, y: stubY },\n { x: railX, y: segment.b.y },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"verticalSourceDetour\");\n const horizontalSourceDetour = /* @__PURE__ */ __name((segment, shift, sourceCenter, targetCenter, sourceRect, tail) => {\n const targetRight = targetCenter.x >= sourceCenter.x;\n const sourcePortX = targetRight ? sourceRect.right : sourceRect.left;\n const stubX = sourcePortX + (targetRight ? SOURCE_DETOUR_STUB : -SOURCE_DETOUR_STUB);\n if (targetRight && segment.b.x <= stubX + EPS_LOCAL2 || !targetRight && segment.b.x >= stubX - EPS_LOCAL2) {\n return void 0;\n }\n const railY = segment.a.y + shift;\n return dedupeConsecutivePoints(\n [\n { x: sourcePortX, y: sourceCenter.y },\n { x: stubX, y: sourceCenter.y },\n { x: stubX, y: railY },\n { x: segment.b.x, y: railY },\n ...tail\n ],\n EPS_LOCAL2\n );\n }, \"horizontalSourceDetour\");\n const sourceDetourCandidate = /* @__PURE__ */ __name((segment, shift) => {\n const context = sourceDetourContextFor(segment);\n if (!context) {\n return void 0;\n }\n if (segment.vertical) {\n return verticalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n if (segment.horizontal) {\n return horizontalSourceDetour(\n segment,\n shift,\n context.sourceCenter,\n context.targetCenter,\n context.sourceRect,\n context.tail\n );\n }\n return void 0;\n }, \"sourceDetourCandidate\");\n const shifts = [\n -TRACK_SHIFT,\n TRACK_SHIFT,\n -2 * TRACK_SHIFT,\n 2 * TRACK_SHIFT,\n -3 * TRACK_SHIFT,\n 3 * TRACK_SHIFT\n ];\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const segments = allSegments();\n let fixed = false;\n for (let i = 0; i < segments.length && !fixed; i++) {\n for (let j = i + 1; j < segments.length && !fixed; j++) {\n const first = segments[i];\n const second = segments[j];\n if (first.edge === second.edge || !hasCrowdedParallelTrack(first, second)) {\n continue;\n }\n const candidates = [first, second].filter((segment) => segment.interior);\n for (const segment of candidates) {\n for (const shift of shifts) {\n const direct = shiftedCandidate(segment, shift);\n if (direct && candidateIsSafe(segment.edge, direct)) {\n segment.edge.points = direct;\n fixed = true;\n break;\n }\n const detoured = sourceDetourCandidate(segment, shift);\n if (detoured && candidateIsSafe(segment.edge, detoured)) {\n segment.edge.points = detoured;\n fixed = true;\n break;\n }\n }\n if (fixed) {\n break;\n }\n }\n }\n }\n if (!fixed) {\n return;\n }\n }\n}\n__name(nudgeSharedInteriorSubpaths, \"nudgeSharedInteriorSubpaths\");\n\n// src/rendering-util/layout-algorithms/swimlanes/direction/validation.ts\nfunction segmentsIntersect(p1, p2, p3, p4) {\n const d1x = p2.x - p1.x;\n const d1y = p2.y - p1.y;\n const d2x = p4.x - p3.x;\n const d2y = p4.y - p3.y;\n const cross = d1x * d2y - d1y * d2x;\n if (Math.abs(cross) < 1e-10) {\n return false;\n }\n const dx = p3.x - p1.x;\n const dy = p3.y - p1.y;\n const t = (dx * d2y - dy * d2x) / cross;\n const u = (dx * d1y - dy * d1x) / cross;\n const eps = 0.01;\n return t > eps && t < 1 - eps && u > eps && u < 1 - eps;\n}\n__name(segmentsIntersect, \"segmentsIntersect\");\nfunction validateSwimlanesLayout(layout) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const issues = [];\n if (!edges.length || !nodes.length) {\n return issues;\n }\n const nodeRects = collectLayoutNodeRects(nodes);\n const epsilon = 1;\n const edgeSegments = [];\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const points = edge.points;\n if (!points || points.length < 2) {\n continue;\n }\n const edgeStart = edge.start;\n const edgeEnd = edge.end;\n const ownLabelId = edge.labelNodeId;\n const edgeId = edge.id ?? `${edgeStart}->${edgeEnd}`;\n for (const rect of nodeRects) {\n if (rect.nodeId === edgeStart || rect.nodeId === edgeEnd) {\n continue;\n }\n if (ownLabelId && rect.nodeId === ownLabelId) {\n continue;\n }\n for (let i = 0; i < points.length - 1; i++) {\n if (segmentBoundsOverlapRect(points[i], points[i + 1], rect, -epsilon)) {\n issues.push({\n type: \"edge-node-overlap\",\n edgeId,\n targetId: rect.nodeId,\n detail: `segment ${i} passes through node \"${rect.nodeId}\"`\n });\n break;\n }\n }\n }\n for (let i = 0; i < points.length - 1; i++) {\n edgeSegments.push({\n edgeId,\n start: edgeStart,\n end: edgeEnd,\n p1: points[i],\n p2: points[i + 1]\n });\n }\n }\n const crossingPairs = /* @__PURE__ */ new Set();\n for (let i = 0; i < edgeSegments.length; i++) {\n for (let j = i + 1; j < edgeSegments.length; j++) {\n const a = edgeSegments[i];\n const b = edgeSegments[j];\n if (a.edgeId === b.edgeId) {\n continue;\n }\n if (a.start === b.start || a.start === b.end || a.end === b.start || a.end === b.end) {\n continue;\n }\n if (segmentsIntersect(a.p1, a.p2, b.p1, b.p2)) {\n const pairKey2 = a.edgeId < b.edgeId ? `${a.edgeId}|${b.edgeId}` : `${b.edgeId}|${a.edgeId}`;\n if (!crossingPairs.has(pairKey2)) {\n crossingPairs.add(pairKey2);\n issues.push({\n type: \"edge-edge-crossing\",\n edgeId: a.edgeId,\n targetId: b.edgeId,\n detail: `edges \"${a.edgeId}\" and \"${b.edgeId}\" cross`\n });\n }\n }\n }\n }\n if (issues.length > 0) {\n const overlaps = issues.filter((i) => i.type === \"edge-node-overlap\").length;\n const crossings = issues.filter((i) => i.type === \"edge-edge-crossing\").length;\n log.warn(\n `[SWIMLANE_VALIDATE] ${issues.length} issue(s) detected: ${overlaps} edge-node overlap(s), ${crossings} edge crossing(s)`\n );\n for (const issue of issues) {\n log.warn(`[SWIMLANE_VALIDATE] ${issue.type}: ${issue.detail}`);\n }\n }\n return issues;\n}\n__name(validateSwimlanesLayout, \"validateSwimlanesLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/postProcessing.ts\nfunction postProcessSwimlaneLayout(layout, direction) {\n const nodes = layout.nodes ?? [];\n const edges = layout.edges ?? [];\n const contentNodes = nodes.filter((n) => !n.isGroup);\n if ((direction === \"LR\" || direction === \"RL\") && contentNodes.length > 0 && !applyLrDirectionTransform(layout, direction)) {\n return;\n }\n if (direction === \"BT\" && contentNodes.length > 0 && !applyBtDirectionTransform(layout)) {\n return;\n }\n for (const edge of edges) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n edge.points = simplifyPolyline(\n orthogonalizePolyline(pts)\n );\n }\n simplifyDetouredEdges(edges, nodes);\n straightenCollinearSiblingDetours(edges, nodes);\n portSwapToLShape(edges, nodes);\n const nodeByIdMap = /* @__PURE__ */ new Map();\n for (const n of nodes) {\n nodeByIdMap.set(String(n.id), n);\n }\n anchorLabelsToPolyline(edges, nodeByIdMap);\n clipEdgeEndpointsToNodeBoundaries(edges, nodeByIdMap);\n collapseShortTerminalStub(edges, nodeByIdMap);\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n separateSharedRenderedTerminalLanes(edges, nodeByIdMap);\n collapseRedundantRectangularDoglegs(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n swapDestinationTerminalTailsToReduceCrossings(edges, nodeByIdMap);\n const finalizeRenderedEdges = /* @__PURE__ */ __name(() => {\n resolveRenderedOrthogonalCrossings(edges, nodeByIdMap);\n reassignCrossingExternalRailChannels(edges, nodeByIdMap);\n shortcutRedundantOrthogonalJogs(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n liftObstacleHuggingSameSideRails(edges, nodeByIdMap);\n anchorLabelsToPolyline(edges, nodeByIdMap);\n prepareEdgeEndpointsForRenderer(edges, nodeByIdMap);\n }, \"finalizeRenderedEdges\");\n finalizeRenderedEdges();\n nudgeSharedInteriorSubpaths(edges, nodeByIdMap);\n finalizeRenderedEdges();\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n liftTopLaneTitleBandsAboveRails(edges, nodeByIdMap);\n shiftLeftLaneTitleBandsLeftOfRails(edges, nodeByIdMap);\n}\n__name(postProcessSwimlaneLayout, \"postProcessSwimlaneLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase0.helpers.ts\nfunction normalizeGraph(g) {\n const nodeById = new Map(g.nodeById);\n const seen = /* @__PURE__ */ new Set();\n const edges = [];\n for (const e of g.edges) {\n if (!nodeById.has(e.src) || !nodeById.has(e.dst)) {\n continue;\n }\n const key = `${e.id}:${e.src}->${e.dst}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n edges.push(e);\n }\n const nodes = [...nodeById.keys()];\n return { nodes, edges, layout: g.layout, nodeById };\n}\n__name(normalizeGraph, \"normalizeGraph\");\nfunction incoming(g, v) {\n return g.edges.filter((e) => e.dst === v);\n}\n__name(incoming, \"incoming\");\nfunction buildSuccessorMap(g) {\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n succs.set(v, []);\n }\n for (const e of g.edges) {\n succs.get(e.src).push(e.dst);\n }\n return succs;\n}\n__name(buildSuccessorMap, \"buildSuccessorMap\");\nfunction buildSortedSuccessorMap(g) {\n const succs = buildSuccessorMap(g);\n for (const successors of succs.values()) {\n successors.sort((a, b) => a.localeCompare(b));\n }\n return succs;\n}\n__name(buildSortedSuccessorMap, \"buildSortedSuccessorMap\");\nfunction buildInDegreeMap(g) {\n const indeg = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n indeg.set(v, 0);\n }\n for (const e of g.edges) {\n indeg.set(e.dst, (indeg.get(e.dst) ?? 0) + 1);\n }\n return indeg;\n}\n__name(buildInDegreeMap, \"buildInDegreeMap\");\nfunction sortedZeroInDegreeNodes(indeg) {\n return [...indeg.entries()].filter(([, degree]) => degree === 0).map(([id]) => id).sort((a, b) => a.localeCompare(b));\n}\n__name(sortedZeroInDegreeNodes, \"sortedZeroInDegreeNodes\");\nfunction buildPredecessorSuccessorMaps(g, includeEdge = () => true) {\n const preds = /* @__PURE__ */ new Map();\n const succs = /* @__PURE__ */ new Map();\n for (const v of g.nodes) {\n preds.set(v, []);\n succs.set(v, []);\n }\n for (const e of g.edges) {\n if (!includeEdge(e)) {\n continue;\n }\n succs.get(e.src).push(e.dst);\n preds.get(e.dst).push(e.src);\n }\n return { preds, succs };\n}\n__name(buildPredecessorSuccessorMaps, \"buildPredecessorSuccessorMaps\");\nfunction buildLayersFromRanks(g, order, rankOf, opts) {\n let maxRank = 0;\n for (const v of g.nodes) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n maxRank = Math.max(maxRank, rankOf[v] ?? 0);\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n for (const v of order) {\n if (opts?.skipGroups && g.nodeById.get(v)?.isGroup) {\n continue;\n }\n layers[Math.max(0, rankOf[v] ?? 0)].push(v);\n }\n return layers;\n}\n__name(buildLayersFromRanks, \"buildLayersFromRanks\");\nfunction topoSortIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const queue = sortedZeroInDegreeNodes(indeg);\n const order = [];\n const adj = buildSortedSuccessorMap(g);\n while (queue.length) {\n const u = queue.shift();\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n let i = 0;\n while (i < queue.length && queue[i] < v) {\n i++;\n }\n queue.splice(i, 0, v);\n }\n }\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortIfAcyclic, \"topoSortIfAcyclic\");\nfunction buildLayerIndex(layer) {\n const m = /* @__PURE__ */ new Map();\n let index = 0;\n for (const id of layer) {\n m.set(id, index);\n index++;\n }\n return m;\n}\n__name(buildLayerIndex, \"buildLayerIndex\");\nfunction countInversions(values) {\n const tmp = new Array(values.length);\n const count = /* @__PURE__ */ __name((left, right) => {\n if (right - left <= 1) {\n return 0;\n }\n const mid = left + right >> 1;\n let inversions = count(left, mid) + count(mid, right);\n let i = left;\n let j = mid;\n let k = left;\n while (i < mid || j < right) {\n if (j >= right || i < mid && values[i] <= values[j]) {\n tmp[k++] = values[i++];\n } else {\n tmp[k++] = values[j++];\n inversions += mid - i;\n }\n }\n for (let t = left; t < right; t++) {\n values[t] = tmp[t];\n }\n return inversions;\n }, \"count\");\n return count(0, values.length);\n}\n__name(countInversions, \"countInversions\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase1.cycles.ts\nfunction removeCycles_DFS(g) {\n const gn = normalizeGraph(g);\n const adj = /* @__PURE__ */ new Map();\n for (const v of gn.nodes) {\n adj.set(v, []);\n }\n for (const e of gn.edges) {\n adj.get(e.src).push(e);\n }\n for (const arr of adj.values()) {\n arr.sort((a, b) => a.dst === b.dst ? a.id.localeCompare(b.id) : a.dst.localeCompare(b.dst));\n }\n const color = /* @__PURE__ */ Object.create(null);\n for (const v of gn.nodes) {\n color[v] = 0;\n }\n const reversed = [];\n const dfs = /* @__PURE__ */ __name((u) => {\n color[u] = 1;\n for (const e of adj.get(u) ?? []) {\n const v = e.dst;\n if (color[v] === 0) {\n dfs(v);\n } else if (color[v] === 1) {\n reversed.push(e);\n }\n }\n color[u] = 2;\n }, \"dfs\");\n const nodesSorted = [...gn.nodes].sort((a, b) => a.localeCompare(b));\n for (const v of nodesSorted) {\n if (color[v] === 0) {\n dfs(v);\n }\n }\n const toReverse = new Set(reversed.map((e) => `${e.id}:${e.src}->${e.dst}`));\n const acycEdges = gn.edges.map(\n (e) => toReverse.has(`${e.id}:${e.src}->${e.dst}`) ? { id: e.id, src: e.dst, dst: e.src, weight: e.weight, ref: e.ref } : e\n );\n const acyclic = {\n nodes: [...gn.nodes],\n edges: acycEdges,\n layout: gn.layout,\n nodeById: new Map(gn.nodeById)\n };\n return { acyclic, reversed };\n}\n__name(removeCycles_DFS, \"removeCycles_DFS\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.options.ts\nfunction buildTopLaneMap(g) {\n const cache = /* @__PURE__ */ new Map();\n const resolve = /* @__PURE__ */ __name((id) => {\n if (cache.has(id)) {\n return cache.get(id);\n }\n const node = g.nodeById.get(id);\n if (!node) {\n cache.set(id, null);\n return null;\n }\n const parentId = node.parentId;\n if (!parentId) {\n cache.set(id, null);\n return null;\n }\n const parentLane = resolve(parentId);\n const lane = parentLane ?? parentId;\n cache.set(id, lane);\n return lane;\n }, \"resolve\");\n for (const id of g.nodes) {\n resolve(id);\n }\n return cache;\n}\n__name(buildTopLaneMap, \"buildTopLaneMap\");\nfunction createTopLaneResolver(g) {\n const topLaneMap = buildTopLaneMap(g);\n return (id) => topLaneMap.get(id) ?? null;\n}\n__name(createTopLaneResolver, \"createTopLaneResolver\");\nfunction buildTopLaneOrder(g) {\n const lanes = [];\n for (const node of g.layout.nodes ?? []) {\n if (node.isGroup && !node.parentId) {\n lanes.push(node.id);\n }\n }\n return [...new Set(lanes)].reverse();\n}\n__name(buildTopLaneOrder, \"buildTopLaneOrder\");\nfunction resolveTopLaneOrder(g, preferredOrder) {\n const sourceOrder = buildTopLaneOrder(g);\n if (!preferredOrder || preferredOrder.length === 0) {\n return sourceOrder;\n }\n const sourceLaneIds = new Set(sourceOrder);\n const seen = /* @__PURE__ */ new Set();\n const resolved = [];\n for (const laneId of preferredOrder) {\n if (!sourceLaneIds.has(laneId) || seen.has(laneId)) {\n continue;\n }\n seen.add(laneId);\n resolved.push(laneId);\n }\n for (const laneId of sourceOrder) {\n if (seen.has(laneId)) {\n continue;\n }\n resolved.push(laneId);\n }\n return resolved;\n}\n__name(resolveTopLaneOrder, \"resolveTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/config.ts\nvar PRECISION = {\n /** Epsilon for floating-point comparisons */\n EPSILON: 1e-6\n};\nvar LAYERING = {\n /** Default number of iterations for gravity-based layering */\n GRAVITY_ITERATIONS: 8,\n /** Maximum number of passes for crossing-based rank optimization */\n MAX_CROSSING_OPTIMIZATION_PASSES: 4,\n /** Whether to compact single-input nodes by default */\n DEFAULT_COMPACT_SINGLE_INPUT: true\n};\nvar COORDINATES = {\n /** Default vertical gap between layers (px) */\n DEFAULT_LAYER_GAP: 100,\n /** Default horizontal gap between nodes (px) */\n DEFAULT_NODE_GAP: 40\n};\n\n// src/rendering-util/layout-algorithms/swimlanes/driving-tree.ts\nfunction buildDrivingTree(graph, opts) {\n const g = normalizeGraph(graph);\n const laneOf = opts?.laneOf ?? (() => null);\n const rankHint = opts?.rankHint;\n const { preds } = buildPredecessorSuccessorMaps(g);\n for (const arr of preds.values()) {\n arr.sort((a, b) => a.localeCompare(b));\n }\n const topoOrder = topoSortIfAcyclic(g) ?? [...g.nodes].sort((a, b) => a.localeCompare(b));\n const topoIndex = /* @__PURE__ */ new Map();\n for (const [idx, id] of topoOrder.entries()) {\n topoIndex.set(id, idx);\n }\n const parent = /* @__PURE__ */ new Map();\n const children = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n children.set(node, []);\n }\n for (const node of topoOrder) {\n const candidates = (preds.get(node) ?? []).filter((p) => parent.has(p));\n if (candidates.length > 0) {\n const chosen = chooseParent(node, candidates, {\n laneOf,\n rankHint,\n topoIndex\n });\n parent.set(node, chosen);\n children.get(chosen).push(node);\n } else if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n for (const node of g.nodes) {\n if (!parent.has(node)) {\n parent.set(node, null);\n }\n }\n const rootSet = /* @__PURE__ */ new Set();\n for (const node of g.nodes) {\n if ((parent.get(node) ?? null) === null) {\n rootSet.add(node);\n }\n }\n const roots = [...rootSet].sort((a, b) => {\n const ta = topoIndex.get(a) ?? 0;\n const tb = topoIndex.get(b) ?? 0;\n if (ta === tb) {\n return a.localeCompare(b);\n }\n return ta - tb;\n });\n const adjacency = buildAdjacency(g);\n const adjacencyList = /* @__PURE__ */ new Map();\n for (const [node, set] of adjacency.entries()) {\n adjacencyList.set(\n node,\n [...set].sort((a, b) => a.localeCompare(b))\n );\n }\n const componentOf = assignComponents(adjacencyList);\n const blocks = computeBlocks(adjacencyList);\n const nodeBlocks = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n nodeBlocks.set(node, []);\n }\n for (const block of blocks) {\n for (const node of block.nodes) {\n const list = nodeBlocks.get(node);\n if (list) {\n list.push(block.id);\n } else {\n nodeBlocks.set(node, [block.id]);\n }\n }\n }\n const preorder = [];\n const postorder = [];\n const seen = /* @__PURE__ */ new Set();\n const walk = /* @__PURE__ */ __name((node) => {\n if (seen.has(node)) {\n return;\n }\n seen.add(node);\n preorder.push(node);\n for (const child of children.get(node) ?? []) {\n walk(child);\n }\n postorder.push(node);\n }, \"walk\");\n for (const root of roots) {\n walk(root);\n }\n for (const node of topoOrder) {\n walk(node);\n }\n return {\n parent,\n children,\n roots,\n componentOf,\n blocks,\n nodeBlocks,\n adjacency: adjacencyList,\n preorder,\n postorder,\n topologicalOrder: topoOrder\n };\n}\n__name(buildDrivingTree, \"buildDrivingTree\");\nfunction chooseParent(node, candidates, ctx) {\n const laneNode = ctx.laneOf(node);\n const sorted = [...candidates].sort((a, b) => {\n const laneA = ctx.laneOf(a);\n const laneB = ctx.laneOf(b);\n const sameLaneA = laneA != null && laneA === laneNode;\n const sameLaneB = laneB != null && laneB === laneNode;\n if (sameLaneA !== sameLaneB) {\n return sameLaneA ? -1 : 1;\n }\n const rankA = ctx.rankHint?.[a];\n const rankB = ctx.rankHint?.[b];\n if (rankA != null && rankB != null && rankA !== rankB) {\n return rankB - rankA;\n }\n const idxA = ctx.topoIndex.get(a) ?? 0;\n const idxB = ctx.topoIndex.get(b) ?? 0;\n if (idxA !== idxB) {\n return idxA - idxB;\n }\n return a.localeCompare(b);\n });\n return sorted[0];\n}\n__name(chooseParent, \"chooseParent\");\nfunction buildAdjacency(g) {\n const adjacency = /* @__PURE__ */ new Map();\n for (const node of g.nodes) {\n adjacency.set(node, /* @__PURE__ */ new Set());\n }\n for (const e of g.edges) {\n adjacency.get(e.src).add(e.dst);\n adjacency.get(e.dst).add(e.src);\n }\n return adjacency;\n}\n__name(buildAdjacency, \"buildAdjacency\");\nfunction assignComponents(adjacency) {\n const componentOf = /* @__PURE__ */ new Map();\n let componentId = 0;\n for (const node of adjacency.keys()) {\n if (componentOf.has(node)) {\n continue;\n }\n const stack = [node];\n while (stack.length > 0) {\n const cur = stack.pop();\n if (componentOf.has(cur)) {\n continue;\n }\n componentOf.set(cur, componentId);\n for (const next of adjacency.get(cur) ?? []) {\n if (!componentOf.has(next)) {\n stack.push(next);\n }\n }\n }\n componentId++;\n }\n return componentOf;\n}\n__name(assignComponents, \"assignComponents\");\nfunction computeBlocks(adjacency) {\n const discovery = /* @__PURE__ */ new Map();\n const low = /* @__PURE__ */ new Map();\n const edgeStack = [];\n const blocks = [];\n let time = 0;\n const visit = /* @__PURE__ */ __name((node, parent) => {\n discovery.set(node, ++time);\n low.set(node, time);\n for (const next of adjacency.get(node) ?? []) {\n if (next === parent) {\n continue;\n }\n if (!discovery.has(next)) {\n edgeStack.push([node, next]);\n visit(next, node);\n low.set(node, Math.min(low.get(node) ?? time, low.get(next) ?? time));\n if ((low.get(next) ?? 0) >= (discovery.get(node) ?? 0)) {\n blocks.push(popBlock(node, next, edgeStack, blocks.length));\n }\n } else if ((discovery.get(next) ?? 0) < (discovery.get(node) ?? 0)) {\n edgeStack.push([node, next]);\n low.set(node, Math.min(low.get(node) ?? time, discovery.get(next) ?? time));\n }\n }\n }, \"visit\");\n for (const node of adjacency.keys()) {\n if (!discovery.has(node)) {\n visit(node, null);\n }\n }\n return blocks;\n}\n__name(computeBlocks, \"computeBlocks\");\nfunction popBlock(u, v, stack, id) {\n const edges = [];\n const nodes = /* @__PURE__ */ new Set();\n while (stack.length > 0) {\n const edge = stack.pop();\n edges.push(edge);\n nodes.add(edge[0]);\n nodes.add(edge[1]);\n if (edge[0] === u && edge[1] === v || edge[0] === v && edge[1] === u) {\n break;\n }\n }\n return { id, edges, nodes: [...nodes] };\n}\n__name(popBlock, \"popBlock\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossCounts.ts\nfunction computeSubtreeCrossCounts(g, rankOf, tree) {\n const nodes = [...g.nodes];\n const indexOf = /* @__PURE__ */ new Map();\n for (const [i, node] of nodes.entries()) {\n indexOf.set(node, i);\n }\n const n = nodes.length;\n const parentIdx = new Array(n).fill(-1);\n const depth = new Array(n).fill(0);\n const queue = [];\n const seen = /* @__PURE__ */ new Set();\n for (const node of nodes) {\n const parentId = tree.parent.get(node) ?? null;\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n if (parentId == null) {\n parentIdx[idx] = -1;\n depth[idx] = 0;\n if (!seen.has(node)) {\n seen.add(node);\n queue.push(node);\n }\n }\n }\n while (queue.length > 0) {\n const current = queue.shift();\n const currentIdx = indexOf.get(current);\n if (currentIdx == null) {\n continue;\n }\n const childList = tree.children.get(current) ?? [];\n for (const child of childList) {\n if (seen.has(child)) {\n continue;\n }\n const childIdx = indexOf.get(child);\n if (childIdx == null) {\n continue;\n }\n parentIdx[childIdx] = currentIdx;\n depth[childIdx] = depth[currentIdx] + 1;\n seen.add(child);\n queue.push(child);\n }\n }\n for (const node of nodes) {\n if (seen.has(node)) {\n continue;\n }\n const idx = indexOf.get(node);\n if (idx == null) {\n continue;\n }\n parentIdx[idx] = -1;\n depth[idx] = 0;\n seen.add(node);\n }\n const maxLog = Math.max(1, Math.ceil(Math.log2(Math.max(1, n))) + 1);\n const up = Array.from({ length: maxLog }, () => new Array(n).fill(-1));\n for (let i = 0; i < n; i++) {\n up[0][i] = parentIdx[i];\n }\n for (let k = 1; k < maxLog; k++) {\n for (let i = 0; i < n; i++) {\n const prev = up[k - 1][i];\n up[k][i] = prev === -1 ? -1 : up[k - 1][prev];\n }\n }\n const lcaIndex = /* @__PURE__ */ __name((aIdx, bIdx) => {\n if (aIdx === -1 || bIdx === -1) {\n return -1;\n }\n if (depth[aIdx] < depth[bIdx]) {\n [aIdx, bIdx] = [bIdx, aIdx];\n }\n const diff = depth[aIdx] - depth[bIdx];\n for (let k = 0; k < maxLog; k++) {\n if (diff >> k & 1) {\n aIdx = up[k][aIdx];\n if (aIdx === -1) {\n return -1;\n }\n }\n }\n if (aIdx === bIdx) {\n return aIdx;\n }\n for (let k = maxLog - 1; k >= 0; k--) {\n const upA = up[k][aIdx];\n const upB = up[k][bIdx];\n if (upA === -1 || upB === -1) {\n continue;\n }\n if (upA !== upB) {\n aIdx = upA;\n bIdx = upB;\n }\n }\n return up[0][aIdx];\n }, \"lcaIndex\");\n const ownCounts = Array.from({ length: n }, () => /* @__PURE__ */ new Map());\n for (const edge of g.edges) {\n let src = edge.src;\n let dst = edge.dst;\n let ru = rankOf[src];\n let rv = rankOf[dst];\n if (ru == null || rv == null) {\n continue;\n }\n if (ru > rv) {\n [src, dst] = [dst, src];\n [ru, rv] = [rv, ru];\n }\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n const upperIdx = indexOf.get(src);\n const lowerIdx = indexOf.get(dst);\n if (upperIdx == null || lowerIdx == null) {\n continue;\n }\n const lca = lcaIndex(upperIdx, lowerIdx);\n if (lca === -1) {\n continue;\n }\n const bucket = ownCounts[lca];\n for (let layer = ru; layer < rv; layer++) {\n bucket.set(layer, (bucket.get(layer) ?? 0) + 1);\n }\n }\n const crossCounts = /* @__PURE__ */ new Map();\n const mergeInto = /* @__PURE__ */ __name((target, source) => {\n if (source.size === 0) {\n return;\n }\n for (const [layer, value] of source) {\n target.set(layer, (target.get(layer) ?? 0) + value);\n }\n }, \"mergeInto\");\n const visited = /* @__PURE__ */ new Set();\n const dfs = /* @__PURE__ */ __name((node) => {\n const idx = indexOf.get(node);\n visited.add(node);\n const base = idx == null ? void 0 : ownCounts[idx];\n const accumulator = base ? new Map(base) : /* @__PURE__ */ new Map();\n const childList = tree.children.get(node) ?? [];\n for (const child of childList) {\n const childMap = dfs(child);\n const parentLayer = rankOf[node];\n if (parentLayer != null) {\n let map = crossCounts.get(node);\n if (!map) {\n map = /* @__PURE__ */ new Map();\n crossCounts.set(node, map);\n }\n let value = childMap.get(parentLayer) ?? 0;\n const childLayer = rankOf[child];\n if (childLayer != null && childLayer > parentLayer) {\n value += 1;\n }\n map.set(child, value);\n }\n mergeInto(accumulator, childMap);\n }\n return accumulator;\n }, \"dfs\");\n for (const root of tree.roots) {\n if (!visited.has(root)) {\n dfs(root);\n }\n }\n for (const node of nodes) {\n if (!visited.has(node)) {\n dfs(node);\n }\n }\n return crossCounts;\n}\n__name(computeSubtreeCrossCounts, \"computeSubtreeCrossCounts\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.core.ts\nfunction annotateMinimumLayers(nodes, children, rankOf) {\n const minLayer = /* @__PURE__ */ new Map();\n const annotate = /* @__PURE__ */ __name((node) => {\n let minL = rankOf[node] ?? 0;\n const childList = [...children.get(node) ?? []];\n childList.sort(compareByRankThenId(rankOf));\n for (const child of childList) {\n annotate(child);\n const childMin = minLayer.get(child);\n if (childMin != null) {\n minL = Math.min(minL, childMin);\n }\n }\n minLayer.set(node, minL);\n }, \"annotate\");\n for (const node of nodes) {\n annotate(node);\n }\n return minLayer;\n}\n__name(annotateMinimumLayers, \"annotateMinimumLayers\");\nfunction compareByRankThenId(rankOf) {\n return (a, b) => {\n const ra = rankOf[a] ?? 0;\n const rb = rankOf[b] ?? 0;\n return ra === rb ? a.localeCompare(b) : ra - rb;\n };\n}\n__name(compareByRankThenId, \"compareByRankThenId\");\nfunction emitNodesInTreeOrder(roots, allNodes, rankOf, orderChildren) {\n let maxRank = 0;\n for (const node of allNodes) {\n const r = rankOf[node] ?? 0;\n if (r > maxRank) {\n maxRank = r;\n }\n }\n const layers = Array.from({ length: maxRank + 1 }, () => []);\n const emitted = /* @__PURE__ */ new Set();\n const emit = /* @__PURE__ */ __name((node) => {\n if (emitted.has(node)) {\n return;\n }\n emitted.add(node);\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n for (const child of orderChildren(node)) {\n emit(child);\n }\n }, \"emit\");\n for (const root of roots) {\n emit(root);\n }\n for (const node of allNodes) {\n if (!emitted.has(node)) {\n const layer = rankOf[node] ?? 0;\n if (!layers[layer]) {\n layers[layer] = [];\n }\n layers[layer].push(node);\n emitted.add(node);\n }\n }\n return layers;\n}\n__name(emitNodesInTreeOrder, \"emitNodesInTreeOrder\");\nfunction deduplicateLayers(layers) {\n const result = [];\n for (const layer of layers) {\n const seen = /* @__PURE__ */ new Set();\n const deduped = [];\n for (const id of layer) {\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(id);\n }\n result.push(deduped);\n }\n return result;\n}\n__name(deduplicateLayers, \"deduplicateLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.multitree.order.ts\nfunction createChildOrderer(children, rankOf, crossCounts, minLayer) {\n return (node) => {\n const raw = children.get(node) ?? [];\n if (raw.length === 0) {\n return [];\n }\n const layer = rankOf[node] ?? 0;\n const future = [];\n const present = [];\n const crossMap = crossCounts.get(node);\n for (const child of raw) {\n const minL = minLayer.get(child) ?? layer;\n if (minL > layer) {\n future.push({ child, min: minL });\n } else {\n present.push(child);\n }\n }\n future.sort((a, b) => {\n if (a.min === b.min) {\n return a.child.localeCompare(b.child);\n }\n return a.min - b.min;\n });\n present.sort((a, b) => {\n const ca = crossMap?.get(a) ?? 0;\n const cb = crossMap?.get(b) ?? 0;\n if (ca !== cb) {\n return ca - cb;\n }\n const ma = minLayer.get(a) ?? layer;\n const mb = minLayer.get(b) ?? layer;\n if (ma !== mb) {\n return ma - mb;\n }\n return a.localeCompare(b);\n });\n return [...future.map((item) => item.child), ...present];\n };\n}\n__name(createChildOrderer, \"createChildOrderer\");\nfunction buildMultitreeLayerOrder(g, rankOf, laneOf) {\n const tree = buildDrivingTree(g, {\n rankHint: rankOf,\n laneOf\n });\n const { children, roots } = tree;\n for (const node of g.nodes) {\n if (!children.has(node)) {\n children.set(node, []);\n }\n }\n const crossCounts = computeSubtreeCrossCounts(g, rankOf, tree);\n const rootsSorted = [...roots].sort(compareByRankThenId(rankOf));\n const minLayer = annotateMinimumLayers(rootsSorted, children, rankOf);\n const orderChildren = createChildOrderer(children, rankOf, crossCounts, minLayer);\n let layers = emitNodesInTreeOrder(rootsSorted, g.nodes, rankOf, orderChildren);\n layers = deduplicateLayers(layers);\n return layers;\n}\n__name(buildMultitreeLayerOrder, \"buildMultitreeLayerOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossOptimization.ts\nfunction countCrossingsBetweenAdjacent(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const li = buildLayerIndex(lower);\n const vs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n vs.push(li.get(e.dst));\n }\n }\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent, \"countCrossingsBetweenAdjacent\");\nfunction totalCrossings(layers, edges, rankOf) {\n const expanded = [];\n for (const e of edges) {\n const ru = rankOf[e.src];\n const rv = rankOf[e.dst];\n if (ru == null || rv == null || ru === rv) {\n continue;\n }\n let upper = e.src;\n let lower = e.dst;\n let rUpper = ru;\n let rLower = rv;\n if (ru > rv) {\n upper = e.dst;\n lower = e.src;\n rUpper = rv;\n rLower = ru;\n }\n for (let L = rUpper; L < rLower; L++) {\n expanded.push({ id: `${e.id}@${L}`, src: upper, dst: lower, ref: e.ref });\n }\n }\n let sum = 0;\n for (let i = 0; i + 1 < layers.length; i++) {\n sum += countCrossingsBetweenAdjacent(layers[i], layers[i + 1], expanded);\n }\n return sum;\n}\n__name(totalCrossings, \"totalCrossings\");\nfunction optimizeRanksByCrossings(g, initialRank) {\n const rankOf = { ...initialRank };\n const { preds } = buildPredecessorSuccessorMaps(g);\n const laneOf = createTopLaneResolver(g);\n const layers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n let best = totalCrossings(layers, g.edges, rankOf);\n const maxPasses = LAYERING.MAX_CROSSING_OPTIMIZATION_PASSES;\n for (let pass = 0; pass < maxPasses; pass++) {\n let changed = false;\n const nodesByRank = [...g.nodes].sort((a, b) => (rankOf[b] ?? 0) - (rankOf[a] ?? 0));\n for (const v of nodesByRank) {\n const r = rankOf[v] ?? 0;\n if (r === 0) {\n continue;\n }\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if (lb >= r) {\n continue;\n }\n const old = r;\n rankOf[v] = lb;\n const trialLayers = buildMultitreeLayerOrder(g, rankOf, laneOf);\n const score = totalCrossings(trialLayers, g.edges, rankOf);\n if (score < best) {\n best = score;\n changed = true;\n } else {\n rankOf[v] = old;\n }\n }\n if (!changed) {\n break;\n }\n }\n return rankOf;\n}\n__name(optimizeRanksByCrossings, \"optimizeRanksByCrossings\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.crossLaneAdjust.ts\nfunction adjustCrossLaneSources(g, rankOf) {\n const topLaneOf = createTopLaneResolver(g);\n const nodesByRank = [...g.nodes].sort(\n (a, b) => (rankOf[a] ?? 0) - (rankOf[b] ?? 0) || a.localeCompare(b)\n );\n for (const v of nodesByRank) {\n const laneV = topLaneOf(v);\n if (!laneV) {\n continue;\n }\n const outEdges = g.edges.filter((e) => e.src === v);\n if (outEdges.length === 0) {\n continue;\n }\n let hasSameLaneSucc = false;\n let crossLaneCount = 0;\n for (const e of outEdges) {\n const laneDst = topLaneOf(e.dst);\n if (laneDst == null || laneDst === laneV) {\n hasSameLaneSucc = true;\n } else {\n crossLaneCount++;\n }\n }\n if (crossLaneCount === 0 || hasSameLaneSucc) {\n continue;\n }\n let crossLaneIncoming = 0;\n let hasSameLanePred = false;\n for (const e of g.edges) {\n if (e.dst !== v) {\n continue;\n }\n const laneSrc = topLaneOf(e.src);\n if (!laneSrc) {\n continue;\n }\n if (laneSrc === laneV) {\n hasSameLanePred = true;\n } else {\n crossLaneIncoming++;\n }\n }\n if (crossLaneIncoming > 0 || !hasSameLanePred) {\n continue;\n }\n const current = rankOf[v] ?? 0;\n const target = current + crossLaneCount;\n let lb = 0;\n for (const e of g.edges) {\n if (e.dst === v) {\n lb = Math.max(lb, (rankOf[e.src] ?? 0) + 1);\n }\n }\n const newRank = Math.max(current, lb, target);\n if (newRank !== current) {\n rankOf[v] = newRank;\n }\n }\n}\n__name(adjustCrossLaneSources, \"adjustCrossLaneSources\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.longestPath.ts\nfunction assignLayers_LongestPath(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const compact = opts?.compactSingleInput ?? false;\n const topLaneOf = createTopLaneResolver(g);\n let rankOf = /* @__PURE__ */ Object.create(null);\n for (const v of order) {\n const incAll = incoming(g, v);\n const inc = opts?.ignoreCrossLaneEdges ? incAll.filter((e) => {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(v);\n if (!laneSrc || !laneDst) {\n return true;\n }\n return laneSrc === laneDst;\n }) : incAll;\n if (inc.length === 0) {\n rankOf[v] = 0;\n } else if (compact && inc.length === 1) {\n const u = inc[0].src;\n const laneU = topLaneOf(u);\n const laneV = topLaneOf(v);\n if (laneU !== laneV) {\n rankOf[v] = rankOf[u] ?? 0;\n } else {\n rankOf[v] = (rankOf[u] ?? 0) + 1;\n }\n } else {\n let mx = -Infinity;\n for (const e of inc) {\n mx = Math.max(mx, (rankOf[e.src] ?? 0) + 1);\n }\n rankOf[v] = mx === -Infinity ? 0 : mx;\n }\n }\n if (opts?.optimizeRanksByCrossings ?? false) {\n rankOf = optimizeRanksByCrossings(g, rankOf);\n }\n if (opts?.ignoreCrossLaneEdges) {\n adjustCrossLaneSources(g, rankOf);\n }\n const layers = buildMultitreeLayerOrder(g, rankOf, topLaneOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LongestPath, \"assignLayers_LongestPath\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.gravity.ts\nfunction assignLayers_Gravity(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const base = assignLayers_LongestPath(g, {\n compactSingleInput: opts?.compactSingleInput,\n ignoreCrossLaneEdges: opts?.ignoreCrossLaneEdges,\n optimizeRanksByCrossings: opts?.optimizeRanksByCrossings\n });\n const rankOf = { ...base.rankOf };\n const topLaneOf = createTopLaneResolver(g);\n const { preds, succs } = buildPredecessorSuccessorMaps(g, (e) => {\n if (opts?.ignoreCrossLaneEdges) {\n const laneSrc = topLaneOf(e.src);\n const laneDst = topLaneOf(e.dst);\n if (laneSrc && laneDst && laneSrc !== laneDst) {\n return false;\n }\n }\n return true;\n });\n const order = topoSortIfAcyclic(g) ?? [...g.nodes];\n const revOrder = [...order].reverse();\n const clampFeasible = /* @__PURE__ */ __name((v, desired) => {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n let ub = Number.POSITIVE_INFINITY;\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n }\n if (!Number.isFinite(ub)) {\n ub = Math.max(lb, desired);\n }\n return Math.min(Math.max(desired, lb), ub);\n }, \"clampFeasible\");\n const iters = LAYERING.GRAVITY_ITERATIONS;\n const relaxOrder = /* @__PURE__ */ __name((nodeOrder) => {\n let changed = false;\n for (const v of nodeOrder) {\n const ps = preds.get(v) ?? [];\n const ss = succs.get(v) ?? [];\n if (ps.length === 0 && ss.length === 0) {\n continue;\n }\n const predAvg = ps.length > 0 ? ps.reduce((a, u) => a + (rankOf[u] ?? 0) + 1, 0) / ps.length : rankOf[v] ?? 0;\n const succAvg = ss.length > 0 ? ss.reduce((a, w) => a + (rankOf[w] ?? 0) - 1, 0) / ss.length : rankOf[v] ?? 0;\n const desired = Math.round((predAvg + succAvg) / 2);\n const clamped = clampFeasible(v, desired);\n if (clamped !== rankOf[v]) {\n rankOf[v] = clamped;\n changed = true;\n }\n }\n return changed;\n }, \"relaxOrder\");\n for (let it = 0; it < iters; it++) {\n const forwardChanged = relaxOrder(order);\n const backwardChanged = relaxOrder(revOrder);\n if (!forwardChanged && !backwardChanged) {\n break;\n }\n }\n for (const v of order) {\n let lb = 0;\n for (const u of preds.get(v) ?? []) {\n lb = Math.max(lb, (rankOf[u] ?? 0) + 1);\n }\n if ((rankOf[v] ?? 0) < lb) {\n rankOf[v] = lb;\n }\n }\n for (const v of revOrder) {\n const s = succs.get(v) ?? [];\n if (s.length > 0) {\n const ub = Math.min(...s.map((w) => (rankOf[w] ?? 0) - 1));\n if ((rankOf[v] ?? 0) > ub) {\n rankOf[v] = ub;\n }\n }\n }\n const layers = buildLayersFromRanks(g, order, rankOf);\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_Gravity, \"assignLayers_Gravity\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.laneAwareCompact.ts\nfunction topoSortByGenerationIfAcyclic(g) {\n const indeg = buildInDegreeMap(g);\n const adj = buildSortedSuccessorMap(g);\n let frontier = sortedZeroInDegreeNodes(indeg);\n const order = [];\n while (frontier.length > 0) {\n const nextFrontier = [];\n for (const u of frontier) {\n order.push(u);\n for (const v of adj.get(u) ?? []) {\n indeg.set(v, (indeg.get(v) ?? 0) - 1);\n if ((indeg.get(v) ?? 0) === 0) {\n nextFrontier.push(v);\n }\n }\n }\n frontier = nextFrontier.sort((a, b) => a.localeCompare(b));\n }\n return order.length === g.nodes.length ? order : null;\n}\n__name(topoSortByGenerationIfAcyclic, \"topoSortByGenerationIfAcyclic\");\nfunction assignLayers_LaneAwareCompact(gAcyclic, opts) {\n const g = normalizeGraph(gAcyclic);\n const order = opts?.direction === \"LR\" ? topoSortByGenerationIfAcyclic(g) ?? [...g.nodes].sort() : topoSortIfAcyclic(g) ?? [...g.nodes].sort();\n const topLaneOf = createTopLaneResolver(g);\n const laneOf = /* @__PURE__ */ __name((id) => topLaneOf(id) ?? id, \"laneOf\");\n const rankOf = /* @__PURE__ */ Object.create(null);\n const nextFree = /* @__PURE__ */ new Map();\n const edgeWeight = /* @__PURE__ */ __name((u, v) => {\n const ignoreCrossLane = opts?.ignoreCrossLaneEdges ?? true;\n if (ignoreCrossLane) {\n return laneOf(u) === laneOf(v) ? 1 : 0;\n }\n return 1;\n }, \"edgeWeight\");\n for (const v of order) {\n const node = g.nodeById.get(v);\n if (node?.isGroup) {\n continue;\n }\n const preds = incoming(g, v);\n let base = 0;\n if (preds.length > 0) {\n for (const e of preds) {\n const u = e.src;\n const ru = rankOf[u] ?? 0;\n base = Math.max(base, ru + edgeWeight(u, v));\n }\n }\n const lane = laneOf(v);\n const nf = nextFree.get(lane) ?? 0;\n const L = Math.max(base, nf);\n rankOf[v] = L;\n nextFree.set(lane, L + 1);\n }\n const layers = buildLayersFromRanks(g, order, rankOf, { skipGroups: true });\n return { layers, rankOf, dummy: /* @__PURE__ */ new Set() };\n}\n__name(assignLayers_LaneAwareCompact, \"assignLayers_LaneAwareCompact\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase2.dummies.ts\nfunction makeProperLayering(layering, gAcyclic) {\n const g = normalizeGraph(gAcyclic);\n const { rankOf } = layering;\n const layers = layering.layers.map((l) => [...l]);\n const dummy = new Set(layering.dummy ? [...layering.dummy] : []);\n let dummySeq = 0;\n const nodeById = new Map(g.nodeById);\n const addDummyAt = /* @__PURE__ */ __name((L) => {\n const id = `placeholder-${dummySeq++}`;\n const dn = { id, isGroup: false, isDummy: true, width: 0, height: 0 };\n nodeById.set(id, dn);\n dummy.add(id);\n while (layers.length <= L) {\n layers.push([]);\n }\n layers[L].push(id);\n rankOf[id] = L;\n return id;\n }, \"addDummyAt\");\n const edgesSorted = [...g.edges].sort(\n (a, b) => a.id === b.id ? a.src === b.src ? a.dst.localeCompare(b.dst) : a.src.localeCompare(b.src) : a.id.localeCompare(b.id)\n );\n const newEdges = [];\n for (const e of edgesSorted) {\n const rU = rankOf[e.src] ?? 0;\n const rV = rankOf[e.dst] ?? 0;\n if (rV - rU <= 1) {\n newEdges.push(e);\n continue;\n }\n let prev = e.src;\n for (let L = rU + 1, k = 0; L < rV; L++, k++) {\n const d = addDummyAt(L);\n newEdges.push({ id: `${e.id}#${k}`, src: prev, dst: d, weight: e.weight, ref: e.ref });\n prev = d;\n }\n const lastIndex = rV - rU - 2;\n newEdges.push({\n id: `${e.id}#${Math.max(lastIndex + 1, 0)}`,\n src: prev,\n dst: e.dst,\n weight: e.weight,\n ref: e.ref\n });\n }\n const nodes = [...g.nodes, ...[...dummy].filter((id) => !g.nodes.includes(id))];\n const graphWithDummies = { nodes, edges: newEdges, layout: g.layout, nodeById };\n return { layering: { layers, rankOf, dummy }, graphWithDummies };\n}\n__name(makeProperLayering, \"makeProperLayering\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase3.ordering.ts\nfunction median(values) {\n const n = values.length;\n if (n === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const a = [...values].sort((x, y) => x - y);\n if (n % 2 === 1) {\n return a[(n - 1) / 2];\n }\n return 0.5 * (a[n / 2 - 1] + a[n / 2]);\n}\n__name(median, \"median\");\nfunction barycenter(values) {\n if (values.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const s = values.reduce((acc, v) => acc + v, 0);\n return s / values.length;\n}\n__name(barycenter, \"barycenter\");\nfunction neighborPositionsFor(targetNodes, fixedIndex, edges, direction) {\n const neighborPositions = /* @__PURE__ */ new Map();\n for (const v of targetNodes) {\n neighborPositions.set(v, []);\n }\n for (const e of edges) {\n if (direction === \"down\") {\n if (fixedIndex.has(e.src) && neighborPositions.has(e.dst)) {\n neighborPositions.get(e.dst).push(fixedIndex.get(e.src));\n }\n } else if (fixedIndex.has(e.dst) && neighborPositions.has(e.src)) {\n neighborPositions.get(e.src).push(fixedIndex.get(e.dst));\n }\n }\n return neighborPositions;\n}\n__name(neighborPositionsFor, \"neighborPositionsFor\");\nfunction currentOrderTieBreak(a, b, currentLayerIndex) {\n const ia = currentLayerIndex.get(a) ?? 0;\n const ib = currentLayerIndex.get(b) ?? 0;\n return ia !== ib ? ia - ib : a.localeCompare(b);\n}\n__name(currentOrderTieBreak, \"currentOrderTieBreak\");\nfunction countCrossingsBetweenAdjacent2(upper, lower, edges) {\n const upperSet = new Set(upper);\n const lowerSet = new Set(lower);\n const upperIndex = buildLayerIndex(upper);\n const lowerIndex = buildLayerIndex(lower);\n const pairs = [];\n for (const e of edges) {\n if (upperSet.has(e.src) && lowerSet.has(e.dst)) {\n pairs.push({ u: upperIndex.get(e.src), v: lowerIndex.get(e.dst) });\n }\n }\n pairs.sort((a, b) => a.u === b.u ? a.v - b.v : a.u - b.u);\n const vs = pairs.map((p) => p.v);\n return countInversions(vs);\n}\n__name(countCrossingsBetweenAdjacent2, \"countCrossingsBetweenAdjacent\");\nfunction sortByHeuristic(nodes, neighborPositions, currentLayerIndex) {\n return [...nodes].sort((a, b) => {\n const sa = median(neighborPositions.get(a) ?? []);\n const sb = median(neighborPositions.get(b) ?? []);\n if (sa === sb) {\n return currentOrderTieBreak(a, b, currentLayerIndex);\n }\n if (!isFinite(sa)) {\n return 1;\n }\n if (!isFinite(sb)) {\n return -1;\n }\n return sa - sb;\n });\n}\n__name(sortByHeuristic, \"sortByHeuristic\");\nfunction reorderLayer(fixedLayer, targetLayer, edges, direction, topLaneOf, laneOrder) {\n const fixedIndex = buildLayerIndex(fixedLayer);\n const currIndex = buildLayerIndex(targetLayer);\n const neighborPositions = neighborPositionsFor(targetLayer, fixedIndex, edges, direction);\n if (!topLaneOf || !laneOrder || laneOrder.length === 0) {\n return sortByHeuristic(targetLayer, neighborPositions, currIndex);\n }\n const byLane = /* @__PURE__ */ new Map();\n for (const id of targetLayer) {\n const lane = topLaneOf(id);\n const arr = byLane.get(lane) ?? [];\n arr.push(id);\n byLane.set(lane, arr);\n }\n const result = [];\n for (const lane of laneOrder) {\n const nodesInLane = byLane.get(lane);\n if (!nodesInLane || nodesInLane.length === 0) {\n continue;\n }\n const sorted = sortByHeuristic(nodesInLane, neighborPositions, currIndex);\n result.push(...sorted);\n }\n const nullNodes = byLane.get(null);\n if (nullNodes && nullNodes.length > 0) {\n const sorted = sortByHeuristic(nullNodes, neighborPositions, currIndex);\n for (const nid of sorted) {\n const bc = barycenter(neighborPositions.get(nid) ?? []);\n let bestIdx = result.length;\n if (isFinite(bc)) {\n for (const [i, rid] of result.entries()) {\n const rBc = barycenter(neighborPositions.get(rid) ?? []);\n if (bc < rBc) {\n bestIdx = i;\n break;\n }\n }\n }\n result.splice(bestIdx, 0, nid);\n }\n }\n return result;\n}\n__name(reorderLayer, \"reorderLayer\");\nfunction transposeImprove(upper, current, edges, next, topLaneOf) {\n const best = [...current];\n const upperSet = new Set(upper);\n const layerSet = new Set(current);\n const nextSet = next ? new Set(next) : null;\n const edgesIn = edges.filter((e) => upperSet.has(e.src) && layerSet.has(e.dst));\n const edgesOut = nextSet ? edges.filter((e) => layerSet.has(e.src) && nextSet.has(e.dst)) : void 0;\n const crossingScore = /* @__PURE__ */ __name((order) => {\n let score = countCrossingsBetweenAdjacent2(upper, order, edgesIn);\n if (edgesOut && next) {\n score += countCrossingsBetweenAdjacent2(order, next, edgesOut);\n }\n return score;\n }, \"crossingScore\");\n const laneOf = topLaneOf ? /* @__PURE__ */ new Map() : null;\n if (topLaneOf && laneOf) {\n for (const id of current) {\n laneOf.set(id, topLaneOf(id));\n }\n }\n let improved = true;\n let bestScore = crossingScore(best);\n while (improved) {\n improved = false;\n for (let i = 0; i + 1 < best.length; i++) {\n if (laneOf) {\n const laneA = laneOf.get(best[i]);\n const laneB = laneOf.get(best[i + 1]);\n if (laneA !== laneB) {\n continue;\n }\n }\n const prev = bestScore;\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n const nextScore = crossingScore(best);\n if (nextScore < prev) {\n bestScore = nextScore;\n improved = true;\n } else {\n [best[i], best[i + 1]] = [best[i + 1], best[i]];\n }\n }\n }\n return best;\n}\n__name(transposeImprove, \"transposeImprove\");\nfunction orderLayers(layering, gWithDummies, opts) {\n const layers = layering.layers.map((l) => [...l]);\n const edges = gWithDummies.edges;\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrder = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n for (let s = 0; s < 3; s++) {\n for (let i = 1; i < layers.length; i++) {\n layers[i] = reorderLayer(layers[i - 1], layers[i], edges, \"down\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i - 1], layers[i], edges, layers[i + 1], topLaneOf);\n }\n for (let i = layers.length - 2; i >= 0; i--) {\n layers[i] = reorderLayer(layers[i + 1], layers[i], edges, \"up\", topLaneOf, laneOrder);\n layers[i] = transposeImprove(layers[i + 1], layers[i], edges, layers[i - 1], topLaneOf);\n }\n }\n return { layers };\n}\n__name(orderLayers, \"orderLayers\");\n\n// src/rendering-util/layout-algorithms/swimlanes/phase4.coordinates.ts\nfunction assignCoordinates(ordered, gWithDummies, opts) {\n const layerGap = opts?.layerGap ?? COORDINATES.DEFAULT_LAYER_GAP;\n const nodeGap = opts?.nodeGap ?? COORDINATES.DEFAULT_NODE_GAP;\n const laneGap = opts?.laneGap ?? nodeGap * 2;\n const direction = opts?.direction ?? \"TB\";\n const isHorizontal = direction === \"LR\" || direction === \"RL\";\n const layers = ordered.layers;\n const x = /* @__PURE__ */ Object.create(null);\n const y = /* @__PURE__ */ Object.create(null);\n const getNode = /* @__PURE__ */ __name((id) => gWithDummies.nodeById.get(id), \"getNode\");\n const getWidth = /* @__PURE__ */ __name((id) => getNode(id)?.width ?? 0, \"getWidth\");\n const getHeight = /* @__PURE__ */ __name((id) => getNode(id)?.height ?? 0, \"getHeight\");\n const topLaneOf = createTopLaneResolver(gWithDummies);\n const laneOrderGlobal = resolveTopLaneOrder(gWithDummies, opts?.laneOrder);\n const layerHeights = layers.map(\n (layer) => layer.reduce((m, v) => Math.max(m, getHeight(v)), 0)\n );\n const extraLayerGaps = [];\n if (isHorizontal) {\n for (let i = 0; i + 1 < layers.length; i++) {\n const thisLayerMaxWidth = layers[i].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const nextLayerMaxWidth = layers[i + 1].reduce((m, v) => Math.max(m, getWidth(v)), 0);\n const thisLayerMaxHeight = layerHeights[i];\n const nextLayerMaxHeight = layerHeights[i + 1];\n const normalSpacing = thisLayerMaxHeight / 2 + nextLayerMaxHeight / 2;\n const requiredSpacing = (thisLayerMaxWidth + nextLayerMaxWidth) / 2;\n const extraNeeded = Math.max(0, requiredSpacing - normalSpacing - layerGap);\n extraLayerGaps.push(extraNeeded);\n }\n }\n const lanesUsedSet = /* @__PURE__ */ new Set();\n for (const layer of layers) {\n for (const id of layer) {\n lanesUsedSet.add(topLaneOf(id));\n }\n }\n const hasNullLane = lanesUsedSet.has(null);\n const lanesUsed = laneOrderGlobal.filter((L) => lanesUsedSet.has(L));\n const laneOrderColumns = [...hasNullLane ? [null] : [], ...lanesUsed];\n const laneWidth = /* @__PURE__ */ Object.create(null);\n for (const L of lanesUsed) {\n laneWidth[L] = 0;\n }\n if (hasNullLane) {\n laneWidth.null = 0;\n }\n for (const layer of layers) {\n const perLane = /* @__PURE__ */ Object.create(null);\n const nullIds = [];\n for (const id of layer) {\n const L = topLaneOf(id);\n if (L === null) {\n nullIds.push(id);\n } else {\n (perLane[L] ||= []).push(id);\n }\n }\n for (const [L, ids] of Object.entries(perLane)) {\n const total = ids.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, ids.length - 1);\n laneWidth[L] = Math.max(laneWidth[L] ?? 0, total);\n }\n if (hasNullLane && nullIds.length) {\n const totalNull = nullIds.reduce((s, id) => s + getWidth(id), 0) + nodeGap * Math.max(0, nullIds.length - 1);\n laneWidth.null = Math.max(laneWidth.null ?? 0, totalNull);\n }\n }\n const centerX = /* @__PURE__ */ new Map();\n {\n const widths = laneOrderColumns.map(\n (L) => (L === null ? laneWidth.null : laneWidth[L]) ?? 0\n );\n const totalW = widths.reduce((a, b) => a + b, 0) + laneGap * Math.max(0, laneOrderColumns.length - 1);\n let cursor = -totalW / 2;\n for (let i = 0; i < laneOrderColumns.length; i++) {\n const L = laneOrderColumns[i];\n const w = widths[i] ?? 0;\n const cx = cursor + w / 2;\n centerX.set(L, cx);\n cursor += w;\n if (i < laneOrderColumns.length - 1) {\n cursor += laneGap;\n }\n }\n }\n let yOffset = 0;\n for (const [li, layer] of layers.entries()) {\n const layerH = layerHeights[li] ?? 0;\n const byLane = /* @__PURE__ */ new Map();\n for (const id of layer) {\n const laneId = topLaneOf(id);\n const arr = byLane.get(laneId) ?? [];\n arr.push(id);\n byLane.set(laneId, arr);\n }\n for (const L of laneOrderColumns) {\n const nodesInLane = byLane.get(L) ?? [];\n if (nodesInLane.length === 0) {\n continue;\n }\n const cx = centerX.get(L);\n if (nodesInLane.length === 1) {\n const id = nodesInLane[0];\n x[id] = cx;\n y[id] = yOffset + layerH / 2;\n } else {\n const widths = nodesInLane.map((id) => getWidth(id));\n const total = widths.reduce((a, b) => a + b, 0) + nodeGap * (nodesInLane.length - 1);\n let start = cx - total / 2;\n for (const [i, id] of nodesInLane.entries()) {\n const w = widths[i];\n x[id] = start + w / 2;\n y[id] = yOffset + layerH / 2;\n start += w + nodeGap;\n }\n }\n }\n const extraGap = extraLayerGaps[li] ?? 0;\n yOffset += layerH + layerGap + extraGap;\n }\n const byRef = /* @__PURE__ */ new Map();\n for (const e of gWithDummies.edges) {\n const rid = e.ref.id;\n if (!byRef.has(rid)) {\n byRef.set(rid, []);\n }\n byRef.get(rid).push(e);\n }\n for (const [, chainEdges] of byRef) {\n if (chainEdges.length === 0) {\n continue;\n }\n const ref = chainEdges[0].ref;\n const src = ref.start;\n const dst = ref.end;\n if (src == null || dst == null) {\n continue;\n }\n const midX = Math.round(((x[src] ?? 0) + (x[dst] ?? 0)) / 2);\n const involved = /* @__PURE__ */ new Set();\n for (const e of chainEdges) {\n involved.add(e.src);\n involved.add(e.dst);\n }\n for (const vid of involved) {\n if (vid === src || vid === dst) {\n continue;\n }\n const node = gWithDummies.nodeById.get(vid);\n if (node?.isDummy) {\n x[vid] = midX;\n }\n }\n }\n return { x, y };\n}\n__name(assignCoordinates, \"assignCoordinates\");\n\n// src/rendering-util/layout-algorithms/swimlanes/laneOrdering.ts\nvar AUTOMATIC_LANE_ORDERING_RESTARTS = 8;\nfunction hashString(input) {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n__name(hashString, \"hashString\");\nfunction mulberry32(seed) {\n let state = seed >>> 0;\n return () => {\n state += 1831565813;\n let t = state;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n return ((t ^ t >>> 14) >>> 0) / 4294967296;\n };\n}\n__name(mulberry32, \"mulberry32\");\nfunction deterministicShuffle(order, seed) {\n const shuffled = [...order];\n const random = mulberry32(seed);\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n return shuffled;\n}\n__name(deterministicShuffle, \"deterministicShuffle\");\nfunction sourceDistance(order, sourceIndex) {\n let distance = 0;\n for (const [index, laneId] of order.entries()) {\n distance += Math.abs(index - (sourceIndex.get(laneId) ?? index));\n }\n return distance;\n}\n__name(sourceDistance, \"sourceDistance\");\nfunction laneArrangementCost(order, weights) {\n const position = /* @__PURE__ */ new Map();\n for (const [index, laneId] of order.entries()) {\n position.set(laneId, index);\n }\n let cost = 0;\n for (const { a, b, weight } of weights) {\n const ai = position.get(a);\n const bi = position.get(b);\n if (ai == null || bi == null) {\n continue;\n }\n cost += weight * Math.abs(ai - bi);\n }\n return cost;\n}\n__name(laneArrangementCost, \"laneArrangementCost\");\nfunction buildWeightedLaneEdges(g) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return [];\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n const topLaneOf = createTopLaneResolver(g);\n const weights = /* @__PURE__ */ new Map();\n for (const edge of g.layout.edges ?? []) {\n if (edge.isLayoutOnly) {\n continue;\n }\n const src = typeof edge.start === \"string\" ? edge.start : void 0;\n const dst = typeof edge.end === \"string\" ? edge.end : void 0;\n if (!src || !dst || !g.nodeById.has(src) || !g.nodeById.has(dst)) {\n continue;\n }\n const laneA = topLaneOf(src);\n const laneB = topLaneOf(dst);\n if (!laneA || !laneB || laneA === laneB) {\n continue;\n }\n const ia = sourceIndex.get(laneA);\n const ib = sourceIndex.get(laneB);\n if (ia == null || ib == null) {\n continue;\n }\n const [a, b] = ia <= ib ? [laneA, laneB] : [laneB, laneA];\n const key = `${a}\\0${b}`;\n const existing = weights.get(key);\n if (existing) {\n existing.weight++;\n } else {\n weights.set(key, { a, b, weight: 1 });\n }\n }\n return [...weights.values()];\n}\n__name(buildWeightedLaneEdges, \"buildWeightedLaneEdges\");\nfunction greedySwitch(startOrder, weights, sourceIndex) {\n const order = [...startOrder];\n let cost = laneArrangementCost(order, weights);\n let changed = true;\n let sweeps = 0;\n const maxSweeps = Math.max(1, order.length);\n while (changed && sweeps < maxSweeps) {\n changed = false;\n sweeps++;\n for (let i = 0; i + 1 < order.length; i++) {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n const nextCost = laneArrangementCost(order, weights);\n if (nextCost < cost) {\n cost = nextCost;\n changed = true;\n } else {\n [order[i], order[i + 1]] = [order[i + 1], order[i]];\n }\n }\n }\n return {\n order,\n cost,\n sourceDistance: sourceDistance(order, sourceIndex)\n };\n}\n__name(greedySwitch, \"greedySwitch\");\nfunction isBetterCandidate(candidate, best) {\n if (candidate.cost !== best.cost) {\n return candidate.cost < best.cost;\n }\n return candidate.sourceDistance < best.sourceDistance;\n}\n__name(isBetterCandidate, \"isBetterCandidate\");\nfunction seedForRestart(sourceOrder, weights, restartIndex) {\n const weightSignature = [...weights].sort((a, b) => a.a === b.a ? a.b.localeCompare(b.b) : a.a.localeCompare(b.a)).map(({ a, b, weight }) => `${a}:${b}:${weight}`).join(\"|\");\n return hashString(`${sourceOrder.join(\"|\")}#${weightSignature}#${restartIndex}`);\n}\n__name(seedForRestart, \"seedForRestart\");\nfunction optimizeTopLaneOrder(g, opts = {}) {\n const sourceOrder = buildTopLaneOrder(g);\n if (sourceOrder.length < 2) {\n return sourceOrder;\n }\n const weights = buildWeightedLaneEdges(g);\n if (weights.length === 0) {\n return sourceOrder;\n }\n const sourceIndex = new Map(sourceOrder.map((laneId, index) => [laneId, index]));\n let best = greedySwitch(sourceOrder, weights, sourceIndex);\n const restarts = Math.max(0, opts.restarts ?? AUTOMATIC_LANE_ORDERING_RESTARTS);\n for (let i = 0; i < restarts; i++) {\n const seed = seedForRestart(sourceOrder, weights, i);\n const start = deterministicShuffle(sourceOrder, seed);\n const candidate = greedySwitch(start, weights, sourceIndex);\n if (isBetterCandidate(candidate, best)) {\n best = candidate;\n }\n }\n return best.order;\n}\n__name(optimizeTopLaneOrder, \"optimizeTopLaneOrder\");\n\n// src/rendering-util/layout-algorithms/swimlanes/pipeline.ts\nfunction sugiyamaLayout(g, opts) {\n const ignoreCrossLaneEdges = opts?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = opts?.optimizeRanksByCrossings ?? true;\n const g0 = normalizeGraph(g);\n const laneOrder = opts?.automaticLaneOrdering ? optimizeTopLaneOrder(g0, { restarts: AUTOMATIC_LANE_ORDERING_RESTARTS }) : void 0;\n const cycleRes = removeCycles_DFS(g0);\n const gAcyclic = cycleRes.acyclic;\n const layering = ignoreCrossLaneEdges ? assignLayers_LaneAwareCompact(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: true,\n direction: opts?.direction\n }) : assignLayers_Gravity(gAcyclic, {\n compactSingleInput: opts?.compactSingleInput ?? LAYERING.DEFAULT_COMPACT_SINGLE_INPUT,\n ignoreCrossLaneEdges: false,\n optimizeRanksByCrossings: optimizeRanksByCrossings2\n });\n const { layering: properLayering, graphWithDummies } = makeProperLayering(layering, gAcyclic);\n const ordered = orderLayers(properLayering, graphWithDummies, { laneOrder });\n const coordinates = assignCoordinates(ordered, graphWithDummies, {\n layerGap: opts?.layerGap,\n nodeGap: opts?.nodeGap,\n direction: opts?.direction,\n laneOrder\n });\n return {\n acyclic: gAcyclic,\n reversed: cycleRes.reversed,\n layering: properLayering,\n ordered,\n coordinates\n };\n}\n__name(sugiyamaLayout, \"sugiyamaLayout\");\n\n// src/rendering-util/layout-algorithms/swimlanes/orthogonalRouter/router.ts\nvar EPS7 = PRECISION.EPSILON;\nvar NODE_PADDING = 8;\nvar HORIZONTAL_PIPE_MARGIN = 15;\nvar VERTICAL_PIPE_MARGIN = 15;\nvar ROUTING_MARGIN = 25;\nvar ANCHOR_OFFSET = 20;\nvar TRACK_SPACING = 10;\nfunction chooseOrthogonalSide(node, target, fallback) {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const dx = target.x - cx;\n const dy = target.y - cy;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n if (absDx < EPS7 && absDy < EPS7) {\n return fallback;\n }\n const verticalBias = 3;\n if (absDy > EPS7 && absDy * verticalBias >= absDx) {\n return dy > 0 ? \"bottom\" : \"top\";\n }\n if (absDx > EPS7) {\n return dx > 0 ? \"right\" : \"left\";\n }\n return fallback;\n}\n__name(chooseOrthogonalSide, \"chooseOrthogonalSide\");\nfunction sharedLineEndpointCoord(line, nextLine) {\n return Math.abs(line.to - nextLine.from) < EPS7 || Math.abs(line.to - nextLine.to) < EPS7 ? line.to : line.from;\n}\n__name(sharedLineEndpointCoord, \"sharedLineEndpointCoord\");\nfunction pointOnLine(line, along) {\n return line.orient === \"vertical\" ? { x: line.coord, y: along } : { x: along, y: line.coord };\n}\n__name(pointOnLine, \"pointOnLine\");\nfunction routeEdgesOrthogonal(data, direction) {\n const nodes = data.nodes ?? [];\n const originalEdges = data.edges ?? [];\n const edges = [];\n for (const oe of originalEdges) {\n if (oe.isLayoutOnly) {\n continue;\n }\n edges.push({\n ...oe,\n __originalEdge: oe\n });\n }\n const nodeById = /* @__PURE__ */ new Map();\n const laneByNodeId = /* @__PURE__ */ new Map();\n const pipes = [];\n const isLR = direction === \"LR\";\n for (const n of nodes) {\n nodeById.set(n.id, n);\n }\n const topLevelGroups = nodes.filter((n) => n.isGroup && !n.parentId);\n for (const group of topLevelGroups) {\n const lane = { id: group.id };\n const assignLane = /* @__PURE__ */ __name((n) => {\n laneByNodeId.set(n.id, lane);\n nodes.filter((child) => child.parentId === n.id).forEach(assignLane);\n }, \"assignLane\");\n assignLane(group);\n }\n const obstacles = nodes.filter((n) => !n.isGroup && !n.isEdgeLabel).map((n) => {\n const w = n.width ?? 10;\n const h = n.height ?? 10;\n const x = n.x ?? 0;\n const y = n.y ?? 0;\n const padding = NODE_PADDING;\n return {\n nodeId: n.id,\n minX: x - w / 2 - padding,\n maxX: x + w / 2 + padding,\n minY: y - h / 2 - padding,\n maxY: y + h / 2 + padding,\n // For LR: TB x becomes LR y, so visual Y extent should be based on height\n visualXHalfExtent: isLR ? h / 2 + padding : w / 2 + padding\n };\n });\n const getOrAddPipe = /* @__PURE__ */ __name((orientation, coord, spanMin, spanMax) => {\n let pipe = pipes.find((p) => p.orientation === orientation && Math.abs(p.coord - coord) < 1);\n if (!pipe) {\n pipe = {\n id: `pipe-${orientation}-${coord.toFixed(0)}`,\n orientation,\n coord,\n spanMin,\n spanMax,\n tracks: []\n };\n pipes.push(pipe);\n }\n pipe.spanMin = Math.min(pipe.spanMin, spanMin);\n pipe.spanMax = Math.max(pipe.spanMax, spanMax);\n return pipe;\n }, \"getOrAddPipe\");\n const portForSide = /* @__PURE__ */ __name((node, side) => {\n const w = node.width ?? 10;\n const h = node.height ?? 10;\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n switch (side) {\n case \"top\":\n return { x: cx, y: cy - h / 2 };\n case \"bottom\":\n return { x: cx, y: cy + h / 2 };\n case \"left\":\n return { x: cx - w / 2, y: cy };\n case \"right\":\n return { x: cx + w / 2, y: cy };\n }\n }, \"portForSide\");\n const getOrthogonalPort = /* @__PURE__ */ __name((node, target, isSource) => portForSide(node, chooseOrthogonalSide(node, target, isSource ? \"bottom\" : \"top\")), \"getOrthogonalPort\");\n const allRoutedSegments = [];\n const edgeSegmentIndices = [];\n const straightIntraLaneEdges = /* @__PURE__ */ new Set();\n const CROSSING_PENALTY = 1e3;\n const crossingPenalty = /* @__PURE__ */ __name((edgeIdx, from, to) => {\n if (allRoutedSegments.length === 0) {\n return 0;\n }\n const isHorizontal = Math.abs(from.y - to.y) < EPS7;\n const isVertical = Math.abs(from.x - to.x) < EPS7;\n if (!isHorizontal && !isVertical) {\n return 0;\n }\n let penalties = 0;\n if (isHorizontal) {\n const y = from.y;\n const minX = Math.min(from.x, to.x) - EPS7;\n const maxX = Math.max(from.x, to.x) + EPS7;\n if (maxX <= minX) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"vertical\") {\n continue;\n }\n if (seg.pipe.coord < minX || seg.pipe.coord > maxX) {\n continue;\n }\n if (seg.from - EPS7 <= y && seg.to + EPS7 >= y) {\n penalties += CROSSING_PENALTY;\n }\n }\n } else if (isVertical) {\n const x = from.x;\n const minY = Math.min(from.y, to.y) - EPS7;\n const maxY = Math.max(from.y, to.y) + EPS7;\n if (maxY <= minY) {\n return 0;\n }\n for (const seg of allRoutedSegments) {\n if (seg.edgeIndex === edgeIdx || seg.orientation !== \"horizontal\") {\n continue;\n }\n if (seg.pipe.coord < minY || seg.pipe.coord > maxY) {\n continue;\n }\n if (seg.from - EPS7 <= x && seg.to + EPS7 >= x) {\n penalties += CROSSING_PENALTY;\n }\n }\n }\n return penalties;\n }, \"crossingPenalty\");\n const routingOrder = edges.map((edge, idx) => {\n if (!edge.start || !edge.end) {\n return { idx, crossLane: 0, dx: 0, dy: 0 };\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n const srcLane = laneByNodeId.get(edge.start);\n const dstLane = laneByNodeId.get(edge.end);\n const crossLane = srcLane && dstLane && srcLane.id !== dstLane.id ? 1 : 0;\n const dx = srcNode && dstNode ? Math.abs((dstNode.x ?? 0) - (srcNode.x ?? 0)) : 0;\n const dy = srcNode && dstNode ? Math.abs((dstNode.y ?? 0) - (srcNode.y ?? 0)) : 0;\n return { idx, crossLane, dx, dy };\n }).sort((a, b) => {\n if (a.crossLane !== b.crossLane) {\n return b.crossLane - a.crossLane;\n }\n const aDist = a.dx + a.dy;\n const bDist = b.dx + b.dy;\n if (Math.abs(aDist - bDist) > 1) {\n return aDist - bDist;\n }\n return a.idx - b.idx;\n }).map((entry) => entry.idx);\n const isSegmentBlocked = /* @__PURE__ */ __name((p1, p2, excludeStart, excludeEnd) => {\n const segMinX = Math.min(p1.x, p2.x);\n const segMaxX = Math.max(p1.x, p2.x);\n const segMinY = Math.min(p1.y, p2.y);\n const segMaxY = Math.max(p1.y, p2.y);\n const blockingObs = obstacles.find((obs) => {\n if (excludeStart && obs.nodeId === excludeStart) {\n return false;\n }\n if (excludeEnd && obs.nodeId === excludeEnd) {\n return false;\n }\n if (Math.abs(p1.x - p2.x) > EPS7) {\n return obs.minY < p1.y && obs.maxY > p1.y && obs.maxX > segMinX && obs.minX < segMaxX;\n } else {\n return obs.minX < p1.x && obs.maxX > p1.x && obs.maxY > segMinY && obs.minY < segMaxY;\n }\n });\n return !!blockingObs;\n }, \"isSegmentBlocked\");\n const portGroups = /* @__PURE__ */ new Map();\n const incidentEdgeTotals = /* @__PURE__ */ new Map();\n for (const edge of edges) {\n if (!edge.start || !edge.end || edge.start === edge.end) {\n continue;\n }\n incidentEdgeTotals.set(edge.start, (incidentEdgeTotals.get(edge.start) ?? 0) + 1);\n incidentEdgeTotals.set(edge.end, (incidentEdgeTotals.get(edge.end) ?? 0) + 1);\n }\n const determineSide = /* @__PURE__ */ __name((node, target) => chooseOrthogonalSide(node, target, \"bottom\"), \"determineSide\");\n const sideInfoByIdx = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (!e.start || !e.end || e.start === e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const dx = (dst.x ?? 0) - (src.x ?? 0);\n const dy = (dst.y ?? 0) - (src.y ?? 0);\n sideInfoByIdx.set(i, {\n edgeIdx: i,\n srcId: e.start,\n dstId: e.end,\n srcSide: determineSide(src, { x: dst.x ?? 0, y: dst.y ?? 0 }),\n dstSide: determineSide(dst, { x: src.x ?? 0, y: src.y ?? 0 }),\n absDx: Math.abs(dx),\n absDy: Math.abs(dy),\n dxSign: Math.sign(dx),\n dySign: Math.sign(dy)\n });\n }\n const preferenceStrength = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.absDx === 0 ? Infinity : info.absDy / info.absDx;\n }\n return info.absDy === 0 ? Infinity : info.absDx / info.absDy;\n }, \"preferenceStrength\");\n const secondarySide = /* @__PURE__ */ __name((info) => {\n if (info.srcSide === \"top\" || info.srcSide === \"bottom\") {\n return info.dxSign >= 0 ? \"right\" : \"left\";\n }\n return info.dySign >= 0 ? \"bottom\" : \"top\";\n }, \"secondarySide\");\n const sourceSideGroups = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n const key = `${info.srcId}:${info.srcSide}`;\n if (!sourceSideGroups.has(key)) {\n sourceSideGroups.set(key, []);\n }\n sourceSideGroups.get(key).push(info);\n }\n const sideLoad = /* @__PURE__ */ new Map();\n const loadKey = /* @__PURE__ */ __name((nodeId, side) => `${nodeId}:${side}`, \"loadKey\");\n for (const info of sideInfoByIdx.values()) {\n sideLoad.set(\n loadKey(info.srcId, info.srcSide),\n (sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0) + 1\n );\n sideLoad.set(\n loadKey(info.dstId, info.dstSide),\n (sideLoad.get(loadKey(info.dstId, info.dstSide)) ?? 0) + 1\n );\n }\n for (const group of sourceSideGroups.values()) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => {\n const sa = preferenceStrength(a);\n const sb = preferenceStrength(b);\n if (Math.abs(sa - sb) > 1e-9) {\n return sb - sa;\n }\n return a.edgeIdx - b.edgeIdx;\n });\n for (let g = 1; g < group.length; g++) {\n const info = group[g];\n const secondary = secondarySide(info);\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n const secondaryLoad = sideLoad.get(loadKey(info.srcId, secondary)) ?? 0;\n if (secondaryLoad >= primaryLoad) {\n continue;\n }\n sideLoad.set(loadKey(info.srcId, info.srcSide), primaryLoad - 1);\n sideLoad.set(loadKey(info.srcId, secondary), secondaryLoad + 1);\n info.srcSide = secondary;\n }\n }\n const isDiamondNode = /* @__PURE__ */ __name((node) => {\n const shape = node?.shape;\n return shape === \"question\" || shape === \"diamond\";\n }, \"isDiamondNode\");\n const inSidesByNode = /* @__PURE__ */ new Map();\n for (const info of sideInfoByIdx.values()) {\n if (!inSidesByNode.has(info.dstId)) {\n inSidesByNode.set(info.dstId, /* @__PURE__ */ new Set());\n }\n inSidesByNode.get(info.dstId).add(info.dstSide);\n }\n for (const info of sideInfoByIdx.values()) {\n if (!isDiamondNode(nodeById.get(info.srcId))) {\n continue;\n }\n const inSides = inSidesByNode.get(info.srcId);\n if (!inSides?.has(info.srcSide)) {\n continue;\n }\n const secondary = secondarySide(info);\n if (inSides.has(secondary) || (sideLoad.get(loadKey(info.srcId, secondary)) ?? 0) > 0) {\n continue;\n }\n const primaryLoad = sideLoad.get(loadKey(info.srcId, info.srcSide)) ?? 0;\n sideLoad.set(loadKey(info.srcId, info.srcSide), Math.max(0, primaryLoad - 1));\n sideLoad.set(loadKey(info.srcId, secondary), 1);\n info.srcSide = secondary;\n }\n for (const info of sideInfoByIdx.values()) {\n const { edgeIdx: i, srcId, dstId, srcSide, dstSide } = info;\n const src = nodeById.get(srcId);\n const dst = nodeById.get(dstId);\n const srcKey = `${srcId}:${srcSide}:src`;\n const dstCoord = srcSide === \"top\" || srcSide === \"bottom\" ? dst.x ?? 0 : dst.y ?? 0;\n if (!portGroups.has(srcKey)) {\n portGroups.set(srcKey, []);\n }\n portGroups.get(srcKey).push({ edgeIdx: i, oppositeCoord: dstCoord });\n const dstKey = `${dstId}:${dstSide}:dst`;\n const srcCoord = dstSide === \"top\" || dstSide === \"bottom\" ? src.x ?? 0 : src.y ?? 0;\n if (!portGroups.has(dstKey)) {\n portGroups.set(dstKey, []);\n }\n portGroups.get(dstKey).push({ edgeIdx: i, oppositeCoord: srcCoord });\n }\n const portOffsets = /* @__PURE__ */ new Map();\n const MIN_PORT_SPACING3 = 8;\n for (const [key, group] of portGroups) {\n if (group.length < 2) {\n continue;\n }\n group.sort((a, b) => a.oppositeCoord - b.oppositeCoord);\n const parts = key.split(\":\");\n const nodeId = parts.slice(0, -2).join(\":\");\n const side = parts[parts.length - 2];\n const role = parts[parts.length - 1];\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n const isVerticalSide = side === \"left\" || side === \"right\";\n const sideLength = isVerticalSide ? node.height ?? 10 : node.width ?? 10;\n const shape = node.shape;\n const isDiamond = shape === \"question\" || shape === \"diamond\";\n const effectiveLength = isDiamond ? sideLength * 0.3 : sideLength;\n const MAX_PORT_SPACING = 20;\n const spacing = Math.min(\n MAX_PORT_SPACING,\n Math.max(MIN_PORT_SPACING3, effectiveLength / (group.length + 1))\n );\n const totalSpan = spacing * (group.length - 1);\n const startOffset = -totalSpan / 2;\n for (const [j, element] of group.entries()) {\n const offset = startOffset + j * spacing;\n const offsetKey = `${element.edgeIdx}:${role}`;\n portOffsets.set(offsetKey, offset);\n }\n }\n const edgeHasLabelNode = /* @__PURE__ */ __name((edgeIdx) => Boolean(edges[edgeIdx]?.labelNodeId), \"edgeHasLabelNode\");\n const faceHasLabelNode = /* @__PURE__ */ __name((nodeId, side) => {\n if (!nodeId) {\n return false;\n }\n return (portGroups.get(`${nodeId}:${side}:src`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n ) || (portGroups.get(`${nodeId}:${side}:dst`) ?? []).some(\n ({ edgeIdx }) => edgeHasLabelNode(edgeIdx)\n );\n }, \"faceHasLabelNode\");\n const applyPortOffset = /* @__PURE__ */ __name((basePort, side, offset) => {\n if (side === \"top\" || side === \"bottom\") {\n return { x: basePort.x + offset, y: basePort.y };\n } else {\n return { x: basePort.x, y: basePort.y + offset };\n }\n }, \"applyPortOffset\");\n const portsForEdge = /* @__PURE__ */ __name((edgeIndex, src, dst) => {\n const sideInfo = sideInfoByIdx.get(edgeIndex);\n const srcTarget = { x: dst.x ?? 0, y: dst.y ?? 0 };\n const dstTarget = { x: src.x ?? 0, y: src.y ?? 0 };\n const srcSide = sideInfo?.srcSide ?? determineSide(src, srcTarget);\n const dstSide = sideInfo?.dstSide ?? determineSide(dst, dstTarget);\n let pSrcPort = sideInfo ? portForSide(src, sideInfo.srcSide) : getOrthogonalPort(src, srcTarget, true);\n let pDstPort = sideInfo ? portForSide(dst, sideInfo.dstSide) : getOrthogonalPort(dst, dstTarget, false);\n const srcOffset = portOffsets.get(`${edgeIndex}:src`);\n const dstOffset = portOffsets.get(`${edgeIndex}:dst`);\n if (srcOffset !== void 0) {\n pSrcPort = applyPortOffset(pSrcPort, srcSide, srcOffset);\n }\n if (dstOffset !== void 0) {\n pDstPort = applyPortOffset(pDstPort, dstSide, dstOffset);\n }\n return { pSrcPort, pDstPort, srcSide, dstSide };\n }, \"portsForEdge\");\n for (const i of routingOrder) {\n const e = edges[i];\n edgeSegmentIndices[i] = [];\n if (!e.start || !e.end) {\n continue;\n }\n if (e.points && e.points.length > 0) {\n continue;\n }\n if (e.start === e.end) {\n continue;\n }\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n if (!src || !dst) {\n continue;\n }\n const {\n pSrcPort,\n pDstPort,\n srcSide: srcPortSide,\n dstSide: dstPortSide\n } = portsForEdge(i, src, dst);\n const pSrcAnchor = { ...pSrcPort };\n const pDstAnchor = { ...pDstPort };\n const srcPortIsVertical = srcPortSide === \"top\" || srcPortSide === \"bottom\";\n const dstPortIsVertical = dstPortSide === \"top\" || dstPortSide === \"bottom\";\n if (srcPortIsVertical) {\n const isBottom = pSrcPort.y > (src.y ?? 0);\n pSrcAnchor.y = isBottom ? pSrcPort.y + ANCHOR_OFFSET : pSrcPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pSrcPort.x > (src.x ?? 0);\n pSrcAnchor.x = isRight ? pSrcPort.x + ANCHOR_OFFSET : pSrcPort.x - ANCHOR_OFFSET;\n }\n if (dstPortIsVertical) {\n const isBottom = pDstPort.y > (dst.y ?? 0);\n pDstAnchor.y = isBottom ? pDstPort.y + ANCHOR_OFFSET : pDstPort.y - ANCHOR_OFFSET;\n } else {\n const isRight = pDstPort.x > (dst.x ?? 0);\n pDstAnchor.x = isRight ? pDstPort.x + ANCHOR_OFFSET : pDstPort.x - ANCHOR_OFFSET;\n }\n const isPointInObstacle = /* @__PURE__ */ __name((pt, excludeNodeIds) => {\n for (const obs of obstacles) {\n if (excludeNodeIds.includes(obs.nodeId)) {\n continue;\n }\n if (pt.x > obs.minX && pt.x < obs.maxX && pt.y > obs.minY && pt.y < obs.maxY) {\n return { inside: true, obstacle: obs };\n }\n }\n return { inside: false };\n }, \"isPointInObstacle\");\n const obstacleDetour = /* @__PURE__ */ __name((port, node, opposite, obs, portIsVertical) => {\n if (portIsVertical) {\n const leavesPositiveSide2 = port.y > (node.y ?? 0);\n const goRight = (opposite.x ?? 0) >= port.x;\n return {\n x: goRight ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: leavesPositiveSide2 ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide: leavesPositiveSide2\n };\n }\n const leavesPositiveSide = port.x > (node.x ?? 0);\n const goDown = (opposite.y ?? 0) >= port.y;\n return {\n x: leavesPositiveSide ? obs.maxX + HORIZONTAL_PIPE_MARGIN : obs.minX - HORIZONTAL_PIPE_MARGIN,\n y: goDown ? obs.maxY + VERTICAL_PIPE_MARGIN : obs.minY - VERTICAL_PIPE_MARGIN,\n leavesPositiveSide\n };\n }, \"obstacleDetour\");\n let srcHandleWaypoints = [];\n const endpointIds = [e.start, e.end];\n const srcCheck = isPointInObstacle(pSrcAnchor, endpointIds);\n if (srcCheck.inside && srcCheck.obstacle) {\n const obs = srcCheck.obstacle;\n if (srcPortIsVertical) {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, true);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n const gapY = detour.leavesPositiveSide ? Math.min(obs.minY - 2, pSrcPort.y + ANCHOR_OFFSET) : Math.max(obs.maxY + 2, pSrcPort.y - ANCHOR_OFFSET);\n srcHandleWaypoints = [\n { x: pSrcPort.x, y: gapY },\n // Orthogonal step in the gap\n { x: detour.x, y: gapY },\n // Horizontal detour\n { x: detour.x, y: detour.y }\n // Down past obstacle\n ];\n } else {\n const detour = obstacleDetour(pSrcPort, src, dst, obs, false);\n const gapX = detour.leavesPositiveSide ? Math.min(obs.minX - 2, pSrcPort.x + ANCHOR_OFFSET) : Math.max(obs.maxX + 2, pSrcPort.x - ANCHOR_OFFSET);\n pSrcAnchor.x = detour.x;\n pSrcAnchor.y = detour.y;\n srcHandleWaypoints = [\n { x: gapX, y: pSrcPort.y },\n // Orthogonal step in the gap\n { x: gapX, y: detour.y },\n // Vertical detour\n { x: detour.x, y: detour.y }\n // Horizontal past obstacle\n ];\n }\n }\n let dstHandleWaypoints = [];\n const dstCheck = isPointInObstacle(pDstAnchor, endpointIds);\n if (dstCheck.inside && dstCheck.obstacle) {\n const obs = dstCheck.obstacle;\n if (dstPortIsVertical) {\n const detour = obstacleDetour(pDstPort, dst, src, obs, true);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: pDstPort.x, y: detour.y }\n // Go sideways to port's X\n // Then orthogonally to port\n ];\n } else {\n const detour = obstacleDetour(pDstPort, dst, src, obs, false);\n pDstAnchor.x = detour.x;\n pDstAnchor.y = detour.y;\n dstHandleWaypoints = [\n { x: detour.x, y: detour.y },\n // From anchor position\n { x: detour.x, y: pDstPort.y }\n // Go vertically to port's Y\n ];\n }\n }\n if (srcHandleWaypoints.length === 0 && dstHandleWaypoints.length === 0) {\n const hpMargin = HORIZONTAL_PIPE_MARGIN;\n const anchorsSameX = Math.abs(pSrcAnchor.x - pDstAnchor.x) < hpMargin;\n const anchorsSameY = Math.abs(pSrcAnchor.y - pDstAnchor.y) < hpMargin;\n const hasPortOffset = portOffsets.get(`${i}:src`) !== void 0 || portOffsets.get(`${i}:dst`) !== void 0;\n const srcFaceTotal = (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.start ?? \"\"}:${srcPortSide}:dst`)?.length ?? 0);\n const dstFaceTotal = (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:src`)?.length ?? 0) + (portGroups.get(`${e.end ?? \"\"}:${dstPortSide}:dst`)?.length ?? 0);\n const faceContested = srcFaceTotal > 1 || dstFaceTotal > 1;\n const srcIncidentTotal = incidentEdgeTotals.get(e.start ?? \"\") ?? 0;\n const dstIncidentTotal = incidentEdgeTotals.get(e.end ?? \"\") ?? 0;\n const contestedFaceHasLabel = srcFaceTotal > 1 && faceHasLabelNode(e.start, srcPortSide) || dstFaceTotal > 1 && faceHasLabelNode(e.end, dstPortSide);\n const srcContestAllowsCenteredStraight = srcFaceTotal <= 1 || srcIncidentTotal <= 2;\n const dstContestAllowsCenteredStraight = dstFaceTotal <= 1 || dstIncidentTotal <= 2;\n const canPreserveSimpleContestedStraight = faceContested && !contestedFaceHasLabel && srcContestAllowsCenteredStraight && dstContestAllowsCenteredStraight;\n if ((anchorsSameX || anchorsSameY) && !hasPortOffset && (!faceContested || canPreserveSimpleContestedStraight)) {\n const directBlocked = isSegmentBlocked(pSrcPort, pDstPort, e.start, e.end);\n if (!directBlocked) {\n e.points = [{ ...pSrcPort }, { ...pSrcAnchor }, { ...pDstAnchor }, { ...pDstPort }];\n straightIntraLaneEdges.add(i);\n const fastPathOrientation = anchorsSameY ? \"horizontal\" : \"vertical\";\n const fastPathCoord = anchorsSameY ? pSrcPort.y : pSrcPort.x;\n const fastPathFrom = anchorsSameY ? Math.min(pSrcPort.x, pDstPort.x) : Math.min(pSrcPort.y, pDstPort.y);\n const fastPathTo = anchorsSameY ? Math.max(pSrcPort.x, pDstPort.x) : Math.max(pSrcPort.y, pDstPort.y);\n const fastPathPipe = {\n id: `fast-path-${fastPathOrientation}-${fastPathCoord.toFixed(0)}-${i}`,\n orientation: fastPathOrientation,\n coord: fastPathCoord,\n spanMin: fastPathFrom,\n spanMax: fastPathTo,\n tracks: []\n };\n allRoutedSegments.push({\n edgeIndex: i,\n segmentIndex: 0,\n orientation: fastPathOrientation,\n pipe: fastPathPipe,\n trackIndex: 0,\n from: fastPathFrom,\n to: fastPathTo\n });\n continue;\n }\n }\n }\n const srcPipe = getOrAddPipe(\"vertical\", pSrcAnchor.x, pSrcAnchor.y, pSrcAnchor.y);\n pSrcAnchor.x = srcPipe.coord;\n const dstPipe = getOrAddPipe(\"vertical\", pDstAnchor.x, pDstAnchor.y, pDstAnchor.y);\n pDstAnchor.x = dstPipe.coord;\n let bbMinX = Math.min(pSrcAnchor.x, pDstAnchor.x) - 50;\n let bbMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x) + 50;\n let bbMinY = Math.min(pSrcAnchor.y, pDstAnchor.y) - 50;\n let bbMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y) + 50;\n for (const obs of obstacles) {\n const pathMinX = Math.min(pSrcAnchor.x, pDstAnchor.x);\n const pathMaxX = Math.max(pSrcAnchor.x, pDstAnchor.x);\n const pathMinY = Math.min(pSrcAnchor.y, pDstAnchor.y);\n const pathMaxY = Math.max(pSrcAnchor.y, pDstAnchor.y);\n const obsBlocksPath = obs.minX < pathMaxX && obs.maxX > pathMinX && obs.minY < pathMaxY && obs.maxY > pathMinY;\n if (obsBlocksPath) {\n bbMinX = Math.min(bbMinX, obs.minX - ROUTING_MARGIN);\n bbMaxX = Math.max(bbMaxX, obs.maxX + ROUTING_MARGIN);\n bbMinY = Math.min(bbMinY, obs.minY - ROUTING_MARGIN);\n bbMaxY = Math.max(bbMaxY, obs.maxY + ROUTING_MARGIN);\n }\n }\n for (const obs of obstacles) {\n if (obs.maxX < bbMinX || obs.minX > bbMaxX || obs.maxY < bbMinY || obs.minY > bbMaxY) {\n continue;\n }\n const hMargin = HORIZONTAL_PIPE_MARGIN;\n getOrAddPipe(\"horizontal\", obs.minY - hMargin, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", obs.maxY + hMargin, bbMinX, bbMaxX);\n const vMargin = VERTICAL_PIPE_MARGIN;\n getOrAddPipe(\"vertical\", obs.minX - vMargin, bbMinY, bbMaxY);\n getOrAddPipe(\"vertical\", obs.maxX + vMargin, bbMinY, bbMaxY);\n }\n getOrAddPipe(\"horizontal\", pSrcAnchor.y, bbMinX, bbMaxX);\n getOrAddPipe(\"horizontal\", pDstAnchor.y, bbMinX, bbMaxX);\n const hPipes = pipes.filter(\n (p) => p.orientation === \"horizontal\" && p.coord >= bbMinY && p.coord <= bbMaxY\n );\n const vPipes = pipes.filter(\n (p) => p.orientation === \"vertical\" && p.coord >= bbMinX && p.coord <= bbMaxX\n );\n const getKey = /* @__PURE__ */ __name((x, y) => `${x.toFixed(1)},${y.toFixed(1)}`, \"getKey\");\n const startKey = getKey(pSrcAnchor.x, pSrcAnchor.y);\n const endKey = getKey(pDstAnchor.x, pDstAnchor.y);\n const gScore = /* @__PURE__ */ new Map();\n const cameFrom = /* @__PURE__ */ new Map();\n const arrivalDir = /* @__PURE__ */ new Map();\n const openSet = /* @__PURE__ */ new Set();\n const openList = [];\n gScore.set(startKey, 0);\n arrivalDir.set(startKey, \"n\");\n openList.push({\n key: startKey,\n f: Math.hypot(pDstAnchor.x - pSrcAnchor.x, pDstAnchor.y - pSrcAnchor.y),\n pt: pSrcAnchor\n });\n openSet.add(startKey);\n let foundPath = [];\n const checkSegmentBlocked = /* @__PURE__ */ __name((p1, p2) => {\n return isSegmentBlocked(p1, p2, e.start, e.end);\n }, \"checkSegmentBlocked\");\n const cornerHV = { x: pDstAnchor.x, y: pSrcAnchor.y };\n const seg1HV_blocked = checkSegmentBlocked(pSrcAnchor, cornerHV);\n const seg2HV_blocked = checkSegmentBlocked(cornerHV, pDstAnchor);\n const pathHV_blocked = seg1HV_blocked || seg2HV_blocked;\n const cornerVH = { x: pSrcAnchor.x, y: pDstAnchor.y };\n const seg1VH_blocked = checkSegmentBlocked(pSrcAnchor, cornerVH);\n const seg2VH_blocked = checkSegmentBlocked(cornerVH, pDstAnchor);\n const pathVH_blocked = seg1VH_blocked || seg2VH_blocked;\n if (!pathHV_blocked) {\n if (Math.abs(pSrcAnchor.y - pDstAnchor.y) < EPS7 || Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerHV, pDstAnchor];\n }\n } else if (!pathVH_blocked) {\n if (Math.abs(pSrcAnchor.x - pDstAnchor.x) < EPS7) {\n foundPath = [pSrcAnchor, pDstAnchor];\n } else {\n foundPath = [pSrcAnchor, cornerVH, pDstAnchor];\n }\n }\n if (foundPath.length === 0) {\n while (openList.length > 0) {\n openList.sort((a, b) => a.f - b.f);\n const current = openList.shift();\n openSet.delete(current.key);\n if (current.key === endKey) {\n let currKey = endKey;\n let currPt = pDstAnchor;\n foundPath = [currPt];\n while (cameFrom.has(currKey)) {\n const prev = cameFrom.get(currKey);\n foundPath.unshift(prev);\n currPt = prev;\n currKey = getKey(prev.x, prev.y);\n }\n break;\n }\n const cx = current.pt.x;\n const cy = current.pt.y;\n const sortedVPipes = vPipes.sort((a, b) => a.coord - b.coord);\n const vIdx = sortedVPipes.findIndex((p) => Math.abs(p.coord - cx) < 1);\n const hPipesSorted = hPipes.sort((a, b) => a.coord - b.coord);\n const hIdx = hPipesSorted.findIndex((p) => Math.abs(p.coord - cy) < 1);\n const neighbors = [];\n if (vIdx > 0) {\n neighbors.push({ x: sortedVPipes[vIdx - 1].coord, y: cy });\n }\n if (vIdx >= 0 && vIdx < sortedVPipes.length - 1) {\n neighbors.push({ x: sortedVPipes[vIdx + 1].coord, y: cy });\n }\n if (hIdx > 0) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx - 1].coord });\n }\n if (hIdx >= 0 && hIdx < hPipesSorted.length - 1) {\n neighbors.push({ x: cx, y: hPipesSorted[hIdx + 1].coord });\n }\n for (const neighbor of neighbors) {\n const minX = Math.min(cx, neighbor.x);\n const maxX = Math.max(cx, neighbor.x);\n const minY = Math.min(cy, neighbor.y);\n const maxY = Math.max(cy, neighbor.y);\n const blocked = obstacles.some((obs) => {\n if (obs.nodeId === e.start || obs.nodeId === e.end) {\n return false;\n }\n if (minX !== maxX) {\n return obs.minY < cy && obs.maxY > cy && obs.maxX > minX && obs.minX < maxX;\n } else {\n return obs.minX < cx && obs.maxX > cx && obs.maxY > minY && obs.minY < maxY;\n }\n });\n if (blocked) {\n continue;\n }\n const nKey = getKey(neighbor.x, neighbor.y);\n const dist = Math.abs(neighbor.x - cx) + Math.abs(neighbor.y - cy);\n const penalty = crossingPenalty(i, current.pt, neighbor);\n let dirPenalty = 0;\n const destDx = pDstAnchor.x - pSrcAnchor.x;\n const destDy = pDstAnchor.y - pSrcAnchor.y;\n const moveDx = neighbor.x - cx;\n const moveDy = neighbor.y - cy;\n if (destDy > 10 && moveDy < -5 || destDy < -10 && moveDy > 5) {\n dirPenalty = Math.abs(moveDy) * 100;\n }\n if (destDx > 10 && moveDx < -5 || destDx < -10 && moveDx > 5) {\n dirPenalty += Math.abs(moveDx) * 50;\n }\n let bendPenalty = 0;\n const currentDir = arrivalDir.get(current.key) ?? \"n\";\n const moveDir = Math.abs(moveDx) > EPS7 ? \"h\" : \"v\";\n if (currentDir !== \"n\" && currentDir !== moveDir) {\n bendPenalty = 50;\n }\n const stepCost = dist + penalty + dirPenalty + bendPenalty;\n const tentativeG = (gScore.get(current.key) ?? Infinity) + stepCost;\n const h = Math.abs(pDstAnchor.x - neighbor.x) + Math.abs(pDstAnchor.y - neighbor.y);\n if (tentativeG < (gScore.get(nKey) ?? Infinity)) {\n cameFrom.set(nKey, current.pt);\n gScore.set(nKey, tentativeG);\n arrivalDir.set(nKey, moveDir);\n if (!openSet.has(nKey)) {\n openList.push({ key: nKey, f: tentativeG + h, pt: neighbor });\n openSet.add(nKey);\n } else {\n const idx = openList.findIndex((x) => x.key === nKey);\n if (idx !== -1) {\n openList[idx].f = tentativeG + h;\n }\n }\n }\n }\n }\n }\n if (foundPath.length === 0) {\n foundPath = [pSrcAnchor, { x: pSrcAnchor.x, y: pDstAnchor.y }, pDstAnchor];\n }\n if (foundPath.length > 4) {\n const start = foundPath[0];\n const end = foundPath[foundPath.length - 1];\n let minX = Math.min(start.x, end.x);\n let maxX = Math.max(start.x, end.x);\n let minY = Math.min(start.y, end.y);\n let maxY = Math.max(start.y, end.y);\n for (const pt of foundPath) {\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n minY = Math.min(minY, pt.y);\n maxY = Math.max(maxY, pt.y);\n }\n const wentRight = maxX > Math.max(start.x, end.x);\n const wentLeft = minX < Math.min(start.x, end.x);\n if (isLR) {\n const margin = VERTICAL_PIPE_MARGIN;\n if (wentRight) {\n const pathX = Math.max(start.x, end.x);\n const pathMinY = Math.min(start.y, end.y);\n const pathMaxY = Math.max(start.y, end.y);\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < pathX && obs.maxX > pathX && // obstacle's x-range contains the path x\n obs.minY < pathMaxY && obs.maxY > pathMinY\n // obstacle's y-range overlaps with path y-range\n );\n if (detourObstacles.length > 0) {\n let visualMaxX = Math.max(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n if (obs.visualXHalfExtent === void 0 || isNaN(obs.visualXHalfExtent)) {\n continue;\n }\n const visualRight = obsCenterX + obs.visualXHalfExtent + margin;\n visualMaxX = Math.max(visualMaxX, visualRight);\n }\n if (!isNaN(visualMaxX)) {\n maxX = visualMaxX;\n }\n }\n }\n if (wentLeft) {\n const detourObstacles = obstacles.filter(\n (obs) => obs.minX < Math.min(start.x, end.x) + margin && // obstacle extends past the direct path\n obs.minY < Math.max(start.y, end.y) && obs.maxY > Math.min(start.y, end.y)\n // obstacle is in Y range\n );\n if (detourObstacles.length > 0) {\n let visualMinX = Math.min(start.x, end.x);\n for (const obs of detourObstacles) {\n const obsCenterX = (obs.minX + obs.maxX) / 2;\n const visualLeft = obsCenterX - obs.visualXHalfExtent - margin;\n visualMinX = Math.min(visualMinX, visualLeft);\n }\n minX = visualMinX;\n }\n }\n }\n const findBestReturnY = /* @__PURE__ */ __name((detourX) => {\n const goingDown = end.y > start.y;\n const relevantObs = obstacles.filter((obs) => {\n const obsInXRange = Math.min(start.x, end.x) < obs.maxX && Math.max(start.x, end.x) > obs.minX;\n const obsInYRange = Math.min(start.y, end.y) < obs.maxY && Math.max(start.y, end.y) > obs.minY;\n return obsInXRange && obsInYRange;\n });\n let filteredObs = relevantObs;\n if (isLR && relevantObs.length > 0) {\n const obsAtDetourX = relevantObs.filter(\n (obs) => obs.minX < detourX && obs.maxX > detourX\n );\n if (obsAtDetourX.length > 0) {\n filteredObs = obsAtDetourX;\n }\n }\n if (filteredObs.length === 0) {\n return end.y;\n }\n const margin = HORIZONTAL_PIPE_MARGIN;\n if (goingDown) {\n const lowestObsBottom = Math.max(...filteredObs.map((obs) => obs.maxY));\n const bestY = lowestObsBottom + margin;\n if (bestY < end.y - EPS7) {\n return bestY;\n }\n } else {\n const highestObsTop = Math.min(...filteredObs.map((obs) => obs.minY));\n const bestY = highestObsTop - margin;\n if (bestY > end.y + EPS7) {\n return bestY;\n }\n }\n return end.y;\n }, \"findBestReturnY\");\n const trySimplifyWithDetourX = /* @__PURE__ */ __name((detourX) => {\n const bestY = findBestReturnY(detourX);\n const corner1 = { x: detourX, y: start.y };\n const corner2 = { x: detourX, y: bestY };\n const corner3 = { x: end.x, y: bestY };\n const seg1Blocked = checkSegmentBlocked(start, corner1);\n const seg2Blocked = checkSegmentBlocked(corner1, corner2);\n const seg3Blocked = checkSegmentBlocked(corner2, corner3);\n const seg4Blocked = bestY !== end.y ? checkSegmentBlocked(corner3, end) : false;\n if (!seg1Blocked && !seg2Blocked && !seg3Blocked && !seg4Blocked) {\n if (Math.abs(bestY - end.y) < EPS7) {\n return [start, corner1, corner2, end];\n }\n return [start, corner1, corner2, corner3, end];\n }\n return null;\n }, \"trySimplifyWithDetourX\");\n const simplified2 = wentRight && !wentLeft ? trySimplifyWithDetourX(maxX) : wentLeft && !wentRight ? trySimplifyWithDetourX(minX) : null;\n if (simplified2) {\n foundPath = simplified2;\n }\n }\n const fullPoints = [\n pSrcPort,\n ...srcHandleWaypoints,\n ...foundPath,\n ...dstHandleWaypoints.reverse(),\n // Reverse because they're stored anchor->waypoint->port\n pDstPort\n ];\n if (fullPoints.length >= 3) {\n const C = fullPoints[fullPoints.length - 1];\n const B = fullPoints[fullPoints.length - 2];\n const A = fullPoints[fullPoints.length - 3];\n const isHoriz = Math.abs(A.y - B.y) < EPS7 && Math.abs(B.y - C.y) < EPS7;\n const isVert = Math.abs(A.x - B.x) < EPS7 && Math.abs(B.x - C.x) < EPS7;\n if (isHoriz) {\n const signAB = Math.sign(B.x - A.x);\n const signAC = Math.sign(C.x - A.x);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.x - A.x) > Math.abs(C.x - A.x)) {\n fullPoints.splice(-2, 1);\n }\n } else if (isVert) {\n const signAB = Math.sign(B.y - A.y);\n const signAC = Math.sign(C.y - A.y);\n if (signAB !== 0 && signAB === signAC && Math.abs(B.y - A.y) > Math.abs(C.y - A.y)) {\n fullPoints.splice(-2, 1);\n }\n }\n }\n const simplified = [fullPoints[0]];\n for (let k = 1; k < fullPoints.length - 1; k++) {\n if (k === 1) {\n simplified.push(fullPoints[k]);\n continue;\n }\n const prev = simplified[simplified.length - 1];\n const curr = fullPoints[k];\n const next = fullPoints[k + 1];\n if (Math.abs(prev.y - curr.y) < EPS7 && Math.abs(curr.y - next.y) < EPS7) {\n const dir1 = curr.x > prev.x;\n const dir2 = next.x > curr.x;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n if (Math.abs(prev.x - curr.x) < EPS7 && Math.abs(curr.x - next.x) < EPS7) {\n const dir1 = curr.y > prev.y;\n const dir2 = next.y > curr.y;\n if (dir1 !== dir2) {\n simplified.push(curr);\n continue;\n }\n continue;\n }\n simplified.push(curr);\n }\n simplified.push(fullPoints[fullPoints.length - 1]);\n for (let k = 0; k < simplified.length - 1; k++) {\n const p1 = simplified[k];\n const p2 = simplified[k + 1];\n const orientation = Math.abs(p1.x - p2.x) < EPS7 ? \"vertical\" : \"horizontal\";\n const coord = orientation === \"vertical\" ? p1.x : p1.y;\n const from = orientation === \"vertical\" ? Math.min(p1.y, p2.y) : Math.min(p1.x, p2.x);\n const to = orientation === \"vertical\" ? Math.max(p1.y, p2.y) : Math.max(p1.x, p2.x);\n const pipe = getOrAddPipe(orientation, coord, from, to);\n const rSeg = {\n edgeIndex: i,\n segmentIndex: k,\n orientation,\n pipe,\n trackIndex: 0,\n // Initial track\n from,\n to\n };\n allRoutedSegments.push(rSeg);\n edgeSegmentIndices[i].push(allRoutedSegments.length - 1);\n if (!pipe.tracks[0]) {\n pipe.tracks[0] = { index: 0, coord: pipe.coord, segments: [] };\n }\n pipe.tracks[0].segments.push({\n edgeIndex: i,\n segmentIndex: k,\n from,\n to\n });\n }\n }\n const segmentsOverlap = /* @__PURE__ */ __name((s1, s2) => {\n return s1.from < s2.to && s2.from < s1.to;\n }, \"segmentsOverlap\");\n const trySwapSegmentsAcrossTracks = /* @__PURE__ */ __name((s1, s2, t1, t2) => {\n const canS1GoT2 = !t2.segments.some(\n (r) => (r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex) && segmentsOverlap(r, s1)\n );\n const canS2GoT1 = !t1.segments.some(\n (r) => (r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex) && segmentsOverlap(r, s2)\n );\n if (canS1GoT2 && canS2GoT1) {\n s1.trackIndex = t2.index;\n s2.trackIndex = t1.index;\n t1.segments = [\n ...t1.segments.filter(\n (r) => r.edgeIndex !== s1.edgeIndex || r.segmentIndex !== s1.segmentIndex\n ),\n {\n edgeIndex: s2.edgeIndex,\n segmentIndex: s2.segmentIndex,\n from: s2.from,\n to: s2.to\n }\n ];\n t2.segments = [\n ...t2.segments.filter(\n (r) => r.edgeIndex !== s2.edgeIndex || r.segmentIndex !== s2.segmentIndex\n ),\n {\n edgeIndex: s1.edgeIndex,\n segmentIndex: s1.segmentIndex,\n from: s1.from,\n to: s1.to\n }\n ];\n return true;\n }\n return false;\n }, \"trySwapSegmentsAcrossTracks\");\n const createNewTrack = /* @__PURE__ */ __name((pipe) => {\n const idx = pipe.tracks.length;\n pipe.tracks[idx] = { index: idx, coord: pipe.coord, segments: [] };\n return idx;\n }, \"createNewTrack\");\n const moveSegmentToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const oldTrack = seg.pipe.tracks[seg.trackIndex];\n oldTrack.segments = oldTrack.segments.filter(\n (r) => r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex\n );\n seg.trackIndex = trackIdx;\n const newTrack = seg.pipe.tracks[trackIdx];\n newTrack.segments.push({\n edgeIndex: seg.edgeIndex,\n segmentIndex: seg.segmentIndex,\n from: seg.from,\n to: seg.to\n });\n }, \"moveSegmentToTrack\");\n const moveSegmentChainToTrack = /* @__PURE__ */ __name((seg, trackIdx) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n for (const idx of indices) {\n const s = allRoutedSegments[idx];\n if (s.pipe === seg.pipe) {\n moveSegmentToTrack(s, trackIdx);\n }\n }\n }, \"moveSegmentChainToTrack\");\n const getAdjacentSegmentsAlongEdge = /* @__PURE__ */ __name((seg) => {\n const indices = edgeSegmentIndices[seg.edgeIndex];\n const idxInList = indices.indexOf(allRoutedSegments.indexOf(seg));\n const adj = [];\n if (idxInList > 0) {\n adj.push(allRoutedSegments[indices[idxInList - 1]]);\n }\n if (idxInList < indices.length - 1) {\n adj.push(allRoutedSegments[indices[idxInList + 1]]);\n }\n return adj;\n }, \"getAdjacentSegmentsAlongEdge\");\n const haveAnyCrossing = /* @__PURE__ */ __name((segA, segB) => {\n if (segA.orientation === segB.orientation) {\n return false;\n }\n const h = segA.orientation === \"horizontal\" ? segA : segB;\n const v = segA.orientation === \"horizontal\" ? segB : segA;\n return v.pipe.coord > h.from && v.pipe.coord < h.to && h.pipe.coord > v.from && h.pipe.coord < v.to;\n }, \"haveAnyCrossing\");\n const findAvailableTrack = /* @__PURE__ */ __name((pipe, seg) => {\n for (const track of pipe.tracks) {\n const overlap = track.segments.some(\n (r) => (r.edgeIndex !== seg.edgeIndex || r.segmentIndex !== seg.segmentIndex) && segmentsOverlap(r, seg)\n );\n if (!overlap) {\n return track.index;\n }\n }\n return -1;\n }, \"findAvailableTrack\");\n const segmentsConflict = /* @__PURE__ */ __name((s1, s2) => {\n if (s1.trackIndex === s2.trackIndex) {\n return segmentsOverlap(s1, s2);\n }\n const adj1 = getAdjacentSegmentsAlongEdge(s1);\n const adj2 = getAdjacentSegmentsAlongEdge(s2);\n return adj1.some((a1) => adj2.some((a2) => haveAnyCrossing(a1, a2)));\n }, \"segmentsConflict\");\n const resolveTrackConflict = /* @__PURE__ */ __name((s1, s2, move) => {\n if (trySwapSegmentsAcrossTracks(\n s1,\n s2,\n s1.pipe.tracks[s1.trackIndex],\n s2.pipe.tracks[s2.trackIndex]\n )) {\n return;\n }\n const avail = findAvailableTrack(s1.pipe, s2);\n move(s2, avail !== -1 ? avail : createNewTrack(s1.pipe));\n }, \"resolveTrackConflict\");\n const resolveHandleConflicts = /* @__PURE__ */ __name((handles) => {\n let crossings = 0;\n for (let i = 0; i < handles.length; i++) {\n for (let j = i + 1; j < handles.length; j++) {\n const h1 = handles[i];\n const h2 = handles[j];\n if (h1.pipe !== h2.pipe) {\n continue;\n }\n if (segmentsConflict(h1, h2)) {\n crossings++;\n resolveTrackConflict(h1, h2, moveSegmentChainToTrack);\n }\n }\n }\n return crossings;\n }, \"resolveHandleConflicts\");\n const destInfoCache = /* @__PURE__ */ new Map();\n const getDestInfo = /* @__PURE__ */ __name((edgeIdx) => {\n if (destInfoCache.has(edgeIdx)) {\n return destInfoCache.get(edgeIdx);\n }\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length === 0) {\n const info2 = { dest: 0, deviation: 0, base: 0, delta: 0 };\n destInfoCache.set(edgeIdx, info2);\n return info2;\n }\n const firstSeg = allRoutedSegments[indices[0]];\n const base = firstSeg.pipe.coord;\n let dest = base;\n for (let idx = 1; idx < indices.length; idx++) {\n const seg = allRoutedSegments[indices[idx]];\n if (seg.orientation === \"horizontal\") {\n const candidateA = seg.from;\n const candidateB = seg.to;\n dest = Math.abs(candidateA - base) > Math.abs(candidateB - base) ? candidateA : candidateB;\n break;\n }\n }\n const deviation = Math.abs(dest - base);\n const info = { dest, deviation, base, delta: dest - base };\n destInfoCache.set(edgeIdx, info);\n return info;\n }, \"getDestInfo\");\n const fixSourceHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesBySource = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n if (edgeSegmentIndices[i].length === 0) {\n continue;\n }\n if (!e.start) {\n continue;\n }\n if (!edgesBySource.has(e.start)) {\n edgesBySource.set(e.start, []);\n }\n edgesBySource.get(e.start).push(i);\n }\n const getEdgeDistance = /* @__PURE__ */ __name((edgeIdx) => {\n const edge = edges[edgeIdx];\n if (!edge.start || !edge.end) {\n return 0;\n }\n const srcNode = nodeById.get(edge.start);\n const dstNode = nodeById.get(edge.end);\n if (!srcNode || !dstNode) {\n return 0;\n }\n const dx = (dstNode.x ?? 0) - (srcNode.x ?? 0);\n const dy = (dstNode.y ?? 0) - (srcNode.y ?? 0);\n return Math.abs(dx) + Math.abs(dy);\n }, \"getEdgeDistance\");\n for (const grp of edgesBySource.values()) {\n grp.sort((a, b) => {\n const infoA = getDestInfo(a);\n const infoB = getDestInfo(b);\n if (Math.abs(infoA.deviation - infoB.deviation) > 1) {\n return infoA.deviation - infoB.deviation;\n }\n if (Math.abs(infoA.dest - infoB.dest) > 1) {\n return infoA.dest - infoB.dest;\n }\n const distA = getEdgeDistance(a);\n const distB = getEdgeDistance(b);\n if (Math.abs(distA - distB) > 1) {\n return distB - distA;\n }\n const lenA = edgeSegmentIndices[a].length;\n const lenB = edgeSegmentIndices[b].length;\n if (lenA !== lenB) {\n return lenA - lenB;\n }\n if (lenA === 1) {\n const idxA = edgeSegmentIndices[a][0];\n const idxB = edgeSegmentIndices[b][0];\n if (allRoutedSegments[idxA] && allRoutedSegments[idxB]) {\n const segA = allRoutedSegments[idxA];\n const segB = allRoutedSegments[idxB];\n const distA2 = Math.abs(segA.to - segA.from);\n const distB2 = Math.abs(segB.to - segB.from);\n if (Math.abs(distA2 - distB2) > 1) {\n return distA2 - distB2;\n }\n }\n }\n return 0;\n });\n const handles = grp.map((ei) => allRoutedSegments[edgeSegmentIndices[ei][0]]);\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixSourceHandleCrossings\");\n const fixTargetHandleCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n const edgesByTarget = /* @__PURE__ */ new Map();\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i];\n if (indices.length === 0) {\n continue;\n }\n if (!e.end) {\n continue;\n }\n if (!edgesByTarget.has(e.end)) {\n edgesByTarget.set(e.end, []);\n }\n edgesByTarget.get(e.end).push(i);\n }\n for (const grp of edgesByTarget.values()) {\n grp.sort((a, b) => {\n const getDist = /* @__PURE__ */ __name((edgeIdx) => {\n const indices = edgeSegmentIndices[edgeIdx];\n if (indices.length < 2) {\n return 0;\n }\n const prev = allRoutedSegments[indices[indices.length - 2]];\n return Math.abs(prev.to - prev.from);\n }, \"getDist\");\n const scoreA = getDist(a);\n const scoreB = getDist(b);\n if (Math.abs(scoreA - scoreB) > 0.1) {\n return scoreA - scoreB;\n }\n return a - b;\n });\n const handles = grp.map(\n (ei) => allRoutedSegments[edgeSegmentIndices[ei][edgeSegmentIndices[ei].length - 1]]\n );\n crossings += resolveHandleConflicts(handles);\n }\n return crossings;\n }, \"fixTargetHandleCrossings\");\n const fixPipeCrossings = /* @__PURE__ */ __name(() => {\n let crossings = 0;\n for (const pipe of pipes) {\n const pipeSegments = [];\n for (const t of pipe.tracks) {\n for (const ref of t.segments) {\n const idx = edgeSegmentIndices[ref.edgeIndex].find(\n (ix) => allRoutedSegments[ix].segmentIndex === ref.segmentIndex\n );\n if (idx !== void 0) {\n pipeSegments.push(allRoutedSegments[idx]);\n }\n }\n }\n pipeSegments.sort((a, b) => a.edgeIndex - b.edgeIndex || a.segmentIndex - b.segmentIndex);\n for (let i = 0; i < pipeSegments.length; i++) {\n for (let j = i + 1; j < pipeSegments.length; j++) {\n const s1 = pipeSegments[i];\n const s2 = pipeSegments[j];\n if (segmentsConflict(s1, s2)) {\n crossings++;\n resolveTrackConflict(s1, s2, moveSegmentToTrack);\n }\n }\n }\n }\n return crossings;\n }, \"fixPipeCrossings\");\n let iterations = 0;\n const MAX_ITER = 10;\n while (iterations < MAX_ITER) {\n let changed = 0;\n changed += fixSourceHandleCrossings();\n changed += fixTargetHandleCrossings();\n changed += fixPipeCrossings();\n if (changed === 0) {\n break;\n }\n iterations++;\n }\n const segmentCoords = /* @__PURE__ */ new Map();\n for (const pipe of pipes) {\n const segments = [];\n pipe.tracks.forEach((t) => {\n t.segments.forEach((s) => {\n segments.push({\n edgeIndex: s.edgeIndex,\n segmentIndex: s.segmentIndex,\n trackIndex: t.index,\n from: s.from,\n to: s.to\n });\n });\n });\n segments.sort((a, b) => a.from - b.from);\n const clusters = [];\n if (segments.length > 0) {\n let currentCluster = [segments[0]];\n let clusterEnd = segments[0].to;\n for (let k = 1; k < segments.length; k++) {\n const s = segments[k];\n if (s.from < clusterEnd) {\n currentCluster.push(s);\n clusterEnd = Math.max(clusterEnd, s.to);\n } else {\n clusters.push(currentCluster);\n currentCluster = [s];\n clusterEnd = s.to;\n }\n }\n clusters.push(currentCluster);\n }\n for (const cluster of clusters) {\n const usedTracks = /* @__PURE__ */ new Set();\n cluster.forEach((s) => usedTracks.add(s.trackIndex));\n const trackScores = /* @__PURE__ */ new Map();\n cluster.forEach((s) => {\n const info = getDestInfo(s.edgeIndex);\n trackScores.set(s.trackIndex, (trackScores.get(s.trackIndex) ?? 0) + info.delta);\n });\n const leftTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) < -1);\n const rightTracks = [...usedTracks].filter((t) => (trackScores.get(t) ?? 0) > 1);\n const neutralTracks = [...usedTracks].filter((t) => Math.abs(trackScores.get(t) ?? 0) <= 1);\n leftTracks.sort((a, b) => (trackScores.get(b) ?? 0) - (trackScores.get(a) ?? 0));\n rightTracks.sort((a, b) => (trackScores.get(a) ?? 0) - (trackScores.get(b) ?? 0));\n const assignCoord = /* @__PURE__ */ __name((trackIndex, coord) => {\n cluster.filter((s) => s.trackIndex === trackIndex).forEach((s) => {\n const effectiveCoord = straightIntraLaneEdges.has(s.edgeIndex) ? pipe.coord : coord;\n segmentCoords.set(`${s.edgeIndex}-${s.segmentIndex}`, effectiveCoord);\n });\n }, \"assignCoord\");\n let leftCount = 0;\n for (const trackIndex of leftTracks) {\n leftCount++;\n assignCoord(trackIndex, pipe.coord - leftCount * TRACK_SPACING);\n }\n if (neutralTracks.length === 0 && usedTracks.size > 0) {\n const bestTrack = [...usedTracks].sort(\n (a, b) => Math.abs(trackScores.get(a) ?? 0) - Math.abs(trackScores.get(b) ?? 0)\n )[0];\n const leftIdx = leftTracks.indexOf(bestTrack);\n if (leftIdx !== -1) {\n leftTracks.splice(leftIdx, 1);\n }\n const rightIdx = rightTracks.indexOf(bestTrack);\n if (rightIdx !== -1) {\n rightTracks.splice(rightIdx, 1);\n }\n neutralTracks.push(bestTrack);\n }\n let neutralAssigned = 0;\n for (const trackIndex of neutralTracks) {\n if (neutralAssigned === 0) {\n assignCoord(trackIndex, pipe.coord);\n } else {\n const dir = neutralAssigned % 2 === 1 ? 1 : -1;\n const magnitude = Math.ceil(neutralAssigned / 2);\n assignCoord(trackIndex, pipe.coord + dir * magnitude * TRACK_SPACING * 0.5);\n }\n neutralAssigned++;\n }\n let rightCount = 0;\n for (const trackIndex of rightTracks) {\n rightCount++;\n assignCoord(trackIndex, pipe.coord + rightCount * TRACK_SPACING);\n }\n }\n }\n for (const [i, e] of edges.entries()) {\n const indices = edgeSegmentIndices[i] ?? [];\n if (indices.length === 0) {\n continue;\n }\n const newPoints = [];\n const src = nodeById.get(e.start);\n const dst = nodeById.get(e.end);\n const { pSrcPort, pDstPort } = portsForEdge(i, src, dst);\n const lines = indices.map((idx) => {\n const s = allRoutedSegments[idx];\n const coord = segmentCoords.get(`${s.edgeIndex}-${s.segmentIndex}`) ?? s.pipe.coord;\n return {\n orient: s.orientation,\n coord,\n from: s.from,\n to: s.to\n };\n });\n newPoints.push(pSrcPort);\n for (let k = 0; k < lines.length; k++) {\n const line = lines[k];\n const prevPt = newPoints[newPoints.length - 1];\n const prevAlong = line.orient === \"vertical\" ? prevPt.y : prevPt.x;\n const prevTrackCoord = line.orient === \"vertical\" ? prevPt.x : prevPt.y;\n const nextLine = lines[k + 1];\n const hasNextLine = k < lines.length - 1;\n if (Math.abs(prevTrackCoord - line.coord) > EPS7) {\n newPoints.push(pointOnLine(line, prevAlong));\n }\n if (hasNextLine && nextLine.orient === line.orient) {\n if (Math.abs(line.coord - nextLine.coord) > EPS7) {\n const junction = line.orient === \"vertical\" ? (prevAlong + nextLine.from) / 2 : sharedLineEndpointCoord(line, nextLine);\n newPoints.push(pointOnLine(line, junction), pointOnLine(nextLine, junction));\n } else if (k === 0 || k === lines.length - 2) {\n newPoints.push(pointOnLine(line, sharedLineEndpointCoord(line, nextLine)));\n }\n } else if (hasNextLine) {\n newPoints.push(pointOnLine(line, nextLine.coord));\n } else {\n const endAlong = Math.abs(line.from - prevAlong) < Math.abs(line.to - prevAlong) ? line.to : line.from;\n newPoints.push(pointOnLine(line, endAlong));\n }\n }\n const last = newPoints[newPoints.length - 1];\n if (Math.abs(last.x - pDstPort.x) > EPS7 || Math.abs(last.y - pDstPort.y) > EPS7) {\n newPoints.push(pDstPort);\n }\n const filtered = [];\n if (newPoints.length > 0) {\n filtered.push(newPoints[0]);\n }\n for (let k = 1; k < newPoints.length; k++) {\n const p = newPoints[k];\n const prev = filtered[filtered.length - 1];\n if (Math.abs(p.x - prev.x) > EPS7 || Math.abs(p.y - prev.y) > EPS7) {\n filtered.push(p);\n }\n }\n e.points = filtered;\n }\n for (const re of edges) {\n const orig = re.__originalEdge;\n if (orig && re.points) {\n orig.points = re.points;\n }\n }\n data.edges = (data.edges ?? []).filter((e) => !e.isLayoutOnly);\n const nodeBoundaryClamp = /* @__PURE__ */ __name((p, node) => {\n const cx = node.x ?? 0;\n const cy = node.y ?? 0;\n const w = node.width ?? 0;\n const h = node.height ?? 0;\n if (w <= 0 || h <= 0) {\n return p;\n }\n const left = cx - w / 2;\n const right = cx + w / 2;\n const top = cy - h / 2;\n const bottom = cy + h / 2;\n if (p.x < left || p.x > right || p.y < top || p.y > bottom) {\n return p;\n }\n const dLeft = p.x - left;\n const dRight = right - p.x;\n const dTop = p.y - top;\n const dBottom = bottom - p.y;\n const minD = Math.min(dLeft, dRight, dTop, dBottom);\n if (minD === dLeft) {\n return { x: left, y: p.y };\n }\n if (minD === dRight) {\n return { x: right, y: p.y };\n }\n if (minD === dTop) {\n return { x: p.x, y: top };\n }\n return { x: p.x, y: bottom };\n }, \"nodeBoundaryClamp\");\n for (const edge of data.edges) {\n const pts = edge.points;\n if (!pts || pts.length < 2) {\n continue;\n }\n const srcId = edge.start;\n const dstId = edge.end;\n const src = srcId ? nodeById.get(srcId) : void 0;\n const dst = dstId ? nodeById.get(dstId) : void 0;\n if (src) {\n pts[0] = nodeBoundaryClamp(pts[0], src);\n }\n if (dst) {\n pts[pts.length - 1] = nodeBoundaryClamp(pts[pts.length - 1], dst);\n }\n }\n return data;\n}\n__name(routeEdgesOrthogonal, \"routeEdgesOrthogonal\");\n\n// src/rendering-util/layout-algorithms/swimlanes/layoutCore.ts\nfunction getSwimlaneDirection(data4Layout) {\n return data4Layout.direction ?? \"TB\";\n}\n__name(getSwimlaneDirection, \"getSwimlaneDirection\");\nfunction runSwimlaneLayoutCore(data4Layout) {\n const g = toGraphView(data4Layout);\n const nodeGap = data4Layout.config.flowchart?.nodeSpacing ?? 40;\n const layerGap = data4Layout.config.flowchart?.rankSpacing ?? 100;\n const ignoreCrossLaneEdges = data4Layout.config.swimlane?.ignoreCrossLaneEdges ?? true;\n const optimizeRanksByCrossings2 = data4Layout.config.swimlane?.optimizeRanksByCrossings ?? true;\n const automaticLaneOrdering = data4Layout.config.swimlane?.automaticLaneOrdering ?? false;\n const direction = getSwimlaneDirection(data4Layout);\n const { ordered, coordinates } = sugiyamaLayout(g, {\n nodeGap,\n layerGap,\n ignoreCrossLaneEdges,\n optimizeRanksByCrossings: optimizeRanksByCrossings2,\n automaticLaneOrdering,\n direction\n });\n writeBackToLayoutData(g, ordered, coordinates, { nodeGap, layerGap });\n for (const edge of data4Layout.edges ?? []) {\n delete edge.points;\n }\n routeEdgesOrthogonal(data4Layout, direction);\n for (const edge of data4Layout.edges ?? []) {\n if (!edge.curve || edge.curve === \"basis\") {\n edge.curve = \"rounded\";\n }\n }\n postProcessSwimlaneLayout(data4Layout, direction);\n validateSwimlanesLayout(data4Layout);\n return direction;\n}\n__name(runSwimlaneLayoutCore, \"runSwimlaneLayoutCore\");\n\n// src/rendering-util/layout-algorithms/swimlanes/index.ts\nasync function render(data4Layout, svg) {\n const element = svg.select(\"g\");\n markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clear3();\n clear2();\n clear();\n clear4();\n prepareLayoutForSwimlanes(data4Layout);\n const transformedData = createEdgeLabelNodes(data4Layout);\n data4Layout.nodes = transformedData.nodes;\n data4Layout.edges = transformedData.edges;\n const { groups } = await createGraphWithElements(element, data4Layout);\n runSwimlaneLayoutCore(data4Layout);\n await adjustLayout(data4Layout, groups);\n}\n__name(render, \"render\");\nexport {\n render\n};\n"],"file":"assets/swimlanes-SLNWSIFB-HnXWSaTr.js"}
|