@kazant/flexgraph 1.0.2 → 1.2.0
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/CHANGELOG.md +42 -0
- package/README.md +90 -4
- package/css/graph.css +121 -4
- package/dist/flexgraph.esm.js +2 -2
- package/dist/flexgraph.umd.cjs +2 -2
- package/dist/flexgraph.umd.js +2 -2
- package/dist/flexgraph.worker.js +2 -2
- package/package.json +1 -1
- package/types/index.d.ts +117 -5
package/dist/flexgraph.umd.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! FlexGraph v1.0
|
|
1
|
+
/*! FlexGraph v1.2.0 | MIT License | (c) 2026 Alexander Pettersen (kazant) | https://github.com/kazant/flexgraph */
|
|
2
2
|
(function (root, factory) {
|
|
3
3
|
if (typeof define === 'function' && define.amd) define([], factory);
|
|
4
4
|
else if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
5
5
|
else root.FlexGraph = factory();
|
|
6
6
|
})(typeof self !== 'undefined' ? self : this, function () {
|
|
7
7
|
var module = { exports: {} }, exports = module.exports;
|
|
8
|
-
var Rt=Object.defineProperty;var je=Object.getOwnPropertyDescriptor;var De=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var ce=(i,t)=>{for(var n in t)Rt(i,n,{get:t[n],enumerable:!0})},Ue=(i,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of De(t))!Ye.call(i,s)&&s!==n&&Rt(i,s,{get:()=>t[s],enumerable:!(o=je(t,s))||o.enumerable});return i};var We=i=>Ue(Rt({},"__esModule",{value:!0}),i);var Hn={};ce(Hn,{DEFAULT_OPTIONS:()=>wt,GraphValidationError:()=>at,GraphView:()=>Lt,VERSION:()=>Be,computeLayout:()=>gt,createGraph:()=>Rn,edgePath:()=>Zt,layoutGraph:()=>$n,metrics:()=>Kt,normalizeGraph:()=>bt,routeEdges:()=>ot});module.exports=We(Hn);var Ze=["top","right","bottom","left"],Ke=["TB","LR","BT","RL"],qe=["orthogonal","straight","curved"],wt=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),at=class extends Error{constructor(t,n=[]){super(t),this.name="GraphValidationError",this.details=n}},Q=i=>typeof i=="number"&&Number.isFinite(i);function Mt(...i){let t={...wt,edgeTypes:{...wt.edgeTypes}};for(let n of i)if(n)for(let[o,s]of Object.entries(n))s!==void 0&&(o==="edgeTypes"?Object.assign(t.edgeTypes,s):t[o]=s);return Ke.includes(t.direction)||(t.direction="TB"),qe.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function bt(i,t,n){if(!i||typeof i!="object")throw new at("Graph must be an object");let o=Mt(i.options,t),s=[],e=[],r=[],c=new Map;for(let f of i.groups||[]){if(!f||f.id==null){s.push("Group without id");continue}let h=String(f.id);if(c.has(h)){s.push(`Duplicate group id "${h}"`);continue}let p={id:h,label:f.label??h,className:f.className||"",data:f};r.push(p),c.set(h,p)}let a=[],d=new Map;(i.nodes||[]).forEach((f,h)=>{if(!f||f.id==null){s.push(`Node at index ${h} has no id`);return}let p=String(f.id);if(d.has(p)){s.push(`Duplicate node id "${p}"`);return}let w=n&&n.get(p),m=Q(f.width)?f.width:w?w.width:o.defaultNodeWidth,M=Q(f.height)?f.height:w?w.height:o.defaultNodeHeight,y=f.group!=null?String(f.group):null;if(y&&!c.has(y)){let _={id:y,label:y,className:"",data:{id:y}};r.push(_),c.set(y,_)}let x=[],b=new Set;for(let _ of f.ports||[]){if(!_||_.id==null){e.push(`Node "${p}": port without id ignored`);continue}let $=String(_.id);if(b.has($)){e.push(`Node "${p}": duplicate port "${$}" ignored`);continue}let B=Ze.includes(_.side)?_.side:null;B||e.push(`Node "${p}": port "${$}" has invalid side "${_.side}", using auto side`),b.add($),x.push({id:$,side:B,offset:Q(_.offset)?Math.min(1,Math.max(0,_.offset)):null,label:_.label,data:_})}let k=f.constraints||{},L={pinned:!!k.pinned,x:Q(k.x)?k.x:Q(f.x)&&k.pinned?f.x:null,y:Q(k.y)?k.y:Q(f.y)&&k.pinned?f.y:null,rank:Number.isInteger(k.rank)&&k.rank>=0?k.rank:null};L.pinned&&(L.x==null||L.y==null)&&(e.push(`Node "${p}" is pinned but has no x/y; pin ignored until it has a position`),L.pinned=!1);let P={id:p,index:h,label:f.label??p,width:m,height:M,group:y,ports:x,portById:new Map(x.map(_=>[_.id,_])),constraints:L,className:f.className||"",type:f.type||null,data:f};a.push(P),d.set(p,P)});let l=[],u=new Map;(i.edges||[]).forEach((f,h)=>{if(!f)return;let p=f.id!=null?String(f.id):`e${h}`;if(u.has(p)){s.push(`Duplicate edge id "${p}"`);return}let w=String(f.source),m=String(f.target);if(!d.has(w)){s.push(`Edge "${p}": unknown source node "${w}"`);return}if(!d.has(m)){s.push(`Edge "${p}": unknown target node "${m}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,y=f.targetPort!=null?String(f.targetPort):null;M&&!d.get(w).portById.has(M)&&(e.push(`Edge "${p}": node "${w}" has no port "${M}"`),M=null),y&&!d.get(m).portById.has(y)&&(e.push(`Edge "${p}": node "${m}" has no port "${y}"`),y=null);let x=o.edgeTypes[f.type]||o.edgeTypes.default||{},b={id:p,index:h,source:w,target:m,sourcePort:M,targetPort:y,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:Q(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:x.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:x.markerEnd||null,className:f.className||"",data:f};l.push(b),u.set(p,b)});let g=[];for(let f of i.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let h=String(f.a),p=String(f.b);if(!d.has(h)||!d.has(p)){e.push("leftOf constraint references unknown node");continue}g.push({type:"leftOf",a:h,b:p})}else if(f.type==="sameRank"){let h=(f.nodes||[]).map(String).filter(p=>d.has(p));h.length>=2?g.push({type:"sameRank",nodes:h}):e.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let h=String(f.node);d.has(h)&&Number.isInteger(f.rank)&&(d.get(h).constraints.rank=f.rank)}else e.push(`Unknown constraint type "${f.type}"`);if(s.length)throw new at(s[0],s);return{options:o,nodes:a,nodeById:d,edges:l,edgeById:u,groups:r,groupById:c,constraints:g,warnings:e}}function Ve(i,t){let n=new Map(i.map(c=>[c,[]])),o=new Map(i.map(c=>[c,0]));for(let c of t)n.get(c.v).push(c),o.set(c.w,o.get(c.w)+1);let s=new Map,e=new Set,r=[...i.filter(c=>o.get(c)===0),...i];for(let c of r){if(s.has(c))continue;let a=[[c,0]];for(s.set(c,1);a.length;){let d=a[a.length-1],[l,u]=d,g=n.get(l);if(u>=g.length){s.set(l,2),a.pop();continue}d[1]++;let f=g[u],h=s.get(f.w);h===1?e.add(f.id):h||(s.set(f.w,1),a.push([f.w,0]))}}return e}var Bt=class{constructor(t){this.p=new Map(t.map(n=>[n,n]))}find(t){let n=t;for(;this.p.get(n)!==n;)n=this.p.get(n);for(;this.p.get(t)!==n;){let o=this.p.get(t);this.p.set(t,n),t=o}return n}union(t,n){let o=this.find(t),s=this.find(n);o!==s&&this.p.set(s,o)}};function de(i,t,n={}){let o=[],s=new Bt(i);for(let x of n.sameRank||[])for(let b=1;b<x.length;b++)s.union(x[0],x[b]);let e=[...new Set(i.map(x=>s.find(x)))],r=new Set,c=new Set,a=[];for(let x of t){if(x.source===x.target){r.add(x.id);continue}let b=s.find(x.source),k=s.find(x.target);if(b===k){c.add(x.id);continue}a.push({id:x.id,v:b,w:k,minLen:x.minLen??1})}let d=Ve(e,a),l=a.map(x=>d.has(x.id)?{...x,v:x.w,w:x.v}:x),u=new Map;if(n.fixedRank)for(let[x,b]of n.fixedRank){if(!s.p.has(x))continue;let k=s.find(x);u.has(k)&&u.get(k)!==b&&o.push(`Conflicting fixed ranks in sameRank set of "${x}"`),u.set(k,Math.max(u.get(k)??0,b))}let g=new Map(e.map(x=>[x,[]])),f=new Map(e.map(x=>[x,[]]));for(let x of l)g.get(x.v).push(x),f.get(x.w).push(x);let h=new Map(e.map(x=>[x,f.get(x).length])),p=e.filter(x=>h.get(x)===0),w=[];for(;p.length;){let x=p.shift();w.push(x);for(let b of g.get(x))h.set(b.w,h.get(b.w)-1),h.get(b.w)===0&&p.push(b.w)}let m=new Map;for(let x of w){let b=u.get(x)??0;for(let k of f.get(x))b=Math.max(b,m.get(k.v)+k.minLen);u.has(x)&&b!==u.get(x)&&o.push(`Fixed rank ${u.get(x)} for "${x}" cannot be satisfied; using ${b}`),m.set(x,b)}for(let x=w.length-1;x>=0;x--){let b=w[x];if(u.has(b))continue;let k=g.get(b);if(!k.length||f.get(b).length>=k.length)continue;let P=1/0;for(let _ of k)P=Math.min(P,m.get(_.w)-_.minLen);P>m.get(b)&&m.set(b,P)}let M=1/0;for(let x of m.values())M=Math.min(M,x);if(!u.size&&M>0)for(let[x,b]of m)m.set(x,b-M);let y=new Map;for(let x of i)y.set(x,m.get(s.find(x))??0);return{rank:y,reversed:d,flat:c,selfLoops:r,warnings:o}}function le(i,t,n=0){let o=[],s=new Map;for(let d of i)s.set(d.id,o.length),o.push({id:d.id,real:!0,rank:d.rank,width:d.width,height:d.height??0,group:d.group??null,pinX:d.pinX??null,inputIndex:o.length,up:[],down:[]});let e=new Map,r=[],c=(d,l,u,g,f,h)=>{let p={a:d,b:l,aOff:u,bOff:g,w:f,edgeId:h};r.push(p),o[d].down.push({n:l,off:g,own:u,w:f}),o[l].up.push({n:d,off:u,own:g,w:f})};for(let d of t){let l=s.get(d.v),u=s.get(d.w),g=o[l].rank,f=o[u].rank;if(f<=g)continue;let h=o[l].group&&o[l].group===o[u].group?o[l].group:null,p=[],w=l,m=d.vOff||0;for(let M=g+1;M<f;M++){let y=o.length;o.push({id:`__d_${d.id}_${M}`,real:!1,rank:M,width:n,height:0,group:h,pinX:null,edgeId:d.id,inputIndex:y,up:[],down:[]}),c(w,y,m,0,d.weight??1,d.id),p.push(y),w=y,m=0}c(w,u,m,d.wOff||0,d.weight??1,d.id),e.set(d.id,p)}let a=0;for(let d of o)a=Math.max(a,d.rank);return{v:o,index:s,segs:r,chains:e,maxRank:a}}function zt(i){let t=Array.from({length:i.maxRank+1},()=>[]),n=new Uint8Array(i.v.length),o=i.v.map((s,e)=>e).filter(s=>i.v[s].real).sort((s,e)=>i.v[s].rank-i.v[e].rank||i.v[s].inputIndex-i.v[e].inputIndex);for(let s of o){if(n[s])continue;let e=[s];for(;e.length;){let r=e.pop();if(n[r])continue;n[r]=1,t[i.v[r].rank].push(r);let c=i.v[r].down.map(a=>a.n);for(let a=c.length-1;a>=0;a--)n[c[a]]||e.push(c[a])}}for(let s=0;s<i.v.length;s++)n[s]||t[i.v[s].rank].push(s);return t}function Je(i){let t=i.length;if(t<2)return 0;let n=i.slice(),o=new Array(t),s=0;for(let e=1;e<t;e*=2){for(let r=0;r<t;r+=2*e){let c=Math.min(r+e,t),a=Math.min(r+2*e,t),d=r,l=c,u=r;for(;d<c&&l<a;)n[d]<=n[l]?o[u++]=n[d++]:(s+=c-d,o[u++]=n[l++]);for(;d<c;)o[u++]=n[d++];for(;l<a;)o[u++]=n[l++]}[n,o]=[o,n]}return s}function Qe(i,t,n,o){let s=[];for(let e of t)for(let r of i.v[e].down)s.push([o[e]+r.own*.999,o[r.n]+r.off*.999]);return s.sort((e,r)=>e[0]-r[0]||e[1]-r[1]),Je(s.map(e=>e[1]))}function Ct(i,t){let n=kt(i,t),o=0;for(let s=0;s<t.length-1;s++)o+=Qe(i,t[s],t[s+1],n);return o}function kt(i,t){let n=new Float64Array(i.v.length);for(let o of t)o.forEach((s,e)=>{n[s]=e});return n}function fe(i,t={}){let n=t.maxIterations??24,o=(t.leftOf||[]).map(([d,l])=>[i.index.get(d),i.index.get(l)]).filter(([d,l])=>d!=null&&l!=null&&i.v[d].rank===i.v[l].rank),s=new Set(o.map(([d,l])=>d+":"+l)),e=[];t.initial&&e.push(t.initial.map(d=>d.slice()));let r=zt(i);e.push(r),!t.initial&&n>4&&(e.push(r.map(d=>d.slice().reverse())),e.push(r.map(d=>d.slice().sort((l,u)=>i.v[l].inputIndex-i.v[u].inputIndex))));let c=null,a=1/0;for(let d of e){let l=tn(i,d,o,s,n);if(l.crossings<a&&(c=l.layers,a=l.crossings),a===0)break}return{layers:c,crossings:a}}function tn(i,t,n,o,s){let e=t.map(d=>ue(i,d,n)),r=e.map(d=>d.slice()),c=Ct(i,e),a=0;for(let d=0;d<s&&c>0;d++){let l=d%2===0;nn(i,e,l,n,d%4>=2),sn(i,e,o);let u=Ct(i,e);if(u<c)c=u,r=e.map(g=>g.slice()),a=0;else if(++a>=6)break}if(c>0&&s>4){e=r.map(d=>d.slice());for(let d=0;d<2;d++){en(i,e,o);let l=Ct(i,e);if(l<c)c=l,r=e.map(u=>u.slice());else break}}return{layers:r,crossings:c}}function en(i,t,n){let o=kt(i,t);for(let s of t)if(!(s.length<3||s.length>120))for(let e of s.slice()){let r=i.v[e];if(r.pinX!=null||r.group)continue;let c=s.indexOf(e),a=0,d=c,l=0;for(let u=c-1;u>=0;u--){let g=s[u];if(n.has(g+":"+e)||i.v[g].group)break;l+=ct(i,e,g,o)-ct(i,g,e,o),l<a&&(a=l,d=u)}l=0;for(let u=c+1;u<s.length;u++){let g=s[u];if(n.has(e+":"+g)||i.v[g].group)break;l+=ct(i,g,e,o)-ct(i,e,g,o),l<a&&(a=l,d=u)}d!==c&&(s.splice(c,1),s.splice(d,0,e),s.forEach((u,g)=>{o[u]=g}))}}function nn(i,t,n,o,s){let e=kt(i,t),r=t.length,c=n?he(1,r):he(r-2,-1,-1);for(let a of c){let d=t[a],l=new Map;d.forEach((h,p)=>{let w=n?i.v[h].up:i.v[h].down;if(!w.length){l.set(h,p);return}if(s){let y=w.map(b=>e[b.n]+b.off-b.own).sort((b,k)=>b-k),x=y.length>>1;l.set(h,y.length%2?y[x]:(y[x-1]+y[x])/2);return}let m=0,M=0;for(let y of w)m+=(e[y.n]+y.off-y.own)*y.w,M+=y.w;l.set(h,m/M)});let u=new Map;for(let h of d){let p=i.v[h].group;if(!p)continue;let w=u.get(p)||[0,0];w[0]+=l.get(h),w[1]++,u.set(p,w)}let g=h=>{let p=i.v[h].group;return p?u.get(p)[0]/u.get(p)[1]:l.get(h)},f=new Map(d.map((h,p)=>[h,p]));d.sort((h,p)=>g(h)-g(p)||(i.v[h].group||"").localeCompare(i.v[p].group||"")||l.get(h)-l.get(p)||f.get(h)-f.get(p)),t[a]=ue(i,d,o),t[a].forEach((h,p)=>{e[h]=p})}}function ue(i,t,n){let o=t.slice(),s=[],e=[];if(o.forEach((r,c)=>{i.v[r].pinX!=null&&(s.push(c),e.push(r))}),e.length>1&&(e.sort((r,c)=>i.v[r].pinX-i.v[c].pinX),s.forEach((r,c)=>{o[r]=e[c]})),n.length)for(let r=0;r<n.length+1;r++){let c=!1;for(let[a,d]of n){let l=o.indexOf(a),u=o.indexOf(d);l<0||u<0||l<u||(o.splice(l,1),o.splice(o.indexOf(d),0,a),c=!0)}if(!c)break}return o}function ct(i,t,n,o){let s=0;for(let e of["up","down"]){let r=i.v[t][e],c=i.v[n][e];for(let a of r)for(let d of c)o[a.n]+a.off>o[d.n]+d.off&&(s+=a.w*d.w)}return s}function sn(i,t,n){let o=kt(i,t),s=!0,e=0;for(;s&&e++<8;){s=!1;for(let r of t)for(let c=0;c<r.length-1;c++){let a=r[c],d=r[c+1],l=i.v[a],u=i.v[d];if((l.group||null)!==(u.group||null)||l.pinX!=null&&u.pinX!=null||n.has(a+":"+d))continue;let g=ct(i,a,d,o);ct(i,d,a,o)<g&&(r[c]=d,r[c+1]=a,o[d]=c,o[a]=c+1,s=!0)}}}function he(i,t,n=1){let o=[];if(n>0)for(let s=i;s<t;s+=n)o.push(s);else for(let s=i;s>t;s+=n)o.push(s);return o}function on(i,t,n){let o=i.length,s=new Float64Array(o);for(let l=1;l<o;l++)s[l]=s[l-1]+n[l];let e=[],r=[],c=[],a=[];for(let l=0;l<o;l++)for(e.push(i[l]-s[l]),r.push(t[l]),c.push(l),a.push(l);e.length>1&&e[e.length-2]>e[e.length-1];){let u=e.length-1,g=u-1,f=r[g]+r[u];e[g]=(e[g]*r[g]+e[u]*r[u])/f,r[g]=f,a[g]=a[u],e.pop(),r.pop(),c.pop(),a.pop()}let d=new Float64Array(o);for(let l=0;l<e.length;l++)for(let u=c[l];u<=a[l];u++)d[u]=e[l]+s[u];return d}function pe(i,t,n){let o=i.v.length,s=new Float64Array(o),e=new Float64Array(o),r=n.groupPadding??20,c=n.groupLabelHeight??0,a=(y,x)=>{let b=i.v[y],k=i.v[x],L;return!b.real&&!k.real?L=n.edgeSpacing:!b.real||!k.real?L=(n.nodeSpacing+n.edgeSpacing)/2:L=n.nodeSpacing,b.group!==k.group&&(b.group&&(L+=r),k.group&&(L+=r+(n.labelOnOrderAxis?c:0))),(b.width+k.width)/2+L},d=t.map(y=>y.map((x,b)=>b===0?0:a(y[b-1],x)));t.forEach((y,x)=>{let b=0;y.forEach((L,P)=>{b+=d[x][P],s[L]=b});let k=b/2;y.forEach(L=>{s[L]-=k})});let l=y=>i.v[y].real?1:4,u=(y,x,b)=>{let k=t[y];if(!k.length)return;let L=new Array(k.length),P=new Array(k.length);k.forEach(($,B)=>{let T=i.v[$];if(T.pinX!=null){L[B]=T.pinX,P[B]=1e6;return}let v=0,I=0,C=Y=>{for(let q of Y){let et=q.w*(i.v[q.n].real?1:2)*l($);v+=(s[q.n]+q.off*i.v[q.n].width-q.own*T.width)*et,I+=et}};x&&C(T.up),b&&C(T.down),I===0?(L[B]=s[$],P[B]=.05):(L[B]=v/I,P[B]=I)});let _=on(L,P,d[y]);k.forEach(($,B)=>{s[$]=_[B]})},g=t.length,f=n.iterations??8;for(let y=0;y<f;y++){for(let x=1;x<g;x++)u(x,!0,!1);for(let x=g-2;x>=0;x--)u(x,!1,!0)}for(let y=0;y<2;y++){for(let x=0;x<g;x++)u(x,!0,!0);for(let x=g-1;x>=0;x--)u(x,!0,!0)}let h=t.map(y=>y.reduce((x,b)=>Math.max(x,i.v[b].height||0),0)),p=new Map;for(let y of i.v){if(!y.real||!y.group)continue;let x=p.get(y.group)||[1/0,-1/0];x[0]=Math.min(x[0],y.rank),x[1]=Math.max(x[1],y.rank),p.set(y.group,x)}let w=new Float64Array(g);for(let[y,x]of p.values()){let b=n.labelOnOrderAxis||n.labelAtRankEnd?0:c,k=n.labelAtRankEnd&&!n.labelOnOrderAxis?c:0;y>0&&(w[y]=Math.max(w[y],r+b)),x<g-1&&(w[x+1]=Math.max(w[x+1],r+k))}let m=[],M=0;for(let y=0;y<g;y++)y>0?M+=h[y-1]/2+n.rankSpacing+w[y]+h[y]/2:M=h[0]/2,m.push(M);for(let y=0;y<o;y++)e[y]=m[i.v[y].rank];return{x:s,y:e,rankY:m,rankHeight:h}}var Z={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function ge(i){switch(i){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function dt(i){let t=new Map,n={top:[],right:[],bottom:[],left:[]};for(let o of i.ports)o.side&&n[o.side].push(o);for(let o of Object.keys(n)){let s=n[o];s.forEach((e,r)=>{let c=e.offset!=null?e.offset:(r+1)/(s.length+1);t.set(e.id,{side:o,t:c,...rn(o,c)})})}return t}function rn(i,t){switch(i){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var tt=i=>({x:i.x+i.width/2,y:i.y+i.height/2});function ye(i,t){return{x:i.x-t,y:i.y-t,width:i.width+2*t,height:i.height+2*t}}function xe(i,t,n,o=.5){return t>i.x+o&&t<i.x+i.width-o&&n>i.y+o&&n<i.y+i.height-o}function vt(i,t,n,o=.5){let s=n.x+o,e=n.x+n.width-o,r=n.y+o,c=n.y+n.height-o;if(e<=s||c<=r)return!1;let a=0,d=1,l=t.x-i.x,u=t.y-i.y,g=(f,h)=>{if(f===0)return h>0;let p=h/f;if(f<0){if(p>d)return!1;p>a&&(a=p)}else{if(p<a)return!1;p<d&&(d=p)}return!0};return!g(-l,i.x-s)||!g(l,e-i.x)||!g(-u,i.y-r)||!g(u,c-i.y)?!1:d-a>1e-9}function Ht(i,t){let n=tt(i),o=t.x-n.x,s=t.y-n.y;if(o===0&&s===0)return{...n,side:"bottom"};let e=o!==0?i.width/2/Math.abs(o):1/0,r=s!==0?i.height/2/Math.abs(s):1/0,c=Math.min(e,r),a=e<r?o>0?"right":"left":s>0?"bottom":"top";return{x:n.x+o*c,y:n.y+s*c,side:a}}function Tt(i){let t=[];for(let n of i){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push({x:n.x,y:n.y})}for(let n=t.length-2;n>=1;n--){let o=t[n-1],s=t[n],e=t[n+1],r=(s.x-o.x)*(e.y-s.y)-(s.y-o.y)*(e.x-s.x),c=(s.x-o.x)*(e.x-s.x)+(s.y-o.y)*(e.y-s.y);Math.abs(r)<.01&&c>=0&&t.splice(n,1)}return t}function an(i){let t=0;for(let n=1;n<i.length;n++)t+=Math.hypot(i[n].x-i[n-1].x,i[n].y-i[n-1].y);return t}function Xt(i,t){if(i.length===0)return[];if(i.length===1)return Array.from({length:t},()=>({...i[0]}));let n=an(i)||1,o=[],s=0,e=0;for(let r=0;r<t;r++){let c=n*r/(t-1);for(;s<i.length-2;){let g=Math.hypot(i[s+1].x-i[s].x,i[s+1].y-i[s].y);if(e+g>=c)break;e+=g,s++}let a=i[s],d=i[s+1],l=Math.hypot(d.x-a.x,d.y-a.y)||1,u=Math.min(1,Math.max(0,(c-e)/l));o.push({x:a.x+(d.x-a.x)*u,y:a.y+(d.y-a.y)*u})}return o}var me=(i,t,n)=>{switch(i){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:-n,y:t};default:return{x:t,y:n}}},Ft=(i,t,n)=>{switch(i){case"BT":return{x:t,y:-n};case"LR":return{x:n,y:t};case"RL":return{x:n,y:-t};default:return{x:t,y:n}}};function gt(i,t={}){return i.nodes.some(n=>n.group)?cn(i,t):Gt(i,t)}function we(i,t,n){let o=new Set(t.map(e=>e.id)),s=t.map(e=>({...e,group:null,constraints:n?e.constraints:{...e.constraints,pinned:!1}}));return{options:i.options,nodes:s,nodeById:new Map(s.map(e=>[e.id,e])),edges:i.edges.filter(e=>o.has(e.source)&&o.has(e.target)),groups:[],groupById:new Map,constraints:i.constraints.filter(e=>e.type==="sameRank"?e.nodes.every(r=>o.has(r)):o.has(e.a)&&o.has(e.b)),warnings:[]}}function cn(i,t){let n=Me(i,t.hints||null,t.hints||null),o=new Map,s=r=>({x:r.x+r.width/2,y:r.y+r.height/2});for(let r of i.nodes){let c=n.nodes.get(r.id);if(!r.group){o.set(r.id,s(c));continue}let a=0,d=0,l=0;for(let u of i.edges){let g=u.source===r.id?u.target:u.target===r.id?u.source:null;if(g==null||i.nodeById.get(g).group===r.group)continue;let f=s(n.nodes.get(g));a+=f.x,d+=f.y,l++}o.set(r.id,l?{x:a/l,y:d/l}:s(c))}let e=Me(i,o,t.hints||o);return e.crossingsRouted<=n.crossingsRouted?e:n}function Me(i,t,n){let o=i.options,s=o.groupPadding,e=o.groupLabelHeight,r=new Map;for(let h of i.nodes)h.group&&(r.has(h.group)||r.set(h.group,[]),r.get(h.group).push(h));let c=new Map,a=[];for(let[h,p]of r){let w=Gt(we(i,p,!1),{hints:t}),m=w.bounds,M="\0group:"+h;c.set(h,{sub:w,b:m,blockId:M}),a.push({id:M,index:-1,label:h,width:m.width+2*s,height:m.height+2*s+e,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let d=h=>{let p=i.nodeById.get(h);return p.group?c.get(p.group).blockId:h},l=we(i,i.nodes.filter(h=>!h.group),!0);l.nodes.push(...a);for(let h of a)l.nodeById.set(h.id,h);l.edges=[];for(let h of i.edges){let p=d(h.source),w=d(h.target);p===w&&(h.source!==h.target||p!==h.source)||l.edges.push({...h,source:p,target:w,sourcePort:p===h.source?h.sourcePort:null,targetPort:w===h.target?h.targetPort:null})}let u=null;if(n){u=new Map(n);for(let[h,p]of r){let w=0,m=0,M=0;for(let y of p){let x=n.get(y.id);x&&(w+=x.x,m+=x.y,M++)}M&&u.set(c.get(h).blockId,{x:w/M,y:m/M})}}let g=Gt(l,{hints:u}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:g.crossings,warnings:g.warnings};for(let h of i.nodes)h.group||f.nodes.set(h.id,g.nodes.get(h.id));for(let[,{sub:h,b:p,blockId:w}]of c){let m=g.nodes.get(w),M=m.x+s-p.x,y=m.y+s+e-p.y;for(let[x,b]of h.nodes)f.nodes.set(x,{...b,x:b.x+M,y:b.y+y});for(let[x,b]of h.edges)f.edges.set(x,{...b,waypoints:b.waypoints.map(k=>({x:k.x+M,y:k.y+y}))});f.crossings+=h.crossings}for(let h of i.edges){if(f.edges.has(h.id))continue;let p=g.edges.get(h.id),w=d(h.source)!==h.source||d(h.target)!==h.target;f.edges.set(h.id,p?{...p,waypoints:w?[]:p.waypoints}:{waypoints:[],reversed:!1,selfLoop:h.source===h.target,flat:!1})}for(let h of i.nodes)if(h.group&&h.constraints.pinned){let p=f.nodes.get(h.id);p.x=h.constraints.x,p.y=h.constraints.y}if(yt(i,f),!i.nodes.some(h=>h.constraints.pinned)){let h=pt(f);be(f,-h.x,-h.y);for(let p of f.groups.values())p.x-=h.x,p.y-=h.y}return f.bounds=pt(f),f.crossingsRouted=dn(i,f),f}function dn(i,t){let n=[];for(let e of i.edges){if(e.source===e.target)continue;let r=t.nodes.get(e.source),c=t.nodes.get(e.target);n.push([e.source,e.target,r.x+r.width/2,r.y+r.height/2,c.x+c.width/2,c.y+c.height/2])}let o=0,s=(e,r,c,a,d,l)=>(c-e)*(l-r)-(a-r)*(d-e);for(let e=0;e<n.length;e++)for(let r=e+1;r<n.length;r++){let c=n[e],a=n[r];if(c[0]===a[0]||c[0]===a[1]||c[1]===a[0]||c[1]===a[1])continue;let d=s(a[2],a[3],a[4],a[5],c[2],c[3]),l=s(a[2],a[3],a[4],a[5],c[4],c[5]),u=s(c[2],c[3],c[4],c[5],a[2],a[3]),g=s(c[2],c[3],c[4],c[5],a[4],a[5]);d*l<0&&u*g<0&&o++}return o}function Gt(i,t={}){let n=i.options,o=n.direction,s=o==="LR"||o==="RL",e=[],r=new Map;for(let g of i.nodes){let f=dt(g),h=new Map;for(let[m,M]of f)h.set(m,(s?M.py:M.px)-.5);let p=null,w=null;if(g.constraints.pinned){let m=Ft(o,g.constraints.x+g.width/2,g.constraints.y+g.height/2);p=m.x,w=m.y}r.set(g.id,{iw:s?g.height:g.width,ih:s?g.width:g.height,frac:h,pinX:p,pinY:w})}let c=ln(i),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:e},d=[];for(let g of c){let f=g.nodes,h=new Set(f),p=i.edges.filter(v=>h.has(v.source)),w=new Map;for(let v of f){let I=i.nodeById.get(v).constraints.rank;I!=null&&w.set(v,I)}let m=i.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(I=>h.has(I))).filter(v=>v.length>1),M=de(f,p,{fixedRank:w,sameRank:m});e.push(...M.warnings);let y=f.map(v=>{let I=i.nodeById.get(v),C=r.get(v);return{id:v,rank:M.rank.get(v),width:C.iw,height:C.ih,group:I.group,pinX:C.pinX}}),x=[];for(let v of p){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let I=M.reversed.has(v.id),C=v.sourcePort?r.get(v.source).frac.get(v.sourcePort)??0:0,Y=v.targetPort?r.get(v.target).frac.get(v.targetPort)??0:0;x.push(I?{id:v.id,v:v.target,w:v.source,vOff:Y,wOff:C,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:C,wOff:Y,weight:v.weight})}let b=le(y,x,0),k;t.hints&&t.hints.size&&(k=hn(b,t.hints,o));let L=i.constraints.filter(v=>v.type==="leftOf"&&h.has(v.a)&&h.has(v.b)).map(v=>[v.a,v.b]),P=fe(b,{maxIterations:n.maxIterations,leftOf:L,initial:k});a.crossings+=P.crossings;let _=pe(b,P.layers,{nodeSpacing:n.nodeSpacing,edgeSpacing:n.edgeSpacing,rankSpacing:n.rankSpacing,groupPadding:n.groupPadding,groupLabelHeight:n.groupLabelHeight,labelOnOrderAxis:s,labelAtRankEnd:o==="BT"||o==="RL"?!s:!1}),$=f.filter(v=>r.get(v).pinY!=null);if($.length){let v=0;for(let I of $)v+=r.get(I).pinY-_.y[b.index.get(I)];v/=$.length;for(let I=0;I<_.y.length;I++)_.y[I]+=v;for(let I of $){let C=b.index.get(I);_.x[C]=r.get(I).pinX,_.y[C]=r.get(I).pinY}}let B=1/0,T=-1/0;for(let v=0;v<b.v.length;v++){let I=b.v[v].width/2;B=Math.min(B,_.x[v]-I),T=Math.max(T,_.x[v]+I)}d.push({comp:g,g:b,co:_,rk:M,layers:P.layers,minX:B,maxX:T,pinned:$.length>0})}if(t.hints&&t.hints.size){let g=h=>{let p=0,w=0;for(let m of h.comp.nodes){let M=t.hints.get(m);M&&(p+=Ft(o,M.x,M.y).x,w++)}return w?p/w:1/0},f=new Map(d.map(h=>[h,g(h)]));d.sort((h,p)=>f.get(h)-f.get(p))}let l=-1/0;for(let g of d)g.pinned&&(l=Math.max(l,g.maxX+n.componentSpacing));l===-1/0&&(l=0);for(let g of d){if(g.pinned)continue;let f=l-g.minX;for(let h=0;h<g.co.x.length;h++)g.co.x[h]+=f;l+=g.maxX-g.minX+n.componentSpacing}for(let g of d){let{g:f,co:h,rk:p}=g;g.layers.forEach((w,m)=>w.forEach((M,y)=>{let x=f.v[M];if(!x.real)return;let b=i.nodeById.get(x.id),k=me(o,h.x[M],h.y[M]);a.nodes.set(x.id,{x:k.x-b.width/2,y:k.y-b.height/2,width:b.width,height:b.height,rank:m,order:y})}));for(let w of i.edges){if(!g.comp.set.has(w.source))continue;let M=(f.chains.get(w.id)||[]).map(x=>me(o,h.x[x],h.y[x])),y=p.reversed.has(w.id);y&&(M=M.reverse()),a.edges.set(w.id,{waypoints:M,reversed:y,selfLoop:p.selfLoops.has(w.id),flat:p.flat.has(w.id)})}}if(!d.some(g=>g.pinned)){let g=1/0,f=1/0;for(let p of a.nodes.values())g=Math.min(g,p.x),f=Math.min(f,p.y);let h=i.groups.length?n.groupPadding+n.groupLabelHeight:0;Number.isFinite(g)&&be(a,-g+h,-f+h)}return yt(i,a),a.bounds=pt(a),a}function be(i,t,n){for(let o of i.nodes.values())o.x+=t,o.y+=n;for(let o of i.edges.values())for(let s of o.waypoints)s.x+=t,s.y+=n}function yt(i,t){let n=i.options;t.groups=new Map;for(let o of i.groups){let s=1/0,e=1/0,r=-1/0,c=-1/0;for(let d of i.nodes){if(d.group!==o.id)continue;let l=t.nodes.get(d.id);l&&(s=Math.min(s,l.x),e=Math.min(e,l.y),r=Math.max(r,l.x+l.width),c=Math.max(c,l.y+l.height))}if(!Number.isFinite(s))continue;let a=n.groupPadding;t.groups.set(o.id,{x:s-a,y:e-a-n.groupLabelHeight,width:r-s+2*a,height:c-e+2*a+n.groupLabelHeight})}return t.groups}function pt(i){let t=1/0,n=1/0,o=-1/0,s=-1/0,e=r=>{t=Math.min(t,r.x),n=Math.min(n,r.y),o=Math.max(o,r.x+r.width),s=Math.max(s,r.y+r.height)};for(let r of i.nodes.values())e(r);for(let r of i.groups.values())e(r);return Number.isFinite(t)?{x:t,y:n,width:o-t,height:s-n}:{x:0,y:0,width:0,height:0}}function hn(i,t,n){let o=zt(i),s=new Float64Array(i.v.length).fill(NaN);i.v.forEach((e,r)=>{if(e.real&&t.has(e.id)){let c=t.get(e.id);s[r]=Ft(n,c.x,c.y).x}});for(let[,e]of i.chains){if(!e.length)continue;let r=i.v[e[0]].up[0]?.n,c=i.v[e[e.length-1]].down[0]?.n;r==null||c==null||Number.isNaN(s[r])||Number.isNaN(s[c])||e.forEach((a,d)=>{s[a]=s[r]+(s[c]-s[r])*(d+1)/(e.length+1)})}return o.map(e=>{let r=new Map(e.map((c,a)=>[c,a]));return e.slice().sort((c,a)=>{let d=s[c],l=s[a];return Number.isNaN(d)&&Number.isNaN(l)?r.get(c)-r.get(a):Number.isNaN(d)?1:Number.isNaN(l)?-1:d-l})})}function ln(i){let t=new Map(i.nodes.map(r=>[r.id,r.id])),n=r=>{for(;t.get(r)!==r;)t.set(r,t.get(t.get(r))),r=t.get(r);return r},o=(r,c)=>{let a=n(r),d=n(c);a!==d&&t.set(d,a)};for(let r of i.edges)o(r.source,r.target);let s=new Map;for(let r of i.nodes)r.group&&(s.has(r.group)?o(s.get(r.group),r.id):s.set(r.group,r.id));for(let r of i.constraints)if(r.type==="leftOf"&&o(r.a,r.b),r.type==="sameRank")for(let c of r.nodes)o(r.nodes[0],c);let e=new Map;for(let r of i.nodes){let c=n(r.id);e.has(c)||e.set(c,[]),e.get(c).push(r.id)}return[...e.values()].map(r=>({nodes:r,set:new Set(r)}))}function ke(i,t,n,o){let s=o==="LR"||o==="RL",e=[...i.nodes.entries()],r=(c,a)=>c.x<a.x+a.width+n&&a.x<c.x+c.width+n&&c.y<a.y+a.height+n&&a.y<c.y+c.height+n;for(let[c,a]of e)if(!t.has(c))for(let d=0;d<200;d++){let l=e.find(([g,f])=>g!==c&&r(a,f));if(!l)break;let u=l[1];s?a.y=u.y+u.height+n:a.x=u.x+u.width+n}}function fn(i,t,n){let o=ge(n),s=tt(i),e=tt(t),r=e.x-s.x,c=e.y-s.y,a=Math.abs(r)-(i.width+t.width)/2,d=Math.abs(c)-(i.height+t.height)/2,l=o.x!==0?r*o.x:c*o.y,u=o.x!==0?a:d;return l>0&&u>4?[o.exit,o.entry]:a>=d?r>=0?["right","left"]:["left","right"]:c>=0?["bottom","top"]:["top","bottom"]}function Se(i,t){let n=i.options.direction,o=new Map,s=new Map;for(let a of i.nodes){let d=t.get(a.id);if(!d)continue;let l=dt(a),u=new Map;for(let[g,f]of l)u.set(g,{x:d.x+f.px*d.width,y:d.y+f.py*d.height,side:f.side,t:f.t});s.set(a.id,u)}let e=new Map,r=new Map;for(let a of i.edges){let d=t.get(a.source),l=t.get(a.target);if(!d||!l)continue;if(a.source===a.target){let p=s.get(a.source),w=a.sourcePort&&p.get(a.sourcePort),m=a.targetPort&&p.get(a.targetPort),M=Math.min(20,d.width/4,d.height/4);o.set(a.id,{source:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:d.x+d.width-M,y:d.y,side:"top"},target:m&&m.side?{x:m.x,y:m.y,side:m.side}:{x:d.x+d.width,y:d.y+M,side:"right"}});continue}let[u,g]=fn(d,l,n),f=a.sourcePort&&s.get(a.source).get(a.sourcePort),h=a.targetPort&&s.get(a.target).get(a.targetPort);f&&f.side&&(u=f.side),h&&h.side&&(g=h.side),r.set(a.id,[u,g]),f||ve(e,a.source+"|"+u,{edgeId:a.id,end:"source",other:a.target}),h||ve(e,a.target+"|"+g,{edgeId:a.id,end:"target",other:a.source}),o.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:h?{x:h.x,y:h.y,side:h.side}:null})}for(let a=0;a<2;a++)for(let[d,l]of e){let[u,g]=d.split("|"),f=t.get(u),h=g==="top"||g==="bottom",p=m=>{let M=o.get(m.edgeId),y=m.end==="source"?M.target:M.source;if(a>0&&y)return h?y.x:y.y;let x=tt(t.get(m.other));return h?x.x:x.y};l.sort((m,M)=>p(m)-p(M)||(m.edgeId<M.edgeId?-1:1));let w=[...s.get(u)?.values()||[]].filter(m=>m.side===g).map(m=>m.t);l.forEach((m,M)=>{let y=(M+1)/(l.length+1);for(let b of w)Math.abs(b-y)<.06&&(y=Math.min(.95,y+.1));let x=h?{x:f.x+y*f.width,y:g==="top"?f.y:f.y+f.height,side:g}:{x:g==="left"?f.x:f.x+f.width,y:f.y+y*f.height,side:g};o.get(m.edgeId)[m.end]=x})}let c=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of o.values())c(a.source),c(a.target);return{ends:o,ports:s,sides:r}}function ve(i,t,n){i.has(t)||i.set(t,[]),i.get(t).push(n)}function Ie(i,t,n){let o=n.spacing,s={h:new Map,v:new Map},e=new Map;for(let[u,g]of i)e.set(u,g.points.map(f=>({x:f.x,y:f.y})));for(let[u,g]of i){if(g.kind!=="orthogonal")continue;let f=g.points;for(let h=0;h<f.length-1;h++){if(n.fixedEnds!==!1&&(h===0||h===f.length-2))continue;let p=f[h],w=f[h+1],m=Math.abs(p.x-w.x)<.01,M=Math.abs(p.y-w.y)<.01;if(!m&&!M)continue;let y=m?p.x:p.y,x=m?Math.min(p.y,w.y):Math.min(p.x,w.x),b=m?Math.max(p.y,w.y):Math.max(p.x,w.x);if(b-x<.5)continue;let k=m?p.y<=w.y:p.x<=w.x,L=f[h-1],P=f[h+2],_=(C,Y)=>C?Math.sign(m?C.x-Y.x:C.y-Y.y):0,$=_(L,p),B=_(P,w),T={id:u,i:h,c:y,lo:x,hi:b,vertical:m,loIsA:k,pts:e.get(u),dirLo:k?$:B,dirHi:k?B:$},v=Math.round(y*100),I=m?s.v:s.h;I.has(v)||I.set(v,[]),I.get(v).push(T)}}let r=[...s.v.values()].flat(),c=[...s.h.values()].flat(),a=[];for(let u of[!0,!1])for(let g of(u?s.v:s.h).values()){if(g.length<2)continue;g.sort((w,m)=>w.lo-m.lo);let f=[g[0]],h=g[0].hi,p=()=>{f.length>1&&d(f,u)};for(let w=1;w<g.length;w++){let m=g[w];m.lo<h-.5?(f.push(m),h=Math.max(h,m.hi)):(p(),f=[m],h=m.hi)}p()}function d(u,g){if(new Set(u.map(k=>k.id)).size<2)return;let f=[];for(let k of u){let L=f.length;for(;L>0&&gn(k,f[L-1])<0;)L--;f.splice(L,0,k)}let h=u[0].c,p=Math.min(...u.map(k=>k.lo)),w=Math.max(...u.map(k=>k.hi)),m=1/0,M=1/0;for(let k of t.values()){let L=g?k.y:k.x;if((g?k.y+k.height:k.x+k.width)<=p||L>=w)continue;let _=g?k.x:k.y,$=g?k.x+k.width:k.y+k.height;$<=h+.01?m=Math.min(m,h-$):_>=h-.01&&(M=Math.min(M,_-h))}for(let k of g?r:c){if(k.c===h||k.hi<=p||k.lo>=w)continue;let L=Math.abs(k.c-h)/2;k.c<h?m=Math.min(m,L+4):M=Math.min(M,L+4)}let y=f.length,x=Math.max(0,Math.min(m,M)-4),b=Math.min(o,y>1?2*x/(y-1):o);f.forEach((k,L)=>{let P=(L-(y-1)/2)*b;Math.abs(P)>.01&&a.push([k.id,k.i,g,P])})}let l=new Map;for(let[u,g,f,h]of a)l.has(u)||l.set(u,new Map),l.get(u).set(g,f?{x:h,y:0}:{x:0,y:h});for(let[u,g]of l){let f=i.get(u),h=f.points,p=[],w={x:0,y:0};for(let m=0;m<h.length;m++){let M=m>0&&g.get(m-1)||w,y=m<h.length-1&&g.get(m)||w,x=m>0&&m<h.length-1&&un(h[m-1],h[m],h[m+1]);x&&(M.x!==y.x||M.y!==y.y)?(p.push({x:h[m].x+M.x,y:h[m].y+M.y}),p.push({x:h[m].x+y.x,y:h[m].y+y.y})):p.push({x:h[m].x+M.x+(x?0:y.x),y:h[m].y+M.y+(x?0:y.y)})}f.points=pn(p)}}function un(i,t,n){return Math.abs(i.x-t.x)<.01&&Math.abs(t.x-n.x)<.01||Math.abs(i.y-t.y)<.01&&Math.abs(t.y-n.y)<.01}function pn(i){let t=[];for(let n of i){let o=t[t.length-1];o&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01||t.push(n)}return t}function gn(i,t){return _e(i,t,!0)||_e(i,t,!1)||xn(i,t)}function Le(i,t){let{pts:n,i:o,loIsA:s}=i,e=[];if(t?!s:s)for(let c=o+1;c<n.length;c++)e.push(n[c]);else for(let c=o;c>=0;c--)e.push(n[c]);return e}var yn=(i,t)=>i.x*t.y-i.y*t.x,Ee=(i,t)=>{let n=t.x-i.x,o=t.y-i.y,s=Math.hypot(n,o)||1;return{x:n/s,y:o/s}};function _e(i,t,n){let o=i.vertical,s=Le(i,n),e=Le(t,n),r=n?Math.max(i.lo,t.lo):Math.min(i.hi,t.hi),c=o?{x:i.c,y:r}:{x:r,y:i.c},a=o?{x:0,y:n?-1:1}:{x:n?-1:1,y:0},d=a,l=0,u=0,g=(h,p)=>{if(h===p)return 0;let w={x:a.y,y:-a.x},m=o?w.x:w.y;return(h<p?m<0:m>0)?-1:1},f=(h,p)=>p+1<h.length?Math.sign(Math.round(yn(d,Ee(h[p],h[p+1]))*1e3)):null;for(let h=0;h<64;h++){let p=l<s.length?(s[l].x-c.x)*d.x+(s[l].y-c.y)*d.y:1/0,w=u<e.length?(e[u].x-c.x)*d.x+(e[u].y-c.y)*d.y:1/0;if(p===1/0&&w===1/0)return 0;if(Math.abs(p-w)<.5){let M=f(s,l),y=f(e,u);if(M===null||y===null)return M===null&&y===null?0:g(M??0,y??0);if(M!==y)return g(M,y);c=s[l],d=Ee(s[l],s[l+1]),l++,u++;continue}if(p<w){let M=f(s,l);return M?g(M,0):0}let m=f(e,u);return m?g(0,m):0}return 0}var xn=(i,t)=>i.id<t.id?-1:i.id>t.id?1:i.i-t.i;function jt(i,t,n=4){let o=[],s=new Map(t.map((a,d)=>[a,d]));for(let a of t){let d=i.get(a).points;for(let l=0;l<d.length-1;l++){let u=d[l],g=d[l+1];Math.abs(u.x-g.x)<.01&&Math.abs(u.y-g.y)>.01&&o.push([s.get(a),u.x,Math.min(u.y,g.y),Math.max(u.y,g.y)])}}let e=64,r=new Map;for(let a of o){let d=Math.floor(a[1]/e);r.has(d)||r.set(d,[]),r.get(d).push(a)}let c=new Map;for(let a of t){let d=s.get(a),l=i.get(a).points,u=[];for(let g=0;g<l.length-1;g++){let f=l[g],h=l[g+1];if(Math.abs(f.y-h.y)>.01)continue;let p=Math.min(f.x,h.x)+n*2,w=Math.max(f.x,h.x)-n*2;if(!(w<=p))for(let m=Math.floor(p/e);m<=Math.floor(w/e);m++)for(let M of r.get(m)||[])M[0]>=d||M[1]<=p||M[1]>=w||f.y<=M[2]+n||f.y>=M[3]-n||u.push({seg:g,x:M[1],y:f.y})}u.length&&c.set(a,u)}return c}var Dt=1,mn=[1,-1,0,0],wn=[0,0,1,-1],Yt=[1,0,3,2],Ae=i=>i.x>0?0:i.x<0?1:i.y>0?2:3;function ot(i,t,n={}){let o=i.options,s=t.nodes,e=o.edgeRouting,{ends:r,ports:c}=Se(i,s),a=new Map,d=new Map,l=n.only||null,u=n.prev||null;if(e==="orthogonal")Mn(i,s,r,o,l,u,a,d),Ie(a,s,{spacing:o.edgeSpacing,fixedEnds:!0});else for(let h of i.edges){let p=s.get(h.source),w=s.get(h.target);if(!p||!w)continue;if(h.source===h.target){a.set(h.id,Ne(p,o,r.get(h.id)));continue}let m=t.edges.get(h.id),M=m&&m.waypoints||[],y=r.get(h.id),x,b;e==="curved"||h.sourcePort?x=y.source:x=Ht(p,M[0]||tt(w)),e==="curved"||h.targetPort?b=y.target:b=Ht(w,M[M.length-1]||tt(p)),a.set(h.id,{points:[x,...M.map(k=>({...k})),b],kind:e,sourceSide:x.side,targetSide:b.side})}let g=i.edges.map(h=>h.id).filter(h=>a.has(h)),f=o.lineHops&&e==="orthogonal"?jt(a,g,o.hopRadius):new Map;for(let[h,p]of a)p.hops=f.get(h)||[];return{paths:a,raw:d,ports:c,mode:e}}function Ne(i,t,n){let o=Math.max(t.nodeMargin*1.5,16),s=n.source,e=n.target,r=Z[s.side],c=Z[e.side],a={x:s.x+r.x*o,y:s.y+r.y*o},d={x:e.x+c.x*o,y:e.y+c.y*o},l;if(s.side===e.side)l=s.side==="left"||s.side==="right"?[a,{x:a.x,y:d.y}]:[a,{x:d.x,y:a.y}];else if((s.side==="top"||s.side==="bottom")!=(e.side==="top"||e.side==="bottom"))l=s.side==="top"||s.side==="bottom"?[a,{x:d.x,y:a.y}]:[a,{x:a.x,y:d.y}];else{let u=s.side==="top"||s.side==="bottom",g=u?i.x+i.width+o:i.y+i.height+o;l=u?[a,{x:g,y:a.y},{x:g,y:d.y}]:[a,{x:a.x,y:g},{x:d.x,y:g}]}return{points:Tt([s,...l,d,e]),kind:"orthogonal",sourceSide:s.side,targetSide:e.side,selfLoop:!0}}function Mn(i,t,n,o,s,e,r,c){let a=o.nodeMargin,d=[];for(let[h,p]of t)d.push({id:h,...ye(p,a)});let l=new Map;for(let h of i.edges){let p=n.get(h.id);if(!p||!p.source||!p.target)continue;let w=Z[p.source.side],m=Z[p.target.side];l.set(h.id,{s:{x:p.source.x+w.x*a,y:p.source.y+w.y*a},t:{x:p.target.x+m.x*a,y:p.target.y+m.y*a},sDir:Ae(w),tNeed:Yt[Ae(m)]})}let u=kn(d,l,a);for(let h of i.edges)if(s&&!s.has(h.id)&&e&&e.raw.has(h.id)){let p=e.raw.get(h.id);c.set(h.id,p),u.markPath(p);let w=e.paths.get(h.id);w&&r.set(h.id,{...w,points:p.map(m=>({...m}))})}let g=i.edges.filter(h=>!r.has(h.id)&&t.has(h.source)&&t.has(h.target)),f=h=>{let p=l.get(h.id);return p?Math.abs(p.s.x-p.t.x)+Math.abs(p.s.y-p.t.y):0};g.sort((h,p)=>f(h)-f(p));for(let h of g){if(h.source===h.target){let y=Ne(t.get(h.source),o,n.get(h.id));r.set(h.id,y),c.set(h.id,y.points);continue}let p=n.get(h.id),w=l.get(h.id),m=u.astar(w.s,w.sDir,w.t,w.tNeed,o);m||(m=bn(w.s,w.t,p.source.side,p.target.side));let M=[p.source,...Tt(m),p.target];u.markPath(M),c.set(h.id,M),r.set(h.id,{points:M.map(y=>({...y})),kind:"orthogonal",sourceSide:p.source.side,targetSide:p.target.side})}}function bn(i,t,n,o){let s=n==="top"||n==="bottom",e=o==="top"||o==="bottom";if(s&&e){let r=(i.y+t.y)/2;return[i,{x:i.x,y:r},{x:t.x,y:r},t]}if(!s&&!e){let r=(i.x+t.x)/2;return[i,{x:r,y:i.y},{x:r,y:t.y},t]}return s?[i,{x:i.x,y:t.y},t]:[i,{x:t.x,y:i.y},t]}function kn(i,t,n){let o=new Set,s=new Set,e=S=>Math.round(S*100)/100,r=1/0,c=1/0,a=-1/0,d=-1/0;for(let S of i)o.add(e(S.x)),o.add(e(S.x+S.width)),s.add(e(S.y)),s.add(e(S.y+S.height)),r=Math.min(r,S.x),c=Math.min(c,S.y),a=Math.max(a,S.x+S.width),d=Math.max(d,S.y+S.height);for(let S of t.values())for(let E of[S.s,S.t])o.add(e(E.x)),s.add(e(E.y)),r=Math.min(r,E.x),c=Math.min(c,E.y),a=Math.max(a,E.x),d=Math.max(d,E.y);o.add(e(r-2*n)),o.add(e(a+2*n)),s.add(e(c-2*n)),s.add(e(d+2*n));let l=S=>{let E=[...S].sort((O,U)=>O-U),A=[];for(let O=0;O<E.length;O++)A.push(E[O]),O+1<E.length&&E[O+1]-E[O]>4&&A.push(e((E[O]+E[O+1])/2));return A},u=l(o),g=l(s),f=u.length,h=g.length,p=f*h,w=new Map(u.map((S,E)=>[S,E])),m=new Map(g.map((S,E)=>[S,E])),M=120,y=new Map,x=(S,E)=>S*73856093^E*19349663;for(let S of i)for(let E=Math.floor(S.x/M);E<=Math.floor((S.x+S.width)/M);E++)for(let A=Math.floor(S.y/M);A<=Math.floor((S.y+S.height)/M);A++){let O=x(E,A);y.has(O)||y.set(O,[]),y.get(O).push(S)}let b=(S,E)=>{let A=y.get(x(Math.floor(S/M),Math.floor(E/M)));if(!A)return!1;for(let O of A)if(xe(O,S,E,.01))return!0;return!1},k=p<=4e6?new Uint8Array(p):null,L=k?null:new Map,P=S=>{if(k){let A=k[S];return A||(A=b(u[S%f],g[S/f|0])?2:1,k[S]=A),A===2}let E=L.get(S);return E===void 0&&(E=b(u[S%f],g[S/f|0]),L.set(S,E)),E},_=new Uint8Array(p),$=new Uint8Array(p),B=(S,E)=>{let A=E?_:$,O=A[S];if(!O){let U=S%f,W=S/f|0,z=E?(u[U]+u[U+1])/2:u[U],F=E?g[W]:(g[W]+g[W+1])/2;O=b(z,F)?2:1,A[S]=O}return O===2},T=new Uint16Array(p),v=new Uint16Array(p),I=new Uint16Array(p),C=new Uint16Array(p),Y=S=>{let E=w.get(e(S.x)),A=m.get(e(S.y));return E==null||A==null?-1:A*f+E};function q(S){for(let E=0;E<S.length-1;E++){let A=S[E],O=S[E+1],U=Math.abs(A.y-O.y)<.01,W=Math.abs(A.x-O.x)<.01;if(U){let z=m.get(e(A.y)),F=w.get(e(A.x)),j=w.get(e(O.x));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)T[z*f+X]++,X<st&&I[z*f+X]++}else if(W){let z=w.get(e(A.x)),F=m.get(e(A.y)),j=m.get(e(O.y));if(z==null||F==null||j==null)continue;let nt=Math.min(F,j),st=Math.max(F,j);for(let X=nt;X<=st;X++)v[X*f+z]++,X<st&&C[X*f+z]++}}}let et=p*4,V=et<=16e6,Vt=V?new Float64Array(et):null,Jt=V?new Int32Array(et):null,Qt=V?new Uint32Array(et):null,Et=0;function Te(S,E,A,O,U){let W=Y(S),z=Y(A);if(W<0||z<0)return null;let F=u[z%f],j=g[z/f|0],nt=U.bendPenalty,st=U.crossingPenalty;Et++;let X=V?null:new Map,te=V?null:new Map,ee=V?R=>Qt[R]===Et?Vt[R]:void 0:R=>X.get(R),ne=V?(R,G,J)=>{Qt[R]=Et,Vt[R]=G,Jt[R]=J}:(R,G,J)=>{X.set(R,G),te.set(R,J)},Xe=V?R=>Jt[R]:R=>te.get(R),ht=new Ut,se=W*4+E;ne(se,0,-1),ht.push(se,Dt*(Math.abs(u[W%f]-F)+Math.abs(g[W/f|0]-j)));let _t=1/0,It=-1,Fe=0,Ge=4e5;for(;ht.size;){let R=ht.peekKey(),G=ht.pop();if(R>=_t)break;let J=ee(G),rt=G>>2,xt=G&3,Nt=rt%f,Ot=rt/f|0;if(!(R>J+Dt*(Math.abs(u[Nt]-F)+Math.abs(g[Ot]-j))+1e-6)){if(++Fe>Ge)break;if(rt===z){let H=xt===O?0:xt===Yt[O]?2*nt:nt;J+H<_t&&(_t=J+H,It=G);continue}for(let H=0;H<4;H++){if(H===Yt[xt])continue;let lt=Nt+mn[H],ft=Ot+wn[H];if(lt<0||ft<0||lt>=f||ft>=h)continue;let K=ft*f+lt;if(K!==z&&P(K))continue;let ut=H<2;if(B(ut?H===0?rt:K:H===2?rt:K,ut))continue;let oe=Math.abs(ut?u[lt]-u[Nt]:g[ft]-g[Ot]),mt=oe;H!==xt&&(mt+=nt);let ie=H===0||H===2?rt:K,re=ut?I[ie]:C[ie];re&&(mt+=oe*.25*re),K!==z&&(ut?v[K]:T[K])&&(mt+=st);let Pt=K*4+H,$t=J+mt,ae=ee(Pt);(ae===void 0||$t<ae-1e-9)&&(ne(Pt,$t,G),ht.push(Pt,$t+Dt*(Math.abs(u[lt]-F)+Math.abs(g[ft]-j))))}}}if(It<0)return null;let At=[];for(let R=It;R!==-1&&R!==void 0;R=Xe(R)){let G=R>>2;At.push({x:u[G%f],y:g[G/f|0]})}return At.reverse(),At}return{astar:Te,markPath:q,xs:u,ys:g,N:p}}var Ut=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,n){let o=this.k,s=this.v,e=o.length;for(o.push(n),s.push(t);e>0;){let r=e-1>>1;if(o[r]<=n)break;o[e]=o[r],s[e]=s[r],e=r}o[e]=n,s[e]=t}peekKey(){return this.k[0]}pop(){let t=this.k,n=this.v,o=n[0],s=t.pop(),e=n.pop();if(t.length){let r=0,c=t.length;for(;;){let a=2*r+1;if(a>=c||(a+1<c&&t[a+1]<t[a]&&a++,t[a]>=s))break;t[r]=t[a],n[r]=n[a],r=a}t[r]=s,n[r]=e}return o}};function Oe(i,t,n,o){if(!o)return 0;let s=i.options,e=(a,d)=>d.x>=a.x-1&&d.x<=a.x+a.width+1&&d.y>=a.y-1&&d.y<=a.y+a.height+1&&Math.min(Math.abs(d.x-a.x),Math.abs(d.x-a.x-a.width),Math.abs(d.y-a.y),Math.abs(d.y-a.y-a.height))<=1,r=(a,d)=>{let l={left:Math.abs(d.x-a.x),right:Math.abs(d.x-a.x-a.width),top:Math.abs(d.y-a.y),bottom:Math.abs(d.y-a.y-a.height)};return Object.keys(l).reduce((u,g)=>l[g]<l[u]?g:u)},c=0;for(let a of i.edges){let d=o[a.id],l=t.paths.get(a.id),u=n.get(a.source),g=n.get(a.target);if(!Array.isArray(d)||d.length<2||!l||!u||!g)continue;let f=d.map(p=>({x:+p[0],y:+p[1]}));if(f.some(p=>!Number.isFinite(p.x)||!Number.isFinite(p.y))||!e(u,f[0])||!e(g,f[f.length-1]))continue;let h=!0;for(let p=0;h&&p<f.length-1;p++){let w=f[p],m=f[p+1];t.mode==="orthogonal"&&Math.abs(w.x-m.x)>.5&&Math.abs(w.y-m.y)>.5&&(h=!1)}h&&(l.points=f,l.sourceSide=r(u,f[0]),l.targetSide=r(g,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(p=>({...p}))),c++)}if(c){let a=i.edges.map(l=>l.id).filter(l=>t.paths.has(l)),d=s.lineHops&&t.mode==="orthogonal"?jt(t.paths,a,s.hopRadius):new Map;for(let[l,u]of t.paths)u.hops=d.get(l)||[]}return c}var it="http://www.w3.org/2000/svg",vn=0,Wt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var St=class{constructor(t,n){this.id="fg"+ ++vn,this.options=n,this.container=t,t.classList.add("fg-container");let o=this.viewport=D("div","fg-viewport");o.tabIndex=0,this.world=D("div","fg-world"),this.groupsLayer=D("div","fg-groups"),this.svg=document.createElementNS(it,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(it,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(it,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=D("div","fg-labels"),this.nodesLayer=D("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),o.appendChild(this.world),t.appendChild(o),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.transform={x:0,y:0,k:1}}destroy(){this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let n=new Set,o=new Map,s=[];for(let e of t){let r=String(e.id);n.add(r);let c=this.nodeEls.get(r),a=Ln(e);if(c||(c=D("div","fg-node"),c.dataset.id=r,this.nodesLayer.appendChild(c),this.nodeEls.set(r,c)),c._sig!==a){c._sig=a,c.className="fg-node"+(e.className?" "+e.className:"")+(e.type?" fg-node--"+e.type:""),c.innerHTML="";let u=this.options.renderNode?this.options.renderNode(e,c):void 0;if(typeof u=="string")c.innerHTML=u;else if(u instanceof Node)c.appendChild(u);else if(u===void 0)if(e.html!=null)c.innerHTML=e.html;else{let g=D("div","fg-node__label");g.textContent=e.label??r,c.appendChild(g)}c._measured=null}let d=typeof e.width=="number",l=typeof e.height=="number";c.style.width=d?e.width+"px":"",c.style.height=l?e.height+"px":"",(!d||!l)&&s.push([r,c,d?e.width:null,l?e.height:null])}for(let[e,r]of this.nodeEls)n.has(e)||(r.remove(),this.nodeEls.delete(e));for(let[,e]of s)e.classList.add("fg-node--measuring");for(let[e,r,c,a]of s)r._measured||(r._measured={width:Math.ceil(r.offsetWidth)||this.options.defaultNodeWidth,height:Math.ceil(r.offsetHeight)||this.options.defaultNodeHeight}),o.set(e,{width:c??r._measured.width,height:a??r._measured.height});for(let[,e]of s)e.classList.remove("fg-node--measuring");return o}renderPorts(t){for(let n of t.nodes){let o=this.nodeEls.get(n.id);if(!o)continue;let s=this.options.showPorts?JSON.stringify(n.ports.map(e=>[e.id,e.side,e.offset])):"";if(o._portSig!==s&&(o._portSig=s,o.querySelectorAll(":scope > .fg-port").forEach(e=>e.remove()),!!s))for(let[e,r]of dt(n)){let c=D("div","fg-port fg-port--"+r.side);c.dataset.port=e,c.style.left=r.px*100+"%",c.style.top=r.py*100+"%",o.appendChild(c)}}}placeNodes(t,n){for(let o of t.nodes){let s=this.nodeEls.get(o.id),e=n.get(o.id);!s||!e||(s.style.width=e.width+"px",s.style.height=e.height+"px",s.style.transform=`translate(${e.x}px, ${e.y}px)`,s.classList.toggle("fg-node--pinned",!!o.constraints.pinned))}}renderGroups(t,n){let o=new Set;for(let s of t.groups){let e=n.get(s.id);if(!e)continue;o.add(s.id);let r=this.groupEls.get(s.id);if(!r){r=D("div","fg-group"),r.dataset.id=s.id;let c=D("div","fg-group__label");r.appendChild(c),this.groupsLayer.appendChild(r),this.groupEls.set(s.id,r)}r.className="fg-group"+(s.className?" "+s.className:""),r.firstChild.textContent=s.label,r.firstChild.style.height=this.options.groupLabelHeight+"px",r.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(r.style,{transform:`translate(${e.x}px, ${e.y}px)`,width:e.width+"px",height:e.height+"px"})}for(let[s,e]of this.groupEls)o.has(s)||(e.remove(),this.groupEls.delete(s))}ensureMarker(t){if(!t||!Wt[t]||this.markersUsed.has(t))return;let n=document.createElementNS(it,"marker");n.setAttribute("id",`${this.id}-m-${t}`),n.setAttribute("viewBox","-10 -8 24 16"),n.setAttribute("refX","12"),n.setAttribute("refY","0"),n.setAttribute("markerWidth","24"),n.setAttribute("markerHeight","16"),n.setAttribute("markerUnits","userSpaceOnUse"),n.setAttribute("orient","auto-start-reverse"),n.setAttribute("class","fg-marker fg-marker--"+t),n.innerHTML=Wt[t],this.defs.appendChild(n),this.markersUsed.add(t)}renderEdges(t,n,o){let s=this.options,e=new Set;for(let r of t.edges){let c=n.paths.get(r.id);if(!c)continue;e.add(r.id);let a=this.edgeEls.get(r.id);if(!a){a=document.createElementNS(it,"g"),a.dataset.id=r.id;let f=document.createElementNS(it,"path");f.setAttribute("class","fg-edge__hit");let h=document.createElementNS(it,"path");h.setAttribute("class","fg-edge__line"),a.append(f,h),this.edgesGroup.appendChild(a),this.edgeEls.set(r.id,a)}a.setAttribute("class",`fg-edge fg-edge--${Sn(r.type)}${r.className?" "+r.className:""}`);let d=o?o.get(r.id):null,l=d?_n(d):Zt(c,s.cornerRadius,s.lineHops?c.hops:[],s.hopRadius),[u,g]=a.childNodes;u.setAttribute("d",l),g.setAttribute("d",l);for(let[f,h]of[["marker-start",r.markerStart],["marker-end",r.markerEnd]])h&&Wt[h]?(this.ensureMarker(h),g.setAttribute(f,`url(#${this.id}-m-${h})`)):g.removeAttribute(f);this.renderLabel(r,o?null:c)}for(let[r,c]of this.edgeEls)e.has(r)||(c.remove(),this.edgeEls.delete(r),this.renderLabel({id:r,label:null},null));for(let r of t.edges){let c=this.edgeEls.get(r.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,n){let o=this.labelEls.get(t.id);if(t.label==null||t.label===""){o&&(o.remove(),this.labelEls.delete(t.id));return}if(o||(o=D("div","fg-edge-label"),o.dataset.id=t.id,this.labelsLayer.appendChild(o),this.labelEls.set(t.id,o)),o.textContent=t.label,!n){o.style.visibility="hidden";return}o.style.visibility="";let s=En(n.points);o.style.transform=`translate(${s.x}px, ${s.y}px) translate(-50%, -50%)`}setTransform(t){this.transform=t,this.world.style.transform=`translate(${t.x}px, ${t.y}px) scale(${t.k})`}};function D(i,t){let n=document.createElement(i);return t&&(n.className=t),n}function Sn(i){return String(i).replace(/[^a-zA-Z0-9_-]/g,"_")}function Ln(i){return JSON.stringify([i.label,i.html,i.className,i.type,i.columns,i.data])}function En(i){let t=0,n=0;for(let e=0;e<i.length-1;e++){let r=Math.hypot(i[e+1].x-i[e].x,i[e+1].y-i[e].y);r>t&&(t=r,n=e)}let o=i[n],s=i[n+1]||o;return{x:(o.x+s.x)/2,y:(o.y+s.y)/2}}var N=i=>Math.round(i*100)/100;function _n(i){return i.map((t,n)=>(n?"L":"M")+N(t.x)+","+N(t.y)).join(" ")}function Zt(i,t=6,n=[],o=4){let s=i.points;if(!s||s.length<2)return"";if(i.kind==="curved")return In(i);let e=`M${N(s[0].x)},${N(s[0].y)}`,r=s.length,c=new Array(r).fill(0);for(let d=1;d<r-1;d++){let l=Math.hypot(s[d].x-s[d-1].x,s[d].y-s[d-1].y),u=Math.hypot(s[d+1].x-s[d].x,s[d+1].y-s[d].y);c[d]=Math.max(0,Math.min(t,l/2,u/2))}let a=new Map;for(let d of n||[])a.has(d.seg)||a.set(d.seg,[]),a.get(d.seg).push(d);for(let d=0;d<r-1;d++){let l=s[d],u=s[d+1],g=Math.hypot(u.x-l.x,u.y-l.y)||1,f=(u.x-l.x)/g,h=(u.y-l.y)/g,p=c[d+1],w=u.x-f*p,m=u.y-h*p,M=a.get(d);if(M&&Math.abs(h)<1e-6){let y=Math.sign(f),x=l.x+f*c[d];M.sort((b,k)=>(b.x-k.x)*y);for(let b of M)(b.x-x)*y<o+1||(w-b.x)*y<o+1||(e+=` L${N(b.x-y*o)},${N(l.y)} A${o},${o} 0 0 ${y>0?1:0} ${N(b.x+y*o)},${N(l.y)}`)}if(e+=` L${N(w)},${N(m)}`,d+1<r-1&&p>0){let y=s[d+2],x=Math.hypot(y.x-u.x,y.y-u.y)||1;e+=` Q${N(u.x)},${N(u.y)} ${N(u.x+(y.x-u.x)/x*p)},${N(u.y+(y.y-u.y)/x*p)}`}}return e}function In(i){let t=i.points,n=t[0],o=t[t.length-1],s=Math.hypot(o.x-n.x,o.y-n.y),e=Math.max(30,Math.min(160,s*.4));if(t.length===2){let g=Z[i.sourceSide]||{x:0,y:0},f=Z[i.targetSide]||{x:0,y:0};return`M${N(n.x)},${N(n.y)} C${N(n.x+g.x*e)},${N(n.y+g.y*e)} ${N(o.x+f.x*e)},${N(o.y+f.y*e)} ${N(o.x)},${N(o.y)}`}let r=Z[i.sourceSide],c=Z[i.targetSide],a=r?{x:n.x-r.x*40,y:n.y-r.y*40}:n,d=c?{x:o.x-c.x*40,y:o.y-c.y*40}:o,l=[a,...t,d],u=`M${N(n.x)},${N(n.y)}`;for(let g=1;g<l.length-2;g++){let f=l[g-1],h=l[g],p=l[g+1],w=l[g+2],m={x:h.x+(p.x-f.x)/6,y:h.y+(p.y-f.y)/6},M={x:p.x-(w.x-h.x)/6,y:p.y-(w.y-h.y)/6};u+=` C${N(m.x)},${N(m.y)} ${N(M.x)},${N(M.y)} ${N(p.x)},${N(p.y)}`}return u}function Pe(i,t,n,o=28){let s=new Map;for(let[e,r]of t){let c=i&&i.get(e),a=Xt(r.points,o);if(!c){s.set(e,a);continue}let d=Xt(c.points,o);s.set(e,a.map((l,u)=>({x:d[u].x+(l.x-d[u].x)*n,y:d[u].y+(l.y-d[u].y)*n})))}return s}function $e(i){let t=i.renderer,n=t.viewport,o=()=>i.options,s=new Map,e=null,r=0,c=null,a=(y,x)=>{let b=n.getBoundingClientRect(),k=t.transform;return{x:(y-b.left-k.x)/k.k,y:(x-b.top-k.y)/k.k}},d=y=>{let x=y.target.closest&&y.target.closest(".fg-node");if(x&&t.nodesLayer.contains(x))return{kind:"node",id:x.dataset.id,el:x};let b=y.target.closest&&y.target.closest(".fg-edge");if(b)return{kind:"edge",id:b.dataset.id,el:b};let k=y.target.closest&&y.target.closest(".fg-edge-label");if(k)return{kind:"edge",id:k.dataset.id,el:k};let L=y.target.closest&&y.target.closest(".fg-group");return L?{kind:"group",id:L.dataset.id,el:L}:{kind:"background"}};function l(y){if(y.button!==void 0&&y.button!==0&&y.pointerType==="mouse"||y.target.closest&&y.target.closest(".fg-controls")||y.target.closest&&y.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(s.set(y.pointerId,{x:y.clientX,y:y.clientY}),n.setPointerCapture?.(y.pointerId),s.size===2&&o().zoomable){let[k,L]=[...s.values()];e={type:"pinch",dist:Math.hypot(k.x-L.x,k.y-L.y),k:t.transform.k,mid:{x:(k.x+L.x)/2,y:(k.y+L.y)/2}};return}let x=d(y),b={x:y.clientX,y:y.clientY};if(x.kind==="node"&&o().draggable){let k=i.positions.get(x.id),L=a(y.clientX,y.clientY);e={type:"drag",id:x.id,target:x,start:b,moved:!1,dx:L.x-k.x,dy:L.y-k.y}}else o().pannable?e={type:"pan",target:x,start:b,moved:!1,tx:t.transform.x,ty:t.transform.y}:e={type:"click",target:x,start:b,moved:!1}}function u(y){if(s.has(y.pointerId)&&s.set(y.pointerId,{x:y.clientX,y:y.clientY}),!e)return;if(e.type==="pinch"){if(s.size<2)return;let[b,k]=[...s.values()],L=Math.hypot(b.x-k.x,b.y-k.y);i.zoomAt(e.k*(L/e.dist),e.mid.x,e.mid.y,!0);return}let x=Math.hypot(y.clientX-e.start.x,y.clientY-e.start.y);if(!(!e.moved&&x<4)){if(e.moved||(e.moved=!0,e.type==="drag"&&(i._dragStart(e.id),n.classList.add("fg-dragging")),e.type==="pan"&&n.classList.add("fg-panning")),e.type==="pan")i.setTransform({x:e.tx+y.clientX-e.start.x,y:e.ty+y.clientY-e.start.y,k:t.transform.k});else if(e.type==="drag"){let b=a(y.clientX,y.clientY);c={id:e.id,x:b.x-e.dx,y:b.y-e.dy},r||(r=requestAnimationFrame(g))}}}function g(){if(r=0,c){let y=c;c=null,i._dragMove(y.id,y.x,y.y)}}function f(y){if(s.delete(y.pointerId),!e)return;let x=e;if(x.type==="pinch"){s.size===0&&(e=null);return}if(e=null,n.classList.remove("fg-dragging","fg-panning"),x.type==="drag"&&x.moved){r&&(cancelAnimationFrame(r),r=0,g()),i._dragEnd(x.id);return}!x.moved&&y.type==="pointerup"&&i._click(x.target,y)}function h(y){if(!o().zoomable)return;y.preventDefault();let x=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));i.zoomAt(x,y.clientX,y.clientY,!0)}let p=null;function w(y){if(e&&e.moved)return;let x=d(y),b=x.kind==="node"||x.kind==="edge"?x.kind+":"+x.id:null;b!==p&&(p=b,i._hover(b?x:null))}function m(){p&&(p=null,i._hover(null))}function M(y){y.key==="Escape"?i.select(null):(y.key==="+"||y.key==="=")&&o().zoomable?i.zoomBy(1.2):y.key==="-"&&o().zoomable?i.zoomBy(1/1.2):y.key==="0"&&i.fit()}return n.addEventListener("pointerdown",l),n.addEventListener("pointermove",u),n.addEventListener("pointerup",f),n.addEventListener("pointercancel",f),n.addEventListener("wheel",h,{passive:!1}),n.addEventListener("pointerover",w),n.addEventListener("pointerleave",m),n.addEventListener("keydown",M),()=>{n.removeEventListener("pointerdown",l),n.removeEventListener("pointermove",u),n.removeEventListener("pointerup",f),n.removeEventListener("pointercancel",f),n.removeEventListener("wheel",h),n.removeEventListener("pointerover",w),n.removeEventListener("pointerleave",m),n.removeEventListener("keydown",M),r&&cancelAnimationFrame(r)}}function Re(i,t,n="chain"){let o=new Set,s=new Set,e=[],r=[];if(t.kind==="node")o.add(t.id),e=[t.id],r=[t.id];else{let l=i.find(u=>u.id===t.id);if(!l)return{nodes:o,edges:s};s.add(l.id),o.add(l.source),o.add(l.target),e=[l.source],r=[l.target]}let c=new Map,a=new Map;for(let l of i)c.has(l.target)||c.set(l.target,[]),a.has(l.source)||a.set(l.source,[]),c.get(l.target).push(l),a.get(l.source).push(l);let d=(l,u,g)=>{let f=new Set(l),h=[...l];for(;h.length;){let p=h.shift();for(let w of u.get(p)||[]){let m=g(w);s.add(w.id),o.add(m),n==="chain"&&!f.has(m)&&(f.add(m),h.push(m))}}};return(t.kind==="node"||n==="chain")&&(d(e,c,l=>l.source),d(r,a,l=>l.target)),{nodes:o,edges:s}}var Be="1.0.2";var Kt={};ce(Kt,{countCrossings:()=>Nn,countNodeOverlaps:()=>On,countOverlappingSegments:()=>Pn});function An(i,t,n,o){let s=(d,l,u)=>(l.x-d.x)*(u.y-d.y)-(l.y-d.y)*(u.x-d.x),e=s(n,o,i),r=s(n,o,t),c=s(i,t,n),a=s(i,t,o);return(e>1e-9&&r<-1e-9||e<-1e-9&&r>1e-9)&&(c>1e-9&&a<-1e-9||c<-1e-9&&a>1e-9)}function Nn(i){let t=[...i.entries()].map(([o,s])=>[o,Array.isArray(s)?s:s.points]),n=0;for(let o=0;o<t.length;o++)for(let s=o+1;s<t.length;s++){let e=t[o][1],r=t[s][1];for(let c=0;c<e.length-1;c++)for(let a=0;a<r.length-1;a++)An(e[c],e[c+1],r[a],r[a+1])&&n++}return n}function On(i,t,n){let o=0;for(let[s,e]of i){let r=Array.isArray(e)?e:e.points,c=n.get(s);for(let[a,d]of t)if(!(c&&(a===c.source||a===c.target))){for(let l=0;l<r.length-1;l++)if(vt(r[l],r[l+1],d,1)){o++;break}}}return o}function Pn(i){let t=[];for(let[s,e]of i){let r=Array.isArray(e)?e:e.points;for(let c=0;c<r.length-1;c++)t.push([s,r[c],r[c+1],c===0?r[0]:c===r.length-2?r[r.length-1]:null])}let n=(s,e)=>s&&e&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01,o=0;for(let s=0;s<t.length;s++)for(let e=s+1;e<t.length;e++){let[r,c,a,d]=t[s],[l,u,g,f]=t[e];if(r===l||n(d,f))continue;let h=Math.abs(c.y-a.y)<.01,p=Math.abs(u.y-g.y)<.01,w=Math.abs(c.x-a.x)<.01,m=Math.abs(u.x-g.x)<.01;if(h&&p&&Math.abs(c.y-u.y)<.5){let M=Math.max(Math.min(c.x,a.x),Math.min(u.x,g.x));Math.min(Math.max(c.x,a.x),Math.max(u.x,g.x))-M>1&&o++}else if(w&&m&&Math.abs(c.x-u.x)<.5){let M=Math.max(Math.min(c.y,a.y),Math.min(u.y,g.y));Math.min(Math.max(c.y,a.y),Math.max(u.y,g.y))-M>1&&o++}}return o}function $n(i,t){let n=bt(i,t),o=gt(n),s=ot(n,o);return{model:n,layout:o,routing:s}}function Rn(i,t,n={}){return new Lt(i,t,n)}var Bn=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],qt=i=>{let t={};for(let n of Bn)i[n]!==void 0&&(t[n]=i[n]);return t},Cn=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,Lt=class{constructor(t,n,o={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=n||{nodes:[],edges:[]},this.userOptions={...o},this.options=Mt(this.data.options,this.userOptions),this.renderer=new St(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._listeners=new Map,this._anim=0,this._hl=[],this.options.controls&&this._controls(),this._detach=$e(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:n=!1}={}){return this._build({mode:"relayout",animate:t,fresh:n})}updateGraph(t,{mode:n="stable",animate:o=this.options.animate}={}){this.data=t;let s=new Set((t.nodes||[]).map(e=>String(e.id)));for(let e of[...this.pins.keys()])s.has(e)||this.pins.delete(e);for(let e of[...this.positions.keys()])s.has(e)||this.positions.delete(e);return this._build({mode:n,animate:o})}setOptions(t,{relayout:n=!0}={}){return Object.assign(this.userOptions,t),this.options=Mt(this.data.options,this.userOptions),this.renderer.options=this.options,n?this.relayout({fresh:"direction"in t}):this._reroute()}exportState(){let t={};for(let[o,s]of this.positions)t[o]={x:ze(s.x),y:ze(s.y),pinned:!!this.pins.get(o)};let n={};if(this.routing)for(let[o,s]of this.routing.paths)n[o]=s.points.map(e=>[He(e.x),He(e.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:n,transform:{...this.renderer.transform}}}importState(t,{animate:n=this.options.animate,transform:o=!0}={}){if(!t||!t.nodes)return Promise.resolve(this);let s=this._snapshot();for(let[e,r]of Object.entries(t.nodes)){let c=this.positions.get(e);c&&(c.x=r.x,c.y=r.y,r.pinned?this.pins.set(e,{x:r.x,y:r.y}):this.pins.delete(e))}this.model=this._prepareModel();for(let e of this.layoutEdges.values())e.waypoints=[];return this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Oe(this.model,this.routing,this.positions,t.edges),this._present(s,n),o&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,n=!0){let o=this.positions.get(t);if(!o)return;n?this.pins.set(t,{x:o.x,y:o.y}):this.pins.delete(t);let s=this.model.nodeById.get(t);s&&Object.assign(s.constraints,{pinned:n,x:n?o.x:null,y:n?o.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:n})}unpin(t){this.pin(t,!1)}unpinAll(){for(let t of[...this.pins.keys()])this.pin(t,!1)}select(t){typeof t=="string"&&(t={kind:"node",id:t});for(let n of this.renderer.viewport.querySelectorAll(".fg-selected"))n.classList.remove("fg-selected");this.selected=t&&t.id!=null?{kind:t.kind,id:String(t.id)}:null,this.selected&&(this.selected.kind==="edge"?this.renderer.edgeEls:this.renderer.nodeEls).get(this.selected.id)?.classList.add("fg-selected"),this._applyHighlight(),this._emit("select",this.selected)}getSelection(){return this.selected}getConnections(t,{chain:n=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let o=this.model.edges,s=r=>{let c=new Set([t]),a=[],d=[t];for(;d.length;){let l=d.shift();for(let u of o){let g=r==="next"?u.source:u.target,f=r==="next"?u.target:u.source;g!==l||c.has(f)||(c.add(f),a.push(f),n&&d.push(f))}}return a.map(l=>this.model.nodeById.get(l).data)},e=r=>r.data;return{previous:s("previous"),next:s("next"),incoming:o.filter(r=>r.target===t).map(e),outgoing:o.filter(r=>r.source===t).map(e)}}fit({padding:t=40,maxZoom:n=1}={}){let o=this.renderer.viewport,s=pt({nodes:this.positions,groups:this._groups||new Map});if(!s.width&&!s.height)return;let e=o.clientWidth||800,r=o.clientHeight||600,c=Math.min((e-2*t)/(s.width||1),(r-2*t)/(s.height||1),n);c=Ce(c,this.options.minZoom,this.options.maxZoom),this.setTransform({k:c,x:(e-s.width*c)/2-s.x*c,y:(r-s.height*c)/2-s.y*c})}zoomAt(t,n,o){let s=this.renderer.transform;t=Ce(t,this.options.minZoom,this.options.maxZoom);let e=this.renderer.viewport.getBoundingClientRect(),r=n-e.left,c=o-e.top;this.setTransform({k:t,x:r-(r-s.x)*t/s.k,y:c-(c-s.y)*t/s.k})}zoomBy(t){let n=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,n.left+n.width/2,n.top+n.height/2)}zoomTo(t){this.zoomAt(t,...zn(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([o,s])=>[o,{...s}])),n=new Map;if(this.routing)for(let[o,s]of this.routing.paths)n.set(o,s.points.map(e=>({...e})));return{nodes:t,edges:n,groups:new Map(this._groups||[])}}on(t,n){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(n),()=>this._listeners.get(t).delete(n)}destroy(){cancelAnimationFrame(this._anim),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,n){for(let o of this._listeners.get(t)||[])try{o(n)}catch(s){console.error(s)}}_prepareModel(t){let n=this.renderer.syncNodes(this.data.nodes||[]),o=(this.data.nodes||[]).map(e=>{let r=String(e.id),c=t&&t.get(r)||this.pins.get(r);return c?{...e,constraints:{...e.constraints||{},pinned:!0,x:c.x,y:c.y}}:e}),s=bt({...this.data,nodes:o},this.userOptions,n);for(let e of s.warnings)console.warn("[FlexGraph] "+e);return this.options=s.options,this.renderer.options=s.options,s}_snapshot(){return{positions:new Map([...this.positions].map(([t,n])=>[t,{...n}])),routing:this.routing,groups:this._groups}}async _build({mode:t,animate:n,fresh:o}){let s=this._snapshot(),e=this._prepareModel(),r,c=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")r=await this._layoutInWorker(e,t,o);else if(t==="stable"&&c){let a=new Map;for(let l of e.nodes){let u=this.positions.get(l.id);u&&a.set(l.id,{x:u.x,y:u.y})}let d=this._prepareModel(a);r=gt(d),ke(r,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let l of r.edges.values())l.waypoints=[];e=this._prepareModel()}else{let a=o||!c?null:new Map([...this.positions].map(([d,l])=>[d,{x:l.x+l.width/2,y:l.y+l.height/2}]));r=gt(e,{hints:a})}return this.model=e,this.positions=new Map([...r.nodes].map(([a,d])=>[a,{x:d.x,y:d.y,width:d.width,height:d.height}])),this.layoutEdges=r.edges,this.routing=r.routing||ot(e,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(e),this._present(c?s:null,n),this.selected&&this.select(this.selected),this._emit("layout",{crossings:r.crossings}),this}_layoutInWorker(t,n,o){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let d=this._wpending.get(a.data.seq);d&&(this._wpending.delete(a.data.seq),a.data.error?d.reject(new Error(a.data.error)):d.resolve(a.data))});let s={options:this.data.options,nodes:t.nodes.map(a=>({...qt(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>qt(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this.data.constraints||[]).map(qt)},e={};for(let[a,d]of Object.entries(this.userOptions))typeof d!="function"&&a!=="worker"&&(e[a]=d);let r=o||n!=="relayout"?null:new Map([...this.positions].map(([a,d])=>[a,{x:d.x+d.width/2,y:d.y+d.height/2}])),c=++this._wseq;return new Promise((a,d)=>{this._wpending.set(c,{resolve:a,reject:d}),this._worker.postMessage({seq:c,data:s,options:e,hints:r})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let n=this.renderer;if(n.placeNodes(this.model,this.positions),this._groups=yt(this.model,{nodes:this.positions}),n.renderGroups(this.model,this._groups),n.renderEdges(this.model,this.routing,t),this.selected?.kind==="edge"&&n.edgeEls.get(this.selected.id)?.classList.add("fg-selected"),this._hl.length)for(let o of this._hl)o.classList.add("fg-hl")}_present(t,n){if(cancelAnimationFrame(this._anim),!t||!n||Cn()||!t.routing){this._render();return}let o=this.positions,s=this.options.animationDuration,e=performance.now(),r=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,c=a=>{let d=Math.min(1,(a-e)/s);if(d>=1){this._render(),this._emit("animationend");return}let l=r(d),u=new Map;for(let[g,f]of o){let h=t.positions.get(g)||f;u.set(g,{x:h.x+(f.x-h.x)*l,y:h.y+(f.y-h.y)*l,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,u),this._groups=yt(this.model,{nodes:u}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,Pe(t.routing.paths,this.routing.paths,l)),this._anim=requestAnimationFrame(c)};this._anim=requestAnimationFrame(c)}_dragStart(t){cancelAnimationFrame(this._anim);let n=new Set([t]);for(let o of this.model.edges)o.source===t&&n.add(o.target),o.target===t&&n.add(o.source);this._affected=new Set(this.model.edges.filter(o=>n.has(o.source)||n.has(o.target)).map(o=>o.id));for(let o of this._affected){let s=this.model.edgeById.get(o);if(s.source===t||s.target===t){let e=this.layoutEdges.get(o);e&&(e.waypoints=[])}}this.renderer.nodeEls.get(t)?.classList.add("fg-node--dragging"),this._emit("dragstart",{id:t})}_dragMove(t,n,o){let s=this.positions.get(t);if(!s)return;s.x=n,s.y=o;let e=this.model.nodeById.get(t);e.constraints.pinned&&(e.constraints.x=n,e.constraints.y=o);let r=this.options.nodeMargin,c={x:n-r,y:o-r,width:s.width+2*r,height:s.height+2*r};if(this.routing)for(let[a,d]of this.routing.paths){if(this._affected.has(a))continue;let l=d.points;for(let u=0;u<l.length-1;u++)if(vt(l[u],l[u+1],c,1)){this._affected.add(a);break}}this.routing=ot(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:n,y:o})}_dragEnd(t){let n=this.positions.get(t);this.renderer.nodeEls.get(t)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(t,!0),this._emit("dragend",{id:t,x:n.x,y:n.y}),this._emit("change",this.exportState())}_click(t,n){if(t.kind==="node"){this.select({kind:"node",id:t.id});let o=this.model.nodeById.get(t.id),s=this.getConnections(t.id);this.options.onNodeClick?.(o.data,n,s),this._emit("nodeclick",{node:o.data,event:n,previous:s.previous,next:s.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,n),this._emit("edgeclick",{edge:o.data,event:n})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:n}):(this.select(null),this.options.onBackgroundClick?.(n))}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let e of this._hl)e.classList.remove("fg-hl");this._hl=[];let t=this.renderer,n=this._hovered||(this.options.highlightSelection?this.selected:null);if(n&&!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id)&&(n=null),t.world.classList.toggle("fg-hovering",!!n),!n)return;let o=e=>{e&&(e.classList.add("fg-hl"),this._hl.push(e))},s=Re(this.model.edges,n,this.options.hoverHighlight);for(let e of s.nodes)o(t.nodeEls.get(e));for(let e of s.edges)o(t.edgeEls.get(e)),o(t.labelEls.get(e))}_controls(){let t=document.createElement("div");t.className="fg-controls";let n=(o,s,e)=>{let r=document.createElement("button");r.type="button",r.textContent=o,r.title=s,r.setAttribute("aria-label",s),r.addEventListener("click",c=>{c.stopPropagation(),e()}),t.appendChild(r)};n("+","Zoom in",()=>this.zoomBy(1.25)),n("\u2212","Zoom out",()=>this.zoomBy(.8)),n("\u2922","Fit to screen",()=>this.fit()),this.renderer.viewport.appendChild(t)}},Ce=(i,t,n)=>Math.max(t,Math.min(n,i)),ze=i=>Math.round(i*10)/10,He=i=>Math.round(i*100)/100;function zn(i){let t=i.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}
|
|
8
|
+
var zt=Object.defineProperty;var nn=Object.getOwnPropertyDescriptor;var sn=Object.getOwnPropertyNames;var on=Object.prototype.hasOwnProperty;var ye=(r,t)=>{for(var e in t)zt(r,e,{get:t[e],enumerable:!0})},rn=(r,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of sn(t))!on.call(r,o)&&o!==e&&zt(r,o,{get:()=>t[o],enumerable:!(s=nn(t,o))||s.enumerable});return r};var an=r=>rn(zt({},"__esModule",{value:!0}),r);var os={};ye(os,{DEFAULT_OPTIONS:()=>_t,GraphValidationError:()=>ct,GraphView:()=>At,VERSION:()=>Ke,computeLayout:()=>mt,createGraph:()=>ts,edgePath:()=>te,layoutGraph:()=>Qn,metrics:()=>ee,normalizeGraph:()=>kt,routeEdges:()=>nt,selectionHighlight:()=>qe});module.exports=an(os);var cn=["top","right","bottom","left"],dn=["TB","LR","BT","RL"],hn=["orthogonal","straight","curved"],_t=Object.freeze({direction:"TB",nodeSpacing:40,rankSpacing:80,edgeSpacing:10,edgeRouting:"orthogonal",cornerRadius:6,lineHops:!0,hopRadius:4,animate:!0,animationDuration:300,nodeMargin:14,groupPadding:20,groupLabelHeight:22,componentSpacing:80,maxIterations:24,bendPenalty:24,crossingPenalty:120,bundleFanOut:5,defaultNodeWidth:160,defaultNodeHeight:60,pinOnDrag:!0,draggable:!0,zoomable:!0,pannable:!0,minZoom:.1,maxZoom:4,controls:!0,showPorts:!0,hoverHighlight:"chain",highlightSelection:!0,multiSelect:!0,history:!0,historyLimit:100,expandText:"Details",collapseText:"Hide",explore:!1,exploreUnfocused:"dim",exploreLimit:25,exploreBreadcrumb:!0,exploreStartText:"Start",exploreMoreText:void 0,edgeTypes:{default:{markerEnd:"arrow"},"has-many":{markerStart:"one",markerEnd:"many"},"has-one":{markerStart:"one",markerEnd:"onlyOne"},"belongs-to":{markerStart:"many",markerEnd:"one"},"many-to-many":{markerStart:"many",markerEnd:"many"},association:{markerEnd:"open"},composition:{markerStart:"diamond"},dependency:{markerEnd:"open"}}}),ct=class extends Error{constructor(t,e=[]){super(t),this.name="GraphValidationError",this.details=e}},tt=r=>typeof r=="number"&&Number.isFinite(r);function yt(...r){let t={..._t,edgeTypes:{..._t.edgeTypes}};for(let e of r)if(e)for(let[s,o]of Object.entries(e))o!==void 0&&(s==="edgeTypes"?Object.assign(t.edgeTypes,o):t[s]=o);return dn.includes(t.direction)||(t.direction="TB"),hn.includes(t.edgeRouting)||(t.edgeRouting="orthogonal"),t}function kt(r,t,e){if(!r||typeof r!="object")throw new ct("Graph must be an object");let s=yt(r.options,t),o=[],n=[],i=[],d=new Map;for(let f of r.groups||[]){if(!f||f.id==null){o.push("Group without id");continue}let l=String(f.id);if(d.has(l)){o.push(`Duplicate group id "${l}"`);continue}let u={id:l,label:f.label??l,className:f.className||"",data:f};i.push(u),d.set(l,u)}let a=[],c=new Map;(r.nodes||[]).forEach((f,l)=>{if(!f||f.id==null){o.push(`Node at index ${l} has no id`);return}let u=String(f.id);if(c.has(u)){o.push(`Duplicate node id "${u}"`);return}let m=e&&e.get(u),w=tt(f.width)?f.width:m?m.width:s.defaultNodeWidth,M=tt(f.height)?f.height:m?m.height:s.defaultNodeHeight,b=f.group!=null?String(f.group):null;if(b&&!d.has(b)){let S={id:b,label:b,className:"",data:{id:b}};i.push(S),d.set(b,S)}let x=[],y=new Set;for(let S of f.ports||[]){if(!S||S.id==null){n.push(`Node "${u}": port without id ignored`);continue}let A=String(S.id);if(y.has(A)){n.push(`Node "${u}": duplicate port "${A}" ignored`);continue}let N=cn.includes(S.side)?S.side:null;N||n.push(`Node "${u}": port "${A}" has invalid side "${S.side}", using auto side`),y.add(A),x.push({id:A,side:N,offset:tt(S.offset)?Math.min(1,Math.max(0,S.offset)):null,label:S.label,data:S})}let _=f.constraints||{},k={pinned:!!_.pinned,x:tt(_.x)?_.x:tt(f.x)&&_.pinned?f.x:null,y:tt(_.y)?_.y:tt(f.y)&&_.pinned?f.y:null,rank:Number.isInteger(_.rank)&&_.rank>=0?_.rank:null};k.pinned&&(k.x==null||k.y==null)&&(n.push(`Node "${u}" is pinned but has no x/y; pin ignored until it has a position`),k.pinned=!1);let E={id:u,index:l,label:f.label??u,width:w,height:M,group:b,ports:x,portById:new Map(x.map(S=>[S.id,S])),constraints:k,className:f.className||"",type:f.type||null,data:f};a.push(E),c.set(u,E)});let h=[],p=new Map;(r.edges||[]).forEach((f,l)=>{if(!f)return;let u=f.id!=null?String(f.id):`e${l}`;if(p.has(u)){o.push(`Duplicate edge id "${u}"`);return}let m=String(f.source),w=String(f.target);if(!c.has(m)){o.push(`Edge "${u}": unknown source node "${m}"`);return}if(!c.has(w)){o.push(`Edge "${u}": unknown target node "${w}"`);return}let M=f.sourcePort!=null?String(f.sourcePort):null,b=f.targetPort!=null?String(f.targetPort):null;M&&!c.get(m).portById.has(M)&&(n.push(`Edge "${u}": node "${m}" has no port "${M}"`),M=null),b&&!c.get(w).portById.has(b)&&(n.push(`Edge "${u}": node "${w}" has no port "${b}"`),b=null);let x=s.edgeTypes[f.type]||s.edgeTypes.default||{},y={id:u,index:l,source:m,target:w,sourcePort:M,targetPort:b,type:f.type||"default",label:f.label??null,minLen:Number.isInteger(f.minLen)&&f.minLen>=0?f.minLen:1,weight:tt(f.weight)?f.weight:1,markerStart:f.markerStart!==void 0?f.markerStart:x.markerStart||null,markerEnd:f.markerEnd!==void 0?f.markerEnd:x.markerEnd||null,className:f.className||"",data:f};h.push(y),p.set(u,y)});let g=[];for(let f of r.constraints||[])if(!(!f||!f.type))if(f.type==="leftOf"||f.type==="before"){let l=String(f.a),u=String(f.b);if(!c.has(l)||!c.has(u)){n.push("leftOf constraint references unknown node");continue}g.push({type:"leftOf",a:l,b:u})}else if(f.type==="sameRank"){let l=(f.nodes||[]).map(String).filter(u=>c.has(u));l.length>=2?g.push({type:"sameRank",nodes:l}):n.push("sameRank constraint needs at least two known nodes")}else if(f.type==="rank"){let l=String(f.node);c.has(l)&&Number.isInteger(f.rank)&&(c.get(l).constraints.rank=f.rank)}else n.push(`Unknown constraint type "${f.type}"`);if(o.length)throw new ct(o[0],o);return{options:s,nodes:a,nodeById:c,edges:h,edgeById:p,groups:i,groupById:d,constraints:g,warnings:n}}function ln(r,t){let e=new Map(r.map(d=>[d,[]])),s=new Map(r.map(d=>[d,0]));for(let d of t)e.get(d.v).push(d),s.set(d.w,s.get(d.w)+1);let o=new Map,n=new Set,i=[...r.filter(d=>s.get(d)===0),...r];for(let d of i){if(o.has(d))continue;let a=[[d,0]];for(o.set(d,1);a.length;){let c=a[a.length-1],[h,p]=c,g=e.get(h);if(p>=g.length){o.set(h,2),a.pop();continue}c[1]++;let f=g[p],l=o.get(f.w);l===1?n.add(f.id):l||(o.set(f.w,1),a.push([f.w,0]))}}return n}var Ht=class{constructor(t){this.p=new Map(t.map(e=>[e,e]))}find(t){let e=t;for(;this.p.get(e)!==e;)e=this.p.get(e);for(;this.p.get(t)!==e;){let s=this.p.get(t);this.p.set(t,e),t=s}return e}union(t,e){let s=this.find(t),o=this.find(e);s!==o&&this.p.set(o,s)}};function xe(r,t,e={}){let s=[],o=new Ht(r);for(let x of e.sameRank||[])for(let y=1;y<x.length;y++)o.union(x[0],x[y]);let n=[...new Set(r.map(x=>o.find(x)))],i=new Set,d=new Set,a=[];for(let x of t){if(x.source===x.target){i.add(x.id);continue}let y=o.find(x.source),_=o.find(x.target);if(y===_){d.add(x.id);continue}a.push({id:x.id,v:y,w:_,minLen:x.minLen??1})}let c=ln(n,a),h=a.map(x=>c.has(x.id)?{...x,v:x.w,w:x.v}:x),p=new Map;if(e.fixedRank)for(let[x,y]of e.fixedRank){if(!o.p.has(x))continue;let _=o.find(x);p.has(_)&&p.get(_)!==y&&s.push(`Conflicting fixed ranks in sameRank set of "${x}"`),p.set(_,Math.max(p.get(_)??0,y))}let g=new Map(n.map(x=>[x,[]])),f=new Map(n.map(x=>[x,[]]));for(let x of h)g.get(x.v).push(x),f.get(x.w).push(x);let l=new Map(n.map(x=>[x,f.get(x).length])),u=n.filter(x=>l.get(x)===0),m=[];for(;u.length;){let x=u.shift();m.push(x);for(let y of g.get(x))l.set(y.w,l.get(y.w)-1),l.get(y.w)===0&&u.push(y.w)}let w=new Map;for(let x of m){let y=p.get(x)??0;for(let _ of f.get(x))y=Math.max(y,w.get(_.v)+_.minLen);p.has(x)&&y!==p.get(x)&&s.push(`Fixed rank ${p.get(x)} for "${x}" cannot be satisfied; using ${y}`),w.set(x,y)}for(let x=m.length-1;x>=0;x--){let y=m[x];if(p.has(y))continue;let _=g.get(y);if(!_.length||f.get(y).length>=_.length)continue;let E=1/0;for(let S of _)E=Math.min(E,w.get(S.w)-S.minLen);E>w.get(y)&&w.set(y,E)}let M=1/0;for(let x of w.values())M=Math.min(M,x);if(!p.size&&M>0)for(let[x,y]of w)w.set(x,y-M);let b=new Map;for(let x of r)b.set(x,w.get(o.find(x))??0);return{rank:b,reversed:c,flat:d,selfLoops:i,warnings:s}}function we(r,t,e=0){let s=[],o=new Map;for(let c of r)o.set(c.id,s.length),s.push({id:c.id,real:!0,rank:c.rank,width:c.width,height:c.height??0,group:c.group??null,pinX:c.pinX??null,inputIndex:s.length,up:[],down:[]});let n=new Map,i=[],d=(c,h,p,g,f,l)=>{let u={a:c,b:h,aOff:p,bOff:g,w:f,edgeId:l};i.push(u),s[c].down.push({n:h,off:g,own:p,w:f}),s[h].up.push({n:c,off:p,own:g,w:f})};for(let c of t){let h=o.get(c.v),p=o.get(c.w),g=s[h].rank,f=s[p].rank;if(f<=g)continue;let l=s[h].group&&s[h].group===s[p].group?s[h].group:null,u=[],m=h,w=c.vOff||0;for(let M=g+1;M<f;M++){let b=s.length;s.push({id:`__d_${c.id}_${M}`,real:!1,rank:M,width:e,height:0,group:l,pinX:null,edgeId:c.id,inputIndex:b,up:[],down:[]}),d(m,b,w,0,c.weight??1,c.id),u.push(b),m=b,w=0}d(m,p,w,c.wOff||0,c.weight??1,c.id),n.set(c.id,u)}let a=0;for(let c of s)a=Math.max(a,c.rank);return{v:s,index:o,segs:i,chains:n,maxRank:a}}function Dt(r){let t=Array.from({length:r.maxRank+1},()=>[]),e=new Uint8Array(r.v.length),s=r.v.map((o,n)=>n).filter(o=>r.v[o].real).sort((o,n)=>r.v[o].rank-r.v[n].rank||r.v[o].inputIndex-r.v[n].inputIndex);for(let o of s){if(e[o])continue;let n=[o];for(;n.length;){let i=n.pop();if(e[i])continue;e[i]=1,t[r.v[i].rank].push(i);let d=r.v[i].down.map(a=>a.n);for(let a=d.length-1;a>=0;a--)e[d[a]]||n.push(d[a])}}for(let o=0;o<r.v.length;o++)e[o]||t[r.v[o].rank].push(o);return t}function fn(r){let t=r.length;if(t<2)return 0;let e=r.slice(),s=new Array(t),o=0;for(let n=1;n<t;n*=2){for(let i=0;i<t;i+=2*n){let d=Math.min(i+n,t),a=Math.min(i+2*n,t),c=i,h=d,p=i;for(;c<d&&h<a;)e[c]<=e[h]?s[p++]=e[c++]:(o+=d-c,s[p++]=e[h++]);for(;c<d;)s[p++]=e[c++];for(;h<a;)s[p++]=e[h++]}[e,s]=[s,e]}return o}function un(r,t,e,s){let o=[];for(let n of t)for(let i of r.v[n].down)o.push([s[n]+i.own*.999,s[i.n]+i.off*.999]);return o.sort((n,i)=>n[0]-i[0]||n[1]-i[1]),fn(o.map(n=>n[1]))}function Ft(r,t){let e=vt(r,t),s=0;for(let o=0;o<t.length-1;o++)s+=un(r,t[o],t[o+1],e);return s}function vt(r,t){let e=new Float64Array(r.v.length);for(let s of t)s.forEach((o,n)=>{e[o]=n});return e}function be(r,t={}){let e=t.maxIterations??24,s=(t.leftOf||[]).map(([c,h])=>[r.index.get(c),r.index.get(h)]).filter(([c,h])=>c!=null&&h!=null&&r.v[c].rank===r.v[h].rank),o=new Set(s.map(([c,h])=>c+":"+h)),n=[];t.initial&&n.push(t.initial.map(c=>c.slice()));let i=Dt(r);n.push(i),!t.initial&&e>4&&(n.push(i.map(c=>c.slice().reverse())),n.push(i.map(c=>c.slice().sort((h,p)=>r.v[h].inputIndex-r.v[p].inputIndex))));let d=null,a=1/0;for(let c of n){let h=pn(r,c,s,o,e);if(h.crossings<a&&(d=h.layers,a=h.crossings),a===0)break}return{layers:d,crossings:a}}function pn(r,t,e,s,o){let n=t.map(c=>Me(r,c,e)),i=n.map(c=>c.slice()),d=Ft(r,n),a=0;for(let c=0;c<o&&d>0;c++){let h=c%2===0;yn(r,n,h,e,c%4>=2),xn(r,n,s);let p=Ft(r,n);if(p<d)d=p,i=n.map(g=>g.slice()),a=0;else if(++a>=6)break}if(d>0&&o>4){n=i.map(c=>c.slice());for(let c=0;c<2;c++){gn(r,n,s);let h=Ft(r,n);if(h<d)d=h,i=n.map(p=>p.slice());else break}}return{layers:i,crossings:d}}function gn(r,t,e){let s=vt(r,t);for(let o of t)if(!(o.length<3||o.length>120))for(let n of o.slice()){let i=r.v[n];if(i.pinX!=null||i.group)continue;let d=o.indexOf(n),a=0,c=d,h=0;for(let p=d-1;p>=0;p--){let g=o[p];if(e.has(g+":"+n)||r.v[g].group)break;h+=dt(r,n,g,s)-dt(r,g,n,s),h<a&&(a=h,c=p)}h=0;for(let p=d+1;p<o.length;p++){let g=o[p];if(e.has(n+":"+g)||r.v[g].group)break;h+=dt(r,g,n,s)-dt(r,n,g,s),h<a&&(a=h,c=p)}c!==d&&(o.splice(d,1),o.splice(c,0,n),o.forEach((p,g)=>{s[p]=g}))}}function yn(r,t,e,s,o){let n=vt(r,t),i=t.length,d=e?me(1,i):me(i-2,-1,-1);for(let a of d){let c=t[a],h=new Map;c.forEach((l,u)=>{let m=e?r.v[l].up:r.v[l].down;if(!m.length){h.set(l,u);return}if(o){let b=m.map(y=>n[y.n]+y.off-y.own).sort((y,_)=>y-_),x=b.length>>1;h.set(l,b.length%2?b[x]:(b[x-1]+b[x])/2);return}let w=0,M=0;for(let b of m)w+=(n[b.n]+b.off-b.own)*b.w,M+=b.w;h.set(l,w/M)});let p=new Map;for(let l of c){let u=r.v[l].group;if(!u)continue;let m=p.get(u)||[0,0];m[0]+=h.get(l),m[1]++,p.set(u,m)}let g=l=>{let u=r.v[l].group;return u?p.get(u)[0]/p.get(u)[1]:h.get(l)},f=new Map(c.map((l,u)=>[l,u]));c.sort((l,u)=>g(l)-g(u)||(r.v[l].group||"").localeCompare(r.v[u].group||"")||h.get(l)-h.get(u)||f.get(l)-f.get(u)),t[a]=Me(r,c,s),t[a].forEach((l,u)=>{n[l]=u})}}function Me(r,t,e){let s=t.slice(),o=[],n=[];if(s.forEach((i,d)=>{r.v[i].pinX!=null&&(o.push(d),n.push(i))}),n.length>1&&(n.sort((i,d)=>r.v[i].pinX-r.v[d].pinX),o.forEach((i,d)=>{s[i]=n[d]})),e.length)for(let i=0;i<e.length+1;i++){let d=!1;for(let[a,c]of e){let h=s.indexOf(a),p=s.indexOf(c);h<0||p<0||h<p||(s.splice(h,1),s.splice(s.indexOf(c),0,a),d=!0)}if(!d)break}return s}function dt(r,t,e,s){let o=0;for(let n of["up","down"]){let i=r.v[t][n],d=r.v[e][n];for(let a of i)for(let c of d)s[a.n]+a.off>s[c.n]+c.off&&(o+=a.w*c.w)}return o}function xn(r,t,e){let s=vt(r,t),o=!0,n=0;for(;o&&n++<8;){o=!1;for(let i of t)for(let d=0;d<i.length-1;d++){let a=i[d],c=i[d+1],h=r.v[a],p=r.v[c];if((h.group||null)!==(p.group||null)||h.pinX!=null&&p.pinX!=null||e.has(a+":"+c))continue;let g=dt(r,a,c,s);dt(r,c,a,s)<g&&(i[d]=c,i[d+1]=a,s[c]=d,s[a]=d+1,o=!0)}}}function me(r,t,e=1){let s=[];if(e>0)for(let o=r;o<t;o+=e)s.push(o);else for(let o=r;o>t;o+=e)s.push(o);return s}function mn(r,t,e){let s=r.length,o=new Float64Array(s);for(let h=1;h<s;h++)o[h]=o[h-1]+e[h];let n=[],i=[],d=[],a=[];for(let h=0;h<s;h++)for(n.push(r[h]-o[h]),i.push(t[h]),d.push(h),a.push(h);n.length>1&&n[n.length-2]>n[n.length-1];){let p=n.length-1,g=p-1,f=i[g]+i[p];n[g]=(n[g]*i[g]+n[p]*i[p])/f,i[g]=f,a[g]=a[p],n.pop(),i.pop(),d.pop(),a.pop()}let c=new Float64Array(s);for(let h=0;h<n.length;h++)for(let p=d[h];p<=a[h];p++)c[p]=n[h]+o[p];return c}function _e(r,t,e){let s=r.v.length,o=new Float64Array(s),n=new Float64Array(s),i=e.groupPadding??20,d=e.groupLabelHeight??0,a=(b,x)=>{let y=r.v[b],_=r.v[x],k;return!y.real&&!_.real?k=e.edgeSpacing:!y.real||!_.real?k=(e.nodeSpacing+e.edgeSpacing)/2:k=e.nodeSpacing,y.group!==_.group&&(y.group&&(k+=i),_.group&&(k+=i+(e.labelOnOrderAxis?d:0))),(y.width+_.width)/2+k},c=t.map(b=>b.map((x,y)=>y===0?0:a(b[y-1],x)));t.forEach((b,x)=>{let y=0;b.forEach((k,E)=>{y+=c[x][E],o[k]=y});let _=y/2;b.forEach(k=>{o[k]-=_})});let h=b=>r.v[b].real?1:4,p=(b,x,y)=>{let _=t[b];if(!_.length)return;let k=new Array(_.length),E=new Array(_.length);_.forEach((A,N)=>{let O=r.v[A];if(O.pinX!=null){k[N]=O.pinX,E[N]=1e6;return}let v=0,P=0,T=K=>{for(let q of K){let st=q.w*(r.v[q.n].real?1:2)*h(A);v+=(o[q.n]+q.off*r.v[q.n].width-q.own*O.width)*st,P+=st}};x&&T(O.up),y&&T(O.down),P===0?(k[N]=o[A],E[N]=.05):(k[N]=v/P,E[N]=P)});let S=mn(k,E,c[b]);_.forEach((A,N)=>{o[A]=S[N]})},g=t.length,f=e.iterations??8;for(let b=0;b<f;b++){for(let x=1;x<g;x++)p(x,!0,!1);for(let x=g-2;x>=0;x--)p(x,!1,!0)}for(let b=0;b<2;b++){for(let x=0;x<g;x++)p(x,!0,!0);for(let x=g-1;x>=0;x--)p(x,!0,!0)}let l=t.map(b=>b.reduce((x,y)=>Math.max(x,r.v[y].height||0),0)),u=new Map;for(let b of r.v){if(!b.real||!b.group)continue;let x=u.get(b.group)||[1/0,-1/0];x[0]=Math.min(x[0],b.rank),x[1]=Math.max(x[1],b.rank),u.set(b.group,x)}let m=new Float64Array(g);for(let[b,x]of u.values()){let y=e.labelOnOrderAxis||e.labelAtRankEnd?0:d,_=e.labelAtRankEnd&&!e.labelOnOrderAxis?d:0;b>0&&(m[b]=Math.max(m[b],i+y)),x<g-1&&(m[x+1]=Math.max(m[x+1],i+_))}let w=[],M=0;for(let b=0;b<g;b++)b>0?M+=l[b-1]/2+e.rankSpacing+m[b]+l[b]/2:M=l[0]/2,w.push(M);for(let b=0;b<s;b++)n[b]=w[r.v[b].rank];return{x:o,y:n,rankY:w,rankHeight:l}}var U={top:{x:0,y:-1},bottom:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function ke(r){switch(r){case"LR":return{x:1,y:0,exit:"right",entry:"left"};case"RL":return{x:-1,y:0,exit:"left",entry:"right"};case"BT":return{x:0,y:-1,exit:"top",entry:"bottom"};default:return{x:0,y:1,exit:"bottom",entry:"top"}}}function ht(r){let t=new Map,e={top:[],right:[],bottom:[],left:[]};for(let s of r.ports)s.side&&e[s.side].push(s);for(let s of Object.keys(e)){let o=e[s];o.forEach((n,i)=>{let d=n.offset!=null?n.offset:(i+1)/(o.length+1);t.set(n.id,{side:s,t:d,...wn(s,d)})})}return t}function wn(r,t){switch(r){case"top":return{px:t,py:0};case"bottom":return{px:t,py:1};case"left":return{px:0,py:t};default:return{px:1,py:t}}}var et=r=>({x:r.x+r.width/2,y:r.y+r.height/2});function ve(r,t){return{x:r.x-t,y:r.y-t,width:r.width+2*t,height:r.height+2*t}}function Se(r,t,e,s=.5){return t>r.x+s&&t<r.x+r.width-s&&e>r.y+s&&e<r.y+r.height-s}function lt(r,t,e,s=.5){let o=e.x+s,n=e.x+e.width-s,i=e.y+s,d=e.y+e.height-s;if(n<=o||d<=i)return!1;let a=0,c=1,h=t.x-r.x,p=t.y-r.y,g=(f,l)=>{if(f===0)return l>0;let u=l/f;if(f<0){if(u>c)return!1;u>a&&(a=u)}else{if(u<a)return!1;u<c&&(c=u)}return!0};return!g(-h,r.x-o)||!g(h,n-r.x)||!g(-p,r.y-i)||!g(p,d-r.y)?!1:c-a>1e-9}function Xt(r,t){let e=et(r),s=t.x-e.x,o=t.y-e.y;if(s===0&&o===0)return{...e,side:"bottom"};let n=s!==0?r.width/2/Math.abs(s):1/0,i=o!==0?r.height/2/Math.abs(o):1/0,d=Math.min(n,i),a=n<i?s>0?"right":"left":o>0?"bottom":"top";return{x:e.x+s*d,y:e.y+o*d,side:a}}function St(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push({x:e.x,y:e.y})}for(let e=t.length-2;e>=1;e--){let s=t[e-1],o=t[e],n=t[e+1],i=(o.x-s.x)*(n.y-o.y)-(o.y-s.y)*(n.x-o.x),d=(o.x-s.x)*(n.x-o.x)+(o.y-s.y)*(n.y-o.y);Math.abs(i)<.01&&d>=0&&t.splice(e,1)}return t}function bn(r){let t=0;for(let e=1;e<r.length;e++)t+=Math.hypot(r[e].x-r[e-1].x,r[e].y-r[e-1].y);return t}function Gt(r,t){if(r.length===0)return[];if(r.length===1)return Array.from({length:t},()=>({...r[0]}));let e=bn(r)||1,s=[],o=0,n=0;for(let i=0;i<t;i++){let d=e*i/(t-1);for(;o<r.length-2;){let g=Math.hypot(r[o+1].x-r[o].x,r[o+1].y-r[o].y);if(n+g>=d)break;n+=g,o++}let a=r[o],c=r[o+1],h=Math.hypot(c.x-a.x,c.y-a.y)||1,p=Math.min(1,Math.max(0,(d-n)/h));s.push({x:a.x+(c.x-a.x)*p,y:a.y+(c.y-a.y)*p})}return s}var Ee=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:-e,y:t};default:return{x:t,y:e}}},jt=(r,t,e)=>{switch(r){case"BT":return{x:t,y:-e};case"LR":return{x:e,y:t};case"RL":return{x:e,y:-t};default:return{x:t,y:e}}};function mt(r,t={}){return r.nodes.some(e=>e.group)?Mn(r,t):Ut(r,t)}function Le(r,t,e){let s=new Set(t.map(n=>n.id)),o=t.map(n=>({...n,group:null,constraints:e?n.constraints:{...n.constraints,pinned:!1}}));return{options:r.options,nodes:o,nodeById:new Map(o.map(n=>[n.id,n])),edges:r.edges.filter(n=>s.has(n.source)&&s.has(n.target)),groups:[],groupById:new Map,constraints:r.constraints.filter(n=>n.type==="sameRank"?n.nodes.every(i=>s.has(i)):s.has(n.a)&&s.has(n.b)),warnings:[]}}function Mn(r,t){let e=Ie(r,t.hints||null,t.hints||null),s=new Map,o=i=>({x:i.x+i.width/2,y:i.y+i.height/2});for(let i of r.nodes){let d=e.nodes.get(i.id);if(!i.group){s.set(i.id,o(d));continue}let a=0,c=0,h=0;for(let p of r.edges){let g=p.source===i.id?p.target:p.target===i.id?p.source:null;if(g==null||r.nodeById.get(g).group===i.group)continue;let f=o(e.nodes.get(g));a+=f.x,c+=f.y,h++}s.set(i.id,h?{x:a/h,y:c/h}:o(d))}let n=Ie(r,s,t.hints||s);return n.crossingsRouted<=e.crossingsRouted?n:e}function Ie(r,t,e){let s=r.options,o=s.groupPadding,n=s.groupLabelHeight,i=new Map;for(let l of r.nodes)l.group&&(i.has(l.group)||i.set(l.group,[]),i.get(l.group).push(l));let d=new Map,a=[];for(let[l,u]of i){let m=Ut(Le(r,u,!1),{hints:t}),w=m.bounds,M="\0group:"+l;d.set(l,{sub:m,b:w,blockId:M}),a.push({id:M,index:-1,label:l,width:w.width+2*o,height:w.height+2*o+n,group:null,ports:[],portById:new Map,constraints:{pinned:!1,x:null,y:null,rank:null}})}let c=l=>{let u=r.nodeById.get(l);return u.group?d.get(u.group).blockId:l},h=Le(r,r.nodes.filter(l=>!l.group),!0);h.nodes.push(...a);for(let l of a)h.nodeById.set(l.id,l);h.edges=[];for(let l of r.edges){let u=c(l.source),m=c(l.target);u===m&&(l.source!==l.target||u!==l.source)||h.edges.push({...l,source:u,target:m,sourcePort:u===l.source?l.sourcePort:null,targetPort:m===l.target?l.targetPort:null})}let p=null;if(e){p=new Map(e);for(let[l,u]of i){let m=0,w=0,M=0;for(let b of u){let x=e.get(b.id);x&&(m+=x.x,w+=x.y,M++)}M&&p.set(d.get(l).blockId,{x:m/M,y:w/M})}}let g=Ut(h,{hints:p}),f={nodes:new Map,edges:new Map,groups:new Map,crossings:g.crossings,warnings:g.warnings};for(let l of r.nodes)l.group||f.nodes.set(l.id,g.nodes.get(l.id));for(let[,{sub:l,b:u,blockId:m}]of d){let w=g.nodes.get(m),M=w.x+o-u.x,b=w.y+o+n-u.y;for(let[x,y]of l.nodes)f.nodes.set(x,{...y,x:y.x+M,y:y.y+b});for(let[x,y]of l.edges)f.edges.set(x,{...y,waypoints:y.waypoints.map(_=>({x:_.x+M,y:_.y+b}))});f.crossings+=l.crossings}for(let l of r.edges){if(f.edges.has(l.id))continue;let u=g.edges.get(l.id),m=c(l.source)!==l.source||c(l.target)!==l.target;f.edges.set(l.id,u?{...u,waypoints:m?[]:u.waypoints}:{waypoints:[],reversed:!1,selfLoop:l.source===l.target,flat:!1})}for(let l of r.nodes)if(l.group&&l.constraints.pinned){let u=f.nodes.get(l.id);u.x=l.constraints.x,u.y=l.constraints.y}if(wt(r,f),!r.nodes.some(l=>l.constraints.pinned)){let l=xt(f);Ae(f,-l.x,-l.y);for(let u of f.groups.values())u.x-=l.x,u.y-=l.y}return f.bounds=xt(f),f.crossingsRouted=_n(r,f),f}function _n(r,t){let e=[];for(let n of r.edges){if(n.source===n.target)continue;let i=t.nodes.get(n.source),d=t.nodes.get(n.target);e.push([n.source,n.target,i.x+i.width/2,i.y+i.height/2,d.x+d.width/2,d.y+d.height/2])}let s=0,o=(n,i,d,a,c,h)=>(d-n)*(h-i)-(a-i)*(c-n);for(let n=0;n<e.length;n++)for(let i=n+1;i<e.length;i++){let d=e[n],a=e[i];if(d[0]===a[0]||d[0]===a[1]||d[1]===a[0]||d[1]===a[1])continue;let c=o(a[2],a[3],a[4],a[5],d[2],d[3]),h=o(a[2],a[3],a[4],a[5],d[4],d[5]),p=o(d[2],d[3],d[4],d[5],a[2],a[3]),g=o(d[2],d[3],d[4],d[5],a[4],a[5]);c*h<0&&p*g<0&&s++}return s}function Ut(r,t={}){let e=r.options,s=e.direction,o=s==="LR"||s==="RL",n=[],i=new Map;for(let g of r.nodes){let f=ht(g),l=new Map;for(let[w,M]of f)l.set(w,(o?M.py:M.px)-.5);let u=null,m=null;if(g.constraints.pinned){let w=jt(s,g.constraints.x+g.width/2,g.constraints.y+g.height/2);u=w.x,m=w.y}i.set(g.id,{iw:o?g.height:g.width,ih:o?g.width:g.height,frac:l,pinX:u,pinY:m})}let d=vn(r),a={nodes:new Map,edges:new Map,groups:new Map,crossings:0,warnings:n},c=[];for(let g of d){let f=g.nodes,l=new Set(f),u=r.edges.filter(v=>l.has(v.source)),m=new Map;for(let v of f){let P=r.nodeById.get(v).constraints.rank;P!=null&&m.set(v,P)}let w=r.constraints.filter(v=>v.type==="sameRank").map(v=>v.nodes.filter(P=>l.has(P))).filter(v=>v.length>1),M=xe(f,u,{fixedRank:m,sameRank:w});n.push(...M.warnings);let b=f.map(v=>{let P=r.nodeById.get(v),T=i.get(v);return{id:v,rank:M.rank.get(v),width:T.iw,height:T.ih,group:P.group,pinX:T.pinX}}),x=[];for(let v of u){if(M.selfLoops.has(v.id)||M.flat.has(v.id))continue;let P=M.reversed.has(v.id),T=v.sourcePort?i.get(v.source).frac.get(v.sourcePort)??0:0,K=v.targetPort?i.get(v.target).frac.get(v.targetPort)??0:0;x.push(P?{id:v.id,v:v.target,w:v.source,vOff:K,wOff:T,weight:v.weight}:{id:v.id,v:v.source,w:v.target,vOff:T,wOff:K,weight:v.weight})}let y=we(b,x,0),_;t.hints&&t.hints.size&&(_=kn(y,t.hints,s));let k=r.constraints.filter(v=>v.type==="leftOf"&&l.has(v.a)&&l.has(v.b)).map(v=>[v.a,v.b]),E=be(y,{maxIterations:e.maxIterations,leftOf:k,initial:_});a.crossings+=E.crossings;let S=_e(y,E.layers,{nodeSpacing:e.nodeSpacing,edgeSpacing:e.edgeSpacing,rankSpacing:e.rankSpacing,groupPadding:e.groupPadding,groupLabelHeight:e.groupLabelHeight,labelOnOrderAxis:o,labelAtRankEnd:s==="BT"||s==="RL"?!o:!1}),A=f.filter(v=>i.get(v).pinY!=null);if(A.length){let v=0;for(let P of A)v+=i.get(P).pinY-S.y[y.index.get(P)];v/=A.length;for(let P=0;P<S.y.length;P++)S.y[P]+=v;for(let P of A){let T=y.index.get(P);S.x[T]=i.get(P).pinX,S.y[T]=i.get(P).pinY}}let N=1/0,O=-1/0;for(let v=0;v<y.v.length;v++){let P=y.v[v].width/2;N=Math.min(N,S.x[v]-P),O=Math.max(O,S.x[v]+P)}c.push({comp:g,g:y,co:S,rk:M,layers:E.layers,minX:N,maxX:O,pinned:A.length>0})}if(t.hints&&t.hints.size){let g=l=>{let u=0,m=0;for(let w of l.comp.nodes){let M=t.hints.get(w);M&&(u+=jt(s,M.x,M.y).x,m++)}return m?u/m:1/0},f=new Map(c.map(l=>[l,g(l)]));c.sort((l,u)=>f.get(l)-f.get(u))}let h=-1/0;for(let g of c)g.pinned&&(h=Math.max(h,g.maxX+e.componentSpacing));h===-1/0&&(h=0);for(let g of c){if(g.pinned)continue;let f=h-g.minX;for(let l=0;l<g.co.x.length;l++)g.co.x[l]+=f;h+=g.maxX-g.minX+e.componentSpacing}for(let g of c){let{g:f,co:l,rk:u}=g;g.layers.forEach((m,w)=>m.forEach((M,b)=>{let x=f.v[M];if(!x.real)return;let y=r.nodeById.get(x.id),_=Ee(s,l.x[M],l.y[M]);a.nodes.set(x.id,{x:_.x-y.width/2,y:_.y-y.height/2,width:y.width,height:y.height,rank:w,order:b})}));for(let m of r.edges){if(!g.comp.set.has(m.source))continue;let M=(f.chains.get(m.id)||[]).map(x=>Ee(s,l.x[x],l.y[x])),b=u.reversed.has(m.id);b&&(M=M.reverse()),a.edges.set(m.id,{waypoints:M,reversed:b,selfLoop:u.selfLoops.has(m.id),flat:u.flat.has(m.id)})}}if(!c.some(g=>g.pinned)){let g=1/0,f=1/0;for(let u of a.nodes.values())g=Math.min(g,u.x),f=Math.min(f,u.y);let l=r.groups.length?e.groupPadding+e.groupLabelHeight:0;Number.isFinite(g)&&Ae(a,-g+l,-f+l)}return wt(r,a),a.bounds=xt(a),a}function Ae(r,t,e){for(let s of r.nodes.values())s.x+=t,s.y+=e;for(let s of r.edges.values())for(let o of s.waypoints)o.x+=t,o.y+=e}function wt(r,t){let e=r.options;t.groups=new Map;for(let s of r.groups){let o=1/0,n=1/0,i=-1/0,d=-1/0;for(let c of r.nodes){if(c.group!==s.id)continue;let h=t.nodes.get(c.id);h&&(o=Math.min(o,h.x),n=Math.min(n,h.y),i=Math.max(i,h.x+h.width),d=Math.max(d,h.y+h.height))}if(!Number.isFinite(o))continue;let a=e.groupPadding;t.groups.set(s.id,{x:o-a,y:n-a-e.groupLabelHeight,width:i-o+2*a,height:d-n+2*a+e.groupLabelHeight})}return t.groups}function xt(r){let t=1/0,e=1/0,s=-1/0,o=-1/0,n=i=>{t=Math.min(t,i.x),e=Math.min(e,i.y),s=Math.max(s,i.x+i.width),o=Math.max(o,i.y+i.height)};for(let i of r.nodes.values())n(i);for(let i of r.groups.values())n(i);return Number.isFinite(t)?{x:t,y:e,width:s-t,height:o-e}:{x:0,y:0,width:0,height:0}}function kn(r,t,e){let s=Dt(r),o=new Float64Array(r.v.length).fill(NaN);r.v.forEach((n,i)=>{if(n.real&&t.has(n.id)){let d=t.get(n.id);o[i]=jt(e,d.x,d.y).x}});for(let[,n]of r.chains){if(!n.length)continue;let i=r.v[n[0]].up[0]?.n,d=r.v[n[n.length-1]].down[0]?.n;i==null||d==null||Number.isNaN(o[i])||Number.isNaN(o[d])||n.forEach((a,c)=>{o[a]=o[i]+(o[d]-o[i])*(c+1)/(n.length+1)})}return s.map(n=>{let i=new Map(n.map((d,a)=>[d,a]));return n.slice().sort((d,a)=>{let c=o[d],h=o[a];return Number.isNaN(c)&&Number.isNaN(h)?i.get(d)-i.get(a):Number.isNaN(c)?1:Number.isNaN(h)?-1:c-h})})}function vn(r){let t=new Map(r.nodes.map(i=>[i.id,i.id])),e=i=>{for(;t.get(i)!==i;)t.set(i,t.get(t.get(i))),i=t.get(i);return i},s=(i,d)=>{let a=e(i),c=e(d);a!==c&&t.set(c,a)};for(let i of r.edges)s(i.source,i.target);let o=new Map;for(let i of r.nodes)i.group&&(o.has(i.group)?s(o.get(i.group),i.id):o.set(i.group,i.id));for(let i of r.constraints)if(i.type==="leftOf"&&s(i.a,i.b),i.type==="sameRank")for(let d of i.nodes)s(i.nodes[0],d);let n=new Map;for(let i of r.nodes){let d=e(i.id);n.has(d)||n.set(d,[]),n.get(d).push(i.id)}return[...n.values()].map(i=>({nodes:i,set:new Set(i)}))}function Ne(r,t,e,s){let o=s==="LR"||s==="RL",n=[...r.nodes.entries()],i=(d,a)=>d.x<a.x+a.width+e&&a.x<d.x+d.width+e&&d.y<a.y+a.height+e&&a.y<d.y+d.height+e;for(let[d,a]of n)if(!t.has(d))for(let c=0;c<200;c++){let h=n.find(([g,f])=>g!==d&&i(a,f));if(!h)break;let p=h[1];o?a.y=p.y+p.height+e:a.x=p.x+p.width+e}}function Sn(r,t,e){let s=ke(e),o=et(r),n=et(t),i=n.x-o.x,d=n.y-o.y,a=Math.abs(i)-(r.width+t.width)/2,c=Math.abs(d)-(r.height+t.height)/2,h=s.x!==0?i*s.x:d*s.y,p=s.x!==0?a:c;return h>0&&p>4?[s.exit,s.entry]:a>=c?i>=0?["right","left"]:["left","right"]:d>=0?["bottom","top"]:["top","bottom"]}function Pe(r,t){let e=r.options.direction,s=new Map,o=new Map;for(let a of r.nodes){let c=t.get(a.id);if(!c)continue;let h=ht(a),p=new Map;for(let[g,f]of h)p.set(g,{x:c.x+f.px*c.width,y:c.y+f.py*c.height,side:f.side,t:f.t});o.set(a.id,p)}let n=new Map,i=new Map;for(let a of r.edges){let c=t.get(a.source),h=t.get(a.target);if(!c||!h)continue;if(a.source===a.target){let u=o.get(a.source),m=a.sourcePort&&u.get(a.sourcePort),w=a.targetPort&&u.get(a.targetPort),M=Math.min(20,c.width/4,c.height/4);s.set(a.id,{source:m&&m.side?{x:m.x,y:m.y,side:m.side}:{x:c.x+c.width-M,y:c.y,side:"top"},target:w&&w.side?{x:w.x,y:w.y,side:w.side}:{x:c.x+c.width,y:c.y+M,side:"right"}});continue}let[p,g]=Sn(c,h,e),f=a.sourcePort&&o.get(a.source).get(a.sourcePort),l=a.targetPort&&o.get(a.target).get(a.targetPort);f&&f.side&&(p=f.side),l&&l.side&&(g=l.side),i.set(a.id,[p,g]),f||Oe(n,a.source+"|"+p,{edgeId:a.id,end:"source",other:a.target}),l||Oe(n,a.target+"|"+g,{edgeId:a.id,end:"target",other:a.source}),s.set(a.id,{source:f?{x:f.x,y:f.y,side:f.side}:null,target:l?{x:l.x,y:l.y,side:l.side}:null})}for(let a=0;a<2;a++)for(let[c,h]of n){let[p,g]=c.split("|"),f=t.get(p),l=g==="top"||g==="bottom",u=w=>{let M=s.get(w.edgeId),b=w.end==="source"?M.target:M.source;if(a>0&&b)return l?b.x:b.y;let x=et(t.get(w.other));return l?x.x:x.y};h.sort((w,M)=>u(w)-u(M)||(w.edgeId<M.edgeId?-1:1));let m=[...o.get(p)?.values()||[]].filter(w=>w.side===g).map(w=>w.t);h.forEach((w,M)=>{let b=(M+1)/(h.length+1);for(let y of m)Math.abs(y-b)<.06&&(b=Math.min(.95,b+.1));let x=l?{x:f.x+b*f.width,y:g==="top"?f.y:f.y+f.height,side:g}:{x:g==="left"?f.x:f.x+f.width,y:f.y+b*f.height,side:g};s.get(w.edgeId)[w.end]=x})}let d=a=>{a&&(a.x=Math.round(a.x*100)/100,a.y=Math.round(a.y*100)/100)};for(let a of s.values())d(a.source),d(a.target);return{ends:s,ports:o,sides:i}}function Oe(r,t,e){r.has(t)||r.set(t,[]),r.get(t).push(e)}function $e(r,t,e){let s=e.spacing,o={h:new Map,v:new Map},n=new Map;for(let[p,g]of r)n.set(p,g.points.map(f=>({x:f.x,y:f.y})));for(let[p,g]of r){if(g.kind!=="orthogonal"||g.bundle)continue;let f=g.points;for(let l=0;l<f.length-1;l++){if(e.fixedEnds!==!1&&(l===0||l===f.length-2))continue;let u=f[l],m=f[l+1],w=Math.abs(u.x-m.x)<.01,M=Math.abs(u.y-m.y)<.01;if(!w&&!M)continue;let b=w?u.x:u.y,x=w?Math.min(u.y,m.y):Math.min(u.x,m.x),y=w?Math.max(u.y,m.y):Math.max(u.x,m.x);if(y-x<.5)continue;let _=w?u.y<=m.y:u.x<=m.x,k=f[l-1],E=f[l+2],S=(T,K)=>T?Math.sign(w?T.x-K.x:T.y-K.y):0,A=S(k,u),N=S(E,m),O={id:p,i:l,c:b,lo:x,hi:y,vertical:w,loIsA:_,pts:n.get(p),dirLo:_?A:N,dirHi:_?N:A},v=Math.round(b*100),P=w?o.v:o.h;P.has(v)||P.set(v,[]),P.get(v).push(O)}}let i=[...o.v.values()].flat(),d=[...o.h.values()].flat(),a=[];for(let p of[!0,!1])for(let g of(p?o.v:o.h).values()){if(g.length<2)continue;g.sort((m,w)=>m.lo-w.lo);let f=[g[0]],l=g[0].hi,u=()=>{f.length>1&&c(f,p)};for(let m=1;m<g.length;m++){let w=g[m];w.lo<l-.5?(f.push(w),l=Math.max(l,w.hi)):(u(),f=[w],l=w.hi)}u()}function c(p,g){if(new Set(p.map(_=>_.id)).size<2)return;let f=[];for(let _ of p){let k=f.length;for(;k>0&&In(_,f[k-1])<0;)k--;f.splice(k,0,_)}let l=p[0].c,u=Math.min(...p.map(_=>_.lo)),m=Math.max(...p.map(_=>_.hi)),w=1/0,M=1/0;for(let _ of t.values()){let k=g?_.y:_.x;if((g?_.y+_.height:_.x+_.width)<=u||k>=m)continue;let S=g?_.x:_.y,A=g?_.x+_.width:_.y+_.height;A<=l+.01?w=Math.min(w,l-A):S>=l-.01&&(M=Math.min(M,S-l))}for(let _ of g?i:d){if(_.c===l||_.hi<=u||_.lo>=m)continue;let k=Math.abs(_.c-l)/2;_.c<l?w=Math.min(w,k+4):M=Math.min(M,k+4)}let b=f.length,x=Math.max(0,Math.min(w,M)-4),y=Math.min(s,b>1?2*x/(b-1):s);f.forEach((_,k)=>{let E=(k-(b-1)/2)*y;Math.abs(E)>.01&&a.push([_.id,_.i,g,E])})}let h=new Map;for(let[p,g,f,l]of a)h.has(p)||h.set(p,new Map),h.get(p).set(g,f?{x:l,y:0}:{x:0,y:l});for(let[p,g]of h){let f=r.get(p),l=f.points,u=[],m={x:0,y:0};for(let w=0;w<l.length;w++){let M=w>0&&g.get(w-1)||m,b=w<l.length-1&&g.get(w)||m,x=w>0&&w<l.length-1&&En(l[w-1],l[w],l[w+1]);x&&(M.x!==b.x||M.y!==b.y)?(u.push({x:l[w].x+M.x,y:l[w].y+M.y}),u.push({x:l[w].x+b.x,y:l[w].y+b.y})):u.push({x:l[w].x+M.x+(x?0:b.x),y:l[w].y+M.y+(x?0:b.y)})}f.points=Ln(u)}}function En(r,t,e){return Math.abs(r.x-t.x)<.01&&Math.abs(t.x-e.x)<.01||Math.abs(r.y-t.y)<.01&&Math.abs(t.y-e.y)<.01}function Ln(r){let t=[];for(let e of r){let s=t[t.length-1];s&&Math.abs(s.x-e.x)<.01&&Math.abs(s.y-e.y)<.01||t.push(e)}return t}function In(r,t){return Re(r,t,!0)||Re(r,t,!1)||Nn(r,t)}function Ce(r,t){let{pts:e,i:s,loIsA:o}=r,n=[];if(t?!o:o)for(let d=s+1;d<e.length;d++)n.push(e[d]);else for(let d=s;d>=0;d--)n.push(e[d]);return n}var An=(r,t)=>r.x*t.y-r.y*t.x,Be=(r,t)=>{let e=t.x-r.x,s=t.y-r.y,o=Math.hypot(e,s)||1;return{x:e/o,y:s/o}};function Re(r,t,e){let s=r.vertical,o=Ce(r,e),n=Ce(t,e),i=e?Math.max(r.lo,t.lo):Math.min(r.hi,t.hi),d=s?{x:r.c,y:i}:{x:i,y:r.c},a=s?{x:0,y:e?-1:1}:{x:e?-1:1,y:0},c=a,h=0,p=0,g=(l,u)=>{if(l===u)return 0;let m={x:a.y,y:-a.x},w=s?m.x:m.y;return(l<u?w<0:w>0)?-1:1},f=(l,u)=>u+1<l.length?Math.sign(Math.round(An(c,Be(l[u],l[u+1]))*1e3)):null;for(let l=0;l<64;l++){let u=h<o.length?(o[h].x-d.x)*c.x+(o[h].y-d.y)*c.y:1/0,m=p<n.length?(n[p].x-d.x)*c.x+(n[p].y-d.y)*c.y:1/0;if(u===1/0&&m===1/0)return 0;if(Math.abs(u-m)<.5){let M=f(o,h),b=f(n,p);if(M===null||b===null)return M===null&&b===null?0:g(M??0,b??0);if(M!==b)return g(M,b);d=o[h],c=Be(o[h],o[h+1]),h++,p++;continue}if(u<m){let M=f(o,h);return M?g(M,0):0}let w=f(n,p);return w?g(0,w):0}return 0}var Nn=(r,t)=>r.id<t.id?-1:r.id>t.id?1:r.i-t.i;function Kt(r,t,e=4){let s=[],o=new Map(t.map((a,c)=>[a,c]));for(let a of t){let c=r.get(a).points;for(let h=0;h<c.length-1;h++){let p=c[h],g=c[h+1];Math.abs(p.x-g.x)<.01&&Math.abs(p.y-g.y)>.01&&s.push([o.get(a),p.x,Math.min(p.y,g.y),Math.max(p.y,g.y)])}}let n=64,i=new Map;for(let a of s){let c=Math.floor(a[1]/n);i.has(c)||i.set(c,[]),i.get(c).push(a)}let d=new Map;for(let a of t){let c=o.get(a),h=r.get(a).points,p=[];for(let g=0;g<h.length-1;g++){let f=h[g],l=h[g+1];if(Math.abs(f.y-l.y)>.01)continue;let u=Math.min(f.x,l.x)+e*2,m=Math.max(f.x,l.x)-e*2;if(!(m<=u))for(let w=Math.floor(u/n);w<=Math.floor(m/n);w++)for(let M of i.get(w)||[])M[0]>=c||M[1]<=u||M[1]>=m||f.y<=M[2]+e||f.y>=M[3]-e||p.push({seg:g,x:M[1],y:f.y})}p.length&&d.set(a,p)}return d}var Yt=1,On=[1,-1,0,0],Pn=[0,0,1,-1],Zt=[1,0,3,2],Te=r=>r.x>0?0:r.x<0?1:r.y>0?2:3;function nt(r,t,e={}){let s=r.options,o=t.nodes,n=s.edgeRouting,{ends:i,ports:d}=Pe(r,o),a=new Map,c=new Map,h=e.only||null,p=e.prev||null;if(n==="orthogonal")Cn(r,o,i,s,h,p,a,c),$e(a,o,{spacing:s.edgeSpacing,fixedEnds:!0});else for(let l of r.edges){let u=o.get(l.source),m=o.get(l.target);if(!u||!m)continue;if(l.source===l.target){a.set(l.id,ze(u,s,i.get(l.id)));continue}let w=t.edges.get(l.id),M=w&&w.waypoints||[],b=i.get(l.id),x,y;n==="curved"||l.sourcePort?x=b.source:x=Xt(u,M[0]||et(m)),n==="curved"||l.targetPort?y=b.target:y=Xt(m,M[M.length-1]||et(u)),a.set(l.id,{points:[x,...M.map(_=>({..._})),y],kind:n,sourceSide:x.side,targetSide:y.side})}let g=r.edges.map(l=>l.id).filter(l=>a.has(l)),f=s.lineHops&&n==="orthogonal"?Kt(a,g,s.hopRadius):new Map;for(let[l,u]of a)u.hops=f.get(l)||[];return{paths:a,raw:c,ports:d,mode:n}}function ze(r,t,e){let s=Math.max(t.nodeMargin*1.5,16),o=e.source,n=e.target,i=U[o.side],d=U[n.side],a={x:o.x+i.x*s,y:o.y+i.y*s},c={x:n.x+d.x*s,y:n.y+d.y*s},h;if(o.side===n.side)h=o.side==="left"||o.side==="right"?[a,{x:a.x,y:c.y}]:[a,{x:c.x,y:a.y}];else if((o.side==="top"||o.side==="bottom")!=(n.side==="top"||n.side==="bottom"))h=o.side==="top"||o.side==="bottom"?[a,{x:c.x,y:a.y}]:[a,{x:a.x,y:c.y}];else{let p=o.side==="top"||o.side==="bottom",g=p?r.x+r.width+s:r.y+r.height+s;h=p?[a,{x:g,y:a.y},{x:g,y:c.y}]:[a,{x:a.x,y:g},{x:c.x,y:g}]}return{points:St([o,...h,c,n]),kind:"orthogonal",sourceSide:o.side,targetSide:n.side,selfLoop:!0}}function Cn(r,t,e,s,o,n,i,d){let a=s.nodeMargin,c=[];for(let[l,u]of t)c.push({id:l,...ve(u,a)});let h=new Map;for(let l of r.edges){let u=e.get(l.id);if(!u||!u.source||!u.target)continue;let m=U[u.source.side],w=U[u.target.side];h.set(l.id,{s:{x:u.source.x+m.x*a,y:u.source.y+m.y*a},t:{x:u.target.x+w.x*a,y:u.target.y+w.y*a},sDir:Te(m),tNeed:Zt[Te(w)]})}let p=Tn(c,h,a);for(let l of r.edges)if(o&&!o.has(l.id)&&n&&n.raw.has(l.id)){let u=n.raw.get(l.id);d.set(l.id,u),p.markPath(u);let m=n.paths.get(l.id);m&&i.set(l.id,{...m,points:u.map(w=>({...w}))})}let g=r.edges.filter(l=>!i.has(l.id)&&t.has(l.source)&&t.has(l.target)),f=l=>{let u=h.get(l.id);return u?Math.abs(u.s.x-u.t.x)+Math.abs(u.s.y-u.t.y):0};g.sort((l,u)=>f(l)-f(u)),Rn(r,t,e,s,c,g,p,i,d);for(let l of g){if(i.has(l.id))continue;if(l.source===l.target){let b=ze(t.get(l.source),s,e.get(l.id));i.set(l.id,b),d.set(l.id,b.points);continue}let u=e.get(l.id),m=h.get(l.id),w=p.astar(m.s,m.sDir,m.t,m.tNeed,s);w||(w=$n(m.s,m.t,u.source.side,u.target.side));let M=[u.source,...St(w),u.target];p.markPath(M),d.set(l.id,M),i.set(l.id,{points:M.map(b=>({...b})),kind:"orthogonal",sourceSide:u.source.side,targetSide:u.target.side})}}var Bn={top:"bottom",bottom:"top",left:"right",right:"left"};function Rn(r,t,e,s,o,n,i,d,a){let c=s.bundleFanOut;if(!c)return;let h=new Map;for(let p of n){if(p.source===p.target||p.sourcePort||p.markerStart)continue;let g=e.get(p.id);if(!g||!g.source||!g.target||g.target.side!==Bn[g.source.side])continue;let f=p.source+"|"+g.source.side;h.has(f)||h.set(f,[]),h.get(f).push(p)}for(let[p,g]of h){if(g.length<c)continue;let f=g[0].source,l=e.get(g[0].id).source.side,u=t.get(f),m=U[l],w=m.y!==0,M=w?m.y:m.x,b=l==="bottom"?u.y+u.height:l==="top"?u.y:l==="right"?u.x+u.width:u.x,x=1/0;for(let S of g){let A=e.get(S.id).target;x=Math.min(x,((w?A.y:A.x)-b)*M)}if(x<2*s.nodeMargin+4)continue;let y=b+M*x/2,_=w?{x:u.x+u.width/2,y:b}:{x:b,y:u.y+u.height/2},k=[],E=!0;for(let S of g){let A=e.get(S.id).target,N=St(w?[_,{x:_.x,y},{x:A.x,y},A]:[_,{x:y,y:_.y},{x:y,y:A.y},A]);for(let O=0;E&&O<N.length-1;O++)for(let v of o)if(v.id!==f&&v.id!==S.target&<(N[O],N[O+1],v,1)){E=!1;break}if(!E)break;k.push([S,N,A.side])}if(E)for(let[S,A,N]of k)i.markPath(A),a.set(S.id,A),d.set(S.id,{points:A.map(O=>({...O})),kind:"orthogonal",sourceSide:l,targetSide:N,bundle:p})}}function $n(r,t,e,s){let o=e==="top"||e==="bottom",n=s==="top"||s==="bottom";if(o&&n){let i=(r.y+t.y)/2;return[r,{x:r.x,y:i},{x:t.x,y:i},t]}if(!o&&!n){let i=(r.x+t.x)/2;return[r,{x:i,y:r.y},{x:i,y:t.y},t]}return o?[r,{x:r.x,y:t.y},t]:[r,{x:t.x,y:r.y},t]}function Tn(r,t,e){let s=new Set,o=new Set,n=L=>Math.round(L*100)/100,i=1/0,d=1/0,a=-1/0,c=-1/0;for(let L of r)s.add(n(L.x)),s.add(n(L.x+L.width)),o.add(n(L.y)),o.add(n(L.y+L.height)),i=Math.min(i,L.x),d=Math.min(d,L.y),a=Math.max(a,L.x+L.width),c=Math.max(c,L.y+L.height);for(let L of t.values())for(let I of[L.s,L.t])s.add(n(I.x)),o.add(n(I.y)),i=Math.min(i,I.x),d=Math.min(d,I.y),a=Math.max(a,I.x),c=Math.max(c,I.y);s.add(n(i-2*e)),s.add(n(a+2*e)),o.add(n(d-2*e)),o.add(n(c+2*e));let h=L=>{let I=[...L].sort((R,Y)=>R-Y),B=[];for(let R=0;R<I.length;R++)B.push(I[R]),R+1<I.length&&I[R+1]-I[R]>4&&B.push(n((I[R]+I[R+1])/2));return B},p=h(s),g=h(o),f=p.length,l=g.length,u=f*l,m=new Map(p.map((L,I)=>[L,I])),w=new Map(g.map((L,I)=>[L,I])),M=120,b=new Map,x=(L,I)=>L*73856093^I*19349663;for(let L of r)for(let I=Math.floor(L.x/M);I<=Math.floor((L.x+L.width)/M);I++)for(let B=Math.floor(L.y/M);B<=Math.floor((L.y+L.height)/M);B++){let R=x(I,B);b.has(R)||b.set(R,[]),b.get(R).push(L)}let y=(L,I)=>{let B=b.get(x(Math.floor(L/M),Math.floor(I/M)));if(!B)return!1;for(let R of B)if(Se(R,L,I,.01))return!0;return!1},_=u<=4e6?new Uint8Array(u):null,k=_?null:new Map,E=L=>{if(_){let B=_[L];return B||(B=y(p[L%f],g[L/f|0])?2:1,_[L]=B),B===2}let I=k.get(L);return I===void 0&&(I=y(p[L%f],g[L/f|0]),k.set(L,I)),I},S=new Uint8Array(u),A=new Uint8Array(u),N=(L,I)=>{let B=I?S:A,R=B[L];if(!R){let Y=L%f,Z=L/f|0,z=I?(p[Y]+p[Y+1])/2:p[Y],X=I?g[Z]:(g[Z]+g[Z+1])/2;R=y(z,X)?2:1,B[L]=R}return R===2},O=new Uint16Array(u),v=new Uint16Array(u),P=new Uint16Array(u),T=new Uint16Array(u),K=L=>{let I=m.get(n(L.x)),B=w.get(n(L.y));return I==null||B==null?-1:B*f+I};function q(L){for(let I=0;I<L.length-1;I++){let B=L[I],R=L[I+1],Y=Math.abs(B.y-R.y)<.01,Z=Math.abs(B.x-R.x)<.01;if(Y){let z=w.get(n(B.y)),X=m.get(n(B.x)),j=m.get(n(R.x));if(z==null||X==null||j==null)continue;let ot=Math.min(X,j),it=Math.max(X,j);for(let D=ot;D<=it;D++)O[z*f+D]++,D<it&&P[z*f+D]++}else if(Z){let z=m.get(n(B.x)),X=w.get(n(B.y)),j=w.get(n(R.y));if(z==null||X==null||j==null)continue;let ot=Math.min(X,j),it=Math.max(X,j);for(let D=ot;D<=it;D++)v[D*f+z]++,D<it&&T[D*f+z]++}}}let st=u*4,J=st<=16e6,ie=J?new Float64Array(st):null,re=J?new Int32Array(st):null,ae=J?new Uint32Array(st):null,Nt=0;function Je(L,I,B,R,Y){let Z=K(L),z=K(B);if(Z<0||z<0)return null;let X=p[z%f],j=g[z/f|0],ot=Y.bendPenalty,it=Y.crossingPenalty;Nt++;let D=J?null:new Map,ce=J?null:new Map,de=J?$=>ae[$]===Nt?ie[$]:void 0:$=>D.get($),he=J?($,G,Q)=>{ae[$]=Nt,ie[$]=G,re[$]=Q}:($,G,Q)=>{D.set($,G),ce.set($,Q)},Qe=J?$=>re[$]:$=>ce.get($),ft=new Wt,le=Z*4+I;he(le,0,-1),ft.push(le,Yt*(Math.abs(p[Z%f]-X)+Math.abs(g[Z/f|0]-j)));let Ot=1/0,Pt=-1,tn=0,en=4e5;for(;ft.size;){let $=ft.peekKey(),G=ft.pop();if($>=Ot)break;let Q=de(G),at=G>>2,bt=G&3,Bt=at%f,Rt=at/f|0;if(!($>Q+Yt*(Math.abs(p[Bt]-X)+Math.abs(g[Rt]-j))+1e-6)){if(++tn>en)break;if(at===z){let H=bt===R?0:bt===Zt[R]?2*ot:ot;Q+H<Ot&&(Ot=Q+H,Pt=G);continue}for(let H=0;H<4;H++){if(H===Zt[bt])continue;let ut=Bt+On[H],pt=Rt+Pn[H];if(ut<0||pt<0||ut>=f||pt>=l)continue;let V=pt*f+ut;if(V!==z&&E(V))continue;let gt=H<2;if(N(gt?H===0?at:V:H===2?at:V,gt))continue;let fe=Math.abs(gt?p[ut]-p[Bt]:g[pt]-g[Rt]),Mt=fe;H!==bt&&(Mt+=ot);let ue=H===0||H===2?at:V,pe=gt?P[ue]:T[ue];pe&&(Mt+=fe*.25*pe),V!==z&&(gt?v[V]:O[V])&&(Mt+=it);let $t=V*4+H,Tt=Q+Mt,ge=de($t);(ge===void 0||Tt<ge-1e-9)&&(he($t,Tt,G),ft.push($t,Tt+Yt*(Math.abs(p[ut]-X)+Math.abs(g[pt]-j))))}}}if(Pt<0)return null;let Ct=[];for(let $=Pt;$!==-1&&$!==void 0;$=Qe($)){let G=$>>2;Ct.push({x:p[G%f],y:g[G/f|0]})}return Ct.reverse(),Ct}return{astar:Je,markPath:q,xs:p,ys:g,N:u}}var Wt=class{constructor(){this.k=[],this.v=[]}get size(){return this.k.length}push(t,e){let s=this.k,o=this.v,n=s.length;for(s.push(e),o.push(t);n>0;){let i=n-1>>1;if(s[i]<=e)break;s[n]=s[i],o[n]=o[i],n=i}s[n]=e,o[n]=t}peekKey(){return this.k[0]}pop(){let t=this.k,e=this.v,s=e[0],o=t.pop(),n=e.pop();if(t.length){let i=0,d=t.length;for(;;){let a=2*i+1;if(a>=d||(a+1<d&&t[a+1]<t[a]&&a++,t[a]>=o))break;t[i]=t[a],e[i]=e[a],i=a}t[i]=o,e[i]=n}return s}};function Vt(r,t,e,s){if(!s)return 0;let o=r.options,n=(a,c)=>c.x>=a.x-1&&c.x<=a.x+a.width+1&&c.y>=a.y-1&&c.y<=a.y+a.height+1&&Math.min(Math.abs(c.x-a.x),Math.abs(c.x-a.x-a.width),Math.abs(c.y-a.y),Math.abs(c.y-a.y-a.height))<=1,i=(a,c)=>{let h={left:Math.abs(c.x-a.x),right:Math.abs(c.x-a.x-a.width),top:Math.abs(c.y-a.y),bottom:Math.abs(c.y-a.y-a.height)};return Object.keys(h).reduce((p,g)=>h[g]<h[p]?g:p)},d=0;for(let a of r.edges){let c=s[a.id],h=t.paths.get(a.id),p=e.get(a.source),g=e.get(a.target);if(!Array.isArray(c)||c.length<2||!h||!p||!g)continue;let f=c.map(u=>({x:+u[0],y:+u[1]}));if(f.some(u=>!Number.isFinite(u.x)||!Number.isFinite(u.y))||!n(p,f[0])||!n(g,f[f.length-1]))continue;let l=!0;for(let u=0;l&&u<f.length-1;u++){let m=f[u],w=f[u+1];t.mode==="orthogonal"&&Math.abs(m.x-w.x)>.5&&Math.abs(m.y-w.y)>.5&&(l=!1)}l&&(h.points=f,h.sourceSide=i(p,f[0]),h.targetSide=i(g,f[f.length-1]),t.raw&&t.raw.set(a.id,f.map(u=>({...u}))),d++)}if(d){let a=r.edges.map(h=>h.id).filter(h=>t.paths.has(h)),c=o.lineHops&&t.mode==="orthogonal"?Kt(t.paths,a,o.hopRadius):new Map;for(let[h,p]of t.paths)p.hops=c.get(h)||[]}return d}var zn=[.5,.3,.7,.15,.85],Et=3;function Fe(r,{nodes:t=[],edges:e=[]}={}){let s=[...t],o=[];for(let[a,c]of e)for(let h=0;h<c.length-1;h++)o.push({id:a,i:h,a:c[h],b:c[h+1],box:Hn(c[h],c[h+1])});let n=[],i=new Map,d=[...r].sort((a,c)=>He(a.points)-He(c.points));for(let a of d){let c=a.points;if(!c||!c.length)continue;let h=a.width,p=a.height,g=[];for(let u=0;u<c.length-1;u++)g.push(Math.hypot(c[u+1].x-c[u].x,c[u+1].y-c[u].y));let f=Math.max(1,...g),l=null;for(let u=0;u<g.length;u++){let m=c[u],w=c[u+1],M=g[u];if(M<1)continue;let b=Math.abs(w.y-m.y)<Math.abs(w.x-m.x),x=b?h:p;for(let y of zn){if(y!==.5&&M<x*2.2)continue;let _={x:m.x+(w.x-m.x)*y,y:m.y+(w.y-m.y)*y},k=b?[[0,0],[0,-(p/2+Et)],[0,p/2+Et]]:[[0,0],[h/2+Et,0],[-(h/2+Et),0]];for(let E=0;E<k.length;E++){let S=_.x+k[E][0],A=_.y+k[E][1],N={x:S-h/2,y:A-p/2,width:h,height:p},O=(1-M/f)*20+Math.abs(y-.5)*40+(E?12:0);if(!E&&M<x+8&&(O+=25),!(l&&O>=l.cost)){for(let v of n)qt(N,v,2)&&(O+=1e3+Fn(N,v));if(!(l&&O>=l.cost)){for(let v of s)qt(N,v,2)&&(O+=800);if(!(l&&O>=l.cost)){for(let v of o)v.id===a.id&&v.i===u||qt(N,v.box,0)&&Dn(v.a,v.b,N)&&(O+=v.id===a.id?60:150);(!l||O<l.cost)&&(l={cost:O,x:S,y:A,r:N})}}}}}}if(!l){let u=c[0];l={x:u.x,y:u.y,r:{x:u.x-h/2,y:u.y-p/2,width:h,height:p}}}n.push(l.r),i.set(a.id,{x:l.x,y:l.y})}return i}function He(r){let t=0;for(let e=0;e<(r?.length||0)-1;e++)t+=Math.hypot(r[e+1].x-r[e].x,r[e+1].y-r[e].y);return t}function Hn(r,t){let e=Math.min(r.x,t.x),s=Math.min(r.y,t.y);return{x:e,y:s,width:Math.abs(r.x-t.x),height:Math.abs(r.y-t.y)}}function qt(r,t,e){return r.x<t.x+t.width+e&&t.x<r.x+r.width+e&&r.y<t.y+t.height+e&&t.y<r.y+r.height+e}function Fn(r,t){let e=Math.min(r.x+r.width,t.x+t.width)-Math.max(r.x,t.x),s=Math.min(r.y+r.height,t.y+t.height)-Math.max(r.y,t.y);return e>0&&s>0?e*s:0}function Dn(r,t,e){let s=0,o=1,n=t.x-r.x,i=t.y-r.y,d=(a,c)=>{if(Math.abs(a)<1e-9)return c>=0;let h=c/a;if(a<0){if(h>o)return!1;h>s&&(s=h)}else{if(h<s)return!1;h<o&&(o=h)}return!0};return d(-n,r.x-e.x)&&d(n,e.x+e.width-r.x)&&d(-i,r.y-e.y)&&d(i,e.y+e.height-r.y)}var rt="http://www.w3.org/2000/svg",Xn=0,Jt={arrow:'<path class="fg-marker-fill" d="M0,-5 L12,0 L0,5 Z"/>',open:'<path class="fg-marker-stroke" d="M1,-5 L12,0 L1,5"/>',many:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',one:'<path class="fg-marker-stroke" d="M6,-6 L6,6 M0,0 L12,0"/>',onlyOne:'<path class="fg-marker-stroke" d="M3,-6 L3,6 M8,-6 L8,6 M0,0 L12,0"/>',oneOrMany:'<path class="fg-marker-stroke" d="M-3,-6 L-3,6 M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/>',zeroOrMany:'<path class="fg-marker-stroke" d="M0,0 L12,-6 M0,0 L12,0 M0,0 L12,6"/><circle class="fg-marker-hollow" cx="-5" cy="0" r="3.5"/>',zeroOrOne:'<path class="fg-marker-stroke" d="M8,-6 L8,6 M0,0 L12,0"/><circle class="fg-marker-hollow" cx="0" cy="0" r="3.5"/>',diamond:'<path class="fg-marker-fill" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',hollowDiamond:'<path class="fg-marker-hollow" d="M0,0 L6,-5 L12,0 L6,5 Z"/>',circle:'<circle class="fg-marker-fill" cx="8" cy="0" r="4"/>'};var Lt=class{constructor(t,e){this.id="fg"+ ++Xn,this.options=e,this.container=t,t.classList.add("fg-container");let s=this.viewport=F("div","fg-viewport");s.tabIndex=0,this.world=F("div","fg-world"),this.groupsLayer=F("div","fg-groups"),this.svg=document.createElementNS(rt,"svg"),this.svg.setAttribute("class","fg-edges"),this.svg.setAttribute("width","1"),this.svg.setAttribute("height","1"),this.defs=document.createElementNS(rt,"defs"),this.svg.appendChild(this.defs),this.edgesGroup=document.createElementNS(rt,"g"),this.svg.appendChild(this.edgesGroup),this.labelsLayer=F("div","fg-labels"),this.nodesLayer=F("div","fg-nodes"),this.world.append(this.groupsLayer,this.svg,this.labelsLayer,this.nodesLayer),s.appendChild(this.world),t.appendChild(s),this.nodeEls=new Map,this.edgeEls=new Map,this.groupEls=new Map,this.labelEls=new Map,this.markersUsed=new Set,this.expanded=new Set,this.transform={x:0,y:0,k:1}}destroy(){clearTimeout(this._settle),this.viewport.remove(),this.container.classList.remove("fg-container")}syncNodes(t){let e=this.options,s=new Set,o=new Map,n=[];for(let i of t){let d=String(i.id);s.add(d);let a=this.nodeEls.get(d),c=Qt(i,e),h=c&&this.expanded.has(d),p=jn(i)+(c?h?"+":"-":"");if(a||(a=F("div","fg-node"),a.dataset.id=d,this.nodesLayer.appendChild(a),this.nodeEls.set(d,a)),a._sig!==p){a._sig=p,a.className="fg-node"+(i.className?" "+i.className:"")+(i.type?" fg-node--"+i.type:"")+(c?" fg-node--expandable":"")+(h?" fg-node--expanded":""),a.innerHTML="";let l=c?F("div","fg-node__body"):a;c&&a.appendChild(l);let u=e.renderNode?e.renderNode(i,l):void 0;if(typeof u=="string")l.innerHTML=u;else if(u instanceof Node)l.appendChild(u);else if(u===void 0)if(i.html!=null)l.innerHTML=i.html;else{let m=F("div","fg-node__label");m.textContent=i.label??d,l.appendChild(m)}if(c){if(h){let m=F("div","fg-node__details"),w=e.renderDetails?e.renderDetails(i,m):i.details;typeof w=="string"?m.innerHTML=w:w instanceof Node&&m.appendChild(w),a.appendChild(m)}a.appendChild(Kn(h,e))}a._measured=null}let g=typeof i.width=="number",f=typeof i.height=="number"&&!h;a.style.width=g?i.width+"px":"",a.style.height=f?i.height+"px":"",(!g||!f)&&n.push([d,a,g?i.width:null,f?i.height:null])}for(let[i,d]of this.nodeEls)s.has(i)||(d.remove(),this.nodeEls.delete(i));for(let[,i,d]of n)i.classList.add(d==null?"fg-node--measuring":"fg-node--measuring-h");for(let[i,d,a,c]of n){if(!d._measured){let h=d.getBoundingClientRect(),p=this.transform.k||1;d._measured={width:Math.ceil(h.width/p-.01)||this.options.defaultNodeWidth,height:Math.ceil(h.height/p-.01)||this.options.defaultNodeHeight}}o.set(i,{width:a??d._measured.width,height:c??d._measured.height})}for(let[,i]of n)i.classList.remove("fg-node--measuring","fg-node--measuring-h");return o}renderBadges(t){for(let[e,s]of this.nodeEls){let o=t&&t.get(e),n=s.querySelector(":scope > .fg-node__badge");if(!o){n?.remove();continue}n||(n=F("div","fg-node__badge"),s.appendChild(n)),n.textContent!==o.text&&(n.textContent=o.text),n.classList.toggle("fg-node__badge--open",!!o.open),n.title=o.title||""}}renderPorts(t){for(let e of t.nodes){let s=this.nodeEls.get(e.id);if(!s)continue;let o=this.options.showPorts?JSON.stringify(e.ports.map(n=>[n.id,n.side,n.offset])):"";if(s._portSig!==o&&(s._portSig=o,s.querySelectorAll(":scope > .fg-port").forEach(n=>n.remove()),!!o))for(let[n,i]of ht(e)){let d=F("div","fg-port fg-port--"+i.side);d.dataset.port=n,d.style.left=i.px*100+"%",d.style.top=i.py*100+"%",s.appendChild(d)}}}placeNodes(t,e){for(let s of t.nodes){let o=this.nodeEls.get(s.id),n=e.get(s.id);!o||!n||(o.style.width=n.width+"px",o.style.height=n.height+"px",o.style.transform=`translate(${n.x}px, ${n.y}px)`,o.classList.toggle("fg-node--pinned",!!s.constraints.pinned))}}renderGroups(t,e){let s=new Set;for(let o of t.groups){let n=e.get(o.id);if(!n)continue;s.add(o.id);let i=this.groupEls.get(o.id);if(!i){i=F("div","fg-group"),i.dataset.id=o.id;let d=F("div","fg-group__label");i.appendChild(d),this.groupsLayer.appendChild(i),this.groupEls.set(o.id,i)}i.className="fg-group"+(o.className?" "+o.className:""),i.firstChild.textContent=o.label,i.firstChild.style.height=this.options.groupLabelHeight+"px",i.firstChild.style.lineHeight=this.options.groupLabelHeight+"px",Object.assign(i.style,{transform:`translate(${n.x}px, ${n.y}px)`,width:n.width+"px",height:n.height+"px"})}for(let[o,n]of this.groupEls)s.has(o)||(n.remove(),this.groupEls.delete(o))}ensureMarker(t){if(!t||!Jt[t]||this.markersUsed.has(t))return;let e=document.createElementNS(rt,"marker");e.setAttribute("id",`${this.id}-m-${t}`),e.setAttribute("viewBox","-10 -8 24 16"),e.setAttribute("refX","12"),e.setAttribute("refY","0"),e.setAttribute("markerWidth","24"),e.setAttribute("markerHeight","16"),e.setAttribute("markerUnits","userSpaceOnUse"),e.setAttribute("orient","auto-start-reverse"),e.setAttribute("class","fg-marker fg-marker--"+t),e.innerHTML=Jt[t],this.defs.appendChild(e),this.markersUsed.add(t)}renderEdges(t,e,s,o){let n=this.options,i=new Set,d=[];for(let a of t.edges){let c=e.paths.get(a.id);if(!c)continue;i.add(a.id);let h=this.edgeEls.get(a.id);if(!h){h=document.createElementNS(rt,"g"),h.dataset.id=a.id;let u=document.createElementNS(rt,"path");u.setAttribute("class","fg-edge__hit");let m=document.createElementNS(rt,"path");m.setAttribute("class","fg-edge__line"),h.append(u,m),this.edgesGroup.appendChild(h),this.edgeEls.set(a.id,h)}h.setAttribute("class",`fg-edge fg-edge--${Gn(a.type)}${a.className?" "+a.className:""}`);let p=s?s.get(a.id):null,g=p?Yn(p):te(c,n.cornerRadius,n.lineHops?c.hops:[],n.hopRadius),[f,l]=h.childNodes;f.setAttribute("d",g),l.setAttribute("d",g);for(let[u,m]of[["marker-start",a.markerStart],["marker-end",a.markerEnd]])m&&Jt[m]?(this.ensureMarker(m),l.setAttribute(u,`url(#${this.id}-m-${m})`)):l.removeAttribute(u);this.renderLabel(a,!s)&&!s&&d.push([a.id,c])}for(let[a,c]of this.edgeEls)i.has(a)||(c.remove(),this.edgeEls.delete(a),this.renderLabel({id:a,label:null},!1));d.length&&this.placeLabels(d,e,o);for(let a of t.edges){let c=this.edgeEls.get(a.id);c&&this.edgesGroup.appendChild(c)}}renderLabel(t,e){let s=this.labelEls.get(t.id);return t.label==null||t.label===""?(s&&(s.remove(),this.labelEls.delete(t.id)),!1):(s||(s=F("div","fg-edge-label"),s.dataset.id=t.id,this.labelsLayer.appendChild(s),this.labelEls.set(t.id,s)),s.textContent!==String(t.label)&&(s.textContent=t.label,s._size=null),s.style.visibility=e?"":"hidden",!0)}placeLabels(t,e,s){let o=[];for(let[d,a]of t){let c=this.labelEls.get(d);c._size||(c._size={width:c.offsetWidth,height:c.offsetHeight}),o.push({id:d,points:a.points,width:c._size.width,height:c._size.height})}let n=[...e.paths].map(([d,a])=>[d,a.points]),i=Fe(o,{nodes:s?s.values():[],edges:n});for(let[d,a]of i){let c=this.labelEls.get(d),h=c._size;c.style.transform=`translate(${C(a.x-h.width/2)}px, ${C(a.y-h.height/2)}px)`}}setTransform(t){this.transform=t,this.world.style.transform=`translate(${Math.round(t.x)}px, ${Math.round(t.y)}px) scale(${t.k})`,this._k!==t.k&&(this._k=t.k,this.world.style.setProperty("--fg-zoom",t.k)),this.world.classList.add("fg-moving"),clearTimeout(this._settle),this._settle=setTimeout(()=>this.world.classList.remove("fg-moving"),150)}};function F(r,t){let e=document.createElement(r);return t&&(e.className=t),e}function Gn(r){return String(r).replace(/[^a-zA-Z0-9_-]/g,"_")}function jn(r){return JSON.stringify([r.label,r.html,r.className,r.type,r.columns,r.data,r.details])}function Qt(r,t){return r.expandable!=null?!!r.expandable:r.details!=null||!!t.renderDetails}var Un='<svg viewBox="0 0 12 12" width="12" height="12" aria-hidden="true"><path d="M3 4.5 6 7.5 9 4.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>';function Kn(r,t){let e=F("button","fg-node__toggle");return e.type="button",e.setAttribute("aria-expanded",String(r)),e.innerHTML=`<span></span>${Un}`,e.firstChild.textContent=r?t.collapseText:t.expandText,e}var C=r=>Math.round(r*100)/100;function Yn(r){return r.map((t,e)=>(e?"L":"M")+C(t.x)+","+C(t.y)).join(" ")}function te(r,t=6,e=[],s=4){let o=r.points;if(!o||o.length<2)return"";if(r.kind==="curved")return Zn(r);let n=`M${C(o[0].x)},${C(o[0].y)}`,i=o.length,d=new Array(i).fill(0);for(let c=1;c<i-1;c++){let h=Math.hypot(o[c].x-o[c-1].x,o[c].y-o[c-1].y),p=Math.hypot(o[c+1].x-o[c].x,o[c+1].y-o[c].y);d[c]=Math.max(0,Math.min(t,h/2,p/2))}let a=new Map;for(let c of e||[])a.has(c.seg)||a.set(c.seg,[]),a.get(c.seg).push(c);for(let c=0;c<i-1;c++){let h=o[c],p=o[c+1],g=Math.hypot(p.x-h.x,p.y-h.y)||1,f=(p.x-h.x)/g,l=(p.y-h.y)/g,u=d[c+1],m=p.x-f*u,w=p.y-l*u,M=a.get(c);if(M&&Math.abs(l)<1e-6){let b=Math.sign(f),x=h.x+f*d[c];M.sort((y,_)=>(y.x-_.x)*b);for(let y of M)(y.x-x)*b<s+1||(m-y.x)*b<s+1||(n+=` L${C(y.x-b*s)},${C(h.y)} A${s},${s} 0 0 ${b>0?1:0} ${C(y.x+b*s)},${C(h.y)}`)}if(n+=` L${C(m)},${C(w)}`,c+1<i-1&&u>0){let b=o[c+2],x=Math.hypot(b.x-p.x,b.y-p.y)||1;n+=` Q${C(p.x)},${C(p.y)} ${C(p.x+(b.x-p.x)/x*u)},${C(p.y+(b.y-p.y)/x*u)}`}}return n}function Zn(r){let t=r.points,e=t[0],s=t[t.length-1],o=Math.hypot(s.x-e.x,s.y-e.y),n=Math.max(30,Math.min(160,o*.4));if(t.length===2){let g=U[r.sourceSide]||{x:0,y:0},f=U[r.targetSide]||{x:0,y:0};return`M${C(e.x)},${C(e.y)} C${C(e.x+g.x*n)},${C(e.y+g.y*n)} ${C(s.x+f.x*n)},${C(s.y+f.y*n)} ${C(s.x)},${C(s.y)}`}let i=U[r.sourceSide],d=U[r.targetSide],a=i?{x:e.x-i.x*40,y:e.y-i.y*40}:e,c=d?{x:s.x-d.x*40,y:s.y-d.y*40}:s,h=[a,...t,c],p=`M${C(e.x)},${C(e.y)}`;for(let g=1;g<h.length-2;g++){let f=h[g-1],l=h[g],u=h[g+1],m=h[g+2],w={x:l.x+(u.x-f.x)/6,y:l.y+(u.y-f.y)/6},M={x:u.x-(m.x-l.x)/6,y:u.y-(m.y-l.y)/6};p+=` C${C(w.x)},${C(w.y)} ${C(M.x)},${C(M.y)} ${C(u.x)},${C(u.y)}`}return p}function De(r,t,e,s=28){let o=new Map;for(let[n,i]of t){let d=r&&r.get(n),a=Gt(i.points,s);if(!d){o.set(n,a);continue}let c=Gt(d.points,s);o.set(n,a.map((h,p)=>({x:c[p].x+(h.x-c[p].x)*e,y:c[p].y+(h.y-c[p].y)*e})))}return o}function Xe(r){let t=r.renderer,e=t.viewport,s=()=>r.options,o=new Map,n=null,i=0,d=null,a=(y,_)=>{let k=e.getBoundingClientRect(),E=t.transform;return{x:(y-k.left-E.x)/E.k,y:(_-k.top-E.y)/E.k}},c=y=>{let _=y.target.closest&&y.target.closest(".fg-node");if(_&&t.nodesLayer.contains(_))return{kind:"node",id:_.dataset.id,el:_};let k=y.target.closest&&y.target.closest(".fg-edge");if(k)return{kind:"edge",id:k.dataset.id,el:k};let E=y.target.closest&&y.target.closest(".fg-edge-label");if(E)return{kind:"edge",id:E.dataset.id,el:E};let S=y.target.closest&&y.target.closest(".fg-group");return S?{kind:"group",id:S.dataset.id,el:S}:{kind:"background"}};function h(y){if(r._stopZoom(),y.button!==void 0&&y.button!==0&&y.pointerType==="mouse"||y.target.closest&&y.target.closest(".fg-controls")||y.target.closest&&y.target.closest("input, textarea, select, button, a, [data-fg-nodrag]"))return;if(o.set(y.pointerId,{x:y.clientX,y:y.clientY}),e.setPointerCapture?.(y.pointerId),o.size===2&&s().zoomable){let[E,S]=[...o.values()];n={type:"pinch",dist:Math.hypot(E.x-S.x,E.y-S.y),k:t.transform.k,mid:{x:(E.x+S.x)/2,y:(E.y+S.y)/2}};return}let _=c(y),k={x:y.clientX,y:y.clientY};if((_.kind==="background"||_.kind==="group")&&y.shiftKey&&s().multiSelect)n={type:"box",target:_,start:k,moved:!1,base:r.getSelectedItems()};else if(_.kind==="node"&&s().draggable){let E=r.positions.get(_.id),S=a(y.clientX,y.clientY);n={type:"drag",id:_.id,target:_,start:k,moved:!1,dx:S.x-E.x,dy:S.y-E.y}}else s().pannable?n={type:"pan",target:_,start:k,moved:!1,tx:t.transform.x,ty:t.transform.y}:n={type:"click",target:_,start:k,moved:!1}}function p(y){if(o.has(y.pointerId)&&o.set(y.pointerId,{x:y.clientX,y:y.clientY}),!n)return;if(n.type==="pinch"){if(o.size<2)return;let[k,E]=[...o.values()],S=Math.hypot(k.x-E.x,k.y-E.y);r.zoomAt(n.k*(S/n.dist),n.mid.x,n.mid.y,!0);return}let _=Math.hypot(y.clientX-n.start.x,y.clientY-n.start.y);if(!(!n.moved&&_<4)){if(n.moved||(n.moved=!0,n.type==="drag"&&(r._dragStart(n.id),e.classList.add("fg-dragging")),n.type==="pan"&&e.classList.add("fg-panning"),n.type==="box"&&(n.el=document.createElement("div"),n.el.className="fg-selection-box",e.appendChild(n.el))),n.type==="box"){let k=e.getBoundingClientRect(),E=Math.min(n.start.x,y.clientX),S=Math.min(n.start.y,y.clientY),A=Math.abs(y.clientX-n.start.x),N=Math.abs(y.clientY-n.start.y);Object.assign(n.el.style,{left:E-k.left+"px",top:S-k.top+"px",width:A+"px",height:N+"px"});let O=a(E,S),v=a(E+A,S+N);d={box:{x:O.x,y:O.y,width:v.x-O.x,height:v.y-O.y},base:n.base},i||(i=requestAnimationFrame(g));return}if(n.type==="pan")r.setTransform({x:n.tx+y.clientX-n.start.x,y:n.ty+y.clientY-n.start.y,k:t.transform.k});else if(n.type==="drag"){let k=a(y.clientX,y.clientY);d={id:n.id,x:k.x-n.dx,y:k.y-n.dy},i||(i=requestAnimationFrame(g))}}}function g(){if(i=0,d){let y=d;d=null,y.box?r._boxSelect(y.box,y.base):r._dragMove(y.id,y.x,y.y)}}function f(y){if(o.delete(y.pointerId),!n)return;let _=n;if(_.type==="pinch"){o.size===0&&(n=null);return}if(n=null,e.classList.remove("fg-dragging","fg-panning"),_.type==="box"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),_.el.remove();return}if(_.type==="drag"&&_.moved){i&&(cancelAnimationFrame(i),i=0,g()),r._dragEnd(_.id);return}!_.moved&&y.type==="pointerup"&&r._click(_.target,y)}function l(y){if(r._stopZoom(),!s().zoomable)return;y.preventDefault();let _=t.transform.k*Math.exp(-y.deltaY*(y.ctrlKey?.01:.0015));r.zoomAt(_,y.clientX,y.clientY,!0)}let u=null;function m(y){if(n&&n.moved)return;let _=c(y),k=_.kind==="node"||_.kind==="edge"?_.kind+":"+_.id:null;k!==u&&(u=k,r._hover(k?_:null))}function w(y){y.target.closest&&y.target.closest(".fg-controls, input, textarea, select, a")||r._contextMenu(c(y),y)}function M(y){let _=y.target.closest&&y.target.closest(".fg-node__toggle");if(!_)return;let k=_.closest(".fg-node");k&&t.nodesLayer.contains(k)&&(y.stopPropagation(),r.toggleExpand(k.dataset.id))}function b(){u&&(u=null,r._hover(null))}function x(y){y.key==="Escape"?r._escape():(y.key==="z"||y.key==="Z")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),y.shiftKey?r.redo():r.undo()):(y.key==="y"||y.key==="Y")&&(y.ctrlKey||y.metaKey)&&s().history?(y.preventDefault(),r.redo()):(y.key==="a"||y.key==="A")&&(y.ctrlKey||y.metaKey)&&s().multiSelect?(y.preventDefault(),r.selectAll()):(y.key==="+"||y.key==="=")&&s().zoomable?r.zoomBy(1.2):y.key==="-"&&s().zoomable?r.zoomBy(1/1.2):y.key==="0"&&r.fit()}return e.addEventListener("pointerdown",h),e.addEventListener("pointermove",p),e.addEventListener("pointerup",f),e.addEventListener("pointercancel",f),e.addEventListener("wheel",l,{passive:!1}),e.addEventListener("pointerover",m),e.addEventListener("contextmenu",w),e.addEventListener("click",M),e.addEventListener("pointerleave",b),e.addEventListener("keydown",x),()=>{e.removeEventListener("pointerdown",h),e.removeEventListener("pointermove",p),e.removeEventListener("pointerup",f),e.removeEventListener("pointercancel",f),e.removeEventListener("wheel",l),e.removeEventListener("pointerover",m),e.removeEventListener("contextmenu",w),e.removeEventListener("click",M),e.removeEventListener("pointerleave",b),e.removeEventListener("keydown",x),i&&cancelAnimationFrame(i)}}function It(r,t,e="chain"){let s=new Set,o=new Set,n=[],i=[];if(t.kind==="node")s.add(t.id),n=[t.id],i=[t.id];else{let h=r.find(p=>p.id===t.id);if(!h)return{nodes:s,edges:o};o.add(h.id),s.add(h.source),s.add(h.target),n=[h.source],i=[h.target]}let d=new Map,a=new Map;for(let h of r)d.has(h.target)||d.set(h.target,[]),a.has(h.source)||a.set(h.source,[]),d.get(h.target).push(h),a.get(h.source).push(h);let c=(h,p,g)=>{let f=new Set(h),l=[...h];for(;l.length;){let u=l.shift();for(let m of p.get(u)||[]){let w=g(m);o.add(m.id),s.add(w),e==="chain"&&!f.has(w)&&(f.add(w),l.push(w))}}};return(t.kind==="node"||e==="chain")&&(c(n,d,h=>h.source),c(i,a,h=>h.target)),{nodes:s,edges:o}}var W="__fg_more:";function Ge(r){let t=new Map;for(let n of r.nodes||[])n&&n.id!=null&&t.set(String(n.id),n);let e=new Map,s=new Set;for(let n of r.edges||[]){if(!n)continue;let i=String(n.source),d=String(n.target);if(i===d||!t.has(i)||!t.has(d))continue;e.has(i)||e.set(i,[]);let a=e.get(i);a.includes(d)||a.push(d),s.add(d)}let o=[...t.keys()].filter(n=>!s.has(n)&&e.has(n));return!o.length&&t.size&&(o=[t.keys().next().value]),{children:e,roots:o,nodeById:t}}function je(r,t,{path:e=[],shown:s=new Map,limit:o=50,hide:n=!1,moreLabel:i}={}){i=i||(x=>`+${x.toLocaleString("en-US")} more`);let{children:d,roots:a,nodeById:c}=t,h=new Set,p=new Set,g=new Map,f=[],l=(x,y)=>{let _=Math.max(o,s.get(x??"")||0);for(let k of y.slice(0,_))h.add(k),x!=null&&!g.has(k)&&g.set(k,x);y.length>_&&f.push({parent:x,count:y.length-_})},u=e.length-1;if((!n||!e.length)&&l(null,a),e.forEach((x,y)=>{h.add(x),p.add(x),(!n||y===u)&&l(x,d.get(x)||[])}),e.length)for(let x of d.get(e[u])||[])h.has(x)&&p.add(x);else for(let x of h)p.add(x);let m=[],w=[];for(let x of h)m.push(c.get(x));for(let x of r.edges||[])x&&h.has(String(x.source))&&h.has(String(x.target))&&w.push(x);for(let x of f){let y=W+(x.parent??"");m.push({id:y,label:i(x.count),className:"fg-node--more",expandable:!1,_more:x}),x.parent!=null&&w.push({id:y+":edge",source:x.parent,target:y,className:"fg-edge--more"}),(x.parent==null||x.parent===e[u])&&p.add(y)}let M=new Map;for(let x of h){let y=d.get(x);y&&M.set(x,y.length)}let b=(r.constraints||[]).filter(x=>[x.a,x.b,x.node,...x.nodes||[]].every(y=>y==null||h.has(String(y))));return{data:{...r,nodes:m,edges:w,constraints:b},focus:p,parentOf:g,childCount:M}}function Ue(r,t,e){let s=r.indexOf(t);if(s>=0)return r.slice(0,s===r.length-1?s:s+1);let o=e.get(t),n=o!=null?r.indexOf(o):-1;return n>=0?[...r.slice(0,n+1),t]:[t]}var Ke="1.2.0";var ee={};ye(ee,{countCrossings:()=>Vn,countNodeOverlaps:()=>qn,countOverlappingSegments:()=>Jn});function Wn(r,t,e,s){let o=(c,h,p)=>(h.x-c.x)*(p.y-c.y)-(h.y-c.y)*(p.x-c.x),n=o(e,s,r),i=o(e,s,t),d=o(r,t,e),a=o(r,t,s);return(n>1e-9&&i<-1e-9||n<-1e-9&&i>1e-9)&&(d>1e-9&&a<-1e-9||d<-1e-9&&a>1e-9)}function Vn(r){let t=[...r.entries()].map(([s,o])=>[s,Array.isArray(o)?o:o.points]),e=0;for(let s=0;s<t.length;s++)for(let o=s+1;o<t.length;o++){let n=t[s][1],i=t[o][1];for(let d=0;d<n.length-1;d++)for(let a=0;a<i.length-1;a++)Wn(n[d],n[d+1],i[a],i[a+1])&&e++}return e}function qn(r,t,e){let s=0;for(let[o,n]of r){let i=Array.isArray(n)?n:n.points,d=e.get(o);for(let[a,c]of t)if(!(d&&(a===d.source||a===d.target))){for(let h=0;h<i.length-1;h++)if(lt(i[h],i[h+1],c,1)){s++;break}}}return s}function Jn(r){let t=[];for(let[o,n]of r){let i=Array.isArray(n)?n:n.points;for(let d=0;d<i.length-1;d++)t.push([o,i[d],i[d+1],d===0?i[0]:d===i.length-2?i[i.length-1]:null])}let e=(o,n)=>o&&n&&Math.abs(o.x-n.x)<.01&&Math.abs(o.y-n.y)<.01,s=0;for(let o=0;o<t.length;o++)for(let n=o+1;n<t.length;n++){let[i,d,a,c]=t[o],[h,p,g,f]=t[n];if(i===h||e(c,f))continue;let l=Math.abs(d.y-a.y)<.01,u=Math.abs(p.y-g.y)<.01,m=Math.abs(d.x-a.x)<.01,w=Math.abs(p.x-g.x)<.01;if(l&&u&&Math.abs(d.y-p.y)<.5){let M=Math.max(Math.min(d.x,a.x),Math.min(p.x,g.x));Math.min(Math.max(d.x,a.x),Math.max(p.x,g.x))-M>1&&s++}else if(m&&w&&Math.abs(d.x-p.x)<.5){let M=Math.max(Math.min(d.y,a.y),Math.min(p.y,g.y));Math.min(Math.max(d.y,a.y),Math.max(p.y,g.y))-M>1&&s++}}return s}function Qn(r,t){let e=kt(r,t),s=mt(e),o=nt(e,s);return{model:e,layout:s,routing:o}}function ts(r,t,e={}){return new At(r,t,e)}var es=["id","label","width","height","group","ports","constraints","source","target","sourcePort","targetPort","type","minLen","weight","markerStart","markerEnd","nodes","type","a","b","node","rank"],ne=r=>{let t={};for(let e of es)r[e]!==void 0&&(t[e]=r[e]);return t},Ye=()=>typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches,At=class{constructor(t,e,s={}){if(typeof t=="string"&&(t=document.querySelector(t)),!t)throw new Error("createGraph: container element not found");this.container=t,this.data=e||{nodes:[],edges:[]},this.userOptions={...s},this.options=yt(this.data.options,this.userOptions),this.renderer=new Lt(t,this.options),this.positions=new Map,this.pins=new Map,this.layoutEdges=new Map,this.routing=null,this.model=null,this.selected=null,this._sel=new Map,this._listeners=new Map,this._anim=0,this._hl=[],this._explore={path:[],shown:new Map},this._undo=[],this._redo=[],this._recDepth=0;for(let o of this.data.nodes||[])o&&o.expanded&&this.renderer.expanded.add(String(o.id));this.options.controls&&this._controls(),this._detach=Xe(this),this.ready=this._build({mode:"relayout",animate:!1}).then(()=>(this.fit(),this))}relayout({animate:t=this.options.animate,fresh:e=!1}={}){return this._record("relayout",()=>this._build({mode:"relayout",animate:t,fresh:e}))}updateGraph(t,e={}){return this._record("update",()=>this._updateGraph(t,e))}_updateGraph(t,{mode:e="stable",animate:s=this.options.animate}={}){this.data=t;let o=new Set((t.nodes||[]).map(i=>String(i.id)));for(let i of[...this.pins.keys()])o.has(i)||this.pins.delete(i);for(let i of[...this.positions.keys()])o.has(i)||this.positions.delete(i);for(let i of[...this.renderer.expanded])o.has(i)||this.renderer.expanded.delete(i);let n=this._explore.path.findIndex(i=>!o.has(i));return n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this._build({mode:e,animate:s})}setOptions(t,e){return oe.some(o=>o in t&&t[o]!==this.options[o])?this._record("options",()=>this._setOptions(t,e)):this._setOptions(t,e)}_setOptions(t,{relayout:e=!0}={}){Object.assign(this.userOptions,t),this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options;let s="explore"in t||"exploreUnfocused"in t||"exploreLimit"in t;return"explore"in t&&(this._explore={path:[],shown:new Map}),s&&(e=!0),e?this.relayout({fresh:"direction"in t||"explore"in t}):this._reroute()}exportState(){let t={};for(let[s,o]of this.positions)t[s]={x:We(o.x),y:We(o.y),pinned:!!this.pins.get(s)};let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[Ve(n.x),Ve(n.y)]);return{version:1,direction:this.options.direction,edgeRouting:this.routing?.mode,nodes:t,edges:e,transform:{...this.renderer.transform}}}importState(t,e){return!t||!t.nodes?Promise.resolve(this):this._record("import",()=>this._importState(t,e))}_importState(t,{animate:e=this.options.animate,transform:s=!0}={}){let o=this._snapshot();for(let[n,i]of Object.entries(t.nodes)){let d=this.positions.get(n);d&&(d.x=i.x,d.y=i.y,i.pinned?this.pins.set(n,{x:i.x,y:i.y}):this.pins.delete(n))}this.model=this._prepareModel();for(let n of this.layoutEdges.values())n.waypoints=[];return this.routing=nt(this.model,{nodes:this.positions,edges:this.layoutEdges}),t.edges&&(!t.edgeRouting||t.edgeRouting===this.routing.mode)&&Vt(this.model,this.routing,this.positions,t.edges),this._present(o,e),s&&t.transform&&this.setTransform(t.transform),Promise.resolve(this)}pin(t,e=!0){let s=this.positions.get(t);if(!s)return;let o=this.pins.get(t);(e?o&&o.x===s.x&&o.y===s.y:!o)||this._record(e?"pin":"unpin",()=>this._pin(t,s,e))}_pin(t,e,s){s?this.pins.set(t,{x:e.x,y:e.y}):this.pins.delete(t);let o=this.model.nodeById.get(t);o&&Object.assign(o.constraints,{pinned:s,x:s?e.x:null,y:s?e.y:null}),this.renderer.placeNodes(this.model,this.positions),this._emit("pin",{id:t,pinned:s})}unpin(t){this.pin(t,!1)}unpinAll(){this.pins.size&&this.batch("unpin",()=>{for(let t of[...this.pins.keys()])this.pin(t,!1)})}async undo(){return this._step(this._undo,this._redo,"undo")}async redo(){return this._step(this._redo,this._undo,"redo")}canUndo(){return this._undo.length>0}canRedo(){return this._redo.length>0}getHistory(){return{undo:this._undo.map(t=>t.label),redo:this._redo.map(t=>t.label)}}clearHistory(){this._undo=[],this._redo=[],this._historyChanged("clear")}batch(t,e){return this._record(t,e)}select(t,{add:e=!1,toggle:s=!1}={}){let o=(t==null?[]:Array.isArray(t)?t:[t]).map(ns).filter(Boolean),n=Ze([...this._sel.values()]);!e&&!s&&this._sel.clear();for(let i of o){let d=i.kind+":"+i.id,a=this._sel.delete(d);s&&a||this._sel.set(d,i)}this.selected=[...this._sel.values()].pop()||null,this._paintSelection(),this._applyHighlight(),this._emit("select",this.selected),Ze([...this._sel.values()])!==n&&this._emit("selectionchange",this._selectionPayload())}getSelection(){return this.selected}getSelectedItems(){return[...this._sel.values()].map(t=>({...t}))}getSelectedNodes(){return this._selectionPayload().nodes}getSelectedEdges(){return this._selectionPayload().edges}selectAll(){this.model&&this.select(this.model.nodes.filter(t=>!t.id.startsWith(W)).map(t=>t.id))}clearSelection(){this.select(null)}getConnections(t,{chain:e=!1}={}){if(!this.model||!this.model.nodeById.has(t))return null;let s=this._ex?this.model.edges.filter(i=>!i.target.startsWith(W)):this.model.edges,o=i=>{let d=new Set([t]),a=[],c=[t];for(;c.length;){let h=c.shift();for(let p of s){let g=i==="next"?p.source:p.target,f=i==="next"?p.target:p.source;g!==h||d.has(f)||(d.add(f),a.push(f),e&&c.push(f))}}return a.map(h=>this.model.nodeById.get(h).data)},n=i=>i.data;return{previous:o("previous"),next:o("next"),incoming:s.filter(i=>i.target===t).map(n),outgoing:s.filter(i=>i.source===t).map(n)}}expand(t,e=!0){t=String(t);let s=this.model?.nodeById.get(t);return!s||!Qt(s.data,this.options)?Promise.resolve(!1):this.renderer.expanded.has(t)===!!e?Promise.resolve(!0):this._record(e?"expand":"collapse",()=>(e?this.renderer.expanded.add(t):this.renderer.expanded.delete(t),this.options.onNodeExpand?.(s.data,!!e),this._emit("expand",{id:t,expanded:!!e,node:s.data}),this._relayoutKeeping(t).then(()=>!0)))}collapse(t){return this.expand(t,!1)}toggleExpand(t){return this.expand(t,!this.isExpanded(t))}isExpanded(t){return this.renderer.expanded.has(String(t))}getExplorePath(){return[...this._explore.path]}setExplorePath(t,{animate:e=this.options.animate}={}){let s=(t||[]).map(String),o=this._explore.path;if(this._explore.path=s,this._emit("explore",{path:[...s]}),!this.options.explore)return Promise.resolve(this);let n=s.length>o.length?s[s.length-1]:o[s.length]??s[s.length-1];return this._relayoutKeeping(n,{animate:e,reveal:s[s.length-1]})}exploreBack(){let t=this._explore.path;return t.length?this.setExplorePath(t.slice(0,-1)):Promise.resolve(this)}fit({padding:t=40,maxZoom:e=1}={}){let s=this.renderer.viewport,o=xt({nodes:this.positions,groups:this._groups||new Map});if(!o.width&&!o.height)return;let n=s.clientWidth||800,i=s.clientHeight||600,d=Math.min((n-2*t)/(o.width||1),(i-2*t)/(o.height||1),e);d=se(d,this.options.minZoom,this.options.maxZoom),this.setTransform({k:d,x:(n-o.width*d)/2-o.x*d,y:(i-o.height*d)/2-o.y*d})}fitNodes(t,{padding:e=40,maxZoom:s=this.options.maxZoom,animate:o=this.options.animate,edges:n}={}){let i=this._fitTransform(t,{padding:e,maxZoom:s,edges:n});return i?(this._animateTransform(i,o),!0):!1}_fitTransform(t,{padding:e=40,maxZoom:s=this.options.maxZoom,edges:o}={}){let n=new Set([...t].map(String).filter(M=>this.positions.has(M)));if(!n.size)return null;let i=1/0,d=1/0,a=-1/0,c=-1/0,h=(M,b)=>{i=Math.min(i,M),d=Math.min(d,b),a=Math.max(a,M),c=Math.max(c,b)};for(let M of n){let b=this.positions.get(M);h(b.x,b.y),h(b.x+b.width,b.y+b.height)}let p=o||this.model.edges.filter(M=>n.has(M.source)&&n.has(M.target)).map(M=>M.id);for(let M of p)for(let b of this.routing?.paths.get(M)?.points||[])h(b.x,b.y);let g=this.renderer.viewport,f=g.clientWidth||800,l=g.clientHeight||600,u=a-i,m=c-d,w=Math.min((f-2*e)/(u||1),(l-2*e)/(m||1),s);return w=se(w,this.options.minZoom,this.options.maxZoom),{k:w,x:(f-u*w)/2-i*w,y:(l-m*w)/2-d*w}}fitFlow(t=this.selected,{mode:e="chain",...s}={}){if(t==null)return!1;if(t===this.selected&&this._sel.size>1){let d=[...this._sel.values()].flatMap(a=>{if(a.kind==="node")return[a.id];let c=this.model?.edgeById.get(a.id);return c?[c.source,c.target]:[]});return this.fitNodes(d,s)}let o;if(typeof t=="string")o={kind:"node",id:t};else if(t.kind)o={kind:t.kind,id:String(t.id)};else{let d=this.model?.edges.find(a=>a.data===t);if(!d)return!1;o={kind:"edge",id:d.id}}if(!(o.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(o.id))return!1;let i=It(this.model.edges,o,e);return this.fitNodes(i.nodes,{...s,edges:[...i.edges]})}_stopZoom(){this._zoomAnim&&typeof cancelAnimationFrame<"u"&&cancelAnimationFrame(this._zoomAnim),this._zoomAnim=0}_animateTransform(t,e){this._stopZoom();let s=this.getTransform();if(!e||Ye()||typeof requestAnimationFrame>"u"){this.setTransform(t);return}let o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o),h=i(c),p=s.k*Math.pow(t.k/s.k,h),g=t.k-s.k?(p-s.k)/(t.k-s.k):h;this.setTransform({k:p,x:s.x+(t.x-s.x)*g,y:s.y+(t.y-s.y)*g}),c<1&&(this._zoomAnim=requestAnimationFrame(d))};this._zoomAnim=requestAnimationFrame(d)}zoomAt(t,e,s){let o=this.renderer.transform;t=se(t,this.options.minZoom,this.options.maxZoom);let n=this.renderer.viewport.getBoundingClientRect(),i=e-n.left,d=s-n.top;this.setTransform({k:t,x:i-(i-o.x)*t/o.k,y:d-(d-o.y)*t/o.k})}zoomBy(t){let e=this.renderer.viewport.getBoundingClientRect();this.zoomAt(this.renderer.transform.k*t,e.left+e.width/2,e.top+e.height/2)}zoomTo(t){this.zoomAt(t,...ss(this.renderer.viewport))}setTransform(t){this.renderer.setTransform(t),this._emit("viewport",{...t})}getTransform(){return{...this.renderer.transform}}getLayout(){let t=new Map([...this.positions].map(([s,o])=>[s,{...o}])),e=new Map;if(this.routing)for(let[s,o]of this.routing.paths)e.set(s,o.points.map(n=>({...n})));return{nodes:t,edges:e,groups:new Map(this._groups||[])}}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}destroy(){cancelAnimationFrame(this._anim),this.container.classList.remove("fg-explore","fg-explore--blur"),delete this.container.dataset.fgDirection,this._stopZoom(),this._detach(),this.renderer.destroy(),this._listeners.clear()}_emit(t,e){for(let s of this._listeners.get(t)||[])try{s(e)}catch(o){console.error(o)}}_refreshView(){if(!this.options.explore){this._ex=null,this._viewData=this.data;return}this._exIndexFor!==this.data&&(this._exIndex=Ge(this.data),this._exIndexFor=this.data);let t=this.options;this._ex=je(this.data,this._exIndex,{path:this._explore.path,shown:this._explore.shown,limit:t.exploreLimit,hide:t.exploreUnfocused==="hide",moreLabel:t.exploreMoreText}),this._viewData=this._ex.data}async _relayoutKeeping(t,{animate:e=this.options.animate,reveal:s}={}){let o=this.getTransform(),n=this.positions.get(t);await this._build({mode:"relayout",animate:e});let i=this.positions.get(t),d=o;if(n&&i&&(d={k:o.k,x:o.x-(i.x-n.x)*o.k,y:o.y-(i.y-n.y)*o.k}),s&&this.positions.has(s)){let a=[s,...this.model.edges.filter(h=>h.source===s).map(h=>h.target)],c=this._fitTransform(a,{maxZoom:o.k});c&&c.k>=o.k*.6&&!this._inView(a,d)&&(d=c)}return this._animateTransform(d,e&&!!n),this}_inView(t,e,s=20){let o=this.renderer.viewport,n=o.clientWidth||800,i=o.clientHeight||600;return t.every(d=>{let a=this.positions.get(d);if(!a)return!0;let c=a.x*e.k+e.x,h=a.y*e.k+e.y;return c>=s&&h>=s&&c+a.width*e.k<=n-s&&h+a.height*e.k<=i-s})}_prepareModel(t){let e=this._viewData||this.data,s=this.renderer.syncNodes(e.nodes||[]),o=(e.nodes||[]).map(i=>{let d=String(i.id),a=t&&t.get(d)||this.pins.get(d);return a?{...i,constraints:{...i.constraints||{},pinned:!0,x:a.x,y:a.y}}:i}),n=kt({...e,nodes:o},this.userOptions,s);for(let i of n.warnings)console.warn("[FlexGraph] "+i);return this.options=n.options,this.renderer.options=n.options,n}_snapshot(){return{positions:new Map([...this.positions].map(([t,e])=>[t,{...e}])),routing:this.routing,groups:this._groups}}_build(t){let e=this._buildNow(t);return this._lastBuild=e.catch(()=>{}),e}async _buildNow({mode:t,animate:e,fresh:s}){let o=this._snapshot();this._refreshView(),this._exploreChrome();let n=this._prepareModel(),i,d=this.positions.size>0;if(this.options.worker&&typeof Worker<"u")i=await this._layoutInWorker(n,t,s);else if(t==="stable"&&d){let a=new Map;for(let h of n.nodes){let p=this.positions.get(h.id);p&&a.set(h.id,{x:p.x,y:p.y})}let c=this._prepareModel(a);i=mt(c),Ne(i,new Set(a.keys()),this.options.nodeSpacing/2,this.options.direction);for(let h of i.edges.values())h.waypoints=[];n=this._prepareModel()}else{let a=s||!d?null:new Map([...this.positions].map(([c,h])=>[c,{x:h.x+h.width/2,y:h.y+h.height/2}]));i=mt(n,{hints:a})}return this.model=n,this.positions=new Map([...i.nodes].map(([a,c])=>[a,{x:c.x,y:c.y,width:c.width,height:c.height}])),this.layoutEdges=i.edges,this.routing=i.routing||nt(n,{nodes:this.positions,edges:this.layoutEdges}),this.renderer.renderPorts(n),this._present(d?o:null,e),this._pruneSelection(),this._emit("layout",{crossings:i.crossings}),this}_layoutInWorker(t,e,s){this._worker||(this._worker=new Worker(this.options.worker,{type:"module"}),this._wseq=0,this._wpending=new Map,this._worker.onmessage=a=>{let c=this._wpending.get(a.data.seq);c&&(this._wpending.delete(a.data.seq),a.data.error?c.reject(new Error(a.data.error)):c.resolve(a.data))});let o={options:this.data.options,nodes:t.nodes.map(a=>({...ne(a.data),id:a.id,width:a.width,height:a.height,constraints:a.constraints})),edges:t.edges.map(a=>ne(a.data)),groups:t.groups.map(a=>({id:a.id,label:a.label})),constraints:(this._viewData?.constraints||[]).map(ne)},n={};for(let[a,c]of Object.entries(this.userOptions))typeof c!="function"&&a!=="worker"&&(n[a]=c);let i=s||e!=="relayout"?null:new Map([...this.positions].map(([a,c])=>[a,{x:c.x+c.width/2,y:c.y+c.height/2}])),d=++this._wseq;return new Promise((a,c)=>{this._wpending.set(d,{resolve:a,reject:c}),this._worker.postMessage({seq:d,data:o,options:n,hints:i})}).then(a=>({nodes:a.nodes,edges:a.edges,crossings:a.crossings,routing:a.routing}))}_reroute(){return this.routing=nt(this.model,{nodes:this.positions,edges:this.layoutEdges}),this._render(),Promise.resolve(this)}_render(t){let e=this.renderer;e.placeNodes(this.model,this.positions),this._groups=wt(this.model,{nodes:this.positions}),e.renderGroups(this.model,this._groups),e.renderEdges(this.model,this.routing,t,t?null:this.positions);for(let s of this._sel.values())s.kind==="edge"&&e.edgeEls.get(s.id)?.classList.add("fg-selected");if(this._hl.length)for(let s of this._hl)s.classList.add("fg-hl");this._exploreFocus()}_exploreFocus(){let t=this.renderer,e=this._ex,s=new Map;if(e){let o=new Set(this._explore.path);for(let[n,i]of e.childCount)s.set(n,{text:o.has(n)?"\u2212":String(i),open:o.has(n),title:`${i} ${i===1?"child":"children"}`})}for(let[o,n]of t.nodeEls)n.classList.toggle("fg-unfocused",!!e&&!e.focus.has(o));for(let o of this.model.edges)t.edgeEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target))),t.labelEls.get(o.id)?.classList.toggle("fg-unfocused",!!e&&!(e.focus.has(o.source)&&e.focus.has(o.target)));t.renderBadges(s)}_exploreChrome(){let t=this.options,e=this.renderer.viewport;this.container.classList.toggle("fg-explore",!!t.explore),this.container.classList.toggle("fg-explore--blur",!!t.explore&&t.exploreUnfocused==="blur"),this.container.dataset.fgDirection=t.direction;let s=e.querySelector(":scope > .fg-breadcrumb");if(!t.explore||!t.exploreBreadcrumb){s?.remove();return}s||(s=document.createElement("nav"),s.className="fg-breadcrumb",s.setAttribute("aria-label","Explore path"),e.appendChild(s)),s.innerHTML="";let o=this._explore.path,n=(i,d,a)=>{let c=document.createElement("button");c.type="button",c.textContent=i,a&&c.setAttribute("aria-current","step"),c.addEventListener("click",h=>{h.stopPropagation(),this.setExplorePath(d)}),s.appendChild(c)};n(t.exploreStartText,[],!o.length),o.forEach((i,d)=>{let a=document.createElement("span");a.className="fg-breadcrumb__sep",a.textContent="\u203A",a.setAttribute("aria-hidden","true"),s.appendChild(a);let c=this._exIndex?.nodeById.get(i);n(String(c?.label??i),o.slice(0,d+1),d===o.length-1)})}_present(t,e){if(cancelAnimationFrame(this._anim),!t||!e||Ye()||!t.routing){this._render();return}let s=this.positions,o=this.options.animationDuration,n=performance.now(),i=a=>a<.5?4*a*a*a:1-Math.pow(-2*a+2,3)/2,d=a=>{let c=Math.min(1,(a-n)/o);if(c>=1){this._render(),this._emit("animationend");return}let h=i(c),p=new Map;for(let[g,f]of s){let l=this._ex?.parentOf.get(g)??(g.startsWith(W)?g.slice(W.length):null),u=t.positions.get(g)||l!=null&&t.positions.get(l)||f;p.set(g,{x:u.x+(f.x-u.x)*h,y:u.y+(f.y-u.y)*h,width:f.width,height:f.height})}this.renderer.placeNodes(this.model,p),this._groups=wt(this.model,{nodes:p}),this.renderer.renderGroups(this.model,this._groups),this.renderer.renderEdges(this.model,this.routing,De(t.routing.paths,this.routing.paths,h)),this._anim=requestAnimationFrame(d)};this._anim=requestAnimationFrame(d)}_dragStart(t){cancelAnimationFrame(this._anim),this._dragSnap=this._canRecord()?this._capture("move"):null;let e=this._sel.has("node:"+t)?[...this._sel.values()].filter(n=>n.kind==="node"&&this.positions.has(n.id)).map(n=>n.id):[t],s=new Set(e);this._dragGroup=e.map(n=>{let i=this.positions.get(n);return{id:n,x:i.x,y:i.y}});let o=new Set(s);for(let n of this.model.edges)s.has(n.source)&&o.add(n.target),s.has(n.target)&&o.add(n.source);this._affected=new Set(this.model.edges.filter(n=>o.has(n.source)||o.has(n.target)).map(n=>n.id));for(let n of this._affected){let i=this.model.edgeById.get(n);if(s.has(i.source)||s.has(i.target)){let d=this.layoutEdges.get(n);d&&(d.waypoints=[])}}for(let n of e)this.renderer.nodeEls.get(n)?.classList.add("fg-node--dragging");this._emit("dragstart",{id:t,ids:[...e]})}_dragMove(t,e,s){let o=this.positions.get(t),n=this._dragGroup?.find(c=>c.id===t);if(!o||!n)return;let i=e-n.x,d=s-n.y,a=this.options.nodeMargin;for(let c of this._dragGroup){let h=this.positions.get(c.id);h.x=c.x+i,h.y=c.y+d;let p=this.model.nodeById.get(c.id);p.constraints.pinned&&(p.constraints.x=h.x,p.constraints.y=h.y);let g={x:h.x-a,y:h.y-a,width:h.width+2*a,height:h.height+2*a};if(this.routing)for(let[f,l]of this.routing.paths){if(this._affected.has(f))continue;let u=l.points;for(let m=0;m<u.length-1;m++)if(lt(u[m],u[m+1],g,1)){this._affected.add(f);break}}}this.routing=nt(this.model,{nodes:this.positions,edges:this.layoutEdges},{only:this._affected,prev:this.routing}),this._render(),this._emit("drag",{id:t,x:e,y:s,ids:this._dragGroup.map(c=>c.id)})}_dragEnd(t){let e=this.positions.get(t),s=(this._dragGroup||[{id:t}]).map(o=>o.id);this._dragGroup=null,this._recDepth++;try{for(let o of s)this.renderer.nodeEls.get(o)?.classList.remove("fg-node--dragging"),this.options.pinOnDrag&&this.pin(o,!0)}finally{this._recDepth--}this._dragSnap&&(this._push(this._dragSnap),this._dragSnap=null),this._emit("dragend",{id:t,x:e.x,y:e.y,ids:s}),this._emit("change",this.exportState())}_boxSelect(t,e){let s=[];for(let[o,n]of this.positions)o.startsWith(W)||n.x<t.x+t.width&&t.x<n.x+n.width&&n.y<t.y+t.height&&t.y<n.y+n.height&&s.push({kind:"node",id:o});this.select([...e,...s])}_click(t,e){let s=this.options.multiSelect&&!!(e.ctrlKey||e.metaKey||e.shiftKey);if(!(t.kind==="node"&&this._ex&&!s&&this._exploreClick(t.id)))if(t.kind==="node"){if(t.id.startsWith(W))return;this.select({kind:"node",id:t.id},{toggle:s});let o=this.model.nodeById.get(t.id),n=this.getConnections(t.id);this.options.onNodeClick?.(o.data,e,n),this._emit("nodeclick",{node:o.data,event:e,previous:n.previous,next:n.next})}else if(t.kind==="edge"){this.select({kind:"edge",id:t.id},{toggle:s});let o=this.model.edgeById.get(t.id);this.options.onEdgeClick?.(o.data,e),this._emit("edgeclick",{edge:o.data,event:e})}else t.kind==="group"?this._emit("groupclick",{group:this.model.groupById.get(t.id)?.data,event:e}):(s||this.select(null),this.options.onBackgroundClick?.(e))}_exploreClick(t){if(t.startsWith(W)){let e=t.slice(W.length),s=this._explore.shown;return s.set(e,Math.max(this.options.exploreLimit,s.get(e)||0)+this.options.exploreLimit),this._relayoutKeeping(t),!0}return!this._exIndex.children.has(t)&&!this._explore.path.includes(t)||this.setExplorePath(Ue(this._explore.path,t,this._ex.parentOf)),!1}_escape(){if(this._sel.size>1||!(this._ex&&this._explore.path.length)){this.select(null);return}this.select(null),this.exploreBack()}_nodeExists(t){return this._exIndex&&this.options.explore?this._exIndex.nodeById.has(t):!!this.model?.nodeById.has(t)||(this.data.nodes||[]).some(e=>String(e.id)===t)}_pruneSelection(){let t=s=>s.kind==="edge"?(this.data.edges||[]).some((o,n)=>String(o.id??"e"+n)===s.id):this._nodeExists(s.id),e=[...this._sel].filter(([,s])=>!t(s));if(e.length){for(let[s]of e)this._sel.delete(s);this.select([...this._sel.values()])}else this._sel.size&&(this._paintSelection(),this._applyHighlight())}_canRecord(){return!!this.options.history&&!this._recDepth&&!this._restoring&&!!this.model}_record(t,e){if(!this._canRecord())return e();let s=this._capture(t);this._recDepth++;let o;try{o=e()}finally{this._recDepth--}return this._push(s),o}_push(t){this._undo.push(t);let e=Math.max(1,this.options.historyLimit|0);this._undo.length>e&&this._undo.splice(0,this._undo.length-e),this._redo=[],this._historyChanged("record",t.label)}_capture(t){let e={};if(this.routing)for(let[s,o]of this.routing.paths)e[s]=o.points.map(n=>[n.x,n.y]);return{label:t,data:this.data,opts:Object.fromEntries(oe.map(s=>[s,this.options[s]])),positions:new Map([...this.positions].map(([s,o])=>[s,{...o}])),pins:new Map([...this.pins].map(([s,o])=>[s,{...o}])),expanded:[...this.renderer.expanded],layoutEdges:new Map([...this.layoutEdges].map(([s,o])=>[s,{...o,waypoints:(o.waypoints||[]).map(n=>({...n}))}])),edges:e}}async _step(t,e,s){await this._lastBuild;let o=t.pop();if(!o)return!1;e.push(this._capture(o.label)),this._restoring=!0;try{await this._restore(o)}finally{this._restoring=!1}return this._historyChanged(s,o.label),this._emit("change",this.exportState()),!0}async _restore(t){let e=this._snapshot();this.data=t.data;let s=oe.filter(i=>this.options[i]!==t.opts[i]);for(let i of s)this.userOptions[i]=t.opts[i];s.length&&(this.options=yt(this.data.options,this.userOptions),this.renderer.options=this.options),this.renderer.expanded=new Set(t.expanded);let o=new Set((this.data.nodes||[]).map(i=>String(i.id))),n=this._explore.path.findIndex(i=>!o.has(i));n>=0&&(this._explore.path=this._explore.path.slice(0,n)),this.pins=new Map([...t.pins].map(([i,d])=>[i,{...d}])),this.positions=new Map([...t.positions].map(([i,d])=>[i,{...d}])),this.layoutEdges=new Map([...t.layoutEdges].map(([i,d])=>[i,{...d,waypoints:d.waypoints.map(a=>({...a}))}])),this._refreshView(),this._exploreChrome(),this.model=this._prepareModel(),this.model.nodes.some(i=>!this.positions.has(i.id))?await this._build({mode:"stable",animate:this.options.animate}):(this.routing=nt(this.model,{nodes:this.positions,edges:this.layoutEdges}),Vt(this.model,this.routing,this.positions,t.edges),this.renderer.renderPorts(this.model),this._present(e,this.options.animate)),this._pruneSelection(),n>=0&&this._emit("explore",{path:[...this._explore.path]})}_historyChanged(t,e){let s=this._historyButtons;s&&(s.undo.disabled=!this._undo.length,s.redo.disabled=!this._redo.length),this._emit("history",{action:t,label:e,canUndo:this._undo.length>0,canRedo:this._redo.length>0,data:this.data})}_paintSelection(){let t=this.renderer;for(let e of t.viewport.querySelectorAll(".fg-selected"))e.classList.remove("fg-selected");for(let e of this._sel.values())(e.kind==="edge"?t.edgeEls:t.nodeEls).get(e.id)?.classList.add("fg-selected");t.world.classList.toggle("fg-multi",this._sel.size>1)}_selectionPayload(){let t=[],e=[];for(let s of this._sel.values())if(s.kind==="node"){let o=this.model?.nodeById.get(s.id)?.data??this._exIndex?.nodeById.get(s.id)??(this.data.nodes||[]).find(n=>String(n.id)===s.id);o&&t.push(o)}else{let o=this.model?.edgeById.get(s.id)?.data;o&&e.push(o)}return{items:this.getSelectedItems(),nodes:t,edges:e}}_contextMenu(t,e){let s=this.options,o,n;if(t.kind==="node"&&this.model?.nodeById.has(t.id)){let i=this.model.nodeById.get(t.id).data,d=this.getConnections(t.id);o={kind:"node",id:t.id,node:i,previous:d.previous,next:d.next,event:e},n=s.onNodeContextMenu&&(()=>s.onNodeContextMenu(i,e,d))}else if(t.kind==="edge"&&this.model?.edgeById.has(t.id)){let i=this.model.edgeById.get(t.id).data;o={kind:"edge",id:t.id,edge:i,event:e},n=s.onEdgeContextMenu&&(()=>s.onEdgeContextMenu(i,e))}else if(t.kind==="group"&&this.model?.groupById.has(t.id)){let i=this.model.groupById.get(t.id).data;o={kind:"group",id:t.id,group:i,event:e},n=s.onGroupContextMenu&&(()=>s.onGroupContextMenu(i,e))}else o={kind:"background",event:e},n=s.onBackgroundContextMenu&&(()=>s.onBackgroundContextMenu(e));o.selection=this.getSelectedItems(),(n||this._listeners.get("contextmenu")?.size)&&e.preventDefault(),n?.(),this._emit("contextmenu",o)}_hover(t){this._hovered=t||null,this._applyHighlight(),this._emit("hover",t?{kind:t.kind,id:t.id}:null)}_applyHighlight(){for(let n of this._hl)n.classList.remove("fg-hl");this._hl=[];let t=this.renderer,e=n=>!!(n.kind==="edge"?this.model?.edgeById:this.model?.nodeById)?.has(n.id),s=null;if(this._hovered&&e(this._hovered)?s=It(this.model.edges,this._hovered,this.options.hoverHighlight):this.options.highlightSelection&&this._sel.size>1?s=qe(this.model.edges,[...this._sel.values()].filter(e)):this.options.highlightSelection&&this.selected&&e(this.selected)&&(s=It(this.model.edges,this.selected,this.options.hoverHighlight)),t.world.classList.toggle("fg-hovering",!!s),!s)return;let o=n=>{n&&(n.classList.add("fg-hl"),this._hl.push(n))};for(let n of s.nodes)o(t.nodeEls.get(n));for(let n of s.edges)o(t.edgeEls.get(n)),o(t.labelEls.get(n))}_controls(){let t=document.createElement("div");t.className="fg-controls";let e=(s,o,n)=>{let i=document.createElement("button");return i.type="button",i.textContent=s,i.title=o,i.setAttribute("aria-label",o),i.addEventListener("click",d=>{d.stopPropagation(),n()}),t.appendChild(i),i};if(e("+","Zoom in",()=>this.zoomBy(1.25)),e("\u2212","Zoom out",()=>this.zoomBy(.8)),e("\u2922","Fit to screen",()=>this.fit()),this.options.history){let s=e("\u21B6","Undo (Ctrl+Z)",()=>this.undo()),o=e("\u21B7","Redo (Ctrl+Shift+Z)",()=>this.redo());s.disabled=o.disabled=!0,s.classList.add("fg-controls__undo"),this._historyButtons={undo:s,redo:o}}this.renderer.viewport.appendChild(t)}},se=(r,t,e)=>Math.max(t,Math.min(e,r)),oe=["direction","edgeRouting"],ns=r=>r==null?null:typeof r=="string"||typeof r=="number"?{kind:"node",id:String(r)}:r.id!=null?{kind:r.kind==="edge"?"edge":"node",id:String(r.id)}:null,Ze=r=>r.map(t=>t.kind+":"+t.id).join("|");function qe(r,t){let e=new Set,s=new Set;for(let n of t)if(n.kind==="node")e.add(n.id);else{let i=r.find(d=>d.id===n.id);i&&(s.add(i.id),e.add(i.source),e.add(i.target))}let o=new Set(t.filter(n=>n.kind==="node").map(n=>n.id));for(let n of r)o.has(n.source)&&o.has(n.target)&&s.add(n.id);return{nodes:e,edges:s}}var We=r=>Math.round(r*10)/10,Ve=r=>Math.round(r*100)/100;function ss(r){let t=r.getBoundingClientRect();return[t.left+t.width/2,t.top+t.height/2]}
|
|
9
9
|
|
|
10
10
|
return module.exports;
|
|
11
11
|
});
|