@tscircuit/eval 0.0.728 → 0.0.730
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/dist/blob-url.js +1 -1
- package/dist/webworker/entrypoint.js +5 -5
- package/package.json +3 -3
|
@@ -313,10 +313,10 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; }
|
|
|
313
313
|
`+filler+` |
|
|
314
314
|
`+offset_s.line+" | "+line2+`
|
|
315
315
|
`+filler+" | "+peg$padEnd("",s2.column-1," ")+peg$padEnd("",hatLen,"^")}else str+=`
|
|
316
|
-
at `+loc}return str};peg$SyntaxError.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s2){return s2.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s2){return s2.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i2,j4;if(descriptions.sort(),descriptions.length>0){for(i2=1,j4=1;i2<descriptions.length;i2++)descriptions[i2-1]!==descriptions[i2]&&(descriptions[j4]=descriptions[i2],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR2(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose2(matrix2,scale2(-1,-1)):matrix2=compose2(matrix2,scale2(1,-1)):flipY2&&(matrix2=compose2(matrix2,scale2(-1,1)));let a2=matrix2.a,b3=matrix2.b,c3=matrix2.c,d3=matrix2.d,scaleX,scaleY,rotation4;if(a2!==0||c3!==0){let hypotAc=Math.hypot(a2,c3);scaleX=hypotAc,scaleY=(a2*d3-b3*c3)/hypotAc;let acos=Math.acos(a2/hypotAc);rotation4=c3>0?-acos:acos}else if(b3!==0||d3!==0){let hypotBd=Math.hypot(b3,d3);scaleX=(a2*d3-b3*c3)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation4=Math.PI/2+(d3>0?-acos:acos)}else scaleX=0,scaleY=0,rotation4=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation4}}}function flipY(){return{a:-1,c:0,e:0,b:0,d:1,f:0}}init_zod();init_zod();var ORIENTATION={CCW:-1,CW:1,NOT_ORIENTABLE:0},PIx2=2*Math.PI,INSIDE$2=1,OUTSIDE$1=0,BOUNDARY$1=2,CONTAINS=3,INTERLACE=4,OVERLAP_SAME$1=1,OVERLAP_OPPOSITE$1=2,NOT_VERTEX$1=0,START_VERTEX$1=1,END_VERTEX$1=2,Constants=Object.freeze({__proto__:null,BOUNDARY:BOUNDARY$1,CCW:!0,CONTAINS,CW:!1,END_VERTEX:END_VERTEX$1,INSIDE:INSIDE$2,INTERLACE,NOT_VERTEX:NOT_VERTEX$1,ORIENTATION,OUTSIDE:OUTSIDE$1,OVERLAP_OPPOSITE:OVERLAP_OPPOSITE$1,OVERLAP_SAME:OVERLAP_SAME$1,PIx2,START_VERTEX:START_VERTEX$1}),DP_TOL=1e-6;function setTolerance(tolerance){DP_TOL=tolerance}function getTolerance(){return DP_TOL}var DECIMALS=3;function EQ_0(x5){return x5<DP_TOL&&x5>-DP_TOL}function EQ(x5,y5){return x5-y5<DP_TOL&&x5-y5>-DP_TOL}function GT(x5,y5){return x5-y5>DP_TOL}function GE(x5,y5){return x5-y5>-DP_TOL}function LT(x5,y5){return x5-y5<-DP_TOL}function LE(x5,y5){return x5-y5<DP_TOL}var Utils$1=Object.freeze({__proto__:null,DECIMALS,EQ,EQ_0,GE,GT,LE,LT,getTolerance,setTolerance}),Flatten={Utils:Utils$1,Errors:void 0,Matrix:void 0,Planar_set:void 0,Point:void 0,Vector:void 0,Line:void 0,Circle:void 0,Segment:void 0,Arc:void 0,Box:void 0,Edge:void 0,Face:void 0,Ray:void 0,Ray_shooting:void 0,Multiline:void 0,Polygon:void 0,Distance:void 0,Inversion:void 0};for(let c3 in Constants)Flatten[c3]=Constants[c3];Object.defineProperty(Flatten,"DP_TOL",{get:function(){return getTolerance()},set:function(value){setTolerance(value)}});var Errors=class{static get ILLEGAL_PARAMETERS(){return new ReferenceError("Illegal Parameters")}static get ZERO_DIVISION(){return new Error("Zero division")}static get UNRESOLVED_BOUNDARY_CONFLICT(){return new Error("Unresolved boundary conflict in boolean operation")}static get INFINITE_LOOP(){return new Error("Infinite loop")}static get CANNOT_COMPLETE_BOOLEAN_OPERATION(){return new Error("Cannot complete boolean operation")}static get CANNOT_INVOKE_ABSTRACT_METHOD(){return new Error("Abstract method cannot be invoked")}static get OPERATION_IS_NOT_SUPPORTED(){return new Error("Operation is not supported")}static get UNSUPPORTED_SHAPE_TYPE(){return new Error("Unsupported shape type")}};Flatten.Errors=Errors;var LinkedList=class{constructor(first,last){this.first=first,this.last=last||this.first}[Symbol.iterator](){let value;return{next:()=>(value=value?value.next:this.first,{value,done:value===void 0})}}get size(){let counter=0;for(let edge of this)counter++;return counter}toArray(start=void 0,end=void 0){let elements=[],from=start||this.first,to3=end||this.last,element=from;if(element===void 0)return elements;do elements.push(element),element=element.next;while(element!==to3.next);return elements}append(element){return this.isEmpty()?this.first=element:(element.prev=this.last,this.last.next=element),this.last=element,this.last.next=void 0,this.first.prev=void 0,this}insert(newElement,elementBefore){if(this.isEmpty())this.first=newElement,this.last=newElement;else if(elementBefore==null)newElement.next=this.first,this.first.prev=newElement,this.first=newElement;else{let elementAfter=elementBefore.next;elementBefore.next=newElement,elementAfter&&(elementAfter.prev=newElement),newElement.prev=elementBefore,newElement.next=elementAfter,this.last===elementBefore&&(this.last=newElement)}return this.last.next=void 0,this.first.prev=void 0,this}remove(element){return element===this.first&&element===this.last?(this.first=void 0,this.last=void 0):(element.prev&&(element.prev.next=element.next),element.next&&(element.next.prev=element.prev),element===this.first&&(this.first=element.next),element===this.last&&(this.last=element.prev)),this}isEmpty(){return this.first===void 0}static testInfiniteLoop(first){let edge=first,controlEdge=first;do{if(edge!=first&&edge===controlEdge)throw Errors.INFINITE_LOOP;edge=edge.next,controlEdge=controlEdge.next.next}while(edge!=first)}},defaultAttributes={stroke:"black"},SVGAttributes=class{constructor(args=defaultAttributes){for(let property in args)this[property]=args[property];this.stroke=args.stroke??defaultAttributes.stroke}toAttributesString(){return Object.keys(this).reduce((acc,key)=>acc+(this[key]!==void 0?this.toAttrString(key,this[key]):""),"")}toAttrString(key,value){let SVGKey=key==="className"?"class":this.convertCamelToKebabCase(key);return value===null?`${SVGKey} `:`${SVGKey}="${value.toString()}" `}convertCamelToKebabCase(str){return str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).join("-").toLowerCase()}};function convertToString(attrs){return new SVGAttributes(attrs).toAttributesString()}function intersectLine2Line(line1,line2){let ip3=[],[A12,B12,C12]=line1.standard,[A22,B22,C22]=line2.standard,det=A12*B22-B12*A22,detX=C12*B22-B12*C22,detY=A12*C22-C12*A22;if(!Flatten.Utils.EQ_0(det)){let x5,y5;B12===0?(x5=C12/A12,y5=detY/det):B22===0?(x5=C22/A22,y5=detY/det):A12===0?(x5=detX/det,y5=C12/B12):A22===0?(x5=detX/det,y5=C22/B22):(x5=detX/det,y5=detY/det),ip3.push(new Flatten.Point(x5,y5))}return ip3}function intersectLine2Circle(line2,circle2){let ip3=[],prj=circle2.pc.projectionOn(line2),dist=circle2.pc.distanceTo(prj)[0];if(Flatten.Utils.EQ(dist,circle2.r))ip3.push(prj);else if(Flatten.Utils.LT(dist,circle2.r)){let delta=Math.sqrt(circle2.r*circle2.r-dist*dist),v_trans,pt4;v_trans=line2.norm.rotate90CCW().multiply(delta),pt4=prj.translate(v_trans),ip3.push(pt4),v_trans=line2.norm.rotate90CW().multiply(delta),pt4=prj.translate(v_trans),ip3.push(pt4)}return ip3}function intersectLine2Box(line2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Line(seg,line2);for(let pt4 of ips_tmp)ptInIntPoints(pt4,ips)||ips.push(pt4)}return ips}function intersectLine2Arc(line2,arc2){let ip3=[];if(intersectLine2Box(line2,arc2.box).length===0)return ip3;let circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectLine2Circle(line2,circle2);for(let pt4 of ip_tmp)pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectSegment2Line(seg,line2){let ip3=[];if(seg.ps.on(line2)&&ip3.push(seg.ps),seg.pe.on(line2)&&!seg.isZeroLength()&&ip3.push(seg.pe),ip3.length>0||seg.isZeroLength()||seg.ps.leftTo(line2)&&seg.pe.leftTo(line2)||!seg.ps.leftTo(line2)&&!seg.pe.leftTo(line2))return ip3;let line1=new Flatten.Line(seg.ps,seg.pe);return intersectLine2Line(line1,line2)}function intersectSegment2Segment(seg1,seg2){let ip3=[];if(seg1.isZeroLength())return seg1.ps.on(seg2)&&ip3.push(seg1.ps),ip3;if(seg2.isZeroLength())return seg2.ps.on(seg1)&&ip3.push(seg2.ps),ip3;let line1=new Flatten.Line(seg1.ps,seg1.pe),line2=new Flatten.Line(seg2.ps,seg2.pe);if(line1.incidentTo(line2))seg1.ps.on(seg2)&&ip3.push(seg1.ps),seg1.pe.on(seg2)&&ip3.push(seg1.pe),seg2.ps.on(seg1)&&!seg2.ps.equalTo(seg1.ps)&&!seg2.ps.equalTo(seg1.pe)&&ip3.push(seg2.ps),seg2.pe.on(seg1)&&!seg2.pe.equalTo(seg1.ps)&&!seg2.pe.equalTo(seg1.pe)&&ip3.push(seg2.pe);else{let new_ip=intersectLine2Line(line1,line2);new_ip.length>0&&isPointInSegmentBox(new_ip[0],seg1)&&isPointInSegmentBox(new_ip[0],seg2)&&ip3.push(new_ip[0])}return ip3}function isPointInSegmentBox(point6,segment2){let box2=segment2.box;return Flatten.Utils.LE(point6.x,box2.xmax)&&Flatten.Utils.GE(point6.x,box2.xmin)&&Flatten.Utils.LE(point6.y,box2.ymax)&&Flatten.Utils.GE(point6.y,box2.ymin)}function intersectSegment2Circle(segment2,circle2){let ips=[];if(segment2.isZeroLength()){let[dist,_5]=segment2.ps.distanceTo(circle2.pc);return Flatten.Utils.EQ(dist,circle2.r)&&ips.push(segment2.ps),ips}let line2=new Flatten.Line(segment2.ps,segment2.pe),ips_tmp=intersectLine2Circle(line2,circle2);for(let ip3 of ips_tmp)ip3.on(segment2)&&ips.push(ip3);return ips}function intersectSegment2Arc(segment2,arc2){let ip3=[];if(segment2.isZeroLength())return segment2.ps.on(arc2)&&ip3.push(segment2.ps),ip3;let line2=new Flatten.Line(segment2.ps,segment2.pe),circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectLine2Circle(line2,circle2);for(let pt4 of ip_tmp)pt4.on(segment2)&&pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectSegment2Box(segment2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Segment(seg,segment2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectCircle2Circle(circle1,circle2){let ip3=[],vec=new Flatten.Vector(circle1.pc,circle2.pc),r12=circle1.r,r22=circle2.r;if(Flatten.Utils.EQ_0(r12)||Flatten.Utils.EQ_0(r22))return ip3;if(Flatten.Utils.EQ_0(vec.x)&&Flatten.Utils.EQ_0(vec.y)&&Flatten.Utils.EQ(r12,r22))return ip3.push(circle1.pc.translate(-r12,0)),ip3;let dist=circle1.pc.distanceTo(circle2.pc)[0];if(Flatten.Utils.GT(dist,r12+r22)||Flatten.Utils.LT(dist,Math.abs(r12-r22)))return ip3;vec.x/=dist,vec.y/=dist;let pt4;if(Flatten.Utils.EQ(dist,r12+r22)||Flatten.Utils.EQ(dist,Math.abs(r12-r22)))return pt4=circle1.pc.translate(r12*vec.x,r12*vec.y),ip3.push(pt4),ip3;let a2=r12*r12/(2*dist)-r22*r22/(2*dist)+dist/2,mid_pt=circle1.pc.translate(a2*vec.x,a2*vec.y),h4=Math.sqrt(r12*r12-a2*a2);return pt4=mid_pt.translate(vec.rotate90CCW().multiply(h4)),ip3.push(pt4),pt4=mid_pt.translate(vec.rotate90CW().multiply(h4)),ip3.push(pt4),ip3}function intersectCircle2Box(circle2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Circle(seg,circle2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectArc2Arc(arc1,arc2){let ip3=[];if(arc1.pc.equalTo(arc2.pc)&&Flatten.Utils.EQ(arc1.r,arc2.r)){let pt4;return pt4=arc1.start,pt4.on(arc2)&&ip3.push(pt4),pt4=arc1.end,pt4.on(arc2)&&ip3.push(pt4),pt4=arc2.start,pt4.on(arc1)&&ip3.push(pt4),pt4=arc2.end,pt4.on(arc1)&&ip3.push(pt4),ip3}let circle1=new Flatten.Circle(arc1.pc,arc1.r),circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=circle1.intersect(circle2);for(let pt4 of ip_tmp)pt4.on(arc1)&&pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectArc2Circle(arc2,circle2){let ip3=[];if(circle2.pc.equalTo(arc2.pc)&&Flatten.Utils.EQ(circle2.r,arc2.r))return ip3.push(arc2.start),ip3.push(arc2.end),ip3;let circle1=circle2,circle22=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectCircle2Circle(circle1,circle22);for(let pt4 of ip_tmp)pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectArc2Box(arc2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Arc(seg,arc2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectEdge2Segment(edge,segment2){return edge.isSegment?intersectSegment2Segment(edge.shape,segment2):intersectSegment2Arc(segment2,edge.shape)}function intersectEdge2Arc(edge,arc2){return edge.isSegment?intersectSegment2Arc(edge.shape,arc2):intersectArc2Arc(edge.shape,arc2)}function intersectEdge2Line(edge,line2){return edge.isSegment?intersectSegment2Line(edge.shape,line2):intersectLine2Arc(line2,edge.shape)}function intersectEdge2Ray(edge,ray2){return edge.isSegment?intersectRay2Segment(ray2,edge.shape):intersectRay2Arc(ray2,edge.shape)}function intersectEdge2Circle(edge,circle2){return edge.isSegment?intersectSegment2Circle(edge.shape,circle2):intersectArc2Circle(edge.shape,circle2)}function intersectSegment2Polygon(segment2,polygon2){let ip3=[];for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Segment(edge,segment2))ip3.push(pt4);return ip3}function intersectArc2Polygon(arc2,polygon2){let ip3=[];for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Arc(edge,arc2))ip3.push(pt4);return ip3}function intersectLine2Polygon(line2,polygon2){let ip3=[];if(polygon2.isEmpty())return ip3;for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Line(edge,line2))ptInIntPoints(pt4,ip3)||ip3.push(pt4);return line2.sortPoints(ip3)}function intersectCircle2Polygon(circle2,polygon2){let ip3=[];if(polygon2.isEmpty())return ip3;for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Circle(edge,circle2))ip3.push(pt4);return ip3}function intersectEdge2Edge(edge1,edge2){return edge1.isSegment?intersectEdge2Segment(edge2,edge1.shape):edge1.isArc?intersectEdge2Arc(edge2,edge1.shape):edge1.isLine?intersectEdge2Line(edge2,edge1.shape):edge1.isRay?intersectEdge2Ray(edge2,edge1.shape):[]}function intersectEdge2Polygon(edge,polygon2){let ip3=[];if(polygon2.isEmpty()||edge.shape.box.not_intersect(polygon2.box))return ip3;let resp_edges=polygon2.edges.search(edge.shape.box);for(let resp_edge of resp_edges)ip3=[...ip3,...intersectEdge2Edge(edge,resp_edge)];return ip3}function intersectMultiline2Polygon(multiline2,polygon2){let ip3=[];if(polygon2.isEmpty()||multiline2.size===0)return ip3;for(let edge of multiline2)ip3=[...ip3,...intersectEdge2Polygon(edge,polygon2)];return ip3}function intersectPolygon2Polygon(polygon1,polygon2){let ip3=[];if(polygon1.isEmpty()||polygon2.isEmpty()||polygon1.box.not_intersect(polygon2.box))return ip3;for(let edge1 of polygon1.edges)ip3=[...ip3,...intersectEdge2Polygon(edge1,polygon2)];return ip3}function intersectShape2Polygon(shape,polygon2){return shape instanceof Flatten.Line?intersectLine2Polygon(shape,polygon2):shape instanceof Flatten.Segment?intersectSegment2Polygon(shape,polygon2):shape instanceof Flatten.Arc?intersectArc2Polygon(shape,polygon2):[]}function ptInIntPoints(new_pt,ip3){return ip3.some(pt4=>pt4.equalTo(new_pt))}function createLineFromRay(ray2){return new Flatten.Line(ray2.start,ray2.norm)}function intersectRay2Segment(ray2,segment2){return intersectSegment2Line(segment2,createLineFromRay(ray2)).filter(pt4=>ray2.contains(pt4))}function intersectRay2Arc(ray2,arc2){return intersectLine2Arc(createLineFromRay(ray2),arc2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Circle(ray2,circle2){return intersectLine2Circle(createLineFromRay(ray2),circle2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Box(ray2,box2){return intersectLine2Box(createLineFromRay(ray2),box2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Line(ray2,line2){return intersectLine2Line(createLineFromRay(ray2),line2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Ray(ray1,ray2){return intersectLine2Line(createLineFromRay(ray1),createLineFromRay(ray2)).filter(pt4=>ray1.contains(pt4)).filter(pt4=>ray2.contains(pt4))}function intersectRay2Polygon(ray2,polygon2){return intersectLine2Polygon(createLineFromRay(ray2),polygon2).filter(pt4=>ray2.contains(pt4))}function intersectShape2Shape(shape1,shape2){if(shape1.intersect&&shape1.intersect instanceof Function)return shape1.intersect(shape2);throw Errors.UNSUPPORTED_SHAPE_TYPE}function intersectShape2Multiline(shape,multiline2){let ip3=[];for(let edge of multiline2)ip3=[...ip3,...intersectShape2Shape(shape,edge.shape)];return ip3}function intersectMultiline2Multiline(multiline1,multiline2){let ip3=[];for(let edge1 of multiline1)for(let edge2 of multiline2)ip3=[...ip3,...intersectShape2Shape(edge1.shape,edge2.shape)];return ip3}var Multiline$1=class Multiline extends LinkedList{constructor(...args){if(super(),this.isInfinite=!1,args.length===1&&args[0]instanceof Array&&args[0].length>0){let shapes=args[0],L4=shapes.length,anyShape=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc||s2 instanceof Flatten.Ray||s2 instanceof Flatten.Line,anyShapeExceptLine=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc||s2 instanceof Flatten.Ray,shapeSegmentOrArc=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc;if(L4===1&&anyShape(shapes[0])||L4>1&&anyShapeExceptLine(shapes[0])&&anyShapeExceptLine(shapes[L4-1])&&shapes.slice(1,L4-1).every(shapeSegmentOrArc)){this.isInfinite=shapes.some(shape=>shape instanceof Flatten.Ray||shape instanceof Flatten.Line);for(let shape of shapes){let edge=new Flatten.Edge(shape);this.append(edge)}this.setArcLength()}else throw Flatten.Errors.ILLEGAL_PARAMETERS}}get edges(){return[...this]}get box(){return this.edges.reduce((acc,edge)=>acc.merge(edge.box),new Flatten.Box)}get vertices(){let v5=this.edges.map(edge=>edge.start);return v5.push(this.last.end),v5}get length(){if(this.isEmpty())return 0;if(this.isInfinite)return Number.POSITIVE_INFINITY;let len=0;for(let edge of this)len+=edge.length;return len}clone(){return new Multiline(this.toShapes())}setArcLength(){for(let edge of this)this.setOneEdgeArcLength(edge)}setOneEdgeArcLength(edge){edge===this.first?edge.arc_length=0:edge.arc_length=edge.prev.arc_length+edge.prev.length}pointAtLength(length3){if(length3>this.length||length3<0||this.isInfinite)return null;let point6=null;for(let edge of this)if(length3>=edge.arc_length&&(edge===this.last||length3<edge.next.arc_length)){point6=edge.pointAtLength(length3-edge.arc_length);break}return point6}addVertex(pt4,edge){let shapes=edge.shape.split(pt4);if(shapes[0]===null)return edge.prev;if(shapes[1]===null)return edge;let newEdge=new Flatten.Edge(shapes[0]),edgeBefore=edge.prev;return this.insert(newEdge,edgeBefore),edge.shape=shapes[1],newEdge}getChain(edgeFrom,edgeTo){let edges=[];for(let edge=edgeFrom;edge!==edgeTo.next;edge=edge.next)edges.push(edge);return edges}split(ip3){for(let pt4 of ip3){let edge=this.findEdgeByPoint(pt4);this.addVertex(pt4,edge)}return this}findEdgeByPoint(pt4){let edgeFound;for(let edge of this)if(edge.shape.contains(pt4)){edgeFound=edge;break}return edgeFound}distanceTo(shape){if(shape instanceof Point){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Line){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Circle){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Segment){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Arc){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Multiline)return Flatten.Distance.multiline2multiline(this,shape);throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}intersect(shape){return shape instanceof Flatten.Multiline?intersectMultiline2Multiline(this,shape):intersectShape2Multiline(shape,this)}contains(shape){if(shape instanceof Flatten.Point)return this.edges.some(edge=>edge.shape.contains(shape));throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}translate(vec){return new Multiline(this.edges.map(edge=>edge.shape.translate(vec)))}rotate(angle=0,center2=new Flatten.Point){return new Multiline(this.edges.map(edge=>edge.shape.rotate(angle,center2)))}transform(matrix2=new Flatten.Matrix){return new Multiline(this.edges.map(edge=>edge.shape.transform(matrix2)))}toShapes(){return this.edges.map(edge=>edge.shape.clone())}toJSON(){return this.edges.map(edge=>edge.toJSON())}svgPoints(){return this.vertices.map(p4=>`${p4.x},${p4.y}`).join(" ")}dpath(){let dPathStr=`M${this.first.start.x},${this.first.start.y}`;for(let edge of this)dPathStr+=edge.svg();return dPathStr}svg(attrs={}){let svgStr=`
|
|
316
|
+
at `+loc}return str};peg$SyntaxError.buildMessage=function(expected,found){var DESCRIBE_EXPECTATION_FNS={literal:function(expectation){return'"'+literalEscape(expectation.text)+'"'},class:function(expectation){var escapedParts=expectation.parts.map(function(part){return Array.isArray(part)?classEscape(part[0])+"-"+classEscape(part[1]):classEscape(part)});return"["+(expectation.inverted?"^":"")+escapedParts.join("")+"]"},any:function(){return"any character"},end:function(){return"end of input"},other:function(expectation){return expectation.description}};function hex(ch3){return ch3.charCodeAt(0).toString(16).toUpperCase()}function literalEscape(s2){return s2.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function classEscape(s2){return s2.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,function(ch3){return"\\x0"+hex(ch3)}).replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch3){return"\\x"+hex(ch3)})}function describeExpectation(expectation){return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)}function describeExpected(expected2){var descriptions=expected2.map(describeExpectation),i2,j4;if(descriptions.sort(),descriptions.length>0){for(i2=1,j4=1;i2<descriptions.length;i2++)descriptions[i2-1]!==descriptions[i2]&&(descriptions[j4]=descriptions[i2],j4++);descriptions.length=j4}switch(descriptions.length){case 1:return descriptions[0];case 2:return descriptions[0]+" or "+descriptions[1];default:return descriptions.slice(0,-1).join(", ")+", or "+descriptions[descriptions.length-1]}}function describeFound(found2){return found2?'"'+literalEscape(found2)+'"':"end of input"}return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found."};function decomposeTSR2(matrix2,flipX=!1,flipY2=!1){flipX?flipY2?matrix2=compose2(matrix2,scale2(-1,-1)):matrix2=compose2(matrix2,scale2(1,-1)):flipY2&&(matrix2=compose2(matrix2,scale2(-1,1)));let a2=matrix2.a,b3=matrix2.b,c3=matrix2.c,d3=matrix2.d,scaleX,scaleY,rotation4;if(a2!==0||c3!==0){let hypotAc=Math.hypot(a2,c3);scaleX=hypotAc,scaleY=(a2*d3-b3*c3)/hypotAc;let acos=Math.acos(a2/hypotAc);rotation4=c3>0?-acos:acos}else if(b3!==0||d3!==0){let hypotBd=Math.hypot(b3,d3);scaleX=(a2*d3-b3*c3)/hypotBd,scaleY=hypotBd;let acos=Math.acos(b3/hypotBd);rotation4=Math.PI/2+(d3>0?-acos:acos)}else scaleX=0,scaleY=0,rotation4=0;return flipY2&&(scaleX=-scaleX),flipX&&(scaleY=-scaleY),{translate:{tx:matrix2.e,ty:matrix2.f},scale:{sx:scaleX,sy:scaleY},rotation:{angle:rotation4}}}function flipY(){return{a:-1,c:0,e:0,b:0,d:1,f:0}}init_zod();init_zod();var ORIENTATION={CCW:-1,CW:1,NOT_ORIENTABLE:0},PIx2=2*Math.PI,INSIDE$2=1,OUTSIDE$1=0,BOUNDARY$1=2,CONTAINS=3,INTERLACE=4,OVERLAP_SAME$1=1,OVERLAP_OPPOSITE$1=2,NOT_VERTEX$1=0,START_VERTEX$1=1,END_VERTEX$1=2,Constants=Object.freeze({__proto__:null,BOUNDARY:BOUNDARY$1,CCW:!0,CONTAINS,CW:!1,END_VERTEX:END_VERTEX$1,INSIDE:INSIDE$2,INTERLACE,NOT_VERTEX:NOT_VERTEX$1,ORIENTATION,OUTSIDE:OUTSIDE$1,OVERLAP_OPPOSITE:OVERLAP_OPPOSITE$1,OVERLAP_SAME:OVERLAP_SAME$1,PIx2,START_VERTEX:START_VERTEX$1}),DP_TOL=1e-6;function setTolerance(tolerance){DP_TOL=tolerance}function getTolerance(){return DP_TOL}var DECIMALS=3;function EQ_0(x5){return x5<DP_TOL&&x5>-DP_TOL}function EQ(x5,y5){return x5-y5<DP_TOL&&x5-y5>-DP_TOL}function GT(x5,y5){return x5-y5>DP_TOL}function GE(x5,y5){return x5-y5>-DP_TOL}function LT(x5,y5){return x5-y5<-DP_TOL}function LE(x5,y5){return x5-y5<DP_TOL}var Utils$1=Object.freeze({__proto__:null,DECIMALS,EQ,EQ_0,GE,GT,LE,LT,getTolerance,setTolerance}),Flatten={Utils:Utils$1,Errors:void 0,Matrix:void 0,Planar_set:void 0,Point:void 0,Vector:void 0,Line:void 0,Circle:void 0,Segment:void 0,Arc:void 0,Box:void 0,Edge:void 0,Face:void 0,Ray:void 0,Ray_shooting:void 0,Multiline:void 0,Polygon:void 0,Distance:void 0,Inversion:void 0};for(let c3 in Constants)Flatten[c3]=Constants[c3];Object.defineProperty(Flatten,"DP_TOL",{get:function(){return getTolerance()},set:function(value){setTolerance(value)}});var Errors=class{static get ILLEGAL_PARAMETERS(){return new ReferenceError("Illegal Parameters")}static get ZERO_DIVISION(){return new Error("Zero division")}static get UNRESOLVED_BOUNDARY_CONFLICT(){return new Error("Unresolved boundary conflict in boolean operation")}static get INFINITE_LOOP(){return new Error("Infinite loop")}static get CANNOT_COMPLETE_BOOLEAN_OPERATION(){return new Error("Cannot complete boolean operation")}static get CANNOT_INVOKE_ABSTRACT_METHOD(){return new Error("Abstract method cannot be invoked")}static get OPERATION_IS_NOT_SUPPORTED(){return new Error("Operation is not supported")}static get UNSUPPORTED_SHAPE_TYPE(){return new Error("Unsupported shape type")}};Flatten.Errors=Errors;var LinkedList=class{constructor(first,last){this.first=first,this.last=last||this.first}[Symbol.iterator](){let value;return{next:()=>(value=value?value.next:this.first,{value,done:value===void 0})}}get size(){let counter=0;for(let edge of this)counter++;return counter}toArray(start=void 0,end=void 0){let elements=[],from=start||this.first,to3=end||this.last,element=from;if(element===void 0)return elements;do elements.push(element),element=element.next;while(element!==to3.next);return elements}append(element){return this.isEmpty()?this.first=element:(element.prev=this.last,this.last.next=element),this.last=element,this.last.next=void 0,this.first.prev=void 0,this}insert(newElement,elementBefore){if(this.isEmpty())this.first=newElement,this.last=newElement;else if(elementBefore==null)newElement.next=this.first,this.first.prev=newElement,this.first=newElement;else{let elementAfter=elementBefore.next;elementBefore.next=newElement,elementAfter&&(elementAfter.prev=newElement),newElement.prev=elementBefore,newElement.next=elementAfter,this.last===elementBefore&&(this.last=newElement)}return this.last.next=void 0,this.first.prev=void 0,this}remove(element){return element===this.first&&element===this.last?(this.first=void 0,this.last=void 0):(element.prev&&(element.prev.next=element.next),element.next&&(element.next.prev=element.prev),element===this.first&&(this.first=element.next),element===this.last&&(this.last=element.prev)),this}isEmpty(){return this.first===void 0}static testInfiniteLoop(first){let edge=first,controlEdge=first;do{if(edge!=first&&edge===controlEdge)throw Errors.INFINITE_LOOP;edge=edge.next,controlEdge=controlEdge.next.next}while(edge!=first)}},defaultAttributes={stroke:"black"},SVGAttributes=class{constructor(args=defaultAttributes){for(let property in args)this[property]=args[property];this.stroke=args.stroke??defaultAttributes.stroke}toAttributesString(){return Object.keys(this).reduce((acc,key)=>acc+(this[key]!==void 0?this.toAttrString(key,this[key]):""),"")}toAttrString(key,value){let SVGKey=key==="className"?"class":this.convertCamelToKebabCase(key);return value===null?`${SVGKey} `:`${SVGKey}="${value.toString()}" `}convertCamelToKebabCase(str){return str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).join("-").toLowerCase()}};function convertToString(attrs){return new SVGAttributes(attrs).toAttributesString()}function intersectLine2Line(line1,line2){let ip3=[],[A12,B12,C12]=line1.standard,[A22,B22,C22]=line2.standard,det=A12*B22-B12*A22,detX=C12*B22-B12*C22,detY=A12*C22-C12*A22;if(!Flatten.Utils.EQ_0(det)){let x5,y5;B12===0?(x5=C12/A12,y5=detY/det):B22===0?(x5=C22/A22,y5=detY/det):A12===0?(x5=detX/det,y5=C12/B12):A22===0?(x5=detX/det,y5=C22/B22):(x5=detX/det,y5=detY/det),ip3.push(new Flatten.Point(x5,y5))}return ip3}function intersectLine2Circle(line2,circle2){let ip3=[],prj=circle2.pc.projectionOn(line2),dist=circle2.pc.distanceTo(prj)[0];if(Flatten.Utils.EQ(dist,circle2.r))ip3.push(prj);else if(Flatten.Utils.LT(dist,circle2.r)){let delta=Math.sqrt(circle2.r*circle2.r-dist*dist),v_trans,pt4;v_trans=line2.norm.rotate90CCW().multiply(delta),pt4=prj.translate(v_trans),ip3.push(pt4),v_trans=line2.norm.rotate90CW().multiply(delta),pt4=prj.translate(v_trans),ip3.push(pt4)}return ip3}function intersectLine2Box(line2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Line(seg,line2);for(let pt4 of ips_tmp)ptInIntPoints(pt4,ips)||ips.push(pt4)}return ips}function intersectLine2Arc(line2,arc2){let ip3=[];if(intersectLine2Box(line2,arc2.box).length===0)return ip3;let circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectLine2Circle(line2,circle2);for(let pt4 of ip_tmp)pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectSegment2Line(seg,line2){let ip3=[];if(seg.ps.on(line2)&&ip3.push(seg.ps),seg.pe.on(line2)&&!seg.isZeroLength()&&ip3.push(seg.pe),ip3.length>0||seg.isZeroLength()||seg.ps.leftTo(line2)&&seg.pe.leftTo(line2)||!seg.ps.leftTo(line2)&&!seg.pe.leftTo(line2))return ip3;let line1=new Flatten.Line(seg.ps,seg.pe);return intersectLine2Line(line1,line2)}function intersectSegment2Segment(seg1,seg2){let ip3=[];if(seg1.isZeroLength())return seg1.ps.on(seg2)&&ip3.push(seg1.ps),ip3;if(seg2.isZeroLength())return seg2.ps.on(seg1)&&ip3.push(seg2.ps),ip3;let line1=new Flatten.Line(seg1.ps,seg1.pe),line2=new Flatten.Line(seg2.ps,seg2.pe);if(line1.incidentTo(line2))seg1.ps.on(seg2)&&ip3.push(seg1.ps),seg1.pe.on(seg2)&&ip3.push(seg1.pe),seg2.ps.on(seg1)&&!seg2.ps.equalTo(seg1.ps)&&!seg2.ps.equalTo(seg1.pe)&&ip3.push(seg2.ps),seg2.pe.on(seg1)&&!seg2.pe.equalTo(seg1.ps)&&!seg2.pe.equalTo(seg1.pe)&&ip3.push(seg2.pe);else if(line1.parallelTo(line2)){let r4=new Flatten.Vector(seg1.ps,seg1.pe),s2=new Flatten.Vector(seg2.ps,seg2.pe),q_p=new Flatten.Vector(seg1.ps,seg2.ps),r_cross_s=r4.cross(s2);if(!Flatten.Utils.EQ_0(r_cross_s)){let t35=q_p.cross(s2)/r_cross_s,u4=q_p.cross(r4)/r_cross_s;Flatten.Utils.GE(t35,0)&&Flatten.Utils.LE(t35,1)&&Flatten.Utils.GE(u4,0)&&Flatten.Utils.LE(u4,1)&&ip3.push(snapToSegmentEndpoints(seg1.ps.translate(r4.multiply(t35)),seg1,seg2))}}else{let new_ip=intersectLine2Line(line1,line2);new_ip.length>0&&isPointInSegmentBox(new_ip[0],seg1)&&isPointInSegmentBox(new_ip[0],seg2)&&ip3.push(snapToSegmentEndpoints(new_ip[0],seg1,seg2))}return ip3}function snapToSegmentEndpoints(pt4,seg1,seg2){for(let endpoint of[seg1.ps,seg1.pe,seg2.ps,seg2.pe])if(pt4.equalTo(endpoint))return endpoint;return pt4}function isPointInSegmentBox(point6,segment2){let box2=segment2.box;return Flatten.Utils.LE(point6.x,box2.xmax)&&Flatten.Utils.GE(point6.x,box2.xmin)&&Flatten.Utils.LE(point6.y,box2.ymax)&&Flatten.Utils.GE(point6.y,box2.ymin)}function intersectSegment2Circle(segment2,circle2){let ips=[];if(segment2.isZeroLength()){let[dist,_5]=segment2.ps.distanceTo(circle2.pc);return Flatten.Utils.EQ(dist,circle2.r)&&ips.push(segment2.ps),ips}let line2=new Flatten.Line(segment2.ps,segment2.pe),ips_tmp=intersectLine2Circle(line2,circle2);for(let ip3 of ips_tmp)ip3.on(segment2)&&ips.push(ip3);return ips}function intersectSegment2Arc(segment2,arc2){let ip3=[];if(segment2.isZeroLength())return segment2.ps.on(arc2)&&ip3.push(segment2.ps),ip3;let line2=new Flatten.Line(segment2.ps,segment2.pe),circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectLine2Circle(line2,circle2);for(let pt4 of ip_tmp)pt4.on(segment2)&&pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectSegment2Box(segment2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Segment(seg,segment2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectCircle2Circle(circle1,circle2){let ip3=[],vec=new Flatten.Vector(circle1.pc,circle2.pc),r12=circle1.r,r22=circle2.r;if(Flatten.Utils.EQ_0(r12)||Flatten.Utils.EQ_0(r22))return ip3;if(Flatten.Utils.EQ_0(vec.x)&&Flatten.Utils.EQ_0(vec.y)&&Flatten.Utils.EQ(r12,r22))return ip3.push(circle1.pc.translate(-r12,0)),ip3;let dist=circle1.pc.distanceTo(circle2.pc)[0];if(Flatten.Utils.GT(dist,r12+r22)||Flatten.Utils.LT(dist,Math.abs(r12-r22)))return ip3;vec.x/=dist,vec.y/=dist;let pt4;if(Flatten.Utils.EQ(dist,r12+r22)||Flatten.Utils.EQ(dist,Math.abs(r12-r22)))return pt4=circle1.pc.translate(r12*vec.x,r12*vec.y),ip3.push(pt4),ip3;let a2=r12*r12/(2*dist)-r22*r22/(2*dist)+dist/2,mid_pt=circle1.pc.translate(a2*vec.x,a2*vec.y),h4=Math.sqrt(r12*r12-a2*a2);return pt4=mid_pt.translate(vec.rotate90CCW().multiply(h4)),ip3.push(pt4),pt4=mid_pt.translate(vec.rotate90CW().multiply(h4)),ip3.push(pt4),ip3}function intersectCircle2Box(circle2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Circle(seg,circle2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectArc2Arc(arc1,arc2){let ip3=[];if(arc1.pc.equalTo(arc2.pc)&&Flatten.Utils.EQ(arc1.r,arc2.r)){let pt4;return pt4=arc1.start,pt4.on(arc2)&&ip3.push(pt4),pt4=arc1.end,pt4.on(arc2)&&ip3.push(pt4),pt4=arc2.start,pt4.on(arc1)&&ip3.push(pt4),pt4=arc2.end,pt4.on(arc1)&&ip3.push(pt4),ip3}let circle1=new Flatten.Circle(arc1.pc,arc1.r),circle2=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=circle1.intersect(circle2);for(let pt4 of ip_tmp)pt4.on(arc1)&&pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectArc2Circle(arc2,circle2){let ip3=[];if(circle2.pc.equalTo(arc2.pc)&&Flatten.Utils.EQ(circle2.r,arc2.r))return ip3.push(arc2.start),ip3.push(arc2.end),ip3;let circle1=circle2,circle22=new Flatten.Circle(arc2.pc,arc2.r),ip_tmp=intersectCircle2Circle(circle1,circle22);for(let pt4 of ip_tmp)pt4.on(arc2)&&ip3.push(pt4);return ip3}function intersectArc2Box(arc2,box2){let ips=[];for(let seg of box2.toSegments()){let ips_tmp=intersectSegment2Arc(seg,arc2);for(let ip3 of ips_tmp)ips.push(ip3)}return ips}function intersectEdge2Segment(edge,segment2){return edge.isSegment?intersectSegment2Segment(edge.shape,segment2):intersectSegment2Arc(segment2,edge.shape)}function intersectEdge2Arc(edge,arc2){return edge.isSegment?intersectSegment2Arc(edge.shape,arc2):intersectArc2Arc(edge.shape,arc2)}function intersectEdge2Line(edge,line2){return edge.isSegment?intersectSegment2Line(edge.shape,line2):intersectLine2Arc(line2,edge.shape)}function intersectEdge2Ray(edge,ray2){return edge.isSegment?intersectRay2Segment(ray2,edge.shape):intersectRay2Arc(ray2,edge.shape)}function intersectEdge2Circle(edge,circle2){return edge.isSegment?intersectSegment2Circle(edge.shape,circle2):intersectArc2Circle(edge.shape,circle2)}function intersectSegment2Polygon(segment2,polygon2){let ip3=[];for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Segment(edge,segment2))ip3.push(pt4);return ip3}function intersectArc2Polygon(arc2,polygon2){let ip3=[];for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Arc(edge,arc2))ip3.push(pt4);return ip3}function intersectLine2Polygon(line2,polygon2){let ip3=[];if(polygon2.isEmpty())return ip3;for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Line(edge,line2))ptInIntPoints(pt4,ip3)||ip3.push(pt4);return line2.sortPoints(ip3)}function intersectCircle2Polygon(circle2,polygon2){let ip3=[];if(polygon2.isEmpty())return ip3;for(let edge of polygon2.edges)for(let pt4 of intersectEdge2Circle(edge,circle2))ip3.push(pt4);return ip3}function intersectEdge2Edge(edge1,edge2){return edge1.isSegment?intersectEdge2Segment(edge2,edge1.shape):edge1.isArc?intersectEdge2Arc(edge2,edge1.shape):edge1.isLine?intersectEdge2Line(edge2,edge1.shape):edge1.isRay?intersectEdge2Ray(edge2,edge1.shape):[]}function intersectEdge2Polygon(edge,polygon2){let ip3=[];if(polygon2.isEmpty()||edge.shape.box.not_intersect(polygon2.box))return ip3;let resp_edges=polygon2.edges.search(edge.shape.box);for(let resp_edge of resp_edges)ip3=[...ip3,...intersectEdge2Edge(edge,resp_edge)];return ip3}function intersectMultiline2Polygon(multiline2,polygon2){let ip3=[];if(polygon2.isEmpty()||multiline2.size===0)return ip3;for(let edge of multiline2)ip3=[...ip3,...intersectEdge2Polygon(edge,polygon2)];return ip3}function intersectPolygon2Polygon(polygon1,polygon2){let ip3=[];if(polygon1.isEmpty()||polygon2.isEmpty()||polygon1.box.not_intersect(polygon2.box))return ip3;for(let edge1 of polygon1.edges)ip3=[...ip3,...intersectEdge2Polygon(edge1,polygon2)];return ip3}function intersectShape2Polygon(shape,polygon2){return shape instanceof Flatten.Line?intersectLine2Polygon(shape,polygon2):shape instanceof Flatten.Segment?intersectSegment2Polygon(shape,polygon2):shape instanceof Flatten.Arc?intersectArc2Polygon(shape,polygon2):[]}function ptInIntPoints(new_pt,ip3){return ip3.some(pt4=>pt4.equalTo(new_pt))}function createLineFromRay(ray2){return new Flatten.Line(ray2.start,ray2.norm)}function intersectRay2Segment(ray2,segment2){return intersectSegment2Line(segment2,createLineFromRay(ray2)).filter(pt4=>ray2.contains(pt4))}function intersectRay2Arc(ray2,arc2){return intersectLine2Arc(createLineFromRay(ray2),arc2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Circle(ray2,circle2){return intersectLine2Circle(createLineFromRay(ray2),circle2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Box(ray2,box2){return intersectLine2Box(createLineFromRay(ray2),box2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Line(ray2,line2){return intersectLine2Line(createLineFromRay(ray2),line2).filter(pt4=>ray2.contains(pt4))}function intersectRay2Ray(ray1,ray2){return intersectLine2Line(createLineFromRay(ray1),createLineFromRay(ray2)).filter(pt4=>ray1.contains(pt4)).filter(pt4=>ray2.contains(pt4))}function intersectRay2Polygon(ray2,polygon2){return intersectLine2Polygon(createLineFromRay(ray2),polygon2).filter(pt4=>ray2.contains(pt4))}function intersectShape2Shape(shape1,shape2){if(shape1.intersect&&shape1.intersect instanceof Function)return shape1.intersect(shape2);throw Errors.UNSUPPORTED_SHAPE_TYPE}function intersectShape2Multiline(shape,multiline2){let ip3=[];for(let edge of multiline2)ip3=[...ip3,...intersectShape2Shape(shape,edge.shape)];return ip3}function intersectMultiline2Multiline(multiline1,multiline2){let ip3=[];for(let edge1 of multiline1)for(let edge2 of multiline2)ip3=[...ip3,...intersectShape2Shape(edge1.shape,edge2.shape)];return ip3}var Multiline$1=class Multiline extends LinkedList{constructor(...args){if(super(),this.isInfinite=!1,args.length===1&&args[0]instanceof Array&&args[0].length>0){let shapes=args[0],L4=shapes.length,anyShape=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc||s2 instanceof Flatten.Ray||s2 instanceof Flatten.Line,anyShapeExceptLine=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc||s2 instanceof Flatten.Ray,shapeSegmentOrArc=s2=>s2 instanceof Flatten.Segment||s2 instanceof Flatten.Arc;if(L4===1&&anyShape(shapes[0])||L4>1&&anyShapeExceptLine(shapes[0])&&anyShapeExceptLine(shapes[L4-1])&&shapes.slice(1,L4-1).every(shapeSegmentOrArc)){this.isInfinite=shapes.some(shape=>shape instanceof Flatten.Ray||shape instanceof Flatten.Line);for(let shape of shapes){let edge=new Flatten.Edge(shape);this.append(edge)}this.setArcLength()}else throw Flatten.Errors.ILLEGAL_PARAMETERS}}get edges(){return[...this]}get box(){return this.edges.reduce((acc,edge)=>acc.merge(edge.box),new Flatten.Box)}get vertices(){let v5=this.edges.map(edge=>edge.start);return v5.push(this.last.end),v5}get length(){if(this.isEmpty())return 0;if(this.isInfinite)return Number.POSITIVE_INFINITY;let len=0;for(let edge of this)len+=edge.length;return len}clone(){return new Multiline(this.toShapes())}setArcLength(){for(let edge of this)this.setOneEdgeArcLength(edge)}setOneEdgeArcLength(edge){edge===this.first?edge.arc_length=0:edge.arc_length=edge.prev.arc_length+edge.prev.length}pointAtLength(length3){if(length3>this.length||length3<0||this.isInfinite)return null;let point6=null;for(let edge of this)if(length3>=edge.arc_length&&(edge===this.last||length3<edge.next.arc_length)){point6=edge.pointAtLength(length3-edge.arc_length);break}return point6}addVertex(pt4,edge){let shapes=edge.shape.split(pt4);if(shapes[0]===null)return edge.prev;if(shapes[1]===null)return edge;let newEdge=new Flatten.Edge(shapes[0]),edgeBefore=edge.prev;return this.insert(newEdge,edgeBefore),edge.shape=shapes[1],newEdge}getChain(edgeFrom,edgeTo){let edges=[];for(let edge=edgeFrom;edge!==edgeTo.next;edge=edge.next)edges.push(edge);return edges}split(ip3){for(let pt4 of ip3){let edge=this.findEdgeByPoint(pt4);this.addVertex(pt4,edge)}return this}findEdgeByPoint(pt4){let edgeFound;for(let edge of this)if(edge.shape.contains(pt4)){edgeFound=edge;break}return edgeFound}distanceTo(shape){if(shape instanceof Point){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Line){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Circle){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Segment){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Arc){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(shape,this);return[dist,shortest_segment.reverse()]}if(shape instanceof Flatten.Multiline)return Flatten.Distance.multiline2multiline(this,shape);throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}intersect(shape){return shape instanceof Flatten.Multiline?intersectMultiline2Multiline(this,shape):intersectShape2Multiline(shape,this)}contains(shape){if(shape instanceof Flatten.Point)return this.edges.some(edge=>edge.shape.contains(shape));throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}translate(vec){return new Multiline(this.edges.map(edge=>edge.shape.translate(vec)))}rotate(angle=0,center2=new Flatten.Point){return new Multiline(this.edges.map(edge=>edge.shape.rotate(angle,center2)))}transform(matrix2=new Flatten.Matrix){return new Multiline(this.edges.map(edge=>edge.shape.transform(matrix2)))}toShapes(){return this.edges.map(edge=>edge.shape.clone())}toJSON(){return this.edges.map(edge=>edge.toJSON())}svgPoints(){return this.vertices.map(p4=>`${p4.x},${p4.y}`).join(" ")}dpath(){let dPathStr=`M${this.first.start.x},${this.first.start.y}`;for(let edge of this)dPathStr+=edge.svg();return dPathStr}svg(attrs={}){let svgStr=`
|
|
317
317
|
<path ${convertToString({fill:"none",...attrs})} d="`;svgStr+=`
|
|
318
318
|
M${this.first.start.x},${this.first.start.y}`;for(let edge of this)svgStr+=edge.svg();return svgStr+=`" >
|
|
319
|
-
</path>`,svgStr}};Flatten.Multiline=Multiline$1;var multiline=(...args)=>new Flatten.Multiline(...args);Flatten.multiline=multiline;function addToIntPoints(edge,pt4,int_points){let id2=int_points.length,shapes=edge.shape.split(pt4);if(shapes.length===0)return;let len=0;shapes[0]===null?len=0:shapes[1]===null?len=edge.shape.length:len=shapes[0].length;let is_vertex=NOT_VERTEX$1;EQ(len,0)&&(is_vertex|=START_VERTEX$1),EQ(len,edge.shape.length)&&(is_vertex|=END_VERTEX$1);let arc_length;len===1/0?arc_length=shapes[0].coord(pt4):arc_length=is_vertex&END_VERTEX$1&&edge.next&&edge.next.arc_length===0?0:edge.arc_length+len,int_points.push({id:id2,pt:pt4,arc_length,edge_before:edge,edge_after:void 0,face:edge.face,is_vertex})}function sortIntersections(intersections){intersections.int_points1_sorted=getSortedArray(intersections.int_points1),intersections.int_points2_sorted=getSortedArray(intersections.int_points2)}function getSortedArray(int_points){let faceMap=new Map,id2=0;for(let ip3 of int_points)faceMap.has(ip3.face)||(faceMap.set(ip3.face,id2),id2++);for(let ip3 of int_points)ip3.faceId=faceMap.get(ip3.face);return int_points.slice().sort(compareFn)}function compareFn(ip1,ip22){return ip1.faceId<ip22.faceId?-1:ip1.faceId>ip22.faceId?1:ip1.arc_length<ip22.arc_length?-1:ip1.arc_length>ip22.arc_length?1:0}function filterDuplicatedIntersections(intersections){if(intersections.int_points1.length<2)return;let do_squeeze=!1,int_point_ref1,int_point_ref2,int_point_cur1,int_point_cur2;for(let i2=0;i2<intersections.int_points1_sorted.length;i2++)if(intersections.int_points1_sorted[i2].id!==-1){int_point_ref1=intersections.int_points1_sorted[i2],int_point_ref2=intersections.int_points2[int_point_ref1.id];for(let j4=i2+1;j4<intersections.int_points1_sorted.length&&(int_point_cur1=intersections.int_points1_sorted[j4],!!EQ(int_point_cur1.arc_length,int_point_ref1.arc_length));j4++)int_point_cur1.id!==-1&&(int_point_cur2=intersections.int_points2[int_point_cur1.id],int_point_cur2.id!==-1&&int_point_cur1.edge_before===int_point_ref1.edge_before&&int_point_cur1.edge_after===int_point_ref1.edge_after&&int_point_cur2.edge_before===int_point_ref2.edge_before&&int_point_cur2.edge_after===int_point_ref2.edge_after&&(int_point_cur1.id=-1,int_point_cur2.id=-1,do_squeeze=!0))}int_point_ref2=intersections.int_points2_sorted[0],int_point_ref1=intersections.int_points1[int_point_ref2.id];for(let i2=1;i2<intersections.int_points2_sorted.length;i2++){let int_point_cur22=intersections.int_points2_sorted[i2];if(int_point_cur22.id===-1)continue;if(int_point_ref2.id===-1||!EQ(int_point_cur22.arc_length,int_point_ref2.arc_length)){int_point_ref2=int_point_cur22,int_point_ref1=intersections.int_points1[int_point_ref2.id];continue}let int_point_cur12=intersections.int_points1[int_point_cur22.id];int_point_cur12.edge_before===int_point_ref1.edge_before&&int_point_cur12.edge_after===int_point_ref1.edge_after&&int_point_cur22.edge_before===int_point_ref2.edge_before&&int_point_cur22.edge_after===int_point_ref2.edge_after&&(int_point_cur12.id=-1,int_point_cur22.id=-1,do_squeeze=!0)}do_squeeze&&(intersections.int_points1=intersections.int_points1.filter(int_point=>int_point.id>=0),intersections.int_points2=intersections.int_points2.filter(int_point=>int_point.id>=0),intersections.int_points1.forEach((int_point,index)=>int_point.id=index),intersections.int_points2.forEach((int_point,index)=>int_point.id=index))}function initializeInclusionFlags(int_points){for(let int_point of int_points)int_point.edge_before&&(int_point.edge_before.bvStart=void 0,int_point.edge_before.bvEnd=void 0,int_point.edge_before.bv=void 0,int_point.edge_before.overlap=void 0),int_point.edge_after&&(int_point.edge_after.bvStart=void 0,int_point.edge_after.bvEnd=void 0,int_point.edge_after.bv=void 0,int_point.edge_after.overlap=void 0);for(let int_point of int_points)int_point.edge_before&&(int_point.edge_before.bvEnd=BOUNDARY$1),int_point.edge_after&&(int_point.edge_after.bvStart=BOUNDARY$1)}function calculateInclusionFlags(int_points,polygon2){for(let int_point of int_points)int_point.edge_before&&int_point.edge_before.setInclusion(polygon2),int_point.edge_after&&int_point.edge_after.setInclusion(polygon2)}function setOverlappingFlags(intersections){let cur_face,first_int_point_in_face_id,next_int_point1,num_int_points=intersections.int_points1.length;for(let i2=0;i2<num_int_points;i2++){let cur_int_point1=intersections.int_points1_sorted[i2];cur_int_point1.face!==cur_face&&(first_int_point_in_face_id=i2,cur_face=cur_int_point1.face);let int_points_cur_pool_start=i2,int_points_cur_pool_num=intPointsPoolCount(intersections.int_points1_sorted,i2,cur_face),next_int_point_id;int_points_cur_pool_start+int_points_cur_pool_num<num_int_points&&intersections.int_points1_sorted[int_points_cur_pool_start+int_points_cur_pool_num].face===cur_face?next_int_point_id=int_points_cur_pool_start+int_points_cur_pool_num:next_int_point_id=first_int_point_in_face_id;let int_points_next_pool_num=intPointsPoolCount(intersections.int_points1_sorted,next_int_point_id,cur_face);next_int_point1=null;for(let j4=next_int_point_id;j4<next_int_point_id+int_points_next_pool_num;j4++){let next_int_point1_tmp=intersections.int_points1_sorted[j4];if(next_int_point1_tmp.face===cur_face&&intersections.int_points2[next_int_point1_tmp.id].face===intersections.int_points2[cur_int_point1.id].face){next_int_point1=next_int_point1_tmp;break}}if(next_int_point1===null)continue;let edge_from1=cur_int_point1.edge_after,edge_to1=next_int_point1.edge_before;if(!(edge_from1.bv===BOUNDARY$1&&edge_to1.bv===BOUNDARY$1)||edge_from1!==edge_to1)continue;let cur_int_point2=intersections.int_points2[cur_int_point1.id],next_int_point2=intersections.int_points2[next_int_point1.id],edge_from2=cur_int_point2.edge_after,edge_to2=next_int_point2.edge_before;edge_from2.bv===BOUNDARY$1&&edge_to2.bv===BOUNDARY$1&&edge_from2===edge_to2||(cur_int_point2=intersections.int_points2[next_int_point1.id],next_int_point2=intersections.int_points2[cur_int_point1.id],edge_from2=cur_int_point2.edge_after,edge_to2=next_int_point2.edge_before),edge_from2.bv===BOUNDARY$1&&edge_to2.bv===BOUNDARY$1&&edge_from2===edge_to2&&edge_from1.setOverlap(edge_from2)}}function intPointsPoolCount(int_points,cur_int_point_num,cur_face){let int_point_current,int_point_next,int_points_pool_num=1;if(int_points.length===1)return 1;int_point_current=int_points[cur_int_point_num];for(let i2=cur_int_point_num+1;i2<int_points.length&&!(int_point_current.face!==cur_face||(int_point_next=int_points[i2],!(int_point_next.pt.equalTo(int_point_current.pt)&&int_point_next.edge_before===int_point_current.edge_before&&int_point_next.edge_after===int_point_current.edge_after)));i2++)int_points_pool_num++;return int_points_pool_num}function splitByIntersections(polygon2,int_points){if(int_points){for(let int_point of int_points){let edge=int_point.edge_before;if(int_point.is_vertex=NOT_VERTEX$1,edge.shape.start&&edge.shape.start.equalTo(int_point.pt)&&(int_point.is_vertex|=START_VERTEX$1),edge.shape.end&&edge.shape.end.equalTo(int_point.pt)&&(int_point.is_vertex|=END_VERTEX$1),int_point.is_vertex&START_VERTEX$1){int_point.edge_before=edge.prev,edge.prev&&(int_point.is_vertex=END_VERTEX$1);continue}if(int_point.is_vertex&END_VERTEX$1)continue;let newEdge=polygon2.addVertex(int_point.pt,edge);int_point.edge_before=newEdge}for(let int_point of int_points)int_point.edge_before?int_point.edge_after=int_point.edge_before.next:polygon2 instanceof Multiline$1&&int_point.is_vertex&START_VERTEX$1&&(int_point.edge_after=polygon2.first)}}function insertBetweenIntPoints(int_point1,int_point2,new_edges){let edge_before=int_point1.edge_before,edge_after=int_point2.edge_after,len=new_edges.length;edge_before.next=new_edges[0],new_edges[0].prev=edge_before,new_edges[len-1].next=edge_after,edge_after.prev=new_edges[len-1]}var{INSIDE:INSIDE$1,OUTSIDE,BOUNDARY,OVERLAP_SAME,OVERLAP_OPPOSITE}=Constants,{NOT_VERTEX,START_VERTEX,END_VERTEX}=Constants,BOOLEAN_UNION=1,BOOLEAN_INTERSECT=2,BOOLEAN_SUBTRACT=3;function unify(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_UNION,!0);return res_poly}function subtract(polygon1,polygon2){let polygon2_reversed=polygon2.clone().reverse(),[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2_reversed,BOOLEAN_SUBTRACT,!0);return res_poly}function intersect$1(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_INTERSECT,!0);return res_poly}function innerClip(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_INTERSECT,!1),clip_shapes1=[];for(let face of res_poly.faces)clip_shapes1=[...clip_shapes1,...[...face.edges].map(edge=>edge.shape)];let clip_shapes2=[];for(let face of wrk_poly.faces)clip_shapes2=[...clip_shapes2,...[...face.edges].map(edge=>edge.shape)];return[clip_shapes1,clip_shapes2]}function outerClip(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_SUBTRACT,!1),clip_shapes1=[];for(let face of res_poly.faces)clip_shapes1=[...clip_shapes1,...[...face.edges].map(edge=>edge.shape)];return clip_shapes1}function calculateIntersections(polygon1,polygon2){let res_poly=polygon1.clone(),wrk_poly=polygon2.clone(),intersections=getIntersections(res_poly,wrk_poly);sortIntersections(intersections),splitByIntersections(res_poly,intersections.int_points1_sorted),splitByIntersections(wrk_poly,intersections.int_points2_sorted),filterDuplicatedIntersections(intersections),sortIntersections(intersections);let ip_sorted1=intersections.int_points1_sorted.map(int_point=>int_point.pt),ip_sorted2=intersections.int_points2_sorted.map(int_point=>int_point.pt);return[ip_sorted1,ip_sorted2]}function filterNotRelevantEdges(res_poly,wrk_poly,intersections,op3){let notIntersectedFacesRes=getNotIntersectedFaces(res_poly,intersections.int_points1),notIntersectedFacesWrk=getNotIntersectedFaces(wrk_poly,intersections.int_points2);for(calcInclusionForNotIntersectedFaces(notIntersectedFacesRes,wrk_poly),calcInclusionForNotIntersectedFaces(notIntersectedFacesWrk,res_poly),initializeInclusionFlags(intersections.int_points1),initializeInclusionFlags(intersections.int_points2),calculateInclusionFlags(intersections.int_points1,wrk_poly),calculateInclusionFlags(intersections.int_points2,res_poly);fixBoundaryConflicts(res_poly,wrk_poly,intersections.int_points1,intersections.int_points1_sorted,intersections.int_points2,intersections););setOverlappingFlags(intersections),removeNotRelevantChains(res_poly,op3,intersections.int_points1_sorted,!0),removeNotRelevantChains(wrk_poly,op3,intersections.int_points2_sorted,!1),removeNotRelevantNotIntersectedFaces(res_poly,notIntersectedFacesRes,op3,!0),removeNotRelevantNotIntersectedFaces(wrk_poly,notIntersectedFacesWrk,op3,!1)}function swapLinksAndRestore(res_poly,wrk_poly,intersections,op3){copyWrkToRes(res_poly,wrk_poly,op3,intersections.int_points2),swapLinks(res_poly,wrk_poly,intersections),removeOldFaces(res_poly,intersections.int_points1),removeOldFaces(wrk_poly,intersections.int_points2),restoreFaces(res_poly,intersections.int_points1,intersections.int_points2),restoreFaces(res_poly,intersections.int_points2,intersections.int_points1)}function booleanOpBinary(polygon1,polygon2,op3,restore){let res_poly=polygon1.clone(),wrk_poly=polygon2.clone(),intersections=getIntersections(res_poly,wrk_poly);return sortIntersections(intersections),splitByIntersections(res_poly,intersections.int_points1_sorted),splitByIntersections(wrk_poly,intersections.int_points2_sorted),filterDuplicatedIntersections(intersections),sortIntersections(intersections),filterNotRelevantEdges(res_poly,wrk_poly,intersections,op3),restore&&swapLinksAndRestore(res_poly,wrk_poly,intersections,op3),[res_poly,wrk_poly]}function getIntersections(polygon1,polygon2){let intersections={int_points1:[],int_points2:[]};for(let edge1 of polygon1.edges){let resp=polygon2.edges.search(edge1.box);for(let edge2 of resp){let ip3=edge1.shape.intersect(edge2.shape);for(let pt4 of ip3)addToIntPoints(edge1,pt4,intersections.int_points1),addToIntPoints(edge2,pt4,intersections.int_points2)}}return intersections}function getNotIntersectedFaces(poly,int_points){let notIntersected=[];for(let face of poly.faces)int_points.find(ip3=>ip3.face===face)||notIntersected.push(face);return notIntersected}function calcInclusionForNotIntersectedFaces(notIntersectedFaces,poly2){for(let face of notIntersectedFaces)face.first.bv=face.first.bvStart=face.first.bvEnd=void 0,face.first.setInclusion(poly2)}function fixBoundaryConflicts(poly1,poly2,int_points1,int_points1_sorted,int_points2,intersections){let cur_face,first_int_point_in_face_id,next_int_point1,num_int_points=int_points1_sorted.length,iterate_more=!1;for(let i2=0;i2<num_int_points;i2++){let cur_int_point1=int_points1_sorted[i2];cur_int_point1.face!==cur_face&&(first_int_point_in_face_id=i2,cur_face=cur_int_point1.face);let int_points_cur_pool_start=i2,int_points_cur_pool_num=intPointsPoolCount(int_points1_sorted,i2,cur_face),next_int_point_id;int_points_cur_pool_start+int_points_cur_pool_num<num_int_points&&int_points1_sorted[int_points_cur_pool_start+int_points_cur_pool_num].face===cur_face?next_int_point_id=int_points_cur_pool_start+int_points_cur_pool_num:next_int_point_id=first_int_point_in_face_id;let int_points_next_pool_num=intPointsPoolCount(int_points1_sorted,next_int_point_id,cur_face);next_int_point1=null;for(let j4=next_int_point_id;j4<next_int_point_id+int_points_next_pool_num;j4++){let next_int_point1_tmp=int_points1_sorted[j4];if(next_int_point1_tmp.face===cur_face&&int_points2[next_int_point1_tmp.id].face===int_points2[cur_int_point1.id].face){next_int_point1=next_int_point1_tmp;break}}if(next_int_point1===null)continue;let edge_from1=cur_int_point1.edge_after,edge_to1=next_int_point1.edge_before;if(edge_from1.bv===BOUNDARY&&edge_to1.bv!=BOUNDARY){edge_from1.bv=edge_to1.bv;continue}if(edge_from1.bv!=BOUNDARY&&edge_to1.bv===BOUNDARY){edge_to1.bv=edge_from1.bv;continue}if(edge_from1.bv===BOUNDARY&&edge_to1.bv===BOUNDARY&&edge_from1!=edge_to1||edge_from1.bv===INSIDE$1&&edge_to1.bv===OUTSIDE||edge_from1.bv===OUTSIDE&&edge_to1.bv===INSIDE$1){let edge_tmp=edge_from1.next;for(;edge_tmp!=edge_to1;)edge_tmp.bvStart=void 0,edge_tmp.bvEnd=void 0,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2),edge_tmp=edge_tmp.next}if(edge_from1.bv===BOUNDARY&&edge_to1.bv===BOUNDARY&&edge_from1!=edge_to1){let edge_tmp=edge_from1.next,new_bv;for(;edge_tmp!=edge_to1;){if(edge_tmp.bv!=BOUNDARY){if(new_bv===void 0)new_bv=edge_tmp.bv;else if(edge_tmp.bv!=new_bv)throw Errors.UNRESOLVED_BOUNDARY_CONFLICT}edge_tmp=edge_tmp.next}new_bv!=null&&(edge_from1.bv=new_bv,edge_to1.bv=new_bv);continue}if(edge_from1.bv===INSIDE$1&&edge_to1.bv===OUTSIDE||edge_from1.bv===OUTSIDE&&edge_to1.bv===INSIDE$1){let edge_tmp=edge_from1;for(;edge_tmp!=edge_to1;){if(edge_tmp.bvStart===edge_from1.bv&&edge_tmp.bvEnd===edge_to1.bv){let[dist,segment2]=edge_tmp.shape.distanceTo(poly2);if(dist<10*Flatten.DP_TOL){addToIntPoints(edge_tmp,segment2.ps,int_points1);let int_point1=int_points1[int_points1.length-1];if(int_point1.is_vertex&START_VERTEX)int_point1.edge_after=edge_tmp,int_point1.edge_before=edge_tmp.prev,edge_tmp.bvStart=BOUNDARY,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2);else if(int_point1.is_vertex&END_VERTEX)int_point1.edge_after=edge_tmp.next,edge_tmp.bvEnd=BOUNDARY,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2);else{let newEdge1=poly2.addVertex(int_point1.pt,edge_tmp);int_point1.edge_before=newEdge1,int_point1.edge_after=newEdge1.next,newEdge1.setInclusion(poly2),newEdge1.next.bvStart=BOUNDARY,newEdge1.next.bvEnd=void 0,newEdge1.next.bv=void 0,newEdge1.next.setInclusion(poly2)}let edge2=poly2.findEdgeByPoint(segment2.pe);addToIntPoints(edge2,segment2.pe,int_points2);let int_point2=int_points2[int_points2.length-1];if(int_point2.is_vertex&START_VERTEX)int_point2.edge_after=edge2,int_point2.edge_before=edge2.prev;else if(int_point2.is_vertex&END_VERTEX)int_point2.edge_after=edge2.next;else{let int_point2_edge_after=int_points2.find(int_point=>int_point.edge_after===edge2),newEdge2=poly2.addVertex(int_point2.pt,edge2);int_point2.edge_before=newEdge2,int_point2.edge_after=newEdge2.next,int_point2_edge_after&&(int_point2_edge_after.edge_after=newEdge2),newEdge2.bvStart=void 0,newEdge2.bvEnd=BOUNDARY,newEdge2.bv=void 0,newEdge2.setInclusion(poly1),newEdge2.next.bvStart=BOUNDARY,newEdge2.next.bvEnd=void 0,newEdge2.next.bv=void 0,newEdge2.next.setInclusion(poly1)}sortIntersections(intersections),iterate_more=!0;break}}edge_tmp=edge_tmp.next}if(iterate_more)break;throw Errors.UNRESOLVED_BOUNDARY_CONFLICT}}return iterate_more}function removeNotRelevantChains(polygon2,op3,int_points,is_res_polygon){if(!int_points)return;let cur_face,first_int_point_in_face_num,int_point_current,int_point_next;for(let i2=0;i2<int_points.length;i2++){if(int_point_current=int_points[i2],int_point_current.face!==cur_face&&(first_int_point_in_face_num=i2,cur_face=int_point_current.face),cur_face.isEmpty())continue;let int_points_from_pull_start=i2,int_points_from_pull_num=intPointsPoolCount(int_points,i2,cur_face),next_int_point_num;int_points_from_pull_start+int_points_from_pull_num<int_points.length&&int_points[int_points_from_pull_start+int_points_from_pull_num].face===int_point_current.face?next_int_point_num=int_points_from_pull_start+int_points_from_pull_num:next_int_point_num=first_int_point_in_face_num,int_point_next=int_points[next_int_point_num];let int_points_to_pull_start=next_int_point_num,int_points_to_pull_num=intPointsPoolCount(int_points,int_points_to_pull_start,cur_face),edge_from=int_point_current.edge_after,edge_to=int_point_next.edge_before;if(edge_from.bv===INSIDE$1&&edge_to.bv===INSIDE$1&&op3===BOOLEAN_UNION||edge_from.bv===OUTSIDE&&edge_to.bv===OUTSIDE&&op3===BOOLEAN_INTERSECT||(edge_from.bv===OUTSIDE||edge_to.bv===OUTSIDE)&&op3===BOOLEAN_SUBTRACT&&!is_res_polygon||(edge_from.bv===INSIDE$1||edge_to.bv===INSIDE$1)&&op3===BOOLEAN_SUBTRACT&&is_res_polygon||edge_from.bv===BOUNDARY&&edge_to.bv===BOUNDARY&&edge_from.overlap&OVERLAP_SAME&&is_res_polygon||edge_from.bv===BOUNDARY&&edge_to.bv===BOUNDARY&&edge_from.overlap&OVERLAP_OPPOSITE){polygon2.removeChain(cur_face,edge_from,edge_to);for(let k4=int_points_from_pull_start;k4<int_points_from_pull_start+int_points_from_pull_num;k4++)int_points[k4].edge_after=void 0;for(let k4=int_points_to_pull_start;k4<int_points_to_pull_start+int_points_to_pull_num;k4++)int_points[k4].edge_before=void 0}i2+=int_points_from_pull_num-1}}function copyWrkToRes(res_polygon,wrk_polygon,op3,int_points){for(let face of wrk_polygon.faces){for(let edge of face)res_polygon.edges.add(edge);int_points.find(ip3=>ip3.face===face)===void 0&&res_polygon.addFace(face.first,face.last)}}function swapLinks(res_polygon,wrk_polygon,intersections){if(intersections.int_points1.length!==0)for(let i2=0;i2<intersections.int_points1.length;i2++){let int_point1=intersections.int_points1[i2],int_point2=intersections.int_points2[i2];if(int_point1.edge_before!==void 0&&int_point1.edge_after===void 0&&int_point2.edge_before===void 0&&int_point2.edge_after!==void 0&&(int_point1.edge_before.next=int_point2.edge_after,int_point2.edge_after.prev=int_point1.edge_before,int_point1.edge_after=int_point2.edge_after,int_point2.edge_before=int_point1.edge_before),int_point2.edge_before!==void 0&&int_point2.edge_after===void 0&&int_point1.edge_before===void 0&&int_point1.edge_after!==void 0&&(int_point2.edge_before.next=int_point1.edge_after,int_point1.edge_after.prev=int_point2.edge_before,int_point2.edge_after=int_point1.edge_after,int_point1.edge_before=int_point2.edge_before),int_point1.edge_before!==void 0&&int_point1.edge_after===void 0)for(let int_point of intersections.int_points1_sorted)int_point!==int_point1&&int_point.edge_before===void 0&&int_point.edge_after!==void 0&&int_point.pt.equalTo(int_point1.pt)&&(int_point1.edge_before.next=int_point.edge_after,int_point.edge_after.prev=int_point1.edge_before,int_point1.edge_after=int_point.edge_after,int_point.edge_before=int_point1.edge_before);if(int_point2.edge_before!==void 0&&int_point2.edge_after===void 0)for(let int_point of intersections.int_points2_sorted)int_point!==int_point2&&int_point.edge_before===void 0&&int_point.edge_after!==void 0&&int_point.pt.equalTo(int_point2.pt)&&(int_point2.edge_before.next=int_point.edge_after,int_point.edge_after.prev=int_point2.edge_before,int_point2.edge_after=int_point.edge_after,int_point.edge_before=int_point2.edge_before)}}function removeOldFaces(polygon2,int_points){for(let int_point of int_points)polygon2.faces.delete(int_point.face),int_point.face=void 0,int_point.edge_before&&(int_point.edge_before.face=void 0),int_point.edge_after&&(int_point.edge_after.face=void 0)}function restoreFaces(polygon2,int_points,other_int_points){for(let int_point of int_points){if(int_point.edge_before===void 0||int_point.edge_after===void 0||int_point.face||int_point.edge_after.face||int_point.edge_before.face)continue;let first=int_point.edge_after,last=int_point.edge_before;try{LinkedList.testInfiniteLoop(first)}catch{throw Errors.CANNOT_COMPLETE_BOOLEAN_OPERATION}let face=polygon2.addFace(first,last);for(let int_point_tmp of int_points)int_point_tmp.edge_before&&int_point_tmp.edge_after&&int_point_tmp.edge_before.face===face&&int_point_tmp.edge_after.face===face&&(int_point_tmp.face=face);for(let int_point_tmp of other_int_points)int_point_tmp.edge_before&&int_point_tmp.edge_after&&int_point_tmp.edge_before.face===face&&int_point_tmp.edge_after.face===face&&(int_point_tmp.face=face)}}function removeNotRelevantNotIntersectedFaces(polygon2,notIntersectedFaces,op3,is_res_polygon){for(let face of notIntersectedFaces){let rel=face.first.bv;(op3===BOOLEAN_UNION&&rel===INSIDE$1||op3===BOOLEAN_SUBTRACT&&rel===INSIDE$1&&is_res_polygon||op3===BOOLEAN_SUBTRACT&&rel===OUTSIDE&&!is_res_polygon||op3===BOOLEAN_INTERSECT&&rel===OUTSIDE)&&polygon2.deleteFace(face)}}var BooleanOperations=Object.freeze({__proto__:null,BOOLEAN_INTERSECT,BOOLEAN_SUBTRACT,BOOLEAN_UNION,calculateIntersections,innerClip,intersect:intersect$1,outerClip,removeNotRelevantChains,removeOldFaces,restoreFaces,subtract,unify}),EQUAL=RegExp("T.F..FFF.|T.F...F.."),INTERSECT=RegExp("T........|.T.......|...T.....|....T...."),TOUCH=RegExp("FT.......|F..T.....|F...T...."),INSIDE=RegExp("T.F..F..."),COVERED=RegExp("T.F..F...|.TF..F...|..FT.F...|..F.TF..."),DE9IM=class{constructor(){this.m=new Array(9).fill(void 0)}get I2I(){return this.m[0]}set I2I(geom){this.m[0]=geom}get I2B(){return this.m[1]}set I2B(geom){this.m[1]=geom}get I2E(){return this.m[2]}set I2E(geom){this.m[2]=geom}get B2I(){return this.m[3]}set B2I(geom){this.m[3]=geom}get B2B(){return this.m[4]}set B2B(geom){this.m[4]=geom}get B2E(){return this.m[5]}set B2E(geom){this.m[5]=geom}get E2I(){return this.m[6]}set E2I(geom){this.m[6]=geom}get E2B(){return this.m[7]}set E2B(geom){this.m[7]=geom}get E2E(){return this.m[8]}set E2E(geom){this.m[8]=geom}toString(){return this.m.map(e4=>e4 instanceof Array&&e4.length>0?"T":e4 instanceof Array&&e4.length===0?"F":"*").join("")}equal(){return EQUAL.test(this.toString())}intersect(){return INTERSECT.test(this.toString())}touch(){return TOUCH.test(this.toString())}inside(){return INSIDE.test(this.toString())}covered(){return COVERED.test(this.toString())}};function ray_shoot(polygon2,point6){let contains,ray2=new Flatten.Ray(point6),line2=new Flatten.Line(ray2.pt,ray2.norm),searchBox=new Flatten.Box(ray2.box.xmin-Flatten.DP_TOL,ray2.box.ymin-Flatten.DP_TOL,ray2.box.xmax+Flatten.DP_TOL,ray2.box.ymax+Flatten.DP_TOL);if(polygon2.box.not_intersect(searchBox))return Flatten.OUTSIDE;let resp_edges=polygon2.edges.search(searchBox);if(resp_edges.length===0)return Flatten.OUTSIDE;for(let edge of resp_edges)if(edge.shape.contains(point6))return Flatten.BOUNDARY;let faces=[...polygon2.faces],intersections=[];for(let edge of resp_edges)for(let ip3 of ray2.intersect(edge.shape)){if(ip3.equalTo(point6))return Flatten.BOUNDARY;intersections.push({pt:ip3,edge,face_index:faces.indexOf(edge.face)})}intersections.sort((i12,i2)=>LT(i12.pt.x,i2.pt.x)?-1:GT(i12.pt.x,i2.pt.x)?1:i12.face_index<i2.face_index?-1:i12.face_index>i2.face_index?1:i12.edge.arc_length<i2.edge.arc_length?-1:i12.edge.arc_length>i2.edge.arc_length?1:0);let counter=0;for(let i2=0;i2<intersections.length;i2++){let intersection=intersections[i2];if(intersection.pt.equalTo(intersection.edge.shape.start)){if(i2>0&&intersection.pt.equalTo(intersections[i2-1].pt)&&intersection.face_index===intersections[i2-1].face_index&&intersection.edge.prev===intersections[i2-1].edge)continue;let prev_edge=intersection.edge.prev;for(;EQ_0(prev_edge.length);)prev_edge=prev_edge.prev;let prev_tangent=prev_edge.shape.tangentInEnd(),prev_point=intersection.pt.translate(prev_tangent),cur_tangent=intersection.edge.shape.tangentInStart(),cur_point=intersection.pt.translate(cur_tangent),prev_on_the_left=prev_point.leftTo(line2),cur_on_the_left=cur_point.leftTo(line2);(prev_on_the_left&&!cur_on_the_left||!prev_on_the_left&&cur_on_the_left)&&counter++}else if(intersection.pt.equalTo(intersection.edge.shape.end)){if(i2>0&&intersection.pt.equalTo(intersections[i2-1].pt)&&intersection.face_index===intersections[i2-1].face_index&&intersection.edge.next===intersections[i2-1].edge)continue;let next_edge=intersection.edge.next;for(;EQ_0(next_edge.length);)next_edge=next_edge.next;let next_tangent=next_edge.shape.tangentInStart(),next_point=intersection.pt.translate(next_tangent),cur_tangent=intersection.edge.shape.tangentInEnd(),cur_point=intersection.pt.translate(cur_tangent),next_on_the_left=next_point.leftTo(line2),cur_on_the_left=cur_point.leftTo(line2);(next_on_the_left&&!cur_on_the_left||!next_on_the_left&&cur_on_the_left)&&counter++}else if(intersection.edge.shape instanceof Flatten.Segment)counter++;else{let box2=intersection.edge.shape.box;EQ(intersection.pt.y,box2.ymin)||EQ(intersection.pt.y,box2.ymax)||counter++}}return contains=counter%2===1?INSIDE$2:OUTSIDE$1,contains}function equal(shape1,shape2){return relate(shape1,shape2).equal()}function intersect(shape1,shape2){return relate(shape1,shape2).intersect()}function touch(shape1,shape2){return relate(shape1,shape2).touch()}function disjoint(shape1,shape2){return!intersect(shape1,shape2)}function inside(shape1,shape2){return relate(shape1,shape2).inside()}function covered(shape1,shape2){return relate(shape1,shape2).covered()}function contain(shape1,shape2){return inside(shape2,shape1)}function cover(shape1,shape2){return covered(shape2,shape1)}function relate(shape1,shape2){if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Line)return relateLine2Line(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Circle)return relateLine2Circle(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Box)return relateLine2Box(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Polygon)return relateLine2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Segment||shape1 instanceof Flatten.Arc)&&shape2 instanceof Flatten.Polygon)return relateShape2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Segment||shape1 instanceof Flatten.Arc)&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relateShape2Polygon(shape1,new Flatten.Polygon(shape2));if(shape1 instanceof Flatten.Polygon&&shape2 instanceof Flatten.Polygon)return relatePolygon2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Circle||shape1 instanceof Flatten.Box)&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relatePolygon2Polygon(new Flatten.Polygon(shape1),new Flatten.Polygon(shape2));if((shape1 instanceof Flatten.Circle||shape1 instanceof Flatten.Box)&&shape2 instanceof Flatten.Polygon)return relatePolygon2Polygon(new Flatten.Polygon(shape1),shape2);if(shape1 instanceof Flatten.Polygon&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relatePolygon2Polygon(shape1,new Flatten.Polygon(shape2))}function relateLine2Line(line1,line2){let denim=new DE9IM,ip3=intersectLine2Line(line1,line2);return ip3.length===0?line1.contains(line2.pt)&&line2.contains(line1.pt)?(denim.I2I=[line1],denim.I2E=[],denim.E2I=[]):(denim.I2I=[],denim.I2E=[line1],denim.E2I=[line2]):(denim.I2I=ip3,denim.I2E=line1.split(ip3),denim.E2I=line2.split(ip3)),denim}function relateLine2Circle(line2,circle2){let denim=new DE9IM,ip3=intersectLine2Circle(line2,circle2);if(ip3.length===0)denim.I2I=[],denim.I2B=[],denim.I2E=[line2],denim.E2I=[circle2];else if(ip3.length===1)denim.I2I=[],denim.I2B=ip3,denim.I2E=line2.split(ip3),denim.E2I=[circle2];else{let multiline2=new Multiline$1([line2]),ip_sorted=line2.sortPoints(ip3);multiline2.split(ip_sorted);let splitShapes=multiline2.toShapes();denim.I2I=[splitShapes[1]],denim.I2B=ip_sorted,denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=new Flatten.Polygon([circle2.toArc()]).cutWithLine(line2)}return denim}function relateLine2Box(line2,box2){let denim=new DE9IM,ip3=intersectLine2Box(line2,box2);if(ip3.length===0)denim.I2I=[],denim.I2B=[],denim.I2E=[line2],denim.E2I=[box2];else if(ip3.length===1)denim.I2I=[],denim.I2B=ip3,denim.I2E=line2.split(ip3),denim.E2I=[box2];else{let multiline2=new Multiline$1([line2]),ip_sorted=line2.sortPoints(ip3);multiline2.split(ip_sorted);let splitShapes=multiline2.toShapes();box2.toSegments().some(segment2=>segment2.contains(ip3[0])&&segment2.contains(ip3[1]))?(denim.I2I=[],denim.I2B=[splitShapes[1]],denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=[box2]):(denim.I2I=[splitShapes[1]],denim.I2B=ip_sorted,denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=new Flatten.Polygon(box2.toSegments()).cutWithLine(line2))}return denim}function relateLine2Polygon(line2,polygon2){let denim=new DE9IM,ip3=intersectLine2Polygon(line2,polygon2),multiline2=new Multiline$1([line2]),ip_sorted=ip3.length>0?ip3.slice():line2.sortPoints(ip3);return multiline2.split(ip_sorted),[...multiline2].forEach(edge=>edge.setInclusion(polygon2)),denim.I2I=[...multiline2].filter(edge=>edge.bv===Flatten.INSIDE).map(edge=>edge.shape),denim.I2B=[...multiline2].slice(1).map(edge=>edge.bv===Flatten.BOUNDARY?edge.shape:edge.shape.start),denim.I2E=[...multiline2].filter(edge=>edge.bv===Flatten.OUTSIDE).map(edge=>edge.shape),denim.E2I=polygon2.cutWithLine(line2),denim}function relateShape2Polygon(shape,polygon2){let denim=new DE9IM,ip3=intersectShape2Polygon(shape,polygon2),ip_sorted=ip3.length>0?ip3.slice():shape.sortPoints(ip3),multiline2=new Multiline$1([shape]);multiline2.split(ip_sorted),[...multiline2].forEach(edge=>edge.setInclusion(polygon2)),denim.I2I=[...multiline2].filter(edge=>edge.bv===Flatten.INSIDE).map(edge=>edge.shape),denim.I2B=[...multiline2].slice(1).map(edge=>edge.bv===Flatten.BOUNDARY?edge.shape:edge.shape.start),denim.I2E=[...multiline2].filter(edge=>edge.bv===Flatten.OUTSIDE).map(edge=>edge.shape),denim.B2I=[],denim.B2B=[],denim.B2E=[];for(let pt4 of[shape.start,shape.end])switch(ray_shoot(polygon2,pt4)){case Flatten.INSIDE:denim.B2I.push(pt4);break;case Flatten.BOUNDARY:denim.B2B.push(pt4);break;case Flatten.OUTSIDE:denim.B2E.push(pt4);break}return denim}function relatePolygon2Polygon(polygon1,polygon2){let denim=new DE9IM,[ip_sorted1,ip_sorted2]=calculateIntersections(polygon1,polygon2),boolean_intersection=intersect$1(polygon1,polygon2),boolean_difference1=subtract(polygon1,polygon2),boolean_difference2=subtract(polygon2,polygon1),[inner_clip_shapes1,inner_clip_shapes2]=innerClip(polygon1,polygon2),outer_clip_shapes1=outerClip(polygon1,polygon2),outer_clip_shapes2=outerClip(polygon2,polygon1);return denim.I2I=boolean_intersection.isEmpty()?[]:[boolean_intersection],denim.I2B=inner_clip_shapes2,denim.I2E=boolean_difference1.isEmpty()?[]:[boolean_difference1],denim.B2I=inner_clip_shapes1,denim.B2B=ip_sorted1,denim.B2E=outer_clip_shapes1,denim.E2I=boolean_difference2.isEmpty()?[]:[boolean_difference2],denim.E2B=outer_clip_shapes2,denim}var Relations=Object.freeze({__proto__:null,contain,cover,covered,disjoint,equal,inside,intersect,relate,touch}),Matrix=class _Matrix{constructor(a2=1,b3=0,c3=0,d3=1,tx3=0,ty3=0){this.a=a2,this.b=b3,this.c=c3,this.d=d3,this.tx=tx3,this.ty=ty3}fromMatrix3x3(matrix3x3){let[a2,c3,tx3]=matrix3x3[0],[b3,d3,ty3]=matrix3x3[1];return new _Matrix(a2,b3,c3,d3,tx3,ty3)}toMatrix3x3(){return[[this.a,this.c,this.tx],[this.b,this.d,this.ty],[0,0,1]]}clone(){return new _Matrix(this.a,this.b,this.c,this.d,this.tx,this.ty)}transform(vector2){return[vector2[0]*this.a+vector2[1]*this.c+this.tx,vector2[0]*this.b+vector2[1]*this.d+this.ty]}multiply(other_matrix){return new _Matrix(this.a*other_matrix.a+this.c*other_matrix.b,this.b*other_matrix.a+this.d*other_matrix.b,this.a*other_matrix.c+this.c*other_matrix.d,this.b*other_matrix.c+this.d*other_matrix.d,this.a*other_matrix.tx+this.c*other_matrix.ty+this.tx,this.b*other_matrix.tx+this.d*other_matrix.ty+this.ty)}translate(...args){let tx3,ty3;if(args.length==1&&!isNaN(args[0].x)&&!isNaN(args[0].y))tx3=args[0].x,ty3=args[0].y;else if(args.length===2&&typeof args[0]=="number"&&typeof args[1]=="number")tx3=args[0],ty3=args[1];else throw Errors.ILLEGAL_PARAMETERS;return this.multiply(new _Matrix(1,0,0,1,tx3,ty3))}rotate(angle,centerX=0,centerY=0){let cos5=Math.cos(angle),sin5=Math.sin(angle);return this.translate(centerX,centerY).multiply(new _Matrix(cos5,sin5,-sin5,cos5,0,0)).translate(-centerX,-centerY)}scale(sx3,sy3){return this.multiply(new _Matrix(sx3,0,0,sy3,0,0))}equalTo(matrix2){return!(!Flatten.Utils.EQ(this.tx,matrix2.tx)||!Flatten.Utils.EQ(this.ty,matrix2.ty)||!Flatten.Utils.EQ(this.a,matrix2.a)||!Flatten.Utils.EQ(this.b,matrix2.b)||!Flatten.Utils.EQ(this.c,matrix2.c)||!Flatten.Utils.EQ(this.d,matrix2.d))}};Flatten.Matrix=Matrix;var matrix=(...args)=>new Flatten.Matrix(...args);Flatten.matrix=matrix;var IntervalBase=class{constructor(low,high){this.low=low,this.high=high}get max(){return this.clone()}less_than(other_interval){return this.low<other_interval.low||this.low===other_interval.low&&this.high<other_interval.high}equal_to(other_interval){return this.low===other_interval.low&&this.high===other_interval.high}intersect(other_interval){return!this.not_intersect(other_interval)}not_intersect(other_interval){return this.high<other_interval.low||other_interval.high<this.low}merge(other_interval){let low=this.low===void 0?other_interval.low:this.low<other_interval.low?this.low:other_interval.low,high=this.high===void 0?other_interval.high:this.high>other_interval.high?this.high:other_interval.high,cloned=this.clone();return cloned.low=low,cloned.high=high,cloned}output(){return[this.low,this.high]}comparable_less_than(val1,val2){return val1<val2}},Interval=class _Interval extends IntervalBase{clone(){return new _Interval(this.low,this.high)}},RB_TREE_COLOR_RED=1,RB_TREE_COLOR_BLACK=0,Node=class{constructor(key,value,left=null,right=null,parent=null,color=RB_TREE_COLOR_BLACK){if(this.left=left,this.right=right,this.parent=parent,this.color=color,this.item={key:void 0,values:[]},value!==void 0&&this.item.values.push(value),key!==void 0)if(Array.isArray(key)){let[rawLow,rawHigh]=key;if(!Number.isNaN(rawLow)&&!Number.isNaN(rawHigh)){let low=rawLow,high=rawHigh;low>high&&([low,high]=[high,low]),this.item.key=new Interval(low,high)}}else this.item.key=key;this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.values.length===0&&this.left===null&&this.right===null&&this.color===RB_TREE_COLOR_BLACK}requireKey(){if(!this.item.key)throw new Error("Node key is undefined (nil/sentinel). Operation is not applicable.");return this.item.key}less_than(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.less_than(b3)}_value_equal(other_node){let a2=this.item.values[0],b3=other_node.item.values[0];return a2&&b3&&a2.equal_to?a2.equal_to(b3):a2===b3}equal_to(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.equal_to(b3)}intersect(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.intersect(b3)}copy_data(other_node){this.item.key=other_node.item.key,this.item.values=other_node.item.values.slice()}update_max(){this.max=this.item.key?this.item.key.max:void 0,this.right&&this.right.max&&(this.max=this.max?this.max.merge(this.right.max):this.right.max),this.left&&this.left.max&&(this.max=this.max?this.max.merge(this.left.max):this.left.max)}not_intersect_left_subtree(search_node){if(!this.left)return!0;let high=this.left.max?this.left.max.high:this.left.item.key.high,selfKey=this.requireKey(),searchKey=search_node.requireKey();return selfKey.comparable_less_than(high,searchKey.low)}not_intersect_right_subtree(search_node){if(!this.right)return!0;let low=this.right.max?this.right.max.low:this.right.item.key.low,selfKey=this.requireKey(),searchKey=search_node.requireKey();return selfKey.comparable_less_than(searchKey.high,low)}},IntervalTree=class _IntervalTree{constructor(){this.root=null,this.nil_node=new Node}get size(){let count=0;return this.tree_walk(this.root,node=>count+=node.item.values.length),count}get keys(){let res2=[];return this.tree_walk(this.root,node=>res2.push(node.item.key.output())),res2}get values(){let res2=[];return this.tree_walk(this.root,node=>{for(let v5 of node.item.values)res2.push(v5)}),res2}get items(){let res2=[];return this.tree_walk(this.root,node=>{let keyOut=node.item.key.output();for(let v5 of node.item.values)res2.push({key:keyOut,value:v5})}),res2}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(key,value=key){if(key===void 0)return;let existing=this.tree_search(this.root,new Node(key));if(existing)return existing.item.values.push(value),existing;let insert_node=new Node(key,value,this.nil_node,this.nil_node,null,RB_TREE_COLOR_RED);return this.tree_insert(insert_node),this.recalc_max(insert_node),insert_node}exist(key,value=key){let node=this.tree_search(this.root,new Node(key));return node?arguments.length<2||value===key?!0:node.item.values.some(v5=>v5&&v5.equal_to?v5.equal_to(value):v5===value):!1}remove(key,value=key){let node=this.tree_search(this.root,new Node(key));if(!node)return;if(arguments.length<2)return this.tree_delete(node),node;let idx=node.item.values.findIndex(v5=>v5&&v5.equal_to?v5.equal_to(value):v5===value);if(idx>=0)return node.item.values.splice(idx,1),node.item.values.length===0&&this.tree_delete(node),node}search(interval,outputMapperFn=(value,key)=>value===key?key.output():value){let search_node=new Node(interval),resp_nodes=[];this.tree_search_interval(this.root,search_node,resp_nodes);let res2=[];for(let node of resp_nodes)for(let v5 of node.item.values)res2.push(outputMapperFn(v5,node.item.key));return res2}intersect_any(interval){let search_node=new Node(interval);return this.tree_find_any_interval(this.root,search_node)}forEach(visitor){this.tree_walk(this.root,node=>{for(let v5 of node.item.values)visitor(node.item.key,v5)})}map(callback){let tree=new _IntervalTree;return this.tree_walk(this.root,node=>{for(let v5 of node.item.values)tree.insert(node.item.key,callback(v5,node.item.key))}),tree}*iterate(interval,outputMapperFn=(value,key)=>value===key?key.output():value){let node=null;for(interval?node=this.tree_search_nearest_forward(this.root,new Node(interval)):this.root&&(node=this.local_minimum(this.root));node;){for(let v5 of node.item.values)yield outputMapperFn(v5,node.item.key);node=this.tree_successor(node)}}recalc_max(node){let node_current=node;for(;node_current.parent!=null;)node_current.parent.update_max(),node_current=node_current.parent}tree_insert(insert_node){let current_node=this.root,parent_node=null;if(this.root==null||this.root===this.nil_node)this.root=insert_node;else{for(;current_node!==this.nil_node;)parent_node=current_node,insert_node.less_than(current_node)?current_node=current_node.left:current_node=current_node.right;insert_node.parent=parent_node,insert_node.less_than(parent_node)?parent_node.left=insert_node:parent_node.right=insert_node}this.insert_fixup(insert_node)}insert_fixup(insert_node){let current_node,uncle_node;for(current_node=insert_node;current_node!==this.root&¤t_node.parent.color===RB_TREE_COLOR_RED;)current_node.parent===current_node.parent.parent.left?(uncle_node=current_node.parent.parent.right,uncle_node.color===RB_TREE_COLOR_RED?(current_node.parent.color=RB_TREE_COLOR_BLACK,uncle_node.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,current_node=current_node.parent.parent):(current_node===current_node.parent.right&&(current_node=current_node.parent,this.rotate_left(current_node)),current_node.parent.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,this.rotate_right(current_node.parent.parent))):(uncle_node=current_node.parent.parent.left,uncle_node.color===RB_TREE_COLOR_RED?(current_node.parent.color=RB_TREE_COLOR_BLACK,uncle_node.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,current_node=current_node.parent.parent):(current_node===current_node.parent.left&&(current_node=current_node.parent,this.rotate_right(current_node)),current_node.parent.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,this.rotate_left(current_node.parent.parent)));this.root.color=RB_TREE_COLOR_BLACK}tree_delete(delete_node){let cut_node,fix_node;delete_node.left===this.nil_node||delete_node.right===this.nil_node?cut_node=delete_node:cut_node=this.tree_successor(delete_node),cut_node.left!==this.nil_node?fix_node=cut_node.left:fix_node=cut_node.right,fix_node.parent=cut_node.parent,cut_node===this.root?this.root=fix_node:(cut_node===cut_node.parent.left?cut_node.parent.left=fix_node:cut_node.parent.right=fix_node,cut_node.parent.update_max()),this.recalc_max(fix_node),cut_node!==delete_node&&(delete_node.copy_data(cut_node),delete_node.update_max(),this.recalc_max(delete_node)),cut_node.color===RB_TREE_COLOR_BLACK&&this.delete_fixup(fix_node)}delete_fixup(fix_node){let current_node=fix_node,brother_node;for(;current_node!==this.root&¤t_node.parent!=null&¤t_node.color===RB_TREE_COLOR_BLACK;)current_node===current_node.parent.left?(brother_node=current_node.parent.right,brother_node.color===RB_TREE_COLOR_RED&&(brother_node.color=RB_TREE_COLOR_BLACK,current_node.parent.color=RB_TREE_COLOR_RED,this.rotate_left(current_node.parent),brother_node=current_node.parent.right),brother_node.left.color===RB_TREE_COLOR_BLACK&&brother_node.right.color===RB_TREE_COLOR_BLACK?(brother_node.color=RB_TREE_COLOR_RED,current_node=current_node.parent):(brother_node.right.color===RB_TREE_COLOR_BLACK&&(brother_node.color=RB_TREE_COLOR_RED,brother_node.left.color=RB_TREE_COLOR_BLACK,this.rotate_right(brother_node),brother_node=current_node.parent.right),brother_node.color=current_node.parent.color,current_node.parent.color=RB_TREE_COLOR_BLACK,brother_node.right.color=RB_TREE_COLOR_BLACK,this.rotate_left(current_node.parent),current_node=this.root)):(brother_node=current_node.parent.left,brother_node.color===RB_TREE_COLOR_RED&&(brother_node.color=RB_TREE_COLOR_BLACK,current_node.parent.color=RB_TREE_COLOR_RED,this.rotate_right(current_node.parent),brother_node=current_node.parent.left),brother_node.left.color===RB_TREE_COLOR_BLACK&&brother_node.right.color===RB_TREE_COLOR_BLACK?(brother_node.color=RB_TREE_COLOR_RED,current_node=current_node.parent):(brother_node.left.color===RB_TREE_COLOR_BLACK&&(brother_node.color=RB_TREE_COLOR_RED,brother_node.right.color=RB_TREE_COLOR_BLACK,this.rotate_left(brother_node),brother_node=current_node.parent.left),brother_node.color=current_node.parent.color,current_node.parent.color=RB_TREE_COLOR_BLACK,brother_node.left.color=RB_TREE_COLOR_BLACK,this.rotate_right(current_node.parent),current_node=this.root));current_node.color=RB_TREE_COLOR_BLACK}tree_search(node,search_node){if(!(node==null||node===this.nil_node))return search_node.equal_to(node)?node:search_node.less_than(node)?this.tree_search(node.left,search_node):this.tree_search(node.right,search_node)}tree_search_nearest_forward(node,search_node){let best=null,curr=node;for(;curr&&curr!==this.nil_node;)curr.less_than(search_node)?curr.intersect(search_node)?(best=curr,curr=curr.left):curr=curr.right:((!best||curr.less_than(best))&&(best=curr),curr=curr.left);return best||null}tree_search_interval(node,search_node,res2){node!=null&&node!==this.nil_node&&(node.left!==this.nil_node&&!node.not_intersect_left_subtree(search_node)&&this.tree_search_interval(node.left,search_node,res2),node.intersect(search_node)&&res2.push(node),node.right!==this.nil_node&&!node.not_intersect_right_subtree(search_node)&&this.tree_search_interval(node.right,search_node,res2))}tree_find_any_interval(node,search_node){let found=!1;return node!=null&&node!==this.nil_node&&(node.left!==this.nil_node&&!node.not_intersect_left_subtree(search_node)&&(found=this.tree_find_any_interval(node.left,search_node)),found||(found=node.intersect(search_node)),!found&&node.right!==this.nil_node&&!node.not_intersect_right_subtree(search_node)&&(found=this.tree_find_any_interval(node.right,search_node))),found}local_minimum(node){let node_min=node;for(;node_min.left!=null&&node_min.left!==this.nil_node;)node_min=node_min.left;return node_min}local_maximum(node){let node_max=node;for(;node_max.right!=null&&node_max.right!==this.nil_node;)node_max=node_max.right;return node_max}tree_successor(node){let node_successor,current_node,parent_node;if(node.right!==this.nil_node)node_successor=this.local_minimum(node.right);else{for(current_node=node,parent_node=node.parent;parent_node!=null&&parent_node.right===current_node;)current_node=parent_node,parent_node=parent_node.parent;node_successor=parent_node}return node_successor}rotate_left(x5){let y5=x5.right;x5.right=y5.left,y5.left!==this.nil_node&&(y5.left.parent=x5),y5.parent=x5.parent,x5===this.root?this.root=y5:x5===x5.parent.left?x5.parent.left=y5:x5.parent.right=y5,y5.left=x5,x5.parent=y5,x5!==null&&x5!==this.nil_node&&x5.update_max(),y5!=null&&y5!==this.nil_node&&y5.update_max()}rotate_right(y5){let x5=y5.left;y5.left=x5.right,x5.right!==this.nil_node&&(x5.right.parent=y5),x5.parent=y5.parent,y5===this.root?this.root=x5:y5===y5.parent.left?y5.parent.left=x5:y5.parent.right=x5,x5.right=y5,y5.parent=x5,y5!==null&&y5!==this.nil_node&&y5.update_max(),x5!=null&&x5!==this.nil_node&&x5.update_max()}tree_walk(node,action){node!=null&&node!==this.nil_node&&(this.tree_walk(node.left,action),action(node),this.tree_walk(node.right,action))}testRedBlackProperty(){let res2=!0;return this.tree_walk(this.root,function(node){node.color===RB_TREE_COLOR_RED&&(node.left.color===RB_TREE_COLOR_BLACK&&node.right.color===RB_TREE_COLOR_BLACK||(res2=!1))}),res2}testBlackHeightProperty(node){let height=0,heightLeft=0,heightRight=0;if(node.color===RB_TREE_COLOR_BLACK&&height++,node.left!==this.nil_node?heightLeft=this.testBlackHeightProperty(node.left):heightLeft=1,node.right!==this.nil_node?heightRight=this.testBlackHeightProperty(node.right):heightRight=1,heightLeft!==heightRight)throw new Error("Red-black height property violated");return height+=heightLeft,height}},PlanarSet=class extends Set{constructor(shapes){super(shapes),this.index=new IntervalTree,this.forEach(shape=>this.index.insert(shape))}add(entry){let size2=this.size,{key,value}=entry,box2=key||entry.box,shape=value||entry;return super.add(shape),this.size>size2&&this.index.insert(box2,shape),this}delete(entry){let{key,value}=entry,box2=key||entry.box,shape=value||entry,deleted=super.delete(shape);return deleted&&this.index.remove(box2,shape),deleted}clear(){super.clear(),this.index=new IntervalTree}search(box2){return this.index.search(box2)}hit(point6){let box2=new Flatten.Box(point6.x-1,point6.y-1,point6.x+1,point6.y+1);return this.index.search(box2).filter(shape=>point6.on(shape))}svg(){return[...this].reduce((acc,shape)=>acc+shape.svg(),"")}};Flatten.PlanarSet=PlanarSet;var Shape=class{get name(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}get box(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}clone(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}translate(...args){return this.transform(new Matrix().translate(...args))}rotate(angle,center2=new Flatten.Point){return this.transform(new Matrix().rotate(angle,center2.x,center2.y))}scale(sx3,sy3){return this.transform(new Matrix().scale(sx3,sy3))}transform(...args){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}toJSON(){return Object.assign({},this,{name:this.name})}svg(attrs={}){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}},Point$3=class Point2 extends Shape{constructor(...args){if(super(),this.x=0,this.y=0,args.length!==0){if(args.length===1&&args[0]instanceof Array&&args[0].length===2){let arr=args[0];if(typeof arr[0]=="number"&&typeof arr[1]=="number"){this.x=arr[0],this.y=arr[1];return}}if(args.length===1&&args[0]instanceof Object&&args[0].name==="point"){let{x:x5,y:y5}=args[0];this.x=x5,this.y=y5;return}if(args.length===2&&typeof args[0]=="number"&&typeof args[1]=="number"){this.x=args[0],this.y=args[1];return}throw Errors.ILLEGAL_PARAMETERS}}get box(){return new Flatten.Box(this.x,this.y,this.x,this.y)}clone(){return new Flatten.Point(this.x,this.y)}get vertices(){return[this.clone()]}equalTo(pt4){return Flatten.Utils.EQ(this.x,pt4.x)&&Flatten.Utils.EQ(this.y,pt4.y)}lessThan(pt4){return!!(Flatten.Utils.LT(this.y,pt4.y)||Flatten.Utils.EQ(this.y,pt4.y)&&Flatten.Utils.LT(this.x,pt4.x))}transform(m3){return new Flatten.Point(m3.transform([this.x,this.y]))}projectionOn(line2){if(this.equalTo(line2.pt))return this.clone();let vec=new Flatten.Vector(this,line2.pt);if(Flatten.Utils.EQ_0(vec.cross(line2.norm)))return line2.pt.clone();let dist=vec.dot(line2.norm),proj_vec=line2.norm.multiply(dist);return this.translate(proj_vec)}leftTo(line2){let vec=new Flatten.Vector(line2.pt,this);return Flatten.Utils.GT(vec.dot(line2.norm),0)}distanceTo(shape){if(shape instanceof Point2){let dx3=shape.x-this.x,dy3=shape.y-this.y;return[Math.sqrt(dx3*dx3+dy3*dy3),new Flatten.Segment(this,shape)]}if(shape instanceof Flatten.Line)return Flatten.Distance.point2line(this,shape);if(shape instanceof Flatten.Circle)return Flatten.Distance.point2circle(this,shape);if(shape instanceof Flatten.Segment)return Flatten.Distance.point2segment(this,shape);if(shape instanceof Flatten.Arc)return Flatten.Distance.point2arc(this,shape);if(shape instanceof Flatten.Polygon)return Flatten.Distance.point2polygon(this,shape);if(shape instanceof Flatten.PlanarSet)return Flatten.Distance.shape2planarSet(this,shape);if(shape instanceof Flatten.Multiline)return Flatten.Distance.shape2multiline(this,shape)}on(shape){if(shape instanceof Flatten.Point)return this.equalTo(shape);if(shape.contains&&shape.contains instanceof Function)return shape.contains(this);throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}get name(){return"point"}svg(attrs={}){let r4=attrs.r??3;return`
|
|
319
|
+
</path>`,svgStr}};Flatten.Multiline=Multiline$1;var multiline=(...args)=>new Flatten.Multiline(...args);Flatten.multiline=multiline;function addToIntPoints(edge,pt4,int_points){let id2=int_points.length,shapes=edge.shape.split(pt4);if(shapes.length===0)return;let len=0;shapes[0]===null?len=0:shapes[1]===null?len=edge.shape.length:len=shapes[0].length;let is_vertex=NOT_VERTEX$1;EQ(len,0)&&(is_vertex|=START_VERTEX$1),EQ(len,edge.shape.length)&&(is_vertex|=END_VERTEX$1);let arc_length;len===1/0?arc_length=shapes[0].coord(pt4):arc_length=is_vertex&END_VERTEX$1&&edge.next&&edge.next.arc_length===0?0:edge.arc_length+len,int_points.push({id:id2,pt:pt4,arc_length,edge_before:edge,edge_after:void 0,face:edge.face,is_vertex})}function sortIntersections(intersections){intersections.int_points1_sorted=getSortedArray(intersections.int_points1),intersections.int_points2_sorted=getSortedArray(intersections.int_points2)}function getSortedArray(int_points){let faceMap=new Map,id2=0;for(let ip3 of int_points)faceMap.has(ip3.face)||(faceMap.set(ip3.face,id2),id2++);for(let ip3 of int_points)ip3.faceId=faceMap.get(ip3.face);return int_points.slice().sort(compareFn)}function compareFn(ip1,ip22){return ip1.faceId<ip22.faceId?-1:ip1.faceId>ip22.faceId?1:ip1.arc_length<ip22.arc_length?-1:ip1.arc_length>ip22.arc_length?1:0}function filterDuplicatedIntersections(intersections){if(intersections.int_points1.length<2)return;let do_squeeze=!1,int_point_ref1,int_point_ref2,int_point_cur1,int_point_cur2;for(let i2=0;i2<intersections.int_points1_sorted.length;i2++)if(intersections.int_points1_sorted[i2].id!==-1){int_point_ref1=intersections.int_points1_sorted[i2],int_point_ref2=intersections.int_points2[int_point_ref1.id];for(let j4=i2+1;j4<intersections.int_points1_sorted.length&&(int_point_cur1=intersections.int_points1_sorted[j4],!!EQ(int_point_cur1.arc_length,int_point_ref1.arc_length));j4++)int_point_cur1.id!==-1&&(int_point_cur2=intersections.int_points2[int_point_cur1.id],int_point_cur2.id!==-1&&int_point_cur1.edge_before===int_point_ref1.edge_before&&int_point_cur1.edge_after===int_point_ref1.edge_after&&int_point_cur2.edge_before===int_point_ref2.edge_before&&int_point_cur2.edge_after===int_point_ref2.edge_after&&(int_point_cur1.id=-1,int_point_cur2.id=-1,do_squeeze=!0))}int_point_ref2=intersections.int_points2_sorted[0],int_point_ref1=intersections.int_points1[int_point_ref2.id];for(let i2=1;i2<intersections.int_points2_sorted.length;i2++){let int_point_cur22=intersections.int_points2_sorted[i2];if(int_point_cur22.id===-1)continue;if(int_point_ref2.id===-1||!EQ(int_point_cur22.arc_length,int_point_ref2.arc_length)){int_point_ref2=int_point_cur22,int_point_ref1=intersections.int_points1[int_point_ref2.id];continue}let int_point_cur12=intersections.int_points1[int_point_cur22.id];int_point_cur12.edge_before===int_point_ref1.edge_before&&int_point_cur12.edge_after===int_point_ref1.edge_after&&int_point_cur22.edge_before===int_point_ref2.edge_before&&int_point_cur22.edge_after===int_point_ref2.edge_after&&(int_point_cur12.id=-1,int_point_cur22.id=-1,do_squeeze=!0)}do_squeeze&&(intersections.int_points1=intersections.int_points1.filter(int_point=>int_point.id>=0),intersections.int_points2=intersections.int_points2.filter(int_point=>int_point.id>=0),intersections.int_points1.forEach((int_point,index)=>int_point.id=index),intersections.int_points2.forEach((int_point,index)=>int_point.id=index))}function initializeInclusionFlags(int_points){for(let int_point of int_points)int_point.edge_before&&(int_point.edge_before.bvStart=void 0,int_point.edge_before.bvEnd=void 0,int_point.edge_before.bv=void 0,int_point.edge_before.overlap=void 0),int_point.edge_after&&(int_point.edge_after.bvStart=void 0,int_point.edge_after.bvEnd=void 0,int_point.edge_after.bv=void 0,int_point.edge_after.overlap=void 0);for(let int_point of int_points)int_point.edge_before&&(int_point.edge_before.bvEnd=BOUNDARY$1),int_point.edge_after&&(int_point.edge_after.bvStart=BOUNDARY$1)}function calculateInclusionFlags(int_points,polygon2){for(let int_point of int_points)int_point.edge_before&&int_point.edge_before.setInclusion(polygon2),int_point.edge_after&&int_point.edge_after.setInclusion(polygon2)}function setOverlappingFlags(intersections){let cur_face,first_int_point_in_face_id,next_int_point1,num_int_points=intersections.int_points1.length;for(let i2=0;i2<num_int_points;i2++){let cur_int_point1=intersections.int_points1_sorted[i2];cur_int_point1.face!==cur_face&&(first_int_point_in_face_id=i2,cur_face=cur_int_point1.face);let int_points_cur_pool_start=i2,int_points_cur_pool_num=intPointsPoolCount(intersections.int_points1_sorted,i2,cur_face),next_int_point_id;int_points_cur_pool_start+int_points_cur_pool_num<num_int_points&&intersections.int_points1_sorted[int_points_cur_pool_start+int_points_cur_pool_num].face===cur_face?next_int_point_id=int_points_cur_pool_start+int_points_cur_pool_num:next_int_point_id=first_int_point_in_face_id;let int_points_next_pool_num=intPointsPoolCount(intersections.int_points1_sorted,next_int_point_id,cur_face);next_int_point1=null;for(let j4=next_int_point_id;j4<next_int_point_id+int_points_next_pool_num;j4++){let next_int_point1_tmp=intersections.int_points1_sorted[j4];if(next_int_point1_tmp.face===cur_face&&intersections.int_points2[next_int_point1_tmp.id].face===intersections.int_points2[cur_int_point1.id].face){next_int_point1=next_int_point1_tmp;break}}if(next_int_point1===null)continue;let edge_from1=cur_int_point1.edge_after,edge_to1=next_int_point1.edge_before;if(!(edge_from1.bv===BOUNDARY$1&&edge_to1.bv===BOUNDARY$1)||edge_from1!==edge_to1)continue;let cur_int_point2=intersections.int_points2[cur_int_point1.id],next_int_point2=intersections.int_points2[next_int_point1.id],edge_from2=cur_int_point2.edge_after,edge_to2=next_int_point2.edge_before;edge_from2.bv===BOUNDARY$1&&edge_to2.bv===BOUNDARY$1&&edge_from2===edge_to2||(cur_int_point2=intersections.int_points2[next_int_point1.id],next_int_point2=intersections.int_points2[cur_int_point1.id],edge_from2=cur_int_point2.edge_after,edge_to2=next_int_point2.edge_before),edge_from2.bv===BOUNDARY$1&&edge_to2.bv===BOUNDARY$1&&edge_from2===edge_to2&&edge_from1.setOverlap(edge_from2)}}function intPointsPoolCount(int_points,cur_int_point_num,cur_face){let int_point_current,int_point_next,int_points_pool_num=1;if(int_points.length===1)return 1;int_point_current=int_points[cur_int_point_num];for(let i2=cur_int_point_num+1;i2<int_points.length&&!(int_point_current.face!==cur_face||(int_point_next=int_points[i2],!(int_point_next.pt.equalTo(int_point_current.pt)&&int_point_next.edge_before===int_point_current.edge_before&&int_point_next.edge_after===int_point_current.edge_after)));i2++)int_points_pool_num++;return int_points_pool_num}function splitByIntersections(polygon2,int_points){if(int_points){for(let int_point of int_points){let edge=int_point.edge_before;if(int_point.is_vertex=NOT_VERTEX$1,edge.shape.start&&edge.shape.start.equalTo(int_point.pt)&&(int_point.is_vertex|=START_VERTEX$1),edge.shape.end&&edge.shape.end.equalTo(int_point.pt)&&(int_point.is_vertex|=END_VERTEX$1),int_point.is_vertex&START_VERTEX$1){int_point.edge_before=edge.prev,edge.prev&&(int_point.is_vertex=END_VERTEX$1);continue}if(int_point.is_vertex&END_VERTEX$1)continue;let newEdge=polygon2.addVertex(int_point.pt,edge);int_point.edge_before=newEdge}for(let int_point of int_points)int_point.edge_before?int_point.edge_after=int_point.edge_before.next:polygon2 instanceof Multiline$1&&int_point.is_vertex&START_VERTEX$1&&(int_point.edge_after=polygon2.first)}}function insertBetweenIntPoints(int_point1,int_point2,new_edges){let edge_before=int_point1.edge_before,edge_after=int_point2.edge_after,len=new_edges.length;edge_before.next=new_edges[0],new_edges[0].prev=edge_before,new_edges[len-1].next=edge_after,edge_after.prev=new_edges[len-1]}var{INSIDE:INSIDE$1,OUTSIDE,BOUNDARY,OVERLAP_SAME,OVERLAP_OPPOSITE}=Constants,{NOT_VERTEX,START_VERTEX,END_VERTEX}=Constants,BOOLEAN_UNION=1,BOOLEAN_INTERSECT=2,BOOLEAN_SUBTRACT=3;function unify(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_UNION,!0);return res_poly}function subtract(polygon1,polygon2){let polygon2_reversed=polygon2.clone().reverse(),[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2_reversed,BOOLEAN_SUBTRACT,!0);return res_poly}function intersect$1(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_INTERSECT,!0);return res_poly}function innerClip(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_INTERSECT,!1),clip_shapes1=[];for(let face of res_poly.faces)clip_shapes1=[...clip_shapes1,...[...face.edges].map(edge=>edge.shape)];let clip_shapes2=[];for(let face of wrk_poly.faces)clip_shapes2=[...clip_shapes2,...[...face.edges].map(edge=>edge.shape)];return[clip_shapes1,clip_shapes2]}function outerClip(polygon1,polygon2){let[res_poly,wrk_poly]=booleanOpBinary(polygon1,polygon2,BOOLEAN_SUBTRACT,!1),clip_shapes1=[];for(let face of res_poly.faces)clip_shapes1=[...clip_shapes1,...[...face.edges].map(edge=>edge.shape)];return clip_shapes1}function calculateIntersections(polygon1,polygon2){let res_poly=polygon1.clone(),wrk_poly=polygon2.clone(),intersections=getIntersections(res_poly,wrk_poly);sortIntersections(intersections),splitByIntersections(res_poly,intersections.int_points1_sorted),splitByIntersections(wrk_poly,intersections.int_points2_sorted),filterDuplicatedIntersections(intersections),sortIntersections(intersections);let ip_sorted1=intersections.int_points1_sorted.map(int_point=>int_point.pt),ip_sorted2=intersections.int_points2_sorted.map(int_point=>int_point.pt);return[ip_sorted1,ip_sorted2]}function filterNotRelevantEdges(res_poly,wrk_poly,intersections,op3){let notIntersectedFacesRes=getNotIntersectedFaces(res_poly,intersections.int_points1),notIntersectedFacesWrk=getNotIntersectedFaces(wrk_poly,intersections.int_points2);for(calcInclusionForNotIntersectedFaces(notIntersectedFacesRes,wrk_poly),calcInclusionForNotIntersectedFaces(notIntersectedFacesWrk,res_poly),initializeInclusionFlags(intersections.int_points1),initializeInclusionFlags(intersections.int_points2),calculateInclusionFlags(intersections.int_points1,wrk_poly),calculateInclusionFlags(intersections.int_points2,res_poly);fixBoundaryConflicts(res_poly,wrk_poly,intersections.int_points1,intersections.int_points1_sorted,intersections.int_points2,intersections););setOverlappingFlags(intersections),removeNotRelevantChains(res_poly,op3,intersections.int_points1_sorted,!0),removeNotRelevantChains(wrk_poly,op3,intersections.int_points2_sorted,!1),removeNotRelevantNotIntersectedFaces(res_poly,notIntersectedFacesRes,op3,!0),removeNotRelevantNotIntersectedFaces(wrk_poly,notIntersectedFacesWrk,op3,!1)}function swapLinksAndRestore(res_poly,wrk_poly,intersections,op3){copyWrkToRes(res_poly,wrk_poly,op3,intersections.int_points2),swapLinks(res_poly,wrk_poly,intersections),removeOldFaces(res_poly,intersections.int_points1),removeOldFaces(wrk_poly,intersections.int_points2),restoreFaces(res_poly,intersections.int_points1,intersections.int_points2),restoreFaces(res_poly,intersections.int_points2,intersections.int_points1),removeDetachedEdges(res_poly),removeDetachedEdges(wrk_poly)}function booleanOpBinary(polygon1,polygon2,op3,restore){let res_poly=polygon1.clone(),wrk_poly=polygon2.clone(),intersections=getIntersections(res_poly,wrk_poly);return sortIntersections(intersections),splitByIntersections(res_poly,intersections.int_points1_sorted),splitByIntersections(wrk_poly,intersections.int_points2_sorted),filterDuplicatedIntersections(intersections),sortIntersections(intersections),filterNotRelevantEdges(res_poly,wrk_poly,intersections,op3),restore&&swapLinksAndRestore(res_poly,wrk_poly,intersections,op3),[res_poly,wrk_poly]}function getIntersections(polygon1,polygon2){let intersections={int_points1:[],int_points2:[]};for(let edge1 of polygon1.edges){let resp=polygon2.edges.search(edge1.box);for(let edge2 of resp){let ip3=edge1.shape.intersect(edge2.shape);for(let pt4 of ip3)addToIntPoints(edge1,pt4,intersections.int_points1),addToIntPoints(edge2,pt4,intersections.int_points2)}}return intersections}function getNotIntersectedFaces(poly,int_points){let notIntersected=[];for(let face of poly.faces)int_points.find(ip3=>ip3.face===face)||notIntersected.push(face);return notIntersected}function calcInclusionForNotIntersectedFaces(notIntersectedFaces,poly2){for(let face of notIntersectedFaces)face.first.bv=face.first.bvStart=face.first.bvEnd=void 0,face.first.setInclusion(poly2)}function fixBoundaryConflicts(poly1,poly2,int_points1,int_points1_sorted,int_points2,intersections){let cur_face,first_int_point_in_face_id,next_int_point1,num_int_points=int_points1_sorted.length,iterate_more=!1;for(let i2=0;i2<num_int_points;i2++){let cur_int_point1=int_points1_sorted[i2];cur_int_point1.face!==cur_face&&(first_int_point_in_face_id=i2,cur_face=cur_int_point1.face);let int_points_cur_pool_start=i2,int_points_cur_pool_num=intPointsPoolCount(int_points1_sorted,i2,cur_face),next_int_point_id;int_points_cur_pool_start+int_points_cur_pool_num<num_int_points&&int_points1_sorted[int_points_cur_pool_start+int_points_cur_pool_num].face===cur_face?next_int_point_id=int_points_cur_pool_start+int_points_cur_pool_num:next_int_point_id=first_int_point_in_face_id;let int_points_next_pool_num=intPointsPoolCount(int_points1_sorted,next_int_point_id,cur_face);next_int_point1=null;for(let j4=next_int_point_id;j4<next_int_point_id+int_points_next_pool_num;j4++){let next_int_point1_tmp=int_points1_sorted[j4];if(next_int_point1_tmp.face===cur_face&&int_points2[next_int_point1_tmp.id].face===int_points2[cur_int_point1.id].face){next_int_point1=next_int_point1_tmp;break}}if(next_int_point1===null)continue;let edge_from1=cur_int_point1.edge_after,edge_to1=next_int_point1.edge_before;if(edge_from1.bv===BOUNDARY&&edge_to1.bv!=BOUNDARY){edge_from1.bv=edge_to1.bv;continue}if(edge_from1.bv!=BOUNDARY&&edge_to1.bv===BOUNDARY){edge_to1.bv=edge_from1.bv;continue}if(edge_from1.bv===BOUNDARY&&edge_to1.bv===BOUNDARY&&edge_from1!=edge_to1||edge_from1.bv===INSIDE$1&&edge_to1.bv===OUTSIDE||edge_from1.bv===OUTSIDE&&edge_to1.bv===INSIDE$1){let edge_tmp=edge_from1.next;for(;edge_tmp!=edge_to1;)edge_tmp.bvStart=void 0,edge_tmp.bvEnd=void 0,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2),edge_tmp=edge_tmp.next}if(edge_from1.bv===BOUNDARY&&edge_to1.bv===BOUNDARY&&edge_from1!=edge_to1){let edge_tmp=edge_from1.next,new_bv;for(;edge_tmp!=edge_to1;){if(edge_tmp.bv!=BOUNDARY){if(new_bv===void 0)new_bv=edge_tmp.bv;else if(edge_tmp.bv!=new_bv)throw Errors.UNRESOLVED_BOUNDARY_CONFLICT}edge_tmp=edge_tmp.next}new_bv!=null&&(edge_from1.bv=new_bv,edge_to1.bv=new_bv);continue}if(edge_from1.bv===INSIDE$1&&edge_to1.bv===OUTSIDE||edge_from1.bv===OUTSIDE&&edge_to1.bv===INSIDE$1){let edge_tmp=edge_from1;for(;edge_tmp!=edge_to1;){if(edge_tmp.bvStart===edge_from1.bv&&edge_tmp.bvEnd===edge_to1.bv){let[dist,segment2]=edge_tmp.shape.distanceTo(poly2);if(dist<10*Flatten.DP_TOL){addToIntPoints(edge_tmp,segment2.ps,int_points1);let int_point1=int_points1[int_points1.length-1];if(int_point1.is_vertex&START_VERTEX)int_point1.edge_after=edge_tmp,int_point1.edge_before=edge_tmp.prev,edge_tmp.bvStart=BOUNDARY,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2);else if(int_point1.is_vertex&END_VERTEX)int_point1.edge_after=edge_tmp.next,edge_tmp.bvEnd=BOUNDARY,edge_tmp.bv=void 0,edge_tmp.setInclusion(poly2);else{let newEdge1=poly2.addVertex(int_point1.pt,edge_tmp);int_point1.edge_before=newEdge1,int_point1.edge_after=newEdge1.next,newEdge1.setInclusion(poly2),newEdge1.next.bvStart=BOUNDARY,newEdge1.next.bvEnd=void 0,newEdge1.next.bv=void 0,newEdge1.next.setInclusion(poly2)}let edge2=poly2.findEdgeByPoint(segment2.pe);addToIntPoints(edge2,segment2.pe,int_points2);let int_point2=int_points2[int_points2.length-1];if(int_point2.is_vertex&START_VERTEX)int_point2.edge_after=edge2,int_point2.edge_before=edge2.prev;else if(int_point2.is_vertex&END_VERTEX)int_point2.edge_after=edge2.next;else{let int_point2_edge_after=int_points2.find(int_point=>int_point.edge_after===edge2),newEdge2=poly2.addVertex(int_point2.pt,edge2);int_point2.edge_before=newEdge2,int_point2.edge_after=newEdge2.next,int_point2_edge_after&&(int_point2_edge_after.edge_after=newEdge2),newEdge2.bvStart=void 0,newEdge2.bvEnd=BOUNDARY,newEdge2.bv=void 0,newEdge2.setInclusion(poly1),newEdge2.next.bvStart=BOUNDARY,newEdge2.next.bvEnd=void 0,newEdge2.next.bv=void 0,newEdge2.next.setInclusion(poly1)}sortIntersections(intersections),iterate_more=!0;break}}edge_tmp=edge_tmp.next}if(iterate_more)break;throw Errors.UNRESOLVED_BOUNDARY_CONFLICT}}return iterate_more}function removeNotRelevantChains(polygon2,op3,int_points,is_res_polygon){if(!int_points)return;let cur_face,first_int_point_in_face_num,int_point_current,int_point_next;for(let i2=0;i2<int_points.length;i2++){if(int_point_current=int_points[i2],int_point_current.face!==cur_face&&(first_int_point_in_face_num=i2,cur_face=int_point_current.face),cur_face.isEmpty())continue;let int_points_from_pull_start=i2,int_points_from_pull_num=intPointsPoolCount(int_points,i2,cur_face),next_int_point_num;int_points_from_pull_start+int_points_from_pull_num<int_points.length&&int_points[int_points_from_pull_start+int_points_from_pull_num].face===int_point_current.face?next_int_point_num=int_points_from_pull_start+int_points_from_pull_num:next_int_point_num=first_int_point_in_face_num,int_point_next=int_points[next_int_point_num];let int_points_to_pull_start=next_int_point_num,int_points_to_pull_num=intPointsPoolCount(int_points,int_points_to_pull_start,cur_face),edge_from=int_point_current.edge_after,edge_to=int_point_next.edge_before;if(edge_from.bv===INSIDE$1&&edge_to.bv===INSIDE$1&&op3===BOOLEAN_UNION||edge_from.bv===OUTSIDE&&edge_to.bv===OUTSIDE&&op3===BOOLEAN_INTERSECT||(edge_from.bv===OUTSIDE||edge_to.bv===OUTSIDE)&&op3===BOOLEAN_SUBTRACT&&!is_res_polygon||(edge_from.bv===INSIDE$1||edge_to.bv===INSIDE$1)&&op3===BOOLEAN_SUBTRACT&&is_res_polygon||edge_from.bv===BOUNDARY&&edge_to.bv===BOUNDARY&&edge_from.overlap&OVERLAP_SAME&&is_res_polygon||edge_from.bv===BOUNDARY&&edge_to.bv===BOUNDARY&&edge_from.overlap&OVERLAP_OPPOSITE){polygon2.removeChain(cur_face,edge_from,edge_to);for(let k4=int_points_from_pull_start;k4<int_points_from_pull_start+int_points_from_pull_num;k4++)int_points[k4].edge_after=void 0;for(let k4=int_points_to_pull_start;k4<int_points_to_pull_start+int_points_to_pull_num;k4++)int_points[k4].edge_before=void 0}i2+=int_points_from_pull_num-1}}function copyWrkToRes(res_polygon,wrk_polygon,op3,int_points){for(let face of wrk_polygon.faces){for(let edge of face)res_polygon.edges.add(edge);int_points.find(ip3=>ip3.face===face)===void 0&&res_polygon.addFace(face.first,face.last)}}function swapLinks(res_polygon,wrk_polygon,intersections){if(intersections.int_points1.length!==0)for(let i2=0;i2<intersections.int_points1.length;i2++){let int_point1=intersections.int_points1[i2],int_point2=intersections.int_points2[i2];if(int_point1.edge_before!==void 0&&int_point1.edge_after===void 0&&int_point2.edge_before===void 0&&int_point2.edge_after!==void 0&&(int_point1.edge_before.next=int_point2.edge_after,int_point2.edge_after.prev=int_point1.edge_before,int_point1.edge_after=int_point2.edge_after,int_point2.edge_before=int_point1.edge_before),int_point2.edge_before!==void 0&&int_point2.edge_after===void 0&&int_point1.edge_before===void 0&&int_point1.edge_after!==void 0&&(int_point2.edge_before.next=int_point1.edge_after,int_point1.edge_after.prev=int_point2.edge_before,int_point2.edge_after=int_point1.edge_after,int_point1.edge_before=int_point2.edge_before),int_point1.edge_before!==void 0&&int_point1.edge_after===void 0)for(let int_point of intersections.int_points1_sorted)int_point!==int_point1&&int_point.edge_before===void 0&&int_point.edge_after!==void 0&&int_point.pt.equalTo(int_point1.pt)&&(int_point1.edge_before.next=int_point.edge_after,int_point.edge_after.prev=int_point1.edge_before,int_point1.edge_after=int_point.edge_after,int_point.edge_before=int_point1.edge_before);if(int_point2.edge_before!==void 0&&int_point2.edge_after===void 0)for(let int_point of intersections.int_points2_sorted)int_point!==int_point2&&int_point.edge_before===void 0&&int_point.edge_after!==void 0&&int_point.pt.equalTo(int_point2.pt)&&(int_point2.edge_before.next=int_point.edge_after,int_point.edge_after.prev=int_point2.edge_before,int_point2.edge_after=int_point.edge_after,int_point.edge_before=int_point2.edge_before)}}function removeOldFaces(polygon2,int_points){for(let int_point of int_points)polygon2.faces.delete(int_point.face),int_point.face=void 0,int_point.edge_before&&(int_point.edge_before.face=void 0),int_point.edge_after&&(int_point.edge_after.face=void 0)}function restoreFaces(polygon2,int_points,other_int_points){for(let int_point of int_points){if(int_point.edge_before===void 0||int_point.edge_after===void 0||int_point.face||int_point.edge_after.face||int_point.edge_before.face)continue;let first=int_point.edge_after,last=int_point.edge_before;try{LinkedList.testInfiniteLoop(first)}catch{throw Errors.CANNOT_COMPLETE_BOOLEAN_OPERATION}let face=polygon2.addFace(first,last);for(let int_point_tmp of int_points)int_point_tmp.edge_before&&int_point_tmp.edge_after&&int_point_tmp.edge_before.face===face&&int_point_tmp.edge_after.face===face&&(int_point_tmp.face=face);for(let int_point_tmp of other_int_points)int_point_tmp.edge_before&&int_point_tmp.edge_after&&int_point_tmp.edge_before.face===face&&int_point_tmp.edge_after.face===face&&(int_point_tmp.face=face)}}function removeNotRelevantNotIntersectedFaces(polygon2,notIntersectedFaces,op3,is_res_polygon){for(let face of notIntersectedFaces){let rel=face.first.bv;(op3===BOOLEAN_UNION&&rel===INSIDE$1||op3===BOOLEAN_SUBTRACT&&rel===INSIDE$1&&is_res_polygon||op3===BOOLEAN_SUBTRACT&&rel===OUTSIDE&&!is_res_polygon||op3===BOOLEAN_INTERSECT&&rel===OUTSIDE)&&polygon2.deleteFace(face)}}function removeDetachedEdges(polygon2){let detachedEdges=[];for(let edge of polygon2.edges)(!edge.face||!polygon2.faces.has(edge.face))&&detachedEdges.push(edge);for(let edge of detachedEdges)polygon2.edges.delete(edge)}var BooleanOperations=Object.freeze({__proto__:null,BOOLEAN_INTERSECT,BOOLEAN_SUBTRACT,BOOLEAN_UNION,calculateIntersections,innerClip,intersect:intersect$1,outerClip,removeNotRelevantChains,removeOldFaces,restoreFaces,subtract,unify}),EQUAL=RegExp("T.F..FFF.|T.F...F.."),INTERSECT=RegExp("T........|.T.......|...T.....|....T...."),TOUCH=RegExp("FT.......|F..T.....|F...T...."),INSIDE=RegExp("T.F..F..."),COVERED=RegExp("T.F..F...|.TF..F...|..FT.F...|..F.TF..."),DE9IM=class{constructor(){this.m=new Array(9).fill(void 0)}get I2I(){return this.m[0]}set I2I(geom){this.m[0]=geom}get I2B(){return this.m[1]}set I2B(geom){this.m[1]=geom}get I2E(){return this.m[2]}set I2E(geom){this.m[2]=geom}get B2I(){return this.m[3]}set B2I(geom){this.m[3]=geom}get B2B(){return this.m[4]}set B2B(geom){this.m[4]=geom}get B2E(){return this.m[5]}set B2E(geom){this.m[5]=geom}get E2I(){return this.m[6]}set E2I(geom){this.m[6]=geom}get E2B(){return this.m[7]}set E2B(geom){this.m[7]=geom}get E2E(){return this.m[8]}set E2E(geom){this.m[8]=geom}toString(){return this.m.map(e4=>e4 instanceof Array&&e4.length>0?"T":e4 instanceof Array&&e4.length===0?"F":"*").join("")}equal(){return EQUAL.test(this.toString())}intersect(){return INTERSECT.test(this.toString())}touch(){return TOUCH.test(this.toString())}inside(){return INSIDE.test(this.toString())}covered(){return COVERED.test(this.toString())}};function ray_shoot(polygon2,point6){let contains,ray2=new Flatten.Ray(point6),line2=new Flatten.Line(ray2.pt,ray2.norm),searchBox=new Flatten.Box(ray2.box.xmin-Flatten.DP_TOL,ray2.box.ymin-Flatten.DP_TOL,ray2.box.xmax+Flatten.DP_TOL,ray2.box.ymax+Flatten.DP_TOL);if(polygon2.box.not_intersect(searchBox))return Flatten.OUTSIDE;let resp_edges=polygon2.edges.search(searchBox);if(resp_edges.length===0)return Flatten.OUTSIDE;for(let edge of resp_edges)if(edge.shape.contains(point6))return Flatten.BOUNDARY;let faces=[...polygon2.faces],intersections=[];for(let edge of resp_edges)for(let ip3 of ray2.intersect(edge.shape)){if(ip3.equalTo(point6))return Flatten.BOUNDARY;intersections.push({pt:ip3,edge,face_index:faces.indexOf(edge.face)})}intersections.sort((i12,i2)=>LT(i12.pt.x,i2.pt.x)?-1:GT(i12.pt.x,i2.pt.x)?1:i12.face_index<i2.face_index?-1:i12.face_index>i2.face_index?1:i12.edge.arc_length<i2.edge.arc_length?-1:i12.edge.arc_length>i2.edge.arc_length?1:0);let counter=0;for(let i2=0;i2<intersections.length;i2++){let intersection=intersections[i2];if(intersection.pt.equalTo(intersection.edge.shape.start)){if(i2>0&&intersection.pt.equalTo(intersections[i2-1].pt)&&intersection.face_index===intersections[i2-1].face_index&&intersection.edge.prev===intersections[i2-1].edge)continue;let prev_edge=intersection.edge.prev;for(;EQ_0(prev_edge.length);)prev_edge=prev_edge.prev;let prev_tangent=prev_edge.shape.tangentInEnd(),prev_point=intersection.pt.translate(prev_tangent),cur_tangent=intersection.edge.shape.tangentInStart(),cur_point=intersection.pt.translate(cur_tangent),prev_on_the_left=prev_point.leftTo(line2),cur_on_the_left=cur_point.leftTo(line2);(prev_on_the_left&&!cur_on_the_left||!prev_on_the_left&&cur_on_the_left)&&counter++}else if(intersection.pt.equalTo(intersection.edge.shape.end)){if(i2>0&&intersection.pt.equalTo(intersections[i2-1].pt)&&intersection.face_index===intersections[i2-1].face_index&&intersection.edge.next===intersections[i2-1].edge)continue;let next_edge=intersection.edge.next;for(;EQ_0(next_edge.length);)next_edge=next_edge.next;let next_tangent=next_edge.shape.tangentInStart(),next_point=intersection.pt.translate(next_tangent),cur_tangent=intersection.edge.shape.tangentInEnd(),cur_point=intersection.pt.translate(cur_tangent),next_on_the_left=next_point.leftTo(line2),cur_on_the_left=cur_point.leftTo(line2);(next_on_the_left&&!cur_on_the_left||!next_on_the_left&&cur_on_the_left)&&counter++}else if(intersection.edge.shape instanceof Flatten.Segment)counter++;else{let box2=intersection.edge.shape.box;EQ(intersection.pt.y,box2.ymin)||EQ(intersection.pt.y,box2.ymax)||counter++}}return contains=counter%2===1?INSIDE$2:OUTSIDE$1,contains}function equal(shape1,shape2){return relate(shape1,shape2).equal()}function intersect(shape1,shape2){return relate(shape1,shape2).intersect()}function touch(shape1,shape2){return relate(shape1,shape2).touch()}function disjoint(shape1,shape2){return!intersect(shape1,shape2)}function inside(shape1,shape2){return relate(shape1,shape2).inside()}function covered(shape1,shape2){return relate(shape1,shape2).covered()}function contain(shape1,shape2){return inside(shape2,shape1)}function cover(shape1,shape2){return covered(shape2,shape1)}function relate(shape1,shape2){if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Line)return relateLine2Line(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Circle)return relateLine2Circle(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Box)return relateLine2Box(shape1,shape2);if(shape1 instanceof Flatten.Line&&shape2 instanceof Flatten.Polygon)return relateLine2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Segment||shape1 instanceof Flatten.Arc)&&shape2 instanceof Flatten.Polygon)return relateShape2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Segment||shape1 instanceof Flatten.Arc)&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relateShape2Polygon(shape1,new Flatten.Polygon(shape2));if(shape1 instanceof Flatten.Polygon&&shape2 instanceof Flatten.Polygon)return relatePolygon2Polygon(shape1,shape2);if((shape1 instanceof Flatten.Circle||shape1 instanceof Flatten.Box)&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relatePolygon2Polygon(new Flatten.Polygon(shape1),new Flatten.Polygon(shape2));if((shape1 instanceof Flatten.Circle||shape1 instanceof Flatten.Box)&&shape2 instanceof Flatten.Polygon)return relatePolygon2Polygon(new Flatten.Polygon(shape1),shape2);if(shape1 instanceof Flatten.Polygon&&(shape2 instanceof Flatten.Circle||shape2 instanceof Flatten.Box))return relatePolygon2Polygon(shape1,new Flatten.Polygon(shape2))}function relateLine2Line(line1,line2){let denim=new DE9IM,ip3=intersectLine2Line(line1,line2);return ip3.length===0?line1.contains(line2.pt)&&line2.contains(line1.pt)?(denim.I2I=[line1],denim.I2E=[],denim.E2I=[]):(denim.I2I=[],denim.I2E=[line1],denim.E2I=[line2]):(denim.I2I=ip3,denim.I2E=line1.split(ip3),denim.E2I=line2.split(ip3)),denim}function relateLine2Circle(line2,circle2){let denim=new DE9IM,ip3=intersectLine2Circle(line2,circle2);if(ip3.length===0)denim.I2I=[],denim.I2B=[],denim.I2E=[line2],denim.E2I=[circle2];else if(ip3.length===1)denim.I2I=[],denim.I2B=ip3,denim.I2E=line2.split(ip3),denim.E2I=[circle2];else{let multiline2=new Multiline$1([line2]),ip_sorted=line2.sortPoints(ip3);multiline2.split(ip_sorted);let splitShapes=multiline2.toShapes();denim.I2I=[splitShapes[1]],denim.I2B=ip_sorted,denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=new Flatten.Polygon([circle2.toArc()]).cutWithLine(line2)}return denim}function relateLine2Box(line2,box2){let denim=new DE9IM,ip3=intersectLine2Box(line2,box2);if(ip3.length===0)denim.I2I=[],denim.I2B=[],denim.I2E=[line2],denim.E2I=[box2];else if(ip3.length===1)denim.I2I=[],denim.I2B=ip3,denim.I2E=line2.split(ip3),denim.E2I=[box2];else{let multiline2=new Multiline$1([line2]),ip_sorted=line2.sortPoints(ip3);multiline2.split(ip_sorted);let splitShapes=multiline2.toShapes();box2.toSegments().some(segment2=>segment2.contains(ip3[0])&&segment2.contains(ip3[1]))?(denim.I2I=[],denim.I2B=[splitShapes[1]],denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=[box2]):(denim.I2I=[splitShapes[1]],denim.I2B=ip_sorted,denim.I2E=[splitShapes[0],splitShapes[2]],denim.E2I=new Flatten.Polygon(box2.toSegments()).cutWithLine(line2))}return denim}function relateLine2Polygon(line2,polygon2){let denim=new DE9IM,ip3=intersectLine2Polygon(line2,polygon2),multiline2=new Multiline$1([line2]),ip_sorted=ip3.length>0?ip3.slice():line2.sortPoints(ip3);return multiline2.split(ip_sorted),[...multiline2].forEach(edge=>edge.setInclusion(polygon2)),denim.I2I=[...multiline2].filter(edge=>edge.bv===Flatten.INSIDE).map(edge=>edge.shape),denim.I2B=[...multiline2].slice(1).map(edge=>edge.bv===Flatten.BOUNDARY?edge.shape:edge.shape.start),denim.I2E=[...multiline2].filter(edge=>edge.bv===Flatten.OUTSIDE).map(edge=>edge.shape),denim.E2I=polygon2.cutWithLine(line2),denim}function relateShape2Polygon(shape,polygon2){let denim=new DE9IM,ip3=intersectShape2Polygon(shape,polygon2),ip_sorted=ip3.length>0?ip3.slice():shape.sortPoints(ip3),multiline2=new Multiline$1([shape]);multiline2.split(ip_sorted),[...multiline2].forEach(edge=>edge.setInclusion(polygon2)),denim.I2I=[...multiline2].filter(edge=>edge.bv===Flatten.INSIDE).map(edge=>edge.shape),denim.I2B=[...multiline2].slice(1).map(edge=>edge.bv===Flatten.BOUNDARY?edge.shape:edge.shape.start),denim.I2E=[...multiline2].filter(edge=>edge.bv===Flatten.OUTSIDE).map(edge=>edge.shape),denim.B2I=[],denim.B2B=[],denim.B2E=[];for(let pt4 of[shape.start,shape.end])switch(ray_shoot(polygon2,pt4)){case Flatten.INSIDE:denim.B2I.push(pt4);break;case Flatten.BOUNDARY:denim.B2B.push(pt4);break;case Flatten.OUTSIDE:denim.B2E.push(pt4);break}return denim}function relatePolygon2Polygon(polygon1,polygon2){let denim=new DE9IM,[ip_sorted1,ip_sorted2]=calculateIntersections(polygon1,polygon2),boolean_intersection=intersect$1(polygon1,polygon2),boolean_difference1=subtract(polygon1,polygon2),boolean_difference2=subtract(polygon2,polygon1),[inner_clip_shapes1,inner_clip_shapes2]=innerClip(polygon1,polygon2),outer_clip_shapes1=outerClip(polygon1,polygon2),outer_clip_shapes2=outerClip(polygon2,polygon1);return denim.I2I=boolean_intersection.isEmpty()?[]:[boolean_intersection],denim.I2B=inner_clip_shapes2,denim.I2E=boolean_difference1.isEmpty()?[]:[boolean_difference1],denim.B2I=inner_clip_shapes1,denim.B2B=ip_sorted1,denim.B2E=outer_clip_shapes1,denim.E2I=boolean_difference2.isEmpty()?[]:[boolean_difference2],denim.E2B=outer_clip_shapes2,denim}var Relations=Object.freeze({__proto__:null,contain,cover,covered,disjoint,equal,inside,intersect,relate,touch}),Matrix=class _Matrix{constructor(a2=1,b3=0,c3=0,d3=1,tx3=0,ty3=0){this.a=a2,this.b=b3,this.c=c3,this.d=d3,this.tx=tx3,this.ty=ty3}fromMatrix3x3(matrix3x3){let[a2,c3,tx3]=matrix3x3[0],[b3,d3,ty3]=matrix3x3[1];return new _Matrix(a2,b3,c3,d3,tx3,ty3)}toMatrix3x3(){return[[this.a,this.c,this.tx],[this.b,this.d,this.ty],[0,0,1]]}clone(){return new _Matrix(this.a,this.b,this.c,this.d,this.tx,this.ty)}transform(vector2){return[vector2[0]*this.a+vector2[1]*this.c+this.tx,vector2[0]*this.b+vector2[1]*this.d+this.ty]}multiply(other_matrix){return new _Matrix(this.a*other_matrix.a+this.c*other_matrix.b,this.b*other_matrix.a+this.d*other_matrix.b,this.a*other_matrix.c+this.c*other_matrix.d,this.b*other_matrix.c+this.d*other_matrix.d,this.a*other_matrix.tx+this.c*other_matrix.ty+this.tx,this.b*other_matrix.tx+this.d*other_matrix.ty+this.ty)}translate(...args){let tx3,ty3;if(args.length==1&&!isNaN(args[0].x)&&!isNaN(args[0].y))tx3=args[0].x,ty3=args[0].y;else if(args.length===2&&typeof args[0]=="number"&&typeof args[1]=="number")tx3=args[0],ty3=args[1];else throw Errors.ILLEGAL_PARAMETERS;return this.multiply(new _Matrix(1,0,0,1,tx3,ty3))}rotate(angle,centerX=0,centerY=0){let cos5=Math.cos(angle),sin5=Math.sin(angle);return this.translate(centerX,centerY).multiply(new _Matrix(cos5,sin5,-sin5,cos5,0,0)).translate(-centerX,-centerY)}scale(sx3,sy3){return this.multiply(new _Matrix(sx3,0,0,sy3,0,0))}equalTo(matrix2){return!(!Flatten.Utils.EQ(this.tx,matrix2.tx)||!Flatten.Utils.EQ(this.ty,matrix2.ty)||!Flatten.Utils.EQ(this.a,matrix2.a)||!Flatten.Utils.EQ(this.b,matrix2.b)||!Flatten.Utils.EQ(this.c,matrix2.c)||!Flatten.Utils.EQ(this.d,matrix2.d))}};Flatten.Matrix=Matrix;var matrix=(...args)=>new Flatten.Matrix(...args);Flatten.matrix=matrix;var IntervalBase=class{constructor(low,high){this.low=low,this.high=high}get max(){return this.clone()}less_than(other_interval){return this.low<other_interval.low||this.low===other_interval.low&&this.high<other_interval.high}equal_to(other_interval){return this.low===other_interval.low&&this.high===other_interval.high}intersect(other_interval){return!this.not_intersect(other_interval)}not_intersect(other_interval){return this.high<other_interval.low||other_interval.high<this.low}merge(other_interval){let low=this.low===void 0?other_interval.low:this.low<other_interval.low?this.low:other_interval.low,high=this.high===void 0?other_interval.high:this.high>other_interval.high?this.high:other_interval.high,cloned=this.clone();return cloned.low=low,cloned.high=high,cloned}output(){return[this.low,this.high]}comparable_less_than(val1,val2){return val1<val2}},Interval=class _Interval extends IntervalBase{clone(){return new _Interval(this.low,this.high)}},RB_TREE_COLOR_RED=1,RB_TREE_COLOR_BLACK=0,Node=class{constructor(key,value,left=null,right=null,parent=null,color=RB_TREE_COLOR_BLACK){if(this.left=left,this.right=right,this.parent=parent,this.color=color,this.item={key:void 0,values:[]},value!==void 0&&this.item.values.push(value),key!==void 0)if(Array.isArray(key)){let[rawLow,rawHigh]=key;if(!Number.isNaN(rawLow)&&!Number.isNaN(rawHigh)){let low=rawLow,high=rawHigh;low>high&&([low,high]=[high,low]),this.item.key=new Interval(low,high)}}else this.item.key=key;this.max=this.item.key?this.item.key.max:void 0}isNil(){return this.item.key===void 0&&this.item.values.length===0&&this.left===null&&this.right===null&&this.color===RB_TREE_COLOR_BLACK}requireKey(){if(!this.item.key)throw new Error("Node key is undefined (nil/sentinel). Operation is not applicable.");return this.item.key}less_than(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.less_than(b3)}_value_equal(other_node){let a2=this.item.values[0],b3=other_node.item.values[0];return a2&&b3&&a2.equal_to?a2.equal_to(b3):a2===b3}equal_to(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.equal_to(b3)}intersect(other_node){let a2=this.requireKey(),b3=other_node.requireKey();return a2.intersect(b3)}copy_data(other_node){this.item.key=other_node.item.key,this.item.values=other_node.item.values.slice()}update_max(){this.max=this.item.key?this.item.key.max:void 0,this.right&&this.right.max&&(this.max=this.max?this.max.merge(this.right.max):this.right.max),this.left&&this.left.max&&(this.max=this.max?this.max.merge(this.left.max):this.left.max)}not_intersect_left_subtree(search_node){if(!this.left)return!0;let high=this.left.max?this.left.max.high:this.left.item.key.high,selfKey=this.requireKey(),searchKey=search_node.requireKey();return selfKey.comparable_less_than(high,searchKey.low)}not_intersect_right_subtree(search_node){if(!this.right)return!0;let low=this.right.max?this.right.max.low:this.right.item.key.low,selfKey=this.requireKey(),searchKey=search_node.requireKey();return selfKey.comparable_less_than(searchKey.high,low)}},IntervalTree=class _IntervalTree{constructor(){this.root=null,this.nil_node=new Node}get size(){let count=0;return this.tree_walk(this.root,node=>count+=node.item.values.length),count}get keys(){let res2=[];return this.tree_walk(this.root,node=>res2.push(node.item.key.output())),res2}get values(){let res2=[];return this.tree_walk(this.root,node=>{for(let v5 of node.item.values)res2.push(v5)}),res2}get items(){let res2=[];return this.tree_walk(this.root,node=>{let keyOut=node.item.key.output();for(let v5 of node.item.values)res2.push({key:keyOut,value:v5})}),res2}isEmpty(){return this.root==null||this.root===this.nil_node}clear(){this.root=null}insert(key,value=key){if(key===void 0)return;let existing=this.tree_search(this.root,new Node(key));if(existing)return existing.item.values.push(value),existing;let insert_node=new Node(key,value,this.nil_node,this.nil_node,null,RB_TREE_COLOR_RED);return this.tree_insert(insert_node),this.recalc_max(insert_node),insert_node}exist(key,value=key){let node=this.tree_search(this.root,new Node(key));return node?arguments.length<2||value===key?!0:node.item.values.some(v5=>v5&&v5.equal_to?v5.equal_to(value):v5===value):!1}remove(key,value=key){let node=this.tree_search(this.root,new Node(key));if(!node)return;if(arguments.length<2)return this.tree_delete(node),node;let idx=node.item.values.findIndex(v5=>v5&&v5.equal_to?v5.equal_to(value):v5===value);if(idx>=0)return node.item.values.splice(idx,1),node.item.values.length===0&&this.tree_delete(node),node}search(interval,outputMapperFn=(value,key)=>value===key?key.output():value){let search_node=new Node(interval),resp_nodes=[];this.tree_search_interval(this.root,search_node,resp_nodes);let res2=[];for(let node of resp_nodes)for(let v5 of node.item.values)res2.push(outputMapperFn(v5,node.item.key));return res2}intersect_any(interval){let search_node=new Node(interval);return this.tree_find_any_interval(this.root,search_node)}forEach(visitor){this.tree_walk(this.root,node=>{for(let v5 of node.item.values)visitor(node.item.key,v5)})}map(callback){let tree=new _IntervalTree;return this.tree_walk(this.root,node=>{for(let v5 of node.item.values)tree.insert(node.item.key,callback(v5,node.item.key))}),tree}*iterate(interval,outputMapperFn=(value,key)=>value===key?key.output():value){let node=null;for(interval?node=this.tree_search_nearest_forward(this.root,new Node(interval)):this.root&&(node=this.local_minimum(this.root));node;){for(let v5 of node.item.values)yield outputMapperFn(v5,node.item.key);node=this.tree_successor(node)}}recalc_max(node){let node_current=node;for(;node_current.parent!=null;)node_current.parent.update_max(),node_current=node_current.parent}tree_insert(insert_node){let current_node=this.root,parent_node=null;if(this.root==null||this.root===this.nil_node)this.root=insert_node;else{for(;current_node!==this.nil_node;)parent_node=current_node,insert_node.less_than(current_node)?current_node=current_node.left:current_node=current_node.right;insert_node.parent=parent_node,insert_node.less_than(parent_node)?parent_node.left=insert_node:parent_node.right=insert_node}this.insert_fixup(insert_node)}insert_fixup(insert_node){let current_node,uncle_node;for(current_node=insert_node;current_node!==this.root&¤t_node.parent.color===RB_TREE_COLOR_RED;)current_node.parent===current_node.parent.parent.left?(uncle_node=current_node.parent.parent.right,uncle_node.color===RB_TREE_COLOR_RED?(current_node.parent.color=RB_TREE_COLOR_BLACK,uncle_node.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,current_node=current_node.parent.parent):(current_node===current_node.parent.right&&(current_node=current_node.parent,this.rotate_left(current_node)),current_node.parent.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,this.rotate_right(current_node.parent.parent))):(uncle_node=current_node.parent.parent.left,uncle_node.color===RB_TREE_COLOR_RED?(current_node.parent.color=RB_TREE_COLOR_BLACK,uncle_node.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,current_node=current_node.parent.parent):(current_node===current_node.parent.left&&(current_node=current_node.parent,this.rotate_right(current_node)),current_node.parent.color=RB_TREE_COLOR_BLACK,current_node.parent.parent.color=RB_TREE_COLOR_RED,this.rotate_left(current_node.parent.parent)));this.root.color=RB_TREE_COLOR_BLACK}tree_delete(delete_node){let cut_node,fix_node;delete_node.left===this.nil_node||delete_node.right===this.nil_node?cut_node=delete_node:cut_node=this.tree_successor(delete_node),cut_node.left!==this.nil_node?fix_node=cut_node.left:fix_node=cut_node.right,fix_node.parent=cut_node.parent,cut_node===this.root?this.root=fix_node:(cut_node===cut_node.parent.left?cut_node.parent.left=fix_node:cut_node.parent.right=fix_node,cut_node.parent.update_max()),this.recalc_max(fix_node),cut_node!==delete_node&&(delete_node.copy_data(cut_node),delete_node.update_max(),this.recalc_max(delete_node)),cut_node.color===RB_TREE_COLOR_BLACK&&this.delete_fixup(fix_node)}delete_fixup(fix_node){let current_node=fix_node,brother_node;for(;current_node!==this.root&¤t_node.parent!=null&¤t_node.color===RB_TREE_COLOR_BLACK;)current_node===current_node.parent.left?(brother_node=current_node.parent.right,brother_node.color===RB_TREE_COLOR_RED&&(brother_node.color=RB_TREE_COLOR_BLACK,current_node.parent.color=RB_TREE_COLOR_RED,this.rotate_left(current_node.parent),brother_node=current_node.parent.right),brother_node.left.color===RB_TREE_COLOR_BLACK&&brother_node.right.color===RB_TREE_COLOR_BLACK?(brother_node.color=RB_TREE_COLOR_RED,current_node=current_node.parent):(brother_node.right.color===RB_TREE_COLOR_BLACK&&(brother_node.color=RB_TREE_COLOR_RED,brother_node.left.color=RB_TREE_COLOR_BLACK,this.rotate_right(brother_node),brother_node=current_node.parent.right),brother_node.color=current_node.parent.color,current_node.parent.color=RB_TREE_COLOR_BLACK,brother_node.right.color=RB_TREE_COLOR_BLACK,this.rotate_left(current_node.parent),current_node=this.root)):(brother_node=current_node.parent.left,brother_node.color===RB_TREE_COLOR_RED&&(brother_node.color=RB_TREE_COLOR_BLACK,current_node.parent.color=RB_TREE_COLOR_RED,this.rotate_right(current_node.parent),brother_node=current_node.parent.left),brother_node.left.color===RB_TREE_COLOR_BLACK&&brother_node.right.color===RB_TREE_COLOR_BLACK?(brother_node.color=RB_TREE_COLOR_RED,current_node=current_node.parent):(brother_node.left.color===RB_TREE_COLOR_BLACK&&(brother_node.color=RB_TREE_COLOR_RED,brother_node.right.color=RB_TREE_COLOR_BLACK,this.rotate_left(brother_node),brother_node=current_node.parent.left),brother_node.color=current_node.parent.color,current_node.parent.color=RB_TREE_COLOR_BLACK,brother_node.left.color=RB_TREE_COLOR_BLACK,this.rotate_right(current_node.parent),current_node=this.root));current_node.color=RB_TREE_COLOR_BLACK}tree_search(node,search_node){if(!(node==null||node===this.nil_node))return search_node.equal_to(node)?node:search_node.less_than(node)?this.tree_search(node.left,search_node):this.tree_search(node.right,search_node)}tree_search_nearest_forward(node,search_node){let best=null,curr=node;for(;curr&&curr!==this.nil_node;)curr.less_than(search_node)?curr.intersect(search_node)?(best=curr,curr=curr.left):curr=curr.right:((!best||curr.less_than(best))&&(best=curr),curr=curr.left);return best||null}tree_search_interval(node,search_node,res2){node!=null&&node!==this.nil_node&&(node.left!==this.nil_node&&!node.not_intersect_left_subtree(search_node)&&this.tree_search_interval(node.left,search_node,res2),node.intersect(search_node)&&res2.push(node),node.right!==this.nil_node&&!node.not_intersect_right_subtree(search_node)&&this.tree_search_interval(node.right,search_node,res2))}tree_find_any_interval(node,search_node){let found=!1;return node!=null&&node!==this.nil_node&&(node.left!==this.nil_node&&!node.not_intersect_left_subtree(search_node)&&(found=this.tree_find_any_interval(node.left,search_node)),found||(found=node.intersect(search_node)),!found&&node.right!==this.nil_node&&!node.not_intersect_right_subtree(search_node)&&(found=this.tree_find_any_interval(node.right,search_node))),found}local_minimum(node){let node_min=node;for(;node_min.left!=null&&node_min.left!==this.nil_node;)node_min=node_min.left;return node_min}local_maximum(node){let node_max=node;for(;node_max.right!=null&&node_max.right!==this.nil_node;)node_max=node_max.right;return node_max}tree_successor(node){let node_successor,current_node,parent_node;if(node.right!==this.nil_node)node_successor=this.local_minimum(node.right);else{for(current_node=node,parent_node=node.parent;parent_node!=null&&parent_node.right===current_node;)current_node=parent_node,parent_node=parent_node.parent;node_successor=parent_node}return node_successor}rotate_left(x5){let y5=x5.right;x5.right=y5.left,y5.left!==this.nil_node&&(y5.left.parent=x5),y5.parent=x5.parent,x5===this.root?this.root=y5:x5===x5.parent.left?x5.parent.left=y5:x5.parent.right=y5,y5.left=x5,x5.parent=y5,x5!==null&&x5!==this.nil_node&&x5.update_max(),y5!=null&&y5!==this.nil_node&&y5.update_max()}rotate_right(y5){let x5=y5.left;y5.left=x5.right,x5.right!==this.nil_node&&(x5.right.parent=y5),x5.parent=y5.parent,y5===this.root?this.root=x5:y5===y5.parent.left?y5.parent.left=x5:y5.parent.right=x5,x5.right=y5,y5.parent=x5,y5!==null&&y5!==this.nil_node&&y5.update_max(),x5!=null&&x5!==this.nil_node&&x5.update_max()}tree_walk(node,action){node!=null&&node!==this.nil_node&&(this.tree_walk(node.left,action),action(node),this.tree_walk(node.right,action))}testRedBlackProperty(){let res2=!0;return this.tree_walk(this.root,function(node){node.color===RB_TREE_COLOR_RED&&(node.left.color===RB_TREE_COLOR_BLACK&&node.right.color===RB_TREE_COLOR_BLACK||(res2=!1))}),res2}testBlackHeightProperty(node){let height=0,heightLeft=0,heightRight=0;if(node.color===RB_TREE_COLOR_BLACK&&height++,node.left!==this.nil_node?heightLeft=this.testBlackHeightProperty(node.left):heightLeft=1,node.right!==this.nil_node?heightRight=this.testBlackHeightProperty(node.right):heightRight=1,heightLeft!==heightRight)throw new Error("Red-black height property violated");return height+=heightLeft,height}},PlanarSet=class extends Set{constructor(shapes){super(shapes),this.index=new IntervalTree,this.forEach(shape=>this.index.insert(shape))}add(entry){let size2=this.size,{key,value}=entry,box2=key||entry.box,shape=value||entry;return super.add(shape),this.size>size2&&this.index.insert(box2,shape),this}delete(entry){let{key,value}=entry,box2=key||entry.box,shape=value||entry,deleted=super.delete(shape);return deleted&&this.index.remove(box2,shape),deleted}clear(){super.clear(),this.index=new IntervalTree}search(box2){return this.index.search(box2)}hit(point6){let box2=new Flatten.Box(point6.x-1,point6.y-1,point6.x+1,point6.y+1);return this.index.search(box2).filter(shape=>point6.on(shape))}svg(){return[...this].reduce((acc,shape)=>acc+shape.svg(),"")}};Flatten.PlanarSet=PlanarSet;var Shape=class{get name(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}get box(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}clone(){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}translate(...args){return this.transform(new Matrix().translate(...args))}rotate(angle,center2=new Flatten.Point){return this.transform(new Matrix().rotate(angle,center2.x,center2.y))}scale(sx3,sy3){return this.transform(new Matrix().scale(sx3,sy3))}transform(...args){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}toJSON(){return Object.assign({},this,{name:this.name})}svg(attrs={}){throw Errors.CANNOT_INVOKE_ABSTRACT_METHOD}},Point$3=class Point2 extends Shape{constructor(...args){if(super(),this.x=0,this.y=0,args.length!==0){if(args.length===1&&args[0]instanceof Array&&args[0].length===2){let arr=args[0];if(typeof arr[0]=="number"&&typeof arr[1]=="number"){this.x=arr[0],this.y=arr[1];return}}if(args.length===1&&args[0]instanceof Object&&args[0].name==="point"){let{x:x5,y:y5}=args[0];this.x=x5,this.y=y5;return}if(args.length===2&&typeof args[0]=="number"&&typeof args[1]=="number"){this.x=args[0],this.y=args[1];return}throw Errors.ILLEGAL_PARAMETERS}}get box(){return new Flatten.Box(this.x,this.y,this.x,this.y)}clone(){return new Flatten.Point(this.x,this.y)}get vertices(){return[this.clone()]}equalTo(pt4){return Flatten.Utils.EQ(this.x,pt4.x)&&Flatten.Utils.EQ(this.y,pt4.y)}lessThan(pt4){return!!(Flatten.Utils.LT(this.y,pt4.y)||Flatten.Utils.EQ(this.y,pt4.y)&&Flatten.Utils.LT(this.x,pt4.x))}transform(m3){return new Flatten.Point(m3.transform([this.x,this.y]))}projectionOn(line2){if(this.equalTo(line2.pt))return this.clone();let vec=new Flatten.Vector(this,line2.pt);if(Flatten.Utils.EQ_0(vec.cross(line2.norm)))return line2.pt.clone();let dist=vec.dot(line2.norm),proj_vec=line2.norm.multiply(dist);return this.translate(proj_vec)}leftTo(line2){let vec=new Flatten.Vector(line2.pt,this);return Flatten.Utils.GT(vec.dot(line2.norm),0)}distanceTo(shape){if(shape instanceof Point2){let dx3=shape.x-this.x,dy3=shape.y-this.y;return[Math.sqrt(dx3*dx3+dy3*dy3),new Flatten.Segment(this,shape)]}if(shape instanceof Flatten.Line)return Flatten.Distance.point2line(this,shape);if(shape instanceof Flatten.Circle)return Flatten.Distance.point2circle(this,shape);if(shape instanceof Flatten.Segment)return Flatten.Distance.point2segment(this,shape);if(shape instanceof Flatten.Arc)return Flatten.Distance.point2arc(this,shape);if(shape instanceof Flatten.Polygon)return Flatten.Distance.point2polygon(this,shape);if(shape instanceof Flatten.PlanarSet)return Flatten.Distance.shape2planarSet(this,shape);if(shape instanceof Flatten.Multiline)return Flatten.Distance.shape2multiline(this,shape)}on(shape){if(shape instanceof Flatten.Point)return this.equalTo(shape);if(shape.contains&&shape.contains instanceof Function)return shape.contains(this);throw Flatten.Errors.UNSUPPORTED_SHAPE_TYPE}get name(){return"point"}svg(attrs={}){let r4=attrs.r??3;return`
|
|
320
320
|
<circle cx="${this.x}" cy="${this.y}" r="${r4}"
|
|
321
321
|
${convertToString({fill:"red",...attrs})} />`}};Flatten.Point=Point$3;var point4=(...args)=>new Flatten.Point(...args);Flatten.point=point4;var Vector$1=class extends Shape{constructor(...args){if(super(),this.x=0,this.y=0,args.length!==0){if(args.length===1&&args[0]instanceof Array&&args[0].length===2){let arr=args[0];if(typeof arr[0]=="number"&&typeof arr[1]=="number"){this.x=arr[0],this.y=arr[1];return}}if(args.length===1&&args[0]instanceof Object&&args[0].name==="vector"){let{x:x5,y:y5}=args[0];this.x=x5,this.y=y5;return}if(args.length===1&&args[0]instanceof Object&&args[0].name==="segment"){let{start,end}=args[0];this.x=end.x-start.x,this.y=end.y-start.y;return}if(args.length===2){let a12=args[0],a2=args[1];if(typeof a12=="number"&&typeof a2=="number"){this.x=a12,this.y=a2;return}if(a12 instanceof Flatten.Point&&a2 instanceof Flatten.Point){this.x=a2.x-a12.x,this.y=a2.y-a12.y;return}}throw Errors.ILLEGAL_PARAMETERS}}clone(){return new Flatten.Vector(this.x,this.y)}get slope(){let angle=Math.atan2(this.y,this.x);return angle<0&&(angle=2*Math.PI+angle),angle}get length(){return Math.sqrt(this.dot(this))}isZeroLength(){return Flatten.Utils.EQ_0(this.length)}equalTo(v5){return Flatten.Utils.EQ(this.x,v5.x)&&Flatten.Utils.EQ(this.y,v5.y)}multiply(scalar){return new Flatten.Vector(scalar*this.x,scalar*this.y)}dot(v5){return this.x*v5.x+this.y*v5.y}cross(v5){return this.x*v5.y-this.y*v5.x}normalize(){if(this.isZeroLength())throw Errors.ZERO_DIVISION;return new Flatten.Vector(this.x/this.length,this.y/this.length)}rotate(angle,center2=new Flatten.Point){if(center2.x===0&¢er2.y===0)return this.transform(new Matrix().rotate(angle));throw Errors.OPERATION_IS_NOT_SUPPORTED}transform(m3){return new Flatten.Vector(m3.transform([this.x,this.y]))}rotate90CCW(){return new Flatten.Vector(-this.y,this.x)}rotate90CW(){return new Flatten.Vector(this.y,-this.x)}invert(){return new Flatten.Vector(-this.x,-this.y)}add(v5){return new Flatten.Vector(this.x+v5.x,this.y+v5.y)}subtract(v5){return new Flatten.Vector(this.x-v5.x,this.y-v5.y)}angleTo(v5){let norm1=this.normalize(),norm2=v5.normalize(),angle=Math.atan2(norm1.cross(norm2),norm1.dot(norm2));return angle<0&&(angle+=2*Math.PI),angle}projectionOn(v5){let n3=v5.normalize(),d3=this.dot(n3);return n3.multiply(d3)}get name(){return"vector"}};Flatten.Vector=Vector$1;var vector$1=(...args)=>new Flatten.Vector(...args);Flatten.vector=vector$1;var Segment$1=class Segment extends Shape{constructor(...args){if(super(),this.ps=new Flatten.Point,this.pe=new Flatten.Point,args.length!==0){if(args.length===1&&args[0]instanceof Array&&args[0].length===4){let coords=args[0];this.ps=new Flatten.Point(coords[0],coords[1]),this.pe=new Flatten.Point(coords[2],coords[3]);return}if(args.length===1&&args[0]instanceof Object&&args[0].name==="segment"){let{ps:ps3,pe:pe4}=args[0];this.ps=new Flatten.Point(ps3.x,ps3.y),this.pe=new Flatten.Point(pe4.x,pe4.y);return}if(args.length===1&&args[0]instanceof Flatten.Point){this.ps=args[0].clone();return}if(args.length===2&&args[0]instanceof Flatten.Point&&args[1]instanceof Flatten.Point){this.ps=args[0].clone(),this.pe=args[1].clone();return}if(args.length===4){this.ps=new Flatten.Point(args[0],args[1]),this.pe=new Flatten.Point(args[2],args[3]);return}throw Errors.ILLEGAL_PARAMETERS}}clone(){return new Flatten.Segment(this.start,this.end)}get start(){return this.ps}get end(){return this.pe}get vertices(){return[this.ps.clone(),this.pe.clone()]}get length(){return this.start.distanceTo(this.end)[0]}get slope(){return new Flatten.Vector(this.start,this.end).slope}get box(){return new Flatten.Box(Math.min(this.start.x,this.end.x),Math.min(this.start.y,this.end.y),Math.max(this.start.x,this.end.x),Math.max(this.start.y,this.end.y))}equalTo(seg){return this.ps.equalTo(seg.ps)&&this.pe.equalTo(seg.pe)}contains(pt4){return Flatten.Utils.EQ_0(this.distanceToPoint(pt4))}intersect(shape){if(shape instanceof Flatten.Point)return this.contains(shape)?[shape]:[];if(shape instanceof Flatten.Line)return intersectSegment2Line(this,shape);if(shape instanceof Flatten.Ray)return intersectRay2Segment(shape,this);if(shape instanceof Flatten.Segment)return intersectSegment2Segment(this,shape);if(shape instanceof Flatten.Circle)return intersectSegment2Circle(this,shape);if(shape instanceof Flatten.Box)return intersectSegment2Box(this,shape);if(shape instanceof Flatten.Arc)return intersectSegment2Arc(this,shape);if(shape instanceof Flatten.Polygon)return intersectSegment2Polygon(this,shape);if(shape instanceof Flatten.Multiline)return intersectShape2Multiline(this,shape)}distanceTo(shape){if(shape instanceof Flatten.Point){let[dist,shortest_segment]=Flatten.Distance.point2segment(shape,this);return shortest_segment=shortest_segment.reverse(),[dist,shortest_segment]}if(shape instanceof Flatten.Circle){let[dist,shortest_segment]=Flatten.Distance.segment2circle(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Line){let[dist,shortest_segment]=Flatten.Distance.segment2line(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Segment){let[dist,shortest_segment]=Flatten.Distance.segment2segment(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Arc){let[dist,shortest_segment]=Flatten.Distance.segment2arc(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Polygon){let[dist,shortest_segment]=Flatten.Distance.shape2polygon(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.PlanarSet){let[dist,shortest_segment]=Flatten.Distance.shape2planarSet(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Multiline)return Flatten.Distance.shape2multiline(this,shape)}tangentInStart(){return new Flatten.Vector(this.start,this.end).normalize()}tangentInEnd(){return new Flatten.Vector(this.end,this.start).normalize()}reverse(){return new Segment(this.end,this.start)}split(pt4){return this.start.equalTo(pt4)?[null,this.clone()]:this.end.equalTo(pt4)?[this.clone(),null]:[new Flatten.Segment(this.start,pt4),new Flatten.Segment(pt4,this.end)]}middle(){return new Flatten.Point((this.start.x+this.end.x)/2,(this.start.y+this.end.y)/2)}pointAtLength(length3){if(length3>this.length||length3<0)return null;if(length3==0)return this.start;if(length3==this.length)return this.end;let factor=length3/this.length;return new Flatten.Point((this.end.x-this.start.x)*factor+this.start.x,(this.end.y-this.start.y)*factor+this.start.y)}distanceToPoint(pt4){let[dist,...rest]=Flatten.Distance.point2segment(pt4,this);return dist}definiteIntegral(ymin=0){let dx3=this.end.x-this.start.x,dy1=this.start.y-ymin,dy22=this.end.y-ymin;return dx3*(dy1+dy22)/2}transform(matrix2=new Flatten.Matrix){return new Segment(this.ps.transform(matrix2),this.pe.transform(matrix2))}isZeroLength(){return this.ps.equalTo(this.pe)}sortPoints(pts){return new Flatten.Line(this.start,this.end).sortPoints(pts)}get name(){return"segment"}svg(attrs={}){return`
|
|
322
322
|
<line x1="${this.start.x}" y1="${this.start.y}" x2="${this.end.x}" y2="${this.end.y}" ${convertToString(attrs)} />`}};Flatten.Segment=Segment$1;var segment=(...args)=>new Flatten.Segment(...args);Flatten.segment=segment;var{vector}=Flatten,Line$1=class Line extends Shape{constructor(...args){if(super(),this.pt=new Flatten.Point,this.norm=new Flatten.Vector(0,1),args.length!==0){if(args.length===1&&args[0]instanceof Object&&args[0].name==="line"){let{pt:pt4,norm}=args[0];this.pt=new Flatten.Point(pt4),this.norm=new Flatten.Vector(norm);return}if(args.length===2){let a12=args[0],a2=args[1];if(a12 instanceof Flatten.Point&&a2 instanceof Flatten.Point){this.pt=a12,this.norm=Line.points2norm(a12,a2),this.norm.dot(vector(this.pt.x,this.pt.y))>=0&&this.norm.invert();return}if(a12 instanceof Flatten.Point&&a2 instanceof Flatten.Vector){if(Flatten.Utils.EQ_0(a2.x)&&Flatten.Utils.EQ_0(a2.y))throw Errors.ILLEGAL_PARAMETERS;this.pt=a12.clone(),this.norm=a2.clone(),this.norm=this.norm.normalize(),this.norm.dot(vector(this.pt.x,this.pt.y))>=0&&this.norm.invert();return}if(a12 instanceof Flatten.Vector&&a2 instanceof Flatten.Point){if(Flatten.Utils.EQ_0(a12.x)&&Flatten.Utils.EQ_0(a12.y))throw Errors.ILLEGAL_PARAMETERS;this.pt=a2.clone(),this.norm=a12.clone(),this.norm=this.norm.normalize(),this.norm.dot(vector(this.pt.x,this.pt.y))>=0&&this.norm.invert();return}}throw Errors.ILLEGAL_PARAMETERS}}clone(){return new Flatten.Line(this.pt,this.norm)}get start(){}get end(){}get length(){return Number.POSITIVE_INFINITY}get box(){return new Flatten.Box(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}get middle(){}get slope(){return new Flatten.Vector(this.norm.y,-this.norm.x).slope}get standard(){let A4=this.norm.x,B5=this.norm.y,C4=this.norm.dot(vector(this.pt.x,this.pt.y));return[A4,B5,C4]}parallelTo(other_line){return Flatten.Utils.EQ_0(this.norm.cross(other_line.norm))}incidentTo(other_line){return this.parallelTo(other_line)&&this.pt.on(other_line)}contains(pt4){if(this.pt.equalTo(pt4))return!0;let vec=new Flatten.Vector(this.pt,pt4);return Flatten.Utils.EQ_0(this.norm.dot(vec))}coord(pt4){return vector(pt4.x,pt4.y).cross(this.norm)}intersect(shape){if(shape instanceof Flatten.Point)return this.contains(shape)?[shape]:[];if(shape instanceof Flatten.Line)return intersectLine2Line(this,shape);if(shape instanceof Flatten.Ray)return intersectRay2Line(shape,this);if(shape instanceof Flatten.Circle)return intersectLine2Circle(this,shape);if(shape instanceof Flatten.Box)return intersectLine2Box(this,shape);if(shape instanceof Flatten.Segment)return intersectSegment2Line(shape,this);if(shape instanceof Flatten.Arc)return intersectLine2Arc(this,shape);if(shape instanceof Flatten.Polygon)return intersectLine2Polygon(this,shape);if(shape instanceof Flatten.Multiline)return intersectShape2Multiline(this,shape)}distanceTo(shape){if(shape instanceof Flatten.Point){let[distance8,shortest_segment]=Flatten.Distance.point2line(shape,this);return shortest_segment=shortest_segment.reverse(),[distance8,shortest_segment]}if(shape instanceof Flatten.Circle){let[distance8,shortest_segment]=Flatten.Distance.circle2line(shape,this);return shortest_segment=shortest_segment.reverse(),[distance8,shortest_segment]}if(shape instanceof Flatten.Segment){let[distance8,shortest_segment]=Flatten.Distance.segment2line(shape,this);return[distance8,shortest_segment.reverse()]}if(shape instanceof Flatten.Arc){let[distance8,shortest_segment]=Flatten.Distance.arc2line(shape,this);return[distance8,shortest_segment.reverse()]}if(shape instanceof Flatten.Polygon){let[distance8,shortest_segment]=Flatten.Distance.shape2polygon(this,shape);return[distance8,shortest_segment]}}split(pt4){if(pt4 instanceof Flatten.Point)return[new Flatten.Ray(pt4,this.norm),new Flatten.Ray(pt4,this.norm)];{let multiline2=new Flatten.Multiline([this]),sorted_points=this.sortPoints(pt4);return multiline2.split(sorted_points),multiline2.toShapes()}}rotate(angle,center2=new Flatten.Point){return new Flatten.Line(this.pt.rotate(angle,center2),this.norm.rotate(angle))}transform(m3){return new Flatten.Line(this.pt.transform(m3),this.norm.clone())}sortPoints(pts){return pts.slice().sort((pt1,pt22)=>this.coord(pt1)<this.coord(pt22)?-1:this.coord(pt1)>this.coord(pt22)?1:0)}get name(){return"line"}svg(box2,attrs={}){let ip3=intersectLine2Box(this,box2);if(ip3.length===0)return"";let ps3=ip3[0],pe4=ip3.length===2?ip3[1]:ip3.find(pt4=>!pt4.equalTo(ps3));return pe4===void 0&&(pe4=ps3),new Flatten.Segment(ps3,pe4).svg(attrs)}static points2norm(pt1,pt22){if(pt1.equalTo(pt22))throw Errors.ILLEGAL_PARAMETERS;return new Flatten.Vector(pt1,pt22).normalize().rotate90CCW()}};Flatten.Line=Line$1;var line=(...args)=>new Flatten.Line(...args);Flatten.line=line;var Circle$1=class extends Shape{constructor(...args){if(super(),this.pc=new Flatten.Point,this.r=1,args.length===1&&args[0]instanceof Object&&args[0].name==="circle"){let{pc:pc3,r:r4}=args[0];this.pc=new Flatten.Point(pc3),this.r=r4}else{let[pc3,r4]=[...args];pc3&&pc3 instanceof Flatten.Point&&(this.pc=pc3.clone()),r4!==void 0&&(this.r=r4)}}clone(){return new Flatten.Circle(this.pc.clone(),this.r)}get center(){return this.pc}get box(){return new Flatten.Box(this.pc.x-this.r,this.pc.y-this.r,this.pc.x+this.r,this.pc.y+this.r)}contains(shape){if(shape instanceof Flatten.Point)return Flatten.Utils.LE(shape.distanceTo(this.center)[0],this.r);if(shape instanceof Flatten.Segment)return Flatten.Utils.LE(shape.start.distanceTo(this.center)[0],this.r)&&Flatten.Utils.LE(shape.end.distanceTo(this.center)[0],this.r);if(shape instanceof Flatten.Arc)return this.intersect(shape).length===0&&Flatten.Utils.LE(shape.start.distanceTo(this.center)[0],this.r)&&Flatten.Utils.LE(shape.end.distanceTo(this.center)[0],this.r);if(shape instanceof Flatten.Circle)return this.intersect(shape).length===0&&Flatten.Utils.LE(shape.r,this.r)&&Flatten.Utils.LE(shape.center.distanceTo(this.center)[0],this.r)}toArc(counterclockwise=!0){return new Flatten.Arc(this.center,this.r,Math.PI,-Math.PI,counterclockwise)}scale(sx3,sy3){if(sx3!==sy3||!(this.pc.x===0&&this.pc.y===0))throw Errors.OPERATION_IS_NOT_SUPPORTED;return new Flatten.Circle(this.pc,this.r*sx3)}transform(matrix2=new Flatten.Matrix){return new Flatten.Circle(this.pc.transform(matrix2),this.r)}intersect(shape){if(shape instanceof Flatten.Point)return this.contains(shape)?[shape]:[];if(shape instanceof Flatten.Line)return intersectLine2Circle(shape,this);if(shape instanceof Flatten.Ray)return intersectRay2Circle(shape,this);if(shape instanceof Flatten.Segment)return intersectSegment2Circle(shape,this);if(shape instanceof Flatten.Circle)return intersectCircle2Circle(shape,this);if(shape instanceof Flatten.Box)return intersectCircle2Box(this,shape);if(shape instanceof Flatten.Arc)return intersectArc2Circle(shape,this);if(shape instanceof Flatten.Polygon)return intersectCircle2Polygon(this,shape);if(shape instanceof Flatten.Multiline)return intersectShape2Multiline(this,shape)}distanceTo(shape){if(shape instanceof Flatten.Point){let[distance8,shortest_segment]=Flatten.Distance.point2circle(shape,this);return shortest_segment=shortest_segment.reverse(),[distance8,shortest_segment]}if(shape instanceof Flatten.Circle){let[distance8,shortest_segment]=Flatten.Distance.circle2circle(this,shape);return[distance8,shortest_segment]}if(shape instanceof Flatten.Line){let[distance8,shortest_segment]=Flatten.Distance.circle2line(this,shape);return[distance8,shortest_segment]}if(shape instanceof Flatten.Segment){let[distance8,shortest_segment]=Flatten.Distance.segment2circle(shape,this);return shortest_segment=shortest_segment.reverse(),[distance8,shortest_segment]}if(shape instanceof Flatten.Arc){let[distance8,shortest_segment]=Flatten.Distance.arc2circle(shape,this);return shortest_segment=shortest_segment.reverse(),[distance8,shortest_segment]}if(shape instanceof Flatten.Polygon){let[distance8,shortest_segment]=Flatten.Distance.shape2polygon(this,shape);return[distance8,shortest_segment]}if(shape instanceof Flatten.PlanarSet){let[dist,shortest_segment]=Flatten.Distance.shape2planarSet(this,shape);return[dist,shortest_segment]}if(shape instanceof Flatten.Multiline){let[dist,shortest_segment]=Flatten.Distance.shape2multiline(this,shape);return[dist,shortest_segment]}}get name(){return"circle"}svg(attrs={}){return`
|
|
@@ -334,7 +334,7 @@ ${face.svg()}`;return svgStr+=`" >
|
|
|
334
334
|
`).map(x5=>x5.match(/\(([^)]+)\)/)[1]).map(parseSinglePoint)}function parseArrayOfLineStrings(str){return str.split(`
|
|
335
335
|
`).map(x5=>x5.match(/\(([^)]+)\)/)[1]).map(parseLineString).reduce((acc,x5)=>[...acc,...x5],[])}function parseWKT(str){if(str.startsWith("POINT")){let pointStr=str.replace(/^POINT \(/,"").replace(/\)$/,"");return parseSinglePoint(pointStr)}else if(str.startsWith("MULTIPOINT")){let multiPointStr=str.replace(/^MULTIPOINT \(/,"").replace(/\)$/,"");return parseMultiPoint(multiPointStr)}else if(str.startsWith("LINESTRING")){let lineStr=str.replace(/^LINESTRING \(/,"").replace(/\)$/,"");return parseLineString(lineStr)}else if(str.startsWith("MULTILINESTRING")){let multilineStr=str.replace(/^MULTILINESTRING /,"");return parseMultiLineString(multilineStr)}else{if(str.startsWith("POLYGON")||str.startsWith("MULTIPOLYGON"))return parsePolygon(str);if(str.startsWith("GEOMETRYCOLLECTION")){let regex=/(?<type>POINT|LINESTRING|POLYGON|MULTIPOINT|MULTILINESTRING|MULTIPOLYGON) \((?:[^\(\)]|\([^\)]*\))*\)/g,wktArray=str.match(regex);return wktArray[0].startsWith("GEOMETRYCOLLECTION")&&(wktArray[0]=wktArray[0].replace("GEOMETRYCOLLECTION (","")),wktArray.map(parseWKT).map(x5=>x5 instanceof Array?x5:[x5]).reduce((acc,x5)=>[...acc,...x5],[])}else{if(isArrayOfPoints(str))return parseArrayOfPoints(str);if(isArrayOfLines(str))return parseArrayOfLineStrings(str)}}return[]}function isArrayOfPoints(str){return str.split(`
|
|
336
336
|
`)?.every(str2=>str2.includes("POINT"))}function isArrayOfLines(str){return str.split(`
|
|
337
|
-
`)?.every(str2=>str2.includes("LINESTRING"))}function isWktString(str){return str.startsWith("POINT")||isArrayOfPoints(str)||str.startsWith("LINESTRING")||isArrayOfLines(str)||str.startsWith("MULTILINESTRING")||str.startsWith("POLYGON")||str.startsWith("MULTIPOINT")||str.startsWith("MULTIPOLYGON")||str.startsWith("GEOMETRYCOLLECTION")}Flatten.isWktString=isWktString;Flatten.parseWKT=parseWKT;Flatten.BooleanOperations=BooleanOperations;Flatten.Relations=Relations;init_dist();init_dist5();var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.398",type:"module",files:["dist"],scripts:{start:"cosmos",build:"tsup ./lib/index.ts --minify terser --external @tscircuit/core --external circuit-to-svg --format esm --dts --sourcemap",bench:"bun test tests/spatial-index-bench.test.ts",format:"biome format --write .","format:check":"biome format .","vercel-build":"cosmos-export","repomix:lib":"repomix --ignore 'testing/**,**/TwoRouteHighDensitySolver/**,**/RouteStitchingSolver/**,solvers/CapacitySegmentPointOptimizer/CapacitySegmentPointOptimizer.ts' lib","bug-report":"bun run scripts/download-bug-report.ts","bug-report-with-test":"bun run scripts/create-bug-report-test.ts"},devDependencies:{"@biomejs/biome":"^1.9.4","@radix-ui/react-icons":"^1.3.2","@radix-ui/react-menubar":"^1.1.14","@react-hook/resize-observer":"^2.0.2","@resvg/resvg-js":"^2.6.2","@tscircuit/autorouting-dataset-01":"^1.0.32","@tscircuit/checks":"^0.0.114","@tscircuit/circuit-json-util":"^0.0.90","@tscircuit/core":"^0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/math-utils":"^0.0.27","@tscircuit/rectdiff":"0.0.25","@tscircuit/solver-utils":"^0.0.16","@types/bun":"^1.2.23","@types/fast-json-stable-stringify":"^2.1.2","@types/object-hash":"^3.0.6","@types/rbush":"^4.0.0","@types/react":"^19.0.8","@types/react-dom":"^19.0.3","@vercel/node":"^5.1.7","@vitejs/plugin-react":"^4.3.4","bun-match-svg":"^0.0.14","circuit-json-to-connectivity-map":"^0.0.19","circuit-to-svg":"^0.0.220",clsx:"^2.1.1",flatbush:"^4.4.0","graphics-debug":"^0.0.88","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2",kleur:"^4.1.5","looks-same":"9",rbush:"^4.0.1",react:"18","react-cosmos":"^6.2.3","react-cosmos-plugin-vite":"^6.2.0","react-dom":"18","react-konva":"18",recharts:"^2.15.1","tailwind-merge":"^3.2.0",terser:"^5.43.1","tiny-hypergraph":"git+https://github.com/0hmX/tiny-hypergraph.git#53a92357d6fbaeb6f19ea0948e5e546bd44cc9f4",tsup:"^8.3.6",typescript:"^5.9.3","use-mouse-matrix-transform":"^1.3.0",vite:"^6.0.11","vite-tsconfig-paths":"^5.1.4","zdwiel-dataset":"git+https://github.com/dwiel/tscircuit-benchmark.git#be36518b5bf51755dae92c230061ab3cf4e3e063"},dependencies:{"@tscircuit/high-density-a01":"^0.0.25","fast-json-stable-stringify":"^2.1.0","high-density-repair02":"git+https://github.com/tscircuit/high-density-repair02.git#5509821634433b6a4f74fa76e530004dffc2f907","object-hash":"^3.0.0"}};init_dist();init_dist3();var import_react=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants24=__toESM(require_constants(),1);init_zod();init_dist();init_dist();init_zod();init_dist();init_dist();init_dist();init_dist4();init_zod();var import_react2=__toESM(require_react(),1);init_dist4();init_zod();init_zod();init_dist();function createMap(){return new IndexedMap}var IndexedMap=class _IndexedMap{constructor(){__publicField(this,"index",{});__publicField(this,"array",[])}size(){return this.array.length}empty(){return this.array.length===0}itemAt(index){return this.array[index]}contains(key){return this.index[key.id()]!==void 0}find(key){let i2=this.index[key.id()];return i2===void 0?void 0:this.array[i2]}setDefault(key,factory){let i2=this.index[key.id()];if(i2===void 0){let pair=new Pair(key,factory());return this.index[key.id()]=this.array.length,this.array.push(pair),pair}else return this.array[i2]}insert(key,value){let pair=new Pair(key,value),i2=this.index[key.id()];return i2===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i2]=pair,pair}erase(key){let i2=this.index[key.id()];if(i2===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i2],last=this.array.pop();return pair!==last&&(this.array[i2]=last,this.index[last.first.id()]=i2),pair}copy(){let copy=new _IndexedMap;for(let i2=0;i2<this.array.length;i2++){let pair=this.array[i2].copy();copy.array[i2]=pair,copy.index[pair.first.id()]=i2}return copy}},Pair=class _Pair{constructor(first,second){__publicField(this,"first");__publicField(this,"second");this.first=first,this.second=second}copy(){return new _Pair(this.first,this.second)}};var Variable=class{constructor(name=""){__publicField(this,"_name");__publicField(this,"_value",0);__publicField(this,"_context",null);__publicField(this,"_id",VarId++);this._name=name}id(){return this._id}name(){return this._name}setName(name){this._name=name}context(){return this._context}setContext(context){this._context=context}value(){return this._value}setValue(value){this._value=value}plus(value){return new Expression(this,value)}minus(value){return new Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new Expression([coefficient,this])}divide(coefficient){return new Expression([1/coefficient,this])}toJSON(){return{name:this._name,value:this._value}}toString(){return this._context+"["+this._name+":"+this._value+"]"}},VarId=0;var Expression=class _Expression{constructor(){__publicField(this,"_terms");__publicField(this,"_constant");let parsed=parseArgs(arguments);this._terms=parsed.terms,this._constant=parsed.constant}terms(){return this._terms}constant(){return this._constant}value(){let result=this._constant;for(let i2=0,n3=this._terms.size();i2<n3;i2++){let pair=this._terms.itemAt(i2);result+=pair.first.value()*pair.second}return result}plus(value){return new _Expression(this,value)}minus(value){return new _Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new _Expression([coefficient,this])}divide(coefficient){return new _Expression([1/coefficient,this])}isConstant(){return this._terms.size()==0}toString(){let result=this._terms.array.map(function(pair){return pair.second+"*"+pair.first.toString()}).join(" + ");return!this.isConstant()&&this._constant!==0&&(result+=" + "),result+=this._constant,result}};function parseArgs(args){let constant=0,factory=()=>0,terms=createMap();for(let i2=0,n3=args.length;i2<n3;++i2){let item=args[i2];if(typeof item=="number")constant+=item;else if(item instanceof Variable)terms.setDefault(item,factory).second+=1;else if(item instanceof Expression){constant+=item.constant();let terms2=item.terms();for(let j4=0,k4=terms2.size();j4<k4;j4++){let termPair=terms2.itemAt(j4);terms.setDefault(termPair.first,factory).second+=termPair.second}}else if(item instanceof Array){if(item.length!==2)throw new Error("array must have length 2");let value=item[0],value2=item[1];if(typeof value!="number")throw new Error("array item 0 must be a number");if(value2 instanceof Variable)terms.setDefault(value2,factory).second+=value;else if(value2 instanceof Expression){constant+=value2.constant()*value;let terms2=value2.terms();for(let j4=0,k4=terms2.size();j4<k4;j4++){let termPair=terms2.itemAt(j4);terms.setDefault(termPair.first,factory).second+=termPair.second*value}}else throw new Error("array item 1 must be a variable or expression")}else throw new Error("invalid Expression argument: "+item)}return{terms,constant}}var _Strength=class _Strength{static create(a2,b3,c3,w4=1){let result=0;return result+=Math.max(0,Math.min(1e3,a2*w4))*1e6,result+=Math.max(0,Math.min(1e3,b3*w4))*1e3,result+=Math.max(0,Math.min(1e3,c3*w4)),result}static clip(value){return Math.max(0,Math.min(_Strength.required,value))}};__publicField(_Strength,"required",_Strength.create(1e3,1e3,1e3)),__publicField(_Strength,"strong",_Strength.create(1,0,0)),__publicField(_Strength,"medium",_Strength.create(0,1,0)),__publicField(_Strength,"weak",_Strength.create(0,0,1));var Strength=_Strength;var Operator;(function(Operator2){Operator2[Operator2.Le=0]="Le",Operator2[Operator2.Ge=1]="Ge",Operator2[Operator2.Eq=2]="Eq"})(Operator||(Operator={}));var Constraint=class{constructor(expression,operator,rhs,strength=Strength.required){__publicField(this,"_expression");__publicField(this,"_operator");__publicField(this,"_strength");__publicField(this,"_id",CnId++);this._operator=operator,this._strength=Strength.clip(strength),rhs===void 0&&expression instanceof Expression?this._expression=expression:this._expression=expression.minus(rhs)}id(){return this._id}expression(){return this._expression}op(){return this._operator}strength(){return this._strength}toString(){return this._expression.toString()+" "+["<=",">=","="][this._operator]+" 0 ("+this._strength.toString()+")"}},CnId=0;var Solver=class{constructor(){__publicField(this,"maxIterations",1e3);__publicField(this,"_cnMap",createCnMap());__publicField(this,"_rowMap",createRowMap());__publicField(this,"_varMap",createVarMap());__publicField(this,"_editMap",createEditMap());__publicField(this,"_infeasibleRows",[]);__publicField(this,"_objective",new Row);__publicField(this,"_artificial",null);__publicField(this,"_idTick",0)}createConstraint(lhs,operator,rhs,strength=Strength.required){let cn3=new Constraint(lhs,operator,rhs,strength);return this.addConstraint(cn3),cn3}addConstraint(constraint){if(this._cnMap.find(constraint)!==void 0)throw new Error("duplicate constraint");let data=this._createRow(constraint),row=data.row,tag=data.tag,subject=this._chooseSubject(row,tag);if(subject.type()===SymbolType.Invalid&&row.allDummies())if(nearZero(row.constant()))subject=tag.marker;else throw new Error("unsatisfiable constraint");if(subject.type()===SymbolType.Invalid){if(!this._addWithArtificialVariable(row))throw new Error("unsatisfiable constraint")}else row.solveFor(subject),this._substitute(subject,row),this._rowMap.insert(subject,row);this._cnMap.insert(constraint,tag),this._optimize(this._objective)}removeConstraint(constraint){let cnPair=this._cnMap.erase(constraint);if(cnPair===void 0)throw new Error("unknown constraint");this._removeConstraintEffects(constraint,cnPair.second);let marker=cnPair.second.marker,rowPair=this._rowMap.erase(marker);if(rowPair===void 0){let leaving=this._getMarkerLeavingSymbol(marker);if(leaving.type()===SymbolType.Invalid)throw new Error("failed to find leaving row");rowPair=this._rowMap.erase(leaving),rowPair.second.solveForEx(leaving,marker),this._substitute(marker,rowPair.second)}this._optimize(this._objective)}hasConstraint(constraint){return this._cnMap.contains(constraint)}getConstraints(){return this._cnMap.array.map(({first})=>first)}addEditVariable(variable,strength){if(this._editMap.find(variable)!==void 0)throw new Error("duplicate edit variable");if(strength=Strength.clip(strength),strength===Strength.required)throw new Error("bad required strength");let expr=new Expression(variable),cn3=new Constraint(expr,Operator.Eq,void 0,strength);this.addConstraint(cn3);let info={tag:this._cnMap.find(cn3).second,constraint:cn3,constant:0};this._editMap.insert(variable,info)}removeEditVariable(variable){let editPair=this._editMap.erase(variable);if(editPair===void 0)throw new Error("unknown edit variable");this.removeConstraint(editPair.second.constraint)}hasEditVariable(variable){return this._editMap.contains(variable)}suggestValue(variable,value){let editPair=this._editMap.find(variable);if(editPair===void 0)throw new Error("unknown edit variable");let rows=this._rowMap,info=editPair.second,delta=value-info.constant;info.constant=value;let marker=info.tag.marker,rowPair=rows.find(marker);if(rowPair!==void 0){rowPair.second.add(-delta)<0&&this._infeasibleRows.push(marker),this._dualOptimize();return}let other=info.tag.other;if(rowPair=rows.find(other),rowPair!==void 0){rowPair.second.add(delta)<0&&this._infeasibleRows.push(other),this._dualOptimize();return}for(let i2=0,n3=rows.size();i2<n3;++i2){let rowPair2=rows.itemAt(i2),row=rowPair2.second,coeff=row.coefficientFor(marker);coeff!==0&&row.add(delta*coeff)<0&&rowPair2.first.type()!==SymbolType.External&&this._infeasibleRows.push(rowPair2.first)}this._dualOptimize()}updateVariables(){let vars=this._varMap,rows=this._rowMap;for(let i2=0,n3=vars.size();i2<n3;++i2){let pair=vars.itemAt(i2),rowPair=rows.find(pair.second);rowPair!==void 0?pair.first.setValue(rowPair.second.constant()):pair.first.setValue(0)}}_getVarSymbol(variable){let factory=()=>this._makeSymbol(SymbolType.External);return this._varMap.setDefault(variable,factory).second}_createRow(constraint){let expr=constraint.expression(),row=new Row(expr.constant()),terms=expr.terms();for(let i2=0,n3=terms.size();i2<n3;++i2){let termPair=terms.itemAt(i2);if(!nearZero(termPair.second)){let symbol=this._getVarSymbol(termPair.first),basicPair=this._rowMap.find(symbol);basicPair!==void 0?row.insertRow(basicPair.second,termPair.second):row.insertSymbol(symbol,termPair.second)}}let objective=this._objective,strength=constraint.strength(),tag={marker:INVALID_SYMBOL,other:INVALID_SYMBOL};switch(constraint.op()){case Operator.Le:case Operator.Ge:{let coeff=constraint.op()===Operator.Le?1:-1,slack=this._makeSymbol(SymbolType.Slack);if(tag.marker=slack,row.insertSymbol(slack,coeff),strength<Strength.required){let error=this._makeSymbol(SymbolType.Error);tag.other=error,row.insertSymbol(error,-coeff),objective.insertSymbol(error,strength)}break}case Operator.Eq:{if(strength<Strength.required){let errplus=this._makeSymbol(SymbolType.Error),errminus=this._makeSymbol(SymbolType.Error);tag.marker=errplus,tag.other=errminus,row.insertSymbol(errplus,-1),row.insertSymbol(errminus,1),objective.insertSymbol(errplus,strength),objective.insertSymbol(errminus,strength)}else{let dummy=this._makeSymbol(SymbolType.Dummy);tag.marker=dummy,row.insertSymbol(dummy)}break}}return row.constant()<0&&row.reverseSign(),{row,tag}}_chooseSubject(row,tag){let cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);if(pair.first.type()===SymbolType.External)return pair.first}let type=tag.marker.type();return(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.marker)<0?tag.marker:(type=tag.other.type(),(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.other)<0?tag.other:INVALID_SYMBOL)}_addWithArtificialVariable(row){let art=this._makeSymbol(SymbolType.Slack);this._rowMap.insert(art,row.copy()),this._artificial=row.copy(),this._optimize(this._artificial);let success=nearZero(this._artificial.constant());this._artificial=null;let pair=this._rowMap.erase(art);if(pair!==void 0){let basicRow=pair.second;if(basicRow.isConstant())return success;let entering=this._anyPivotableSymbol(basicRow);if(entering.type()===SymbolType.Invalid)return!1;basicRow.solveForEx(art,entering),this._substitute(entering,basicRow),this._rowMap.insert(entering,basicRow)}let rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2)rows.itemAt(i2).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2);pair.second.substitute(symbol,row),pair.second.constant()<0&&pair.first.type()!==SymbolType.External&&this._infeasibleRows.push(pair.first)}this._objective.substitute(symbol,row),this._artificial&&this._artificial.substitute(symbol,row)}_optimize(objective){let iterations=0;for(;iterations<this.maxIterations;){let entering=this._getEnteringSymbol(objective);if(entering.type()===SymbolType.Invalid)return;let leaving=this._getLeavingSymbol(entering);if(leaving.type()===SymbolType.Invalid)throw new Error("the objective is unbounded");let row=this._rowMap.erase(leaving).second;row.solveForEx(leaving,entering),this._substitute(entering,row),this._rowMap.insert(entering,row),iterations++}throw new Error("solver iterations exceeded")}_dualOptimize(){let rows=this._rowMap,infeasible=this._infeasibleRows;for(;infeasible.length!==0;){let leaving=infeasible.pop(),pair=rows.find(leaving);if(pair!==void 0&&pair.second.constant()<0){let entering=this._getDualEnteringSymbol(pair.second);if(entering.type()===SymbolType.Invalid)throw new Error("dual optimize failed");let row=pair.second;rows.erase(leaving),row.solveForEx(leaving,entering),this._substitute(entering,row),rows.insert(entering,row)}}}_getEnteringSymbol(objective){let cells=objective.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),symbol=pair.first;if(pair.second<0&&symbol.type()!==SymbolType.Dummy)return symbol}return INVALID_SYMBOL}_getDualEnteringSymbol(row){let ratio=Number.MAX_VALUE,entering=INVALID_SYMBOL,cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),symbol=pair.first,c3=pair.second;if(c3>0&&symbol.type()!==SymbolType.Dummy){let r4=this._objective.coefficientFor(symbol)/c3;r4<ratio&&(ratio=r4,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2),symbol=pair.first;if(symbol.type()!==SymbolType.External){let row=pair.second,temp=row.coefficientFor(entering);if(temp<0){let temp_ratio=-row.constant()/temp;temp_ratio<ratio&&(ratio=temp_ratio,found=symbol)}}}return found}_getMarkerLeavingSymbol(marker){let dmax=Number.MAX_VALUE,r12=dmax,r22=dmax,invalid=INVALID_SYMBOL,first=invalid,second=invalid,third=invalid,rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2),row=pair.second,c3=row.coefficientFor(marker);if(c3===0)continue;let symbol=pair.first;if(symbol.type()===SymbolType.External)third=symbol;else if(c3<0){let r4=-row.constant()/c3;r4<r12&&(r12=r4,first=symbol)}else{let r4=row.constant()/c3;r4<r22&&(r22=r4,second=symbol)}}return first!==invalid?first:second!==invalid?second:third}_removeConstraintEffects(cn3,tag){tag.marker.type()===SymbolType.Error&&this._removeMarkerEffects(tag.marker,cn3.strength()),tag.other.type()===SymbolType.Error&&this._removeMarkerEffects(tag.other,cn3.strength())}_removeMarkerEffects(marker,strength){let pair=this._rowMap.find(marker);pair!==void 0?this._objective.insertRow(pair.second,-strength):this._objective.insertSymbol(marker,-strength)}_anyPivotableSymbol(row){let cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),type=pair.first.type();if(type===SymbolType.Slack||type===SymbolType.Error)return pair.first}return INVALID_SYMBOL}_makeSymbol(type){return new Symbol2(type,this._idTick++)}};function nearZero(value){let eps=1e-8;return value<0?-value<eps:value<eps}function createCnMap(){return createMap()}function createRowMap(){return createMap()}function createVarMap(){return createMap()}function createEditMap(){return createMap()}var SymbolType;(function(SymbolType2){SymbolType2[SymbolType2.Invalid=0]="Invalid",SymbolType2[SymbolType2.External=1]="External",SymbolType2[SymbolType2.Slack=2]="Slack",SymbolType2[SymbolType2.Error=3]="Error",SymbolType2[SymbolType2.Dummy=4]="Dummy"})(SymbolType||(SymbolType={}));var Symbol2=class{constructor(type,id2){__publicField(this,"_id");__publicField(this,"_type");this._id=id2,this._type=type}id(){return this._id}type(){return this._type}},INVALID_SYMBOL=new Symbol2(SymbolType.Invalid,-1),Row=class _Row{constructor(constant=0){__publicField(this,"_cellMap",createMap());__publicField(this,"_constant");this._constant=constant}cells(){return this._cellMap}constant(){return this._constant}isConstant(){return this._cellMap.empty()}allDummies(){let cells=this._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2)if(cells.itemAt(i2).first.type()!==SymbolType.Dummy)return!1;return!0}copy(){let theCopy=new _Row(this._constant);return theCopy._cellMap=this._cellMap.copy(),theCopy}add(value){return this._constant+=value}insertSymbol(symbol,coefficient=1){let pair=this._cellMap.setDefault(symbol,()=>0);nearZero(pair.second+=coefficient)&&this._cellMap.erase(symbol)}insertRow(other,coefficient=1){this._constant+=other._constant*coefficient;let cells=other._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i2=0,n3=cells.size();i2<n3;++i2)cells.itemAt(i2).second*=coeff}solveForEx(lhs,rhs){this.insertSymbol(lhs,-1),this.solveFor(rhs)}coefficientFor(symbol){let pair=this._cellMap.find(symbol);return pair!==void 0?pair.second:0}substitute(symbol,row){let pair=this._cellMap.erase(symbol);pair!==void 0&&this.insertRow(row,pair.second)}};var import_debug9=__toESM(require_browser(),1);init_dist6();var import_react3=__toESM(require_react(),1);init_dist();var import_debug10=__toESM(require_browser(),1);init_dist3();init_dist6();init_dist6();init_dist3();init_dist6();init_dist6();init_dist();init_dist6();init_src();init_dist6();init_dist3();init_dist6();init_dist3();init_dist6();init_dist6();init_dist3();init_dist6();init_dist6();init_dist6();init_dist6();init_dist6();init_dist6();function distance5(x12,y12,x22,y22){return Math.sqrt((x22-x12)**2+(y22-y12)**2)}var addStartAndEndPortIdsIfMissing=soup=>{let pcbPorts=soup.filter(item=>item.type==="pcb_port"),pcbSmtPads=soup.filter(item=>item.type==="pcb_smtpad"),pcbTraces=soup.filter(item=>item.type==="pcb_trace");function findPortIdOverlappingPoint(point6,options={}){let traceWidth=options.traceWidth||0,directPort=pcbPorts.find(port=>distance5(port.x,port.y,point6.x,point6.y)<.01);if(directPort)return directPort.pcb_port_id;if(options.isFirstOrLastPoint){let smtPad=pcbSmtPads.find(pad2=>{if(pad2.shape==="rect")return Math.abs(point6.x-pad2.x)<pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<pad2.height/2+traceWidth/2;if(pad2.shape==="circle")return distance5(point6.x,point6.y,pad2.x,pad2.y)<pad2.radius});if(smtPad)return smtPad.pcb_port_id??null}return null}for(let trace of pcbTraces)for(let index=0;index<trace.route.length;index++){let segment2=trace.route[index],isFirstOrLastPoint=index===0||index===trace.route.length-1;if(segment2.route_type==="wire"){if(!segment2.start_pcb_port_id&&index===0){let startPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});startPortId&&(segment2.start_pcb_port_id=startPortId)}if(!segment2.end_pcb_port_id&&index===trace.route.length-1){let endPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});endPortId&&(segment2.end_pcb_port_id=endPortId)}}}},CIRCUIT_JSON_ID_PATTERN=/\b(?:pcb|source|schematic|subcircuit)_[a-z0-9_]+\b/i,sanitizeReadableName=(candidate,id2,fallbackLabel)=>!candidate||candidate===id2||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id2)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id2,"");if(readableName)return readableName}return""},getReadableNameForComponent=(circuitJson,pcbComponentId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,pcbComponentId),pcbComponentId,"component"),getReadableNameForPort=(circuitJson,pcbPortId)=>{let pcbPort=circuitJson.find(element=>element.type==="pcb_port"&&element.pcb_port_id===pcbPortId);if(pcbPort?.type==="pcb_port"){let sourcePort=circuitJson.find(element=>element.type==="source_port"&&element.source_port_id===pcbPort.source_port_id),sourceComponent=sourcePort?.type==="source_port"?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===sourcePort.source_component_id):null,readableSourceComponentName=firstReadableName([sourceComponent?.type==="source_component"?sourceComponent.name:null],sourceComponent?.type==="source_component"?sourceComponent.source_component_id:""),readableSourcePortName=firstReadableName([sourcePort?.type==="source_port"?sourcePort.name:null,sourcePort?.type==="source_port"?sourcePort.pin_number?.toString():null,sourcePort?.type==="source_port"?sourcePort.port_hints?.[0]:null],sourcePort?.type==="source_port"?sourcePort.source_port_id:"");if(readableSourceComponentName&&readableSourcePortName)return`${readableSourceComponentName}.${readableSourcePortName}`;if(readableSourcePortName)return readableSourcePortName}return sanitizeReadableName(getReadableNameForPcbPort(circuitJson,pcbPortId)??getReadableNameForElement(circuitJson,pcbPortId),pcbPortId,"port")},getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function checkEachPcbPortConnectedToPcbTraces(circuitJson){addStartAndEndPortIdsIfMissing(circuitJson);let sourceTraces=circuitJson.filter(item=>item.type==="source_trace"),pcbPorts=circuitJson.filter(item=>item.type==="pcb_port"),errors=[],connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),sourcePortToPcbPort=new Map;for(let pcbPort of pcbPorts)sourcePortToPcbPort.set(pcbPort.source_port_id,pcbPort);for(let sourceTrace of sourceTraces){let connectedSourcePortIds=sourceTrace.connected_source_port_ids;if(connectedSourcePortIds.length<2)continue;let pcbPortsInTrace=[],missingPcbPorts=[];for(let sourcePortId of connectedSourcePortIds){let pcbPort=sourcePortToPcbPort.get(sourcePortId);pcbPort?pcbPortsInTrace.push(pcbPort):missingPcbPorts.push(sourcePortId)}if(pcbPortsInTrace.length<2)continue;let firstPcbPort=pcbPortsInTrace[0],referenceNetId=connectivityMap.getNetConnectedToId(firstPcbPort.pcb_port_id);connectivityMap.getIdsConnectedToNet(referenceNetId).filter(id2=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id2||"route_id"in element&&element.route_id===id2))).length===0&&new Set(pcbPortsInTrace.map(p4=>p4.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p4=>getReadableNameForPort(circuitJson,p4.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p4=>p4.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p4=>p4.pcb_component_id).filter(id2=>id2!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var SpatialObjectIndex=class{constructor({objects,getBounds:getBounds3,getId,CELL_SIZE}){__publicField(this,"buckets");__publicField(this,"objectsById");__publicField(this,"getBounds");__publicField(this,"getId");__publicField(this,"CELL_SIZE",.4);__publicField(this,"_idCounter",0);this.buckets=new Map,this.objectsById=new Map,this.getBounds=getBounds3,this.getId=getId??(()=>this._getNextId()),this.CELL_SIZE=CELL_SIZE??this.CELL_SIZE;for(let obj of objects)this.addObject(obj)}_getNextId(){return`${this._idCounter++}`}addObject(obj){let bounds=this.getBounds(obj),spatialIndexId=this.getId(obj),objWithId={...obj,spatialIndexId};this.objectsById.set(spatialIndexId,objWithId);let minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);bucket?bucket.push(objWithId):this.buckets.set(bucketKey,[objWithId])}}removeObject(id2){let obj=this.objectsById.get(id2);if(!obj)return!1;this.objectsById.delete(id2);let bounds=this.getBounds(obj),minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);if(bucket){let index=bucket.findIndex(item=>item.spatialIndexId===id2);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x5,y5){return`${Math.floor(x5/this.CELL_SIZE)}x${Math.floor(y5/this.CELL_SIZE)}`}getObjectsInBounds(bounds,margin=0){let objects=[],addedIds=new Set,minBucketX=Math.floor((bounds.minX-margin)/this.CELL_SIZE),minBucketY=Math.floor((bounds.minY-margin)/this.CELL_SIZE),maxBucketX=Math.floor((bounds.maxX+margin)/this.CELL_SIZE),maxBucketY=Math.floor((bounds.maxY+margin)/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey)||[];for(let obj of bucket){let id2=obj.spatialIndexId;addedIds.has(id2)||(addedIds.add(id2),objects.push(obj))}}return objects}},getCollidableBounds=collidable=>collidable.type==="pcb_trace_segment"?{minX:Math.min(collidable.x1,collidable.x2),minY:Math.min(collidable.y1,collidable.y2),maxX:Math.max(collidable.x1,collidable.x2),maxY:Math.max(collidable.y1,collidable.y2)}:getBoundsOfPcbElements([collidable]),DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=.15,DEFAULT_VIA_BOARD_MARGIN=.3,DEFAULT_SAME_NET_VIA_MARGIN=.2,DEFAULT_DIFFERENT_NET_VIA_MARGIN=.3,EPSILON=.005;function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id&&connectedPcbPorts.add(segment2.start_pcb_port_id),segment2.end_pcb_port_id&&connectedPcbPorts.add(segment2.end_pcb_port_id));return Array.from(connectedPcbPorts)}function getPcbPortIdsConnectedToTraces(traces){let connectedPorts=new Set;for(let trace of traces)for(let portId of getPcbPortIdsConnectedToTrace(trace))connectedPorts.add(portId);return Array.from(connectedPorts)}var getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a2={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a2.x-a12.x,y:a2.y-a12.y},vb2={x:b22.x-b12.x,y:b22.y-b12.y},lenSqrA=va3.x*va3.x+va3.y*va3.y,lenSqrB=vb2.x*vb2.x+vb2.y*vb2.y;if(lenSqrA===0||lenSqrB===0){if(lenSqrA===0&&lenSqrB===0)return{x:(a12.x+b12.x)/2,y:(a12.y+b12.y)/2};if(lenSqrA===0){let t210=clamp3(((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB,0,1),closestOnB2={x:b12.x+t210*vb2.x,y:b12.y+t210*vb2.y};return{x:(a12.x+closestOnB2.x)/2,y:(a12.y+closestOnB2.y)/2}}let t35=clamp3(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t35*va3.x,y:a12.y+t35*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w4={x:a12.x-b12.x,y:a12.y-b12.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a2,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA=clamp3(tA,0,1),tB=clamp3(tB,0,1),tB=(tA*dotAB+dotBW)/dotBB,tB=clamp3(tB,0,1),tA=(tB*dotAB-dotAW)/dotAA,tA=clamp3(tA,0,1);let closestOnA={x:a12.x+tA*va3.x,y:a12.y+tA*va3.y},closestOnB={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance32=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a2,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA=clamp3(tA,0,1);let pointOnA1={x:a12.x+tA*va3.x,y:a12.y+tA*va3.y},tA2=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA2=clamp3(tA2,0,1);let pointOnA2={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tB=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB=clamp3(tB,0,1);let pointOnB1={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},tB2=((a2.x-b12.x)*vb2.x+(a2.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp3(tB2,0,1);let pointOnB2={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},closestPair=[{pointA:pointOnA1,pointB:b12,distance:Math.sqrt((pointOnA1.x-b12.x)**2+(pointOnA1.y-b12.y)**2)},{pointA:pointOnA2,pointB:b22,distance:Math.sqrt((pointOnA2.x-b22.x)**2+(pointOnA2.y-b22.y)**2)},{pointA:a12,pointB:pointOnB1,distance:Math.sqrt((a12.x-pointOnB1.x)**2+(a12.y-pointOnB1.y)**2)},{pointA:a2,pointB:pointOnB2,distance:Math.sqrt((a2.x-pointOnB2.x)**2+(a2.y-pointOnB2.y)**2)}].reduce((closest,current2)=>current2.distance<closest.distance?current2:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp3=(value,min,max)=>Math.max(min,Math.min(max,value)),getRadiusOfCircuitJsonElement=obj=>{if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle")return obj.outer_diameter/2;if(obj.type==="pcb_hole"&&obj.hole_shape==="circle")return obj.hole_diameter/2;if(obj.type==="pcb_smtpad"&&obj.shape==="circle")return obj.radius;throw new Error(`Could not determine radius of element: ${JSON.stringify(obj)}`)},getClosestPointBetweenSegmentAndBounds=(segment2,bounds)=>{let p12={x:segment2.x1,y:segment2.y1},p22={x:segment2.x2,y:segment2.y2},minX=bounds.minX,minY=bounds.minY,maxX=bounds.maxX,maxY=bounds.maxY;if(p12.x===p22.x&&p12.y===p22.y){let closestX=Math.max(minX,Math.min(maxX,p12.x)),closestY=Math.max(minY,Math.min(maxY,p12.y));return closestX===p12.x&&closestY===p12.y?{x:p12.x,y:p12.y}:{x:closestX,y:closestY}}let dx3=p22.x-p12.x,dy3=p22.y-p12.y,tMinX=dx3!==0?(minX-p12.x)/dx3:Number.NEGATIVE_INFINITY,tMaxX=dx3!==0?(maxX-p12.x)/dx3:Number.POSITIVE_INFINITY,tMinY=dy3!==0?(minY-p12.y)/dy3:Number.NEGATIVE_INFINITY,tMaxY=dy3!==0?(maxY-p12.y)/dy3:Number.POSITIVE_INFINITY,tEnter=Math.max(Math.min(tMinX,tMaxX),Math.min(tMinY,tMaxY)),tExit=Math.min(Math.max(tMinX,tMaxX),Math.max(tMinY,tMaxY));if(tEnter<=tExit&&tExit>=0&&tEnter<=1){let t35=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t35*dx3,y:p12.y+t35*dy3}}let closestToP1={x:Math.max(minX,Math.min(maxX,p12.x)),y:Math.max(minY,Math.min(maxY,p12.y))},closestToP2={x:Math.max(minX,Math.min(maxX,p22.x)),y:Math.max(minY,Math.min(maxY,p22.y))},distToP1Squared=(closestToP1.x-p12.x)**2+(closestToP1.y-p12.y)**2,distToP2Squared=(closestToP2.x-p22.x)**2+(closestToP2.y-p22.y)**2,edges=[{start:{x:minX,y:minY},end:{x:maxX,y:minY}},{start:{x:maxX,y:minY},end:{x:maxX,y:maxY}},{start:{x:maxX,y:maxY},end:{x:minX,y:maxY}},{start:{x:minX,y:maxY},end:{x:minX,y:minY}}],minDistance=Math.min(distToP1Squared,distToP2Squared),closestPoint=distToP1Squared<=distToP2Squared?closestToP1:closestToP2,clamp22=(value,min,max)=>Math.max(min,Math.min(max,value));for(let edge of edges){let va3={x:p22.x-p12.x,y:p22.y-p12.y},vb2={x:edge.end.x-edge.start.x,y:edge.end.y-edge.start.y},w4={x:p12.x-edge.start.x,y:p12.y-edge.start.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA=clamp22(tA,0,1),tB=clamp22(tB,0,1);let closestOnSegment={x:p12.x+tA*va3.x,y:p12.y+tA*va3.y},closestOnEdge={x:edge.start.x+tB*vb2.x,y:edge.start.y+tB*vb2.y},dx22=closestOnSegment.x-closestOnEdge.x,dy22=closestOnSegment.y-closestOnEdge.y,distSquared=dx22*dx22+dy22*dy22;distSquared<minDistance&&(minDistance=distSquared,closestPoint={x:(closestOnSegment.x+closestOnEdge.x)/2,y:(closestOnSegment.y+closestOnEdge.y)/2})}return closestPoint};function getLayersOfPcbElement(obj){return obj.type==="pcb_trace_segment"?[obj.layer]:obj.type==="pcb_smtpad"?[obj.layer]:obj.type==="pcb_plated_hole"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_hole"?[...all_layers]:obj.type==="pcb_via"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_keepout"?Array.isArray(obj.layers)?obj.layers:[]:[]}function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minSpacing=DEFAULT_TRACE_MARGIN}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i2=0;i2<pcbTrace.route.length-1;i2++){let p12=pcbTrace.route[i2],p22=pcbTrace.route[i2+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments}),pcbSmtPads=cju_default(circuitJson).pcb_smtpad.list(),pcbPlatedHoles=cju_default(circuitJson).pcb_plated_hole.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id2=>getReadableNameForElement(circuitJson,id2),errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minSpacing,bounds=getCollidableBounds(segmentA),nearbyObjects=spatialIndex.getObjectsInBounds(bounds,requiredMargin+segmentA.thickness/2);if(!(segmentA.x1===segmentA.x2&&segmentA.y1===segmentA.y2))for(let obj of nearbyObjects){if(!getLayersOfPcbElement(obj).includes(segmentA.layer))continue;if(obj.type==="pcb_trace_segment"){let segmentB=obj;if(segmentA.layer!==segmentB.layer||connMap.areIdsConnected(segmentA.pcb_trace_id,segmentB.pcb_trace_id))continue;let gap2=segmentToSegmentMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:segmentB.x1,y:segmentB.y1},{x:segmentB.x2,y:segmentB.y2})-segmentA.thickness/2-segmentB.thickness/2;if(gap2>minSpacing-EPSILON)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${segmentB.pcb_trace_id}`,pcb_trace_error_id_reverse=`overlap_${segmentB.pcb_trace_id}_${segmentA.pcb_trace_id}`;if(errorIds.has(pcb_trace_error_id)||errorIds.has(pcb_trace_error_id_reverse))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${getReadableName(segmentB.pcb_trace_id)} ${gap2<0?"(accidental contact)":`(gap: ${gap2.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:[],center:getClosestPointBetweenSegments(segmentA,segmentB),pcb_port_ids:getPcbPortIdsConnectedToTraces([segmentA._pcbTrace,segmentB._pcbTrace])});continue}let primaryObjId=getPrimaryId(obj);if(connMap.areIdsConnected(segmentA.pcb_trace_id,"pcb_trace_id"in obj?obj.pcb_trace_id:primaryObjId))continue;if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle"||obj.type==="pcb_hole"||obj.type==="pcb_smtpad"&&obj.shape==="circle"){let radius=getRadiusOfCircuitJsonElement(obj),gap2=segmentToCircleMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:obj.x,y:obj.y,radius})-segmentA.thickness/2;if(gap2>minSpacing-EPSILON)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${obj.type} "${getReadableName(getPrimaryId(obj))}" ${gap2<0?"(accidental contact)":`(gap: ${gap2.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}let gap=segmentToBoundsMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},getCollidableBounds(obj))-segmentA.thickness/2;if(gap+EPSILON<requiredMargin){let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${obj.type} "${getReadableName(getPrimaryId(obj))}" ${gap<0?"(accidental contact)":`(gap: ${gap.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}}}return errors}function checkViasOffBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length===0)return[];if(board.width===void 0||board.height===void 0)return[];let boardMinX=board.center.x-board.width/2,boardMaxX=board.center.x+board.width/2,boardMinY=board.center.y-board.height/2,boardMaxY=board.center.y+board.height/2,errors=[];for(let via of vias){let viaRadius=via.outer_diameter/2,viaMinX=via.x-viaRadius,viaMaxX=via.x+viaRadius,viaMinY=via.y-viaRadius,viaMaxY=via.y+viaRadius;if(viaMinX<boardMinX+DEFAULT_VIA_BOARD_MARGIN||viaMaxX>boardMaxX-DEFAULT_VIA_BOARD_MARGIN||viaMinY<boardMinY+DEFAULT_VIA_BOARD_MARGIN||viaMaxY>boardMaxY-DEFAULT_VIA_BOARD_MARGIN){let viaName=getReadableNameForElement(circuitJson,via.pcb_via_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`out_of_board_${via.pcb_via_id}`,message:`Via ${viaName} is outside or crossing the board boundary`,error_type:"pcb_placement_error"})}}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size2,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size2.width/2,hh3=size2.height/2,corners=[new Point$3(cx3-hw2,cy3-hh3),new Point$3(cx3+hw2,cy3-hh3),new Point$3(cx3+hw2,cy3+hh3),new Point$3(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt4=>{let p4=applyToPoint(matrix2,{x:pt4.x,y:pt4.y});return new Point$3(p4.x,p4.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p4=>new Point$3(p4.x,p4.y)),poly=new Polygon$1(points);return isPolygonCCW(poly)||poly.reverse(),poly}return board.center&&typeof board.width=="number"&&typeof board.height=="number"?rectanglePolygon({center:board.center,size:{width:board.width,height:board.height},rotationDeg:0}):null}function getComponentName({circuitJson,component}){if(component.source_component_id){let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===component.source_component_id);if(sourceComponent&&"name"in sourceComponent&&sourceComponent.name)return sourceComponent.name}return getReadableNameForComponent(circuitJson,component.pcb_component_id)}function computeOverlapDistance(compPoly,boardPoly,componentCenter,componentWidth,componentHeight,rotationDeg){let centerPoint=new Point$3(componentCenter.x,componentCenter.y);if(!boardPoly.contains(centerPoint)){let dist=boardPoly.distanceTo(centerPoint);return Array.isArray(dist)?dist[0]:Number(dist)||0}let hw2=componentWidth/2,hh3=componentHeight/2,corners=[{x:componentCenter.x-hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y+hh3},{x:componentCenter.x-hw2,y:componentCenter.y+hh3}],midpoints=[];for(let i2=0;i2<4;i2++){let next2=(i2+1)%4;midpoints.push({x:(corners[i2].x+corners[next2].x)/2,y:(corners[i2].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint5=pt4=>{let p4=applyToPoint(matrix2,pt4);return new Point$3(p4.x,p4.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint5),maxDistance=0;for(let pt4 of rotatedPoints)if(!boardPoly.contains(pt4)){let dist=boardPoly.distanceTo(pt4),d3=Array.isArray(dist)?dist[0]:Number(dist)||0;d3>maxDistance&&(maxDistance=d3)}if(maxDistance>0)return maxDistance;try{let intersection=BooleanOperations.intersect(compPoly,boardPoly),intersectionArea=0;intersection?Array.isArray(intersection)?intersectionArea=intersection.reduce((sum,p4)=>sum+(typeof p4.area=="function"?p4.area():0),0):typeof intersection.area=="function"?intersectionArea=intersection.area():intersectionArea=0:intersectionArea=0;let compArea=compPoly.area();if(intersectionArea>0&&intersectionArea<compArea){let overlapRatio=1-intersectionArea/compArea,compWidth=Math.abs(componentWidth),compHeight=Math.abs(componentHeight);return Math.min(compWidth,compHeight)*overlapRatio}else return .1}catch{return .1}}function getRepositionSuggestion({componentPoly,boardPoly}){let boardBox=boardPoly.box,componentBox=componentPoly.box,deltaX=0,deltaY=0;if(componentBox.xmin<boardBox.xmin?deltaX=boardBox.xmin-componentBox.xmin:componentBox.xmax>boardBox.xmax&&(deltaX=boardBox.xmax-componentBox.xmax),componentBox.ymin<boardBox.ymin?deltaY=boardBox.ymin-componentBox.ymin:componentBox.ymax>boardBox.ymax&&(deltaY=boardBox.ymax-componentBox.ymax),deltaX===0&&deltaY===0)return null;let xDir=deltaX>=0?"right":"left",yDir=deltaY>=0?"up":"down",absDx=Math.abs(Math.round(deltaX*100)/100),absDy=Math.abs(Math.round(deltaY*100)/100);return absDx>0&&absDy>0?`Try moving it ${absDx}mm ${xDir} and ${absDy}mm ${yDir} to fit within the board edge.`:absDx>0?`Try moving it ${absDx}mm ${xDir} to fit within the board edge.`:`Try moving it ${absDy}mm ${yDir} to fit within the board edge.`}function checkPcbComponentsOutOfBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let boardPoly=boardToPolygon({board});if(!boardPoly)return[];let components=circuitJson.filter(el3=>el3.type==="pcb_component");if(components.length===0)return[];let errors=[];for(let c3 of components){if(c3.is_allowed_to_be_off_board||!c3.center||typeof c3.width!="number"||typeof c3.height!="number"||c3.width<=0||c3.height<=0)continue;let compPoly=rectanglePolygon({center:c3.center,size:{width:c3.width,height:c3.height},rotationDeg:0});if(compPoly.area()===0||boardPoly.contains(compPoly))continue;let overlapDistance=computeOverlapDistance(compPoly,boardPoly,c3.center,c3.width,c3.height,0),compName=getComponentName({circuitJson,component:c3}),overlapDistanceMm=Math.round(overlapDistance*100)/100,repositionSuggestion=getRepositionSuggestion({componentPoly:compPoly,boardPoly});errors.push({type:"pcb_component_outside_board_error",error_type:"pcb_component_outside_board_error",pcb_component_outside_board_error_id:`pcb_component_outside_board_${c3.pcb_component_id}`,message:`Component ${compName} extends outside board boundaries by ${overlapDistanceMm}mm.${repositionSuggestion?` ${repositionSuggestion}`:""}`,pcb_component_id:c3.pcb_component_id,pcb_board_id:board.pcb_board_id,component_center:c3.center,component_bounds:{min_x:compPoly.box.xmin,max_x:compPoly.box.xmax,min_y:compPoly.box.ymin,max_y:compPoly.box.ymax},subcircuit_id:c3.subcircuit_id,source_component_id:c3.source_component_id})}return errors}function distance22(a2,b3){return Math.hypot(a2.x-b3.x,a2.y-b3.y)}function viasAreAtSameLocation(a2,b3){return distance22(a2,b3)<=EPSILON}function checkSameNetViaSpacing(circuitJson,{connMap,minSpacing=DEFAULT_SAME_NET_VIA_MARGIN}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i2=0;i2<vias.length;i2++)for(let j4=i2+1;j4<vias.length;j4++){let viaA=vias[i2],viaB=vias[j4];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.outer_diameter/2-viaB.outer_diameter/2;if(gap+EPSILON>=minSpacing)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`same_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minSpacing,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minSpacing=DEFAULT_DIFFERENT_NET_VIA_MARGIN}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i2=0;i2<vias.length;i2++)for(let j4=i2+1;j4<vias.length;j4++){let viaA=vias[i2],viaB=vias[j4];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.outer_diameter/2-viaB.outer_diameter/2;if(gap+EPSILON>=minSpacing)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`different_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} from different nets are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minSpacing,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}var getSourceTraceIdsFromPcbTrace=pcbTraceSourceTraceId=>pcbTraceSourceTraceId?pcbTraceSourceTraceId.includes("__")?pcbTraceSourceTraceId.split("__").filter(part=>part.startsWith("source_trace_")):[pcbTraceSourceTraceId]:[];function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace");for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids?.length||(sourceTrace.connected_source_net_ids?.length??0)>0||sourceTrace.connected_source_port_ids.length<2)continue;if(!pcbTraces.some(pcbTrace=>getSourceTraceIdsFromPcbTrace(pcbTrace.source_trace_id).includes(sourceTrace.source_trace_id))){let connectedPcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"&&sourceTrace.connected_source_port_ids.includes(el3.source_port_id)),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id2=>id2!==void 0)));errors.push({type:"pcb_trace_missing_error",pcb_trace_missing_error_id:`pcb_trace_missing_${sourceTrace.source_trace_id}`,error_type:"pcb_trace_missing_error",message:`Trace [${sourceTrace.display_name&&!containsCircuitJsonId(sourceTrace.display_name)?sourceTrace.display_name:"trace"}] is not connected (it has no PCB trace)`,source_trace_id:sourceTrace.source_trace_id,pcb_component_ids:connectedPcbComponentIds,pcb_port_ids:connectedPcbPorts.map(port=>port.pcb_port_id)})}}return errors}var DEFAULT_BOARD_MARGIN=.2;function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p4=>({x:p4.x,y:p4.y}));if(board.center&&typeof board.width=="number"&&typeof board.height=="number"){let cx3=board.center.x,cy3=board.center.y,hw2=board.width/2,hh3=board.height/2;return[{x:cx3-hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3+hh3},{x:cx3-hw2,y:cy3+hh3}]}return null}function checkPcbTracesOutOfBoard(circuitJson,config={}){let errors=[],margin=config.margin??DEFAULT_BOARD_MARGIN,board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return errors;let boardPoints=getBoardPolygonPoints(board);if(!boardPoints)return errors;let pcbTraces=cju_default(circuitJson).pcb_trace.list();for(let trace of pcbTraces)if(!(trace.route.length<2))for(let i2=0;i2<trace.route.length-1;i2++){let p12=trace.route[i2],p22=trace.route[i2+1];if(p12.route_type!=="wire"||p22.route_type!=="wire")continue;let traceWidth="width"in p12?p12.width:"width"in p22?p22.width:.1,segmentStart={x:p12.x,y:p12.y},segmentEnd={x:p22.x,y:p22.y},minDistance=1/0;for(let j4=0;j4<boardPoints.length;j4++){let edgeStart=boardPoints[j4],edgeEnd=boardPoints[(j4+1)%boardPoints.length],distance32=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance32<minDistance&&(minDistance=distance32)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i2}`,message:`Trace too close to board edge (${minDistance.toFixed(3)}mm < ${minimumDistance.toFixed(3)}mm required, margin: ${margin}mm)`,pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id||"",center:{x:(segmentStart.x+segmentEnd.x)/2,y:(segmentStart.y+segmentEnd.y)/2},pcb_component_ids:[],pcb_port_ids:[]};errors.push(error)}}return errors}function getElementLayers(elem){return getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l3=>layers2.includes(l3))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id2=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id2);return readableName==="element"?`[${id2}]`:readableName};function checkPcbComponentOverlap(circuitJson){let errors=[],connMap=getFullConnectivityMapFromCircuitJson(circuitJson),smtPads=cju_default(circuitJson).pcb_smtpad.list(),platedHoles=cju_default(circuitJson).pcb_plated_hole.list(),holes=cju_default(circuitJson).pcb_hole.list(),componentMap=new Map;for(let pad2 of smtPads){let componentId=pad2.pcb_component_id||`standalone_pad_${getPrimaryId(pad2)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[],bounds:{minX:0,minY:0,maxX:0,maxY:0}}),componentMap.get(componentId).elements.push(pad2)}for(let hole of platedHoles){let componentId=hole.pcb_component_id||`standalone_plated_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[],bounds:{minX:0,minY:0,maxX:0,maxY:0}}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=`standalone_hole_${getPrimaryId(hole)}`;componentMap.set(componentId,{component_id:componentId,elements:[hole],bounds:{minX:0,minY:0,maxX:0,maxY:0}})}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i2=0;i2<componentsWithElements.length;i2++)for(let j4=i2+1;j4<componentsWithElements.length;j4++){let comp1=componentsWithElements[i2],comp2=componentsWithElements[j4];if(doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id2=getPrimaryId(elem2);if(!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id2))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id2}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error.pcb_smtpad_ids.push(id2)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error.pcb_plated_hole_ids.push(id2)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error.pcb_hole_ids.push(id2)),errors.push(error)}}}return errors}function checkPinMustBeConnected(circuitJson){let errors=[],sourceComponents=circuitJson.filter(el3=>"source_component_id"in el3&&(el3.type==="source_component"||el3.type.startsWith("source_simple_"))),sourcePorts=circuitJson.filter(el3=>el3.type==="source_port"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),connectedPortIds=new Set;for(let trace of sourceTraces)for(let portId of trace.connected_source_port_ids??[])connectedPortIds.add(portId);let componentInternalConnections=new Map;for(let component of sourceComponents)"internally_connected_source_port_ids"in component&&component.internally_connected_source_port_ids&&componentInternalConnections.set(component.source_component_id,component.internally_connected_source_port_ids);for(let internalGroups of componentInternalConnections.values())for(let group of internalGroups)if(group.some(portId=>connectedPortIds.has(portId)))for(let portId of group)connectedPortIds.add(portId);for(let port of sourcePorts)if(port.must_be_connected===!0&&!connectedPortIds.has(port.source_port_id)){let componentName=sourceComponents.find(c3=>c3.source_component_id===port.source_component_id)?.name??"Unknown";errors.push({type:"source_pin_must_be_connected_error",source_pin_must_be_connected_error_id:`source_pin_must_be_connected_error_${port.source_port_id}`,error_type:"source_pin_must_be_connected_error",message:`Port ${port.name} on ${componentName} must be connected but is floating`,source_component_id:port.source_component_id??"",source_port_id:port.source_port_id,subcircuit_id:port.subcircuit_id})}return errors}var PIN_ATTRIBUTE_KEYS=["must_be_connected","provides_power","requires_power","provides_ground","requires_ground","provides_voltage","requires_voltage","do_not_connect","include_in_board_pinout","can_use_internal_pullup","is_using_internal_pullup","needs_external_pullup","can_use_internal_pulldown","is_using_internal_pulldown","needs_external_pulldown","can_use_open_drain","is_using_open_drain","can_use_push_pull","is_using_push_pull","should_have_decoupling_capacitor","recommended_decoupling_capacitor_capacitance","is_configured_for_i2c_sda","is_configured_for_i2c_scl","is_configured_for_spi_mosi","is_configured_for_spi_miso","is_configured_for_spi_sck","is_configured_for_spi_cs","is_configured_for_uart_tx","is_configured_for_uart_rx","supports_i2c_sda","supports_i2c_scl","supports_spi_mosi","supports_spi_miso","supports_spi_sck","supports_spi_cs","supports_uart_tx","supports_uart_rx"];function hasAnyPinAttribute(port){return PIN_ATTRIBUTE_KEYS.some(key=>port[key]!==void 0)}function checkAllPinsInComponentAreUnderspecified(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>hasAnyPinAttribute(port))||warnings.push({type:"source_component_pins_underspecified_warning",source_component_pins_underspecified_warning_id:`source_component_pins_underspecified_warning_${component.source_component_id}`,warning_type:"source_component_pins_underspecified_warning",message:`All pins on ${component.name} are underspecified (no pinAttributes set)`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoPowerPinDefined(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_power===!0)||warnings.push({type:"source_no_power_pin_defined_warning",source_no_power_pin_defined_warning_id:`source_no_power_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_power_pin_defined_warning",message:`${component.name} has no pin with requires_power=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoGroundPinDefined(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_ground===!0)||warnings.push({type:"source_no_ground_pin_defined_warning",source_no_ground_pin_defined_warning_id:`source_no_ground_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_ground_pin_defined_warning",message:`${component.name} has no pin with requires_ground=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function getCourtyardPolygon(el3){if(el3.type==="pcb_courtyard_rect"){let hw2=el3.width/2,hh3=el3.height/2,corners=[{x:-hw2,y:-hh3},{x:+hw2,y:-hh3},{x:+hw2,y:+hh3},{x:-hw2,y:+hh3}],angle=(el3.ccw_rotation??0)*Math.PI/180,cos5=Math.cos(angle),sin5=Math.sin(angle);return corners.map(({x:x5,y:y5})=>({x:el3.center.x+x5*cos5-y5*sin5,y:el3.center.y+x5*sin5+y5*cos5}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_5,i2)=>{let a2=2*Math.PI*i2/32;return{x:el3.center.x+el3.radius*Math.cos(a2),y:el3.center.y+el3.radius*Math.sin(a2)}}):el3.outline}function getComponentName2(circuitJson,pcbComponentId){let pcbComponent=circuitJson.find(el3=>el3.type==="pcb_component"&&el3.pcb_component_id===pcbComponentId);if(pcbComponent?.type!=="pcb_component")return pcbComponentId;let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===pcbComponent.source_component_id);return sourceComponent?.type==="source_component"&&sourceComponent.name?sourceComponent.name:pcbComponentId}function polygonsOverlap(polyA,polyB){if(polyA.some(p4=>isPointInsidePolygon(p4,polyB))||polyB.some(p4=>isPointInsidePolygon(p4,polyA)))return!0;for(let i2=0;i2<polyA.length;i2++){let a12=polyA[i2],a2=polyA[(i2+1)%polyA.length];for(let j4=0;j4<polyB.length;j4++){let b12=polyB[j4],b22=polyB[(j4+1)%polyB.length];if(doSegmentsIntersect(a12,a2,b12,b22))return!0}}return!1}function checkCourtyardOverlap(circuitJson){let courtyards=circuitJson.filter(el3=>el3.type==="pcb_courtyard_rect"||el3.type==="pcb_courtyard_circle"||el3.type==="pcb_courtyard_outline"),byComponent=new Map;for(let el3 of courtyards){let id2=el3.pcb_component_id;byComponent.has(id2)||byComponent.set(id2,[]),byComponent.get(id2).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i2=0;i2<componentIds.length;i2++)for(let j4=i2+1;j4<componentIds.length;j4++){let idA=componentIds[i2],idB=componentIds[j4],overlapping=!1;outer:for(let a2 of byComponent.get(idA))for(let b3 of byComponent.get(idB)){let polyA=getCourtyardPolygon(a2),polyB=getCourtyardPolygon(b3);if(polygonsOverlap(polyA,polyB)){overlapping=!0;break outer}}overlapping&&errors.push({type:"pcb_courtyard_overlap_error",pcb_error_id:`pcb_courtyard_overlap_${idA}_${idB}`,error_type:"pcb_courtyard_overlap_error",message:`Courtyard of ${getComponentName2(circuitJson,idA)} overlaps with courtyard of ${getComponentName2(circuitJson,idB)}`,pcb_component_ids:[idA,idB]})}return errors}function getFacingDirection(component){if(!component.center||!component.cable_insertion_center)return null;let dx3=component.cable_insertion_center.x-component.center.x,dy3=component.cable_insertion_center.y-component.center.y;return Math.abs(dx3)<1e-6&&Math.abs(dy3)<1e-6?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"x+":"x-":dy3>=0?"y+":"y-"}function getRecommendedFacingDirection(component,bounds){if(!component.center)return null;let distances=[{direction:"x-",distance:component.center.x-bounds.minX},{direction:"x+",distance:bounds.maxX-component.center.x},{direction:"y-",distance:component.center.y-bounds.minY},{direction:"y+",distance:bounds.maxY-component.center.y}];return distances.sort((a2,b3)=>a2.distance-b3.distance),distances[0]?.direction??null}function checkConnectorAccessibleOrientation(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let bounds=(()=>{try{return getBoardBounds(board)}catch{return null}})();if(!bounds)return[];let warnings=[],components=circuitJson.filter(el3=>el3.type==="pcb_component");for(let component of components){if(!component.cable_insertion_center)continue;let facingDirection=getFacingDirection(component),recommendedFacingDirection=getRecommendedFacingDirection(component,bounds);if(!facingDirection||!recommendedFacingDirection||facingDirection===recommendedFacingDirection)continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id);warnings.push({type:"pcb_connector_not_in_accessible_orientation_warning",warning_type:"pcb_connector_not_in_accessible_orientation_warning",pcb_connector_not_in_accessible_orientation_warning_id:`pcb_connector_not_in_accessible_orientation_warning_${component.pcb_component_id}`,message:`${componentName} is facing ${facingDirection} but should face ${recommendedFacingDirection} so the connector is accessible from the board edge`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,pcb_board_id:board.pcb_board_id,facing_direction:facingDirection,recommended_facing_direction:recommendedFacingDirection,subcircuit_id:component.subcircuit_id})}return warnings}async function runAllPlacementChecks(circuitJson){return[...checkViasOffBoard(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson)]}async function runAllNetlistChecks(circuitJson){return[...checkPinMustBeConnected(circuitJson)]}async function runAllPinSpecificationChecks(circuitJson){return[...checkAllPinsInComponentAreUnderspecified(circuitJson),...checkNoPowerPinDefined(circuitJson),...checkNoGroundPinDefined(circuitJson)]}async function runAllRoutingChecks(circuitJson){return[...checkEachPcbPortConnectedToPcbTraces(circuitJson),...checkSourceTracesHavePcbTraces(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist6();var SI_PREFIXES=[{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"},{value:1,symbol:""},{value:.001,symbol:"m"},{value:1e-6,symbol:"\xB5"},{value:1e-9,symbol:"n"},{value:1e-12,symbol:"p"}];function formatSiUnit(value){if(value==null)return"";if(value===0)return"0";let absValue=Math.abs(value),prefix=SI_PREFIXES.find(p4=>{let scaled2=absValue/p4.value;return scaled2>=1&&scaled2<1e3})||SI_PREFIXES[SI_PREFIXES.length-1],formatted=(value/prefix.value).toPrecision(3);return formatted.includes(".")&&!/\.0+$/.test(formatted)&&(formatted=formatted.replace(/0+$/,"")),formatted=formatted.replace(/\.0+$/,""),`${formatted}${prefix.symbol}`}init_dist6();init_dist();var import_object_hash=__toESM(require_object_hash(),1);var FlatQueue=class{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(item,priority){let pos=this.length++;for(;pos>0;){let parent=pos-1>>1,parentValue=this.values[parent];if(priority>=parentValue)break;this.ids[pos]=this.ids[parent],this.values[pos]=parentValue,pos=parent}this.ids[pos]=item,this.values[pos]=priority}pop(){if(this.length===0)return;let ids=this.ids,values=this.values,top=ids[0],last=--this.length;if(last>0){let id2=ids[last],value=values[last],pos=0,halfLen=last>>1;for(;pos<halfLen;){let left=(pos<<1)+1,right=left+1,child=left+(+(right<last)&+(values[right]<values[left]));if(values[child]>=value)break;ids[pos]=ids[child],values[pos]=values[child],pos=child}ids[pos]=id2,values[pos]=value}return top}peek(){return this.length>0?this.ids[0]:void 0}peekValue(){return this.length>0?this.values[0]:void 0}shrink(){this.ids.length=this.values.length=this.length}};var ARRAY_TYPES=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],VERSION=3,Flatbush=class _Flatbush{static from(data,byteOffset=0){if(byteOffset%8!==0)throw new Error("byteOffset must be 8-byte aligned.");if(!data||data.byteLength===void 0||data.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");let[magic,versionAndType]=new Uint8Array(data,byteOffset+0,2);if(magic!==251)throw new Error("Data does not appear to be in a Flatbush format.");let version=versionAndType>>4;if(version!==VERSION)throw new Error(`Got v${version} data when expected v${VERSION}.`);let ArrayType=ARRAY_TYPES[versionAndType&15];if(!ArrayType)throw new Error("Unrecognized array type.");let[nodeSize]=new Uint16Array(data,byteOffset+2,1),[numItems]=new Uint32Array(data,byteOffset+4,1);return new _Flatbush(numItems,nodeSize,ArrayType,void 0,data,byteOffset)}constructor(numItems,nodeSize=16,ArrayType=Float64Array,ArrayBufferType=ArrayBuffer,data,byteOffset=0){if(numItems===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(numItems)||numItems<=0)throw new Error(`Unexpected numItems value: ${numItems}.`);this.numItems=+numItems,this.nodeSize=Math.min(Math.max(+nodeSize,2),65535),this.byteOffset=byteOffset;let n3=numItems,numNodes=n3;this._levelBounds=[n3*4];do n3=Math.ceil(n3/this.nodeSize),numNodes+=n3,this._levelBounds.push(numNodes*4);while(n3!==1);this.ArrayType=ArrayType,this.IndexArrayType=numNodes<16384?Uint16Array:Uint32Array;let arrayTypeIndex=ARRAY_TYPES.indexOf(ArrayType),nodesByteSize=numNodes*4*ArrayType.BYTES_PER_ELEMENT;if(arrayTypeIndex<0)throw new Error(`Unexpected typed array class: ${ArrayType}.`);if(data)this.data=data,this._boxes=new ArrayType(data,byteOffset+8,numNodes*4),this._indices=new this.IndexArrayType(data,byteOffset+8+nodesByteSize,numNodes),this._pos=numNodes*4,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1];else{let data2=this.data=new ArrayBufferType(8+nodesByteSize+numNodes*this.IndexArrayType.BYTES_PER_ELEMENT);this._boxes=new ArrayType(data2,8,numNodes*4),this._indices=new this.IndexArrayType(data2,8+nodesByteSize,numNodes),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(data2,0,2).set([251,(VERSION<<4)+arrayTypeIndex]),new Uint16Array(data2,2,1)[0]=nodeSize,new Uint32Array(data2,4,1)[0]=numItems}this._queue=new FlatQueue}add(minX,minY,maxX=minX,maxY=minY){let index=this._pos>>2,boxes=this._boxes;return this._indices[index]=index,boxes[this._pos++]=minX,boxes[this._pos++]=minY,boxes[this._pos++]=maxX,boxes[this._pos++]=maxY,minX<this.minX&&(this.minX=minX),minY<this.minY&&(this.minY=minY),maxX>this.maxX&&(this.maxX=maxX),maxY>this.maxY&&(this.maxY=maxY),index}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);let boxes=this._boxes;if(this.numItems<=this.nodeSize){boxes[this._pos++]=this.minX,boxes[this._pos++]=this.minY,boxes[this._pos++]=this.maxX,boxes[this._pos++]=this.maxY;return}let width=this.maxX-this.minX||1,height=this.maxY-this.minY||1,hilbertValues=new Uint32Array(this.numItems),hilbertMax=65535;for(let i2=0,pos=0;i2<this.numItems;i2++){let minX=boxes[pos++],minY=boxes[pos++],maxX=boxes[pos++],maxY=boxes[pos++],x5=Math.floor(hilbertMax*((minX+maxX)/2-this.minX)/width),y5=Math.floor(hilbertMax*((minY+maxY)/2-this.minY)/height);hilbertValues[i2]=hilbert(x5,y5)}sort(hilbertValues,boxes,this._indices,0,this.numItems-1,this.nodeSize);for(let i2=0,pos=0;i2<this._levelBounds.length-1;i2++){let end=this._levelBounds[i2];for(;pos<end;){let nodeIndex=pos,nodeMinX=boxes[pos++],nodeMinY=boxes[pos++],nodeMaxX=boxes[pos++],nodeMaxY=boxes[pos++];for(let j4=1;j4<this.nodeSize&&pos<end;j4++)nodeMinX=Math.min(nodeMinX,boxes[pos++]),nodeMinY=Math.min(nodeMinY,boxes[pos++]),nodeMaxX=Math.max(nodeMaxX,boxes[pos++]),nodeMaxY=Math.max(nodeMaxY,boxes[pos++]);this._indices[this._pos>>2]=nodeIndex,boxes[this._pos++]=nodeMinX,boxes[this._pos++]=nodeMinY,boxes[this._pos++]=nodeMaxX,boxes[this._pos++]=nodeMaxY}}}search(minX,minY,maxX,maxY,filterFn){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let nodeIndex=this._boxes.length-4,queue=[],results=[];for(;nodeIndex!==void 0;){let end=Math.min(nodeIndex+this.nodeSize*4,upperBound(nodeIndex,this._levelBounds));for(let pos=nodeIndex;pos<end;pos+=4){let x02=this._boxes[pos];if(maxX<x02)continue;let y02=this._boxes[pos+1];if(maxY<y02)continue;let x12=this._boxes[pos+2];if(minX>x12)continue;let y12=this._boxes[pos+3];if(minY>y12)continue;let index=this._indices[pos>>2]|0;nodeIndex>=this.numItems*4?queue.push(index):(filterFn===void 0||filterFn(index,x02,y02,x12,y12))&&results.push(index)}nodeIndex=queue.pop()}return results}neighbors(x5,y5,maxResults=1/0,maxDistance=1/0,filterFn){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let nodeIndex=this._boxes.length-4,q4=this._queue,results=[],maxDistSquared=maxDistance*maxDistance;outer:for(;nodeIndex!==void 0;){let end=Math.min(nodeIndex+this.nodeSize*4,upperBound(nodeIndex,this._levelBounds));for(let pos=nodeIndex;pos<end;pos+=4){let index=this._indices[pos>>2]|0,minX=this._boxes[pos],minY=this._boxes[pos+1],maxX=this._boxes[pos+2],maxY=this._boxes[pos+3],dx3=x5<minX?minX-x5:x5>maxX?x5-maxX:0,dy3=y5<minY?minY-y5:y5>maxY?y5-maxY:0,dist=dx3*dx3+dy3*dy3;dist>maxDistSquared||(nodeIndex>=this.numItems*4?q4.push(index<<1,dist):(filterFn===void 0||filterFn(index))&&q4.push((index<<1)+1,dist))}for(;q4.length&&q4.peek()&1;)if(q4.peekValue()>maxDistSquared||(results.push(q4.pop()>>1),results.length===maxResults))break outer;nodeIndex=q4.length?q4.pop()>>1:void 0}return q4.clear(),results}};function upperBound(value,arr){let i2=0,j4=arr.length-1;for(;i2<j4;){let m3=i2+j4>>1;arr[m3]>value?j4=m3:i2=m3+1}return arr[i2]}function sort(values,boxes,indices,left,right,nodeSize){let stack=[left,right];for(;stack.length;){let r4=stack.pop()||0,l3=stack.pop()||0;if(r4-l3<=nodeSize&&Math.floor(l3/nodeSize)>=Math.floor(r4/nodeSize))continue;let a2=values[l3],b3=values[l3+r4>>1],c3=values[r4],pivot=a2>b3!=a2>c3?a2:b3<a2!=b3<c3?b3:c3,i2=l3-1,j4=r4+1;for(;;){do i2++;while(values[i2]<pivot);do j4--;while(values[j4]>pivot);if(i2>=j4)break;swap(values,boxes,indices,i2,j4)}stack.push(l3,j4,j4+1,r4)}}function swap(values,boxes,indices,i2,j4){let temp=values[i2];values[i2]=values[j4],values[j4]=temp;let k4=4*i2,m3=4*j4,a2=boxes[k4],b3=boxes[k4+1],c3=boxes[k4+2],d3=boxes[k4+3];boxes[k4]=boxes[m3],boxes[k4+1]=boxes[m3+1],boxes[k4+2]=boxes[m3+2],boxes[k4+3]=boxes[m3+3],boxes[m3]=a2,boxes[m3+1]=b3,boxes[m3+2]=c3,boxes[m3+3]=d3;let e4=indices[i2];indices[i2]=indices[j4],indices[j4]=e4}function hilbert(x5,y5){let a2=x5^y5,b3=65535^a2,c3=65535^(x5|y5),d3=x5&(y5^65535),A4=a2|b3>>1,B5=a2>>1^a2,C4=c3>>1^b3&d3>>1^c3,D6=a2&c3>>1^d3>>1^d3;a2=A4,b3=B5,c3=C4,d3=D6,A4=a2&a2>>2^b3&b3>>2,B5=a2&b3>>2^b3&(a2^b3)>>2,C4^=a2&c3>>2^b3&d3>>2,D6^=b3&c3>>2^(a2^b3)&d3>>2,a2=A4,b3=B5,c3=C4,d3=D6,A4=a2&a2>>4^b3&b3>>4,B5=a2&b3>>4^b3&(a2^b3)>>4,C4^=a2&c3>>4^b3&d3>>4,D6^=b3&c3>>4^(a2^b3)&d3>>4,a2=A4,b3=B5,c3=C4,d3=D6,C4^=a2&c3>>8^b3&d3>>8,D6^=b3&c3>>8^(a2^b3)&d3>>8,a2=C4^C4>>1,b3=D6^D6>>1;let i02=x5^y5,i12=b3|65535^(i02|a2);return i02=(i02|i02<<8)&16711935,i02=(i02|i02<<4)&252645135,i02=(i02|i02<<2)&858993459,i02=(i02|i02<<1)&1431655765,i12=(i12|i12<<8)&16711935,i12=(i12|i12<<4)&252645135,i12=(i12|i12<<2)&858993459,i12=(i12|i12<<1)&1431655765,(i12<<1|i02)>>>0}var __create2=Object.create,__defProp3=Object.defineProperty,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__getOwnPropNames2=Object.getOwnPropertyNames,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__commonJS2=(cb3,mod)=>function(){return mod||(0,cb3[__getOwnPropNames2(cb3)[0]])((mod={exports:{}}).exports,mod),mod.exports},__copyProps2=(to3,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames2(from))!__hasOwnProp2.call(to3,key)&&key!==except&&__defProp3(to3,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc2(from,key))||desc.enumerable});return to3},__toESM2=(mod,isNodeMode,target)=>(target=mod!=null?__create2(__getProtoOf2(mod)):{},__copyProps2(isNodeMode||!mod||!mod.__esModule?__defProp3(target,"default",{value:mod,enumerable:!0}):target,mod)),require_is_buffer=__commonJS2({"node_modules/is-buffer/index.js"(exports,module){"use strict";module.exports=function(obj){return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)};function isBuffer(obj){return!!obj.constructor&&typeof obj.constructor.isBuffer=="function"&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return typeof obj.readFloatLE=="function"&&typeof obj.slice=="function"&&isBuffer(obj.slice(0,0))}}}),require_kind_of=__commonJS2({"node_modules/kind-of/index.js"(exports,module){"use strict";var isBuffer=require_is_buffer(),toString2=Object.prototype.toString;module.exports=function(val){if(typeof val>"u")return"undefined";if(val===null)return"null";if(val===!0||val===!1||val instanceof Boolean)return"boolean";if(typeof val=="string"||val instanceof String)return"string";if(typeof val=="number"||val instanceof Number)return"number";if(typeof val=="function"||val instanceof Function)return"function";if(typeof Array.isArray<"u"&&Array.isArray(val))return"array";if(val instanceof RegExp)return"regexp";if(val instanceof Date)return"date";var type=toString2.call(val);return type==="[object RegExp]"?"regexp":type==="[object Date]"?"date":type==="[object Arguments]"?"arguments":type==="[object Error]"?"error":isBuffer(val)?"buffer":type==="[object Set]"?"set":type==="[object WeakSet]"?"weakset":type==="[object Map]"?"map":type==="[object WeakMap]"?"weakmap":type==="[object Symbol]"?"symbol":type==="[object Int8Array]"?"int8array":type==="[object Uint8Array]"?"uint8array":type==="[object Uint8ClampedArray]"?"uint8clampedarray":type==="[object Int16Array]"?"int16array":type==="[object Uint16Array]"?"uint16array":type==="[object Int32Array]"?"int32array":type==="[object Uint32Array]"?"uint32array":type==="[object Float32Array]"?"float32array":type==="[object Float64Array]"?"float64array":"object"}}}),require_rename_keys=__commonJS2({"node_modules/rename-keys/index.js"(exports,module){"use strict";(function(){"use strict";function rename2(obj,fn3){if(typeof fn3!="function")return obj;var res2={};for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(res2[fn3(key,obj[key])||key]=obj[key]);return res2}typeof module<"u"&&module.exports?module.exports=rename2:typeof define=="function"&&define.amd?define([],function(){return rename2}):window.rename=rename2})()}}),require_deep_rename_keys=__commonJS2({"node_modules/deep-rename-keys/index.js"(exports,module){"use strict";var typeOf=require_kind_of(),rename2=require_rename_keys();module.exports=function renameDeep(obj,cb3){var type=typeOf(obj);if(type!=="object"&&type!=="array")throw new Error("expected an object");var res2=[];type==="object"&&(obj=rename2(obj,cb3),res2={});for(var key in obj)if(obj.hasOwnProperty(key)){var val=obj[key];typeOf(val)==="object"||typeOf(val)==="array"?res2[key]=renameDeep(val,cb3):res2[key]=val}return res2}}}),require_eventemitter3=__commonJS2({"node_modules/eventemitter3/index.js"(exports,module){"use strict";var has=Object.prototype.hasOwnProperty,prefix="~";function Events(){}Object.create&&(Events.prototype=Object.create(null),new Events().__proto__||(prefix=!1));function EE2(fn3,context,once){this.fn=fn3,this.context=context,this.once=once||!1}function EventEmitter(){this._events=new Events,this._eventsCount=0}EventEmitter.prototype.eventNames=function(){var names=[],events,name;if(this._eventsCount===0)return names;for(name in events=this._events)has.call(events,name)&&names.push(prefix?name.slice(1):name);return Object.getOwnPropertySymbols?names.concat(Object.getOwnPropertySymbols(events)):names},EventEmitter.prototype.listeners=function(event,exists){var evt=prefix?prefix+event:event,available=this._events[evt];if(exists)return!!available;if(!available)return[];if(available.fn)return[available.fn];for(var i2=0,l3=available.length,ee4=new Array(l3);i2<l3;i2++)ee4[i2]=available[i2].fn;return ee4},EventEmitter.prototype.emit=function(event,a12,a2,a3,a4,a52){var evt=prefix?prefix+event:event;if(!this._events[evt])return!1;var listeners=this._events[evt],len=arguments.length,args,i2;if(listeners.fn){switch(listeners.once&&this.removeListener(event,listeners.fn,void 0,!0),len){case 1:return listeners.fn.call(listeners.context),!0;case 2:return listeners.fn.call(listeners.context,a12),!0;case 3:return listeners.fn.call(listeners.context,a12,a2),!0;case 4:return listeners.fn.call(listeners.context,a12,a2,a3),!0;case 5:return listeners.fn.call(listeners.context,a12,a2,a3,a4),!0;case 6:return listeners.fn.call(listeners.context,a12,a2,a3,a4,a52),!0}for(i2=1,args=new Array(len-1);i2<len;i2++)args[i2-1]=arguments[i2];listeners.fn.apply(listeners.context,args)}else{var length3=listeners.length,j4;for(i2=0;i2<length3;i2++)switch(listeners[i2].once&&this.removeListener(event,listeners[i2].fn,void 0,!0),len){case 1:listeners[i2].fn.call(listeners[i2].context);break;case 2:listeners[i2].fn.call(listeners[i2].context,a12);break;case 3:listeners[i2].fn.call(listeners[i2].context,a12,a2);break;case 4:listeners[i2].fn.call(listeners[i2].context,a12,a2,a3);break;default:if(!args)for(j4=1,args=new Array(len-1);j4<len;j4++)args[j4-1]=arguments[j4];listeners[i2].fn.apply(listeners[i2].context,args)}}return!0},EventEmitter.prototype.on=function(event,fn3,context){var listener=new EE2(fn3,context||this),evt=prefix?prefix+event:event;return this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):(this._events[evt]=listener,this._eventsCount++),this},EventEmitter.prototype.once=function(event,fn3,context){var listener=new EE2(fn3,context||this,!0),evt=prefix?prefix+event:event;return this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):(this._events[evt]=listener,this._eventsCount++),this},EventEmitter.prototype.removeListener=function(event,fn3,context,once){var evt=prefix?prefix+event:event;if(!this._events[evt])return this;if(!fn3)return--this._eventsCount===0?this._events=new Events:delete this._events[evt],this;var listeners=this._events[evt];if(listeners.fn)listeners.fn===fn3&&(!once||listeners.once)&&(!context||listeners.context===context)&&(--this._eventsCount===0?this._events=new Events:delete this._events[evt]);else{for(var i2=0,events=[],length3=listeners.length;i2<length3;i2++)(listeners[i2].fn!==fn3||once&&!listeners[i2].once||context&&listeners[i2].context!==context)&&events.push(listeners[i2]);events.length?this._events[evt]=events.length===1?events[0]:events:--this._eventsCount===0?this._events=new Events:delete this._events[evt]}return this},EventEmitter.prototype.removeAllListeners=function(event){var evt;return event?(evt=prefix?prefix+event:event,this._events[evt]&&(--this._eventsCount===0?this._events=new Events:delete this._events[evt])):(this._events=new Events,this._eventsCount=0),this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=prefix,EventEmitter.EventEmitter=EventEmitter,typeof module<"u"&&(module.exports=EventEmitter)}}),require_lexer=__commonJS2({"node_modules/xml-lexer/dist/lexer.js"(exports,module){"use strict";function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}var EventEmitter=require_eventemitter3(),noop=function(){},State2={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},Action={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},Type={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},charToAction={" ":Action.space," ":Action.space,"\n":Action.space,"\r":Action.space,"<":Action.lt,">":Action.gt,'"':Action.quote,"'":Action.quote,"=":Action.equal,"/":Action.slash},getAction=function(char){return charToAction[char]||Action.char},create=function(options){var _State$data,_State$tagBegin,_State$tagName,_State$tagEnd,_State$attributeNameS,_State$attributeName,_State$attributeNameE,_State$attributeValue,_State$attributeValue2,_lexer$stateMachine;options=Object.assign({debug:!1},options);var lexer=new EventEmitter,state2=State2.data,data="",tagName="",attrName="",attrValue="",isClosing="",openingQuote="",emit=function(type,value){if(!(tagName[0]==="?"||tagName[0]==="!")){var event={type,value};options.debug&&console.log("emit:",event),lexer.emit("data",event)}};lexer.stateMachine=(_lexer$stateMachine={},_defineProperty(_lexer$stateMachine,State2.data,(_State$data={},_defineProperty(_State$data,Action.lt,function(){data.trim()&&emit(Type.text,data),tagName="",isClosing=!1,state2=State2.tagBegin}),_defineProperty(_State$data,Action.char,function(char){data+=char}),_State$data)),_defineProperty(_lexer$stateMachine,State2.cdata,_defineProperty({},Action.char,function(char){data+=char,data.substr(-3)==="]]>"&&(emit(Type.text,data.slice(0,-3)),data="",state2=State2.data)})),_defineProperty(_lexer$stateMachine,State2.tagBegin,(_State$tagBegin={},_defineProperty(_State$tagBegin,Action.space,noop),_defineProperty(_State$tagBegin,Action.char,function(char){tagName=char,state2=State2.tagName}),_defineProperty(_State$tagBegin,Action.slash,function(){tagName="",isClosing=!0}),_State$tagBegin)),_defineProperty(_lexer$stateMachine,State2.tagName,(_State$tagName={},_defineProperty(_State$tagName,Action.space,function(){isClosing?state2=State2.tagEnd:(state2=State2.attributeNameStart,emit(Type.openTag,tagName))}),_defineProperty(_State$tagName,Action.gt,function(){emit(isClosing?Type.closeTag:Type.openTag,tagName),data="",state2=State2.data}),_defineProperty(_State$tagName,Action.slash,function(){state2=State2.tagEnd,emit(Type.openTag,tagName)}),_defineProperty(_State$tagName,Action.char,function(char){tagName+=char,tagName==="![CDATA["&&(state2=State2.cdata,data="",tagName="")}),_State$tagName)),_defineProperty(_lexer$stateMachine,State2.tagEnd,(_State$tagEnd={},_defineProperty(_State$tagEnd,Action.gt,function(){emit(Type.closeTag,tagName),data="",state2=State2.data}),_defineProperty(_State$tagEnd,Action.char,noop),_State$tagEnd)),_defineProperty(_lexer$stateMachine,State2.attributeNameStart,(_State$attributeNameS={},_defineProperty(_State$attributeNameS,Action.char,function(char){attrName=char,state2=State2.attributeName}),_defineProperty(_State$attributeNameS,Action.gt,function(){data="",state2=State2.data}),_defineProperty(_State$attributeNameS,Action.space,noop),_defineProperty(_State$attributeNameS,Action.slash,function(){isClosing=!0,state2=State2.tagEnd}),_State$attributeNameS)),_defineProperty(_lexer$stateMachine,State2.attributeName,(_State$attributeName={},_defineProperty(_State$attributeName,Action.space,function(){state2=State2.attributeNameEnd}),_defineProperty(_State$attributeName,Action.equal,function(){emit(Type.attributeName,attrName),state2=State2.attributeValueBegin}),_defineProperty(_State$attributeName,Action.gt,function(){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeName,Action.slash,function(){isClosing=!0,attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),state2=State2.tagEnd}),_defineProperty(_State$attributeName,Action.char,function(char){attrName+=char}),_State$attributeName)),_defineProperty(_lexer$stateMachine,State2.attributeNameEnd,(_State$attributeNameE={},_defineProperty(_State$attributeNameE,Action.space,noop),_defineProperty(_State$attributeNameE,Action.equal,function(){emit(Type.attributeName,attrName),state2=State2.attributeValueBegin}),_defineProperty(_State$attributeNameE,Action.gt,function(){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeNameE,Action.char,function(char){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),attrName=char,state2=State2.attributeName}),_State$attributeNameE)),_defineProperty(_lexer$stateMachine,State2.attributeValueBegin,(_State$attributeValue={},_defineProperty(_State$attributeValue,Action.space,noop),_defineProperty(_State$attributeValue,Action.quote,function(char){openingQuote=char,attrValue="",state2=State2.attributeValue}),_defineProperty(_State$attributeValue,Action.gt,function(){attrValue="",emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeValue,Action.char,function(char){openingQuote="",attrValue=char,state2=State2.attributeValue}),_State$attributeValue)),_defineProperty(_lexer$stateMachine,State2.attributeValue,(_State$attributeValue2={},_defineProperty(_State$attributeValue2,Action.space,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),state2=State2.attributeNameStart)}),_defineProperty(_State$attributeValue2,Action.quote,function(char){openingQuote===char?(emit(Type.attributeValue,attrValue),state2=State2.attributeNameStart):attrValue+=char}),_defineProperty(_State$attributeValue2,Action.gt,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),data="",state2=State2.data)}),_defineProperty(_State$attributeValue2,Action.slash,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),isClosing=!0,state2=State2.tagEnd)}),_defineProperty(_State$attributeValue2,Action.char,function(char){attrValue+=char}),_State$attributeValue2)),_lexer$stateMachine);var step=function(char){options.debug&&console.log(state2,char);var actions=lexer.stateMachine[state2],action=actions[getAction(char)]||actions[Action.error]||actions[Action.char];action(char)};return lexer.write=function(str){for(var len=str.length,i2=0;i2<len;i2++)step(str[i2])},lexer};module.exports={State:State2,Action,Type,create}}}),require_reader=__commonJS2({"node_modules/xml-reader/dist/reader.js"(exports,module){"use strict";var EventEmitter=require_eventemitter3(),Lexer=require_lexer(),Type=Lexer.Type,NodeType={element:"element",text:"text"},createNode=function(params){return Object.assign({name:"",type:NodeType.element,value:"",parent:null,attributes:{},children:[]},params)},create=function(options){options=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},options);var lexer=void 0,rootNode=void 0,current2=void 0,attrName=void 0,reader=new EventEmitter,handleLexerData=function(data){switch(data.type){case Type.openTag:if(current2===null)current2=rootNode,current2.name=data.value;else{var node=createNode({name:data.value,parent:current2});current2.children.push(node),current2=node}break;case Type.closeTag:var parent=current2.parent;if(options.parentNodes||(current2.parent=null),current2.name!==data.value)break;options.stream&&parent===rootNode&&(rootNode.children=[],current2.parent=null),(!options.emitTopLevelOnly||parent===rootNode)&&(reader.emit(options.tagPrefix+current2.name,current2),reader.emit("tag",current2.name,current2)),current2===rootNode&&(lexer.removeAllListeners("data"),reader.emit(options.doneEvent,current2),rootNode=null),current2=parent;break;case Type.text:current2&¤t2.children.push(createNode({type:NodeType.text,value:data.value,parent:options.parentNodes?current2:null}));break;case Type.attributeName:attrName=data.value,current2.attributes[attrName]="";break;case Type.attributeValue:current2.attributes[attrName]=data.value;break}};return reader.reset=function(){lexer=Lexer.create({debug:options.debug}),lexer.on("data",handleLexerData),rootNode=createNode(),current2=null,attrName="",reader.parse=lexer.write},reader.reset(),reader},parseSync2=function(xml,options){options=Object.assign({},options,{stream:!1,tagPrefix:":"});var reader=create(options),res2=void 0;return reader.on("done",function(ast){res2=ast}),reader.parse(xml),res2};module.exports={parseSync:parseSync2,create,NodeType}}});function computeGridToAffineTransform(params){let{originX,originY,rows,cols,cellSizeMm,width,height}=params,a2,c3;cols>1?(a2=width/((cols-1)*cellSizeMm),c3=originX*(1-a2)-.5*cellSizeMm*a2):(a2=1,c3=originX+width/2-(originX+.5*cellSizeMm));let e4,f2;return rows>1?(e4=height/((rows-1)*cellSizeMm),f2=originY*(1-e4)-.5*cellSizeMm*e4):(e4=1,f2=originY+height/2-(originY+.5*cellSizeMm)),{a:a2,b:0,c:c3,d:0,e:e4,f:f2}}function applyAffineTransformToPoint(t35,p4){return{x:t35.a*p4.x+t35.b*p4.y+t35.c,y:t35.d*p4.x+t35.e*p4.y+t35.f}}var{cos:cos3,sin:sin3,PI:PI3}=Math,{tan:tan3}=Math,import_deep_rename_keys=__toESM2(require_deep_rename_keys()),import_xml_reader=__toESM2(require_reader()),BaseSolver=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}getSolverName(){return this.constructor.name}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(e4){throw this.error=`${this.getSolverName()} error: ${e4}`,this.failed=!0,e4}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.getSolverName()} ran out of iterations`,this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let startTime=Date.now();for(;!this.solved&&!this.failed;)this.step();let endTime=Date.now();this.timeToSolve=endTime-startTime}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};function clamp4(value,min,max){return Math.max(min,Math.min(max,value))}function computeMaxIterationsByNodeSizeAndConnectionCount(input2){let states=input2.planeSize*input2.layers,connectionCount=input2.connectionCount,connectionFactor=Math.sqrt(connectionCount),requestedMaxIterations=Math.max(1,input2.maxIterations),baseComputedMaxIterations=clamp4(Math.round(states*(8+1.2*connectionFactor)),15e4,12e6),computedMaxIters=clamp4(Math.round(baseComputedMaxIterations*input2.effort),15e4,12e6),minIterationBudgetIters=clamp4(Math.round(requestedMaxIterations*.2),15e4,2e6),maxIterationsIters=Math.max(1,Math.min(requestedMaxIterations,Math.max(minIterationBudgetIters,computedMaxIters))),baseSearchBudgetIters=clamp4(Math.round(states*(10+.8*connectionFactor)*input2.effort),5e4,4e6);return{maxIterationsIters,baseSearchBudgetIters}}function rippedContains(r4,id2){for(let cur=r4;cur;cur=cur.prev)if(cur.id===id2)return!0;return!1}var MinHeap=class{constructor(){__publicField(this,"f",[]);__publicField(this,"seq",[]);__publicField(this,"id",[]);__publicField(this,"n",0)}push(f2,seq,id2){let i2=this.n++;for(this.f[i2]=f2,this.seq[i2]=seq,this.id[i2]=id2;i2>0;){let p4=i2-1>>1;if(this.less(p4,i2))break;this.swap(i2,p4),i2=p4}}pop(){let out=this.id[0];return this.n--,this.n>0&&(this.f[0]=this.f[this.n],this.seq[0]=this.seq[this.n],this.id[0]=this.id[this.n],this.siftDown(0)),out}get size(){return this.n}clear(){this.n=0}siftDown(i2){for(;;){let l3=i2*2+1,r4=l3+1;if(l3>=this.n)return;let m3=l3;if(r4<this.n&&!this.less(l3,r4)&&(m3=r4),this.less(i2,m3))return;this.swap(i2,m3),i2=m3}}less(i2,j4){let fi3=this.f[i2],fj=this.f[j4];return fi3!==fj?fi3<fj:this.seq[i2]<this.seq[j4]}swap(i2,j4){let tmpF=this.f[i2];this.f[i2]=this.f[j4],this.f[j4]=tmpF;let tmpS=this.seq[i2];this.seq[i2]=this.seq[j4],this.seq[j4]=tmpS;let tmpI=this.id[i2];this.id[i2]=this.id[j4],this.id[j4]=tmpI}};function toRootNetName(connectionName,rootConnectionName){return rootConnectionName??connectionName.replace(/_mst\d+$/,"")}var DIRS_DR=[-1,-1,-1,0,0,1,1,1],DIRS_DC=[-1,0,1,-1,1,-1,0,1],HighDensitySolverA01=class extends BaseSolver{constructor(props){super();__publicField(this,"nodeWithPortPoints");__publicField(this,"cellSizeMm");__publicField(this,"viaDiameter");__publicField(this,"MAX_RIPS");__publicField(this,"maxCellCount");__publicField(this,"traceThickness");__publicField(this,"traceMargin");__publicField(this,"viaMinDistFromBorder");__publicField(this,"showPenaltyMap");__publicField(this,"showUsedCellMap");__publicField(this,"effort");__publicField(this,"stepMultiplier");__publicField(this,"hyperParameters");__publicField(this,"initialPenaltyFn");__publicField(this,"rows");__publicField(this,"cols");__publicField(this,"layers");__publicField(this,"gridOrigin");__publicField(this,"gridToBoundsTransform");__publicField(this,"availableZ");__publicField(this,"zToLayer");__publicField(this,"layerToZ");__publicField(this,"connNameToId");__publicField(this,"connIdToName");__publicField(this,"connIdToRootNet");__publicField(this,"overlapFriendlyRootNets");__publicField(this,"planeSize");__publicField(this,"usedCellsFlat");__publicField(this,"portOwnerFlat");__publicField(this,"usedDiagFlat");__publicField(this,"penalty2d");__publicField(this,"visitedStamp");__publicField(this,"sharedCrossRootPortCells");__publicField(this,"stamp",0);__publicField(this,"viaOffsetsDr");__publicField(this,"viaOffsetsDc");__publicField(this,"viaOffsetsLen");__publicField(this,"minViaRow");__publicField(this,"maxViaRow");__publicField(this,"minViaCol");__publicField(this,"maxViaCol");__publicField(this,"usedIndicesByConn");__publicField(this,"usedDiagIndicesByConn");__publicField(this,"unsolvedSegs");__publicField(this,"solvedRoutes");__publicField(this,"activeConnSeg",null);__publicField(this,"activeConnId",-1);__publicField(this,"crossLayerSearch",!1);__publicField(this,"nodePool");__publicField(this,"heap");__publicField(this,"seqCounter",0);__publicField(this,"_viaOccs",[]);__publicField(this,"ripCount");__publicField(this,"totalRipEvents",0);__publicField(this,"searchIterations",0);__publicField(this,"consecutiveSkips",0);__publicField(this,"penaltyCap");__publicField(this,"baseSearchBudgetIters");__publicField(this,"_moveCost",0);__publicField(this,"_moveRipped",null);this.nodeWithPortPoints=props.nodeWithPortPoints,this.cellSizeMm=props.cellSizeMm,this.viaDiameter=props.viaDiameter,this.maxCellCount=props.maxCellCount,this.traceThickness=props.traceThickness??.1,this.traceMargin=props.traceMargin??.15,this.viaMinDistFromBorder=props.viaMinDistFromBorder??.15,this.showPenaltyMap=props.showPenaltyMap??!1,this.showUsedCellMap=props.showUsedCellMap??!1,this.effort=props.effort??1,this.stepMultiplier=Math.max(1,Math.floor(props.stepMultiplier??1)),this.hyperParameters={shuffleSeed:0,ripCost:10,ripTracePenalty:.5,ripViaPenalty:.75,viaBaseCost:.1,greedyMultiplier:1.5,...props.hyperParameters},this.MAX_ITERATIONS=1e8,this.MAX_RIPS=200,this.initialPenaltyFn=props.initialPenaltyFn}get unsolvedConnections(){return this.unsolvedSegs}get solvedConnectionsMap(){return this.solvedRoutes}get activeConnection(){if(!this.activeConnSeg)return null;let s2=this.activeConnSeg;return{connectionName:this.connIdToName[s2.connId]??"",start:{row:s2.startRow,col:s2.startCol,z:s2.startZ,x:0,y:0},end:{row:s2.endRow,col:s2.endCol,z:s2.endZ,x:0,y:0}}}get openSet(){return{length:this.heap?.size??0}}get gridStats(){return{cells:this.planeSize||0,layers:this.layers||0,states:(this.planeSize||0)*(this.layers||0)}}getConstructorParams(){return[{nodeWithPortPoints:this.nodeWithPortPoints,cellSizeMm:this.cellSizeMm,viaDiameter:this.viaDiameter,maxCellCount:this.maxCellCount,stepMultiplier:this.stepMultiplier,traceThickness:this.traceThickness,traceMargin:this.traceMargin,viaMinDistFromBorder:this.viaMinDistFromBorder,showPenaltyMap:this.showPenaltyMap,showUsedCellMap:this.showUsedCellMap,effort:this.effort,hyperParameters:this.hyperParameters,initialPenaltyFn:this.initialPenaltyFn}]}_setup(){let{nodeWithPortPoints,cellSizeMm}=this,{width,height,center:center2}=nodeWithPortPoints;this.availableZ=nodeWithPortPoints.availableZ??[...new Set(nodeWithPortPoints.portPoints.map(pp3=>pp3.z))].sort((a2,b3)=>a2-b3),this.rows=Math.floor(height/cellSizeMm),this.cols=Math.floor(width/cellSizeMm),this.layers=this.availableZ.length,this.planeSize=this.rows*this.cols;let totalCells=this.layers*this.planeSize;if(this.maxCellCount!==void 0&&totalCells>this.maxCellCount){this.error=`Cell count ${totalCells} exceeds maxCellCount ${this.maxCellCount}`,this.failed=!0;return}let totalDiags=this.layers*Math.max(0,this.rows-1)*Math.max(0,this.cols-1)*2;this.zToLayer=new Map,this.layerToZ=new Map;for(let i2=0;i2<this.availableZ.length;i2++){let z5=this.availableZ[i2];this.zToLayer.set(z5,i2),this.layerToZ.set(i2,z5)}if(this.gridOrigin={x:center2.x-width/2,y:center2.y-height/2},this.gridToBoundsTransform=computeGridToAffineTransform({originX:this.gridOrigin.x,originY:this.gridOrigin.y,rows:this.rows,cols:this.cols,cellSizeMm,width,height}),this.connNameToId=new Map,this.connIdToName=[],this.connIdToRootNet=[],this.overlapFriendlyRootNets=new Set,this.penalty2d=new Float64Array(this.planeSize),this.initialPenaltyFn)for(let row=0;row<this.rows;row++){let rowBase=row*this.cols;for(let col=0;col<this.cols;col++){let x5=this.gridOrigin.x+(col+.5)*cellSizeMm,y5=this.gridOrigin.y+(row+.5)*cellSizeMm,px3=(col+.5)/this.cols,py3=(row+.5)/this.rows;this.penalty2d[rowBase+col]=this.initialPenaltyFn({x:x5,y:y5,px:px3,py:py3,row,col})}}this.usedCellsFlat=new Int32Array(totalCells).fill(-1),this.portOwnerFlat=new Int32Array(totalCells).fill(-1),this.usedDiagFlat=new Int32Array(totalDiags).fill(-1),this.visitedStamp=new Uint32Array(totalCells),this.stamp=0;let viaRadiusCells=Math.ceil(this.viaDiameter/2/cellSizeMm),r22=viaRadiusCells*viaRadiusCells,drList=[],dcList=[];for(let dr4=-viaRadiusCells;dr4<=viaRadiusCells;dr4++)for(let dc3=-viaRadiusCells;dc3<=viaRadiusCells;dc3++)dr4*dr4+dc3*dc3<=r22&&(drList.push(dr4),dcList.push(dc3));if(this.viaOffsetsLen=drList.length,this.viaOffsetsDr=new Int32Array(drList),this.viaOffsetsDc=new Int32Array(dcList),this.viaMinDistFromBorder>0){let borderCells=Math.ceil(this.viaMinDistFromBorder/cellSizeMm);this.minViaRow=borderCells,this.maxViaRow=this.rows-1-borderCells,this.minViaCol=borderCells,this.maxViaCol=this.cols-1-borderCells}else this.minViaRow=0,this.maxViaRow=this.rows-1,this.minViaCol=0,this.maxViaCol=this.cols-1;this.unsolvedSegs=this.buildConnectionSegs(),this.sharedCrossRootPortCells=new Set;let rootByPortFlat=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let connId=this.connNameToId.get(pp3.connectionName);if(connId===void 0)continue;let cell=this.pointToCell(pp3),flatIdx=(cell.z*this.rows+cell.row)*this.cols+cell.col,rootNet=this.connIdToRootNet[connId],existingRoot=rootByPortFlat.get(flatIdx);existingRoot===void 0?rootByPortFlat.set(flatIdx,rootNet):existingRoot!==rootNet&&this.sharedCrossRootPortCells.add(flatIdx);let existing=this.portOwnerFlat[flatIdx];existing===-1||existing===connId?this.portOwnerFlat[flatIdx]=connId:this.portOwnerFlat[flatIdx]=-2}this.solvedRoutes=new Map,this.usedIndicesByConn=[],this.usedDiagIndicesByConn=[],this.ripCount=[],this.consecutiveSkips=0,this.penaltyCap=this.hyperParameters.ripCost*.5,this.shuffleConnections();let budget=computeMaxIterationsByNodeSizeAndConnectionCount({planeSize:this.planeSize,layers:this.layers,connectionCount:this.unsolvedSegs.length,effort:this.effort,maxIterations:this.MAX_ITERATIONS});this.baseSearchBudgetIters=budget.baseSearchBudgetIters,this.MAX_ITERATIONS=budget.maxIterationsIters,this.activeConnSeg=null,this.activeConnId=-1,this.nodePool=[],this.heap=new MinHeap,this.seqCounter=0}_step(){for(let i2=0;i2<this.stepMultiplier;i2++){if(this.solved||this.failed)return;this.stepOnce()}}stepOnce(){if(!this.activeConnSeg){if(this.unsolvedSegs.length===0){this.solved=!0;return}let next2=this.unsolvedSegs.shift();this.activeConnSeg=next2,this.activeConnId=next2.connId,this.crossLayerSearch=next2.startZ!==next2.endZ,this.nodePool=[],this.heap.clear(),this.seqCounter=0,this.searchIterations=0,this.nextStamp();let f2=this.computeH(next2.startZ,next2.startRow,next2.startCol,next2.endZ,next2.endRow,next2.endCol)*this.hyperParameters.greedyMultiplier;this.nodePool.push({z:next2.startZ,row:next2.startRow,col:next2.startCol,g:0,f:f2,parentIdx:-1,ripped:null}),this.heap.push(f2,this.seqCounter++,0);return}this.searchIterations++;let connRips=this.ripCount[this.activeConnId]??0,budget=Math.round(this.baseSearchBudgetIters*(1+Math.min(connRips,10)*.25));if(this.searchIterations>budget){let pen=this.penalty2d;for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.9;this.unsolvedSegs.push(this.activeConnSeg),this.activeConnSeg=null,this.activeConnId=-1,this.heap.clear(),this.nodePool=[],this.consecutiveSkips++,this.consecutiveSkips>=this.unsolvedSegs.length*3&&(this.error=`Convergence failure: ${this.unsolvedSegs.length} connections stuck`,this.failed=!0);return}if(this.heap.size===0){this.error=`No path found for ${this.connIdToName[this.activeConnId]}`,this.failed=!0;return}let nodeIdx=this.heap.pop(),node=this.nodePool[nodeIdx],{z:z5,row,col,g:g7,ripped}=node,cellIdx=(z5*this.rows+row)*this.cols+col;if(this.visitedStamp[cellIdx]===this.stamp)return;this.visitedStamp[cellIdx]=this.stamp;let seg=this.activeConnSeg;if(z5===seg.endZ&&row===seg.endRow&&col===seg.endCol){this.finalizeRoute(nodeIdx),this.activeConnSeg=null,this.activeConnId=-1;return}let endZ=seg.endZ,endRow=seg.endRow,endCol=seg.endCol,activeConn=this.activeConnId,rows=this.rows,cols=this.cols,cellSizeMm=this.cellSizeMm,visited=this.visitedStamp,stamp=this.stamp;for(let d3=0;d3<8;d3++){let nr4=row+DIRS_DR[d3],nc3=col+DIRS_DC[d3];if(nr4<0||nr4>=rows||nc3<0||nc3>=cols)continue;let nIdx=(z5*rows+nr4)*cols+nc3;if(visited[nIdx]===stamp||(this.computeMoveCostAndRips(activeConn,z5,row,col,z5,nr4,nc3,ripped),this._moveCost<0))continue;let g22=g7+this._moveCost,f2=g22+this.computeH(z5,nr4,nc3,endZ,endRow,endCol)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.length;this.nodePool.push({z:z5,row:nr4,col:nc3,g:g22,f:f2,parentIdx:nodeIdx,ripped:this._moveRipped}),this.heap.push(f2,this.seqCounter++,newNodeIdx)}if(row>=this.minViaRow&&row<=this.maxViaRow&&col>=this.minViaCol&&col<=this.maxViaCol)for(let nz=0;nz<this.layers;nz++){if(nz===z5)continue;let nIdx=(nz*rows+row)*cols+col;if(visited[nIdx]===stamp||(this.computeMoveCostAndRips(activeConn,z5,row,col,nz,row,col,ripped),this._moveCost<0))continue;let g22=g7+this._moveCost,f2=g22+this.computeH(nz,row,col,endZ,endRow,endCol)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.length;this.nodePool.push({z:nz,row,col,g:g22,f:f2,parentIdx:nodeIdx,ripped:this._moveRipped}),this.heap.push(f2,this.seqCounter++,newNodeIdx)}}computeMoveCostAndRips(activeConn,fromZ,fromRow,fromCol,toZ,toRow,toCol,ripped){let cost=0,r4=ripped,cols=this.cols;if(fromZ!==toZ){cost+=this.hyperParameters.viaBaseCost,cost+=Math.min(this.penalty2d[toRow*cols+toCol],this.penaltyCap);let toFlatIdx=(toZ*this.rows+toRow)*cols+toCol,fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toRow===seg.endRow&&toCol===seg.endCol;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRipped=r4;return}this.fillViaOccupants(toRow,toCol,activeConn);let occs=this._viaOccs;for(let i2=0;i2<occs.length;i2++){let occ=occs[i2];rippedContains(r4,occ)||(cost+=this.hyperParameters.ripCost,r4={id:occ,prev:r4}),cost+=this.hyperParameters.ripViaPenalty}}else{let dr4=fromRow>toRow?fromRow-toRow:toRow-fromRow,dc3=fromCol>toCol?fromCol-toCol:toCol-fromCol;cost+=(dr4+dc3>1?Math.SQRT2:1)*this.cellSizeMm,cost+=Math.min(this.penalty2d[toRow*cols+toCol],this.penaltyCap);let flatIdx=(toZ*this.rows+toRow)*cols+toCol,fixedOwner=this.portOwnerFlat[flatIdx],allowFixedOverlap=this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toRow===seg.endRow&&toCol===seg.endCol;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRipped=r4;return}let occ=this.usedCellsFlat[flatIdx],allowSameRootOverlap=this.connIdToRootNet[occ]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]);if(occ!==-1&&occ!==activeConn&&!allowSameRootOverlap&&(rippedContains(r4,occ)||(cost+=this.hyperParameters.ripCost,r4={id:occ,prev:r4}),cost+=this.hyperParameters.ripTracePenalty),dr4===1&&dc3===1){let sqRow=fromRow<toRow?fromRow:toRow,sqCol=fromCol<toCol?fromCol:toCol,crossingSlot=(fromRow<toRow&&fromCol<toCol||fromRow>toRow&&fromCol>toCol?0:1)^1,sqCols=this.cols-1,diagBase=((toZ*(this.rows-1)+sqRow)*sqCols+sqCol)*2,crossingOcc=this.usedDiagFlat[diagBase+crossingSlot],allowCrossingOverlap=this.connIdToRootNet[crossingOcc]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]);if(crossingOcc!==-1&&crossingOcc!==activeConn&&!allowCrossingOverlap){this._moveCost=-1,this._moveRipped=r4;return}}}this._moveCost=cost,this._moveRipped=r4}fillViaOccupants(row,col,activeConn){let occs=this._viaOccs;occs.length=0;let rows=this.rows,cols=this.cols,offDr=this.viaOffsetsDr,offDc=this.viaOffsetsDc,offLen=this.viaOffsetsLen,used=this.usedCellsFlat;for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let i2=0;i2<offLen;i2++){let r4=row+offDr[i2],c3=col+offDc[i2];if(r4<0||c3<0||r4>=rows||c3>=cols)continue;let occ=used[zBase+r4*cols+c3];if(occ===-1||occ===activeConn||this.connIdToRootNet[occ]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]))continue;let seen=!1;for(let j4=0;j4<occs.length;j4++)if(occs[j4]===occ){seen=!0;break}seen||occs.push(occ)}}}shouldSkipFixedPortHalo(flatIdx,connId){let fixedOwner=this.portOwnerFlat[flatIdx];return fixedOwner===connId?!1:fixedOwner===-2?!0:fixedOwner<0?!1:!(this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]))}nextStamp(){this.stamp=this.stamp+1>>>0,this.stamp===0&&(this.visitedStamp.fill(0),this.stamp=1)}computeH(z5,row,col,toZ,toRow,toCol){let dr4=Math.abs(row-toRow),dc3=Math.abs(col-toCol),manhattan=dr4+dc3;if(z5===toZ)return manhattan*this.cellSizeMm;if(!this.crossLayerSearch)return manhattan*this.cellSizeMm+this.hyperParameters.viaBaseCost;let vr1=Math.max(this.minViaRow,Math.min(this.maxViaRow,row)),vc1=Math.max(this.minViaCol,Math.min(this.maxViaCol,col)),vr22=Math.max(this.minViaRow,Math.min(this.maxViaRow,toRow)),vc22=Math.max(this.minViaCol,Math.min(this.maxViaCol,toCol)),via1=Math.abs(row-vr1)+Math.abs(col-vc1)+Math.abs(vr1-toRow)+Math.abs(vc1-toCol),via2=Math.abs(row-vr22)+Math.abs(col-vc22)+Math.abs(vr22-toRow)+Math.abs(vc22-toCol);return Math.max(Math.min(via1,via2),manhattan)*this.cellSizeMm+this.hyperParameters.viaBaseCost}internConn(name,rootNetName){let existing=this.connNameToId.get(name);if(existing!==void 0)return existing;let id2=this.connIdToName.length;return this.connIdToName.push(name),this.connIdToRootNet.push(toRootNetName(name,rootNetName)),this.connNameToId.set(name,id2),id2}buildConnectionSegs(){let byName=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let name=pp3.connectionName;byName.has(name)||byName.set(name,{points:[],rootConnectionName:pp3.rootConnectionName}),byName.get(name).points.push(pp3)}let segs=[],seenSegmentKeys=new Set;for(let[name,conn]of byName){let pts=conn.points;if(pts.length<2)continue;let connId=this.internConn(name,conn.rootConnectionName);for(let i2=0;i2<pts.length-1;i2++){let s2=this.pointToCell(pts[i2]),e4=this.pointToCell(pts[i2+1]),endpointA=`${s2.z}:${s2.row}:${s2.col}`,endpointB=`${e4.z}:${e4.row}:${e4.col}`,orderedEndpoints=endpointA<endpointB?`${endpointA}|${endpointB}`:`${endpointB}|${endpointA}`,netName=conn.rootConnectionName??name,segKey=`${netName}|${orderedEndpoints}`;if(seenSegmentKeys.has(segKey)){this.overlapFriendlyRootNets.add(netName);continue}seenSegmentKeys.add(segKey),segs.push({connId,startZ:s2.z,startRow:s2.row,startCol:s2.col,endZ:e4.z,endRow:e4.row,endCol:e4.col})}}return segs}pointToCell(pt4){let col=Math.max(0,Math.min(this.cols-1,Math.round((pt4.x-this.gridOrigin.x)/this.cellSizeMm-.5))),row=Math.max(0,Math.min(this.rows-1,Math.round((pt4.y-this.gridOrigin.y)/this.cellSizeMm-.5)));return{z:this.zToLayer.get(pt4.z)??0,row,col}}shuffleConnections(){let arr=this.unsolvedSegs,s2=this.hyperParameters.shuffleSeed,rng=()=>(s2=s2*1664525+1013904223&4294967295,(s2>>>0)/4294967295);for(let i2=arr.length-1;i2>0;i2--){let j4=Math.floor(rng()*(i2+1)),tmp=arr[i2];arr[i2]=arr[j4],arr[j4]=tmp}}finalizeRoute(goalNodeIdx){this.consecutiveSkips=Math.max(0,this.consecutiveSkips-1);let cells=[],idx=goalNodeIdx;for(;idx>=0;){let n3=this.nodePool[idx];cells.push({z:n3.z,row:n3.row,col:n3.col}),idx=n3.parentIdx}for(cells.reverse();cells.length>1;){let first=cells[0],firstFlat=(first.z*this.rows+first.row)*this.cols+first.col;if(!this.sharedCrossRootPortCells.has(firstFlat))break;cells.shift()}for(;cells.length>1;){let last=cells[cells.length-1],lastFlat=(last.z*this.rows+last.row)*this.cols+last.col;if(!this.sharedCrossRootPortCells.has(lastFlat))break;cells.pop()}let viaCells=[];for(let i2=1;i2<cells.length;i2++)cells[i2].z!==cells[i2-1].z&&viaCells.push({row:cells[i2].row,col:cells[i2].col});let connId=this.activeConnId,goalNode=this.nodePool[goalNodeIdx],rippedIds=[];for(let cur=goalNode.ripped;cur;cur=cur.prev)rippedIds.push(cur.id);for(let i2=0;i2<rippedIds.length;i2++)if(this.ripTrace(rippedIds[i2]),this.failed)return;let marginCells=Math.ceil(this.traceMargin/this.cellSizeMm),indices=[],rows=this.rows,cols=this.cols,used=this.usedCellsFlat;for(let ci3=0;ci3<cells.length;ci3++){let cell=cells[ci3];for(let dr4=-marginCells;dr4<=marginCells;dr4++)for(let dc3=-marginCells;dc3<=marginCells;dc3++){let r4=cell.row+dr4,c3=cell.col+dc3;if(r4<0||r4>=rows||c3<0||c3>=cols)continue;let flatIdx=(cell.z*rows+r4)*cols+c3;if((r4!==cell.row||c3!==cell.col)&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;let existing=used[flatIdx],allowSameRootOverlap=this.connIdToRootNet[existing]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);existing!==-1&&existing!==connId&&!allowSameRootOverlap||(used[flatIdx]=connId,indices.push(flatIdx))}}let displacedByVias=[],offDr=this.viaOffsetsDr,offDc=this.viaOffsetsDc,offLen=this.viaOffsetsLen;for(let vi3=0;vi3<viaCells.length;vi3++){let via=viaCells[vi3];for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let oi3=0;oi3<offLen;oi3++){let r4=via.row+offDr[oi3],c3=via.col+offDc[oi3];if(r4<0||r4>=rows||c3<0||c3>=cols)continue;let flatIdx=zBase+r4*cols+c3;if((r4!==via.row||c3!==via.col)&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;let existing=used[flatIdx],allowSameRootOverlap=this.connIdToRootNet[existing]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);if(existing!==-1&&existing!==connId&&!allowSameRootOverlap){let seen=!1;for(let k4=0;k4<displacedByVias.length;k4++)if(displacedByVias[k4]===existing){seen=!0;break}seen||displacedByVias.push(existing)}used[flatIdx]=connId,indices.push(flatIdx)}}}let diagIndices=[],sqCols=this.cols-1;for(let i2=1;i2<cells.length;i2++){let prev=cells[i2-1],curr=cells[i2];if(prev.z!==curr.z)continue;let dr4=prev.row>curr.row?prev.row-curr.row:curr.row-prev.row,dc3=prev.col>curr.col?prev.col-curr.col:curr.col-prev.col;if(dr4!==1||dc3!==1)continue;let sqRow=prev.row<curr.row?prev.row:curr.row,sqCol=prev.col<curr.col?prev.col:curr.col,diagSlot=prev.row<curr.row&&prev.col<curr.col||prev.row>curr.row&&prev.col>curr.col?0:1,crossingSlot=diagSlot^1,diagBase=((prev.z*(this.rows-1)+sqRow)*sqCols+sqCol)*2,crossingIdx=diagBase+crossingSlot,crossingOcc=this.usedDiagFlat[crossingIdx],allowCrossingOverlap=this.connIdToRootNet[crossingOcc]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);if(crossingOcc!==-1&&crossingOcc!==connId&&!allowCrossingOverlap)continue;let diagIdx=diagBase+diagSlot;this.usedDiagFlat[diagIdx]=connId,diagIndices.push(diagIdx)}for(;this.usedIndicesByConn.length<=connId;)this.usedIndicesByConn.push([]);for(this.usedIndicesByConn[connId]=indices;this.usedDiagIndicesByConn.length<=connId;)this.usedDiagIndicesByConn.push([]);this.usedDiagIndicesByConn[connId]=diagIndices,this.solvedRoutes.set(connId,{connId,cells,viaCells});for(let i2=0;i2<displacedByVias.length;i2++)if(this.ripTrace(displacedByVias[i2]),this.failed)return;if(rippedIds.length>0||displacedByVias.length>0){let pen=this.penalty2d,cap2=this.penaltyCap;if(this.totalRipEvents>50)for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.99;else for(let i2=0;i2<pen.length;i2++)pen[i2]>cap2&&(pen[i2]=pen[i2]*.5)}}ripTrace(connId){for(;this.ripCount.length<=connId;)this.ripCount.push(0);if(this.ripCount[connId]++,this.totalRipEvents++,this.totalRipEvents>=this.MAX_RIPS){this.error=`Convergence failure: exceeded MAX_RIPS ${this.MAX_RIPS}`,this.failed=!0;return}let route=this.solvedRoutes.get(connId);if(route){let cols=this.cols;for(let i2=0;i2<route.cells.length;i2++){let cell=route.cells[i2],cellIdx=cell.row*cols+cell.col;this.penalty2d[cellIdx]=this.penalty2d[cellIdx]+this.hyperParameters.ripTracePenalty}for(let i2=0;i2<route.viaCells.length;i2++){let via=route.viaCells[i2],viaIdx=via.row*cols+via.col;this.penalty2d[viaIdx]=this.penalty2d[viaIdx]+this.hyperParameters.ripViaPenalty}}let indices=this.usedIndicesByConn[connId];if(indices){let used=this.usedCellsFlat;for(let i2=0;i2<indices.length;i2++){let flatIdx=indices[i2];used[flatIdx]===connId&&(used[flatIdx]=-1)}this.usedIndicesByConn[connId]=[]}let diagIndices=this.usedDiagIndicesByConn[connId];if(diagIndices){let usedDiag=this.usedDiagFlat;for(let i2=0;i2<diagIndices.length;i2++){let flatIdx=diagIndices[i2];usedDiag[flatIdx]===connId&&(usedDiag[flatIdx]=-1)}this.usedDiagIndicesByConn[connId]=[]}if(route){this.solvedRoutes.delete(connId);let first=route.cells[0],last=route.cells[route.cells.length-1];this.unsolvedSegs.push({connId,startZ:first.z,startRow:first.row,startCol:first.col,endZ:last.z,endRow:last.row,endCol:last.col})}}visualize(){let LAYER_COLORS=["red","blue","orange","green"],points=[],lines=[],circles=[],rects=[],{width,height,center:center2}=this.nodeWithPortPoints;rects.push({center:{x:center2.x,y:center2.y},width,height,stroke:"gray"});let vt4=this.gridToBoundsTransform;if(this.showPenaltyMap&&this.penalty2d){let maxPenalty=0;for(let i2=0;i2<this.penalty2d.length;i2++)this.penalty2d[i2]>maxPenalty&&(maxPenalty=this.penalty2d[i2]);if(maxPenalty>0)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){let p4=this.penalty2d[row*this.cols+col];if(p4<=0)continue;let alpha=Math.min(.6,p4/maxPenalty*.6),tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});rects.push({center:tc3,width:this.cellSizeMm*vt4.a,height:this.cellSizeMm*vt4.e,fill:`rgba(255,165,0,${alpha.toFixed(3)})`})}}if(this.showUsedCellMap&&this.usedCellsFlat)for(let z5=0;z5<this.layers;z5++)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){if(this.usedCellsFlat[(z5*this.rows+row)*this.cols+col]===-1)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});rects.push({center:tc3,width:this.cellSizeMm*vt4.a,height:this.cellSizeMm*vt4.e,fill:"rgba(0,0,255,0.5)"})}for(let pp3 of this.nodeWithPortPoints.portPoints)points.push({x:pp3.x,y:pp3.y,color:LAYER_COLORS[pp3.z]??"gray",label:pp3.connectionName});let TRACE_COLORS=["rgba(255,0,0,0.75)","rgba(0,0,255,0.75)","rgba(255,165,0,0.75)","rgba(0,128,0,0.75)"],transformedRoutes=this.getOutput();for(let route of transformedRoutes){if(route.route.length<2)continue;let segStart=0;for(let i2=1;i2<route.route.length;i2++){let prev=route.route[i2-1];route.route[i2].z!==prev.z&&(i2-segStart>=2&&lines.push({points:route.route.slice(segStart,i2).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[prev.z]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness}),segStart=i2)}if(route.route.length-segStart>=2){let lastZ=route.route[segStart].z;lines.push({points:route.route.slice(segStart).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[lastZ]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness})}}for(let route of transformedRoutes)for(let via of route.vias)circles.push({center:{x:via.x,y:via.y},radius:this.viaDiameter/2,fill:"rgba(0,0,0,0.3)",stroke:"black"});if(this.activeConnSeg&&this.visitedStamp){let currentStamp=this.stamp;for(let z5=0;z5<this.layers;z5++)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){if(this.visitedStamp[(z5*this.rows+row)*this.cols+col]!==currentStamp)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});points.push({x:tc3.x,y:tc3.y,color:"rgba(0,0,255,0.2)"})}}return{points,lines,circles,rects,coordinateSystem:"cartesian",title:`HighDensityA01 [${this.solvedRoutes?.size??0} solved, ${this.unsolvedSegs?.length??0} remaining]`}}getOutput(){let t35=this.gridToBoundsTransform,result=[];for(let[connId,route]of this.solvedRoutes??[]){let connName=this.connIdToName[connId];result.push({connectionName:connName,traceThickness:this.traceThickness,viaDiameter:this.viaDiameter,route:route.cells.map(cell=>{let rawX=this.gridOrigin.x+(cell.col+.5)*this.cellSizeMm,rawY=this.gridOrigin.y+(cell.row+.5)*this.cellSizeMm,tp3=applyAffineTransformToPoint(t35,{x:rawX,y:rawY});return{x:tp3.x,y:tp3.y,z:this.layerToZ.get(cell.z)??cell.z}}),vias:route.viaCells.map(via=>{let rawX=this.gridOrigin.x+(via.col+.5)*this.cellSizeMm,rawY=this.gridOrigin.y+(via.row+.5)*this.cellSizeMm;return applyAffineTransformToPoint(t35,{x:rawX,y:rawY})})})}return result}};var REGION_LEFT=0,REGION_TOP=1,REGION_RIGHT=2,REGION_BOTTOM=3,REGION_MIDDLE=4,REGION_NAMES=["left","top","right","bottom","middle"],TypedMinHeap2=class{constructor(){__publicField(this,"f",new Float64Array(1024));__publicField(this,"seq",new Uint32Array(1024));__publicField(this,"id",new Int32Array(1024));__publicField(this,"n",0)}push(f2,seq,id2){this.ensureCapacity(this.n+1);let i2=this.n++;for(this.f[i2]=f2,this.seq[i2]=seq,this.id[i2]=id2;i2>0;){let p4=i2-1>>1;if(this.less(p4,i2))break;this.swap(i2,p4),i2=p4}}pop(){let out=this.id[0];return this.n--,this.n>0&&(this.f[0]=this.f[this.n],this.seq[0]=this.seq[this.n],this.id[0]=this.id[this.n],this.siftDown(0)),out}get size(){return this.n}clear(){this.n=0}ensureCapacity(size2){if(size2<=this.f.length)return;let next2=this.f.length;for(;next2<size2;)next2*=2;let nf3=new Float64Array(next2);nf3.set(this.f),this.f=nf3;let ns3=new Uint32Array(next2);ns3.set(this.seq),this.seq=ns3;let ni3=new Int32Array(next2);ni3.set(this.id),this.id=ni3}siftDown(i2){for(;;){let l3=i2*2+1,r4=l3+1;if(l3>=this.n)return;let m3=l3;if(r4<this.n&&!this.less(l3,r4)&&(m3=r4),this.less(i2,m3))return;this.swap(i2,m3),i2=m3}}less(i2,j4){let fi3=this.f[i2],fj=this.f[j4];return fi3!==fj?fi3<fj:this.seq[i2]<this.seq[j4]}swap(i2,j4){let tf3=this.f[i2];this.f[i2]=this.f[j4],this.f[j4]=tf3;let ts3=this.seq[i2];this.seq[i2]=this.seq[j4],this.seq[j4]=ts3;let ti3=this.id[i2];this.id[i2]=this.id[j4],this.id[j4]=ti3}},TypedNodePool2=class{constructor(){__publicField(this,"z",new Int32Array(1024));__publicField(this,"cellId",new Int32Array(1024));__publicField(this,"g",new Float64Array(1024));__publicField(this,"parent",new Int32Array(1024));__publicField(this,"ripHead",new Int32Array(1024).fill(-1));__publicField(this,"ripCount",new Int32Array(1024));__publicField(this,"length",0)}clear(){this.length=0}push(z5,cellId,g7,parent,ripHead,ripCount){this.ensureCapacity(this.length+1);let idx=this.length++;return this.z[idx]=z5,this.cellId[idx]=cellId,this.g[idx]=g7,this.parent[idx]=parent,this.ripHead[idx]=ripHead,this.ripCount[idx]=ripCount,idx}ensureCapacity(size2){if(size2<=this.z.length)return;let next2=this.z.length;for(;next2<size2;)next2*=2;let nz=new Int32Array(next2);nz.set(this.z),this.z=nz;let nc3=new Int32Array(next2);nc3.set(this.cellId),this.cellId=nc3;let ng3=new Float64Array(next2);ng3.set(this.g),this.g=ng3;let np2=new Int32Array(next2);np2.set(this.parent),this.parent=np2;let nr4=new Int32Array(next2);nr4.fill(-1),nr4.set(this.ripHead.subarray(0,this.length)),this.ripHead=nr4;let nrc=new Int32Array(next2);nrc.set(this.ripCount.subarray(0,this.length)),this.ripCount=nrc}},TypedRipChain2=class{constructor(){__publicField(this,"connId",new Int32Array(1024));__publicField(this,"prev",new Int32Array(1024).fill(-1));__publicField(this,"length",0)}clear(){this.length=0}append(prevHead,connId){this.ensureCapacity(this.length+1);let idx=this.length++;return this.connId[idx]=connId,this.prev[idx]=prevHead,idx}contains(head,connId){for(let cur=head;cur>=0;cur=this.prev[cur])if(this.connId[cur]===connId)return!0;return!1}collect(head,out){out.length=0;for(let cur=head;cur>=0;cur=this.prev[cur])out.push(this.connId[cur])}ensureCapacity(size2){if(size2<=this.connId.length)return;let next2=this.connId.length;for(;next2<size2;)next2*=2;let nc3=new Int32Array(next2);nc3.set(this.connId),this.connId=nc3;let np2=new Int32Array(next2);np2.fill(-1),np2.set(this.prev.subarray(0,this.length)),this.prev=np2}};function toRootNetName3(connectionName,rootConnectionName){return rootConnectionName??connectionName.replace(/_mst\d+$/,"")}function clamp32(value,min,max){return Math.max(min,Math.min(max,value))}function pushUnique2(arr,value){for(let i2=0;i2<arr.length;i2++)if(arr[i2]===value)return;arr.push(value)}function pushUniqueNeighbor2(arr,edge){for(let i2=0;i2<arr.length;i2++)if(arr[i2].cellId===edge.cellId)return;arr.push(edge)}function circleIntersectsRect2(cx3,cy3,r4,minX,minY,maxX,maxY){let qx3=clamp32(cx3,minX,maxX),qy3=clamp32(cy3,minY,maxY),dx3=cx3-qx3,dy3=cy3-qy3;return dx3*dx3+dy3*dy3<=r4*r4}var HighDensitySolverA03=class extends BaseSolver{constructor(props){super();__publicField(this,"nodeWithPortPoints");__publicField(this,"highResolutionCellSize");__publicField(this,"highResolutionCellThickness");__publicField(this,"lowResolutionCellSize");__publicField(this,"viaDiameter");__publicField(this,"MAX_RIPS");__publicField(this,"maxCellCount");__publicField(this,"traceThickness");__publicField(this,"traceMargin");__publicField(this,"viaMinDistFromBorder");__publicField(this,"showPenaltyMap");__publicField(this,"showUsedCellMap");__publicField(this,"effort");__publicField(this,"stepMultiplier");__publicField(this,"hyperParameters");__publicField(this,"initialPenaltyFn");__publicField(this,"boundsMinX");__publicField(this,"boundsMaxX");__publicField(this,"boundsMinY");__publicField(this,"boundsMaxY");__publicField(this,"gridToBoundsTransform");__publicField(this,"availableZ");__publicField(this,"zToLayer");__publicField(this,"layerToZ");__publicField(this,"layers");__publicField(this,"fineRows");__publicField(this,"fineCols");__publicField(this,"lowScale");__publicField(this,"bandRows");__publicField(this,"bandCols");__publicField(this,"regions");__publicField(this,"planeSize");__publicField(this,"cellCenterX");__publicField(this,"cellCenterY");__publicField(this,"cellMinX");__publicField(this,"cellMinY");__publicField(this,"cellMaxX");__publicField(this,"cellMaxY");__publicField(this,"cellWidth");__publicField(this,"cellHeight");__publicField(this,"cellRegion");__publicField(this,"cellRow");__publicField(this,"cellCol");__publicField(this,"viaAllowed");__publicField(this,"neighborOffset");__publicField(this,"neighborIds");__publicField(this,"neighborCosts");__publicField(this,"usedCellsFlat");__publicField(this,"sharedCellsFlat");__publicField(this,"portOwnerFlat");__publicField(this,"penalty2d");__publicField(this,"ripStateBuckets");__publicField(this,"visitedStamp");__publicField(this,"bestGStamp");__publicField(this,"bestGValue");__publicField(this,"visitedFlatStamp");__publicField(this,"sharedCrossRootPortFlat");__publicField(this,"stamp",0);__publicField(this,"connNameToId");__publicField(this,"connIdToName");__publicField(this,"connIdToRootNet");__publicField(this,"overlapFriendlyRootNets");__publicField(this,"usedIndicesByConn");__publicField(this,"unsolvedSegs");__publicField(this,"solvedRoutes");__publicField(this,"activeConnSeg",null);__publicField(this,"activeConnId",-1);__publicField(this,"nodePool");__publicField(this,"heap");__publicField(this,"ripChain");__publicField(this,"seqCounter",0);__publicField(this,"_viaOccs",[]);__publicField(this,"_cellOccs",[]);__publicField(this,"_rippedIds",[]);__publicField(this,"ripCount");__publicField(this,"totalRipEvents",0);__publicField(this,"searchIterations",0);__publicField(this,"consecutiveSkips",0);__publicField(this,"penaltyCap");__publicField(this,"baseSearchBudgetIters");__publicField(this,"_moveCost",0);__publicField(this,"_moveRippedHead",-1);__publicField(this,"_moveRipCount",0);__publicField(this,"traceKeepoutRadius");__publicField(this,"viaKeepoutRadius");this.nodeWithPortPoints=props.nodeWithPortPoints,this.highResolutionCellSize=props.highResolutionCellSize??.1,this.highResolutionCellThickness=Math.max(1,Math.floor(props.highResolutionCellThickness??8)),this.lowResolutionCellSize=props.lowResolutionCellSize??.4,this.viaDiameter=props.viaDiameter,this.maxCellCount=props.maxCellCount,this.traceThickness=props.traceThickness??.1,this.traceMargin=props.traceMargin??.15,this.viaMinDistFromBorder=props.viaMinDistFromBorder??.15,this.showPenaltyMap=props.showPenaltyMap??!1,this.showUsedCellMap=props.showUsedCellMap??!1,this.effort=props.effort??1,this.stepMultiplier=Math.max(1,Math.floor(props.stepMultiplier??1)),this.hyperParameters={shuffleSeed:0,ripCost:8,ripTracePenalty:.5,ripViaPenalty:.75,viaBaseCost:.1,greedyMultiplier:1.5,...props.hyperParameters},this.MAX_ITERATIONS=1e8,this.MAX_RIPS=200,this.initialPenaltyFn=props.initialPenaltyFn}get unsolvedConnections(){return this.unsolvedSegs}get solvedConnectionsMap(){let map=new Map;for(let connId=0;connId<this.solvedRoutes.length;connId++){let route=this.solvedRoutes[connId];route&&map.set(connId,route)}return map}get activeConnection(){if(!this.activeConnSeg)return null;let startCellId=this.activeConnSeg.startCellId,endCellId=this.activeConnSeg.endCellId;return{connectionName:this.connIdToName[this.activeConnSeg.connId]??"",start:{cellId:startCellId,region:REGION_NAMES[this.cellRegion[startCellId]],row:this.cellRow[startCellId],col:this.cellCol[startCellId],x:this.cellCenterX[startCellId],y:this.cellCenterY[startCellId],z:this.activeConnSeg.startZ},end:{cellId:endCellId,region:REGION_NAMES[this.cellRegion[endCellId]],row:this.cellRow[endCellId],col:this.cellCol[endCellId],x:this.cellCenterX[endCellId],y:this.cellCenterY[endCellId],z:this.activeConnSeg.endZ}}}get openSet(){return{length:this.heap?.size??0}}get gridStats(){return{cells:this.planeSize||0,layers:this.layers||0,states:(this.planeSize||0)*(this.layers||0),ripStateBuckets:this.ripStateBuckets||0,neighborEdges:this.neighborIds?.length??0,regionCounts:this.regions?Object.fromEntries(this.regions.map(region=>[region.name,region.rows*region.cols])):{}}}getConstructorParams(){return[{nodeWithPortPoints:this.nodeWithPortPoints,highResolutionCellSize:this.highResolutionCellSize,highResolutionCellThickness:this.highResolutionCellThickness,lowResolutionCellSize:this.lowResolutionCellSize,viaDiameter:this.viaDiameter,maxCellCount:this.maxCellCount,stepMultiplier:this.stepMultiplier,traceThickness:this.traceThickness,traceMargin:this.traceMargin,viaMinDistFromBorder:this.viaMinDistFromBorder,showPenaltyMap:this.showPenaltyMap,showUsedCellMap:this.showUsedCellMap,effort:this.effort,hyperParameters:this.hyperParameters,initialPenaltyFn:this.initialPenaltyFn}]}_setup(){let{nodeWithPortPoints}=this,{width,height,center:center2}=nodeWithPortPoints,rawScale=this.lowResolutionCellSize/this.highResolutionCellSize,roundedScale=Math.round(rawScale);if(!Number.isFinite(rawScale)||rawScale<=0||Math.abs(rawScale-roundedScale)>1e-9){this.error="lowResolutionCellSize must be a positive integer multiple of highResolutionCellSize",this.failed=!0;return}this.lowScale=Math.max(1,roundedScale),this.availableZ=nodeWithPortPoints.availableZ??[...new Set(nodeWithPortPoints.portPoints.map(pp3=>pp3.z))].sort((a2,b3)=>a2-b3),this.layers=this.availableZ.length,this.zToLayer=new Map,this.layerToZ=new Map;for(let i2=0;i2<this.availableZ.length;i2++){let z5=this.availableZ[i2];this.zToLayer.set(z5,i2),this.layerToZ.set(i2,z5)}this.boundsMinX=center2.x-width/2,this.boundsMaxX=center2.x+width/2,this.boundsMinY=center2.y-height/2,this.boundsMaxY=center2.y+height/2,this.traceKeepoutRadius=this.traceMargin+this.traceThickness/2,this.viaKeepoutRadius=this.viaDiameter/2+this.traceKeepoutRadius,this.buildFiveRegionGrid(width,height),this.gridToBoundsTransform=this.computeGridToBoundsTransform();let totalCells=this.layers*this.planeSize;if(this.maxCellCount!==void 0&&totalCells>this.maxCellCount){this.error=`Cell count ${totalCells} exceeds maxCellCount ${this.maxCellCount}`,this.failed=!0;return}this.connNameToId=new Map,this.connIdToName=[],this.connIdToRootNet=[],this.overlapFriendlyRootNets=new Set,this.unsolvedSegs=this.buildConnectionSegs(),this.penalty2d=new Float64Array(this.planeSize);let widthInv=width>0?1/width:0,heightInv=height>0?1/height:0;for(let cellId=0;cellId<this.planeSize;cellId++){let penalty=0;this.initialPenaltyFn&&(penalty+=this.initialPenaltyFn({x:this.cellCenterX[cellId],y:this.cellCenterY[cellId],px:(this.cellCenterX[cellId]-this.boundsMinX)*widthInv,py:(this.cellCenterY[cellId]-this.boundsMinY)*heightInv,cellId,region:REGION_NAMES[this.cellRegion[cellId]],row:this.cellRow[cellId],col:this.cellCol[cellId]})),this.penalty2d[cellId]=penalty}this.usedCellsFlat=new Int32Array(totalCells).fill(-1),this.sharedCellsFlat=Array.from({length:totalCells},()=>{}),this.portOwnerFlat=new Int32Array(totalCells).fill(-1),this.sharedCrossRootPortFlat=new Uint8Array(totalCells),this.ripStateBuckets=1;let searchStateCount=totalCells;this.visitedStamp=new Uint32Array(searchStateCount),this.bestGStamp=new Uint32Array(searchStateCount),this.bestGValue=new Float64Array(searchStateCount),this.visitedFlatStamp=new Uint32Array(totalCells),this.stamp=0;let rootByPortFlat=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let connId=this.connNameToId.get(pp3.connectionName);if(connId===void 0)continue;let cell=this.pointToCell(pp3),flatIdx=cell.z*this.planeSize+cell.cellId,rootNet=this.connIdToRootNet[connId],existingRoot=rootByPortFlat.get(flatIdx);existingRoot===void 0?rootByPortFlat.set(flatIdx,rootNet):existingRoot!==rootNet&&(this.sharedCrossRootPortFlat[flatIdx]=1);let existing=this.portOwnerFlat[flatIdx];existing===-1||existing===connId?this.portOwnerFlat[flatIdx]=connId:this.portOwnerFlat[flatIdx]=-2}this.solvedRoutes=[],this.usedIndicesByConn=[],this.ripCount=[],this.consecutiveSkips=0,this.penaltyCap=this.hyperParameters.ripCost*.5,this.shuffleConnections();let budget=computeMaxIterationsByNodeSizeAndConnectionCount({planeSize:this.planeSize,layers:this.layers,connectionCount:this.unsolvedSegs.length,effort:this.effort,maxIterations:this.MAX_ITERATIONS});this.baseSearchBudgetIters=budget.baseSearchBudgetIters,this.MAX_ITERATIONS=budget.maxIterationsIters,this.activeConnSeg=null,this.activeConnId=-1,this.nodePool=new TypedNodePool2,this.heap=new TypedMinHeap2,this.ripChain=new TypedRipChain2,this.seqCounter=0}_step(){for(let i2=0;i2<this.stepMultiplier;i2++){if(this.solved||this.failed)return;this.stepOnce()}}buildFiveRegionGrid(width,height){this.fineCols=Math.max(1,Math.ceil(width/this.highResolutionCellSize)),this.fineRows=Math.max(1,Math.ceil(height/this.highResolutionCellSize)),this.bandCols=Math.min(this.highResolutionCellThickness,Math.floor(this.fineCols/2)),this.bandRows=Math.min(this.highResolutionCellThickness,Math.floor(this.fineRows/2));let middleFineCols=Math.max(0,this.fineCols-this.bandCols*2),middleFineRows=Math.max(0,this.fineRows-this.bandRows*2),topFineCols=middleFineCols,bottomFineCols=middleFineCols;this.regions=[{id:REGION_LEFT,name:"left",fineOriginRow:0,fineOriginCol:0,fineRows:this.fineRows,fineCols:this.bandCols,cellScale:1,rows:this.fineRows,cols:this.bandCols,offset:0},{id:REGION_TOP,name:"top",fineOriginRow:0,fineOriginCol:this.bandCols,fineRows:this.bandRows,fineCols:topFineCols,cellScale:1,rows:this.bandRows,cols:topFineCols,offset:0},{id:REGION_RIGHT,name:"right",fineOriginRow:0,fineOriginCol:this.fineCols-this.bandCols,fineRows:this.fineRows,fineCols:this.bandCols,cellScale:1,rows:this.fineRows,cols:this.bandCols,offset:0},{id:REGION_BOTTOM,name:"bottom",fineOriginRow:this.fineRows-this.bandRows,fineOriginCol:this.bandCols,fineRows:this.bandRows,fineCols:bottomFineCols,cellScale:1,rows:this.bandRows,cols:bottomFineCols,offset:0},{id:REGION_MIDDLE,name:"middle",fineOriginRow:this.bandRows,fineOriginCol:this.bandCols,fineRows:middleFineRows,fineCols:middleFineCols,cellScale:this.lowScale,rows:middleFineRows>0?Math.ceil(middleFineRows/this.lowScale):0,cols:middleFineCols>0?Math.ceil(middleFineCols/this.lowScale):0,offset:0}];let offset=0;for(let i2=0;i2<this.regions.length;i2++)this.regions[i2].offset=offset,offset+=this.regions[i2].rows*this.regions[i2].cols;this.planeSize=offset,this.cellCenterX=new Float64Array(this.planeSize),this.cellCenterY=new Float64Array(this.planeSize),this.cellMinX=new Float64Array(this.planeSize),this.cellMinY=new Float64Array(this.planeSize),this.cellMaxX=new Float64Array(this.planeSize),this.cellMaxY=new Float64Array(this.planeSize),this.cellWidth=new Float64Array(this.planeSize),this.cellHeight=new Float64Array(this.planeSize),this.cellRegion=new Uint8Array(this.planeSize),this.cellRow=new Int32Array(this.planeSize),this.cellCol=new Int32Array(this.planeSize),this.viaAllowed=new Uint8Array(this.planeSize);for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];for(let row=0;row<region.rows;row++){let fineRow0=region.fineOriginRow+row*region.cellScale,fineRow1=Math.min(region.fineOriginRow+region.fineRows,fineRow0+region.cellScale),minY=this.boundsMinY+fineRow0*this.highResolutionCellSize,maxY=Math.min(this.boundsMaxY,this.boundsMinY+fineRow1*this.highResolutionCellSize);for(let col=0;col<region.cols;col++){let fineCol0=region.fineOriginCol+col*region.cellScale,fineCol1=Math.min(region.fineOriginCol+region.fineCols,fineCol0+region.cellScale),minX=this.boundsMinX+fineCol0*this.highResolutionCellSize,maxX=Math.min(this.boundsMaxX,this.boundsMinX+fineCol1*this.highResolutionCellSize),cellId=this.cellIdFor(region.id,row,col);this.cellCenterX[cellId]=(minX+maxX)/2,this.cellCenterY[cellId]=(minY+maxY)/2,this.cellMinX[cellId]=minX,this.cellMinY[cellId]=minY,this.cellMaxX[cellId]=maxX,this.cellMaxY[cellId]=maxY,this.cellWidth[cellId]=maxX-minX,this.cellHeight[cellId]=maxY-minY,this.cellRegion[cellId]=region.id,this.cellRow[cellId]=row,this.cellCol[cellId]=col;let minBorderDist=Math.min(this.cellCenterX[cellId]-this.boundsMinX,this.boundsMaxX-this.cellCenterX[cellId],this.cellCenterY[cellId]-this.boundsMinY,this.boundsMaxY-this.cellCenterY[cellId]);this.viaAllowed[cellId]=minBorderDist>=this.viaMinDistFromBorder?1:0}}}let neighbors=Array.from({length:this.planeSize},()=>[]),addBidirectionalEdge=(a2,b3)=>{if(a2===b3||a2<0||b3<0)return;let dx3=this.cellCenterX[a2]-this.cellCenterX[b3],dy3=this.cellCenterY[a2]-this.cellCenterY[b3],cost=Math.hypot(dx3,dy3);pushUniqueNeighbor2(neighbors[a2],{cellId:b3,cost}),pushUniqueNeighbor2(neighbors[b3],{cellId:a2,cost})};for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];for(let row=0;row<region.rows;row++)for(let col=0;col<region.cols;col++){let cellId=this.cellIdFor(region.id,row,col);row+1<region.rows&&addBidirectionalEdge(cellId,this.cellIdFor(region.id,row+1,col)),col+1<region.cols&&addBidirectionalEdge(cellId,this.cellIdFor(region.id,row,col+1))}}let left=this.regions[REGION_LEFT],top=this.regions[REGION_TOP],right=this.regions[REGION_RIGHT],bottom=this.regions[REGION_BOTTOM],middle=this.regions[REGION_MIDDLE],hasLeft=left.rows>0&&left.cols>0,hasTop=top.rows>0&&top.cols>0,hasRight=right.rows>0&&right.cols>0,hasBottom=bottom.rows>0&&bottom.cols>0,hasMiddle=middle.rows>0&&middle.cols>0;if(hasLeft&&hasTop)for(let globalRow=0;globalRow<this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_TOP,globalRow,0));if(hasTop&&hasRight)for(let globalRow=0;globalRow<this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,globalRow,top.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasLeft&&hasBottom)for(let globalRow=this.fineRows-this.bandRows;globalRow<this.fineRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_BOTTOM,globalRow-(this.fineRows-this.bandRows),0));if(hasBottom&&hasRight)for(let globalRow=this.fineRows-this.bandRows;globalRow<this.fineRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_BOTTOM,globalRow-(this.fineRows-this.bandRows),bottom.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasLeft&&hasMiddle)for(let globalRow=this.bandRows;globalRow<this.fineRows-this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_MIDDLE,Math.floor((globalRow-this.bandRows)/this.lowScale),0));if(hasRight&&hasMiddle)for(let globalRow=this.bandRows;globalRow<this.fineRows-this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_MIDDLE,Math.floor((globalRow-this.bandRows)/this.lowScale),middle.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasTop&&hasMiddle)for(let globalCol=this.bandCols;globalCol<this.fineCols-this.bandCols;globalCol++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,top.rows-1,globalCol-this.bandCols),this.cellIdFor(REGION_MIDDLE,0,Math.floor((globalCol-this.bandCols)/this.lowScale)));if(hasBottom&&hasMiddle)for(let globalCol=this.bandCols;globalCol<this.fineCols-this.bandCols;globalCol++)addBidirectionalEdge(this.cellIdFor(REGION_MIDDLE,middle.rows-1,Math.floor((globalCol-this.bandCols)/this.lowScale)),this.cellIdFor(REGION_BOTTOM,0,globalCol-this.bandCols));if(!hasMiddle&&!hasTop&&!hasBottom&&hasLeft&&hasRight)for(let row=0;row<Math.min(left.rows,right.rows);row++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,row,left.cols-1),this.cellIdFor(REGION_RIGHT,row,0));if(!hasMiddle&&!hasLeft&&!hasRight&&hasTop&&hasBottom)for(let col=0;col<Math.min(top.cols,bottom.cols);col++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,top.rows-1,col),this.cellIdFor(REGION_BOTTOM,0,col));let flattened=this.flattenNeighborLists(neighbors);this.neighborOffset=flattened.offset,this.neighborIds=flattened.ids,this.neighborCosts=flattened.costs}cellIdFor(regionId,row,col){let region=this.regions[regionId];return region.offset+row*region.cols+col}stepOnce(){if(!this.activeConnSeg){if(this.unsolvedSegs.length===0){this.solved=!0;return}let next2=this.unsolvedSegs.shift();this.activeConnSeg=next2,this.activeConnId=next2.connId,this.nodePool.clear(),this.ripChain.clear(),this.heap.clear(),this.seqCounter=0,this.searchIterations=0,this.nextStamp();let f2=this.computeH(next2.startZ,next2.startCellId,next2.endZ,next2.endCellId)*this.hyperParameters.greedyMultiplier,startIdx=this.nodePool.push(next2.startZ,next2.startCellId,0,-1,-1,0),startFlatIdx=next2.startZ*this.planeSize+next2.startCellId,startStateIdx=this.getSearchStateIdx(startFlatIdx,0);this.bestGStamp[startStateIdx]=this.stamp,this.bestGValue[startStateIdx]=0,this.heap.push(f2,this.seqCounter++,startIdx);return}this.searchIterations++;let connRips=this.ripCount[this.activeConnId]??0,budget=Math.round(this.baseSearchBudgetIters*(1+Math.min(connRips,10)*.25));if(this.searchIterations>budget){let pen=this.penalty2d;for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.9;this.unsolvedSegs.push(this.activeConnSeg),this.activeConnSeg=null,this.activeConnId=-1,this.heap.clear(),this.nodePool.clear(),this.consecutiveSkips++,this.consecutiveSkips>=Math.max(3,this.unsolvedSegs.length*3)&&(this.error=`Convergence failure: ${this.unsolvedSegs.length} connections stuck`,this.failed=!0);return}if(this.heap.size===0){this.error=`No path found for ${this.connIdToName[this.activeConnId]}`,this.failed=!0;return}let nodeIdx=this.heap.pop(),z5=this.nodePool.z[nodeIdx],cellId=this.nodePool.cellId[nodeIdx],g7=this.nodePool.g[nodeIdx],rippedHead=this.nodePool.ripHead[nodeIdx],ripCount=this.nodePool.ripCount[nodeIdx],flatIdx=z5*this.planeSize+cellId,searchStateIdx=this.getSearchStateIdx(flatIdx,ripCount);if(this.visitedStamp[searchStateIdx]===this.stamp)return;this.visitedStamp[searchStateIdx]=this.stamp,this.visitedFlatStamp[flatIdx]=this.stamp;let seg=this.activeConnSeg;if(z5===seg.endZ&&cellId===seg.endCellId){this.finalizeRoute(nodeIdx),this.activeConnSeg=null,this.activeConnId=-1;return}let visited=this.visitedStamp,stamp=this.stamp,activeConn=this.activeConnId,endZ=seg.endZ,endCellId=seg.endCellId,neighborStart=this.neighborOffset[cellId],neighborEnd=this.neighborOffset[cellId+1];for(let i2=neighborStart;i2<neighborEnd;i2++){let neighborCellId=this.neighborIds[i2],nextFlatIdx=z5*this.planeSize+neighborCellId;if(this.computeMoveCostAndRips(activeConn,z5,neighborCellId,!1,rippedHead,ripCount,this.neighborCosts[i2]),this._moveCost<0)continue;let nextStateIdx=this.getSearchStateIdx(nextFlatIdx,this._moveRipCount);if(visited[nextStateIdx]===stamp)continue;let g22=g7+this._moveCost;if(this.bestGStamp[nextStateIdx]===stamp&&g22>=this.bestGValue[nextStateIdx])continue;this.bestGStamp[nextStateIdx]=stamp,this.bestGValue[nextStateIdx]=g22;let f2=g22+this.computeH(z5,neighborCellId,endZ,endCellId)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.push(z5,neighborCellId,g22,nodeIdx,this._moveRippedHead,this._moveRipCount);this.heap.push(f2,this.seqCounter++,newNodeIdx)}if(this.viaAllowed[cellId])for(let nz=0;nz<this.layers;nz++){if(nz===z5)continue;let nextFlatIdx=nz*this.planeSize+cellId;if(this.computeMoveCostAndRips(activeConn,nz,cellId,!0,rippedHead,ripCount,0),this._moveCost<0)continue;let nextStateIdx=this.getSearchStateIdx(nextFlatIdx,this._moveRipCount);if(visited[nextStateIdx]===stamp)continue;let g22=g7+this._moveCost;if(this.bestGStamp[nextStateIdx]===stamp&&g22>=this.bestGValue[nextStateIdx])continue;this.bestGStamp[nextStateIdx]=stamp,this.bestGValue[nextStateIdx]=g22;let f2=g22+this.computeH(nz,cellId,endZ,endCellId)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.push(nz,cellId,g22,nodeIdx,this._moveRippedHead,this._moveRipCount);this.heap.push(f2,this.seqCounter++,newNodeIdx)}}computeMoveCostAndRips(activeConn,toZ,toCellId,isVia,rippedHead,currentRipCount,lateralCost){let cost=0,head=rippedHead,ripCount=currentRipCount,toFlatIdx=toZ*this.planeSize+toCellId;if(isVia){cost+=this.hyperParameters.viaBaseCost,cost+=Math.min(this.penalty2d[toCellId],this.penaltyCap);let fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.allowSharedUse(activeConn,fixedOwner),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toCellId===seg.endCellId;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRippedHead=head;return}this.fillViaOccupants(toCellId,activeConn);let occs=this._viaOccs;for(let i2=0;i2<occs.length;i2++){let occ=occs[i2];this.ripChain.contains(head,occ)||(cost+=this.hyperParameters.ripCost,head=this.ripChain.append(head,occ),ripCount++),cost+=this.hyperParameters.ripViaPenalty}}else{cost+=lateralCost,cost+=Math.min(this.penalty2d[toCellId],this.penaltyCap);let fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.allowSharedUse(activeConn,fixedOwner),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toCellId===seg.endCellId;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRippedHead=head;return}this.fillTraceOccupants(toFlatIdx,activeConn,this._cellOccs);for(let i2=0;i2<this._cellOccs.length;i2++){let occ=this._cellOccs[i2];this.ripChain.contains(head,occ)||(cost+=this.hyperParameters.ripCost,head=this.ripChain.append(head,occ),ripCount++),cost+=this.hyperParameters.ripTracePenalty}}this._moveCost=cost,this._moveRippedHead=head,this._moveRipCount=ripCount}fillViaOccupants(cellId,activeConn){let occs=this._viaOccs;occs.length=0;let cx3=this.cellCenterX[cellId],cy3=this.cellCenterY[cellId];this.forEachCellNearCircle(cx3,cy3,this.viaKeepoutRadius,occCellId=>{if(circleIntersectsRect2(cx3,cy3,this.viaKeepoutRadius,this.cellMinX[occCellId],this.cellMinY[occCellId],this.cellMaxX[occCellId],this.cellMaxY[occCellId]))for(let z5=0;z5<this.layers;z5++)this.pushFlatOccupants(z5*this.planeSize+occCellId,activeConn,occs)})}fillTraceOccupants(flatIdx,activeConn,out){out.length=0,this.pushFlatOccupants(flatIdx,activeConn,out)}pushFlatOccupants(flatIdx,activeConn,out){let primaryOcc=this.usedCellsFlat[flatIdx];primaryOcc!==-1&&primaryOcc!==activeConn&&!this.allowSharedUse(activeConn,primaryOcc)&&pushUnique2(out,primaryOcc);let sharedOccs=this.sharedCellsFlat[flatIdx];if(sharedOccs)for(let i2=0;i2<sharedOccs.length;i2++){let occ=sharedOccs[i2];occ!==activeConn&&(this.allowSharedUse(activeConn,occ)||pushUnique2(out,occ))}}addSharedOccupant(flatIdx,connId){if(this.usedCellsFlat[flatIdx]===connId)return;let sharedOccs=this.sharedCellsFlat[flatIdx];sharedOccs||(sharedOccs=[],this.sharedCellsFlat[flatIdx]=sharedOccs),pushUnique2(sharedOccs,connId)}replaceOccupants(flatIdx,connId){this.usedCellsFlat[flatIdx]=connId,this.sharedCellsFlat[flatIdx]=void 0}removeOccupant(flatIdx,connId){let sharedOccs=this.sharedCellsFlat[flatIdx];if(this.usedCellsFlat[flatIdx]===connId){sharedOccs&&sharedOccs.length>0?(this.usedCellsFlat[flatIdx]=sharedOccs.pop(),sharedOccs.length===0&&(this.sharedCellsFlat[flatIdx]=void 0)):this.usedCellsFlat[flatIdx]=-1;return}if(!sharedOccs)return;let idx=sharedOccs.indexOf(connId);idx!==-1&&(sharedOccs.splice(idx,1),sharedOccs.length===0&&(this.sharedCellsFlat[flatIdx]=void 0))}allowSharedUse(activeConn,existingConn){return existingConn<0?!1:this.connIdToRootNet[existingConn]===this.connIdToRootNet[activeConn]}shouldSkipFixedPortHalo(flatIdx,connId){let fixedOwner=this.portOwnerFlat[flatIdx];return fixedOwner===connId?!1:fixedOwner===-2?!0:fixedOwner<0?!1:!this.allowSharedUse(connId,fixedOwner)}nextStamp(){this.stamp=this.stamp+1>>>0,this.stamp===0&&(this.visitedStamp.fill(0),this.bestGStamp.fill(0),this.visitedFlatStamp.fill(0),this.stamp=1)}getSearchStateIdx(flatIdx,ripCount){return flatIdx}computeH(z5,cellId,toZ,toCellId){let dist=Math.hypot(this.cellCenterX[cellId]-this.cellCenterX[toCellId],this.cellCenterY[cellId]-this.cellCenterY[toCellId]);return z5===toZ?dist:dist+this.hyperParameters.viaBaseCost}internConn(name,rootNetName){let existing=this.connNameToId.get(name);if(existing!==void 0)return existing;let id2=this.connIdToName.length;return this.connIdToName.push(name),this.connIdToRootNet.push(toRootNetName3(name,rootNetName)),this.connNameToId.set(name,id2),id2}buildConnectionSegs(){let byName=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let name=pp3.connectionName;byName.has(name)||byName.set(name,{points:[],rootConnectionName:pp3.rootConnectionName}),byName.get(name).points.push(pp3)}let segs=[],seenSegmentKeys=new Set;for(let[name,conn]of byName){let pts=conn.points;if(pts.length<2)continue;let connId=this.internConn(name,conn.rootConnectionName);for(let i2=0;i2<pts.length-1;i2++){let s2=this.pointToCell(pts[i2]),e4=this.pointToCell(pts[i2+1]),endpointA=`${s2.z}:${s2.cellId}`,endpointB=`${e4.z}:${e4.cellId}`,orderedEndpoints=endpointA<endpointB?`${endpointA}|${endpointB}`:`${endpointB}|${endpointA}`,netName=conn.rootConnectionName??name,segKey=`${netName}|${orderedEndpoints}`;if(seenSegmentKeys.has(segKey)){this.overlapFriendlyRootNets.add(netName);continue}seenSegmentKeys.add(segKey),segs.push({connId,startZ:s2.z,startCellId:s2.cellId,startPoint:pts[i2],endZ:e4.z,endCellId:e4.cellId,endPoint:pts[i2+1]})}}return segs}pointToCell(pt4){let fineCol=clamp32(Math.floor((pt4.x-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),fineRow=clamp32(Math.floor((pt4.y-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1),regionId=REGION_MIDDLE;fineCol<this.bandCols?regionId=REGION_LEFT:fineCol>=this.fineCols-this.bandCols?regionId=REGION_RIGHT:fineRow<this.bandRows?regionId=REGION_TOP:fineRow>=this.fineRows-this.bandRows&&(regionId=REGION_BOTTOM);let region=this.regions[regionId],localFineRow=fineRow-region.fineOriginRow,localFineCol=fineCol-region.fineOriginCol,row=clamp32(Math.floor(localFineRow/region.cellScale),0,Math.max(0,region.rows-1)),col=clamp32(Math.floor(localFineCol/region.cellScale),0,Math.max(0,region.cols-1));return{z:this.zToLayer.get(pt4.z)??0,cellId:this.cellIdFor(regionId,row,col)}}shuffleConnections(){let arr=this.unsolvedSegs,s2=this.hyperParameters.shuffleSeed>>>0,rng=()=>(s2=Math.imul(s2,1664525)+1013904223>>>0,s2/4294967295);for(let i2=arr.length-1;i2>0;i2--){let j4=Math.floor(rng()*(i2+1)),tmp=arr[i2];arr[i2]=arr[j4],arr[j4]=tmp}}finalizeRoute(goalNodeIdx){this.consecutiveSkips=Math.max(0,this.consecutiveSkips-1);let states=[],idx=goalNodeIdx;for(;idx>=0;){let z5=this.nodePool.z[idx],cellId=this.nodePool.cellId[idx];states.push(z5*this.planeSize+cellId),idx=this.nodePool.parent[idx]}for(states.reverse();states.length>1&&this.sharedCrossRootPortFlat[states[0]];)states.shift();for(;states.length>1&&this.sharedCrossRootPortFlat[states[states.length-1]];)states.pop();let viaCellIds=this.extractViaCellIds(states),connId=this.activeConnId;this.ripChain.collect(this.nodePool.ripHead[goalNodeIdx],this._rippedIds);for(let i2=0;i2<this._rippedIds.length;i2++)if(this.ripTrace(this._rippedIds[i2]),this.failed)return;let indices=[];for(let i2=0;i2<states.length;i2++){let state2=states[i2],z5=Math.floor(state2/this.planeSize),cellId=state2-z5*this.planeSize;this.markTraceFootprint(connId,z5,cellId,indices)}let displacedByVias=[];for(let i2=0;i2<viaCellIds.length;i2++)this.markViaFootprint(connId,viaCellIds[i2],indices,displacedByVias);for(;this.usedIndicesByConn.length<=connId;)this.usedIndicesByConn.push(void 0);for(this.usedIndicesByConn[connId]=indices;this.solvedRoutes.length<=connId;)this.solvedRoutes.push(void 0);this.solvedRoutes[connId]={connId,states:Int32Array.from(states),viaCellIds:Int32Array.from(viaCellIds),startPoint:this.activeConnSeg.startPoint,endPoint:this.activeConnSeg.endPoint};for(let i2=0;i2<displacedByVias.length;i2++)if(this.ripTrace(displacedByVias[i2]),this.failed)return;if(this._rippedIds.length>0||displacedByVias.length>0){let pen=this.penalty2d,cap2=this.penaltyCap;if(this.totalRipEvents>50)for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.99;else for(let i2=0;i2<pen.length;i2++)pen[i2]>cap2&&(pen[i2]=pen[i2]*.5)}}extractViaCellIds(states){let viaCellIds=[];for(let i2=1;i2<states.length;i2++){let prevState=states[i2-1],nextState=states[i2],prevZ=Math.floor(prevState/this.planeSize),nextZ=Math.floor(nextState/this.planeSize);prevZ!==nextZ&&viaCellIds.push(nextState-nextZ*this.planeSize)}return viaCellIds}markTraceFootprint(connId,z5,sourceCellId,indices){let cx3=this.cellCenterX[sourceCellId],cy3=this.cellCenterY[sourceCellId];this.forEachCellNearCircle(cx3,cy3,this.traceKeepoutRadius,cellId=>{if(!circleIntersectsRect2(cx3,cy3,this.traceKeepoutRadius,this.cellMinX[cellId],this.cellMinY[cellId],this.cellMaxX[cellId],this.cellMaxY[cellId]))return;let flatIdx=z5*this.planeSize+cellId;if(cellId!==sourceCellId&&this.shouldSkipFixedPortHalo(flatIdx,connId))return;let existing=this.usedCellsFlat[flatIdx],allowSameRootOverlap=this.allowSharedUse(connId,existing);existing!==-1&&existing!==connId&&!allowSameRootOverlap||(existing!==-1&&existing!==connId?this.addSharedOccupant(flatIdx,connId):this.usedCellsFlat[flatIdx]=connId,indices.push(flatIdx))})}markViaFootprint(connId,sourceCellId,indices,displacedByVias){let cx3=this.cellCenterX[sourceCellId],cy3=this.cellCenterY[sourceCellId];this.forEachCellNearCircle(cx3,cy3,this.viaKeepoutRadius,cellId=>{if(circleIntersectsRect2(cx3,cy3,this.viaKeepoutRadius,this.cellMinX[cellId],this.cellMinY[cellId],this.cellMaxX[cellId],this.cellMaxY[cellId]))for(let z5=0;z5<this.layers;z5++){let flatIdx=z5*this.planeSize+cellId;if(cellId!==sourceCellId&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;if(this.fillTraceOccupants(flatIdx,connId,this._cellOccs),this._cellOccs.length>0){for(let i2=0;i2<this._cellOccs.length;i2++)pushUnique2(displacedByVias,this._cellOccs[i2]);this.replaceOccupants(flatIdx,connId),indices.push(flatIdx);continue}let existing=this.usedCellsFlat[flatIdx];existing!==-1&&existing!==connId?this.addSharedOccupant(flatIdx,connId):this.usedCellsFlat[flatIdx]=connId,indices.push(flatIdx)}})}forEachCellNearCircle(cx3,cy3,radius,visitor){let minFineCol=clamp32(Math.floor((cx3-radius-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),maxFineCol=clamp32(Math.floor((cx3+radius-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),minFineRow=clamp32(Math.floor((cy3-radius-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1),maxFineRow=clamp32(Math.floor((cy3+radius-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1);for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];if(region.rows===0||region.cols===0)continue;let regionFineRowMin=Math.max(minFineRow,region.fineOriginRow),regionFineRowMax=Math.min(maxFineRow,region.fineOriginRow+region.fineRows-1),regionFineColMin=Math.max(minFineCol,region.fineOriginCol),regionFineColMax=Math.min(maxFineCol,region.fineOriginCol+region.fineCols-1);if(regionFineRowMin>regionFineRowMax||regionFineColMin>regionFineColMax)continue;let localRowMin=Math.floor((regionFineRowMin-region.fineOriginRow)/region.cellScale),localRowMax=Math.floor((regionFineRowMax-region.fineOriginRow)/region.cellScale),localColMin=Math.floor((regionFineColMin-region.fineOriginCol)/region.cellScale),localColMax=Math.floor((regionFineColMax-region.fineOriginCol)/region.cellScale);for(let row=localRowMin;row<=localRowMax;row++)for(let col=localColMin;col<=localColMax;col++)visitor(this.cellIdFor(region.id,row,col))}}ripTrace(connId){for(;this.ripCount.length<=connId;)this.ripCount.push(0);if(this.ripCount[connId]++,this.totalRipEvents++,this.totalRipEvents>=this.MAX_RIPS){this.error=`Convergence failure: exceeded MAX_RIPS ${this.MAX_RIPS}`,this.failed=!0;return}let route=this.solvedRoutes[connId];if(route){for(let i2=0;i2<route.states.length;i2++){let cellId=route.states[i2]%this.planeSize;this.penalty2d[cellId]=this.penalty2d[cellId]+this.hyperParameters.ripTracePenalty}for(let i2=0;i2<route.viaCellIds.length;i2++){let cellId=route.viaCellIds[i2];this.penalty2d[cellId]=this.penalty2d[cellId]+this.hyperParameters.ripViaPenalty}}let indices=this.usedIndicesByConn[connId];if(indices){for(let i2=0;i2<indices.length;i2++)this.removeOccupant(indices[i2],connId);this.usedIndicesByConn[connId]=void 0}if(route){this.solvedRoutes[connId]=void 0;let first=route.states[0],last=route.states[route.states.length-1],startZ=Math.floor(first/this.planeSize),endZ=Math.floor(last/this.planeSize);this.unsolvedSegs.push({connId,startZ,startCellId:first-startZ*this.planeSize,startPoint:route.startPoint,endZ,endCellId:last-endZ*this.planeSize,endPoint:route.endPoint})}}flattenNeighborLists(neighbors){let offset=new Int32Array(neighbors.length+1),total=0;for(let i2=0;i2<neighbors.length;i2++)offset[i2]=total,total+=neighbors[i2].length;offset[neighbors.length]=total;let ids=new Int32Array(total),costs=new Float32Array(total),cursor=0;for(let i2=0;i2<neighbors.length;i2++){let edges=neighbors[i2];for(let j4=0;j4<edges.length;j4++){let edge=edges[j4];ids[cursor]=edge.cellId,costs[cursor]=edge.cost,cursor++}}return{offset,ids,costs}}visualize(){let LAYER_COLORS=["red","blue","orange","green"],vt4=this.gridToBoundsTransform,points=[],lines=[],circles=[],rects=[];if(rects.push({center:{x:this.nodeWithPortPoints.center.x,y:this.nodeWithPortPoints.center.y},width:this.nodeWithPortPoints.width,height:this.nodeWithPortPoints.height,stroke:"gray"}),this.showPenaltyMap&&this.penalty2d){let maxPenalty=0;for(let i2=0;i2<this.penalty2d.length;i2++)this.penalty2d[i2]>maxPenalty&&(maxPenalty=this.penalty2d[i2]);if(maxPenalty>0)for(let cellId=0;cellId<this.planeSize;cellId++){let penalty=this.penalty2d[cellId];if(penalty<=0)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]}),alpha=Math.min(.6,penalty/maxPenalty*.6);rects.push({center:tc3,width:this.cellWidth[cellId]*vt4.a,height:this.cellHeight[cellId]*vt4.e,fill:`rgba(255,165,0,${alpha.toFixed(3)})`})}}if(this.showUsedCellMap&&this.usedCellsFlat)for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let cellId=0;cellId<this.planeSize;cellId++){if(this.usedCellsFlat[zBase+cellId]===-1)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});rects.push({center:tc3,width:this.cellWidth[cellId]*vt4.a,height:this.cellHeight[cellId]*vt4.e,fill:"rgba(0,0,255,0.5)"})}}for(let pp3 of this.nodeWithPortPoints.portPoints)points.push({x:pp3.x,y:pp3.y,color:LAYER_COLORS[pp3.z]??"gray",label:pp3.connectionName});let TRACE_COLORS=["rgba(255,0,0,0.75)","rgba(0,0,255,0.75)","rgba(255,165,0,0.75)","rgba(0,128,0,0.75)"],transformedRoutes=this.getOutput();for(let route of transformedRoutes){if(route.route.length<2)continue;let segStart=0;for(let i2=1;i2<route.route.length;i2++){let prev=route.route[i2-1];route.route[i2].z!==prev.z&&(i2-segStart>=2&&lines.push({points:route.route.slice(segStart,i2).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[prev.z]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness}),segStart=i2)}if(route.route.length-segStart>=2){let lastZ=route.route[segStart].z;lines.push({points:route.route.slice(segStart).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[lastZ]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness})}}for(let route of transformedRoutes)for(let via of route.vias)circles.push({center:{x:via.x,y:via.y},radius:this.viaDiameter/2,fill:"rgba(0,0,0,0.3)",stroke:"black"});if(this.activeConnSeg&&this.visitedFlatStamp){let currentStamp=this.stamp;for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let cellId=0;cellId<this.planeSize;cellId++){if(this.visitedFlatStamp[zBase+cellId]!==currentStamp)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});points.push({x:tc3.x,y:tc3.y,color:"rgba(0,0,255,0.2)"})}}}return{points,lines,circles,rects,coordinateSystem:"cartesian",title:`HighDensityA03 [${this.getSolvedRouteCount()} solved, ${this.unsolvedSegs?.length??0} remaining]`}}getOutput(){let t35=this.gridToBoundsTransform,result=[];for(let connId=0;connId<this.solvedRoutes.length;connId++){let route=this.solvedRoutes[connId];if(!route)continue;let connName=this.connIdToName[connId],points=Array.from(route.states,state2=>{let z5=Math.floor(state2/this.planeSize),cellId=state2-z5*this.planeSize,tp3=applyAffineTransformToPoint(t35,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});return{x:tp3.x,y:tp3.y,z:this.layerToZ.get(z5)??z5}});points.length>0&&(points[0]={...route.startPoint},points.length>1&&(points[points.length-1]={...route.endPoint})),result.push({connectionName:connName,traceThickness:this.traceThickness,viaDiameter:this.viaDiameter,route:points,vias:Array.from(route.viaCellIds,cellId=>applyAffineTransformToPoint(t35,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]}))})}return result}getSolvedRouteCount(){let count=0;for(let i2=0;i2<this.solvedRoutes.length;i2++)this.solvedRoutes[i2]&&count++;return count}computeGridToBoundsTransform(){let minCenterX=1/0,maxCenterX=-1/0,minCenterY=1/0,maxCenterY=-1/0;for(let cellId=0;cellId<this.planeSize;cellId++){let centerX=this.cellCenterX[cellId],centerY=this.cellCenterY[cellId];centerX<minCenterX&&(minCenterX=centerX),centerX>maxCenterX&&(maxCenterX=centerX),centerY<minCenterY&&(minCenterY=centerY),centerY>maxCenterY&&(maxCenterY=centerY)}let xSpan=maxCenterX-minCenterX,ySpan=maxCenterY-minCenterY,width=this.boundsMaxX-this.boundsMinX,height=this.boundsMaxY-this.boundsMinY,a2=xSpan>0?width/xSpan:1,e4=ySpan>0?height/ySpan:1,c3=xSpan>0?this.boundsMinX-a2*minCenterX:(this.boundsMinX+this.boundsMaxX)/2-minCenterX,f2=ySpan>0?this.boundsMinY-e4*minCenterY:(this.boundsMinY+this.boundsMaxY)/2-minCenterY;return{a:a2,b:0,c:c3,d:0,e:e4,f:f2}}};var import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var BaseSolver2=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(e4){throw this.error=`${this.constructor.name} error: ${e4}`,console.error(this.error),this.failed=!0,e4}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.constructor.name} ran out of iterations`,console.error(this.error),this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let startTime=Date.now();for(;!this.solved&&!this.failed;)this.step();let endTime=Date.now();this.timeToSolve=endTime-startTime}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};var BasePipelineSolver=class extends BaseSolver2{constructor(inputProblem){super();__publicField(this,"startTimeOfPhase",{});__publicField(this,"endTimeOfPhase",{});__publicField(this,"timeSpentOnPhase",{});__publicField(this,"firstIterationOfPhase",{});__publicField(this,"currentPipelineStepIndex",0);__publicField(this,"inputProblem");__publicField(this,"pipelineOutputs",{});this.inputProblem=inputProblem,this.MAX_ITERATIONS=1e6}_step(){let pipelineStepDef=this.pipelineDef[this.currentPipelineStepIndex];if(!pipelineStepDef){this.solved=!0;return}if(this.activeSubSolver){if(this.activeSubSolver.step(),this.activeSubSolver.solved){this.endTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.timeSpentOnPhase[pipelineStepDef.solverName]=this.endTimeOfPhase[pipelineStepDef.solverName]-this.startTimeOfPhase[pipelineStepDef.solverName];let output=this.activeSubSolver.getOutput();output!==null&&(this.pipelineOutputs[pipelineStepDef.solverName]=output),pipelineStepDef.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++}else this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let constructorParams=pipelineStepDef.getConstructorParams(this);this.activeSubSolver=new pipelineStepDef.solverClass(...constructorParams),this[pipelineStepDef.solverName]=this.activeSubSolver,this.timeSpentOnPhase[pipelineStepDef.solverName]=0,this.startTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.firstIterationOfPhase[pipelineStepDef.solverName]=this.iterations}solveUntilPhase(phase){for(;this.getCurrentPhase().toLowerCase()!==phase.toLowerCase()&&(this.step(),!(this.failed||this.solved)););}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}getPhaseProgress(){let totalPhases=this.pipelineDef.length;if(totalPhases===0)return 1;let currentPhaseProgress=this.activeSubSolver?.progress??0;return(this.currentPipelineStepIndex+currentPhaseProgress)/totalPhases}getPhaseStats(){let stats={};for(let step of this.pipelineDef){let timeSpent=this.timeSpentOnPhase[step.solverName]||0,firstIteration=this.firstIterationOfPhase[step.solverName]||0,currentIteration=this.iterations,iterations=step.solverName===this.getCurrentPhase()?currentIteration-firstIteration:0,completed=this.currentPipelineStepIndex>this.pipelineDef.findIndex(s2=>s2.solverName===step.solverName);stats[step.solverName]={timeSpent,iterations,completed}}return stats}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let visualizations=this.pipelineDef.map((step,stepIndex)=>{let viz=this[step.solverName]?.visualize();if(!viz)return null;for(let rect of viz.rects??[])rect.step=stepIndex;for(let point6 of viz.points??[])point6.step=stepIndex;for(let circle2 of viz.circles??[])circle2.step=stepIndex;for(let text of viz.texts??[])text.step=stepIndex;for(let line2 of viz.lines??[])line2.step=stepIndex;return viz}).filter(Boolean);return visualizations.length===0?{points:[],rects:[],lines:[],circles:[],texts:[]}:visualizations.length===1?visualizations[0]:{points:visualizations.flatMap(v5=>v5.points||[]),rects:visualizations.flatMap(v5=>v5.rects||[]),lines:visualizations.flatMap(v5=>v5.lines||[]),circles:visualizations.flatMap(v5=>v5.circles||[]),texts:visualizations.flatMap(v5=>v5.texts||[])}}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}computeProgress(){return this.getPhaseProgress()}getStepOutput(stepName){return this.pipelineOutputs[stepName]}getAllOutputs(){return{...this.pipelineOutputs}}hasStepOutput(stepName){return stepName in this.pipelineOutputs}getSolver(stepName){return this[stepName]}};var clonePoint=point6=>({...point6});var cloneRoute=route=>({...route,route:route.route?.map(clonePoint),vias:route.vias?.map(via=>({...via}))});var cloneRoutes=routes=>routes.map(cloneRoute);var getBoundaryRect=node=>!node?.center||!node.width||!node.height?null:{minX:node.center.x-node.width/2,maxX:node.center.x+node.width/2,minY:node.center.y-node.height/2,maxY:node.center.y+node.height/2,width:node.width,height:node.height,center:node.center};var getRoutePointLayer=point6=>point6?.z===1?"bottom":"top";var TOP_LAYER_COLOR="#FF0000",BOTTOM_LAYER_COLOR="#0000FF";var GRID_COLOR="rgba(15, 23, 42, 0.14)",HIGHLIGHT_COLOR="rgba(245, 158, 11, 0.16)",ACCEPT_COLOR="rgba(16, 185, 129, 0.14)",REJECT_COLOR="rgba(220, 38, 38, 0.14)",CANDIDATE_STROKE="#000000";var BOUNDARY_SIDES=["top","bottom","left","right"];var getRouteStrokeColor=layer=>layer==="bottom"?BOTTOM_LAYER_COLOR:TOP_LAYER_COLOR;var splitRouteIntoLayerSegments=route=>{let routePoints=route.route??[],lines=[];if(routePoints.length<2)return lines;let currentLayer=getRoutePointLayer(routePoints[0]),currentSegment=[routePoints[0]];for(let index=1;index<routePoints.length;index+=1){let point6=routePoints[index],pointLayer=getRoutePointLayer(point6);if(pointLayer!==currentLayer){currentSegment.length>=2&&lines.push({points:currentSegment,strokeColor:getRouteStrokeColor(currentLayer),strokeWidth:route.traceThickness??.15,label:route.connectionName??"route"}),currentLayer=pointLayer,currentSegment=[routePoints[index-1],point6];continue}currentSegment.push(point6)}return currentSegment.length>=2&&lines.push({points:currentSegment,strokeColor:getRouteStrokeColor(currentLayer),strokeWidth:route.traceThickness??.15,label:route.connectionName??"route"}),lines};var createBoundaryGridLines=(boundary,step,side)=>{let lines=[],clampedStep=Math.max(step,.05);for(let x5=boundary.minX+clampedStep;x5<boundary.maxX-1e-6;x5+=clampedStep)lines.push({points:[{x:x5,y:boundary.minY},{x:x5,y:boundary.maxY}],strokeColor:GRID_COLOR,strokeWidth:.02,label:side?`grid:${side}:v`:"grid:v"});for(let y5=boundary.minY+clampedStep;y5<boundary.maxY-1e-6;y5+=clampedStep)lines.push({points:[{x:boundary.minX,y:y5},{x:boundary.maxX,y:y5}],strokeColor:GRID_COLOR,strokeWidth:.02,label:side?`grid:${side}:h`:"grid:h"});return lines};var createFinalFrame=(routes,originalRoutes,boundary,margin,gridStep)=>({title:`HighDensityRepair02 Final State (margin=${margin})`,routes,originalRoutes,overlayLines:createBoundaryGridLines(boundary,gridStep)});var createInitialFrame=(routes,boundary,margin,gridStep)=>({title:`HighDensityRepair02 Initial State (margin=${margin})`,routes,overlayLines:createBoundaryGridLines(boundary,gridStep)});var createOverlayLinesForRoutes=(routes,routeIndexes)=>Array.from(routeIndexes).flatMap(routeIndex=>splitRouteIntoLayerSegments(routes[routeIndex]).map(line2=>({...line2,strokeColor:CANDIDATE_STROKE,strokeWidth:line2.strokeWidth,label:`candidate:${line2.label}`})));var createSideStripRect=(boundary,side,depth,fill,label)=>{let stroke="rgba(0, 0, 0, 0)";switch(side){case"left":return{center:{x:boundary.minX+depth/2,y:boundary.center.y},width:depth,height:boundary.height,stroke,fill,label};case"right":return{center:{x:boundary.maxX-depth/2,y:boundary.center.y},width:depth,height:boundary.height,stroke,fill,label};case"top":return{center:{x:boundary.center.x,y:boundary.maxY-depth/2},width:boundary.width,height:depth,stroke,fill,label};case"bottom":return{center:{x:boundary.center.x,y:boundary.minY+depth/2},width:boundary.width,height:depth,stroke,fill,label}}};var createCandidateFrame=({routes,candidateRoutes,candidateRouteIndexes,originalRoutes,boundary,side,margin,moveAmount,gridStep,rejected,rejectionReason})=>{let routeNames=Array.from(candidateRouteIndexes).map(index=>candidateRoutes[index].connectionName??`route-${index}`);return{title:rejected?`${side} move rejected (${rejectionReason})`:`${side} move accepted`,routes:rejected?routes:candidateRoutes,originalRoutes,activeSide:side,candidateRouteNames:routeNames,overlayLines:[...createBoundaryGridLines(boundary,gridStep,side),...rejected?createOverlayLinesForRoutes(candidateRoutes,candidateRouteIndexes):[]],overlayRects:[createSideStripRect(boundary,side,margin,rejected?REJECT_COLOR:ACCEPT_COLOR,rejected?`rejected:${side}`:`accepted:${side}`)]}};var createSideAnalysisFrame=(routes,boundary,side,margin,moveAmount,hasObstacle,gridStep)=>({title:`${side} boundary analysis: move=${moveAmount.toFixed(3)} (${hasObstacle?"obstacle-side":"clear-side"})`,routes,activeSide:side,overlayLines:createBoundaryGridLines(boundary,gridStep,side),overlayRects:[createSideStripRect(boundary,side,margin,HIGHLIGHT_COLOR,`strip:${side}`)]});var getObstacleBounds=obstacle=>!obstacle.center||!obstacle.width||!obstacle.height?null:{minX:obstacle.center.x-obstacle.width/2,maxX:obstacle.center.x+obstacle.width/2,minY:obstacle.center.y-obstacle.height/2,maxY:obstacle.center.y+obstacle.height/2};var isObstacleNearSide=(obstacle,boundary,side,margin)=>{let bounds=getObstacleBounds(obstacle);if(!bounds)return!1;switch(side){case"left":return bounds.maxX>=boundary.minX-1e-6&&bounds.minX<=boundary.minX+margin+1e-6;case"right":return bounds.minX<=boundary.maxX+1e-6&&bounds.maxX>=boundary.maxX-margin-1e-6;case"top":return bounds.minY<=boundary.maxY+1e-6&&bounds.maxY>=boundary.maxY-margin-1e-6;case"bottom":return bounds.maxY>=boundary.minY-1e-6&&bounds.minY<=boundary.minY+margin+1e-6}};var getMoveAmountForSide=(sample,boundary,side,margin)=>{let hasObstacle=(sample?.adjacentObstacles??[]).some(obstacle=>isObstacleNearSide(obstacle,boundary,side,margin));return{hasObstacle,moveAmount:hasObstacle?margin:margin/2}};var pointsCoincide=(a2,b3)=>Math.abs(a2.x-b3.x)<=1e-6&&Math.abs(a2.y-b3.y)<=1e-6;var dedupeRoutePoints=points=>{let result=[];for(let point6 of points){let previous=result[result.length-1];previous&&previous.z===point6.z&&pointsCoincide(previous,point6)||result.push(point6)}return result};var createGridBridge=(start,end,delta,preferredAxisValue)=>Math.abs(delta.x)>1e-6?dedupeRoutePoints([start,{x:preferredAxisValue,y:start.y,z:start.z},{x:preferredAxisValue,y:end.y,z:end.z},end]):dedupeRoutePoints([start,{x:start.x,y:preferredAxisValue,z:start.z},{x:end.x,y:preferredAxisValue,z:end.z},end]);var distanceToSide=(point6,boundary,side)=>{switch(side){case"left":return point6.x-boundary.minX;case"right":return boundary.maxX-point6.x;case"top":return boundary.maxY-point6.y;case"bottom":return point6.y-boundary.minY}};var clamp01=value=>Math.max(0,Math.min(1,value));var dot=(a2,b3)=>a2.x*b3.x+a2.y*b3.y;var lengthSquared=point6=>point6.x*point6.x+point6.y*point6.y;var subtract2=(a2,b3)=>({x:a2.x-b3.x,y:a2.y-b3.y});var distancePointToSegment=(point6,start,end)=>{let segment2=subtract2(end,start),denom=lengthSquared(segment2);if(denom<=1e-6)return Math.sqrt(lengthSquared(subtract2(point6,start)));let t35=clamp01(dot(subtract2(point6,start),segment2)/denom),projection={x:start.x+segment2.x*t35,y:start.y+segment2.y*t35};return Math.sqrt(lengthSquared(subtract2(point6,projection)))};var getRouteGeometry=(route,routeIndex,cache2)=>{let cachedGeometry=cache2?.get(route);if(cachedGeometry)return cachedGeometry;let points=route.route??[],thickness=route.traceThickness??.15,geometry={segments:[],vias:(route.vias??[]).map(via=>({center:{x:via.x,y:via.y},radius:(via.diameter??route.viaDiameter??.15*2)/2,routeIndex}))};for(let pointIndex=0;pointIndex<points.length-1;pointIndex+=1)geometry.segments.push({start:points[pointIndex],end:points[pointIndex+1],routeIndex,pointIndex,thickness,layer:getRoutePointLayer(points[pointIndex])});return cache2?.set(route,geometry),geometry};var getRouteSegments=(route,routeIndex,cache2)=>getRouteGeometry(route,routeIndex,cache2).segments;var onSegment3=(a2,b3,c3)=>b3.x<=Math.max(a2.x,c3.x)+1e-6&&b3.x>=Math.min(a2.x,c3.x)-1e-6&&b3.y<=Math.max(a2.y,c3.y)+1e-6&&b3.y>=Math.min(a2.y,c3.y)-1e-6;var orientation3=(a2,b3,c3)=>(b3.y-a2.y)*(c3.x-b3.x)-(b3.x-a2.x)*(c3.y-b3.y);var segmentsIntersect=(a12,a2,b12,b22)=>{let o12=orientation3(a12,a2,b12),o22=orientation3(a12,a2,b22),o3=orientation3(b12,b22,a12),o4=orientation3(b12,b22,a2);return Math.abs(o12)<=1e-6&&onSegment3(a12,b12,a2)||Math.abs(o22)<=1e-6&&onSegment3(a12,b22,a2)||Math.abs(o3)<=1e-6&&onSegment3(b12,a12,b22)||Math.abs(o4)<=1e-6&&onSegment3(b12,a2,b22)?!0:o12>0!=o22>0&&o3>0!=o4>0};var segmentDistance=(a12,a2,b12,b22)=>segmentsIntersect(a12,a2,b12,b22)?0:Math.min(distancePointToSegment(a12,b12,b22),distancePointToSegment(a2,b12,b22),distancePointToSegment(b12,a12,a2),distancePointToSegment(b22,a12,a2));var getAxisValues=(startValue,endValue,minValue,maxValue,gridStep)=>{let values=new Set([startValue,endValue]),steps=Math.round((maxValue-minValue)/gridStep);for(let step=0;step<=steps;step+=1)values.add(Number((minValue+step*gridStep).toFixed(12)));return Array.from(values).sort((a2,b3)=>a2-b3)},compressPath=points=>{if(points.length<=2)return dedupeRoutePoints(points);let compressed=[points[0]];for(let index=1;index<points.length-1;index+=1){let previous=compressed[compressed.length-1],current2=points[index],next2=points[index+1],sameX=Math.abs(previous.x-current2.x)<=1e-6&&Math.abs(current2.x-next2.x)<=1e-6,sameY=Math.abs(previous.y-current2.y)<=1e-6&&Math.abs(current2.y-next2.y)<=1e-6;sameX||sameY||compressed.push(current2)}return compressed.push(points[points.length-1]),dedupeRoutePoints(compressed)},getRouteObstacleData=(surroundingRoutes,activeRouteIndex)=>{let routes=surroundingRoutes??[],segments=routes.flatMap((route,routeIndex)=>routeIndex===activeRouteIndex?[]:getRouteSegments(route,routeIndex)),vias=routes.flatMap((route,routeIndex)=>routeIndex===activeRouteIndex?[]:(route.vias??[]).map(via=>({center:{x:via.x,y:via.y},radius:(via.diameter??route.viaDiameter??(route.traceThickness??.15)*2)/2,routeIndex})));return{segments,vias}},getSegmentTravelScore=({from,to:to3,boundary,activeSide,margin,obstacleSegments,obstacleVias,traceThickness,routeLayer})=>{let midPoint={x:(from.x+to3.x)/2,y:(from.y+to3.y)/2},segmentLength=Math.hypot(to3.x-from.x,to3.y-from.y),activeBoundaryDistance=distanceToSide(midPoint,boundary,activeSide),otherSides=["left","right","top","bottom"].filter(side=>side!==activeSide),score=segmentLength;score+=Math.max(0,margin*2-activeBoundaryDistance)*8;for(let side of otherSides){let distance8=distanceToSide(midPoint,boundary,side);if(distance8<margin){score+=500+(margin-distance8)*200;continue}score+=Math.max(0,margin*2-distance8)*20}for(let segment2 of obstacleSegments){if(routeLayer===1&&segment2.layer!=="bottom"||routeLayer!==1&&segment2.layer!=="top")continue;let clearance=segmentDistance(from,to3,segment2.start,segment2.end)-(traceThickness+segment2.thickness)/2;if(clearance<-1e-6)return Number.POSITIVE_INFINITY;score+=Math.max(0,margin-clearance)*50}for(let via of obstacleVias){let clearance=distancePointToSegment(via.center,from,to3)-via.radius-traceThickness/2;if(clearance<-1e-6)return Number.POSITIVE_INFINITY;score+=Math.max(0,margin-clearance)*40}return score},heapPush=(heap,entry)=>{heap.push(entry);let index=heap.length-1;for(;index>0;){let parentIndex=Math.floor((index-1)/2);if(heap[parentIndex].score<=heap[index].score)break;[heap[parentIndex],heap[index]]=[heap[index],heap[parentIndex]],index=parentIndex}},heapPop=heap=>{if(heap.length===0)return null;let first=heap[0],last=heap.pop();if(heap.length===0||!last)return first;heap[0]=last;let index=0;for(;;){let leftIndex=index*2+1,rightIndex=leftIndex+1,smallestIndex=index;if(leftIndex<heap.length&&heap[leftIndex].score<heap[smallestIndex].score&&(smallestIndex=leftIndex),rightIndex<heap.length&&heap[rightIndex].score<heap[smallestIndex].score&&(smallestIndex=rightIndex),smallestIndex===index)return first;[heap[index],heap[smallestIndex]]=[heap[smallestIndex],heap[index]],index=smallestIndex}},findBestGridBridgePath=({start,end,boundary,activeSide,gridStep,margin,preferredAxisValue,activeRouteIndex,surroundingRoutes,traceThickness=.15})=>{if((start.z??0)!==(end.z??0))return null;let xValues=getAxisValues(start.x,end.x,boundary.minX,boundary.maxX,gridStep),yValues=getAxisValues(start.y,end.y,boundary.minY,boundary.maxY,gridStep),startXIndex=xValues.findIndex(value=>Math.abs(value-start.x)<=1e-6),startYIndex=yValues.findIndex(value=>Math.abs(value-start.y)<=1e-6),endXIndex=xValues.findIndex(value=>Math.abs(value-end.x)<=1e-6),endYIndex=yValues.findIndex(value=>Math.abs(value-end.y)<=1e-6);if(startXIndex===-1||startYIndex===-1||endXIndex===-1||endYIndex===-1)return null;let{segments,vias}=getRouteObstacleData(surroundingRoutes,activeRouteIndex),startKey=`${startXIndex}:${startYIndex}`,targetKey=`${endXIndex}:${endYIndex}`,openSet=[{key:startKey,score:0}],bestCosts=new Map([[startKey,0]]),previous=new Map,routeLayer=(start.z??0)===1?1:0,getPoint=(xIndex,yIndex)=>({x:xValues[xIndex],y:yValues[yIndex],z:start.z});for(;openSet.length>0;){let current2=heapPop(openSet);if(current2.score>(bestCosts.get(current2.key)??Number.POSITIVE_INFINITY))continue;if(current2.key===targetKey)break;let[xIndexText,yIndexText]=current2.key.split(":"),xIndex=Number(xIndexText),yIndex=Number(yIndexText),currentPoint=getPoint(xIndex,yIndex),neighbors=[[xIndex-1,yIndex],[xIndex+1,yIndex],[xIndex,yIndex-1],[xIndex,yIndex+1]].filter(([candidateXIndex,candidateYIndex])=>candidateXIndex>=0&&candidateYIndex>=0&&candidateXIndex<xValues.length&&candidateYIndex<yValues.length);for(let[nextXIndex,nextYIndex]of neighbors){let nextPoint=getPoint(nextXIndex,nextYIndex),travelScore=getSegmentTravelScore({from:currentPoint,to:nextPoint,boundary,activeSide,margin,obstacleSegments:segments,obstacleVias:vias,traceThickness,routeLayer});if(!Number.isFinite(travelScore))continue;let nextKey=`${nextXIndex}:${nextYIndex}`,axisBias=Math.abs(activeSide==="left"||activeSide==="right"?nextPoint.x-preferredAxisValue:nextPoint.y-preferredAxisValue),nextCost=current2.score+travelScore+axisBias*.2;nextCost>=(bestCosts.get(nextKey)??Number.POSITIVE_INFINITY)||(bestCosts.set(nextKey,nextCost),previous.set(nextKey,current2.key),heapPush(openSet,{key:nextKey,score:nextCost}))}}if(!bestCosts.has(targetKey))return null;let pathKeys=[targetKey];for(;pathKeys[0]!==startKey;){let priorKey=previous.get(pathKeys[0]);if(!priorKey)return null;pathKeys.unshift(priorKey)}return compressPath(pathKeys.map(key=>{let[xIndexText,yIndexText]=key.split(":");return getPoint(Number(xIndexText),Number(yIndexText))}))};var clamp5=(value,min,max)=>Math.min(max,Math.max(min,value));var snapToGrid=(value,step,origin,direction2="nearest")=>{let offset=(value-origin)/step,snappedOffset=direction2==="inward-positive"?Math.ceil(offset-1e-6):direction2==="inward-negative"?Math.floor(offset+1e-6):Math.round(offset);return origin+snappedOffset*step};var getPreferredAxisValue=(side,moveAmount,boundary,gridStep)=>{switch(side){case"left":return clamp5(snapToGrid(boundary.minX+moveAmount,gridStep,boundary.minX,"inward-positive"),boundary.minX,boundary.maxX);case"right":return clamp5(snapToGrid(boundary.maxX-moveAmount,gridStep,boundary.minX,"inward-negative"),boundary.minX,boundary.maxX);case"top":return clamp5(snapToGrid(boundary.maxY-moveAmount,gridStep,boundary.minY,"inward-negative"),boundary.minY,boundary.maxY);case"bottom":return clamp5(snapToGrid(boundary.minY+moveAmount,gridStep,boundary.minY,"inward-positive"),boundary.minY,boundary.maxY)}};var getSegmentLength=(start,end)=>Math.hypot(end.x-start.x,end.y-start.y);var isPointNearSide=(point6,boundary,side,margin)=>distanceToSide(point6,boundary,side)<=margin+1e-6;var getRouteSideContactState=(route,boundary,side,margin)=>{let points=route.route??[];if(points.length===0)return"none";let touchesAtEndpoint=!1;for(let index=0;index<points.length;index+=1){let point6=points[index];if(point6&&isPointNearSide(point6,boundary,side,margin)){if(index===0||index===points.length-1){touchesAtEndpoint=!0;continue}return"interior"}}for(let index=0;index<points.length-1;index+=1){let start=points[index],end=points[index+1];if(!(!start||!end)&&isPointNearSide(start,boundary,side,margin)&&isPointNearSide(end,boundary,side,margin)&&!(getSegmentLength(start,end)<=1e-6))return"interior"}return touchesAtEndpoint?"endpoint":"none"};var getRouteSideExposure=(route,boundary,side,margin)=>{let points=route.route??[],exposure=0;for(let index=0;index<points.length-1;index+=1){let start=points[index],end=points[index+1];!start||!end||isPointNearSide(start,boundary,side,margin)&&isPointNearSide(end,boundary,side,margin)&&(exposure+=getSegmentLength(start,end))}return exposure};var sideDirection=(side,amount)=>{switch(side){case"left":return{x:amount,y:0};case"right":return{x:-amount,y:0};case"top":return{x:0,y:-amount};case"bottom":return{x:0,y:amount}}};var createGridBridgeCandidates=({start,end,delta,preferredAxisValue})=>Math.abs(delta.x)>0?[createGridBridge(start,end,delta,preferredAxisValue),dedupeRoutePoints([start,{x:preferredAxisValue,y:start.y,z:start.z},{x:end.x,y:start.y,z:end.z},end]),dedupeRoutePoints([start,{x:start.x,y:end.y,z:start.z},{x:preferredAxisValue,y:end.y,z:end.z},end])]:[createGridBridge(start,end,delta,preferredAxisValue)],getSaferPreferredAxisValue=({side,moveAmount,boundary,gridStep,margin,targetAxisValue})=>{let preferredAxis=targetAxisValue??getPreferredAxisValue(side,moveAmount,boundary,gridStep),point6=side==="left"||side==="right"?{x:preferredAxis,y:boundary.center.y}:{x:boundary.center.x,y:preferredAxis};if(distanceToSide(point6,boundary,side)>margin)return preferredAxis;switch(side){case"left":return Math.min(preferredAxis+gridStep,boundary.maxX);case"right":return Math.max(preferredAxis-gridStep,boundary.minX);case"top":return Math.max(preferredAxis-gridStep,boundary.minY);case"bottom":return Math.min(preferredAxis+gridStep,boundary.maxY)}},createMovedRoute=(route,movableIndexes,boundary,gridStep,side,moveAmount,margin,surroundingRoutes,activeRouteIndex,targetAxisValue,translateOnly=!1)=>{let getContactRank=contactState=>contactState==="none"?0:contactState==="endpoint"?1:2,isScoreBetter=(score,bestScore2)=>score.worsenedOtherSideContacts!==bestScore2.worsenedOtherSideContacts?score.worsenedOtherSideContacts<bestScore2.worsenedOtherSideContacts:score.activeExposure!==bestScore2.activeExposure?score.activeExposure<bestScore2.activeExposure:score.minOtherSideClearance!==bestScore2.minOtherSideClearance?score.minOtherSideClearance>bestScore2.minOtherSideClearance:score.otherExposureIncrease!==bestScore2.otherExposureIncrease?score.otherExposureIncrease<bestScore2.otherExposureIncrease:score.otherExposure!==bestScore2.otherExposure?score.otherExposure<bestScore2.otherExposure:score.pointCount<bestScore2.pointCount,getRouteSafetyScore=candidateRoute=>{let otherSides=BOUNDARY_SIDES.filter(candidateSide=>candidateSide!==side),originalTouchingSides=new Set(otherSides.filter(candidateSide=>getRouteSideContactState(route,boundary,candidateSide,margin)!=="none")),activeExposure=getRouteSideExposure(candidateRoute,boundary,side,margin),worsenedOtherSideContacts=otherSides.reduce((sum,candidateSide)=>{let beforeContact=getRouteSideContactState(route,boundary,candidateSide,margin),afterContact=getRouteSideContactState(candidateRoute,boundary,candidateSide,margin);return sum+(getContactRank(afterContact)>getContactRank(beforeContact)?1:0)},0),otherExposureIncrease=otherSides.reduce((sum,candidateSide)=>{let beforeExposure=getRouteSideExposure(route,boundary,candidateSide,margin),afterExposure=getRouteSideExposure(candidateRoute,boundary,candidateSide,margin);return sum+Math.max(0,afterExposure-beforeExposure)},0),otherExposure=otherSides.reduce((sum,candidateSide)=>sum+getRouteSideExposure(candidateRoute,boundary,candidateSide,margin),0),candidatePoints=candidateRoute.route??[],minOtherSideClearance=candidatePoints.flatMap((point6,index)=>{let nextPoint=candidatePoints[index+1];return nextPoint?[point6,{x:(point6.x+nextPoint.x)/2,y:(point6.y+nextPoint.y)/2}]:[point6]}).reduce((minClearance,point6)=>{let pointClearance=otherSides.reduce((pointMin,candidateSide)=>{let distance8=distanceToSide(point6,boundary,candidateSide);return originalTouchingSides.has(candidateSide)&&distance8<=1e-6?pointMin:Math.min(pointMin,distance8)},Number.POSITIVE_INFINITY);return Number.isFinite(pointClearance)?Math.min(minClearance,pointClearance):minClearance},Number.POSITIVE_INFINITY);return{activeExposure,worsenedOtherSideContacts,otherExposureIncrease,otherExposure,minOtherSideClearance,pointCount:candidatePoints.length}},delta=sideDirection(side,moveAmount),originalPoints=route.route??[];if(originalPoints.length<2||movableIndexes.length===0)return cloneRoute(route);if(translateOnly||(route.vias?.length??0)>0){let translatedRoute=cloneRoute(route),translatedPoints=translatedRoute.route??[];for(let index of movableIndexes){let originalPoint=translatedPoints[index];originalPoint&&(translatedPoints[index]={...originalPoint,x:originalPoint.x+delta.x,y:originalPoint.y+delta.y})}for(let via of translatedRoute.vias??[])movableIndexes.some(index=>{let point6=route.route?.[index];return point6?pointsCoincide(point6,via):!1})&&(via.x+=delta.x,via.y+=delta.y);return translatedRoute}let nextRoute=cloneRoute(route);if(originalPoints.length===2&&movableIndexes.length===2&&movableIndexes[0]===0&&movableIndexes[1]===1){let start=originalPoints[0],end=originalPoints[1],preferredAxis2=getSaferPreferredAxisValue({side,moveAmount,boundary,gridStep,margin,targetAxisValue}),candidateRoutes2=createGridBridgeCandidates({start,end,delta,preferredAxisValue:preferredAxis2}).map(candidateBridge=>cloneRoute({...route,route:candidateBridge})),searchedPath2=findBestGridBridgePath({start,end,boundary,activeSide:side,gridStep,margin,preferredAxisValue:preferredAxis2,activeRouteIndex,surroundingRoutes,traceThickness:route.traceThickness});searchedPath2&&candidateRoutes2.push(cloneRoute({...route,route:searchedPath2}));let bestRoute2=candidateRoutes2[0],bestScore2=getRouteSafetyScore(bestRoute2);for(let candidateRoute of candidateRoutes2.slice(1)){let score=getRouteSafetyScore(candidateRoute);isScoreBetter(score,bestScore2)&&(bestRoute2=candidateRoute,bestScore2=score)}return bestRoute2}let firstIndex=movableIndexes[0],lastIndex=movableIndexes[movableIndexes.length-1],anchorStart=originalPoints[firstIndex-1],anchorEnd=originalPoints[lastIndex+1];if(!anchorStart||!anchorEnd)return nextRoute;let preferredAxis=getSaferPreferredAxisValue({side,moveAmount,boundary,gridStep,margin,targetAxisValue}),candidateRoutes=createGridBridgeCandidates({start:anchorStart,end:anchorEnd,delta,preferredAxisValue:preferredAxis}).map(candidateBridge=>cloneRoute({...route,route:dedupeRoutePoints([...originalPoints.slice(0,firstIndex),...candidateBridge.slice(1),...originalPoints.slice(lastIndex+2)])})),searchedPath=findBestGridBridgePath({start:anchorStart,end:anchorEnd,boundary,activeSide:side,gridStep,margin,preferredAxisValue:preferredAxis,activeRouteIndex,surroundingRoutes,traceThickness:route.traceThickness});searchedPath&&candidateRoutes.push(cloneRoute({...route,route:dedupeRoutePoints([...originalPoints.slice(0,firstIndex),...searchedPath.slice(1),...originalPoints.slice(lastIndex+2)])}));let bestRoute=candidateRoutes[0],bestScore=getRouteSafetyScore(bestRoute);for(let candidateRoute of candidateRoutes.slice(1)){let score=getRouteSafetyScore(candidateRoute);isScoreBetter(score,bestScore)&&(bestRoute=candidateRoute,bestScore=score)}return bestRoute};var segmentsShareEndpoint=(a2,b3)=>pointsCoincide(a2.start,b3.start)||pointsCoincide(a2.start,b3.end)||pointsCoincide(a2.end,b3.start)||pointsCoincide(a2.end,b3.end);var conflictKey=(firstRouteIndex,firstLayer,secondRouteIndex,secondLayer)=>firstRouteIndex<secondRouteIndex?`${firstRouteIndex}:${firstLayer}:${secondRouteIndex}:${secondLayer}`:`${secondRouteIndex}:${secondLayer}:${firstRouteIndex}:${firstLayer}`,pushConflict=(conflicts,firstRouteIndex,firstLayer,secondRouteIndex,secondLayer)=>{let key=conflictKey(firstRouteIndex,firstLayer,secondRouteIndex,secondLayer);if(!conflicts.has(key)){if(firstRouteIndex<secondRouteIndex){conflicts.set(key,{routeIndexes:[firstRouteIndex,secondRouteIndex],layers:[firstLayer,secondLayer]});return}conflicts.set(key,{routeIndexes:[secondRouteIndex,firstRouteIndex],layers:[secondLayer,firstLayer]})}},findClearanceConflicts=(routes,movedRouteIndexes,margin,geometryCache)=>{let routeGeometries=routes.map((route,routeIndex)=>getRouteGeometry(route,routeIndex,geometryCache)),conflicts=new Map;if(movedRouteIndexes.size===0)return[];let movedIndexes=Array.from(movedRouteIndexes);for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(movedGeometry)for(let first of movedGeometry.segments)for(let otherRouteIndex=0;otherRouteIndex<routeGeometries.length;otherRouteIndex+=1){if(otherRouteIndex===movedRouteIndex||movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let second of otherGeometry.segments){if(first.layer!==second.layer||segmentsShareEndpoint(first,second))continue;let minDistanceAllowed=margin+(first.thickness+second.thickness)/2-1e-6;segmentDistance(first.start,first.end,second.start,second.end)<minDistanceAllowed&&pushConflict(conflicts,first.routeIndex,first.layer,second.routeIndex,second.layer)}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(movedGeometry)for(let via of movedGeometry.vias)for(let otherRouteIndex=0;otherRouteIndex<routeGeometries.length;otherRouteIndex+=1){if(otherRouteIndex===movedRouteIndex||movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let segment2 of otherGeometry.segments){let minDistanceAllowed=margin+segment2.thickness/2+via.radius-1e-6;distancePointToSegment(via.center,segment2.start,segment2.end)<minDistanceAllowed&&pushConflict(conflicts,segment2.routeIndex,segment2.layer,via.routeIndex,"via")}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(movedGeometry)for(let segment2 of movedGeometry.segments)for(let otherRouteIndex=0;otherRouteIndex<routeGeometries.length;otherRouteIndex+=1){if(otherRouteIndex===movedRouteIndex)continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let via of otherGeometry.vias){let minDistanceAllowed=margin+segment2.thickness/2+via.radius-1e-6;distancePointToSegment(via.center,segment2.start,segment2.end)<minDistanceAllowed&&pushConflict(conflicts,segment2.routeIndex,segment2.layer,via.routeIndex,"via")}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(movedGeometry)for(let first of movedGeometry.vias)for(let otherRouteIndex=0;otherRouteIndex<routeGeometries.length;otherRouteIndex+=1){if(otherRouteIndex===movedRouteIndex||movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let second of otherGeometry.vias){let minDistanceAllowed=margin+first.radius+second.radius-1e-6;Math.hypot(first.center.x-second.center.x,first.center.y-second.center.y)<minDistanceAllowed&&pushConflict(conflicts,first.routeIndex,"via",second.routeIndex,"via")}}}return Array.from(conflicts.values())};var findClearanceConflictPairs=(routes,movedRouteIndexes,margin,geometryCache)=>findClearanceConflicts(routes,movedRouteIndexes,margin,geometryCache).map(({routeIndexes})=>routeIndexes);var getRouteBoundaryOverflow=(route,boundary)=>Math.max(0,...(route.route??[]).map(point6=>Math.max(boundary.minX-point6.x,point6.x-boundary.maxX,boundary.minY-point6.y,point6.y-boundary.maxY,0)));var getRouteMovableIndexes=(route,boundary,side,margin)=>{let points=route.route??[],movableIndexes=[],movableIndexSet=new Set,firstMovableIndex=1,lastMovableIndex=points.length-2;for(;firstMovableIndex<points.length-1&&pointsCoincide(points[firstMovableIndex],points[0]);)firstMovableIndex+=1;for(;lastMovableIndex>0&&pointsCoincide(points[lastMovableIndex],points[points.length-1]);)lastMovableIndex-=1;for(let index=firstMovableIndex;index<=lastMovableIndex;index+=1)isPointNearSide(points[index],boundary,side,margin)&&(movableIndexSet.add(index),movableIndexes.push(index));for(let queueIndex=0;queueIndex<movableIndexes.length;queueIndex+=1){let activeIndex=movableIndexes[queueIndex],activePoint=points[activeIndex];if(activePoint)for(let index=firstMovableIndex;index<=lastMovableIndex;index+=1){if(movableIndexSet.has(index))continue;let point6=points[index];point6&&point6.z!==activePoint.z&&pointsCoincide(point6,activePoint)&&(movableIndexSet.add(index),movableIndexes.push(index))}}return movableIndexes.length===0&&points.length===2&&points.some(point6=>isPointNearSide(point6,boundary,side,margin))?[0,1]:(movableIndexes.sort((a2,b3)=>a2-b3),movableIndexes)};var getRoutePushableIndexes=(route,preferredLayers)=>{let points=route.route??[],pushableIndexes=[],pushableIndexSet=new Set,wantsAllLayers=preferredLayers.length===0||preferredLayers.includes("via");if(points.length===2)return[0,1];for(let index=1;index<points.length-1;index+=1){if(wantsAllLayers){pushableIndexSet.add(index),pushableIndexes.push(index);continue}preferredLayers.includes(getRoutePointLayer(points[index]))&&(pushableIndexSet.add(index),pushableIndexes.push(index))}for(let queueIndex=0;queueIndex<pushableIndexes.length;queueIndex+=1){let activeIndex=pushableIndexes[queueIndex],activePoint=points[activeIndex];if(activePoint)for(let index=1;index<points.length-1;index+=1){if(pushableIndexSet.has(index))continue;let point6=points[index];point6&&point6.z!==activePoint.z&&pointsCoincide(point6,activePoint)&&(pushableIndexSet.add(index),pushableIndexes.push(index))}}return pushableIndexes.sort((a2,b3)=>a2-b3),pushableIndexes};var getEndpointBoundarySides=(route,boundary,endpointIndex)=>{let points=route.route??[],point6=endpointIndex===0?points[0]:points[points.length-1];return point6?BOUNDARY_SIDES.filter(side=>distanceToSide(point6,boundary,side)<=1e-6):[]},routeEndpointsStayOnBoundarySides=(originalRoute,candidateRoute,boundary)=>{let originalPoints=originalRoute.route??[],candidatePoints=candidateRoute.route??[];if(originalPoints.length===0||candidatePoints.length===0)return!0;for(let endpointIndex of[0,-1]){let originalSides=getEndpointBoundarySides(originalRoute,boundary,endpointIndex);if(originalSides.length===0)continue;let candidatePoint=endpointIndex===0?candidatePoints[0]:candidatePoints[candidatePoints.length-1];if(!candidatePoint)return!1;for(let side of originalSides)if(distanceToSide(candidatePoint,boundary,side)>1e-6)return!1}return!0};var wouldIncreaseExposureOnOtherSides=(currentRoutes,candidateRoutes,candidateRouteIndexes,boundary,activeSide,margin)=>Array.from(candidateRouteIndexes).some(index=>{let previousRoute=currentRoutes[index],nextRoute=candidateRoutes[index];return BOUNDARY_SIDES.filter(side=>side!==activeSide).some(otherSide=>{let previousContactState=getRouteSideContactState(previousRoute,boundary,otherSide,margin),nextContactState=getRouteSideContactState(nextRoute,boundary,otherSide,margin);return previousContactState==="none"&&nextContactState!=="none"})});var evaluateRouteMove=({currentRoutes,routeIndex,side,boundary,margin,gridStep,moveAmount,geometryCache})=>{let getConflictKeys=(routes,movedIndexes)=>new Set(findClearanceConflicts(routes,movedIndexes,margin,geometryCache).map(({routeIndexes,layers})=>`${routeIndexes[0]}:${layers[0]}:${routeIndexes[1]}:${layers[1]}`)),route=currentRoutes[routeIndex],isTwoPointRoute=(route.route?.length??0)===2,movableIndexes=getRouteMovableIndexes(route,boundary,side,margin);if(movableIndexes.length===0)return null;let candidateRouteIndexes=new Set,movedTwoPointRouteIndexes=new Set,candidateRoutes=cloneRoutes(currentRoutes),rejected=!1,rejectionReason="overlap",queuedRouteIndexes=new Set([routeIndex]),queuedRouteLayers=new Map([[routeIndex,new Set]]),routeQueue=[routeIndex],routeQueueIndex=0;for(;routeQueueIndex<routeQueue.length&&!rejected;){let activeRouteIndex=routeQueue[routeQueueIndex];if(routeQueueIndex+=1,queuedRouteIndexes.delete(activeRouteIndex),candidateRouteIndexes.has(activeRouteIndex))continue;let activeRoute=candidateRoutes[activeRouteIndex],activePreferredLayers=Array.from(queuedRouteLayers.get(activeRouteIndex)??[]);queuedRouteLayers.delete(activeRouteIndex);let activeMovableIndexes=activeRouteIndex===routeIndex?getRouteMovableIndexes(activeRoute,boundary,side,margin):getRoutePushableIndexes(activeRoute,activePreferredLayers);if(activeMovableIndexes.length===0){if(activeRouteIndex===routeIndex)return null;rejected=!0,rejectionReason="eventual-overlap";break}let activePoints=activeRoute.route??[],targetAxisValue=activeRouteIndex===routeIndex?void 0:side==="left"||side==="right"?(activePoints[activeMovableIndexes[0]]?.x??0)+(side==="left"?moveAmount:-moveAmount):(activePoints[activeMovableIndexes[0]]?.y??0)+(side==="top"?-moveAmount:moveAmount);candidateRoutes[activeRouteIndex]=createMovedRoute(activeRoute,activeMovableIndexes,boundary,gridStep,side,moveAmount,margin,candidateRoutes,activeRouteIndex,targetAxisValue,activeRouteIndex!==routeIndex),candidateRouteIndexes.add(activeRouteIndex),(activeRoute.route?.length??0)===2&&movedTwoPointRouteIndexes.add(activeRouteIndex);let originalBoundaryOverflow=getRouteBoundaryOverflow(currentRoutes[activeRouteIndex],boundary);if(getRouteBoundaryOverflow(candidateRoutes[activeRouteIndex],boundary)>originalBoundaryOverflow+1e-6){rejected=!0,rejectionReason="boundary";break}if(!routeEndpointsStayOnBoundarySides(currentRoutes[activeRouteIndex],candidateRoutes[activeRouteIndex],boundary)){rejected=!0,rejectionReason="endpoint-boundary";break}let adjacencyConflicts=findClearanceConflicts(candidateRoutes,new Set([activeRouteIndex]),margin,geometryCache);for(let conflict of adjacencyConflicts){let[firstRouteIndex,secondRouteIndex]=conflict.routeIndexes,firstMoved=candidateRouteIndexes.has(firstRouteIndex),secondMoved=candidateRouteIndexes.has(secondRouteIndex);if(firstMoved&&secondMoved)continue;let nextRouteIndex=firstMoved?secondRouteIndex:firstRouteIndex,nextRouteLayer=firstMoved?conflict.layers[1]:conflict.layers[0];if(!candidateRouteIndexes.has(nextRouteIndex)&&!queuedRouteIndexes.has(nextRouteIndex)){queuedRouteIndexes.add(nextRouteIndex),routeQueue.push(nextRouteIndex),queuedRouteLayers.set(nextRouteIndex,new Set([nextRouteLayer]));continue}if(queuedRouteIndexes.has(nextRouteIndex)){let existingLayers=queuedRouteLayers.get(nextRouteIndex)??new Set;existingLayers.add(nextRouteLayer),queuedRouteLayers.set(nextRouteIndex,existingLayers)}}}if(!rejected){let currentConflictKeys=getConflictKeys(currentRoutes,candidateRouteIndexes),candidateConflictKeys=getConflictKeys(candidateRoutes,candidateRouteIndexes);for(let conflictKey2 of candidateConflictKeys)if(!currentConflictKeys.has(conflictKey2)){rejected=!0,rejectionReason="eventual-overlap";break}}return!rejected&&findClearanceConflictPairs(candidateRoutes,candidateRouteIndexes,0,geometryCache).length>0&&(rejected=!0,rejectionReason="eventual-overlap"),!rejected&&wouldIncreaseExposureOnOtherSides(currentRoutes,candidateRoutes,candidateRouteIndexes,boundary,side,margin)&&(rejected=!0,rejectionReason="side-regression"),{isTwoPointRoute,movableIndexes,candidateRouteIndexes,movedTwoPointRouteIndexes,candidateRoutes,rejected,rejectionReason}};var processBoundarySide=({side,sample,boundary,margin,gridStep,repairedRoutes,frames,captureProgressFrames,lockedTwoPointRoutes,geometryCache})=>{let{hasObstacle,moveAmount}=getMoveAmountForSide(sample,boundary,side,margin);captureProgressFrames&&frames.push(createSideAnalysisFrame(cloneRoutes(repairedRoutes),boundary,side,margin,moveAmount,hasObstacle,gridStep));let attemptedRoutes=new Set;for(let routeIndex=0;routeIndex<repairedRoutes.length;routeIndex+=1){if(attemptedRoutes.has(routeIndex)||lockedTwoPointRoutes.has(routeIndex)||(repairedRoutes[routeIndex].route?.length??0)===2&&!hasObstacle)continue;let evaluation=evaluateRouteMove({currentRoutes:repairedRoutes,routeIndex,side,boundary,margin,gridStep,moveAmount,geometryCache});if(evaluation){if(captureProgressFrames&&frames.push(createCandidateFrame({routes:cloneRoutes(repairedRoutes),candidateRoutes:evaluation.candidateRoutes,candidateRouteIndexes:evaluation.candidateRouteIndexes,originalRoutes:evaluation.rejected?void 0:Array.from(evaluation.candidateRouteIndexes).map(index=>cloneRoute(repairedRoutes[index])),boundary,side,margin,moveAmount,gridStep,rejected:evaluation.rejected,rejectionReason:evaluation.rejectionReason})),!evaluation.rejected){repairedRoutes.splice(0,repairedRoutes.length,...evaluation.candidateRoutes);for(let movedTwoPointRouteIndex of evaluation.movedTwoPointRouteIndexes)lockedTwoPointRoutes.add(movedTwoPointRouteIndex)}for(let candidateRouteIndex of evaluation.candidateRouteIndexes)attemptedRoutes.add(candidateRouteIndex)}}};var buildRepairFrames=(sample,requestedMargin,captureProgressFrames=!1)=>{let boundary=getBoundaryRect(sample?.nodeWithPortPoints),baseRoutes=cloneRoutes(sample?.nodeHdRoutes??[]),repairedRoutes=cloneRoutes(baseRoutes),margin=Math.max(requestedMargin??.4,.05);if(!boundary)return{boundary:null,baseRoutes,repairedRoutes,margin,gridStep:Math.max(margin/2,.05),frames:[{title:"HighDensityRepair02 Missing Boundary",routes:repairedRoutes}]};let gridStep=Math.max(margin/2,.05),frames=captureProgressFrames?[createInitialFrame(cloneRoutes(repairedRoutes),boundary,margin,gridStep)]:[],lockedTwoPointRoutes=new Set,geometryCache=new WeakMap;for(let side of BOUNDARY_SIDES)processBoundarySide({side,sample,boundary,margin,gridStep,repairedRoutes,frames,captureProgressFrames,lockedTwoPointRoutes,geometryCache});return frames.push(createFinalFrame(cloneRoutes(repairedRoutes),cloneRoutes(baseRoutes),boundary,margin,gridStep)),{boundary,baseRoutes,repairedRoutes,frames,margin,gridStep}};var HighDensityRepairSolver=class extends BaseSolver2{constructor(params={}){super();this.params=params;this.frames=[];this.currentFrameIndex=0;this.repairedRoutes=[]}_setup(){this.buildFrames(),this.stats={margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex}}_step(){if(this.frames.length<=1){this.solved=!0;return}this.currentFrameIndex<this.frames.length-1&&(this.currentFrameIndex+=1),this.stats={...this.stats,currentFrame:this.currentFrameIndex,title:this.frames[this.currentFrameIndex]?.title},this.currentFrameIndex>=this.frames.length-1&&(this.solved=!0)}getConstructorParams(){return[this.params]}getOutput(){return{margin:this.params.margin??.4,repairedRoutes:this.repairedRoutes,frameCount:this.frames.length}}buildFrames(){let result=buildRepairFrames(this.params.sample,this.params.margin,this.params.captureProgressFrames??!1);this.frames=result.frames,this.repairedRoutes=result.repairedRoutes}visualize(){let sample=this.params.sample,node=sample?.nodeWithPortPoints,obstacles=sample?.adjacentObstacles??[],frame=this.frames[this.currentFrameIndex]??{title:"HighDensityRepair02",routes:cloneRoutes(sample?.nodeHdRoutes??[])},boundary=getBoundaryRect(node),nodeRect=boundary&&node?.capacityMeshNodeId?[{center:boundary.center,width:boundary.width,height:boundary.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:node.capacityMeshNodeId}]:boundary?[{center:boundary.center,width:boundary.width,height:boundary.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:"capacity-node"}]:[],obstacleRects=obstacles.filter(obstacle=>obstacle.center&&obstacle.width&&obstacle.height).map((obstacle,idx)=>({center:obstacle.center,width:obstacle.width,height:obstacle.height,stroke:obstacle.type==="oval"?"#a855f7":"#dc2626",fill:obstacle.type==="oval"?"rgba(168, 85, 247, 0.12)":"rgba(220, 38, 38, 0.08)",label:obstacle.type?`obstacle:${obstacle.type}:${idx}`:`obstacle:${idx}`})),points=[...(node?.portPoints??[]).map(portPoint=>({x:portPoint.x,y:portPoint.y,color:"#0f766e",label:portPoint.connectionName??portPoint.portPointId??"port-point"})),...frame.routes.flatMap(route=>route.route??[]).map(routePoint=>({x:routePoint.x,y:routePoint.y,color:getRoutePointLayer(routePoint)==="bottom"?BOTTOM_LAYER_COLOR:"#0ea5e9",label:""})),...frame.overlayPoints??[]],lines=[...(frame.originalRoutes??[]).flatMap(route=>splitRouteIntoLayerSegments(route).map(line2=>({...line2,strokeColor:"#111111",strokeWidth:Math.max(line2.strokeWidth*.6,.05),label:`original:${line2.label}`}))),...frame.routes.filter(route=>(route.route?.length??0)>=2).flatMap(route=>splitRouteIntoLayerSegments(route)),...frame.overlayLines??[]],circles=frame.routes.flatMap(route=>(route.vias??[]).map(via=>({center:{x:via.x,y:via.y},radius:(via.diameter??route.viaDiameter??.3)/2,stroke:"#7c3aed",fill:"rgba(124, 58, 237, 0.2)",label:route.connectionName?`via:${route.connectionName}`:"via"})));return{coordinateSystem:"cartesian",title:frame.title,rects:[...nodeRect,...obstacleRects,...frame.overlayRects??[]],points,lines,circles,arrows:frame.overlayArrows}}};var t=Object.create,e2=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,r3=(t35,e4)=>function(){return e4||(0,t35[o(t35)[0]])((e4={exports:{}}).exports,e4),e4.exports},a=(r4,a2,c3)=>(c3=r4!=null?t(i(r4)):{},((t35,i2,r5,a3)=>{if(i2&&typeof i2=="object"||typeof i2=="function")for(let c4 of o(i2))s.call(t35,c4)||c4===r5||e2(t35,c4,{get:()=>i2[c4],enumerable:!(a3=n(i2,c4))||a3.enumerable});return t35})(!a2&&r4&&r4.__esModule?c3:e2(c3,"default",{value:r4,enumerable:!0}),r4)),c=r3({"node_modules/is-buffer/index.js"(t35,e4){function n3(t36){return!!t36.constructor&&typeof t36.constructor.isBuffer=="function"&&t36.constructor.isBuffer(t36)}e4.exports=function(t36){return t36!=null&&(n3(t36)||(function(t37){return typeof t37.readFloatLE=="function"&&typeof t37.slice=="function"&&n3(t37.slice(0,0))})(t36)||!!t36._isBuffer)}}}),h=r3({"node_modules/kind-of/index.js"(t35,e4){var n3=c(),o3=Object.prototype.toString;e4.exports=function(t36){if(t36===void 0)return"undefined";if(t36===null)return"null";if(t36===!0||t36===!1||t36 instanceof Boolean)return"boolean";if(typeof t36=="string"||t36 instanceof String)return"string";if(typeof t36=="number"||t36 instanceof Number)return"number";if(typeof t36=="function"||t36 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t36))return"array";if(t36 instanceof RegExp)return"regexp";if(t36 instanceof Date)return"date";var e5=o3.call(t36);return e5==="[object RegExp]"?"regexp":e5==="[object Date]"?"date":e5==="[object Arguments]"?"arguments":e5==="[object Error]"?"error":n3(t36)?"buffer":e5==="[object Set]"?"set":e5==="[object WeakSet]"?"weakset":e5==="[object Map]"?"map":e5==="[object WeakMap]"?"weakmap":e5==="[object Symbol]"?"symbol":e5==="[object Int8Array]"?"int8array":e5==="[object Uint8Array]"?"uint8array":e5==="[object Uint8ClampedArray]"?"uint8clampedarray":e5==="[object Int16Array]"?"int16array":e5==="[object Uint16Array]"?"uint16array":e5==="[object Int32Array]"?"int32array":e5==="[object Uint32Array]"?"uint32array":e5==="[object Float32Array]"?"float32array":e5==="[object Float64Array]"?"float64array":"object"}}}),l=r3({"node_modules/rename-keys/index.js"(t35,e4){(function(){function t36(t37,e5){if(typeof e5!="function")return t37;var n3={};for(var o3 in t37)Object.prototype.hasOwnProperty.call(t37,o3)&&(n3[e5(o3,t37[o3])||o3]=t37[o3]);return n3}e4!==void 0&&e4.exports?e4.exports=t36:typeof define=="function"&&define.amd?define([],function(){return t36}):window.rename=t36})()}}),d=r3({"node_modules/deep-rename-keys/index.js"(t35,e4){var n3=h(),o3=l();e4.exports=function t36(e5,i2){var s2=n3(e5);if(s2!=="object"&&s2!=="array")throw new Error("expected an object");var r4=[];for(var a2 in s2==="object"&&(e5=o3(e5,i2),r4={}),e5)if(e5.hasOwnProperty(a2)){var c3=e5[a2];n3(c3)==="object"||n3(c3)==="array"?r4[a2]=t36(c3,i2):r4[a2]=c3}return r4}}}),u3=r3({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t35,e4){var n3=Object.prototype.hasOwnProperty,o3="~";function i2(){}function s2(t36,e5,n4){this.fn=t36,this.context=e5,this.once=n4||!1}function r4(){this._events=new i2,this._eventsCount=0}Object.create&&(i2.prototype=Object.create(null),new i2().__proto__||(o3=!1)),r4.prototype.eventNames=function(){var t36,e5,i3=[];if(this._eventsCount===0)return i3;for(e5 in t36=this._events)n3.call(t36,e5)&&i3.push(o3?e5.slice(1):e5);return Object.getOwnPropertySymbols?i3.concat(Object.getOwnPropertySymbols(t36)):i3},r4.prototype.listeners=function(t36,e5){var n4=o3?o3+t36:t36,i3=this._events[n4];if(e5)return!!i3;if(!i3)return[];if(i3.fn)return[i3.fn];for(var s3=0,r5=i3.length,a2=new Array(r5);s3<r5;s3++)a2[s3]=i3[s3].fn;return a2},r4.prototype.emit=function(t36,e5,n4,i3,s3,r5){var a2=o3?o3+t36:t36;if(!this._events[a2])return!1;var c3,h4,l3=this._events[a2],d3=arguments.length;if(l3.fn){switch(l3.once&&this.removeListener(t36,l3.fn,void 0,!0),d3){case 1:return l3.fn.call(l3.context),!0;case 2:return l3.fn.call(l3.context,e5),!0;case 3:return l3.fn.call(l3.context,e5,n4),!0;case 4:return l3.fn.call(l3.context,e5,n4,i3),!0;case 5:return l3.fn.call(l3.context,e5,n4,i3,s3),!0;case 6:return l3.fn.call(l3.context,e5,n4,i3,s3,r5),!0}for(h4=1,c3=new Array(d3-1);h4<d3;h4++)c3[h4-1]=arguments[h4];l3.fn.apply(l3.context,c3)}else{var u4,p4=l3.length;for(h4=0;h4<p4;h4++)switch(l3[h4].once&&this.removeListener(t36,l3[h4].fn,void 0,!0),d3){case 1:l3[h4].fn.call(l3[h4].context);break;case 2:l3[h4].fn.call(l3[h4].context,e5);break;case 3:l3[h4].fn.call(l3[h4].context,e5,n4);break;case 4:l3[h4].fn.call(l3[h4].context,e5,n4,i3);break;default:if(!c3)for(u4=1,c3=new Array(d3-1);u4<d3;u4++)c3[u4-1]=arguments[u4];l3[h4].fn.apply(l3[h4].context,c3)}}return!0},r4.prototype.on=function(t36,e5,n4){var i3=new s2(e5,n4||this),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.once=function(t36,e5,n4){var i3=new s2(e5,n4||this,!0),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.removeListener=function(t36,e5,n4,s3){var r5=o3?o3+t36:t36;if(!this._events[r5])return this;if(!e5)return--this._eventsCount===0?this._events=new i2:delete this._events[r5],this;var a2=this._events[r5];if(a2.fn)a2.fn!==e5||s3&&!a2.once||n4&&a2.context!==n4||(--this._eventsCount===0?this._events=new i2:delete this._events[r5]);else{for(var c3=0,h4=[],l3=a2.length;c3<l3;c3++)(a2[c3].fn!==e5||s3&&!a2[c3].once||n4&&a2[c3].context!==n4)&&h4.push(a2[c3]);h4.length?this._events[r5]=h4.length===1?h4[0]:h4:--this._eventsCount===0?this._events=new i2:delete this._events[r5]}return this},r4.prototype.removeAllListeners=function(t36){var e5;return t36?(e5=o3?o3+t36:t36,this._events[e5]&&(--this._eventsCount===0?this._events=new i2:delete this._events[e5])):(this._events=new i2,this._eventsCount=0),this},r4.prototype.off=r4.prototype.removeListener,r4.prototype.addListener=r4.prototype.on,r4.prototype.setMaxListeners=function(){return this},r4.prefixed=o3,r4.EventEmitter=r4,e4!==void 0&&(e4.exports=r4)}}),p=r3({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t35,e4){var n3=Object.prototype.hasOwnProperty,o3="~";function i2(){}function s2(t36,e5,n4){this.fn=t36,this.context=e5,this.once=n4||!1}function r4(){this._events=new i2,this._eventsCount=0}Object.create&&(i2.prototype=Object.create(null),new i2().__proto__||(o3=!1)),r4.prototype.eventNames=function(){var t36,e5,i3=[];if(this._eventsCount===0)return i3;for(e5 in t36=this._events)n3.call(t36,e5)&&i3.push(o3?e5.slice(1):e5);return Object.getOwnPropertySymbols?i3.concat(Object.getOwnPropertySymbols(t36)):i3},r4.prototype.listeners=function(t36,e5){var n4=o3?o3+t36:t36,i3=this._events[n4];if(e5)return!!i3;if(!i3)return[];if(i3.fn)return[i3.fn];for(var s3=0,r5=i3.length,a2=new Array(r5);s3<r5;s3++)a2[s3]=i3[s3].fn;return a2},r4.prototype.emit=function(t36,e5,n4,i3,s3,r5){var a2=o3?o3+t36:t36;if(!this._events[a2])return!1;var c3,h4,l3=this._events[a2],d3=arguments.length;if(l3.fn){switch(l3.once&&this.removeListener(t36,l3.fn,void 0,!0),d3){case 1:return l3.fn.call(l3.context),!0;case 2:return l3.fn.call(l3.context,e5),!0;case 3:return l3.fn.call(l3.context,e5,n4),!0;case 4:return l3.fn.call(l3.context,e5,n4,i3),!0;case 5:return l3.fn.call(l3.context,e5,n4,i3,s3),!0;case 6:return l3.fn.call(l3.context,e5,n4,i3,s3,r5),!0}for(h4=1,c3=new Array(d3-1);h4<d3;h4++)c3[h4-1]=arguments[h4];l3.fn.apply(l3.context,c3)}else{var u4,p4=l3.length;for(h4=0;h4<p4;h4++)switch(l3[h4].once&&this.removeListener(t36,l3[h4].fn,void 0,!0),d3){case 1:l3[h4].fn.call(l3[h4].context);break;case 2:l3[h4].fn.call(l3[h4].context,e5);break;case 3:l3[h4].fn.call(l3[h4].context,e5,n4);break;case 4:l3[h4].fn.call(l3[h4].context,e5,n4,i3);break;default:if(!c3)for(u4=1,c3=new Array(d3-1);u4<d3;u4++)c3[u4-1]=arguments[u4];l3[h4].fn.apply(l3[h4].context,c3)}}return!0},r4.prototype.on=function(t36,e5,n4){var i3=new s2(e5,n4||this),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.once=function(t36,e5,n4){var i3=new s2(e5,n4||this,!0),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.removeListener=function(t36,e5,n4,s3){var r5=o3?o3+t36:t36;if(!this._events[r5])return this;if(!e5)return--this._eventsCount===0?this._events=new i2:delete this._events[r5],this;var a2=this._events[r5];if(a2.fn)a2.fn!==e5||s3&&!a2.once||n4&&a2.context!==n4||(--this._eventsCount===0?this._events=new i2:delete this._events[r5]);else{for(var c3=0,h4=[],l3=a2.length;c3<l3;c3++)(a2[c3].fn!==e5||s3&&!a2[c3].once||n4&&a2[c3].context!==n4)&&h4.push(a2[c3]);h4.length?this._events[r5]=h4.length===1?h4[0]:h4:--this._eventsCount===0?this._events=new i2:delete this._events[r5]}return this},r4.prototype.removeAllListeners=function(t36){var e5;return t36?(e5=o3?o3+t36:t36,this._events[e5]&&(--this._eventsCount===0?this._events=new i2:delete this._events[e5])):(this._events=new i2,this._eventsCount=0),this},r4.prototype.off=r4.prototype.removeListener,r4.prototype.addListener=r4.prototype.on,r4.prototype.setMaxListeners=function(){return this},r4.prefixed=o3,r4.EventEmitter=r4,e4!==void 0&&(e4.exports=r4)}}),f=r3({"node_modules/xml-lexer/dist/lexer.js"(t35,e4){function n3(t36,e5,n4){return e5 in t36?Object.defineProperty(t36,e5,{value:n4,enumerable:!0,configurable:!0,writable:!0}):t36[e5]=n4,t36}var o3=p(),i2=function(){},s2={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},r4={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a2={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c3={" ":r4.space," ":r4.space,"\n":r4.space,"\r":r4.space,"<":r4.lt,">":r4.gt,'"':r4.quote,"'":r4.quote,"=":r4.equal,"/":r4.slash};e4.exports={State:s2,Action:r4,Type:a2,create:function(t36){var e5,h4,l3,d3,u4,p4,f2,g7,m3,y5;t36=Object.assign({debug:!1},t36);var x5=new o3,v5=s2.data,b3="",S3="",I5="",P5="",_5="",N6="",M5=function(e6,n4){if(S3[0]!=="?"&&S3[0]!=="!"){var o4={type:e6,value:n4};t36.debug&&console.log("emit:",o4),x5.emit("data",o4)}};x5.stateMachine=(n3(y5={},s2.data,(n3(e5={},r4.lt,function(){b3.trim()&&M5(a2.text,b3),S3="",_5=!1,v5=s2.tagBegin}),n3(e5,r4.char,function(t37){b3+=t37}),e5)),n3(y5,s2.cdata,n3({},r4.char,function(t37){(b3+=t37).substr(-3)==="]]>"&&(M5(a2.text,b3.slice(0,-3)),b3="",v5=s2.data)})),n3(y5,s2.tagBegin,(n3(h4={},r4.space,i2),n3(h4,r4.char,function(t37){S3=t37,v5=s2.tagName}),n3(h4,r4.slash,function(){S3="",_5=!0}),h4)),n3(y5,s2.tagName,(n3(l3={},r4.space,function(){_5?v5=s2.tagEnd:(v5=s2.attributeNameStart,M5(a2.openTag,S3))}),n3(l3,r4.gt,function(){M5(_5?a2.closeTag:a2.openTag,S3),b3="",v5=s2.data}),n3(l3,r4.slash,function(){v5=s2.tagEnd,M5(a2.openTag,S3)}),n3(l3,r4.char,function(t37){(S3+=t37)==="![CDATA["&&(v5=s2.cdata,b3="",S3="")}),l3)),n3(y5,s2.tagEnd,(n3(d3={},r4.gt,function(){M5(a2.closeTag,S3),b3="",v5=s2.data}),n3(d3,r4.char,i2),d3)),n3(y5,s2.attributeNameStart,(n3(u4={},r4.char,function(t37){I5=t37,v5=s2.attributeName}),n3(u4,r4.gt,function(){b3="",v5=s2.data}),n3(u4,r4.space,i2),n3(u4,r4.slash,function(){_5=!0,v5=s2.tagEnd}),u4)),n3(y5,s2.attributeName,(n3(p4={},r4.space,function(){v5=s2.attributeNameEnd}),n3(p4,r4.equal,function(){M5(a2.attributeName,I5),v5=s2.attributeValueBegin}),n3(p4,r4.gt,function(){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),b3="",v5=s2.data}),n3(p4,r4.slash,function(){_5=!0,P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),v5=s2.tagEnd}),n3(p4,r4.char,function(t37){I5+=t37}),p4)),n3(y5,s2.attributeNameEnd,(n3(f2={},r4.space,i2),n3(f2,r4.equal,function(){M5(a2.attributeName,I5),v5=s2.attributeValueBegin}),n3(f2,r4.gt,function(){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),b3="",v5=s2.data}),n3(f2,r4.char,function(t37){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),I5=t37,v5=s2.attributeName}),f2)),n3(y5,s2.attributeValueBegin,(n3(g7={},r4.space,i2),n3(g7,r4.quote,function(t37){N6=t37,P5="",v5=s2.attributeValue}),n3(g7,r4.gt,function(){M5(a2.attributeValue,P5=""),b3="",v5=s2.data}),n3(g7,r4.char,function(t37){N6="",P5=t37,v5=s2.attributeValue}),g7)),n3(y5,s2.attributeValue,(n3(m3={},r4.space,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),v5=s2.attributeNameStart)}),n3(m3,r4.quote,function(t37){N6===t37?(M5(a2.attributeValue,P5),v5=s2.attributeNameStart):P5+=t37}),n3(m3,r4.gt,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),b3="",v5=s2.data)}),n3(m3,r4.slash,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),_5=!0,v5=s2.tagEnd)}),n3(m3,r4.char,function(t37){P5+=t37}),m3)),y5);var C4=function(e6){t36.debug&&console.log(v5,e6);var n4=x5.stateMachine[v5],o4=n4[(function(t37){return c3[t37]||r4.char})(e6)]||n4[r4.error]||n4[r4.char];o4(e6)};return x5.write=function(t37){for(var e6=t37.length,n4=0;n4<e6;n4++)C4(t37[n4])},x5}}}}),g4=r3({"node_modules/xml-reader/dist/reader.js"(t35,e4){var n3=u3(),o3=f(),i2=o3.Type,s2={element:"element",text:"text"},r4=function(t36){return Object.assign({name:"",type:s2.element,value:"",parent:null,attributes:{},children:[]},t36)},a2=function(t36){t36=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t36);var e5=void 0,a3=void 0,c3=void 0,h4=void 0,l3=new n3,d3=function(n4){switch(n4.type){case i2.openTag:if(c3===null)(c3=a3).name=n4.value;else{var o4=r4({name:n4.value,parent:c3});c3.children.push(o4),c3=o4}break;case i2.closeTag:var d4=c3.parent;if(t36.parentNodes||(c3.parent=null),c3.name!==n4.value)break;t36.stream&&d4===a3&&(a3.children=[],c3.parent=null),t36.emitTopLevelOnly&&d4!==a3||(l3.emit(t36.tagPrefix+c3.name,c3),l3.emit("tag",c3.name,c3)),c3===a3&&(e5.removeAllListeners("data"),l3.emit(t36.doneEvent,c3),a3=null),c3=d4;break;case i2.text:c3&&c3.children.push(r4({type:s2.text,value:n4.value,parent:t36.parentNodes?c3:null}));break;case i2.attributeName:h4=n4.value,c3.attributes[h4]="";break;case i2.attributeValue:c3.attributes[h4]=n4.value}};return l3.reset=function(){(e5=o3.create({debug:t36.debug})).on("data",d3),a3=r4(),c3=null,h4="",l3.parse=e5.write},l3.reset(),l3};e4.exports={parseSync:function(t36,e5){e5=Object.assign({},e5,{stream:!1,tagPrefix:":"});var n4=a2(e5),o4=void 0;return n4.on("done",function(t37){o4=t37}),n4.parse(t36),o4},create:a2,NodeType:s2}}}),m=r3({"node_modules/binary-search-bounds/search-bounds.js"(t35,e4){function n3(t36,e5,n4,o4,i3){for(var s3=i3+1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)>=0?(s3=r5,i3=r5-1):o4=r5+1}return s3}function o3(t36,e5,n4,o4,i3){for(var s3=i3+1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)>0?(s3=r5,i3=r5-1):o4=r5+1}return s3}function i2(t36,e5,n4,o4,i3){for(var s3=o4-1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)<0?(s3=r5,o4=r5+1):i3=r5-1}return s3}function s2(t36,e5,n4,o4,i3){for(var s3=o4-1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)<=0?(s3=r5,o4=r5+1):i3=r5-1}return s3}function r4(t36,e5,n4,o4,i3){for(;o4<=i3;){var s3=o4+i3>>>1,r5=t36[s3],a3=n4!==void 0?n4(r5,e5):r5-e5;if(a3===0)return s3;a3<=0?o4=s3+1:i3=s3-1}return-1}function a2(t36,e5,n4,o4,i3,s3){return typeof n4=="function"?s3(t36,e5,n4,o4===void 0?0:0|o4,i3===void 0?t36.length-1:0|i3):s3(t36,e5,void 0,n4===void 0?0:0|n4,o4===void 0?t36.length-1:0|o4)}e4.exports={ge:function(t36,e5,o4,i3,s3){return a2(t36,e5,o4,i3,s3,n3)},gt:function(t36,e5,n4,i3,s3){return a2(t36,e5,n4,i3,s3,o3)},lt:function(t36,e5,n4,o4,s3){return a2(t36,e5,n4,o4,s3,i2)},le:function(t36,e5,n4,o4,i3){return a2(t36,e5,n4,o4,i3,s2)},eq:function(t36,e5,n4,o4,i3){return a2(t36,e5,n4,o4,i3,r4)}}}}),y=r3({"node_modules/two-product/two-product.js"(t35,e4){e4.exports=function(t36,e5,o3){var i2=t36*e5,s2=n3*t36,r4=s2-(s2-t36),a2=t36-r4,c3=n3*e5,h4=c3-(c3-e5),l3=e5-h4,d3=a2*l3-(i2-r4*h4-a2*h4-r4*l3);return o3?(o3[0]=d3,o3[1]=i2,o3):[d3,i2]};var n3=+(Math.pow(2,27)+1)}}),x3=r3({"node_modules/robust-sum/robust-sum.js"(t35,e4){e4.exports=function(t36,e5){var n3=0|t36.length,o3=0|e5.length;if(n3===1&&o3===1)return(function(t37,e6){var n4=t37+e6,o4=n4-t37,i3=n4-o4,s3=e6-o4,r5=t37-i3,a3=r5+s3;return a3?[a3,n4]:[n4]})(t36[0],e5[0]);var i2,s2,r4=new Array(n3+o3),a2=0,c3=0,h4=0,l3=Math.abs,d3=t36[c3],u4=l3(d3),p4=e5[h4],f2=l3(p4);u4<f2?(s2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(s2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4]))),c3<n3&&u4<f2||h4>=o3?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4])));for(var g7,m3,y5=i2+s2,x5=y5-i2,v5=s2-x5,b3=v5,S3=y5;c3<n3&&h4<o3;)u4<f2?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4]))),(v5=(s2=b3)-(x5=(y5=i2+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7;for(;c3<n3;)(v5=(s2=b3)-(x5=(y5=(i2=d3)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(c3+=1)<n3&&(d3=t36[c3]);for(;h4<o3;)(v5=(s2=b3)-(x5=(y5=(i2=p4)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(h4+=1)<o3&&(p4=e5[h4]);return b3&&(r4[a2++]=b3),S3&&(r4[a2++]=S3),a2||(r4[a2++]=0),r4.length=a2,r4}}}),v3=r3({"node_modules/two-sum/two-sum.js"(t35,e4){e4.exports=function(t36,e5,n3){var o3=t36+e5,i2=o3-t36,s2=e5-i2,r4=t36-(o3-i2);return n3?(n3[0]=r4+s2,n3[1]=o3,n3):[r4+s2,o3]}}}),b=r3({"node_modules/robust-scale/robust-scale.js"(t35,e4){var n3=y(),o3=v3();e4.exports=function(t36,e5){var i2=t36.length;if(i2===1){var s2=n3(t36[0],e5);return s2[0]?s2:[s2[1]]}var r4=new Array(2*i2),a2=[.1,.1],c3=[.1,.1],h4=0;n3(t36[0],e5,a2),a2[0]&&(r4[h4++]=a2[0]);for(var l3=1;l3<i2;++l3){n3(t36[l3],e5,c3);var d3=a2[1];o3(d3,c3[0],a2),a2[0]&&(r4[h4++]=a2[0]);var u4=c3[1],p4=a2[1],f2=u4+p4,g7=p4-(f2-u4);a2[1]=f2,g7&&(r4[h4++]=g7)}return a2[1]&&(r4[h4++]=a2[1]),h4===0&&(r4[h4++]=0),r4.length=h4,r4}}}),S2=r3({"node_modules/robust-subtract/robust-diff.js"(t35,e4){e4.exports=function(t36,e5){var n3=0|t36.length,o3=0|e5.length;if(n3===1&&o3===1)return(function(t37,e6){var n4=t37+e6,o4=n4-t37,i3=n4-o4,s3=e6-o4,r5=t37-i3,a3=r5+s3;return a3?[a3,n4]:[n4]})(t36[0],-e5[0]);var i2,s2,r4=new Array(n3+o3),a2=0,c3=0,h4=0,l3=Math.abs,d3=t36[c3],u4=l3(d3),p4=-e5[h4],f2=l3(p4);u4<f2?(s2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(s2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4]))),c3<n3&&u4<f2||h4>=o3?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4])));for(var g7,m3,y5=i2+s2,x5=y5-i2,v5=s2-x5,b3=v5,S3=y5;c3<n3&&h4<o3;)u4<f2?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4]))),(v5=(s2=b3)-(x5=(y5=i2+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7;for(;c3<n3;)(v5=(s2=b3)-(x5=(y5=(i2=d3)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(c3+=1)<n3&&(d3=t36[c3]);for(;h4<o3;)(v5=(s2=b3)-(x5=(y5=(i2=p4)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(h4+=1)<o3&&(p4=-e5[h4]);return b3&&(r4[a2++]=b3),S3&&(r4[a2++]=S3),a2||(r4[a2++]=0),r4.length=a2,r4}}}),I3=r3({"node_modules/robust-orientation/orientation.js"(t35,e4){var n3=y(),o3=x3(),i2=b(),s2=S2();function r4(t36,e5,n4,o4){return function(n5,i3,s3){var r5=t36(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),t36(e5(n5[1],i3[0]),e5(-i3[1],n5[0]))),a3=t36(e5(n5[1],s3[0]),e5(-s3[1],n5[0])),c4=o4(r5,a3);return c4[c4.length-1]}}function a2(t36,e5,n4,o4){return function(i3,s3,r5,a3){var c4=t36(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2])))),h6=t36(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2])))),l4=o4(c4,h6);return l4[l4.length-1]}}function c3(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4){var h6=t36(t36(t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),r5[2]),t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),-a3[2]),n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),c4[2]))),s3[3]),t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-a3[2]),n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),c4[2]))),-r5[3]),n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),c4[2]))),a3[3]))),t36(n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),-c4[3]),t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-a3[2]),n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-a3[2]),n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),c4[2]))),-s3[3])))),t36(t36(n4(t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),c4[2]))),a3[3]),t36(n4(t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2]))),-c4[3]),n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),i3[3]))),t36(n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),-s3[3]),t36(n4(t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2]))),r5[3]),n4(t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2]))),-a3[3]))))),l4=t36(t36(t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),r5[2]),t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),-a3[2]),n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-a3[2]),n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),c4[2]))),-r5[3])),t36(n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),c4[2]))),a3[3]),n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),-c4[3]))),t36(t36(n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),c4[2]))),-s3[3])),t36(n4(t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),c4[2]))),r5[3]),n4(t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2]))),-c4[3])))),d4=o4(h6,l4);return d4[d4.length-1]}}function h4(t36){return(t36===3?r4:t36===4?a2:c3)(o3,n3,i2,s2)}var l3=h4(3),d3=h4(4),u4=[function(){return 0},function(){return 0},function(t36,e5){return e5[0]-t36[0]},function(t36,e5,n4){var o4,i3=(t36[1]-n4[1])*(e5[0]-n4[0]),s3=(t36[0]-n4[0])*(e5[1]-n4[1]),r5=i3-s3;if(i3>0){if(s3<=0)return r5;o4=i3+s3}else{if(!(i3<0)||s3>=0)return r5;o4=-(i3+s3)}var a3=33306690738754716e-32*o4;return r5>=a3||r5<=-a3?r5:l3(t36,e5,n4)},function(t36,e5,n4,o4){var i3=t36[0]-o4[0],s3=e5[0]-o4[0],r5=n4[0]-o4[0],a3=t36[1]-o4[1],c4=e5[1]-o4[1],h6=n4[1]-o4[1],l4=t36[2]-o4[2],u5=e5[2]-o4[2],p5=n4[2]-o4[2],f3=s3*h6,g7=r5*c4,m3=r5*a3,y5=i3*h6,x5=i3*c4,v5=s3*a3,b3=l4*(f3-g7)+u5*(m3-y5)+p5*(x5-v5),S3=7771561172376103e-31*((Math.abs(f3)+Math.abs(g7))*Math.abs(l4)+(Math.abs(m3)+Math.abs(y5))*Math.abs(u5)+(Math.abs(x5)+Math.abs(v5))*Math.abs(p5));return b3>S3||-b3>S3?b3:d3(t36,e5,n4,o4)}];function p4(t36){var e5=u4[t36.length];return e5||(e5=u4[t36.length]=h4(t36.length)),e5.apply(void 0,t36)}function f2(t36,e5,n4,o4,i3,s3,r5){return function(e6,n5,a3,c4,h6){switch(arguments.length){case 0:case 1:return 0;case 2:return o4(e6,n5);case 3:return i3(e6,n5,a3);case 4:return s3(e6,n5,a3,c4);case 5:return r5(e6,n5,a3,c4,h6)}for(var l4=new Array(arguments.length),d4=0;d4<arguments.length;++d4)l4[d4]=arguments[d4];return t36(l4)}}(function(){for(;u4.length<=5;)u4.push(h4(u4.length));e4.exports=f2.apply(void 0,[p4].concat(u4));for(var t36=0;t36<=5;++t36)e4.exports[t36]=u4[t36]})()}}),P2=r3({"node_modules/cdt2d/lib/monotone.js"(t35,e4){var n3=m(),o3=I3()[3];function i2(t36,e5,n4,o4,i3){this.a=t36,this.b=e5,this.idx=n4,this.lowerIds=o4,this.upperIds=i3}function s2(t36,e5,n4,o4){this.a=t36,this.b=e5,this.type=n4,this.idx=o4}function r4(t36,e5){var n4=t36.a[0]-e5.a[0]||t36.a[1]-e5.a[1]||t36.type-e5.type;return n4||(t36.type!==0&&(n4=o3(t36.a,t36.b,e5.b))?n4:t36.idx-e5.idx)}function a2(t36,e5){return o3(t36.a,t36.b,e5)}function c3(t36,e5,i3,s3,r5){for(var c4=n3.lt(e5,s3,a2),h6=n3.gt(e5,s3,a2),l4=c4;l4<h6;++l4){for(var d4=e5[l4],u4=d4.lowerIds,p4=u4.length;p4>1&&o3(i3[u4[p4-2]],i3[u4[p4-1]],s3)>0;)t36.push([u4[p4-1],u4[p4-2],r5]),p4-=1;u4.length=p4,u4.push(r5);var f2=d4.upperIds;for(p4=f2.length;p4>1&&o3(i3[f2[p4-2]],i3[f2[p4-1]],s3)<0;)t36.push([f2[p4-2],f2[p4-1],r5]),p4-=1;f2.length=p4,f2.push(r5)}}function h4(t36,e5){var n4;return(n4=t36.a[0]<e5.a[0]?o3(t36.a,t36.b,e5.a):o3(e5.b,e5.a,t36.a))?n4:(n4=e5.b[0]<t36.b[0]?o3(t36.a,t36.b,e5.b):o3(e5.b,e5.a,t36.b))||t36.idx-e5.idx}function l3(t36,e5,o4){var s3=n3.le(t36,o4,h4),r5=t36[s3],a3=r5.upperIds,c4=a3[a3.length-1];r5.upperIds=[c4],t36.splice(s3+1,0,new i2(o4.a,o4.b,o4.idx,[c4],a3))}function d3(t36,e5,o4){var i3=o4.a;o4.a=o4.b,o4.b=i3;var s3=n3.eq(t36,o4,h4),r5=t36[s3];t36[s3-1].upperIds=r5.upperIds,t36.splice(s3,1)}e4.exports=function(t36,e5){for(var n4=t36.length,o4=e5.length,a3=[],h6=0;h6<n4;++h6)a3.push(new s2(t36[h6],null,0,h6));for(h6=0;h6<o4;++h6){var u4=e5[h6],p4=t36[u4[0]],f2=t36[u4[1]];p4[0]<f2[0]?a3.push(new s2(p4,f2,2,h6),new s2(f2,p4,1,h6)):p4[0]>f2[0]&&a3.push(new s2(f2,p4,2,h6),new s2(p4,f2,1,h6))}a3.sort(r4);for(var g7=a3[0].a[0]-(1+Math.abs(a3[0].a[0]))*Math.pow(2,-52),m3=[new i2([g7,1],[g7,0],-1,[],[],[],[])],y5=[],x5=(h6=0,a3.length);h6<x5;++h6){var v5=a3[h6],b3=v5.type;b3===0?c3(y5,m3,t36,v5.a,v5.idx):b3===2?l3(m3,t36,v5):d3(m3,t36,v5)}return y5}}}),_3=r3({"node_modules/cdt2d/lib/triangulation.js"(t35,e4){var n3=m();function o3(t36,e5){this.stars=t36,this.edges=e5}e4.exports=function(t36,e5){for(var n4=new Array(t36),i3=0;i3<t36;++i3)n4[i3]=[];return new o3(n4,e5)};var i2=o3.prototype;function s2(t36,e5,n4){for(var o4=1,i3=t36.length;o4<i3;o4+=2)if(t36[o4-1]===e5&&t36[o4]===n4)return t36[o4-1]=t36[i3-2],t36[o4]=t36[i3-1],void(t36.length=i3-2)}i2.isConstraint=(function(){var t36=[0,0];function e5(t37,e6){return t37[0]-e6[0]||t37[1]-e6[1]}return function(o4,i3){return t36[0]=Math.min(o4,i3),t36[1]=Math.max(o4,i3),n3.eq(this.edges,t36,e5)>=0}})(),i2.removeTriangle=function(t36,e5,n4){var o4=this.stars;s2(o4[t36],e5,n4),s2(o4[e5],n4,t36),s2(o4[n4],t36,e5)},i2.addTriangle=function(t36,e5,n4){var o4=this.stars;o4[t36].push(e5,n4),o4[e5].push(n4,t36),o4[n4].push(t36,e5)},i2.opposite=function(t36,e5){for(var n4=this.stars[e5],o4=1,i3=n4.length;o4<i3;o4+=2)if(n4[o4]===t36)return n4[o4-1];return-1},i2.flip=function(t36,e5){var n4=this.opposite(t36,e5),o4=this.opposite(e5,t36);this.removeTriangle(t36,e5,n4),this.removeTriangle(e5,t36,o4),this.addTriangle(t36,o4,n4),this.addTriangle(e5,n4,o4)},i2.edges=function(){for(var t36=this.stars,e5=[],n4=0,o4=t36.length;n4<o4;++n4)for(var i3=t36[n4],s3=0,r4=i3.length;s3<r4;s3+=2)e5.push([i3[s3],i3[s3+1]]);return e5},i2.cells=function(){for(var t36=this.stars,e5=[],n4=0,o4=t36.length;n4<o4;++n4)for(var i3=t36[n4],s3=0,r4=i3.length;s3<r4;s3+=2){var a2=i3[s3],c3=i3[s3+1];n4<Math.min(a2,c3)&&e5.push([n4,a2,c3])}return e5}}}),N3=r3({"node_modules/robust-in-sphere/in-sphere.js"(t35,e4){var n3=y(),o3=x3(),i2=S2(),s2=b();function r4(t36){return(t36===3?a2:t36===4?c3:t36===5?h4:l3)(o3,i2,n3,s2)}function a2(t36,e5,n4,o4){return function(i3,s3,r5){var a3=n4(i3[0],i3[0]),c4=o4(a3,s3[0]),h6=o4(a3,r5[0]),l4=n4(s3[0],s3[0]),d4=o4(l4,i3[0]),u5=o4(l4,r5[0]),p5=n4(r5[0],r5[0]),f2=o4(p5,i3[0]),g7=o4(p5,s3[0]),m3=t36(e5(g7,u5),e5(d4,c4)),y5=e5(f2,h6),x5=e5(m3,y5);return x5[x5.length-1]}}function c3(t36,e5,n4,o4){return function(i3,s3,r5,a3){var c4=t36(n4(i3[0],i3[0]),n4(i3[1],i3[1])),h6=o4(c4,s3[0]),l4=o4(c4,r5[0]),d4=o4(c4,a3[0]),u5=t36(n4(s3[0],s3[0]),n4(s3[1],s3[1])),p5=o4(u5,i3[0]),f2=o4(u5,r5[0]),g7=o4(u5,a3[0]),m3=t36(n4(r5[0],r5[0]),n4(r5[1],r5[1])),y5=o4(m3,i3[0]),x5=o4(m3,s3[0]),v5=o4(m3,a3[0]),b3=t36(n4(a3[0],a3[0]),n4(a3[1],a3[1])),S3=o4(b3,i3[0]),I5=o4(b3,s3[0]),P5=o4(b3,r5[0]),_5=t36(t36(o4(e5(P5,v5),s3[1]),t36(o4(e5(I5,g7),-r5[1]),o4(e5(x5,f2),a3[1]))),t36(o4(e5(I5,g7),i3[1]),t36(o4(e5(S3,d4),-s3[1]),o4(e5(p5,h6),a3[1])))),N6=t36(t36(o4(e5(P5,v5),i3[1]),t36(o4(e5(S3,d4),-r5[1]),o4(e5(y5,l4),a3[1]))),t36(o4(e5(x5,f2),i3[1]),t36(o4(e5(y5,l4),-s3[1]),o4(e5(p5,h6),r5[1])))),M5=e5(_5,N6);return M5[M5.length-1]}}function h4(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4){var h6=t36(n4(i3[0],i3[0]),t36(n4(i3[1],i3[1]),n4(i3[2],i3[2]))),l4=o4(h6,s3[0]),d4=o4(h6,r5[0]),u5=o4(h6,a3[0]),p5=o4(h6,c4[0]),f2=t36(n4(s3[0],s3[0]),t36(n4(s3[1],s3[1]),n4(s3[2],s3[2]))),g7=o4(f2,i3[0]),m3=o4(f2,r5[0]),y5=o4(f2,a3[0]),x5=o4(f2,c4[0]),v5=t36(n4(r5[0],r5[0]),t36(n4(r5[1],r5[1]),n4(r5[2],r5[2]))),b3=o4(v5,i3[0]),S3=o4(v5,s3[0]),I5=o4(v5,a3[0]),P5=o4(v5,c4[0]),_5=t36(n4(a3[0],a3[0]),t36(n4(a3[1],a3[1]),n4(a3[2],a3[2]))),N6=o4(_5,i3[0]),M5=o4(_5,s3[0]),C4=o4(_5,r5[0]),T7=o4(_5,c4[0]),E5=t36(n4(c4[0],c4[0]),t36(n4(c4[1],c4[1]),n4(c4[2],c4[2]))),R5=o4(E5,i3[0]),w4=o4(E5,s3[0]),A4=o4(E5,r5[0]),O5=o4(E5,a3[0]),L4=t36(t36(t36(o4(t36(o4(e5(O5,T7),r5[1]),t36(o4(e5(A4,P5),-a3[1]),o4(e5(C4,I5),c4[1]))),s3[2]),t36(o4(t36(o4(e5(O5,T7),s3[1]),t36(o4(e5(w4,x5),-a3[1]),o4(e5(M5,y5),c4[1]))),-r5[2]),o4(t36(o4(e5(A4,P5),s3[1]),t36(o4(e5(w4,x5),-r5[1]),o4(e5(S3,m3),c4[1]))),a3[2]))),t36(o4(t36(o4(e5(C4,I5),s3[1]),t36(o4(e5(M5,y5),-r5[1]),o4(e5(S3,m3),a3[1]))),-c4[2]),t36(o4(t36(o4(e5(O5,T7),s3[1]),t36(o4(e5(w4,x5),-a3[1]),o4(e5(M5,y5),c4[1]))),i3[2]),o4(t36(o4(e5(O5,T7),i3[1]),t36(o4(e5(R5,p5),-a3[1]),o4(e5(N6,u5),c4[1]))),-s3[2])))),t36(t36(o4(t36(o4(e5(w4,x5),i3[1]),t36(o4(e5(R5,p5),-s3[1]),o4(e5(g7,l4),c4[1]))),a3[2]),t36(o4(t36(o4(e5(M5,y5),i3[1]),t36(o4(e5(N6,u5),-s3[1]),o4(e5(g7,l4),a3[1]))),-c4[2]),o4(t36(o4(e5(C4,I5),s3[1]),t36(o4(e5(M5,y5),-r5[1]),o4(e5(S3,m3),a3[1]))),i3[2]))),t36(o4(t36(o4(e5(C4,I5),i3[1]),t36(o4(e5(N6,u5),-r5[1]),o4(e5(b3,d4),a3[1]))),-s3[2]),t36(o4(t36(o4(e5(M5,y5),i3[1]),t36(o4(e5(N6,u5),-s3[1]),o4(e5(g7,l4),a3[1]))),r5[2]),o4(t36(o4(e5(S3,m3),i3[1]),t36(o4(e5(b3,d4),-s3[1]),o4(e5(g7,l4),r5[1]))),-a3[2]))))),z5=t36(t36(t36(o4(t36(o4(e5(O5,T7),r5[1]),t36(o4(e5(A4,P5),-a3[1]),o4(e5(C4,I5),c4[1]))),i3[2]),o4(t36(o4(e5(O5,T7),i3[1]),t36(o4(e5(R5,p5),-a3[1]),o4(e5(N6,u5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(A4,P5),i3[1]),t36(o4(e5(R5,p5),-r5[1]),o4(e5(b3,d4),c4[1]))),a3[2]),o4(t36(o4(e5(C4,I5),i3[1]),t36(o4(e5(N6,u5),-r5[1]),o4(e5(b3,d4),a3[1]))),-c4[2]))),t36(t36(o4(t36(o4(e5(A4,P5),s3[1]),t36(o4(e5(w4,x5),-r5[1]),o4(e5(S3,m3),c4[1]))),i3[2]),o4(t36(o4(e5(A4,P5),i3[1]),t36(o4(e5(R5,p5),-r5[1]),o4(e5(b3,d4),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(w4,x5),i3[1]),t36(o4(e5(R5,p5),-s3[1]),o4(e5(g7,l4),c4[1]))),r5[2]),o4(t36(o4(e5(S3,m3),i3[1]),t36(o4(e5(b3,d4),-s3[1]),o4(e5(g7,l4),r5[1]))),-c4[2])))),D6=e5(L4,z5);return D6[D6.length-1]}}function l3(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4,h6){var l4=t36(t36(n4(i3[0],i3[0]),n4(i3[1],i3[1])),t36(n4(i3[2],i3[2]),n4(i3[3],i3[3]))),d4=o4(l4,s3[0]),u5=o4(l4,r5[0]),p5=o4(l4,a3[0]),f2=o4(l4,c4[0]),g7=o4(l4,h6[0]),m3=t36(t36(n4(s3[0],s3[0]),n4(s3[1],s3[1])),t36(n4(s3[2],s3[2]),n4(s3[3],s3[3]))),y5=o4(m3,i3[0]),x5=o4(m3,r5[0]),v5=o4(m3,a3[0]),b3=o4(m3,c4[0]),S3=o4(m3,h6[0]),I5=t36(t36(n4(r5[0],r5[0]),n4(r5[1],r5[1])),t36(n4(r5[2],r5[2]),n4(r5[3],r5[3]))),P5=o4(I5,i3[0]),_5=o4(I5,s3[0]),N6=o4(I5,a3[0]),M5=o4(I5,c4[0]),C4=o4(I5,h6[0]),T7=t36(t36(n4(a3[0],a3[0]),n4(a3[1],a3[1])),t36(n4(a3[2],a3[2]),n4(a3[3],a3[3]))),E5=o4(T7,i3[0]),R5=o4(T7,s3[0]),w4=o4(T7,r5[0]),A4=o4(T7,c4[0]),O5=o4(T7,h6[0]),L4=t36(t36(n4(c4[0],c4[0]),n4(c4[1],c4[1])),t36(n4(c4[2],c4[2]),n4(c4[3],c4[3]))),z5=o4(L4,i3[0]),D6=o4(L4,s3[0]),Y6=o4(L4,r5[0]),X6=o4(L4,a3[0]),F6=o4(L4,h6[0]),k4=t36(t36(n4(h6[0],h6[0]),n4(h6[1],h6[1])),t36(n4(h6[2],h6[2]),n4(h6[3],h6[3]))),B5=o4(k4,i3[0]),$7=o4(k4,s3[0]),j4=o4(k4,r5[0]),W5=o4(k4,a3[0]),H4=o4(k4,c4[0]),V4=t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),r5[2]),o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),-h6[2]))),s3[3]),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-h6[2]))),-r5[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),-h6[2]))),a3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),s3[2]),o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-h6[2]))),-c4[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),s3[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-c4[2]))),h6[3])),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-h6[2]))),i3[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-h6[2]))),-s3[3])))),t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),c4[2]),o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),-h6[2]))),a3[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-h6[2]))),-c4[3])),t36(o4(t36(t36(o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-c4[2]))),h6[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),s3[2]),o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-h6[2]))),i3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-h6[2]))),-s3[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-h6[2]))),r5[3])),t36(o4(t36(t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),i3[2]),o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-h6[2]))),-a3[3]),o4(t36(t36(o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),i3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-s3[2])),t36(o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-a3[2]))),h6[3]))))),U4=t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),r5[2]),o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),-h6[2]))),i3[3]),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-h6[2]))),-r5[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-h6[2]))),a3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-h6[2]))),-c4[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-c4[2]))),h6[3])),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),-h6[2]))),i3[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-h6[2]))),-s3[3])))),t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),c4[2]),o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),-h6[2]))),r5[3]),o4(t36(t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),i3[2]),o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-h6[2]))),-c4[3])),t36(o4(t36(t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),i3[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-c4[2]))),h6[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),s3[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-c4[2]))),i3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-c4[2]))),-s3[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-c4[2]))),r5[3])),t36(o4(t36(t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),i3[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-c4[2]))),-a3[3]),o4(t36(t36(o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),i3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-s3[2])),t36(o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-a3[2]))),c4[3]))))),G5=e5(V4,U4);return G5[G5.length-1]}}var d3=[function(){return 0},function(){return 0},function(){return 0}];function u4(t36){var e5=d3[t36.length];return e5||(e5=d3[t36.length]=r4(t36.length)),e5.apply(void 0,t36)}function p4(t36,e5,n4,o4,i3,s3,r5,a3){return function(e6,n5,c4,h6,l4,d4){switch(arguments.length){case 0:case 1:return 0;case 2:return o4(e6,n5);case 3:return i3(e6,n5,c4);case 4:return s3(e6,n5,c4,h6);case 5:return r5(e6,n5,c4,h6,l4);case 6:return a3(e6,n5,c4,h6,l4,d4)}for(var u5=new Array(arguments.length),p5=0;p5<arguments.length;++p5)u5[p5]=arguments[p5];return t36(u5)}}(function(){for(;d3.length<=6;)d3.push(r4(d3.length));e4.exports=p4.apply(void 0,[u4].concat(d3));for(var t36=0;t36<=6;++t36)e4.exports[t36]=d3[t36]})()}}),M3=r3({"node_modules/cdt2d/lib/delaunay.js"(t35,e4){var n3=N3()[4];m();function o3(t36,e5,o4,i2,s2,r4){var a2=e5.opposite(i2,s2);if(!(a2<0)){if(s2<i2){var c3=i2;i2=s2,s2=c3,c3=r4,r4=a2,a2=c3}e5.isConstraint(i2,s2)||n3(t36[i2],t36[s2],t36[r4],t36[a2])<0&&o4.push(i2,s2)}}e4.exports=function(t36,e5){for(var i2=[],s2=t36.length,r4=e5.stars,a2=0;a2<s2;++a2)for(var c3=r4[a2],h4=1;h4<c3.length;h4+=2)if(!((p4=c3[h4])<a2)&&!e5.isConstraint(a2,p4)){for(var l3=c3[h4-1],d3=-1,u4=1;u4<c3.length;u4+=2)if(c3[u4-1]===p4){d3=c3[u4];break}d3<0||n3(t36[a2],t36[p4],t36[l3],t36[d3])<0&&i2.push(a2,p4)}for(;i2.length>0;){for(var p4=i2.pop(),f2=(l3=-1,d3=-1,c3=r4[a2=i2.pop()],1);f2<c3.length;f2+=2){var g7=c3[f2-1],m3=c3[f2];g7===p4?d3=m3:m3===p4&&(l3=g7)}l3<0||d3<0||n3(t36[a2],t36[p4],t36[l3],t36[d3])>=0||(e5.flip(a2,p4),o3(t36,e5,i2,l3,a2,d3),o3(t36,e5,i2,a2,d3,l3),o3(t36,e5,i2,d3,p4,l3),o3(t36,e5,i2,p4,l3,d3))}}}}),C3=r3({"node_modules/cdt2d/lib/filter.js"(t35,e4){var n3=m();function o3(t36,e5,n4,o4,i3,s2,r4){this.cells=t36,this.neighbor=e5,this.flags=o4,this.constraint=n4,this.active=i3,this.next=s2,this.boundary=r4}function i2(t36,e5){return t36[0]-e5[0]||t36[1]-e5[1]||t36[2]-e5[2]}e4.exports=function(t36,e5,n4){var s2=(function(t37,e6){for(var n5=t37.cells(),s3=n5.length,r5=0;r5<s3;++r5){var a3=(y6=n5[r5])[0],c4=y6[1],h6=y6[2];c4<h6?c4<a3&&(y6[0]=c4,y6[1]=h6,y6[2]=a3):h6<a3&&(y6[0]=h6,y6[1]=a3,y6[2]=c4)}n5.sort(i2);var l4=new Array(s3);for(r5=0;r5<l4.length;++r5)l4[r5]=0;var d4=[],u5=[],p5=new Array(3*s3),f3=new Array(3*s3),g8=null;e6&&(g8=[]);var m4=new o3(n5,p5,f3,l4,d4,u5,g8);for(r5=0;r5<s3;++r5)for(var y6=n5[r5],x5=0;x5<3;++x5){a3=y6[x5],c4=y6[(x5+1)%3];var v5=p5[3*r5+x5]=m4.locate(c4,a3,t37.opposite(c4,a3)),b3=f3[3*r5+x5]=t37.isConstraint(a3,c4);v5<0&&(b3?u5.push(r5):(d4.push(r5),l4[r5]=1),e6&&g8.push([c4,a3,-1]))}return m4})(t36,n4);if(e5===0)return n4?s2.cells.concat(s2.boundary):s2.cells;for(var r4=1,a2=s2.active,c3=s2.next,h4=s2.flags,l3=s2.cells,d3=s2.constraint,u4=s2.neighbor;a2.length>0||c3.length>0;){for(;a2.length>0;){var p4=a2.pop();if(h4[p4]!==-r4){h4[p4]=r4,l3[p4];for(var f2=0;f2<3;++f2){var g7=u4[3*p4+f2];g7>=0&&h4[g7]===0&&(d3[3*p4+f2]?c3.push(g7):(a2.push(g7),h4[g7]=r4))}}}var m3=c3;c3=a2,a2=m3,c3.length=0,r4=-r4}var y5=(function(t37,e6,n5){for(var o4=0,i3=0;i3<t37.length;++i3)e6[i3]===n5&&(t37[o4++]=t37[i3]);return t37.length=o4,t37})(l3,h4,e5);return n4?y5.concat(s2.boundary):y5},o3.prototype.locate=(function(){var t36=[0,0,0];return function(e5,o4,s2){var r4=e5,a2=o4,c3=s2;return o4<s2?o4<e5&&(r4=o4,a2=s2,c3=e5):s2<e5&&(r4=s2,a2=e5,c3=o4),r4<0?-1:(t36[0]=r4,t36[1]=a2,t36[2]=c3,n3.eq(this.cells,t36,i2))}})()}}),T3=r3({"node_modules/cdt2d/cdt2d.js"(t35,e4){var n3=P2(),o3=_3(),i2=M3(),s2=C3();function r4(t36){return[Math.min(t36[0],t36[1]),Math.max(t36[0],t36[1])]}function a2(t36,e5){return t36[0]-e5[0]||t36[1]-e5[1]}function c3(t36,e5,n4){return e5 in t36?t36[e5]:n4}e4.exports=function(t36,e5,h4){Array.isArray(e5)?(h4=h4||{},e5=e5||[]):(h4=e5||{},e5=[]);var l3=!!c3(h4,"delaunay",!0),d3=!!c3(h4,"interior",!0),u4=!!c3(h4,"exterior",!0),p4=!!c3(h4,"infinity",!1);if(!d3&&!u4||t36.length===0)return[];var f2=n3(t36,e5);if(l3||d3!==u4||p4){for(var g7=o3(t36.length,(function(t37){return t37.map(r4).sort(a2)})(e5)),m3=0;m3<f2.length;++m3){var y5=f2[m3];g7.addTriangle(y5[0],y5[1],y5[2])}return l3&&i2(t36,g7),u4?d3?p4?s2(g7,0,p4):g7.cells():s2(g7,1,p4):s2(g7,-1)}return f2}}});function E2(t35,e4){return Array.isArray(e4)?[t35.a*e4[0]+t35.c*e4[1]+t35.e,t35.b*e4[0]+t35.d*e4[1]+t35.f]:{x:t35.a*e4.x+t35.c*e4.y+t35.e,y:t35.b*e4.x+t35.d*e4.y+t35.f}}function R2(t35,e4=0){return{a:1,c:0,e:t35,b:0,d:1,f:e4}}var{cos:w3,sin:A3,PI:O2}=Math,{tan:L2}=Math;a(d()),a(g4());function z3(t35,e4){if(t35.points)for(let n3 of t35.points)n3.step=e4;if(t35.lines)for(let n3 of t35.lines)n3.step=e4;if(t35.infiniteLines)for(let n3 of t35.infiniteLines)n3.step=e4;if(t35.polygons)for(let n3 of t35.polygons)n3.step=e4;if(t35.rects)for(let n3 of t35.rects)n3.step=e4;if(t35.circles)for(let n3 of t35.circles)n3.step=e4;if(t35.texts)for(let n3 of t35.texts)n3.step=e4;return t35}var D3=(t35,e4)=>({...t35,rects:[...t35.rects??[],...e4.rects??[]],points:[...t35.points??[],...e4.points??[]],lines:[...t35.lines??[],...e4.lines??[]],infiniteLines:[...t35.infiniteLines??[],...e4.infiniteLines??[]],polygons:[...t35.polygons??[],...e4.polygons??[]],circles:[...t35.circles??[],...e4.circles??[]],arrows:[...t35.arrows??[],...e4.arrows??[]],texts:[...t35.texts??[],...e4.texts??[]]}),Y3=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}getSolverName(){return this.constructor.name}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(t35){throw this.error=`${this.getSolverName()} error: ${t35}`,this.failed=!0,t35}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.getSolverName()} ran out of iterations`,this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let t35=Date.now();for(;!this.solved&&!this.failed;)this.step();let e4=Date.now();this.timeToSolve=e4-t35}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};function X3(t35,e4,n3,o3={}){return{solverName:t35,solverClass:e4,getConstructorParams:n3,onSolved:o3.onSolved}}var F3=class extends Y3{constructor(t35){super();__publicField(this,"startTimeOfStage",{});__publicField(this,"endTimeOfStage",{});__publicField(this,"timeSpentOnStage",{});__publicField(this,"firstIterationOfStage",{});__publicField(this,"currentPipelineStageIndex",0);__publicField(this,"inputProblem");__publicField(this,"pipelineOutputs",{});this.inputProblem=t35,this.MAX_ITERATIONS=1e6}_step(){let t35=this.pipelineDef[this.currentPipelineStageIndex];if(!t35)return void(this.solved=!0);if(this.activeSubSolver){if(this.activeSubSolver.step(),this.activeSubSolver.solved){this.endTimeOfStage[t35.solverName]=performance.now(),this.timeSpentOnStage[t35.solverName]=this.endTimeOfStage[t35.solverName]-this.startTimeOfStage[t35.solverName];let e5=this.activeSubSolver.getOutput();e5!==null&&(this.pipelineOutputs[t35.solverName]=e5),t35.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStageIndex++}else this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let e4=t35.getConstructorParams(this);this.activeSubSolver=new t35.solverClass(...e4),this[t35.solverName]=this.activeSubSolver,this.timeSpentOnStage[t35.solverName]=0,this.startTimeOfStage[t35.solverName]=performance.now(),this.firstIterationOfStage[t35.solverName]=this.iterations}solveUntilStage(t35){for(;this.getCurrentStageName().toLowerCase()!==t35.toLowerCase()&&(this.step(),!this.failed&&!this.solved););}getCurrentStageName(){return this.pipelineDef[this.currentPipelineStageIndex]?.solverName??"none"}getStageProgress(){let t35=this.pipelineDef.length;if(t35===0)return 1;let e4=this.activeSubSolver?.progress??0;return(this.currentPipelineStageIndex+e4)/t35}getStageStats(){let t35={};for(let e4 of this.pipelineDef){let n3=this.timeSpentOnStage[e4.solverName]||0,o3=this.firstIterationOfStage[e4.solverName]||0,i2=this.iterations,s2=e4.solverName===this.getCurrentStageName()?i2-o3:0,r4=this.currentPipelineStageIndex>this.pipelineDef.findIndex(t36=>t36.solverName===e4.solverName);t35[e4.solverName]={timeSpent:n3,iterations:s2,completed:r4}}return t35}initialVisualize(){return null}finalVisualize(){return null}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let t35=0,e4=this.initialVisualize();e4&&(z3(e4,0),t35=1);let n3=null;this.solved&&(n3=this.finalVisualize());let o3=[e4].filter(Boolean).concat(this.pipelineDef.map((e5,n4)=>{let o4=this[e5.solverName],i2=o4?.visualize();return i2?(z3(i2,n4+t35),i2):null}).filter(Boolean));return o3.length===0?{points:[],rects:[],lines:[],circles:[],texts:[]}:(this.solved&&n3&&(z3(n3,o3.length+t35+1),o3.push(n3)),o3.length===1?o3[0]:{points:o3.flatMap(t36=>t36.points||[]),rects:o3.flatMap(t36=>t36.rects||[]),lines:o3.flatMap(t36=>t36.lines||[]),circles:o3.flatMap(t36=>t36.circles||[]),texts:o3.flatMap(t36=>t36.texts||[])})}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}computeProgress(){return this.getStageProgress()}getStageOutput(t35){return this.pipelineOutputs[t35]}getAllOutputs(){return{...this.pipelineOutputs}}hasStageOutput(t35){return t35 in this.pipelineOutputs}getSolver(t35){return this[t35]}},k3=class{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(t35,e4){let n3=this.length++;for(;n3>0;){let t36=n3-1>>1,o3=this.values[t36];if(e4>=o3)break;this.ids[n3]=this.ids[t36],this.values[n3]=o3,n3=t36}this.ids[n3]=t35,this.values[n3]=e4}pop(){if(this.length===0)return;let t35=this.ids,e4=this.values,n3=t35[0],o3=--this.length;if(o3>0){let n4=t35[o3],i2=e4[o3],s2=0,r4=o3>>1;for(;s2<r4;){let n5=1+(s2<<1),r5=n5+1,a2=n5+(+(r5<o3)&+(e4[r5]<e4[n5]));if(e4[a2]>=i2)break;t35[s2]=t35[a2],e4[s2]=e4[a2],s2=a2}t35[s2]=n4,e4[s2]=i2}return n3}peek(){return this.length>0?this.ids[0]:void 0}peekValue(){return this.length>0?this.values[0]:void 0}shrink(){this.ids.length=this.values.length=this.length}},B3=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],$4=class t3{static from(e4,n3=0){if(n3%8!=0)throw new Error("byteOffset must be 8-byte aligned.");if(!e4||e4.byteLength===void 0||e4.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");let[o3,i2]=new Uint8Array(e4,n3+0,2);if(o3!==251)throw new Error("Data does not appear to be in a Flatbush format.");let s2=i2>>4;if(s2!==3)throw new Error(`Got v${s2} data when expected v3.`);let r4=B3[15&i2];if(!r4)throw new Error("Unrecognized array type.");let[a2]=new Uint16Array(e4,n3+2,1),[c3]=new Uint32Array(e4,n3+4,1);return new t3(c3,a2,r4,void 0,e4,n3)}constructor(t35,e4=16,n3=Float64Array,o3=ArrayBuffer,i2,s2=0){if(t35===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(t35)||t35<=0)throw new Error(`Unexpected numItems value: ${t35}.`);this.numItems=+t35,this.nodeSize=Math.min(Math.max(+e4,2),65535),this.byteOffset=s2;let r4=t35,a2=r4;this._levelBounds=[4*r4];do r4=Math.ceil(r4/this.nodeSize),a2+=r4,this._levelBounds.push(4*a2);while(r4!==1);this.ArrayType=n3,this.IndexArrayType=a2<16384?Uint16Array:Uint32Array;let c3=B3.indexOf(n3),h4=4*a2*n3.BYTES_PER_ELEMENT;if(c3<0)throw new Error(`Unexpected typed array class: ${n3}.`);if(i2)this.data=i2,this._boxes=new n3(i2,s2+8,4*a2),this._indices=new this.IndexArrayType(i2,s2+8+h4,a2),this._pos=4*a2,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1];else{let i3=this.data=new o3(8+h4+a2*this.IndexArrayType.BYTES_PER_ELEMENT);this._boxes=new n3(i3,8,4*a2),this._indices=new this.IndexArrayType(i3,8+h4,a2),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(i3,0,2).set([251,48+c3]),new Uint16Array(i3,2,1)[0]=e4,new Uint32Array(i3,4,1)[0]=t35}this._queue=new k3}add(t35,e4,n3=t35,o3=e4){let i2=this._pos>>2,s2=this._boxes;return this._indices[i2]=i2,s2[this._pos++]=t35,s2[this._pos++]=e4,s2[this._pos++]=n3,s2[this._pos++]=o3,t35<this.minX&&(this.minX=t35),e4<this.minY&&(this.minY=e4),n3>this.maxX&&(this.maxX=n3),o3>this.maxY&&(this.maxY=o3),i2}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);let t35=this._boxes;if(this.numItems<=this.nodeSize)return t35[this._pos++]=this.minX,t35[this._pos++]=this.minY,t35[this._pos++]=this.maxX,void(t35[this._pos++]=this.maxY);let e4=this.maxX-this.minX||1,n3=this.maxY-this.minY||1,o3=new Uint32Array(this.numItems);for(let i2=0,s2=0;i2<this.numItems;i2++){let r4=t35[s2++],a2=t35[s2++],c3=t35[s2++],h4=t35[s2++],l3=Math.floor(65535*((r4+c3)/2-this.minX)/e4),d3=Math.floor(65535*((a2+h4)/2-this.minY)/n3);o3[i2]=H3(l3,d3)}(function(t36,e5,n4,o4,i2,s2){let r4=[o4,i2];for(;r4.length;){let o6=r4.pop()||0,i3=r4.pop()||0;if(o6-i3<=s2&&Math.floor(i3/s2)>=Math.floor(o6/s2))continue;let a2=t36[i3],c3=t36[i3+o6>>1],h4=t36[o6],l3=a2>c3!=a2>h4?a2:c3<a2!=c3<h4?c3:h4,d3=i3-1,u4=o6+1;for(;;){do d3++;while(t36[d3]<l3);do u4--;while(t36[u4]>l3);if(d3>=u4)break;W4(t36,e5,n4,d3,u4)}r4.push(i3,u4,u4+1,o6)}})(o3,t35,this._indices,0,this.numItems-1,this.nodeSize);for(let e5=0,n4=0;e5<this._levelBounds.length-1;e5++){let o4=this._levelBounds[e5];for(;n4<o4;){let e6=n4,i2=t35[n4++],s2=t35[n4++],r4=t35[n4++],a2=t35[n4++];for(let e7=1;e7<this.nodeSize&&n4<o4;e7++)i2=Math.min(i2,t35[n4++]),s2=Math.min(s2,t35[n4++]),r4=Math.max(r4,t35[n4++]),a2=Math.max(a2,t35[n4++]);this._indices[this._pos>>2]=e6,t35[this._pos++]=i2,t35[this._pos++]=s2,t35[this._pos++]=r4,t35[this._pos++]=a2}}}search(t35,e4,n3,o3,i2){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let s2=this._boxes.length-4,r4=[],a2=[];for(;s2!==void 0;){let c3=Math.min(s2+4*this.nodeSize,j2(s2,this._levelBounds));for(let h4=s2;h4<c3;h4+=4){let c4=this._boxes[h4];if(n3<c4)continue;let l3=this._boxes[h4+1];if(o3<l3)continue;let d3=this._boxes[h4+2];if(t35>d3)continue;let u4=this._boxes[h4+3];if(e4>u4)continue;let p4=0|this._indices[h4>>2];s2>=4*this.numItems?r4.push(p4):(i2===void 0||i2(p4,c4,l3,d3,u4))&&a2.push(p4)}s2=r4.pop()}return a2}neighbors(t35,e4,n3=1/0,o3=1/0,i2){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let s2=this._boxes.length-4,r4=this._queue,a2=[],c3=o3*o3;t:for(;s2!==void 0;){let o4=Math.min(s2+4*this.nodeSize,j2(s2,this._levelBounds));for(let n4=s2;n4<o4;n4+=4){let o6=0|this._indices[n4>>2],a3=this._boxes[n4],h4=this._boxes[n4+1],l3=this._boxes[n4+2],d3=this._boxes[n4+3],u4=t35<a3?a3-t35:t35>l3?t35-l3:0,p4=e4<h4?h4-e4:e4>d3?e4-d3:0,f2=u4*u4+p4*p4;f2>c3||(s2>=4*this.numItems?r4.push(o6<<1,f2):(i2===void 0||i2(o6))&&r4.push(1+(o6<<1),f2))}for(;r4.length&&1&r4.peek();)if(r4.peekValue()>c3||(a2.push(r4.pop()>>1),a2.length===n3))break t;s2=r4.length?r4.pop()>>1:void 0}return r4.clear(),a2}};function j2(t35,e4){let n3=0,o3=e4.length-1;for(;n3<o3;){let i2=n3+o3>>1;e4[i2]>t35?o3=i2:n3=i2+1}return e4[n3]}function W4(t35,e4,n3,o3,i2){let s2=t35[o3];t35[o3]=t35[i2],t35[i2]=s2;let r4=4*o3,a2=4*i2,c3=e4[r4],h4=e4[r4+1],l3=e4[r4+2],d3=e4[r4+3];e4[r4]=e4[a2],e4[r4+1]=e4[a2+1],e4[r4+2]=e4[a2+2],e4[r4+3]=e4[a2+3],e4[a2]=c3,e4[a2+1]=h4,e4[a2+2]=l3,e4[a2+3]=d3;let u4=n3[o3];n3[o3]=n3[i2],n3[i2]=u4}function H3(t35,e4){let n3=t35^e4,o3=65535^n3,i2=65535^(t35|e4),s2=t35&(65535^e4),r4=n3|o3>>1,a2=n3>>1^n3,c3=i2>>1^o3&s2>>1^i2,h4=n3&i2>>1^s2>>1^s2;n3=r4,o3=a2,i2=c3,s2=h4,r4=n3&n3>>2^o3&o3>>2,a2=n3&o3>>2^o3&(n3^o3)>>2,c3^=n3&i2>>2^o3&s2>>2,h4^=o3&i2>>2^(n3^o3)&s2>>2,n3=r4,o3=a2,i2=c3,s2=h4,r4=n3&n3>>4^o3&o3>>4,a2=n3&o3>>4^o3&(n3^o3)>>4,c3^=n3&i2>>4^o3&s2>>4,h4^=o3&i2>>4^(n3^o3)&s2>>4,n3=r4,o3=a2,i2=c3,s2=h4,c3^=n3&i2>>8^o3&s2>>8,h4^=o3&i2>>8^(n3^o3)&s2>>8,n3=c3^c3>>1,o3=h4^h4>>1;let l3=t35^e4,d3=o3|65535^(l3|n3);return l3=16711935&(l3|l3<<8),l3=252645135&(l3|l3<<4),l3=858993459&(l3|l3<<2),l3=1431655765&(l3|l3<<1),d3=16711935&(d3|d3<<8),d3=252645135&(d3|d3<<4),d3=858993459&(d3|d3<<2),d3=1431655765&(d3|d3<<1),(d3<<1|l3)>>>0}function V3(t35){let e4=t35.width/2,n3=t35.height/2;return{minX:t35.center.x-e4,maxX:t35.center.x+e4,minY:t35.center.y-n3,maxY:t35.center.y+n3}}function U2(t35,e4,n3){return Math.max(e4,Math.min(n3,t35))}function G3(t35,e4,n3,o3){let i2=q3(t35,e4,n3),s2=q3(t35,e4,o3),r4=q3(n3,o3,t35),a2=q3(n3,o3,e4);return i2!==s2&&r4!==a2||!(i2!==0||!Z2(t35,n3,e4))||!(s2!==0||!Z2(t35,o3,e4))||!(r4!==0||!Z2(n3,t35,o3))||!(a2!==0||!Z2(n3,e4,o3))}function q3(t35,e4,n3){let o3=(e4.y-t35.y)*(n3.x-e4.x)-(e4.x-t35.x)*(n3.y-e4.y);return o3===0?0:o3>0?1:2}function Z2(t35,e4,n3){return e4.x<=Math.max(t35.x,n3.x)&&e4.x>=Math.min(t35.x,n3.x)&&e4.y<=Math.max(t35.y,n3.y)&&e4.y>=Math.min(t35.y,n3.y)}function J3(t35,e4,n3){let o3=(n3.x-e4.x)**2+(n3.y-e4.y)**2;if(o3===0)return K2(t35,e4);let i2=((t35.x-e4.x)*(n3.x-e4.x)+(t35.y-e4.y)*(n3.y-e4.y))/o3;return i2=Math.max(0,Math.min(1,i2)),K2(t35,{x:e4.x+i2*(n3.x-e4.x),y:e4.y+i2*(n3.y-e4.y)})}function K2(t35,e4){let n3=t35.x-e4.x,o3=t35.y-e4.y;return Math.sqrt(n3*n3+o3*o3)}function Q3(t35,e4,n3,o3){let i2=e4.x-t35.x,s2=e4.y-t35.y,r4=o3.x-n3.x,a2=o3.y-n3.y,c3=t35.x-n3.x,h4=t35.y-n3.y,l3=i2*a2-s2*r4;if(Math.abs(l3)<1e-10)return null;let d3=(h4*r4-c3*a2)/l3,u4=(i2*h4-s2*c3)/l3,p4=1e-9;return d3>=-1e-9&&d3<=1+p4&&u4>=-1e-9&&u4<=1+p4?{x:t35.x+d3*i2,y:t35.y+d3*s2}:null}function tt2(t35,e4){let n3=e4.width/2,o3=e4.height/2,i2=e4.center.x-n3,s2=e4.center.x+n3,r4=e4.center.y-o3,a2=e4.center.y+o3;return t35.x>=i2&&t35.x<=s2&&t35.y>=r4&&t35.y<=a2?0:K2(t35,{x:U2(t35.x,i2,s2),y:U2(t35.y,r4,a2)})}function et2(t35,e4){return{x:(t35.x+e4.x)/2,y:(t35.y+e4.y)/2}}var nt2=t35=>{if("minX"in t35)return t35;let e4=t35.width/2,n3=t35.height/2;return{minX:t35.center.x-e4,minY:t35.center.y-n3,maxX:t35.center.x+e4,maxY:t35.center.y+n3}},ot2=t35=>[{x:t35.minX,y:t35.minY},{x:t35.maxX,y:t35.minY},{x:t35.maxX,y:t35.maxY},{x:t35.minX,y:t35.maxY}],it2=t35=>{let e4=[];for(let n3=0;n3<t35.length;n3++){let o3=t35[n3],i2=t35[(n3+1)%t35.length];e4.push([o3,i2])}return e4},st2=(t35,e4,n3)=>{let o3=(t35.y-e4.y)*(n3.x-e4.x)-(t35.x-e4.x)*(n3.y-e4.y);if(Math.abs(o3)>1e-9)return!1;let i2=(t35.x-e4.x)*(n3.x-e4.x)+(t35.y-e4.y)*(n3.y-e4.y);return i2<0?!1:!(i2>(n3.x-e4.x)**2+(n3.y-e4.y)**2)},rt2=(t35,e4)=>{if(e4.length<3)return!1;let n3=it2(e4);for(let[e5,o4]of n3)if(st2(t35,e5,o4))return!0;let o3=!1;for(let n4=0,i2=e4.length-1;n4<e4.length;i2=n4++){let s2=e4[n4].x,r4=e4[n4].y,a2=e4[i2].x,c3=e4[i2].y;r4>t35.y!=c3>t35.y&&t35.x<(a2-s2)*(t35.y-r4)/(c3-r4)+s2&&(o3=!o3)}return o3},at2=(t35,e4)=>{let n3=ot2(t35),o3=[[n3[0],n3[1]],[n3[1],n3[2]],[n3[2],n3[3]],[n3[3],n3[0]]],i2=it2(e4);for(let[t36,e5]of i2)for(let[n4,i3]of o3)if(G3(t36,e5,n4,i3))return!0;return!1},ct2=(t35,e4)=>((t36,e5)=>!(e5.length<3)&&(!!e5.some(e6=>((t37,e7)=>t37.x>=e7.minX&&t37.x<=e7.maxX&&t37.y>=e7.minY&&t37.y<=e7.maxY)(e6,t36))||!!ot2(t36).some(t37=>rt2(t37,e5))||at2(t36,e5)))(nt2(t35),e4),ht2=(t35,e4)=>((t36,e5)=>!(e5.length<3)&&!!ot2(t36).every(t37=>rt2(t37,e5))&&!at2(t36,e5))(nt2(t35),e4);function lt2(t35,e4,n3,o3){if(t35.x===e4.x&&t35.y===e4.y)return J3(t35,n3,o3);if(n3.x===o3.x&&n3.y===o3.y)return J3(n3,t35,e4);if(G3(t35,e4,n3,o3))return 0;let i2=[J3(t35,n3,o3),J3(e4,n3,o3),J3(n3,t35,e4),J3(o3,t35,e4)];return Math.min(...i2)}function dt2(t35,e4,n3){let o3=n3.width/2,i2=n3.height/2;return(function(t36,e5,n4){let o4={x:n4.minX,y:n4.minY},i3={x:n4.maxX,y:n4.minY},s2={x:n4.minX,y:n4.maxY},r4={x:n4.maxX,y:n4.maxY};if(G3(t36,e5,o4,i3)||G3(t36,e5,i3,r4)||G3(t36,e5,r4,s2)||G3(t36,e5,s2,o4)||t36.x>=n4.minX&&t36.x<=n4.maxX&&t36.y>=n4.minY&&t36.y<=n4.maxY&&e5.x>=n4.minX&&e5.x<=n4.maxX&&e5.y>=n4.minY&&e5.y<=n4.maxY)return 0;let a2=[J3(o4,t36,e5),J3(i3,t36,e5),J3(s2,t36,e5),J3(r4,t36,e5)];if(t36.x>=n4.minX&&t36.x<=n4.maxX&&t36.y>=n4.minY&&t36.y<=n4.maxY||e5.x>=n4.minX&&e5.x<=n4.maxX&&e5.y>=n4.minY&&e5.y<=n4.maxY)return 0;if(t36.x<n4.minX||t36.x>n4.maxX||t36.y<n4.minY||t36.y>n4.maxY){let e6=U2(t36.x,n4.minX,n4.maxX),o6=U2(t36.y,n4.minY,n4.maxY);a2.push(K2(t36,{x:e6,y:o6}))}if(e5.x<n4.minX||e5.x>n4.maxX||e5.y<n4.minY||e5.y>n4.maxY){let t37=U2(e5.x,n4.minX,n4.maxX),o6=U2(e5.y,n4.minY,n4.maxY);a2.push(K2(e5,{x:t37,y:o6}))}return Math.min(...a2)})(t35,e4,{minX:n3.center.x-o3,maxX:n3.center.x+o3,minY:n3.center.y-i2,maxY:n3.center.y+i2})}function ut2(t35,e4,n3){let o3=n3.x-e4.x,i2=n3.y-e4.y,s2=o3*o3+i2*i2;if(s2===0)return{x:e4.x,y:e4.y};let r4=((t35.x-e4.x)*o3+(t35.y-e4.y)*i2)/s2;return r4=Math.max(0,Math.min(1,r4)),{x:e4.x+r4*o3,y:e4.y+r4*i2}}function pt2(t35,e4,n3=0,o3=t35.length-1,i2=gt2){for(;o3>n3;){if(o3-n3>600){let s3=o3-n3+1,r5=e4-n3+1,a3=Math.log(s3),c3=.5*Math.exp(2*a3/3),h4=.5*Math.sqrt(a3*c3*(s3-c3)/s3)*(r5-s3/2<0?-1:1);pt2(t35,e4,Math.max(n3,Math.floor(e4-r5*c3/s3+h4)),Math.min(o3,Math.floor(e4+(s3-r5)*c3/s3+h4)),i2)}let s2=t35[e4],r4=n3,a2=o3;for(ft2(t35,n3,e4),i2(t35[o3],s2)>0&&ft2(t35,n3,o3);r4<a2;){for(ft2(t35,r4,a2),r4++,a2--;i2(t35[r4],s2)<0;)r4++;for(;i2(t35[a2],s2)>0;)a2--}i2(t35[n3],s2)===0?ft2(t35,n3,a2):(a2++,ft2(t35,a2,o3)),a2<=e4&&(n3=a2+1),e4<=a2&&(o3=a2-1)}}function ft2(t35,e4,n3){let o3=t35[e4];t35[e4]=t35[n3],t35[n3]=o3}function gt2(t35,e4){return t35<e4?-1:t35>e4?1:0}var mt2=class{constructor(t35=9){this._maxEntries=Math.max(4,t35),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(t35){let e4=this.data,n3=[];if(!Tt2(t35,e4))return n3;let o3=this.toBBox,i2=[];for(;e4;){for(let s2=0;s2<e4.children.length;s2++){let r4=e4.children[s2],a2=e4.leaf?o3(r4):r4;Tt2(t35,a2)&&(e4.leaf?n3.push(r4):Ct2(t35,a2)?this._all(r4,n3):i2.push(r4))}e4=i2.pop()}return n3}collides(t35){let e4=this.data;if(!Tt2(t35,e4))return!1;let n3=[];for(;e4;){for(let o3=0;o3<e4.children.length;o3++){let i2=e4.children[o3],s2=e4.leaf?this.toBBox(i2):i2;if(Tt2(t35,s2)){if(e4.leaf||Ct2(t35,s2))return!0;n3.push(i2)}}e4=n3.pop()}return!1}load(t35){if(!t35||!t35.length)return this;if(t35.length<this._minEntries){for(let e5=0;e5<t35.length;e5++)this.insert(t35[e5]);return this}let e4=this._build(t35.slice(),0,t35.length-1,0);if(this.data.children.length)if(this.data.height===e4.height)this._splitRoot(this.data,e4);else{if(this.data.height<e4.height){let t36=this.data;this.data=e4,e4=t36}this._insert(e4,this.data.height-e4.height-1,!0)}else this.data=e4;return this}insert(t35){return t35&&this._insert(t35,this.data.height-1),this}clear(){return this.data=Et2([]),this}remove(t35,e4){if(!t35)return this;let n3=this.data,o3=this.toBBox(t35),i2=[],s2=[],r4,a2,c3;for(;n3||i2.length;){if(n3||(n3=i2.pop(),a2=i2[i2.length-1],r4=s2.pop(),c3=!0),n3.leaf){let o4=yt2(t35,n3.children,e4);if(o4!==-1)return n3.children.splice(o4,1),i2.push(n3),this._condense(i2),this}c3||n3.leaf||!Ct2(n3,o3)?a2?(r4++,n3=a2.children[r4],c3=!1):n3=null:(i2.push(n3),s2.push(r4),r4=0,a2=n3,n3=n3.children[0])}return this}toBBox(t35){return t35}compareMinX(t35,e4){return t35.minX-e4.minX}compareMinY(t35,e4){return t35.minY-e4.minY}toJSON(){return this.data}fromJSON(t35){return this.data=t35,this}_all(t35,e4){let n3=[];for(;t35;)t35.leaf?e4.push(...t35.children):n3.push(...t35.children),t35=n3.pop();return e4}_build(t35,e4,n3,o3){let i2=n3-e4+1,s2,r4=this._maxEntries;if(i2<=r4)return s2=Et2(t35.slice(e4,n3+1)),xt2(s2,this.toBBox),s2;o3||(o3=Math.ceil(Math.log(i2)/Math.log(r4)),r4=Math.ceil(i2/Math.pow(r4,o3-1))),s2=Et2([]),s2.leaf=!1,s2.height=o3;let a2=Math.ceil(i2/r4),c3=a2*Math.ceil(Math.sqrt(r4));Rt2(t35,e4,n3,c3,this.compareMinX);for(let i3=e4;i3<=n3;i3+=c3){let e5=Math.min(i3+c3-1,n3);Rt2(t35,i3,e5,a2,this.compareMinY);for(let n4=i3;n4<=e5;n4+=a2){let i4=Math.min(n4+a2-1,e5);s2.children.push(this._build(t35,n4,i4,o3-1))}}return xt2(s2,this.toBBox),s2}_chooseSubtree(t35,e4,n3,o3){for(;o3.push(e4),!e4.leaf&&o3.length-1!==n3;){let n4,o4=1/0,i2=1/0;for(let s2=0;s2<e4.children.length;s2++){let r4=e4.children[s2],a2=Pt2(r4),c3=Nt2(t35,r4)-a2;c3<i2?(i2=c3,o4=a2<o4?a2:o4,n4=r4):c3===i2&&a2<o4&&(o4=a2,n4=r4)}e4=n4||e4.children[0]}return e4}_insert(t35,e4,n3){let o3=n3?t35:this.toBBox(t35),i2=[],s2=this._chooseSubtree(o3,this.data,e4,i2);for(s2.children.push(t35),bt(s2,o3);e4>=0&&i2[e4].children.length>this._maxEntries;)this._split(i2,e4),e4--;this._adjustParentBBoxes(o3,i2,e4)}_split(t35,e4){let n3=t35[e4],o3=n3.children.length,i2=this._minEntries;this._chooseSplitAxis(n3,i2,o3);let s2=this._chooseSplitIndex(n3,i2,o3),r4=Et2(n3.children.splice(s2,n3.children.length-s2));r4.height=n3.height,r4.leaf=n3.leaf,xt2(n3,this.toBBox),xt2(r4,this.toBBox),e4?t35[e4-1].children.push(r4):this._splitRoot(n3,r4)}_splitRoot(t35,e4){this.data=Et2([t35,e4]),this.data.height=t35.height+1,this.data.leaf=!1,xt2(this.data,this.toBBox)}_chooseSplitIndex(t35,e4,n3){let o3,i2=1/0,s2=1/0;for(let r4=e4;r4<=n3-e4;r4++){let e5=vt2(t35,0,r4,this.toBBox),a2=vt2(t35,r4,n3,this.toBBox),c3=Mt2(e5,a2),h4=Pt2(e5)+Pt2(a2);c3<i2?(i2=c3,o3=r4,s2=h4<s2?h4:s2):c3===i2&&h4<s2&&(s2=h4,o3=r4)}return o3||n3-e4}_chooseSplitAxis(t35,e4,n3){let o3=t35.leaf?this.compareMinX:St2,i2=t35.leaf?this.compareMinY:It2;this._allDistMargin(t35,e4,n3,o3)<this._allDistMargin(t35,e4,n3,i2)&&t35.children.sort(o3)}_allDistMargin(t35,e4,n3,o3){t35.children.sort(o3);let i2=this.toBBox,s2=vt2(t35,0,e4,i2),r4=vt2(t35,n3-e4,n3,i2),a2=_t2(s2)+_t2(r4);for(let o4=e4;o4<n3-e4;o4++){let e5=t35.children[o4];bt(s2,t35.leaf?i2(e5):e5),a2+=_t2(s2)}for(let o4=n3-e4-1;o4>=e4;o4--){let e5=t35.children[o4];bt(r4,t35.leaf?i2(e5):e5),a2+=_t2(r4)}return a2}_adjustParentBBoxes(t35,e4,n3){for(let o3=n3;o3>=0;o3--)bt(e4[o3],t35)}_condense(t35){for(let e4,n3=t35.length-1;n3>=0;n3--)t35[n3].children.length===0?n3>0?(e4=t35[n3-1].children,e4.splice(e4.indexOf(t35[n3]),1)):this.clear():xt2(t35[n3],this.toBBox)}};function yt2(t35,e4,n3){if(!n3)return e4.indexOf(t35);for(let o3=0;o3<e4.length;o3++)if(n3(t35,e4[o3]))return o3;return-1}function xt2(t35,e4){vt2(t35,0,t35.children.length,e4,t35)}function vt2(t35,e4,n3,o3,i2){i2||(i2=Et2(null)),i2.minX=1/0,i2.minY=1/0,i2.maxX=-1/0,i2.maxY=-1/0;for(let s2=e4;s2<n3;s2++){let e5=t35.children[s2];bt(i2,t35.leaf?o3(e5):e5)}return i2}function bt(t35,e4){return t35.minX=Math.min(t35.minX,e4.minX),t35.minY=Math.min(t35.minY,e4.minY),t35.maxX=Math.max(t35.maxX,e4.maxX),t35.maxY=Math.max(t35.maxY,e4.maxY),t35}function St2(t35,e4){return t35.minX-e4.minX}function It2(t35,e4){return t35.minY-e4.minY}function Pt2(t35){return(t35.maxX-t35.minX)*(t35.maxY-t35.minY)}function _t2(t35){return t35.maxX-t35.minX+(t35.maxY-t35.minY)}function Nt2(t35,e4){return(Math.max(e4.maxX,t35.maxX)-Math.min(e4.minX,t35.minX))*(Math.max(e4.maxY,t35.maxY)-Math.min(e4.minY,t35.minY))}function Mt2(t35,e4){let n3=Math.max(t35.minX,e4.minX),o3=Math.max(t35.minY,e4.minY),i2=Math.min(t35.maxX,e4.maxX),s2=Math.min(t35.maxY,e4.maxY);return Math.max(0,i2-n3)*Math.max(0,s2-o3)}function Ct2(t35,e4){return t35.minX<=e4.minX&&t35.minY<=e4.minY&&e4.maxX<=t35.maxX&&e4.maxY<=t35.maxY}function Tt2(t35,e4){return e4.minX<=t35.maxX&&e4.minY<=t35.maxY&&e4.maxX>=t35.minX&&e4.maxY>=t35.minY}function Et2(t35){return{children:t35,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function Rt2(t35,e4,n3,o3,i2){let s2=[e4,n3];for(;s2.length;){if((n3=s2.pop())-(e4=s2.pop())<=o3)continue;let r4=e4+Math.ceil((n3-e4)/o3/2)*o3;pt2(t35,r4,e4,n3,i2),s2.push(e4,r4,r4,n3)}}var wt2=1e-4,At2=[{facingDirection:"x-",dx:-1,dy:0,startX:-.5,startY:.5,endX:-.5,endY:-.5},{facingDirection:"x+",dx:1,dy:0,startX:.5,startY:.5,endX:.5,endY:-.5},{facingDirection:"y-",dx:0,dy:-1,startX:-.5,startY:-.5,endX:.5,endY:-.5},{facingDirection:"y+",dx:0,dy:1,startX:.5,startY:.5,endX:-.5,endY:.5}],Ot2={"x-":At2.find(t35=>t35.facingDirection==="x-"),"x+":At2.find(t35=>t35.facingDirection==="x+"),"y-":At2.find(t35=>t35.facingDirection==="y-"),"y+":At2.find(t35=>t35.facingDirection==="y+")},Lt2={"x-":{x:-1,y:0},"x+":{x:1,y:0},"y-":{x:0,y:-1},"y+":{x:0,y:1}},zt2=(t35,e4)=>{let{dir:n3,amt:o3}=e4,i2=Lt2[n3];return t35.map(t36=>({x:t36.x+i2.x*o3,y:t36.y+i2.y*o3}))},Dt2=1e-4,Yt2=class extends Y3{constructor(t35){super();__publicField(this,"allEdges");__publicField(this,"unprocessedEdges",[]);__publicField(this,"segmentsWithAdjacentEmptySpace",[]);__publicField(this,"edgeSpatialIndex");__publicField(this,"lastCandidateEdge",null);__publicField(this,"lastOverlappingEdges",null);__publicField(this,"lastUncoveredSegments",null);this.input=t35;for(let t36 of this.input.meshNodes)for(let e4 of At2){let n3={x:t36.center.x+t36.width*e4.startX,y:t36.center.y+t36.height*e4.startY},o3={x:t36.center.x+t36.width*e4.endX,y:t36.center.y+t36.height*e4.endY};n3.x>o3.x&&([n3,o3]=[o3,n3]),Math.abs(n3.x-o3.x)<Dt2&&n3.y>o3.y&&([n3,o3]=[o3,n3]);for(let i2 of t36.availableZ)this.unprocessedEdges.push({parent:t36,start:n3,end:o3,facingDirection:e4.facingDirection,z:i2})}this.allEdges=[...this.unprocessedEdges],this.edgeSpatialIndex=new $4(this.allEdges.length);for(let t36 of this.allEdges)this.edgeSpatialIndex.add(t36.start.x,t36.start.y,t36.end.x,t36.end.y);this.edgeSpatialIndex.finish()}_step(){if(this.unprocessedEdges.length===0)return this.solved=!0,this.lastCandidateEdge=null,this.lastOverlappingEdges=null,void(this.lastUncoveredSegments=null);let t35=this.unprocessedEdges.shift();this.lastCandidateEdge=t35;let e4=this.edgeSpatialIndex.search(t35.start.x-Dt2,t35.start.y-Dt2,t35.end.x+Dt2,t35.end.y+Dt2).map(t36=>this.allEdges[t36]).filter(e5=>e5.z===t35.z);this.lastOverlappingEdges=e4;let n3=(function(t36,e5){let n4=Math.abs(t36.start.y-t36.end.y)<wt2,o3=Math.abs(t36.start.x-t36.end.x)<wt2;if(!n4&&!o3)return[];let i2=n4?"x":"y",s2=n4?"y":"x",r4=t36.start[s2],a2=t36.start[i2],c3=t36.end[i2],h4=Math.min(a2,c3),l3=Math.max(a2,c3),d3=t37=>Math.max(h4,Math.min(l3,t37)),u4=[];for(let n5 of e5){if(n5===t36)continue;let e6=Math.abs(n5.start.y-n5.end.y)<wt2,o4=Math.abs(n5.start.x-n5.end.x)<wt2;if(i2==="x"&&!e6||i2==="y"&&!o4||Math.abs(n5.start[s2]-r4)>wt2)continue;let a3=Math.min(n5.start[i2],n5.end[i2]),c4=Math.max(n5.start[i2],n5.end[i2]),h6=d3(a3),l4=d3(c4);l4-h6>wt2&&u4.push({s:h6,e:l4})}if(u4.length===0)return[{...t36,start:{...t36.start},end:{...t36.end}}];u4.sort((t37,e6)=>t37.s-e6.s);let p4=[];for(let t37 of u4){let e6=p4[p4.length-1];!e6||t37.s>e6.e+wt2?p4.push({...t37}):e6.e=Math.max(e6.e,t37.e)}let f2=[],g7=h4;for(let t37 of p4)if(t37.s>g7+wt2&&f2.push({s:g7,e:t37.s}),g7=Math.max(g7,t37.e),g7>=l3-wt2)break;return l3>g7+wt2&&f2.push({s:g7,e:l3}),f2.length===0?[]:f2.filter(t37=>t37.e-t37.s>wt2).map(e6=>{let n5=i2==="x"?{x:e6.s,y:r4}:{x:r4,y:e6.s},o4=i2==="x"?{x:e6.e,y:r4}:{x:r4,y:e6.e};return{parent:t36.parent,facingDirection:t36.facingDirection,start:n5,end:o4,z:t36.z}})})(t35,e4);this.lastUncoveredSegments=n3,this.segmentsWithAdjacentEmptySpace.push(...n3)}getOutput(){return{segmentsWithAdjacentEmptySpace:this.segmentsWithAdjacentEmptySpace}}visualize(){let t35={title:"FindSegmentsWithAdjacentEmptySpace",coordinateSystem:"cartesian",rects:[],points:[],lines:[],circles:[],arrows:[],texts:[]};for(let e4 of this.input.meshNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,stroke:"rgba(0, 0, 0, 0.1)"});for(let e4 of this.unprocessedEdges)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:-.1}),strokeColor:"rgba(0, 0, 255, 0.5)",strokeDash:"5 5"});for(let e4 of this.segmentsWithAdjacentEmptySpace)t35.lines.push({points:[e4.start,e4.end],strokeColor:"rgba(0,255,0, 0.5)"});if(this.lastCandidateEdge&&t35.lines.push({points:[this.lastCandidateEdge.start,this.lastCandidateEdge.end],strokeColor:"blue"}),this.lastOverlappingEdges)for(let e4 of this.lastOverlappingEdges)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:.05}),strokeColor:"red",strokeDash:"2 2"});if(this.lastUncoveredSegments)for(let e4 of this.lastUncoveredSegments)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:-.05}),strokeColor:"green",strokeDash:"2 2"});return t35}},Xt2=t35=>({minX:Math.min(...t35.map(t36=>t36.x)),minY:Math.min(...t35.map(t36=>t36.y)),maxX:Math.max(...t35.map(t36=>t36.x)),maxY:Math.max(...t35.map(t36=>t36.y))}),Ft2=1e-4,kt2=class extends Y3{constructor(t35){super();__publicField(this,"unprocessedSegments",[]);__publicField(this,"expandedSegments",[]);__publicField(this,"lastSegment",null);__publicField(this,"lastSearchBounds",null);__publicField(this,"lastCollidingNodes",null);__publicField(this,"lastSearchCorner1",null);__publicField(this,"lastSearchCorner2",null);__publicField(this,"lastExpandedSegment",null);__publicField(this,"rectSpatialIndex");this.input=t35,this.unprocessedSegments=[...this.input.segmentsWithAdjacentEmptySpace],this.rectSpatialIndex=new mt2,this.rectSpatialIndex.load(this.input.boardVoid?.boardVoidRects.map((t36,e4)=>({capacityMeshNodeId:`void-rect-${e4}`,center:{x:t36.x+t36.width/2,y:t36.y+t36.height/2},width:t36.width,height:t36.height,availableZ:Array.from({length:this.input.boardVoid?.layerCount||0},(t37,e5)=>e5),layer:"void",minX:t36.x,minY:t36.y,maxX:t36.x+t36.width,maxY:t36.y+t36.height}))||[]),this.rectSpatialIndex.load(this.input.inputMeshNodes.map(t36=>({...t36,minX:t36.center.x-t36.width/2,minY:t36.center.y-t36.height/2,maxX:t36.center.x+t36.width/2,maxY:t36.center.y+t36.height/2})))}_step(){if(this.unprocessedSegments.length===0)return void(this.solved=!0);let t35=this.unprocessedSegments.shift();this.lastSegment=t35;let{dx:e4,dy:n3}=Ot2[t35.facingDirection],o3=t35.end.x-t35.start.x,i2=t35.end.y-t35.start.y,s2=Math.sqrt(o3**2+i2**2),r4=o3/s2,a2=i2/s2,c3=null,h4=1,l3={x:t35.start.x+e4*Ft2+r4*Ft2*10,y:t35.start.y+n3*Ft2+a2*Ft2*10},d3={x:t35.end.x+e4*Ft2-r4*Ft2*10,y:t35.end.y+n3*Ft2-a2*Ft2*10};for(this.lastSearchCorner1=l3,this.lastSearchCorner2=d3;(!c3||c3.length===0)&&h4<1e3;){let o4=Xt2([l3,d3,{x:l3.x+e4*h4,y:l3.y+n3*h4},{x:d3.x+e4*h4,y:d3.y+n3*h4}]);this.lastSearchBounds=o4,c3=this.rectSpatialIndex.search(o4).filter(e5=>e5.availableZ.includes(t35.z)).filter(e5=>e5.capacityMeshNodeId!==t35.parent.capacityMeshNodeId),h4*=4}if(!c3||c3.length===0)return;this.lastCollidingNodes=c3;let u4=1/0;for(let e5 of c3){let n4=dt2(t35.start,t35.end,e5);n4<u4&&(u4=n4)}let p4=u4,f2=Xt2([t35.start,t35.end,{x:t35.start.x+e4*p4,y:t35.start.y+n3*p4},{x:t35.end.x+e4*p4,y:t35.end.y+n3*p4}]),g7={x:(f2.minX+f2.maxX)/2,y:(f2.minY+f2.maxY)/2},m3=f2.maxX-f2.minX,y5=f2.maxY-f2.minY,x5={segment:t35,newNode:{capacityMeshNodeId:`new-${t35.parent.capacityMeshNodeId}-${this.expandedSegments.length}`,center:g7,width:m3,height:y5,availableZ:[t35.z],layer:t35.parent.layer}};this.lastExpandedSegment=x5,m3<Ft2||y5<Ft2||(this.expandedSegments.push(x5),this.rectSpatialIndex.insert({...x5.newNode,...f2}))}getOutput(){return{expandedSegments:this.expandedSegments}}visualize(){let t35={title:"ExpandEdgesToEmptySpace",coordinateSystem:"cartesian",rects:[],points:[],lines:[],circles:[],arrows:[],texts:[]};for(let e4 of this.input.inputMeshNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,stroke:"rgba(0, 0, 0, 0.1)",layer:`z${e4.availableZ.join(",")}`,label:[`node ${e4.capacityMeshNodeId}`,`z:${e4.availableZ.join(",")}`].join(`
|
|
337
|
+
`)?.every(str2=>str2.includes("LINESTRING"))}function isWktString(str){return str.startsWith("POINT")||isArrayOfPoints(str)||str.startsWith("LINESTRING")||isArrayOfLines(str)||str.startsWith("MULTILINESTRING")||str.startsWith("POLYGON")||str.startsWith("MULTIPOINT")||str.startsWith("MULTIPOLYGON")||str.startsWith("GEOMETRYCOLLECTION")}Flatten.isWktString=isWktString;Flatten.parseWKT=parseWKT;Flatten.BooleanOperations=BooleanOperations;Flatten.Relations=Relations;init_dist();init_dist5();var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.400",type:"module",files:["dist"],scripts:{start:"cosmos",build:"tsup ./lib/index.ts --minify terser --external @tscircuit/core --external circuit-to-svg --format esm --dts --sourcemap",bench:"bun test tests/spatial-index-bench.test.ts",format:"biome format --write .","format:check":"biome format .","vercel-build":"cosmos-export","repomix:lib":"repomix --ignore 'testing/**,**/TwoRouteHighDensitySolver/**,**/RouteStitchingSolver/**,solvers/CapacitySegmentPointOptimizer/CapacitySegmentPointOptimizer.ts' lib","bug-report":"bun run scripts/download-bug-report.ts","bug-report-with-test":"bun run scripts/create-bug-report-test.ts"},devDependencies:{"@biomejs/biome":"^1.9.4","@radix-ui/react-icons":"^1.3.2","@radix-ui/react-menubar":"^1.1.14","@react-hook/resize-observer":"^2.0.2","@resvg/resvg-js":"^2.6.2","@tscircuit/autorouting-dataset-01":"^1.0.32","@tscircuit/checks":"^0.0.114","@tscircuit/circuit-json-util":"^0.0.90","@tscircuit/core":"^0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/math-utils":"^0.0.27","@tscircuit/rectdiff":"0.0.25","@tscircuit/solver-utils":"^0.0.16","@types/bun":"^1.2.23","@types/fast-json-stable-stringify":"^2.1.2","@types/object-hash":"^3.0.6","@types/rbush":"^4.0.0","@types/react":"^19.0.8","@types/react-dom":"^19.0.3","@vercel/node":"^5.1.7","@vitejs/plugin-react":"^4.3.4","bun-match-svg":"^0.0.14","circuit-json-to-connectivity-map":"^0.0.19","circuit-to-svg":"^0.0.220",clsx:"^2.1.1",flatbush:"^4.4.0","graphics-debug":"^0.0.88","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2",kleur:"^4.1.5","looks-same":"9",rbush:"^4.0.1",react:"18","react-cosmos":"^6.2.3","react-cosmos-plugin-vite":"^6.2.0","react-dom":"18","react-konva":"18",recharts:"^2.15.1","tailwind-merge":"^3.2.0",terser:"^5.43.1","tiny-hypergraph":"git+https://github.com/0hmX/tiny-hypergraph.git#53a92357d6fbaeb6f19ea0948e5e546bd44cc9f4",tsup:"^8.3.6",typescript:"^5.9.3","use-mouse-matrix-transform":"^1.3.0",vite:"^6.0.11","vite-tsconfig-paths":"^5.1.4","zdwiel-dataset":"git+https://github.com/dwiel/tscircuit-benchmark.git#be36518b5bf51755dae92c230061ab3cf4e3e063"},dependencies:{"@tscircuit/high-density-a01":"^0.0.25","fast-json-stable-stringify":"^2.1.0","high-density-repair02":"git+https://github.com/tscircuit/high-density-repair02.git#fc48c9bd54e75a5b6d248b880a4ccbc77ac0b633","object-hash":"^3.0.0"}};init_dist();init_dist3();var import_react=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants24=__toESM(require_constants(),1);init_zod();init_dist();init_dist();init_zod();init_dist();init_dist();init_dist();init_dist4();init_zod();var import_react2=__toESM(require_react(),1);init_dist4();init_zod();init_zod();init_dist();function createMap(){return new IndexedMap}var IndexedMap=class _IndexedMap{constructor(){__publicField(this,"index",{});__publicField(this,"array",[])}size(){return this.array.length}empty(){return this.array.length===0}itemAt(index){return this.array[index]}contains(key){return this.index[key.id()]!==void 0}find(key){let i2=this.index[key.id()];return i2===void 0?void 0:this.array[i2]}setDefault(key,factory){let i2=this.index[key.id()];if(i2===void 0){let pair=new Pair(key,factory());return this.index[key.id()]=this.array.length,this.array.push(pair),pair}else return this.array[i2]}insert(key,value){let pair=new Pair(key,value),i2=this.index[key.id()];return i2===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i2]=pair,pair}erase(key){let i2=this.index[key.id()];if(i2===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i2],last=this.array.pop();return pair!==last&&(this.array[i2]=last,this.index[last.first.id()]=i2),pair}copy(){let copy=new _IndexedMap;for(let i2=0;i2<this.array.length;i2++){let pair=this.array[i2].copy();copy.array[i2]=pair,copy.index[pair.first.id()]=i2}return copy}},Pair=class _Pair{constructor(first,second){__publicField(this,"first");__publicField(this,"second");this.first=first,this.second=second}copy(){return new _Pair(this.first,this.second)}};var Variable=class{constructor(name=""){__publicField(this,"_name");__publicField(this,"_value",0);__publicField(this,"_context",null);__publicField(this,"_id",VarId++);this._name=name}id(){return this._id}name(){return this._name}setName(name){this._name=name}context(){return this._context}setContext(context){this._context=context}value(){return this._value}setValue(value){this._value=value}plus(value){return new Expression(this,value)}minus(value){return new Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new Expression([coefficient,this])}divide(coefficient){return new Expression([1/coefficient,this])}toJSON(){return{name:this._name,value:this._value}}toString(){return this._context+"["+this._name+":"+this._value+"]"}},VarId=0;var Expression=class _Expression{constructor(){__publicField(this,"_terms");__publicField(this,"_constant");let parsed=parseArgs(arguments);this._terms=parsed.terms,this._constant=parsed.constant}terms(){return this._terms}constant(){return this._constant}value(){let result=this._constant;for(let i2=0,n3=this._terms.size();i2<n3;i2++){let pair=this._terms.itemAt(i2);result+=pair.first.value()*pair.second}return result}plus(value){return new _Expression(this,value)}minus(value){return new _Expression(this,typeof value=="number"?-value:[-1,value])}multiply(coefficient){return new _Expression([coefficient,this])}divide(coefficient){return new _Expression([1/coefficient,this])}isConstant(){return this._terms.size()==0}toString(){let result=this._terms.array.map(function(pair){return pair.second+"*"+pair.first.toString()}).join(" + ");return!this.isConstant()&&this._constant!==0&&(result+=" + "),result+=this._constant,result}};function parseArgs(args){let constant=0,factory=()=>0,terms=createMap();for(let i2=0,n3=args.length;i2<n3;++i2){let item=args[i2];if(typeof item=="number")constant+=item;else if(item instanceof Variable)terms.setDefault(item,factory).second+=1;else if(item instanceof Expression){constant+=item.constant();let terms2=item.terms();for(let j4=0,k4=terms2.size();j4<k4;j4++){let termPair=terms2.itemAt(j4);terms.setDefault(termPair.first,factory).second+=termPair.second}}else if(item instanceof Array){if(item.length!==2)throw new Error("array must have length 2");let value=item[0],value2=item[1];if(typeof value!="number")throw new Error("array item 0 must be a number");if(value2 instanceof Variable)terms.setDefault(value2,factory).second+=value;else if(value2 instanceof Expression){constant+=value2.constant()*value;let terms2=value2.terms();for(let j4=0,k4=terms2.size();j4<k4;j4++){let termPair=terms2.itemAt(j4);terms.setDefault(termPair.first,factory).second+=termPair.second*value}}else throw new Error("array item 1 must be a variable or expression")}else throw new Error("invalid Expression argument: "+item)}return{terms,constant}}var _Strength=class _Strength{static create(a2,b3,c3,w4=1){let result=0;return result+=Math.max(0,Math.min(1e3,a2*w4))*1e6,result+=Math.max(0,Math.min(1e3,b3*w4))*1e3,result+=Math.max(0,Math.min(1e3,c3*w4)),result}static clip(value){return Math.max(0,Math.min(_Strength.required,value))}};__publicField(_Strength,"required",_Strength.create(1e3,1e3,1e3)),__publicField(_Strength,"strong",_Strength.create(1,0,0)),__publicField(_Strength,"medium",_Strength.create(0,1,0)),__publicField(_Strength,"weak",_Strength.create(0,0,1));var Strength=_Strength;var Operator;(function(Operator2){Operator2[Operator2.Le=0]="Le",Operator2[Operator2.Ge=1]="Ge",Operator2[Operator2.Eq=2]="Eq"})(Operator||(Operator={}));var Constraint=class{constructor(expression,operator,rhs,strength=Strength.required){__publicField(this,"_expression");__publicField(this,"_operator");__publicField(this,"_strength");__publicField(this,"_id",CnId++);this._operator=operator,this._strength=Strength.clip(strength),rhs===void 0&&expression instanceof Expression?this._expression=expression:this._expression=expression.minus(rhs)}id(){return this._id}expression(){return this._expression}op(){return this._operator}strength(){return this._strength}toString(){return this._expression.toString()+" "+["<=",">=","="][this._operator]+" 0 ("+this._strength.toString()+")"}},CnId=0;var Solver=class{constructor(){__publicField(this,"maxIterations",1e3);__publicField(this,"_cnMap",createCnMap());__publicField(this,"_rowMap",createRowMap());__publicField(this,"_varMap",createVarMap());__publicField(this,"_editMap",createEditMap());__publicField(this,"_infeasibleRows",[]);__publicField(this,"_objective",new Row);__publicField(this,"_artificial",null);__publicField(this,"_idTick",0)}createConstraint(lhs,operator,rhs,strength=Strength.required){let cn3=new Constraint(lhs,operator,rhs,strength);return this.addConstraint(cn3),cn3}addConstraint(constraint){if(this._cnMap.find(constraint)!==void 0)throw new Error("duplicate constraint");let data=this._createRow(constraint),row=data.row,tag=data.tag,subject=this._chooseSubject(row,tag);if(subject.type()===SymbolType.Invalid&&row.allDummies())if(nearZero(row.constant()))subject=tag.marker;else throw new Error("unsatisfiable constraint");if(subject.type()===SymbolType.Invalid){if(!this._addWithArtificialVariable(row))throw new Error("unsatisfiable constraint")}else row.solveFor(subject),this._substitute(subject,row),this._rowMap.insert(subject,row);this._cnMap.insert(constraint,tag),this._optimize(this._objective)}removeConstraint(constraint){let cnPair=this._cnMap.erase(constraint);if(cnPair===void 0)throw new Error("unknown constraint");this._removeConstraintEffects(constraint,cnPair.second);let marker=cnPair.second.marker,rowPair=this._rowMap.erase(marker);if(rowPair===void 0){let leaving=this._getMarkerLeavingSymbol(marker);if(leaving.type()===SymbolType.Invalid)throw new Error("failed to find leaving row");rowPair=this._rowMap.erase(leaving),rowPair.second.solveForEx(leaving,marker),this._substitute(marker,rowPair.second)}this._optimize(this._objective)}hasConstraint(constraint){return this._cnMap.contains(constraint)}getConstraints(){return this._cnMap.array.map(({first})=>first)}addEditVariable(variable,strength){if(this._editMap.find(variable)!==void 0)throw new Error("duplicate edit variable");if(strength=Strength.clip(strength),strength===Strength.required)throw new Error("bad required strength");let expr=new Expression(variable),cn3=new Constraint(expr,Operator.Eq,void 0,strength);this.addConstraint(cn3);let info={tag:this._cnMap.find(cn3).second,constraint:cn3,constant:0};this._editMap.insert(variable,info)}removeEditVariable(variable){let editPair=this._editMap.erase(variable);if(editPair===void 0)throw new Error("unknown edit variable");this.removeConstraint(editPair.second.constraint)}hasEditVariable(variable){return this._editMap.contains(variable)}suggestValue(variable,value){let editPair=this._editMap.find(variable);if(editPair===void 0)throw new Error("unknown edit variable");let rows=this._rowMap,info=editPair.second,delta=value-info.constant;info.constant=value;let marker=info.tag.marker,rowPair=rows.find(marker);if(rowPair!==void 0){rowPair.second.add(-delta)<0&&this._infeasibleRows.push(marker),this._dualOptimize();return}let other=info.tag.other;if(rowPair=rows.find(other),rowPair!==void 0){rowPair.second.add(delta)<0&&this._infeasibleRows.push(other),this._dualOptimize();return}for(let i2=0,n3=rows.size();i2<n3;++i2){let rowPair2=rows.itemAt(i2),row=rowPair2.second,coeff=row.coefficientFor(marker);coeff!==0&&row.add(delta*coeff)<0&&rowPair2.first.type()!==SymbolType.External&&this._infeasibleRows.push(rowPair2.first)}this._dualOptimize()}updateVariables(){let vars=this._varMap,rows=this._rowMap;for(let i2=0,n3=vars.size();i2<n3;++i2){let pair=vars.itemAt(i2),rowPair=rows.find(pair.second);rowPair!==void 0?pair.first.setValue(rowPair.second.constant()):pair.first.setValue(0)}}_getVarSymbol(variable){let factory=()=>this._makeSymbol(SymbolType.External);return this._varMap.setDefault(variable,factory).second}_createRow(constraint){let expr=constraint.expression(),row=new Row(expr.constant()),terms=expr.terms();for(let i2=0,n3=terms.size();i2<n3;++i2){let termPair=terms.itemAt(i2);if(!nearZero(termPair.second)){let symbol=this._getVarSymbol(termPair.first),basicPair=this._rowMap.find(symbol);basicPair!==void 0?row.insertRow(basicPair.second,termPair.second):row.insertSymbol(symbol,termPair.second)}}let objective=this._objective,strength=constraint.strength(),tag={marker:INVALID_SYMBOL,other:INVALID_SYMBOL};switch(constraint.op()){case Operator.Le:case Operator.Ge:{let coeff=constraint.op()===Operator.Le?1:-1,slack=this._makeSymbol(SymbolType.Slack);if(tag.marker=slack,row.insertSymbol(slack,coeff),strength<Strength.required){let error=this._makeSymbol(SymbolType.Error);tag.other=error,row.insertSymbol(error,-coeff),objective.insertSymbol(error,strength)}break}case Operator.Eq:{if(strength<Strength.required){let errplus=this._makeSymbol(SymbolType.Error),errminus=this._makeSymbol(SymbolType.Error);tag.marker=errplus,tag.other=errminus,row.insertSymbol(errplus,-1),row.insertSymbol(errminus,1),objective.insertSymbol(errplus,strength),objective.insertSymbol(errminus,strength)}else{let dummy=this._makeSymbol(SymbolType.Dummy);tag.marker=dummy,row.insertSymbol(dummy)}break}}return row.constant()<0&&row.reverseSign(),{row,tag}}_chooseSubject(row,tag){let cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);if(pair.first.type()===SymbolType.External)return pair.first}let type=tag.marker.type();return(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.marker)<0?tag.marker:(type=tag.other.type(),(type===SymbolType.Slack||type===SymbolType.Error)&&row.coefficientFor(tag.other)<0?tag.other:INVALID_SYMBOL)}_addWithArtificialVariable(row){let art=this._makeSymbol(SymbolType.Slack);this._rowMap.insert(art,row.copy()),this._artificial=row.copy(),this._optimize(this._artificial);let success=nearZero(this._artificial.constant());this._artificial=null;let pair=this._rowMap.erase(art);if(pair!==void 0){let basicRow=pair.second;if(basicRow.isConstant())return success;let entering=this._anyPivotableSymbol(basicRow);if(entering.type()===SymbolType.Invalid)return!1;basicRow.solveForEx(art,entering),this._substitute(entering,basicRow),this._rowMap.insert(entering,basicRow)}let rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2)rows.itemAt(i2).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2);pair.second.substitute(symbol,row),pair.second.constant()<0&&pair.first.type()!==SymbolType.External&&this._infeasibleRows.push(pair.first)}this._objective.substitute(symbol,row),this._artificial&&this._artificial.substitute(symbol,row)}_optimize(objective){let iterations=0;for(;iterations<this.maxIterations;){let entering=this._getEnteringSymbol(objective);if(entering.type()===SymbolType.Invalid)return;let leaving=this._getLeavingSymbol(entering);if(leaving.type()===SymbolType.Invalid)throw new Error("the objective is unbounded");let row=this._rowMap.erase(leaving).second;row.solveForEx(leaving,entering),this._substitute(entering,row),this._rowMap.insert(entering,row),iterations++}throw new Error("solver iterations exceeded")}_dualOptimize(){let rows=this._rowMap,infeasible=this._infeasibleRows;for(;infeasible.length!==0;){let leaving=infeasible.pop(),pair=rows.find(leaving);if(pair!==void 0&&pair.second.constant()<0){let entering=this._getDualEnteringSymbol(pair.second);if(entering.type()===SymbolType.Invalid)throw new Error("dual optimize failed");let row=pair.second;rows.erase(leaving),row.solveForEx(leaving,entering),this._substitute(entering,row),rows.insert(entering,row)}}}_getEnteringSymbol(objective){let cells=objective.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),symbol=pair.first;if(pair.second<0&&symbol.type()!==SymbolType.Dummy)return symbol}return INVALID_SYMBOL}_getDualEnteringSymbol(row){let ratio=Number.MAX_VALUE,entering=INVALID_SYMBOL,cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),symbol=pair.first,c3=pair.second;if(c3>0&&symbol.type()!==SymbolType.Dummy){let r4=this._objective.coefficientFor(symbol)/c3;r4<ratio&&(ratio=r4,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2),symbol=pair.first;if(symbol.type()!==SymbolType.External){let row=pair.second,temp=row.coefficientFor(entering);if(temp<0){let temp_ratio=-row.constant()/temp;temp_ratio<ratio&&(ratio=temp_ratio,found=symbol)}}}return found}_getMarkerLeavingSymbol(marker){let dmax=Number.MAX_VALUE,r12=dmax,r22=dmax,invalid=INVALID_SYMBOL,first=invalid,second=invalid,third=invalid,rows=this._rowMap;for(let i2=0,n3=rows.size();i2<n3;++i2){let pair=rows.itemAt(i2),row=pair.second,c3=row.coefficientFor(marker);if(c3===0)continue;let symbol=pair.first;if(symbol.type()===SymbolType.External)third=symbol;else if(c3<0){let r4=-row.constant()/c3;r4<r12&&(r12=r4,first=symbol)}else{let r4=row.constant()/c3;r4<r22&&(r22=r4,second=symbol)}}return first!==invalid?first:second!==invalid?second:third}_removeConstraintEffects(cn3,tag){tag.marker.type()===SymbolType.Error&&this._removeMarkerEffects(tag.marker,cn3.strength()),tag.other.type()===SymbolType.Error&&this._removeMarkerEffects(tag.other,cn3.strength())}_removeMarkerEffects(marker,strength){let pair=this._rowMap.find(marker);pair!==void 0?this._objective.insertRow(pair.second,-strength):this._objective.insertSymbol(marker,-strength)}_anyPivotableSymbol(row){let cells=row.cells();for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2),type=pair.first.type();if(type===SymbolType.Slack||type===SymbolType.Error)return pair.first}return INVALID_SYMBOL}_makeSymbol(type){return new Symbol2(type,this._idTick++)}};function nearZero(value){let eps=1e-8;return value<0?-value<eps:value<eps}function createCnMap(){return createMap()}function createRowMap(){return createMap()}function createVarMap(){return createMap()}function createEditMap(){return createMap()}var SymbolType;(function(SymbolType2){SymbolType2[SymbolType2.Invalid=0]="Invalid",SymbolType2[SymbolType2.External=1]="External",SymbolType2[SymbolType2.Slack=2]="Slack",SymbolType2[SymbolType2.Error=3]="Error",SymbolType2[SymbolType2.Dummy=4]="Dummy"})(SymbolType||(SymbolType={}));var Symbol2=class{constructor(type,id2){__publicField(this,"_id");__publicField(this,"_type");this._id=id2,this._type=type}id(){return this._id}type(){return this._type}},INVALID_SYMBOL=new Symbol2(SymbolType.Invalid,-1),Row=class _Row{constructor(constant=0){__publicField(this,"_cellMap",createMap());__publicField(this,"_constant");this._constant=constant}cells(){return this._cellMap}constant(){return this._constant}isConstant(){return this._cellMap.empty()}allDummies(){let cells=this._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2)if(cells.itemAt(i2).first.type()!==SymbolType.Dummy)return!1;return!0}copy(){let theCopy=new _Row(this._constant);return theCopy._cellMap=this._cellMap.copy(),theCopy}add(value){return this._constant+=value}insertSymbol(symbol,coefficient=1){let pair=this._cellMap.setDefault(symbol,()=>0);nearZero(pair.second+=coefficient)&&this._cellMap.erase(symbol)}insertRow(other,coefficient=1){this._constant+=other._constant*coefficient;let cells=other._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i2=0,n3=cells.size();i2<n3;++i2){let pair=cells.itemAt(i2);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i2=0,n3=cells.size();i2<n3;++i2)cells.itemAt(i2).second*=coeff}solveForEx(lhs,rhs){this.insertSymbol(lhs,-1),this.solveFor(rhs)}coefficientFor(symbol){let pair=this._cellMap.find(symbol);return pair!==void 0?pair.second:0}substitute(symbol,row){let pair=this._cellMap.erase(symbol);pair!==void 0&&this.insertRow(row,pair.second)}};var import_debug9=__toESM(require_browser(),1);init_dist6();var import_react3=__toESM(require_react(),1);init_dist();var import_debug10=__toESM(require_browser(),1);init_dist3();init_dist6();init_dist6();init_dist3();init_dist6();init_dist6();init_dist();init_dist6();init_src();init_dist6();init_dist3();init_dist6();init_dist3();init_dist6();init_dist6();init_dist3();init_dist6();init_dist6();init_dist6();init_dist6();init_dist6();init_dist6();function distance5(x12,y12,x22,y22){return Math.sqrt((x22-x12)**2+(y22-y12)**2)}var addStartAndEndPortIdsIfMissing=soup=>{let pcbPorts=soup.filter(item=>item.type==="pcb_port"),pcbSmtPads=soup.filter(item=>item.type==="pcb_smtpad"),pcbTraces=soup.filter(item=>item.type==="pcb_trace");function findPortIdOverlappingPoint(point6,options={}){let traceWidth=options.traceWidth||0,directPort=pcbPorts.find(port=>distance5(port.x,port.y,point6.x,point6.y)<.01);if(directPort)return directPort.pcb_port_id;if(options.isFirstOrLastPoint){let smtPad=pcbSmtPads.find(pad2=>{if(pad2.shape==="rect")return Math.abs(point6.x-pad2.x)<pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<pad2.height/2+traceWidth/2;if(pad2.shape==="circle")return distance5(point6.x,point6.y,pad2.x,pad2.y)<pad2.radius});if(smtPad)return smtPad.pcb_port_id??null}return null}for(let trace of pcbTraces)for(let index=0;index<trace.route.length;index++){let segment2=trace.route[index],isFirstOrLastPoint=index===0||index===trace.route.length-1;if(segment2.route_type==="wire"){if(!segment2.start_pcb_port_id&&index===0){let startPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});startPortId&&(segment2.start_pcb_port_id=startPortId)}if(!segment2.end_pcb_port_id&&index===trace.route.length-1){let endPortId=findPortIdOverlappingPoint(segment2,{isFirstOrLastPoint,traceWidth:segment2.width});endPortId&&(segment2.end_pcb_port_id=endPortId)}}}},CIRCUIT_JSON_ID_PATTERN=/\b(?:pcb|source|schematic|subcircuit)_[a-z0-9_]+\b/i,sanitizeReadableName=(candidate,id2,fallbackLabel)=>!candidate||candidate===id2||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id2)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id2,"");if(readableName)return readableName}return""},getReadableNameForComponent=(circuitJson,pcbComponentId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,pcbComponentId),pcbComponentId,"component"),getReadableNameForPort=(circuitJson,pcbPortId)=>{let pcbPort=circuitJson.find(element=>element.type==="pcb_port"&&element.pcb_port_id===pcbPortId);if(pcbPort?.type==="pcb_port"){let sourcePort=circuitJson.find(element=>element.type==="source_port"&&element.source_port_id===pcbPort.source_port_id),sourceComponent=sourcePort?.type==="source_port"?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===sourcePort.source_component_id):null,readableSourceComponentName=firstReadableName([sourceComponent?.type==="source_component"?sourceComponent.name:null],sourceComponent?.type==="source_component"?sourceComponent.source_component_id:""),readableSourcePortName=firstReadableName([sourcePort?.type==="source_port"?sourcePort.name:null,sourcePort?.type==="source_port"?sourcePort.pin_number?.toString():null,sourcePort?.type==="source_port"?sourcePort.port_hints?.[0]:null],sourcePort?.type==="source_port"?sourcePort.source_port_id:"");if(readableSourceComponentName&&readableSourcePortName)return`${readableSourceComponentName}.${readableSourcePortName}`;if(readableSourcePortName)return readableSourcePortName}return sanitizeReadableName(getReadableNameForPcbPort(circuitJson,pcbPortId)??getReadableNameForElement(circuitJson,pcbPortId),pcbPortId,"port")},getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function checkEachPcbPortConnectedToPcbTraces(circuitJson){addStartAndEndPortIdsIfMissing(circuitJson);let sourceTraces=circuitJson.filter(item=>item.type==="source_trace"),pcbPorts=circuitJson.filter(item=>item.type==="pcb_port"),errors=[],connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),sourcePortToPcbPort=new Map;for(let pcbPort of pcbPorts)sourcePortToPcbPort.set(pcbPort.source_port_id,pcbPort);for(let sourceTrace of sourceTraces){let connectedSourcePortIds=sourceTrace.connected_source_port_ids;if(connectedSourcePortIds.length<2)continue;let pcbPortsInTrace=[],missingPcbPorts=[];for(let sourcePortId of connectedSourcePortIds){let pcbPort=sourcePortToPcbPort.get(sourcePortId);pcbPort?pcbPortsInTrace.push(pcbPort):missingPcbPorts.push(sourcePortId)}if(pcbPortsInTrace.length<2)continue;let firstPcbPort=pcbPortsInTrace[0],referenceNetId=connectivityMap.getNetConnectedToId(firstPcbPort.pcb_port_id);connectivityMap.getIdsConnectedToNet(referenceNetId).filter(id2=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id2||"route_id"in element&&element.route_id===id2))).length===0&&new Set(pcbPortsInTrace.map(p4=>p4.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p4=>getReadableNameForPort(circuitJson,p4.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p4=>p4.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p4=>p4.pcb_component_id).filter(id2=>id2!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var SpatialObjectIndex=class{constructor({objects,getBounds:getBounds3,getId,CELL_SIZE}){__publicField(this,"buckets");__publicField(this,"objectsById");__publicField(this,"getBounds");__publicField(this,"getId");__publicField(this,"CELL_SIZE",.4);__publicField(this,"_idCounter",0);this.buckets=new Map,this.objectsById=new Map,this.getBounds=getBounds3,this.getId=getId??(()=>this._getNextId()),this.CELL_SIZE=CELL_SIZE??this.CELL_SIZE;for(let obj of objects)this.addObject(obj)}_getNextId(){return`${this._idCounter++}`}addObject(obj){let bounds=this.getBounds(obj),spatialIndexId=this.getId(obj),objWithId={...obj,spatialIndexId};this.objectsById.set(spatialIndexId,objWithId);let minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);bucket?bucket.push(objWithId):this.buckets.set(bucketKey,[objWithId])}}removeObject(id2){let obj=this.objectsById.get(id2);if(!obj)return!1;this.objectsById.delete(id2);let bounds=this.getBounds(obj),minBucketX=Math.floor(bounds.minX/this.CELL_SIZE),minBucketY=Math.floor(bounds.minY/this.CELL_SIZE),maxBucketX=Math.floor(bounds.maxX/this.CELL_SIZE),maxBucketY=Math.floor(bounds.maxY/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey);if(bucket){let index=bucket.findIndex(item=>item.spatialIndexId===id2);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x5,y5){return`${Math.floor(x5/this.CELL_SIZE)}x${Math.floor(y5/this.CELL_SIZE)}`}getObjectsInBounds(bounds,margin=0){let objects=[],addedIds=new Set,minBucketX=Math.floor((bounds.minX-margin)/this.CELL_SIZE),minBucketY=Math.floor((bounds.minY-margin)/this.CELL_SIZE),maxBucketX=Math.floor((bounds.maxX+margin)/this.CELL_SIZE),maxBucketY=Math.floor((bounds.maxY+margin)/this.CELL_SIZE);for(let bx3=minBucketX;bx3<=maxBucketX;bx3++)for(let by3=minBucketY;by3<=maxBucketY;by3++){let bucketKey=`${bx3}x${by3}`,bucket=this.buckets.get(bucketKey)||[];for(let obj of bucket){let id2=obj.spatialIndexId;addedIds.has(id2)||(addedIds.add(id2),objects.push(obj))}}return objects}},getCollidableBounds=collidable=>collidable.type==="pcb_trace_segment"?{minX:Math.min(collidable.x1,collidable.x2),minY:Math.min(collidable.y1,collidable.y2),maxX:Math.max(collidable.x1,collidable.x2),maxY:Math.max(collidable.y1,collidable.y2)}:getBoundsOfPcbElements([collidable]),DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=.15,DEFAULT_VIA_BOARD_MARGIN=.3,DEFAULT_SAME_NET_VIA_MARGIN=.2,DEFAULT_DIFFERENT_NET_VIA_MARGIN=.3,EPSILON=.005;function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id&&connectedPcbPorts.add(segment2.start_pcb_port_id),segment2.end_pcb_port_id&&connectedPcbPorts.add(segment2.end_pcb_port_id));return Array.from(connectedPcbPorts)}function getPcbPortIdsConnectedToTraces(traces){let connectedPorts=new Set;for(let trace of traces)for(let portId of getPcbPortIdsConnectedToTrace(trace))connectedPorts.add(portId);return Array.from(connectedPorts)}var getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a2={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a2.x-a12.x,y:a2.y-a12.y},vb2={x:b22.x-b12.x,y:b22.y-b12.y},lenSqrA=va3.x*va3.x+va3.y*va3.y,lenSqrB=vb2.x*vb2.x+vb2.y*vb2.y;if(lenSqrA===0||lenSqrB===0){if(lenSqrA===0&&lenSqrB===0)return{x:(a12.x+b12.x)/2,y:(a12.y+b12.y)/2};if(lenSqrA===0){let t210=clamp3(((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB,0,1),closestOnB2={x:b12.x+t210*vb2.x,y:b12.y+t210*vb2.y};return{x:(a12.x+closestOnB2.x)/2,y:(a12.y+closestOnB2.y)/2}}let t35=clamp3(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t35*va3.x,y:a12.y+t35*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w4={x:a12.x-b12.x,y:a12.y-b12.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a2,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA=clamp3(tA,0,1),tB=clamp3(tB,0,1),tB=(tA*dotAB+dotBW)/dotBB,tB=clamp3(tB,0,1),tA=(tB*dotAB-dotAW)/dotAA,tA=clamp3(tA,0,1);let closestOnA={x:a12.x+tA*va3.x,y:a12.y+tA*va3.y},closestOnB={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance32=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a2,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA=clamp3(tA,0,1);let pointOnA1={x:a12.x+tA*va3.x,y:a12.y+tA*va3.y},tA2=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA2=clamp3(tA2,0,1);let pointOnA2={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tB=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB=clamp3(tB,0,1);let pointOnB1={x:b12.x+tB*vb2.x,y:b12.y+tB*vb2.y},tB2=((a2.x-b12.x)*vb2.x+(a2.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp3(tB2,0,1);let pointOnB2={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},closestPair=[{pointA:pointOnA1,pointB:b12,distance:Math.sqrt((pointOnA1.x-b12.x)**2+(pointOnA1.y-b12.y)**2)},{pointA:pointOnA2,pointB:b22,distance:Math.sqrt((pointOnA2.x-b22.x)**2+(pointOnA2.y-b22.y)**2)},{pointA:a12,pointB:pointOnB1,distance:Math.sqrt((a12.x-pointOnB1.x)**2+(a12.y-pointOnB1.y)**2)},{pointA:a2,pointB:pointOnB2,distance:Math.sqrt((a2.x-pointOnB2.x)**2+(a2.y-pointOnB2.y)**2)}].reduce((closest,current2)=>current2.distance<closest.distance?current2:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp3=(value,min,max)=>Math.max(min,Math.min(max,value)),getRadiusOfCircuitJsonElement=obj=>{if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle")return obj.outer_diameter/2;if(obj.type==="pcb_hole"&&obj.hole_shape==="circle")return obj.hole_diameter/2;if(obj.type==="pcb_smtpad"&&obj.shape==="circle")return obj.radius;throw new Error(`Could not determine radius of element: ${JSON.stringify(obj)}`)},getClosestPointBetweenSegmentAndBounds=(segment2,bounds)=>{let p12={x:segment2.x1,y:segment2.y1},p22={x:segment2.x2,y:segment2.y2},minX=bounds.minX,minY=bounds.minY,maxX=bounds.maxX,maxY=bounds.maxY;if(p12.x===p22.x&&p12.y===p22.y){let closestX=Math.max(minX,Math.min(maxX,p12.x)),closestY=Math.max(minY,Math.min(maxY,p12.y));return closestX===p12.x&&closestY===p12.y?{x:p12.x,y:p12.y}:{x:closestX,y:closestY}}let dx3=p22.x-p12.x,dy3=p22.y-p12.y,tMinX=dx3!==0?(minX-p12.x)/dx3:Number.NEGATIVE_INFINITY,tMaxX=dx3!==0?(maxX-p12.x)/dx3:Number.POSITIVE_INFINITY,tMinY=dy3!==0?(minY-p12.y)/dy3:Number.NEGATIVE_INFINITY,tMaxY=dy3!==0?(maxY-p12.y)/dy3:Number.POSITIVE_INFINITY,tEnter=Math.max(Math.min(tMinX,tMaxX),Math.min(tMinY,tMaxY)),tExit=Math.min(Math.max(tMinX,tMaxX),Math.max(tMinY,tMaxY));if(tEnter<=tExit&&tExit>=0&&tEnter<=1){let t35=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t35*dx3,y:p12.y+t35*dy3}}let closestToP1={x:Math.max(minX,Math.min(maxX,p12.x)),y:Math.max(minY,Math.min(maxY,p12.y))},closestToP2={x:Math.max(minX,Math.min(maxX,p22.x)),y:Math.max(minY,Math.min(maxY,p22.y))},distToP1Squared=(closestToP1.x-p12.x)**2+(closestToP1.y-p12.y)**2,distToP2Squared=(closestToP2.x-p22.x)**2+(closestToP2.y-p22.y)**2,edges=[{start:{x:minX,y:minY},end:{x:maxX,y:minY}},{start:{x:maxX,y:minY},end:{x:maxX,y:maxY}},{start:{x:maxX,y:maxY},end:{x:minX,y:maxY}},{start:{x:minX,y:maxY},end:{x:minX,y:minY}}],minDistance=Math.min(distToP1Squared,distToP2Squared),closestPoint=distToP1Squared<=distToP2Squared?closestToP1:closestToP2,clamp22=(value,min,max)=>Math.max(min,Math.min(max,value));for(let edge of edges){let va3={x:p22.x-p12.x,y:p22.y-p12.y},vb2={x:edge.end.x-edge.start.x,y:edge.end.y-edge.start.y},w4={x:p12.x-edge.start.x,y:p12.y-edge.start.y},dotAA=va3.x*va3.x+va3.y*va3.y,dotAB=va3.x*vb2.x+va3.y*vb2.y,dotAW=va3.x*w4.x+va3.y*w4.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w4.x+vb2.y*w4.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA=(dotAB*dotBW-dotBB*dotAW)/denominator,tB=(dotAA*dotBW-dotAB*dotAW)/denominator;tA=clamp22(tA,0,1),tB=clamp22(tB,0,1);let closestOnSegment={x:p12.x+tA*va3.x,y:p12.y+tA*va3.y},closestOnEdge={x:edge.start.x+tB*vb2.x,y:edge.start.y+tB*vb2.y},dx22=closestOnSegment.x-closestOnEdge.x,dy22=closestOnSegment.y-closestOnEdge.y,distSquared=dx22*dx22+dy22*dy22;distSquared<minDistance&&(minDistance=distSquared,closestPoint={x:(closestOnSegment.x+closestOnEdge.x)/2,y:(closestOnSegment.y+closestOnEdge.y)/2})}return closestPoint};function getLayersOfPcbElement(obj){return obj.type==="pcb_trace_segment"?[obj.layer]:obj.type==="pcb_smtpad"?[obj.layer]:obj.type==="pcb_plated_hole"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_hole"?[...all_layers]:obj.type==="pcb_via"?Array.isArray(obj.layers)?obj.layers:[...all_layers]:obj.type==="pcb_keepout"?Array.isArray(obj.layers)?obj.layers:[]:[]}function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minSpacing=DEFAULT_TRACE_MARGIN}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i2=0;i2<pcbTrace.route.length-1;i2++){let p12=pcbTrace.route[i2],p22=pcbTrace.route[i2+1];p12.route_type==="wire"&&p22.route_type==="wire"&&p12.layer===p22.layer&&segments.push({type:"pcb_trace_segment",pcb_trace_id:pcbTrace.pcb_trace_id,_pcbTrace:pcbTrace,thickness:"width"in p12?p12.width:"width"in p22?p22.width:DEFAULT_TRACE_THICKNESS,layer:p12.layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}return segments}),pcbSmtPads=cju_default(circuitJson).pcb_smtpad.list(),pcbPlatedHoles=cju_default(circuitJson).pcb_plated_hole.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id2=>getReadableNameForElement(circuitJson,id2),errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minSpacing,bounds=getCollidableBounds(segmentA),nearbyObjects=spatialIndex.getObjectsInBounds(bounds,requiredMargin+segmentA.thickness/2);if(!(segmentA.x1===segmentA.x2&&segmentA.y1===segmentA.y2))for(let obj of nearbyObjects){if(!getLayersOfPcbElement(obj).includes(segmentA.layer))continue;if(obj.type==="pcb_trace_segment"){let segmentB=obj;if(segmentA.layer!==segmentB.layer||connMap.areIdsConnected(segmentA.pcb_trace_id,segmentB.pcb_trace_id))continue;let gap2=segmentToSegmentMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:segmentB.x1,y:segmentB.y1},{x:segmentB.x2,y:segmentB.y2})-segmentA.thickness/2-segmentB.thickness/2;if(gap2>minSpacing-EPSILON)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${segmentB.pcb_trace_id}`,pcb_trace_error_id_reverse=`overlap_${segmentB.pcb_trace_id}_${segmentA.pcb_trace_id}`;if(errorIds.has(pcb_trace_error_id)||errorIds.has(pcb_trace_error_id_reverse))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${getReadableName(segmentB.pcb_trace_id)} ${gap2<0?"(accidental contact)":`(gap: ${gap2.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:[],center:getClosestPointBetweenSegments(segmentA,segmentB),pcb_port_ids:getPcbPortIdsConnectedToTraces([segmentA._pcbTrace,segmentB._pcbTrace])});continue}let primaryObjId=getPrimaryId(obj);if(connMap.areIdsConnected(segmentA.pcb_trace_id,"pcb_trace_id"in obj?obj.pcb_trace_id:primaryObjId))continue;if(obj.type==="pcb_via"||obj.type==="pcb_plated_hole"&&obj.shape==="circle"||obj.type==="pcb_hole"||obj.type==="pcb_smtpad"&&obj.shape==="circle"){let radius=getRadiusOfCircuitJsonElement(obj),gap2=segmentToCircleMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},{x:obj.x,y:obj.y,radius})-segmentA.thickness/2;if(gap2>minSpacing-EPSILON)continue;let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${obj.type} "${getReadableName(getPrimaryId(obj))}" ${gap2<0?"(accidental contact)":`(gap: ${gap2.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}let gap=segmentToBoundsMinDistance({x:segmentA.x1,y:segmentA.y1},{x:segmentA.x2,y:segmentA.y2},getCollidableBounds(obj))-segmentA.thickness/2;if(gap+EPSILON<requiredMargin){let pcb_trace_error_id=`overlap_${segmentA.pcb_trace_id}_${primaryObjId}`;if(errorIds.has(pcb_trace_error_id))continue;errorIds.add(pcb_trace_error_id),errors.push({type:"pcb_trace_error",error_type:"pcb_trace_error",message:`PCB trace ${getReadableName(segmentA.pcb_trace_id)} overlaps with ${obj.type} "${getReadableName(getPrimaryId(obj))}" ${gap<0?"(accidental contact)":`(gap: ${gap.toFixed(3)}mm)`}`,pcb_trace_id:segmentA.pcb_trace_id,source_trace_id:"",pcb_trace_error_id,pcb_component_ids:["pcb_component_id"in obj?obj.pcb_component_id:void 0].filter(Boolean),center:getClosestPointBetweenSegmentAndBounds(segmentA,getCollidableBounds(obj)),pcb_port_ids:[...getPcbPortIdsConnectedToTraces([segmentA._pcbTrace]),"pcb_port_id"in obj?obj.pcb_port_id:void 0].filter(Boolean)})}}}return errors}function checkViasOffBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length===0)return[];if(board.width===void 0||board.height===void 0)return[];let boardMinX=board.center.x-board.width/2,boardMaxX=board.center.x+board.width/2,boardMinY=board.center.y-board.height/2,boardMaxY=board.center.y+board.height/2,errors=[];for(let via of vias){let viaRadius=via.outer_diameter/2,viaMinX=via.x-viaRadius,viaMaxX=via.x+viaRadius,viaMinY=via.y-viaRadius,viaMaxY=via.y+viaRadius;if(viaMinX<boardMinX+DEFAULT_VIA_BOARD_MARGIN||viaMaxX>boardMaxX-DEFAULT_VIA_BOARD_MARGIN||viaMinY<boardMinY+DEFAULT_VIA_BOARD_MARGIN||viaMaxY>boardMaxY-DEFAULT_VIA_BOARD_MARGIN){let viaName=getReadableNameForElement(circuitJson,via.pcb_via_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`out_of_board_${via.pcb_via_id}`,message:`Via ${viaName} is outside or crossing the board boundary`,error_type:"pcb_placement_error"})}}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size2,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size2.width/2,hh3=size2.height/2,corners=[new Point$3(cx3-hw2,cy3-hh3),new Point$3(cx3+hw2,cy3-hh3),new Point$3(cx3+hw2,cy3+hh3),new Point$3(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt4=>{let p4=applyToPoint(matrix2,{x:pt4.x,y:pt4.y});return new Point$3(p4.x,p4.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p4=>new Point$3(p4.x,p4.y)),poly=new Polygon$1(points);return isPolygonCCW(poly)||poly.reverse(),poly}return board.center&&typeof board.width=="number"&&typeof board.height=="number"?rectanglePolygon({center:board.center,size:{width:board.width,height:board.height},rotationDeg:0}):null}function getComponentName({circuitJson,component}){if(component.source_component_id){let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===component.source_component_id);if(sourceComponent&&"name"in sourceComponent&&sourceComponent.name)return sourceComponent.name}return getReadableNameForComponent(circuitJson,component.pcb_component_id)}function computeOverlapDistance(compPoly,boardPoly,componentCenter,componentWidth,componentHeight,rotationDeg){let centerPoint=new Point$3(componentCenter.x,componentCenter.y);if(!boardPoly.contains(centerPoint)){let dist=boardPoly.distanceTo(centerPoint);return Array.isArray(dist)?dist[0]:Number(dist)||0}let hw2=componentWidth/2,hh3=componentHeight/2,corners=[{x:componentCenter.x-hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y-hh3},{x:componentCenter.x+hw2,y:componentCenter.y+hh3},{x:componentCenter.x-hw2,y:componentCenter.y+hh3}],midpoints=[];for(let i2=0;i2<4;i2++){let next2=(i2+1)%4;midpoints.push({x:(corners[i2].x+corners[next2].x)/2,y:(corners[i2].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint5=pt4=>{let p4=applyToPoint(matrix2,pt4);return new Point$3(p4.x,p4.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint5),maxDistance=0;for(let pt4 of rotatedPoints)if(!boardPoly.contains(pt4)){let dist=boardPoly.distanceTo(pt4),d3=Array.isArray(dist)?dist[0]:Number(dist)||0;d3>maxDistance&&(maxDistance=d3)}if(maxDistance>0)return maxDistance;try{let intersection=BooleanOperations.intersect(compPoly,boardPoly),intersectionArea=0;intersection?Array.isArray(intersection)?intersectionArea=intersection.reduce((sum,p4)=>sum+(typeof p4.area=="function"?p4.area():0),0):typeof intersection.area=="function"?intersectionArea=intersection.area():intersectionArea=0:intersectionArea=0;let compArea=compPoly.area();if(intersectionArea>0&&intersectionArea<compArea){let overlapRatio=1-intersectionArea/compArea,compWidth=Math.abs(componentWidth),compHeight=Math.abs(componentHeight);return Math.min(compWidth,compHeight)*overlapRatio}else return .1}catch{return .1}}function getRepositionSuggestion({componentPoly,boardPoly}){let boardBox=boardPoly.box,componentBox=componentPoly.box,deltaX=0,deltaY=0;if(componentBox.xmin<boardBox.xmin?deltaX=boardBox.xmin-componentBox.xmin:componentBox.xmax>boardBox.xmax&&(deltaX=boardBox.xmax-componentBox.xmax),componentBox.ymin<boardBox.ymin?deltaY=boardBox.ymin-componentBox.ymin:componentBox.ymax>boardBox.ymax&&(deltaY=boardBox.ymax-componentBox.ymax),deltaX===0&&deltaY===0)return null;let xDir=deltaX>=0?"right":"left",yDir=deltaY>=0?"up":"down",absDx=Math.abs(Math.round(deltaX*100)/100),absDy=Math.abs(Math.round(deltaY*100)/100);return absDx>0&&absDy>0?`Try moving it ${absDx}mm ${xDir} and ${absDy}mm ${yDir} to fit within the board edge.`:absDx>0?`Try moving it ${absDx}mm ${xDir} to fit within the board edge.`:`Try moving it ${absDy}mm ${yDir} to fit within the board edge.`}function checkPcbComponentsOutOfBoard(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let boardPoly=boardToPolygon({board});if(!boardPoly)return[];let components=circuitJson.filter(el3=>el3.type==="pcb_component");if(components.length===0)return[];let errors=[];for(let c3 of components){if(c3.is_allowed_to_be_off_board||!c3.center||typeof c3.width!="number"||typeof c3.height!="number"||c3.width<=0||c3.height<=0)continue;let compPoly=rectanglePolygon({center:c3.center,size:{width:c3.width,height:c3.height},rotationDeg:0});if(compPoly.area()===0||boardPoly.contains(compPoly))continue;let overlapDistance=computeOverlapDistance(compPoly,boardPoly,c3.center,c3.width,c3.height,0),compName=getComponentName({circuitJson,component:c3}),overlapDistanceMm=Math.round(overlapDistance*100)/100,repositionSuggestion=getRepositionSuggestion({componentPoly:compPoly,boardPoly});errors.push({type:"pcb_component_outside_board_error",error_type:"pcb_component_outside_board_error",pcb_component_outside_board_error_id:`pcb_component_outside_board_${c3.pcb_component_id}`,message:`Component ${compName} extends outside board boundaries by ${overlapDistanceMm}mm.${repositionSuggestion?` ${repositionSuggestion}`:""}`,pcb_component_id:c3.pcb_component_id,pcb_board_id:board.pcb_board_id,component_center:c3.center,component_bounds:{min_x:compPoly.box.xmin,max_x:compPoly.box.xmax,min_y:compPoly.box.ymin,max_y:compPoly.box.ymax},subcircuit_id:c3.subcircuit_id,source_component_id:c3.source_component_id})}return errors}function distance22(a2,b3){return Math.hypot(a2.x-b3.x,a2.y-b3.y)}function viasAreAtSameLocation(a2,b3){return distance22(a2,b3)<=EPSILON}function checkSameNetViaSpacing(circuitJson,{connMap,minSpacing=DEFAULT_SAME_NET_VIA_MARGIN}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i2=0;i2<vias.length;i2++)for(let j4=i2+1;j4<vias.length;j4++){let viaA=vias[i2],viaB=vias[j4];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.outer_diameter/2-viaB.outer_diameter/2;if(gap+EPSILON>=minSpacing)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`same_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minSpacing,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minSpacing=DEFAULT_DIFFERENT_NET_VIA_MARGIN}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i2=0;i2<vias.length;i2++)for(let j4=i2+1;j4<vias.length;j4++){let viaA=vias[i2],viaB=vias[j4];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.outer_diameter/2-viaB.outer_diameter/2;if(gap+EPSILON>=minSpacing)continue;let pairId=[viaA.pcb_via_id,viaB.pcb_via_id].sort().join("_");reported.has(pairId)||(reported.add(pairId),errors.push({type:"pcb_via_clearance_error",pcb_error_id:`different_net_vias_close_${pairId}`,message:`Vias ${getReadableNameForElement(circuitJson,viaA.pcb_via_id)} and ${getReadableNameForElement(circuitJson,viaB.pcb_via_id)} from different nets are too close together (gap: ${gap.toFixed(3)}mm)`,error_type:"pcb_via_clearance_error",pcb_via_ids:[viaA.pcb_via_id,viaB.pcb_via_id],minimum_clearance:minSpacing,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}var getSourceTraceIdsFromPcbTrace=pcbTraceSourceTraceId=>pcbTraceSourceTraceId?pcbTraceSourceTraceId.includes("__")?pcbTraceSourceTraceId.split("__").filter(part=>part.startsWith("source_trace_")):[pcbTraceSourceTraceId]:[];function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace");for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids?.length||(sourceTrace.connected_source_net_ids?.length??0)>0||sourceTrace.connected_source_port_ids.length<2)continue;if(!pcbTraces.some(pcbTrace=>getSourceTraceIdsFromPcbTrace(pcbTrace.source_trace_id).includes(sourceTrace.source_trace_id))){let connectedPcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"&&sourceTrace.connected_source_port_ids.includes(el3.source_port_id)),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id2=>id2!==void 0)));errors.push({type:"pcb_trace_missing_error",pcb_trace_missing_error_id:`pcb_trace_missing_${sourceTrace.source_trace_id}`,error_type:"pcb_trace_missing_error",message:`Trace [${sourceTrace.display_name&&!containsCircuitJsonId(sourceTrace.display_name)?sourceTrace.display_name:"trace"}] is not connected (it has no PCB trace)`,source_trace_id:sourceTrace.source_trace_id,pcb_component_ids:connectedPcbComponentIds,pcb_port_ids:connectedPcbPorts.map(port=>port.pcb_port_id)})}}return errors}var DEFAULT_BOARD_MARGIN=.2;function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p4=>({x:p4.x,y:p4.y}));if(board.center&&typeof board.width=="number"&&typeof board.height=="number"){let cx3=board.center.x,cy3=board.center.y,hw2=board.width/2,hh3=board.height/2;return[{x:cx3-hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3-hh3},{x:cx3+hw2,y:cy3+hh3},{x:cx3-hw2,y:cy3+hh3}]}return null}function checkPcbTracesOutOfBoard(circuitJson,config={}){let errors=[],margin=config.margin??DEFAULT_BOARD_MARGIN,board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return errors;let boardPoints=getBoardPolygonPoints(board);if(!boardPoints)return errors;let pcbTraces=cju_default(circuitJson).pcb_trace.list();for(let trace of pcbTraces)if(!(trace.route.length<2))for(let i2=0;i2<trace.route.length-1;i2++){let p12=trace.route[i2],p22=trace.route[i2+1];if(p12.route_type!=="wire"||p22.route_type!=="wire")continue;let traceWidth="width"in p12?p12.width:"width"in p22?p22.width:.1,segmentStart={x:p12.x,y:p12.y},segmentEnd={x:p22.x,y:p22.y},minDistance=1/0;for(let j4=0;j4<boardPoints.length;j4++){let edgeStart=boardPoints[j4],edgeEnd=boardPoints[(j4+1)%boardPoints.length],distance32=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance32<minDistance&&(minDistance=distance32)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i2}`,message:`Trace too close to board edge (${minDistance.toFixed(3)}mm < ${minimumDistance.toFixed(3)}mm required, margin: ${margin}mm)`,pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id||"",center:{x:(segmentStart.x+segmentEnd.x)/2,y:(segmentStart.y+segmentEnd.y)/2},pcb_component_ids:[],pcb_port_ids:[]};errors.push(error)}}return errors}function getElementLayers(elem){return getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l3=>layers2.includes(l3))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id2=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id2);return readableName==="element"?`[${id2}]`:readableName};function checkPcbComponentOverlap(circuitJson){let errors=[],connMap=getFullConnectivityMapFromCircuitJson(circuitJson),smtPads=cju_default(circuitJson).pcb_smtpad.list(),platedHoles=cju_default(circuitJson).pcb_plated_hole.list(),holes=cju_default(circuitJson).pcb_hole.list(),componentMap=new Map;for(let pad2 of smtPads){let componentId=pad2.pcb_component_id||`standalone_pad_${getPrimaryId(pad2)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[],bounds:{minX:0,minY:0,maxX:0,maxY:0}}),componentMap.get(componentId).elements.push(pad2)}for(let hole of platedHoles){let componentId=hole.pcb_component_id||`standalone_plated_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[],bounds:{minX:0,minY:0,maxX:0,maxY:0}}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=`standalone_hole_${getPrimaryId(hole)}`;componentMap.set(componentId,{component_id:componentId,elements:[hole],bounds:{minX:0,minY:0,maxX:0,maxY:0}})}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i2=0;i2<componentsWithElements.length;i2++)for(let j4=i2+1;j4<componentsWithElements.length;j4++){let comp1=componentsWithElements[i2],comp2=componentsWithElements[j4];if(doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id2=getPrimaryId(elem2);if(!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id2))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id2}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error.pcb_smtpad_ids.push(id2)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error.pcb_plated_hole_ids.push(id2)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error.pcb_hole_ids.push(id2)),errors.push(error)}}}return errors}function checkPinMustBeConnected(circuitJson){let errors=[],sourceComponents=circuitJson.filter(el3=>"source_component_id"in el3&&(el3.type==="source_component"||el3.type.startsWith("source_simple_"))),sourcePorts=circuitJson.filter(el3=>el3.type==="source_port"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),connectedPortIds=new Set;for(let trace of sourceTraces)for(let portId of trace.connected_source_port_ids??[])connectedPortIds.add(portId);let componentInternalConnections=new Map;for(let component of sourceComponents)"internally_connected_source_port_ids"in component&&component.internally_connected_source_port_ids&&componentInternalConnections.set(component.source_component_id,component.internally_connected_source_port_ids);for(let internalGroups of componentInternalConnections.values())for(let group of internalGroups)if(group.some(portId=>connectedPortIds.has(portId)))for(let portId of group)connectedPortIds.add(portId);for(let port of sourcePorts)if(port.must_be_connected===!0&&!connectedPortIds.has(port.source_port_id)){let componentName=sourceComponents.find(c3=>c3.source_component_id===port.source_component_id)?.name??"Unknown";errors.push({type:"source_pin_must_be_connected_error",source_pin_must_be_connected_error_id:`source_pin_must_be_connected_error_${port.source_port_id}`,error_type:"source_pin_must_be_connected_error",message:`Port ${port.name} on ${componentName} must be connected but is floating`,source_component_id:port.source_component_id??"",source_port_id:port.source_port_id,subcircuit_id:port.subcircuit_id})}return errors}var PIN_ATTRIBUTE_KEYS=["must_be_connected","provides_power","requires_power","provides_ground","requires_ground","provides_voltage","requires_voltage","do_not_connect","include_in_board_pinout","can_use_internal_pullup","is_using_internal_pullup","needs_external_pullup","can_use_internal_pulldown","is_using_internal_pulldown","needs_external_pulldown","can_use_open_drain","is_using_open_drain","can_use_push_pull","is_using_push_pull","should_have_decoupling_capacitor","recommended_decoupling_capacitor_capacitance","is_configured_for_i2c_sda","is_configured_for_i2c_scl","is_configured_for_spi_mosi","is_configured_for_spi_miso","is_configured_for_spi_sck","is_configured_for_spi_cs","is_configured_for_uart_tx","is_configured_for_uart_rx","supports_i2c_sda","supports_i2c_scl","supports_spi_mosi","supports_spi_miso","supports_spi_sck","supports_spi_cs","supports_uart_tx","supports_uart_rx"];function hasAnyPinAttribute(port){return PIN_ATTRIBUTE_KEYS.some(key=>port[key]!==void 0)}function checkAllPinsInComponentAreUnderspecified(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>hasAnyPinAttribute(port))||warnings.push({type:"source_component_pins_underspecified_warning",source_component_pins_underspecified_warning_id:`source_component_pins_underspecified_warning_${component.source_component_id}`,warning_type:"source_component_pins_underspecified_warning",message:`All pins on ${component.name} are underspecified (no pinAttributes set)`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoPowerPinDefined(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_power===!0)||warnings.push({type:"source_no_power_pin_defined_warning",source_no_power_pin_defined_warning_id:`source_no_power_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_power_pin_defined_warning",message:`${component.name} has no pin with requires_power=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function checkNoGroundPinDefined(circuitJson){let warnings=[],db2=cju_default(circuitJson),sourceComponents=db2.source_component.list(),sourcePorts=db2.source_port.list(),portsByComponent=new Map;for(let port of sourcePorts){if(!port.source_component_id)continue;let existing=portsByComponent.get(port.source_component_id)??[];existing.push(port),portsByComponent.set(port.source_component_id,existing)}for(let component of sourceComponents){if(component.ftype!=="simple_chip")continue;let componentPorts=portsByComponent.get(component.source_component_id)??[];componentPorts.length===0||componentPorts.some(port=>port.requires_ground===!0)||warnings.push({type:"source_no_ground_pin_defined_warning",source_no_ground_pin_defined_warning_id:`source_no_ground_pin_defined_warning_${component.source_component_id}`,warning_type:"source_no_ground_pin_defined_warning",message:`${component.name} has no pin with requires_ground=true`,source_component_id:component.source_component_id,source_port_ids:componentPorts.map(port=>port.source_port_id),subcircuit_id:componentPorts[0]?.subcircuit_id})}return warnings}function getCourtyardPolygon(el3){if(el3.type==="pcb_courtyard_rect"){let hw2=el3.width/2,hh3=el3.height/2,corners=[{x:-hw2,y:-hh3},{x:+hw2,y:-hh3},{x:+hw2,y:+hh3},{x:-hw2,y:+hh3}],angle=(el3.ccw_rotation??0)*Math.PI/180,cos5=Math.cos(angle),sin5=Math.sin(angle);return corners.map(({x:x5,y:y5})=>({x:el3.center.x+x5*cos5-y5*sin5,y:el3.center.y+x5*sin5+y5*cos5}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_5,i2)=>{let a2=2*Math.PI*i2/32;return{x:el3.center.x+el3.radius*Math.cos(a2),y:el3.center.y+el3.radius*Math.sin(a2)}}):el3.outline}function getComponentName2(circuitJson,pcbComponentId){let pcbComponent=circuitJson.find(el3=>el3.type==="pcb_component"&&el3.pcb_component_id===pcbComponentId);if(pcbComponent?.type!=="pcb_component")return pcbComponentId;let sourceComponent=circuitJson.find(el3=>el3.type==="source_component"&&el3.source_component_id===pcbComponent.source_component_id);return sourceComponent?.type==="source_component"&&sourceComponent.name?sourceComponent.name:pcbComponentId}function polygonsOverlap(polyA,polyB){if(polyA.some(p4=>isPointInsidePolygon(p4,polyB))||polyB.some(p4=>isPointInsidePolygon(p4,polyA)))return!0;for(let i2=0;i2<polyA.length;i2++){let a12=polyA[i2],a2=polyA[(i2+1)%polyA.length];for(let j4=0;j4<polyB.length;j4++){let b12=polyB[j4],b22=polyB[(j4+1)%polyB.length];if(doSegmentsIntersect(a12,a2,b12,b22))return!0}}return!1}function checkCourtyardOverlap(circuitJson){let courtyards=circuitJson.filter(el3=>el3.type==="pcb_courtyard_rect"||el3.type==="pcb_courtyard_circle"||el3.type==="pcb_courtyard_outline"),byComponent=new Map;for(let el3 of courtyards){let id2=el3.pcb_component_id;byComponent.has(id2)||byComponent.set(id2,[]),byComponent.get(id2).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i2=0;i2<componentIds.length;i2++)for(let j4=i2+1;j4<componentIds.length;j4++){let idA=componentIds[i2],idB=componentIds[j4],overlapping=!1;outer:for(let a2 of byComponent.get(idA))for(let b3 of byComponent.get(idB)){let polyA=getCourtyardPolygon(a2),polyB=getCourtyardPolygon(b3);if(polygonsOverlap(polyA,polyB)){overlapping=!0;break outer}}overlapping&&errors.push({type:"pcb_courtyard_overlap_error",pcb_error_id:`pcb_courtyard_overlap_${idA}_${idB}`,error_type:"pcb_courtyard_overlap_error",message:`Courtyard of ${getComponentName2(circuitJson,idA)} overlaps with courtyard of ${getComponentName2(circuitJson,idB)}`,pcb_component_ids:[idA,idB]})}return errors}function getFacingDirection(component){if(!component.center||!component.cable_insertion_center)return null;let dx3=component.cable_insertion_center.x-component.center.x,dy3=component.cable_insertion_center.y-component.center.y;return Math.abs(dx3)<1e-6&&Math.abs(dy3)<1e-6?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"x+":"x-":dy3>=0?"y+":"y-"}function getRecommendedFacingDirection(component,bounds){if(!component.center)return null;let distances=[{direction:"x-",distance:component.center.x-bounds.minX},{direction:"x+",distance:bounds.maxX-component.center.x},{direction:"y-",distance:component.center.y-bounds.minY},{direction:"y+",distance:bounds.maxY-component.center.y}];return distances.sort((a2,b3)=>a2.distance-b3.distance),distances[0]?.direction??null}function checkConnectorAccessibleOrientation(circuitJson){let board=circuitJson.find(el3=>el3.type==="pcb_board");if(!board)return[];let bounds=(()=>{try{return getBoardBounds(board)}catch{return null}})();if(!bounds)return[];let warnings=[],components=circuitJson.filter(el3=>el3.type==="pcb_component");for(let component of components){if(!component.cable_insertion_center)continue;let facingDirection=getFacingDirection(component),recommendedFacingDirection=getRecommendedFacingDirection(component,bounds);if(!facingDirection||!recommendedFacingDirection||facingDirection===recommendedFacingDirection)continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id);warnings.push({type:"pcb_connector_not_in_accessible_orientation_warning",warning_type:"pcb_connector_not_in_accessible_orientation_warning",pcb_connector_not_in_accessible_orientation_warning_id:`pcb_connector_not_in_accessible_orientation_warning_${component.pcb_component_id}`,message:`${componentName} is facing ${facingDirection} but should face ${recommendedFacingDirection} so the connector is accessible from the board edge`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,pcb_board_id:board.pcb_board_id,facing_direction:facingDirection,recommended_facing_direction:recommendedFacingDirection,subcircuit_id:component.subcircuit_id})}return warnings}async function runAllPlacementChecks(circuitJson){return[...checkViasOffBoard(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson)]}async function runAllNetlistChecks(circuitJson){return[...checkPinMustBeConnected(circuitJson)]}async function runAllPinSpecificationChecks(circuitJson){return[...checkAllPinsInComponentAreUnderspecified(circuitJson),...checkNoPowerPinDefined(circuitJson),...checkNoGroundPinDefined(circuitJson)]}async function runAllRoutingChecks(circuitJson){return[...checkEachPcbPortConnectedToPcbTraces(circuitJson),...checkSourceTracesHavePcbTraces(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist6();var SI_PREFIXES=[{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"},{value:1,symbol:""},{value:.001,symbol:"m"},{value:1e-6,symbol:"\xB5"},{value:1e-9,symbol:"n"},{value:1e-12,symbol:"p"}];function formatSiUnit(value){if(value==null)return"";if(value===0)return"0";let absValue=Math.abs(value),prefix=SI_PREFIXES.find(p4=>{let scaled2=absValue/p4.value;return scaled2>=1&&scaled2<1e3})||SI_PREFIXES[SI_PREFIXES.length-1],formatted=(value/prefix.value).toPrecision(3);return formatted.includes(".")&&!/\.0+$/.test(formatted)&&(formatted=formatted.replace(/0+$/,"")),formatted=formatted.replace(/\.0+$/,""),`${formatted}${prefix.symbol}`}init_dist6();init_dist();var import_object_hash=__toESM(require_object_hash(),1);var FlatQueue=class{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(item,priority){let pos=this.length++;for(;pos>0;){let parent=pos-1>>1,parentValue=this.values[parent];if(priority>=parentValue)break;this.ids[pos]=this.ids[parent],this.values[pos]=parentValue,pos=parent}this.ids[pos]=item,this.values[pos]=priority}pop(){if(this.length===0)return;let ids=this.ids,values=this.values,top=ids[0],last=--this.length;if(last>0){let id2=ids[last],value=values[last],pos=0,halfLen=last>>1;for(;pos<halfLen;){let left=(pos<<1)+1,right=left+1,child=left+(+(right<last)&+(values[right]<values[left]));if(values[child]>=value)break;ids[pos]=ids[child],values[pos]=values[child],pos=child}ids[pos]=id2,values[pos]=value}return top}peek(){return this.length>0?this.ids[0]:void 0}peekValue(){return this.length>0?this.values[0]:void 0}shrink(){this.ids.length=this.values.length=this.length}};var ARRAY_TYPES=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],VERSION=3,Flatbush=class _Flatbush{static from(data,byteOffset=0){if(byteOffset%8!==0)throw new Error("byteOffset must be 8-byte aligned.");if(!data||data.byteLength===void 0||data.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");let[magic,versionAndType]=new Uint8Array(data,byteOffset+0,2);if(magic!==251)throw new Error("Data does not appear to be in a Flatbush format.");let version=versionAndType>>4;if(version!==VERSION)throw new Error(`Got v${version} data when expected v${VERSION}.`);let ArrayType=ARRAY_TYPES[versionAndType&15];if(!ArrayType)throw new Error("Unrecognized array type.");let[nodeSize]=new Uint16Array(data,byteOffset+2,1),[numItems]=new Uint32Array(data,byteOffset+4,1);return new _Flatbush(numItems,nodeSize,ArrayType,void 0,data,byteOffset)}constructor(numItems,nodeSize=16,ArrayType=Float64Array,ArrayBufferType=ArrayBuffer,data,byteOffset=0){if(numItems===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(numItems)||numItems<=0)throw new Error(`Unexpected numItems value: ${numItems}.`);this.numItems=+numItems,this.nodeSize=Math.min(Math.max(+nodeSize,2),65535),this.byteOffset=byteOffset;let n3=numItems,numNodes=n3;this._levelBounds=[n3*4];do n3=Math.ceil(n3/this.nodeSize),numNodes+=n3,this._levelBounds.push(numNodes*4);while(n3!==1);this.ArrayType=ArrayType,this.IndexArrayType=numNodes<16384?Uint16Array:Uint32Array;let arrayTypeIndex=ARRAY_TYPES.indexOf(ArrayType),nodesByteSize=numNodes*4*ArrayType.BYTES_PER_ELEMENT;if(arrayTypeIndex<0)throw new Error(`Unexpected typed array class: ${ArrayType}.`);if(data)this.data=data,this._boxes=new ArrayType(data,byteOffset+8,numNodes*4),this._indices=new this.IndexArrayType(data,byteOffset+8+nodesByteSize,numNodes),this._pos=numNodes*4,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1];else{let data2=this.data=new ArrayBufferType(8+nodesByteSize+numNodes*this.IndexArrayType.BYTES_PER_ELEMENT);this._boxes=new ArrayType(data2,8,numNodes*4),this._indices=new this.IndexArrayType(data2,8+nodesByteSize,numNodes),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(data2,0,2).set([251,(VERSION<<4)+arrayTypeIndex]),new Uint16Array(data2,2,1)[0]=nodeSize,new Uint32Array(data2,4,1)[0]=numItems}this._queue=new FlatQueue}add(minX,minY,maxX=minX,maxY=minY){let index=this._pos>>2,boxes=this._boxes;return this._indices[index]=index,boxes[this._pos++]=minX,boxes[this._pos++]=minY,boxes[this._pos++]=maxX,boxes[this._pos++]=maxY,minX<this.minX&&(this.minX=minX),minY<this.minY&&(this.minY=minY),maxX>this.maxX&&(this.maxX=maxX),maxY>this.maxY&&(this.maxY=maxY),index}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);let boxes=this._boxes;if(this.numItems<=this.nodeSize){boxes[this._pos++]=this.minX,boxes[this._pos++]=this.minY,boxes[this._pos++]=this.maxX,boxes[this._pos++]=this.maxY;return}let width=this.maxX-this.minX||1,height=this.maxY-this.minY||1,hilbertValues=new Uint32Array(this.numItems),hilbertMax=65535;for(let i2=0,pos=0;i2<this.numItems;i2++){let minX=boxes[pos++],minY=boxes[pos++],maxX=boxes[pos++],maxY=boxes[pos++],x5=Math.floor(hilbertMax*((minX+maxX)/2-this.minX)/width),y5=Math.floor(hilbertMax*((minY+maxY)/2-this.minY)/height);hilbertValues[i2]=hilbert(x5,y5)}sort(hilbertValues,boxes,this._indices,0,this.numItems-1,this.nodeSize);for(let i2=0,pos=0;i2<this._levelBounds.length-1;i2++){let end=this._levelBounds[i2];for(;pos<end;){let nodeIndex=pos,nodeMinX=boxes[pos++],nodeMinY=boxes[pos++],nodeMaxX=boxes[pos++],nodeMaxY=boxes[pos++];for(let j4=1;j4<this.nodeSize&&pos<end;j4++)nodeMinX=Math.min(nodeMinX,boxes[pos++]),nodeMinY=Math.min(nodeMinY,boxes[pos++]),nodeMaxX=Math.max(nodeMaxX,boxes[pos++]),nodeMaxY=Math.max(nodeMaxY,boxes[pos++]);this._indices[this._pos>>2]=nodeIndex,boxes[this._pos++]=nodeMinX,boxes[this._pos++]=nodeMinY,boxes[this._pos++]=nodeMaxX,boxes[this._pos++]=nodeMaxY}}}search(minX,minY,maxX,maxY,filterFn){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let nodeIndex=this._boxes.length-4,queue=[],results=[];for(;nodeIndex!==void 0;){let end=Math.min(nodeIndex+this.nodeSize*4,upperBound(nodeIndex,this._levelBounds));for(let pos=nodeIndex;pos<end;pos+=4){let x02=this._boxes[pos];if(maxX<x02)continue;let y02=this._boxes[pos+1];if(maxY<y02)continue;let x12=this._boxes[pos+2];if(minX>x12)continue;let y12=this._boxes[pos+3];if(minY>y12)continue;let index=this._indices[pos>>2]|0;nodeIndex>=this.numItems*4?queue.push(index):(filterFn===void 0||filterFn(index,x02,y02,x12,y12))&&results.push(index)}nodeIndex=queue.pop()}return results}neighbors(x5,y5,maxResults=1/0,maxDistance=1/0,filterFn){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let nodeIndex=this._boxes.length-4,q4=this._queue,results=[],maxDistSquared=maxDistance*maxDistance;outer:for(;nodeIndex!==void 0;){let end=Math.min(nodeIndex+this.nodeSize*4,upperBound(nodeIndex,this._levelBounds));for(let pos=nodeIndex;pos<end;pos+=4){let index=this._indices[pos>>2]|0,minX=this._boxes[pos],minY=this._boxes[pos+1],maxX=this._boxes[pos+2],maxY=this._boxes[pos+3],dx3=x5<minX?minX-x5:x5>maxX?x5-maxX:0,dy3=y5<minY?minY-y5:y5>maxY?y5-maxY:0,dist=dx3*dx3+dy3*dy3;dist>maxDistSquared||(nodeIndex>=this.numItems*4?q4.push(index<<1,dist):(filterFn===void 0||filterFn(index))&&q4.push((index<<1)+1,dist))}for(;q4.length&&q4.peek()&1;)if(q4.peekValue()>maxDistSquared||(results.push(q4.pop()>>1),results.length===maxResults))break outer;nodeIndex=q4.length?q4.pop()>>1:void 0}return q4.clear(),results}};function upperBound(value,arr){let i2=0,j4=arr.length-1;for(;i2<j4;){let m3=i2+j4>>1;arr[m3]>value?j4=m3:i2=m3+1}return arr[i2]}function sort(values,boxes,indices,left,right,nodeSize){let stack=[left,right];for(;stack.length;){let r4=stack.pop()||0,l3=stack.pop()||0;if(r4-l3<=nodeSize&&Math.floor(l3/nodeSize)>=Math.floor(r4/nodeSize))continue;let a2=values[l3],b3=values[l3+r4>>1],c3=values[r4],pivot=a2>b3!=a2>c3?a2:b3<a2!=b3<c3?b3:c3,i2=l3-1,j4=r4+1;for(;;){do i2++;while(values[i2]<pivot);do j4--;while(values[j4]>pivot);if(i2>=j4)break;swap(values,boxes,indices,i2,j4)}stack.push(l3,j4,j4+1,r4)}}function swap(values,boxes,indices,i2,j4){let temp=values[i2];values[i2]=values[j4],values[j4]=temp;let k4=4*i2,m3=4*j4,a2=boxes[k4],b3=boxes[k4+1],c3=boxes[k4+2],d3=boxes[k4+3];boxes[k4]=boxes[m3],boxes[k4+1]=boxes[m3+1],boxes[k4+2]=boxes[m3+2],boxes[k4+3]=boxes[m3+3],boxes[m3]=a2,boxes[m3+1]=b3,boxes[m3+2]=c3,boxes[m3+3]=d3;let e4=indices[i2];indices[i2]=indices[j4],indices[j4]=e4}function hilbert(x5,y5){let a2=x5^y5,b3=65535^a2,c3=65535^(x5|y5),d3=x5&(y5^65535),A4=a2|b3>>1,B5=a2>>1^a2,C4=c3>>1^b3&d3>>1^c3,D6=a2&c3>>1^d3>>1^d3;a2=A4,b3=B5,c3=C4,d3=D6,A4=a2&a2>>2^b3&b3>>2,B5=a2&b3>>2^b3&(a2^b3)>>2,C4^=a2&c3>>2^b3&d3>>2,D6^=b3&c3>>2^(a2^b3)&d3>>2,a2=A4,b3=B5,c3=C4,d3=D6,A4=a2&a2>>4^b3&b3>>4,B5=a2&b3>>4^b3&(a2^b3)>>4,C4^=a2&c3>>4^b3&d3>>4,D6^=b3&c3>>4^(a2^b3)&d3>>4,a2=A4,b3=B5,c3=C4,d3=D6,C4^=a2&c3>>8^b3&d3>>8,D6^=b3&c3>>8^(a2^b3)&d3>>8,a2=C4^C4>>1,b3=D6^D6>>1;let i02=x5^y5,i12=b3|65535^(i02|a2);return i02=(i02|i02<<8)&16711935,i02=(i02|i02<<4)&252645135,i02=(i02|i02<<2)&858993459,i02=(i02|i02<<1)&1431655765,i12=(i12|i12<<8)&16711935,i12=(i12|i12<<4)&252645135,i12=(i12|i12<<2)&858993459,i12=(i12|i12<<1)&1431655765,(i12<<1|i02)>>>0}var __create2=Object.create,__defProp3=Object.defineProperty,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__getOwnPropNames2=Object.getOwnPropertyNames,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__commonJS2=(cb3,mod)=>function(){return mod||(0,cb3[__getOwnPropNames2(cb3)[0]])((mod={exports:{}}).exports,mod),mod.exports},__copyProps2=(to3,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames2(from))!__hasOwnProp2.call(to3,key)&&key!==except&&__defProp3(to3,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc2(from,key))||desc.enumerable});return to3},__toESM2=(mod,isNodeMode,target)=>(target=mod!=null?__create2(__getProtoOf2(mod)):{},__copyProps2(isNodeMode||!mod||!mod.__esModule?__defProp3(target,"default",{value:mod,enumerable:!0}):target,mod)),require_is_buffer=__commonJS2({"node_modules/is-buffer/index.js"(exports,module){"use strict";module.exports=function(obj){return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)};function isBuffer(obj){return!!obj.constructor&&typeof obj.constructor.isBuffer=="function"&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return typeof obj.readFloatLE=="function"&&typeof obj.slice=="function"&&isBuffer(obj.slice(0,0))}}}),require_kind_of=__commonJS2({"node_modules/kind-of/index.js"(exports,module){"use strict";var isBuffer=require_is_buffer(),toString2=Object.prototype.toString;module.exports=function(val){if(typeof val>"u")return"undefined";if(val===null)return"null";if(val===!0||val===!1||val instanceof Boolean)return"boolean";if(typeof val=="string"||val instanceof String)return"string";if(typeof val=="number"||val instanceof Number)return"number";if(typeof val=="function"||val instanceof Function)return"function";if(typeof Array.isArray<"u"&&Array.isArray(val))return"array";if(val instanceof RegExp)return"regexp";if(val instanceof Date)return"date";var type=toString2.call(val);return type==="[object RegExp]"?"regexp":type==="[object Date]"?"date":type==="[object Arguments]"?"arguments":type==="[object Error]"?"error":isBuffer(val)?"buffer":type==="[object Set]"?"set":type==="[object WeakSet]"?"weakset":type==="[object Map]"?"map":type==="[object WeakMap]"?"weakmap":type==="[object Symbol]"?"symbol":type==="[object Int8Array]"?"int8array":type==="[object Uint8Array]"?"uint8array":type==="[object Uint8ClampedArray]"?"uint8clampedarray":type==="[object Int16Array]"?"int16array":type==="[object Uint16Array]"?"uint16array":type==="[object Int32Array]"?"int32array":type==="[object Uint32Array]"?"uint32array":type==="[object Float32Array]"?"float32array":type==="[object Float64Array]"?"float64array":"object"}}}),require_rename_keys=__commonJS2({"node_modules/rename-keys/index.js"(exports,module){"use strict";(function(){"use strict";function rename2(obj,fn3){if(typeof fn3!="function")return obj;var res2={};for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(res2[fn3(key,obj[key])||key]=obj[key]);return res2}typeof module<"u"&&module.exports?module.exports=rename2:typeof define=="function"&&define.amd?define([],function(){return rename2}):window.rename=rename2})()}}),require_deep_rename_keys=__commonJS2({"node_modules/deep-rename-keys/index.js"(exports,module){"use strict";var typeOf=require_kind_of(),rename2=require_rename_keys();module.exports=function renameDeep(obj,cb3){var type=typeOf(obj);if(type!=="object"&&type!=="array")throw new Error("expected an object");var res2=[];type==="object"&&(obj=rename2(obj,cb3),res2={});for(var key in obj)if(obj.hasOwnProperty(key)){var val=obj[key];typeOf(val)==="object"||typeOf(val)==="array"?res2[key]=renameDeep(val,cb3):res2[key]=val}return res2}}}),require_eventemitter3=__commonJS2({"node_modules/eventemitter3/index.js"(exports,module){"use strict";var has=Object.prototype.hasOwnProperty,prefix="~";function Events(){}Object.create&&(Events.prototype=Object.create(null),new Events().__proto__||(prefix=!1));function EE2(fn3,context,once){this.fn=fn3,this.context=context,this.once=once||!1}function EventEmitter(){this._events=new Events,this._eventsCount=0}EventEmitter.prototype.eventNames=function(){var names=[],events,name;if(this._eventsCount===0)return names;for(name in events=this._events)has.call(events,name)&&names.push(prefix?name.slice(1):name);return Object.getOwnPropertySymbols?names.concat(Object.getOwnPropertySymbols(events)):names},EventEmitter.prototype.listeners=function(event,exists){var evt=prefix?prefix+event:event,available=this._events[evt];if(exists)return!!available;if(!available)return[];if(available.fn)return[available.fn];for(var i2=0,l3=available.length,ee4=new Array(l3);i2<l3;i2++)ee4[i2]=available[i2].fn;return ee4},EventEmitter.prototype.emit=function(event,a12,a2,a3,a4,a52){var evt=prefix?prefix+event:event;if(!this._events[evt])return!1;var listeners=this._events[evt],len=arguments.length,args,i2;if(listeners.fn){switch(listeners.once&&this.removeListener(event,listeners.fn,void 0,!0),len){case 1:return listeners.fn.call(listeners.context),!0;case 2:return listeners.fn.call(listeners.context,a12),!0;case 3:return listeners.fn.call(listeners.context,a12,a2),!0;case 4:return listeners.fn.call(listeners.context,a12,a2,a3),!0;case 5:return listeners.fn.call(listeners.context,a12,a2,a3,a4),!0;case 6:return listeners.fn.call(listeners.context,a12,a2,a3,a4,a52),!0}for(i2=1,args=new Array(len-1);i2<len;i2++)args[i2-1]=arguments[i2];listeners.fn.apply(listeners.context,args)}else{var length3=listeners.length,j4;for(i2=0;i2<length3;i2++)switch(listeners[i2].once&&this.removeListener(event,listeners[i2].fn,void 0,!0),len){case 1:listeners[i2].fn.call(listeners[i2].context);break;case 2:listeners[i2].fn.call(listeners[i2].context,a12);break;case 3:listeners[i2].fn.call(listeners[i2].context,a12,a2);break;case 4:listeners[i2].fn.call(listeners[i2].context,a12,a2,a3);break;default:if(!args)for(j4=1,args=new Array(len-1);j4<len;j4++)args[j4-1]=arguments[j4];listeners[i2].fn.apply(listeners[i2].context,args)}}return!0},EventEmitter.prototype.on=function(event,fn3,context){var listener=new EE2(fn3,context||this),evt=prefix?prefix+event:event;return this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):(this._events[evt]=listener,this._eventsCount++),this},EventEmitter.prototype.once=function(event,fn3,context){var listener=new EE2(fn3,context||this,!0),evt=prefix?prefix+event:event;return this._events[evt]?this._events[evt].fn?this._events[evt]=[this._events[evt],listener]:this._events[evt].push(listener):(this._events[evt]=listener,this._eventsCount++),this},EventEmitter.prototype.removeListener=function(event,fn3,context,once){var evt=prefix?prefix+event:event;if(!this._events[evt])return this;if(!fn3)return--this._eventsCount===0?this._events=new Events:delete this._events[evt],this;var listeners=this._events[evt];if(listeners.fn)listeners.fn===fn3&&(!once||listeners.once)&&(!context||listeners.context===context)&&(--this._eventsCount===0?this._events=new Events:delete this._events[evt]);else{for(var i2=0,events=[],length3=listeners.length;i2<length3;i2++)(listeners[i2].fn!==fn3||once&&!listeners[i2].once||context&&listeners[i2].context!==context)&&events.push(listeners[i2]);events.length?this._events[evt]=events.length===1?events[0]:events:--this._eventsCount===0?this._events=new Events:delete this._events[evt]}return this},EventEmitter.prototype.removeAllListeners=function(event){var evt;return event?(evt=prefix?prefix+event:event,this._events[evt]&&(--this._eventsCount===0?this._events=new Events:delete this._events[evt])):(this._events=new Events,this._eventsCount=0),this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prototype.setMaxListeners=function(){return this},EventEmitter.prefixed=prefix,EventEmitter.EventEmitter=EventEmitter,typeof module<"u"&&(module.exports=EventEmitter)}}),require_lexer=__commonJS2({"node_modules/xml-lexer/dist/lexer.js"(exports,module){"use strict";function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}var EventEmitter=require_eventemitter3(),noop=function(){},State2={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},Action={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},Type={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},charToAction={" ":Action.space," ":Action.space,"\n":Action.space,"\r":Action.space,"<":Action.lt,">":Action.gt,'"':Action.quote,"'":Action.quote,"=":Action.equal,"/":Action.slash},getAction=function(char){return charToAction[char]||Action.char},create=function(options){var _State$data,_State$tagBegin,_State$tagName,_State$tagEnd,_State$attributeNameS,_State$attributeName,_State$attributeNameE,_State$attributeValue,_State$attributeValue2,_lexer$stateMachine;options=Object.assign({debug:!1},options);var lexer=new EventEmitter,state2=State2.data,data="",tagName="",attrName="",attrValue="",isClosing="",openingQuote="",emit=function(type,value){if(!(tagName[0]==="?"||tagName[0]==="!")){var event={type,value};options.debug&&console.log("emit:",event),lexer.emit("data",event)}};lexer.stateMachine=(_lexer$stateMachine={},_defineProperty(_lexer$stateMachine,State2.data,(_State$data={},_defineProperty(_State$data,Action.lt,function(){data.trim()&&emit(Type.text,data),tagName="",isClosing=!1,state2=State2.tagBegin}),_defineProperty(_State$data,Action.char,function(char){data+=char}),_State$data)),_defineProperty(_lexer$stateMachine,State2.cdata,_defineProperty({},Action.char,function(char){data+=char,data.substr(-3)==="]]>"&&(emit(Type.text,data.slice(0,-3)),data="",state2=State2.data)})),_defineProperty(_lexer$stateMachine,State2.tagBegin,(_State$tagBegin={},_defineProperty(_State$tagBegin,Action.space,noop),_defineProperty(_State$tagBegin,Action.char,function(char){tagName=char,state2=State2.tagName}),_defineProperty(_State$tagBegin,Action.slash,function(){tagName="",isClosing=!0}),_State$tagBegin)),_defineProperty(_lexer$stateMachine,State2.tagName,(_State$tagName={},_defineProperty(_State$tagName,Action.space,function(){isClosing?state2=State2.tagEnd:(state2=State2.attributeNameStart,emit(Type.openTag,tagName))}),_defineProperty(_State$tagName,Action.gt,function(){emit(isClosing?Type.closeTag:Type.openTag,tagName),data="",state2=State2.data}),_defineProperty(_State$tagName,Action.slash,function(){state2=State2.tagEnd,emit(Type.openTag,tagName)}),_defineProperty(_State$tagName,Action.char,function(char){tagName+=char,tagName==="![CDATA["&&(state2=State2.cdata,data="",tagName="")}),_State$tagName)),_defineProperty(_lexer$stateMachine,State2.tagEnd,(_State$tagEnd={},_defineProperty(_State$tagEnd,Action.gt,function(){emit(Type.closeTag,tagName),data="",state2=State2.data}),_defineProperty(_State$tagEnd,Action.char,noop),_State$tagEnd)),_defineProperty(_lexer$stateMachine,State2.attributeNameStart,(_State$attributeNameS={},_defineProperty(_State$attributeNameS,Action.char,function(char){attrName=char,state2=State2.attributeName}),_defineProperty(_State$attributeNameS,Action.gt,function(){data="",state2=State2.data}),_defineProperty(_State$attributeNameS,Action.space,noop),_defineProperty(_State$attributeNameS,Action.slash,function(){isClosing=!0,state2=State2.tagEnd}),_State$attributeNameS)),_defineProperty(_lexer$stateMachine,State2.attributeName,(_State$attributeName={},_defineProperty(_State$attributeName,Action.space,function(){state2=State2.attributeNameEnd}),_defineProperty(_State$attributeName,Action.equal,function(){emit(Type.attributeName,attrName),state2=State2.attributeValueBegin}),_defineProperty(_State$attributeName,Action.gt,function(){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeName,Action.slash,function(){isClosing=!0,attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),state2=State2.tagEnd}),_defineProperty(_State$attributeName,Action.char,function(char){attrName+=char}),_State$attributeName)),_defineProperty(_lexer$stateMachine,State2.attributeNameEnd,(_State$attributeNameE={},_defineProperty(_State$attributeNameE,Action.space,noop),_defineProperty(_State$attributeNameE,Action.equal,function(){emit(Type.attributeName,attrName),state2=State2.attributeValueBegin}),_defineProperty(_State$attributeNameE,Action.gt,function(){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeNameE,Action.char,function(char){attrValue="",emit(Type.attributeName,attrName),emit(Type.attributeValue,attrValue),attrName=char,state2=State2.attributeName}),_State$attributeNameE)),_defineProperty(_lexer$stateMachine,State2.attributeValueBegin,(_State$attributeValue={},_defineProperty(_State$attributeValue,Action.space,noop),_defineProperty(_State$attributeValue,Action.quote,function(char){openingQuote=char,attrValue="",state2=State2.attributeValue}),_defineProperty(_State$attributeValue,Action.gt,function(){attrValue="",emit(Type.attributeValue,attrValue),data="",state2=State2.data}),_defineProperty(_State$attributeValue,Action.char,function(char){openingQuote="",attrValue=char,state2=State2.attributeValue}),_State$attributeValue)),_defineProperty(_lexer$stateMachine,State2.attributeValue,(_State$attributeValue2={},_defineProperty(_State$attributeValue2,Action.space,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),state2=State2.attributeNameStart)}),_defineProperty(_State$attributeValue2,Action.quote,function(char){openingQuote===char?(emit(Type.attributeValue,attrValue),state2=State2.attributeNameStart):attrValue+=char}),_defineProperty(_State$attributeValue2,Action.gt,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),data="",state2=State2.data)}),_defineProperty(_State$attributeValue2,Action.slash,function(char){openingQuote?attrValue+=char:(emit(Type.attributeValue,attrValue),isClosing=!0,state2=State2.tagEnd)}),_defineProperty(_State$attributeValue2,Action.char,function(char){attrValue+=char}),_State$attributeValue2)),_lexer$stateMachine);var step=function(char){options.debug&&console.log(state2,char);var actions=lexer.stateMachine[state2],action=actions[getAction(char)]||actions[Action.error]||actions[Action.char];action(char)};return lexer.write=function(str){for(var len=str.length,i2=0;i2<len;i2++)step(str[i2])},lexer};module.exports={State:State2,Action,Type,create}}}),require_reader=__commonJS2({"node_modules/xml-reader/dist/reader.js"(exports,module){"use strict";var EventEmitter=require_eventemitter3(),Lexer=require_lexer(),Type=Lexer.Type,NodeType={element:"element",text:"text"},createNode=function(params){return Object.assign({name:"",type:NodeType.element,value:"",parent:null,attributes:{},children:[]},params)},create=function(options){options=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},options);var lexer=void 0,rootNode=void 0,current2=void 0,attrName=void 0,reader=new EventEmitter,handleLexerData=function(data){switch(data.type){case Type.openTag:if(current2===null)current2=rootNode,current2.name=data.value;else{var node=createNode({name:data.value,parent:current2});current2.children.push(node),current2=node}break;case Type.closeTag:var parent=current2.parent;if(options.parentNodes||(current2.parent=null),current2.name!==data.value)break;options.stream&&parent===rootNode&&(rootNode.children=[],current2.parent=null),(!options.emitTopLevelOnly||parent===rootNode)&&(reader.emit(options.tagPrefix+current2.name,current2),reader.emit("tag",current2.name,current2)),current2===rootNode&&(lexer.removeAllListeners("data"),reader.emit(options.doneEvent,current2),rootNode=null),current2=parent;break;case Type.text:current2&¤t2.children.push(createNode({type:NodeType.text,value:data.value,parent:options.parentNodes?current2:null}));break;case Type.attributeName:attrName=data.value,current2.attributes[attrName]="";break;case Type.attributeValue:current2.attributes[attrName]=data.value;break}};return reader.reset=function(){lexer=Lexer.create({debug:options.debug}),lexer.on("data",handleLexerData),rootNode=createNode(),current2=null,attrName="",reader.parse=lexer.write},reader.reset(),reader},parseSync2=function(xml,options){options=Object.assign({},options,{stream:!1,tagPrefix:":"});var reader=create(options),res2=void 0;return reader.on("done",function(ast){res2=ast}),reader.parse(xml),res2};module.exports={parseSync:parseSync2,create,NodeType}}});function computeGridToAffineTransform(params){let{originX,originY,rows,cols,cellSizeMm,width,height}=params,a2,c3;cols>1?(a2=width/((cols-1)*cellSizeMm),c3=originX*(1-a2)-.5*cellSizeMm*a2):(a2=1,c3=originX+width/2-(originX+.5*cellSizeMm));let e4,f2;return rows>1?(e4=height/((rows-1)*cellSizeMm),f2=originY*(1-e4)-.5*cellSizeMm*e4):(e4=1,f2=originY+height/2-(originY+.5*cellSizeMm)),{a:a2,b:0,c:c3,d:0,e:e4,f:f2}}function applyAffineTransformToPoint(t35,p4){return{x:t35.a*p4.x+t35.b*p4.y+t35.c,y:t35.d*p4.x+t35.e*p4.y+t35.f}}var{cos:cos3,sin:sin3,PI:PI3}=Math,{tan:tan3}=Math,import_deep_rename_keys=__toESM2(require_deep_rename_keys()),import_xml_reader=__toESM2(require_reader()),BaseSolver=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}getSolverName(){return this.constructor.name}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(e4){throw this.error=`${this.getSolverName()} error: ${e4}`,this.failed=!0,e4}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.getSolverName()} ran out of iterations`,this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let startTime=Date.now();for(;!this.solved&&!this.failed;)this.step();let endTime=Date.now();this.timeToSolve=endTime-startTime}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};function clamp4(value,min,max){return Math.max(min,Math.min(max,value))}function computeMaxIterationsByNodeSizeAndConnectionCount(input2){let states=input2.planeSize*input2.layers,connectionCount=input2.connectionCount,connectionFactor=Math.sqrt(connectionCount),requestedMaxIterations=Math.max(1,input2.maxIterations),baseComputedMaxIterations=clamp4(Math.round(states*(8+1.2*connectionFactor)),15e4,12e6),computedMaxIters=clamp4(Math.round(baseComputedMaxIterations*input2.effort),15e4,12e6),minIterationBudgetIters=clamp4(Math.round(requestedMaxIterations*.2),15e4,2e6),maxIterationsIters=Math.max(1,Math.min(requestedMaxIterations,Math.max(minIterationBudgetIters,computedMaxIters))),baseSearchBudgetIters=clamp4(Math.round(states*(10+.8*connectionFactor)*input2.effort),5e4,4e6);return{maxIterationsIters,baseSearchBudgetIters}}function rippedContains(r4,id2){for(let cur=r4;cur;cur=cur.prev)if(cur.id===id2)return!0;return!1}var MinHeap=class{constructor(){__publicField(this,"f",[]);__publicField(this,"seq",[]);__publicField(this,"id",[]);__publicField(this,"n",0)}push(f2,seq,id2){let i2=this.n++;for(this.f[i2]=f2,this.seq[i2]=seq,this.id[i2]=id2;i2>0;){let p4=i2-1>>1;if(this.less(p4,i2))break;this.swap(i2,p4),i2=p4}}pop(){let out=this.id[0];return this.n--,this.n>0&&(this.f[0]=this.f[this.n],this.seq[0]=this.seq[this.n],this.id[0]=this.id[this.n],this.siftDown(0)),out}get size(){return this.n}clear(){this.n=0}siftDown(i2){for(;;){let l3=i2*2+1,r4=l3+1;if(l3>=this.n)return;let m3=l3;if(r4<this.n&&!this.less(l3,r4)&&(m3=r4),this.less(i2,m3))return;this.swap(i2,m3),i2=m3}}less(i2,j4){let fi3=this.f[i2],fj=this.f[j4];return fi3!==fj?fi3<fj:this.seq[i2]<this.seq[j4]}swap(i2,j4){let tmpF=this.f[i2];this.f[i2]=this.f[j4],this.f[j4]=tmpF;let tmpS=this.seq[i2];this.seq[i2]=this.seq[j4],this.seq[j4]=tmpS;let tmpI=this.id[i2];this.id[i2]=this.id[j4],this.id[j4]=tmpI}};function toRootNetName(connectionName,rootConnectionName){return rootConnectionName??connectionName.replace(/_mst\d+$/,"")}var DIRS_DR=[-1,-1,-1,0,0,1,1,1],DIRS_DC=[-1,0,1,-1,1,-1,0,1],HighDensitySolverA01=class extends BaseSolver{constructor(props){super();__publicField(this,"nodeWithPortPoints");__publicField(this,"cellSizeMm");__publicField(this,"viaDiameter");__publicField(this,"MAX_RIPS");__publicField(this,"maxCellCount");__publicField(this,"traceThickness");__publicField(this,"traceMargin");__publicField(this,"viaMinDistFromBorder");__publicField(this,"showPenaltyMap");__publicField(this,"showUsedCellMap");__publicField(this,"effort");__publicField(this,"stepMultiplier");__publicField(this,"hyperParameters");__publicField(this,"initialPenaltyFn");__publicField(this,"rows");__publicField(this,"cols");__publicField(this,"layers");__publicField(this,"gridOrigin");__publicField(this,"gridToBoundsTransform");__publicField(this,"availableZ");__publicField(this,"zToLayer");__publicField(this,"layerToZ");__publicField(this,"connNameToId");__publicField(this,"connIdToName");__publicField(this,"connIdToRootNet");__publicField(this,"overlapFriendlyRootNets");__publicField(this,"planeSize");__publicField(this,"usedCellsFlat");__publicField(this,"portOwnerFlat");__publicField(this,"usedDiagFlat");__publicField(this,"penalty2d");__publicField(this,"visitedStamp");__publicField(this,"sharedCrossRootPortCells");__publicField(this,"stamp",0);__publicField(this,"viaOffsetsDr");__publicField(this,"viaOffsetsDc");__publicField(this,"viaOffsetsLen");__publicField(this,"minViaRow");__publicField(this,"maxViaRow");__publicField(this,"minViaCol");__publicField(this,"maxViaCol");__publicField(this,"usedIndicesByConn");__publicField(this,"usedDiagIndicesByConn");__publicField(this,"unsolvedSegs");__publicField(this,"solvedRoutes");__publicField(this,"activeConnSeg",null);__publicField(this,"activeConnId",-1);__publicField(this,"crossLayerSearch",!1);__publicField(this,"nodePool");__publicField(this,"heap");__publicField(this,"seqCounter",0);__publicField(this,"_viaOccs",[]);__publicField(this,"ripCount");__publicField(this,"totalRipEvents",0);__publicField(this,"searchIterations",0);__publicField(this,"consecutiveSkips",0);__publicField(this,"penaltyCap");__publicField(this,"baseSearchBudgetIters");__publicField(this,"_moveCost",0);__publicField(this,"_moveRipped",null);this.nodeWithPortPoints=props.nodeWithPortPoints,this.cellSizeMm=props.cellSizeMm,this.viaDiameter=props.viaDiameter,this.maxCellCount=props.maxCellCount,this.traceThickness=props.traceThickness??.1,this.traceMargin=props.traceMargin??.15,this.viaMinDistFromBorder=props.viaMinDistFromBorder??.15,this.showPenaltyMap=props.showPenaltyMap??!1,this.showUsedCellMap=props.showUsedCellMap??!1,this.effort=props.effort??1,this.stepMultiplier=Math.max(1,Math.floor(props.stepMultiplier??1)),this.hyperParameters={shuffleSeed:0,ripCost:10,ripTracePenalty:.5,ripViaPenalty:.75,viaBaseCost:.1,greedyMultiplier:1.5,...props.hyperParameters},this.MAX_ITERATIONS=1e8,this.MAX_RIPS=200,this.initialPenaltyFn=props.initialPenaltyFn}get unsolvedConnections(){return this.unsolvedSegs}get solvedConnectionsMap(){return this.solvedRoutes}get activeConnection(){if(!this.activeConnSeg)return null;let s2=this.activeConnSeg;return{connectionName:this.connIdToName[s2.connId]??"",start:{row:s2.startRow,col:s2.startCol,z:s2.startZ,x:0,y:0},end:{row:s2.endRow,col:s2.endCol,z:s2.endZ,x:0,y:0}}}get openSet(){return{length:this.heap?.size??0}}get gridStats(){return{cells:this.planeSize||0,layers:this.layers||0,states:(this.planeSize||0)*(this.layers||0)}}getConstructorParams(){return[{nodeWithPortPoints:this.nodeWithPortPoints,cellSizeMm:this.cellSizeMm,viaDiameter:this.viaDiameter,maxCellCount:this.maxCellCount,stepMultiplier:this.stepMultiplier,traceThickness:this.traceThickness,traceMargin:this.traceMargin,viaMinDistFromBorder:this.viaMinDistFromBorder,showPenaltyMap:this.showPenaltyMap,showUsedCellMap:this.showUsedCellMap,effort:this.effort,hyperParameters:this.hyperParameters,initialPenaltyFn:this.initialPenaltyFn}]}_setup(){let{nodeWithPortPoints,cellSizeMm}=this,{width,height,center:center2}=nodeWithPortPoints;this.availableZ=nodeWithPortPoints.availableZ??[...new Set(nodeWithPortPoints.portPoints.map(pp3=>pp3.z))].sort((a2,b3)=>a2-b3),this.rows=Math.floor(height/cellSizeMm),this.cols=Math.floor(width/cellSizeMm),this.layers=this.availableZ.length,this.planeSize=this.rows*this.cols;let totalCells=this.layers*this.planeSize;if(this.maxCellCount!==void 0&&totalCells>this.maxCellCount){this.error=`Cell count ${totalCells} exceeds maxCellCount ${this.maxCellCount}`,this.failed=!0;return}let totalDiags=this.layers*Math.max(0,this.rows-1)*Math.max(0,this.cols-1)*2;this.zToLayer=new Map,this.layerToZ=new Map;for(let i2=0;i2<this.availableZ.length;i2++){let z5=this.availableZ[i2];this.zToLayer.set(z5,i2),this.layerToZ.set(i2,z5)}if(this.gridOrigin={x:center2.x-width/2,y:center2.y-height/2},this.gridToBoundsTransform=computeGridToAffineTransform({originX:this.gridOrigin.x,originY:this.gridOrigin.y,rows:this.rows,cols:this.cols,cellSizeMm,width,height}),this.connNameToId=new Map,this.connIdToName=[],this.connIdToRootNet=[],this.overlapFriendlyRootNets=new Set,this.penalty2d=new Float64Array(this.planeSize),this.initialPenaltyFn)for(let row=0;row<this.rows;row++){let rowBase=row*this.cols;for(let col=0;col<this.cols;col++){let x5=this.gridOrigin.x+(col+.5)*cellSizeMm,y5=this.gridOrigin.y+(row+.5)*cellSizeMm,px3=(col+.5)/this.cols,py3=(row+.5)/this.rows;this.penalty2d[rowBase+col]=this.initialPenaltyFn({x:x5,y:y5,px:px3,py:py3,row,col})}}this.usedCellsFlat=new Int32Array(totalCells).fill(-1),this.portOwnerFlat=new Int32Array(totalCells).fill(-1),this.usedDiagFlat=new Int32Array(totalDiags).fill(-1),this.visitedStamp=new Uint32Array(totalCells),this.stamp=0;let viaRadiusCells=Math.ceil(this.viaDiameter/2/cellSizeMm),r22=viaRadiusCells*viaRadiusCells,drList=[],dcList=[];for(let dr4=-viaRadiusCells;dr4<=viaRadiusCells;dr4++)for(let dc3=-viaRadiusCells;dc3<=viaRadiusCells;dc3++)dr4*dr4+dc3*dc3<=r22&&(drList.push(dr4),dcList.push(dc3));if(this.viaOffsetsLen=drList.length,this.viaOffsetsDr=new Int32Array(drList),this.viaOffsetsDc=new Int32Array(dcList),this.viaMinDistFromBorder>0){let borderCells=Math.ceil(this.viaMinDistFromBorder/cellSizeMm);this.minViaRow=borderCells,this.maxViaRow=this.rows-1-borderCells,this.minViaCol=borderCells,this.maxViaCol=this.cols-1-borderCells}else this.minViaRow=0,this.maxViaRow=this.rows-1,this.minViaCol=0,this.maxViaCol=this.cols-1;this.unsolvedSegs=this.buildConnectionSegs(),this.sharedCrossRootPortCells=new Set;let rootByPortFlat=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let connId=this.connNameToId.get(pp3.connectionName);if(connId===void 0)continue;let cell=this.pointToCell(pp3),flatIdx=(cell.z*this.rows+cell.row)*this.cols+cell.col,rootNet=this.connIdToRootNet[connId],existingRoot=rootByPortFlat.get(flatIdx);existingRoot===void 0?rootByPortFlat.set(flatIdx,rootNet):existingRoot!==rootNet&&this.sharedCrossRootPortCells.add(flatIdx);let existing=this.portOwnerFlat[flatIdx];existing===-1||existing===connId?this.portOwnerFlat[flatIdx]=connId:this.portOwnerFlat[flatIdx]=-2}this.solvedRoutes=new Map,this.usedIndicesByConn=[],this.usedDiagIndicesByConn=[],this.ripCount=[],this.consecutiveSkips=0,this.penaltyCap=this.hyperParameters.ripCost*.5,this.shuffleConnections();let budget=computeMaxIterationsByNodeSizeAndConnectionCount({planeSize:this.planeSize,layers:this.layers,connectionCount:this.unsolvedSegs.length,effort:this.effort,maxIterations:this.MAX_ITERATIONS});this.baseSearchBudgetIters=budget.baseSearchBudgetIters,this.MAX_ITERATIONS=budget.maxIterationsIters,this.activeConnSeg=null,this.activeConnId=-1,this.nodePool=[],this.heap=new MinHeap,this.seqCounter=0}_step(){for(let i2=0;i2<this.stepMultiplier;i2++){if(this.solved||this.failed)return;this.stepOnce()}}stepOnce(){if(!this.activeConnSeg){if(this.unsolvedSegs.length===0){this.solved=!0;return}let next2=this.unsolvedSegs.shift();this.activeConnSeg=next2,this.activeConnId=next2.connId,this.crossLayerSearch=next2.startZ!==next2.endZ,this.nodePool=[],this.heap.clear(),this.seqCounter=0,this.searchIterations=0,this.nextStamp();let f2=this.computeH(next2.startZ,next2.startRow,next2.startCol,next2.endZ,next2.endRow,next2.endCol)*this.hyperParameters.greedyMultiplier;this.nodePool.push({z:next2.startZ,row:next2.startRow,col:next2.startCol,g:0,f:f2,parentIdx:-1,ripped:null}),this.heap.push(f2,this.seqCounter++,0);return}this.searchIterations++;let connRips=this.ripCount[this.activeConnId]??0,budget=Math.round(this.baseSearchBudgetIters*(1+Math.min(connRips,10)*.25));if(this.searchIterations>budget){let pen=this.penalty2d;for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.9;this.unsolvedSegs.push(this.activeConnSeg),this.activeConnSeg=null,this.activeConnId=-1,this.heap.clear(),this.nodePool=[],this.consecutiveSkips++,this.consecutiveSkips>=this.unsolvedSegs.length*3&&(this.error=`Convergence failure: ${this.unsolvedSegs.length} connections stuck`,this.failed=!0);return}if(this.heap.size===0){this.error=`No path found for ${this.connIdToName[this.activeConnId]}`,this.failed=!0;return}let nodeIdx=this.heap.pop(),node=this.nodePool[nodeIdx],{z:z5,row,col,g:g7,ripped}=node,cellIdx=(z5*this.rows+row)*this.cols+col;if(this.visitedStamp[cellIdx]===this.stamp)return;this.visitedStamp[cellIdx]=this.stamp;let seg=this.activeConnSeg;if(z5===seg.endZ&&row===seg.endRow&&col===seg.endCol){this.finalizeRoute(nodeIdx),this.activeConnSeg=null,this.activeConnId=-1;return}let endZ=seg.endZ,endRow=seg.endRow,endCol=seg.endCol,activeConn=this.activeConnId,rows=this.rows,cols=this.cols,cellSizeMm=this.cellSizeMm,visited=this.visitedStamp,stamp=this.stamp;for(let d3=0;d3<8;d3++){let nr4=row+DIRS_DR[d3],nc3=col+DIRS_DC[d3];if(nr4<0||nr4>=rows||nc3<0||nc3>=cols)continue;let nIdx=(z5*rows+nr4)*cols+nc3;if(visited[nIdx]===stamp||(this.computeMoveCostAndRips(activeConn,z5,row,col,z5,nr4,nc3,ripped),this._moveCost<0))continue;let g22=g7+this._moveCost,f2=g22+this.computeH(z5,nr4,nc3,endZ,endRow,endCol)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.length;this.nodePool.push({z:z5,row:nr4,col:nc3,g:g22,f:f2,parentIdx:nodeIdx,ripped:this._moveRipped}),this.heap.push(f2,this.seqCounter++,newNodeIdx)}if(row>=this.minViaRow&&row<=this.maxViaRow&&col>=this.minViaCol&&col<=this.maxViaCol)for(let nz=0;nz<this.layers;nz++){if(nz===z5)continue;let nIdx=(nz*rows+row)*cols+col;if(visited[nIdx]===stamp||(this.computeMoveCostAndRips(activeConn,z5,row,col,nz,row,col,ripped),this._moveCost<0))continue;let g22=g7+this._moveCost,f2=g22+this.computeH(nz,row,col,endZ,endRow,endCol)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.length;this.nodePool.push({z:nz,row,col,g:g22,f:f2,parentIdx:nodeIdx,ripped:this._moveRipped}),this.heap.push(f2,this.seqCounter++,newNodeIdx)}}computeMoveCostAndRips(activeConn,fromZ,fromRow,fromCol,toZ,toRow,toCol,ripped){let cost=0,r4=ripped,cols=this.cols;if(fromZ!==toZ){cost+=this.hyperParameters.viaBaseCost,cost+=Math.min(this.penalty2d[toRow*cols+toCol],this.penaltyCap);let toFlatIdx=(toZ*this.rows+toRow)*cols+toCol,fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toRow===seg.endRow&&toCol===seg.endCol;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRipped=r4;return}this.fillViaOccupants(toRow,toCol,activeConn);let occs=this._viaOccs;for(let i2=0;i2<occs.length;i2++){let occ=occs[i2];rippedContains(r4,occ)||(cost+=this.hyperParameters.ripCost,r4={id:occ,prev:r4}),cost+=this.hyperParameters.ripViaPenalty}}else{let dr4=fromRow>toRow?fromRow-toRow:toRow-fromRow,dc3=fromCol>toCol?fromCol-toCol:toCol-fromCol;cost+=(dr4+dc3>1?Math.SQRT2:1)*this.cellSizeMm,cost+=Math.min(this.penalty2d[toRow*cols+toCol],this.penaltyCap);let flatIdx=(toZ*this.rows+toRow)*cols+toCol,fixedOwner=this.portOwnerFlat[flatIdx],allowFixedOverlap=this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toRow===seg.endRow&&toCol===seg.endCol;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRipped=r4;return}let occ=this.usedCellsFlat[flatIdx],allowSameRootOverlap=this.connIdToRootNet[occ]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]);if(occ!==-1&&occ!==activeConn&&!allowSameRootOverlap&&(rippedContains(r4,occ)||(cost+=this.hyperParameters.ripCost,r4={id:occ,prev:r4}),cost+=this.hyperParameters.ripTracePenalty),dr4===1&&dc3===1){let sqRow=fromRow<toRow?fromRow:toRow,sqCol=fromCol<toCol?fromCol:toCol,crossingSlot=(fromRow<toRow&&fromCol<toCol||fromRow>toRow&&fromCol>toCol?0:1)^1,sqCols=this.cols-1,diagBase=((toZ*(this.rows-1)+sqRow)*sqCols+sqCol)*2,crossingOcc=this.usedDiagFlat[diagBase+crossingSlot],allowCrossingOverlap=this.connIdToRootNet[crossingOcc]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]);if(crossingOcc!==-1&&crossingOcc!==activeConn&&!allowCrossingOverlap){this._moveCost=-1,this._moveRipped=r4;return}}}this._moveCost=cost,this._moveRipped=r4}fillViaOccupants(row,col,activeConn){let occs=this._viaOccs;occs.length=0;let rows=this.rows,cols=this.cols,offDr=this.viaOffsetsDr,offDc=this.viaOffsetsDc,offLen=this.viaOffsetsLen,used=this.usedCellsFlat;for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let i2=0;i2<offLen;i2++){let r4=row+offDr[i2],c3=col+offDc[i2];if(r4<0||c3<0||r4>=rows||c3>=cols)continue;let occ=used[zBase+r4*cols+c3];if(occ===-1||occ===activeConn||this.connIdToRootNet[occ]===this.connIdToRootNet[activeConn]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[activeConn]))continue;let seen=!1;for(let j4=0;j4<occs.length;j4++)if(occs[j4]===occ){seen=!0;break}seen||occs.push(occ)}}}shouldSkipFixedPortHalo(flatIdx,connId){let fixedOwner=this.portOwnerFlat[flatIdx];return fixedOwner===connId?!1:fixedOwner===-2?!0:fixedOwner<0?!1:!(this.connIdToRootNet[fixedOwner]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]))}nextStamp(){this.stamp=this.stamp+1>>>0,this.stamp===0&&(this.visitedStamp.fill(0),this.stamp=1)}computeH(z5,row,col,toZ,toRow,toCol){let dr4=Math.abs(row-toRow),dc3=Math.abs(col-toCol),manhattan=dr4+dc3;if(z5===toZ)return manhattan*this.cellSizeMm;if(!this.crossLayerSearch)return manhattan*this.cellSizeMm+this.hyperParameters.viaBaseCost;let vr1=Math.max(this.minViaRow,Math.min(this.maxViaRow,row)),vc1=Math.max(this.minViaCol,Math.min(this.maxViaCol,col)),vr22=Math.max(this.minViaRow,Math.min(this.maxViaRow,toRow)),vc22=Math.max(this.minViaCol,Math.min(this.maxViaCol,toCol)),via1=Math.abs(row-vr1)+Math.abs(col-vc1)+Math.abs(vr1-toRow)+Math.abs(vc1-toCol),via2=Math.abs(row-vr22)+Math.abs(col-vc22)+Math.abs(vr22-toRow)+Math.abs(vc22-toCol);return Math.max(Math.min(via1,via2),manhattan)*this.cellSizeMm+this.hyperParameters.viaBaseCost}internConn(name,rootNetName){let existing=this.connNameToId.get(name);if(existing!==void 0)return existing;let id2=this.connIdToName.length;return this.connIdToName.push(name),this.connIdToRootNet.push(toRootNetName(name,rootNetName)),this.connNameToId.set(name,id2),id2}buildConnectionSegs(){let byName=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let name=pp3.connectionName;byName.has(name)||byName.set(name,{points:[],rootConnectionName:pp3.rootConnectionName}),byName.get(name).points.push(pp3)}let segs=[],seenSegmentKeys=new Set;for(let[name,conn]of byName){let pts=conn.points;if(pts.length<2)continue;let connId=this.internConn(name,conn.rootConnectionName);for(let i2=0;i2<pts.length-1;i2++){let s2=this.pointToCell(pts[i2]),e4=this.pointToCell(pts[i2+1]),endpointA=`${s2.z}:${s2.row}:${s2.col}`,endpointB=`${e4.z}:${e4.row}:${e4.col}`,orderedEndpoints=endpointA<endpointB?`${endpointA}|${endpointB}`:`${endpointB}|${endpointA}`,netName=conn.rootConnectionName??name,segKey=`${netName}|${orderedEndpoints}`;if(seenSegmentKeys.has(segKey)){this.overlapFriendlyRootNets.add(netName);continue}seenSegmentKeys.add(segKey),segs.push({connId,startZ:s2.z,startRow:s2.row,startCol:s2.col,endZ:e4.z,endRow:e4.row,endCol:e4.col})}}return segs}pointToCell(pt4){let col=Math.max(0,Math.min(this.cols-1,Math.round((pt4.x-this.gridOrigin.x)/this.cellSizeMm-.5))),row=Math.max(0,Math.min(this.rows-1,Math.round((pt4.y-this.gridOrigin.y)/this.cellSizeMm-.5)));return{z:this.zToLayer.get(pt4.z)??0,row,col}}shuffleConnections(){let arr=this.unsolvedSegs,s2=this.hyperParameters.shuffleSeed,rng=()=>(s2=s2*1664525+1013904223&4294967295,(s2>>>0)/4294967295);for(let i2=arr.length-1;i2>0;i2--){let j4=Math.floor(rng()*(i2+1)),tmp=arr[i2];arr[i2]=arr[j4],arr[j4]=tmp}}finalizeRoute(goalNodeIdx){this.consecutiveSkips=Math.max(0,this.consecutiveSkips-1);let cells=[],idx=goalNodeIdx;for(;idx>=0;){let n3=this.nodePool[idx];cells.push({z:n3.z,row:n3.row,col:n3.col}),idx=n3.parentIdx}for(cells.reverse();cells.length>1;){let first=cells[0],firstFlat=(first.z*this.rows+first.row)*this.cols+first.col;if(!this.sharedCrossRootPortCells.has(firstFlat))break;cells.shift()}for(;cells.length>1;){let last=cells[cells.length-1],lastFlat=(last.z*this.rows+last.row)*this.cols+last.col;if(!this.sharedCrossRootPortCells.has(lastFlat))break;cells.pop()}let viaCells=[];for(let i2=1;i2<cells.length;i2++)cells[i2].z!==cells[i2-1].z&&viaCells.push({row:cells[i2].row,col:cells[i2].col});let connId=this.activeConnId,goalNode=this.nodePool[goalNodeIdx],rippedIds=[];for(let cur=goalNode.ripped;cur;cur=cur.prev)rippedIds.push(cur.id);for(let i2=0;i2<rippedIds.length;i2++)if(this.ripTrace(rippedIds[i2]),this.failed)return;let marginCells=Math.ceil(this.traceMargin/this.cellSizeMm),indices=[],rows=this.rows,cols=this.cols,used=this.usedCellsFlat;for(let ci3=0;ci3<cells.length;ci3++){let cell=cells[ci3];for(let dr4=-marginCells;dr4<=marginCells;dr4++)for(let dc3=-marginCells;dc3<=marginCells;dc3++){let r4=cell.row+dr4,c3=cell.col+dc3;if(r4<0||r4>=rows||c3<0||c3>=cols)continue;let flatIdx=(cell.z*rows+r4)*cols+c3;if((r4!==cell.row||c3!==cell.col)&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;let existing=used[flatIdx],allowSameRootOverlap=this.connIdToRootNet[existing]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);existing!==-1&&existing!==connId&&!allowSameRootOverlap||(used[flatIdx]=connId,indices.push(flatIdx))}}let displacedByVias=[],offDr=this.viaOffsetsDr,offDc=this.viaOffsetsDc,offLen=this.viaOffsetsLen;for(let vi3=0;vi3<viaCells.length;vi3++){let via=viaCells[vi3];for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let oi3=0;oi3<offLen;oi3++){let r4=via.row+offDr[oi3],c3=via.col+offDc[oi3];if(r4<0||r4>=rows||c3<0||c3>=cols)continue;let flatIdx=zBase+r4*cols+c3;if((r4!==via.row||c3!==via.col)&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;let existing=used[flatIdx],allowSameRootOverlap=this.connIdToRootNet[existing]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);if(existing!==-1&&existing!==connId&&!allowSameRootOverlap){let seen=!1;for(let k4=0;k4<displacedByVias.length;k4++)if(displacedByVias[k4]===existing){seen=!0;break}seen||displacedByVias.push(existing)}used[flatIdx]=connId,indices.push(flatIdx)}}}let diagIndices=[],sqCols=this.cols-1;for(let i2=1;i2<cells.length;i2++){let prev=cells[i2-1],curr=cells[i2];if(prev.z!==curr.z)continue;let dr4=prev.row>curr.row?prev.row-curr.row:curr.row-prev.row,dc3=prev.col>curr.col?prev.col-curr.col:curr.col-prev.col;if(dr4!==1||dc3!==1)continue;let sqRow=prev.row<curr.row?prev.row:curr.row,sqCol=prev.col<curr.col?prev.col:curr.col,diagSlot=prev.row<curr.row&&prev.col<curr.col||prev.row>curr.row&&prev.col>curr.col?0:1,crossingSlot=diagSlot^1,diagBase=((prev.z*(this.rows-1)+sqRow)*sqCols+sqCol)*2,crossingIdx=diagBase+crossingSlot,crossingOcc=this.usedDiagFlat[crossingIdx],allowCrossingOverlap=this.connIdToRootNet[crossingOcc]===this.connIdToRootNet[connId]&&this.overlapFriendlyRootNets.has(this.connIdToRootNet[connId]);if(crossingOcc!==-1&&crossingOcc!==connId&&!allowCrossingOverlap)continue;let diagIdx=diagBase+diagSlot;this.usedDiagFlat[diagIdx]=connId,diagIndices.push(diagIdx)}for(;this.usedIndicesByConn.length<=connId;)this.usedIndicesByConn.push([]);for(this.usedIndicesByConn[connId]=indices;this.usedDiagIndicesByConn.length<=connId;)this.usedDiagIndicesByConn.push([]);this.usedDiagIndicesByConn[connId]=diagIndices,this.solvedRoutes.set(connId,{connId,cells,viaCells});for(let i2=0;i2<displacedByVias.length;i2++)if(this.ripTrace(displacedByVias[i2]),this.failed)return;if(rippedIds.length>0||displacedByVias.length>0){let pen=this.penalty2d,cap2=this.penaltyCap;if(this.totalRipEvents>50)for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.99;else for(let i2=0;i2<pen.length;i2++)pen[i2]>cap2&&(pen[i2]=pen[i2]*.5)}}ripTrace(connId){for(;this.ripCount.length<=connId;)this.ripCount.push(0);if(this.ripCount[connId]++,this.totalRipEvents++,this.totalRipEvents>=this.MAX_RIPS){this.error=`Convergence failure: exceeded MAX_RIPS ${this.MAX_RIPS}`,this.failed=!0;return}let route=this.solvedRoutes.get(connId);if(route){let cols=this.cols;for(let i2=0;i2<route.cells.length;i2++){let cell=route.cells[i2],cellIdx=cell.row*cols+cell.col;this.penalty2d[cellIdx]=this.penalty2d[cellIdx]+this.hyperParameters.ripTracePenalty}for(let i2=0;i2<route.viaCells.length;i2++){let via=route.viaCells[i2],viaIdx=via.row*cols+via.col;this.penalty2d[viaIdx]=this.penalty2d[viaIdx]+this.hyperParameters.ripViaPenalty}}let indices=this.usedIndicesByConn[connId];if(indices){let used=this.usedCellsFlat;for(let i2=0;i2<indices.length;i2++){let flatIdx=indices[i2];used[flatIdx]===connId&&(used[flatIdx]=-1)}this.usedIndicesByConn[connId]=[]}let diagIndices=this.usedDiagIndicesByConn[connId];if(diagIndices){let usedDiag=this.usedDiagFlat;for(let i2=0;i2<diagIndices.length;i2++){let flatIdx=diagIndices[i2];usedDiag[flatIdx]===connId&&(usedDiag[flatIdx]=-1)}this.usedDiagIndicesByConn[connId]=[]}if(route){this.solvedRoutes.delete(connId);let first=route.cells[0],last=route.cells[route.cells.length-1];this.unsolvedSegs.push({connId,startZ:first.z,startRow:first.row,startCol:first.col,endZ:last.z,endRow:last.row,endCol:last.col})}}visualize(){let LAYER_COLORS=["red","blue","orange","green"],points=[],lines=[],circles=[],rects=[],{width,height,center:center2}=this.nodeWithPortPoints;rects.push({center:{x:center2.x,y:center2.y},width,height,stroke:"gray"});let vt4=this.gridToBoundsTransform;if(this.showPenaltyMap&&this.penalty2d){let maxPenalty=0;for(let i2=0;i2<this.penalty2d.length;i2++)this.penalty2d[i2]>maxPenalty&&(maxPenalty=this.penalty2d[i2]);if(maxPenalty>0)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){let p4=this.penalty2d[row*this.cols+col];if(p4<=0)continue;let alpha=Math.min(.6,p4/maxPenalty*.6),tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});rects.push({center:tc3,width:this.cellSizeMm*vt4.a,height:this.cellSizeMm*vt4.e,fill:`rgba(255,165,0,${alpha.toFixed(3)})`})}}if(this.showUsedCellMap&&this.usedCellsFlat)for(let z5=0;z5<this.layers;z5++)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){if(this.usedCellsFlat[(z5*this.rows+row)*this.cols+col]===-1)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});rects.push({center:tc3,width:this.cellSizeMm*vt4.a,height:this.cellSizeMm*vt4.e,fill:"rgba(0,0,255,0.5)"})}for(let pp3 of this.nodeWithPortPoints.portPoints)points.push({x:pp3.x,y:pp3.y,color:LAYER_COLORS[pp3.z]??"gray",label:pp3.connectionName});let TRACE_COLORS=["rgba(255,0,0,0.75)","rgba(0,0,255,0.75)","rgba(255,165,0,0.75)","rgba(0,128,0,0.75)"],transformedRoutes=this.getOutput();for(let route of transformedRoutes){if(route.route.length<2)continue;let segStart=0;for(let i2=1;i2<route.route.length;i2++){let prev=route.route[i2-1];route.route[i2].z!==prev.z&&(i2-segStart>=2&&lines.push({points:route.route.slice(segStart,i2).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[prev.z]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness}),segStart=i2)}if(route.route.length-segStart>=2){let lastZ=route.route[segStart].z;lines.push({points:route.route.slice(segStart).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[lastZ]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness})}}for(let route of transformedRoutes)for(let via of route.vias)circles.push({center:{x:via.x,y:via.y},radius:this.viaDiameter/2,fill:"rgba(0,0,0,0.3)",stroke:"black"});if(this.activeConnSeg&&this.visitedStamp){let currentStamp=this.stamp;for(let z5=0;z5<this.layers;z5++)for(let row=0;row<this.rows;row++)for(let col=0;col<this.cols;col++){if(this.visitedStamp[(z5*this.rows+row)*this.cols+col]!==currentStamp)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.gridOrigin.x+(col+.5)*this.cellSizeMm,y:this.gridOrigin.y+(row+.5)*this.cellSizeMm});points.push({x:tc3.x,y:tc3.y,color:"rgba(0,0,255,0.2)"})}}return{points,lines,circles,rects,coordinateSystem:"cartesian",title:`HighDensityA01 [${this.solvedRoutes?.size??0} solved, ${this.unsolvedSegs?.length??0} remaining]`}}getOutput(){let t35=this.gridToBoundsTransform,result=[];for(let[connId,route]of this.solvedRoutes??[]){let connName=this.connIdToName[connId];result.push({connectionName:connName,traceThickness:this.traceThickness,viaDiameter:this.viaDiameter,route:route.cells.map(cell=>{let rawX=this.gridOrigin.x+(cell.col+.5)*this.cellSizeMm,rawY=this.gridOrigin.y+(cell.row+.5)*this.cellSizeMm,tp3=applyAffineTransformToPoint(t35,{x:rawX,y:rawY});return{x:tp3.x,y:tp3.y,z:this.layerToZ.get(cell.z)??cell.z}}),vias:route.viaCells.map(via=>{let rawX=this.gridOrigin.x+(via.col+.5)*this.cellSizeMm,rawY=this.gridOrigin.y+(via.row+.5)*this.cellSizeMm;return applyAffineTransformToPoint(t35,{x:rawX,y:rawY})})})}return result}};var REGION_LEFT=0,REGION_TOP=1,REGION_RIGHT=2,REGION_BOTTOM=3,REGION_MIDDLE=4,REGION_NAMES=["left","top","right","bottom","middle"],TypedMinHeap2=class{constructor(){__publicField(this,"f",new Float64Array(1024));__publicField(this,"seq",new Uint32Array(1024));__publicField(this,"id",new Int32Array(1024));__publicField(this,"n",0)}push(f2,seq,id2){this.ensureCapacity(this.n+1);let i2=this.n++;for(this.f[i2]=f2,this.seq[i2]=seq,this.id[i2]=id2;i2>0;){let p4=i2-1>>1;if(this.less(p4,i2))break;this.swap(i2,p4),i2=p4}}pop(){let out=this.id[0];return this.n--,this.n>0&&(this.f[0]=this.f[this.n],this.seq[0]=this.seq[this.n],this.id[0]=this.id[this.n],this.siftDown(0)),out}get size(){return this.n}clear(){this.n=0}ensureCapacity(size2){if(size2<=this.f.length)return;let next2=this.f.length;for(;next2<size2;)next2*=2;let nf3=new Float64Array(next2);nf3.set(this.f),this.f=nf3;let ns3=new Uint32Array(next2);ns3.set(this.seq),this.seq=ns3;let ni3=new Int32Array(next2);ni3.set(this.id),this.id=ni3}siftDown(i2){for(;;){let l3=i2*2+1,r4=l3+1;if(l3>=this.n)return;let m3=l3;if(r4<this.n&&!this.less(l3,r4)&&(m3=r4),this.less(i2,m3))return;this.swap(i2,m3),i2=m3}}less(i2,j4){let fi3=this.f[i2],fj=this.f[j4];return fi3!==fj?fi3<fj:this.seq[i2]<this.seq[j4]}swap(i2,j4){let tf3=this.f[i2];this.f[i2]=this.f[j4],this.f[j4]=tf3;let ts3=this.seq[i2];this.seq[i2]=this.seq[j4],this.seq[j4]=ts3;let ti3=this.id[i2];this.id[i2]=this.id[j4],this.id[j4]=ti3}},TypedNodePool2=class{constructor(){__publicField(this,"z",new Int32Array(1024));__publicField(this,"cellId",new Int32Array(1024));__publicField(this,"g",new Float64Array(1024));__publicField(this,"parent",new Int32Array(1024));__publicField(this,"ripHead",new Int32Array(1024).fill(-1));__publicField(this,"ripCount",new Int32Array(1024));__publicField(this,"length",0)}clear(){this.length=0}push(z5,cellId,g7,parent,ripHead,ripCount){this.ensureCapacity(this.length+1);let idx=this.length++;return this.z[idx]=z5,this.cellId[idx]=cellId,this.g[idx]=g7,this.parent[idx]=parent,this.ripHead[idx]=ripHead,this.ripCount[idx]=ripCount,idx}ensureCapacity(size2){if(size2<=this.z.length)return;let next2=this.z.length;for(;next2<size2;)next2*=2;let nz=new Int32Array(next2);nz.set(this.z),this.z=nz;let nc3=new Int32Array(next2);nc3.set(this.cellId),this.cellId=nc3;let ng3=new Float64Array(next2);ng3.set(this.g),this.g=ng3;let np2=new Int32Array(next2);np2.set(this.parent),this.parent=np2;let nr4=new Int32Array(next2);nr4.fill(-1),nr4.set(this.ripHead.subarray(0,this.length)),this.ripHead=nr4;let nrc=new Int32Array(next2);nrc.set(this.ripCount.subarray(0,this.length)),this.ripCount=nrc}},TypedRipChain2=class{constructor(){__publicField(this,"connId",new Int32Array(1024));__publicField(this,"prev",new Int32Array(1024).fill(-1));__publicField(this,"length",0)}clear(){this.length=0}append(prevHead,connId){this.ensureCapacity(this.length+1);let idx=this.length++;return this.connId[idx]=connId,this.prev[idx]=prevHead,idx}contains(head,connId){for(let cur=head;cur>=0;cur=this.prev[cur])if(this.connId[cur]===connId)return!0;return!1}collect(head,out){out.length=0;for(let cur=head;cur>=0;cur=this.prev[cur])out.push(this.connId[cur])}ensureCapacity(size2){if(size2<=this.connId.length)return;let next2=this.connId.length;for(;next2<size2;)next2*=2;let nc3=new Int32Array(next2);nc3.set(this.connId),this.connId=nc3;let np2=new Int32Array(next2);np2.fill(-1),np2.set(this.prev.subarray(0,this.length)),this.prev=np2}};function toRootNetName3(connectionName,rootConnectionName){return rootConnectionName??connectionName.replace(/_mst\d+$/,"")}function clamp32(value,min,max){return Math.max(min,Math.min(max,value))}function pushUnique2(arr,value){for(let i2=0;i2<arr.length;i2++)if(arr[i2]===value)return;arr.push(value)}function pushUniqueNeighbor2(arr,edge){for(let i2=0;i2<arr.length;i2++)if(arr[i2].cellId===edge.cellId)return;arr.push(edge)}function circleIntersectsRect2(cx3,cy3,r4,minX,minY,maxX,maxY){let qx3=clamp32(cx3,minX,maxX),qy3=clamp32(cy3,minY,maxY),dx3=cx3-qx3,dy3=cy3-qy3;return dx3*dx3+dy3*dy3<=r4*r4}var HighDensitySolverA03=class extends BaseSolver{constructor(props){super();__publicField(this,"nodeWithPortPoints");__publicField(this,"highResolutionCellSize");__publicField(this,"highResolutionCellThickness");__publicField(this,"lowResolutionCellSize");__publicField(this,"viaDiameter");__publicField(this,"MAX_RIPS");__publicField(this,"maxCellCount");__publicField(this,"traceThickness");__publicField(this,"traceMargin");__publicField(this,"viaMinDistFromBorder");__publicField(this,"showPenaltyMap");__publicField(this,"showUsedCellMap");__publicField(this,"effort");__publicField(this,"stepMultiplier");__publicField(this,"hyperParameters");__publicField(this,"initialPenaltyFn");__publicField(this,"boundsMinX");__publicField(this,"boundsMaxX");__publicField(this,"boundsMinY");__publicField(this,"boundsMaxY");__publicField(this,"gridToBoundsTransform");__publicField(this,"availableZ");__publicField(this,"zToLayer");__publicField(this,"layerToZ");__publicField(this,"layers");__publicField(this,"fineRows");__publicField(this,"fineCols");__publicField(this,"lowScale");__publicField(this,"bandRows");__publicField(this,"bandCols");__publicField(this,"regions");__publicField(this,"planeSize");__publicField(this,"cellCenterX");__publicField(this,"cellCenterY");__publicField(this,"cellMinX");__publicField(this,"cellMinY");__publicField(this,"cellMaxX");__publicField(this,"cellMaxY");__publicField(this,"cellWidth");__publicField(this,"cellHeight");__publicField(this,"cellRegion");__publicField(this,"cellRow");__publicField(this,"cellCol");__publicField(this,"viaAllowed");__publicField(this,"neighborOffset");__publicField(this,"neighborIds");__publicField(this,"neighborCosts");__publicField(this,"usedCellsFlat");__publicField(this,"sharedCellsFlat");__publicField(this,"portOwnerFlat");__publicField(this,"penalty2d");__publicField(this,"ripStateBuckets");__publicField(this,"visitedStamp");__publicField(this,"bestGStamp");__publicField(this,"bestGValue");__publicField(this,"visitedFlatStamp");__publicField(this,"sharedCrossRootPortFlat");__publicField(this,"stamp",0);__publicField(this,"connNameToId");__publicField(this,"connIdToName");__publicField(this,"connIdToRootNet");__publicField(this,"overlapFriendlyRootNets");__publicField(this,"usedIndicesByConn");__publicField(this,"unsolvedSegs");__publicField(this,"solvedRoutes");__publicField(this,"activeConnSeg",null);__publicField(this,"activeConnId",-1);__publicField(this,"nodePool");__publicField(this,"heap");__publicField(this,"ripChain");__publicField(this,"seqCounter",0);__publicField(this,"_viaOccs",[]);__publicField(this,"_cellOccs",[]);__publicField(this,"_rippedIds",[]);__publicField(this,"ripCount");__publicField(this,"totalRipEvents",0);__publicField(this,"searchIterations",0);__publicField(this,"consecutiveSkips",0);__publicField(this,"penaltyCap");__publicField(this,"baseSearchBudgetIters");__publicField(this,"_moveCost",0);__publicField(this,"_moveRippedHead",-1);__publicField(this,"_moveRipCount",0);__publicField(this,"traceKeepoutRadius");__publicField(this,"viaKeepoutRadius");this.nodeWithPortPoints=props.nodeWithPortPoints,this.highResolutionCellSize=props.highResolutionCellSize??.1,this.highResolutionCellThickness=Math.max(1,Math.floor(props.highResolutionCellThickness??8)),this.lowResolutionCellSize=props.lowResolutionCellSize??.4,this.viaDiameter=props.viaDiameter,this.maxCellCount=props.maxCellCount,this.traceThickness=props.traceThickness??.1,this.traceMargin=props.traceMargin??.15,this.viaMinDistFromBorder=props.viaMinDistFromBorder??.15,this.showPenaltyMap=props.showPenaltyMap??!1,this.showUsedCellMap=props.showUsedCellMap??!1,this.effort=props.effort??1,this.stepMultiplier=Math.max(1,Math.floor(props.stepMultiplier??1)),this.hyperParameters={shuffleSeed:0,ripCost:8,ripTracePenalty:.5,ripViaPenalty:.75,viaBaseCost:.1,greedyMultiplier:1.5,...props.hyperParameters},this.MAX_ITERATIONS=1e8,this.MAX_RIPS=200,this.initialPenaltyFn=props.initialPenaltyFn}get unsolvedConnections(){return this.unsolvedSegs}get solvedConnectionsMap(){let map=new Map;for(let connId=0;connId<this.solvedRoutes.length;connId++){let route=this.solvedRoutes[connId];route&&map.set(connId,route)}return map}get activeConnection(){if(!this.activeConnSeg)return null;let startCellId=this.activeConnSeg.startCellId,endCellId=this.activeConnSeg.endCellId;return{connectionName:this.connIdToName[this.activeConnSeg.connId]??"",start:{cellId:startCellId,region:REGION_NAMES[this.cellRegion[startCellId]],row:this.cellRow[startCellId],col:this.cellCol[startCellId],x:this.cellCenterX[startCellId],y:this.cellCenterY[startCellId],z:this.activeConnSeg.startZ},end:{cellId:endCellId,region:REGION_NAMES[this.cellRegion[endCellId]],row:this.cellRow[endCellId],col:this.cellCol[endCellId],x:this.cellCenterX[endCellId],y:this.cellCenterY[endCellId],z:this.activeConnSeg.endZ}}}get openSet(){return{length:this.heap?.size??0}}get gridStats(){return{cells:this.planeSize||0,layers:this.layers||0,states:(this.planeSize||0)*(this.layers||0),ripStateBuckets:this.ripStateBuckets||0,neighborEdges:this.neighborIds?.length??0,regionCounts:this.regions?Object.fromEntries(this.regions.map(region=>[region.name,region.rows*region.cols])):{}}}getConstructorParams(){return[{nodeWithPortPoints:this.nodeWithPortPoints,highResolutionCellSize:this.highResolutionCellSize,highResolutionCellThickness:this.highResolutionCellThickness,lowResolutionCellSize:this.lowResolutionCellSize,viaDiameter:this.viaDiameter,maxCellCount:this.maxCellCount,stepMultiplier:this.stepMultiplier,traceThickness:this.traceThickness,traceMargin:this.traceMargin,viaMinDistFromBorder:this.viaMinDistFromBorder,showPenaltyMap:this.showPenaltyMap,showUsedCellMap:this.showUsedCellMap,effort:this.effort,hyperParameters:this.hyperParameters,initialPenaltyFn:this.initialPenaltyFn}]}_setup(){let{nodeWithPortPoints}=this,{width,height,center:center2}=nodeWithPortPoints,rawScale=this.lowResolutionCellSize/this.highResolutionCellSize,roundedScale=Math.round(rawScale);if(!Number.isFinite(rawScale)||rawScale<=0||Math.abs(rawScale-roundedScale)>1e-9){this.error="lowResolutionCellSize must be a positive integer multiple of highResolutionCellSize",this.failed=!0;return}this.lowScale=Math.max(1,roundedScale),this.availableZ=nodeWithPortPoints.availableZ??[...new Set(nodeWithPortPoints.portPoints.map(pp3=>pp3.z))].sort((a2,b3)=>a2-b3),this.layers=this.availableZ.length,this.zToLayer=new Map,this.layerToZ=new Map;for(let i2=0;i2<this.availableZ.length;i2++){let z5=this.availableZ[i2];this.zToLayer.set(z5,i2),this.layerToZ.set(i2,z5)}this.boundsMinX=center2.x-width/2,this.boundsMaxX=center2.x+width/2,this.boundsMinY=center2.y-height/2,this.boundsMaxY=center2.y+height/2,this.traceKeepoutRadius=this.traceMargin+this.traceThickness/2,this.viaKeepoutRadius=this.viaDiameter/2+this.traceKeepoutRadius,this.buildFiveRegionGrid(width,height),this.gridToBoundsTransform=this.computeGridToBoundsTransform();let totalCells=this.layers*this.planeSize;if(this.maxCellCount!==void 0&&totalCells>this.maxCellCount){this.error=`Cell count ${totalCells} exceeds maxCellCount ${this.maxCellCount}`,this.failed=!0;return}this.connNameToId=new Map,this.connIdToName=[],this.connIdToRootNet=[],this.overlapFriendlyRootNets=new Set,this.unsolvedSegs=this.buildConnectionSegs(),this.penalty2d=new Float64Array(this.planeSize);let widthInv=width>0?1/width:0,heightInv=height>0?1/height:0;for(let cellId=0;cellId<this.planeSize;cellId++){let penalty=0;this.initialPenaltyFn&&(penalty+=this.initialPenaltyFn({x:this.cellCenterX[cellId],y:this.cellCenterY[cellId],px:(this.cellCenterX[cellId]-this.boundsMinX)*widthInv,py:(this.cellCenterY[cellId]-this.boundsMinY)*heightInv,cellId,region:REGION_NAMES[this.cellRegion[cellId]],row:this.cellRow[cellId],col:this.cellCol[cellId]})),this.penalty2d[cellId]=penalty}this.usedCellsFlat=new Int32Array(totalCells).fill(-1),this.sharedCellsFlat=Array.from({length:totalCells},()=>{}),this.portOwnerFlat=new Int32Array(totalCells).fill(-1),this.sharedCrossRootPortFlat=new Uint8Array(totalCells),this.ripStateBuckets=1;let searchStateCount=totalCells;this.visitedStamp=new Uint32Array(searchStateCount),this.bestGStamp=new Uint32Array(searchStateCount),this.bestGValue=new Float64Array(searchStateCount),this.visitedFlatStamp=new Uint32Array(totalCells),this.stamp=0;let rootByPortFlat=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let connId=this.connNameToId.get(pp3.connectionName);if(connId===void 0)continue;let cell=this.pointToCell(pp3),flatIdx=cell.z*this.planeSize+cell.cellId,rootNet=this.connIdToRootNet[connId],existingRoot=rootByPortFlat.get(flatIdx);existingRoot===void 0?rootByPortFlat.set(flatIdx,rootNet):existingRoot!==rootNet&&(this.sharedCrossRootPortFlat[flatIdx]=1);let existing=this.portOwnerFlat[flatIdx];existing===-1||existing===connId?this.portOwnerFlat[flatIdx]=connId:this.portOwnerFlat[flatIdx]=-2}this.solvedRoutes=[],this.usedIndicesByConn=[],this.ripCount=[],this.consecutiveSkips=0,this.penaltyCap=this.hyperParameters.ripCost*.5,this.shuffleConnections();let budget=computeMaxIterationsByNodeSizeAndConnectionCount({planeSize:this.planeSize,layers:this.layers,connectionCount:this.unsolvedSegs.length,effort:this.effort,maxIterations:this.MAX_ITERATIONS});this.baseSearchBudgetIters=budget.baseSearchBudgetIters,this.MAX_ITERATIONS=budget.maxIterationsIters,this.activeConnSeg=null,this.activeConnId=-1,this.nodePool=new TypedNodePool2,this.heap=new TypedMinHeap2,this.ripChain=new TypedRipChain2,this.seqCounter=0}_step(){for(let i2=0;i2<this.stepMultiplier;i2++){if(this.solved||this.failed)return;this.stepOnce()}}buildFiveRegionGrid(width,height){this.fineCols=Math.max(1,Math.ceil(width/this.highResolutionCellSize)),this.fineRows=Math.max(1,Math.ceil(height/this.highResolutionCellSize)),this.bandCols=Math.min(this.highResolutionCellThickness,Math.floor(this.fineCols/2)),this.bandRows=Math.min(this.highResolutionCellThickness,Math.floor(this.fineRows/2));let middleFineCols=Math.max(0,this.fineCols-this.bandCols*2),middleFineRows=Math.max(0,this.fineRows-this.bandRows*2),topFineCols=middleFineCols,bottomFineCols=middleFineCols;this.regions=[{id:REGION_LEFT,name:"left",fineOriginRow:0,fineOriginCol:0,fineRows:this.fineRows,fineCols:this.bandCols,cellScale:1,rows:this.fineRows,cols:this.bandCols,offset:0},{id:REGION_TOP,name:"top",fineOriginRow:0,fineOriginCol:this.bandCols,fineRows:this.bandRows,fineCols:topFineCols,cellScale:1,rows:this.bandRows,cols:topFineCols,offset:0},{id:REGION_RIGHT,name:"right",fineOriginRow:0,fineOriginCol:this.fineCols-this.bandCols,fineRows:this.fineRows,fineCols:this.bandCols,cellScale:1,rows:this.fineRows,cols:this.bandCols,offset:0},{id:REGION_BOTTOM,name:"bottom",fineOriginRow:this.fineRows-this.bandRows,fineOriginCol:this.bandCols,fineRows:this.bandRows,fineCols:bottomFineCols,cellScale:1,rows:this.bandRows,cols:bottomFineCols,offset:0},{id:REGION_MIDDLE,name:"middle",fineOriginRow:this.bandRows,fineOriginCol:this.bandCols,fineRows:middleFineRows,fineCols:middleFineCols,cellScale:this.lowScale,rows:middleFineRows>0?Math.ceil(middleFineRows/this.lowScale):0,cols:middleFineCols>0?Math.ceil(middleFineCols/this.lowScale):0,offset:0}];let offset=0;for(let i2=0;i2<this.regions.length;i2++)this.regions[i2].offset=offset,offset+=this.regions[i2].rows*this.regions[i2].cols;this.planeSize=offset,this.cellCenterX=new Float64Array(this.planeSize),this.cellCenterY=new Float64Array(this.planeSize),this.cellMinX=new Float64Array(this.planeSize),this.cellMinY=new Float64Array(this.planeSize),this.cellMaxX=new Float64Array(this.planeSize),this.cellMaxY=new Float64Array(this.planeSize),this.cellWidth=new Float64Array(this.planeSize),this.cellHeight=new Float64Array(this.planeSize),this.cellRegion=new Uint8Array(this.planeSize),this.cellRow=new Int32Array(this.planeSize),this.cellCol=new Int32Array(this.planeSize),this.viaAllowed=new Uint8Array(this.planeSize);for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];for(let row=0;row<region.rows;row++){let fineRow0=region.fineOriginRow+row*region.cellScale,fineRow1=Math.min(region.fineOriginRow+region.fineRows,fineRow0+region.cellScale),minY=this.boundsMinY+fineRow0*this.highResolutionCellSize,maxY=Math.min(this.boundsMaxY,this.boundsMinY+fineRow1*this.highResolutionCellSize);for(let col=0;col<region.cols;col++){let fineCol0=region.fineOriginCol+col*region.cellScale,fineCol1=Math.min(region.fineOriginCol+region.fineCols,fineCol0+region.cellScale),minX=this.boundsMinX+fineCol0*this.highResolutionCellSize,maxX=Math.min(this.boundsMaxX,this.boundsMinX+fineCol1*this.highResolutionCellSize),cellId=this.cellIdFor(region.id,row,col);this.cellCenterX[cellId]=(minX+maxX)/2,this.cellCenterY[cellId]=(minY+maxY)/2,this.cellMinX[cellId]=minX,this.cellMinY[cellId]=minY,this.cellMaxX[cellId]=maxX,this.cellMaxY[cellId]=maxY,this.cellWidth[cellId]=maxX-minX,this.cellHeight[cellId]=maxY-minY,this.cellRegion[cellId]=region.id,this.cellRow[cellId]=row,this.cellCol[cellId]=col;let minBorderDist=Math.min(this.cellCenterX[cellId]-this.boundsMinX,this.boundsMaxX-this.cellCenterX[cellId],this.cellCenterY[cellId]-this.boundsMinY,this.boundsMaxY-this.cellCenterY[cellId]);this.viaAllowed[cellId]=minBorderDist>=this.viaMinDistFromBorder?1:0}}}let neighbors=Array.from({length:this.planeSize},()=>[]),addBidirectionalEdge=(a2,b3)=>{if(a2===b3||a2<0||b3<0)return;let dx3=this.cellCenterX[a2]-this.cellCenterX[b3],dy3=this.cellCenterY[a2]-this.cellCenterY[b3],cost=Math.hypot(dx3,dy3);pushUniqueNeighbor2(neighbors[a2],{cellId:b3,cost}),pushUniqueNeighbor2(neighbors[b3],{cellId:a2,cost})};for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];for(let row=0;row<region.rows;row++)for(let col=0;col<region.cols;col++){let cellId=this.cellIdFor(region.id,row,col);row+1<region.rows&&addBidirectionalEdge(cellId,this.cellIdFor(region.id,row+1,col)),col+1<region.cols&&addBidirectionalEdge(cellId,this.cellIdFor(region.id,row,col+1))}}let left=this.regions[REGION_LEFT],top=this.regions[REGION_TOP],right=this.regions[REGION_RIGHT],bottom=this.regions[REGION_BOTTOM],middle=this.regions[REGION_MIDDLE],hasLeft=left.rows>0&&left.cols>0,hasTop=top.rows>0&&top.cols>0,hasRight=right.rows>0&&right.cols>0,hasBottom=bottom.rows>0&&bottom.cols>0,hasMiddle=middle.rows>0&&middle.cols>0;if(hasLeft&&hasTop)for(let globalRow=0;globalRow<this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_TOP,globalRow,0));if(hasTop&&hasRight)for(let globalRow=0;globalRow<this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,globalRow,top.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasLeft&&hasBottom)for(let globalRow=this.fineRows-this.bandRows;globalRow<this.fineRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_BOTTOM,globalRow-(this.fineRows-this.bandRows),0));if(hasBottom&&hasRight)for(let globalRow=this.fineRows-this.bandRows;globalRow<this.fineRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_BOTTOM,globalRow-(this.fineRows-this.bandRows),bottom.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasLeft&&hasMiddle)for(let globalRow=this.bandRows;globalRow<this.fineRows-this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,globalRow,left.cols-1),this.cellIdFor(REGION_MIDDLE,Math.floor((globalRow-this.bandRows)/this.lowScale),0));if(hasRight&&hasMiddle)for(let globalRow=this.bandRows;globalRow<this.fineRows-this.bandRows;globalRow++)addBidirectionalEdge(this.cellIdFor(REGION_MIDDLE,Math.floor((globalRow-this.bandRows)/this.lowScale),middle.cols-1),this.cellIdFor(REGION_RIGHT,globalRow,0));if(hasTop&&hasMiddle)for(let globalCol=this.bandCols;globalCol<this.fineCols-this.bandCols;globalCol++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,top.rows-1,globalCol-this.bandCols),this.cellIdFor(REGION_MIDDLE,0,Math.floor((globalCol-this.bandCols)/this.lowScale)));if(hasBottom&&hasMiddle)for(let globalCol=this.bandCols;globalCol<this.fineCols-this.bandCols;globalCol++)addBidirectionalEdge(this.cellIdFor(REGION_MIDDLE,middle.rows-1,Math.floor((globalCol-this.bandCols)/this.lowScale)),this.cellIdFor(REGION_BOTTOM,0,globalCol-this.bandCols));if(!hasMiddle&&!hasTop&&!hasBottom&&hasLeft&&hasRight)for(let row=0;row<Math.min(left.rows,right.rows);row++)addBidirectionalEdge(this.cellIdFor(REGION_LEFT,row,left.cols-1),this.cellIdFor(REGION_RIGHT,row,0));if(!hasMiddle&&!hasLeft&&!hasRight&&hasTop&&hasBottom)for(let col=0;col<Math.min(top.cols,bottom.cols);col++)addBidirectionalEdge(this.cellIdFor(REGION_TOP,top.rows-1,col),this.cellIdFor(REGION_BOTTOM,0,col));let flattened=this.flattenNeighborLists(neighbors);this.neighborOffset=flattened.offset,this.neighborIds=flattened.ids,this.neighborCosts=flattened.costs}cellIdFor(regionId,row,col){let region=this.regions[regionId];return region.offset+row*region.cols+col}stepOnce(){if(!this.activeConnSeg){if(this.unsolvedSegs.length===0){this.solved=!0;return}let next2=this.unsolvedSegs.shift();this.activeConnSeg=next2,this.activeConnId=next2.connId,this.nodePool.clear(),this.ripChain.clear(),this.heap.clear(),this.seqCounter=0,this.searchIterations=0,this.nextStamp();let f2=this.computeH(next2.startZ,next2.startCellId,next2.endZ,next2.endCellId)*this.hyperParameters.greedyMultiplier,startIdx=this.nodePool.push(next2.startZ,next2.startCellId,0,-1,-1,0),startFlatIdx=next2.startZ*this.planeSize+next2.startCellId,startStateIdx=this.getSearchStateIdx(startFlatIdx,0);this.bestGStamp[startStateIdx]=this.stamp,this.bestGValue[startStateIdx]=0,this.heap.push(f2,this.seqCounter++,startIdx);return}this.searchIterations++;let connRips=this.ripCount[this.activeConnId]??0,budget=Math.round(this.baseSearchBudgetIters*(1+Math.min(connRips,10)*.25));if(this.searchIterations>budget){let pen=this.penalty2d;for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.9;this.unsolvedSegs.push(this.activeConnSeg),this.activeConnSeg=null,this.activeConnId=-1,this.heap.clear(),this.nodePool.clear(),this.consecutiveSkips++,this.consecutiveSkips>=Math.max(3,this.unsolvedSegs.length*3)&&(this.error=`Convergence failure: ${this.unsolvedSegs.length} connections stuck`,this.failed=!0);return}if(this.heap.size===0){this.error=`No path found for ${this.connIdToName[this.activeConnId]}`,this.failed=!0;return}let nodeIdx=this.heap.pop(),z5=this.nodePool.z[nodeIdx],cellId=this.nodePool.cellId[nodeIdx],g7=this.nodePool.g[nodeIdx],rippedHead=this.nodePool.ripHead[nodeIdx],ripCount=this.nodePool.ripCount[nodeIdx],flatIdx=z5*this.planeSize+cellId,searchStateIdx=this.getSearchStateIdx(flatIdx,ripCount);if(this.visitedStamp[searchStateIdx]===this.stamp)return;this.visitedStamp[searchStateIdx]=this.stamp,this.visitedFlatStamp[flatIdx]=this.stamp;let seg=this.activeConnSeg;if(z5===seg.endZ&&cellId===seg.endCellId){this.finalizeRoute(nodeIdx),this.activeConnSeg=null,this.activeConnId=-1;return}let visited=this.visitedStamp,stamp=this.stamp,activeConn=this.activeConnId,endZ=seg.endZ,endCellId=seg.endCellId,neighborStart=this.neighborOffset[cellId],neighborEnd=this.neighborOffset[cellId+1];for(let i2=neighborStart;i2<neighborEnd;i2++){let neighborCellId=this.neighborIds[i2],nextFlatIdx=z5*this.planeSize+neighborCellId;if(this.computeMoveCostAndRips(activeConn,z5,neighborCellId,!1,rippedHead,ripCount,this.neighborCosts[i2]),this._moveCost<0)continue;let nextStateIdx=this.getSearchStateIdx(nextFlatIdx,this._moveRipCount);if(visited[nextStateIdx]===stamp)continue;let g22=g7+this._moveCost;if(this.bestGStamp[nextStateIdx]===stamp&&g22>=this.bestGValue[nextStateIdx])continue;this.bestGStamp[nextStateIdx]=stamp,this.bestGValue[nextStateIdx]=g22;let f2=g22+this.computeH(z5,neighborCellId,endZ,endCellId)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.push(z5,neighborCellId,g22,nodeIdx,this._moveRippedHead,this._moveRipCount);this.heap.push(f2,this.seqCounter++,newNodeIdx)}if(this.viaAllowed[cellId])for(let nz=0;nz<this.layers;nz++){if(nz===z5)continue;let nextFlatIdx=nz*this.planeSize+cellId;if(this.computeMoveCostAndRips(activeConn,nz,cellId,!0,rippedHead,ripCount,0),this._moveCost<0)continue;let nextStateIdx=this.getSearchStateIdx(nextFlatIdx,this._moveRipCount);if(visited[nextStateIdx]===stamp)continue;let g22=g7+this._moveCost;if(this.bestGStamp[nextStateIdx]===stamp&&g22>=this.bestGValue[nextStateIdx])continue;this.bestGStamp[nextStateIdx]=stamp,this.bestGValue[nextStateIdx]=g22;let f2=g22+this.computeH(nz,cellId,endZ,endCellId)*this.hyperParameters.greedyMultiplier,newNodeIdx=this.nodePool.push(nz,cellId,g22,nodeIdx,this._moveRippedHead,this._moveRipCount);this.heap.push(f2,this.seqCounter++,newNodeIdx)}}computeMoveCostAndRips(activeConn,toZ,toCellId,isVia,rippedHead,currentRipCount,lateralCost){let cost=0,head=rippedHead,ripCount=currentRipCount,toFlatIdx=toZ*this.planeSize+toCellId;if(isVia){cost+=this.hyperParameters.viaBaseCost,cost+=Math.min(this.penalty2d[toCellId],this.penaltyCap);let fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.allowSharedUse(activeConn,fixedOwner),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toCellId===seg.endCellId;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRippedHead=head;return}this.fillViaOccupants(toCellId,activeConn);let occs=this._viaOccs;for(let i2=0;i2<occs.length;i2++){let occ=occs[i2];this.ripChain.contains(head,occ)||(cost+=this.hyperParameters.ripCost,head=this.ripChain.append(head,occ),ripCount++),cost+=this.hyperParameters.ripViaPenalty}}else{cost+=lateralCost,cost+=Math.min(this.penalty2d[toCellId],this.penaltyCap);let fixedOwner=this.portOwnerFlat[toFlatIdx],allowFixedOverlap=this.allowSharedUse(activeConn,fixedOwner),seg=this.activeConnSeg,isSegEnd=!!seg&&toZ===seg.endZ&&toCellId===seg.endCellId;if(fixedOwner>=0&&fixedOwner!==activeConn&&!allowFixedOverlap&&!isSegEnd){this._moveCost=-1,this._moveRippedHead=head;return}this.fillTraceOccupants(toFlatIdx,activeConn,this._cellOccs);for(let i2=0;i2<this._cellOccs.length;i2++){let occ=this._cellOccs[i2];this.ripChain.contains(head,occ)||(cost+=this.hyperParameters.ripCost,head=this.ripChain.append(head,occ),ripCount++),cost+=this.hyperParameters.ripTracePenalty}}this._moveCost=cost,this._moveRippedHead=head,this._moveRipCount=ripCount}fillViaOccupants(cellId,activeConn){let occs=this._viaOccs;occs.length=0;let cx3=this.cellCenterX[cellId],cy3=this.cellCenterY[cellId];this.forEachCellNearCircle(cx3,cy3,this.viaKeepoutRadius,occCellId=>{if(circleIntersectsRect2(cx3,cy3,this.viaKeepoutRadius,this.cellMinX[occCellId],this.cellMinY[occCellId],this.cellMaxX[occCellId],this.cellMaxY[occCellId]))for(let z5=0;z5<this.layers;z5++)this.pushFlatOccupants(z5*this.planeSize+occCellId,activeConn,occs)})}fillTraceOccupants(flatIdx,activeConn,out){out.length=0,this.pushFlatOccupants(flatIdx,activeConn,out)}pushFlatOccupants(flatIdx,activeConn,out){let primaryOcc=this.usedCellsFlat[flatIdx];primaryOcc!==-1&&primaryOcc!==activeConn&&!this.allowSharedUse(activeConn,primaryOcc)&&pushUnique2(out,primaryOcc);let sharedOccs=this.sharedCellsFlat[flatIdx];if(sharedOccs)for(let i2=0;i2<sharedOccs.length;i2++){let occ=sharedOccs[i2];occ!==activeConn&&(this.allowSharedUse(activeConn,occ)||pushUnique2(out,occ))}}addSharedOccupant(flatIdx,connId){if(this.usedCellsFlat[flatIdx]===connId)return;let sharedOccs=this.sharedCellsFlat[flatIdx];sharedOccs||(sharedOccs=[],this.sharedCellsFlat[flatIdx]=sharedOccs),pushUnique2(sharedOccs,connId)}replaceOccupants(flatIdx,connId){this.usedCellsFlat[flatIdx]=connId,this.sharedCellsFlat[flatIdx]=void 0}removeOccupant(flatIdx,connId){let sharedOccs=this.sharedCellsFlat[flatIdx];if(this.usedCellsFlat[flatIdx]===connId){sharedOccs&&sharedOccs.length>0?(this.usedCellsFlat[flatIdx]=sharedOccs.pop(),sharedOccs.length===0&&(this.sharedCellsFlat[flatIdx]=void 0)):this.usedCellsFlat[flatIdx]=-1;return}if(!sharedOccs)return;let idx=sharedOccs.indexOf(connId);idx!==-1&&(sharedOccs.splice(idx,1),sharedOccs.length===0&&(this.sharedCellsFlat[flatIdx]=void 0))}allowSharedUse(activeConn,existingConn){return existingConn<0?!1:this.connIdToRootNet[existingConn]===this.connIdToRootNet[activeConn]}shouldSkipFixedPortHalo(flatIdx,connId){let fixedOwner=this.portOwnerFlat[flatIdx];return fixedOwner===connId?!1:fixedOwner===-2?!0:fixedOwner<0?!1:!this.allowSharedUse(connId,fixedOwner)}nextStamp(){this.stamp=this.stamp+1>>>0,this.stamp===0&&(this.visitedStamp.fill(0),this.bestGStamp.fill(0),this.visitedFlatStamp.fill(0),this.stamp=1)}getSearchStateIdx(flatIdx,ripCount){return flatIdx}computeH(z5,cellId,toZ,toCellId){let dist=Math.hypot(this.cellCenterX[cellId]-this.cellCenterX[toCellId],this.cellCenterY[cellId]-this.cellCenterY[toCellId]);return z5===toZ?dist:dist+this.hyperParameters.viaBaseCost}internConn(name,rootNetName){let existing=this.connNameToId.get(name);if(existing!==void 0)return existing;let id2=this.connIdToName.length;return this.connIdToName.push(name),this.connIdToRootNet.push(toRootNetName3(name,rootNetName)),this.connNameToId.set(name,id2),id2}buildConnectionSegs(){let byName=new Map;for(let pp3 of this.nodeWithPortPoints.portPoints){let name=pp3.connectionName;byName.has(name)||byName.set(name,{points:[],rootConnectionName:pp3.rootConnectionName}),byName.get(name).points.push(pp3)}let segs=[],seenSegmentKeys=new Set;for(let[name,conn]of byName){let pts=conn.points;if(pts.length<2)continue;let connId=this.internConn(name,conn.rootConnectionName);for(let i2=0;i2<pts.length-1;i2++){let s2=this.pointToCell(pts[i2]),e4=this.pointToCell(pts[i2+1]),endpointA=`${s2.z}:${s2.cellId}`,endpointB=`${e4.z}:${e4.cellId}`,orderedEndpoints=endpointA<endpointB?`${endpointA}|${endpointB}`:`${endpointB}|${endpointA}`,netName=conn.rootConnectionName??name,segKey=`${netName}|${orderedEndpoints}`;if(seenSegmentKeys.has(segKey)){this.overlapFriendlyRootNets.add(netName);continue}seenSegmentKeys.add(segKey),segs.push({connId,startZ:s2.z,startCellId:s2.cellId,startPoint:pts[i2],endZ:e4.z,endCellId:e4.cellId,endPoint:pts[i2+1]})}}return segs}pointToCell(pt4){let fineCol=clamp32(Math.floor((pt4.x-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),fineRow=clamp32(Math.floor((pt4.y-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1),regionId=REGION_MIDDLE;fineCol<this.bandCols?regionId=REGION_LEFT:fineCol>=this.fineCols-this.bandCols?regionId=REGION_RIGHT:fineRow<this.bandRows?regionId=REGION_TOP:fineRow>=this.fineRows-this.bandRows&&(regionId=REGION_BOTTOM);let region=this.regions[regionId],localFineRow=fineRow-region.fineOriginRow,localFineCol=fineCol-region.fineOriginCol,row=clamp32(Math.floor(localFineRow/region.cellScale),0,Math.max(0,region.rows-1)),col=clamp32(Math.floor(localFineCol/region.cellScale),0,Math.max(0,region.cols-1));return{z:this.zToLayer.get(pt4.z)??0,cellId:this.cellIdFor(regionId,row,col)}}shuffleConnections(){let arr=this.unsolvedSegs,s2=this.hyperParameters.shuffleSeed>>>0,rng=()=>(s2=Math.imul(s2,1664525)+1013904223>>>0,s2/4294967295);for(let i2=arr.length-1;i2>0;i2--){let j4=Math.floor(rng()*(i2+1)),tmp=arr[i2];arr[i2]=arr[j4],arr[j4]=tmp}}finalizeRoute(goalNodeIdx){this.consecutiveSkips=Math.max(0,this.consecutiveSkips-1);let states=[],idx=goalNodeIdx;for(;idx>=0;){let z5=this.nodePool.z[idx],cellId=this.nodePool.cellId[idx];states.push(z5*this.planeSize+cellId),idx=this.nodePool.parent[idx]}for(states.reverse();states.length>1&&this.sharedCrossRootPortFlat[states[0]];)states.shift();for(;states.length>1&&this.sharedCrossRootPortFlat[states[states.length-1]];)states.pop();let viaCellIds=this.extractViaCellIds(states),connId=this.activeConnId;this.ripChain.collect(this.nodePool.ripHead[goalNodeIdx],this._rippedIds);for(let i2=0;i2<this._rippedIds.length;i2++)if(this.ripTrace(this._rippedIds[i2]),this.failed)return;let indices=[];for(let i2=0;i2<states.length;i2++){let state2=states[i2],z5=Math.floor(state2/this.planeSize),cellId=state2-z5*this.planeSize;this.markTraceFootprint(connId,z5,cellId,indices)}let displacedByVias=[];for(let i2=0;i2<viaCellIds.length;i2++)this.markViaFootprint(connId,viaCellIds[i2],indices,displacedByVias);for(;this.usedIndicesByConn.length<=connId;)this.usedIndicesByConn.push(void 0);for(this.usedIndicesByConn[connId]=indices;this.solvedRoutes.length<=connId;)this.solvedRoutes.push(void 0);this.solvedRoutes[connId]={connId,states:Int32Array.from(states),viaCellIds:Int32Array.from(viaCellIds),startPoint:this.activeConnSeg.startPoint,endPoint:this.activeConnSeg.endPoint};for(let i2=0;i2<displacedByVias.length;i2++)if(this.ripTrace(displacedByVias[i2]),this.failed)return;if(this._rippedIds.length>0||displacedByVias.length>0){let pen=this.penalty2d,cap2=this.penaltyCap;if(this.totalRipEvents>50)for(let i2=0;i2<pen.length;i2++)pen[i2]=pen[i2]*.99;else for(let i2=0;i2<pen.length;i2++)pen[i2]>cap2&&(pen[i2]=pen[i2]*.5)}}extractViaCellIds(states){let viaCellIds=[];for(let i2=1;i2<states.length;i2++){let prevState=states[i2-1],nextState=states[i2],prevZ=Math.floor(prevState/this.planeSize),nextZ=Math.floor(nextState/this.planeSize);prevZ!==nextZ&&viaCellIds.push(nextState-nextZ*this.planeSize)}return viaCellIds}markTraceFootprint(connId,z5,sourceCellId,indices){let cx3=this.cellCenterX[sourceCellId],cy3=this.cellCenterY[sourceCellId];this.forEachCellNearCircle(cx3,cy3,this.traceKeepoutRadius,cellId=>{if(!circleIntersectsRect2(cx3,cy3,this.traceKeepoutRadius,this.cellMinX[cellId],this.cellMinY[cellId],this.cellMaxX[cellId],this.cellMaxY[cellId]))return;let flatIdx=z5*this.planeSize+cellId;if(cellId!==sourceCellId&&this.shouldSkipFixedPortHalo(flatIdx,connId))return;let existing=this.usedCellsFlat[flatIdx],allowSameRootOverlap=this.allowSharedUse(connId,existing);existing!==-1&&existing!==connId&&!allowSameRootOverlap||(existing!==-1&&existing!==connId?this.addSharedOccupant(flatIdx,connId):this.usedCellsFlat[flatIdx]=connId,indices.push(flatIdx))})}markViaFootprint(connId,sourceCellId,indices,displacedByVias){let cx3=this.cellCenterX[sourceCellId],cy3=this.cellCenterY[sourceCellId];this.forEachCellNearCircle(cx3,cy3,this.viaKeepoutRadius,cellId=>{if(circleIntersectsRect2(cx3,cy3,this.viaKeepoutRadius,this.cellMinX[cellId],this.cellMinY[cellId],this.cellMaxX[cellId],this.cellMaxY[cellId]))for(let z5=0;z5<this.layers;z5++){let flatIdx=z5*this.planeSize+cellId;if(cellId!==sourceCellId&&this.shouldSkipFixedPortHalo(flatIdx,connId))continue;if(this.fillTraceOccupants(flatIdx,connId,this._cellOccs),this._cellOccs.length>0){for(let i2=0;i2<this._cellOccs.length;i2++)pushUnique2(displacedByVias,this._cellOccs[i2]);this.replaceOccupants(flatIdx,connId),indices.push(flatIdx);continue}let existing=this.usedCellsFlat[flatIdx];existing!==-1&&existing!==connId?this.addSharedOccupant(flatIdx,connId):this.usedCellsFlat[flatIdx]=connId,indices.push(flatIdx)}})}forEachCellNearCircle(cx3,cy3,radius,visitor){let minFineCol=clamp32(Math.floor((cx3-radius-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),maxFineCol=clamp32(Math.floor((cx3+radius-this.boundsMinX)/this.highResolutionCellSize),0,this.fineCols-1),minFineRow=clamp32(Math.floor((cy3-radius-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1),maxFineRow=clamp32(Math.floor((cy3+radius-this.boundsMinY)/this.highResolutionCellSize),0,this.fineRows-1);for(let regionIdx=0;regionIdx<this.regions.length;regionIdx++){let region=this.regions[regionIdx];if(region.rows===0||region.cols===0)continue;let regionFineRowMin=Math.max(minFineRow,region.fineOriginRow),regionFineRowMax=Math.min(maxFineRow,region.fineOriginRow+region.fineRows-1),regionFineColMin=Math.max(minFineCol,region.fineOriginCol),regionFineColMax=Math.min(maxFineCol,region.fineOriginCol+region.fineCols-1);if(regionFineRowMin>regionFineRowMax||regionFineColMin>regionFineColMax)continue;let localRowMin=Math.floor((regionFineRowMin-region.fineOriginRow)/region.cellScale),localRowMax=Math.floor((regionFineRowMax-region.fineOriginRow)/region.cellScale),localColMin=Math.floor((regionFineColMin-region.fineOriginCol)/region.cellScale),localColMax=Math.floor((regionFineColMax-region.fineOriginCol)/region.cellScale);for(let row=localRowMin;row<=localRowMax;row++)for(let col=localColMin;col<=localColMax;col++)visitor(this.cellIdFor(region.id,row,col))}}ripTrace(connId){for(;this.ripCount.length<=connId;)this.ripCount.push(0);if(this.ripCount[connId]++,this.totalRipEvents++,this.totalRipEvents>=this.MAX_RIPS){this.error=`Convergence failure: exceeded MAX_RIPS ${this.MAX_RIPS}`,this.failed=!0;return}let route=this.solvedRoutes[connId];if(route){for(let i2=0;i2<route.states.length;i2++){let cellId=route.states[i2]%this.planeSize;this.penalty2d[cellId]=this.penalty2d[cellId]+this.hyperParameters.ripTracePenalty}for(let i2=0;i2<route.viaCellIds.length;i2++){let cellId=route.viaCellIds[i2];this.penalty2d[cellId]=this.penalty2d[cellId]+this.hyperParameters.ripViaPenalty}}let indices=this.usedIndicesByConn[connId];if(indices){for(let i2=0;i2<indices.length;i2++)this.removeOccupant(indices[i2],connId);this.usedIndicesByConn[connId]=void 0}if(route){this.solvedRoutes[connId]=void 0;let first=route.states[0],last=route.states[route.states.length-1],startZ=Math.floor(first/this.planeSize),endZ=Math.floor(last/this.planeSize);this.unsolvedSegs.push({connId,startZ,startCellId:first-startZ*this.planeSize,startPoint:route.startPoint,endZ,endCellId:last-endZ*this.planeSize,endPoint:route.endPoint})}}flattenNeighborLists(neighbors){let offset=new Int32Array(neighbors.length+1),total=0;for(let i2=0;i2<neighbors.length;i2++)offset[i2]=total,total+=neighbors[i2].length;offset[neighbors.length]=total;let ids=new Int32Array(total),costs=new Float32Array(total),cursor=0;for(let i2=0;i2<neighbors.length;i2++){let edges=neighbors[i2];for(let j4=0;j4<edges.length;j4++){let edge=edges[j4];ids[cursor]=edge.cellId,costs[cursor]=edge.cost,cursor++}}return{offset,ids,costs}}visualize(){let LAYER_COLORS=["red","blue","orange","green"],vt4=this.gridToBoundsTransform,points=[],lines=[],circles=[],rects=[];if(rects.push({center:{x:this.nodeWithPortPoints.center.x,y:this.nodeWithPortPoints.center.y},width:this.nodeWithPortPoints.width,height:this.nodeWithPortPoints.height,stroke:"gray"}),this.showPenaltyMap&&this.penalty2d){let maxPenalty=0;for(let i2=0;i2<this.penalty2d.length;i2++)this.penalty2d[i2]>maxPenalty&&(maxPenalty=this.penalty2d[i2]);if(maxPenalty>0)for(let cellId=0;cellId<this.planeSize;cellId++){let penalty=this.penalty2d[cellId];if(penalty<=0)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]}),alpha=Math.min(.6,penalty/maxPenalty*.6);rects.push({center:tc3,width:this.cellWidth[cellId]*vt4.a,height:this.cellHeight[cellId]*vt4.e,fill:`rgba(255,165,0,${alpha.toFixed(3)})`})}}if(this.showUsedCellMap&&this.usedCellsFlat)for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let cellId=0;cellId<this.planeSize;cellId++){if(this.usedCellsFlat[zBase+cellId]===-1)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});rects.push({center:tc3,width:this.cellWidth[cellId]*vt4.a,height:this.cellHeight[cellId]*vt4.e,fill:"rgba(0,0,255,0.5)"})}}for(let pp3 of this.nodeWithPortPoints.portPoints)points.push({x:pp3.x,y:pp3.y,color:LAYER_COLORS[pp3.z]??"gray",label:pp3.connectionName});let TRACE_COLORS=["rgba(255,0,0,0.75)","rgba(0,0,255,0.75)","rgba(255,165,0,0.75)","rgba(0,128,0,0.75)"],transformedRoutes=this.getOutput();for(let route of transformedRoutes){if(route.route.length<2)continue;let segStart=0;for(let i2=1;i2<route.route.length;i2++){let prev=route.route[i2-1];route.route[i2].z!==prev.z&&(i2-segStart>=2&&lines.push({points:route.route.slice(segStart,i2).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[prev.z]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness}),segStart=i2)}if(route.route.length-segStart>=2){let lastZ=route.route[segStart].z;lines.push({points:route.route.slice(segStart).map(p4=>({x:p4.x,y:p4.y})),strokeColor:TRACE_COLORS[lastZ]??"rgba(128,128,128,0.75)",strokeWidth:this.traceThickness})}}for(let route of transformedRoutes)for(let via of route.vias)circles.push({center:{x:via.x,y:via.y},radius:this.viaDiameter/2,fill:"rgba(0,0,0,0.3)",stroke:"black"});if(this.activeConnSeg&&this.visitedFlatStamp){let currentStamp=this.stamp;for(let z5=0;z5<this.layers;z5++){let zBase=z5*this.planeSize;for(let cellId=0;cellId<this.planeSize;cellId++){if(this.visitedFlatStamp[zBase+cellId]!==currentStamp)continue;let tc3=applyAffineTransformToPoint(vt4,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});points.push({x:tc3.x,y:tc3.y,color:"rgba(0,0,255,0.2)"})}}}return{points,lines,circles,rects,coordinateSystem:"cartesian",title:`HighDensityA03 [${this.getSolvedRouteCount()} solved, ${this.unsolvedSegs?.length??0} remaining]`}}getOutput(){let t35=this.gridToBoundsTransform,result=[];for(let connId=0;connId<this.solvedRoutes.length;connId++){let route=this.solvedRoutes[connId];if(!route)continue;let connName=this.connIdToName[connId],points=Array.from(route.states,state2=>{let z5=Math.floor(state2/this.planeSize),cellId=state2-z5*this.planeSize,tp3=applyAffineTransformToPoint(t35,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]});return{x:tp3.x,y:tp3.y,z:this.layerToZ.get(z5)??z5}});points.length>0&&(points[0]={...route.startPoint},points.length>1&&(points[points.length-1]={...route.endPoint})),result.push({connectionName:connName,traceThickness:this.traceThickness,viaDiameter:this.viaDiameter,route:points,vias:Array.from(route.viaCellIds,cellId=>applyAffineTransformToPoint(t35,{x:this.cellCenterX[cellId],y:this.cellCenterY[cellId]}))})}return result}getSolvedRouteCount(){let count=0;for(let i2=0;i2<this.solvedRoutes.length;i2++)this.solvedRoutes[i2]&&count++;return count}computeGridToBoundsTransform(){let minCenterX=1/0,maxCenterX=-1/0,minCenterY=1/0,maxCenterY=-1/0;for(let cellId=0;cellId<this.planeSize;cellId++){let centerX=this.cellCenterX[cellId],centerY=this.cellCenterY[cellId];centerX<minCenterX&&(minCenterX=centerX),centerX>maxCenterX&&(maxCenterX=centerX),centerY<minCenterY&&(minCenterY=centerY),centerY>maxCenterY&&(maxCenterY=centerY)}let xSpan=maxCenterX-minCenterX,ySpan=maxCenterY-minCenterY,width=this.boundsMaxX-this.boundsMinX,height=this.boundsMaxY-this.boundsMinY,a2=xSpan>0?width/xSpan:1,e4=ySpan>0?height/ySpan:1,c3=xSpan>0?this.boundsMinX-a2*minCenterX:(this.boundsMinX+this.boundsMaxX)/2-minCenterX,f2=ySpan>0?this.boundsMinY-e4*minCenterY:(this.boundsMinY+this.boundsMaxY)/2-minCenterY;return{a:a2,b:0,c:c3,d:0,e:e4,f:f2}}};var import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var BaseSolver2=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(e4){throw this.error=`${this.constructor.name} error: ${e4}`,console.error(this.error),this.failed=!0,e4}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.constructor.name} ran out of iterations`,console.error(this.error),this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let startTime=Date.now();for(;!this.solved&&!this.failed;)this.step();let endTime=Date.now();this.timeToSolve=endTime-startTime}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};var BasePipelineSolver=class extends BaseSolver2{constructor(inputProblem){super();__publicField(this,"startTimeOfPhase",{});__publicField(this,"endTimeOfPhase",{});__publicField(this,"timeSpentOnPhase",{});__publicField(this,"firstIterationOfPhase",{});__publicField(this,"currentPipelineStepIndex",0);__publicField(this,"inputProblem");__publicField(this,"pipelineOutputs",{});this.inputProblem=inputProblem,this.MAX_ITERATIONS=1e6}_step(){let pipelineStepDef=this.pipelineDef[this.currentPipelineStepIndex];if(!pipelineStepDef){this.solved=!0;return}if(this.activeSubSolver){if(this.activeSubSolver.step(),this.activeSubSolver.solved){this.endTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.timeSpentOnPhase[pipelineStepDef.solverName]=this.endTimeOfPhase[pipelineStepDef.solverName]-this.startTimeOfPhase[pipelineStepDef.solverName];let output=this.activeSubSolver.getOutput();output!==null&&(this.pipelineOutputs[pipelineStepDef.solverName]=output),pipelineStepDef.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStepIndex++}else this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let constructorParams=pipelineStepDef.getConstructorParams(this);this.activeSubSolver=new pipelineStepDef.solverClass(...constructorParams),this[pipelineStepDef.solverName]=this.activeSubSolver,this.timeSpentOnPhase[pipelineStepDef.solverName]=0,this.startTimeOfPhase[pipelineStepDef.solverName]=performance.now(),this.firstIterationOfPhase[pipelineStepDef.solverName]=this.iterations}solveUntilPhase(phase){for(;this.getCurrentPhase().toLowerCase()!==phase.toLowerCase()&&(this.step(),!(this.failed||this.solved)););}getCurrentPhase(){return this.pipelineDef[this.currentPipelineStepIndex]?.solverName??"none"}getPhaseProgress(){let totalPhases=this.pipelineDef.length;if(totalPhases===0)return 1;let currentPhaseProgress=this.activeSubSolver?.progress??0;return(this.currentPipelineStepIndex+currentPhaseProgress)/totalPhases}getPhaseStats(){let stats={};for(let step of this.pipelineDef){let timeSpent=this.timeSpentOnPhase[step.solverName]||0,firstIteration=this.firstIterationOfPhase[step.solverName]||0,currentIteration=this.iterations,iterations=step.solverName===this.getCurrentPhase()?currentIteration-firstIteration:0,completed=this.currentPipelineStepIndex>this.pipelineDef.findIndex(s2=>s2.solverName===step.solverName);stats[step.solverName]={timeSpent,iterations,completed}}return stats}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let visualizations=this.pipelineDef.map((step,stepIndex)=>{let viz=this[step.solverName]?.visualize();if(!viz)return null;for(let rect of viz.rects??[])rect.step=stepIndex;for(let point6 of viz.points??[])point6.step=stepIndex;for(let circle2 of viz.circles??[])circle2.step=stepIndex;for(let text of viz.texts??[])text.step=stepIndex;for(let line2 of viz.lines??[])line2.step=stepIndex;return viz}).filter(Boolean);return visualizations.length===0?{points:[],rects:[],lines:[],circles:[],texts:[]}:visualizations.length===1?visualizations[0]:{points:visualizations.flatMap(v5=>v5.points||[]),rects:visualizations.flatMap(v5=>v5.rects||[]),lines:visualizations.flatMap(v5=>v5.lines||[]),circles:visualizations.flatMap(v5=>v5.circles||[]),texts:visualizations.flatMap(v5=>v5.texts||[])}}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}computeProgress(){return this.getPhaseProgress()}getStepOutput(stepName){return this.pipelineOutputs[stepName]}getAllOutputs(){return{...this.pipelineOutputs}}hasStepOutput(stepName){return stepName in this.pipelineOutputs}getSolver(stepName){return this[stepName]}};var clonePoint=point6=>({...point6});var cloneRoute=route=>({...route,route:route.route?.map(clonePoint),vias:route.vias?.map(via=>({...via}))});var cloneRoutes=routes=>routes.map(cloneRoute);var getBoundaryRect=node=>!node?.center||!node.width||!node.height?null:{minX:node.center.x-node.width/2,maxX:node.center.x+node.width/2,minY:node.center.y-node.height/2,maxY:node.center.y+node.height/2,width:node.width,height:node.height,center:node.center};var getRoutePointLayer=point6=>point6?.z===1?"bottom":"top";var TOP_LAYER_COLOR="#FF0000",BOTTOM_LAYER_COLOR="#0000FF";var GRID_COLOR="rgba(15, 23, 42, 0.14)",HIGHLIGHT_COLOR="rgba(245, 158, 11, 0.16)",ACCEPT_COLOR="rgba(16, 185, 129, 0.14)",REJECT_COLOR="rgba(220, 38, 38, 0.14)",CANDIDATE_STROKE="#000000";var BOUNDARY_SIDES=["top","bottom","left","right"];var getRouteStrokeColor=layer=>layer==="bottom"?BOTTOM_LAYER_COLOR:TOP_LAYER_COLOR;var splitRouteIntoLayerSegments=route=>{let routePoints=route.route??[],lines=[];if(routePoints.length<2)return lines;let currentLayer=getRoutePointLayer(routePoints[0]),currentSegment=[routePoints[0]];for(let index=1;index<routePoints.length;index+=1){let point6=routePoints[index],pointLayer=getRoutePointLayer(point6);if(pointLayer!==currentLayer){currentSegment.length>=2&&lines.push({points:currentSegment,strokeColor:getRouteStrokeColor(currentLayer),strokeWidth:route.traceThickness??.15,label:route.connectionName??"route"}),currentLayer=pointLayer,currentSegment=[routePoints[index-1],point6];continue}currentSegment.push(point6)}return currentSegment.length>=2&&lines.push({points:currentSegment,strokeColor:getRouteStrokeColor(currentLayer),strokeWidth:route.traceThickness??.15,label:route.connectionName??"route"}),lines};var createBoundaryGridLines=(boundary,step,side)=>{let lines=[],clampedStep=Math.max(step,.05);for(let x5=boundary.minX+clampedStep;x5<boundary.maxX-1e-6;x5+=clampedStep)lines.push({points:[{x:x5,y:boundary.minY},{x:x5,y:boundary.maxY}],strokeColor:GRID_COLOR,strokeWidth:.02,label:side?`grid:${side}:v`:"grid:v"});for(let y5=boundary.minY+clampedStep;y5<boundary.maxY-1e-6;y5+=clampedStep)lines.push({points:[{x:boundary.minX,y:y5},{x:boundary.maxX,y:y5}],strokeColor:GRID_COLOR,strokeWidth:.02,label:side?`grid:${side}:h`:"grid:h"});return lines};var createFinalFrame=(routes,originalRoutes,boundary,margin,gridStep)=>({title:`HighDensityRepair02 Final State (margin=${margin})`,routes,originalRoutes,overlayLines:createBoundaryGridLines(boundary,gridStep)});var createInitialFrame=(routes,boundary,margin,gridStep)=>({title:`HighDensityRepair02 Initial State (margin=${margin})`,routes,overlayLines:createBoundaryGridLines(boundary,gridStep)});var createOverlayLinesForRoutes=(routes,routeIndexes)=>Array.from(routeIndexes).flatMap(routeIndex=>splitRouteIntoLayerSegments(routes[routeIndex]).map(line2=>({...line2,strokeColor:CANDIDATE_STROKE,strokeWidth:line2.strokeWidth,label:`candidate:${line2.label}`})));var createSideStripRect=(boundary,side,depth,fill,label)=>{let stroke="rgba(0, 0, 0, 0)";switch(side){case"left":return{center:{x:boundary.minX+depth/2,y:boundary.center.y},width:depth,height:boundary.height,stroke,fill,label};case"right":return{center:{x:boundary.maxX-depth/2,y:boundary.center.y},width:depth,height:boundary.height,stroke,fill,label};case"top":return{center:{x:boundary.center.x,y:boundary.maxY-depth/2},width:boundary.width,height:depth,stroke,fill,label};case"bottom":return{center:{x:boundary.center.x,y:boundary.minY+depth/2},width:boundary.width,height:depth,stroke,fill,label}}};var createCandidateFrame=({routes,candidateRoutes,candidateRouteIndexes,originalRoutes,boundary,side,margin,gridStep,rejected,rejectionReason})=>{let routeNames=Array.from(candidateRouteIndexes).map(index=>candidateRoutes[index].connectionName??`route-${index}`);return{title:rejected?`${side} move rejected (${rejectionReason})`:`${side} move accepted`,routes:rejected?routes:candidateRoutes,originalRoutes,activeSide:side,candidateRouteNames:routeNames,overlayLines:[...createBoundaryGridLines(boundary,gridStep,side),...rejected?createOverlayLinesForRoutes(candidateRoutes,candidateRouteIndexes):[]],overlayRects:[createSideStripRect(boundary,side,margin,rejected?REJECT_COLOR:ACCEPT_COLOR,rejected?`rejected:${side}`:`accepted:${side}`)]}};var createSideAnalysisFrame=(routes,boundary,side,margin,moveAmount,hasObstacle,gridStep)=>({title:`${side} boundary analysis: move=${moveAmount.toFixed(3)} (${hasObstacle?"obstacle-side":"clear-side"})`,routes,activeSide:side,overlayLines:createBoundaryGridLines(boundary,gridStep,side),overlayRects:[createSideStripRect(boundary,side,margin,HIGHLIGHT_COLOR,`strip:${side}`)]});var getObstacleBounds=obstacle=>!obstacle.center||!obstacle.width||!obstacle.height?null:{minX:obstacle.center.x-obstacle.width/2,maxX:obstacle.center.x+obstacle.width/2,minY:obstacle.center.y-obstacle.height/2,maxY:obstacle.center.y+obstacle.height/2};var isObstacleNearSide=(obstacle,boundary,side,margin)=>{let bounds=getObstacleBounds(obstacle);if(!bounds)return!1;switch(side){case"left":return bounds.maxX>=boundary.minX-1e-6&&bounds.minX<=boundary.minX+margin+1e-6;case"right":return bounds.minX<=boundary.maxX+1e-6&&bounds.maxX>=boundary.maxX-margin-1e-6;case"top":return bounds.minY<=boundary.maxY+1e-6&&bounds.maxY>=boundary.maxY-margin-1e-6;case"bottom":return bounds.maxY>=boundary.minY-1e-6&&bounds.minY<=boundary.minY+margin+1e-6}};var getMoveAmountForSide=(sample,boundary,side,margin)=>{let hasObstacle=(sample?.adjacentObstacles??[]).some(obstacle=>isObstacleNearSide(obstacle,boundary,side,margin));return{hasObstacle,moveAmount:hasObstacle?margin:margin/2}};var pointsCoincide=(a2,b3)=>Math.abs(a2.x-b3.x)<=1e-6&&Math.abs(a2.y-b3.y)<=1e-6;var dedupeRoutePoints=points=>{let result=[];for(let point6 of points){let previous=result[result.length-1];previous&&previous.z===point6.z&&pointsCoincide(previous,point6)||result.push(point6)}return result};var createGridBridge=(start,end,delta,preferredAxisValue)=>Math.abs(delta.x)>1e-6?dedupeRoutePoints([start,{x:preferredAxisValue,y:start.y,z:start.z},{x:preferredAxisValue,y:end.y,z:end.z},end]):dedupeRoutePoints([start,{x:start.x,y:preferredAxisValue,z:start.z},{x:end.x,y:preferredAxisValue,z:end.z},end]);var distanceToSide=(point6,boundary,side)=>{switch(side){case"left":return point6.x-boundary.minX;case"right":return boundary.maxX-point6.x;case"top":return boundary.maxY-point6.y;case"bottom":return point6.y-boundary.minY}};var clamp01=value=>Math.max(0,Math.min(1,value));var dot=(a2,b3)=>a2.x*b3.x+a2.y*b3.y;var lengthSquared=point6=>point6.x*point6.x+point6.y*point6.y;var subtract2=(a2,b3)=>({x:a2.x-b3.x,y:a2.y-b3.y});var distancePointToSegment=(point6,start,end)=>{let segment2=subtract2(end,start),denom=lengthSquared(segment2);if(denom<=1e-6)return Math.sqrt(lengthSquared(subtract2(point6,start)));let t35=clamp01(dot(subtract2(point6,start),segment2)/denom),projection={x:start.x+segment2.x*t35,y:start.y+segment2.y*t35};return Math.sqrt(lengthSquared(subtract2(point6,projection)))};var isCollinearSameLayerChain=(start,middle,end)=>(start.z??0)!==(middle.z??0)||(middle.z??0)!==(end.z??0)?!1:start.x===middle.x&&middle.x===end.x||start.y===middle.y&&middle.y===end.y,getRouteGeometry=(route,routeIndex,cache2)=>{let cachedGeometry=cache2?.get(route);if(cachedGeometry)return cachedGeometry;let points=route.route??[],thickness=route.traceThickness??.15,minX=Number.POSITIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY,hasBounds2=!1,extendBounds=(x5,y5,padding)=>{minX=Math.min(minX,x5-padding),minY=Math.min(minY,y5-padding),maxX=Math.max(maxX,x5+padding),maxY=Math.max(maxY,y5+padding),hasBounds2=!0},geometry={segments:[],vias:(route.vias??[]).map(via=>{let radius=(via.diameter??route.viaDiameter??.15*2)/2;return extendBounds(via.x,via.y,radius),{center:{x:via.x,y:via.y},radius,routeIndex}}),bounds:{minX:0,minY:0,maxX:0,maxY:0}};for(let pointIndex=0;pointIndex<points.length-1;){let start=points[pointIndex],endIndex=pointIndex+1,end=points[endIndex],padding=thickness/2;for(start&&extendBounds(start.x,start.y,padding),end&&extendBounds(end.x,end.y,padding);endIndex<points.length-1;){let middle=points[endIndex],next2=points[endIndex+1];if(!start||!middle||!next2||getRoutePointLayer(start)!==getRoutePointLayer(middle)||getRoutePointLayer(middle)!==getRoutePointLayer(next2)||!isCollinearSameLayerChain(start,middle,next2))break;endIndex+=1,end=next2,extendBounds(next2.x,next2.y,padding)}if(!start||!end){pointIndex+=1;continue}geometry.segments.push({start,end,routeIndex,pointIndex,thickness,layer:getRoutePointLayer(start)}),pointIndex=endIndex}if(!hasBounds2)for(let point6 of points)extendBounds(point6.x,point6.y,thickness/2);return geometry.bounds=hasBounds2?{minX,minY,maxX,maxY}:{minX:0,minY:0,maxX:0,maxY:0},cache2?.set(route,geometry),geometry};var getRouteSegments=(route,routeIndex,cache2)=>getRouteGeometry(route,routeIndex,cache2).segments;var onSegment3=(a2,b3,c3)=>b3.x<=Math.max(a2.x,c3.x)+1e-6&&b3.x>=Math.min(a2.x,c3.x)-1e-6&&b3.y<=Math.max(a2.y,c3.y)+1e-6&&b3.y>=Math.min(a2.y,c3.y)-1e-6;var orientation3=(a2,b3,c3)=>(b3.y-a2.y)*(c3.x-b3.x)-(b3.x-a2.x)*(c3.y-b3.y);var segmentsIntersect=(a12,a2,b12,b22)=>{let o12=orientation3(a12,a2,b12),o22=orientation3(a12,a2,b22),o3=orientation3(b12,b22,a12),o4=orientation3(b12,b22,a2);return Math.abs(o12)<=1e-6&&onSegment3(a12,b12,a2)||Math.abs(o22)<=1e-6&&onSegment3(a12,b22,a2)||Math.abs(o3)<=1e-6&&onSegment3(b12,a12,b22)||Math.abs(o4)<=1e-6&&onSegment3(b12,a2,b22)?!0:o12>0!=o22>0&&o3>0!=o4>0};var segmentDistance=(a12,a2,b12,b22)=>segmentsIntersect(a12,a2,b12,b22)?0:Math.min(distancePointToSegment(a12,b12,b22),distancePointToSegment(a2,b12,b22),distancePointToSegment(b12,a12,a2),distancePointToSegment(b22,a12,a2));var getAxisValues=(startValue,endValue,minValue,maxValue,gridStep)=>{let values=new Set([startValue,endValue]),steps=Math.round((maxValue-minValue)/gridStep);for(let step=0;step<=steps;step+=1)values.add(Number((minValue+step*gridStep).toFixed(12)));return Array.from(values).sort((a2,b3)=>a2-b3)},compressPath=points=>{if(points.length<=2)return dedupeRoutePoints(points);let compressed=[points[0]];for(let index=1;index<points.length-1;index+=1){let previous=compressed[compressed.length-1],current2=points[index],next2=points[index+1],sameX=Math.abs(previous.x-current2.x)<=1e-6&&Math.abs(current2.x-next2.x)<=1e-6,sameY=Math.abs(previous.y-current2.y)<=1e-6&&Math.abs(current2.y-next2.y)<=1e-6;sameX||sameY||compressed.push(current2)}return compressed.push(points[points.length-1]),dedupeRoutePoints(compressed)},getRouteObstacleData=(surroundingRoutes,activeRouteIndex)=>{let routes=surroundingRoutes??[],segments=routes.flatMap((route,routeIndex)=>routeIndex===activeRouteIndex?[]:getRouteSegments(route,routeIndex)),vias=routes.flatMap((route,routeIndex)=>routeIndex===activeRouteIndex?[]:(route.vias??[]).map(via=>({center:{x:via.x,y:via.y},radius:(via.diameter??route.viaDiameter??(route.traceThickness??.15)*2)/2,routeIndex})));return{segments,vias}},getSegmentTravelScore=({from,to:to3,boundary,activeSide,margin,obstacleSegments,obstacleVias,traceThickness,routeLayer})=>{let midPoint={x:(from.x+to3.x)/2,y:(from.y+to3.y)/2},segmentLength=Math.hypot(to3.x-from.x,to3.y-from.y),activeBoundaryDistance=distanceToSide(midPoint,boundary,activeSide),otherSides=["left","right","top","bottom"].filter(side=>side!==activeSide),score=segmentLength;score+=Math.max(0,margin*2-activeBoundaryDistance)*8;for(let side of otherSides){let distance8=distanceToSide(midPoint,boundary,side);if(distance8<margin){score+=500+(margin-distance8)*200;continue}score+=Math.max(0,margin*2-distance8)*20}for(let segment2 of obstacleSegments){if(routeLayer===1&&segment2.layer!=="bottom"||routeLayer!==1&&segment2.layer!=="top")continue;let clearance=segmentDistance(from,to3,segment2.start,segment2.end)-(traceThickness+segment2.thickness)/2;if(clearance<-1e-6)return Number.POSITIVE_INFINITY;score+=Math.max(0,margin-clearance)*50}for(let via of obstacleVias){let clearance=distancePointToSegment(via.center,from,to3)-via.radius-traceThickness/2;if(clearance<-1e-6)return Number.POSITIVE_INFINITY;score+=Math.max(0,margin-clearance)*40}return score},heapPush=(heap,entry)=>{heap.push(entry);let index=heap.length-1;for(;index>0;){let parentIndex=Math.floor((index-1)/2);if(heap[parentIndex].score<=heap[index].score)break;[heap[parentIndex],heap[index]]=[heap[index],heap[parentIndex]],index=parentIndex}},heapPop=heap=>{if(heap.length===0)return null;let first=heap[0],last=heap.pop();if(heap.length===0||!last)return first;heap[0]=last;let index=0;for(;;){let leftIndex=index*2+1,rightIndex=leftIndex+1,smallestIndex=index;if(leftIndex<heap.length&&heap[leftIndex].score<heap[smallestIndex].score&&(smallestIndex=leftIndex),rightIndex<heap.length&&heap[rightIndex].score<heap[smallestIndex].score&&(smallestIndex=rightIndex),smallestIndex===index)return first;[heap[index],heap[smallestIndex]]=[heap[smallestIndex],heap[index]],index=smallestIndex}},findBestGridBridgePath=({start,end,boundary,activeSide,gridStep,margin,preferredAxisValue,activeRouteIndex,surroundingRoutes,traceThickness=.15})=>{if((start.z??0)!==(end.z??0))return null;let xValues=getAxisValues(start.x,end.x,boundary.minX,boundary.maxX,gridStep),yValues=getAxisValues(start.y,end.y,boundary.minY,boundary.maxY,gridStep),startXIndex=xValues.findIndex(value=>Math.abs(value-start.x)<=1e-6),startYIndex=yValues.findIndex(value=>Math.abs(value-start.y)<=1e-6),endXIndex=xValues.findIndex(value=>Math.abs(value-end.x)<=1e-6),endYIndex=yValues.findIndex(value=>Math.abs(value-end.y)<=1e-6);if(startXIndex===-1||startYIndex===-1||endXIndex===-1||endYIndex===-1)return null;let{segments,vias}=getRouteObstacleData(surroundingRoutes,activeRouteIndex),startKey=`${startXIndex}:${startYIndex}`,targetKey=`${endXIndex}:${endYIndex}`,openSet=[{key:startKey,score:0}],bestCosts=new Map([[startKey,0]]),previous=new Map,routeLayer=(start.z??0)===1?1:0,getPoint=(xIndex,yIndex)=>({x:xValues[xIndex],y:yValues[yIndex],z:start.z});for(;openSet.length>0;){let current2=heapPop(openSet);if(current2.score>(bestCosts.get(current2.key)??Number.POSITIVE_INFINITY))continue;if(current2.key===targetKey)break;let[xIndexText,yIndexText]=current2.key.split(":"),xIndex=Number(xIndexText),yIndex=Number(yIndexText),currentPoint=getPoint(xIndex,yIndex),neighbors=[[xIndex-1,yIndex],[xIndex+1,yIndex],[xIndex,yIndex-1],[xIndex,yIndex+1]].filter(([candidateXIndex,candidateYIndex])=>candidateXIndex>=0&&candidateYIndex>=0&&candidateXIndex<xValues.length&&candidateYIndex<yValues.length);for(let[nextXIndex,nextYIndex]of neighbors){let nextPoint=getPoint(nextXIndex,nextYIndex),travelScore=getSegmentTravelScore({from:currentPoint,to:nextPoint,boundary,activeSide,margin,obstacleSegments:segments,obstacleVias:vias,traceThickness,routeLayer});if(!Number.isFinite(travelScore))continue;let nextKey=`${nextXIndex}:${nextYIndex}`,axisBias=Math.abs(activeSide==="left"||activeSide==="right"?nextPoint.x-preferredAxisValue:nextPoint.y-preferredAxisValue),nextCost=current2.score+travelScore+axisBias*.2;nextCost>=(bestCosts.get(nextKey)??Number.POSITIVE_INFINITY)||(bestCosts.set(nextKey,nextCost),previous.set(nextKey,current2.key),heapPush(openSet,{key:nextKey,score:nextCost}))}}if(!bestCosts.has(targetKey))return null;let pathKeys=[targetKey];for(;pathKeys[0]!==startKey;){let priorKey=previous.get(pathKeys[0]);if(!priorKey)return null;pathKeys.unshift(priorKey)}return compressPath(pathKeys.map(key=>{let[xIndexText,yIndexText]=key.split(":");return getPoint(Number(xIndexText),Number(yIndexText))}))};var clamp5=(value,min,max)=>Math.min(max,Math.max(min,value));var snapToGrid=(value,step,origin,direction2="nearest")=>{let offset=(value-origin)/step,snappedOffset=direction2==="inward-positive"?Math.ceil(offset-1e-6):direction2==="inward-negative"?Math.floor(offset+1e-6):Math.round(offset);return origin+snappedOffset*step};var getPreferredAxisValue=(side,moveAmount,boundary,gridStep)=>{switch(side){case"left":return clamp5(snapToGrid(boundary.minX+moveAmount,gridStep,boundary.minX,"inward-positive"),boundary.minX,boundary.maxX);case"right":return clamp5(snapToGrid(boundary.maxX-moveAmount,gridStep,boundary.minX,"inward-negative"),boundary.minX,boundary.maxX);case"top":return clamp5(snapToGrid(boundary.maxY-moveAmount,gridStep,boundary.minY,"inward-negative"),boundary.minY,boundary.maxY);case"bottom":return clamp5(snapToGrid(boundary.minY+moveAmount,gridStep,boundary.minY,"inward-positive"),boundary.minY,boundary.maxY)}};var getSegmentLength=(start,end)=>Math.hypot(end.x-start.x,end.y-start.y);var isPointNearSide=(point6,boundary,side,margin)=>distanceToSide(point6,boundary,side)<=margin+1e-6;var getRouteSideContactState=(route,boundary,side,margin)=>{let points=route.route??[];if(points.length===0)return"none";let touchesAtEndpoint=!1;for(let index=0;index<points.length;index+=1){let point6=points[index];if(point6&&isPointNearSide(point6,boundary,side,margin)){if(index===0||index===points.length-1){touchesAtEndpoint=!0;continue}return"interior"}}for(let index=0;index<points.length-1;index+=1){let start=points[index],end=points[index+1];if(!(!start||!end)&&isPointNearSide(start,boundary,side,margin)&&isPointNearSide(end,boundary,side,margin)&&!(getSegmentLength(start,end)<=1e-6))return"interior"}return touchesAtEndpoint?"endpoint":"none"};var getRouteSideExposure=(route,boundary,side,margin)=>{let points=route.route??[],exposure=0;for(let index=0;index<points.length-1;index+=1){let start=points[index],end=points[index+1];!start||!end||isPointNearSide(start,boundary,side,margin)&&isPointNearSide(end,boundary,side,margin)&&(exposure+=getSegmentLength(start,end))}return exposure};var sideDirection=(side,amount)=>{switch(side){case"left":return{x:amount,y:0};case"right":return{x:-amount,y:0};case"top":return{x:0,y:-amount};case"bottom":return{x:0,y:amount}}};var createGridBridgeCandidates=({start,end,delta,preferredAxisValue})=>Math.abs(delta.x)>0?[createGridBridge(start,end,delta,preferredAxisValue),dedupeRoutePoints([start,{x:preferredAxisValue,y:start.y,z:start.z},{x:end.x,y:start.y,z:end.z},end]),dedupeRoutePoints([start,{x:start.x,y:end.y,z:start.z},{x:preferredAxisValue,y:end.y,z:end.z},end])]:[createGridBridge(start,end,delta,preferredAxisValue)],getSaferPreferredAxisValue=({side,moveAmount,boundary,gridStep,margin,targetAxisValue})=>{let preferredAxis=targetAxisValue??getPreferredAxisValue(side,moveAmount,boundary,gridStep),point6=side==="left"||side==="right"?{x:preferredAxis,y:boundary.center.y}:{x:boundary.center.x,y:preferredAxis};if(distanceToSide(point6,boundary,side)>margin)return preferredAxis;switch(side){case"left":return Math.min(preferredAxis+gridStep,boundary.maxX);case"right":return Math.max(preferredAxis-gridStep,boundary.minX);case"top":return Math.max(preferredAxis-gridStep,boundary.minY);case"bottom":return Math.min(preferredAxis+gridStep,boundary.maxY)}},createMovedRoute=(route,movableIndexes,boundary,gridStep,side,moveAmount,margin,surroundingRoutes,activeRouteIndex,targetAxisValue,translateOnly=!1)=>{let getContactRank=contactState=>contactState==="none"?0:contactState==="endpoint"?1:2,isScoreBetter=(score,bestScore2)=>score.worsenedOtherSideContacts!==bestScore2.worsenedOtherSideContacts?score.worsenedOtherSideContacts<bestScore2.worsenedOtherSideContacts:score.activeExposure!==bestScore2.activeExposure?score.activeExposure<bestScore2.activeExposure:score.minOtherSideClearance!==bestScore2.minOtherSideClearance?score.minOtherSideClearance>bestScore2.minOtherSideClearance:score.otherExposureIncrease!==bestScore2.otherExposureIncrease?score.otherExposureIncrease<bestScore2.otherExposureIncrease:score.otherExposure!==bestScore2.otherExposure?score.otherExposure<bestScore2.otherExposure:score.pointCount<bestScore2.pointCount,getRouteSafetyScore=candidateRoute=>{let otherSides=BOUNDARY_SIDES.filter(candidateSide=>candidateSide!==side),originalTouchingSides=new Set(otherSides.filter(candidateSide=>getRouteSideContactState(route,boundary,candidateSide,margin)!=="none")),activeExposure=getRouteSideExposure(candidateRoute,boundary,side,margin),worsenedOtherSideContacts=otherSides.reduce((sum,candidateSide)=>{let beforeContact=getRouteSideContactState(route,boundary,candidateSide,margin),afterContact=getRouteSideContactState(candidateRoute,boundary,candidateSide,margin);return sum+(getContactRank(afterContact)>getContactRank(beforeContact)?1:0)},0),otherExposureIncrease=otherSides.reduce((sum,candidateSide)=>{let beforeExposure=getRouteSideExposure(route,boundary,candidateSide,margin),afterExposure=getRouteSideExposure(candidateRoute,boundary,candidateSide,margin);return sum+Math.max(0,afterExposure-beforeExposure)},0),otherExposure=otherSides.reduce((sum,candidateSide)=>sum+getRouteSideExposure(candidateRoute,boundary,candidateSide,margin),0),candidatePoints=candidateRoute.route??[],minOtherSideClearance=candidatePoints.flatMap((point6,index)=>{let nextPoint=candidatePoints[index+1];return nextPoint?[point6,{x:(point6.x+nextPoint.x)/2,y:(point6.y+nextPoint.y)/2}]:[point6]}).reduce((minClearance,point6)=>{let pointClearance=otherSides.reduce((pointMin,candidateSide)=>{let distance8=distanceToSide(point6,boundary,candidateSide);return originalTouchingSides.has(candidateSide)&&distance8<=1e-6?pointMin:Math.min(pointMin,distance8)},Number.POSITIVE_INFINITY);return Number.isFinite(pointClearance)?Math.min(minClearance,pointClearance):minClearance},Number.POSITIVE_INFINITY);return{activeExposure,worsenedOtherSideContacts,otherExposureIncrease,otherExposure,minOtherSideClearance,pointCount:candidatePoints.length}},delta=sideDirection(side,moveAmount),originalPoints=route.route??[];if(originalPoints.length<2||movableIndexes.length===0)return cloneRoute(route);if(translateOnly||(route.vias?.length??0)>0){let translatedRoute=cloneRoute(route),translatedPoints=translatedRoute.route??[];for(let index of movableIndexes){let originalPoint=translatedPoints[index];originalPoint&&(translatedPoints[index]={...originalPoint,x:originalPoint.x+delta.x,y:originalPoint.y+delta.y})}for(let via of translatedRoute.vias??[])movableIndexes.some(index=>{let point6=route.route?.[index];return point6?pointsCoincide(point6,via):!1})&&(via.x+=delta.x,via.y+=delta.y);return translatedRoute}let nextRoute=cloneRoute(route);if(originalPoints.length===2&&movableIndexes.length===2&&movableIndexes[0]===0&&movableIndexes[1]===1){let start=originalPoints[0],end=originalPoints[1],preferredAxis2=getSaferPreferredAxisValue({side,moveAmount,boundary,gridStep,margin,targetAxisValue}),candidateRoutes2=createGridBridgeCandidates({start,end,delta,preferredAxisValue:preferredAxis2}).map(candidateBridge=>cloneRoute({...route,route:candidateBridge})),searchedPath2=findBestGridBridgePath({start,end,boundary,activeSide:side,gridStep,margin,preferredAxisValue:preferredAxis2,activeRouteIndex,surroundingRoutes,traceThickness:route.traceThickness});searchedPath2&&candidateRoutes2.push(cloneRoute({...route,route:searchedPath2}));let bestRoute2=candidateRoutes2[0],bestScore2=getRouteSafetyScore(bestRoute2);for(let candidateRoute of candidateRoutes2.slice(1)){let score=getRouteSafetyScore(candidateRoute);isScoreBetter(score,bestScore2)&&(bestRoute2=candidateRoute,bestScore2=score)}return bestRoute2}let firstIndex=movableIndexes[0],lastIndex=movableIndexes[movableIndexes.length-1],anchorStart=originalPoints[firstIndex-1],anchorEnd=originalPoints[lastIndex+1];if(!anchorStart||!anchorEnd)return nextRoute;let preferredAxis=getSaferPreferredAxisValue({side,moveAmount,boundary,gridStep,margin,targetAxisValue}),candidateRoutes=createGridBridgeCandidates({start:anchorStart,end:anchorEnd,delta,preferredAxisValue:preferredAxis}).map(candidateBridge=>cloneRoute({...route,route:dedupeRoutePoints([...originalPoints.slice(0,firstIndex),...candidateBridge.slice(1),...originalPoints.slice(lastIndex+2)])})),searchedPath=findBestGridBridgePath({start:anchorStart,end:anchorEnd,boundary,activeSide:side,gridStep,margin,preferredAxisValue:preferredAxis,activeRouteIndex,surroundingRoutes,traceThickness:route.traceThickness});searchedPath&&candidateRoutes.push(cloneRoute({...route,route:dedupeRoutePoints([...originalPoints.slice(0,firstIndex),...searchedPath.slice(1),...originalPoints.slice(lastIndex+2)])}));let bestRoute=candidateRoutes[0],bestScore=getRouteSafetyScore(bestRoute);for(let candidateRoute of candidateRoutes.slice(1)){let score=getRouteSafetyScore(candidateRoute);isScoreBetter(score,bestScore)&&(bestRoute=candidateRoute,bestScore=score)}return bestRoute};var segmentsShareEndpoint=(a2,b3)=>pointsCoincide(a2.start,b3.start)||pointsCoincide(a2.start,b3.end)||pointsCoincide(a2.end,b3.start)||pointsCoincide(a2.end,b3.end);var conflictKey=(firstRouteIndex,firstLayer,secondRouteIndex,secondLayer)=>firstRouteIndex<secondRouteIndex?`${firstRouteIndex}:${firstLayer}:${secondRouteIndex}:${secondLayer}`:`${secondRouteIndex}:${secondLayer}:${firstRouteIndex}:${firstLayer}`,pushConflict=(conflicts,firstRouteIndex,firstLayer,secondRouteIndex,secondLayer)=>{let key=conflictKey(firstRouteIndex,firstLayer,secondRouteIndex,secondLayer);if(!conflicts.has(key)){if(firstRouteIndex<secondRouteIndex){conflicts.set(key,{routeIndexes:[firstRouteIndex,secondRouteIndex],layers:[firstLayer,secondLayer]});return}conflicts.set(key,{routeIndexes:[secondRouteIndex,firstRouteIndex],layers:[secondLayer,firstLayer]})}},boundsOverlap=(first,second,margin)=>first.minX-margin<=second.maxX&&first.maxX+margin>=second.minX&&first.minY-margin<=second.maxY&&first.maxY+margin>=second.minY,segmentBoxesOverlap=(first,second,margin)=>{let firstHalfThickness=first.thickness/2,secondHalfThickness=second.thickness/2,minDistanceAllowed=margin+firstHalfThickness+secondHalfThickness-1e-6,firstMinX=Math.min(first.start.x,first.end.x)-firstHalfThickness-margin,firstMaxX=Math.max(first.start.x,first.end.x)+firstHalfThickness+margin,firstMinY=Math.min(first.start.y,first.end.y)-firstHalfThickness-margin,firstMaxY=Math.max(first.start.y,first.end.y)+firstHalfThickness+margin,secondMinX=Math.min(second.start.x,second.end.x)-secondHalfThickness,secondMaxX=Math.max(second.start.x,second.end.x)+secondHalfThickness,secondMinY=Math.min(second.start.y,second.end.y)-secondHalfThickness,secondMaxY=Math.max(second.start.y,second.end.y)+secondHalfThickness;return firstMinX<=secondMaxX&&firstMaxX>=secondMinX&&firstMinY<=secondMaxY&&firstMaxY>=secondMinY&&minDistanceAllowed>0},pointBoxOverlapsSegment=(point6,radius,segment2,margin)=>{let minDistanceAllowed=margin+segment2.thickness/2+radius-1e-6,pointMinX=point6.x-minDistanceAllowed,pointMaxX=point6.x+minDistanceAllowed,pointMinY=point6.y-minDistanceAllowed,pointMaxY=point6.y+minDistanceAllowed,segmentHalfThickness=segment2.thickness/2,segmentMinX=Math.min(segment2.start.x,segment2.end.x)-segmentHalfThickness,segmentMaxX=Math.max(segment2.start.x,segment2.end.x)+segmentHalfThickness,segmentMinY=Math.min(segment2.start.y,segment2.end.y)-segmentHalfThickness,segmentMaxY=Math.max(segment2.start.y,segment2.end.y)+segmentHalfThickness;return pointMinX<=segmentMaxX&&pointMaxX>=segmentMinX&&pointMinY<=segmentMaxY&&pointMaxY>=segmentMinY},viaBoxesOverlap=(first,second,margin)=>{let minDistanceAllowed=margin+first.radius+second.radius-1e-6;return Math.abs(first.center.x-second.center.x)<=minDistanceAllowed&&Math.abs(first.center.y-second.center.y)<=minDistanceAllowed},findClearanceConflicts=(routes,movedRouteIndexes,margin,geometryCache)=>{let routeGeometries=routes.map((route,routeIndex)=>getRouteGeometry(route,routeIndex,geometryCache)),conflicts=new Map;if(movedRouteIndexes.size===0)return[];let movedIndexes=Array.from(movedRouteIndexes),nearbyRouteIndexesByMovedRoute=new Map,getNearbyRouteIndexes=movedRouteIndex=>{let cachedRouteIndexes=nearbyRouteIndexesByMovedRoute.get(movedRouteIndex);if(cachedRouteIndexes)return cachedRouteIndexes;let movedGeometry=routeGeometries[movedRouteIndex];if(!movedGeometry)return[];let nearbyRouteIndexes=[];for(let otherRouteIndex=0;otherRouteIndex<routeGeometries.length;otherRouteIndex+=1){if(otherRouteIndex===movedRouteIndex)continue;let otherGeometry=routeGeometries[otherRouteIndex];otherGeometry&&boundsOverlap(movedGeometry.bounds,otherGeometry.bounds,margin)&&nearbyRouteIndexes.push(otherRouteIndex)}return nearbyRouteIndexesByMovedRoute.set(movedRouteIndex,nearbyRouteIndexes),nearbyRouteIndexes};for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(!movedGeometry)continue;let nearbyRouteIndexes=getNearbyRouteIndexes(movedRouteIndex);for(let first of movedGeometry.segments)for(let otherRouteIndex of nearbyRouteIndexes){if(movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let second of otherGeometry.segments){if(first.layer!==second.layer||segmentsShareEndpoint(first,second)||!segmentBoxesOverlap(first,second,margin))continue;let minDistanceAllowed=margin+(first.thickness+second.thickness)/2-1e-6;segmentDistance(first.start,first.end,second.start,second.end)<minDistanceAllowed&&pushConflict(conflicts,first.routeIndex,first.layer,second.routeIndex,second.layer)}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(!movedGeometry)continue;let nearbyRouteIndexes=getNearbyRouteIndexes(movedRouteIndex);for(let via of movedGeometry.vias)for(let otherRouteIndex of nearbyRouteIndexes){if(movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let segment2 of otherGeometry.segments){if(!pointBoxOverlapsSegment(via.center,via.radius,segment2,margin))continue;let minDistanceAllowed=margin+segment2.thickness/2+via.radius-1e-6;distancePointToSegment(via.center,segment2.start,segment2.end)<minDistanceAllowed&&pushConflict(conflicts,segment2.routeIndex,segment2.layer,via.routeIndex,"via")}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(!movedGeometry)continue;let nearbyRouteIndexes=getNearbyRouteIndexes(movedRouteIndex);for(let segment2 of movedGeometry.segments)for(let otherRouteIndex of nearbyRouteIndexes){let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let via of otherGeometry.vias){if(!pointBoxOverlapsSegment(via.center,via.radius,segment2,margin))continue;let minDistanceAllowed=margin+segment2.thickness/2+via.radius-1e-6;distancePointToSegment(via.center,segment2.start,segment2.end)<minDistanceAllowed&&pushConflict(conflicts,segment2.routeIndex,segment2.layer,via.routeIndex,"via")}}}for(let movedRouteIndex of movedIndexes){let movedGeometry=routeGeometries[movedRouteIndex];if(!movedGeometry)continue;let nearbyRouteIndexes=getNearbyRouteIndexes(movedRouteIndex);for(let first of movedGeometry.vias)for(let otherRouteIndex of nearbyRouteIndexes){if(movedRouteIndex>otherRouteIndex&&movedRouteIndexes.has(otherRouteIndex))continue;let otherGeometry=routeGeometries[otherRouteIndex];if(otherGeometry)for(let second of otherGeometry.vias){if(!viaBoxesOverlap(first,second,margin))continue;let minDistanceAllowed=margin+first.radius+second.radius-1e-6;Math.hypot(first.center.x-second.center.x,first.center.y-second.center.y)<minDistanceAllowed&&pushConflict(conflicts,first.routeIndex,"via",second.routeIndex,"via")}}}return Array.from(conflicts.values())};var findClearanceConflictPairs=(routes,movedRouteIndexes,margin,geometryCache)=>findClearanceConflicts(routes,movedRouteIndexes,margin,geometryCache).map(({routeIndexes})=>routeIndexes);var getRouteBoundaryOverflow=(route,boundary)=>Math.max(0,...(route.route??[]).map(point6=>Math.max(boundary.minX-point6.x,point6.x-boundary.maxX,boundary.minY-point6.y,point6.y-boundary.maxY,0)));var getRouteMovableIndexes=(route,boundary,side,margin)=>{let points=route.route??[],movableIndexes=[],movableIndexSet=new Set,firstMovableIndex=1,lastMovableIndex=points.length-2;for(;firstMovableIndex<points.length-1&&pointsCoincide(points[firstMovableIndex],points[0]);)firstMovableIndex+=1;for(;lastMovableIndex>0&&pointsCoincide(points[lastMovableIndex],points[points.length-1]);)lastMovableIndex-=1;for(let index=firstMovableIndex;index<=lastMovableIndex;index+=1)isPointNearSide(points[index],boundary,side,margin)&&(movableIndexSet.add(index),movableIndexes.push(index));for(let queueIndex=0;queueIndex<movableIndexes.length;queueIndex+=1){let activeIndex=movableIndexes[queueIndex],activePoint=points[activeIndex];if(activePoint)for(let index=firstMovableIndex;index<=lastMovableIndex;index+=1){if(movableIndexSet.has(index))continue;let point6=points[index];point6&&point6.z!==activePoint.z&&pointsCoincide(point6,activePoint)&&(movableIndexSet.add(index),movableIndexes.push(index))}}return movableIndexes.length===0&&points.length===2&&points.some(point6=>isPointNearSide(point6,boundary,side,margin))?[0,1]:(movableIndexes.sort((a2,b3)=>a2-b3),movableIndexes)};var getRoutePushableIndexes=(route,preferredLayers)=>{let points=route.route??[],pushableIndexes=[],pushableIndexSet=new Set,wantsAllLayers=preferredLayers.length===0||preferredLayers.includes("via");if(points.length===2)return[0,1];for(let index=1;index<points.length-1;index+=1){if(wantsAllLayers){pushableIndexSet.add(index),pushableIndexes.push(index);continue}preferredLayers.includes(getRoutePointLayer(points[index]))&&(pushableIndexSet.add(index),pushableIndexes.push(index))}for(let queueIndex=0;queueIndex<pushableIndexes.length;queueIndex+=1){let activeIndex=pushableIndexes[queueIndex],activePoint=points[activeIndex];if(activePoint)for(let index=1;index<points.length-1;index+=1){if(pushableIndexSet.has(index))continue;let point6=points[index];point6&&point6.z!==activePoint.z&&pointsCoincide(point6,activePoint)&&(pushableIndexSet.add(index),pushableIndexes.push(index))}}return pushableIndexes.sort((a2,b3)=>a2-b3),pushableIndexes};var getEndpointBoundarySides=(route,boundary,endpointIndex)=>{let points=route.route??[],point6=endpointIndex===0?points[0]:points[points.length-1];return point6?BOUNDARY_SIDES.filter(side=>distanceToSide(point6,boundary,side)<=1e-6):[]},routeEndpointsStayOnBoundarySides=(originalRoute,candidateRoute,boundary)=>{let originalPoints=originalRoute.route??[],candidatePoints=candidateRoute.route??[];if(originalPoints.length===0||candidatePoints.length===0)return!0;for(let endpointIndex of[0,-1]){let originalSides=getEndpointBoundarySides(originalRoute,boundary,endpointIndex);if(originalSides.length===0)continue;let candidatePoint=endpointIndex===0?candidatePoints[0]:candidatePoints[candidatePoints.length-1];if(!candidatePoint)return!1;for(let side of originalSides)if(distanceToSide(candidatePoint,boundary,side)>1e-6)return!1}return!0};var wouldIncreaseExposureOnOtherSides=(currentRoutes,candidateRoutes,candidateRouteIndexes,boundary,activeSide,margin)=>Array.from(candidateRouteIndexes).some(index=>{let previousRoute=currentRoutes[index],nextRoute=candidateRoutes[index];return BOUNDARY_SIDES.filter(side=>side!==activeSide).some(otherSide=>{let previousContactState=getRouteSideContactState(previousRoute,boundary,otherSide,margin),nextContactState=getRouteSideContactState(nextRoute,boundary,otherSide,margin);return previousContactState==="none"&&nextContactState!=="none"})});var evaluateRouteMove=({currentRoutes,routeIndex,side,boundary,margin,gridStep,moveAmount,geometryCache})=>{let getConflictKeys=(routes,movedIndexes)=>new Set(findClearanceConflicts(routes,movedIndexes,margin,geometryCache).map(({routeIndexes,layers})=>`${routeIndexes[0]}:${layers[0]}:${routeIndexes[1]}:${layers[1]}`)),route=currentRoutes[routeIndex],isTwoPointRoute=(route.route?.length??0)===2,movableIndexes=getRouteMovableIndexes(route,boundary,side,margin);if(movableIndexes.length===0)return null;let candidateRouteIndexes=new Set,movedTwoPointRouteIndexes=new Set,candidateRoutes=cloneRoutes(currentRoutes),rejected=!1,rejectionReason="overlap",queuedRouteIndexes=new Set([routeIndex]),queuedRouteLayers=new Map([[routeIndex,new Set]]),routeQueue=[routeIndex],routeQueueIndex=0;for(;routeQueueIndex<routeQueue.length&&!rejected;){let activeRouteIndex=routeQueue[routeQueueIndex];if(routeQueueIndex+=1,queuedRouteIndexes.delete(activeRouteIndex),candidateRouteIndexes.has(activeRouteIndex))continue;let activeRoute=candidateRoutes[activeRouteIndex],activePreferredLayers=Array.from(queuedRouteLayers.get(activeRouteIndex)??[]);queuedRouteLayers.delete(activeRouteIndex);let activeMovableIndexes=activeRouteIndex===routeIndex?getRouteMovableIndexes(activeRoute,boundary,side,margin):getRoutePushableIndexes(activeRoute,activePreferredLayers);if(activeMovableIndexes.length===0){if(activeRouteIndex===routeIndex)return null;rejected=!0,rejectionReason="eventual-overlap";break}let activePoints=activeRoute.route??[],targetAxisValue=activeRouteIndex===routeIndex?void 0:side==="left"||side==="right"?(activePoints[activeMovableIndexes[0]]?.x??0)+(side==="left"?moveAmount:-moveAmount):(activePoints[activeMovableIndexes[0]]?.y??0)+(side==="top"?-moveAmount:moveAmount);candidateRoutes[activeRouteIndex]=createMovedRoute(activeRoute,activeMovableIndexes,boundary,gridStep,side,moveAmount,margin,candidateRoutes,activeRouteIndex,targetAxisValue,activeRouteIndex!==routeIndex),candidateRouteIndexes.add(activeRouteIndex),(activeRoute.route?.length??0)===2&&movedTwoPointRouteIndexes.add(activeRouteIndex);let originalBoundaryOverflow=getRouteBoundaryOverflow(currentRoutes[activeRouteIndex],boundary);if(getRouteBoundaryOverflow(candidateRoutes[activeRouteIndex],boundary)>originalBoundaryOverflow+1e-6){rejected=!0,rejectionReason="boundary";break}if(!routeEndpointsStayOnBoundarySides(currentRoutes[activeRouteIndex],candidateRoutes[activeRouteIndex],boundary)){rejected=!0,rejectionReason="endpoint-boundary";break}let adjacencyConflicts=findClearanceConflicts(candidateRoutes,new Set([activeRouteIndex]),margin,geometryCache);for(let conflict of adjacencyConflicts){let[firstRouteIndex,secondRouteIndex]=conflict.routeIndexes,firstMoved=candidateRouteIndexes.has(firstRouteIndex),secondMoved=candidateRouteIndexes.has(secondRouteIndex);if(firstMoved&&secondMoved)continue;let nextRouteIndex=firstMoved?secondRouteIndex:firstRouteIndex,nextRouteLayer=firstMoved?conflict.layers[1]:conflict.layers[0];if(!candidateRouteIndexes.has(nextRouteIndex)&&!queuedRouteIndexes.has(nextRouteIndex)){queuedRouteIndexes.add(nextRouteIndex),routeQueue.push(nextRouteIndex),queuedRouteLayers.set(nextRouteIndex,new Set([nextRouteLayer]));continue}if(queuedRouteIndexes.has(nextRouteIndex)){let existingLayers=queuedRouteLayers.get(nextRouteIndex)??new Set;existingLayers.add(nextRouteLayer),queuedRouteLayers.set(nextRouteIndex,existingLayers)}}}if(!rejected&&candidateRouteIndexes.size>1){let currentConflictKeys=getConflictKeys(currentRoutes,candidateRouteIndexes),candidateConflictKeys=getConflictKeys(candidateRoutes,candidateRouteIndexes);for(let conflictKey2 of candidateConflictKeys)if(!currentConflictKeys.has(conflictKey2)){rejected=!0,rejectionReason="eventual-overlap";break}}return!rejected&&candidateRouteIndexes.size>1&&findClearanceConflictPairs(candidateRoutes,candidateRouteIndexes,0,geometryCache).length>0&&(rejected=!0,rejectionReason="eventual-overlap"),!rejected&&wouldIncreaseExposureOnOtherSides(currentRoutes,candidateRoutes,candidateRouteIndexes,boundary,side,margin)&&(rejected=!0,rejectionReason="side-regression"),{isTwoPointRoute,movableIndexes,candidateRouteIndexes,movedTwoPointRouteIndexes,candidateRoutes,rejected,rejectionReason}};var processBoundarySide=({side,sample,boundary,margin,gridStep,repairedRoutes,frames,captureProgressFrames,lockedTwoPointRoutes,geometryCache})=>{let{hasObstacle,moveAmount}=getMoveAmountForSide(sample,boundary,side,margin);captureProgressFrames&&frames.push(createSideAnalysisFrame(cloneRoutes(repairedRoutes),boundary,side,margin,moveAmount,hasObstacle,gridStep));let attemptedRoutes=new Set;for(let routeIndex=0;routeIndex<repairedRoutes.length;routeIndex+=1){if(attemptedRoutes.has(routeIndex)||lockedTwoPointRoutes.has(routeIndex)||(repairedRoutes[routeIndex].route?.length??0)===2&&!hasObstacle)continue;let evaluation=evaluateRouteMove({currentRoutes:repairedRoutes,routeIndex,side,boundary,margin,gridStep,moveAmount,geometryCache});if(evaluation){if(captureProgressFrames&&frames.push(createCandidateFrame({routes:cloneRoutes(repairedRoutes),candidateRoutes:evaluation.candidateRoutes,candidateRouteIndexes:evaluation.candidateRouteIndexes,originalRoutes:evaluation.rejected?void 0:Array.from(evaluation.candidateRouteIndexes).map(index=>cloneRoute(repairedRoutes[index])),boundary,side,margin,gridStep,rejected:evaluation.rejected,rejectionReason:evaluation.rejectionReason})),!evaluation.rejected){repairedRoutes.splice(0,repairedRoutes.length,...evaluation.candidateRoutes);for(let movedTwoPointRouteIndex of evaluation.movedTwoPointRouteIndexes)lockedTwoPointRoutes.add(movedTwoPointRouteIndex)}for(let candidateRouteIndex of evaluation.candidateRouteIndexes)attemptedRoutes.add(candidateRouteIndex)}}};var buildRepairFrames=(sample,requestedMargin,captureProgressFrames=!1)=>{let boundary=getBoundaryRect(sample?.nodeWithPortPoints),baseRoutes=cloneRoutes(sample?.nodeHdRoutes??[]),margin=Math.max(requestedMargin??.4,.05),repairedRoutes=cloneRoutes(baseRoutes);if(!boundary)return{boundary:null,baseRoutes,repairedRoutes,margin,gridStep:Math.max(margin/2,.05),frames:[{title:"HighDensityRepair02 Missing Boundary",routes:repairedRoutes}]};let gridStep=Math.max(margin/2,.05),frames=captureProgressFrames?[createInitialFrame(cloneRoutes(repairedRoutes),boundary,margin,gridStep)]:[],lockedTwoPointRoutes=new Set,geometryCache=new WeakMap;for(let side of BOUNDARY_SIDES)processBoundarySide({side,sample,boundary,margin,gridStep,repairedRoutes,frames,captureProgressFrames,lockedTwoPointRoutes,geometryCache});return frames.push(createFinalFrame(cloneRoutes(repairedRoutes),cloneRoutes(baseRoutes),boundary,margin,gridStep)),{boundary,baseRoutes,repairedRoutes,frames,margin,gridStep}};var HighDensityRepairSolver=class extends BaseSolver2{constructor(params={}){super();this.params=params;this.frames=[];this.currentFrameIndex=0;this.repairedRoutes=[]}_setup(){this.buildFrames(),this.stats={margin:this.params.margin??.4,frames:this.frames.length,currentFrame:this.currentFrameIndex}}_step(){if(this.frames.length<=1){this.solved=!0;return}this.currentFrameIndex<this.frames.length-1&&(this.currentFrameIndex+=1),this.stats={...this.stats,currentFrame:this.currentFrameIndex,title:this.frames[this.currentFrameIndex]?.title},this.currentFrameIndex>=this.frames.length-1&&(this.solved=!0)}getConstructorParams(){return[this.params]}getOutput(){return{margin:this.params.margin??.4,repairedRoutes:this.repairedRoutes,frameCount:this.frames.length}}buildFrames(){let result=buildRepairFrames(this.params.sample,this.params.margin,this.params.captureProgressFrames??!1);this.frames=result.frames,this.repairedRoutes=result.repairedRoutes}visualize(){let sample=this.params.sample,node=sample?.nodeWithPortPoints,obstacles=sample?.adjacentObstacles??[],frame=this.frames[this.currentFrameIndex]??{title:"HighDensityRepair02",routes:cloneRoutes(sample?.nodeHdRoutes??[])},boundary=getBoundaryRect(node),nodeRect=boundary&&node?.capacityMeshNodeId?[{center:boundary.center,width:boundary.width,height:boundary.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:node.capacityMeshNodeId}]:boundary?[{center:boundary.center,width:boundary.width,height:boundary.height,stroke:"#1d4ed8",fill:"rgba(29, 78, 216, 0.08)",label:"capacity-node"}]:[],obstacleRects=obstacles.filter(obstacle=>obstacle.center&&obstacle.width&&obstacle.height).map((obstacle,idx)=>({center:obstacle.center,width:obstacle.width,height:obstacle.height,stroke:obstacle.type==="oval"?"#a855f7":"#dc2626",fill:obstacle.type==="oval"?"rgba(168, 85, 247, 0.12)":"rgba(220, 38, 38, 0.08)",label:obstacle.type?`obstacle:${obstacle.type}:${idx}`:`obstacle:${idx}`})),points=[...(node?.portPoints??[]).map(portPoint=>({x:portPoint.x,y:portPoint.y,color:"#0f766e",label:portPoint.connectionName??portPoint.portPointId??"port-point"})),...frame.routes.flatMap(route=>route.route??[]).map(routePoint=>({x:routePoint.x,y:routePoint.y,color:getRoutePointLayer(routePoint)==="bottom"?BOTTOM_LAYER_COLOR:"#0ea5e9",label:""})),...frame.overlayPoints??[]],lines=[...(frame.originalRoutes??[]).flatMap(route=>splitRouteIntoLayerSegments(route).map(line2=>({...line2,strokeColor:"#111111",strokeWidth:Math.max(line2.strokeWidth*.6,.05),label:`original:${line2.label}`}))),...frame.routes.filter(route=>(route.route?.length??0)>=2).flatMap(route=>splitRouteIntoLayerSegments(route)),...frame.overlayLines??[]],circles=frame.routes.flatMap(route=>(route.vias??[]).map(via=>({center:{x:via.x,y:via.y},radius:(via.diameter??route.viaDiameter??.3)/2,stroke:"#7c3aed",fill:"rgba(124, 58, 237, 0.2)",label:route.connectionName?`via:${route.connectionName}`:"via"})));return{coordinateSystem:"cartesian",title:frame.title,rects:[...nodeRect,...obstacleRects,...frame.overlayRects??[]],points,lines,circles,arrows:frame.overlayArrows}}};var t=Object.create,e2=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,r3=(t35,e4)=>function(){return e4||(0,t35[o(t35)[0]])((e4={exports:{}}).exports,e4),e4.exports},a=(r4,a2,c3)=>(c3=r4!=null?t(i(r4)):{},((t35,i2,r5,a3)=>{if(i2&&typeof i2=="object"||typeof i2=="function")for(let c4 of o(i2))s.call(t35,c4)||c4===r5||e2(t35,c4,{get:()=>i2[c4],enumerable:!(a3=n(i2,c4))||a3.enumerable});return t35})(!a2&&r4&&r4.__esModule?c3:e2(c3,"default",{value:r4,enumerable:!0}),r4)),c=r3({"node_modules/is-buffer/index.js"(t35,e4){function n3(t36){return!!t36.constructor&&typeof t36.constructor.isBuffer=="function"&&t36.constructor.isBuffer(t36)}e4.exports=function(t36){return t36!=null&&(n3(t36)||(function(t37){return typeof t37.readFloatLE=="function"&&typeof t37.slice=="function"&&n3(t37.slice(0,0))})(t36)||!!t36._isBuffer)}}}),h=r3({"node_modules/kind-of/index.js"(t35,e4){var n3=c(),o3=Object.prototype.toString;e4.exports=function(t36){if(t36===void 0)return"undefined";if(t36===null)return"null";if(t36===!0||t36===!1||t36 instanceof Boolean)return"boolean";if(typeof t36=="string"||t36 instanceof String)return"string";if(typeof t36=="number"||t36 instanceof Number)return"number";if(typeof t36=="function"||t36 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t36))return"array";if(t36 instanceof RegExp)return"regexp";if(t36 instanceof Date)return"date";var e5=o3.call(t36);return e5==="[object RegExp]"?"regexp":e5==="[object Date]"?"date":e5==="[object Arguments]"?"arguments":e5==="[object Error]"?"error":n3(t36)?"buffer":e5==="[object Set]"?"set":e5==="[object WeakSet]"?"weakset":e5==="[object Map]"?"map":e5==="[object WeakMap]"?"weakmap":e5==="[object Symbol]"?"symbol":e5==="[object Int8Array]"?"int8array":e5==="[object Uint8Array]"?"uint8array":e5==="[object Uint8ClampedArray]"?"uint8clampedarray":e5==="[object Int16Array]"?"int16array":e5==="[object Uint16Array]"?"uint16array":e5==="[object Int32Array]"?"int32array":e5==="[object Uint32Array]"?"uint32array":e5==="[object Float32Array]"?"float32array":e5==="[object Float64Array]"?"float64array":"object"}}}),l=r3({"node_modules/rename-keys/index.js"(t35,e4){(function(){function t36(t37,e5){if(typeof e5!="function")return t37;var n3={};for(var o3 in t37)Object.prototype.hasOwnProperty.call(t37,o3)&&(n3[e5(o3,t37[o3])||o3]=t37[o3]);return n3}e4!==void 0&&e4.exports?e4.exports=t36:typeof define=="function"&&define.amd?define([],function(){return t36}):window.rename=t36})()}}),d=r3({"node_modules/deep-rename-keys/index.js"(t35,e4){var n3=h(),o3=l();e4.exports=function t36(e5,i2){var s2=n3(e5);if(s2!=="object"&&s2!=="array")throw new Error("expected an object");var r4=[];for(var a2 in s2==="object"&&(e5=o3(e5,i2),r4={}),e5)if(e5.hasOwnProperty(a2)){var c3=e5[a2];n3(c3)==="object"||n3(c3)==="array"?r4[a2]=t36(c3,i2):r4[a2]=c3}return r4}}}),u3=r3({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t35,e4){var n3=Object.prototype.hasOwnProperty,o3="~";function i2(){}function s2(t36,e5,n4){this.fn=t36,this.context=e5,this.once=n4||!1}function r4(){this._events=new i2,this._eventsCount=0}Object.create&&(i2.prototype=Object.create(null),new i2().__proto__||(o3=!1)),r4.prototype.eventNames=function(){var t36,e5,i3=[];if(this._eventsCount===0)return i3;for(e5 in t36=this._events)n3.call(t36,e5)&&i3.push(o3?e5.slice(1):e5);return Object.getOwnPropertySymbols?i3.concat(Object.getOwnPropertySymbols(t36)):i3},r4.prototype.listeners=function(t36,e5){var n4=o3?o3+t36:t36,i3=this._events[n4];if(e5)return!!i3;if(!i3)return[];if(i3.fn)return[i3.fn];for(var s3=0,r5=i3.length,a2=new Array(r5);s3<r5;s3++)a2[s3]=i3[s3].fn;return a2},r4.prototype.emit=function(t36,e5,n4,i3,s3,r5){var a2=o3?o3+t36:t36;if(!this._events[a2])return!1;var c3,h4,l3=this._events[a2],d3=arguments.length;if(l3.fn){switch(l3.once&&this.removeListener(t36,l3.fn,void 0,!0),d3){case 1:return l3.fn.call(l3.context),!0;case 2:return l3.fn.call(l3.context,e5),!0;case 3:return l3.fn.call(l3.context,e5,n4),!0;case 4:return l3.fn.call(l3.context,e5,n4,i3),!0;case 5:return l3.fn.call(l3.context,e5,n4,i3,s3),!0;case 6:return l3.fn.call(l3.context,e5,n4,i3,s3,r5),!0}for(h4=1,c3=new Array(d3-1);h4<d3;h4++)c3[h4-1]=arguments[h4];l3.fn.apply(l3.context,c3)}else{var u4,p4=l3.length;for(h4=0;h4<p4;h4++)switch(l3[h4].once&&this.removeListener(t36,l3[h4].fn,void 0,!0),d3){case 1:l3[h4].fn.call(l3[h4].context);break;case 2:l3[h4].fn.call(l3[h4].context,e5);break;case 3:l3[h4].fn.call(l3[h4].context,e5,n4);break;case 4:l3[h4].fn.call(l3[h4].context,e5,n4,i3);break;default:if(!c3)for(u4=1,c3=new Array(d3-1);u4<d3;u4++)c3[u4-1]=arguments[u4];l3[h4].fn.apply(l3[h4].context,c3)}}return!0},r4.prototype.on=function(t36,e5,n4){var i3=new s2(e5,n4||this),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.once=function(t36,e5,n4){var i3=new s2(e5,n4||this,!0),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.removeListener=function(t36,e5,n4,s3){var r5=o3?o3+t36:t36;if(!this._events[r5])return this;if(!e5)return--this._eventsCount===0?this._events=new i2:delete this._events[r5],this;var a2=this._events[r5];if(a2.fn)a2.fn!==e5||s3&&!a2.once||n4&&a2.context!==n4||(--this._eventsCount===0?this._events=new i2:delete this._events[r5]);else{for(var c3=0,h4=[],l3=a2.length;c3<l3;c3++)(a2[c3].fn!==e5||s3&&!a2[c3].once||n4&&a2[c3].context!==n4)&&h4.push(a2[c3]);h4.length?this._events[r5]=h4.length===1?h4[0]:h4:--this._eventsCount===0?this._events=new i2:delete this._events[r5]}return this},r4.prototype.removeAllListeners=function(t36){var e5;return t36?(e5=o3?o3+t36:t36,this._events[e5]&&(--this._eventsCount===0?this._events=new i2:delete this._events[e5])):(this._events=new i2,this._eventsCount=0),this},r4.prototype.off=r4.prototype.removeListener,r4.prototype.addListener=r4.prototype.on,r4.prototype.setMaxListeners=function(){return this},r4.prefixed=o3,r4.EventEmitter=r4,e4!==void 0&&(e4.exports=r4)}}),p=r3({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t35,e4){var n3=Object.prototype.hasOwnProperty,o3="~";function i2(){}function s2(t36,e5,n4){this.fn=t36,this.context=e5,this.once=n4||!1}function r4(){this._events=new i2,this._eventsCount=0}Object.create&&(i2.prototype=Object.create(null),new i2().__proto__||(o3=!1)),r4.prototype.eventNames=function(){var t36,e5,i3=[];if(this._eventsCount===0)return i3;for(e5 in t36=this._events)n3.call(t36,e5)&&i3.push(o3?e5.slice(1):e5);return Object.getOwnPropertySymbols?i3.concat(Object.getOwnPropertySymbols(t36)):i3},r4.prototype.listeners=function(t36,e5){var n4=o3?o3+t36:t36,i3=this._events[n4];if(e5)return!!i3;if(!i3)return[];if(i3.fn)return[i3.fn];for(var s3=0,r5=i3.length,a2=new Array(r5);s3<r5;s3++)a2[s3]=i3[s3].fn;return a2},r4.prototype.emit=function(t36,e5,n4,i3,s3,r5){var a2=o3?o3+t36:t36;if(!this._events[a2])return!1;var c3,h4,l3=this._events[a2],d3=arguments.length;if(l3.fn){switch(l3.once&&this.removeListener(t36,l3.fn,void 0,!0),d3){case 1:return l3.fn.call(l3.context),!0;case 2:return l3.fn.call(l3.context,e5),!0;case 3:return l3.fn.call(l3.context,e5,n4),!0;case 4:return l3.fn.call(l3.context,e5,n4,i3),!0;case 5:return l3.fn.call(l3.context,e5,n4,i3,s3),!0;case 6:return l3.fn.call(l3.context,e5,n4,i3,s3,r5),!0}for(h4=1,c3=new Array(d3-1);h4<d3;h4++)c3[h4-1]=arguments[h4];l3.fn.apply(l3.context,c3)}else{var u4,p4=l3.length;for(h4=0;h4<p4;h4++)switch(l3[h4].once&&this.removeListener(t36,l3[h4].fn,void 0,!0),d3){case 1:l3[h4].fn.call(l3[h4].context);break;case 2:l3[h4].fn.call(l3[h4].context,e5);break;case 3:l3[h4].fn.call(l3[h4].context,e5,n4);break;case 4:l3[h4].fn.call(l3[h4].context,e5,n4,i3);break;default:if(!c3)for(u4=1,c3=new Array(d3-1);u4<d3;u4++)c3[u4-1]=arguments[u4];l3[h4].fn.apply(l3[h4].context,c3)}}return!0},r4.prototype.on=function(t36,e5,n4){var i3=new s2(e5,n4||this),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.once=function(t36,e5,n4){var i3=new s2(e5,n4||this,!0),r5=o3?o3+t36:t36;return this._events[r5]?this._events[r5].fn?this._events[r5]=[this._events[r5],i3]:this._events[r5].push(i3):(this._events[r5]=i3,this._eventsCount++),this},r4.prototype.removeListener=function(t36,e5,n4,s3){var r5=o3?o3+t36:t36;if(!this._events[r5])return this;if(!e5)return--this._eventsCount===0?this._events=new i2:delete this._events[r5],this;var a2=this._events[r5];if(a2.fn)a2.fn!==e5||s3&&!a2.once||n4&&a2.context!==n4||(--this._eventsCount===0?this._events=new i2:delete this._events[r5]);else{for(var c3=0,h4=[],l3=a2.length;c3<l3;c3++)(a2[c3].fn!==e5||s3&&!a2[c3].once||n4&&a2[c3].context!==n4)&&h4.push(a2[c3]);h4.length?this._events[r5]=h4.length===1?h4[0]:h4:--this._eventsCount===0?this._events=new i2:delete this._events[r5]}return this},r4.prototype.removeAllListeners=function(t36){var e5;return t36?(e5=o3?o3+t36:t36,this._events[e5]&&(--this._eventsCount===0?this._events=new i2:delete this._events[e5])):(this._events=new i2,this._eventsCount=0),this},r4.prototype.off=r4.prototype.removeListener,r4.prototype.addListener=r4.prototype.on,r4.prototype.setMaxListeners=function(){return this},r4.prefixed=o3,r4.EventEmitter=r4,e4!==void 0&&(e4.exports=r4)}}),f=r3({"node_modules/xml-lexer/dist/lexer.js"(t35,e4){function n3(t36,e5,n4){return e5 in t36?Object.defineProperty(t36,e5,{value:n4,enumerable:!0,configurable:!0,writable:!0}):t36[e5]=n4,t36}var o3=p(),i2=function(){},s2={data:"state-data",cdata:"state-cdata",tagBegin:"state-tag-begin",tagName:"state-tag-name",tagEnd:"state-tag-end",attributeNameStart:"state-attribute-name-start",attributeName:"state-attribute-name",attributeNameEnd:"state-attribute-name-end",attributeValueBegin:"state-attribute-value-begin",attributeValue:"state-attribute-value"},r4={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a2={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c3={" ":r4.space," ":r4.space,"\n":r4.space,"\r":r4.space,"<":r4.lt,">":r4.gt,'"':r4.quote,"'":r4.quote,"=":r4.equal,"/":r4.slash};e4.exports={State:s2,Action:r4,Type:a2,create:function(t36){var e5,h4,l3,d3,u4,p4,f2,g7,m3,y5;t36=Object.assign({debug:!1},t36);var x5=new o3,v5=s2.data,b3="",S3="",I5="",P5="",_5="",N6="",M5=function(e6,n4){if(S3[0]!=="?"&&S3[0]!=="!"){var o4={type:e6,value:n4};t36.debug&&console.log("emit:",o4),x5.emit("data",o4)}};x5.stateMachine=(n3(y5={},s2.data,(n3(e5={},r4.lt,function(){b3.trim()&&M5(a2.text,b3),S3="",_5=!1,v5=s2.tagBegin}),n3(e5,r4.char,function(t37){b3+=t37}),e5)),n3(y5,s2.cdata,n3({},r4.char,function(t37){(b3+=t37).substr(-3)==="]]>"&&(M5(a2.text,b3.slice(0,-3)),b3="",v5=s2.data)})),n3(y5,s2.tagBegin,(n3(h4={},r4.space,i2),n3(h4,r4.char,function(t37){S3=t37,v5=s2.tagName}),n3(h4,r4.slash,function(){S3="",_5=!0}),h4)),n3(y5,s2.tagName,(n3(l3={},r4.space,function(){_5?v5=s2.tagEnd:(v5=s2.attributeNameStart,M5(a2.openTag,S3))}),n3(l3,r4.gt,function(){M5(_5?a2.closeTag:a2.openTag,S3),b3="",v5=s2.data}),n3(l3,r4.slash,function(){v5=s2.tagEnd,M5(a2.openTag,S3)}),n3(l3,r4.char,function(t37){(S3+=t37)==="![CDATA["&&(v5=s2.cdata,b3="",S3="")}),l3)),n3(y5,s2.tagEnd,(n3(d3={},r4.gt,function(){M5(a2.closeTag,S3),b3="",v5=s2.data}),n3(d3,r4.char,i2),d3)),n3(y5,s2.attributeNameStart,(n3(u4={},r4.char,function(t37){I5=t37,v5=s2.attributeName}),n3(u4,r4.gt,function(){b3="",v5=s2.data}),n3(u4,r4.space,i2),n3(u4,r4.slash,function(){_5=!0,v5=s2.tagEnd}),u4)),n3(y5,s2.attributeName,(n3(p4={},r4.space,function(){v5=s2.attributeNameEnd}),n3(p4,r4.equal,function(){M5(a2.attributeName,I5),v5=s2.attributeValueBegin}),n3(p4,r4.gt,function(){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),b3="",v5=s2.data}),n3(p4,r4.slash,function(){_5=!0,P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),v5=s2.tagEnd}),n3(p4,r4.char,function(t37){I5+=t37}),p4)),n3(y5,s2.attributeNameEnd,(n3(f2={},r4.space,i2),n3(f2,r4.equal,function(){M5(a2.attributeName,I5),v5=s2.attributeValueBegin}),n3(f2,r4.gt,function(){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),b3="",v5=s2.data}),n3(f2,r4.char,function(t37){P5="",M5(a2.attributeName,I5),M5(a2.attributeValue,P5),I5=t37,v5=s2.attributeName}),f2)),n3(y5,s2.attributeValueBegin,(n3(g7={},r4.space,i2),n3(g7,r4.quote,function(t37){N6=t37,P5="",v5=s2.attributeValue}),n3(g7,r4.gt,function(){M5(a2.attributeValue,P5=""),b3="",v5=s2.data}),n3(g7,r4.char,function(t37){N6="",P5=t37,v5=s2.attributeValue}),g7)),n3(y5,s2.attributeValue,(n3(m3={},r4.space,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),v5=s2.attributeNameStart)}),n3(m3,r4.quote,function(t37){N6===t37?(M5(a2.attributeValue,P5),v5=s2.attributeNameStart):P5+=t37}),n3(m3,r4.gt,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),b3="",v5=s2.data)}),n3(m3,r4.slash,function(t37){N6?P5+=t37:(M5(a2.attributeValue,P5),_5=!0,v5=s2.tagEnd)}),n3(m3,r4.char,function(t37){P5+=t37}),m3)),y5);var C4=function(e6){t36.debug&&console.log(v5,e6);var n4=x5.stateMachine[v5],o4=n4[(function(t37){return c3[t37]||r4.char})(e6)]||n4[r4.error]||n4[r4.char];o4(e6)};return x5.write=function(t37){for(var e6=t37.length,n4=0;n4<e6;n4++)C4(t37[n4])},x5}}}}),g4=r3({"node_modules/xml-reader/dist/reader.js"(t35,e4){var n3=u3(),o3=f(),i2=o3.Type,s2={element:"element",text:"text"},r4=function(t36){return Object.assign({name:"",type:s2.element,value:"",parent:null,attributes:{},children:[]},t36)},a2=function(t36){t36=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t36);var e5=void 0,a3=void 0,c3=void 0,h4=void 0,l3=new n3,d3=function(n4){switch(n4.type){case i2.openTag:if(c3===null)(c3=a3).name=n4.value;else{var o4=r4({name:n4.value,parent:c3});c3.children.push(o4),c3=o4}break;case i2.closeTag:var d4=c3.parent;if(t36.parentNodes||(c3.parent=null),c3.name!==n4.value)break;t36.stream&&d4===a3&&(a3.children=[],c3.parent=null),t36.emitTopLevelOnly&&d4!==a3||(l3.emit(t36.tagPrefix+c3.name,c3),l3.emit("tag",c3.name,c3)),c3===a3&&(e5.removeAllListeners("data"),l3.emit(t36.doneEvent,c3),a3=null),c3=d4;break;case i2.text:c3&&c3.children.push(r4({type:s2.text,value:n4.value,parent:t36.parentNodes?c3:null}));break;case i2.attributeName:h4=n4.value,c3.attributes[h4]="";break;case i2.attributeValue:c3.attributes[h4]=n4.value}};return l3.reset=function(){(e5=o3.create({debug:t36.debug})).on("data",d3),a3=r4(),c3=null,h4="",l3.parse=e5.write},l3.reset(),l3};e4.exports={parseSync:function(t36,e5){e5=Object.assign({},e5,{stream:!1,tagPrefix:":"});var n4=a2(e5),o4=void 0;return n4.on("done",function(t37){o4=t37}),n4.parse(t36),o4},create:a2,NodeType:s2}}}),m=r3({"node_modules/binary-search-bounds/search-bounds.js"(t35,e4){function n3(t36,e5,n4,o4,i3){for(var s3=i3+1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)>=0?(s3=r5,i3=r5-1):o4=r5+1}return s3}function o3(t36,e5,n4,o4,i3){for(var s3=i3+1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)>0?(s3=r5,i3=r5-1):o4=r5+1}return s3}function i2(t36,e5,n4,o4,i3){for(var s3=o4-1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)<0?(s3=r5,o4=r5+1):i3=r5-1}return s3}function s2(t36,e5,n4,o4,i3){for(var s3=o4-1;o4<=i3;){var r5=o4+i3>>>1,a3=t36[r5];(n4!==void 0?n4(a3,e5):a3-e5)<=0?(s3=r5,o4=r5+1):i3=r5-1}return s3}function r4(t36,e5,n4,o4,i3){for(;o4<=i3;){var s3=o4+i3>>>1,r5=t36[s3],a3=n4!==void 0?n4(r5,e5):r5-e5;if(a3===0)return s3;a3<=0?o4=s3+1:i3=s3-1}return-1}function a2(t36,e5,n4,o4,i3,s3){return typeof n4=="function"?s3(t36,e5,n4,o4===void 0?0:0|o4,i3===void 0?t36.length-1:0|i3):s3(t36,e5,void 0,n4===void 0?0:0|n4,o4===void 0?t36.length-1:0|o4)}e4.exports={ge:function(t36,e5,o4,i3,s3){return a2(t36,e5,o4,i3,s3,n3)},gt:function(t36,e5,n4,i3,s3){return a2(t36,e5,n4,i3,s3,o3)},lt:function(t36,e5,n4,o4,s3){return a2(t36,e5,n4,o4,s3,i2)},le:function(t36,e5,n4,o4,i3){return a2(t36,e5,n4,o4,i3,s2)},eq:function(t36,e5,n4,o4,i3){return a2(t36,e5,n4,o4,i3,r4)}}}}),y=r3({"node_modules/two-product/two-product.js"(t35,e4){e4.exports=function(t36,e5,o3){var i2=t36*e5,s2=n3*t36,r4=s2-(s2-t36),a2=t36-r4,c3=n3*e5,h4=c3-(c3-e5),l3=e5-h4,d3=a2*l3-(i2-r4*h4-a2*h4-r4*l3);return o3?(o3[0]=d3,o3[1]=i2,o3):[d3,i2]};var n3=+(Math.pow(2,27)+1)}}),x3=r3({"node_modules/robust-sum/robust-sum.js"(t35,e4){e4.exports=function(t36,e5){var n3=0|t36.length,o3=0|e5.length;if(n3===1&&o3===1)return(function(t37,e6){var n4=t37+e6,o4=n4-t37,i3=n4-o4,s3=e6-o4,r5=t37-i3,a3=r5+s3;return a3?[a3,n4]:[n4]})(t36[0],e5[0]);var i2,s2,r4=new Array(n3+o3),a2=0,c3=0,h4=0,l3=Math.abs,d3=t36[c3],u4=l3(d3),p4=e5[h4],f2=l3(p4);u4<f2?(s2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(s2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4]))),c3<n3&&u4<f2||h4>=o3?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4])));for(var g7,m3,y5=i2+s2,x5=y5-i2,v5=s2-x5,b3=v5,S3=y5;c3<n3&&h4<o3;)u4<f2?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=e5[h4]))),(v5=(s2=b3)-(x5=(y5=i2+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7;for(;c3<n3;)(v5=(s2=b3)-(x5=(y5=(i2=d3)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(c3+=1)<n3&&(d3=t36[c3]);for(;h4<o3;)(v5=(s2=b3)-(x5=(y5=(i2=p4)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(h4+=1)<o3&&(p4=e5[h4]);return b3&&(r4[a2++]=b3),S3&&(r4[a2++]=S3),a2||(r4[a2++]=0),r4.length=a2,r4}}}),v3=r3({"node_modules/two-sum/two-sum.js"(t35,e4){e4.exports=function(t36,e5,n3){var o3=t36+e5,i2=o3-t36,s2=e5-i2,r4=t36-(o3-i2);return n3?(n3[0]=r4+s2,n3[1]=o3,n3):[r4+s2,o3]}}}),b=r3({"node_modules/robust-scale/robust-scale.js"(t35,e4){var n3=y(),o3=v3();e4.exports=function(t36,e5){var i2=t36.length;if(i2===1){var s2=n3(t36[0],e5);return s2[0]?s2:[s2[1]]}var r4=new Array(2*i2),a2=[.1,.1],c3=[.1,.1],h4=0;n3(t36[0],e5,a2),a2[0]&&(r4[h4++]=a2[0]);for(var l3=1;l3<i2;++l3){n3(t36[l3],e5,c3);var d3=a2[1];o3(d3,c3[0],a2),a2[0]&&(r4[h4++]=a2[0]);var u4=c3[1],p4=a2[1],f2=u4+p4,g7=p4-(f2-u4);a2[1]=f2,g7&&(r4[h4++]=g7)}return a2[1]&&(r4[h4++]=a2[1]),h4===0&&(r4[h4++]=0),r4.length=h4,r4}}}),S2=r3({"node_modules/robust-subtract/robust-diff.js"(t35,e4){e4.exports=function(t36,e5){var n3=0|t36.length,o3=0|e5.length;if(n3===1&&o3===1)return(function(t37,e6){var n4=t37+e6,o4=n4-t37,i3=n4-o4,s3=e6-o4,r5=t37-i3,a3=r5+s3;return a3?[a3,n4]:[n4]})(t36[0],-e5[0]);var i2,s2,r4=new Array(n3+o3),a2=0,c3=0,h4=0,l3=Math.abs,d3=t36[c3],u4=l3(d3),p4=-e5[h4],f2=l3(p4);u4<f2?(s2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(s2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4]))),c3<n3&&u4<f2||h4>=o3?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4])));for(var g7,m3,y5=i2+s2,x5=y5-i2,v5=s2-x5,b3=v5,S3=y5;c3<n3&&h4<o3;)u4<f2?(i2=d3,(c3+=1)<n3&&(u4=l3(d3=t36[c3]))):(i2=p4,(h4+=1)<o3&&(f2=l3(p4=-e5[h4]))),(v5=(s2=b3)-(x5=(y5=i2+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7;for(;c3<n3;)(v5=(s2=b3)-(x5=(y5=(i2=d3)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(c3+=1)<n3&&(d3=t36[c3]);for(;h4<o3;)(v5=(s2=b3)-(x5=(y5=(i2=p4)+s2)-i2))&&(r4[a2++]=v5),b3=S3-((g7=S3+y5)-(m3=g7-S3))+(y5-m3),S3=g7,(h4+=1)<o3&&(p4=-e5[h4]);return b3&&(r4[a2++]=b3),S3&&(r4[a2++]=S3),a2||(r4[a2++]=0),r4.length=a2,r4}}}),I3=r3({"node_modules/robust-orientation/orientation.js"(t35,e4){var n3=y(),o3=x3(),i2=b(),s2=S2();function r4(t36,e5,n4,o4){return function(n5,i3,s3){var r5=t36(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),t36(e5(n5[1],i3[0]),e5(-i3[1],n5[0]))),a3=t36(e5(n5[1],s3[0]),e5(-s3[1],n5[0])),c4=o4(r5,a3);return c4[c4.length-1]}}function a2(t36,e5,n4,o4){return function(i3,s3,r5,a3){var c4=t36(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2])))),h6=t36(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2])))),l4=o4(c4,h6);return l4[l4.length-1]}}function c3(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4){var h6=t36(t36(t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),r5[2]),t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),-a3[2]),n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),c4[2]))),s3[3]),t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-a3[2]),n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),c4[2]))),-r5[3]),n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),c4[2]))),a3[3]))),t36(n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),-c4[3]),t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-a3[2]),n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-a3[2]),n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),c4[2]))),-s3[3])))),t36(t36(n4(t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),c4[2]))),a3[3]),t36(n4(t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2]))),-c4[3]),n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),a3[2]))),i3[3]))),t36(n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),-s3[3]),t36(n4(t36(n4(t36(e5(s3[1],a3[0]),e5(-a3[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),a3[2]))),r5[3]),n4(t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2]))),-a3[3]))))),l4=t36(t36(t36(n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),r5[2]),t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),-a3[2]),n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(a3[1],c4[0]),e5(-c4[1],a3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-a3[2]),n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),c4[2]))),-r5[3])),t36(n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),c4[2]))),a3[3]),n4(t36(n4(t36(e5(r5[1],a3[0]),e5(-a3[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],a3[0]),e5(-a3[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),a3[2]))),-c4[3]))),t36(t36(n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),s3[2]),t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),-r5[2]),n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),c4[2]))),i3[3]),n4(t36(n4(t36(e5(r5[1],c4[0]),e5(-c4[1],r5[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-r5[2]),n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),c4[2]))),-s3[3])),t36(n4(t36(n4(t36(e5(s3[1],c4[0]),e5(-c4[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],c4[0]),e5(-c4[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),c4[2]))),r5[3]),n4(t36(n4(t36(e5(s3[1],r5[0]),e5(-r5[1],s3[0])),i3[2]),t36(n4(t36(e5(i3[1],r5[0]),e5(-r5[1],i3[0])),-s3[2]),n4(t36(e5(i3[1],s3[0]),e5(-s3[1],i3[0])),r5[2]))),-c4[3])))),d4=o4(h6,l4);return d4[d4.length-1]}}function h4(t36){return(t36===3?r4:t36===4?a2:c3)(o3,n3,i2,s2)}var l3=h4(3),d3=h4(4),u4=[function(){return 0},function(){return 0},function(t36,e5){return e5[0]-t36[0]},function(t36,e5,n4){var o4,i3=(t36[1]-n4[1])*(e5[0]-n4[0]),s3=(t36[0]-n4[0])*(e5[1]-n4[1]),r5=i3-s3;if(i3>0){if(s3<=0)return r5;o4=i3+s3}else{if(!(i3<0)||s3>=0)return r5;o4=-(i3+s3)}var a3=33306690738754716e-32*o4;return r5>=a3||r5<=-a3?r5:l3(t36,e5,n4)},function(t36,e5,n4,o4){var i3=t36[0]-o4[0],s3=e5[0]-o4[0],r5=n4[0]-o4[0],a3=t36[1]-o4[1],c4=e5[1]-o4[1],h6=n4[1]-o4[1],l4=t36[2]-o4[2],u5=e5[2]-o4[2],p5=n4[2]-o4[2],f3=s3*h6,g7=r5*c4,m3=r5*a3,y5=i3*h6,x5=i3*c4,v5=s3*a3,b3=l4*(f3-g7)+u5*(m3-y5)+p5*(x5-v5),S3=7771561172376103e-31*((Math.abs(f3)+Math.abs(g7))*Math.abs(l4)+(Math.abs(m3)+Math.abs(y5))*Math.abs(u5)+(Math.abs(x5)+Math.abs(v5))*Math.abs(p5));return b3>S3||-b3>S3?b3:d3(t36,e5,n4,o4)}];function p4(t36){var e5=u4[t36.length];return e5||(e5=u4[t36.length]=h4(t36.length)),e5.apply(void 0,t36)}function f2(t36,e5,n4,o4,i3,s3,r5){return function(e6,n5,a3,c4,h6){switch(arguments.length){case 0:case 1:return 0;case 2:return o4(e6,n5);case 3:return i3(e6,n5,a3);case 4:return s3(e6,n5,a3,c4);case 5:return r5(e6,n5,a3,c4,h6)}for(var l4=new Array(arguments.length),d4=0;d4<arguments.length;++d4)l4[d4]=arguments[d4];return t36(l4)}}(function(){for(;u4.length<=5;)u4.push(h4(u4.length));e4.exports=f2.apply(void 0,[p4].concat(u4));for(var t36=0;t36<=5;++t36)e4.exports[t36]=u4[t36]})()}}),P2=r3({"node_modules/cdt2d/lib/monotone.js"(t35,e4){var n3=m(),o3=I3()[3];function i2(t36,e5,n4,o4,i3){this.a=t36,this.b=e5,this.idx=n4,this.lowerIds=o4,this.upperIds=i3}function s2(t36,e5,n4,o4){this.a=t36,this.b=e5,this.type=n4,this.idx=o4}function r4(t36,e5){var n4=t36.a[0]-e5.a[0]||t36.a[1]-e5.a[1]||t36.type-e5.type;return n4||(t36.type!==0&&(n4=o3(t36.a,t36.b,e5.b))?n4:t36.idx-e5.idx)}function a2(t36,e5){return o3(t36.a,t36.b,e5)}function c3(t36,e5,i3,s3,r5){for(var c4=n3.lt(e5,s3,a2),h6=n3.gt(e5,s3,a2),l4=c4;l4<h6;++l4){for(var d4=e5[l4],u4=d4.lowerIds,p4=u4.length;p4>1&&o3(i3[u4[p4-2]],i3[u4[p4-1]],s3)>0;)t36.push([u4[p4-1],u4[p4-2],r5]),p4-=1;u4.length=p4,u4.push(r5);var f2=d4.upperIds;for(p4=f2.length;p4>1&&o3(i3[f2[p4-2]],i3[f2[p4-1]],s3)<0;)t36.push([f2[p4-2],f2[p4-1],r5]),p4-=1;f2.length=p4,f2.push(r5)}}function h4(t36,e5){var n4;return(n4=t36.a[0]<e5.a[0]?o3(t36.a,t36.b,e5.a):o3(e5.b,e5.a,t36.a))?n4:(n4=e5.b[0]<t36.b[0]?o3(t36.a,t36.b,e5.b):o3(e5.b,e5.a,t36.b))||t36.idx-e5.idx}function l3(t36,e5,o4){var s3=n3.le(t36,o4,h4),r5=t36[s3],a3=r5.upperIds,c4=a3[a3.length-1];r5.upperIds=[c4],t36.splice(s3+1,0,new i2(o4.a,o4.b,o4.idx,[c4],a3))}function d3(t36,e5,o4){var i3=o4.a;o4.a=o4.b,o4.b=i3;var s3=n3.eq(t36,o4,h4),r5=t36[s3];t36[s3-1].upperIds=r5.upperIds,t36.splice(s3,1)}e4.exports=function(t36,e5){for(var n4=t36.length,o4=e5.length,a3=[],h6=0;h6<n4;++h6)a3.push(new s2(t36[h6],null,0,h6));for(h6=0;h6<o4;++h6){var u4=e5[h6],p4=t36[u4[0]],f2=t36[u4[1]];p4[0]<f2[0]?a3.push(new s2(p4,f2,2,h6),new s2(f2,p4,1,h6)):p4[0]>f2[0]&&a3.push(new s2(f2,p4,2,h6),new s2(p4,f2,1,h6))}a3.sort(r4);for(var g7=a3[0].a[0]-(1+Math.abs(a3[0].a[0]))*Math.pow(2,-52),m3=[new i2([g7,1],[g7,0],-1,[],[],[],[])],y5=[],x5=(h6=0,a3.length);h6<x5;++h6){var v5=a3[h6],b3=v5.type;b3===0?c3(y5,m3,t36,v5.a,v5.idx):b3===2?l3(m3,t36,v5):d3(m3,t36,v5)}return y5}}}),_3=r3({"node_modules/cdt2d/lib/triangulation.js"(t35,e4){var n3=m();function o3(t36,e5){this.stars=t36,this.edges=e5}e4.exports=function(t36,e5){for(var n4=new Array(t36),i3=0;i3<t36;++i3)n4[i3]=[];return new o3(n4,e5)};var i2=o3.prototype;function s2(t36,e5,n4){for(var o4=1,i3=t36.length;o4<i3;o4+=2)if(t36[o4-1]===e5&&t36[o4]===n4)return t36[o4-1]=t36[i3-2],t36[o4]=t36[i3-1],void(t36.length=i3-2)}i2.isConstraint=(function(){var t36=[0,0];function e5(t37,e6){return t37[0]-e6[0]||t37[1]-e6[1]}return function(o4,i3){return t36[0]=Math.min(o4,i3),t36[1]=Math.max(o4,i3),n3.eq(this.edges,t36,e5)>=0}})(),i2.removeTriangle=function(t36,e5,n4){var o4=this.stars;s2(o4[t36],e5,n4),s2(o4[e5],n4,t36),s2(o4[n4],t36,e5)},i2.addTriangle=function(t36,e5,n4){var o4=this.stars;o4[t36].push(e5,n4),o4[e5].push(n4,t36),o4[n4].push(t36,e5)},i2.opposite=function(t36,e5){for(var n4=this.stars[e5],o4=1,i3=n4.length;o4<i3;o4+=2)if(n4[o4]===t36)return n4[o4-1];return-1},i2.flip=function(t36,e5){var n4=this.opposite(t36,e5),o4=this.opposite(e5,t36);this.removeTriangle(t36,e5,n4),this.removeTriangle(e5,t36,o4),this.addTriangle(t36,o4,n4),this.addTriangle(e5,n4,o4)},i2.edges=function(){for(var t36=this.stars,e5=[],n4=0,o4=t36.length;n4<o4;++n4)for(var i3=t36[n4],s3=0,r4=i3.length;s3<r4;s3+=2)e5.push([i3[s3],i3[s3+1]]);return e5},i2.cells=function(){for(var t36=this.stars,e5=[],n4=0,o4=t36.length;n4<o4;++n4)for(var i3=t36[n4],s3=0,r4=i3.length;s3<r4;s3+=2){var a2=i3[s3],c3=i3[s3+1];n4<Math.min(a2,c3)&&e5.push([n4,a2,c3])}return e5}}}),N3=r3({"node_modules/robust-in-sphere/in-sphere.js"(t35,e4){var n3=y(),o3=x3(),i2=S2(),s2=b();function r4(t36){return(t36===3?a2:t36===4?c3:t36===5?h4:l3)(o3,i2,n3,s2)}function a2(t36,e5,n4,o4){return function(i3,s3,r5){var a3=n4(i3[0],i3[0]),c4=o4(a3,s3[0]),h6=o4(a3,r5[0]),l4=n4(s3[0],s3[0]),d4=o4(l4,i3[0]),u5=o4(l4,r5[0]),p5=n4(r5[0],r5[0]),f2=o4(p5,i3[0]),g7=o4(p5,s3[0]),m3=t36(e5(g7,u5),e5(d4,c4)),y5=e5(f2,h6),x5=e5(m3,y5);return x5[x5.length-1]}}function c3(t36,e5,n4,o4){return function(i3,s3,r5,a3){var c4=t36(n4(i3[0],i3[0]),n4(i3[1],i3[1])),h6=o4(c4,s3[0]),l4=o4(c4,r5[0]),d4=o4(c4,a3[0]),u5=t36(n4(s3[0],s3[0]),n4(s3[1],s3[1])),p5=o4(u5,i3[0]),f2=o4(u5,r5[0]),g7=o4(u5,a3[0]),m3=t36(n4(r5[0],r5[0]),n4(r5[1],r5[1])),y5=o4(m3,i3[0]),x5=o4(m3,s3[0]),v5=o4(m3,a3[0]),b3=t36(n4(a3[0],a3[0]),n4(a3[1],a3[1])),S3=o4(b3,i3[0]),I5=o4(b3,s3[0]),P5=o4(b3,r5[0]),_5=t36(t36(o4(e5(P5,v5),s3[1]),t36(o4(e5(I5,g7),-r5[1]),o4(e5(x5,f2),a3[1]))),t36(o4(e5(I5,g7),i3[1]),t36(o4(e5(S3,d4),-s3[1]),o4(e5(p5,h6),a3[1])))),N6=t36(t36(o4(e5(P5,v5),i3[1]),t36(o4(e5(S3,d4),-r5[1]),o4(e5(y5,l4),a3[1]))),t36(o4(e5(x5,f2),i3[1]),t36(o4(e5(y5,l4),-s3[1]),o4(e5(p5,h6),r5[1])))),M5=e5(_5,N6);return M5[M5.length-1]}}function h4(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4){var h6=t36(n4(i3[0],i3[0]),t36(n4(i3[1],i3[1]),n4(i3[2],i3[2]))),l4=o4(h6,s3[0]),d4=o4(h6,r5[0]),u5=o4(h6,a3[0]),p5=o4(h6,c4[0]),f2=t36(n4(s3[0],s3[0]),t36(n4(s3[1],s3[1]),n4(s3[2],s3[2]))),g7=o4(f2,i3[0]),m3=o4(f2,r5[0]),y5=o4(f2,a3[0]),x5=o4(f2,c4[0]),v5=t36(n4(r5[0],r5[0]),t36(n4(r5[1],r5[1]),n4(r5[2],r5[2]))),b3=o4(v5,i3[0]),S3=o4(v5,s3[0]),I5=o4(v5,a3[0]),P5=o4(v5,c4[0]),_5=t36(n4(a3[0],a3[0]),t36(n4(a3[1],a3[1]),n4(a3[2],a3[2]))),N6=o4(_5,i3[0]),M5=o4(_5,s3[0]),C4=o4(_5,r5[0]),T7=o4(_5,c4[0]),E5=t36(n4(c4[0],c4[0]),t36(n4(c4[1],c4[1]),n4(c4[2],c4[2]))),R5=o4(E5,i3[0]),w4=o4(E5,s3[0]),A4=o4(E5,r5[0]),O5=o4(E5,a3[0]),L4=t36(t36(t36(o4(t36(o4(e5(O5,T7),r5[1]),t36(o4(e5(A4,P5),-a3[1]),o4(e5(C4,I5),c4[1]))),s3[2]),t36(o4(t36(o4(e5(O5,T7),s3[1]),t36(o4(e5(w4,x5),-a3[1]),o4(e5(M5,y5),c4[1]))),-r5[2]),o4(t36(o4(e5(A4,P5),s3[1]),t36(o4(e5(w4,x5),-r5[1]),o4(e5(S3,m3),c4[1]))),a3[2]))),t36(o4(t36(o4(e5(C4,I5),s3[1]),t36(o4(e5(M5,y5),-r5[1]),o4(e5(S3,m3),a3[1]))),-c4[2]),t36(o4(t36(o4(e5(O5,T7),s3[1]),t36(o4(e5(w4,x5),-a3[1]),o4(e5(M5,y5),c4[1]))),i3[2]),o4(t36(o4(e5(O5,T7),i3[1]),t36(o4(e5(R5,p5),-a3[1]),o4(e5(N6,u5),c4[1]))),-s3[2])))),t36(t36(o4(t36(o4(e5(w4,x5),i3[1]),t36(o4(e5(R5,p5),-s3[1]),o4(e5(g7,l4),c4[1]))),a3[2]),t36(o4(t36(o4(e5(M5,y5),i3[1]),t36(o4(e5(N6,u5),-s3[1]),o4(e5(g7,l4),a3[1]))),-c4[2]),o4(t36(o4(e5(C4,I5),s3[1]),t36(o4(e5(M5,y5),-r5[1]),o4(e5(S3,m3),a3[1]))),i3[2]))),t36(o4(t36(o4(e5(C4,I5),i3[1]),t36(o4(e5(N6,u5),-r5[1]),o4(e5(b3,d4),a3[1]))),-s3[2]),t36(o4(t36(o4(e5(M5,y5),i3[1]),t36(o4(e5(N6,u5),-s3[1]),o4(e5(g7,l4),a3[1]))),r5[2]),o4(t36(o4(e5(S3,m3),i3[1]),t36(o4(e5(b3,d4),-s3[1]),o4(e5(g7,l4),r5[1]))),-a3[2]))))),z5=t36(t36(t36(o4(t36(o4(e5(O5,T7),r5[1]),t36(o4(e5(A4,P5),-a3[1]),o4(e5(C4,I5),c4[1]))),i3[2]),o4(t36(o4(e5(O5,T7),i3[1]),t36(o4(e5(R5,p5),-a3[1]),o4(e5(N6,u5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(A4,P5),i3[1]),t36(o4(e5(R5,p5),-r5[1]),o4(e5(b3,d4),c4[1]))),a3[2]),o4(t36(o4(e5(C4,I5),i3[1]),t36(o4(e5(N6,u5),-r5[1]),o4(e5(b3,d4),a3[1]))),-c4[2]))),t36(t36(o4(t36(o4(e5(A4,P5),s3[1]),t36(o4(e5(w4,x5),-r5[1]),o4(e5(S3,m3),c4[1]))),i3[2]),o4(t36(o4(e5(A4,P5),i3[1]),t36(o4(e5(R5,p5),-r5[1]),o4(e5(b3,d4),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(w4,x5),i3[1]),t36(o4(e5(R5,p5),-s3[1]),o4(e5(g7,l4),c4[1]))),r5[2]),o4(t36(o4(e5(S3,m3),i3[1]),t36(o4(e5(b3,d4),-s3[1]),o4(e5(g7,l4),r5[1]))),-c4[2])))),D6=e5(L4,z5);return D6[D6.length-1]}}function l3(t36,e5,n4,o4){return function(i3,s3,r5,a3,c4,h6){var l4=t36(t36(n4(i3[0],i3[0]),n4(i3[1],i3[1])),t36(n4(i3[2],i3[2]),n4(i3[3],i3[3]))),d4=o4(l4,s3[0]),u5=o4(l4,r5[0]),p5=o4(l4,a3[0]),f2=o4(l4,c4[0]),g7=o4(l4,h6[0]),m3=t36(t36(n4(s3[0],s3[0]),n4(s3[1],s3[1])),t36(n4(s3[2],s3[2]),n4(s3[3],s3[3]))),y5=o4(m3,i3[0]),x5=o4(m3,r5[0]),v5=o4(m3,a3[0]),b3=o4(m3,c4[0]),S3=o4(m3,h6[0]),I5=t36(t36(n4(r5[0],r5[0]),n4(r5[1],r5[1])),t36(n4(r5[2],r5[2]),n4(r5[3],r5[3]))),P5=o4(I5,i3[0]),_5=o4(I5,s3[0]),N6=o4(I5,a3[0]),M5=o4(I5,c4[0]),C4=o4(I5,h6[0]),T7=t36(t36(n4(a3[0],a3[0]),n4(a3[1],a3[1])),t36(n4(a3[2],a3[2]),n4(a3[3],a3[3]))),E5=o4(T7,i3[0]),R5=o4(T7,s3[0]),w4=o4(T7,r5[0]),A4=o4(T7,c4[0]),O5=o4(T7,h6[0]),L4=t36(t36(n4(c4[0],c4[0]),n4(c4[1],c4[1])),t36(n4(c4[2],c4[2]),n4(c4[3],c4[3]))),z5=o4(L4,i3[0]),D6=o4(L4,s3[0]),Y6=o4(L4,r5[0]),X6=o4(L4,a3[0]),F6=o4(L4,h6[0]),k4=t36(t36(n4(h6[0],h6[0]),n4(h6[1],h6[1])),t36(n4(h6[2],h6[2]),n4(h6[3],h6[3]))),B5=o4(k4,i3[0]),$7=o4(k4,s3[0]),j4=o4(k4,r5[0]),W5=o4(k4,a3[0]),H4=o4(k4,c4[0]),V4=t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),r5[2]),o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),-h6[2]))),s3[3]),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-h6[2]))),-r5[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),-h6[2]))),a3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),s3[2]),o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-h6[2]))),-c4[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),s3[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-c4[2]))),h6[3])),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-h6[2]))),i3[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-h6[2]))),-s3[3])))),t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),c4[2]),o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),-h6[2]))),a3[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-h6[2]))),-c4[3])),t36(o4(t36(t36(o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-c4[2]))),h6[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),s3[2]),o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-h6[2]))),i3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-h6[2]))),-s3[3]),o4(t36(t36(o4(t36(o4(e5(W5,O5),s3[1]),t36(o4(e5($7,S3),-a3[1]),o4(e5(R5,v5),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-h6[2]))),r5[3])),t36(o4(t36(t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),i3[2]),o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-h6[2]))),-a3[3]),o4(t36(t36(o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),i3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-s3[2])),t36(o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-a3[2]))),h6[3]))))),U4=t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),r5[2]),o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),-h6[2]))),i3[3]),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),a3[1]),t36(o4(e5(W5,O5),-c4[1]),o4(e5(X6,A4),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-a3[2])),t36(o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),c4[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-h6[2]))),-r5[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-h6[2]))),a3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(W5,O5),r5[1]),t36(o4(e5(j4,C4),-a3[1]),o4(e5(w4,N6),h6[1]))),i3[2]),o4(t36(o4(e5(W5,O5),i3[1]),t36(o4(e5(B5,g7),-a3[1]),o4(e5(E5,p5),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-h6[2]))),-c4[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-c4[2]))),h6[3])),t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),s3[2]),o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),-h6[2]))),i3[3]),o4(t36(t36(o4(t36(o4(e5(H4,F6),r5[1]),t36(o4(e5(j4,C4),-c4[1]),o4(e5(Y6,M5),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-r5[2])),t36(o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),c4[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-h6[2]))),-s3[3])))),t36(t36(t36(o4(t36(t36(o4(t36(o4(e5(H4,F6),s3[1]),t36(o4(e5($7,S3),-c4[1]),o4(e5(D6,b3),h6[1]))),i3[2]),o4(t36(o4(e5(H4,F6),i3[1]),t36(o4(e5(B5,g7),-c4[1]),o4(e5(z5,f2),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),c4[2]),o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),-h6[2]))),r5[3]),o4(t36(t36(o4(t36(o4(e5(j4,C4),s3[1]),t36(o4(e5($7,S3),-r5[1]),o4(e5(_5,x5),h6[1]))),i3[2]),o4(t36(o4(e5(j4,C4),i3[1]),t36(o4(e5(B5,g7),-r5[1]),o4(e5(P5,u5),h6[1]))),-s3[2])),t36(o4(t36(o4(e5($7,S3),i3[1]),t36(o4(e5(B5,g7),-s3[1]),o4(e5(y5,d4),h6[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-h6[2]))),-c4[3])),t36(o4(t36(t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),i3[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-c4[2]))),h6[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),s3[2]),o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),-c4[2]))),i3[3]))),t36(t36(o4(t36(t36(o4(t36(o4(e5(X6,A4),r5[1]),t36(o4(e5(Y6,M5),-a3[1]),o4(e5(w4,N6),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-r5[2])),t36(o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),a3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-c4[2]))),-s3[3]),o4(t36(t36(o4(t36(o4(e5(X6,A4),s3[1]),t36(o4(e5(D6,b3),-a3[1]),o4(e5(R5,v5),c4[1]))),i3[2]),o4(t36(o4(e5(X6,A4),i3[1]),t36(o4(e5(z5,f2),-a3[1]),o4(e5(E5,p5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),a3[2]),o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),-c4[2]))),r5[3])),t36(o4(t36(t36(o4(t36(o4(e5(Y6,M5),s3[1]),t36(o4(e5(D6,b3),-r5[1]),o4(e5(_5,x5),c4[1]))),i3[2]),o4(t36(o4(e5(Y6,M5),i3[1]),t36(o4(e5(z5,f2),-r5[1]),o4(e5(P5,u5),c4[1]))),-s3[2])),t36(o4(t36(o4(e5(D6,b3),i3[1]),t36(o4(e5(z5,f2),-s3[1]),o4(e5(y5,d4),c4[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-c4[2]))),-a3[3]),o4(t36(t36(o4(t36(o4(e5(w4,N6),s3[1]),t36(o4(e5(R5,v5),-r5[1]),o4(e5(_5,x5),a3[1]))),i3[2]),o4(t36(o4(e5(w4,N6),i3[1]),t36(o4(e5(E5,p5),-r5[1]),o4(e5(P5,u5),a3[1]))),-s3[2])),t36(o4(t36(o4(e5(R5,v5),i3[1]),t36(o4(e5(E5,p5),-s3[1]),o4(e5(y5,d4),a3[1]))),r5[2]),o4(t36(o4(e5(_5,x5),i3[1]),t36(o4(e5(P5,u5),-s3[1]),o4(e5(y5,d4),r5[1]))),-a3[2]))),c4[3]))))),G5=e5(V4,U4);return G5[G5.length-1]}}var d3=[function(){return 0},function(){return 0},function(){return 0}];function u4(t36){var e5=d3[t36.length];return e5||(e5=d3[t36.length]=r4(t36.length)),e5.apply(void 0,t36)}function p4(t36,e5,n4,o4,i3,s3,r5,a3){return function(e6,n5,c4,h6,l4,d4){switch(arguments.length){case 0:case 1:return 0;case 2:return o4(e6,n5);case 3:return i3(e6,n5,c4);case 4:return s3(e6,n5,c4,h6);case 5:return r5(e6,n5,c4,h6,l4);case 6:return a3(e6,n5,c4,h6,l4,d4)}for(var u5=new Array(arguments.length),p5=0;p5<arguments.length;++p5)u5[p5]=arguments[p5];return t36(u5)}}(function(){for(;d3.length<=6;)d3.push(r4(d3.length));e4.exports=p4.apply(void 0,[u4].concat(d3));for(var t36=0;t36<=6;++t36)e4.exports[t36]=d3[t36]})()}}),M3=r3({"node_modules/cdt2d/lib/delaunay.js"(t35,e4){var n3=N3()[4];m();function o3(t36,e5,o4,i2,s2,r4){var a2=e5.opposite(i2,s2);if(!(a2<0)){if(s2<i2){var c3=i2;i2=s2,s2=c3,c3=r4,r4=a2,a2=c3}e5.isConstraint(i2,s2)||n3(t36[i2],t36[s2],t36[r4],t36[a2])<0&&o4.push(i2,s2)}}e4.exports=function(t36,e5){for(var i2=[],s2=t36.length,r4=e5.stars,a2=0;a2<s2;++a2)for(var c3=r4[a2],h4=1;h4<c3.length;h4+=2)if(!((p4=c3[h4])<a2)&&!e5.isConstraint(a2,p4)){for(var l3=c3[h4-1],d3=-1,u4=1;u4<c3.length;u4+=2)if(c3[u4-1]===p4){d3=c3[u4];break}d3<0||n3(t36[a2],t36[p4],t36[l3],t36[d3])<0&&i2.push(a2,p4)}for(;i2.length>0;){for(var p4=i2.pop(),f2=(l3=-1,d3=-1,c3=r4[a2=i2.pop()],1);f2<c3.length;f2+=2){var g7=c3[f2-1],m3=c3[f2];g7===p4?d3=m3:m3===p4&&(l3=g7)}l3<0||d3<0||n3(t36[a2],t36[p4],t36[l3],t36[d3])>=0||(e5.flip(a2,p4),o3(t36,e5,i2,l3,a2,d3),o3(t36,e5,i2,a2,d3,l3),o3(t36,e5,i2,d3,p4,l3),o3(t36,e5,i2,p4,l3,d3))}}}}),C3=r3({"node_modules/cdt2d/lib/filter.js"(t35,e4){var n3=m();function o3(t36,e5,n4,o4,i3,s2,r4){this.cells=t36,this.neighbor=e5,this.flags=o4,this.constraint=n4,this.active=i3,this.next=s2,this.boundary=r4}function i2(t36,e5){return t36[0]-e5[0]||t36[1]-e5[1]||t36[2]-e5[2]}e4.exports=function(t36,e5,n4){var s2=(function(t37,e6){for(var n5=t37.cells(),s3=n5.length,r5=0;r5<s3;++r5){var a3=(y6=n5[r5])[0],c4=y6[1],h6=y6[2];c4<h6?c4<a3&&(y6[0]=c4,y6[1]=h6,y6[2]=a3):h6<a3&&(y6[0]=h6,y6[1]=a3,y6[2]=c4)}n5.sort(i2);var l4=new Array(s3);for(r5=0;r5<l4.length;++r5)l4[r5]=0;var d4=[],u5=[],p5=new Array(3*s3),f3=new Array(3*s3),g8=null;e6&&(g8=[]);var m4=new o3(n5,p5,f3,l4,d4,u5,g8);for(r5=0;r5<s3;++r5)for(var y6=n5[r5],x5=0;x5<3;++x5){a3=y6[x5],c4=y6[(x5+1)%3];var v5=p5[3*r5+x5]=m4.locate(c4,a3,t37.opposite(c4,a3)),b3=f3[3*r5+x5]=t37.isConstraint(a3,c4);v5<0&&(b3?u5.push(r5):(d4.push(r5),l4[r5]=1),e6&&g8.push([c4,a3,-1]))}return m4})(t36,n4);if(e5===0)return n4?s2.cells.concat(s2.boundary):s2.cells;for(var r4=1,a2=s2.active,c3=s2.next,h4=s2.flags,l3=s2.cells,d3=s2.constraint,u4=s2.neighbor;a2.length>0||c3.length>0;){for(;a2.length>0;){var p4=a2.pop();if(h4[p4]!==-r4){h4[p4]=r4,l3[p4];for(var f2=0;f2<3;++f2){var g7=u4[3*p4+f2];g7>=0&&h4[g7]===0&&(d3[3*p4+f2]?c3.push(g7):(a2.push(g7),h4[g7]=r4))}}}var m3=c3;c3=a2,a2=m3,c3.length=0,r4=-r4}var y5=(function(t37,e6,n5){for(var o4=0,i3=0;i3<t37.length;++i3)e6[i3]===n5&&(t37[o4++]=t37[i3]);return t37.length=o4,t37})(l3,h4,e5);return n4?y5.concat(s2.boundary):y5},o3.prototype.locate=(function(){var t36=[0,0,0];return function(e5,o4,s2){var r4=e5,a2=o4,c3=s2;return o4<s2?o4<e5&&(r4=o4,a2=s2,c3=e5):s2<e5&&(r4=s2,a2=e5,c3=o4),r4<0?-1:(t36[0]=r4,t36[1]=a2,t36[2]=c3,n3.eq(this.cells,t36,i2))}})()}}),T3=r3({"node_modules/cdt2d/cdt2d.js"(t35,e4){var n3=P2(),o3=_3(),i2=M3(),s2=C3();function r4(t36){return[Math.min(t36[0],t36[1]),Math.max(t36[0],t36[1])]}function a2(t36,e5){return t36[0]-e5[0]||t36[1]-e5[1]}function c3(t36,e5,n4){return e5 in t36?t36[e5]:n4}e4.exports=function(t36,e5,h4){Array.isArray(e5)?(h4=h4||{},e5=e5||[]):(h4=e5||{},e5=[]);var l3=!!c3(h4,"delaunay",!0),d3=!!c3(h4,"interior",!0),u4=!!c3(h4,"exterior",!0),p4=!!c3(h4,"infinity",!1);if(!d3&&!u4||t36.length===0)return[];var f2=n3(t36,e5);if(l3||d3!==u4||p4){for(var g7=o3(t36.length,(function(t37){return t37.map(r4).sort(a2)})(e5)),m3=0;m3<f2.length;++m3){var y5=f2[m3];g7.addTriangle(y5[0],y5[1],y5[2])}return l3&&i2(t36,g7),u4?d3?p4?s2(g7,0,p4):g7.cells():s2(g7,1,p4):s2(g7,-1)}return f2}}});function E2(t35,e4){return Array.isArray(e4)?[t35.a*e4[0]+t35.c*e4[1]+t35.e,t35.b*e4[0]+t35.d*e4[1]+t35.f]:{x:t35.a*e4.x+t35.c*e4.y+t35.e,y:t35.b*e4.x+t35.d*e4.y+t35.f}}function R2(t35,e4=0){return{a:1,c:0,e:t35,b:0,d:1,f:e4}}var{cos:w3,sin:A3,PI:O2}=Math,{tan:L2}=Math;a(d()),a(g4());function z3(t35,e4){if(t35.points)for(let n3 of t35.points)n3.step=e4;if(t35.lines)for(let n3 of t35.lines)n3.step=e4;if(t35.infiniteLines)for(let n3 of t35.infiniteLines)n3.step=e4;if(t35.polygons)for(let n3 of t35.polygons)n3.step=e4;if(t35.rects)for(let n3 of t35.rects)n3.step=e4;if(t35.circles)for(let n3 of t35.circles)n3.step=e4;if(t35.texts)for(let n3 of t35.texts)n3.step=e4;return t35}var D3=(t35,e4)=>({...t35,rects:[...t35.rects??[],...e4.rects??[]],points:[...t35.points??[],...e4.points??[]],lines:[...t35.lines??[],...e4.lines??[]],infiniteLines:[...t35.infiniteLines??[],...e4.infiniteLines??[]],polygons:[...t35.polygons??[],...e4.polygons??[]],circles:[...t35.circles??[],...e4.circles??[]],arrows:[...t35.arrows??[],...e4.arrows??[]],texts:[...t35.texts??[],...e4.texts??[]]}),Y3=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e5);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"_setupDone",!1)}getSolverName(){return this.constructor.name}setup(){this._setupDone||(this._setup(),this._setupDone=!0)}_setup(){}step(){if(this._setupDone||this.setup(),!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(t35){throw this.error=`${this.getSolverName()} error: ${t35}`,this.failed=!0,t35}!this.solved&&this.iterations>=this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>=this.MAX_ITERATIONS&&(this.error=`${this.getSolverName()} ran out of iterations`,this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}getOutput(){return null}solve(){let t35=Date.now();for(;!this.solved&&!this.failed;)this.step();let e4=Date.now();this.timeToSolve=e4-t35}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};function X3(t35,e4,n3,o3={}){return{solverName:t35,solverClass:e4,getConstructorParams:n3,onSolved:o3.onSolved}}var F3=class extends Y3{constructor(t35){super();__publicField(this,"startTimeOfStage",{});__publicField(this,"endTimeOfStage",{});__publicField(this,"timeSpentOnStage",{});__publicField(this,"firstIterationOfStage",{});__publicField(this,"currentPipelineStageIndex",0);__publicField(this,"inputProblem");__publicField(this,"pipelineOutputs",{});this.inputProblem=t35,this.MAX_ITERATIONS=1e6}_step(){let t35=this.pipelineDef[this.currentPipelineStageIndex];if(!t35)return void(this.solved=!0);if(this.activeSubSolver){if(this.activeSubSolver.step(),this.activeSubSolver.solved){this.endTimeOfStage[t35.solverName]=performance.now(),this.timeSpentOnStage[t35.solverName]=this.endTimeOfStage[t35.solverName]-this.startTimeOfStage[t35.solverName];let e5=this.activeSubSolver.getOutput();e5!==null&&(this.pipelineOutputs[t35.solverName]=e5),t35.onSolved?.(this),this.activeSubSolver=null,this.currentPipelineStageIndex++}else this.activeSubSolver.failed&&(this.error=this.activeSubSolver?.error,this.failed=!0,this.activeSubSolver=null);return}let e4=t35.getConstructorParams(this);this.activeSubSolver=new t35.solverClass(...e4),this[t35.solverName]=this.activeSubSolver,this.timeSpentOnStage[t35.solverName]=0,this.startTimeOfStage[t35.solverName]=performance.now(),this.firstIterationOfStage[t35.solverName]=this.iterations}solveUntilStage(t35){for(;this.getCurrentStageName().toLowerCase()!==t35.toLowerCase()&&(this.step(),!this.failed&&!this.solved););}getCurrentStageName(){return this.pipelineDef[this.currentPipelineStageIndex]?.solverName??"none"}getStageProgress(){let t35=this.pipelineDef.length;if(t35===0)return 1;let e4=this.activeSubSolver?.progress??0;return(this.currentPipelineStageIndex+e4)/t35}getStageStats(){let t35={};for(let e4 of this.pipelineDef){let n3=this.timeSpentOnStage[e4.solverName]||0,o3=this.firstIterationOfStage[e4.solverName]||0,i2=this.iterations,s2=e4.solverName===this.getCurrentStageName()?i2-o3:0,r4=this.currentPipelineStageIndex>this.pipelineDef.findIndex(t36=>t36.solverName===e4.solverName);t35[e4.solverName]={timeSpent:n3,iterations:s2,completed:r4}}return t35}initialVisualize(){return null}finalVisualize(){return null}visualize(){if(!this.solved&&this.activeSubSolver)return this.activeSubSolver.visualize();let t35=0,e4=this.initialVisualize();e4&&(z3(e4,0),t35=1);let n3=null;this.solved&&(n3=this.finalVisualize());let o3=[e4].filter(Boolean).concat(this.pipelineDef.map((e5,n4)=>{let o4=this[e5.solverName],i2=o4?.visualize();return i2?(z3(i2,n4+t35),i2):null}).filter(Boolean));return o3.length===0?{points:[],rects:[],lines:[],circles:[],texts:[]}:(this.solved&&n3&&(z3(n3,o3.length+t35+1),o3.push(n3)),o3.length===1?o3[0]:{points:o3.flatMap(t36=>t36.points||[]),rects:o3.flatMap(t36=>t36.rects||[]),lines:o3.flatMap(t36=>t36.lines||[]),circles:o3.flatMap(t36=>t36.circles||[]),texts:o3.flatMap(t36=>t36.texts||[])})}preview(){return this.activeSubSolver?this.activeSubSolver.preview():super.preview()}computeProgress(){return this.getStageProgress()}getStageOutput(t35){return this.pipelineOutputs[t35]}getAllOutputs(){return{...this.pipelineOutputs}}hasStageOutput(t35){return t35 in this.pipelineOutputs}getSolver(t35){return this[t35]}},k3=class{constructor(){this.ids=[],this.values=[],this.length=0}clear(){this.length=0}push(t35,e4){let n3=this.length++;for(;n3>0;){let t36=n3-1>>1,o3=this.values[t36];if(e4>=o3)break;this.ids[n3]=this.ids[t36],this.values[n3]=o3,n3=t36}this.ids[n3]=t35,this.values[n3]=e4}pop(){if(this.length===0)return;let t35=this.ids,e4=this.values,n3=t35[0],o3=--this.length;if(o3>0){let n4=t35[o3],i2=e4[o3],s2=0,r4=o3>>1;for(;s2<r4;){let n5=1+(s2<<1),r5=n5+1,a2=n5+(+(r5<o3)&+(e4[r5]<e4[n5]));if(e4[a2]>=i2)break;t35[s2]=t35[a2],e4[s2]=e4[a2],s2=a2}t35[s2]=n4,e4[s2]=i2}return n3}peek(){return this.length>0?this.ids[0]:void 0}peekValue(){return this.length>0?this.values[0]:void 0}shrink(){this.ids.length=this.values.length=this.length}},B3=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],$4=class t3{static from(e4,n3=0){if(n3%8!=0)throw new Error("byteOffset must be 8-byte aligned.");if(!e4||e4.byteLength===void 0||e4.buffer)throw new Error("Data must be an instance of ArrayBuffer or SharedArrayBuffer.");let[o3,i2]=new Uint8Array(e4,n3+0,2);if(o3!==251)throw new Error("Data does not appear to be in a Flatbush format.");let s2=i2>>4;if(s2!==3)throw new Error(`Got v${s2} data when expected v3.`);let r4=B3[15&i2];if(!r4)throw new Error("Unrecognized array type.");let[a2]=new Uint16Array(e4,n3+2,1),[c3]=new Uint32Array(e4,n3+4,1);return new t3(c3,a2,r4,void 0,e4,n3)}constructor(t35,e4=16,n3=Float64Array,o3=ArrayBuffer,i2,s2=0){if(t35===void 0)throw new Error("Missing required argument: numItems.");if(isNaN(t35)||t35<=0)throw new Error(`Unexpected numItems value: ${t35}.`);this.numItems=+t35,this.nodeSize=Math.min(Math.max(+e4,2),65535),this.byteOffset=s2;let r4=t35,a2=r4;this._levelBounds=[4*r4];do r4=Math.ceil(r4/this.nodeSize),a2+=r4,this._levelBounds.push(4*a2);while(r4!==1);this.ArrayType=n3,this.IndexArrayType=a2<16384?Uint16Array:Uint32Array;let c3=B3.indexOf(n3),h4=4*a2*n3.BYTES_PER_ELEMENT;if(c3<0)throw new Error(`Unexpected typed array class: ${n3}.`);if(i2)this.data=i2,this._boxes=new n3(i2,s2+8,4*a2),this._indices=new this.IndexArrayType(i2,s2+8+h4,a2),this._pos=4*a2,this.minX=this._boxes[this._pos-4],this.minY=this._boxes[this._pos-3],this.maxX=this._boxes[this._pos-2],this.maxY=this._boxes[this._pos-1];else{let i3=this.data=new o3(8+h4+a2*this.IndexArrayType.BYTES_PER_ELEMENT);this._boxes=new n3(i3,8,4*a2),this._indices=new this.IndexArrayType(i3,8+h4,a2),this._pos=0,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,new Uint8Array(i3,0,2).set([251,48+c3]),new Uint16Array(i3,2,1)[0]=e4,new Uint32Array(i3,4,1)[0]=t35}this._queue=new k3}add(t35,e4,n3=t35,o3=e4){let i2=this._pos>>2,s2=this._boxes;return this._indices[i2]=i2,s2[this._pos++]=t35,s2[this._pos++]=e4,s2[this._pos++]=n3,s2[this._pos++]=o3,t35<this.minX&&(this.minX=t35),e4<this.minY&&(this.minY=e4),n3>this.maxX&&(this.maxX=n3),o3>this.maxY&&(this.maxY=o3),i2}finish(){if(this._pos>>2!==this.numItems)throw new Error(`Added ${this._pos>>2} items when expected ${this.numItems}.`);let t35=this._boxes;if(this.numItems<=this.nodeSize)return t35[this._pos++]=this.minX,t35[this._pos++]=this.minY,t35[this._pos++]=this.maxX,void(t35[this._pos++]=this.maxY);let e4=this.maxX-this.minX||1,n3=this.maxY-this.minY||1,o3=new Uint32Array(this.numItems);for(let i2=0,s2=0;i2<this.numItems;i2++){let r4=t35[s2++],a2=t35[s2++],c3=t35[s2++],h4=t35[s2++],l3=Math.floor(65535*((r4+c3)/2-this.minX)/e4),d3=Math.floor(65535*((a2+h4)/2-this.minY)/n3);o3[i2]=H3(l3,d3)}(function(t36,e5,n4,o4,i2,s2){let r4=[o4,i2];for(;r4.length;){let o6=r4.pop()||0,i3=r4.pop()||0;if(o6-i3<=s2&&Math.floor(i3/s2)>=Math.floor(o6/s2))continue;let a2=t36[i3],c3=t36[i3+o6>>1],h4=t36[o6],l3=a2>c3!=a2>h4?a2:c3<a2!=c3<h4?c3:h4,d3=i3-1,u4=o6+1;for(;;){do d3++;while(t36[d3]<l3);do u4--;while(t36[u4]>l3);if(d3>=u4)break;W4(t36,e5,n4,d3,u4)}r4.push(i3,u4,u4+1,o6)}})(o3,t35,this._indices,0,this.numItems-1,this.nodeSize);for(let e5=0,n4=0;e5<this._levelBounds.length-1;e5++){let o4=this._levelBounds[e5];for(;n4<o4;){let e6=n4,i2=t35[n4++],s2=t35[n4++],r4=t35[n4++],a2=t35[n4++];for(let e7=1;e7<this.nodeSize&&n4<o4;e7++)i2=Math.min(i2,t35[n4++]),s2=Math.min(s2,t35[n4++]),r4=Math.max(r4,t35[n4++]),a2=Math.max(a2,t35[n4++]);this._indices[this._pos>>2]=e6,t35[this._pos++]=i2,t35[this._pos++]=s2,t35[this._pos++]=r4,t35[this._pos++]=a2}}}search(t35,e4,n3,o3,i2){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let s2=this._boxes.length-4,r4=[],a2=[];for(;s2!==void 0;){let c3=Math.min(s2+4*this.nodeSize,j2(s2,this._levelBounds));for(let h4=s2;h4<c3;h4+=4){let c4=this._boxes[h4];if(n3<c4)continue;let l3=this._boxes[h4+1];if(o3<l3)continue;let d3=this._boxes[h4+2];if(t35>d3)continue;let u4=this._boxes[h4+3];if(e4>u4)continue;let p4=0|this._indices[h4>>2];s2>=4*this.numItems?r4.push(p4):(i2===void 0||i2(p4,c4,l3,d3,u4))&&a2.push(p4)}s2=r4.pop()}return a2}neighbors(t35,e4,n3=1/0,o3=1/0,i2){if(this._pos!==this._boxes.length)throw new Error("Data not yet indexed - call index.finish().");let s2=this._boxes.length-4,r4=this._queue,a2=[],c3=o3*o3;t:for(;s2!==void 0;){let o4=Math.min(s2+4*this.nodeSize,j2(s2,this._levelBounds));for(let n4=s2;n4<o4;n4+=4){let o6=0|this._indices[n4>>2],a3=this._boxes[n4],h4=this._boxes[n4+1],l3=this._boxes[n4+2],d3=this._boxes[n4+3],u4=t35<a3?a3-t35:t35>l3?t35-l3:0,p4=e4<h4?h4-e4:e4>d3?e4-d3:0,f2=u4*u4+p4*p4;f2>c3||(s2>=4*this.numItems?r4.push(o6<<1,f2):(i2===void 0||i2(o6))&&r4.push(1+(o6<<1),f2))}for(;r4.length&&1&r4.peek();)if(r4.peekValue()>c3||(a2.push(r4.pop()>>1),a2.length===n3))break t;s2=r4.length?r4.pop()>>1:void 0}return r4.clear(),a2}};function j2(t35,e4){let n3=0,o3=e4.length-1;for(;n3<o3;){let i2=n3+o3>>1;e4[i2]>t35?o3=i2:n3=i2+1}return e4[n3]}function W4(t35,e4,n3,o3,i2){let s2=t35[o3];t35[o3]=t35[i2],t35[i2]=s2;let r4=4*o3,a2=4*i2,c3=e4[r4],h4=e4[r4+1],l3=e4[r4+2],d3=e4[r4+3];e4[r4]=e4[a2],e4[r4+1]=e4[a2+1],e4[r4+2]=e4[a2+2],e4[r4+3]=e4[a2+3],e4[a2]=c3,e4[a2+1]=h4,e4[a2+2]=l3,e4[a2+3]=d3;let u4=n3[o3];n3[o3]=n3[i2],n3[i2]=u4}function H3(t35,e4){let n3=t35^e4,o3=65535^n3,i2=65535^(t35|e4),s2=t35&(65535^e4),r4=n3|o3>>1,a2=n3>>1^n3,c3=i2>>1^o3&s2>>1^i2,h4=n3&i2>>1^s2>>1^s2;n3=r4,o3=a2,i2=c3,s2=h4,r4=n3&n3>>2^o3&o3>>2,a2=n3&o3>>2^o3&(n3^o3)>>2,c3^=n3&i2>>2^o3&s2>>2,h4^=o3&i2>>2^(n3^o3)&s2>>2,n3=r4,o3=a2,i2=c3,s2=h4,r4=n3&n3>>4^o3&o3>>4,a2=n3&o3>>4^o3&(n3^o3)>>4,c3^=n3&i2>>4^o3&s2>>4,h4^=o3&i2>>4^(n3^o3)&s2>>4,n3=r4,o3=a2,i2=c3,s2=h4,c3^=n3&i2>>8^o3&s2>>8,h4^=o3&i2>>8^(n3^o3)&s2>>8,n3=c3^c3>>1,o3=h4^h4>>1;let l3=t35^e4,d3=o3|65535^(l3|n3);return l3=16711935&(l3|l3<<8),l3=252645135&(l3|l3<<4),l3=858993459&(l3|l3<<2),l3=1431655765&(l3|l3<<1),d3=16711935&(d3|d3<<8),d3=252645135&(d3|d3<<4),d3=858993459&(d3|d3<<2),d3=1431655765&(d3|d3<<1),(d3<<1|l3)>>>0}function V3(t35){let e4=t35.width/2,n3=t35.height/2;return{minX:t35.center.x-e4,maxX:t35.center.x+e4,minY:t35.center.y-n3,maxY:t35.center.y+n3}}function U2(t35,e4,n3){return Math.max(e4,Math.min(n3,t35))}function G3(t35,e4,n3,o3){let i2=q3(t35,e4,n3),s2=q3(t35,e4,o3),r4=q3(n3,o3,t35),a2=q3(n3,o3,e4);return i2!==s2&&r4!==a2||!(i2!==0||!Z2(t35,n3,e4))||!(s2!==0||!Z2(t35,o3,e4))||!(r4!==0||!Z2(n3,t35,o3))||!(a2!==0||!Z2(n3,e4,o3))}function q3(t35,e4,n3){let o3=(e4.y-t35.y)*(n3.x-e4.x)-(e4.x-t35.x)*(n3.y-e4.y);return o3===0?0:o3>0?1:2}function Z2(t35,e4,n3){return e4.x<=Math.max(t35.x,n3.x)&&e4.x>=Math.min(t35.x,n3.x)&&e4.y<=Math.max(t35.y,n3.y)&&e4.y>=Math.min(t35.y,n3.y)}function J3(t35,e4,n3){let o3=(n3.x-e4.x)**2+(n3.y-e4.y)**2;if(o3===0)return K2(t35,e4);let i2=((t35.x-e4.x)*(n3.x-e4.x)+(t35.y-e4.y)*(n3.y-e4.y))/o3;return i2=Math.max(0,Math.min(1,i2)),K2(t35,{x:e4.x+i2*(n3.x-e4.x),y:e4.y+i2*(n3.y-e4.y)})}function K2(t35,e4){let n3=t35.x-e4.x,o3=t35.y-e4.y;return Math.sqrt(n3*n3+o3*o3)}function Q3(t35,e4,n3,o3){let i2=e4.x-t35.x,s2=e4.y-t35.y,r4=o3.x-n3.x,a2=o3.y-n3.y,c3=t35.x-n3.x,h4=t35.y-n3.y,l3=i2*a2-s2*r4;if(Math.abs(l3)<1e-10)return null;let d3=(h4*r4-c3*a2)/l3,u4=(i2*h4-s2*c3)/l3,p4=1e-9;return d3>=-1e-9&&d3<=1+p4&&u4>=-1e-9&&u4<=1+p4?{x:t35.x+d3*i2,y:t35.y+d3*s2}:null}function tt2(t35,e4){let n3=e4.width/2,o3=e4.height/2,i2=e4.center.x-n3,s2=e4.center.x+n3,r4=e4.center.y-o3,a2=e4.center.y+o3;return t35.x>=i2&&t35.x<=s2&&t35.y>=r4&&t35.y<=a2?0:K2(t35,{x:U2(t35.x,i2,s2),y:U2(t35.y,r4,a2)})}function et2(t35,e4){return{x:(t35.x+e4.x)/2,y:(t35.y+e4.y)/2}}var nt2=t35=>{if("minX"in t35)return t35;let e4=t35.width/2,n3=t35.height/2;return{minX:t35.center.x-e4,minY:t35.center.y-n3,maxX:t35.center.x+e4,maxY:t35.center.y+n3}},ot2=t35=>[{x:t35.minX,y:t35.minY},{x:t35.maxX,y:t35.minY},{x:t35.maxX,y:t35.maxY},{x:t35.minX,y:t35.maxY}],it2=t35=>{let e4=[];for(let n3=0;n3<t35.length;n3++){let o3=t35[n3],i2=t35[(n3+1)%t35.length];e4.push([o3,i2])}return e4},st2=(t35,e4,n3)=>{let o3=(t35.y-e4.y)*(n3.x-e4.x)-(t35.x-e4.x)*(n3.y-e4.y);if(Math.abs(o3)>1e-9)return!1;let i2=(t35.x-e4.x)*(n3.x-e4.x)+(t35.y-e4.y)*(n3.y-e4.y);return i2<0?!1:!(i2>(n3.x-e4.x)**2+(n3.y-e4.y)**2)},rt2=(t35,e4)=>{if(e4.length<3)return!1;let n3=it2(e4);for(let[e5,o4]of n3)if(st2(t35,e5,o4))return!0;let o3=!1;for(let n4=0,i2=e4.length-1;n4<e4.length;i2=n4++){let s2=e4[n4].x,r4=e4[n4].y,a2=e4[i2].x,c3=e4[i2].y;r4>t35.y!=c3>t35.y&&t35.x<(a2-s2)*(t35.y-r4)/(c3-r4)+s2&&(o3=!o3)}return o3},at2=(t35,e4)=>{let n3=ot2(t35),o3=[[n3[0],n3[1]],[n3[1],n3[2]],[n3[2],n3[3]],[n3[3],n3[0]]],i2=it2(e4);for(let[t36,e5]of i2)for(let[n4,i3]of o3)if(G3(t36,e5,n4,i3))return!0;return!1},ct2=(t35,e4)=>((t36,e5)=>!(e5.length<3)&&(!!e5.some(e6=>((t37,e7)=>t37.x>=e7.minX&&t37.x<=e7.maxX&&t37.y>=e7.minY&&t37.y<=e7.maxY)(e6,t36))||!!ot2(t36).some(t37=>rt2(t37,e5))||at2(t36,e5)))(nt2(t35),e4),ht2=(t35,e4)=>((t36,e5)=>!(e5.length<3)&&!!ot2(t36).every(t37=>rt2(t37,e5))&&!at2(t36,e5))(nt2(t35),e4);function lt2(t35,e4,n3,o3){if(t35.x===e4.x&&t35.y===e4.y)return J3(t35,n3,o3);if(n3.x===o3.x&&n3.y===o3.y)return J3(n3,t35,e4);if(G3(t35,e4,n3,o3))return 0;let i2=[J3(t35,n3,o3),J3(e4,n3,o3),J3(n3,t35,e4),J3(o3,t35,e4)];return Math.min(...i2)}function dt2(t35,e4,n3){let o3=n3.width/2,i2=n3.height/2;return(function(t36,e5,n4){let o4={x:n4.minX,y:n4.minY},i3={x:n4.maxX,y:n4.minY},s2={x:n4.minX,y:n4.maxY},r4={x:n4.maxX,y:n4.maxY};if(G3(t36,e5,o4,i3)||G3(t36,e5,i3,r4)||G3(t36,e5,r4,s2)||G3(t36,e5,s2,o4)||t36.x>=n4.minX&&t36.x<=n4.maxX&&t36.y>=n4.minY&&t36.y<=n4.maxY&&e5.x>=n4.minX&&e5.x<=n4.maxX&&e5.y>=n4.minY&&e5.y<=n4.maxY)return 0;let a2=[J3(o4,t36,e5),J3(i3,t36,e5),J3(s2,t36,e5),J3(r4,t36,e5)];if(t36.x>=n4.minX&&t36.x<=n4.maxX&&t36.y>=n4.minY&&t36.y<=n4.maxY||e5.x>=n4.minX&&e5.x<=n4.maxX&&e5.y>=n4.minY&&e5.y<=n4.maxY)return 0;if(t36.x<n4.minX||t36.x>n4.maxX||t36.y<n4.minY||t36.y>n4.maxY){let e6=U2(t36.x,n4.minX,n4.maxX),o6=U2(t36.y,n4.minY,n4.maxY);a2.push(K2(t36,{x:e6,y:o6}))}if(e5.x<n4.minX||e5.x>n4.maxX||e5.y<n4.minY||e5.y>n4.maxY){let t37=U2(e5.x,n4.minX,n4.maxX),o6=U2(e5.y,n4.minY,n4.maxY);a2.push(K2(e5,{x:t37,y:o6}))}return Math.min(...a2)})(t35,e4,{minX:n3.center.x-o3,maxX:n3.center.x+o3,minY:n3.center.y-i2,maxY:n3.center.y+i2})}function ut2(t35,e4,n3){let o3=n3.x-e4.x,i2=n3.y-e4.y,s2=o3*o3+i2*i2;if(s2===0)return{x:e4.x,y:e4.y};let r4=((t35.x-e4.x)*o3+(t35.y-e4.y)*i2)/s2;return r4=Math.max(0,Math.min(1,r4)),{x:e4.x+r4*o3,y:e4.y+r4*i2}}function pt2(t35,e4,n3=0,o3=t35.length-1,i2=gt2){for(;o3>n3;){if(o3-n3>600){let s3=o3-n3+1,r5=e4-n3+1,a3=Math.log(s3),c3=.5*Math.exp(2*a3/3),h4=.5*Math.sqrt(a3*c3*(s3-c3)/s3)*(r5-s3/2<0?-1:1);pt2(t35,e4,Math.max(n3,Math.floor(e4-r5*c3/s3+h4)),Math.min(o3,Math.floor(e4+(s3-r5)*c3/s3+h4)),i2)}let s2=t35[e4],r4=n3,a2=o3;for(ft2(t35,n3,e4),i2(t35[o3],s2)>0&&ft2(t35,n3,o3);r4<a2;){for(ft2(t35,r4,a2),r4++,a2--;i2(t35[r4],s2)<0;)r4++;for(;i2(t35[a2],s2)>0;)a2--}i2(t35[n3],s2)===0?ft2(t35,n3,a2):(a2++,ft2(t35,a2,o3)),a2<=e4&&(n3=a2+1),e4<=a2&&(o3=a2-1)}}function ft2(t35,e4,n3){let o3=t35[e4];t35[e4]=t35[n3],t35[n3]=o3}function gt2(t35,e4){return t35<e4?-1:t35>e4?1:0}var mt2=class{constructor(t35=9){this._maxEntries=Math.max(4,t35),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(t35){let e4=this.data,n3=[];if(!Tt2(t35,e4))return n3;let o3=this.toBBox,i2=[];for(;e4;){for(let s2=0;s2<e4.children.length;s2++){let r4=e4.children[s2],a2=e4.leaf?o3(r4):r4;Tt2(t35,a2)&&(e4.leaf?n3.push(r4):Ct2(t35,a2)?this._all(r4,n3):i2.push(r4))}e4=i2.pop()}return n3}collides(t35){let e4=this.data;if(!Tt2(t35,e4))return!1;let n3=[];for(;e4;){for(let o3=0;o3<e4.children.length;o3++){let i2=e4.children[o3],s2=e4.leaf?this.toBBox(i2):i2;if(Tt2(t35,s2)){if(e4.leaf||Ct2(t35,s2))return!0;n3.push(i2)}}e4=n3.pop()}return!1}load(t35){if(!t35||!t35.length)return this;if(t35.length<this._minEntries){for(let e5=0;e5<t35.length;e5++)this.insert(t35[e5]);return this}let e4=this._build(t35.slice(),0,t35.length-1,0);if(this.data.children.length)if(this.data.height===e4.height)this._splitRoot(this.data,e4);else{if(this.data.height<e4.height){let t36=this.data;this.data=e4,e4=t36}this._insert(e4,this.data.height-e4.height-1,!0)}else this.data=e4;return this}insert(t35){return t35&&this._insert(t35,this.data.height-1),this}clear(){return this.data=Et2([]),this}remove(t35,e4){if(!t35)return this;let n3=this.data,o3=this.toBBox(t35),i2=[],s2=[],r4,a2,c3;for(;n3||i2.length;){if(n3||(n3=i2.pop(),a2=i2[i2.length-1],r4=s2.pop(),c3=!0),n3.leaf){let o4=yt2(t35,n3.children,e4);if(o4!==-1)return n3.children.splice(o4,1),i2.push(n3),this._condense(i2),this}c3||n3.leaf||!Ct2(n3,o3)?a2?(r4++,n3=a2.children[r4],c3=!1):n3=null:(i2.push(n3),s2.push(r4),r4=0,a2=n3,n3=n3.children[0])}return this}toBBox(t35){return t35}compareMinX(t35,e4){return t35.minX-e4.minX}compareMinY(t35,e4){return t35.minY-e4.minY}toJSON(){return this.data}fromJSON(t35){return this.data=t35,this}_all(t35,e4){let n3=[];for(;t35;)t35.leaf?e4.push(...t35.children):n3.push(...t35.children),t35=n3.pop();return e4}_build(t35,e4,n3,o3){let i2=n3-e4+1,s2,r4=this._maxEntries;if(i2<=r4)return s2=Et2(t35.slice(e4,n3+1)),xt2(s2,this.toBBox),s2;o3||(o3=Math.ceil(Math.log(i2)/Math.log(r4)),r4=Math.ceil(i2/Math.pow(r4,o3-1))),s2=Et2([]),s2.leaf=!1,s2.height=o3;let a2=Math.ceil(i2/r4),c3=a2*Math.ceil(Math.sqrt(r4));Rt2(t35,e4,n3,c3,this.compareMinX);for(let i3=e4;i3<=n3;i3+=c3){let e5=Math.min(i3+c3-1,n3);Rt2(t35,i3,e5,a2,this.compareMinY);for(let n4=i3;n4<=e5;n4+=a2){let i4=Math.min(n4+a2-1,e5);s2.children.push(this._build(t35,n4,i4,o3-1))}}return xt2(s2,this.toBBox),s2}_chooseSubtree(t35,e4,n3,o3){for(;o3.push(e4),!e4.leaf&&o3.length-1!==n3;){let n4,o4=1/0,i2=1/0;for(let s2=0;s2<e4.children.length;s2++){let r4=e4.children[s2],a2=Pt2(r4),c3=Nt2(t35,r4)-a2;c3<i2?(i2=c3,o4=a2<o4?a2:o4,n4=r4):c3===i2&&a2<o4&&(o4=a2,n4=r4)}e4=n4||e4.children[0]}return e4}_insert(t35,e4,n3){let o3=n3?t35:this.toBBox(t35),i2=[],s2=this._chooseSubtree(o3,this.data,e4,i2);for(s2.children.push(t35),bt(s2,o3);e4>=0&&i2[e4].children.length>this._maxEntries;)this._split(i2,e4),e4--;this._adjustParentBBoxes(o3,i2,e4)}_split(t35,e4){let n3=t35[e4],o3=n3.children.length,i2=this._minEntries;this._chooseSplitAxis(n3,i2,o3);let s2=this._chooseSplitIndex(n3,i2,o3),r4=Et2(n3.children.splice(s2,n3.children.length-s2));r4.height=n3.height,r4.leaf=n3.leaf,xt2(n3,this.toBBox),xt2(r4,this.toBBox),e4?t35[e4-1].children.push(r4):this._splitRoot(n3,r4)}_splitRoot(t35,e4){this.data=Et2([t35,e4]),this.data.height=t35.height+1,this.data.leaf=!1,xt2(this.data,this.toBBox)}_chooseSplitIndex(t35,e4,n3){let o3,i2=1/0,s2=1/0;for(let r4=e4;r4<=n3-e4;r4++){let e5=vt2(t35,0,r4,this.toBBox),a2=vt2(t35,r4,n3,this.toBBox),c3=Mt2(e5,a2),h4=Pt2(e5)+Pt2(a2);c3<i2?(i2=c3,o3=r4,s2=h4<s2?h4:s2):c3===i2&&h4<s2&&(s2=h4,o3=r4)}return o3||n3-e4}_chooseSplitAxis(t35,e4,n3){let o3=t35.leaf?this.compareMinX:St2,i2=t35.leaf?this.compareMinY:It2;this._allDistMargin(t35,e4,n3,o3)<this._allDistMargin(t35,e4,n3,i2)&&t35.children.sort(o3)}_allDistMargin(t35,e4,n3,o3){t35.children.sort(o3);let i2=this.toBBox,s2=vt2(t35,0,e4,i2),r4=vt2(t35,n3-e4,n3,i2),a2=_t2(s2)+_t2(r4);for(let o4=e4;o4<n3-e4;o4++){let e5=t35.children[o4];bt(s2,t35.leaf?i2(e5):e5),a2+=_t2(s2)}for(let o4=n3-e4-1;o4>=e4;o4--){let e5=t35.children[o4];bt(r4,t35.leaf?i2(e5):e5),a2+=_t2(r4)}return a2}_adjustParentBBoxes(t35,e4,n3){for(let o3=n3;o3>=0;o3--)bt(e4[o3],t35)}_condense(t35){for(let e4,n3=t35.length-1;n3>=0;n3--)t35[n3].children.length===0?n3>0?(e4=t35[n3-1].children,e4.splice(e4.indexOf(t35[n3]),1)):this.clear():xt2(t35[n3],this.toBBox)}};function yt2(t35,e4,n3){if(!n3)return e4.indexOf(t35);for(let o3=0;o3<e4.length;o3++)if(n3(t35,e4[o3]))return o3;return-1}function xt2(t35,e4){vt2(t35,0,t35.children.length,e4,t35)}function vt2(t35,e4,n3,o3,i2){i2||(i2=Et2(null)),i2.minX=1/0,i2.minY=1/0,i2.maxX=-1/0,i2.maxY=-1/0;for(let s2=e4;s2<n3;s2++){let e5=t35.children[s2];bt(i2,t35.leaf?o3(e5):e5)}return i2}function bt(t35,e4){return t35.minX=Math.min(t35.minX,e4.minX),t35.minY=Math.min(t35.minY,e4.minY),t35.maxX=Math.max(t35.maxX,e4.maxX),t35.maxY=Math.max(t35.maxY,e4.maxY),t35}function St2(t35,e4){return t35.minX-e4.minX}function It2(t35,e4){return t35.minY-e4.minY}function Pt2(t35){return(t35.maxX-t35.minX)*(t35.maxY-t35.minY)}function _t2(t35){return t35.maxX-t35.minX+(t35.maxY-t35.minY)}function Nt2(t35,e4){return(Math.max(e4.maxX,t35.maxX)-Math.min(e4.minX,t35.minX))*(Math.max(e4.maxY,t35.maxY)-Math.min(e4.minY,t35.minY))}function Mt2(t35,e4){let n3=Math.max(t35.minX,e4.minX),o3=Math.max(t35.minY,e4.minY),i2=Math.min(t35.maxX,e4.maxX),s2=Math.min(t35.maxY,e4.maxY);return Math.max(0,i2-n3)*Math.max(0,s2-o3)}function Ct2(t35,e4){return t35.minX<=e4.minX&&t35.minY<=e4.minY&&e4.maxX<=t35.maxX&&e4.maxY<=t35.maxY}function Tt2(t35,e4){return e4.minX<=t35.maxX&&e4.minY<=t35.maxY&&e4.maxX>=t35.minX&&e4.maxY>=t35.minY}function Et2(t35){return{children:t35,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function Rt2(t35,e4,n3,o3,i2){let s2=[e4,n3];for(;s2.length;){if((n3=s2.pop())-(e4=s2.pop())<=o3)continue;let r4=e4+Math.ceil((n3-e4)/o3/2)*o3;pt2(t35,r4,e4,n3,i2),s2.push(e4,r4,r4,n3)}}var wt2=1e-4,At2=[{facingDirection:"x-",dx:-1,dy:0,startX:-.5,startY:.5,endX:-.5,endY:-.5},{facingDirection:"x+",dx:1,dy:0,startX:.5,startY:.5,endX:.5,endY:-.5},{facingDirection:"y-",dx:0,dy:-1,startX:-.5,startY:-.5,endX:.5,endY:-.5},{facingDirection:"y+",dx:0,dy:1,startX:.5,startY:.5,endX:-.5,endY:.5}],Ot2={"x-":At2.find(t35=>t35.facingDirection==="x-"),"x+":At2.find(t35=>t35.facingDirection==="x+"),"y-":At2.find(t35=>t35.facingDirection==="y-"),"y+":At2.find(t35=>t35.facingDirection==="y+")},Lt2={"x-":{x:-1,y:0},"x+":{x:1,y:0},"y-":{x:0,y:-1},"y+":{x:0,y:1}},zt2=(t35,e4)=>{let{dir:n3,amt:o3}=e4,i2=Lt2[n3];return t35.map(t36=>({x:t36.x+i2.x*o3,y:t36.y+i2.y*o3}))},Dt2=1e-4,Yt2=class extends Y3{constructor(t35){super();__publicField(this,"allEdges");__publicField(this,"unprocessedEdges",[]);__publicField(this,"segmentsWithAdjacentEmptySpace",[]);__publicField(this,"edgeSpatialIndex");__publicField(this,"lastCandidateEdge",null);__publicField(this,"lastOverlappingEdges",null);__publicField(this,"lastUncoveredSegments",null);this.input=t35;for(let t36 of this.input.meshNodes)for(let e4 of At2){let n3={x:t36.center.x+t36.width*e4.startX,y:t36.center.y+t36.height*e4.startY},o3={x:t36.center.x+t36.width*e4.endX,y:t36.center.y+t36.height*e4.endY};n3.x>o3.x&&([n3,o3]=[o3,n3]),Math.abs(n3.x-o3.x)<Dt2&&n3.y>o3.y&&([n3,o3]=[o3,n3]);for(let i2 of t36.availableZ)this.unprocessedEdges.push({parent:t36,start:n3,end:o3,facingDirection:e4.facingDirection,z:i2})}this.allEdges=[...this.unprocessedEdges],this.edgeSpatialIndex=new $4(this.allEdges.length);for(let t36 of this.allEdges)this.edgeSpatialIndex.add(t36.start.x,t36.start.y,t36.end.x,t36.end.y);this.edgeSpatialIndex.finish()}_step(){if(this.unprocessedEdges.length===0)return this.solved=!0,this.lastCandidateEdge=null,this.lastOverlappingEdges=null,void(this.lastUncoveredSegments=null);let t35=this.unprocessedEdges.shift();this.lastCandidateEdge=t35;let e4=this.edgeSpatialIndex.search(t35.start.x-Dt2,t35.start.y-Dt2,t35.end.x+Dt2,t35.end.y+Dt2).map(t36=>this.allEdges[t36]).filter(e5=>e5.z===t35.z);this.lastOverlappingEdges=e4;let n3=(function(t36,e5){let n4=Math.abs(t36.start.y-t36.end.y)<wt2,o3=Math.abs(t36.start.x-t36.end.x)<wt2;if(!n4&&!o3)return[];let i2=n4?"x":"y",s2=n4?"y":"x",r4=t36.start[s2],a2=t36.start[i2],c3=t36.end[i2],h4=Math.min(a2,c3),l3=Math.max(a2,c3),d3=t37=>Math.max(h4,Math.min(l3,t37)),u4=[];for(let n5 of e5){if(n5===t36)continue;let e6=Math.abs(n5.start.y-n5.end.y)<wt2,o4=Math.abs(n5.start.x-n5.end.x)<wt2;if(i2==="x"&&!e6||i2==="y"&&!o4||Math.abs(n5.start[s2]-r4)>wt2)continue;let a3=Math.min(n5.start[i2],n5.end[i2]),c4=Math.max(n5.start[i2],n5.end[i2]),h6=d3(a3),l4=d3(c4);l4-h6>wt2&&u4.push({s:h6,e:l4})}if(u4.length===0)return[{...t36,start:{...t36.start},end:{...t36.end}}];u4.sort((t37,e6)=>t37.s-e6.s);let p4=[];for(let t37 of u4){let e6=p4[p4.length-1];!e6||t37.s>e6.e+wt2?p4.push({...t37}):e6.e=Math.max(e6.e,t37.e)}let f2=[],g7=h4;for(let t37 of p4)if(t37.s>g7+wt2&&f2.push({s:g7,e:t37.s}),g7=Math.max(g7,t37.e),g7>=l3-wt2)break;return l3>g7+wt2&&f2.push({s:g7,e:l3}),f2.length===0?[]:f2.filter(t37=>t37.e-t37.s>wt2).map(e6=>{let n5=i2==="x"?{x:e6.s,y:r4}:{x:r4,y:e6.s},o4=i2==="x"?{x:e6.e,y:r4}:{x:r4,y:e6.e};return{parent:t36.parent,facingDirection:t36.facingDirection,start:n5,end:o4,z:t36.z}})})(t35,e4);this.lastUncoveredSegments=n3,this.segmentsWithAdjacentEmptySpace.push(...n3)}getOutput(){return{segmentsWithAdjacentEmptySpace:this.segmentsWithAdjacentEmptySpace}}visualize(){let t35={title:"FindSegmentsWithAdjacentEmptySpace",coordinateSystem:"cartesian",rects:[],points:[],lines:[],circles:[],arrows:[],texts:[]};for(let e4 of this.input.meshNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,stroke:"rgba(0, 0, 0, 0.1)"});for(let e4 of this.unprocessedEdges)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:-.1}),strokeColor:"rgba(0, 0, 255, 0.5)",strokeDash:"5 5"});for(let e4 of this.segmentsWithAdjacentEmptySpace)t35.lines.push({points:[e4.start,e4.end],strokeColor:"rgba(0,255,0, 0.5)"});if(this.lastCandidateEdge&&t35.lines.push({points:[this.lastCandidateEdge.start,this.lastCandidateEdge.end],strokeColor:"blue"}),this.lastOverlappingEdges)for(let e4 of this.lastOverlappingEdges)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:.05}),strokeColor:"red",strokeDash:"2 2"});if(this.lastUncoveredSegments)for(let e4 of this.lastUncoveredSegments)t35.lines.push({points:zt2([e4.start,e4.end],{dir:e4.facingDirection,amt:-.05}),strokeColor:"green",strokeDash:"2 2"});return t35}},Xt2=t35=>({minX:Math.min(...t35.map(t36=>t36.x)),minY:Math.min(...t35.map(t36=>t36.y)),maxX:Math.max(...t35.map(t36=>t36.x)),maxY:Math.max(...t35.map(t36=>t36.y))}),Ft2=1e-4,kt2=class extends Y3{constructor(t35){super();__publicField(this,"unprocessedSegments",[]);__publicField(this,"expandedSegments",[]);__publicField(this,"lastSegment",null);__publicField(this,"lastSearchBounds",null);__publicField(this,"lastCollidingNodes",null);__publicField(this,"lastSearchCorner1",null);__publicField(this,"lastSearchCorner2",null);__publicField(this,"lastExpandedSegment",null);__publicField(this,"rectSpatialIndex");this.input=t35,this.unprocessedSegments=[...this.input.segmentsWithAdjacentEmptySpace],this.rectSpatialIndex=new mt2,this.rectSpatialIndex.load(this.input.boardVoid?.boardVoidRects.map((t36,e4)=>({capacityMeshNodeId:`void-rect-${e4}`,center:{x:t36.x+t36.width/2,y:t36.y+t36.height/2},width:t36.width,height:t36.height,availableZ:Array.from({length:this.input.boardVoid?.layerCount||0},(t37,e5)=>e5),layer:"void",minX:t36.x,minY:t36.y,maxX:t36.x+t36.width,maxY:t36.y+t36.height}))||[]),this.rectSpatialIndex.load(this.input.inputMeshNodes.map(t36=>({...t36,minX:t36.center.x-t36.width/2,minY:t36.center.y-t36.height/2,maxX:t36.center.x+t36.width/2,maxY:t36.center.y+t36.height/2})))}_step(){if(this.unprocessedSegments.length===0)return void(this.solved=!0);let t35=this.unprocessedSegments.shift();this.lastSegment=t35;let{dx:e4,dy:n3}=Ot2[t35.facingDirection],o3=t35.end.x-t35.start.x,i2=t35.end.y-t35.start.y,s2=Math.sqrt(o3**2+i2**2),r4=o3/s2,a2=i2/s2,c3=null,h4=1,l3={x:t35.start.x+e4*Ft2+r4*Ft2*10,y:t35.start.y+n3*Ft2+a2*Ft2*10},d3={x:t35.end.x+e4*Ft2-r4*Ft2*10,y:t35.end.y+n3*Ft2-a2*Ft2*10};for(this.lastSearchCorner1=l3,this.lastSearchCorner2=d3;(!c3||c3.length===0)&&h4<1e3;){let o4=Xt2([l3,d3,{x:l3.x+e4*h4,y:l3.y+n3*h4},{x:d3.x+e4*h4,y:d3.y+n3*h4}]);this.lastSearchBounds=o4,c3=this.rectSpatialIndex.search(o4).filter(e5=>e5.availableZ.includes(t35.z)).filter(e5=>e5.capacityMeshNodeId!==t35.parent.capacityMeshNodeId),h4*=4}if(!c3||c3.length===0)return;this.lastCollidingNodes=c3;let u4=1/0;for(let e5 of c3){let n4=dt2(t35.start,t35.end,e5);n4<u4&&(u4=n4)}let p4=u4,f2=Xt2([t35.start,t35.end,{x:t35.start.x+e4*p4,y:t35.start.y+n3*p4},{x:t35.end.x+e4*p4,y:t35.end.y+n3*p4}]),g7={x:(f2.minX+f2.maxX)/2,y:(f2.minY+f2.maxY)/2},m3=f2.maxX-f2.minX,y5=f2.maxY-f2.minY,x5={segment:t35,newNode:{capacityMeshNodeId:`new-${t35.parent.capacityMeshNodeId}-${this.expandedSegments.length}`,center:g7,width:m3,height:y5,availableZ:[t35.z],layer:t35.parent.layer}};this.lastExpandedSegment=x5,m3<Ft2||y5<Ft2||(this.expandedSegments.push(x5),this.rectSpatialIndex.insert({...x5.newNode,...f2}))}getOutput(){return{expandedSegments:this.expandedSegments}}visualize(){let t35={title:"ExpandEdgesToEmptySpace",coordinateSystem:"cartesian",rects:[],points:[],lines:[],circles:[],arrows:[],texts:[]};for(let e4 of this.input.inputMeshNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,stroke:"rgba(0, 0, 0, 0.1)",layer:`z${e4.availableZ.join(",")}`,label:[`node ${e4.capacityMeshNodeId}`,`z:${e4.availableZ.join(",")}`].join(`
|
|
338
338
|
`)});for(let{newNode:e4}of this.expandedSegments)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,fill:"green",label:`expandedSegment (z=${e4.availableZ.join(",")})`,layer:`z${e4.availableZ.join(",")}`});if(this.lastSegment&&t35.lines.push({points:[this.lastSegment.start,this.lastSegment.end],strokeColor:"rgba(0, 0, 255, 0.5)"}),this.lastSearchBounds&&t35.rects.push({center:{x:(this.lastSearchBounds.minX+this.lastSearchBounds.maxX)/2,y:(this.lastSearchBounds.minY+this.lastSearchBounds.maxY)/2},width:this.lastSearchBounds.maxX-this.lastSearchBounds.minX,height:this.lastSearchBounds.maxY-this.lastSearchBounds.minY,fill:"rgba(0, 0, 255, 0.25)"}),this.lastSearchCorner1&&this.lastSearchCorner2&&(t35.points.push({x:this.lastSearchCorner1.x,y:this.lastSearchCorner1.y,color:"rgba(0, 0, 255, 0.5)",label:["searchCorner1",`z=${this.lastSegment?.z}`].join(`
|
|
339
339
|
`)}),t35.points.push({x:this.lastSearchCorner2.x,y:this.lastSearchCorner2.y,color:"rgba(0, 0, 255, 0.5)",label:["searchCorner2",`z=${this.lastSegment?.z}`].join(`
|
|
340
340
|
`)})),this.lastExpandedSegment&&t35.rects.push({center:this.lastExpandedSegment.newNode.center,width:this.lastExpandedSegment.newNode.width,height:this.lastExpandedSegment.newNode.height,fill:"purple",label:`expandedSegment (z=${this.lastExpandedSegment.segment.z})`}),this.lastCollidingNodes)for(let e4 of this.lastCollidingNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,fill:"rgba(255, 0, 0, 0.5)"});return t35}},Bt2=class extends F3{constructor(){super(...arguments);__publicField(this,"findSegmentsWithAdjacentEmptySpaceSolver");__publicField(this,"expandEdgesToEmptySpaceSolver");__publicField(this,"pipelineDef",[X3("findSegmentsWithAdjacentEmptySpaceSolver",Yt2,t35=>[{meshNodes:t35.inputProblem.meshNodes}],{onSolved:()=>{}}),X3("expandEdgesToEmptySpaceSolver",kt2,t35=>[{inputMeshNodes:t35.inputProblem.meshNodes,segmentsWithAdjacentEmptySpace:t35.findSegmentsWithAdjacentEmptySpaceSolver.getOutput().segmentsWithAdjacentEmptySpace,boardVoid:t35.inputProblem.boardVoid}],{onSolved:()=>{}})])}getOutput(){let t35=(this.expandEdgesToEmptySpaceSolver?.getOutput().expandedSegments??[]).map(t36=>t36.newNode);return{outputNodes:[...this.inputProblem.meshNodes,...t35]}}initialVisualize(){let t35={title:"GapFillSolverPipeline - Initial",coordinateSystem:"cartesian",rects:[],points:[],lines:[],circles:[],arrows:[],texts:[]};for(let e4 of this.inputProblem.meshNodes)t35.rects.push({center:e4.center,width:e4.width,height:e4.height,stroke:"rgba(0, 0, 0, 0.3)",fill:"rgba(100, 100, 100, 0.1)",layer:`z${e4.availableZ.join(",")}`,label:[`node ${e4.capacityMeshNodeId}`,`z:${e4.availableZ.join(",")}`].join(`
|
|
@@ -646,8 +646,8 @@ D2 negative_supply output opamp_diode
|
|
|
646
646
|
${err.message}`):err}}let nNodes=ckt.nodes.count()-1;for(let i2=0;i2<ckt.V.length;i2++){let vs3=ckt.V[i2];vs3&&(vs3.index=nNodes+i2)}for(let sw of ckt.S){let model=vswitchModels.get(sw.modelName);if(!model)throw new Error(`Unknown .model ${sw.modelName} referenced by switch ${sw.name}`);sw.model=model,sw.isOn=!1}for(let d3 of ckt.D){let model=diodeModels.get(d3.modelName);if(!model)throw new Error(`Unknown .model ${d3.modelName} referenced by diode ${d3.name}`);d3.model=model}return ckt}var Complex=class _Complex{constructor(re4=0,im3=0){__publicField(this,"re");__publicField(this,"im");this.re=re4,this.im=im3}static from(re4,im3=0){return new _Complex(re4,im3)}static fromPolar(mag,deg=0){let ph3=deg*Math.PI/180;return new _Complex(mag*Math.cos(ph3),mag*Math.sin(ph3))}clone(){return new _Complex(this.re,this.im)}add(b3){return new _Complex(this.re+b3.re,this.im+b3.im)}sub(b3){return new _Complex(this.re-b3.re,this.im-b3.im)}mul(b3){return new _Complex(this.re*b3.re-this.im*b3.im,this.re*b3.im+this.im*b3.re)}div(b3){let d3=b3.re*b3.re+b3.im*b3.im;if(d3<EPS5)throw new Error("Complex divide by ~0");return new _Complex((this.re*b3.re+this.im*b3.im)/d3,(this.im*b3.re-this.re*b3.im)/d3)}inv(){let d3=this.re*this.re+this.im*this.im;if(d3<EPS5)throw new Error("Complex invert by ~0");return new _Complex(this.re/d3,-this.im/d3)}abs(){return Math.hypot(this.re,this.im)}phaseDeg(){return Math.atan2(this.im,this.re)*180/Math.PI}};function solveComplex(A4,b3){let n3=A4.length;for(let i2=0;i2<n3;i2++){let row=A4[i2],bi3=b3[i2];if(!row||!bi3)throw new Error("Matrix dimensions mismatch");let copy=row.map(z5=>z5.clone());copy.push(bi3.clone()),A4[i2]=copy}for(let k4=0;k4<n3;k4++){let imax=k4,pivotRow=A4[k4];if(!pivotRow)throw new Error("Matrix row missing");let vmax=pivotRow[k4]?.abs()??0;for(let i2=k4+1;i2<n3;i2++){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let v5=row[k4]?.abs()??0;v5>vmax&&(vmax=v5,imax=i2)}if(vmax<EPS5)throw new Error("Singular matrix (complex)");if(imax!==k4){let tmp=A4[k4];A4[k4]=A4[imax],A4[imax]=tmp}let pivotRowUpdated=A4[k4];if(!pivotRowUpdated)throw new Error("Pivot row missing");let pivot=pivotRowUpdated[k4];if(!pivot)throw new Error("Zero pivot encountered");for(let i2=k4+1;i2<n3;i2++){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let entry=row[k4];if(!entry)continue;let f2=entry.div(pivot);if(!(f2.abs()<EPS5))for(let j4=k4;j4<=n3;j4++){let target=row[j4],source=pivotRowUpdated[j4];!target||!source||(row[j4]=target.sub(f2.mul(source)))}}}let x5=new Array(n3);for(let i2=n3-1;i2>=0;i2--){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let s2=row[n3];if(!s2)throw new Error("Augmented column missing");for(let j4=i2+1;j4<n3;j4++){let coeff=row[j4],sol=x5[j4];!coeff||!sol||(s2=s2.sub(coeff.mul(sol)))}let pivot=row[i2];if(!pivot)throw new Error("Zero pivot on back-substitution");x5[i2]=s2.div(pivot)}return x5}function logspace(f12,f2,pointsPerDecade){if(f12<=0||f2<=0)throw new Error(".ac frequencies must be > 0");f2<f12&&([f12,f2]=[f2,f12]);let decades=Math.log10(f2/f12),n3=Math.max(1,Math.ceil(decades*pointsPerDecade)),arr=[];for(let i2=0;i2<=n3;i2++)arr.push(f12*Math.pow(10,i2/pointsPerDecade));let last=arr[arr.length-1];return(last==null||last<f2*(1-EPS5))&&arr.push(f2),arr}function stampAdmittanceComplex(A4,nidx,n12,n22,Y6){let i12=nidx.matrixIndexOfNode(n12),i2=nidx.matrixIndexOfNode(n22);if(i12>=0){let row1=A4[i12];if(!row1)throw new Error("Matrix row missing while stamping");row1[i12]=row1[i12]?.add(Y6)??Y6}if(i2>=0){let row2=A4[i2];if(!row2)throw new Error("Matrix row missing while stamping");row2[i2]=row2[i2]?.add(Y6)??Y6}if(i12>=0&&i2>=0){let row1=A4[i12],row2=A4[i2];if(!row1||!row2)throw new Error("Matrix row missing while stamping");row1[i2]=row1[i2]?.sub(Y6)??Complex.from(0,0).sub(Y6),row2[i12]=row2[i12]?.sub(Y6)??Complex.from(0,0).sub(Y6)}}function stampVoltageSourceComplex(A4,b3,nidx,source,voltage2){let i12=nidx.matrixIndexOfNode(source.n1),i2=nidx.matrixIndexOfNode(source.n2),j4=source.index,one=Complex.from(1,0),negOne=Complex.from(-1,0);if(i12>=0){let row1=A4[i12];if(!row1)throw new Error("Matrix row missing while stamping voltage source");row1[j4]=row1[j4]?.add(one)??one}if(i2>=0){let row2=A4[i2];if(!row2)throw new Error("Matrix row missing while stamping voltage source");row2[j4]=row2[j4]?.sub(one)??negOne}let branchRow=A4[j4];if(!branchRow)throw new Error("Branch row missing while stamping voltage source");i12>=0&&(branchRow[i12]=branchRow[i12]?.add(one)??one),i2>=0&&(branchRow[i2]=branchRow[i2]?.sub(one)??negOne),b3[j4]=(b3[j4]??Complex.from(0,0)).add(voltage2)}function buildFrequencyArray(params){let{mode,N:N6,f1:f12,f2}=params;if(mode==="dec")return logspace(f12,f2,N6);let arr=[],npts=Math.max(2,N6),step=(f2-f12)/(npts-1);for(let i2=0;i2<npts;i2++)arr.push(f12+i2*step);return arr}function buildLinearSystemForAC(ckt,f2,Nvar){let A4=Array.from({length:Nvar},()=>Array.from({length:Nvar},()=>Complex.from(0,0))),b3=Array.from({length:Nvar},()=>Complex.from(0,0)),twoPi=2*Math.PI;for(let r4 of ckt.R){if(r4.R<=0)throw new Error(`R ${r4.name} must be > 0`);let Y6=Complex.from(1/r4.R,0);stampAdmittanceComplex(A4,ckt.nodes,r4.n1,r4.n2,Y6)}for(let c3 of ckt.C){let Y6=Complex.from(0,twoPi*f2*c3.C);stampAdmittanceComplex(A4,ckt.nodes,c3.n1,c3.n2,Y6)}for(let l3 of ckt.L){let denom=Complex.from(0,twoPi*f2*l3.L),Y6=denom.abs()<EPS5?Complex.from(0,0):Complex.from(1,0).div(denom);stampAdmittanceComplex(A4,ckt.nodes,l3.n1,l3.n2,Y6)}for(let vs3 of ckt.V){let Vph=Complex.fromPolar(vs3.acMag||0,vs3.acPhaseDeg||0);stampVoltageSourceComplex(A4,b3,ckt.nodes,vs3,Vph)}return{A:A4,b:b3}}function simulateAC(ckt){var _a360,_b2,_c3,_d3;if(!ckt.analyses.ac)return null;let{mode,N:N6,f1:f12,f2}=ckt.analyses.ac,nNodeVars=ckt.nodes.count()-1,nVsrc=ckt.V.length,Nvar=nNodeVars+nVsrc,freqs=buildFrequencyArray({mode,N:N6,f1:f12,f2}),nodeVoltages={};ckt.nodes.rev.forEach((name,id2)=>{id2!==0&&(nodeVoltages[name]=[])});let elementCurrents={},twoPi=2*Math.PI;for(let f3 of freqs){let{A:A4,b:b3}=buildLinearSystemForAC(ckt,f3,Nvar),x5=solveComplex(A4,b3);for(let id2=1;id2<ckt.nodes.count();id2++){let idx=id2-1,nodeName2=ckt.nodes.rev[id2];if(!nodeName2)continue;let series=nodeVoltages[nodeName2];series&&series.push(x5[idx]??Complex.from(0,0))}for(let r4 of ckt.R){let v12=r4.n1===0?Complex.from(0,0):x5[r4.n1-1]??Complex.from(0,0),v22=r4.n2===0?Complex.from(0,0):x5[r4.n2-1]??Complex.from(0,0),i2=Complex.from(1/r4.R,0).mul(v12.sub(v22));(elementCurrents[_a360=r4.name]||(elementCurrents[_a360]=[])).push(i2)}for(let c3 of ckt.C){let v12=c3.n1===0?Complex.from(0,0):x5[c3.n1-1]??Complex.from(0,0),v22=c3.n2===0?Complex.from(0,0):x5[c3.n2-1]??Complex.from(0,0),i2=Complex.from(0,twoPi*f3*c3.C).mul(v12.sub(v22));(elementCurrents[_b2=c3.name]||(elementCurrents[_b2]=[])).push(i2)}for(let l3 of ckt.L){let v12=l3.n1===0?Complex.from(0,0):x5[l3.n1-1]??Complex.from(0,0),v22=l3.n2===0?Complex.from(0,0):x5[l3.n2-1]??Complex.from(0,0),denom=Complex.from(0,twoPi*f3*l3.L),i2=(denom.abs()<EPS5?Complex.from(0,0):Complex.from(1,0).div(denom)).mul(v12.sub(v22));(elementCurrents[_c3=l3.name]||(elementCurrents[_c3]=[])).push(i2)}for(let vs3 of ckt.V){let i2=x5[vs3.index]??Complex.from(0,0);(elementCurrents[_d3=vs3.name]||(elementCurrents[_d3]=[])).push(i2)}}return{freqs,nodeVoltages,elementCurrents}}var VT_300K=.02585;function solveReal(A4,b3){let n3=A4.length;for(let i2=0;i2<n3;i2++){let row=A4[i2],bi3=b3[i2];if(!row||bi3==null)throw new Error("Matrix dimensions mismatch");let copy=row.slice();copy.push(bi3),A4[i2]=copy}for(let k4=0;k4<n3;k4++){let imax=k4,pivotRow=A4[k4];if(!pivotRow)throw new Error("Matrix row missing");let vmax=Math.abs(pivotRow[k4]??0);for(let i2=k4+1;i2<n3;i2++){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let v5=Math.abs(row[k4]??0);v5>vmax&&(vmax=v5,imax=i2)}if(vmax<EPS5)throw new Error("Singular matrix (real)");if(imax!==k4){let tmp=A4[k4];A4[k4]=A4[imax],A4[imax]=tmp}let pivotRowUpdated=A4[k4];if(!pivotRowUpdated)throw new Error("Pivot row missing");let pivot=pivotRowUpdated[k4];if(pivot==null)throw new Error("Zero pivot encountered");for(let i2=k4+1;i2<n3;i2++){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let entry=row[k4];if(entry==null)continue;let f2=entry/pivot;if(!(Math.abs(f2)<EPS5))for(let j4=k4;j4<=n3;j4++){let target=row[j4],source=pivotRowUpdated[j4];target==null||source==null||(row[j4]=target-f2*source)}}}let x5=new Array(n3).fill(0);for(let i2=n3-1;i2>=0;i2--){let row=A4[i2];if(!row)throw new Error("Matrix row missing");let s2=row[n3];if(s2==null)throw new Error("Augmented column missing");for(let j4=i2+1;j4<n3;j4++){let coeff=row[j4],sol=x5[j4];coeff==null||sol==null||(s2-=coeff*sol)}let pivot=row[i2];if(pivot==null)throw new Error("Zero pivot on back-substitution");x5[i2]=s2/pivot}return x5}function stampAdmittanceReal(A4,nidx,n12,n22,Y6){let i12=nidx.matrixIndexOfNode(n12),i2=nidx.matrixIndexOfNode(n22);if(i12>=0){let row1=A4[i12];if(!row1)throw new Error("Matrix row missing while stamping");row1[i12]=(row1[i12]??0)+Y6}if(i2>=0){let row2=A4[i2];if(!row2)throw new Error("Matrix row missing while stamping");row2[i2]=(row2[i2]??0)+Y6}if(i12>=0&&i2>=0){let row1=A4[i12],row2=A4[i2];if(!row1||!row2)throw new Error("Matrix row missing while stamping");row1[i2]=(row1[i2]??0)-Y6,row2[i12]=(row2[i12]??0)-Y6}}function stampCurrentReal(b3,nidx,nPlus,nMinus,current2){let iPlus=nidx.matrixIndexOfNode(nPlus),iMinus=nidx.matrixIndexOfNode(nMinus);iPlus>=0&&(b3[iPlus]=(b3[iPlus]??0)-current2),iMinus>=0&&(b3[iMinus]=(b3[iMinus]??0)+current2)}function stampVoltageSourceReal(A4,b3,nidx,source,voltage2){let i12=nidx.matrixIndexOfNode(source.n1),i2=nidx.matrixIndexOfNode(source.n2),j4=source.index;if(i12>=0){let row1=A4[i12];if(!row1)throw new Error("Matrix row missing while stamping voltage source");row1[j4]=(row1[j4]??0)+1}if(i2>=0){let row2=A4[i2];if(!row2)throw new Error("Matrix row missing while stamping voltage source");row2[j4]=(row2[j4]??0)-1}let branchRow=A4[j4];if(!branchRow)throw new Error("Branch row missing while stamping voltage source");i12>=0&&(branchRow[i12]=(branchRow[i12]??0)+1),i2>=0&&(branchRow[i2]=(branchRow[i2]??0)-1),b3[j4]=(b3[j4]??0)+voltage2}function computeEffectiveTimeStep(dtRequested,tstop){let dtEff=dtRequested>EPS5?dtRequested:Math.max(tstop/1e3,EPS5),steps=Math.max(1,Math.ceil(tstop/Math.max(dtEff,EPS5)));return{dt:steps>0?tstop/steps:tstop,steps}}function stampAllElementsAtTime(A4,b3,ckt,t35,dt4,x5,iter){for(let r4 of ckt.R){let G5=1/r4.R;stampAdmittanceReal(A4,ckt.nodes,r4.n1,r4.n2,G5)}for(let c3 of ckt.C){let Gc3=c3.C/Math.max(dt4,EPS5);stampAdmittanceReal(A4,ckt.nodes,c3.n1,c3.n2,Gc3);let Ieq=-Gc3*c3.vPrev;stampCurrentReal(b3,ckt.nodes,c3.n1,c3.n2,Ieq)}for(let l3 of ckt.L){let Gl3=Math.max(dt4,EPS5)/l3.L;stampAdmittanceReal(A4,ckt.nodes,l3.n1,l3.n2,Gl3),stampCurrentReal(b3,ckt.nodes,l3.n1,l3.n2,l3.iPrev)}for(let sw of ckt.S){let model=sw.model;if(!model)continue;let Rvalue=sw.isOn?model.Ron:model.Roff,G5=1/Math.max(Math.abs(Rvalue),EPS5);stampAdmittanceReal(A4,ckt.nodes,sw.n1,sw.n2,G5)}for(let vs3 of ckt.V){let Vt4=vs3.waveform?vs3.waveform(t35):vs3.dc||0;stampVoltageSourceReal(A4,b3,ckt.nodes,vs3,Vt4)}for(let d3 of ckt.D){let model=d3.model;if(!model)continue;let{nPlus,nMinus}=d3,vp_idx=ckt.nodes.matrixIndexOfNode(nPlus),vn_idx=ckt.nodes.matrixIndexOfNode(nMinus),v_plus_prev_iter=nPlus===0?0:x5[vp_idx]??0,v_minus_prev_iter=nMinus===0?0:x5[vn_idx]??0,vd_prev_iter=v_plus_prev_iter-v_minus_prev_iter,vd3=iter===0?d3.vdPrev:vd_prev_iter,v_thermal=model.N*VT_300K,vd_limited=vd3;vd3>.8&&(vd_limited=.8),vd3<-1&&(vd_limited=-1);let exp_val=Math.exp(vd_limited/v_thermal),id2=model.Is*(exp_val-1),gd3=Math.max(model.Is/v_thermal*exp_val,1e-12),ieq=id2-gd3*vd_limited;stampAdmittanceReal(A4,ckt.nodes,nPlus,nMinus,gd3),stampCurrentReal(b3,ckt.nodes,nPlus,nMinus,ieq)}}function updateSwitchStatesFromSolution(ckt,x5){let switched=!1;for(let sw of ckt.S){let model=sw.model;if(!model)continue;let vp3=sw.ncPos===0?0:x5[sw.ncPos-1]??0,vn3=sw.ncNeg===0?0:x5[sw.ncNeg-1]??0,vctrl=vp3-vn3,nextState=sw.isOn;sw.isOn?vctrl<model.Voff&&(nextState=!1):vctrl>model.Von&&(nextState=!0),nextState!==sw.isOn&&(sw.isOn=nextState,switched=!0)}return switched}function simulateTRAN(ckt){var _a360,_b2,_c3,_d3,_e4,_f3;if(!ckt.analyses.tran)return null;let{dt:dtRequested,tstop}=ckt.analyses.tran,{dt:dt4,steps}=computeEffectiveTimeStep(dtRequested,tstop),nNodeVars=ckt.nodes.count()-1,nVsrc=ckt.V.length,Nvar=nNodeVars+nVsrc,times=[],nodeVoltages={};ckt.nodes.rev.forEach((name,id2)=>{id2!==0&&(nodeVoltages[name]=[])});let elementCurrents={},t35=0;for(let step=0;step<=steps;step++,t35=step*dt4){times.push(t35);let x5=new Array(Nvar).fill(0);for(let iter=0;iter<20;iter++){let A4=Array.from({length:Nvar},()=>new Array(Nvar).fill(0)),b3=new Array(Nvar).fill(0);if(stampAllElementsAtTime(A4,b3,ckt,t35,dt4,x5,iter),x5=solveReal(A4,b3),!updateSwitchStatesFromSolution(ckt,x5)||iter===19)break}for(let id2=1;id2<ckt.nodes.count();id2++){let idx=id2-1,nodeName2=ckt.nodes.rev[id2];if(!nodeName2)continue;let series=nodeVoltages[nodeName2];series&&series.push(x5[idx]??0)}for(let r4 of ckt.R){let v12=r4.n1===0?0:x5[r4.n1-1]??0,v22=r4.n2===0?0:x5[r4.n2-1]??0,i2=(v12-v22)/r4.R;(elementCurrents[_a360=r4.name]||(elementCurrents[_a360]=[])).push(i2)}for(let c3 of ckt.C){let v12=c3.n1===0?0:x5[c3.n1-1]??0,v22=c3.n2===0?0:x5[c3.n2-1]??0,i2=c3.C*(v12-v22-c3.vPrev)/Math.max(dt4,EPS5);(elementCurrents[_b2=c3.name]||(elementCurrents[_b2]=[])).push(i2)}for(let l3 of ckt.L){let v12=l3.n1===0?0:x5[l3.n1-1]??0,v22=l3.n2===0?0:x5[l3.n2-1]??0,i2=Math.max(dt4,EPS5)/l3.L*(v12-v22)+l3.iPrev;(elementCurrents[_c3=l3.name]||(elementCurrents[_c3]=[])).push(i2)}for(let vs3 of ckt.V){let i2=x5[vs3.index]??0;(elementCurrents[_d3=vs3.name]||(elementCurrents[_d3]=[])).push(i2)}for(let sw of ckt.S){let model=sw.model;if(!model)continue;let v12=sw.n1===0?0:x5[sw.n1-1]??0,v22=sw.n2===0?0:x5[sw.n2-1]??0,Rvalue=sw.isOn?model.Ron:model.Roff,Rclamped=Math.max(Math.abs(Rvalue),EPS5),i2=(v12-v22)/Rclamped;(elementCurrents[_e4=sw.name]||(elementCurrents[_e4]=[])).push(i2)}for(let d3 of ckt.D){if(!d3.model)continue;let{nPlus,nMinus,model}=d3,v12=nPlus===0?0:x5[nPlus-1]??0,v22=nMinus===0?0:x5[nMinus-1]??0,vd3=v12-v22,v_thermal=model.N*VT_300K,exp_val=Math.exp(vd3/v_thermal),id2=model.Is*(exp_val-1);(elementCurrents[_f3=d3.name]||(elementCurrents[_f3]=[])).push(id2)}for(let c3 of ckt.C){let v12=c3.n1===0?0:x5[c3.n1-1]??0,v22=c3.n2===0?0:x5[c3.n2-1]??0;c3.vPrev=v12-v22}for(let l3 of ckt.L){let v12=l3.n1===0?0:x5[l3.n1-1]??0,v22=l3.n2===0?0:x5[l3.n2-1]??0,Gl3=Math.max(dt4,EPS5)/l3.L;l3.iPrev=Gl3*(v12-v22)+l3.iPrev}for(let d3 of ckt.D){let v12=d3.nPlus===0?0:x5[d3.nPlus-1]??0,v22=d3.nMinus===0?0:x5[d3.nMinus-1]??0;d3.vdPrev=v12-v22}}if(ckt.probes.tran.length>0){let probedVoltages={},upperProbes=ckt.probes.tran.map(p4=>p4.toUpperCase());for(let nodeName2 in nodeVoltages)upperProbes.includes(nodeName2.toUpperCase())&&(probedVoltages[nodeName2]=nodeVoltages[nodeName2]);return{times,nodeVoltages:probedVoltages,elementCurrents}}return{times,nodeVoltages,elementCurrents}}function simulate(netlistText){let circuit=parseNetlist(netlistText),ac3=simulateAC(circuit),tran=simulateTRAN(circuit);return{circuit,ac:ac3,tran}}function spiceyTranToVGraphs(tranResult,ckt,simulation_experiment_id){if(!tranResult||!ckt.analyses.tran)return[];let{dt:dt4,tstop}=ckt.analyses.tran,{times,nodeVoltages}=tranResult,graphs=[];for(let nodeName2 in nodeVoltages){let voltage_levels=nodeVoltages[nodeName2];graphs.push({type:"simulation_transient_voltage_graph",simulation_transient_voltage_graph_id:`stvg_${simulation_experiment_id}_${nodeName2}`,simulation_experiment_id,timestamps_ms:times.map(t35=>t35*1e3),voltage_levels,time_per_step:dt4*1e3,start_time_ms:0,end_time_ms:tstop*1e3,name:`${nodeName2}`})}return graphs}init_dist3();init_dist6();var import_debug19=__toESM(require_browser(),1),import_react4=__toESM(require_react(),1);init_dist();init_dist();init_dist();init_dist();init_dist5();init_dist();init_dist3();var emptyBounds=()=>({minX:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY}),includePoint=(bounds,x5,y5)=>{bounds.minX=Math.min(bounds.minX,x5),bounds.maxX=Math.max(bounds.maxX,x5),bounds.minY=Math.min(bounds.minY,y5),bounds.maxY=Math.max(bounds.maxY,y5)},includeRect=(bounds,x5,y5,width,height)=>{includePoint(bounds,x5-width/2,y5-height/2),includePoint(bounds,x5+width/2,y5+height/2)},hasBounds=bounds=>Number.isFinite(bounds.minX)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxY),getPrimaryPcbComponent=circuitJson=>circuitJson.find(elm=>elm.type==="pcb_component"),getComponentPcbElements=(circuitJson,pcbComponentId)=>pcbComponentId?circuitJson.filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponentId):[],computeOverallBounds=(elements,fallbackBounds)=>{let bounds=emptyBounds();for(let elm of elements){if(elm.type==="pcb_smtpad"){if("points"in elm)for(let point6 of elm.points)includePoint(bounds,point6.x,point6.y);else"x"in elm&&"y"in elm&&"width"in elm&&"height"in elm?includeRect(bounds,elm.x,elm.y,elm.width,elm.height):"x"in elm&&"y"in elm&&"radius"in elm&&includeRect(bounds,elm.x,elm.y,elm.radius*2,elm.radius*2);continue}if(elm.type==="pcb_plated_hole"){"outer_width"in elm&&"outer_height"in elm?includeRect(bounds,elm.x,elm.y,elm.outer_width,elm.outer_height):"outer_diameter"in elm&&includeRect(bounds,elm.x,elm.y,elm.outer_diameter,elm.outer_diameter);continue}if(elm.type==="pcb_hole"){"hole_diameter"in elm?includeRect(bounds,elm.x,elm.y,elm.hole_diameter,elm.hole_diameter):"hole_width"in elm&&"hole_height"in elm&&includeRect(bounds,elm.x,elm.y,elm.hole_width,elm.hole_height);continue}if(elm.type==="pcb_silkscreen_path"){for(let point6 of elm.route)includePoint(bounds,point6.x,point6.y);continue}elm.type==="pcb_component"&&includeRect(bounds,elm.center.x,elm.center.y,elm.width,elm.height)}return hasBounds(bounds)?bounds:fallbackBounds},computePadBounds=(elements,fallbackBounds)=>{let bounds=emptyBounds();for(let elm of elements){if(elm.type==="pcb_smtpad"&&("x"in elm&&"y"in elm&&includePoint(bounds,elm.x,elm.y),"points"in elm))for(let point6 of elm.points)includePoint(bounds,point6.x,point6.y);elm.type==="pcb_plated_hole"&&elm.pcb_port_id&&includePoint(bounds,elm.x,elm.y)}return hasBounds(bounds)?bounds:fallbackBounds},guessCableInsertCenter=circuitJson=>{let pcbComponent=getPrimaryPcbComponent(circuitJson);if(!pcbComponent)return{x:0,y:0,side:"bottom"};let fallbackBounds={minX:pcbComponent.center.x-pcbComponent.width/2,maxX:pcbComponent.center.x+pcbComponent.width/2,minY:pcbComponent.center.y-pcbComponent.height/2,maxY:pcbComponent.center.y+pcbComponent.height/2},elements=getComponentPcbElements(circuitJson,pcbComponent.pcb_component_id),overallBounds=computeOverallBounds(elements,fallbackBounds),padBounds=computePadBounds(elements,fallbackBounds),sideMargins={left:padBounds.minX-overallBounds.minX,right:overallBounds.maxX-padBounds.maxX,top:overallBounds.maxY-padBounds.maxY,bottom:padBounds.minY-overallBounds.minY},side=Object.entries(sideMargins).sort((a2,b3)=>b3[1]-a2[1])[0]?.[0]??"bottom",width=overallBounds.maxX-overallBounds.minX,height=overallBounds.maxY-overallBounds.minY,offset=Math.max(.4,Math.min(width,height)*.08),centerX=(overallBounds.minX+overallBounds.maxX)/2,centerY=(overallBounds.minY+overallBounds.maxY)/2;return side==="top"?{x:centerX,y:overallBounds.maxY+offset,side,pcbComponentId:pcbComponent.pcb_component_id}:side==="left"?{x:overallBounds.minX-offset,y:centerY,side,pcbComponentId:pcbComponent.pcb_component_id}:side==="right"?{x:overallBounds.maxX+offset,y:centerY,side,pcbComponentId:pcbComponent.pcb_component_id}:{x:centerX,y:overallBounds.minY-offset,side:"bottom",pcbComponentId:pcbComponent.pcb_component_id}};init_dist();init_dist4();init_dist();var Z3=Object.defineProperty,z4=(s2,t35,e4)=>t35 in s2?Z3(s2,t35,{enumerable:!0,configurable:!0,writable:!0,value:e4}):s2[t35]=e4,p3=(s2,t35,e4)=>z4(s2,typeof t35!="symbol"?t35+"":t35,e4),$5={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},E3=s2=>(s2 instanceof Float64Array||s2 instanceof Float32Array||Array.isArray(s2)&&s2.every(t35=>typeof t35=="number"))&&[6,16].some(t35=>s2.length===t35),P4=s2=>s2 instanceof DOMMatrix||s2 instanceof y4||typeof s2=="object"&&Object.keys($5).every(t35=>s2&&t35 in s2),g6=s2=>{let t35=new y4,e4=Array.from(s2);if(!E3(e4))throw TypeError(`CSSMatrix: "${e4.join(",")}" must be an array with 6/16 numbers.`);if(e4.length===16){let[n3,i2,r4,a2,l3,m3,h4,c3,u4,f2,w4,o3,d3,A4,M5,b3]=e4;t35.m11=n3,t35.a=n3,t35.m21=l3,t35.c=l3,t35.m31=u4,t35.m41=d3,t35.e=d3,t35.m12=i2,t35.b=i2,t35.m22=m3,t35.d=m3,t35.m32=f2,t35.m42=A4,t35.f=A4,t35.m13=r4,t35.m23=h4,t35.m33=w4,t35.m43=M5,t35.m14=a2,t35.m24=c3,t35.m34=o3,t35.m44=b3}else if(e4.length===6){let[n3,i2,r4,a2,l3,m3]=e4;t35.m11=n3,t35.a=n3,t35.m12=i2,t35.b=i2,t35.m21=r4,t35.c=r4,t35.m22=a2,t35.d=a2,t35.m41=l3,t35.e=l3,t35.m42=m3,t35.f=m3}return t35},X4=s2=>{if(P4(s2))return g6([s2.m11,s2.m12,s2.m13,s2.m14,s2.m21,s2.m22,s2.m23,s2.m24,s2.m31,s2.m32,s2.m33,s2.m34,s2.m41,s2.m42,s2.m43,s2.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(s2)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},O3=s2=>{if(typeof s2!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(s2)}" is not a string.`);let t35=String(s2).replace(/\s/g,""),e4=new y4,n3=`CSSMatrix: invalid transform string "${s2}"`;return t35.split(")").filter(i2=>i2).forEach(i2=>{let[r4,a2]=i2.split("(");if(!a2)throw TypeError(n3);let l3=a2.split(",").map(o3=>o3.includes("rad")?parseFloat(o3)*(180/Math.PI):parseFloat(o3)),[m3,h4,c3,u4]=l3,f2=[m3,h4,c3],w4=[m3,h4,c3,u4];if(r4==="perspective"&&m3&&[h4,c3].every(o3=>o3===void 0))e4.m34=-1/m3;else if(r4.includes("matrix")&&[6,16].includes(l3.length)&&l3.every(o3=>!Number.isNaN(+o3))){let o3=l3.map(d3=>Math.abs(d3)<1e-6?0:d3);e4=e4.multiply(g6(o3))}else if(r4==="translate3d"&&f2.every(o3=>!Number.isNaN(+o3)))e4=e4.translate(m3,h4,c3);else if(r4==="translate"&&m3&&c3===void 0)e4=e4.translate(m3,h4||0,0);else if(r4==="rotate3d"&&w4.every(o3=>!Number.isNaN(+o3))&&u4)e4=e4.rotateAxisAngle(m3,h4,c3,u4);else if(r4==="rotate"&&m3&&[h4,c3].every(o3=>o3===void 0))e4=e4.rotate(0,0,m3);else if(r4==="scale3d"&&f2.every(o3=>!Number.isNaN(+o3))&&f2.some(o3=>o3!==1))e4=e4.scale(m3,h4,c3);else if(r4==="scale"&&!Number.isNaN(m3)&&(m3!==1||h4!==1)&&c3===void 0){let d3=Number.isNaN(+h4)?m3:h4;e4=e4.scale(m3,d3,1)}else if(r4==="skew"&&(m3||!Number.isNaN(m3)&&h4)&&c3===void 0)e4=e4.skew(m3,h4||0);else if(["translate","rotate","scale","skew"].some(o3=>r4.includes(o3))&&/[XYZ]/.test(r4)&&m3&&[h4,c3].every(o3=>o3===void 0))if(r4==="skewX"||r4==="skewY")e4=e4[r4](m3);else{let o3=r4.replace(/[XYZ]/,""),d3=r4.replace(o3,""),A4=["X","Y","Z"].indexOf(d3),M5=o3==="scale"?1:0,b3=[A4===0?m3:M5,A4===1?m3:M5,A4===2?m3:M5];e4=e4[o3](...b3)}else throw TypeError(n3)}),e4},x4=(s2,t35)=>t35?[s2.a,s2.b,s2.c,s2.d,s2.e,s2.f]:[s2.m11,s2.m12,s2.m13,s2.m14,s2.m21,s2.m22,s2.m23,s2.m24,s2.m31,s2.m32,s2.m33,s2.m34,s2.m41,s2.m42,s2.m43,s2.m44],Y4=(s2,t35,e4)=>{let n3=new y4;return n3.m41=s2,n3.e=s2,n3.m42=t35,n3.f=t35,n3.m43=e4,n3},F4=(s2,t35,e4)=>{let n3=new y4,i2=Math.PI/180,r4=s2*i2,a2=t35*i2,l3=e4*i2,m3=Math.cos(r4),h4=-Math.sin(r4),c3=Math.cos(a2),u4=-Math.sin(a2),f2=Math.cos(l3),w4=-Math.sin(l3),o3=c3*f2,d3=-c3*w4;n3.m11=o3,n3.a=o3,n3.m12=d3,n3.b=d3,n3.m13=u4;let A4=h4*u4*f2+m3*w4;n3.m21=A4,n3.c=A4;let M5=m3*f2-h4*u4*w4;return n3.m22=M5,n3.d=M5,n3.m23=-h4*c3,n3.m31=h4*w4-m3*u4*f2,n3.m32=h4*f2+m3*u4*w4,n3.m33=m3*c3,n3},T4=(s2,t35,e4,n3)=>{let i2=new y4,r4=Math.sqrt(s2*s2+t35*t35+e4*e4);if(r4===0)return i2;let a2=s2/r4,l3=t35/r4,m3=e4/r4,h4=n3*(Math.PI/360),c3=Math.sin(h4),u4=Math.cos(h4),f2=c3*c3,w4=a2*a2,o3=l3*l3,d3=m3*m3,A4=1-2*(o3+d3)*f2;i2.m11=A4,i2.a=A4;let M5=2*(a2*l3*f2+m3*c3*u4);i2.m12=M5,i2.b=M5,i2.m13=2*(a2*m3*f2-l3*c3*u4);let b3=2*(l3*a2*f2-m3*c3*u4);i2.m21=b3,i2.c=b3;let k4=1-2*(d3+w4)*f2;return i2.m22=k4,i2.d=k4,i2.m23=2*(l3*m3*f2+a2*c3*u4),i2.m31=2*(m3*a2*f2+l3*c3*u4),i2.m32=2*(m3*l3*f2-a2*c3*u4),i2.m33=1-2*(w4+o3)*f2,i2},I4=(s2,t35,e4)=>{let n3=new y4;return n3.m11=s2,n3.a=s2,n3.m22=t35,n3.d=t35,n3.m33=e4,n3},v4=(s2,t35)=>{let e4=new y4;if(s2){let n3=s2*Math.PI/180,i2=Math.tan(n3);e4.m21=i2,e4.c=i2}if(t35){let n3=t35*Math.PI/180,i2=Math.tan(n3);e4.m12=i2,e4.b=i2}return e4},R3=s2=>v4(s2,0),D4=s2=>v4(0,s2),N4=(s2,t35)=>{let e4=t35.m11*s2.m11+t35.m12*s2.m21+t35.m13*s2.m31+t35.m14*s2.m41,n3=t35.m11*s2.m12+t35.m12*s2.m22+t35.m13*s2.m32+t35.m14*s2.m42,i2=t35.m11*s2.m13+t35.m12*s2.m23+t35.m13*s2.m33+t35.m14*s2.m43,r4=t35.m11*s2.m14+t35.m12*s2.m24+t35.m13*s2.m34+t35.m14*s2.m44,a2=t35.m21*s2.m11+t35.m22*s2.m21+t35.m23*s2.m31+t35.m24*s2.m41,l3=t35.m21*s2.m12+t35.m22*s2.m22+t35.m23*s2.m32+t35.m24*s2.m42,m3=t35.m21*s2.m13+t35.m22*s2.m23+t35.m23*s2.m33+t35.m24*s2.m43,h4=t35.m21*s2.m14+t35.m22*s2.m24+t35.m23*s2.m34+t35.m24*s2.m44,c3=t35.m31*s2.m11+t35.m32*s2.m21+t35.m33*s2.m31+t35.m34*s2.m41,u4=t35.m31*s2.m12+t35.m32*s2.m22+t35.m33*s2.m32+t35.m34*s2.m42,f2=t35.m31*s2.m13+t35.m32*s2.m23+t35.m33*s2.m33+t35.m34*s2.m43,w4=t35.m31*s2.m14+t35.m32*s2.m24+t35.m33*s2.m34+t35.m34*s2.m44,o3=t35.m41*s2.m11+t35.m42*s2.m21+t35.m43*s2.m31+t35.m44*s2.m41,d3=t35.m41*s2.m12+t35.m42*s2.m22+t35.m43*s2.m32+t35.m44*s2.m42,A4=t35.m41*s2.m13+t35.m42*s2.m23+t35.m43*s2.m33+t35.m44*s2.m43,M5=t35.m41*s2.m14+t35.m42*s2.m24+t35.m43*s2.m34+t35.m44*s2.m44;return g6([e4,n3,i2,r4,a2,l3,m3,h4,c3,u4,f2,w4,o3,d3,A4,M5])},y4=class{constructor(t35){return this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0,this.m11=1,this.m12=0,this.m13=0,this.m14=0,this.m21=0,this.m22=1,this.m23=0,this.m24=0,this.m31=0,this.m32=0,this.m33=1,this.m34=0,this.m41=0,this.m42=0,this.m43=0,this.m44=1,t35?this.setMatrixValue(t35):this}get isIdentity(){return this.m11===1&&this.m12===0&&this.m13===0&&this.m14===0&&this.m21===0&&this.m22===1&&this.m23===0&&this.m24===0&&this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m41===0&&this.m42===0&&this.m43===0&&this.m44===1}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t35){return typeof t35=="string"&&t35.length&&t35!=="none"?O3(t35):Array.isArray(t35)||t35 instanceof Float64Array||t35 instanceof Float32Array?g6(t35):typeof t35=="object"?X4(t35):this}toFloat32Array(t35){return Float32Array.from(x4(this,t35))}toFloat64Array(t35){return Float64Array.from(x4(this,t35))}toString(){let{is2D:t35}=this,e4=this.toFloat64Array(t35).join(", ");return`${t35?"matrix":"matrix3d"}(${e4})`}toJSON(){let{is2D:t35,isIdentity:e4}=this;return{...this,is2D:t35,isIdentity:e4}}multiply(t35){return N4(this,t35)}translate(t35,e4,n3){let i2=t35,r4=e4,a2=n3;return typeof r4>"u"&&(r4=0),typeof a2>"u"&&(a2=0),N4(this,Y4(i2,r4,a2))}scale(t35,e4,n3){let i2=t35,r4=e4,a2=n3;return typeof r4>"u"&&(r4=t35),typeof a2>"u"&&(a2=1),N4(this,I4(i2,r4,a2))}rotate(t35,e4,n3){let i2=t35,r4=e4||0,a2=n3||0;return typeof t35=="number"&&typeof e4>"u"&&typeof n3>"u"&&(a2=i2,i2=0,r4=0),N4(this,F4(i2,r4,a2))}rotateAxisAngle(t35,e4,n3,i2){if([t35,e4,n3,i2].some(r4=>Number.isNaN(+r4)))throw new TypeError("CSSMatrix: expecting 4 values");return N4(this,T4(t35,e4,n3,i2))}skewX(t35){return N4(this,R3(t35))}skewY(t35){return N4(this,D4(t35))}skew(t35,e4){return N4(this,v4(t35,e4))}transformPoint(t35){let e4=this.m11*t35.x+this.m21*t35.y+this.m31*t35.z+this.m41*t35.w,n3=this.m12*t35.x+this.m22*t35.y+this.m32*t35.z+this.m42*t35.w,i2=this.m13*t35.x+this.m23*t35.y+this.m33*t35.z+this.m43*t35.w,r4=this.m14*t35.x+this.m24*t35.y+this.m34*t35.z+this.m44*t35.w;return t35 instanceof DOMPoint?new DOMPoint(e4,n3,i2,r4):{x:e4,y:n3,z:i2,w:r4}}};p3(y4,"Translate",Y4),p3(y4,"Rotate",F4),p3(y4,"RotateAxisAngle",T4),p3(y4,"Scale",I4),p3(y4,"SkewX",R3),p3(y4,"SkewY",D4),p3(y4,"Skew",v4),p3(y4,"Multiply",N4),p3(y4,"fromArray",g6),p3(y4,"fromMatrix",X4),p3(y4,"fromString",O3),p3(y4,"toArray",x4),p3(y4,"isCompatibleArray",E3),p3(y4,"isCompatibleObject",P4);var Bt3=(t35,e4,n3)=>{let[o3,r4]=t35,[s2,a2]=e4;return[o3+(s2-o3)*n3,r4+(a2-r4)*n3]},E4=Bt3,$t3=(t35,e4)=>Math.sqrt((t35[0]-e4[0])*(t35[0]-e4[0])+(t35[1]-e4[1])*(t35[1]-e4[1])),re3=$t3,ce3=(t35,e4,n3,o3)=>re3([t35,e4],[n3,o3]),Le3=(t35,e4,n3,o3,r4)=>{let s2={x:t35,y:e4};if(typeof r4=="number"){let a2=re3([t35,e4],[n3,o3]);if(r4<=0)s2={x:t35,y:e4};else if(r4>=a2)s2={x:n3,y:o3};else{let[i2,m3]=E4([t35,e4],[n3,o3],r4/a2);s2={x:i2,y:m3}}}return s2},Ge3=(t35,e4,n3,o3)=>{let{min:r4,max:s2}=Math;return[r4(t35,n3),r4(e4,o3),s2(t35,n3),s2(e4,o3)]},ot3={getLineBBox:Ge3,getLineLength:ce3,getPointAtLineLength:Le3},st3=(t35,e4,n3)=>{let o3=n3/2,r4=Math.sin(o3),s2=Math.cos(o3),a2=t35**2*r4**2,i2=e4**2*s2**2,m3=Math.sqrt(a2+i2)*n3;return Math.abs(m3)},pe3=(t35,e4,n3,o3,r4,s2)=>{let{sin:a2,cos:i2}=Math,m3=i2(r4),u4=a2(r4),l3=n3*i2(s2),c3=o3*a2(s2);return[t35+m3*l3-u4*c3,e4+u4*l3+m3*c3]},at3=(t35,e4)=>{let{x:n3,y:o3}=t35,{x:r4,y:s2}=e4,a2=n3*r4+o3*s2,i2=Math.sqrt((n3**2+o3**2)*(r4**2+s2**2));return(n3*s2-o3*r4<0?-1:1)*Math.acos(a2/i2)},_e3=(t35,e4,n3,o3,r4,s2,a2,i2,m3)=>{let{abs:u4,sin:l3,cos:c3,sqrt:f2,PI:g7}=Math,p4=u4(n3),h4=u4(o3),S3=(r4%360+360)%360*(g7/180);if(t35===i2&&e4===m3)return{rx:p4,ry:h4,startAngle:0,endAngle:0,center:{x:i2,y:m3}};if(p4===0||h4===0)return{rx:p4,ry:h4,startAngle:0,endAngle:0,center:{x:(i2+t35)/2,y:(m3+e4)/2}};let A4=(t35-i2)/2,d3=(e4-m3)/2,b3={x:c3(S3)*A4+l3(S3)*d3,y:-l3(S3)*A4+c3(S3)*d3},P5=b3.x**2/p4**2+b3.y**2/h4**2;P5>1&&(p4*=f2(P5),h4*=f2(P5));let C4=p4**2*h4**2-p4**2*b3.y**2-h4**2*b3.x**2,V4=p4**2*b3.y**2+h4**2*b3.x**2,k4=C4/V4;k4=k4<0?0:k4;let w4=(s2!==a2?1:-1)*f2(k4),v5={x:w4*(p4*b3.y/h4),y:w4*(-(h4*b3.x)/p4)},j4={x:c3(S3)*v5.x-l3(S3)*v5.y+(t35+i2)/2,y:l3(S3)*v5.x+c3(S3)*v5.y+(e4+m3)/2},ue3={x:(b3.x-v5.x)/p4,y:(b3.y-v5.y)/h4},q4=at3({x:1,y:0},ue3),x5={x:(-b3.x-v5.x)/p4,y:(-b3.y-v5.y)/h4},Q4=at3(ue3,x5);!a2&&Q4>0?Q4-=2*g7:a2&&Q4<0&&(Q4+=2*g7),Q4%=2*g7;let H4=q4+Q4;return{center:j4,startAngle:q4,endAngle:H4,rx:p4,ry:h4}},ve3=(t35,e4,n3,o3,r4,s2,a2,i2,m3)=>{let{rx:u4,ry:l3,startAngle:c3,endAngle:f2}=_e3(t35,e4,n3,o3,r4,s2,a2,i2,m3);return st3(u4,l3,f2-c3)},mt3=(t35,e4,n3,o3,r4,s2,a2,i2,m3,u4)=>{let l3={x:t35,y:e4},{center:c3,rx:f2,ry:g7,startAngle:p4,endAngle:h4}=_e3(t35,e4,n3,o3,r4,s2,a2,i2,m3);if(typeof u4=="number"){let y5=st3(f2,g7,h4-p4);if(u4<=0)l3={x:t35,y:e4};else if(u4>=y5)l3={x:i2,y:m3};else{if(t35===i2&&e4===m3)return{x:i2,y:m3};if(f2===0||g7===0)return Le3(t35,e4,i2,m3,u4);let{PI:S3,cos:A4,sin:d3}=Math,b3=h4-p4,C4=(r4%360+360)%360*(S3/180),V4=p4+b3*(u4/y5),k4=f2*A4(V4),w4=g7*d3(V4);l3={x:A4(C4)*k4-d3(C4)*w4+c3.x,y:d3(C4)*k4+A4(C4)*w4+c3.y}}}return l3},it3=(t35,e4,n3,o3,r4,s2,a2,i2,m3)=>{let{center:u4,rx:l3,ry:c3,startAngle:f2,endAngle:g7}=_e3(t35,e4,n3,o3,r4,s2,a2,i2,m3),p4=g7-f2,{min:h4,max:y5,tan:S3,atan2:A4,PI:d3}=Math,{x:b3,y:P5}=u4,C4=r4*d3/180,V4=S3(C4),k4=A4(-c3*V4,l3),w4=k4,v5=k4+d3,j4=A4(c3,l3*V4),ue3=j4+d3,q4=[i2],x5=[m3],Q4=h4(t35,i2),H4=y5(t35,i2),I5=h4(e4,m3),W5=y5(e4,m3),ye3=g7-p4*1e-5,le3=pe3(b3,P5,l3,c3,C4,ye3),N6=g7-p4*.99999,D6=pe3(b3,P5,l3,c3,C4,N6);if(le3[0]>H4||D6[0]>H4){let z5=pe3(b3,P5,l3,c3,C4,w4);q4.push(z5[0]),x5.push(z5[1])}if(le3[0]<Q4||D6[0]<Q4){let z5=pe3(b3,P5,l3,c3,C4,v5);q4.push(z5[0]),x5.push(z5[1])}if(le3[1]<I5||D6[1]<I5){let z5=pe3(b3,P5,l3,c3,C4,ue3);q4.push(z5[0]),x5.push(z5[1])}if(le3[1]>W5||D6[1]>W5){let z5=pe3(b3,P5,l3,c3,C4,j4);q4.push(z5[0]),x5.push(z5[1])}return Q4=h4.apply([],q4),I5=h4.apply([],x5),H4=y5.apply([],q4),W5=y5.apply([],x5),[Q4,I5,H4,W5]},ut3={angleBetween:at3,arcLength:st3,arcPoint:pe3,getArcBBox:it3,getArcLength:ve3,getArcProps:_e3,getPointAtArcLength:mt3},lt3=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],zt3=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Vt3=t35=>{let e4=[];for(let n3=t35,o3=n3.length,r4=o3-1;o3>1;o3-=1,r4-=1){let s2=[];for(let a2=0;a2<r4;a2+=1)s2.push({x:r4*(n3[a2+1].x-n3[a2].x),y:r4*(n3[a2+1].y-n3[a2].y),t:0});e4.push(s2),n3=s2}return e4},Rt3=(t35,e4)=>{if(e4===0)return t35[0].t=0,t35[0];let n3=t35.length-1;if(e4===1)return t35[n3].t=1,t35[n3];let o3=1-e4,r4=t35;if(n3===0)return t35[0].t=e4,t35[0];if(n3===1)return{x:o3*r4[0].x+e4*r4[1].x,y:o3*r4[0].y+e4*r4[1].y,t:e4};let s2=o3*o3,a2=e4*e4,i2=0,m3=0,u4=0,l3=0;return n3===2?(r4=[r4[0],r4[1],r4[2],{x:0,y:0}],i2=s2,m3=o3*e4*2,u4=a2):n3===3&&(i2=s2*o3,m3=s2*e4*3,u4=o3*a2*3,l3=e4*a2),{x:i2*r4[0].x+m3*r4[1].x+u4*r4[2].x+l3*r4[3].x,y:i2*r4[0].y+m3*r4[1].y+u4*r4[2].y+l3*r4[3].y,t:e4}},kt3=(t35,e4)=>{let n3=t35(e4),o3=n3.x*n3.x+n3.y*n3.y;return Math.sqrt(o3)},qt3=t35=>{let n3=lt3.length,o3=0;for(let r4=0,s2;r4<n3;r4++)s2=.5*lt3[r4]+.5,o3+=zt3[r4]*kt3(t35,s2);return .5*o3},fe3=t35=>{let e4=[];for(let o3=0,r4=t35.length,s2=2;o3<r4;o3+=s2)e4.push({x:t35[o3],y:t35[o3+1]});let n3=Vt3(e4);return qt3(o3=>Rt3(n3[0],o3))},Qt3=1e-8,Ne3=([t35,e4,n3])=>{let o3=Math.min(t35,n3),r4=Math.max(t35,n3);if(e4>=t35?n3>=e4:n3<=e4)return[o3,r4];let s2=(t35*n3-e4*e4)/(t35-2*e4+n3);return s2<o3?[s2,r4]:[o3,s2]},Ue3=([t35,e4,n3,o3])=>{let r4=t35-3*e4+3*n3-o3;if(Math.abs(r4)<Qt3)return t35===o3&&t35===e4?[t35,o3]:Ne3([t35,-.5*t35+1.5*e4,t35-3*e4+3*n3]);let s2=-t35*n3+t35*o3-e4*n3-e4*o3+e4*e4+n3*n3;if(s2<=0)return[Math.min(t35,o3),Math.max(t35,o3)];let a2=Math.sqrt(s2),i2=Math.min(t35,o3),m3=Math.max(t35,o3),u4=t35-2*e4+n3;for(let l3=(u4+a2)/r4,c3=1;c3<=2;l3=(u4-a2)/r4,c3++)if(l3>0&&l3<1){let f2=t35*(1-l3)*(1-l3)*(1-l3)+e4*3*(1-l3)*(1-l3)*l3+n3*3*(1-l3)*l3*l3+o3*l3*l3*l3;f2<i2&&(i2=f2),f2>m3&&(m3=f2)}return[i2,m3]},ct3={bezierLength:qt3,calculateBezier:kt3,CBEZIER_MINMAX_EPSILON:Qt3,computeBezier:Rt3,Cvalues:zt3,deriveBezier:Vt3,getBezierLength:fe3,minmaxC:Ue3,minmaxQ:Ne3,Tvalues:lt3},Dt3=([t35,e4,n3,o3,r4,s2,a2,i2],m3)=>{let u4=1-m3;return{x:u4**3*t35+3*u4**2*m3*n3+3*u4*m3**2*r4+m3**3*a2,y:u4**3*e4+3*u4**2*m3*o3+3*u4*m3**2*s2+m3**3*i2}},Pe3=(t35,e4,n3,o3,r4,s2,a2,i2)=>fe3([t35,e4,n3,o3,r4,s2,a2,i2]),pt3=(t35,e4,n3,o3,r4,s2,a2,i2,m3)=>{let u4=typeof m3=="number",l3={x:t35,y:e4};if(u4){let c3=fe3([t35,e4,n3,o3,r4,s2,a2,i2]);m3<=0||(m3>=c3?l3={x:a2,y:i2}:l3=Dt3([t35,e4,n3,o3,r4,s2,a2,i2],m3/c3))}return l3},Fe3=(t35,e4,n3,o3,r4,s2,a2,i2)=>{let m3=Ue3([t35,n3,r4,a2]),u4=Ue3([e4,o3,s2,i2]);return[m3[0],u4[0],m3[1],u4[1]]},ft3={getCubicBBox:Fe3,getCubicLength:Pe3,getPointAtCubicLength:pt3,getPointAtCubicSegmentLength:Dt3},Et3=([t35,e4,n3,o3,r4,s2],a2)=>{let i2=1-a2;return{x:i2**2*t35+2*i2*a2*n3+a2**2*r4,y:i2**2*e4+2*i2*a2*o3+a2**2*s2}},xe3=(t35,e4,n3,o3,r4,s2)=>fe3([t35,e4,n3,o3,r4,s2]),gt3=(t35,e4,n3,o3,r4,s2,a2)=>{let i2=typeof a2=="number",m3={x:t35,y:e4};if(i2){let u4=fe3([t35,e4,n3,o3,r4,s2]);a2<=0||(a2>=u4?m3={x:r4,y:s2}:m3=Et3([t35,e4,n3,o3,r4,s2],a2/u4))}return m3},Ke3=(t35,e4,n3,o3,r4,s2)=>{let a2=Ne3([t35,n3,r4]),i2=Ne3([e4,o3,s2]);return[a2[0],i2[0],a2[1],i2[1]]},ht3={getPointAtQuadLength:gt3,getPointAtQuadSegmentLength:Et3,getQuadBBox:Ke3,getQuadLength:xe3},jt3=t35=>{let e4=t35.length,n3=-1,o3,r4=t35[e4-1],s2=0;for(;++n3<e4;)o3=r4,r4=t35[n3],s2+=o3[1]*r4[0]-o3[0]*r4[1];return s2/2},Ht3=t35=>t35.reduce((e4,n3,o3)=>o3?e4+re3(t35[o3-1],n3):0,0),bt2={polygonArea:jt3,polygonLength:Ht3},Zt3=(t35,e4,n3)=>{let{sin:o3,cos:r4}=Math,s2=t35*r4(n3)-e4*o3(n3),a2=t35*o3(n3)+e4*r4(n3);return{x:s2,y:a2}},ne3=Zt3,Gt3=(t35,e4)=>{let n3=e4>=1?10**e4:1;return e4>0?Math.round(t35*n3)/n3:Math.round(t35)},M4=Gt3,_t3={origin:[0,0,0],round:4},O4=_t3,Ut3={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z4=Ut3,Ft3=t35=>{let e4=t35.pathValue[t35.segmentStart],n3=e4.toLowerCase(),{data:o3}=t35;for(;o3.length>=Z4[n3]&&(n3==="m"&&o3.length>2?(t35.segments.push([e4].concat(o3.splice(0,2))),n3="l",e4=e4==="m"?"l":"L"):t35.segments.push([e4].concat(o3.splice(0,Z4[n3]))),!!Z4[n3]););},Se3=Ft3,Kt3="SVGPathCommander Error",R4=Kt3,Jt3=t35=>{let{index:e4,pathValue:n3}=t35,o3=n3.charCodeAt(e4);if(o3===48){t35.param=0,t35.index+=1;return}if(o3===49){t35.param=1,t35.index+=1;return}t35.err=`${R4}: invalid Arc flag "${n3[e4]}", expecting 0 or 1 at index ${e4}`},we3=Jt3,Wt3=t35=>t35>=48&&t35<=57,B4=Wt3,Xt3="Invalid path value",$6=Xt3,Yt3=t35=>{let{max:e4,pathValue:n3,index:o3}=t35,r4=o3,s2=!1,a2=!1,i2=!1,m3=!1,u4;if(r4>=e4){t35.err=`${R4}: ${$6} at index ${r4}, "pathValue" is missing param`;return}if(u4=n3.charCodeAt(r4),(u4===43||u4===45)&&(r4+=1,u4=n3.charCodeAt(r4)),!B4(u4)&&u4!==46){t35.err=`${R4}: ${$6} at index ${r4}, "${n3[r4]}" is not a number`;return}if(u4!==46){if(s2=u4===48,r4+=1,u4=n3.charCodeAt(r4),s2&&r4<e4&&u4&&B4(u4)){t35.err=`${R4}: ${$6} at index ${o3}, "${n3[o3]}" illegal number`;return}for(;r4<e4&&B4(n3.charCodeAt(r4));)r4+=1,a2=!0;u4=n3.charCodeAt(r4)}if(u4===46){for(m3=!0,r4+=1;B4(n3.charCodeAt(r4));)r4+=1,i2=!0;u4=n3.charCodeAt(r4)}if(u4===101||u4===69){if(m3&&!a2&&!i2){t35.err=`${R4}: ${$6} at index ${r4}, "${n3[r4]}" invalid float exponent`;return}if(r4+=1,u4=n3.charCodeAt(r4),(u4===43||u4===45)&&(r4+=1),r4<e4&&B4(n3.charCodeAt(r4)))for(;r4<e4&&B4(n3.charCodeAt(r4));)r4+=1;else{t35.err=`${R4}: ${$6} at index ${r4}, "${n3[r4]}" invalid integer exponent`;return}}t35.index=r4,t35.param=+t35.pathValue.slice(o3,r4)},ze3=Yt3,er3=t35=>[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t35),Ve3=er3,tr3=t35=>{let{pathValue:e4,max:n3}=t35;for(;t35.index<n3&&Ve3(e4.charCodeAt(t35.index));)t35.index+=1},G4=tr3,rr3=t35=>{switch(t35|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Re3=rr3,nr3=t35=>B4(t35)||t35===43||t35===45||t35===46,ke3=nr3,or3=t35=>(t35|32)===97,qe3=or3,ar3=t35=>{switch(t35|32){case 109:case 77:return!0;default:return!1}},Qe3=ar3,sr3=t35=>{let{max:e4,pathValue:n3,index:o3,segments:r4}=t35,s2=n3.charCodeAt(o3),a2=Z4[n3[o3].toLowerCase()];if(t35.segmentStart=o3,!Re3(s2)){t35.err=`${R4}: ${$6} "${n3[o3]}" is not a path command at index ${o3}`;return}let i2=r4[r4.length-1];if(!Qe3(s2)&&i2?.[0]?.toLocaleLowerCase()==="z"){t35.err=`${R4}: ${$6} "${n3[o3]}" is not a MoveTo path command at index ${o3}`;return}if(t35.index+=1,G4(t35),t35.data=[],!a2){Se3(t35);return}for(;;){for(let m3=a2;m3>0;m3-=1){if(qe3(s2)&&(m3===3||m3===4)?we3(t35):ze3(t35),t35.err.length)return;t35.data.push(t35.param),G4(t35),t35.index<e4&&n3.charCodeAt(t35.index)===44&&(t35.index+=1,G4(t35))}if(t35.index>=t35.max||!ke3(n3.charCodeAt(t35.index)))break}Se3(t35)},ge3=sr3,F5=class{constructor(e4){this.segments=[],this.pathValue=e4,this.max=e4.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}},mr3=t35=>{if(typeof t35!="string")return t35.slice(0);let e4=new F5(t35);for(G4(e4);e4.index<e4.max&&!e4.err.length;)ge3(e4);if(!e4.err.length)e4.segments.length&&(e4.segments[0][0]="M");else throw TypeError(e4.err);return e4.segments},L3=mr3,ir3=(t35,e4,n3,o3)=>{let[r4]=t35,s2=r4.toUpperCase();if(e4===0||s2===r4)return t35;if(s2==="A")return[s2,t35[1],t35[2],t35[3],t35[4],t35[5],t35[6]+n3,t35[7]+o3];if(s2==="V")return[s2,t35[1]+o3];if(s2==="H")return[s2,t35[1]+n3];if(s2==="L")return[s2,t35[1]+n3,t35[2]+o3];{let i2=[],m3=t35.length;for(let u4=1;u4<m3;u4+=1)i2.push(t35[u4]+(u4%2?n3:o3));return[s2].concat(i2)}},_4=ir3,ur3=(t35,e4)=>{let n3=t35.length,o3,r4="M",s2="M",a2=!1,i2=0,m3=0,u4=0,l3=0,c3=0;for(let f2=0;f2<n3;f2+=1){o3=t35[f2],[r4]=o3,c3=o3.length,s2=r4.toUpperCase(),a2=s2!==r4;let g7=e4(o3,f2,i2,m3);if(g7===!1)break;s2==="Z"?(i2=u4,m3=l3):s2==="H"?i2=o3[1]+(a2?i2:0):s2==="V"?m3=o3[1]+(a2?m3:0):(i2=o3[c3-2]+(a2?i2:0),m3=o3[c3-1]+(a2?m3:0),s2==="M"&&(u4=i2,l3=m3)),g7&&(t35[f2]=g7,g7[0]==="C"&&(n3=t35.length))}return t35},T6=ur3,lr3=t35=>{let e4=L3(t35);return T6(e4,_4)},oe3=lr3,cr3=(t35,e4,n3,o3)=>{let[r4]=t35,s2=r4.toLowerCase();if(e4===0||r4===s2)return t35;if(s2==="a")return[s2,t35[1],t35[2],t35[3],t35[4],t35[5],t35[6]-n3,t35[7]-o3];if(s2==="v")return[s2,t35[1]-o3];if(s2==="h")return[s2,t35[1]-n3];if(s2==="l")return[s2,t35[1]-n3,t35[2]-o3];{let i2=[],m3=t35.length;for(let u4=1;u4<m3;u4+=1)i2.push(t35[u4]-(u4%2?n3:o3));return[s2].concat(i2)}},he3=cr3,pr3=t35=>{let e4=L3(t35);return T6(e4,he3)},Je3=pr3,Ot3=(t35,e4,n3,o3,r4,s2,a2,i2,m3,u4)=>{let l3=t35,c3=e4,f2=n3,g7=o3,p4=i2,h4=m3,y5=Math.PI*120/180,S3=Math.PI/180*(+r4||0),A4=[],d3,b3,P5,C4,V4;if(u4)[b3,P5,C4,V4]=u4;else{d3=ne3(l3,c3,-S3),l3=d3.x,c3=d3.y,d3=ne3(p4,h4,-S3),p4=d3.x,h4=d3.y;let N6=(l3-p4)/2,D6=(c3-h4)/2,z5=N6*N6/(f2*f2)+D6*D6/(g7*g7);z5>1&&(z5=Math.sqrt(z5),f2*=z5,g7*=z5);let rt3=f2*f2,nt3=g7*g7,wt3=(s2===a2?-1:1)*Math.sqrt(Math.abs((rt3*nt3-rt3*D6*D6-nt3*N6*N6)/(rt3*D6*D6+nt3*N6*N6)));C4=wt3*f2*D6/g7+(l3+p4)/2,V4=wt3*-g7*N6/f2+(c3+h4)/2,b3=Math.asin(((c3-V4)/g7*10**9>>0)/10**9),P5=Math.asin(((h4-V4)/g7*10**9>>0)/10**9),b3=l3<C4?Math.PI-b3:b3,P5=p4<C4?Math.PI-P5:P5,b3<0&&(b3=Math.PI*2+b3),P5<0&&(P5=Math.PI*2+P5),a2&&b3>P5&&(b3-=Math.PI*2),!a2&&P5>b3&&(P5-=Math.PI*2)}let k4=P5-b3;if(Math.abs(k4)>y5){let N6=P5,D6=p4,z5=h4;P5=b3+y5*(a2&&P5>b3?1:-1),p4=C4+f2*Math.cos(P5),h4=V4+g7*Math.sin(P5),A4=Ot3(p4,h4,f2,g7,r4,0,a2,D6,z5,[P5,N6,C4,V4])}k4=P5-b3;let w4=Math.cos(b3),v5=Math.sin(b3),j4=Math.cos(P5),ue3=Math.sin(P5),q4=Math.tan(k4/4),x5=4/3*f2*q4,Q4=4/3*g7*q4,H4=[l3,c3],I5=[l3+x5*v5,c3-Q4*w4],W5=[p4+x5*ue3,h4-Q4*j4],ye3=[p4,h4];if(I5[0]=2*H4[0]-I5[0],I5[1]=2*H4[1]-I5[1],u4)return[I5[0],I5[1],W5[0],W5[1],ye3[0],ye3[1]].concat(A4);A4=[I5[0],I5[1],W5[0],W5[1],ye3[0],ye3[1]].concat(A4);let le3=[];for(let N6=0,D6=A4.length;N6<D6;N6+=1)le3[N6]=N6%2?ne3(A4[N6-1],A4[N6],S3).y:ne3(A4[N6],A4[N6+1],S3).x;return le3},be3=Ot3,fr3=(t35,e4,n3,o3,r4,s2)=>{let a2=.3333333333333333,i2=2/3;return[a2*t35+i2*n3,a2*e4+i2*o3,a2*r4+i2*n3,a2*s2+i2*o3,r4,s2]},De3=fr3,gr3=(t35,e4,n3,o3)=>{let r4=E4([t35,e4],[n3,o3],.3333333333333333),s2=E4([t35,e4],[n3,o3],2/3);return[r4[0],r4[1],s2[0],s2[1],n3,o3]},Ae3=gr3,hr3=(t35,e4)=>{let[n3]=t35,o3=t35.slice(1).map(Number),[r4,s2]=o3,{x1:a2,y1:i2,x:m3,y:u4}=e4;return"TQ".includes(n3)||(e4.qx=null,e4.qy=null),n3==="M"?(e4.x=r4,e4.y=s2,t35):n3==="A"?["C"].concat(be3(a2,i2,o3[0],o3[1],o3[2],o3[3],o3[4],o3[5],o3[6])):n3==="Q"?(e4.qx=r4,e4.qy=s2,["C"].concat(De3(a2,i2,o3[0],o3[1],o3[2],o3[3]))):n3==="L"?["C"].concat(Ae3(a2,i2,r4,s2)):n3==="Z"?["C"].concat(Ae3(a2,i2,m3,u4)):t35},Ee3=hr3,br3=(t35,e4)=>{let[n3]=t35,o3=n3.toUpperCase(),r4=n3!==o3,{x1:s2,y1:a2,x2:i2,y2:m3,x:u4,y:l3}=e4,c3=t35.slice(1),f2=c3.map((g7,p4)=>g7+(r4?p4%2?l3:u4:0));if("TQ".includes(o3)||(e4.qx=null,e4.qy=null),o3==="A")return f2=c3.slice(0,-2).concat(c3[5]+(r4?u4:0),c3[6]+(r4?l3:0)),["A"].concat(f2);if(o3==="H")return["L",t35[1]+(r4?u4:0),a2];if(o3==="V")return["L",s2,t35[1]+(r4?l3:0)];if(o3==="L")return["L",t35[1]+(r4?u4:0),t35[2]+(r4?l3:0)];if(o3==="M")return["M",t35[1]+(r4?u4:0),t35[2]+(r4?l3:0)];if(o3==="C")return["C"].concat(f2);if(o3==="S"){let g7=s2*2-i2,p4=a2*2-m3;return e4.x1=g7,e4.y1=p4,["C",g7,p4].concat(f2)}else if(o3==="T"){let g7=s2*2-(e4.qx?e4.qx:0),p4=a2*2-(e4.qy?e4.qy:0);return e4.qx=g7,e4.qy=p4,["Q",g7,p4].concat(f2)}else if(o3==="Q"){let[g7,p4]=f2;return e4.qx=g7,e4.qy=p4,["Q"].concat(f2)}else if(o3==="Z")return["Z"];return t35},X5=br3,dr3={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U3=dr3,yr3=t35=>{let e4={...U3},n3=L3(t35);return T6(n3,(o3,r4,s2,a2)=>{e4.x=s2,e4.y=a2;let i2=X5(o3,e4),m3=Ee3(i2,e4);m3[0]==="C"&&m3.length>7&&(n3.splice(r4+1,0,["C"].concat(m3.slice(7))),m3=m3.slice(0,7));let l3=m3.length;return e4.x1=+m3[l3-2],e4.y1=+m3[l3-1],e4.x2=+m3[l3-4]||e4.x1,e4.y2=+m3[l3-3]||e4.y1,m3})},ae3=yr3,Pr3=(t35,e4)=>{let n3=t35.length,{round:o3}=O4,r4=t35[0],s2="";o3=e4==="off"||typeof e4=="number"&&e4>=0?e4:typeof o3=="number"&&o3>=0?o3:"off";for(let a2=0;a2<n3;a2+=1){r4=t35[a2];let[i2]=r4,m3=r4.slice(1);if(s2+=i2,o3==="off")s2+=m3.join(" ");else{let u4=0,l3=m3.length;for(;u4<l3;)s2+=M4(m3[u4],o3),u4!==l3-1&&(s2+=" "),u4+=1}}return s2},Ce3=Pr3,xr3=t35=>{if(!t35)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e4=L3(t35),n3="M",o3=0,r4=0,{max:s2,min:a2}=Math,i2=1/0,m3=1/0,u4=-1/0,l3=-1/0,c3=0,f2=0,g7=0,p4=0,h4=0,y5=0,S3=0,A4=0,d3=0,b3=0;T6(e4,(V4,k4,w4,v5)=>{[n3]=V4;let j4=n3.toUpperCase(),q4=j4!==n3?_4(V4,k4,w4,v5):V4.slice(0),x5=j4==="V"?["L",w4,q4[1]]:j4==="H"?["L",q4[1],v5]:q4;if([n3]=x5,"TQ".includes(j4)||(d3=0,b3=0),n3==="M")[,o3,r4]=x5,c3=o3,f2=r4,g7=o3,p4=r4;else if(n3==="L")[c3,f2,g7,p4]=Ge3(w4,v5,x5[1],x5[2]);else if(n3==="A")[c3,f2,g7,p4]=it3(w4,v5,x5[1],x5[2],x5[3],x5[4],x5[5],x5[6],x5[7]);else if(n3==="S"){let Q4=h4*2-S3,H4=y5*2-A4;[c3,f2,g7,p4]=Fe3(w4,v5,Q4,H4,x5[1],x5[2],x5[3],x5[4])}else n3==="C"?[c3,f2,g7,p4]=Fe3(w4,v5,x5[1],x5[2],x5[3],x5[4],x5[5],x5[6]):n3==="T"?(d3=h4*2-d3,b3=y5*2-b3,[c3,f2,g7,p4]=Ke3(w4,v5,d3,b3,x5[1],x5[2])):n3==="Q"?(d3=x5[1],b3=x5[2],[c3,f2,g7,p4]=Ke3(w4,v5,x5[1],x5[2],x5[3],x5[4])):n3==="Z"&&([c3,f2,g7,p4]=Ge3(w4,v5,o3,r4));i2=a2(c3,i2),m3=a2(f2,m3),u4=s2(g7,u4),l3=s2(p4,l3),[h4,y5]=n3==="Z"?[o3,r4]:x5.slice(-2),[S3,A4]=n3==="C"?[x5[3],x5[4]]:n3==="S"?[x5[1],x5[2]]:[h4,y5]});let P5=u4-i2,C4=l3-m3;return{width:P5,height:C4,x:i2,y:m3,x2:u4,y2:l3,cx:i2+P5/2,cy:m3+C4/2,cz:Math.max(P5,C4)+Math.min(P5,C4)/2}},We3=xr3,Sr3=t35=>{let e4=L3(t35),n3=0,o3=0,r4=0,s2=0,a2=0,i2=0,m3="M",u4=0,l3=0,c3=0;return T6(e4,(f2,g7,p4,h4)=>{[m3]=f2;let y5=m3.toUpperCase(),A4=y5!==m3?_4(f2,g7,p4,h4):f2.slice(0),d3=y5==="V"?["L",p4,A4[1]]:y5==="H"?["L",A4[1],h4]:A4;if([m3]=d3,"TQ".includes(y5)||(a2=0,i2=0),m3==="M")[,u4,l3]=d3;else if(m3==="L")c3+=ce3(p4,h4,d3[1],d3[2]);else if(m3==="A")c3+=ve3(p4,h4,d3[1],d3[2],d3[3],d3[4],d3[5],d3[6],d3[7]);else if(m3==="S"){let b3=n3*2-r4,P5=o3*2-s2;c3+=Pe3(p4,h4,b3,P5,d3[1],d3[2],d3[3],d3[4])}else m3==="C"?c3+=Pe3(p4,h4,d3[1],d3[2],d3[3],d3[4],d3[5],d3[6]):m3==="T"?(a2=n3*2-a2,i2=o3*2-i2,c3+=xe3(p4,h4,a2,i2,d3[1],d3[2])):m3==="Q"?(a2=d3[1],i2=d3[2],c3+=xe3(p4,h4,d3[1],d3[2],d3[3],d3[4])):m3==="Z"&&(c3+=ce3(p4,h4,u4,l3));[n3,o3]=m3==="Z"?[u4,l3]:d3.slice(-2),[r4,s2]=m3==="C"?[d3[3],d3[4]]:m3==="S"?[d3[1],d3[2]]:[n3,o3]}),c3},K3=Sr3,se3=1e-5,Ar3=t35=>{let e4=L3(t35),n3={...U3};return T6(e4,(o3,r4,s2,a2)=>{n3.x=s2,n3.y=a2;let i2=X5(o3,n3),m3=i2.length;return n3.x1=+i2[m3-2],n3.y1=+i2[m3-1],n3.x2=+i2[m3-4]||n3.x1,n3.y2=+i2[m3-3]||n3.y1,i2})},J4=Ar3,Cr3=(t35,e4)=>{let n3=J4(t35),o3=!1,r4=[],s2="M",a2=0,i2=0,[m3,u4]=n3[0].slice(1),l3=typeof e4=="number",c3={x:m3,y:u4},f2=0,g7=c3,p4=0;return!l3||e4<se3?c3:(T6(n3,(h4,y5,S3,A4)=>{if([s2]=h4,o3=s2==="M",r4=o3?r4:[S3,A4].concat(h4.slice(1)),o3?([,m3,u4]=h4,c3={x:m3,y:u4},f2=0):s2==="L"?(c3=Le3(r4[0],r4[1],r4[2],r4[3],e4-p4),f2=ce3(r4[0],r4[1],r4[2],r4[3])):s2==="A"?(c3=mt3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5],r4[6],r4[7],r4[8],e4-p4),f2=ve3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5],r4[6],r4[7],r4[8])):s2==="C"?(c3=pt3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5],r4[6],r4[7],e4-p4),f2=Pe3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5],r4[6],r4[7])):s2==="Q"?(c3=gt3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5],e4-p4),f2=xe3(r4[0],r4[1],r4[2],r4[3],r4[4],r4[5])):s2==="Z"&&(r4=[S3,A4,m3,u4],c3={x:m3,y:u4},f2=ce3(r4[0],r4[1],r4[2],r4[3])),[a2,i2]=r4.slice(-2),p4<e4)g7=c3;else return!1;p4+=f2}),e4>p4-se3?{x:a2,y:i2}:g7)},me3=Cr3,Tr3=(t35,e4)=>{let n3=L3(t35),o3=n3.slice(0),r4=K3(o3),s2=o3.length-1,a2=0,i2=0,m3=n3[0];if(s2<=0||!e4||!Number.isFinite(e4))return{segment:m3,index:0,length:i2,lengthAtSegment:a2};if(e4>=r4)return o3=n3.slice(0,-1),a2=K3(o3),i2=r4-a2,m3=n3[s2],{segment:m3,index:s2,length:i2,lengthAtSegment:a2};let u4=[];for(;s2>0;)m3=o3[s2],o3=o3.slice(0,-1),a2=K3(o3),i2=r4-a2,r4=a2,u4.push({segment:m3,index:s2,length:i2,lengthAtSegment:a2}),s2-=1;return u4.find(({lengthAtSegment:l3})=>l3<=e4)},de3=Tr3,Mr3=(t35,e4)=>{let n3=L3(t35),o3=J4(n3),r4=K3(o3),s2=b3=>{let P5=b3.x-e4.x,C4=b3.y-e4.y;return P5*P5+C4*C4},a2=8,i2,m3={x:0,y:0},u4=0,l3=0,c3=1/0;for(let b3=0;b3<=r4;b3+=a2)i2=me3(o3,b3),u4=s2(i2),u4<c3&&(m3=i2,l3=b3,c3=u4);a2/=2;let f2,g7,p4=0,h4=0,y5=0,S3=0;for(;a2>1e-6&&(p4=l3-a2,f2=me3(o3,p4),y5=s2(f2),h4=l3+a2,g7=me3(o3,h4),S3=s2(g7),p4>=0&&y5<c3?(m3=f2,l3=p4,c3=y5):h4<=r4&&S3<c3?(m3=g7,l3=h4,c3=S3):a2/=2,!(a2<1e-5)););let A4=de3(n3,l3),d3=Math.sqrt(c3);return{closest:m3,distance:d3,segment:A4}},Y5=Mr3,Lr3=(t35,e4)=>Y5(t35,e4).closest,dt3=Lr3,vr3=(t35,e4,n3,o3,r4,s2,a2,i2)=>3*((i2-e4)*(n3+r4)-(a2-t35)*(o3+s2)+o3*(t35-r4)-n3*(e4-s2)+i2*(r4+t35/3)-a2*(s2+e4/3))/20,Nr3=t35=>{let e4=0,n3=0,o3=0;return ae3(t35).map(r4=>r4[0]==="M"?([,e4,n3]=r4,0):(o3=vr3(e4,n3,r4[1],r4[2],r4[3],r4[4],r4[5],r4[6]),[e4,n3]=r4.slice(-2),o3)).reduce((r4,s2)=>r4+s2,0)},Oe3=Nr3,wr3=t35=>Oe3(ae3(t35))>=0,yt3=wr3,zr3=(t35,e4)=>de3(t35,e4).segment,Pt3=zr3,Vr3=(t35,e4)=>Y5(t35,e4).segment,xt3=Vr3,Rr3=t35=>Array.isArray(t35)&&t35.every(e4=>{let n3=e4[0].toLowerCase();return Z4[n3]===e4.length-1&&"achlmqstvz".includes(n3)&&e4.slice(1).every(Number.isFinite)})&&t35.length>0,ee3=Rr3,kr3=t35=>ee3(t35)&&t35.every(([e4])=>e4===e4.toUpperCase()),Ie3=kr3,qr3=t35=>Ie3(t35)&&t35.every(([e4])=>"ACLMQZ".includes(e4)),Be3=qr3,Qr3=t35=>Be3(t35)&&t35.every(([e4])=>"MC".includes(e4)),St3=Qr3,Dr3=(t35,e4)=>{let{distance:n3}=Y5(t35,e4);return Math.abs(n3)<se3},At3=Dr3,Er3=t35=>ee3(t35)&&t35.slice(1).every(([e4])=>e4===e4.toLowerCase()),Ct3=Er3,Or3=t35=>{if(typeof t35!="string"||!t35.length)return!1;let e4=new F5(t35);for(G4(e4);e4.index<e4.max&&!e4.err.length;)ge3(e4);return!e4.err.length&&"mM".includes(e4.segments[0][0])},$e3=Or3,Ir3={line:["x1","y1","x2","y2"],circle:["cx","cy","r"],ellipse:["cx","cy","rx","ry"],rect:["width","height","x","y","rx","ry"],polygon:["points"],polyline:["points"],glyph:["d"]},te3=Ir3,Br3=t35=>t35!=null&&typeof t35=="object"&&t35.nodeType===1,Xe3=Br3,$r3=t35=>{let{x1:e4,y1:n3,x2:o3,y2:r4}=t35;return[e4,n3,o3,r4]=[e4,n3,o3,r4].map(s2=>+s2),[["M",e4,n3],["L",o3,r4]]},jr3=t35=>{let e4=[],n3=(t35.points||"").trim().split(/[\s|,]/).map(r4=>+r4),o3=0;for(;o3<n3.length;)e4.push([o3?"L":"M",n3[o3],n3[o3+1]]),o3+=2;return t35.type==="polygon"?[...e4,["z"]]:e4},Hr3=t35=>{let{cx:e4,cy:n3,r:o3}=t35;return[e4,n3,o3]=[e4,n3,o3].map(r4=>+r4),[["M",e4-o3,n3],["a",o3,o3,0,1,0,2*o3,0],["a",o3,o3,0,1,0,-2*o3,0]]},Zr3=t35=>{let{cx:e4,cy:n3}=t35,o3=t35.rx||0,r4=t35.ry||o3;return[e4,n3,o3,r4]=[e4,n3,o3,r4].map(s2=>+s2),[["M",e4-o3,n3],["a",o3,r4,0,1,0,2*o3,0],["a",o3,r4,0,1,0,-2*o3,0]]},Gr3=t35=>{let e4=+t35.x||0,n3=+t35.y||0,o3=+t35.width,r4=+t35.height,s2=+(t35.rx||0),a2=+(t35.ry||s2);return s2||a2?(s2*2>o3&&(s2-=(s2*2-o3)/2),a2*2>r4&&(a2-=(a2*2-r4)/2),[["M",e4+s2,n3],["h",o3-s2*2],["s",s2,0,s2,a2],["v",r4-a2*2],["s",0,a2,-s2,a2],["h",-o3+s2*2],["s",-s2,0,-s2,-a2],["v",-r4+a2*2],["s",0,-a2,s2,-a2]]):[["M",e4,n3],["h",o3],["v",r4],["H",e4],["Z"]]},_r3=t35=>{let e4=Object.keys(te3),n3=Xe3(t35),o3=n3?t35.tagName:null;if(o3&&[...e4,"path"].every(m3=>o3!==m3))throw TypeError(`${R4}: "${o3}" is not SVGElement`);let r4=n3?o3:t35.type,s2=te3[r4],a2={type:r4};n3?s2.forEach(m3=>{a2[m3]=t35.getAttribute(m3)}):Object.assign(a2,t35);let i2=[];return r4==="circle"?i2=Hr3(a2):r4==="ellipse"?i2=Zr3(a2):["polyline","polygon"].includes(r4)?i2=jr3(a2):r4==="rect"?i2=Gr3(a2):r4==="line"?i2=$r3(a2):["glyph","path"].includes(r4)&&(i2=L3(n3?t35.getAttribute("d")||"":t35.d||"")),ee3(i2)&&i2.length?i2:!1},je3=_r3,Ur3=(t35,e4,n3)=>{let o3=n3||document,r4=Object.keys(te3),s2=Xe3(t35),a2=s2?t35.tagName:null;if(a2==="path")throw TypeError(`${R4}: "${a2}" is already SVGPathElement`);if(a2&&r4.every(p4=>a2!==p4))throw TypeError(`${R4}: "${a2}" is not SVGElement`);let i2=o3.createElementNS("http://www.w3.org/2000/svg","path"),m3=s2?a2:t35.type,u4=te3[m3],l3={type:m3},c3=O4.round,f2=je3(t35),g7=f2&&f2.length?Ce3(f2,c3):"";return s2?(u4.forEach(p4=>{l3[p4]=t35.getAttribute(p4)}),Object.values(t35.attributes).forEach(({name:p4,value:h4})=>{u4.includes(p4)||i2.setAttribute(p4,h4)})):(Object.assign(l3,t35),Object.keys(l3).forEach(p4=>{!u4.includes(p4)&&p4!=="type"&&i2.setAttribute(p4.replace(/[A-Z]/g,h4=>`-${h4.toLowerCase()}`),l3[p4])})),$e3(g7)?(i2.setAttribute("d",g7),e4&&s2&&(t35.before(i2,t35),t35.remove()),i2):!1},Tt3=Ur3,Fr3=(t35,e4,n3,o3)=>{let[r4]=t35,{round:s2}=O4,a2=typeof s2=="number"?s2:4,i2=e4.slice(1),{x1:m3,y1:u4,x2:l3,y2:c3,x:f2,y:g7}=n3,[p4,h4]=i2.slice(-2),y5=t35;if("TQ".includes(r4)||(n3.qx=null,n3.qy=null),r4==="L"){if(M4(f2,a2)===M4(p4,a2))return["V",h4];if(M4(g7,a2)===M4(h4,a2))return["H",p4]}else if(r4==="C"){let[S3,A4]=i2;if(n3.x1=S3,n3.y1=A4,"CS".includes(o3)&&(M4(S3,a2)===M4(m3*2-l3,a2)&&M4(A4,a2)===M4(u4*2-c3,a2)||M4(m3,a2)===M4(l3*2-f2,a2)&&M4(u4,a2)===M4(c3*2-g7,a2)))return["S",i2[2],i2[3],i2[4],i2[5]]}else if(r4==="Q"){let[S3,A4]=i2;if(n3.qx=S3,n3.qy=A4,"QT".includes(o3)&&M4(S3,a2)===M4(m3*2-l3,a2)&&M4(A4,a2)===M4(u4*2-c3,a2))return["T",i2[2],i2[3]]}return y5},He3=Fr3,Kr3=(t35,e4)=>{let n3=t35.slice(1).map(o3=>M4(o3,e4));return[t35[0]].concat(n3)},ie3=Kr3,Jr3=(t35,e4)=>{let n3=oe3(t35),o3=typeof e4=="number"&&e4>=0?e4:2,r4={...U3},s2=[],a2="M",i2="Z";return T6(n3,(m3,u4,l3,c3)=>{r4.x=l3,r4.y=c3;let f2=X5(m3,r4),g7=m3;if([a2]=m3,s2[u4]=a2,u4){i2=s2[u4-1];let h4=He3(m3,f2,r4,i2),y5=ie3(h4,o3),S3=y5.join(""),A4=he3(h4,u4,l3,c3),d3=ie3(A4,o3),b3=d3.join("");g7=S3.length<b3.length?y5:d3}let p4=f2.length;return r4.x1=+f2[p4-2],r4.y1=+f2[p4-1],r4.x2=+f2[p4-4]||r4.x1,r4.y2=+f2[p4-3]||r4.y1,g7})},Ye3=Jr3,Wr3=t35=>{let e4=oe3(t35),n3=J4(e4),o3=e4.length,r4=e4[o3-1][0]==="Z",s2=T6(e4,(a2,i2)=>{let m3=n3[i2],u4=i2&&e4[i2-1],l3=u4&&u4[0],c3=e4[i2+1],f2=c3&&c3[0],[g7]=a2,[p4,h4]=n3[i2?i2-1:o3-1].slice(-2),y5=a2;switch(g7){case"M":y5=r4?["Z"]:[g7,p4,h4];break;case"A":y5=[g7,a2[1],a2[2],a2[3],a2[4],a2[5]===1?0:1,p4,h4];break;case"C":c3&&f2==="S"?y5=["S",a2[1],a2[2],p4,h4]:y5=[g7,a2[3],a2[4],a2[1],a2[2],p4,h4];break;case"S":l3&&"CS".includes(l3)&&(!c3||f2!=="S")?y5=["C",m3[3],m3[4],m3[1],m3[2],p4,h4]:y5=[g7,m3[1],m3[2],p4,h4];break;case"Q":c3&&f2==="T"?y5=["T",p4,h4]:y5=[g7,a2[1],a2[2],p4,h4];break;case"T":l3&&"QT".includes(l3)&&(!c3||f2!=="T")?y5=["Q",m3[1],m3[2],p4,h4]:y5=[g7,p4,h4];break;case"Z":y5=["M",p4,h4];break;case"H":y5=[g7,p4];break;case"V":y5=[g7,h4];break;default:y5=[g7].concat(a2.slice(1,-2),p4,h4)}return y5});return r4?s2.reverse():[s2[0]].concat(s2.slice(1).reverse())},Te3=Wr3,Xr3=t35=>{let e4=[],n3,o3=-1,r4=0,s2=0,a2=0,i2=0,m3={...U3};return t35.forEach(u4=>{let[l3]=u4,c3=l3.toUpperCase(),f2=l3.toLowerCase(),g7=l3===f2,p4=u4.slice(1);c3==="M"?(o3+=1,[r4,s2]=p4,r4+=g7?m3.x:0,s2+=g7?m3.y:0,a2=r4,i2=s2,n3=[g7?[c3,a2,i2]:u4]):(c3==="Z"?(r4=a2,s2=i2):c3==="H"?([,r4]=u4,r4+=g7?m3.x:0):c3==="V"?([,s2]=u4,s2+=g7?m3.y:0):([r4,s2]=u4.slice(-2),r4+=g7?m3.x:0,s2+=g7?m3.y:0),n3.push(u4)),m3.x=r4,m3.y=s2,e4[o3]=n3}),e4},et3=Xr3,en3=t35=>{let e4=new y4,{origin:n3}=t35,[o3,r4]=n3,{translate:s2}=t35,{rotate:a2}=t35,{skew:i2}=t35,{scale:m3}=t35;return Array.isArray(s2)&&s2.length>=2&&s2.every(u4=>!Number.isNaN(+u4))&&s2.some(u4=>u4!==0)?e4=e4.translate(...s2):typeof s2=="number"&&!Number.isNaN(s2)&&(e4=e4.translate(s2)),(a2||i2||m3)&&(e4=e4.translate(o3,r4),Array.isArray(a2)&&a2.length>=2&&a2.every(u4=>!Number.isNaN(+u4))&&a2.some(u4=>u4!==0)?e4=e4.rotate(...a2):typeof a2=="number"&&!Number.isNaN(a2)&&(e4=e4.rotate(a2)),Array.isArray(i2)&&i2.length===2&&i2.every(u4=>!Number.isNaN(+u4))&&i2.some(u4=>u4!==0)?(e4=i2[0]?e4.skewX(i2[0]):e4,e4=i2[1]?e4.skewY(i2[1]):e4):typeof i2=="number"&&!Number.isNaN(i2)&&(e4=e4.skewX(i2)),Array.isArray(m3)&&m3.length>=2&&m3.every(u4=>!Number.isNaN(+u4))&&m3.some(u4=>u4!==1)?e4=e4.scale(...m3):typeof m3=="number"&&!Number.isNaN(m3)&&(e4=e4.scale(m3)),e4=e4.translate(-o3,-r4)),e4},Ze3=en3,rn3=(t35,e4)=>{let n3=y4.Translate(e4[0],e4[1],e4[2]);return[,,,n3.m44]=e4,n3=t35.multiply(n3),[n3.m41,n3.m42,n3.m43,n3.m44]},nn3=(t35,e4,n3)=>{let[o3,r4,s2]=n3,[a2,i2,m3]=rn3(t35,[e4[0],e4[1],0,1]),u4=a2-o3,l3=i2-r4,c3=m3-s2;return[u4*(Math.abs(s2)/Math.abs(c3)||1)+o3,l3*(Math.abs(s2)/Math.abs(c3)||1)+r4]},Me3=nn3,on3=(t35,e4)=>{let n3=0,o3=0,r4=0,s2=0,a2=0,i2=0,m3="M",u4=L3(t35),l3=e4&&Object.keys(e4);if(!e4||l3&&!l3.length)return u4.slice(0);e4.origin||Object.assign(e4,{origin:O4.origin});let c3=e4.origin,f2=Ze3(e4);return f2.isIdentity?u4.slice(0):T6(u4,(g7,p4,h4,y5)=>{[m3]=g7;let S3=m3.toUpperCase(),d3=S3!==m3?_4(g7,p4,h4,y5):g7.slice(0),b3=S3==="A"?["C"].concat(be3(h4,y5,d3[1],d3[2],d3[3],d3[4],d3[5],d3[6],d3[7])):S3==="V"?["L",h4,d3[1]]:S3==="H"?["L",d3[1],y5]:d3;m3=b3[0];let P5=m3==="C"&&b3.length>7,C4=P5?b3.slice(0,7):b3.slice(0);if(P5&&(u4.splice(p4+1,0,["C"].concat(b3.slice(7))),b3=C4),m3==="L")[r4,s2]=Me3(f2,[b3[1],b3[2]],c3),n3!==r4&&o3!==s2?b3=["L",r4,s2]:o3===s2?b3=["H",r4]:n3===r4&&(b3=["V",s2]);else for(a2=1,i2=b3.length;a2<i2;a2+=2)[r4,s2]=Me3(f2,[+b3[a2],+b3[a2+1]],c3),b3[a2]=r4,b3[a2+1]=s2;return n3=r4,o3=s2,b3})},tt3=on3,an3=t35=>{let e4=t35.slice(1).map((n3,o3,r4)=>o3?r4[o3-1].slice(-2).concat(n3.slice(1)):t35[0].slice(1).concat(n3.slice(1))).map(n3=>n3.map((o3,r4)=>n3[n3.length-r4-2*(1-r4%2)])).reverse();return[["M"].concat(e4[0].slice(0,2))].concat(e4.map(n3=>["C"].concat(n3.slice(2))))},Mt3=an3,sn3=(t35,e4)=>{let{round:n3}=O4;return n3=e4==="off"||typeof e4=="number"&&e4>=0?e4:typeof n3=="number"&&n3>=0?n3:"off",n3==="off"?t35.slice(0):T6(t35,o3=>ie3(o3,n3))},Lt3=sn3,mn3=(t35,e4=.5)=>{let n3=e4,o3=t35.slice(0,2),r4=t35.slice(2,4),s2=t35.slice(4,6),a2=t35.slice(6,8),i2=E4(o3,r4,n3),m3=E4(r4,s2,n3),u4=E4(s2,a2,n3),l3=E4(i2,m3,n3),c3=E4(m3,u4,n3),f2=E4(l3,c3,n3);return[["C",i2[0],i2[1],l3[0],l3[1],f2[0],f2[1]],["C",c3[0],c3[1],u4[0],u4[1],a2[0],a2[1]]]},vt3=mn3,Nt3=class{constructor(e4,n3){let o3=n3||{},r4=typeof e4>"u";if(r4||!e4.length)throw TypeError(`${R4}: "pathValue" is ${r4?"undefined":"empty"}`);this.segments=L3(e4);let{round:s2,origin:a2}=o3,i2;Number.isInteger(s2)||s2==="off"?i2=s2:i2=O4.round;let m3=O4.origin;if(Array.isArray(a2)&&a2.length>=2){let[u4,l3,c3]=a2.map(Number);m3=[Number.isNaN(u4)?0:u4,Number.isNaN(l3)?0:l3,Number.isNaN(c3)?0:c3]}return this.round=i2,this.origin=m3,this}get bbox(){return We3(this.segments)}get length(){return K3(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e4){return me3(this.segments,e4)}toAbsolute(){let{segments:e4}=this;return this.segments=oe3(e4),this}toRelative(){let{segments:e4}=this;return this.segments=Je3(e4),this}toCurve(){let{segments:e4}=this;return this.segments=ae3(e4),this}reverse(e4){let{segments:n3}=this,o3=et3(n3),r4=o3.length>1?o3:!1,s2=r4?r4.map((i2,m3)=>e4?m3?Te3(i2):i2.slice(0):Te3(i2)):n3.slice(0),a2=[];return r4?a2=s2.flat(1):a2=e4?n3:Te3(n3),this.segments=a2.slice(0),this}normalize(){let{segments:e4}=this;return this.segments=J4(e4),this}optimize(){let{segments:e4}=this,n3=this.round==="off"?2:this.round;return this.segments=Ye3(e4,n3),this}transform(e4){if(!e4||typeof e4!="object"||typeof e4=="object"&&!["translate","rotate","skew","scale"].some(m3=>m3 in e4))return this;let{segments:n3,origin:[o3,r4,s2]}=this,a2={};for(let[m3,u4]of Object.entries(e4))m3==="skew"&&Array.isArray(u4)||(m3==="rotate"||m3==="translate"||m3==="origin"||m3==="scale")&&Array.isArray(u4)?a2[m3]=u4.map(Number):m3!=="origin"&&typeof Number(u4)=="number"&&(a2[m3]=Number(u4));let{origin:i2}=a2;if(Array.isArray(i2)&&i2.length>=2){let[m3,u4,l3]=i2.map(Number);a2.origin=[Number.isNaN(m3)?o3:m3,Number.isNaN(u4)?r4:u4,l3||s2]}else a2.origin=[o3,r4,s2];return this.segments=tt3(n3,a2),this}flipX(){let{cx:e4,cy:n3}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e4,n3,0]}),this}flipY(){let{cx:e4,cy:n3}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e4,n3,0]}),this}toString(){return Ce3(this.segments,this.round)}dispose(){Object.keys(this).forEach(e4=>delete this[e4])}static get options(){return O4}static get CSSMatrix(){return y4}static get arcTools(){return ut3}static get bezierTools(){return ct3}static get cubicTools(){return ft3}static get lineTools(){return ot3}static get polygonTools(){return bt2}static get quadTools(){return ht3}static get pathToAbsolute(){return oe3}static get pathToRelative(){return Je3}static get pathToCurve(){return ae3}static get pathToString(){return Ce3}static get distanceSquareRoot(){return re3}static get midPoint(){return E4}static get rotateVector(){return ne3}static get roundTo(){return M4}static get parsePathString(){return L3}static get finalizeSegment(){return Se3}static get invalidPathValue(){return $6}static get isArcCommand(){return qe3}static get isDigit(){return B4}static get isDigitStart(){return ke3}static get isMoveCommand(){return Qe3}static get isPathCommand(){return Re3}static get isSpace(){return Ve3}static get paramsCount(){return Z4}static get paramsParser(){return U3}static get pathParser(){return F5}static get scanFlag(){return we3}static get scanParam(){return ze3}static get scanSegment(){return ge3}static get skipSpaces(){return G4}static get distanceEpsilon(){return se3}static get getClosestPoint(){return dt3}static get getDrawDirection(){return yt3}static get getPathArea(){return Oe3}static get getPathBBox(){return We3}static get getPointAtLength(){return me3}static get getPropertiesAtLength(){return de3}static get getPropertiesAtPoint(){return Y5}static get getSegmentAtLength(){return Pt3}static get getSegmentOfPoint(){return xt3}static get getTotalLength(){return K3}static get isAbsoluteArray(){return Ie3}static get isCurveArray(){return St3}static get isNormalizedArray(){return Be3}static get isPathArray(){return ee3}static get isPointInStroke(){return At3}static get isRelativeArray(){return Ct3}static get isValidPath(){return $e3}static get shapeParams(){return te3}static get shapeToPath(){return Tt3}static get shapeToPathArray(){return je3}static get absolutizeSegment(){return _4}static get arcToCubic(){return be3}static get getSVGMatrix(){return Ze3}static get iterate(){return T6}static get lineToCubic(){return Ae3}static get normalizePath(){return J4}static get normalizeSegment(){return X5}static get optimizePath(){return Ye3}static get projection2d(){return Me3}static get quadToCubic(){return De3}static get relativizeSegment(){return he3}static get reverseCurve(){return Mt3}static get reversePath(){return Te3}static get roundPath(){return Lt3}static get roundSegment(){return ie3}static get segmentToCubic(){return Ee3}static get shortenSegment(){return He3}static get splitCubic(){return vt3}static get splitPath(){return et3}static get transformPath(){return tt3}},It3=Nt3,Ci3=It3;var import_react5=__toESM(require_react(),1),import_react6=__toESM(require_react(),1);var import_jsx_runtime=__toESM(require_jsx_runtime(),1);var import_jsx_runtime2=__toESM(require_jsx_runtime(),1),import_jsx_runtime3=__toESM(require_jsx_runtime(),1);var import_jsx_runtime4=__toESM(require_jsx_runtime(),1);var import_jsx_runtime5=__toESM(require_jsx_runtime(),1);var import_jsx_runtime6=__toESM(require_jsx_runtime(),1),import_react7=__toESM(require_react(),1);var __defProp5=Object.defineProperty,__export3=(target,all)=>{for(var name in all)__defProp5(target,name,{get:all[name],enumerable:!0})},components_exports={};__export3(components_exports,{AnalogSimulation:()=>AnalogSimulation,Battery:()=>Battery,Board:()=>Board,Breakout:()=>Breakout,BreakoutPoint:()=>BreakoutPoint,CadAssembly:()=>CadAssembly,CadModel:()=>CadModel,Capacitor:()=>Capacitor,Chip:()=>Chip,Connector:()=>Connector,Constraint:()=>Constraint3,CopperPour:()=>CopperPour,CopperText:()=>CopperText,CourtyardCircle:()=>CourtyardCircle,CourtyardOutline:()=>CourtyardOutline,CourtyardRect:()=>CourtyardRect,Crystal:()=>Crystal,CurrentSource:()=>CurrentSource,Cutout:()=>Cutout,Diode:()=>Diode,FabricationNoteDimension:()=>FabricationNoteDimension,FabricationNotePath:()=>FabricationNotePath,FabricationNoteRect:()=>FabricationNoteRect,FabricationNoteText:()=>FabricationNoteText,Fiducial:()=>Fiducial,Footprint:()=>Footprint,Fuse:()=>Fuse,Group:()=>Group6,Hole:()=>Hole,Inductor:()=>Inductor,Interconnect:()=>Interconnect,Jumper:()=>Jumper,Keepout:()=>Keepout,Led:()=>Led,Mosfet:()=>Mosfet,MountedBoard:()=>MountedBoard,Net:()=>Net,NetLabel:()=>NetLabel,NormalComponent:()=>NormalComponent3,OpAmp:()=>OpAmp,Panel:()=>Panel,PcbNoteDimension:()=>PcbNoteDimension,PcbNoteLine:()=>PcbNoteLine,PcbNotePath:()=>PcbNotePath,PcbNoteRect:()=>PcbNoteRect,PcbNoteText:()=>PcbNoteText,PcbTrace:()=>PcbTrace,PinHeader:()=>PinHeader,Pinout:()=>Pinout,PlatedHole:()=>PlatedHole,Port:()=>Port,Potentiometer:()=>Potentiometer,PowerSource:()=>PowerSource,PrimitiveComponent:()=>PrimitiveComponent2,PushButton:()=>PushButton,Renderable:()=>Renderable,Resistor:()=>Resistor,Resonator:()=>Resonator,SchematicArc:()=>SchematicArc,SchematicBox:()=>SchematicBox,SchematicCell:()=>SchematicCell,SchematicCircle:()=>SchematicCircle,SchematicLine:()=>SchematicLine,SchematicPath:()=>SchematicPath,SchematicRect:()=>SchematicRect,SchematicRow:()=>SchematicRow,SchematicTable:()=>SchematicTable,SchematicText:()=>SchematicText,SilkscreenCircle:()=>SilkscreenCircle,SilkscreenLine:()=>SilkscreenLine,SilkscreenPath:()=>SilkscreenPath,SilkscreenRect:()=>SilkscreenRect,SilkscreenText:()=>SilkscreenText,SmtPad:()=>SmtPad,SolderJumper:()=>SolderJumper,Subcircuit:()=>Subcircuit,Subpanel:()=>Subpanel,Switch:()=>Switch,Symbol:()=>SymbolComponent,TestPoint:()=>TestPoint,Trace:()=>Trace3,TraceHint:()=>TraceHint,Transistor:()=>Transistor,Via:()=>Via,VoltageProbe:()=>VoltageProbe,VoltageSource:()=>VoltageSource});var DirectLineRouter=class{constructor({input:input2}){__publicField(this,"input");this.input=input2}solveAndMapToTraces(){let traces=[];for(let connection of this.input.connections){if(connection.pointsToConnect.length!==2)continue;let[start,end]=connection.pointsToConnect,trace={type:"pcb_trace",pcb_trace_id:"",connection_name:connection.name,route:[{route_type:"wire",x:start.x,y:start.y,layer:"top",width:.1},{route_type:"wire",x:end.x,y:end.y,layer:"top",width:.1}]};traces.push(trace)}return traces}},computeObstacleBounds=obstacles=>{let minX=Math.min(...obstacles.map(o3=>o3.center.x)),maxX=Math.max(...obstacles.map(o3=>o3.center.x)),minY=Math.min(...obstacles.map(o3=>o3.center.y)),maxY=Math.max(...obstacles.map(o3=>o3.center.y));return{minX,maxX,minY,maxY}},LAYER_SELECTION_PREFERENCE=["top","bottom","inner1","inner2"],findPossibleTraceLayerCombinations=(hints,layer_path=[])=>{let candidates=[];if(layer_path.length===0){let starting_layers=hints[0].layers;for(let layer of starting_layers)candidates.push(...findPossibleTraceLayerCombinations(hints.slice(1),[layer]));return candidates}if(hints.length===0)return[];let current_hint=hints[0],is_possibly_via=current_hint.via||current_hint.optional_via,last_layer=layer_path[layer_path.length-1];if(hints.length===1){let last_hint=current_hint;return last_hint.layers&&is_possibly_via?last_hint.layers.map(layer=>({layer_path:[...layer_path,layer]})):last_hint.layers?.includes(last_layer)?[{layer_path:[...layer_path,last_layer]}]:[]}if(!is_possibly_via)return current_hint.layers&&!current_hint.layers.includes(last_layer)?[]:findPossibleTraceLayerCombinations(hints.slice(1),layer_path.concat([last_layer]));let candidate_next_layers=(current_hint.optional_via?LAYER_SELECTION_PREFERENCE:LAYER_SELECTION_PREFERENCE.filter(layer=>layer!==last_layer)).filter(layer=>!current_hint.layers||current_hint.layers?.includes(layer));for(let candidate_next_layer of candidate_next_layers)candidates.push(...findPossibleTraceLayerCombinations(hints.slice(1),layer_path.concat(candidate_next_layer)));return candidates};function getDominantDirection(edge){let delta={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},absX=Math.abs(delta.x),absY=Math.abs(delta.y);return absX>absY?delta.x>0?"right":"left":delta.y>0?"down":"up"}function pdist(a2,b3){return Math.hypot(a2.x-b3.x,a2.y-b3.y)}var mergeRoutes=routes=>{if(routes.length===1)return routes[0];if(routes.some(r4=>r4.length===0))throw new Error("Cannot merge routes with zero length");let merged=[],first_route_fp=routes[0][0],first_route_lp=routes[0][routes[0].length-1],second_route_fp=routes[1][0],second_route_lp=routes[1][routes[1].length-1],best_reverse_dist=Math.min(pdist(first_route_fp,second_route_fp),pdist(first_route_fp,second_route_lp)),best_normal_dist=Math.min(pdist(first_route_lp,second_route_fp),pdist(first_route_lp,second_route_lp));best_reverse_dist<best_normal_dist?merged.push(...routes[0].reverse()):merged.push(...routes[0]);for(let i2=1;i2<routes.length;i2++){let last_merged_point=merged[merged.length-1],next_route=routes[i2],next_first_point=next_route[0],next_last_point=next_route[next_route.length-1],distance_to_first=pdist(last_merged_point,next_first_point),distance_to_last=pdist(last_merged_point,next_last_point);distance_to_first<distance_to_last?merged.push(...next_route):merged.push(...next_route.reverse())}for(let i2=1;i2<merged.length-1;i2++){let lastPoint=merged[i2-1],currentPoint=merged[i2];lastPoint.route_type==="wire"&¤tPoint.route_type==="wire"&&lastPoint.layer!==currentPoint.layer&&merged.splice(i2,0,{x:lastPoint.x,y:lastPoint.y,from_layer:lastPoint.layer,to_layer:currentPoint.layer,route_type:"via"})}return merged},debug6=(0,import_debug8.default)("tscircuit:renderable"),orderedRenderPhases=["ReactSubtreesRender","RenderIsolatedSubcircuits","InflateSubcircuitCircuitJson","SourceNameDuplicateComponentRemoval","PcbFootprintStringRender","FetchPartFootprint","InitializePortsFromChildren","CreateNetsFromProps","AssignFallbackProps","CreateTracesFromProps","CreateTracesFromNetLabels","CreateTraceHintsFromProps","SourceGroupRender","AssignNameToUnnamedComponents","SourceRender","SourceParentAttachment","PortMatching","OptimizeSelectorCache","SourceTraceRender","SourceAddConnectivityMapKey","SourceDesignRuleChecks","SimulationRender","SchematicComponentRender","SchematicPortRender","SymbolContainerRender","SchematicPrimitiveRender","SchematicSymbolResize","SchematicComponentSizeCalculation","SchematicLayout","SchematicTraceRender","SchematicReplaceNetLabelsWithSymbols","PanelBoardLayout","ValidatePcbCoordinates","PcbComponentRender","PcbPrimitiveRender","PcbFootprintLayout","PcbPortRender","PcbPortAttachment","PcbComponentSizeCalculation","PcbComponentAnchorAlignment","PcbCalcPlacementResolution","PcbLayout","PcbBoardAutoSize","PanelLayout","PcbTraceHintRender","PcbManualTraceRender","PcbTraceRender","PcbRouteNetIslands","PcbCopperPourRender","PcbDesignRuleChecks","SilkscreenOverlapAdjustment","CadModelRender","PartsEngineRender","SimulationSpiceEngineRender"],renderPhaseIndexMap=new Map(orderedRenderPhases.map((phase,index)=>[phase,index])),asyncPhaseDependencies={InflateSubcircuitCircuitJson:["RenderIsolatedSubcircuits"],SchematicComponentRender:["PcbFootprintStringRender","FetchPartFootprint"],SchematicPortRender:["PcbFootprintStringRender","FetchPartFootprint"],SymbolContainerRender:["PcbFootprintStringRender","FetchPartFootprint"],SchematicPrimitiveRender:["PcbFootprintStringRender","FetchPartFootprint"],SchematicSymbolResize:["PcbFootprintStringRender","FetchPartFootprint"],SchematicComponentSizeCalculation:["PcbFootprintStringRender","FetchPartFootprint"],SchematicLayout:["PcbFootprintStringRender","FetchPartFootprint"],SchematicTraceRender:["PcbFootprintStringRender","FetchPartFootprint"],SchematicReplaceNetLabelsWithSymbols:["PcbFootprintStringRender","FetchPartFootprint"],PcbFootprintLayout:["PcbFootprintStringRender","FetchPartFootprint"],PcbComponentSizeCalculation:["PcbFootprintStringRender","FetchPartFootprint"],PcbLayout:["PcbFootprintStringRender","FetchPartFootprint"],PcbBoardAutoSize:["PcbFootprintStringRender","FetchPartFootprint"],PcbTraceHintRender:["PcbFootprintStringRender","FetchPartFootprint"],PcbManualTraceRender:["PcbFootprintStringRender","FetchPartFootprint"],PcbCopperPourRender:["PcbFootprintStringRender","FetchPartFootprint","PcbTraceRender","PcbRouteNetIslands"],PcbTraceRender:["PcbFootprintStringRender","FetchPartFootprint"],PcbRouteNetIslands:["PcbFootprintStringRender","FetchPartFootprint"],PcbDesignRuleChecks:["PcbFootprintStringRender","FetchPartFootprint"],SilkscreenOverlapAdjustment:["PcbFootprintStringRender","FetchPartFootprint"],CadModelRender:["PcbFootprintStringRender","FetchPartFootprint"],PartsEngineRender:["PcbFootprintStringRender","FetchPartFootprint"],PcbComponentAnchorAlignment:["PcbFootprintStringRender","FetchPartFootprint"],PcbCalcPlacementResolution:["PcbFootprintStringRender","FetchPartFootprint"],ValidatePcbCoordinates:["PcbFootprintStringRender","FetchPartFootprint"],SourceTraceRender:["PcbFootprintStringRender","FetchPartFootprint"]},globalRenderCounter=0,globalAsyncEffectCounter=0,Renderable=class _Renderable{constructor(props){__publicField(this,"renderPhaseStates");__publicField(this,"shouldBeRemoved",!1);__publicField(this,"children");__publicField(this,"isPcbPrimitive",!1);__publicField(this,"isSchematicPrimitive",!1);__publicField(this,"_renderId");__publicField(this,"_currentRenderPhase",null);__publicField(this,"_asyncEffects",[]);__publicField(this,"parent",null);this._renderId=`${globalRenderCounter++}`,this.children=[],this.renderPhaseStates={};for(let phase of orderedRenderPhases)this.renderPhaseStates[phase]={initialized:!1,dirty:!1}}_markDirty(phase){this.renderPhaseStates[phase].dirty=!0;let phaseIndex=renderPhaseIndexMap.get(phase);for(let i2=phaseIndex+1;i2<orderedRenderPhases.length;i2++)this.renderPhaseStates[orderedRenderPhases[i2]].dirty=!0;this.parent?._markDirty&&this.parent._markDirty(phase)}_queueAsyncEffect(effectName,effect){let asyncEffectId=`${this._renderId}:${globalAsyncEffectCounter++}`,asyncEffect={asyncEffectId,promise:effect(),phase:this._currentRenderPhase,effectName,complete:!1};this._asyncEffects.push(asyncEffect);let root=this._getRootCircuit();root&&root.emit("asyncEffect:start",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase}),asyncEffect.promise.then(()=>{asyncEffect.complete=!0;let root2=this._getRootCircuit();root2&&root2.emit("asyncEffect:end",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase})}).catch(error=>{console.error(`Async effect error in ${asyncEffect.phase} "${effectName}":
|
|
647
647
|
${error.stack}`),asyncEffect.complete=!0;let root2=this._getRootCircuit();root2&&root2.emit("asyncEffect:end",{asyncEffectId,effectName,componentDisplayName:this.getString(),phase:asyncEffect.phase,error:error.toString()})})}_emitRenderLifecycleEvent(phase,startOrEnd){debug6(`${phase}:${startOrEnd} ${this.getString()}`);let granular_event_type=`renderable:renderLifecycle:${phase}:${startOrEnd}`,eventPayload={renderId:this._renderId,componentDisplayName:this.getString(),type:granular_event_type},root=this._getRootCircuit();root&&(root.emit(granular_event_type,eventPayload),root.emit("renderable:renderLifecycle:anyEvent",{...eventPayload,type:granular_event_type}))}getString(){return this.constructor.name}_hasIncompleteAsyncEffects(){return this._asyncEffects.some(effect=>!effect.complete)?!0:this.children.some(child=>typeof child._hasIncompleteAsyncEffects=="function"?child._hasIncompleteAsyncEffects():!1)}_hasIncompleteAsyncEffectsInSubtreeForPhase(phase){for(let e4 of this._asyncEffects)if(!e4.complete&&e4.phase===phase)return!0;for(let child of this.children)if(child._hasIncompleteAsyncEffectsInSubtreeForPhase(phase))return!0;return!1}_hasIncompleteAsyncEffectsForPhase(phase){let root=this._getRootCircuit();return root?._hasIncompleteAsyncEffectsForPhase?root._hasIncompleteAsyncEffectsForPhase(phase):this._hasIncompleteAsyncEffectsInSubtreeForPhase(phase)}getCurrentRenderPhase(){return this._currentRenderPhase}getRenderGraph(){return{id:this._renderId,currentPhase:this._currentRenderPhase,renderPhaseStates:this.renderPhaseStates,shouldBeRemoved:this.shouldBeRemoved,children:this.children.map(child=>child.getRenderGraph())}}getTopLevelRenderable(){let current2=this;for(;current2.parent&¤t2.parent instanceof _Renderable;)current2=current2.parent;return current2}runRenderCycle(){for(let renderPhase of orderedRenderPhases)this.runRenderPhaseForChildren(renderPhase),this.runRenderPhase(renderPhase)}runRenderPhase(phase){this._currentRenderPhase=phase;let phaseState=this.renderPhaseStates[phase],isInitialized=phaseState.initialized,isDirty2=phaseState.dirty;if(!isInitialized&&this.shouldBeRemoved)return;if(this.shouldBeRemoved&&isInitialized){this._emitRenderLifecycleEvent(phase,"start"),this?.[`remove${phase}`]?.(),phaseState.initialized=!1,phaseState.dirty=!1,this._emitRenderLifecycleEvent(phase,"end");return}let prevPhaseIndex=renderPhaseIndexMap.get(phase)-1;if(prevPhaseIndex>=0){let prevPhase=orderedRenderPhases[prevPhaseIndex];if(this._asyncEffects.filter(e4=>e4.phase===prevPhase).some(e4=>!e4.complete))return}let deps=asyncPhaseDependencies[phase]||[];if(deps.length>0){for(let depPhase of deps)if(this._hasIncompleteAsyncEffectsForPhase(depPhase))return}if(this._emitRenderLifecycleEvent(phase,"start"),isInitialized){isDirty2&&(this?.[`update${phase}`]?.(),phaseState.dirty=!1),this._emitRenderLifecycleEvent(phase,"end");return}phaseState.dirty=!1,this?.[`doInitial${phase}`]?.(),phaseState.initialized=!0,this._emitRenderLifecycleEvent(phase,"end")}runRenderPhaseForChildren(phase){for(let child of this.children)"_isIsolatedSubcircuit"in this&&this._isIsolatedSubcircuit&&"doInitialRenderIsolatedSubcircuits"in this&&phase==="RenderIsolatedSubcircuits"||(child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase))}_getRootCircuit(){return"root"in this?this.root??null:null}renderError(message){throw typeof message=="string"?new Error(message):new Error(JSON.stringify(message,null,2))}},InvalidProps=class extends Error{constructor(componentName,originalProps,formattedError){let message,propsWithError=Object.keys(formattedError).filter(k4=>k4!=="_errors"),invalidPinLabelMessages=[],pinLabels=originalProps.pinLabels;if(pinLabels)for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels];for(let label of labels)typeof label=="string"&&(label.startsWith(" ")||label.endsWith(" "))&&invalidPinLabelMessages.push(`pinLabels.${pin} ("${label}" has leading or trailing spaces)`)}let propMessage=propsWithError.map(k4=>k4==="pinLabels"&&invalidPinLabelMessages.length>0?invalidPinLabelMessages.join(", "):formattedError[k4]._errors[0]?`${k4} (${formattedError[k4]._errors[0]})`:`${k4} (${JSON.stringify(formattedError[k4])})`).join(", ");"name"in originalProps?message=`Invalid props for ${componentName} "${originalProps.name}": ${propMessage}`:"footprint"in originalProps&&typeof originalProps.footprint=="string"?message=`Invalid props for ${componentName} (unnamed ${originalProps.footprint} component): ${propMessage}`:message=`Invalid props for ${componentName} (unnamed): ${propMessage}`;super(message);__publicField(this,"componentName");__publicField(this,"originalProps");__publicField(this,"formattedError");this.componentName=componentName,this.originalProps=originalProps,this.formattedError=formattedError}},defaultUnits={mm:1};function evaluateCalcString(input2,options){let{knownVariables,units:userUnits}=options,units={...defaultUnits,...userUnits??{}},expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2)),tokens=tokenize2(expr,units);return parseExpression(tokens,knownVariables)}function extractCalcIdentifiers(input2){let expr=normalizeLegacyBoundsIdentifierCase(extractExpression(input2));return tokenize2(expr,defaultUnits).filter(token=>token.type==="identifier").map(token=>token.value)}function normalizeLegacyBoundsIdentifierCase(expr){let legacyBoundNameToCamelCase={minx:"minX",maxx:"maxX",miny:"minY",maxy:"maxY"};return expr.replace(/\.(minx|maxx|miny|maxy)\b/gi,(match2,boundName)=>`.${legacyBoundNameToCamelCase[String(boundName).toLowerCase()]??match2.slice(1)}`)}function extractExpression(raw){let trimmed=raw.trim();if(!trimmed.toLowerCase().startsWith("calc"))return trimmed;let match2=trimmed.match(/^calc\s*\((.*)\)$/is);if(!match2)throw new Error(`Invalid calc() expression: "${raw}"`);return match2[1].trim()}function tokenize2(expr,units){let tokens=[],i2=0,isDigit=ch3=>ch3>="0"&&ch3<="9",isIdentStart=ch3=>ch3>="A"&&ch3<="Z"||ch3>="a"&&ch3<="z"||ch3==="_",isIdentChar=ch3=>isIdentStart(ch3)||isDigit(ch3)||ch3===".";for(;i2<expr.length;){let ch3=expr[i2];if(ch3===" "||ch3===" "||ch3===`
|
|
648
648
|
`||ch3==="\r"){i2++;continue}if(isDigit(ch3)||ch3==="."&&i2+1<expr.length&&isDigit(expr[i2+1])){let start=i2;for(i2++;i2<expr.length;){let c3=expr[i2];if(isDigit(c3)||c3===".")i2++;else break}let numberText=expr.slice(start,i2),num=Number(numberText);if(Number.isNaN(num))throw new Error(`Invalid number: "${numberText}"`);let unitStart=i2;for(;i2<expr.length&&/[A-Za-z]/.test(expr[i2]);)i2++;if(i2>unitStart){let unitText=expr.slice(unitStart,i2),factor=units[unitText];if(factor==null)throw new Error(`Unknown unit: "${unitText}"`);num*=factor}tokens.push({type:"number",value:num});continue}if(isIdentStart(ch3)){let start=i2;for(i2++;i2<expr.length&&isIdentChar(expr[i2]);)i2++;let ident=expr.slice(start,i2);tokens.push({type:"identifier",value:ident});continue}if(ch3==="("||ch3===")"){tokens.push({type:"paren",value:ch3}),i2++;continue}if(ch3==="+"||ch3==="-"||ch3==="*"||ch3==="/"){tokens.push({type:"operator",value:ch3}),i2++;continue}throw new Error(`Unexpected character "${ch3}" in expression "${expr}"`)}return tokens}function parseExpression(tokens,vars){let index=0,peek=()=>tokens[index],consume=()=>tokens[index++],parsePrimary=()=>{let token=peek();if(!token)throw new Error("Unexpected end of expression");if(token.type==="number")return consume(),token.value;if(token.type==="identifier"){consume();let value=vars[token.value];if(value==null)throw new Error(`Unknown variable: "${token.value}"`);return value}if(token.type==="paren"&&token.value==="("){consume();let value=parseExpr(),next2=peek();if(!next2||next2.type!=="paren"||next2.value!==")")throw new Error('Expected ")"');return consume(),value}throw new Error(`Unexpected token "${token.value}"`)},parseFactor=()=>{let token=peek();if(token&&token.type==="operator"&&(token.value==="+"||token.value==="-")){consume();let value=parseFactor();return token.value==="+"?value:-value}return parsePrimary()},parseTerm=()=>{let value=parseFactor();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="*"&&token.value!=="/")break;consume();let rhs=parseFactor();token.value==="*"?value*=rhs:value/=rhs}return value},parseExpr=()=>{let value=parseTerm();for(;;){let token=peek();if(!token||token.type!=="operator"||token.value!=="+"&&token.value!=="-")break;consume();let rhs=parseTerm();token.value==="+"?value+=rhs:value-=rhs}return value},result=parseExpr();if(index<tokens.length){let leftover=tokens.slice(index).map(t35=>"value"in t35?t35.value:"?").join(" ");throw new Error(`Unexpected tokens at end of expression: ${leftover}`)}return result}function setSubcircuitPcbComponentCalcVariables(params){let{vars,componentName,position:position2,size:size2}=params;vars[`${componentName}.x`]=position2.x,vars[`${componentName}.y`]=position2.y,vars[`${componentName}.width`]=size2.width,vars[`${componentName}.height`]=size2.height,vars[`${componentName}.minX`]=position2.x-size2.width/2,vars[`${componentName}.maxX`]=position2.x+size2.width/2,vars[`${componentName}.minY`]=position2.y-size2.height/2,vars[`${componentName}.maxY`]=position2.y+size2.height/2}function getSubcircuitPcbCalcVariables(db2){let vars={};for(let sourceComponent of db2.source_component.list()){if(!sourceComponent.name)continue;let pcbComponent=db2.pcb_component.getWhere({source_component_id:sourceComponent.source_component_id});pcbComponent&&setSubcircuitPcbComponentCalcVariables({vars,componentName:sourceComponent.name,position:{x:pcbComponent.center.x,y:pcbComponent.center.y},size:{width:pcbComponent.width??0,height:pcbComponent.height??0}})}return vars}function convertPcbStyleToPcbSx(pcbStyle2){if(!pcbStyle2)return;let sx3={};if(pcbStyle2.silkscreenFontSize!==void 0&&(sx3["& silkscreentext"]={fontSize:pcbStyle2.silkscreenFontSize}),Object.keys(sx3).length!==0)return sx3}function getResolvedPcbSx({parentResolvedPcbSx,pcbStyle:pcbStyle2,ownPcbSx}){let styleSx=convertPcbStyleToPcbSx(pcbStyle2),result={},allKeys=new Set;if(parentResolvedPcbSx)for(let k4 of Object.keys(parentResolvedPcbSx))allKeys.add(k4);if(styleSx)for(let k4 of Object.keys(styleSx))allKeys.add(k4);if(ownPcbSx)for(let k4 of Object.keys(ownPcbSx))allKeys.add(k4);for(let key of allKeys)result[key]={...parentResolvedPcbSx?.[key],...styleSx?.[key],...ownPcbSx?.[key]};return result}function isMatchingSelector(component,selector){let idMatch=selector.match(/^#(\w+)/);if(idMatch)return component.props.id===idMatch[1];let classMatch=selector.match(/^\.(\w+)/);if(classMatch)return component.isMatchingNameOrAlias(classMatch[1]);let[type,...conditions]=selector.split(/(?=[#.[])/);return type==="pin"&&(type="port"),type&&type!=="*"&&component.lowercaseComponentName!==type.toLowerCase()?!1:conditions.every(condition=>{if(condition.startsWith("#"))return component.props.id===condition.slice(1);if(condition.startsWith("."))return component.isMatchingNameOrAlias(condition.slice(1));let match2=condition.match(/\[(\w+)=['"]?(.+?)['"]?\]/);if(!match2)return!0;let[,prop,value]=match2;return component.props[prop].toString()===value})}var cssSelectPrimitiveComponentAdapter={isTag:node=>!0,getParent:node=>node.parent,getChildren:node=>node.children,getName:node=>node.lowercaseComponentName,getAttributeValue:(node,name)=>{if(name==="class"&&"getNameAndAliases"in node)return node.getNameAndAliases().join(" ");if(name==="name"&&node._parsedProps?.name)return node._parsedProps.name;if(node._parsedProps&&name in node._parsedProps){let value=node._parsedProps[name];return typeof value=="string"?value:value!=null?String(value):null}if(name in node){let value=node[name];return typeof value=="string"?value:value!=null?String(value):null}let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node){let value=node[camelCaseName];return typeof value=="string"?value:value!=null?String(value):null}}return null},hasAttrib:(node,name)=>{if(name==="class")return!!node._parsedProps?.name;if(node._parsedProps&&name in node._parsedProps||name in node)return!0;let reverseMap=node._attributeLowerToCamelNameMap;if(reverseMap){let camelCaseName=reverseMap[name];if(camelCaseName&&camelCaseName in node)return!0}return!1},getSiblings:node=>node.parent?node.parent.children:[],prevElementSibling:node=>{if(!node.parent)return null;let siblings=node.parent.children,idx=siblings.indexOf(node);return idx>0?siblings[idx-1]:null},getText:()=>"",removeSubsets:nodes=>nodes.filter((node,i2)=>!nodes.some((other,j4)=>i2!==j4&&other!==node&&other.getDescendants().includes(node))),existsOne:(test,nodes)=>nodes.some(test),findAll:(test,nodes)=>{let result=[],recurse=node=>{test(node)&&result.push(node);for(let child of node.children)recurse(child)};for(let node of nodes)recurse(node);return result},findOne:(test,nodes)=>{for(let node of nodes){if(test(node))return node;let children=node.children;if(children.length>0){let result=cssSelectPrimitiveComponentAdapter.findOne(test,children);if(result)return result}}return null},equals:(a2,b3)=>a2._renderId===b3._renderId,isHovered:elem=>!1,isVisited:elem=>!1,isActive:elem=>!1},cssSelectPrimitiveComponentAdapterWithoutSubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c3=>!c3.isSubcircuit)},cssSelectPrimitiveComponentAdapterOnlySubcircuits={...cssSelectPrimitiveComponentAdapter,getChildren:node=>node.children.filter(c3=>c3.isSubcircuit)},buildPlusMinusNetErrorMessage=(selector,component)=>{let netName=selector.split("net.")[1]?.split(/[ >]/)[0]??selector;return`Net names cannot contain "+" or "-" (component "${component?.componentName??"Unknown component"}" received "${netName}" via "${selector}"). Try using underscores instead, e.g. VCC_P`},preprocessSelector=(selector,component)=>{if(/net\.[^\s>]*\./.test(selector))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(selector))throw new Error(buildPlusMinusNetErrorMessage(selector,component));if(/net\.[0-9]/.test(selector)){let match2=selector.match(/net\.([^ >]+)/),netName=match2?match2[1]:"";throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}return selector.replace(/ pin(?=[\d.])/g," port").replace(/ subcircuit\./g," group[isSubcircuit=true]").replace(/([^ ])\>([^ ])/g,"$1 > $2").replace(/(^|[ >])(?!pin\.)(?!port\.)(?!net\.)([A-Z][A-Za-z0-9_-]*)\.([A-Za-z0-9_-]+)/g,(_5,sep,name,pin)=>{let pinPart=/^\d+$/.test(pin)?`pin${pin}`:pin;return`${sep}.${name} > .${pinPart}`}).trim()},cssSelectOptionsInsideSubcircuit={adapter:cssSelectPrimitiveComponentAdapterWithoutSubcircuits,cacheResults:!0},PrimitiveComponent2=class extends Renderable{constructor(props){super(props);__publicField(this,"parent",null);__publicField(this,"children");__publicField(this,"childrenPendingRemoval");__publicField(this,"props");__publicField(this,"_parsedProps");__publicField(this,"externallyAddedAliases");__publicField(this,"isPrimitiveContainer",!1);__publicField(this,"canHaveTextChildren",!1);__publicField(this,"source_group_id",null);__publicField(this,"source_component_id",null);__publicField(this,"schematic_component_id",null);__publicField(this,"pcb_component_id",null);__publicField(this,"cad_component_id",null);__publicField(this,"_reportedInvalidPcbCalcWarnings",new Set);__publicField(this,"fallbackUnassignedName");__publicField(this,"_cachedSelectAllQueries",new Map);__publicField(this,"_cachedSelectOneQueries",new Map);this.children=[],this.childrenPendingRemoval=[],this.props=props??{},this.externallyAddedAliases=[];let parsePropsResult=("partial"in this.config.zodProps?this.config.zodProps.partial({name:!0}):this.config.zodProps).safeParse(props??{});if(parsePropsResult.success)this._parsedProps=parsePropsResult.data;else throw new InvalidProps(this.lowercaseComponentName,this.props,parsePropsResult.error.format())}get config(){return{componentName:"",zodProps:external_exports.object({}).passthrough()}}get componentName(){return this.config.componentName}getInheritedProperty(propertyName){let current2=this;for(;current2;){if(current2._parsedProps&&propertyName in current2._parsedProps)return current2._parsedProps[propertyName];current2=current2.parent}if(this.root?.platform&&propertyName in this.root.platform)return this.root.platform[propertyName]}getInheritedMergedProperty(propertyName){let parentPropertyObject=this.parent?.getInheritedMergedProperty?.(propertyName),myPropertyObject=this._parsedProps?.[propertyName];return{...parentPropertyObject,...myPropertyObject}}getResolvedPcbSx(){return getResolvedPcbSx({parentResolvedPcbSx:this.parent?.getResolvedPcbSx?.(),pcbStyle:this._parsedProps?.pcbStyle,ownPcbSx:this._parsedProps?.pcbSx})}get lowercaseComponentName(){return this.componentName.toLowerCase()}get isSubcircuit(){return!!this.props.subcircuit||this.lowercaseComponentName==="group"&&this?.parent?.isRootCircuit}get isGroup(){return this.lowercaseComponentName==="group"}get name(){return this._parsedProps.name??this.fallbackUnassignedName}_reportInvalidComponentPropertyError(propertyName,message){!this.root||this._reportedInvalidPcbCalcWarnings.has(propertyName)||(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:propertyName,message,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(propertyName))}setProps(props){let newProps=this.config.zodProps.parse({...this.props,...props}),oldProps=this.props;this.props=newProps,this._parsedProps=this.config.zodProps.parse(props),this.onPropsChange({oldProps,newProps,changedProps:Object.keys(props)}),this.parent?.onChildChanged?.(this)}_getPcbRotationBeforeLayout(){let{pcbRotation}=this.props;return typeof pcbRotation=="string"?parseFloat(pcbRotation):pcbRotation??null}getResolvedPcbPositionProp(){return{pcbX:this._resolvePcbCoordinate(this._parsedProps.pcbX,"pcbX"),pcbY:this._resolvePcbCoordinate(this._parsedProps.pcbY,"pcbY")}}doInitialValidatePcbCoordinates(){if(this.root?.pcbDisabled)return;let rawProps=this.props,rawPcbX=rawProps.pcbX,rawPcbY=rawProps.pcbY;this._validatePcbCoordinateReferences({rawValue:rawPcbX,axis:"pcbX",propertyName:"pcbX"}),this._validatePcbCoordinateReferences({rawValue:rawPcbY,axis:"pcbY",propertyName:"pcbY"})}_validatePcbCoordinateReferences(params){let{rawValue,axis,propertyName=axis}=params;if(typeof rawValue!="string")return;let allowComponentVariables=!(this._isNormalComponent===!0)&&!this._isInsideFootprint(),calcIdentifiers=[];try{calcIdentifiers=extractCalcIdentifiers(rawValue)}catch{this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Invalid calc() expression. expression="${rawValue}"`);return}calcIdentifiers.some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables&&this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: component-relative calc references are not supported for footprint elements (${this.componentName}); ${propertyName} will be ignored. expression="${rawValue}"`)}_resolvePcbCoordinate(rawValue,axis,options={}){if(rawValue==null)return 0;let propertyName=options.propertyName??axis;if(typeof rawValue=="number")return Number.isFinite(rawValue)?rawValue:0;if(typeof rawValue!="string")throw new Error(`Invalid ${axis} value for ${this.componentName}: ${String(rawValue)}`);let allowBoardVariables=options.allowBoardVariables??this._shouldAllowBoardVariablesByDefault(),isNormalComponent=this._isNormalComponent===!0,allowComponentVariables=options.allowComponentVariables??(!isNormalComponent&&!this._isInsideFootprint()),includesBoardVariable=rawValue.includes("board."),knownVariables={};if(allowBoardVariables){let board=this._getBoard(),boardVariables=board?._getBoardCalcVariables()??{};if(includesBoardVariable&&!board)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: no board found for board.* variables. expression="${rawValue}"`),0;if(includesBoardVariable&&board&&Object.keys(boardVariables).length===0)return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: Cannot do calculations based on board size when the board is auto-sized. expression="${rawValue}"`),0;Object.assign(knownVariables,boardVariables)}if(allowComponentVariables){let db2=this.root?.db;db2&&Object.assign(knownVariables,getSubcircuitPcbCalcVariables(db2)),Object.assign(knownVariables,options.componentVariables??{})}try{return extractCalcIdentifiers(rawValue).some(identifier=>!identifier.startsWith("board."))&&!allowComponentVariables?(this._isInsideFootprint()&&this.root&&!this._reportedInvalidPcbCalcWarnings.has(axis)&&(this.root.db.source_invalid_component_property_error.insert({source_component_id:this.source_component_id||"",property_name:axis,message:`component-relative calc references are not supported for footprint elements (${this.componentName}); ${axis} will be ignored. expression="${rawValue}"`,error_type:"source_invalid_component_property_error"}),this._reportedInvalidPcbCalcWarnings.add(axis)),0):evaluateCalcString(rawValue,{knownVariables})}catch(error){let message=error instanceof Error?error.message:String(error);return this._reportInvalidComponentPropertyError(propertyName,`Invalid ${propertyName} value for ${this.componentName}: ${message}. expression="${rawValue}"`),0}}_shouldAllowBoardVariablesByDefault(){return this._isNormalComponent===!0?!0:!this._isInsideFootprint()&&!this._isInsideNonBoardSubcircuit()}_isInsideFootprint(){let current2=this.parent;for(;current2;){if(current2.componentName==="Footprint")return!0;current2=current2.parent}return!1}_isInsideNonBoardSubcircuit(){let current2=this.parent;for(;current2;){let componentName=current2.componentName;if(componentName==="Board"||componentName==="MountedBoard")return!1;if(current2.isSubcircuit)return!0;current2=current2.parent}return!1}_hasUserDefinedPcbPosition(){let props=this._parsedProps;return props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0}resolvePcbCoordinate(params){let{rawValue,axis,allowBoardVariables,allowComponentVariables,componentVariables,propertyName}=params;return this._resolvePcbCoordinate(rawValue,axis,{allowBoardVariables,allowComponentVariables,componentVariables,propertyName})}computePcbPropsTransform(){let rotation4=this._getPcbRotationBeforeLayout()??0,{pcbX,pcbY}=this.getResolvedPcbPositionProp();return compose2(translate2(pcbX,pcbY),rotate2(rotation4*Math.PI/180))}_computePcbGlobalTransformBeforeLayout(){let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if(manualPlacement&&this.props.pcbX===void 0&&this.props.pcbY===void 0){let rotation4=this._getPcbRotationBeforeLayout()??0;return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),compose2(translate2(manualPlacement.x,manualPlacement.y),rotate2(rotation4*Math.PI/180)))}if(this.isPcbPrimitive){let primitiveContainer=this.getPrimitiveContainer();if(primitiveContainer&&primitiveContainer._parsedProps.layer==="bottom")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),flipY(),this.computePcbPropsTransform())}return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),this.computePcbPropsTransform())}getPrimitiveContainer(){return this.isPrimitiveContainer?this:this.parent?.getPrimitiveContainer?.()??null}_getSymbolAncestor(){let container=this.getPrimitiveContainer();return container?.componentName==="Symbol"?container:null}getParentNormalComponent(){let current2=this.parent;for(;current2;){if(current2.isPrimitiveContainer&¤t2.doInitialPcbComponentRender)return current2;current2=current2.parent}return null}_resolveText(){let text=this._parsedProps.text;if(!text)return"";if(!text.includes("{NAME}")&&!text.includes("{REF}")&&!text.includes("{REFERENCE}"))return text;let refdes=this.getParentNormalComponent()?.name;return refdes?text.replace(/\{NAME\}/g,refdes).replace(/\{REF\}/g,refdes).replace(/\{REFERENCE\}/g,refdes):text}emitSolderMaskMarginWarning(isCoveredWithSolderMask,solderMaskMargin){if(isCoveredWithSolderMask&&solderMaskMargin!==void 0){let parentNormalComponent=this.getParentNormalComponent();parentNormalComponent?.source_component_id&&this.root.db.source_property_ignored_warning.insert({source_component_id:parentNormalComponent.source_component_id,property_name:"solderMaskMargin",message:"solderMaskMargin is set but coveredWithSolderMask is true. When a component is fully covered with solder mask, a margin doesn't apply.",error_type:"source_property_ignored_warning"})}}_getPcbCircuitJsonBounds(){return{center:{x:0,y:0},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getPcbPrimitiveFlippedHelpers(){let container=this.getPrimitiveContainer(),isFlipped=container?container._parsedProps.layer==="bottom":!1;return{isFlipped,maybeFlipLayer:layer=>isFlipped?layer==="top"?"bottom":"top":layer}}_setPositionFromLayout(newCenter){throw new Error(`_setPositionFromLayout not implemented for ${this.componentName}`)}computeSchematicPropsTransform(){let{_parsedProps:props}=this;return compose2(translate2(props.schX??0,props.schY??0))}computeSchematicGlobalTransform(){let manualPlacementTransform=this._getSchematicGlobalManualPlacementTransform(this);return manualPlacementTransform||compose2(this.parent?.computeSchematicGlobalTransform?.()??identity(),this.computeSchematicPropsTransform())}_getSchematicSymbolName(){let{_parsedProps:props}=this,base_symbol_name=this.config.schematicSymbolName,orientationRotationMap={horizontal:0,pos_left:0,neg_right:0,pos_right:180,neg_left:180,pos_top:270,neg_bottom:90,vertical:270,pos_bottom:90,neg_top:90},normalizedRotation=props.schOrientation!==void 0?orientationRotationMap[props.schOrientation]:props.schRotation;if(normalizedRotation===void 0&&(normalizedRotation=0),normalizedRotation=normalizedRotation%360,normalizedRotation<0&&(normalizedRotation+=360),props.schRotation!==void 0&&normalizedRotation%90!==0)throw new Error(`Schematic rotation ${props.schRotation} is not supported for ${this.componentName}`);let symbol_name_horz=`${base_symbol_name}_horz`,symbol_name_vert=`${base_symbol_name}_vert`,symbol_name_up=`${base_symbol_name}_up`,symbol_name_down=`${base_symbol_name}_down`,symbol_name_left=`${base_symbol_name}_left`,symbol_name_right=`${base_symbol_name}_right`;if(symbol_name_right in Vf&&normalizedRotation===0)return symbol_name_right;if(symbol_name_up in Vf&&normalizedRotation===90)return symbol_name_up;if(symbol_name_left in Vf&&normalizedRotation===180)return symbol_name_left;if(symbol_name_down in Vf&&normalizedRotation===270)return symbol_name_down;if(symbol_name_horz in Vf&&(normalizedRotation===0||normalizedRotation===180))return symbol_name_horz;if(symbol_name_vert in Vf&&(normalizedRotation===90||normalizedRotation===270))return symbol_name_vert;if(base_symbol_name in Vf)return base_symbol_name}_getSchematicSymbolNameOrThrow(){let symbol_name=this._getSchematicSymbolName();if(!symbol_name)throw new Error(`No schematic symbol found (given: "${this.config.schematicSymbolName}")`);return symbol_name}getSchematicSymbol(){let symbol_name=this._getSchematicSymbolName();return symbol_name?Vf[symbol_name]??null:null}_getPcbManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits?.pcb_placements;if(!placementConfigPositions)return null;for(let position2 of placementConfigPositions)if(isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),position2.center);return null}_getSchematicManualPlacementForComponent(component){if(!this.isSubcircuit)return null;let manualEdits=this.props.manualEdits;if(!manualEdits)return null;let placementConfigPositions=manualEdits.schematic_placements;if(!placementConfigPositions)return null;for(let position2 of placementConfigPositions)if(isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)return applyToPoint2(this.computeSchematicGlobalTransform(),position2.center);return null}_getSchematicGlobalManualPlacementTransform(component){let manualEdits=this.getSubcircuit()?._parsedProps.manualEdits;if(!manualEdits)return null;for(let position2 of manualEdits.schematic_placements??[])if((isMatchingSelector(component,position2.selector)||component.props.name===position2.selector)&&position2.relative_to==="group_center")return compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),translate2(position2.center.x,position2.center.y));return null}_getGlobalPcbPositionBeforeLayout(){return applyToPoint2(this._computePcbGlobalTransformBeforeLayout(),{x:0,y:0})}_getGlobalSchematicPositionBeforeLayout(){return applyToPoint2(this.computeSchematicGlobalTransform(),{x:0,y:0})}_getBoard(){let current2=this;for(;current2;){let maybePrimitive=current2,componentName=maybePrimitive.componentName;if(componentName==="Board"||componentName==="MountedBoard")return maybePrimitive;current2=current2.parent??null}return this.root?._getBoard()}get root(){return this.parent?.root??null}onAddToParent(parent){this.parent=parent}onPropsChange(params){}onChildChanged(child){this.parent?.onChildChanged?.(child)}add(component){let textContent2=component.__text;if(typeof textContent2=="string"){if(this.canHaveTextChildren||textContent2.trim()==="")return;throw new Error(`Invalid JSX Element: Expected a React component but received text "${textContent2}"`)}if(Object.keys(component).length!==0){if(component.lowercaseComponentName==="panel")throw new Error("<panel> must be a root-level element");if(!component.onAddToParent)throw new Error(`Invalid JSX Element: Expected a React component but received "${JSON.stringify(component)}"`);component.onAddToParent(this),component.parent=this,this.children.push(component)}}addAll(components){for(let component of components)this.add(component)}remove(component){this.children=this.children.filter(c3=>c3!==component),this.childrenPendingRemoval.push(component),component.shouldBeRemoved=!0}getSubcircuitSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName;return!this.parent||this.parent.isSubcircuit?endPart:`${this.parent.getSubcircuitSelector()} > ${endPart}`}getFullPathSelector(){let name=this.name,endPart=name?`${this.lowercaseComponentName}.${name}`:this.lowercaseComponentName,parentSelector=this.parent?.getFullPathSelector?.();return parentSelector?`${parentSelector} > ${endPart}`:endPart}getNameAndAliases(){return[this.name,...this._parsedProps.portHints??[]].filter(Boolean)}isMatchingNameOrAlias(name){return this.getNameAndAliases().includes(name)}isMatchingAnyOf(aliases2){return this.getNameAndAliases().some(a2=>aliases2.map(a22=>a22.toString()).includes(a2))}getPcbSize(){throw new Error(`getPcbSize not implemented for ${this.componentName}`)}doesSelectorMatch(selector){let myTypeNames=[this.componentName,this.lowercaseComponentName],myClassNames=[this.name].filter(Boolean),parts=selector.trim().split(/\> /)[0],firstPart=parts[0];return parts.length>1?!1:!!(selector==="*"||selector[0]==="#"&&selector.slice(1)===this.props.id||selector[0]==="."&&myClassNames.includes(selector.slice(1))||/^[a-zA-Z0-9_]/.test(firstPart)&&myTypeNames.includes(firstPart))}getSubcircuit(){if(this.isSubcircuit)return this;let group=this.parent?.getSubcircuit?.();if(!group)throw new Error("Component is not inside an opaque group (no board?)");return group}getGroup(){return this.isGroup?this:this.parent?.getGroup?.()??null}doInitialAssignNameToUnnamedComponents(){this._parsedProps.name||(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialOptimizeSelectorCache(){if(!this.isSubcircuit)return;let ports=this.selectAll("port"),isValidShorthandName=name=>/^[A-Za-z_][A-Za-z0-9_-]*$/.test(name);for(let port of ports){let parentAliases=(port.getParentNormalComponent?.()??port.parent)?.getNameAndAliases(),portAliases=port.getNameAndAliases();if(parentAliases)for(let parentAlias of parentAliases)for(let portAlias of portAliases){let selectors=[`.${parentAlias} > .${portAlias}`,`.${parentAlias} .${portAlias}`];isValidShorthandName(parentAlias)&&isValidShorthandName(portAlias)&&selectors.push(`${parentAlias}.${portAlias}`);for(let selector of selectors){let ar4=this._cachedSelectAllQueries.get(selector);ar4?ar4.push(port):this._cachedSelectAllQueries.set(selector,[port])}}}for(let[selector,ports2]of this._cachedSelectAllQueries.entries())ports2.length===1&&this._cachedSelectOneQueries.set(selector,ports2[0])}selectAll(selectorRaw){if(this._cachedSelectAllQueries.has(selectorRaw))return this._cachedSelectAllQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this),result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit);if(result.length>0)return this._cachedSelectAllQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});if(!subcircuit)return[];let result2=subcircuit.selectAll(rest.join(" "));return this._cachedSelectAllQueries.set(selectorRaw,result2),result2}selectOne(selectorRaw,options){if(this._cachedSelectOneQueries.has(selectorRaw))return this._cachedSelectOneQueries.get(selectorRaw);let selector=preprocessSelector(selectorRaw,this);options?.port&&(options.type="port");let result=null;if(options?.type&&(result=selectAll(selector,this,cssSelectOptionsInsideSubcircuit).find(n3=>n3.lowercaseComponentName===options.type)),result??(result=selectOne(selector,this,cssSelectOptionsInsideSubcircuit)),result)return this._cachedSelectOneQueries.set(selectorRaw,result),result;let[firstpart,...rest]=selector.split(" "),subcircuit=selectOne(firstpart,this,{adapter:cssSelectPrimitiveComponentAdapterOnlySubcircuits});return subcircuit?(result=subcircuit.selectOne(rest.join(" "),options),this._cachedSelectOneQueries.set(selectorRaw,result),result):null}getAvailablePcbLayers(){if(this.isPcbPrimitive){let{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers();return"layer"in this._parsedProps||this.componentName==="SmtPad"?[maybeFlipLayer(this._parsedProps.layer??"top")]:"layers"in this._parsedProps?this._parsedProps.layers:this.componentName==="PlatedHole"?[...this.root?._getBoard()?.allLayers??["top","bottom"]]:[]}return[]}getDescendants(){let descendants=[];for(let child of this.children)descendants.push(child),descendants.push(...child.getDescendants());return descendants}getSelectableDescendants(){let descendants=[];for(let child of this.children)child.isSubcircuit?descendants.push(child):(descendants.push(child),descendants.push(...child.getSelectableDescendants()));return descendants}_getPinCount(){return 0}_getSchematicBoxDimensions(){return null}_getSchematicBoxComponentDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this;return{schWidth:props.schWidth,schHeight:props.schHeight}}renderError(message){if(typeof message=="string")return super.renderError(message);switch(message.type){case"pcb_placement_error":this.root?.db.pcb_placement_error.insert(message);break;case"pcb_via_clearance_error":this.root?.db.pcb_via_clearance_error.insert(message);break;case"pcb_trace_error":this.root?.db.pcb_trace_error.insert(message);break;case"pcb_manual_edit_conflict_warning":this.root?.db.pcb_manual_edit_conflict_warning.insert(message);break;default:this.root?.db.pcb_placement_error.insert(message)}}getString(){let{lowercaseComponentName:cname,_parsedProps:props,parent}=this;return props?.pinNumber!==void 0&&parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(pin:${props.pinNumber} .${parent?.props.name}>.${props.name}) />`:parent?.props?.name&&props?.name?`<${cname}#${this._renderId}(.${parent?.props.name}>.${props?.name}) />`:props?.from&&props?.to?`<${cname}#${this._renderId}(from:${props.from} to:${props?.to}) />`:props?.name?`<${cname}#${this._renderId} name=".${props?.name}" />`:props?.portHints?`<${cname}#${this._renderId}(${props.portHints.map(ph3=>`.${ph3}`).join(", ")}) />`:`<${cname}#${this._renderId} />`}get[Symbol.toStringTag](){return this.getString()}[Symbol.for("nodejs.util.inspect.custom")](){return this.getString()}};function pairs2(arr){let result=[];for(let i2=0;i2<arr.length-1;i2++)result.push([arr[i2],arr[i2+1]]);return result}var netProps2=external_exports.object({name:external_exports.string().refine(val=>!/[+-]/.test(val),val=>({message:`Net names cannot contain "+" or "-" (component "Net" received "${val}"). Try using underscores instead, e.g. VCC_P`}))}),Net=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_id");__publicField(this,"subcircuit_connectivity_map_key",null)}get config(){return{componentName:"Net",zodProps:netProps2}}getPortSelector(){return`net.${this.props.name}`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,isGround=props.name.startsWith("GND"),isPositiveVoltageSource=props.name.startsWith("V"),net=db2.source_net.insert({name:props.name,member_source_group_ids:[],is_ground:isGround,is_power:isPositiveVoltageSource,is_positive_voltage_source:isPositiveVoltageSource});this.source_net_id=net.source_net_id}doInitialSourceParentAttachment(){let subcircuit=this.getSubcircuit();if(!subcircuit)return;let{db:db2}=this.root;db2.source_net.update(this.source_net_id,{subcircuit_id:subcircuit.subcircuit_id})}getAllConnectedPorts(){let allPorts=this.getSubcircuit().selectAll("port"),connectedPorts=[];for(let port of allPorts){let traces=port._getDirectlyConnectedTraces();for(let trace of traces)if(trace._isExplicitlyConnectedToNet(this)){connectedPorts.push(port);break}}return connectedPorts}_getAllDirectlyConnectedTraces(){let allTraces=this.getSubcircuit().selectAll("trace"),connectedTraces=[];for(let trace of allTraces)trace._isExplicitlyConnectedToNet(this)&&connectedTraces.push(trace);return connectedTraces}doInitialPcbRouteNetIslands(){if(this.root?.pcbDisabled||this.getSubcircuit()._parsedProps.routingDisabled||this.getSubcircuit()._isInflatedFromCircuitJson||this.getSubcircuit()._getAutorouterConfig().groupMode!=="sequential-trace")return;let{db:db2}=this.root,{_parsedProps:props}=this,traces=this._getAllDirectlyConnectedTraces().filter(trace=>(trace._portsRoutedOnPcb?.length??0)>0),islands=[];for(let trace of traces){let tracePorts=trace._portsRoutedOnPcb,traceIsland=islands.find(island=>tracePorts.some(port=>island.ports.includes(port)));if(!traceIsland){islands.push({ports:[...tracePorts],traces:[trace]});continue}traceIsland.traces.push(trace),traceIsland.ports.push(...tracePorts)}if(islands.length===0)return;let islandPairs=pairs2(islands);for(let[A4,B5]of islandPairs){let Apositions=A4.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),Bpositions=B5.ports.map(port=>port._getGlobalPcbPositionBeforeLayout()),closestDist=1/0,closestPair=[-1,-1];for(let i2=0;i2<Apositions.length;i2++){let Apos=Apositions[i2];for(let j4=0;j4<Bpositions.length;j4++){let Bpos=Bpositions[j4],dist=Math.sqrt((Apos.x-Bpos.x)**2+(Apos.y-Bpos.y)**2);dist<closestDist&&(closestDist=dist,closestPair=[i2,j4])}}let Aport=A4.ports[closestPair[0]],Bport=B5.ports[closestPair[1]],pcbElements=db2.toArray().filter(elm=>elm.type==="pcb_smtpad"||elm.type==="pcb_trace"||elm.type==="pcb_plated_hole"||elm.type==="pcb_hole"||elm.type==="source_port"||elm.type==="pcb_port"),{solution}=autoroute2(pcbElements.concat([{type:"source_trace",source_trace_id:"__net_trace_tmp",connected_source_port_ids:[Aport.source_port_id,Bport.source_port_id]}])),trace=solution[0];if(!trace){this.renderError({pcb_trace_error_id:"",pcb_trace_id:"__net_trace_tmp",pcb_component_ids:[Aport.pcb_component_id,Bport.pcb_component_id].filter(Boolean),pcb_port_ids:[Aport.pcb_port_id,Bport.pcb_port_id].filter(Boolean),type:"pcb_trace_error",error_type:"pcb_trace_error",message:`Failed to route net islands for "${this.getString()}"`,source_trace_id:"__net_trace_tmp"});return}db2.pcb_trace.insert(trace)}}renderError(message){if(typeof message=="string")return super.renderError(message);this.root?.db.pcb_trace_error.insert(message)}},createNetsFromProps=(component,props)=>{for(let prop of props)if(typeof prop=="string"&&prop.startsWith("net.")){if(/net\.[^\s>]*\./.test(prop))throw new Error('Net names cannot contain a period, try using "sel.net..." to autocomplete with conventional net names, e.g. V3_3');if(/net\.[^\s>]*[+-]/.test(prop)){let netName=prop.split("net.")[1],message=`Net names cannot contain "+" or "-" (component "${component.componentName}" received "${netName}" via "${prop}"). Try using underscores instead, e.g. VCC_P`;throw new Error(message)}if(/net\.[0-9]/.test(prop)){let netName=prop.split("net.")[1];throw new Error(`Net name "${netName}" cannot start with a number, try using a prefix like "VBUS1"`)}let subcircuit=component.getSubcircuit();if(!subcircuit.selectOne(prop)){let net=new Net({name:prop.split("net.")[1]});subcircuit.add(net)}}},getDistance=(a2,b3)=>{let aPos="_getGlobalPcbPositionBeforeLayout"in a2?a2._getGlobalPcbPositionBeforeLayout():a2,bPos="_getGlobalPcbPositionBeforeLayout"in b3?b3._getGlobalPcbPositionBeforeLayout():b3;return Math.sqrt((aPos.x-bPos.x)**2+(aPos.y-bPos.y)**2)};function getClosest(point6,candidates){if(candidates.length===0)throw new Error("No candidates given to getClosest method");let closest=candidates[0],closestDist=1/0;for(let candidate of candidates){let dist=getDistance(point6,candidate);dist<closestDist&&(closest=candidate,closestDist=dist)}return closest}var countComplexElements=(junctions,edges)=>{let count=0;count+=junctions.length??0,count+=edges.filter(edge=>edge.is_crossing).length;for(let i2=1;i2<edges.length;i2++){let prev=edges[i2-1],curr=edges[i2],prevVertical=Math.abs(prev.from.x-prev.to.x)<.01,currVertical=Math.abs(curr.from.x-curr.to.x)<.01;prevVertical!==currVertical&&count++}return count},getEnteringEdgeFromDirection=direction2=>({up:"bottom",down:"top",left:"right",right:"left"})[direction2]??null,getStubEdges=({firstEdge,firstEdgePort,firstDominantDirection,lastEdge,lastEdgePort,lastDominantDirection})=>{if(firstEdge&&firstEdgePort)return getStubEdges({lastEdge:{from:firstEdge.to,to:firstEdge.from},lastEdgePort:firstEdgePort,lastDominantDirection:firstDominantDirection}).reverse().map(e4=>({from:e4.to,to:e4.from}));let edges=[];if(lastEdge&&lastEdgePort){let intermediatePoint={x:lastEdge.to.x,y:lastEdge.to.y};lastDominantDirection==="left"||lastDominantDirection==="right"?(intermediatePoint.x=lastEdgePort.position.x,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}})):(intermediatePoint.y=lastEdgePort.position.y,edges.push({from:lastEdge.to,to:{...intermediatePoint}}),edges.push({from:intermediatePoint,to:{...lastEdgePort.position}}))}return edges=edges.filter(e4=>distance2(e4.from,e4.to)>.01),edges};function tryNow(fn3){try{return[fn3(),null]}catch(e4){return[null,e4]}}var getMaxLengthFromConnectedCapacitors=(ports,{db:db2})=>{let capacitorMaxLengths=ports.map(port=>{let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort?.source_component_id)return null;let sourceComponent=db2.source_component.get(sourcePort.source_component_id);return sourceComponent?.ftype==="simple_capacitor"?sourceComponent.max_decoupling_trace_length:null}).filter(length7=>length7!==null);if(capacitorMaxLengths.length!==0)return Math.min(...capacitorMaxLengths)};function getTraceDisplayName({ports,nets}){if(ports.length>=2)return`${ports[0]?.selector} to ${ports[1]?.selector}`;if(ports.length===1&&nets.length===1)return`${ports[0]?.selector} to net.${nets[0]._parsedProps.name}`}var getPcbBoardOutlinePolygon=pcbBoard=>pcbBoard.outline&&pcbBoard.outline.length>0?new Polygon$1(pcbBoard.outline.map(p4=>point4(p4.x,p4.y))):new Polygon$1(new Box(pcbBoard.center.x-pcbBoard.width/2,pcbBoard.center.y-pcbBoard.height/2,pcbBoard.center.x+pcbBoard.width/2,pcbBoard.center.y+pcbBoard.height/2).toPoints()),isRouteOutsideBoard=({mergedRoute,db:db2,pcbBoardId})=>{let pcbBoard=db2.pcb_board.get(pcbBoardId);if(!pcbBoard)return!1;let boardOutlinePolygon=getPcbBoardOutlinePolygon(pcbBoard);return!mergedRoute.flat().every(routePoint=>boardOutlinePolygon.contains(point4(routePoint.x,routePoint.y)))},isCloseTo2=(a2,b3)=>Math.abs(a2-b3)<1e-4,getObstaclesFromRoute2=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i2=0;i2<route.length-1;i2++){let[start,end]=[route[i2],route[i2+1]],prev=i2-1>=0?route[i2-1]:null,isHorz=isCloseTo2(start.y,end.y),isVert=isCloseTo2(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles};function generateApproximatingRects2(rotatedRect,numRects=2){let{center:center2,width,height,rotation:rotation4}=rotatedRect,rects=[],angleRad=rotation4*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),normalizedRotation=(rotation4%360+360)%360;if(height<=width?normalizedRotation>=45&&normalizedRotation<135||normalizedRotation>=225&&normalizedRotation<315:normalizedRotation>=135&&normalizedRotation<225||normalizedRotation>=315||normalizedRotation<45){let sliceWidth=width/numRects;for(let i2=0;i2<numRects;i2++){let x5=(i2-numRects/2+.5)*sliceWidth,rotatedX=-x5*cosAngle,rotatedY=-x5*sinAngle,coverageWidth=sliceWidth*1.1,coverageHeight=Math.abs(height*cosAngle)+Math.abs(sliceWidth*sinAngle);rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}else{let sliceHeight=height/numRects;for(let i2=0;i2<numRects;i2++){let y5=(i2-numRects/2+.5)*sliceHeight,rotatedX=-y5*sinAngle,rotatedY=y5*cosAngle,coverageWidth=Math.abs(width*cosAngle)+Math.abs(sliceHeight*sinAngle),coverageHeight=sliceHeight*1.1;rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}return rects}function fillPolygonWithRects(polygon2,options={}){if(polygon2.length<3)return[];let{rectHeight=.1}=options,rects=[],yCoords=polygon2.map(p4=>p4.y),minY=Math.min(...yCoords),maxY=Math.max(...yCoords);for(let y5=minY;y5<maxY;y5+=rectHeight){let scanlineY=y5+rectHeight/2,intersections=[];for(let i2=0;i2<polygon2.length;i2++){let p12=polygon2[i2],p22=polygon2[(i2+1)%polygon2.length];if(p12.y<=scanlineY&&p22.y>scanlineY||p22.y<=scanlineY&&p12.y>scanlineY){let x5=(scanlineY-p12.y)*(p22.x-p12.x)/(p22.y-p12.y)+p12.x;intersections.push(x5)}}intersections.sort((a2,b3)=>a2-b3);for(let i2=0;i2<intersections.length;i2+=2)if(i2+1<intersections.length){let x12=intersections[i2],width=intersections[i2+1]-x12;width>1e-6&&rects.push({center:{x:x12+width/2,y:scanlineY},width,height:rectHeight})}}return rects}function fillCircleWithRects(circle2,options={}){let{center:center2,radius}=circle2,{rectHeight=.1}=options,rects=[],numSlices=Math.ceil(radius*2/rectHeight);for(let i2=0;i2<numSlices;i2++){let y5=center2.y-radius+(i2+.5)*rectHeight,dy3=y5-center2.y,halfWidth=Math.sqrt(radius*radius-dy3*dy3);halfWidth>0&&rects.push({center:{x:center2.x,y:y5},width:halfWidth*2,height:rectHeight})}return rects}var EVERY_LAYER2=["top","inner1","inner2","bottom"],getObstaclesFromCircuitJson2=(soup,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id2=>connMap?.getNetConnectedToId(id2)).filter(Boolean)):idList,obstacles=[];for(let element of soup)if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},approximatingRects=generateApproximatingRects2(rotatedRect);for(let rect of approximatingRects)obstacles.push({type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_cutout"){if(element.shape==="rect")obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.shape==="circle"){let approximatingRects=fillCircleWithRects({center:element.center,radius:element.radius},{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}else if(element.shape==="polygon"){let approximatingRects=fillPolygonWithRects(element.points,{rectHeight:.6});for(let rect of approximatingRects)obstacles.push({type:"rect",layers:EVERY_LAYER2,center:rect.center,width:rect.width,height:rect.height,connectedTo:[]})}}else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="rect"?obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole"){if(element.shape==="circle")obstacles.push({type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="circular_hole_with_rect_pad")obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.rect_pad_width,height:element.rect_pad_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="oval"||element.shape==="pill")obstacles.push({type:"oval",layers:EVERY_LAYER2,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.shape==="hole_with_polygon_pad"&&"pad_outline"in element&&element.pad_outline&&element.pad_outline.length>0){let xs3=element.pad_outline.map(p4=>element.x+p4.x),ys3=element.pad_outline.map(p4=>element.y+p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),centerX=(minX+maxX)/2,centerY=(minY+maxY)/2;obstacles.push({type:"rect",layers:EVERY_LAYER2,center:{x:centerX,y:centerY},width:maxX-minX,height:maxY-minY,connectedTo:withNetId([element.pcb_plated_hole_id])})}}else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute2(element.route.map(rp3=>({x:rp3.x,y:rp3.y,layer:"layer"in rp3?rp3.layer:rp3.from_layer})),element.source_trace_id);obstacles.push(...traceObstacles)}else if(element.type==="pcb_via"){let netIsAssignable=!!(element.net_is_assignable??element.netIsAssignable);obstacles.push({type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:[],width:element.outer_diameter,height:element.outer_diameter,netIsAssignable:netIsAssignable||void 0})}return obstacles},computeSchematicNetLabelCenter=({anchor_position,anchor_side,text,font_size=.18})=>{let charWidth=.1*(font_size/.18),width=text.length*charWidth,height=font_size,center2={...anchor_position};switch(anchor_side){case"right":center2.x-=width/2;break;case"left":center2.x+=width/2;break;case"top":center2.y-=height/2;break;case"bottom":center2.y+=height/2;break}return center2},getOtherSchematicTraces=({db:db2,source_trace_id,sameNetOnly,differentNetOnly})=>{!sameNetOnly&&!differentNetOnly&&(differentNetOnly=!0);let mySourceTrace=db2.source_trace.get(source_trace_id),traces=[];for(let otherSchematicTrace of db2.schematic_trace.list()){if(otherSchematicTrace.source_trace_id===source_trace_id)continue;let isSameNet=db2.source_trace.get(otherSchematicTrace.source_trace_id)?.subcircuit_connectivity_map_key===mySourceTrace.subcircuit_connectivity_map_key;differentNetOnly&&isSameNet||sameNetOnly&&!isSameNet||traces.push(otherSchematicTrace)}return traces},createSchematicTraceCrossingSegments=({edges:inputEdges,otherEdges})=>{let edges=[...inputEdges];for(let i2=0;i2<edges.length;i2++){if(i2>2e3)throw new Error("Over 2000 iterations spent inside createSchematicTraceCrossingSegments, you have triggered an infinite loop, please report this!");let edge=edges[i2],edgeOrientation=Math.abs(edge.from.x-edge.to.x)<.01?"vertical":edge.from.y===edge.to.y?"horizontal":"not-orthogonal";if(edgeOrientation==="not-orthogonal")continue;let otherEdgesIntersections=[];for(let otherEdge of otherEdges){let otherOrientation=otherEdge.from.x===otherEdge.to.x?"vertical":otherEdge.from.y===otherEdge.to.y?"horizontal":"not-orthogonal";if(otherOrientation==="not-orthogonal"||edgeOrientation===otherOrientation)continue;if(doesLineIntersectLine([edge.from,edge.to],[otherEdge.from,otherEdge.to],{lineThickness:.01})){let intersectX=edgeOrientation==="vertical"?edge.from.x:otherEdge.from.x,intersectY=edgeOrientation==="vertical"?otherEdge.from.y:edge.from.y,crossingPoint2={x:intersectX,y:intersectY};otherEdgesIntersections.push({otherEdge,crossingPoint:crossingPoint2,distanceFromEdgeFrom:distance2(edge.from,crossingPoint2)})}}if(otherEdgesIntersections.length===0)continue;let closestIntersection=otherEdgesIntersections[0];for(let intersection of otherEdgesIntersections)intersection.distanceFromEdgeFrom<closestIntersection.distanceFromEdgeFrom&&(closestIntersection=intersection);let crossingPoint=closestIntersection.crossingPoint,crossingSegmentLength=.075;if(crossingPoint.x===edge.from.x&&crossingPoint.y===edge.from.y)continue;let crossingUnitVec=getUnitVectorFromPointAToB(edge.from,crossingPoint),beforeCrossing={x:crossingPoint.x-crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y-crossingUnitVec.y*crossingSegmentLength/2},afterCrossing={x:crossingPoint.x+crossingUnitVec.x*crossingSegmentLength/2,y:crossingPoint.y+crossingUnitVec.y*crossingSegmentLength/2},overshot=distance2(afterCrossing,edge.to)<crossingSegmentLength,newEdges=[{from:edge.from,to:beforeCrossing},{from:beforeCrossing,to:afterCrossing,is_crossing:!0},{from:afterCrossing,to:edge.to}];edges.splice(i2,1,...newEdges),i2+=newEdges.length-2,overshot&&i2++}return edges},TOLERANCE=.001,isPointWithinEdge=(point6,edge)=>{let minX=Math.min(edge.from.x,edge.to.x),maxX=Math.max(edge.from.x,edge.to.x),minY=Math.min(edge.from.y,edge.to.y),maxY=Math.max(edge.from.y,edge.to.y);return point6.x>=minX&&point6.x<=maxX&&point6.y>=minY&&point6.y<=maxY},getEdgeOrientation=edge=>{let isVertical3=Math.abs(edge.from.x-edge.to.x)<TOLERANCE,isHorizontal2=Math.abs(edge.from.y-edge.to.y)<TOLERANCE;return isVertical3?"vertical":isHorizontal2?"horizontal":"diagonal"},getIntersectionPoint=(edge1,edge2)=>{let orientation1=getEdgeOrientation(edge1),orientation22=getEdgeOrientation(edge2);if(orientation1===orientation22)return null;if(orientation1==="vertical"&&orientation22==="horizontal"||orientation1==="horizontal"&&orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,horizontalEdge=orientation1==="horizontal"?edge1:edge2,x22=verticalEdge.from.x,y22=horizontalEdge.from.y,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}if(orientation1==="vertical"||orientation22==="vertical"){let verticalEdge=orientation1==="vertical"?edge1:edge2,diagonalEdge=orientation1==="vertical"?edge2:edge1,x22=verticalEdge.from.x,m3=(diagonalEdge.to.y-diagonalEdge.from.y)/(diagonalEdge.to.x-diagonalEdge.from.x),b3=diagonalEdge.from.y-m3*diagonalEdge.from.x,y22=m3*x22+b3,intersection2={x:x22,y:y22};return isPointWithinEdge(intersection2,edge1)&&isPointWithinEdge(intersection2,edge2)?intersection2:null}let m12=(edge1.to.y-edge1.from.y)/(edge1.to.x-edge1.from.x),b12=edge1.from.y-m12*edge1.from.x,m22=(edge2.to.y-edge2.from.y)/(edge2.to.x-edge2.from.x),b22=edge2.from.y-m22*edge2.from.x;if(Math.abs(m12-m22)<TOLERANCE)return null;let x5=(b22-b12)/(m12-m22),y5=m12*x5+b12,intersection={x:x5,y:y5};return isPointWithinEdge(intersection,edge1)&&isPointWithinEdge(intersection,edge2)?intersection:null},createSchematicTraceJunctions=({edges:myEdges,db:db2,source_trace_id})=>{let otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,sameNetOnly:!0}).flatMap(t35=>t35.edges),junctions=new Map;for(let myEdge of myEdges)for(let otherEdge of otherEdges){let intersection=getIntersectionPoint(myEdge,otherEdge);if(intersection){let key=`${intersection.x.toFixed(6)},${intersection.y.toFixed(6)}`;junctions.has(key)||junctions.set(key,intersection)}}return Array.from(junctions.values())};function normalizeAngle(angle){let normalized=angle%360;return normalized<0?normalized+360:normalized}function isAngleBetween(angle,start,end,direction2){return direction2==="counterclockwise"?end>=start?angle>=start&&angle<=end:angle>=start||angle<=end:end<=start?angle<=start&&angle>=end:angle<=start||angle>=end}function getArcBounds(elm){let center2=elm.center,radius=elm.radius,startAngle=elm.start_angle_degrees,endAngle=elm.end_angle_degrees,direction2=elm.direction??"counterclockwise";if(!center2||typeof center2.x!="number"||typeof center2.y!="number"||typeof radius!="number"||typeof startAngle!="number"||typeof endAngle!="number")return null;let start=normalizeAngle(startAngle),end=normalizeAngle(endAngle),consideredAngles=new Set([start,end]),cardinalAngles=[0,90,180,270];for(let cardinal of cardinalAngles)isAngleBetween(cardinal,start,end,direction2)&&consideredAngles.add(cardinal);let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let angle of consideredAngles){let radians=angle*Math.PI/180,x5=center2.x+radius*Math.cos(radians),y5=center2.y+radius*Math.sin(radians);minX=Math.min(minX,x5),maxX=Math.max(maxX,x5),minY=Math.min(minY,y5),maxY=Math.max(maxY,y5)}return!Number.isFinite(minX)||!Number.isFinite(minY)?null:{minX,maxX,minY,maxY}}function getBoundsForSchematic(db2){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let elm of db2){let cx3,cy3,w4,h4;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h4=elm.size?.height;else if(elm.type==="schematic_box")cx3=elm.x,cy3=elm.y,w4=elm.width,h4=elm.height;else if(elm.type==="schematic_port")cx3=elm.center?.x,cy3=elm.center?.y,w4=.2,h4=.2;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h4=.2;else if(elm.type==="schematic_line"){let x12=elm.x1??0,y12=elm.y1??0,x22=elm.x2??0,y22=elm.y2??0;cx3=(x12+x22)/2,cy3=(y12+y22)/2,w4=Math.abs(x22-x12),h4=Math.abs(y22-y12)}else if(elm.type==="schematic_rect")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.width,h4=elm.height;else if(elm.type==="schematic_circle"){cx3=elm.center?.x,cy3=elm.center?.y;let radius=elm.radius;typeof radius=="number"&&(w4=radius*2,h4=radius*2)}else if(elm.type==="schematic_arc"){let bounds=getArcBounds(elm);bounds&&(minX=Math.min(minX,bounds.minX),maxX=Math.max(maxX,bounds.maxX),minY=Math.min(minY,bounds.minY),maxY=Math.max(maxY,bounds.maxY));continue}else if(elm.type==="schematic_path"){let points=elm.points;if(Array.isArray(points))for(let point6 of points)typeof point6.x=="number"&&typeof point6.y=="number"&&(minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y));continue}typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h4=="number"&&(minX=Math.min(minX,cx3-w4/2),maxX=Math.max(maxX,cx3+w4/2),minY=Math.min(minY,cy3-h4/2),maxY=Math.max(maxY,cy3+h4/2))}return{minX,maxX,minY,maxY}}function getObstaclesFromBounds(bounds,opts={}){let{minX,maxX,minY,maxY}=bounds,PADDING=opts.padding??1;if(!isFinite(minX)||!isFinite(maxX)||!isFinite(minY)||!isFinite(maxY))return[];let left=minX-PADDING,right=maxX+PADDING,top=maxY+PADDING,bottom=minY-PADDING,thickness=.01;return[{type:"rect",layers:["top"],center:{x:(left+right)/2,y:top},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:(left+right)/2,y:bottom},width:right-left,height:thickness,connectedTo:[]},{type:"rect",layers:["top"],center:{x:left,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]},{type:"rect",layers:["top"],center:{x:right,y:(top+bottom)/2},width:thickness,height:top-bottom,connectedTo:[]}]}var getSchematicObstaclesForTrace=trace=>{let db2=trace.root.db,connectedPorts=trace._findConnectedPorts().ports??[],connectedPortIds=new Set(connectedPorts.map(p4=>p4.schematic_port_id)),obstacles=[];for(let elm of db2.toArray()){if(elm.type==="schematic_component"){let isSymbol3=!!elm.symbol_name,dominateAxis=elm.size.width>elm.size.height?"horz":"vert";obstacles.push({type:"rect",layers:["top"],center:elm.center,width:elm.size.width+(isSymbol3&&dominateAxis==="horz"?-.5:0),height:elm.size.height+(isSymbol3&&dominateAxis==="vert"?-.5:0),connectedTo:[]})}if(elm.type==="schematic_port"){if(connectedPortIds.has(elm.schematic_port_id))continue;let dirVec=elm.facing_direction?getUnitVectorFromDirection(elm.facing_direction):{x:0,y:0};obstacles.push({type:"rect",layers:["top"],center:{x:elm.center.x-dirVec.x*.1,y:elm.center.y-dirVec.y*.1},width:.1+Math.abs(dirVec.x)*.3,height:.1+Math.abs(dirVec.y)*.3,connectedTo:[]})}elm.type==="schematic_text"&&obstacles.push({type:"rect",layers:["top"],center:elm.position,width:(elm.text?.length??0)*.1,height:.2,connectedTo:[]}),elm.type==="schematic_box"&&obstacles.push({type:"rect",layers:["top"],center:{x:elm.x,y:elm.y},width:elm.width,height:elm.height,connectedTo:[]})}let bounds=getBoundsForSchematic(db2.toArray());return obstacles.push(...getObstaclesFromBounds(bounds,{padding:1})),obstacles},pushEdgesOfSchematicTraceToPreventOverlap=({edges,db:db2,source_trace_id})=>{let mySourceTrace=db2.source_trace.get(source_trace_id),otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,differentNetOnly:!0}).flatMap(t35=>t35.edges),edgeOrientation=edge=>{let{from,to:to3}=edge;return from.x===to3.x?"vertical":"horizontal"};for(let mySegment of edges){let mySegmentOrientation=edgeOrientation(mySegment),findOverlappingParallelSegment=()=>otherEdges.find(otherEdge=>edgeOrientation(otherEdge)===mySegmentOrientation&&doesLineIntersectLine([mySegment.from,mySegment.to],[otherEdge.from,otherEdge.to],{lineThickness:.05})),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment();for(;overlappingParallelSegmentFromOtherTrace;)mySegmentOrientation==="horizontal"?(mySegment.from.y+=.1,mySegment.to.y+=.1):(mySegment.from.x+=.1,mySegment.to.x+=.1),overlappingParallelSegmentFromOtherTrace=findOverlappingParallelSegment()}},convertFacingDirectionToElbowDirection=facingDirection=>{switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:}},autorouterVersion=package_default.version??"unknown",AutorouterError=class extends Error{constructor(message){super(`${message} (capacity-autorouter@${autorouterVersion})`),this.name="AutorouterError"}},TraceConnectionError=class extends Error{constructor(errorData){super(errorData.message);__publicField(this,"errorData");this.errorData=errorData,this.name="TraceConnectionError"}},Trace_doInitialSchematicTraceRender=trace=>{if(trace.root?._featureMspSchematicTraceRouting||trace._couldNotFindPort||trace.root?.schematicDisabled)return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let allPortsFound,connectedPorts;try{let result=trace._findConnectedPorts();allPortsFound=result.allPortsFound,connectedPorts=result.portsWithSelectors??[]}catch(error){if(error instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"});return}throw error}let{netsWithSelectors}=trace._findConnectedNets();if(!allPortsFound)return;let portPairKey=connectedPorts.map(p4=>p4.port.schematic_port_id).sort().join(","),board=trace.root?._getBoard();if(board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.has(portPairKey))return;let connection={name:trace.source_trace_id,pointsToConnect:[]},obstacles=getSchematicObstaclesForTrace(trace),portsWithPosition=connectedPorts.filter(({port})=>port.schematic_port_id!==null).map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id??void 0,facingDirection:port.facingDirection}));if(portsWithPosition.length===1&&netsWithSelectors.length===1){let net=netsWithSelectors[0].net,{port,position:anchorPos}=portsWithPosition[0],connectedNetLabel=trace.getSubcircuit().selectAll("netlabel").find(nl3=>{let conn=nl3._parsedProps.connection??nl3._parsedProps.connectsTo;return conn?Array.isArray(conn)?conn.some(selector=>trace.getSubcircuit().selectOne(selector,{port:!0})===port):trace.getSubcircuit().selectOne(conn,{port:!0})===port:!1});if(!connectedNetLabel){let dbNetLabel=db2.schematic_net_label.getWhere({source_trace_id:trace.source_trace_id});dbNetLabel&&(connectedNetLabel=dbNetLabel)}if(connectedNetLabel){let labelPos="_getGlobalSchematicPositionBeforeLayout"in connectedNetLabel?connectedNetLabel._getGlobalSchematicPositionBeforeLayout():connectedNetLabel.anchor_position,edges2=[];anchorPos.x===labelPos.x||anchorPos.y===labelPos.y?edges2.push({from:anchorPos,to:labelPos}):(edges2.push({from:anchorPos,to:{x:labelPos.x,y:anchorPos.y}}),edges2.push({from:{x:labelPos.x,y:anchorPos.y},to:labelPos}));let dbTrace2=db2.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges:edges2,junctions:[],subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace2.schematic_trace_id;return}if(trace.props.schDisplayLabel){let side2=getEnteringEdgeFromDirection(port.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side2,text:trace.props.schDisplayLabel}),anchor_side:side2});return}let side=getEnteringEdgeFromDirection(port.facingDirection)??"bottom",netLabel=db2.schematic_net_label.insert({text:net._parsedProps.name,source_net_id:net.source_net_id,anchor_position:anchorPos,center:computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:side,text:net._parsedProps.name}),anchor_side:side});return}if(trace.props.schDisplayLabel&&("from"in trace.props&&"to"in trace.props||"path"in trace.props)){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}if(portsWithPosition.length<2)return;let edges=(()=>{let elbowEdges=[];for(let i2=0;i2<portsWithPosition.length-1;i2++){let start=portsWithPosition[i2],end=portsWithPosition[i2+1],path=calculateElbow({x:start.position.x,y:start.position.y,facingDirection:convertFacingDirectionToElbowDirection(start.facingDirection)},{x:end.position.x,y:end.position.y,facingDirection:convertFacingDirectionToElbowDirection(end.facingDirection)});for(let j4=0;j4<path.length-1;j4++)elbowEdges.push({from:path[j4],to:path[j4+1]})}let doesSegmentIntersectRect2=(edge,rect)=>{let halfW=rect.width/2,halfH=rect.height/2,left=rect.center.x-halfW,right=rect.center.x+halfW,top=rect.center.y-halfH,bottom=rect.center.y+halfH,inRect=p4=>p4.x>=left&&p4.x<=right&&p4.y>=top&&p4.y<=bottom;return inRect(edge.from)||inRect(edge.to)?!0:[[{x:left,y:top},{x:right,y:top}],[{x:right,y:top},{x:right,y:bottom}],[{x:right,y:bottom},{x:left,y:bottom}],[{x:left,y:bottom},{x:left,y:top}]].some(r4=>doesLineIntersectLine([edge.from,edge.to],r4,{lineThickness:0}))};for(let edge of elbowEdges)for(let obstacle of obstacles)if(doesSegmentIntersectRect2(edge,obstacle))return null;return elbowEdges})();edges&&edges.length===0&&(edges=null),connection.pointsToConnect=portsWithPosition.map(({position:position2})=>({...position2,layer:"top"}));let bounds=computeObstacleBounds(obstacles),BOUNDS_MARGIN=2,simpleRouteJsonInput={minTraceWidth:.1,obstacles,connections:[connection],bounds:{minX:bounds.minX-BOUNDS_MARGIN,maxX:bounds.maxX+BOUNDS_MARGIN,minY:bounds.minY-BOUNDS_MARGIN,maxY:bounds.maxY+BOUNDS_MARGIN},layerCount:1},Autorouter=MultilayerIjump,skipOtherTraceInteraction=!1;if(trace.getSubcircuit().props._schDirectLineRoutingEnabled&&(Autorouter=DirectLineRouter,skipOtherTraceInteraction=!0),!edges){let results=new Autorouter({input:simpleRouteJsonInput,MAX_ITERATIONS:100,OBSTACLE_MARGIN:.1,isRemovePathLoopsEnabled:!0,isShortenPathWithShortcutsEnabled:!0,marginsWithCosts:[{margin:1,enterCost:0,travelCostFactor:1},{margin:.3,enterCost:0,travelCostFactor:1},{margin:.2,enterCost:0,travelCostFactor:2},{margin:.1,enterCost:0,travelCostFactor:3}]}).solveAndMapToTraces();if(results.length===0){if(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection()){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}results=new DirectLineRouter({input:simpleRouteJsonInput}).solveAndMapToTraces(),skipOtherTraceInteraction=!0}let[{route}]=results;edges=[];let wireAndViaRoutes=route.filter(r4=>r4.route_type==="wire"||r4.route_type==="via");for(let i2=0;i2<wireAndViaRoutes.length-1;i2++)edges.push({from:wireAndViaRoutes[i2],to:wireAndViaRoutes[i2+1]})}let source_trace_id=trace.source_trace_id,junctions=[];if(!skipOtherTraceInteraction){pushEdgesOfSchematicTraceToPreventOverlap({edges,db:db2,source_trace_id});let otherEdges=getOtherSchematicTraces({db:db2,source_trace_id,differentNetOnly:!0}).flatMap(t35=>t35.edges);edges=createSchematicTraceCrossingSegments({edges,otherEdges}),junctions=createSchematicTraceJunctions({edges,db:db2,source_trace_id:trace.source_trace_id})}if(!edges||edges.length===0)return;let lastEdge=edges[edges.length-1],lastEdgePort=portsWithPosition[portsWithPosition.length-1],lastDominantDirection=getDominantDirection(lastEdge);edges.push(...getStubEdges({lastEdge,lastEdgePort,lastDominantDirection}));let firstEdge=edges[0],firstEdgePort=portsWithPosition[0],firstDominantDirection=getDominantDirection(firstEdge);if(edges.unshift(...getStubEdges({firstEdge,firstEdgePort,firstDominantDirection})),!trace.source_trace_id)throw new Error("Missing source_trace_id for schematic trace insertion.");if(trace.getSubcircuit()._parsedProps.schTraceAutoLabelEnabled&&countComplexElements(junctions,edges)>=5&&(trace._isSymbolToChipConnection()||trace._isSymbolToSymbolConnection()||trace._isChipToChipConnection())){trace._doInitialSchematicTraceRenderWithDisplayLabel();return}let dbTrace=db2.schematic_trace.insert({source_trace_id:trace.source_trace_id,edges,junctions,subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key??void 0});trace.schematic_trace_id=dbTrace.schematic_trace_id;for(let{port}of connectedPorts)port.schematic_port_id&&db2.schematic_port.update(port.schematic_port_id,{is_connected:!0});board?._connectedSchematicPortPairs&&board._connectedSchematicPortPairs.add(portPairKey)};function getTraceLength(route){let totalLength=0;for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(point6.route_type==="wire"){let nextPoint=route[i2+1];if(nextPoint){let dx3=nextPoint.x-point6.x,dy3=nextPoint.y-point6.y;totalLength+=Math.sqrt(dx3*dx3+dy3*dy3)}}else point6.route_type==="via"&&(totalLength+=1.6)}return totalLength}var DEFAULT_VIA_HOLE_DIAMETER=.2,DEFAULT_VIA_PAD_DIAMETER=.3,parseDistance=(value,fallback)=>{if(value===void 0)return fallback;if(typeof value=="number")return value;let parsed=parseFloat(value);return Number.isFinite(parsed)?parsed:fallback},getViaDiameterDefaults=pcbStyle2=>({holeDiameter:parseDistance(pcbStyle2?.viaHoleDiameter,DEFAULT_VIA_HOLE_DIAMETER),padDiameter:parseDistance(pcbStyle2?.viaPadDiameter,DEFAULT_VIA_PAD_DIAMETER)}),getViaDiameterDefaultsWithOverrides=(overrides,pcbStyle2)=>{let defaults=getViaDiameterDefaults(pcbStyle2);return{holeDiameter:overrides.holeDiameter??defaults.holeDiameter,padDiameter:overrides.padDiameter??defaults.padDiameter}},portToObjective=port=>({...port._getGlobalPcbPositionAfterLayout(),layers:port.getAvailablePcbLayers()}),SHOULD_USE_SINGLE_LAYER_ROUTING=!1;function Trace_doInitialPcbTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace,subcircuit=trace.getSubcircuit();if(!parent)throw new Error("Trace has no parent");if(subcircuit._parsedProps.routingDisabled||subcircuit._isInflatedFromCircuitJson)return;let cachedRoute=subcircuit._parsedProps.pcbRouteCache?.pcbTraces;if(cachedRoute){let pcb_trace22=db2.pcb_trace.insert({route:cachedRoute.flatMap(trace2=>trace2.route),source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0});trace.pcb_trace_id=pcb_trace22.pcb_trace_id;return}if(props.pcbPath&&props.pcbPath.length>0||props.pcbStraightLine||!subcircuit._shouldUseTraceByTraceRouting())return;let allPortsFound,ports;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[]}catch(error){if(error instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error}let portsConnectedOnPcbViaNet=[];if(!allPortsFound)return;let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let nets=trace._findConnectedNets().netsWithSelectors;if(ports.length===0&&nets.length===2){trace.renderError("Trace connects two nets, we haven't implemented a way to route this yet");return}else if(ports.length===1&&nets.length===1){let port=ports[0],otherPortsInNet=nets[0].net.getAllConnectedPorts().filter(p4=>p4!==port);if(otherPortsInNet.length===0){console.log("Nothing to connect this port to, the net is empty. TODO should emit a warning!");return}let closestPortInNet=getClosest(port,otherPortsInNet);portsConnectedOnPcbViaNet.push(closestPortInNet),ports.push(closestPortInNet)}else if(ports.length>1&&nets.length>=1){trace.renderError("Trace has more than one port and one or more nets, we don't currently support this type of complex trace routing");return}let hints=ports.flatMap(port=>port.matchedComponents.filter(c3=>c3.componentName==="TraceHint")),pcbRouteHints=(trace._parsedProps.pcbRouteHints??[]).concat(hints.flatMap(h4=>h4.getPcbRouteHints()));if(ports.length>2){trace.renderError(`Trace has more than two ports (${ports.map(p4=>p4.getString()).join(", ")}), routing between more than two ports for a single trace is not implemented`);return}if(trace.getSubcircuit().selectAll("trace").filter(trace2=>trace2.renderPhaseStates.PcbTraceRender.initialized).some(trace2=>trace2._portsRoutedOnPcb.length===ports.length&&trace2._portsRoutedOnPcb.every(portRoutedByOtherTrace=>ports.includes(portRoutedByOtherTrace))))return;let orderedRouteObjectives=[];pcbRouteHints.length===0?orderedRouteObjectives=[portToObjective(ports[0]),portToObjective(ports[1])]:orderedRouteObjectives=[portToObjective(ports[0]),...pcbRouteHints,portToObjective(ports[1])];let candidateLayerCombinations=findPossibleTraceLayerCombinations(orderedRouteObjectives);if(SHOULD_USE_SINGLE_LAYER_ROUTING&&candidateLayerCombinations.length===0){trace.renderError(`Could not find a common layer (using hints) for trace ${trace.getString()}`);return}let connMap=getFullConnectivityMapFromCircuitJson(trace.root.db.toArray()),[obstacles,errGettingObstacles]=tryNow(()=>getObstaclesFromCircuitJson2(trace.root.db.toArray()));if(errGettingObstacles){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Error getting obstacles for autorouting: ${errGettingObstacles.message}`,source_trace_id:trace.source_trace_id,center:{x:0,y:0},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[]});return}for(let obstacle of obstacles)if(obstacle.connectedTo.length>0){let netId=connMap.getNetConnectedToId(obstacle.connectedTo[0]);netId&&obstacle.connectedTo.push(netId)}let orderedRoutePoints=[];if(candidateLayerCombinations.length===0)orderedRoutePoints=orderedRouteObjectives;else{let candidateLayerSelections=candidateLayerCombinations[0].layer_path;orderedRoutePoints=orderedRouteObjectives.map((t35,idx)=>t35.via?{...t35,via_to_layer:candidateLayerSelections[idx]}:{...t35,layers:[candidateLayerSelections[idx]]})}orderedRoutePoints[0].pcb_port_id=ports[0].pcb_port_id,orderedRoutePoints[orderedRoutePoints.length-1].pcb_port_id=ports[1].pcb_port_id;let routes=[];for(let[a2,b3]of pairs2(orderedRoutePoints)){let dominantLayer="via_to_layer"in a2?a2.via_to_layer:null,BOUNDS_MARGIN=2,aLayer="layers"in a2&&a2.layers.length===1?a2.layers[0]:dominantLayer??"top",bLayer="layers"in b3&&b3.layers.length===1?b3.layers[0]:dominantLayer??"top",pcbPortA="pcb_port_id"in a2?a2.pcb_port_id:null,pcbPortB="pcb_port_id"in b3?b3.pcb_port_id:null,minTraceWidth=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??.16,ijump=new MultilayerIjump({OBSTACLE_MARGIN:minTraceWidth*2,isRemovePathLoopsEnabled:!0,optimizeWithGoalBoxes:!!(pcbPortA&&pcbPortB),connMap,input:{obstacles,minTraceWidth,connections:[{name:trace.source_trace_id,pointsToConnect:[{...a2,layer:aLayer,pcb_port_id:pcbPortA},{...b3,layer:bLayer,pcb_port_id:pcbPortB}]}],layerCount:trace.getSubcircuit()._getSubcircuitLayerCount(),bounds:{minX:Math.min(a2.x,b3.x)-BOUNDS_MARGIN,maxX:Math.max(a2.x,b3.x)+BOUNDS_MARGIN,minY:Math.min(a2.y,b3.y)-BOUNDS_MARGIN,maxY:Math.max(a2.y,b3.y)+BOUNDS_MARGIN}}}),traces=null;try{traces=ijump.solveAndMapToTraces()}catch(e4){trace.renderError({type:"pcb_trace_error",pcb_trace_error_id:trace.source_trace_id,error_type:"pcb_trace_error",message:`error solving route: ${e4.message}`,source_trace_id:trace.pcb_trace_id,center:{x:(a2.x+b3.x)/2,y:(a2.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)})}if(!traces)return;if(traces.length===0){trace.renderError({type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:trace.pcb_trace_id,message:`Could not find a route for ${trace}`,source_trace_id:trace.source_trace_id,center:{x:(a2.x+b3.x)/2,y:(a2.y+b3.y)/2},pcb_port_ids:ports.map(p4=>p4.pcb_port_id),pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:ports.map(p4=>p4.pcb_component_id)});return}let[autoroutedTrace]=traces;dominantLayer&&(autoroutedTrace.route=autoroutedTrace.route.map(p4=>(p4.route_type==="wire"&&!p4.layer&&(p4.layer=dominantLayer),p4))),pcbPortA&&autoroutedTrace.route[0].route_type==="wire"&&(autoroutedTrace.route[0].start_pcb_port_id=pcbPortA);let lastRoutePoint=autoroutedTrace.route[autoroutedTrace.route.length-1];pcbPortB&&lastRoutePoint.route_type==="wire"&&(lastRoutePoint.end_pcb_port_id=pcbPortB),routes.push(autoroutedTrace.route)}let mergedRoute=mergeRoutes(routes),traceLength=getTraceLength(mergedRoute),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),pcb_trace2=db2.pcb_trace.insert({route:mergedRoute,source_trace_id:trace.source_trace_id,subcircuit_id:trace.getSubcircuit()?.subcircuit_id,trace_length:traceLength});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace2.pcb_trace_id;for(let point6 of mergedRoute)point6.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer});trace._insertErrorIfTraceIsOutsideBoard(mergedRoute,ports)}function computeLineRectIntersection(params){let{lineStart,lineEnd,rectCenter,rectWidth,rectHeight}=params,left=rectCenter.x-rectWidth/2,right=rectCenter.x+rectWidth/2,top=rectCenter.y+rectHeight/2,bottom=rectCenter.y-rectHeight/2,dx3=lineEnd.x-lineStart.x,dy3=lineEnd.y-lineStart.y,intersections=[];if(dx3!==0){let t35=(left-lineStart.x)/dx3;if(t35>=0&&t35<=1){let y5=lineStart.y+t35*dy3;y5>=bottom&&y5<=top&&intersections.push({x:left,y:y5,t:t35})}}if(dx3!==0){let t35=(right-lineStart.x)/dx3;if(t35>=0&&t35<=1){let y5=lineStart.y+t35*dy3;y5>=bottom&&y5<=top&&intersections.push({x:right,y:y5,t:t35})}}if(dy3!==0){let t35=(bottom-lineStart.y)/dy3;if(t35>=0&&t35<=1){let x5=lineStart.x+t35*dx3;x5>=left&&x5<=right&&intersections.push({x:x5,y:bottom,t:t35})}}if(dy3!==0){let t35=(top-lineStart.y)/dy3;if(t35>=0&&t35<=1){let x5=lineStart.x+t35*dx3;x5>=left&&x5<=right&&intersections.push({x:x5,y:top,t:t35})}}return intersections.length===0?null:(intersections.sort((a2,b3)=>a2.t-b3.t),{x:intersections[0].x,y:intersections[0].y})}function computeLineCircleIntersection(params){let{lineStart,lineEnd,circleCenter,circleRadius}=params,x12=lineStart.x-circleCenter.x,y12=lineStart.y-circleCenter.y,x22=lineEnd.x-circleCenter.x,y22=lineEnd.y-circleCenter.y,dx3=x22-x12,dy3=y22-y12,a2=dx3*dx3+dy3*dy3,b3=2*(x12*dx3+y12*dy3),c3=x12*x12+y12*y12-circleRadius*circleRadius,discriminant=b3*b3-4*a2*c3;if(discriminant<0)return null;let sqrtDisc=Math.sqrt(discriminant),t110=(-b3-sqrtDisc)/(2*a2),t210=(-b3+sqrtDisc)/(2*a2),t35=null;return t110>=0&&t110<=1?t35=t110:t210>=0&&t210<=1&&(t35=t210),t35===null?null:{x:lineStart.x+t35*dx3,y:lineStart.y+t35*dy3}}function clipTraceEndAtPad(params){let{traceStart,traceEnd,traceWidth,port}=params,pcbPrimitive=port.matchedComponents.find(c3=>c3.isPcbPrimitive);if(!pcbPrimitive)return traceEnd;let padBounds=pcbPrimitive._getPcbCircuitJsonBounds(),padWidth=padBounds.width,padHeight=padBounds.height,padCenter=padBounds.center,smallestPadDimension=Math.min(padWidth,padHeight);if(traceWidth<=smallestPadDimension/2)return traceEnd;let clippedPoint=null;if(pcbPrimitive.componentName==="SmtPad"){let smtPad=pcbPrimitive,padShape=smtPad._parsedProps.shape;if(padShape==="circle"){let radius=smtPad._parsedProps.radius;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:radius})}else(padShape==="rect"||padShape==="rotated_rect"||padShape==="pill"||padShape==="polygon")&&(clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight}))}else if(pcbPrimitive.componentName==="PlatedHole"){let platedHole=pcbPrimitive;if(platedHole._parsedProps.shape==="circle"){let outerDiameter=platedHole._parsedProps.outerDiameter;clippedPoint=computeLineCircleIntersection({lineStart:traceStart,lineEnd:traceEnd,circleCenter:padCenter,circleRadius:outerDiameter/2})}else clippedPoint=computeLineRectIntersection({lineStart:traceStart,lineEnd:traceEnd,rectCenter:padCenter,rectWidth:padWidth,rectHeight:padHeight})}return clippedPoint??traceEnd}function Trace_doInitialPcbManualTraceRender(trace){if(trace.root?.pcbDisabled)return;let{db:db2}=trace.root,{_parsedProps:props}=trace,subcircuit=trace.getSubcircuit(),hasPcbPath=props.pcbPath!==void 0,wantsStraightLine=!!props.pcbStraightLine;if(!hasPcbPath&&!wantsStraightLine)return;let allPortsFound,ports,portsWithSelectors;try{let connectedPorts=trace._findConnectedPorts();allPortsFound=connectedPorts.allPortsFound,ports=connectedPorts.ports??[],portsWithSelectors=connectedPorts.portsWithSelectors??[]}catch(error){if(error instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"}),trace._couldNotFindPort=!0;return}throw error}if(!allPortsFound)return;let portsWithoutMatchedPcbPrimitive=[];for(let port of ports)port._hasMatchedPcbPrimitive()||portsWithoutMatchedPcbPrimitive.push(port);if(portsWithoutMatchedPcbPrimitive.length>0){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Some ports did not have a matching PCB primitive (e.g. a pad or plated hole), this can happen if a footprint is missing. As a result, ${trace} wasn't routed. Missing ports: ${portsWithoutMatchedPcbPrimitive.map(p4=>p4.getString()).join(", ")}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:portsWithoutMatchedPcbPrimitive.map(p4=>p4.pcb_port_id).filter(Boolean)});return}let width=trace._getExplicitTraceThickness()??trace.getSubcircuit()._parsedProps.minTraceWidth??.16;if(wantsStraightLine&&!hasPcbPath){if(!ports||ports.length<2){trace.renderError("pcbStraightLine requires exactly two connected ports");return}let[startPort,endPort]=ports,startLayers=startPort.getAvailablePcbLayers(),endLayers=endPort.getAvailablePcbLayers(),layer2=startLayers.find(layer3=>endLayers.includes(layer3))??startLayers[0]??endLayers[0]??"top",startPos=startPort._getGlobalPcbPositionAfterLayout(),endPos=endPort._getGlobalPcbPositionAfterLayout(),clippedStartPos=clipTraceEndAtPad({traceStart:endPos,traceEnd:startPos,traceWidth:width,port:startPort}),clippedEndPos=clipTraceEndAtPad({traceStart:startPos,traceEnd:endPos,traceWidth:width,port:endPort}),route2=[{route_type:"wire",x:clippedStartPos.x,y:clippedStartPos.y,width,layer:layer2,start_pcb_port_id:startPort.pcb_port_id},{route_type:"wire",x:clippedEndPos.x,y:clippedEndPos.y,width,layer:layer2,end_pcb_port_id:endPort.pcb_port_id}],traceLength2=getTraceLength(route2),pcb_trace22=db2.pcb_trace.insert({route:route2,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength2});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace22.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route2,ports);return}if(!props.pcbPath)return;let anchorPort;props.pcbPathRelativeTo&&(anchorPort=portsWithSelectors.find(p4=>p4.selector===props.pcbPathRelativeTo)?.port,anchorPort||(anchorPort=trace.getSubcircuit().selectOne(props.pcbPathRelativeTo))),anchorPort||(anchorPort=ports[0]);let otherPort=ports.find(p4=>p4!==anchorPort)??ports[1],currentLayer=anchorPort.getAvailablePcbLayers()[0]||"top",anchorPos=anchorPort._getGlobalPcbPositionAfterLayout(),otherPos=otherPort._getGlobalPcbPositionAfterLayout(),route=[];route.push({route_type:"wire",x:anchorPos.x,y:anchorPos.y,width,layer:currentLayer,start_pcb_port_id:anchorPort.pcb_port_id});let transform5=subcircuit._isInflatedFromCircuitJson?trace._computePcbGlobalTransformBeforeLayout():anchorPort?._computePcbGlobalTransformBeforeLayout?.()||identity(),pcbPath2=props.pcbPath;for(let pt4 of pcbPath2){let coordinates,isGlobalPosition=!1,isViaPoint=typeof pt4!="string"&&pt4.via,viaFromLayer,viaToLayer;if(typeof pt4=="string"){let resolvedPort=trace.getSubcircuit().selectOne(pt4,{type:"port"});if(!resolvedPort){db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:trace.source_trace_id,message:`Could not resolve pcbPath selector "${pt4}" for ${trace}`,pcb_trace_id:trace.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:[]});continue}let portPos=resolvedPort._getGlobalPcbPositionAfterLayout();coordinates={x:portPos.x,y:portPos.y},isGlobalPosition=!0}else coordinates={x:pt4.x,y:pt4.y},isGlobalPosition=!1,pt4.via&&(viaFromLayer=pt4.fromLayer??currentLayer,viaToLayer=pt4.toLayer);let finalCoordinates=isGlobalPosition?coordinates:applyToPoint2(transform5,coordinates);isViaPoint?(route.push({route_type:"via",x:finalCoordinates.x,y:finalCoordinates.y,from_layer:viaFromLayer??currentLayer,to_layer:viaToLayer??currentLayer}),currentLayer=viaToLayer??currentLayer):route.push({route_type:"wire",x:finalCoordinates.x,y:finalCoordinates.y,width,layer:currentLayer})}route.push({route_type:"wire",x:otherPos.x,y:otherPos.y,width,layer:currentLayer,end_pcb_port_id:otherPort.pcb_port_id});let traceLength=getTraceLength(route),pcb_trace2=db2.pcb_trace.insert({route,source_trace_id:trace.source_trace_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:trace.getGroup()?.pcb_group_id??void 0,trace_length:traceLength}),pcbStyle2=trace.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);for(let point6 of route)point6.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer});trace._portsRoutedOnPcb=ports,trace.pcb_trace_id=pcb_trace2.pcb_trace_id,trace._insertErrorIfTraceIsOutsideBoard(route,ports)}function Trace__doInitialSchematicTraceRenderWithDisplayLabel(trace){if(trace.root?.schematicDisabled)return;let{db:db2}=trace.root,{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let{allPortsFound,portsWithSelectors:connectedPorts}=trace._findConnectedPorts();if(!allPortsFound)return;let portsWithPosition=connectedPorts.map(({port})=>({port,position:port._getGlobalSchematicPositionAfterLayout(),schematic_port_id:port.schematic_port_id,facingDirection:port.facingDirection}));if(portsWithPosition.length<2)throw new Error("Expected at least two ports in portsWithPosition.");let fromPortName,toPortName,fromAnchorPos=portsWithPosition[0].position,fromPort=portsWithPosition[0].port;if("path"in trace.props){if(trace.props.path.length!==2)throw new Error("Invalid 'path': Must contain exactly two elements.");[fromPortName,toPortName]=trace.props.path}else{if(!("from"in trace.props&&"to"in trace.props))throw new Error("Missing 'from' or 'to' properties in props.");fromPortName=trace.props.from,toPortName=trace.props.to}if(!fromPort.source_port_id)throw new Error(`Missing source_port_id for the 'from' port (${fromPortName}).`);let toAnchorPos=portsWithPosition[1].position,toPort=portsWithPosition[1].port;if(!toPort.source_port_id)throw new Error(`Missing source_port_id for the 'to' port (${toPortName}).`);let existingFromNetLabel=db2.schematic_net_label.list().find(label=>label.source_net_id===fromPort.source_port_id),existingToNetLabel=db2.schematic_net_label.list().find(label=>label.source_net_id===toPort.source_port_id),[firstPort,secondPort]=connectedPorts.map(({port})=>port),pinFullName=firstPort.parent?.config.shouldRenderAsSchematicBox?`${firstPort?.parent?.props.name}_${firstPort?.props.name}`:`${secondPort?.parent?.props.name}_${secondPort?.props.name}`,netLabelText=trace.props.schDisplayLabel??pinFullName;if(existingFromNetLabel&&existingFromNetLabel.text!==netLabelText&&(existingFromNetLabel.text=`${netLabelText} / ${existingFromNetLabel.text}`),existingToNetLabel&&existingToNetLabel?.text!==netLabelText&&(existingToNetLabel.text=`${netLabelText} / ${existingToNetLabel.text}`),!existingToNetLabel){let toSide=getEnteringEdgeFromDirection(toPort.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:toPort.source_port_id,anchor_position:toAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:toAnchorPos,anchor_side:toSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:toSide})}if(!existingFromNetLabel){let fromSide=getEnteringEdgeFromDirection(fromPort.facingDirection)??"bottom";db2.schematic_net_label.insert({text:trace.props.schDisplayLabel??pinFullName,source_net_id:fromPort.source_port_id,anchor_position:fromAnchorPos,center:computeSchematicNetLabelCenter({anchor_position:fromAnchorPos,anchor_side:fromSide,text:trace.props.schDisplayLabel??pinFullName}),anchor_side:fromSide})}}function Trace__findConnectedPorts(trace){let{_parsedProps:props,parent}=trace;if(!parent)throw new Error("Trace has no parent");let portSelectors=trace.getTracePortPathSelectors(),resolveImplicitSinglePort=selector=>{if(selector.lastIndexOf(".")>selector.lastIndexOf(" "))return null;let targetComponent=trace.getSubcircuit().selectOne(selector);if(!targetComponent&&!/[.#\[]/.test(selector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${selector}`)),!targetComponent)return null;let ports=targetComponent.children.filter(c3=>c3.componentName==="Port");return ports.length===1?ports[0]:null},portsWithSelectors=portSelectors.map(selector=>({selector,port:trace.getSubcircuit().selectOne(selector,{type:"port"})??resolveImplicitSinglePort(selector)}));for(let{selector,port}of portsWithSelectors)if(!port){let parentSelector,portToken,dotIndex=selector.lastIndexOf(".");if(dotIndex!==-1&&dotIndex>selector.lastIndexOf(" "))parentSelector=selector.slice(0,dotIndex),portToken=selector.slice(dotIndex+1);else{let match2=selector.match(/^(.*[ >])?([^ >]+)$/);parentSelector=match2?.[1]?.trim()??"",portToken=match2?.[2]??selector}let targetComponent=parentSelector?trace.getSubcircuit().selectOne(parentSelector):null;if(!targetComponent&&parentSelector&&!/[.#\[]/.test(parentSelector)&&(targetComponent=trace.getSubcircuit().selectOne(`.${parentSelector}`)),!targetComponent){let errorMessage2=parentSelector?`Could not find port for selector "${selector}". Component "${parentSelector}" not found`:`Could not find port for selector "${selector}"`,subcircuit2=trace.getSubcircuit(),sourceGroup2=subcircuit2.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage2,subcircuit_id:subcircuit2.subcircuit_id??void 0,source_group_id:sourceGroup2?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}let ports=targetComponent.children.filter(c3=>c3.componentName==="Port"),portLabel=portToken.includes(".")?portToken.split(".").pop()??"":portToken,portNames=ports.flatMap(c3=>c3.getNameAndAliases()),hasCustomLabels=portNames.some(n3=>!/^(pin\d+|\d+)$/.test(n3)),labelList=Array.from(new Set(portNames)).join(", "),detail;ports.length===0?detail="It has no ports":hasCustomLabels?detail=`It has [${labelList}]`:detail=`It has ${ports.length} pins and no pinLabels (consider adding pinLabels)`;let errorMessage=`Could not find port for selector "${selector}". Component "${targetComponent.props.name??parentSelector}" found, but does not have pin "${portLabel}". ${detail}`,subcircuit=trace.getSubcircuit(),sourceGroup=subcircuit.getGroup();throw new TraceConnectionError({error_type:"source_trace_not_connected_error",message:errorMessage,subcircuit_id:subcircuit.subcircuit_id??void 0,source_group_id:sourceGroup?.source_group_id??void 0,source_trace_id:trace.source_trace_id??void 0,selectors_not_found:[selector]})}return portsWithSelectors.some(p4=>!p4.port)?{allPortsFound:!1}:{allPortsFound:!0,portsWithSelectors,ports:portsWithSelectors.map(({port})=>port)}}var Trace3=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"source_trace_id",null);__publicField(this,"pcb_trace_id",null);__publicField(this,"schematic_trace_id",null);__publicField(this,"_portsRoutedOnPcb");__publicField(this,"subcircuit_connectivity_map_key",null);__publicField(this,"_traceConnectionHash",null);__publicField(this,"_couldNotFindPort");this._portsRoutedOnPcb=[]}_getExplicitTraceThickness(){return this._parsedProps.thickness??this._parsedProps.width}get config(){return{zodProps:traceProps,componentName:"Trace"}}_getTracePortOrNetSelectorListFromProps(){return"from"in this.props&&"to"in this.props?[typeof this.props.from=="string"?this.props.from:this.props.from.getPortSelector(),typeof this.props.to=="string"?this.props.to:this.props.to.getPortSelector()]:"path"in this.props?this.props.path.map(p4=>typeof p4=="string"?p4:p4.getPortSelector()):[]}getTracePortPathSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>!selector.includes("net."))}getTracePathNetSelectors(){return this._getTracePortOrNetSelectorListFromProps().filter(selector=>selector.includes("net."))}_findConnectedPorts(){return Trace__findConnectedPorts(this)}_resolveNet(selector){let direct=this.getSubcircuit().selectOne(selector,{type:"net"});if(direct)return direct;let match2=selector.match(/^net\.(.+)$/),netName=match2?match2[1]:null;if(!netName)return null;let board=this.root?._getBoard();return board?board.getDescendants().find(d3=>d3.componentName==="Net"&&d3._parsedProps.name===netName)||null:(this.renderError(`Could not find a <board> ancestor for ${this}, so net "${selector}" cannot be resolved`),null)}_findConnectedNets(){let netsWithSelectors=this.getTracePathNetSelectors().map(selector=>({selector,net:this._resolveNet(selector)})),undefinedNets=netsWithSelectors.filter(n3=>!n3.net);return undefinedNets.length>0&&this.renderError(`Could not find net for selector "${undefinedNets[0].selector}" inside ${this}`),{netsWithSelectors,nets:netsWithSelectors.map(n3=>n3.net)}}_getAllTracesConnectedToSameNet(){let traces=this.getSubcircuit().selectAll("trace"),myNets=this._findConnectedNets().nets,myPorts=this._findConnectedPorts().ports??[];return traces.filter(t35=>{if(t35===this)return!1;let tNets=t35._findConnectedNets().nets,tPorts=t35._findConnectedPorts().ports??[];return tNets.some(n3=>myNets.includes(n3))||tPorts.some(p4=>myPorts.includes(p4))})}_isExplicitlyConnectedToPort(port){let{allPortsFound,portsWithSelectors:portsWithMetadata}=this._findConnectedPorts();return allPortsFound?portsWithMetadata.map(p4=>p4.port).includes(port):!1}_isExplicitlyConnectedToNet(net){return this._findConnectedNets().nets.includes(net)}doInitialCreateNetsFromProps(){createNetsFromProps(this,this.getTracePathNetSelectors())}_computeTraceConnectionHash(){let{allPortsFound,ports}=this._findConnectedPorts();return!allPortsFound||!ports?null:[...ports].sort((a2,b3)=>(a2.pcb_port_id||"").localeCompare(b3.pcb_port_id||"")).map(p4=>p4.pcb_port_id).join(",")}doInitialSourceTraceRender(){let{db:db2}=this.root,{_parsedProps:props,parent}=this;if(!parent){this.renderError("Trace has no parent");return}let allPortsFound,ports;try{let result=this._findConnectedPorts();allPortsFound=result.allPortsFound,ports=result.portsWithSelectors??[]}catch(error){if(error instanceof TraceConnectionError){db2.source_trace_not_connected_error.insert({...error.errorData,error_type:"source_trace_not_connected_error"}),this._couldNotFindPort=!0;return}throw error}if(!allPortsFound)return;this._traceConnectionHash=this._computeTraceConnectionHash();let existingTrace=db2.source_trace.list().find(t35=>t35.subcircuit_connectivity_map_key===this.subcircuit_connectivity_map_key&&t35.connected_source_port_ids.sort().join(",")===this._traceConnectionHash);if(existingTrace){this.source_trace_id=existingTrace.source_trace_id;return}let nets=this._findConnectedNets().nets,displayName=getTraceDisplayName({ports,nets}),trace=db2.source_trace.insert({connected_source_port_ids:ports.map(p4=>p4.port.source_port_id),connected_source_net_ids:nets.map(n3=>n3.source_net_id),subcircuit_id:this.getSubcircuit()?.subcircuit_id,max_length:getMaxLengthFromConnectedCapacitors(ports.map(p4=>p4.port),{db:db2})??props.maxLength,display_name:displayName,min_trace_thickness:this._getExplicitTraceThickness()});this.source_trace_id=trace.source_trace_id}_insertErrorIfTraceIsOutsideBoard(mergedRoute,ports){let{db:db2}=this.root,board=this._getBoard();if(!board)return;let pcbBoardId=board.pcb_board_id;if(!pcbBoardId)return;isRouteOutsideBoard({mergedRoute,db:db2,pcbBoardId})&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",source_trace_id:this.source_trace_id,message:`Trace ${this.getString()} routed outside the board boundaries.`,pcb_trace_id:this.pcb_trace_id,pcb_component_ids:[],pcb_port_ids:ports.map(p4=>p4.pcb_port_id)})}doInitialPcbManualTraceRender(){Trace_doInitialPcbManualTraceRender(this)}doInitialPcbTraceRender(){Trace_doInitialPcbTraceRender(this)}_doInitialSchematicTraceRenderWithDisplayLabel(){Trace__doInitialSchematicTraceRenderWithDisplayLabel(this)}_isSymbolToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&!isPort2Chip||!isPort1Chip&&isPort2Chip}_isSymbolToSymbolConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Symbol=!port1.parent.config.shouldRenderAsSchematicBox,isPort2Symbol=!port2.parent.config.shouldRenderAsSchematicBox;return isPort1Symbol&&isPort2Symbol}_isChipToChipConnection(){let{allPortsFound,ports}=this._findConnectedPorts();if(!allPortsFound||ports.length!==2)return!1;let[port1,port2]=ports;if(!port1?.parent||!port2?.parent)return!1;let isPort1Chip=port1.parent.config.shouldRenderAsSchematicBox,isPort2Chip=port2.parent.config.shouldRenderAsSchematicBox;return isPort1Chip&&isPort2Chip}doInitialSchematicTraceRender(){Trace_doInitialSchematicTraceRender(this)}},catalogue={},extendCatalogue=objects=>{let altKeys=Object.fromEntries(Object.entries(objects).map(([key,v5])=>[key.toLowerCase(),v5]));Object.assign(catalogue,objects),Object.assign(catalogue,altKeys)},ErrorPlaceholderComponent=class extends PrimitiveComponent2{constructor(props,error){super(props);let resolveCoordinate=(value,axis)=>{if(typeof value=="number")return value;if(typeof value=="string")try{return this._resolvePcbCoordinate(value,axis,{allowBoardVariables:!1})}catch{return 0}return 0};this._parsedProps={...props,error,type:props.type||"unknown",component_name:props.name,error_type:"source_failed_to_create_component_error",message:error instanceof Error?error.message:String(error),pcbX:resolveCoordinate(props.pcbX,"pcbX"),pcbY:resolveCoordinate(props.pcbY,"pcbY"),schX:props.schX,schY:props.schY}}formatErrorDetails(){let selectorValue=this._parsedProps.selector??this._parsedProps.selectors??this._parsedProps.in??this._parsedProps.within,selectorText=selectorValue===void 0?void 0:typeof selectorValue=="string"?selectorValue:this.safeStringify(selectorValue),propsText=this.safeStringify(this._parsedProps);return{selectorText,propsText}}safeStringify(value){let seen=new WeakSet,json=JSON.stringify(value,(_key,item)=>{if(typeof item=="bigint")return item.toString();if(typeof item=="function")return`[Function ${item.name||"anonymous"}]`;if(typeof item=="symbol")return item.toString();if(typeof item=="object"&&item!==null){if(seen.has(item))return"[Circular]";seen.add(item)}return item},2);return json?json.length>2e3?`${json.slice(0,2e3)}\u2026`:json:"undefined"}get config(){return{componentName:"ErrorPlaceholder",zodProps:external_exports.object({}).passthrough()}}doInitialSourceRender(){if(this.root?.db){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout(),{selectorText,propsText}=this.formatErrorDetails(),messageDetails=[selectorText?`Within selector: ${selectorText}`:null,`Props: ${propsText}`].filter(Boolean).join(" "),baseMessage=`Could not create ${this._parsedProps.componentType??"component"}${this._parsedProps.name?` "${this._parsedProps.name}"`:""}. ${this._parsedProps.error?.formattedError?._errors?.join("; ")||this._parsedProps.message}`;this.root.db.source_failed_to_create_component_error.insert({component_name:this._parsedProps.component_name,error_type:"source_failed_to_create_component_error",message:`${baseMessage}${messageDetails?` Details: ${messageDetails}`:""}`,pcb_center:pcbPosition2,schematic_center:schematicPosition})}}};function createErrorPlaceholderComponent(props,error){return new ErrorPlaceholderComponent(props,error)}function prepare(object,state2){let instance=object;return instance.__tsci={...state2},object}var hostConfig={supportsMutation:!0,createInstance(type,props){let target=catalogue[type];if(!target)throw Object.keys(catalogue).length===0?new Error("No components registered in catalogue, did you forget to import lib/register-catalogue in your test file?"):new Error(`Unsupported component type "${type}". No element with this name is registered in the @tscircuit/core catalogue. Check for typos or see https://docs.tscircuit.com/category/built-in-elements for a list of valid components. To add your own component, see docs/CREATING_NEW_COMPONENTS.md`);try{return prepare(new target(props),{})}catch(error){return createErrorPlaceholderComponent({...props,componentType:type},error)}},createTextInstance(text){return{__text:text}},appendInitialChild(parentInstance,child){parentInstance.add(child)},appendChild(parentInstance,child){parentInstance.add(child)},appendChildToContainer(container,child){container.add(child)},finalizeInitialChildren(){return!1},prepareUpdate(){return null},shouldSetTextContent(){return!1},getRootHostContext(){return{}},getChildHostContext(){return{}},prepareForCommit(){return null},resetAfterCommit(){},commitMount(){},commitUpdate(){},removeChild(){},clearContainer(){},supportsPersistence:!1,getPublicInstance(instance){return instance},preparePortalMount(containerInfo){throw new Error("Function not implemented.")},scheduleTimeout(fn3,delay){throw new Error("Function not implemented.")},cancelTimeout(id2){throw new Error("Function not implemented.")},noTimeout:void 0,isPrimaryRenderer:!1,getInstanceFromNode(node){throw new Error("Function not implemented.")},beforeActiveInstanceBlur(){throw new Error("Function not implemented.")},afterActiveInstanceBlur(){throw new Error("Function not implemented.")},prepareScopeUpdate:(scopeInstance,instance)=>{throw new Error("Function not implemented.")},getInstanceFromScope:scopeInstance=>{throw new Error("Function not implemented.")},detachDeletedInstance:node=>{throw new Error("Function not implemented.")},getCurrentEventPriority:()=>import_constants24.DefaultEventPriority,getCurrentUpdatePriority:()=>import_constants24.DefaultEventPriority,resolveUpdatePriority:()=>import_constants24.DefaultEventPriority,setCurrentUpdatePriority:()=>{},maySuspendCommit:()=>!1,supportsHydration:!1},reconciler=(0,import_react_reconciler.default)(hostConfig),createInstanceFromReactElement=reactElm=>{let rootContainer={children:[],props:{name:"$root"},add(instance){instance.parent=this,this.children.push(instance)},computePcbGlobalTransform(){return identity()}},containerErrors=[],container=reconciler.createContainer(rootContainer,0,null,!1,null,"tsci",error=>{console.log("Error in createContainer"),console.error(error),containerErrors.push(error)},null);if(reconciler.updateContainerSync(reactElm,container,null,()=>{}),reconciler.flushSyncWork(),containerErrors.length>0)throw containerErrors[0];let rootInstance=reconciler.getPublicRootInstance(container);return rootInstance||rootContainer.children[0]},parsePinNumberFromLabelsOrThrow=(pinNumberOrLabel,pinLabels)=>{if(typeof pinNumberOrLabel=="number")return pinNumberOrLabel;if(pinNumberOrLabel.startsWith("pin"))return Number(pinNumberOrLabel.slice(3));if(!pinLabels)throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`);for(let pinNumberKey in pinLabels)if((Array.isArray(pinLabels[pinNumberKey])?pinLabels[pinNumberKey]:[pinLabels[pinNumberKey]]).includes(pinNumberOrLabel))return Number(pinNumberKey.replace("pin",""));throw new Error(`No pin labels provided and pin number or label is not a number: "${pinNumberOrLabel}"`)},underscorifyPinStyles=(pinStyles,pinLabels)=>{if(!pinStyles)return;let underscorePinStyles={},mergedStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels);mergedStyles[pinNumber]={...mergedStyles[pinNumber],...pinStyle}}for(let[pinNumber,pinStyle]of Object.entries(mergedStyles)){let pinKey=`pin${pinNumber}`;underscorePinStyles[pinKey]={bottom_margin:pinStyle.bottomMargin,left_margin:pinStyle.leftMargin,right_margin:pinStyle.rightMargin,top_margin:pinStyle.topMargin}}return underscorePinStyles},underscorifyPortArrangement=portArrangement=>{if(portArrangement){if("leftSide"in portArrangement||"rightSide"in portArrangement||"topSide"in portArrangement||"bottomSide"in portArrangement)return{left_side:portArrangement.leftSide,right_side:portArrangement.rightSide,top_side:portArrangement.topSide,bottom_side:portArrangement.bottomSide};if("leftPinCount"in portArrangement||"rightPinCount"in portArrangement||"topPinCount"in portArrangement||"bottomPinCount"in portArrangement)return{left_size:portArrangement.leftPinCount,right_size:portArrangement.rightPinCount,top_size:portArrangement.topPinCount,bottom_size:portArrangement.bottomPinCount};if("leftSize"in portArrangement||"rightSize"in portArrangement||"topSize"in portArrangement||"bottomSize"in portArrangement)return{left_size:portArrangement.leftSize,right_size:portArrangement.rightSize,top_size:portArrangement.topSize,bottom_size:portArrangement.bottomSize}}},CourtyardCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardCircle",zodProps:courtyardCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_circle2=db2.pcb_courtyard_circle.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_circle_id=pcb_courtyard_circle2.pcb_courtyard_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_circle_id)return;let circle2=db2.pcb_courtyard_circle.get(this.pcb_courtyard_circle_id);circle2&&db2.pcb_courtyard_circle.update(this.pcb_courtyard_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},CourtyardOutline=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_outline_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardOutline",zodProps:courtyardOutlineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardOutline. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_courtyard_outline2=db2.pcb_courtyard_outline.insert({pcb_component_id,layer,outline:props.outline.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{x:transformedPosition.x,y:transformedPosition.y}}),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_outline_id=pcb_courtyard_outline2.pcb_courtyard_outline_id}_setPositionFromLayout(newCenter){let{db:db2}=this.root,currentOutline=db2.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);if(!currentOutline)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentOutline.outline)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentOutline.outline.length,currentCenterY/=currentOutline.outline.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newOutline=currentOutline.outline.map(point6=>({x:point6.x+offsetX,y:point6.y+offsetY}));db2.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:newOutline})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_outline_id)return;let outline=db2.pcb_courtyard_outline.get(this.pcb_courtyard_outline_id);outline&&db2.pcb_courtyard_outline.update(this.pcb_courtyard_outline_id,{outline:outline.outline.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.outline||props.outline.length===0)return{width:0,height:0};let bounds=getBoundsFromPoints(props.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:{width:0,height:0}}},CourtyardRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_courtyard_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CourtyardRect",zodProps:courtyardRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for CourtyardRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,ccw_rotation=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI,pcb_courtyard_rect2=db2.pcb_courtyard_rect.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},width:props.width,height:props.height,ccw_rotation:ccw_rotation||void 0,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_courtyard_rect_id=pcb_courtyard_rect2.pcb_courtyard_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_courtyard_rect_id)return;let rect=db2.pcb_courtyard_rect.get(this.pcb_courtyard_rect_id);rect&&db2.pcb_courtyard_rect.update(this.pcb_courtyard_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},Cutout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_cutout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Cutout",zodProps:cutoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),pcb_group_id=this.getGroup()?.pcb_group_id??void 0,globalPosition=this._getGlobalPcbPositionBeforeLayout(),parentRotation=this.getPrimitiveContainer()?._parsedProps.pcbRotation??0,inserted_pcb_cutout;if(props.shape==="rect"){let rotationDeg=typeof parentRotation=="string"?parseInt(parentRotation.replace("deg",""),10):parentRotation,isRotated90=Math.abs(rotationDeg%180)===90,rectData={shape:"rect",center:globalPosition,width:isRotated90?props.height:props.width,height:isRotated90?props.width:props.height,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(rectData)}else if(props.shape==="circle"){let circleData={shape:"circle",center:globalPosition,radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(circleData)}else if(props.shape==="polygon"){let transform5=this._computePcbGlobalTransformBeforeLayout(),polygonData={shape:"polygon",points:props.points.map(p4=>applyToPoint2(transform5,p4)),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id};inserted_pcb_cutout=db2.pcb_cutout.insert(polygonData)}inserted_pcb_cutout&&(this.pcb_cutout_id=inserted_pcb_cutout.pcb_cutout_id)}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="polygon"){if(props.points.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}return{width:0,height:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_cutout_id)return super._getPcbCircuitJsonBounds();let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);if(!cutout)return super._getPcbCircuitJsonBounds();if(cutout.shape==="rect")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.width/2,top:cutout.center.y+cutout.height/2,right:cutout.center.x+cutout.width/2,bottom:cutout.center.y-cutout.height/2},width:cutout.width,height:cutout.height};if(cutout.shape==="circle")return{center:cutout.center,bounds:{left:cutout.center.x-cutout.radius,top:cutout.center.y+cutout.radius,right:cutout.center.x+cutout.radius,bottom:cutout.center.y-cutout.radius},width:cutout.radius*2,height:cutout.radius*2};if(cutout.shape==="polygon"){if(cutout.points.length===0)return super._getPcbCircuitJsonBounds();let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of cutout.points)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}return super._getPcbCircuitJsonBounds()}_setPositionFromLayout(newCenter){if(!this.pcb_cutout_id)return;let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);if(cutout){if(cutout.shape==="rect"||cutout.shape==="circle")db2.pcb_cutout.update(this.pcb_cutout_id,{...cutout,center:newCenter});else if(cutout.shape==="polygon"){let oldCenter=this._getPcbCircuitJsonBounds().center,dx3=newCenter.x-oldCenter.x,dy3=newCenter.y-oldCenter.y,newPoints=cutout.points.map(p4=>({x:p4.x+dx3,y:p4.y+dy3}));db2.pcb_cutout.update(this.pcb_cutout_id,{...cutout,points:newPoints})}}}_moveCircuitJsonElements({deltaX,deltaY}){if(!this.pcb_cutout_id)return;let{db:db2}=this.root,cutout=db2.pcb_cutout.get(this.pcb_cutout_id);cutout&&(cutout.shape==="rect"||cutout.shape==="circle"?db2.pcb_cutout.update(this.pcb_cutout_id,{center:{x:cutout.center.x+deltaX,y:cutout.center.y+deltaY}}):cutout.shape==="polygon"&&db2.pcb_cutout.update(this.pcb_cutout_id,{points:cutout.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},FabricationNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNotePath",zodProps:fabricationNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,subcircuit=this.getSubcircuit(),{_parsedProps:props}=this,layer=props.layer??"top";if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,fabrication_note_path=db2.pcb_fabrication_note_path.insert({pcb_component_id,layer,color:props.color,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0});this.fabrication_note_path_id=fabrication_note_path.pcb_fabrication_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_path_id)return;let path=db2.pcb_fabrication_note_path.get(this.fabrication_note_path_id);path&&db2.pcb_fabrication_note_path.update(this.fabrication_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},FabricationNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteRect",zodProps:fabricationNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteRect. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),hasStroke=props.hasStroke??(props.strokeWidth!==void 0&&props.strokeWidth!==null),fabrication_note_rect=db2.pcb_fabrication_note_rect.insert({pcb_component_id,layer,color:props.color,center:{x:position2.x,y:position2.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??1,is_filled:props.isFilled??!1,has_stroke:hasStroke,is_stroke_dashed:props.isStrokeDashed??!1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,corner_radius:props.cornerRadius??void 0});this.fabrication_note_rect_id=fabrication_note_rect.pcb_fabrication_note_rect_id}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_rect_id)return;let rect=db2.pcb_fabrication_note_rect.get(this.fabrication_note_rect_id);rect&&db2.pcb_fabrication_note_rect.update(this.fabrication_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}};function normalizeTextForCircuitJson(text){return text.replace(/\\n/g,`
|
|
649
|
-
`)}function parseSegment(seg){let bracketIdx=seg.indexOf("[");if(bracketIdx===-1)return{tag:seg};let tag=seg.slice(0,bracketIdx),m3=seg.slice(bracketIdx+1,seg.lastIndexOf("]")).match(/^(\w+)(\^=|\$=|=)['"]?(.*?)['"]?$/);return m3?{tag,attrName:m3[1],attrOp:m3[2],attrValue:m3[3]}:{tag}}function componentMatchesSegment(component,seg){if(component.lowercaseComponentName!==seg.tag)return!1;if(!seg.attrName)return!0;let attrVal=component.props?.[seg.attrName];if(attrVal===void 0)return!1;let valStr=String(attrVal);switch(seg.attrOp){case"^=":return valStr.startsWith(seg.attrValue);case"$=":return valStr.endsWith(seg.attrValue);case"=":return valStr===seg.attrValue;default:return!1}}function matchesCompoundSelector(component,segments){if(!componentMatchesSegment(component,segments[segments.length-1]))return!1;let segIdx=segments.length-2,current2=component.parent;for(;segIdx>=0&¤t2;)componentMatchesSegment(current2,segments[segIdx])&&segIdx--,current2=current2.parent;return segIdx<0}function resolvePcbProperty({propertyName,resolvedPcbSx,pathFromAmpersand,component}){if(!resolvedPcbSx)return;let result,bestSpecificity=0;for(let[key,entry]of Object.entries(resolvedPcbSx)){if(!entry||!(propertyName in entry))continue;let selectorBody=key.startsWith("& ")?key.slice(2):key;if(selectorBody===pathFromAmpersand){1>bestSpecificity&&(bestSpecificity=1,result=entry[propertyName]);continue}if(!component)continue;let segments=selectorBody.split(/\s+/).map(parseSegment);if(!(segments.length<2)&&matchesCompoundSelector(component,segments)){let specificity=segments.length;specificity>bestSpecificity&&(bestSpecificity=specificity,result=entry[propertyName])}}return result}var FabricationNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_fabrication_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteText",zodProps:fabricationNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit();if(resolvePcbProperty({propertyName:"visibility",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"fabricationnotetext",component:this})==="hidden")return;let pcb_fabrication_note_text2=db2.pcb_fabrication_note_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:"top",color:props.color,text:normalizeTextForCircuitJson(props.text??""),pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_fabrication_note_text_id=pcb_fabrication_note_text2.pcb_fabrication_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:(props.text??"").length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_fabrication_note_text_id){let text=db2.pcb_fabrication_note_text.get(this.pcb_fabrication_note_text_id);text&&db2.pcb_fabrication_note_text.update(this.pcb_fabrication_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},Hole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_hole_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:holeProps}}getPcbSize(){let{_parsedProps:props}=this,isPill=props.shape==="pill",isRect=props.shape==="rect";return isPill?{width:props.width,height:props.height}:isRect?{width:props.width,height:props.height}:{width:props.diameter,height:props.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin),props.shape==="pill")if(props.pcbRotation&&props.pcbRotation!==0){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rotated_pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,ccw_rotation:props.pcbRotation,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="rect"){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rect",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"circle",hole_diameter:props.diameter,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,hole=db2.pcb_hole.get(this.pcb_hole_id),size2=this.getPcbSize();return{center:{x:hole.x,y:hole.y},bounds:{left:hole.x-size2.width/2,top:hole.y-size2.height/2,right:hole.x+size2.width/2,bottom:hole.y+size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_hole.update(this.pcb_hole_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_hole_id)return;let hole=db2.pcb_hole.get(this.pcb_hole_id);hole&&db2.pcb_hole.update(this.pcb_hole_id,{x:hole.x+deltaX,y:hole.y+deltaY})}},Keepout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_keepout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:pcbKeepoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let subcircuit=this.getSubcircuit(),{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),decomposedMat=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()),isRotated90=Math.abs(decomposedMat.rotation.angle*(180/Math.PI)-90)%180<.01,pcb_keepout2=null;props.shape==="circle"?pcb_keepout2=db2.pcb_keepout.insert({layers:["top"],shape:"circle",radius:props.radius,center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0}):props.shape==="rect"&&(pcb_keepout2=db2.pcb_keepout.insert({layers:["top"],shape:"rect",...isRotated90?{width:props.height,height:props.width}:{width:props.width,height:props.height},center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0})),pcb_keepout2&&(this.pcb_keepout_id=pcb_keepout2.pcb_keepout_id)}getPcbSize(){let{_parsedProps:props}=this;return props.shape==="circle"?{width:props.radius*2,height:props.radius*2}:props.shape==="rect"?{width:props.width,height:props.height}:{width:0,height:0}}},PcbNoteLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:pcbNoteLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),group=this.getGroup(),transform5=this._computePcbGlobalTransformBeforeLayout(),start=applyToPoint2(transform5,{x:props.x1,y:props.y1}),end=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_line2=db2.pcb_note_line.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,x1:start.x,y1:start.y,x2:end.x,y2:end.y,stroke_width:props.strokeWidth??.1,color:props.color,is_dashed:props.isDashed});this.pcb_note_line_id=pcb_note_line2.pcb_note_line_id}getPcbSize(){let{_parsedProps:props}=this;return{width:Math.abs(props.x2-props.x1),height:Math.abs(props.y2-props.y1)}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_line_id)return;let line2=db2.pcb_note_line.get(this.pcb_note_line_id);line2&&db2.pcb_note_line.update(this.pcb_note_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},PcbNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:pcbNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...rest}=point6,numericX=typeof x5=="string"?parseFloat(x5):x5,numericY=typeof y5=="string"?parseFloat(y5):y5,transformed=applyToPoint2(transform5,{x:numericX,y:numericY});return{...rest,x:transformed.x,y:transformed.y}}),pcb_note_path2=db2.pcb_note_path.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,route:transformedRoute,stroke_width:props.strokeWidth??.1,color:props.color});this.pcb_note_path_id=pcb_note_path2.pcb_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_path_id)return;let path=db2.pcb_note_path.get(this.pcb_note_path_id);path&&db2.pcb_note_path.update(this.pcb_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},PcbNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:pcbNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),center2=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_rect2=db2.pcb_note_rect.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,center:center2,width:props.width,height:props.height,stroke_width:props.strokeWidth??.1,is_filled:props.isFilled??!1,has_stroke:props.hasStroke??!0,is_stroke_dashed:props.isStrokeDashed??!1,color:props.color,corner_radius:props.cornerRadius??void 0});this.pcb_note_rect_id=pcb_note_rect2.pcb_note_rect_id}getPcbSize(){let{_parsedProps:props}=this,width=typeof props.width=="string"?parseFloat(props.width):props.width,height=typeof props.height=="string"?parseFloat(props.height):props.height;return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_rect_id)return;let rect=db2.pcb_note_rect.get(this.pcb_note_rect_id);rect&&db2.pcb_note_rect.update(this.pcb_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},PcbNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:pcbNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),anchorPosition=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_text2=db2.pcb_note_text.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,font:props.font??"tscircuit2024",font_size:props.fontSize??1,text:normalizeTextForCircuitJson(props.text),anchor_position:anchorPosition,anchor_alignment:props.anchorAlignment??"center",color:props.color});this.pcb_note_text_id=pcb_note_text2.pcb_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:props.text.length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_text_id)return;let text=db2.pcb_note_text.get(this.pcb_note_text_id);text&&db2.pcb_note_text.update(this.pcb_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},pcbTraceProps2=external_exports.object({route:external_exports.array(pcb_trace_route_point),source_trace_id:external_exports.string().optional()}),PcbTrace=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_trace_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:pcbTraceProps2}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),parentTransform=this._computePcbGlobalTransformBeforeLayout(),transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...restOfPoint}=point6,transformedPoint=applyToPoint2(parentTransform,{x:x5,y:y5});return point6.route_type==="wire"&&point6.layer?{...transformedPoint,...restOfPoint,layer:maybeFlipLayer(point6.layer)}:{...transformedPoint,...restOfPoint}}),pcb_trace2=db2.pcb_trace.insert({pcb_component_id:container.pcb_component_id,source_trace_id:props.source_trace_id,route:transformedRoute,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=pcb_trace2.pcb_trace_id}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y),point6.route_type==="wire"&&(minX=Math.min(minX,point6.x-point6.width/2),maxX=Math.max(maxX,point6.x+point6.width/2),minY=Math.min(minY,point6.y-point6.width/2),maxY=Math.max(maxY,point6.y+point6.width/2));return minX===1/0||maxX===-1/0||minY===1/0||maxY===-1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}},PlatedHole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_plated_hole_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:platedHoleProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.outerDiameter,height:props.outerDiameter};if(props.shape==="oval"||props.shape==="pill")return{width:props.outerWidth,height:props.outerHeight};if(props.shape==="circular_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="pill_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="hole_with_polygon_pad"){if(!props.padOutline||props.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let xs3=props.padOutline.map(p4=>typeof p4.x=="number"?p4.x:parseFloat(String(p4.x))),ys3=props.padOutline.map(p4=>typeof p4.y=="number"?p4.y:parseFloat(String(p4.y))),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,platedHole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id),size2=this.getPcbSize();return{center:{x:platedHole.x,y:platedHole.y},bounds:{left:platedHole.x-size2.width/2,top:platedHole.y+size2.height/2,right:platedHole.x+size2.width/2,bottom:platedHole.y-size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this._parsedProps.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this._parsedProps.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let finalRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;if(props.shape==="circle"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:props.outerDiameter,hole_diameter:props.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="pill"&&props.rectPad){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:props.pcbRotation??0,rect_ccw_rotation:props.pcbRotation??0,rect_pad_width:props.outerWidth,rect_pad_height:props.outerHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill"||props.shape==="oval"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:props.shape,port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:props.pcbRotation??0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="circular_hole_with_rect_pad"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:props.holeDiameter,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,rect_border_radius:props.rectBorderRadius??0,rect_ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill_hole_with_rect_pad"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"pill_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="hole_with_polygon_pad"){let padOutline=(props.padOutline||[]).map(point6=>{let x5=typeof point6.x=="number"?point6.x:parseFloat(String(point6.x)),y5=typeof point6.y=="number"?point6.y:parseFloat(String(point6.y));return{x:x5,y:y5}}),pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:props.holeShape||"circle",hole_diameter:props.holeDiameter,hole_width:props.holeWidth,hole_height:props.holeHeight,pad_outline:padOutline,hole_offset_x:typeof props.holeOffsetX=="number"?props.holeOffsetX:parseFloat(String(props.holeOffsetX||0)),hole_offset_y:typeof props.holeOffsetY=="number"?props.holeOffsetY:parseFloat(String(props.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_plated_hole_id)return;let hole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id);if(hole){let newCenter={x:hole.x+deltaX,y:hole.y+deltaY};this._setPositionFromLayout(newCenter)}}},SilkscreenCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:silkscreenCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_circle2=db2.pcb_silkscreen_circle.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1});this.pcb_silkscreen_circle_id=pcb_silkscreen_circle2.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_circle_id)return;let circle2=db2.pcb_silkscreen_circle.get(this.pcb_silkscreen_circle_id);circle2&&db2.pcb_silkscreen_circle.update(this.pcb_silkscreen_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},SilkscreenLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:silkscreenLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenLine. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),transform5=this._computePcbGlobalTransformBeforeLayout(),p12=applyToPoint2(transform5,{x:props.x1,y:props.y1}),p22=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_line2=db2.pcb_silkscreen_line.insert({pcb_component_id,layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y,stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=pcb_silkscreen_line2.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:props}=this,width=Math.abs(props.x2-props.x1),height=Math.abs(props.y2-props.y1);return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_line_id)return;let line2=db2.pcb_silkscreen_line.get(this.pcb_silkscreen_line_id);line2&&db2.pcb_silkscreen_line.update(this.pcb_silkscreen_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},SilkscreenPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:silkscreenPathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_path2=db2.pcb_silkscreen_path.insert({pcb_component_id,layer,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=pcb_silkscreen_path2.pcb_silkscreen_path_id}_setPositionFromLayout(newCenter){let{db:db2}=this.root,{_parsedProps:props}=this,currentPath=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!currentPath)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentPath.route)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentPath.route.length,currentCenterY/=currentPath.route.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newRoute=currentPath.route.map(point6=>({...point6,x:point6.x+offsetX,y:point6.y+offsetY}));db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:newRoute})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_path_id)return;let path=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);path&&db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}},SilkscreenRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:silkscreenRectProps}}_isRotated90Degrees(){let globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(globalTransform).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01;return Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),isRotated90Degrees=this._isRotated90Degrees(),finalWidth=isRotated90Degrees?props.height:props.width,finalHeight=isRotated90Degrees?props.width:props.height,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_rect2=db2.pcb_silkscreen_rect.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},width:finalWidth,height:finalHeight,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1,is_filled:props.filled??!1,corner_radius:props.cornerRadius??void 0});this.pcb_silkscreen_rect_id=pcb_silkscreen_rect2.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:props}=this;return this._isRotated90Degrees()?{width:props.height,height:props.width}:{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_rect_id)return;let rect=db2.pcb_silkscreen_rect.get(this.pcb_silkscreen_rect_id);rect&&db2.pcb_silkscreen_rect.update(this.pcb_silkscreen_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},SilkscreenText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_text_ids",[]);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_footprinterFontSize")}get config(){return{componentName:"SilkscreenText",zodProps:silkscreenTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),subcircuit=this.getSubcircuit(),rotation4=0;if(props.pcbRotation!==void 0&&props.pcbRotation!==0)rotation4=props.pcbRotation;else{let globalTransform=this._computePcbGlobalTransformBeforeLayout();rotation4=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}isFlipped&&(rotation4=(rotation4+180)%360);let uniqueLayers=new Set(props.layers);props.layer&&uniqueLayers.add(props.layer);let targetLayers=uniqueLayers.size>0?Array.from(uniqueLayers):["top"],resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbX=resolvePcbProperty({propertyName:"pcbX",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbY=resolvePcbProperty({propertyName:"pcbY",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,position2=(resolvedPcbSxPcbX!==void 0||resolvedPcbSxPcbY!==void 0)&&this._footprinterFontSize!==void 0?applyToPoint2(compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),isFlipped?flipY():identity()),{x:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbX??props.pcbX??0,axis:"pcbX"}),y:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbY??props.pcbY??0,axis:"pcbY"})}):this._getGlobalPcbPositionBeforeLayout(),uniformPadding=props.knockoutPadding??0,knockoutPadding=props.knockoutPadding!==void 0||props.knockoutPaddingLeft!==void 0||props.knockoutPaddingRight!==void 0||props.knockoutPaddingTop!==void 0||props.knockoutPaddingBottom!==void 0?{left:props.knockoutPaddingLeft??uniformPadding,right:props.knockoutPaddingRight??uniformPadding,top:props.knockoutPaddingTop??uniformPadding,bottom:props.knockoutPaddingBottom??uniformPadding}:void 0,text=this._resolveText();for(let layer of targetLayers){let pcb_silkscreen_text2=db2.pcb_silkscreen_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:fontSize,layer:maybeFlipLayer(layer),text:normalizeTextForCircuitJson(text),ccw_rotation:rotation4,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,is_knockout:props.isKnockout,knockout_padding:knockoutPadding});this.pcb_silkscreen_text_ids.push(pcb_silkscreen_text2.pcb_silkscreen_text_id)}}getPcbSize(){let{_parsedProps:props}=this,resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,textWidth=this._resolveText().length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;for(let id2 of this.pcb_silkscreen_text_ids){let text=db2.pcb_silkscreen_text.get(id2);text&&db2.pcb_silkscreen_text.update(id2,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},SmtPad=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:smtPadProps}}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="rotated_rect"){let angleRad=(props.ccwRotation??0)*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),width=Math.abs(props.width*cosAngle)+Math.abs(props.height*sinAngle),height=Math.abs(props.width*sinAngle)+Math.abs(props.height*cosAngle);return{width,height}}if(props.shape==="polygon"){let points=props.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}if(props.shape==="pill")return{width:props.width,height:props.height};throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this.props.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,shouldCreateSolderPaste=!isCoveredWithSolderMask,soldermaskMargin=props.solderMaskMargin;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01,isAxisAligned=Math.abs(normalizedRotationDegrees)<rotationTolerance||Math.abs(normalizedRotationDegrees-180)<rotationTolerance||Math.abs(normalizedRotationDegrees-360)<rotationTolerance,isRotated90Degrees=Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance,finalRotationDegrees=Math.abs(normalizedRotationDegrees-360)<rotationTolerance?0:normalizedRotationDegrees,transformRotationBeforeFlip=finalRotationDegrees,{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers();isFlipped&&(finalRotationDegrees=(360-finalRotationDegrees+360)%360);let portHints2=props.portHints?.map(ph3=>ph3.toString())??[],pcb_smtpad2=null,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(props.shape==="circle")pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"circle",radius:props.radius,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:pcb_smtpad2.layer,shape:"circle",radius:pcb_smtpad2.radius*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(props.shape==="rect")!isAxisAligned&&!isRotated90Degrees?pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:isRotated90Degrees?props.height:props.width,height:isRotated90Degrees?props.width:props.height,corner_radius:props.cornerRadius??void 0,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&(pcb_smtpad2.shape==="rect"?db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2.shape==="rotated_rect"&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,ccw_rotation:pcb_smtpad2.ccw_rotation,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(props.shape==="rotated_rect"){let baseRotation=props.ccwRotation??0,combinedRotationBeforeFlip=(transformRotationBeforeFlip+baseRotation+360)%360,padRotation=isFlipped?(360-combinedRotationBeforeFlip+360)%360:combinedRotationBeforeFlip;pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:padRotation,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:position2.x,y:position2.y,ccw_rotation:padRotation,pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="polygon"){let transformedPoints=props.points.map(point6=>{let transformed=applyToPoint2(globalTransform,{x:distance.parse(point6.x),y:distance.parse(point6.y)});return{x:transformed.x,y:transformed.y}});pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"polygon",points:transformedPoints,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else props.shape==="pill"&&(pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"pill",x:position2.x,y:position2.y,radius:props.radius,height:props.height,width:props.width,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));pcb_smtpad2&&(this.pcb_smtpad_id=pcb_smtpad2.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,smtpad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(smtpad2.shape==="rect")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.width/2,top:smtpad2.y+smtpad2.height/2,right:smtpad2.x+smtpad2.width/2,bottom:smtpad2.y-smtpad2.height/2},width:smtpad2.width,height:smtpad2.height};if(smtpad2.shape==="rotated_rect"){let angleRad=smtpad2.ccw_rotation*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),w22=smtpad2.width/2,h22=smtpad2.height/2,xExtent=Math.abs(w22*cosAngle)+Math.abs(h22*sinAngle),yExtent=Math.abs(w22*sinAngle)+Math.abs(h22*cosAngle);return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width:xExtent*2,height:yExtent*2}}if(smtpad2.shape==="circle")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.radius,top:smtpad2.y-smtpad2.radius,right:smtpad2.x+smtpad2.radius,bottom:smtpad2.y+smtpad2.radius},width:smtpad2.radius*2,height:smtpad2.radius*2};if(smtpad2.shape==="polygon"){let points=smtpad2.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}if(smtpad2.shape==="pill"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-halfWidth,top:smtpad2.y-halfHeight,right:smtpad2.x+halfWidth,bottom:smtpad2.y+halfHeight},width:smtpad2.width,height:smtpad2.height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${smtpad2.shape}"`)}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y});let solderPaste=db2.pcb_solder_paste.list().find(elm=>elm.pcb_smtpad_id===this.pcb_smtpad_id);solderPaste&&db2.pcb_solder_paste.update(solderPaste.pcb_solder_paste_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill")this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY});else if(pad2.shape==="polygon"){db2.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))});let newCenter={x:this._getPcbCircuitJsonBounds().center.x+deltaX/2,y:this._getPcbCircuitJsonBounds().center.y+deltaY/2};this.matchedPort?._setPositionFromLayout(newCenter)}}},createPinrowSilkscreenText=({elm,pinLabels,layer,readableRotation,anchorAlignment})=>{let pinNum=elm.text.replace(/[{}]/g,"").toLowerCase(),label=pinNum;if(Array.isArray(pinLabels)){let index=parseInt(pinNum.replace(/[^\d]/g,""),10)-1;label=String(pinLabels[index]??pinNum)}else typeof pinLabels=="object"&&(label=String(pinLabels[pinNum]??pinNum));let silkscreenText=new SilkscreenText({anchorAlignment:anchorAlignment||"center",text:label??pinNum,layer:layer||"top",pcbX:isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:readableRotation??0});return silkscreenText._footprinterFontSize=elm.font_size+.2,silkscreenText},calculateCcwRotation=(componentRotationStr,elementCcwRotation)=>{let componentAngle=parseInt(componentRotationStr||"0",10),totalRotation;return elementCcwRotation!=null?totalRotation=elementCcwRotation-componentAngle:totalRotation=componentAngle,(totalRotation%360+360)%360},createComponentsFromCircuitJson=({componentName,componentRotation,footprinterString,pinLabels,pcbPinLabels},circuitJson)=>{let components=[];for(let elm of circuitJson)if(elm.type==="pcb_smtpad"&&elm.shape==="rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rect",height:elm.height,width:elm.width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius}));else if(elm.type==="pcb_smtpad"&&elm.shape==="circle")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"circle",radius:elm.radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="pill")components.push(new SmtPad({shape:"pill",height:elm.height,width:elm.width,radius:elm.radius,portHints:elm.port_hints,pcbX:elm.x,pcbY:elm.y,layer:elm.layer}));else if(elm.type==="pcb_smtpad"&&elm.shape==="polygon")components.push(new SmtPad({shape:"polygon",points:elm.points,portHints:elm.port_hints,layer:elm.layer}));else if(elm.type==="pcb_silkscreen_path")components.push(new SilkscreenPath({layer:elm.layer,route:elm.route,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_plated_hole")elm.shape==="circle"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circle",holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,portHints:elm.port_hints})):elm.shape==="circular_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circular_hole_with_rect_pad",holeDiameter:elm.hole_diameter,rectPadHeight:elm.rect_pad_height,rectPadWidth:elm.rect_pad_width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="pill"||elm.shape==="oval"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:elm.shape,holeWidth:elm.hole_width,holeHeight:elm.hole_height,outerWidth:elm.outer_width,outerHeight:elm.outer_height,portHints:elm.port_hints})):elm.shape==="pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="hole_with_polygon_pad"&&components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"hole_with_polygon_pad",holeShape:elm.hole_shape||"circle",holeDiameter:elm.hole_diameter,holeWidth:elm.hole_width,holeHeight:elm.hole_height,padOutline:elm.pad_outline||[],holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,portHints:elm.port_hints}));else if(elm.type==="pcb_keepout"&&elm.shape==="circle")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius}));else if(elm.type==="pcb_keepout"&&elm.shape==="rect")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="circle")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,diameter:elm.hole_diameter}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rect")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"rect",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rotated_pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height,pcbRotation:elm.ccw_rotation}));else if(elm.type==="pcb_cutout")elm.shape==="rect"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height})):elm.shape==="circle"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius})):elm.shape==="polygon"&&components.push(new Cutout({shape:"polygon",points:elm.points}));else if(elm.type==="pcb_silkscreen_text"){let ccwRotation=calculateCcwRotation(componentRotation,elm.ccw_rotation);if(footprinterString?.includes("pinrow")&&elm.text.includes("PIN"))components.push(createPinrowSilkscreenText({elm,pinLabels:pcbPinLabels??pinLabels??{},layer:elm.layer,readableRotation:ccwRotation,anchorAlignment:elm.anchor_alignment}));else{let silkscreenText=new SilkscreenText({anchorAlignment:elm.anchor_alignment||"center",text:componentName||elm.text,pcbX:Number.isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:ccwRotation??0});silkscreenText._footprinterFontSize=elm.font_size+.2,components.push(silkscreenText)}}else elm.type==="pcb_trace"?components.push(new PcbTrace({route:elm.route})):elm.type==="pcb_silkscreen_rect"?components.push(new SilkscreenRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer,strokeWidth:elm.stroke_width,filled:elm.is_filled,cornerRadius:elm.corner_radius})):elm.type==="pcb_silkscreen_circle"?components.push(new SilkscreenCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_silkscreen_line"?components.push(new SilkscreenLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_fabrication_note_text"?components.push(new FabricationNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text,fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_fabrication_note_path"?components.push(new FabricationNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color,layer:elm.layer})):elm.type==="pcb_fabrication_note_rect"?components.push(new FabricationNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,layer:elm.layer,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_text"?components.push(new PcbNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text??"",fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_note_rect"?components.push(new PcbNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_path"?components.push(new PcbNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color})):elm.type==="pcb_note_line"?components.push(new PcbNoteLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:elm.stroke_width,color:elm.color,isDashed:elm.is_dashed})):elm.type==="pcb_courtyard_rect"?components.push(new CourtyardRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer})):elm.type==="pcb_courtyard_circle"?components.push(new CourtyardCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer})):elm.type==="pcb_courtyard_outline"&&components.push(new CourtyardOutline({outline:elm.outline,layer:elm.layer}));return components};function filterPinLabels(pinLabels){if(!pinLabels)return{validPinLabels:pinLabels,invalidPinLabelsMessages:[]};let validPinLabels={},invalidPinLabelsMessages=[];for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels.slice():[labelOrLabels],validLabels=[];for(let label of labels)isValidPinLabel(pin,label)?validLabels.push(label):invalidPinLabelsMessages.push(`Invalid pin label: ${pin} = '${label}' - excluding from component. Pin labels can only contain letters, numbers and underscores.`);validLabels.length>0&&(validPinLabels[pin]=Array.isArray(labelOrLabels)?validLabels:validLabels[0])}return{validPinLabels:Object.keys(validPinLabels).length>0?validPinLabels:void 0,invalidPinLabelsMessages}}function isValidPinLabel(pin,label){try{let testProps={name:"test",footprint:"test",pinLabels:{[pin]:label}};return chipProps.safeParse(testProps).success}catch{return!1}}var NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES=["Silkscreen","PcbNote","Courtyard","FabricationNote"];function getBoundsOfPcbComponents(components){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,hasValidComponents=!1;for(let child of components)if(child.isPcbPrimitive&&!NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES.some(prefix=>child.componentName.startsWith(prefix))){let{x:x5,y:y5}=child._getGlobalPcbPositionBeforeLayout(),{width:width2,height:height2}=child.getPcbSize();minX=Math.min(minX,x5-width2/2),minY=Math.min(minY,y5-height2/2),maxX=Math.max(maxX,x5+width2/2),maxY=Math.max(maxY,y5+height2/2),hasValidComponents=!0}else if(child.children.length>0){let childBounds=getBoundsOfPcbComponents(child.children);(childBounds.width>0||childBounds.height>0)&&(minX=Math.min(minX,childBounds.minX),minY=Math.min(minY,childBounds.minY),maxX=Math.max(maxX,childBounds.maxX),maxY=Math.max(maxY,childBounds.maxY),hasValidComponents=!0)}if(!hasValidComponents)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let width=maxX-minX,height=maxY-minY;return width<0&&(width=0),height<0&&(height=0),{minX,minY,maxX,maxY,width,height}}function getRelativeDirection(pointA,pointB){let dx3=pointB.x-pointA.x,dy3=pointB.y-pointA.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}var stringProxy=new Proxy({},{get:(target,prop)=>prop}),FTYPE=stringProxy,SCHEMATIC_COMPONENT_OUTLINE_COLOR="rgba(132, 0, 0)",SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH=.12,areAllPcbPrimitivesOverlapping=pcbPrimitives=>{if(pcbPrimitives.length<=1)return!0;let bounds=pcbPrimitives.map(p4=>{let circuitBounds=p4._getPcbCircuitJsonBounds();return{left:circuitBounds.bounds.left,right:circuitBounds.bounds.right,top:circuitBounds.bounds.top,bottom:circuitBounds.bounds.bottom}}),overlaps=Array(bounds.length).fill(!1).map(()=>Array(bounds.length).fill(!1));for(let i2=0;i2<bounds.length;i2++)for(let j4=i2+1;j4<bounds.length;j4++){let a2=bounds[i2],b3=bounds[j4];overlaps[i2][j4]=overlaps[j4][i2]=!(a2.right<b3.left||a2.left>b3.right||a2.bottom>b3.top||a2.top<b3.bottom)}let visited=new Set,dfs=node=>{visited.add(node);for(let i2=0;i2<bounds.length;i2++)overlaps[node][i2]&&!visited.has(i2)&&dfs(i2)};return dfs(0),visited.size===bounds.length},getCenterOfPcbPrimitives=pcbPrimitives=>{if(pcbPrimitives.length===0)throw new Error("Cannot get center of empty PCB primitives array");let positions=pcbPrimitives.map(p4=>p4._getPcbCircuitJsonBounds().center).filter(Boolean),sumX=positions.reduce((sum,pos)=>sum+pos.x,0),sumY=positions.reduce((sum,pos)=>sum+pos.y,0);return{x:sumX/positions.length,y:sumY/positions.length}},portProps2=external_exports.object({name:external_exports.string().optional(),pinNumber:external_exports.number().optional(),schStemLength:external_exports.number().optional(),aliases:external_exports.array(external_exports.string()).optional(),layer:external_exports.string().optional(),layers:external_exports.array(external_exports.string()).optional(),schX:external_exports.number().optional(),schY:external_exports.number().optional(),direction:external_exports.enum(["up","down","left","right"]).optional(),connectsTo:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional()}),Port=class extends PrimitiveComponent2{constructor(props,opts={}){if(!props.name&&props.pinNumber!==void 0&&(props.name=`pin${props.pinNumber}`),!props.name)throw new Error("Port must have a name or a pinNumber");super(props);__publicField(this,"source_port_id",null);__publicField(this,"pcb_port_id",null);__publicField(this,"schematic_port_id",null);__publicField(this,"schematic_stem_line_id",null);__publicField(this,"schematicSymbolPortDef",null);__publicField(this,"matchedComponents");__publicField(this,"facingDirection",null);__publicField(this,"originDescription",null);opts.originDescription&&(this.originDescription=opts.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:portProps2}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo;if(!connectsTo)return[];let connectedPorts=[],connectsToArray=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let connection of connectsToArray){let port=this.getSubcircuit().selectOne(connection,{type:"port"});port&&connectedPorts.push(port)}return connectedPorts}_isBoardPinoutFromAttributes(){let parent=this.parent;if(parent?._parsedProps?.pinAttributes){let pinAttributes=parent._parsedProps.pinAttributes;for(let alias of this.getNameAndAliases())if(pinAttributes[alias]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let matchedPcbElm=this.matchedComponents.find(c3=>c3.isPcbPrimitive),parentComponent=this.parent;if(parentComponent&&!parentComponent.props.footprint)throw new Error(`${parentComponent.componentName} "${parentComponent.props.name}" does not have a footprint. Add a footprint prop, e.g. <${parentComponent.componentName.toLowerCase()} footprint="..." />`);if(!matchedPcbElm)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return matchedPcbElm?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db:db2}=this.root,pcb_port2=db2.pcb_port.get(this.pcb_port_id);return{center:{x:pcb_port2.x,y:pcb_port2.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let parent=this.parent;if(!parent||!parent._getInternallyConnectedPins)return[];let internallyConnectedPorts=parent._getInternallyConnectedPins();for(let ports of internallyConnectedPorts)if(ports.some(port=>port===this))return ports;return[]}_hasSchematicPort(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return!0;let parentNormalComponent=this.getParentNormalComponent();if(parentNormalComponent?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(p4=>p4.schematicSymbolPortDef));let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();return!!(parentBoxDim&&this.props.pinNumber!==void 0&&parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return{x:schX,y:schY};let parentNormalComponent=this.getParentNormalComponent(),symbol=parentNormalComponent?.getSchematicSymbol();if(symbol){let schematicSymbolPortDef=this.schematicSymbolPortDef;if(!schematicSymbolPortDef&&(schematicSymbolPortDef=this._getPortsInternallyConnectedToThisPort().find(p4=>p4.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!schematicSymbolPortDef))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let transform5=compose2(parentNormalComponent.computeSchematicGlobalTransform(),translate2(-symbol.center.x,-symbol.center.y));return applyToPoint2(transform5,schematicSymbolPortDef)}let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();if(parentBoxDim&&this.props.pinNumber!==void 0){let localPortPosition=parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber);if(!localPortPosition)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return applyToPoint2(parentNormalComponent.computeSchematicGlobalTransform(),localPortPosition)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db:db2}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let schematic_port2=db2.schematic_port.get(this.schematic_port_id);if(!schematic_port2)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return schematic_port2.center}registerMatch(component){this.matchedComponents.push(component)}getNameAndAliases(){let{_parsedProps:props}=this;return Array.from(new Set([...props.name?[props.name]:[],...props.aliases??[],...typeof props.pinNumber=="number"?[`pin${props.pinNumber}`,props.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let pinAttributes=this.parent?._parsedProps?.pinAttributes;if(!pinAttributes)return[];let matches=[];for(let alias of this.getNameAndAliases()){let attributes2=pinAttributes[alias];attributes2&&matches.push(attributes2)}return matches}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(attributes2=>attributes2.includeInBoardPinout===!0)}isMatchingPort(port){return this.isMatchingAnyOf(port.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer,layers}=this._parsedProps;return layers||(layer?[layer]:Array.from(new Set(this.matchedComponents.flatMap(c3=>c3.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(trace=>!trace._couldNotFindPort).filter(trace=>trace._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,port_hints=this.getNameAndAliases(),parentNormalComponent=this.getParentNormalComponent(),source_component_id=(this.parent?.source_component_id?this.parent:parentNormalComponent)?.source_component_id??null,pinAttributes=this._getMatchingPinAttributes(),portAttributesFromParent={};for(let attributes2 of pinAttributes)attributes2.mustBeConnected!==void 0&&(portAttributesFromParent.must_be_connected=attributes2.mustBeConnected);let source_port2=db2.source_port.insert({name:props.name,pin_number:props.pinNumber,port_hints,source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...portAttributesFromParent});this.source_port_id=source_port2.source_port_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentNormalComponent=this.getParentNormalComponent(),parentWithSourceId=this.parent?.source_component_id?this.parent:parentNormalComponent;if(this.isGroupPort()){db2.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!parentWithSourceId?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);db2.source_port.update(this.source_port_id,{source_component_id:parentWithSourceId.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=parentWithSourceId.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{matchedComponents}=this;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit=this.getSubcircuit(),pcb_port2=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port2.pcb_port_id;return}let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent;if(!parentWithPcbComponentId?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${parentNormalComponent?.getString()})`);let pcbMatches=matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1){if(!areAllPcbPrimitivesOverlapping(pcbMatches)){let portName=this.props.name,componentName=this.getParentNormalComponent()?.props.name??"unknown",altAliases=this.getNameAndAliases().filter(h4=>h4!==portName),altMsg=altAliases.length>0?` (consider using alternate aliases: ${altAliases.join(", ")})`:"";db2.source_ambiguous_port_reference.insert({error_type:"source_ambiguous_port_reference",message:`${componentName}.${portName} is ambiguous: ${componentName}.${portName} references multiple non-overlapping pads: ${pcbMatches.map(c3=>c3.getString()).join(", ")}${altMsg}`,source_port_id:this.source_port_id??void 0,source_component_id:this.getParentNormalComponent()?.source_component_id??void 0});return}matchCenter=getCenterOfPcbPrimitives(pcbMatches)}if(matchCenter){let subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}else{let pcbMatch=pcbMatches[0];throw new Error(`${pcbMatch.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit2=this.getSubcircuit(),pcb_port22=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit2?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port22.pcb_port_id;return}let pcbMatches=this.matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1)try{areAllPcbPrimitivesOverlapping(pcbMatches)&&(matchCenter=getCenterOfPcbPrimitives(pcbMatches))}catch{}if(!matchCenter)return;let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent,subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}_getBestDisplayPinLabel(){let{db:db2}=this.root,sourcePort=db2.source_port.get(this.source_port_id),labelHints=[];for(let portHint of sourcePort?.port_hints??[])portHint.match(/^(pin)?\d+$/)||portHint.match(/^(left|right)/)&&!sourcePort?.name.match(/^(left|right)/)||labelHints.push(portHint);if(this.getParentNormalComponent()?.props?.showPinAliases&&labelHints.length>0)return labelHints.join("/");if(labelHints.length>0)return labelHints[0]}doInitialSchematicPortRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{schX,schY}=props,container=schX!==void 0&&schY!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!container||!this._hasSchematicPort())return;let containerCenter=container._getGlobalSchematicPositionBeforeLayout(),portCenter=this._getGlobalSchematicPositionBeforeLayout(),localPortInfo=null,containerDims=container._getSchematicBoxDimensions();containerDims&&props.pinNumber!==void 0&&(localPortInfo=containerDims.getPortPositionByPinNumber(props.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&db2.schematic_debug_object.insert({shape:"rect",center:portCenter,size:{width:.1,height:.1},label:"obstacle"}),localPortInfo?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[localPortInfo.side]:this.facingDirection=getRelativeDirection(containerCenter,portCenter);let bestDisplayPinLabel=this._getBestDisplayPinLabel(),parentNormalComponent=this.getParentNormalComponent(),sideOfComponent=localPortInfo?.side??(props.direction==="up"?"top":props.direction==="down"?"bottom":props.direction),schematicPortInsertProps={type:"schematic_port",schematic_component_id:parentNormalComponent?.schematic_component_id,center:portCenter,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:props.schStemLength??.4,side_of_component:sideOfComponent,pin_number:props.pinNumber,true_ccw_index:localPortInfo?.trueIndex,display_pin_label:bestDisplayPinLabel,is_connected:!1};for(let attributes2 of this._getMatchingPinAttributes())attributes2.requiresPower&&(schematicPortInsertProps.has_input_arrow=!0),attributes2.providesPower&&(schematicPortInsertProps.has_output_arrow=!0);let schematic_port2=db2.schematic_port.insert(schematicPortInsertProps);if(this.schematic_port_id=schematic_port2.schematic_port_id,props.schStemLength!==void 0&&props.schStemLength!==0){let{schStemLength,direction:direction2}=props,x22=portCenter.x,y22=portCenter.y;direction2==="right"?x22-=schStemLength:direction2==="left"?x22+=schStemLength:direction2==="up"?y22-=schStemLength:direction2==="down"&&(y22+=schStemLength);let stemLine=db2.schematic_line.insert({schematic_component_id:parentNormalComponent?.schematic_component_id,x1:portCenter.x,y1:portCenter.y,x2:x22,y2:y22,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1});this.schematic_stem_line_id=stemLine.schematic_line_id}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_port_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,schPort=db2.schematic_port.get(this.schematic_port_id);if(schPort){let newCenter=applyToPoint2(transform5,schPort.center);if(db2.schematic_port.update(this.schematic_port_id,{center:newCenter}),this.schematic_stem_line_id){let line2=db2.schematic_line.get(this.schematic_stem_line_id);if(line2){let p12=applyToPoint2(transform5,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform5,{x:line2.x2,y:line2.y2});db2.schematic_line.update(this.schematic_stem_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y});let scaledStemLength=Math.sqrt((p12.x-p22.x)**2+(p12.y-p22.y)**2);db2.schematic_port.update(this.schematic_port_id,{distance_from_component_edge:scaledStemLength})}}}}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(newCenter){let{db:db2}=this.root;this.pcb_port_id&&db2.pcb_port.update(this.pcb_port_id,{x:newCenter.x,y:newCenter.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(c3=>c3.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},getPinNumberFromLabels=labels=>{let pinNumber=labels.find(p4=>/^(pin)?\d+$/.test(p4));return pinNumber?Number.parseInt(pinNumber.replace(/^pin/,"")):null};function getPortFromHints(hints,opts){let pinNumber=getPinNumberFromLabels(hints);if(!pinNumber)return null;let aliases2=[...hints.filter(p4=>p4.toString()!==pinNumber.toString()&&p4!==`pin${pinNumber}`&&p4.trim()!==""),...opts?.additionalAliases?.[`pin${pinNumber}`]??[]];return new Port({pinNumber,aliases:aliases2})}function getPinsFromSideDefinition(sideDefinition){return sideDefinition?Array.isArray(sideDefinition)?sideDefinition:sideDefinition.pins??[]:[]}var hasExplicitPinMapping=pa3=>{for(let side of["leftSide","rightSide","topSide","bottomSide"])if(side in pa3&&typeof pa3[side]=="number")throw new Error(`A number was specified for "${side}", you probably meant to use "size" not "side"`);return"leftSide"in pa3||"rightSide"in pa3||"topSide"in pa3||"bottomSide"in pa3},getSizeOfSidesFromPortArrangement=pa3=>{if(hasExplicitPinMapping(pa3))return{leftSize:getPinsFromSideDefinition(pa3.leftSide).length,rightSize:getPinsFromSideDefinition(pa3.rightSide).length,topSize:getPinsFromSideDefinition(pa3.topSide).length,bottomSize:getPinsFromSideDefinition(pa3.bottomSide).length};let{leftSize=0,rightSize=0,topSize=0,bottomSize=0}=pa3;return{leftSize,rightSize,topSize,bottomSize}},DEFAULT_SCHEMATIC_BOX_PADDING_MM=.4;function isExplicitPinMappingArrangement(arrangement){let a2=arrangement;return a2.leftSide!==void 0||a2.rightSide!==void 0||a2.topSide!==void 0||a2.bottomSide!==void 0}var getAllDimensionsForSchematicBox=params=>{let portDistanceFromEdge=params.portDistanceFromEdge??.4,sidePinCounts=params.schPortArrangement?getSizeOfSidesFromPortArrangement(params.schPortArrangement):null,sideLengths={left:0,right:0,top:0,bottom:0},pinCount=params.pinCount??null;if(pinCount===null)if(sidePinCounts)pinCount=sidePinCounts.leftSize+sidePinCounts.rightSize+sidePinCounts.topSize;else throw new Error("Could not determine pin count for the schematic box");if(pinCount&&!sidePinCounts){let rightSize=Math.floor(pinCount/2);sidePinCounts={leftSize:pinCount-rightSize,rightSize,topSize:0,bottomSize:0}}sidePinCounts||(sidePinCounts={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let getPinNumberUsingSideIndex=({side,sideIndex,truePinIndex:truePinIndex2})=>{if(!params.schPortArrangement||!isExplicitPinMappingArrangement(params.schPortArrangement))return truePinIndex2+1;let normalCcwDirection={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[side],directionAlongSide=params.schPortArrangement?.[`${side}Side`]?.direction??normalCcwDirection,pinsDefinitionForSide=params.schPortArrangement?.[`${side}Side`]?.pins,sideIndexWithDirectionCorrection=sideIndex;return directionAlongSide!==normalCcwDirection&&(sideIndexWithDirectionCorrection=pinsDefinitionForSide.length-sideIndex-1),parsePinNumberFromLabelsOrThrow(pinsDefinitionForSide[sideIndexWithDirectionCorrection],params.pinLabels)},orderedTruePorts=[],currentDistanceFromEdge=0,truePinIndex=0;for(let sideIndex=0;sideIndex<sidePinCounts.leftSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"left",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"left",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),sideIndex===sidePinCounts.leftSize-1?sideLengths.left=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.bottomSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"bottom",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"bottom",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),sideIndex===sidePinCounts.bottomSize-1?sideLengths.bottom=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.rightSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"right",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"right",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),sideIndex===sidePinCounts.rightSize-1?sideLengths.right=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.topSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"top",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"top",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),sideIndex===sidePinCounts.topSize-1?sideLengths.top=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}let resolvedSchWidth=params.schWidth;if(resolvedSchWidth===void 0){resolvedSchWidth=Math.max(sideLengths.top+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.bottom+DEFAULT_SCHEMATIC_BOX_PADDING_MM),params.pinLabels&&orderedTruePorts.filter(p4=>p4.side==="left"||p4.side==="right").some(p4=>params.pinLabels?.[`pin${p4.pinNumber}`]||params.pinLabels?.[p4.pinNumber])&&(resolvedSchWidth=Math.max(resolvedSchWidth,.5));let labelWidth=params.pinLabels?Math.max(...Object.values(params.pinLabels).map(label=>label.length*.1)):0,LABEL_PADDING=labelWidth>0?1.1:0;resolvedSchWidth=Math.max(resolvedSchWidth,labelWidth+LABEL_PADDING)}let schHeight=params.schHeight;schHeight||(schHeight=Math.max(sideLengths.left+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.right+DEFAULT_SCHEMATIC_BOX_PADDING_MM));let trueEdgePositions={left:{x:-resolvedSchWidth/2-portDistanceFromEdge,y:sideLengths.left/2},bottom:{x:-sideLengths.bottom/2,y:-schHeight/2-portDistanceFromEdge},right:{x:resolvedSchWidth/2+portDistanceFromEdge,y:-sideLengths.right/2},top:{x:sideLengths.top/2,y:schHeight/2+portDistanceFromEdge}},trueEdgeTraversalDirections={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},truePortsWithPositions=orderedTruePorts.map(p4=>{let{distanceFromOrthogonalEdge,side}=p4,edgePos=trueEdgePositions[side],edgeDir=trueEdgeTraversalDirections[side];return{x:edgePos.x+distanceFromOrthogonalEdge*edgeDir.x,y:edgePos.y+distanceFromOrthogonalEdge*edgeDir.y,...p4}});return{getPortPositionByPinNumber(pinNumber){let port=truePortsWithPositions.find(p4=>p4.pinNumber.toString()===pinNumber.toString());return port||null},getSize(){return{width:resolvedSchWidth,height:schHeight}},getSizeIncludingPins(){return{width:resolvedSchWidth+(sidePinCounts.leftSize||sidePinCounts.rightSize?.4:0),height:schHeight+(sidePinCounts.topSize||sidePinCounts.bottomSize?.4:0)}},pinCount}},getNumericSchPinStyle=(pinStyles,pinLabels)=>{if(!pinStyles)return;let numericPinStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels),pinStyleWithSideFirst={leftMargin:pinStyle.marginLeft??pinStyle.leftMargin,rightMargin:pinStyle.marginRight??pinStyle.rightMargin,topMargin:pinStyle.marginTop??pinStyle.topMargin,bottomMargin:pinStyle.marginBottom??pinStyle.bottomMargin};numericPinStyles[`pin${pinNumber}`]={...numericPinStyles[`pin${pinNumber}`],...pinStyleWithSideFirst}}return numericPinStyles},CadAssembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:cadassemblyProps}}},getFileExtension=filename=>{if(!filename)return null;let fragmentMatch=filename.match(/#ext=(\w+)$/);if(fragmentMatch)return fragmentMatch[1].toLowerCase();let sanitized=filename.split("?")[0].split("#")[0],lastSegment=sanitized.split("/").pop()??sanitized;return lastSegment.includes(".")?lastSegment.split(".").pop()?.toLowerCase()??null:null},joinUrlPath=(base,path)=>{let trimmedBase=base.replace(/\/+$/,""),trimmedPath=path.replace(/^\/+/,"");return`${trimmedBase}/${trimmedPath}`},constructAssetUrl=(targetUrl,baseUrl)=>{if(!baseUrl||!targetUrl.startsWith("/"))return targetUrl;try{let baseUrlObj=new URL(baseUrl);return baseUrlObj.pathname!=="/"&&targetUrl.startsWith(baseUrlObj.pathname)?new URL(targetUrl,baseUrlObj.origin).toString():joinUrlPath(baseUrl,targetUrl)}catch{return targetUrl}},rotation2=external_exports.union([external_exports.number(),external_exports.string()]),rotation3=external_exports.object({x:rotation2,y:rotation2,z:rotation2}),CadModel=class extends PrimitiveComponent2{get config(){return{componentName:"CadModel",zodProps:cadmodelProps}}doInitialCadModelRender(){let parent=this._findParentWithPcbComponent();if(!parent||!parent.pcb_component_id)return;let{db:db2}=this.root,{boardThickness=0}=parent._getBoard()??{},bounds=parent._getPcbCircuitJsonBounds(),pcb_component2=db2.pcb_component.get(parent.pcb_component_id),props=this._parsedProps;if(!props||typeof props.modelUrl!="string"&&typeof props.stepUrl!="string")return;let parentTransform=parent._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(parentTransform).rotation.angle*180/Math.PI,sourceRotationOffset=props.pcbRotationOffset??props.rotationOffset,rotationOffset=rotation3.parse({x:0,y:0,z:0});if(typeof sourceRotationOffset=="number")rotationOffset.z=Number(sourceRotationOffset);else if(typeof sourceRotationOffset=="object"){let parsed=rotation3.parse(sourceRotationOffset);rotationOffset.x=Number(parsed.x),rotationOffset.y=Number(parsed.y),rotationOffset.z=Number(parsed.z)}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),positionOffset=point32.parse({x:pcbX,y:pcbY,z:props.pcbZ??0,...typeof props.positionOffset=="object"?props.positionOffset:{}}),zOffsetFromSurface=props.zOffsetFromSurface!==void 0?distance.parse(props.zOffsetFromSurface):0,layer=parent.props.layer==="bottom"?"bottom":"top",ext=props.modelUrl?getFileExtension(props.modelUrl):void 0,modelUrlWithoutExtFragment=props.modelUrl?.replace(/#ext=\w+$/,""),urlProps={};if(ext==="stl"?urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="obj"?urlProps.model_obj_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="gltf"?urlProps.model_gltf_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="glb"?urlProps.model_glb_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="step"||ext==="stp"?urlProps.model_step_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="wrl"||ext==="vrml"?urlProps.model_wrl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment),props.stepUrl){let transformed=this._addCachebustToModelUrl(props.stepUrl);transformed&&(urlProps.model_step_url=transformed)}let cad=db2.cad_component.insert({position:{x:bounds.center.x+Number(positionOffset.x),y:bounds.center.y+Number(positionOffset.y),z:(layer==="bottom"?-boardThickness/2:boardThickness/2)+(layer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+Number(positionOffset.z)},rotation:{x:Number(rotationOffset.x),y:(layer==="top"?0:180)+Number(rotationOffset.y),z:layer==="bottom"?-(accumulatedRotation+Number(rotationOffset.z))+180:accumulatedRotation+Number(rotationOffset.z)},pcb_component_id:parent.pcb_component_id,model_board_normal_direction:props.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:props.modelOriginPosition,source_component_id:parent.source_component_id,model_unit_to_mm_scale_factor:typeof props.modelUnitToMmScale=="number"?props.modelUnitToMmScale:void 0,show_as_translucent_model:props.showAsTranslucentModel??parent._parsedProps.showAsTranslucentModel,...urlProps});this.cad_component_id=cad.cad_component_id}_findParentWithPcbComponent(){let p4=this.parent;for(;p4&&!p4.pcb_component_id;)p4=p4.parent;return p4}_addCachebustToModelUrl(url2){if(!url2)return url2;let baseUrl=this.root?.platform?.projectBaseUrl,transformedUrl=constructAssetUrl(url2,baseUrl);if(!transformedUrl.includes("modelcdn.tscircuit.com"))return transformedUrl;let origin=this.root?.getClientOrigin()??"";return`${transformedUrl}${transformedUrl.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}},debug22=(0,import_debug9.default)("tscircuit:core:footprint"),Footprint=class extends PrimitiveComponent2{get config(){return{componentName:"Footprint",zodProps:footprintProps}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let constraints=this.children.filter(child=>child.componentName==="Constraint");if(constraints.length===0)return;let{isFlipped}=this._getPcbPrimitiveFlippedHelpers(),maybeFlipLeftRight=props=>isFlipped&&"left"in props&&"right"in props?{...props,left:props.right,right:props.left}:props,involvedComponents=constraints.flatMap(constraint=>constraint._getAllReferencedComponents().componentsWithSelectors).map(({component,selector,componentSelector,edge})=>({component,selector,componentSelector,edge,bounds:component._getPcbCircuitJsonBounds()}));if(involvedComponents.some(c3=>c3.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function getComponentDetails(selector){return involvedComponents.find(({selector:s2})=>s2===selector)}let solver=new Solver,kVars={};function getKVar(name){return name in kVars||(kVars[name]=new Variable(name),solver.addEditVariable(kVars[name],Strength.weak)),kVars[name]}for(let{selector,bounds:bounds2}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);solver.suggestValue(kvx,bounds2.center.x),solver.suggestValue(kvy,bounds2.center.y)}for(let constraint of constraints){let props=constraint._parsedProps;if("xDist"in props){let{xDist,left,right,edgeToEdge,centerToCenter}=maybeFlipLeftRight(props),leftVar=getKVar(`${left}_x`),rightVar=getKVar(`${right}_x`),leftBounds=getComponentDetails(left)?.bounds,rightBounds=getComponentDetails(right)?.bounds;if(centerToCenter){let expr=new Expression(rightVar,[-1,leftVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(rightVar,-rightBounds.width/2,[-1,leftVar],-leftBounds.width/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}}else if("yDist"in props){let{yDist,top,bottom,edgeToEdge,centerToCenter}=props,topVar=getKVar(`${top}_y`),bottomVar=getKVar(`${bottom}_y`),topBounds=getComponentDetails(top)?.bounds,bottomBounds=getComponentDetails(bottom)?.bounds;if(centerToCenter){let expr=new Expression(topVar,[-1,bottomVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(topVar,topBounds.height/2,[-1,bottomVar],-bottomBounds.height/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}}else if("sameY"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_y`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}else if("sameX"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_x`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}}solver.updateVariables(),debug22.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(kVars).map(([key,kvar])=>({var:key,val:kvar.value()}))));let bounds={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector,bounds:{width,height}}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`),newLeft=kvx.value()-width/2,newRight=kvx.value()+width/2,newTop=kvy.value()+height/2,newBottom=kvy.value()-height/2;bounds.left=Math.min(bounds.left,newLeft),bounds.right=Math.max(bounds.right,newRight),bounds.top=Math.max(bounds.top,newTop),bounds.bottom=Math.min(bounds.bottom,newBottom)}let globalOffset={x:-(bounds.right+bounds.left)/2,y:-(bounds.top+bounds.bottom)/2},containerPos=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();globalOffset.x+=containerPos.x,globalOffset.y+=containerPos.y;for(let{component,selector}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);component._setPositionFromLayout({x:kvx.value()+globalOffset.x,y:kvy.value()+globalOffset.y})}}},NormalComponent__getMinimumFlexContainerSize=component=>{let{db:db2}=component.root;if(component.pcb_component_id){let pcbComponent=db2.pcb_component.get(component.pcb_component_id);return pcbComponent?{width:pcbComponent.width,height:pcbComponent.height}:null}if(component.pcb_group_id){let pcbGroup=db2.pcb_group.get(component.pcb_group_id);if(!pcbGroup)return null;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:null}return{width:pcbGroup.width??0,height:pcbGroup.height??0}}return null},NormalComponent__repositionOnPcb=(component,position2)=>{let{db:db2}=component.root,allCircuitJson=db2.toArray();if(component.pcb_component_id){repositionPcbComponentTo(allCircuitJson,component.pcb_component_id,position2);return}if(component.source_group_id){repositionPcbGroupTo(allCircuitJson,component.source_group_id,position2);return}throw new Error(`Cannot reposition component ${component.getString()}: no pcb_component_id or source_group_id`)};function NormalComponent_doInitialPcbComponentAnchorAlignment(component){if(component.root?.pcbDisabled||!component.pcb_component_id)return;let{pcbX,pcbY}=component._parsedProps,pcbPositionAnchor=component.props?.pcbPositionAnchor;if(!pcbPositionAnchor||pcbX===void 0&&pcbY===void 0)return;let bounds=getBoundsOfPcbComponents(component.children);if(bounds.width===0||bounds.height===0)return;let currentCenter={...{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor)){let b3={left:bounds.minX,right:bounds.maxX,top:bounds.minY,bottom:bounds.maxY};switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:b3.left,y:b3.top};break;case"top_center":anchorPos={x:currentCenter.x,y:b3.top};break;case"top_right":anchorPos={x:b3.right,y:b3.top};break;case"center_left":anchorPos={x:b3.left,y:currentCenter.y};break;case"center_right":anchorPos={x:b3.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:b3.left,y:b3.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:b3.bottom};break;case"bottom_right":anchorPos={x:b3.right,y:b3.bottom};break}}else try{let port=component.portMap[pcbPositionAnchor];port&&(anchorPos=port._getGlobalPcbPositionBeforeLayout())}catch{}if(!anchorPos)return;let newCenter={...currentCenter};pcbX!==void 0&&(newCenter.x+=pcbX-anchorPos.x),pcbY!==void 0&&(newCenter.y+=pcbY-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&component._repositionOnPcb(newCenter)}var isHttpUrl=s2=>s2.startsWith("http://")||s2.startsWith("https://"),parseLibraryFootprintRef=s2=>{if(isHttpUrl(s2))return null;let idx=s2.indexOf(":");if(idx<=0)return null;let footprintLib=s2.slice(0,idx),footprintName=s2.slice(idx+1);return!footprintLib||!footprintName?null:{footprintLib,footprintName}},isStaticAssetPath=s2=>s2.startsWith("/")||s2.startsWith("./"),resolveStaticFileImportDebug=(0,import_debug10.default)("tscircuit:core:resolveStaticFileImport");async function resolveStaticFileImport(path,platform){if(!path)return path;let normalizedPath=path.startsWith("./")?path.slice(1):path,resolver=platform?.resolveProjectStaticFileImportUrl;if(resolver&&(path.startsWith("/")||path.startsWith("./")))try{let resolved=await resolver(normalizedPath);if(resolved)return resolved}catch(error){resolveStaticFileImportDebug("failed to resolve static file via platform resolver",error)}return constructAssetUrl(normalizedPath,platform?.projectBaseUrl)}function NormalComponent_doInitialPcbFootprintStringRender(component,queueAsyncEffect){let{footprint}=component.props;if(footprint??(footprint=component._getImpliedFootprintString?.()),!footprint)return;let{pcbRotation,pinLabels,pcbPinLabels}=component.props,fileExtension=getFileExtension(String(footprint)),footprintParser=fileExtension?component.root?.platform?.footprintFileParserMap?.[fileExtension]:null;if(typeof footprint=="string"&&(isHttpUrl(footprint)||isStaticAssetPath(footprint))&&footprintParser){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0,queueAsyncEffect("load-footprint-from-platform-file-parser",async()=>{let footprintUrl=isHttpUrl(footprint)?footprint:await resolveStaticFileImport(footprint,component.root?.platform);try{let result=await footprintParser.loadFromUrl(footprintUrl),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprintUrl,pinLabels,pcbPinLabels},result.footprintCircuitJson);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load footprint "${footprintUrl}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprintUrl});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"&&isHttpUrl(footprint)){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let url2=footprint;queueAsyncEffect("load-footprint-url",async()=>{try{let res2=await fetch(url2);if(!res2.ok)throw new Error(`Failed to fetch footprint: ${res2.status}`);let soup=await res2.json(),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:url2,pinLabels,pcbPinLabels},soup);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${url2}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:url2});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"){let libRef=parseLibraryFootprintRef(footprint);if(!libRef||component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let libMap=component.root?.platform?.footprintLibraryMap?.[libRef.footprintLib],resolverFn;if(typeof libMap=="function"&&(resolverFn=libMap),!resolverFn)return;queueAsyncEffect("load-lib-footprint",async()=>{try{let result=await resolverFn(libRef.footprintName),circuitJson=null;if(Array.isArray(result)?circuitJson=result:Array.isArray(result.footprintCircuitJson)&&(circuitJson=result.footprintCircuitJson),!circuitJson)return;let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},circuitJson),fpWrapper=new Footprint({src:footprint});for(let c3 of fpComponents)fpWrapper.add(c3);component.add(fpWrapper),!Array.isArray(result)&&result.cadModel&&(component._asyncFootprintCadModel=result.cadModel);for(let child of component.children)child.componentName==="Port"&&child._markDirty?.("PcbPortRender");component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${footprint}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprint});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(!(0,import_react3.isValidElement)(footprint)&&footprint.componentName==="Footprint"&&component.add(footprint),Array.isArray(footprint)&&!(0,import_react3.isValidElement)(footprint)&&footprint.length>0){try{let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:"",pinLabels,pcbPinLabels},footprint);component.addAll(fpComponents)}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load json footprint: `+(err instanceof Error?err.message:String(err)),errorObj=circuit_json_footprint_load_error.parse({type:"circuit_json_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0});db2.circuit_json_footprint_load_error.insert(errorObj)}throw err}return}}function getPcbTextBounds(text){let fontSize=text.font_size,textWidth=text.text.length*fontSize*.6,textHeight=fontSize,anchorAlignment=text.anchor_alignment||"center",centerX=text.anchor_position.x,centerY=text.anchor_position.y;switch(anchorAlignment){case"top_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"top_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y+textHeight/2;break;case"top_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"center_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y;break;case"center":centerX=text.anchor_position.x,centerY=text.anchor_position.y;break;case"center_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y;break;case"bottom_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;default:centerX=text.anchor_position.x,centerY=text.anchor_position.y;break}return{x:centerX-textWidth/2,y:centerY-textHeight/2,width:textWidth,height:textHeight}}function NormalComponent_doInitialSilkscreenOverlapAdjustment(component){if(!component._adjustSilkscreenTextAutomatically||component.root?.pcbDisabled||!component.pcb_component_id)return;let{db:db2}=component.root,componentCenter=component._getPcbCircuitJsonBounds().center,silkscreenTexts=db2.pcb_silkscreen_text.list({pcb_component_id:component.pcb_component_id}).filter(text=>text.text===component.name);if(silkscreenTexts.length===0)return;let obstacleBounds=component.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(comp=>comp!==component&&comp.pcb_component_id).map(comp=>{let bounds=comp._getPcbCircuitJsonBounds(),box2={center:bounds.center,width:bounds.width,height:bounds.height};return getBoundingBox(box2)});for(let silkscreenText of silkscreenTexts){let currentPosition=silkscreenText.anchor_position,textBounds=getPcbTextBounds(silkscreenText),textBox={center:{x:textBounds.x+textBounds.width/2,y:textBounds.y+textBounds.height/2},width:textBounds.width,height:textBounds.height},textBoundsBox=getBoundingBox(textBox);if(!obstacleBounds.some(obstacle=>doBoundsOverlap(textBoundsBox,obstacle)))continue;let flippedX=2*componentCenter.x-currentPosition.x,flippedY=2*componentCenter.y-currentPosition.y,flippedTextBox={center:{x:flippedX,y:flippedY},width:textBounds.width,height:textBounds.height},flippedTextBounds=getBoundingBox(flippedTextBox);obstacleBounds.some(obstacle=>doBoundsOverlap(flippedTextBounds,obstacle))||db2.pcb_silkscreen_text.update(silkscreenText.pcb_silkscreen_text_id,{anchor_position:{x:flippedX,y:flippedY}})}}var NormalComponent_doInitialSourceDesignRuleChecks=component=>{let{db:db2}=component.root;if(!component.source_component_id)return;let ports=component.selectAll("port"),traces=db2.source_trace.list(),connected=new Set;for(let trace of traces)for(let id2 of trace.connected_source_port_ids)connected.add(id2);let internalGroups=component._getInternallyConnectedPins();for(let group of internalGroups)if(group.some(p4=>p4.source_port_id&&connected.has(p4.source_port_id)))for(let p4 of group)p4.source_port_id&&connected.add(p4.source_port_id);for(let port of ports)port.source_port_id&&shouldCheckPortForMissingTrace(component,port)&&(connected.has(port.source_port_id)||db2.source_pin_missing_trace_warning.insert({message:`Port ${port.getNameAndAliases()[0]} on ${component.props.name} is missing a trace`,source_component_id:component.source_component_id,source_port_id:port.source_port_id,subcircuit_id:component.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"}))},shouldCheckPortForMissingTrace=(component,port)=>{if(component.config.componentName==="Interconnect")return!1;if(component.config.componentName==="Chip"){let pinAttributes=component.props.pinAttributes;if(!pinAttributes)return!1;for(let alias of port.getNameAndAliases()){let attrs=pinAttributes[alias];if(attrs?.requiresPower||attrs?.requiresGround||attrs?.requiresVoltage!==void 0)return!0}return!1}return!0},debug32=(0,import_debug6.default)("tscircuit:core"),rotation32=external_exports.object({x:rotation,y:rotation,z:rotation}),NormalComponent3=class extends PrimitiveComponent2{constructor(props){let filteredProps={...props},invalidPinLabelsMessages=[];if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let{validPinLabels,invalidPinLabelsMessages:messages}=filterPinLabels(filteredProps.pinLabels);filteredProps.pinLabels=validPinLabels,invalidPinLabelsMessages=messages}super(filteredProps);__publicField(this,"reactSubtrees",[]);__publicField(this,"_impliedFootprint");__publicField(this,"_resolvedPcbCalcOffsetX");__publicField(this,"_resolvedPcbCalcOffsetY");__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"_isNormalComponent",!0);__publicField(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});__publicField(this,"_asyncSupplierPartNumbers");__publicField(this,"_asyncFootprintCadModel");__publicField(this,"_isCadModelChild");__publicField(this,"pcb_missing_footprint_error_id");__publicField(this,"_hasStartedFootprintUrlLoad",!1);__publicField(this,"_invalidPinLabelMessages",[]);__publicField(this,"_adjustSilkscreenTextAutomatically",!1);this._invalidPinLabelMessages=invalidPinLabelsMessages,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return(this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames).map(pinGroup=>pinGroup.map(pin=>typeof pin=="number"?`pin${pin}`:pin))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let root=this.root;if((this.getSubcircuit().getNormalComponentNameMap?.()?.get(this.props.name)??[]).filter(component=>component!==this&&component.renderPhaseStates.SourceNameDuplicateComponentRemoval.initialized).length>0){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout();root.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:pcbPosition2,schematic_center:schematicPosition}),this.shouldBeRemoved=!0;let childrenToRemove=[...this.children];for(let child of childrenToRemove)this.remove(child)}}initPorts(opts={}){if(this.root?.schematicDisabled)return;let{config}=this,portsToCreate=[],schPortArrangement=this._getSchematicPortArrangement();if(schPortArrangement&&!this._parsedProps.pinLabels){for(let side in schPortArrangement){let pins=schPortArrangement[side].pins;if(Array.isArray(pins))for(let pinNumberOrLabel of pins){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNumberOrLabel,this._parsedProps.pinLabels);portsToCreate.push(new Port({pinNumber,aliases:opts.additionalAliases?.[`pin${pinNumber}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let sides=["left","right","top","bottom"],pinNum=1;for(let side of sides){let size2=schPortArrangement[`${side}Size`];for(let i2=0;i2<size2;i2++)portsToCreate.push(new Port({pinNumber:pinNum++,aliases:opts.additionalAliases?.[`pin${pinNum}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let pinLabels=this._parsedProps.pinLabels;if(pinLabels)for(let[pinNumber,label]of Object.entries(pinLabels)){pinNumber=pinNumber.replace("pin","");let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber)),primaryLabel=Array.isArray(label)?label[0]:label,otherLabels=Array.isArray(label)?label.slice(1):[];existingPort?(existingPort.externallyAddedAliases.push(primaryLabel,...otherLabels),existingPort.props.name=primaryLabel):(existingPort=new Port({pinNumber:parseInt(pinNumber),name:primaryLabel,aliases:[...otherLabels,...opts.additionalAliases?.[`pin${parseInt(pinNumber)}`]??[]]},{originDescription:`pinLabels:pin${pinNumber}`}),portsToCreate.push(existingPort))}if(config.schematicSymbolName&&!opts.ignoreSymbolPorts){let sym=Vf[this._getSchematicSymbolNameOrThrow()];if(!sym)return;for(let symPort of sym.ports){let pinNumber=getPinNumberFromLabels(symPort.labels);if(!pinNumber)continue;let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber));if(existingPort)existingPort.schematicSymbolPortDef=symPort;else{let port=getPortFromHints(symPort.labels.concat(opts.additionalAliases?.[`pin${pinNumber}`]??[]));port&&(port.originDescription=`schematicSymbol:labels[0]:${symPort.labels[0]}`,port.schematicSymbolPortDef=symPort,portsToCreate.push(port))}}this.addAll(portsToCreate)}if(!this._getSchematicPortArrangement()){let hasReactSymbol=(0,import_react2.isValidElement)(this.props.symbol),symbolAlreadyAdded=this.children.some(c3=>c3.componentName==="Symbol");if(!(hasReactSymbol&&!symbolAlreadyAdded)){let portsFromFootprint=this.getPortsFromFootprint(opts),existingPorts=this._getAllPortsFromChildren();for(let port of portsFromFootprint){let alreadyInPortsToCreate=portsToCreate.some(p4=>p4.isMatchingAnyOf(port.getNameAndAliases())),alreadyInExistingPorts=existingPorts.some(p4=>p4.isMatchingAnyOf(port.getNameAndAliases()));!alreadyInPortsToCreate&&!alreadyInExistingPorts&&portsToCreate.push(port)}}}let requiredPinCount=opts.pinCount??this._getPinCount()??0;for(let pn3=1;pn3<=requiredPinCount;pn3++){if(portsToCreate.find(p4=>p4._parsedProps.pinNumber===pn3))continue;if(!schPortArrangement){portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]}));continue}let explicitlyListedPinNumbersInSchPortArrangement=[...getPinsFromSideDefinition(schPortArrangement.leftSide),...getPinsFromSideDefinition(schPortArrangement.rightSide),...getPinsFromSideDefinition(schPortArrangement.topSide),...getPinsFromSideDefinition(schPortArrangement.bottomSide)].map(pn22=>parsePinNumberFromLabelsOrThrow(pn22,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(key=>key in schPortArrangement)&&(explicitlyListedPinNumbersInSchPortArrangement=Array.from({length:this._getPinCount()},(_5,i2)=>i2+1)),explicitlyListedPinNumbersInSchPortArrangement.includes(pn3)&&portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${pn3}`}))}portsToCreate.length>0&&this.addAll(portsToCreate)}_getImpliedFootprintString(){return null}_addChildrenFromStringFootprint(){let{pcbRotation,pinLabels,pcbPinLabels}=this.props,{footprint}=this.props;if(footprint??(footprint=this._getImpliedFootprintString?.()),!!footprint&&typeof footprint=="string"){if(isHttpUrl(footprint)||isStaticAssetPath(footprint)||parseLibraryFootprintRef(footprint))return;let fpSoup=fp.string(footprint).soup(),fpComponents=createComponentsFromCircuitJson({componentName:this.name??this.componentName,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},fpSoup);this.addAll(fpComponents)}}get portMap(){return new Proxy({},{get:(target,prop)=>{let port=this.children.find(c3=>c3.componentName==="Port"&&c3.isMatchingNameOrAlias(prop));if(!port)throw new Error(`There was an issue finding the port "${prop.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return port}})}getInstanceForReactElement(element){for(let subtree of this.reactSubtrees)if(subtree.element===element)return subtree.component;return null}doInitialSourceRender(){let ftype=this.config.sourceFtype;if(!ftype)return;let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype,name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id2=>id2!==null);sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root;if(this._invalidPinLabelMessages?.length&&this.root?.db)for(let message of this._invalidPinLabelMessages){let property_name="pinLabels",match2=message.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);match2&&(property_name=`pinLabels['${match2[2]}']`),this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name,message,error_type:"source_property_ignored_warning"})}let{schematicSymbolName}=this.config,{_parsedProps:props}=this;props.symbol&&(0,import_react2.isValidElement)(props.symbol)?this._doInitialSchematicComponentRenderWithReactSymbol(props.symbol):schematicSymbolName?this._doInitialSchematicComponentRenderWithSymbol():this._getSchematicBoxDimensions()&&this._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let manualPlacement=this.getSubcircuit()?._getSchematicManualPlacementForComponent(this);if(this.schematic_component_id&&(this.props.schX!==void 0||this.props.schY!==void 0)&&manualPlacement){if(!this.schematic_component_id)return;let warning=schematic_manual_edit_conflict_warning.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:this.schematic_component_id,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.schematic_manual_edit_conflict_warning.insert(warning)}}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let internallyConnectedPorts=[];for(let netPortNames of this.internallyConnectedPinNames){let ports=[];for(let portName of netPortNames)ports.push(this.portMap[portName]);internallyConnectedPorts.push(ports)}return internallyConnectedPorts}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,symbol_name=this._getSchematicSymbolNameOrThrow(),symbol=Vf[symbol_name],center2=this._getGlobalSchematicPositionBeforeLayout();if(symbol){let schematic_component2=db2.schematic_component.insert({center:center2,size:{...symbol.size},source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name,symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=schematic_component2.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(symbolElement){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,center2=this._getGlobalSchematicPositionBeforeLayout(),schematic_component2=db2.schematic_component.insert({center:center2,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1});this.schematic_component_id=schematic_component2.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,dimensions=this._getSchematicBoxDimensions(),primaryPortLabels={};if(Array.isArray(props.pinLabels))props.pinLabels.forEach((label,index)=>{primaryPortLabels[String(index+1)]=label});else for(let[port,label]of Object.entries(props.pinLabels??{}))primaryPortLabels[port]=Array.isArray(label)?label[0]:label;let center2=this._getGlobalSchematicPositionBeforeLayout(),schPortArrangement=this._getSchematicPortArrangement(),schematic_component2=db2.schematic_component.insert({center:center2,rotation:props.schRotation??0,size:dimensions.getSize(),port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:props.schPinSpacing??.2,pin_styles:underscorifyPinStyles(props.schPinStyle,props.pinLabels),port_labels:primaryPortLabels,source_component_id:this.source_component_id}),hasTopOrBottomPins=schPortArrangement?.topSide!==void 0||schPortArrangement?.bottomSide!==void 0,schematic_box_width=dimensions?.getSize().width,schematic_box_height=dimensions?.getSize().height,manufacturer_part_number_schematic_text=db2.schematic_text.insert({text:props.manufacturerPartNumber??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.35:center2.y-(schematic_box_height??0)/2-.13},color:"#006464",font_size:.18}),component_name_text=db2.schematic_text.insert({text:props.displayName??props.name??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.55:center2.y+(schematic_box_height??0)/2+.13},color:"#006464",font_size:.18});this.schematic_component_id=schematic_component2.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error)}let globalTransform=this._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,pcb_component2=db2.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??accumulatedRotation,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0}),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c3=>c3.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this.isGroup){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}this.pcb_component_id=pcb_component2.pcb_component_id;let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&manualPlacement){let warning=pcb_manual_edit_conflict_warning.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_manual_edit_conflict_warning.insert(warning)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,bounds=getBoundsOfPcbComponents(this.children);if(bounds.width===0||bounds.height===0)return;let center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2};db2.pcb_component.update(this.pcb_component_id,{center:center2,width:bounds.width,height:bounds.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db:db2}=this.root;if(!db2.schematic_component.get(this.schematic_component_id))return;let schematicElements=[],collectSchematicPrimitives=children=>{for(let child of children){if(child.isSchematicPrimitive&&child.componentName==="SchematicLine"){let line2=db2.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicRect"){let rect=db2.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}if(child.isSchematicPrimitive&&child.componentName==="SchematicCircle"){let circle2=db2.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicArc"){let arc2=db2.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicText"){let text=db2.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}if(child.isSchematicPrimitive&&child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db2.schematic_path.get(pathId);path&&schematicElements.push(path)}}child.children&&child.children.length>0&&collectSchematicPrimitives(child.children)}};if(collectSchematicPrimitives(this.children),schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements),width=Math.abs(bounds.maxX-bounds.minX),height=Math.abs(bounds.maxY-bounds.minY);if(width===0&&height===0)return;let centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;db2.schematic_component.update(this.schematic_component_id,{center:{x:centerX,y:centerY},size:{width,height}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){NormalComponent_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(element){let component=createInstanceFromReactElement(element);return{element,component}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}doInitialReactSubtreesRender(){let fpElm=this.props.footprint;(0,import_react2.isValidElement)(fpElm)&&(this.children.some(c3=>c3.componentName==="Footprint")||this.add(fpElm));let symElm=this.props.symbol;(0,import_react2.isValidElement)(symElm)&&(this.children.some(c3=>c3.componentName==="Symbol")||this.add(symElm));let cmElm=this.props.cadModel;if((0,import_react2.isValidElement)(cmElm)){this._isCadModelChild=!0;let hasCadAssemblyChild=this.children.some(c3=>c3.componentName==="CadAssembly"),hasCadModelChild=this.children.some(c3=>c3.componentName==="CadModel");!hasCadAssemblyChild&&!hasCadModelChild&&this.add(cmElm)}}doInitialPcbFootprintStringRender(){NormalComponent_doInitialPcbFootprintStringRender(this,(name,effect)=>this._queueAsyncEffect(name,effect))}_getAllPortsFromChildren(){let ports=[],collectPorts=component=>{component.componentName==="Port"&&ports.push(component);for(let child of component.children)collectPorts(child)};for(let child of this.children)collectPorts(child);return ports}_hasExistingPortExactly(port1){return this._getAllPortsFromChildren().some(port2=>{let aliases1=port1.getNameAndAliases(),aliases2=port2.getNameAndAliases();return aliases1.length===aliases2.length&&aliases1.every(alias=>aliases2.includes(alias))})}_hasMatchingPort(port1){let existingPorts=this._getAllPortsFromChildren(),pinNumber1=port1._parsedProps.pinNumber;return pinNumber1===void 0?!1:existingPorts.some(port2=>port2._parsedProps.pinNumber===pinNumber1)}add(componentOrElm){let component;if((0,import_react2.isValidElement)(componentOrElm)){let subtree=this._renderReactSubtree(componentOrElm);this.reactSubtrees.push(subtree),component=subtree.component}else component=componentOrElm;if(component.componentName==="Port"){if(this._hasExistingPortExactly(component))return;if(this._hasMatchingPort(component)){debug32(`Skipping port ${component} because a matching port already exists`);return}}super.add(component)}getPortsFromFootprint(opts){let{footprint}=this.props;if(typeof footprint=="string"&&parseLibraryFootprintRef(footprint)&&this.children.some(c3=>c3.componentName==="Footprint")?footprint=this.children.find(c3=>c3.componentName==="Footprint"):(!footprint||(0,import_react2.isValidElement)(footprint))&&(footprint=this.children.find(c3=>c3.componentName==="Footprint")),typeof footprint=="string"){if(isHttpUrl(footprint))return[];if(isStaticAssetPath(footprint))return[];if(parseLibraryFootprintRef(footprint))return[];let fpSoup=fp.string(footprint).soup(),newPorts2=[];for(let elm of fpSoup)if("port_hints"in elm&&elm.port_hints){let newPort=getPortFromHints(elm.port_hints,opts);if(!newPort)continue;newPort.originDescription=`footprint:string:${footprint}:port_hints[0]:${elm.port_hints[0]}`,newPorts2.push(newPort)}return newPorts2}if(!(0,import_react2.isValidElement)(footprint)&&footprint&&footprint.componentName==="Footprint"){let fp22=footprint,pinNumber=1,newPorts2=[];for(let fpChild of fp22.children){if(!fpChild.props.portHints)continue;let filteredPortHints=fpChild.props.portHints.filter(hint=>hint&&hint.trim()!=="");if(filteredPortHints.length===0)continue;let portHintsList=filteredPortHints;portHintsList.some(hint=>hint.startsWith("pin"))||(portHintsList=[...portHintsList,`pin${pinNumber}`]),pinNumber++;let newPort=getPortFromHints(portHintsList);newPort&&(newPort.originDescription=`footprint:${footprint}`,newPorts2.push(newPort))}return newPorts2}let newPorts=[];if(!footprint){for(let child of this.children)if(child.props.portHints&&child.isPcbPrimitive){let port=getPortFromHints(child.props.portHints);port&&newPorts.push(port)}}return newPorts}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config}=this;if(!config.schematicSymbolName)return[];let symbol=Vf[config.schematicSymbolName];if(!symbol)return[];let newPorts=[];for(let symbolPort of symbol.ports){let port=getPortFromHints(symbolPort.labels);port&&(port.schematicSymbolPortDef=symbolPort,newPorts.push(port))}return newPorts}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:props}=this,propsWithConnections=[];if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)propsWithConnections.push(String(targetPath))}return propsWithConnections}_createNetsFromProps(propsWithConnections){createNetsFromProps(this,propsWithConnections)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let pcb_component2=db2.pcb_component.get(this.pcb_component_id);return{center:{x:pcb_component2.center.x,y:pcb_component2.center.y},bounds:{left:pcb_component2.center.x-pcb_component2.width/2,top:pcb_component2.center.y-pcb_component2.height/2,right:pcb_component2.center.x+pcb_component2.width/2,bottom:pcb_component2.center.y+pcb_component2.height/2},width:pcb_component2.width,height:pcb_component2.height}}_getPinCountFromSchematicPortArrangement(){let schPortArrangement=this._getSchematicPortArrangement();if(!schPortArrangement)return 0;if(!isExplicitPinMappingArrangement(schPortArrangement))return(schPortArrangement.leftSize??schPortArrangement.leftPinCount??0)+(schPortArrangement.rightSize??schPortArrangement.rightPinCount??0)+(schPortArrangement.topSize??schPortArrangement.topPinCount??0)+(schPortArrangement.bottomSize??schPortArrangement.bottomPinCount??0);let{leftSide,rightSide,topSide,bottomSide}=schPortArrangement;return Math.max(...leftSide?.pins??[],...rightSide?.pins??[],...topSide?.pins??[],...bottomSide?.pins??[])}_getPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let portsFromFootprint=this.getPortsFromFootprint();if(portsFromFootprint.length>0)return portsFromFootprint.length;let{pinLabels}=this._parsedProps;if(pinLabels){if(Array.isArray(pinLabels))return pinLabels.length;let pinNumbers=Object.keys(pinLabels).map(k4=>k4.startsWith("pin")?parseInt(k4.slice(3)):parseInt(k4)).filter(n3=>!Number.isNaN(n3));return pinNumbers.length>0?Math.max(...pinNumbers):Object.keys(pinLabels).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let ports=this.selectAll("port"),pinLabels={};for(let port of ports){let pinNumber=port.props.pinNumber;if(pinNumber!==void 0){let bestLabel=port._getBestDisplayPinLabel();bestLabel&&(pinLabels[`pin${pinNumber}`]=bestLabel)}}return pinLabels}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPinCount(),pinSpacing=props.schPinSpacing??.2,allPinLabels={...this._getPinLabelsFromPorts(),...props.pinLabels};return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(props.schPinStyle,allPinLabels),pinCount,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:allPinLabels})}getFootprinterString(){return typeof this._parsedProps.footprint=="string"?this._parsedProps.footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db:db2}=this.root,{boardThickness=0}=this._getBoard()??{},cadModelProp2=this._parsedProps.cadModel,cadModel=cadModelProp2===void 0?this._asyncFootprintCadModel:cadModelProp2,footprint=this.getFootprinterString()??this._getImpliedFootprintString();if(!this.pcb_component_id||!cadModel&&!footprint||cadModel===null)return;let bounds=this._getPcbCircuitJsonBounds();if(typeof cadModel=="string")throw new Error("String cadModel not yet implemented");let sourceRotationOffset=cadModel?.pcbRotationOffset??cadModel?.rotationOffset,rotationOffset=rotation32.parse({x:0,y:0,z:typeof sourceRotationOffset=="number"?sourceRotationOffset:0,...typeof sourceRotationOffset=="object"?sourceRotationOffset:{}}),positionOffset=point3.parse({x:0,y:0,z:0,...typeof cadModel?.positionOffset=="object"?cadModel.positionOffset:{}}),zOffsetFromSurface=cadModel&&typeof cadModel=="object"&&"zOffsetFromSurface"in cadModel&&cadModel.zOffsetFromSurface!==void 0?distance.parse(cadModel.zOffsetFromSurface):0,computedLayer=this.props.layer==="bottom"?"bottom":"top",pcbComponent=db2.pcb_component.get(this.pcb_component_id),globalTransform=this._computePcbGlobalTransformBeforeLayout(),preLayoutRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,totalRotation=pcbComponent?.position_mode==="packed"?pcbComponent.rotation??preLayoutRotation:preLayoutRotation,isBottomLayer=computedLayer==="bottom",rotationWithOffset=totalRotation+(rotationOffset.z??0),cadRotationZ=normalizeDegrees(rotationWithOffset),cad_model=db2.cad_component.insert({position:{x:bounds.center.x+positionOffset.x,y:bounds.center.y+positionOffset.y,z:(computedLayer==="bottom"?-boardThickness/2:boardThickness/2)+(computedLayer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+positionOffset.z},rotation:{x:rotationOffset.x,y:rotationOffset.y+(isBottomLayer?180:0),z:normalizeDegrees(isBottomLayer?-cadRotationZ:cadRotationZ)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stlUrl):void 0,model_obj_url:"objUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.objUrl):void 0,model_mtl_url:"mtlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.gltfUrl):void 0,model_glb_url:"glbUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.glbUrl):void 0,model_step_url:"stepUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stepUrl):void 0,model_wrl_url:"wrlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.wrlUrl):void 0,model_jscad:"jscad"in(cadModel??{})?cadModel.jscad:void 0,model_unit_to_mm_scale_factor:typeof cadModel?.modelUnitToMmScale=="number"?cadModel.modelUnitToMmScale:void 0,model_board_normal_direction:cadModel?.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:cadModel?.modelOriginPosition,footprinter_string:typeof footprint=="string"&&!cadModel?footprint:void 0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_model.cad_component_id}_addCachebustToModelUrl(url2){if(!url2||!url2.includes("modelcdn.tscircuit.com"))return url2;let origin=this.root?.getClientOrigin()??"";return`${url2}${url2.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}_getPartsEngineCacheKey(source_component,footprinterString){return JSON.stringify({ftype:source_component.ftype,name:source_component.name,manufacturer_part_number:source_component.manufacturer_part_number,footprinterString})}async _getSupplierPartNumbers(partsEngine2,source_component,footprinterString){if(this.props.doNotPlace)return{};let cacheEngine=this.root?.platform?.localCacheEngine,cacheKey=this._getPartsEngineCacheKey(source_component,footprinterString);if(cacheEngine){let cached=await cacheEngine.getItem(cacheKey);if(cached)try{return JSON.parse(cached)}catch{}}let result=await Promise.resolve(partsEngine2.findPart({sourceComponent:source_component,footprinterString}));if(typeof result=="string"){if(result.includes("<!DOCTYPE")||result.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${result.substring(0,100)}`);if(result==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${result}"`)}if(!result||Array.isArray(result)||typeof result!="object"){let actualType=result===null?"null":Array.isArray(result)?"array":typeof result;throw new Error(`Invalid supplier part numbers format: Expected object but got ${actualType}`)}let supplierPartNumbers=result;if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(supplierPartNumbers))}catch{}return supplierPartNumbers}doInitialPartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=this.getInheritedProperty("partsEngine");if(!partsEngine2)return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(!source_component||source_component.supplier_part_numbers)return;let footprinterString;this.props.footprint&&typeof this.props.footprint=="string"&&(footprinterString=this.props.footprint);let supplierPartNumbersMaybePromise=this._getSupplierPartNumbers(partsEngine2,source_component,footprinterString);if(!(supplierPartNumbersMaybePromise instanceof Promise)){db2.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbersMaybePromise});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await supplierPartNumbersMaybePromise.then(supplierPartNumbers=>{this._asyncSupplierPartNumbers=supplierPartNumbers,this._markDirty("PartsEngineRender")}).catch(error=>{this._asyncSupplierPartNumbers={};let errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${error.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.unknown_error_finding_part.insert(errorObj),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(source_component&&!source_component.supplier_part_numbers&&this._asyncSupplierPartNumbers){db2.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialAssignFallbackProps(){let{_parsedProps:props}=this;props.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:props}=this;if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)this.add(new Trace3({from:`.${this.name} > .${pinName}`,to:String(targetPath)}))}}doInitialSourceDesignRuleChecks(){NormalComponent_doInitialSourceDesignRuleChecks(this)}doInitialValidatePcbCoordinates(){if(super.doInitialValidatePcbCoordinates(),this.root?.pcbDisabled)return;let props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=typeof rawProps.pcbLeftEdgeX=="string"?rawProps.pcbLeftEdgeX:props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=typeof rawProps.pcbRightEdgeX=="string"?rawProps.pcbRightEdgeX:props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=typeof rawProps.pcbTopEdgeY=="string"?rawProps.pcbTopEdgeY:props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=typeof rawProps.pcbBottomEdgeY=="string"?rawProps.pcbBottomEdgeY:props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0)&&(pcbLeftEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbLeftEdgeX,axis:"pcbX",propertyName:"pcbLeftEdgeX"}),pcbRightEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbRightEdgeX,axis:"pcbX",propertyName:"pcbRightEdgeX"}),pcbTopEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbTopEdgeY,axis:"pcbY",propertyName:"pcbTopEdgeY"}),pcbBottomEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbBottomEdgeY,axis:"pcbY",propertyName:"pcbBottomEdgeY"}))}doInitialPcbLayout(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;if(!(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0))return;if(pcbLeftEdgeX!==void 0&&pcbRightEdgeX!==void 0)throw new Error(`${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(pcbTopEdgeY!==void 0&&pcbBottomEdgeY!==void 0)throw new Error(`${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let pcbComponent=db2.pcb_component.get(this.pcb_component_id),componentWidth=pcbComponent?.width??0,componentHeight=pcbComponent?.height??0,positionedRelativeToGroupId=this.getGroup()?.pcb_group_id??void 0,positionedRelativeToBoardId=positionedRelativeToGroupId?void 0:this._getBoard()?.pcb_board_id??void 0,resolvedPcbX=this._resolvedPcbCalcOffsetX??(props.pcbX!==void 0?this._resolvePcbCoordinate(props.pcbX,"pcbX"):pcbLeftEdgeX!==void 0?this._resolvePcbCoordinate(pcbLeftEdgeX,"pcbX",{propertyName:"pcbLeftEdgeX"})+componentWidth/2:pcbRightEdgeX!==void 0?this._resolvePcbCoordinate(pcbRightEdgeX,"pcbX",{propertyName:"pcbRightEdgeX"})-componentWidth/2:void 0),resolvedPcbY=this._resolvedPcbCalcOffsetY??(props.pcbY!==void 0?this._resolvePcbCoordinate(props.pcbY,"pcbY"):pcbTopEdgeY!==void 0?this._resolvePcbCoordinate(pcbTopEdgeY,"pcbY",{propertyName:"pcbTopEdgeY"})-componentHeight/2:pcbBottomEdgeY!==void 0?this._resolvePcbCoordinate(pcbBottomEdgeY,"pcbY",{propertyName:"pcbBottomEdgeY"})+componentHeight/2:void 0);db2.pcb_component.update(this.pcb_component_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:positionedRelativeToGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:resolvedPcbX,display_offset_y:resolvedPcbY})}_getMinimumFlexContainerSize(){return NormalComponent__getMinimumFlexContainerSize(this)}_repositionOnPcb(position2){return NormalComponent__repositionOnPcb(this,position2)}doInitialSilkscreenOverlapAdjustment(){return NormalComponent_doInitialSilkscreenOverlapAdjustment(this)}isRelativelyPositioned(){let rawProps=this.props;return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0||this._parsedProps.pcbLeftEdgeX!==void 0||this._parsedProps.pcbRightEdgeX!==void 0||this._parsedProps.pcbTopEdgeY!==void 0||this._parsedProps.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0}},getDescendantSubcircuitIds=(db2,root_subcircuit_id)=>{let groups=db2.source_group.list(),result=[],findDescendants=parentId=>{let children=groups.filter(group=>group.parent_subcircuit_id===parentId);for(let child of children)child.subcircuit_id&&(result.push(child.subcircuit_id),findDescendants(child.subcircuit_id))};return findDescendants(root_subcircuit_id),result},getBoardCenterFromAnchor=({boardAnchorPosition,boardAnchorAlignment,width,height})=>{let{x:ax3,y:ay3}=boardAnchorPosition,cx3=ax3,cy3=ay3;switch(boardAnchorAlignment){case"top_left":cx3=ax3+width/2,cy3=ay3-height/2;break;case"top_right":cx3=ax3-width/2,cy3=ay3-height/2;break;case"bottom_left":cx3=ax3+width/2,cy3=ay3+height/2;break;case"bottom_right":cx3=ax3-width/2,cy3=ay3+height/2;break;case"top":cx3=ax3,cy3=ay3-height/2;break;case"bottom":cx3=ax3,cy3=ay3+height/2;break;case"left":cx3=ax3+width/2,cy3=ay3;break;case"right":cx3=ax3-width/2,cy3=ay3;break;default:break}return{x:cx3,y:cy3}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db:db2,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({});return footprint.addAll(primitives),footprint};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),capacitor=new Capacitor({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c3=>c3.componentName==="Footprint");if(!footprint&&!hasFootprintChild){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}let componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error)}let pcb_component2=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db:db2}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage2,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage2=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage2===void 0)return;let powerSourcePort=db2.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db2.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db2.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage2})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),diode2=new Diode({name:sourceElm.name,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}var SOLVERS={PackSolver2,AutoroutingPipelineSolver:nb2,AssignableAutoroutingPipeline2:Kg2,AssignableAutoroutingPipeline3:sx2,AutoroutingPipeline1_OriginalUnravel:_g,AutoroutingPipelineSolver3_HgPortPointPathing:bx2,AutoroutingPipelineSolver4:nb2,AutoroutingPipelineSolver5:ub,CopperPourPipelineSolver},TscircuitAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"isRouting",!1);__publicField(this,"solver");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});__publicField(this,"cycleCount",0);__publicField(this,"stepDelay");__publicField(this,"timeoutId");this.input=input2;let{capacityDepth,targetMinCapacity,stepDelay=0,useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion2,effort,onSolverStarted}=options,solverName;autorouterVersion2==="v1"?solverName="AutoroutingPipeline1_OriginalUnravel":autorouterVersion2==="v3"?solverName="AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion2==="v4"||autorouterVersion2==="latest"?solverName="AutoroutingPipelineSolver4":autorouterVersion2==="v5"?solverName="AutoroutingPipelineSolver5":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver4";let SolverClass=SOLVERS[solverName];this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:null,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:null,effort}}}),this.stepDelay=stepDelay}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new AutorouterError(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let startTime=Date.now(),startIterations=this.solver.iterations;for(;Date.now()-startTime<250&&!this.solver.failed&&!this.solver.solved;)this.solver.step();let iterationsPerSecond=(this.solver.iterations-startIterations)/(Date.now()-startTime)*1e3;this.cycleCount++;let debugGraphics=this.solver?.preview()||void 0,progress=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond,progress,phase:this.solver.getCurrentPhase(),debugGraphics}),this.stepDelay>0?this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),this.stepDelay):this.timeoutId=setTimeout(()=>this.runCycleAndQueueNextCycle(),0)}catch(error){this.emitEvent({type:"error",error:error instanceof Error?new AutorouterError(error.message):new AutorouterError(String(error))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):event==="progress"&&this.eventHandlers.progress.push(callback)}emitEvent(event){if(event.type==="complete")for(let handler of this.eventHandlers.complete)handler(event);else if(event.type==="error")for(let handler of this.eventHandlers.error)handler(event);else if(event.type==="progress")for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new AutorouterError(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createSourceTracesFromOffboardConnections=({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id})=>{if(Object.keys(connectedOffboardObstacles).length===0)return;let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}let obstacleById=new Map;for(let obstacle of simpleRouteJson.obstacles)obstacle.obstacleId&&obstacleById.set(obstacle.obstacleId,obstacle);let connectionGroups=new Map;for(let[obstacleId,rootConnectionName]of Object.entries(connectedOffboardObstacles))connectionGroups.has(rootConnectionName)||connectionGroups.set(rootConnectionName,[]),connectionGroups.get(rootConnectionName).push(obstacleId);for(let[rootConnectionName,obstacleIds]of connectionGroups){let sourcePortIds=new Set;for(let obstacleId of obstacleIds){let obstacle=obstacleById.get(obstacleId);if(obstacle)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);sourcePortId&&sourcePortIds.add(sourcePortId)}}if(sourcePortIds.size<2)continue;let sourcePortIdArray=Array.from(sourcePortIds);db2.source_trace.list().some(trace=>{let tracePortIds=new Set(trace.connected_source_port_ids);return sourcePortIdArray.every(id2=>tracePortIds.has(id2))})||db2.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}};function getPresetAutoroutingConfig(autorouterConfig2){let defaults={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{};switch(typeof preset=="string"?preset.replace(/_/g,"-"):preset){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults,...rest}}case"laser-prefab":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...rest}}case"auto-jumper":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"auto_jumper",...rest}}default:return{local:!0,groupMode:"subcircuit"}}}var applyPcbEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,pcb_placements:[...manualEditsFile.pcb_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id,new_center}=editEvent,pcb_component2=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component2)continue;let source_component=su2(circuitJson).source_component.get(pcb_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.pcb_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.pcb_placements.push(newPlacement)}return updatedManualEditsFile},applySchematicEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,schematic_placements:[...manualEditsFile.schematic_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id,new_center}=editEvent,schematic_component2=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component2||!schematic_component2.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.schematic_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.schematic_placements.push(newPlacement)}return updatedManualEditsFile},applyEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let schematicEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_schematic_component_location"),pcbEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_pcb_component_location"),updatedManualEditsFile=manualEditsFile;return schematicEditEvents.length>0&&(updatedManualEditsFile=applySchematicEditEventsToManualEditsFile({circuitJson,editEvents:schematicEditEvents,manualEditsFile:updatedManualEditsFile})),pcbEditEvents.length>0&&(updatedManualEditsFile=applyPcbEditEventsToManualEditsFile({circuitJson,editEvents:pcbEditEvents,manualEditsFile:updatedManualEditsFile})),updatedManualEditsFile},applyTraceHintEditEvent=(circuitJson,edit_event)=>{if(su2(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e4=>e4.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e4,route:edit_event.route}:e4);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e4=>!(e4.type==="pcb_trace_hint"&&e4.pcb_port_id===edit_event.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:edit_event.pcb_trace_hint_id,route:edit_event.route,pcb_port_id:edit_event.pcb_port_id,pcb_component_id:pcbPort?.pcb_component_id}])}return circuitJson},applyEditEvents=({circuitJson,editEvents})=>{circuitJson=JSON.parse(JSON.stringify(circuitJson));for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let component=circuitJson.find(e4=>e4.type==="pcb_component"&&e4.pcb_component_id===editEvent.pcb_component_id);if((!component||component.center.x!==editEvent.new_center.x||component.center.y!==editEvent.new_center.y)&&editEvent.original_center){let mat=translate2(editEvent.new_center.x-editEvent.original_center.x,editEvent.new_center.y-editEvent.original_center.y);circuitJson=circuitJson.map(e4=>e4.pcb_component_id!==editEvent.pcb_component_id?e4:transformPCBElement(e4,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e4=>e4.type==="schematic_component"&&e4.schematic_component_id===editEvent.schematic_component_id?{...e4,center:editEvent.new_center}:e4):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getSimpleRouteJsonFromCircuitJson=({db:db2,circuitJson,subcircuit_id,minTraceWidth=.1,nominalTraceWidth})=>{if(!db2&&circuitJson&&(db2=su2(circuitJson)),!db2)throw new Error("db or circuitJson is required");let traceHints=db2.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds(db2,subcircuit_id);for(let id2 of descendantSubcircuitIds)relevantSubcircuitIds.add(id2)}let subcircuitElements=(circuitJson??db2.toArray()).filter(e4=>!subcircuit_id||"subcircuit_id"in e4&&relevantSubcircuitIds.has(e4.subcircuit_id)),board=null;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board2=db2.source_board.getWhere({source_group_id});source_board2&&(board=db2.pcb_board.getWhere({source_board_id:source_board2.source_board_id}))}board||(board=db2.pcb_board.list()[0]),db2=su2(subcircuitElements);let connMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),obstacles=getObstaclesFromCircuitJson2([...db2.pcb_component.list(),...db2.pcb_smtpad.list(),...db2.pcb_plated_hole.list(),...db2.pcb_hole.list(),...db2.pcb_via.list(),...db2.pcb_cutout.list()].filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connMap);for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id2=>connMap.getIdsConnectedToNet(id2));obstacle.connectedTo.push(...additionalIds)}let internalConnections=db2.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic3 of internalConnections)for(let sourcePortId of ic3.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic3.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}for(let obstacle of obstacles)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);if(sourcePortId){let internalConnectionId=sourcePortIdToInternalConnectionId.get(sourcePortId);if(internalConnectionId){obstacle.offBoardConnectsTo=[internalConnectionId],obstacle.netIsAssignable=!0;break}}}let allPoints=obstacles.flatMap(o3=>[{x:o3.center.x-o3.width/2,y:o3.center.y-o3.height/2},{x:o3.center.x+o3.width/2,y:o3.center.y+o3.height/2}]).concat(board?.outline??[]),bounds;if(board&&!board.outline?bounds={minX:board.center.x-board.width/2,maxX:board.center.x+board.width/2,minY:board.center.y-board.height/2,maxY:board.center.y+board.height/2}:bounds={minX:Math.min(...allPoints.map(p4=>p4.x))-1,maxX:Math.max(...allPoints.map(p4=>p4.x))+1,minY:Math.min(...allPoints.map(p4=>p4.y))-1,maxY:Math.max(...allPoints.map(p4=>p4.y))+1},subcircuit_id){let group=db2.pcb_group.getWhere({subcircuit_id});if(group?.width&&group.height){let groupBounds={minX:group.center.x-group.width/2,maxX:group.center.x+group.width/2,minY:group.center.y-group.height/2,maxY:group.center.y+group.height/2};bounds={minX:Math.min(bounds.minX,groupBounds.minX),maxX:Math.max(bounds.maxX,groupBounds.maxX),minY:Math.min(bounds.minY,groupBounds.minY),maxY:Math.max(bounds.maxY,groupBounds.maxY)}}}let routedTraceIds=new Set(db2.pcb_trace.list().map(t35=>t35.source_trace_id).filter(id2=>!!id2)),directTraceConnections=db2.source_trace.list().filter(trace=>!routedTraceIds.has(trace.source_trace_id)).map(trace=>{let connectedPorts=trace.connected_source_port_ids.map(id2=>{let source_port2=db2.source_port.get(id2),pcb_port2=db2.pcb_port.getWhere({source_port_id:id2});return{...source_port2,...pcb_port2}});if(connectedPorts.length<2)return null;let[portA,portB]=connectedPorts;if(portA.x===void 0||portA.y===void 0)return console.error(`(source_port_id: ${portA.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(portB.x===void 0||portB.y===void 0)return console.error(`(source_port_id: ${portB.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let layerA=portA.layers?.[0]??"top",layerB=portB.layers?.[0]??"top",matchingHints=traceHints.filter(hint=>hint.pcb_port_id===portA.pcb_port_id||hint.pcb_port_id===portB.pcb_port_id),hintPoints=[];for(let hint of matchingHints){let layer=db2.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt4 of hint.route)hintPoints.push({x:pt4.x,y:pt4.y,layer})}return{name:trace.source_trace_id??connMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[{x:portA.x,y:portA.y,layer:layerA,pointId:portA.pcb_port_id,pcb_port_id:portA.pcb_port_id},...hintPoints,{x:portB.x,y:portB.y,layer:layerB,pointId:portB.pcb_port_id,pcb_port_id:portB.pcb_port_id}]}}).filter(c3=>c3!==null),directTraceConnectionsById=new Map(directTraceConnections.map(c3=>[c3.source_trace_id,c3])),source_nets=db2.source_net.list().filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connectionsFromNets=[];for(let net of source_nets){let connectedSourceTraces=db2.source_trace.list().filter(st4=>st4.connected_source_net_ids?.includes(net.source_net_id));connectionsFromNets.push({name:net.source_net_id??connMap.getNetConnectedToId(net.source_net_id),pointsToConnect:connectedSourceTraces.flatMap(st4=>db2.pcb_port.list().filter(p4=>st4.connected_source_port_ids.includes(p4.source_port_id)).map(p4=>({x:p4.x,y:p4.y,layer:p4.layers?.[0]??"top",pointId:p4.pcb_port_id,pcb_port_id:p4.pcb_port_id})))})}let breakoutPoints=db2.pcb_breakout_point.list().filter(bp3=>!subcircuit_id||relevantSubcircuitIds?.has(bp3.subcircuit_id)),connectionsFromBreakoutPoints=[],breakoutTraceConnectionsById=new Map;for(let bp3 of breakoutPoints){let pt4={x:bp3.x,y:bp3.y,layer:"top"};if(bp3.source_trace_id){let conn=directTraceConnectionsById.get(bp3.source_trace_id)??breakoutTraceConnectionsById.get(bp3.source_trace_id);if(conn)conn.pointsToConnect.push(pt4);else{let newConn={name:bp3.source_trace_id,source_trace_id:bp3.source_trace_id,pointsToConnect:[pt4]};connectionsFromBreakoutPoints.push(newConn),breakoutTraceConnectionsById.set(bp3.source_trace_id,newConn)}}else if(bp3.source_net_id){let conn=connectionsFromNets.find(c3=>c3.name===bp3.source_net_id);conn?conn.pointsToConnect.push(pt4):connectionsFromBreakoutPoints.push({name:bp3.source_net_id,pointsToConnect:[pt4]})}else if(bp3.source_port_id){let pcb_port2=db2.pcb_port.getWhere({source_port_id:bp3.source_port_id});pcb_port2&&connectionsFromBreakoutPoints.push({name:bp3.source_port_id,source_trace_id:void 0,pointsToConnect:[{x:pcb_port2.x,y:pcb_port2.y,layer:pcb_port2.layers?.[0]??"top",pointId:pcb_port2.pcb_port_id,pcb_port_id:pcb_port2.pcb_port_id},pt4]})}}let allConns=[...directTraceConnections,...connectionsFromNets,...connectionsFromBreakoutPoints],pointIdToConn=new Map;for(let conn of allConns)for(let pt4 of conn.pointsToConnect)pt4.pointId&&pointIdToConn.set(pt4.pointId,conn);let existingTraces=db2.pcb_trace.list().filter(t35=>!subcircuit_id||relevantSubcircuitIds?.has(t35.subcircuit_id));for(let tr4 of existingTraces){let tracePortIds=new Set;for(let seg of tr4.route)seg.start_pcb_port_id&&tracePortIds.add(seg.start_pcb_port_id),seg.end_pcb_port_id&&tracePortIds.add(seg.end_pcb_port_id);if(tracePortIds.size<2)continue;let firstId=tracePortIds.values().next().value;if(!firstId)continue;let conn=pointIdToConn.get(firstId);conn&&[...tracePortIds].every(pid=>pointIdToConn.get(pid)===conn)&&(conn.externallyConnectedPointIds??(conn.externallyConnectedPointIds=[]),conn.externallyConnectedPointIds.push([...tracePortIds]))}return{simpleRouteJson:{bounds,obstacles,connections:allConns,layerCount:board?.num_layers??2,minTraceWidth,nominalTraceWidth,outline:board?.outline?.map(point6=>({...point6}))},connMap}},getPhaseTimingsFromRenderEvents=renderEvents=>{let phaseTimings={};if(!renderEvents)return phaseTimings;for(let renderPhase of orderedRenderPhases)phaseTimings[renderPhase]=0;let startEvents=new Map;for(let event of renderEvents){let[,,phase,eventType]=event.type.split(":");if(eventType==="start"){startEvents.set(`${phase}:${event.renderId}`,event);continue}if(eventType==="end"){let startEvent=startEvents.get(`${phase}:${event.renderId}`);if(startEvent){let duration=event.createdAt-startEvent.createdAt;phaseTimings[phase]=(phaseTimings[phase]||0)+duration}}}return phaseTimings},normalizePinLabels=inputPinLabels=>{let unqInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=unqInputPinLabels.map(()=>[]),desiredNumbers=unqInputPinLabels.map(()=>null);for(let i2=0;i2<unqInputPinLabels.length;i2++)for(let label of unqInputPinLabels[i2])if(/^\d+$/.test(label)){desiredNumbers[i2]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i2=0;i2<desiredNumbers.length;i2++){let desiredNumber=desiredNumbers[i2];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i2].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i2])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i2].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i2=0;i2<result.length;i2++)result[i2][0]?.includes("_alt")&&(highestPinNumber++,result[i2].unshift(`pin${highestPinNumber}`));for(let i2=0;i2<result.length;i2++)result[i2].length===0&&(highestPinNumber++,result[i2].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of unqInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i2=0;i2<unqInputPinLabels.length;i2++){let inputLabels=unqInputPinLabels[i2];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i2].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i2].push(`${label}${incrementalLabelCounts[label]}`)))}return result},TraceHint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:traceHintProps}}doInitialPortMatching(){let{db:db2}=this.root,{_parsedProps:props,parent}=this;if(!parent)return;if(parent.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!parent)throw new Error("TraceHint has no parent");if(!props.for){this.renderError(`TraceHint has no for property (${this})`);return}let port=parent.selectOne(props.for,{type:"port"});port||this.renderError(`${this} could not find port for selector "${props.for}"`),this.matchedPort=port,port.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:props}=this,offsets=props.offset?[props.offset]:props.offsets;if(!offsets)return[];let globalTransform=this._computePcbGlobalTransformBeforeLayout();return offsets.map(offset=>({...applyToPoint2(globalTransform,offset),via:offset.via,to_layer:offset.to_layer,trace_width:offset.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this;db2.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group){if(group.root?.pcbDisabled||!group.isSubcircuit)return;let{db:db2}=group.root,normalComponentNameMap=group.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group),namedComponentVars={};for(let component of allNormalComponents)updateVarsForNamedComponent(component,namedComponentVars);let candidatesByName=new Map,inDegree=new Map,dependents=new Map;for(let component of allNormalComponents){if(!shouldResolvePlacementInCalcPhase(component))continue;let refs=getComponentRefsForCalcPlacement(component);if(!component.name)throw new Error(`Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`);candidatesByName.set(component.name,{component,refs}),inDegree.set(component.name,0)}for(let[candidateName,candidate]of candidatesByName.entries()){let referencedCandidateNames=new Set;for(let token of candidate.refs){let{referencePath,field}=parseComponentReferenceToken(token);if(!SUPPORTED_COMPONENT_FIELDS.has(field))throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unsupported component field "${field}" in "${token}"`);let referencedComponentName=resolveReferencedComponentName({token,referencePath,candidate,normalComponentNameMap});candidatesByName.has(referencedComponentName)&&referencedComponentName!==candidateName&&referencedCandidateNames.add(referencedComponentName)}for(let referencedComponentName of referencedCandidateNames)inDegree.set(candidateName,(inDegree.get(candidateName)??0)+1),dependents.has(referencedComponentName)||dependents.set(referencedComponentName,new Set),dependents.get(referencedComponentName).add(candidateName)}let queue=[...inDegree.entries()].filter(([,degree])=>degree===0).map(([name])=>name),resolvedCount=0;for(;queue.length>0;){let name=queue.shift(),candidate=candidatesByName.get(name);if(candidate){resolveCandidatePlacement(candidate.component,namedComponentVars),resolvedCount++;for(let dependentName of dependents.get(name)??[]){let nextDegree=(inDegree.get(dependentName)??0)-1;inDegree.set(dependentName,nextDegree),nextDegree===0&&queue.push(dependentName)}}}if(resolvedCount<candidatesByName.size){let unresolvedNames=[...candidatesByName.keys()].filter(name=>(inDegree.get(name)??0)>0);throw new Error(`Circular pcb position calc references detected among: ${unresolvedNames.join(", ")}`)}function resolveCandidatePlacement(component,componentVars){if(!component.pcb_component_id)return;let pcbComponent=db2.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY;if(rawPcbLeftEdgeX!==void 0&&rawPcbRightEdgeX!==void 0)throw new Error(`${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(rawPcbTopEdgeY!==void 0&&rawPcbBottomEdgeY!==void 0)throw new Error(`${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let componentWidth=pcbComponent.width??0,componentHeight=pcbComponent.height??0,nextCenter={x:pcbComponent.center.x,y:pcbComponent.center.y};if(rawPcbX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbLeftEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbLeftEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbLeftEdgeX"})+componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbRightEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbRightEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbRightEdgeX"})-componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}if(rawPcbY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbTopEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbTopEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbTopEdgeY"})-componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbBottomEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbBottomEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbBottomEdgeY"})+componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}component._repositionOnPcb(nextCenter),updateVarsForNamedComponent(component,componentVars)}}function shouldResolvePlacementInCalcPhase(component){let parsedProps=component._parsedProps,rawProps=component.props,pcbX=parsedProps.pcbX,pcbY=parsedProps.pcbY,pcbLeftEdgeX=parsedProps.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=parsedProps.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=parsedProps.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=parsedProps.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;return pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0?!0:typeof pcbX=="string"||typeof pcbY=="string"}function collectNormalComponentsInSubcircuit(group){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group.children)child.isSubcircuit||walk(child);return components}function getComponentRefsForCalcPlacement(component){let refs=new Set,rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY,addRefs=rawValue=>{if(typeof rawValue!="string")return;let identifiers=extractCalcIdentifiers(rawValue);for(let identifier of identifiers)identifier.startsWith("board.")||refs.add(identifier)};return addRefs(rawPcbX),addRefs(rawPcbY),addRefs(rawPcbLeftEdgeX),addRefs(rawPcbRightEdgeX),addRefs(rawPcbTopEdgeY),addRefs(rawPcbBottomEdgeY),refs}function parseComponentReferenceToken(token){let dotIndex=token.lastIndexOf(".");if(dotIndex<=0||dotIndex===token.length-1)throw new Error(`Invalid component reference token: "${token}"`);return{referencePath:token.slice(0,dotIndex),field:token.slice(dotIndex+1).toLowerCase()}}function resolveReferencedComponentName(params){let{token,referencePath,candidate,normalComponentNameMap}=params,directComponents=normalComponentNameMap.get(referencePath);if(directComponents&&directComponents.length>0){if(directComponents.length>1)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: ambiguous component reference "${referencePath}" in "${token}"`);return referencePath}let bestMatch=null;for(let componentName of normalComponentNameMap.keys())referencePath.startsWith(`${componentName}.`)&&(!bestMatch||componentName.length>bestMatch.length)&&(bestMatch=componentName);if(!bestMatch)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unknown component reference "${referencePath}" in "${token}"`);return bestMatch}function updateVarsForNamedComponent(component,vars){if(!component.name||!component.pcb_component_id||!component.root)return;let pcbComponent=component.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let width=pcbComponent.width??0,height=pcbComponent.height??0,x5=pcbComponent.center.x,y5=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x5,y:y5},size:{width,height}});let padElementsByReference=collectPadElementsByReference(component);for(let[referencePath,elements]of padElementsByReference.entries()){let bounds=getBoundsOfPcbElements(elements),minX=bounds.minX,maxX=bounds.maxX,minY=bounds.minY,maxY=bounds.maxY;vars[`${referencePath}.x`]=(minX+maxX)/2,vars[`${referencePath}.y`]=(minY+maxY)/2,vars[`${referencePath}.width`]=maxX-minX,vars[`${referencePath}.height`]=maxY-minY,vars[`${referencePath}.minX`]=minX,vars[`${referencePath}.maxX`]=maxX,vars[`${referencePath}.minY`]=minY,vars[`${referencePath}.maxY`]=maxY}}function collectPadElementsByReference(component){let refsToElements=new Map;if(!component.name||!component.pcb_component_id||!component.root)return refsToElements;let{db:db2}=component.root,padElements=[...db2.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db2.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases2=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases2.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db2.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db2.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases2.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases2.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases2){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group){if(group.root?.pcbDisabled||!group.pcb_group_id)return;let pcbPositionAnchor=group._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db2}=group.root,pcbGroup=db2.pcb_group.get(group.pcb_group_id);if(!pcbGroup)return;let width=pcbGroup.width,height=pcbGroup.height,{center:center2}=pcbGroup;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds2=getBoundsFromPoints(pcbGroup.outline);bounds2&&(width=bounds2.maxX-bounds2.minX,height=bounds2.maxY-bounds2.minY)}if(!width||!height)return;let bounds={left:center2.x-width/2,right:center2.x+width/2,top:center2.y+height/2,bottom:center2.y-height/2},currentCenter={...center2},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor))switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:bounds.left,y:bounds.top};break;case"top_center":anchorPos={x:currentCenter.x,y:bounds.top};break;case"top_right":anchorPos={x:bounds.right,y:bounds.top};break;case"center_left":anchorPos={x:bounds.left,y:currentCenter.y};break;case"center_right":anchorPos={x:bounds.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:bounds.left,y:bounds.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:bounds.bottom};break;case"bottom_right":anchorPos={x:bounds.right,y:bounds.bottom};break}if(!anchorPos)return;let newCenter={...currentCenter};targetPosition.x!==void 0&&(newCenter.x+=targetPosition.x-anchorPos.x),targetPosition.y!==void 0&&(newCenter.y+=targetPosition.y-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&(group._repositionOnPcb(newCenter),db2.pcb_group.update(group.pcb_group_id,{center:newCenter})),db2.pcb_group.update(group.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group=>{let{db:db2}=group.root,{_parsedProps:props}=group,pcbChildren=group.children.filter(c3=>c3.pcb_component_id||c3.pcb_group_id);if(pcbChildren.some(child=>{let childProps=child._parsedProps;return childProps?.pcbX!==void 0||childProps?.pcbY!==void 0}))return;let rawJustify=props.pcbJustifyContent??props.justifyContent,rawAlign=props.pcbAlignItems??props.alignItems,rawGap=props.pcbFlexGap??props.pcbGap??props.gap,direction2=props.pcbFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.pcbWidth??void 0,height=props.height??props.pcbHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(pcbChildren.map(child=>child._getMinimumFlexContainerSize()).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of pcbChildren){let size2=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let groupCenter=group._getGlobalPcbPositionBeforeLayout(),offset={x:groupCenter.x-(bounds.maxX+bounds.minX)/2,y:groupCenter.y-(bounds.maxY+bounds.minY)/2};for(let child of flexBox.children)child.metadata._repositionOnPcb({x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y});db2.pcb_group.update(group.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,pcbChildren=getPcbChildren(group);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db2,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db2,group,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db2,group,props,gridLayout})}function getPcbChildren(group){return group.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db2,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db2.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db2.pcb_component.get(child.pcb_component_id);width=pcbComp?.width??0,height=pcbComp?.height??0}maxWidth=Math.max(maxWidth,width),maxHeight=Math.max(maxHeight,height)}return{width:maxWidth,height:maxHeight}}function parseGridConfiguration(props){let cols=props.pcbGridCols??props.gridCols??props.pcbLayout?.grid?.cols,rows=props.pcbGridRows??props.pcbLayout?.grid?.rows,templateColumns=props.pcbGridTemplateColumns,templateRows=props.pcbGridTemplateRows,parseGap=gapValue=>gapValue===void 0?MIN_GAP:typeof gapValue=="number"?gapValue:length.parse(gapValue),gridGapOption=props.pcbGridGap??props.gridGap??props.pcbLayout?.gridGap,rowGapOption=props.pcbGridRowGap??props.gridRowGap??props.pcbLayout?.gridRowGap,colGapOption=props.pcbGridColumnGap??props.gridColumnGap??props.pcbLayout?.gridColumnGap,gapX=MIN_GAP,gapY=MIN_GAP;if(rowGapOption!==void 0||colGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"?gridGapOption?.x:gridGapOption,fallbackY=typeof gridGapOption=="object"?gridGapOption?.y:gridGapOption;gapX=parseGap(colGapOption??fallbackX),gapY=parseGap(rowGapOption??fallbackY)}else if(typeof gridGapOption=="object"&&gridGapOption!==null)gapX=parseGap(gridGapOption.x),gapY=parseGap(gridGapOption.y);else{let gap=parseGap(gridGapOption);gapX=gap,gapY=gap}return{cols,rows,gapX,gapY,templateColumns,templateRows}}function createGridLayout(params){let{props,pcbChildren,childDimensions,gridConfig}=params;return props.pcbGridTemplateColumns||props.pcbGridTemplateRows?createTemplateBasedLayout({props,gridConfig,pcbChildren,childDimensions}):createDefaultLayout({gridConfig,pcbChildren,childDimensions})}function createTemplateBasedLayout(params){let{props,gridConfig,pcbChildren,childDimensions}=params,gridTemplateColumns=props.pcbGridTemplateColumns??"",gridTemplateRows=props.pcbGridTemplateRows??"",extractRepeatCount=template=>{let match2=template.match(/repeat\((\d+),/);return match2?parseInt(match2[1]):Math.ceil(Math.sqrt(pcbChildren.length))},numCols=props.pcbGridTemplateColumns?extractRepeatCount(gridTemplateColumns):Math.ceil(Math.sqrt(pcbChildren.length)),numRows=props.pcbGridTemplateRows?extractRepeatCount(gridTemplateRows):Math.ceil(pcbChildren.length/numCols),containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createDefaultLayout(params){let{gridConfig,pcbChildren,childDimensions}=params,numCols,numRows;gridConfig.cols!==void 0&&gridConfig.rows!==void 0?(numCols=gridConfig.cols,numRows=gridConfig.rows):gridConfig.cols!==void 0?(numCols=gridConfig.cols,numRows=Math.ceil(pcbChildren.length/numCols)):gridConfig.rows!==void 0?(numRows=gridConfig.rows,numCols=Math.ceil(pcbChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(pcbChildren.length)),numRows=Math.ceil(pcbChildren.length/numCols)),numCols=Math.max(1,numCols),numRows=Math.max(1,numRows);let containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY,gridTemplateColumns=`repeat(${numCols}, ${childDimensions.width}px)`,gridTemplateRows=`repeat(${numRows}, ${childDimensions.height}px)`;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createCssGrid(params){let{pcbChildren,childDimensions,gridLayout,gridConfig}=params,gridChildren=pcbChildren.map((child,index)=>({key:child.getString()||`child-${index}`,contentWidth:childDimensions.width,contentHeight:childDimensions.height}));return new CssGrid({containerWidth:gridLayout.containerWidth,containerHeight:gridLayout.containerHeight,gridTemplateColumns:gridLayout.gridTemplateColumns,gridTemplateRows:gridLayout.gridTemplateRows,gap:[gridConfig.gapY,gridConfig.gapX],children:gridChildren})}function positionChildren(params){let{db:db2,group,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db2.toArray();for(let i2=0;i2<pcbChildren.length;i2++){let child=pcbChildren[i2],childKey=child.getString()||`child-${i2}`,coordinates=itemCoordinates[childKey];if(!coordinates){console.warn(`PCB grid layout: No coordinates found for child ${childKey}`);continue}let targetX=groupCenter.x-gridLayout.containerWidth/2+coordinates.x+coordinates.width/2,targetY=groupCenter.y+gridLayout.containerHeight/2-coordinates.y-coordinates.height/2;if(child.pcb_component_id)repositionPcbComponentTo(allCircuitJson,child.pcb_component_id,{x:targetX,y:targetY});else{let groupChild=child;groupChild.pcb_group_id&&groupChild.source_group_id&&repositionPcbGroupTo(allCircuitJson,groupChild.source_group_id,{x:targetX,y:targetY})}}}function updateGroupDimensions(params){let{db:db2,group,props,gridLayout}=params;if(group.pcb_group_id){let groupCenter=group._getGlobalPcbPositionBeforeLayout();db2.pcb_group.update(group.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c3=>c3.componentName==="Constraint"&&c3._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x5=>(parent[x5]!==x5&&(parent[x5]=find2(parent[x5])),parent[x5]),union2=(a2,b3)=>{let ra3=find2(a2),rb2=find2(b3);ra3!==rb2&&(parent[rb2]=ra3)},makeSet=x5=>{x5 in parent||(parent[x5]=x5)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group.children.find(c3=>c3.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a2=getIdFromSelector(props.left),b3=getIdFromSelector(props.right);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("top"in props&&"bottom"in props){let a2=getIdFromSelector(props.top),b3=getIdFromSelector(props.bottom);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);for(let id2 of ids)makeSet(id2);for(let i2=1;i2<ids.length;i2++)union2(ids[0],ids[i2])}}for(let id2 of Object.keys(parent)){let rootId=find2(id2);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id2)}for(let constraint of constraints){let props=constraint._parsedProps,compId;if("left"in props?compId=getIdFromSelector(props.left):"top"in props?compId=getIdFromSelector(props.top):"for"in props&&(compId=getIdFromSelector(props.for[0])),!compId)continue;let root=find2(compId);clusterByRoot.get(root)?.constraints.push(constraint)}let clusterMap={},packCompById=Object.fromEntries(packInput.components.map(c3=>[c3.componentId,c3]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id2,axis)=>{let key=`${id2}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor,"y"),Operator.Eq,0,Strength.required));for(let constraint of info.constraints){let props=constraint._parsedProps;if("xDist"in props){let left=getIdFromSelector(props.left),right=getIdFromSelector(props.right);left&&right&&solver.addConstraint(new Constraint(new Expression(getVar(right,"x"),[-1,getVar(left,"x")]),Operator.Eq,props.xDist,Strength.required))}else if("yDist"in props){let top=getIdFromSelector(props.top),bottom=getIdFromSelector(props.bottom);top&&bottom&&solver.addConstraint(new Constraint(new Expression(getVar(top,"y"),[-1,getVar(bottom,"y")]),Operator.Eq,props.yDist,Strength.required))}else if("sameX"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"x");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"y");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id2 of info.componentIds)positions[id2]={x:getVar(id2,"x").value(),y:getVar(id2,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp)for(let pad2 of comp.pads){let ax3=pos.x+pad2.offset.x,ay3=pos.y+pad2.offset.y;minX=Math.min(minX,ax3-pad2.size.x/2),maxX=Math.max(maxX,ax3+pad2.size.x/2),minY=Math.min(minY,ay3-pad2.size.y/2),maxY=Math.max(maxY,ay3+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp){relCenters[id2]={x:pos.x-clusterCenter.x,y:pos.y-clusterCenter.y};for(let pad2 of comp.pads)mergedPads.push({padId:pad2.padId,networkId:pad2.networkId,type:pad2.type,size:pad2.size,offset:{x:pos.x+pad2.offset.x-clusterCenter.x,y:pos.y+pad2.offset.y-clusterCenter.y}})}}packInput.components=packInput.components.filter(c3=>!info.componentIds.includes(c3.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db2,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db2?.cad_component?.list)return;let cadComponent=db2.cad_component.getWhere({pcb_component_id:pcbComponentId});if(!cadComponent)return;let delta=layer?.toLowerCase?.()==="bottom"?-rotationDegrees:rotationDegrees,currentRotationZ=cadComponent.rotation?.z??0,nextRotation={...cadComponent.rotation??{x:0,y:0,z:0},z:normalizeDegrees(currentRotationZ+delta)};db2.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db2,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group=db2.source_group.get(groupId);return!group||!group.parent_source_group_id?!1:isDescendantGroup(db2,group.parent_source_group_id,ancestorId)},applyPackOutput=(group,packOutput,clusterMap)=>{let{db:db2}=group.root;for(let packedComponent of packOutput.components){let{center:center2,componentId,ccwRotationOffset,ccwRotationDegrees}=packedComponent,cluster=clusterMap[componentId];if(cluster){let rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,angleRad=rotationDegrees2*Math.PI/180;for(let memberId of cluster.componentIds){let rel=cluster.relativeCenters[memberId];if(!rel)continue;db2.pcb_component.update(memberId,{position_mode:"packed"});let rotatedRel={x:rel.x*Math.cos(angleRad)-rel.y*Math.sin(angleRad),y:rel.x*Math.sin(angleRad)+rel.y*Math.cos(angleRad)},member=db2.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db2.pcb_component.get(componentId);if(pcbComponent){db2.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group.source_group_id,componentGroupId=db2.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db2,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db2.pcb_group.list().find(g7=>g7.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db2.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db2,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db2.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db2,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db2.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db2.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db2,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db2.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db2.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),Group_doInitialPcbLayoutPack=group=>{let{db:db2}=group.root,{_parsedProps:props}=group;group.root?.emit("packing:start",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()});let{packOrderStrategy,packPlacementStrategy,gap:gapProp,pcbGap,pcbPackGap}=props,gap=pcbPackGap??pcbGap??gapProp,gapMm=length.parse(gap??DEFAULT_MIN_GAP),chipMarginsMap={},staticPcbComponentIds=new Set,collectMargins=comp=>{if(comp?.pcb_component_id&&comp?._parsedProps){let props2=comp._parsedProps,left=length.parse(props2.pcbMarginLeft??props2.pcbMarginX??0),right=length.parse(props2.pcbMarginRight??props2.pcbMarginX??0),top=length.parse(props2.pcbMarginTop??props2.pcbMarginY??0),bottom=length.parse(props2.pcbMarginBottom??props2.pcbMarginY??0);(left||right||top||bottom)&&(chipMarginsMap[comp.pcb_component_id]={left,right,top,bottom})}comp?.children&&comp.children.forEach(collectMargins)};collectMargins(group);let excludedPcbGroupIds=new Set;for(let child of group.children){let childIsGroupOrNormalComponent=child;childIsGroupOrNormalComponent._isNormalComponent&&childIsGroupOrNormalComponent.isRelativelyPositioned?.()&&(childIsGroupOrNormalComponent.pcb_component_id&&staticPcbComponentIds.add(childIsGroupOrNormalComponent.pcb_component_id),childIsGroupOrNormalComponent.pcb_group_id&&excludedPcbGroupIds.add(childIsGroupOrNormalComponent.pcb_group_id))}let isDescendantGroup2=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup2(db22,group2.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db2.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db2.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db2,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db2.toArray(),bounds;if(props.width!==void 0&&props.height!==void 0){let widthMm=length.parse(props.width),heightMm=length.parse(props.height);bounds={minX:-widthMm/2,maxX:widthMm/2,minY:-heightMm/2,maxY:heightMm/2}}let packInput={...convertPackOutputToPackInput(convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)})),orderStrategy:packOrderStrategy??"largest_to_smallest",placementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group,packInput);debug42.enabled&&(group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group.name}`,content:JSON.stringify(db2.toArray())}),group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group.name}`,content:packInput}));let packOutput;try{let solver=new PackSolver2(packInput);group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams:solver.getConstructorParams(),componentName:group.getString()}),solver.solve(),packOutput={...packInput,components:solver.packedComponents}}catch(error){throw group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message:error instanceof Error?error.message:String(error)}}),error}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap),group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},getSizeOfTreeNodeChild=(db2,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent?.source_component_id});return schComponent?.size?{width:schComponent.size.width,height:schComponent.size.height}:null}if(child.nodeType==="group"){let schGroup=db2.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db2.schematic_component.list({schematic_group_id:schGroup?.schematic_group_id}),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let comp of groupComponents)if(comp.center&&comp.size){let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let groupWidth=maxX-minX,groupHeight=maxY-minY;return{width:groupWidth,height:groupHeight}}return null},Group_doInitialSchematicLayoutFlex=group=>{let{db:db2}=group.root,props=group._parsedProps,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction2=props.schFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.schWidth??void 0,height=props.height??props.schHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(tree.childNodes.map(child=>getSizeOfTreeNodeChild(db2,child)).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of tree.childNodes){let size2=getSizeOfTreeNodeChild(db2,child);flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let offset={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db2.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent.source_component_id});if(!schComponent)continue;repositionSchematicComponentTo(allCircuitJson,schComponent.schematic_component_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}if(sourceGroup){if(!db2.schematic_group.getWhere({source_group_id:sourceGroup.source_group_id}))continue;repositionSchematicGroupTo(allCircuitJson,sourceGroup.source_group_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId,deltaX,deltaY}){let rects=db2.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db2.schematic_line.list({schematic_component_id:schematicComponentId});for(let line2 of lines)line2.x1+=deltaX,line2.y1+=deltaY,line2.x2+=deltaX,line2.y2+=deltaY;let circles=db2.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle2 of circles)circle2.center.x+=deltaX,circle2.center.y+=deltaY;let arcs=db2.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db2.schematic_path.list({schematic_component_id:schematicComponentId});for(let path of paths)for(let point6 of path.points)point6.x+=deltaX,point6.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,schematicChildren=group.children.filter(child=>{let isExplicitlyPositioned=child._parsedProps?.schX!==void 0||child._parsedProps?.schY!==void 0;return child.schematic_component_id&&!isExplicitlyPositioned});if(schematicChildren.length===0)return;let maxCellWidth=0,maxCellHeight=0;for(let child of schematicChildren){let schComp=db2.schematic_component.get(child.schematic_component_id);schComp?.size&&(maxCellWidth=Math.max(maxCellWidth,schComp.size.width),maxCellHeight=Math.max(maxCellHeight,schComp.size.height))}maxCellWidth===0&&schematicChildren.length>0&&(maxCellWidth=1),maxCellHeight===0&&schematicChildren.length>0&&(maxCellHeight=1);let gridColsOption=props.gridCols,gridRowsOption,gridGapOption=props.gridGap,gridRowGapOption=props.gridRowGap,gridColumnGapOption=props.gridColumnGap;props.schLayout?.grid&&(gridColsOption=props.schLayout.grid.cols??gridColsOption,gridRowsOption=props.schLayout.grid.rows,gridGapOption=props.schLayout.gridGap??gridGapOption,gridRowGapOption=props.schLayout.gridRowGap??gridRowGapOption,gridColumnGapOption=props.schLayout.gridColumnGap??gridColumnGapOption);let numCols,numRows;gridColsOption!==void 0&&gridRowsOption!==void 0?(numCols=gridColsOption,numRows=gridRowsOption):gridColsOption!==void 0?(numCols=gridColsOption,numRows=Math.ceil(schematicChildren.length/numCols)):gridRowsOption!==void 0?(numRows=gridRowsOption,numCols=Math.ceil(schematicChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(schematicChildren.length)),numRows=Math.ceil(schematicChildren.length/numCols)),numCols===0&&schematicChildren.length>0&&(numCols=1),numRows===0&&schematicChildren.length>0&&(numRows=schematicChildren.length);let gridGapX,gridGapY,parseGap=val=>{if(val!==void 0)return typeof val=="number"?val:length.parse(val)};if(gridRowGapOption!==void 0||gridColumnGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.x:gridGapOption,fallbackY=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.y:gridGapOption;gridGapX=parseGap(gridColumnGapOption??fallbackX)??1,gridGapY=parseGap(gridRowGapOption??fallbackY)??1}else if(typeof gridGapOption=="number")gridGapX=gridGapOption,gridGapY=gridGapOption;else if(typeof gridGapOption=="string"){let parsed=length.parse(gridGapOption);gridGapX=parsed,gridGapY=parsed}else if(typeof gridGapOption=="object"&&gridGapOption!==null){let xRaw=gridGapOption.x,yRaw=gridGapOption.y;gridGapX=typeof xRaw=="number"?xRaw:length.parse(xRaw??"0mm"),gridGapY=typeof yRaw=="number"?yRaw:length.parse(yRaw??"0mm")}else gridGapX=1,gridGapY=1;let totalGridWidth=numCols*maxCellWidth+Math.max(0,numCols-1)*gridGapX,totalGridHeight=numRows*maxCellHeight+Math.max(0,numRows-1)*gridGapY,groupCenter=group._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i2=0;i2<schematicChildren.length;i2++){let child=schematicChildren[i2];if(!child.schematic_component_id)continue;let row=Math.floor(i2/numCols),col=i2%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i2} (row ${row}, col ${col}) exceeds specified grid dimensions (${numRows}x${numCols}). Skipping placement.`);continue}let targetCellCenterX=firstCellCenterX+col*(maxCellWidth+gridGapX),targetCellCenterY=firstCellCenterY-row*(maxCellHeight+gridGapY),schComp=db2.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db2.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db2.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db2.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db2.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db2.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group){let{db:db2}=group.root,subtreeCircuitJson=buildSubtree(db2.toArray(),{source_group_id:group.source_group_id}),bpcGraphBeforeGeneratedNetLabels=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(bpcGraphBeforeGeneratedNetLabels,{title:`floatingBpcGraph-${group.name}`}));let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson),floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p4=>({...p4,color:p4.color.replace("not_connected","normal")}))},{result:laidOutBpcGraph}=layoutSchematicGraphVariants([{variantName:"default",floatingGraph},{variantName:"noNotConnected",floatingGraph:floatingGraphNoNotConnected}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(floatingGraph.boxes.filter(box2=>floatingGraph.pins.filter(p4=>p4.boxId===box2.boxId).filter(bp3=>!bp3.color.includes("center")).length<=2).map(b3=>b3.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group.name}`}));let groupOffset=group._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component2=db2.schematic_component.get(box2.boxId);if(schematic_component2){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db2.schematic_port.list({schematic_component_id:schematic_component2.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematic_component2.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component2.center.x,y:newCenter.y-schematic_component2.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematic_component2.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component2.center=newCenter;continue}let schematic_net_label2=db2.schematic_net_label.get(box2.boxId);if(schematic_net_label2){let pin=laidOutBpcGraph.pins.find(p4=>p4.boxId===box2.boxId&&p4.color==="netlabel_center");if(!pin)throw new Error(`No pin found for net label: ${box2.boxId}`);let finalCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y};schematic_net_label2.center=finalCenter,schematic_net_label2.anchor_position={x:finalCenter.x+pin.offset.x,y:finalCenter.y+pin.offset.y};continue}console.error(`No schematic element found for box: ${box2.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack");function facingDirectionToSide(facingDirection){switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function rotateDirection2(direction2,degrees){let directions=["right","up","left","down"],currentIndex=directions.indexOf(direction2);if(currentIndex===-1)return direction2;let steps=Math.round(degrees/90),newIndex=(currentIndex+steps)%4;return directions[newIndex<0?newIndex+4:newIndex]}function isTreeChildExplicitlyPositioned(treeChild,group){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group.children.find(groupChild=>groupChild.source_component_id===treeChild.sourceComponent?.source_component_id);return component?._parsedProps?.schX!==void 0||component?._parsedProps?.schY!==void 0}if(treeChild.nodeType==="group"&&treeChild.sourceGroup){let nestedGroup=group.children.find(groupChild=>groupChild.source_group_id===treeChild.sourceGroup?.source_group_id);return nestedGroup?._parsedProps?.schX!==void 0||nestedGroup?._parsedProps?.schY!==void 0}return!1}function convertTreeToInputProblem(tree,db2,group){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2};debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{if(isTreeChildExplicitlyPositioned(child,group)){debug62(`[${group.name}] Skipping explicitly positioned child ${index} from matchpack`);return}if(debug62(`[${group.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=child.sourceComponent.name||`chip_${index}`,schematicComponent=db2.schematic_component.getWhere({source_component_id:child.sourceComponent.source_component_id});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),availableRotations=[0,90,180,270];component?._parsedProps?.schOrientation&&(availableRotations=[0]),component?._parsedProps?.schRotation!==void 0&&(availableRotations=[0]),component?._parsedProps?.facingDirection&&(availableRotations=[0]),component?._parsedProps?.schFacingDirection&&(availableRotations=[0]),component?.componentName==="Chip"&&(availableRotations=[0]);let marginLeft=component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0,marginRight=component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0,marginTop=component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0,marginBottom=component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2;problem.chipMap[chipId]={chipId,pins:[],size:{x:(schematicComponent.size?.width||1)+marginLeft+marginRight,y:(schematicComponent.size?.height||1)+marginTop+marginBottom},availableRotations};let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${chipId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;problem.chipMap[chipId].pins.push(pinId);let side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-(schematicComponent.center.x||0)+marginXShift,y:(port.center?.y||0)-(schematicComponent.center.y||0)+marginYShift},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=child.sourceGroup.name||`group_${index}`;debug62(`[${group.name}] Processing nested group: ${groupId}`);let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group.name}] Treating group ${groupId} as composite chip`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c3=>c3.source_component_id));let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let comp of groupComponents)if(comp.center&&comp.size){hasValidBounds=!0;let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let marginLeft=groupInstance?._parsedProps?.schMarginLeft??groupInstance?._parsedProps?.schMarginX??0,marginRight=groupInstance?._parsedProps?.schMarginRight??groupInstance?._parsedProps?.schMarginX??0,marginTop=groupInstance?._parsedProps?.schMarginTop??groupInstance?._parsedProps?.schMarginY??0,marginBottom=groupInstance?._parsedProps?.schMarginBottom??groupInstance?._parsedProps?.schMarginY??0,marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2,groupWidth=(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,groupHeight=(hasValidBounds?maxY-minY:2)+marginTop+marginBottom;debug62(`[${group.name}] Group ${groupId} computed size: ${groupWidth} x ${groupHeight}`);let groupPins=[];for(let comp of groupComponents){let ports=db2.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${groupId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;groupPins.push(pinId);let groupCenter=schematicGroup.center||{x:0,y:0},side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-groupCenter.x+marginXShift,y:(port.center?.y||0)-groupCenter.y+marginYShift},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:{x:groupWidth,y:groupHeight}},debug62(`[${group.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group.name}] Creating connections using connectivity keys`);let connectivityGroups=new Map;for(let[chipId,chip]of Object.entries(problem.chipMap))for(let pinId of chip.pins){let pinNumber=pinId.split(".").pop(),treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);if(treeNode?.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db2.source_port.list({source_component_id:comp.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber))if(sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber)&&sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups)if(pins.length>=2){let tracesWithThisKey=db2.source_trace.list().filter(trace=>trace.subcircuit_connectivity_map_key===connectivityKey),hasNetConnections=tracesWithThisKey.some(trace=>trace.connected_source_net_ids&&trace.connected_source_net_ids.length>0),hasDirectConnections=tracesWithThisKey.some(trace=>trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2);if(debug62(`[${group.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),hasDirectConnections){for(let trace of tracesWithThisKey)if(trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2){let directlyConnectedPins=[];for(let portId of trace.connected_source_port_ids)for(let pinId of pins){let pinNumber=pinId.split(".").pop(),sourcePort=db2.source_port.get(portId);if(sourcePort&&String(sourcePort.pin_number||sourcePort.name)===String(pinNumber)){let chipId=pinId.split(".")[0],treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p4=>p4.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i2=0;i2<directlyConnectedPins.length;i2++)for(let j4=i2+1;j4<directlyConnectedPins.length;j4++){let pin1=directlyConnectedPins[i2],pin2=directlyConnectedPins[j4];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net2=db2.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net2?.is_ground??!1,isPositiveVoltageSource=source_net2?.is_power??!1;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return problem}function Group_doInitialSchematicLayoutMatchPack(group){let{db:db2}=group.root,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id});if(debug62(`[${group.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let inputProblem=convertTreeToInputProblem(tree,db2,group);debug62.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed)throw debug62(`Solver failed with error: ${solver.error}`),new Error(`Matchpack layout solver failed: ${solver.error}`);let outputLayout=solver.getOutputLayout();if(debug62("OutputLayout:",JSON.stringify(outputLayout,null,2)),debug62("Solver completed successfully:",!solver.failed),debug62.enabled&&global?.debugGraphics){let finalViz=solver.visualize();global.debugGraphics.push({...finalViz,title:`matchpack-final-${group.name}`})}let overlaps=solver.checkForOverlaps(outputLayout);if(overlaps.length>0){debug62(`Warning: Found ${overlaps.length} overlapping components:`);for(let overlap of overlaps)debug62(` ${overlap.chip1} overlaps ${overlap.chip2} (area: ${overlap.overlapArea})`)}let groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`Group offset: x=${groupOffset.x}, y=${groupOffset.y}`),debug62(`Applying layout results for ${Object.keys(outputLayout.chipPlacements).length} chip placements`);for(let[chipId,placement]of Object.entries(outputLayout.chipPlacements)){debug62(`Processing placement for chip: ${chipId} at (${placement.x}, ${placement.y})`);let treeNode=tree.childNodes.find(child=>{if(child.nodeType==="component"&&child.sourceComponent){let matches=child.sourceComponent.name===chipId;return debug62(` Checking component ${child.sourceComponent.name}: matches=${matches}`),matches}if(child.nodeType==="group"&&child.sourceGroup){let groupName=child.sourceGroup.name,expectedChipId=`group_${tree.childNodes.indexOf(child)}`,matches=expectedChipId===chipId;return debug62(` Checking group ${groupName} (expected chipId: ${expectedChipId}): matches=${matches}`),matches}return!1});if(!treeNode){debug62(`Warning: No tree node found for chip: ${chipId}`),debug62("Available tree nodes:",tree.childNodes.map((child,idx)=>({type:child.nodeType,name:child.nodeType==="component"?child.sourceComponent?.name:child.sourceGroup?.name,expectedChipId:child.nodeType==="group"?`group_${idx}`:child.sourceComponent?.name})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let schematicComponent=db2.schematic_component.getWhere({source_component_id:treeNode.sourceComponent.source_component_id});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematicComponent.schematic_component_id}),positionDelta={x:newCenter.x-schematicComponent.center.x,y:newCenter.y-schematicComponent.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematicComponent.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematicComponent.center=newCenter,placement.ccwRotationDegrees!==0){debug62(`Component ${chipId} has rotation: ${placement.ccwRotationDegrees}\xB0`);let normalizedRotation=(Math.round(placement.ccwRotationDegrees)%360+360)%360;if((normalizedRotation===90||normalizedRotation===270)&&schematicComponent.size){let prevWidth=schematicComponent.size.width;schematicComponent.size.width=schematicComponent.size.height,schematicComponent.size.height=prevWidth}let angleRad=placement.ccwRotationDegrees*Math.PI/180,cos5=Math.cos(angleRad),sin5=Math.sin(angleRad);for(let port of ports){let dx3=port.center.x-newCenter.x,dy3=port.center.y-newCenter.y,rotatedDx=dx3*cos5-dy3*sin5,rotatedDy=dx3*sin5+dy3*cos5;port.center.x=newCenter.x+rotatedDx,port.center.y=newCenter.y+rotatedDy;let originalDirection=port.facing_direction||"right";port.facing_direction=rotateDirection2(originalDirection,placement.ccwRotationDegrees),port.side_of_component=(port.facing_direction==="up"?"top":port.facing_direction==="down"?"bottom":port.facing_direction)||port.side_of_component}for(let text of texts){let dx3=text.position.x-newCenter.x,dy3=text.position.y-newCenter.y,rotatedDx=dx3*cos5-dy3*sin5,rotatedDy=dx3*sin5+dy3*cos5;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}if(schematicComponent.symbol_name){let schematicSymbolDirection=schematicComponent.symbol_name.match(/_(right|left|up|down)$/);schematicSymbolDirection&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolDirection[0],`_${rotateDirection2(schematicSymbolDirection[1],placement.ccwRotationDegrees)}`))}}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){debug62(`Moving group ${chipId} to (${newCenter.x}, ${newCenter.y}) from (${schematicGroup.center?.x}, ${schematicGroup.center?.y})`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let oldCenter=schematicGroup.center||{x:0,y:0},positionDelta={x:newCenter.x-oldCenter.x,y:newCenter.y-oldCenter.y};debug62(`Position delta for group ${chipId}: (${positionDelta.x}, ${positionDelta.y})`);for(let component of groupComponents)if(component.center){let oldComponentCenter={...component.center};component.center.x+=positionDelta.x,component.center.y+=positionDelta.y,debug62(`Moved component ${component.source_component_id} from (${oldComponentCenter.x}, ${oldComponentCenter.y}) to (${component.center.x}, ${component.center.y})`);let ports=db2.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:component.schematic_component_id});for(let port of ports)port.center&&(port.center.x+=positionDelta.x,port.center.y+=positionDelta.y);for(let text of texts)text.position&&(text.position.x+=positionDelta.x,text.position.y+=positionDelta.y)}schematicGroup.center=newCenter,debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function createSchematicTraceSolverInputProblem(group){let{db:db2}=group.root,sckToSourceNet=new Map,sckToUserNetId=new Map,allScks=new Set,displayLabelTraces=group.selectAll("trace").filter(t35=>t35._parsedProps?.schDisplayLabel),childGroups=group.selectAll("group"),allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a2=>a2.schematic_group_id)],schematicComponents=db2.schematic_component.list().filter(a2=>allSchematicGroupIds.includes(a2.schematic_group_id)),chips=[],pinIdToSchematicPortId=new Map,schematicPortIdToPinId=new Map;for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],sourceComponent=db2.source_component.getWhere({source_component_id:schematicComponent.source_component_id}),schematicPorts=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let pinId=`${sourceComponent?.name??schematicComponent.schematic_component_id}.${schematicPort.pin_number}`;pinIdToSchematicPortId.set(pinId,schematicPort.schematic_port_id),schematicPortIdToPinId.set(schematicPort.schematic_port_id,pinId)}for(let schematicPort of schematicPorts){let pinId=schematicPortIdToPinId.get(schematicPort.schematic_port_id);pins.push({pinId,x:schematicPort.center.x,y:schematicPort.center.y})}chips.push({chipId,center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height,pins})}let allSourceAndSchematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToSck=new Map;for(let sc2 of schematicComponents){let ports=db2.schematic_port.list({schematic_component_id:sc2.schematic_component_id});for(let sp3 of ports)allSourceAndSchematicPortIdsInScope.add(sp3.schematic_port_id),sp3.source_port_id&&(schPortIdToSourcePortId.set(sp3.schematic_port_id,sp3.source_port_id),sourcePortIdToSchPortId.set(sp3.source_port_id,sp3.schematic_port_id))}let allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg3 of childGroups)cg3.subcircuit_id&&allowedSubcircuitIds.add(cg3.subcircuit_id);let externalNetIds=db2.source_trace.list().filter(st4=>{if(st4.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st4.connected_source_port_ids)if(sourcePortIdToSchPortId.has(source_port_id))return!0;return!1}).flatMap(st4=>st4.connected_source_net_ids);for(let netId of externalNetIds){let net=db2.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}let directConnections=[],pairKeyToSourceTraceId=new Map;for(let st4 of db2.source_trace.list()){if(st4.subcircuit_id&&!allowedSubcircuitIds.has(st4.subcircuit_id))continue;let connected=(st4.connected_source_port_ids??[]).map(srcId=>sourcePortIdToSchPortId.get(srcId)).filter(sourcePortId=>!!sourcePortId&&allSourceAndSchematicPortIdsInScope.has(sourcePortId));if(connected.length>=2){let[a2,b3]=connected.slice(0,2),pairKey=[a2,b3].sort().join("::");if(!pairKeyToSourceTraceId.has(pairKey)){pairKeyToSourceTraceId.set(pairKey,st4.source_trace_id);let userNetId=st4.display_name??st4.source_trace_id;st4.subcircuit_connectivity_map_key&&(allScks.add(st4.subcircuit_connectivity_map_key),userNetIdToSck.set(userNetId,st4.subcircuit_connectivity_map_key),sckToUserNetId.set(st4.subcircuit_connectivity_map_key,userNetId)),directConnections.push({pinIds:[a2,b3].map(id2=>schematicPortIdToPinId.get(id2)),netId:userNetId})}}}let netConnections=[];for(let net of db2.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.subcircuit_connectivity_map_key&&(allScks.add(net.subcircuit_connectivity_map_key),sckToSourceNet.set(net.subcircuit_connectivity_map_key,net));let sckToPinIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){let sp3=db2.source_port.get(srcPortId);if(!sp3?.subcircuit_connectivity_map_key)continue;let sck=sp3.subcircuit_connectivity_map_key;allScks.add(sck),sckToPinIds.has(sck)||sckToPinIds.set(sck,[]),sckToPinIds.get(sck).push(schId)}for(let[subcircuitConnectivityKey,schematicPortIds]of sckToPinIds){let sourceNet=sckToSourceNet.get(subcircuitConnectivityKey);if(sourceNet&&schematicPortIds.length>=2){let userNetId=String(sourceNet.name||sourceNet.source_net_id||subcircuitConnectivityKey);userNetIdToSck.set(userNetId,subcircuitConnectivityKey),sckToUserNetId.set(subcircuitConnectivityKey,userNetId);let charWidth=.1*(.18/.18),netLabelWidth=Number((String(userNetId).length*charWidth).toFixed(2));netConnections.push({netId:userNetId,pinIds:schematicPortIds.map(portId=>schematicPortIdToPinId.get(portId)),netLabelWidth})}}let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db2.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.name&&presentNetIds.has(net.name)&&(net.is_ground||net.name.toLowerCase().startsWith("gnd")?netToAllowedOrientations[net.name]=["y-"]:net.is_power||net.name.toLowerCase().startsWith("v")?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections,netConnections,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??2.4},pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,sckToUserNetId,userNetIdToSck,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks}}var TOL=1e-6;function isHorizontalEdge(edge){let dx3=Math.abs(edge.to.x-edge.from.x),dy3=Math.abs(edge.to.y-edge.from.y);return dx3>=dy3}function length6(a2,b3){return Math.hypot(b3.x-a2.x,b3.y-a2.y)}function pointAt(a2,b3,t35){return{x:a2.x+(b3.x-a2.x)*t35,y:a2.y+(b3.y-a2.y)*t35}}function paramAlong(a2,b3,p4){let L4=length6(a2,b3);if(L4<TOL)return 0;let t35=((p4.x-a2.x)*(b3.x-a2.x)+(p4.y-a2.y)*(b3.y-a2.y))/((b3.x-a2.x)*(b3.x-a2.x)+(b3.y-a2.y)*(b3.y-a2.y));return Math.max(0,Math.min(1,t35))*L4}function cross2(ax3,ay3,bx3,by3){return ax3*by3-ay3*bx3}function segmentIntersection(p12,p22,q12,q22){let r4={x:p22.x-p12.x,y:p22.y-p12.y},s2={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross2(r4.x,r4.y,s2.x,s2.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross2(q_p.x,q_p.y,r4.x,r4.y);if(Math.abs(rxs)<TOL&&Math.abs(q_pxr)<TOL||Math.abs(rxs)<TOL&&Math.abs(q_pxr)>=TOL)return null;let t35=cross2(q_p.x,q_p.y,s2.x,s2.y)/rxs,u4=cross2(q_p.x,q_p.y,r4.x,r4.y)/rxs;return t35<-TOL||t35>1+TOL||u4<-TOL||u4>1+TOL?null:{x:p12.x+t35*r4.x,y:p12.y+t35*r4.y}}function mergeIntervals(intervals,tol=TOL){if(intervals.length===0)return intervals;intervals.sort((a2,b3)=>a2.start-b3.start);let merged=[],cur={...intervals[0]};for(let i2=1;i2<intervals.length;i2++){let nxt=intervals[i2];nxt.start<=cur.end+tol?cur.end=Math.max(cur.end,nxt.end):(merged.push(cur),cur={...nxt})}return merged.push(cur),merged}function splitEdgeByCrossings(edge,crossingDistances,crossLen){let L4=length6(edge.from,edge.to);if(L4<TOL||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d3=>({start:Math.max(0,d3-half),end:Math.min(L4,d3+half)})).filter(iv2=>iv2.end-iv2.start>TOL),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL)return;let t02=d02/L4,t110=d12/L4;result.push({from:pointAt(edge.from,edge.to,t02),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv2 of intervals)iv2.start-cursor>TOL&&addSeg(cursor,iv2.start,!1),addSeg(iv2.start,iv2.end,!0),cursor=iv2.end;return L4-cursor>TOL&&addSeg(cursor,L4,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL,crossingsByEdge=new Map,keyOf=ref=>`${ref.traceIdx}:${ref.edgeIdx}`,getEdge=ref=>traces[ref.traceIdx].edges[ref.edgeIdx];for(let ti3=0;ti3<traces.length;ti3++){let A4=traces[ti3];for(let ei3=0;ei3<A4.edges.length;ei3++){let eA=A4.edges[ei3];for(let tj=ti3;tj<traces.length;tj++){let B5=traces[tj];for(let ej=tj===ti3?ei3+1:0;ej<B5.edges.length;ej++){let eB=B5.edges[ej],P5=segmentIntersection(eA.from,eA.to,eB.from,eB.to);if(!P5)continue;let LA=length6(eA.from,eA.to),LB=length6(eB.from,eB.to);if(LA<tol||LB<tol)continue;let dA=paramAlong(eA.from,eA.to,P5),dB=paramAlong(eB.from,eB.to,P5),nearEndpointA=dA<=tol||Math.abs(LA-dA)<=tol||Number.isNaN(dA),nearEndpointB=dB<=tol||Math.abs(LB-dB)<=tol||Number.isNaN(dB);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA),bIsHorizontal=isHorizontalEdge(eB),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax3=Math.abs(eA.to.x-eA.from.x),ay3=Math.abs(eA.to.y-eA.from.y),bx3=Math.abs(eB.to.x-eB.from.x),by3=Math.abs(eB.to.y-eB.from.y),aScore=ax3-ay3,bScore=bx3-by3;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj,edgeIdx:assignToA?ei3:ej}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA:dB),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t35=>({source_trace_id:t35.source_trace_id,edges:[]}));for(let ti3=0;ti3<traces.length;ti3++){let trace=traces[ti3];for(let ei3=0;ei3<trace.edges.length;ei3++){let eRefKey=keyOf({traceIdx:ti3,edgeIdx:ei3}),splittingDistances=crossingsByEdge.get(eRefKey)??[];if(splittingDistances.length===0){out[ti3].edges.push(trace.edges[ei3]);continue}let uniqueSorted=Array.from(new Set(splittingDistances.map(d3=>Number(d3.toFixed(6))))).sort((a2,b3)=>a2-b3),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted,crossLen);out[ti3].edges.push(...split)}}return out}var TOL2=1e-6;function nearlyEqual(a2,b3,tol=TOL2){return Math.abs(a2-b3)<=tol}function pointEq(a2,b3,tol=TOL2){return nearlyEqual(a2.x,b3.x,tol)&&nearlyEqual(a2.y,b3.y,tol)}function onSegment5(p4,a2,b3,tol=TOL2){let minX=Math.min(a2.x,b3.x)-tol,maxX=Math.max(a2.x,b3.x)+tol,minY=Math.min(a2.y,b3.y)-tol,maxY=Math.max(a2.y,b3.y)+tol;return p4.x<minX||p4.x>maxX||p4.y<minY||p4.y>maxY?!1:Math.abs((b3.x-a2.x)*(p4.y-a2.y)-(b3.y-a2.y)*(p4.x-a2.x))<=tol}function dedupePoints(points,tol=TOL2){let map=new Map;for(let p4 of points){let key=`${p4.x.toFixed(6)},${p4.y.toFixed(6)}`;map.has(key)||map.set(key,p4)}return Array.from(map.values())}function edgeVec(e4){return{x:e4.to.x-e4.from.x,y:e4.to.y-e4.from.y}}function isParallel(e12,e22,tol=TOL2){let v12=edgeVec(e12),v22=edgeVec(e22),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross22=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross22)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p4,tol=TOL2){return trace.edges.filter(e4=>pointEq(e4.from,p4,tol)||pointEq(e4.to,p4,tol))}function nearestEndpointOnTrace(trace,p4,tol=TOL2){for(let e4 of trace.edges){if(pointEq(e4.from,p4,tol))return e4.from;if(pointEq(e4.to,p4,tol))return e4.to}return null}function edgeDirectionFromPoint(e4,p4,tol=TOL2){let other=pointEq(e4.from,p4,tol)||nearlyEqual(e4.from.x,p4.x,tol)&&nearlyEqual(e4.from.y,p4.y,tol)?e4.to:e4.from,dx3=other.x-p4.x,dy3=other.y-p4.y;return Math.abs(dx3)<tol&&Math.abs(dy3)<tol?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p4,tol=TOL2){let incident=incidentEdgesAtPoint(trace,p4,tol);if(incident.length<2)return null;let dirs=incident.map(e4=>edgeDirectionFromPoint(e4,p4,tol)),hasUp=dirs.includes("up"),hasDown=dirs.includes("down"),hasLeft=dirs.includes("left"),hasRight=dirs.includes("right"),vertical=hasUp?"up":hasDown?"down":null,horizontal=hasRight?"right":hasLeft?"left":null;return vertical&&horizontal?`${vertical}-${horizontal}`:null}function computeJunctions(traces,opts={}){let tol=opts.tolerance??TOL2,result={};for(let t35 of traces)result[t35.source_trace_id]=[];let endpointsByTrace=traces.map(t35=>{let pts=[];for(let e4 of t35.edges)pts.push(e4.from,e4.to);return dedupePoints(pts,tol)});for(let i2=0;i2<traces.length;i2++){let A4=traces[i2],AEnds=endpointsByTrace[i2];for(let j4=i2+1;j4<traces.length;j4++){let B5=traces[j4],BEnds=endpointsByTrace[j4];for(let pa3 of AEnds)for(let pb of BEnds)if(pointEq(pa3,pb,tol)){let aEdgesAtP=incidentEdgesAtPoint(A4,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B5,pb,tol),hasCorner=aEdgesAtP.some(eA=>bEdgesAtP.some(eB=>!isParallel(eA,eB,tol))),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bCorner=getCornerOrientationAtPoint(B5,pb,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pb))}for(let pa3 of AEnds)for(let eB of B5.edges)if(onSegment5(pa3,eB.from,eB.to,tol)){let hasCorner=incidentEdgesAtPoint(A4,pa3,tol).some(eA=>!isParallel(eA,eB,tol)),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B5,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B5,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pa3))}for(let pb of BEnds)for(let eA of A4.edges)if(onSegment5(pb,eA.from,eA.to,tol)){let hasCorner=incidentEdgesAtPoint(B5,pb,tol).some(eB=>!isParallel(eA,eB,tol)),bCorner=getCornerOrientationAtPoint(B5,pb,tol),aEndpointNearPb=nearestEndpointOnTrace(A4,pb,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A4,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B5.source_trace_id].push(pb),A4.source_trace_id!==B5.source_trace_id&&result[A4.source_trace_id].push(pb))}}}for(let id2 of Object.keys(result))result[id2]=dedupePoints(result[id2],tol);return result}var debug7=(0,import_debug16.default)("Group_doInitialSchematicTraceRender");function applyTracesFromSolverOutput(args){let{group,solver,pinIdToSchematicPortId,userNetIdToSck}=args,{db:db2}=group.root,traces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug7(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug7(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let edges=[];for(let i2=0;i2<points.length-1;i2++)edges.push({from:{x:points[i2].x,y:points[i2].y},to:{x:points[i2+1].x,y:points[i2+1].y}});let source_trace_id=null,subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let pA=pinIdToSchematicPortId.get(solvedTracePath.pins[0]?.pinId),pB=pinIdToSchematicPortId.get(solvedTracePath.pins[1]?.pinId);if(pA&&pB){for(let schPid of[pA,pB])db2.schematic_port.get(schPid)&&db2.schematic_port.update(schPid,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))}}source_trace_id||(source_trace_id=`solver_${solvedTracePath?.mspPairId}`,subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key})}debug7(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t35=>({source_trace_id:t35.source_trace_id,edges:t35.edges}))),junctionsById=computeJunctions(withCrossings);for(let t35 of withCrossings)db2.schematic_trace.insert({source_trace_id:t35.source_trace_id,edges:t35.edges,junctions:junctionsById[t35.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTraces.find(p4=>p4.source_trace_id===t35.source_trace_id)?.subcircuit_connectivity_map_key})}var oppositeSide2=input2=>{switch(input2){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},getNetNameFromPorts=ports=>{for(let port of ports){let traces=port._getDirectlyConnectedTraces();for(let trace of traces){let displayLabel=trace._parsedProps.schDisplayLabel;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0}}}return{name:ports.map(p4=>p4._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender");function applyNetLabelPlacements(args){let{group,solver,sckToSourceNet,allScks,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,userNetIdToSck,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}=args,{db:db2}=group.root,netLabelPlacements=solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of netLabelPlacements){debug8(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id2=>userNetIdToSck.get(id2)),placementSck=userNetIdToSck.get(placementUserNetId),anchor_position=placement.anchorPoint,orientation5=placement.orientation,anchor_side=oppositeSide2(orientation5),sourceNet=placementSck?sckToSourceNet.get(placementSck):void 0,schPortIds=placement.pinIds.map(pinId=>pinIdToSchematicPortId.get(pinId));if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let text2=sourceNet.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2});db2.schematic_net_label.insert({text:text2,anchor_position,center:center22,anchor_side,...sourceNet?.source_net_id?{source_net_id:sourceNet.source_net_id}:{}});continue}let ports=group.selectAll("port").filter(p4=>p4._getSubcircuitConnectivityKey()===placementSck),{name:text,wasAssignedDisplayLabel}=getNetNameFromPorts(ports);if(!wasAssignedDisplayLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed traces and no display label`);continue}let center2=computeSchematicNetLabelCenter({anchor_position,anchor_side,text});db2.schematic_net_label.insert({text,anchor_position,center:center2,anchor_side})}}var insertNetLabelsForPortsMissingTrace=({allSourceAndSchematicPortIdsInScope,group,schPortIdToSourcePortId,sckToSourceNet:connKeyToNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})=>{let{db:db2}=group.root;for(let schOrSrcPortId of Array.from(allSourceAndSchematicPortIdsInScope)){let schPort=db2.schematic_port.get(schOrSrcPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schOrSrcPortId);if(!srcPortId)continue;let key=db2.source_port.get(srcPortId)?.subcircuit_connectivity_map_key;if(!key)continue;let sourceNet=connKeyToNet.get(key);if(!sourceNet||db2.schematic_net_label.list().some(nl3=>Math.abs(nl3.anchor_position.x-schPort.center.x)<.1&&Math.abs(nl3.anchor_position.y-schPort.center.y)<.1?sourceNet.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.text===(sourceNet.name||key):!1))continue;let text=sourceNet.name||sourceNet.source_net_id||key,side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right",center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text});db2.schematic_net_label.insert({text,anchor_position:schPort.center,center:center2,anchor_side:side,...sourceNet.source_net_id?{source_net_id:sourceNet.source_net_id}:{}})}},getSchematicPortIdsWithAssignedNetLabels=group=>{let schematicPortIdsWithNetLabels=new Set,netLabels=group.selectAll("netlabel");for(let netLabel of netLabels){let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(port.schematic_port_id)}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver,pinIdToSchematicPortId})=>{let solvedTraces=solver.schematicTraceLinesSolver.solvedTracePaths,schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces)for(let pinId of solvedTrace.pinIds){let schPortId=pinIdToSchematicPortId.get(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}return schematicPortIdsWithRoutedTraces},debug9=(0,import_debug15.default)("Group_doInitialSchematicTraceRender"),Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let{inputProblem,pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks,userNetIdToSck}=createSchematicTraceSolverInputProblem(group),schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(group);debug9.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem);solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver,pinIdToSchematicPortId});applyTracesFromSolverOutput({group,solver,pinIdToSchematicPortId,userNetIdToSck}),applyNetLabelPlacements({group,solver,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,pinIdToSchematicPortId,allScks,userNetIdToSck,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}),insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,sckToSourceNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})},getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),SIMULATION_COLOR_PALETTE=["rgb(132, 0, 0)","rgb(194, 194, 0)","rgb(194, 0, 194)","rgb(194, 0, 0)","rgb(0, 132, 132)","rgb(0, 132, 0)","rgb(0, 0, 132)","rgb(132, 132, 132)","rgb(132, 0, 132)","rgb(194, 194, 194)","rgb(132, 0, 132)","rgb(132, 0, 0)","rgb(132, 132, 0)","rgb(194, 194, 194)","rgb(0, 0, 132)","rgb(0, 132, 0)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id2){if(idToColorMap.has(id2))return idToColorMap.get(id2);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id2,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var debug10=(0,import_debug18.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSims=group.selectAll("analogsimulation");if(analogSims.length===0)return;let voltageProbes=group.selectAll("voltageprobe");resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());let circuitJson=root.db.toArray(),spiceString,spiceNetlist;try{spiceNetlist=circuitJsonToSpice(circuitJson),spiceString=spiceNetlist.toSpiceString(),debug10(`Generated SPICE string:
|
|
650
|
-
${spiceString}`)}catch(error){debug10(`Failed to convert circuit JSON to SPICE: ${error}`);return}for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbes.find(p4=>p4.finalProbeName===element.name);probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error){debug10(`Simulation failed for engine ${engineName}: ${error}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error instanceof Error?error.message:String(error)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db2}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t35=>{let source_trace2=db2.source_trace.get(t35.source_trace_id);return source_trace2?[source_trace2.source_trace_id,...source_trace2.connected_source_port_ids,...source_trace2.connected_source_net_ids]:null}).filter(c3=>c3!==null));let sourceNets=db2.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db2.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db2.source_trace.get(trace.source_trace_id);if(source_trace2)for(let id2 of source_trace2.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db2.source_trace.get(trace.source_trace_id);if(source_trace2)for(let source_net_id of source_trace2.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getJumperPadInfos(db2){let padInfos=[],jumperSmtpads=db2.pcb_smtpad.list().filter(pad2=>{let component=db2.pcb_component.get(pad2.pcb_component_id);return component?db2.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x5,y5,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x5)<tolerance&&Math.abs(pad2.y-y5)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x5,y5){for(let pad2 of padInfos)if(x5>=pad2.minX&&x5<=pad2.maxX&&y5>=pad2.minY&&y5<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(currentSegment.push(point6),point6.route_type==="wire"&&i2>0&&i2<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db2){let padInfos=getJumperPadInfos(db2);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation5){let groups=[];for(let pad2 of pads){let key=orientation5==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation5==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g7=>g7.length>=2)}function insertAutoplacedJumpers(params){let{db:db2,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db2.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation4=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db2.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation4,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db2.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db2.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db2.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i2=0;i2<wireAndViaRoutes.length;i2++){let p4=wireAndViaRoutes[i2];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i2),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i2)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a2,b3)=>a2.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return console.log("width or height is not a number"),anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var Group6=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group2=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group2.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group2.source_group_id}`,db2.source_group.update(source_group2.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.children)db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db2.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db2.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group2=db2.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group2.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group2.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db2.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let center2=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};db2.pcb_group.update(this.pcb_group_id,{width:Number(props.width??width),height:Number(props.height??height),center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a360,_b2;return(_a360=this.unnamedElementCounter)[_b2=elm.lowercaseComponentName]??(_a360[_b2]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db2}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g7=>g7.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),traces=this.selectAll("trace");return debug112(`[${this.getString()}] has ${traces.length} traces to route`),traces.length>0}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db2.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id});if(isAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,autorouterConfig2.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=autorouterConfig2.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=qn2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(autorouterConfig2.algorithmFn)autorouter=await autorouterConfig2.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:this.props.autorouter?.capacityDepth,targetMinCapacity:this.props.autorouter?.targetMinCapacity,useAssignableSolver:isLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:isAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let outputJumpers=[],solver=autorouter.solver;solver?.getOutputJumpers&&(outputJumpers=solver.getOutputJumpers()||[]),this._asyncAutoroutingResult={output_pcb_traces:traces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}catch(error){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error instanceof Error?error.message:String(error)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error instanceof Error?error.message:String(error)},simpleRouteJson}),error}finally{autorouter.stop()}}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db2}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db2}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace2=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id});for(let pcb_trace2 of output_pcb_traces){if(pcb_trace2.type!=="pcb_trace")continue;if(pcb_trace2.subcircuit_id=this.subcircuit_id,pcb_trace2.connection_name){let sourceTraceId=pcb_trace2.connection_name;pcb_trace2.source_trace_id=sourceTraceId}let segments=splitPcbTracesOnJumperSegments(pcb_trace2.route);segments===null&&(segments=[pcb_trace2.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)segment2.length>0&&db2.pcb_trace.insert({...pcb_trace2,route:segment2})}for(let pcb_trace2 of output_pcb_traces)if(pcb_trace2.type!=="pcb_via"&&pcb_trace2.type==="pcb_trace")for(let point6 of pcb_trace2.route)point6.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group2=db2.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group2.schematic_group_id;for(let child of this.children)child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group2.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db2}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db2.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db2.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db2.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db2.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db2}=this.root,subtree=db2;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position2){return super._repositionOnPcb(position2)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{subcircuit,groupsMap}=inflatorContext,group=new Group6({name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`});return group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db2}=root,pcb_port2=db2.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port2.pcb_port_id}}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let isSameAsFirst=point6.x===firstPoint.x&&point6.y===firstPoint.y,isSameAsLast=point6.x===lastPoint.x&&point6.y===lastPoint.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>point6.route_type==="via"?{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer}:{x:point6.x,y:point6.y})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt4=>pt4.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:pcbTrace&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line"],standalonePrimitives=injectionDb.toArray().filter(elm=>standalonePrimitiveTypes.includes(elm.type)&&"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0));if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g7=>!g7.parent_source_group_id||renderedGroupIds.has(g7.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g7=>g7.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1134",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/capacity-autorouter":"^0.0.398","@tscircuit/checks":"0.0.115","@tscircuit/circuit-json-util":"^0.0.90","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.20","@tscircuit/footprinter":"^0.0.333","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.502","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.403","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.91","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.337",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.89",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.68","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c3=>c3.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group6({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db2}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e4=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
649
|
+
`)}function parseSegment(seg){let bracketIdx=seg.indexOf("[");if(bracketIdx===-1)return{tag:seg};let tag=seg.slice(0,bracketIdx),m3=seg.slice(bracketIdx+1,seg.lastIndexOf("]")).match(/^(\w+)(\^=|\$=|=)['"]?(.*?)['"]?$/);return m3?{tag,attrName:m3[1],attrOp:m3[2],attrValue:m3[3]}:{tag}}function componentMatchesSegment(component,seg){if(component.lowercaseComponentName!==seg.tag)return!1;if(!seg.attrName)return!0;let attrVal=component.props?.[seg.attrName];if(attrVal===void 0)return!1;let valStr=String(attrVal);switch(seg.attrOp){case"^=":return valStr.startsWith(seg.attrValue);case"$=":return valStr.endsWith(seg.attrValue);case"=":return valStr===seg.attrValue;default:return!1}}function matchesCompoundSelector(component,segments){if(!componentMatchesSegment(component,segments[segments.length-1]))return!1;let segIdx=segments.length-2,current2=component.parent;for(;segIdx>=0&¤t2;)componentMatchesSegment(current2,segments[segIdx])&&segIdx--,current2=current2.parent;return segIdx<0}function resolvePcbProperty({propertyName,resolvedPcbSx,pathFromAmpersand,component}){if(!resolvedPcbSx)return;let result,bestSpecificity=0;for(let[key,entry]of Object.entries(resolvedPcbSx)){if(!entry||!(propertyName in entry))continue;let selectorBody=key.startsWith("& ")?key.slice(2):key;if(selectorBody===pathFromAmpersand){1>bestSpecificity&&(bestSpecificity=1,result=entry[propertyName]);continue}if(!component)continue;let segments=selectorBody.split(/\s+/).map(parseSegment);if(!(segments.length<2)&&matchesCompoundSelector(component,segments)){let specificity=segments.length;specificity>bestSpecificity&&(bestSpecificity=specificity,result=entry[propertyName])}}return result}var FabricationNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_fabrication_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteText",zodProps:fabricationNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit();if(resolvePcbProperty({propertyName:"visibility",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"fabricationnotetext",component:this})==="hidden")return;let pcb_fabrication_note_text2=db2.pcb_fabrication_note_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:props.fontSize??1,layer:"top",color:props.color,text:normalizeTextForCircuitJson(props.text??""),pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_fabrication_note_text_id=pcb_fabrication_note_text2.pcb_fabrication_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:(props.text??"").length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_fabrication_note_text_id){let text=db2.pcb_fabrication_note_text.get(this.pcb_fabrication_note_text_id);text&&db2.pcb_fabrication_note_text.update(this.pcb_fabrication_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},Hole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_hole_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Hole",zodProps:holeProps}}getPcbSize(){let{_parsedProps:props}=this,isPill=props.shape==="pill",isRect=props.shape==="rect";return isPill?{width:props.width,height:props.height}:isRect?{width:props.width,height:props.height}:{width:props.diameter,height:props.diameter}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin),props.shape==="pill")if(props.pcbRotation&&props.pcbRotation!==0){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rotated_pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,ccw_rotation:props.pcbRotation,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"pill",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else if(props.shape==="rect"){let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"rect",hole_width:props.width,hole_height:props.height,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}else{let inserted_hole=db2.pcb_hole.insert({pcb_component_id,type:"pcb_hole",hole_shape:"circle",hole_diameter:props.diameter,x:position2.x,y:position2.y,soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_hole_id=inserted_hole.pcb_hole_id}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,hole=db2.pcb_hole.get(this.pcb_hole_id),size2=this.getPcbSize();return{center:{x:hole.x,y:hole.y},bounds:{left:hole.x-size2.width/2,top:hole.y-size2.height/2,right:hole.x+size2.width/2,bottom:hole.y+size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_hole.update(this.pcb_hole_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_hole_id)return;let hole=db2.pcb_hole.get(this.pcb_hole_id);hole&&db2.pcb_hole.update(this.pcb_hole_id,{x:hole.x+deltaX,y:hole.y+deltaY})}},Keepout=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_keepout_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Keepout",zodProps:pcbKeepoutProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let subcircuit=this.getSubcircuit(),{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),decomposedMat=decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()),isRotated90=Math.abs(decomposedMat.rotation.angle*(180/Math.PI)-90)%180<.01,pcb_keepout2=null;props.shape==="circle"?pcb_keepout2=db2.pcb_keepout.insert({layers:["top"],shape:"circle",radius:props.radius,center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0}):props.shape==="rect"&&(pcb_keepout2=db2.pcb_keepout.insert({layers:["top"],shape:"rect",...isRotated90?{width:props.height,height:props.width}:{width:props.width,height:props.height},center:{x:position2.x,y:position2.y},subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0})),pcb_keepout2&&(this.pcb_keepout_id=pcb_keepout2.pcb_keepout_id)}getPcbSize(){let{_parsedProps:props}=this;return props.shape==="circle"?{width:props.radius*2,height:props.radius*2}:props.shape==="rect"?{width:props.width,height:props.height}:{width:0,height:0}}},PcbNoteLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteLine",zodProps:pcbNoteLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),group=this.getGroup(),transform5=this._computePcbGlobalTransformBeforeLayout(),start=applyToPoint2(transform5,{x:props.x1,y:props.y1}),end=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_line2=db2.pcb_note_line.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,x1:start.x,y1:start.y,x2:end.x,y2:end.y,stroke_width:props.strokeWidth??.1,color:props.color,is_dashed:props.isDashed});this.pcb_note_line_id=pcb_note_line2.pcb_note_line_id}getPcbSize(){let{_parsedProps:props}=this;return{width:Math.abs(props.x2-props.x1),height:Math.abs(props.y2-props.y1)}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_line_id)return;let line2=db2.pcb_note_line.get(this.pcb_note_line_id);line2&&db2.pcb_note_line.update(this.pcb_note_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},PcbNotePath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNotePath",zodProps:pcbNotePathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...rest}=point6,numericX=typeof x5=="string"?parseFloat(x5):x5,numericY=typeof y5=="string"?parseFloat(y5):y5,transformed=applyToPoint2(transform5,{x:numericX,y:numericY});return{...rest,x:transformed.x,y:transformed.y}}),pcb_note_path2=db2.pcb_note_path.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,route:transformedRoute,stroke_width:props.strokeWidth??.1,color:props.color});this.pcb_note_path_id=pcb_note_path2.pcb_note_path_id}getPcbSize(){let{_parsedProps:props}=this;if(props.route.length===0)return{width:0,height:0};let xs3=props.route.map(point6=>typeof point6.x=="string"?parseFloat(point6.x):point6.x),ys3=props.route.map(point6=>typeof point6.y=="string"?parseFloat(point6.y):point6.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_path_id)return;let path=db2.pcb_note_path.get(this.pcb_note_path_id);path&&db2.pcb_note_path.update(this.pcb_note_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}},PcbNoteRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteRect",zodProps:pcbNoteRectProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),center2=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_rect2=db2.pcb_note_rect.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,center:center2,width:props.width,height:props.height,stroke_width:props.strokeWidth??.1,is_filled:props.isFilled??!1,has_stroke:props.hasStroke??!0,is_stroke_dashed:props.isStrokeDashed??!1,color:props.color,corner_radius:props.cornerRadius??void 0});this.pcb_note_rect_id=pcb_note_rect2.pcb_note_rect_id}getPcbSize(){let{_parsedProps:props}=this,width=typeof props.width=="string"?parseFloat(props.width):props.width,height=typeof props.height=="string"?parseFloat(props.height):props.height;return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_rect_id)return;let rect=db2.pcb_note_rect.get(this.pcb_note_rect_id);rect&&db2.pcb_note_rect.update(this.pcb_note_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},PcbNoteText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_text_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteText",zodProps:pcbNoteTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),anchorPosition=applyToPoint2(transform5,{x:0,y:0}),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,pcb_note_text2=db2.pcb_note_text.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,font:props.font??"tscircuit2024",font_size:props.fontSize??1,text:normalizeTextForCircuitJson(props.text),anchor_position:anchorPosition,anchor_alignment:props.anchorAlignment??"center",color:props.color});this.pcb_note_text_id=pcb_note_text2.pcb_note_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=typeof props.fontSize=="string"?parseFloat(props.fontSize):props.fontSize??1,charWidth=fontSize*.6;return{width:props.text.length*charWidth,height:fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_text_id)return;let text=db2.pcb_note_text.get(this.pcb_note_text_id);text&&db2.pcb_note_text.update(this.pcb_note_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},pcbTraceProps2=external_exports.object({route:external_exports.array(pcb_trace_route_point),source_trace_id:external_exports.string().optional()}),PcbTrace=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_trace_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbTrace",zodProps:pcbTraceProps2}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),subcircuit=this.getSubcircuit(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),parentTransform=this._computePcbGlobalTransformBeforeLayout(),transformedRoute=props.route.map(point6=>{let{x:x5,y:y5,...restOfPoint}=point6,transformedPoint=applyToPoint2(parentTransform,{x:x5,y:y5});return point6.route_type==="wire"&&point6.layer?{...transformedPoint,...restOfPoint,layer:maybeFlipLayer(point6.layer)}:{...transformedPoint,...restOfPoint}}),pcb_trace2=db2.pcb_trace.insert({pcb_component_id:container.pcb_component_id,source_trace_id:props.source_trace_id,route:transformedRoute,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_trace_id=pcb_trace2.pcb_trace_id}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y),point6.route_type==="wire"&&(minX=Math.min(minX,point6.x-point6.width/2),maxX=Math.max(maxX,point6.x+point6.width/2),minY=Math.min(minY,point6.y-point6.width/2),maxY=Math.max(maxY,point6.y+point6.width/2));return minX===1/0||maxX===-1/0||minY===1/0||maxY===-1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}},PlatedHole=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_plated_hole_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PlatedHole",zodProps:platedHoleProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.outerDiameter,height:props.outerDiameter};if(props.shape==="oval"||props.shape==="pill")return{width:props.outerWidth,height:props.outerHeight};if(props.shape==="circular_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="pill_hole_with_rect_pad")return{width:props.rectPadWidth,height:props.rectPadHeight};if(props.shape==="hole_with_polygon_pad"){if(!props.padOutline||props.padOutline.length===0)throw new Error("padOutline is required for hole_with_polygon_pad shape");let xs3=props.padOutline.map(p4=>typeof p4.x=="number"?p4.x:parseFloat(String(p4.x))),ys3=props.padOutline.map(p4=>typeof p4.y=="number"?p4.y:parseFloat(String(p4.y))),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,platedHole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id),size2=this.getPcbSize();return{center:{x:platedHole.x,y:platedHole.y},bounds:{left:platedHole.x-size2.width/2,top:platedHole.y+size2.height/2,right:platedHole.x+size2.width/2,bottom:platedHole.y-size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this._parsedProps.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this._parsedProps.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,subcircuit=this.getSubcircuit(),soldermaskMargin=props.solderMaskMargin,isCoveredWithSolderMask=props.coveredWithSolderMask??!1;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let finalRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360;if(props.shape==="circle"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_diameter:props.outerDiameter,hole_diameter:props.holeDiameter,shape:"circle",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:"circle",radius:props.outerDiameter/2,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="pill"&&props.rectPad){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:"rotated_pill_hole_with_rect_pad",type:"pcb_plated_hole",port_hints:this.getNameAndAliases(),pcb_plated_hole_id:this.pcb_plated_hole_id,x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_shape:"rotated_pill",pad_shape:"rect",hole_ccw_rotation:props.pcbRotation??0,rect_ccw_rotation:props.pcbRotation??0,rect_pad_width:props.outerWidth,rect_pad_height:props.outerHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill"||props.shape==="oval"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,outer_width:props.outerWidth,outer_height:props.outerHeight,hole_width:props.holeWidth,hole_height:props.holeHeight,shape:props.shape,port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,ccw_rotation:props.pcbRotation??0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id,db2.pcb_solder_paste.insert({layer:"top",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),db2.pcb_solder_paste.insert({layer:"bottom",shape:props.shape,width:props.outerWidth,height:props.outerHeight,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="circular_hole_with_rect_pad"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_diameter:props.holeDiameter,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,shape:"circular_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,rect_border_radius:props.rectBorderRadius??0,rect_ccw_rotation:finalRotationDegrees});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="pill_hole_with_rect_pad"){let pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,hole_width:props.holeWidth,hole_height:props.holeHeight,rect_pad_width:props.rectPadWidth,rect_pad_height:props.rectPadHeight,hole_offset_x:props.holeOffsetX,hole_offset_y:props.holeOffsetY,shape:"pill_hole_with_rect_pad",port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}else if(props.shape==="hole_with_polygon_pad"){let padOutline=(props.padOutline||[]).map(point6=>{let x5=typeof point6.x=="number"?point6.x:parseFloat(String(point6.x)),y5=typeof point6.y=="number"?point6.y:parseFloat(String(point6.y));return{x:x5,y:y5}}),pcb_plated_hole2=db2.pcb_plated_hole.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,shape:"hole_with_polygon_pad",hole_shape:props.holeShape||"circle",hole_diameter:props.holeDiameter,hole_width:props.holeWidth,hole_height:props.holeHeight,pad_outline:padOutline,hole_offset_x:typeof props.holeOffsetX=="number"?props.holeOffsetX:parseFloat(String(props.holeOffsetX||0)),hole_offset_y:typeof props.holeOffsetY=="number"?props.holeOffsetY:parseFloat(String(props.holeOffsetY||0)),port_hints:this.getNameAndAliases(),x:position2.x,y:position2.y,layers:["top","bottom"],soldermask_margin:soldermaskMargin,is_covered_with_solder_mask:isCoveredWithSolderMask,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_plated_hole_id=pcb_plated_hole2.pcb_plated_hole_id}}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_plated_hole.update(this.pcb_plated_hole_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_plated_hole_id)return;let hole=db2.pcb_plated_hole.get(this.pcb_plated_hole_id);if(hole){let newCenter={x:hole.x+deltaX,y:hole.y+deltaY};this._setPositionFromLayout(newCenter)}}},SilkscreenCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_circle_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenCircle",zodProps:silkscreenCircleProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenCircle. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_circle2=db2.pcb_silkscreen_circle.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},radius:props.radius,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1});this.pcb_silkscreen_circle_id=pcb_silkscreen_circle2.pcb_silkscreen_circle_id}getPcbSize(){let{_parsedProps:props}=this,diameter=props.radius*2;return{width:diameter,height:diameter}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_circle_id)return;let circle2=db2.pcb_silkscreen_circle.get(this.pcb_silkscreen_circle_id);circle2&&db2.pcb_silkscreen_circle.update(this.pcb_silkscreen_circle_id,{center:{x:circle2.center.x+deltaX,y:circle2.center.y+deltaY}})}},SilkscreenLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_line_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenLine",zodProps:silkscreenLineProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenLine. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),transform5=this._computePcbGlobalTransformBeforeLayout(),p12=applyToPoint2(transform5,{x:props.x1,y:props.y1}),p22=applyToPoint2(transform5,{x:props.x2,y:props.y2}),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_line2=db2.pcb_silkscreen_line.insert({pcb_component_id,layer,x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y,stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:subcircuit?.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_line_id=pcb_silkscreen_line2.pcb_silkscreen_line_id}getPcbSize(){let{_parsedProps:props}=this,width=Math.abs(props.x2-props.x1),height=Math.abs(props.y2-props.y1);return{width,height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_line_id)return;let line2=db2.pcb_silkscreen_line.get(this.pcb_silkscreen_line_id);line2&&db2.pcb_silkscreen_line.update(this.pcb_silkscreen_line_id,{x1:line2.x1+deltaX,y1:line2.y1+deltaY,x2:line2.x2+deltaX,y2:line2.y2+deltaY})}},SilkscreenPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_path_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenPath",zodProps:silkscreenPathProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenPath. Must be "top" or "bottom".`);let transform5=this._computePcbGlobalTransformBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_path2=db2.pcb_silkscreen_path.insert({pcb_component_id,layer,route:props.route.map(p4=>{let transformedPosition=applyToPoint2(transform5,{x:p4.x,y:p4.y});return{...p4,x:transformedPosition.x,y:transformedPosition.y}}),stroke_width:props.strokeWidth??.1,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_id=pcb_silkscreen_path2.pcb_silkscreen_path_id}_setPositionFromLayout(newCenter){let{db:db2}=this.root,{_parsedProps:props}=this,currentPath=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);if(!currentPath)return;let currentCenterX=0,currentCenterY=0;for(let point6 of currentPath.route)currentCenterX+=point6.x,currentCenterY+=point6.y;currentCenterX/=currentPath.route.length,currentCenterY/=currentPath.route.length;let offsetX=newCenter.x-currentCenterX,offsetY=newCenter.y-currentCenterY,newRoute=currentPath.route.map(point6=>({...point6,x:point6.x+offsetX,y:point6.y+offsetY}));db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:newRoute})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_path_id)return;let path=db2.pcb_silkscreen_path.get(this.pcb_silkscreen_path_id);path&&db2.pcb_silkscreen_path.update(this.pcb_silkscreen_path_id,{route:path.route.map(p4=>({...p4,x:p4.x+deltaX,y:p4.y+deltaY}))})}getPcbSize(){let{_parsedProps:props}=this;if(!props.route||props.route.length===0)return{width:0,height:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let point6 of props.route)minX=Math.min(minX,point6.x),maxX=Math.max(maxX,point6.x),minY=Math.min(minY,point6.y),maxY=Math.max(maxY,point6.y);return{width:maxX-minX,height:maxY-minY}}},SilkscreenRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_rect_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenRect",zodProps:silkscreenRectProps}}_isRotated90Degrees(){let globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(globalTransform).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01;return Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for SilkscreenRect. Must be "top" or "bottom".`);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),isRotated90Degrees=this._isRotated90Degrees(),finalWidth=isRotated90Degrees?props.height:props.width,finalHeight=isRotated90Degrees?props.width:props.height,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_silkscreen_rect2=db2.pcb_silkscreen_rect.insert({pcb_component_id,layer,center:{x:position2.x,y:position2.y},width:finalWidth,height:finalHeight,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this?.getGroup()?.pcb_group_id??void 0,stroke_width:props.strokeWidth??.1,is_filled:props.filled??!1,corner_radius:props.cornerRadius??void 0});this.pcb_silkscreen_rect_id=pcb_silkscreen_rect2.pcb_silkscreen_rect_id}getPcbSize(){let{_parsedProps:props}=this;return this._isRotated90Degrees()?{width:props.height,height:props.width}:{width:props.width,height:props.height}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_silkscreen_rect_id)return;let rect=db2.pcb_silkscreen_rect.get(this.pcb_silkscreen_rect_id);rect&&db2.pcb_silkscreen_rect.update(this.pcb_silkscreen_rect_id,{center:{x:rect.center.x+deltaX,y:rect.center.y+deltaY}})}},SilkscreenText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_text_ids",[]);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"_footprinterFontSize")}get config(){return{componentName:"SilkscreenText",zodProps:silkscreenTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers(),subcircuit=this.getSubcircuit(),rotation4=0;if(props.pcbRotation!==void 0&&props.pcbRotation!==0)rotation4=props.pcbRotation;else{let globalTransform=this._computePcbGlobalTransformBeforeLayout();rotation4=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI}isFlipped&&(rotation4=(rotation4+180)%360);let uniqueLayers=new Set(props.layers);props.layer&&uniqueLayers.add(props.layer);let targetLayers=uniqueLayers.size>0?Array.from(uniqueLayers):["top"],resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbX=resolvePcbProperty({propertyName:"pcbX",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),resolvedPcbSxPcbY=resolvePcbProperty({propertyName:"pcbY",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,position2=(resolvedPcbSxPcbX!==void 0||resolvedPcbSxPcbY!==void 0)&&this._footprinterFontSize!==void 0?applyToPoint2(compose2(this.parent?._computePcbGlobalTransformBeforeLayout()??identity(),isFlipped?flipY():identity()),{x:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbX??props.pcbX??0,axis:"pcbX"}),y:this.resolvePcbCoordinate({rawValue:resolvedPcbSxPcbY??props.pcbY??0,axis:"pcbY"})}):this._getGlobalPcbPositionBeforeLayout(),uniformPadding=props.knockoutPadding??0,knockoutPadding=props.knockoutPadding!==void 0||props.knockoutPaddingLeft!==void 0||props.knockoutPaddingRight!==void 0||props.knockoutPaddingTop!==void 0||props.knockoutPaddingBottom!==void 0?{left:props.knockoutPaddingLeft??uniformPadding,right:props.knockoutPaddingRight??uniformPadding,top:props.knockoutPaddingTop??uniformPadding,bottom:props.knockoutPaddingBottom??uniformPadding}:void 0,text=this._resolveText();for(let layer of targetLayers){let pcb_silkscreen_text2=db2.pcb_silkscreen_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:props.font??"tscircuit2024",font_size:fontSize,layer:maybeFlipLayer(layer),text:normalizeTextForCircuitJson(text),ccw_rotation:rotation4,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,is_knockout:props.isKnockout,knockout_padding:knockoutPadding});this.pcb_silkscreen_text_ids.push(pcb_silkscreen_text2.pcb_silkscreen_text_id)}}getPcbSize(){let{_parsedProps:props}=this,resolvedPcbSxFontSize=resolvePcbProperty({propertyName:"fontSize",resolvedPcbSx:this.getResolvedPcbSx(),pathFromAmpersand:"silkscreentext",component:this}),fontSize=props.fontSize??resolvedPcbSxFontSize??this.getInheritedProperty("pcbStyle")?.silkscreenFontSize??this._footprinterFontSize??1,textWidth=this._resolveText().length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;for(let id2 of this.pcb_silkscreen_text_ids){let text=db2.pcb_silkscreen_text.get(id2);text&&db2.pcb_silkscreen_text.update(id2,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}}},SmtPad=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SmtPad",zodProps:smtPadProps}}getPcbSize(){let{_parsedProps:props}=this;if(props.shape==="circle")return{width:props.radius*2,height:props.radius*2};if(props.shape==="rect")return{width:props.width,height:props.height};if(props.shape==="rotated_rect"){let angleRad=(props.ccwRotation??0)*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),width=Math.abs(props.width*cosAngle)+Math.abs(props.height*sinAngle),height=Math.abs(props.width*sinAngle)+Math.abs(props.height*cosAngle);return{width,height}}if(props.shape==="polygon"){let points=props.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{width:maxX-minX,height:maxY-minY}}if(props.shape==="pill")return{width:props.width,height:props.height};throw new Error(`getPcbSize for shape "${props.shape}" not implemented for ${this.componentName}`)}doInitialPortMatching(){let parentPorts=this.getPrimitiveContainer()?.selectAll("port");if(this.props.portHints){for(let port of parentPorts)if(port.isMatchingAnyOf(this.props.portHints)){this.matchedPort=port,port.registerMatch(this);return}}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,isCoveredWithSolderMask=props.coveredWithSolderMask??!1,shouldCreateSolderPaste=!isCoveredWithSolderMask,soldermaskMargin=props.solderMaskMargin;this.emitSolderMaskMarginWarning(isCoveredWithSolderMask,soldermaskMargin);let subcircuit=this.getSubcircuit(),position2=this._getGlobalPcbPositionBeforeLayout(),globalTransform=this._computePcbGlobalTransformBeforeLayout(),normalizedRotationDegrees=(decomposeTSR2(this._computePcbGlobalTransformBeforeLayout()).rotation.angle*180/Math.PI%360+360)%360,rotationTolerance=.01,isAxisAligned=Math.abs(normalizedRotationDegrees)<rotationTolerance||Math.abs(normalizedRotationDegrees-180)<rotationTolerance||Math.abs(normalizedRotationDegrees-360)<rotationTolerance,isRotated90Degrees=Math.abs(normalizedRotationDegrees-90)<rotationTolerance||Math.abs(normalizedRotationDegrees-270)<rotationTolerance,finalRotationDegrees=Math.abs(normalizedRotationDegrees-360)<rotationTolerance?0:normalizedRotationDegrees,transformRotationBeforeFlip=finalRotationDegrees,{maybeFlipLayer,isFlipped}=this._getPcbPrimitiveFlippedHelpers();isFlipped&&(finalRotationDegrees=(360-finalRotationDegrees+360)%360);let portHints2=props.portHints?.map(ph3=>ph3.toString())??[],pcb_smtpad2=null,pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id;if(props.shape==="circle")pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"circle",radius:props.radius,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:pcb_smtpad2.layer,shape:"circle",radius:pcb_smtpad2.radius*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});else if(props.shape==="rect")!isAxisAligned&&!isRotated90Degrees?pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:finalRotationDegrees,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:isRotated90Degrees?props.height:props.width,height:isRotated90Degrees?props.width:props.height,corner_radius:props.cornerRadius??void 0,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,x:position2.x,y:position2.y,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&(pcb_smtpad2.shape==="rect"?db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}):pcb_smtpad2.shape==="rotated_rect"&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:pcb_smtpad2.x,y:pcb_smtpad2.y,ccw_rotation:pcb_smtpad2.ccw_rotation,pcb_component_id:pcb_smtpad2.pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));else if(props.shape==="rotated_rect"){let baseRotation=props.ccwRotation??0,combinedRotationBeforeFlip=(transformRotationBeforeFlip+baseRotation+360)%360,padRotation=isFlipped?(360-combinedRotationBeforeFlip+360)%360:combinedRotationBeforeFlip;pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:props.width,height:props.height,corner_radius:props.cornerRadius??void 0,x:position2.x,y:position2.y,ccw_rotation:padRotation,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}),shouldCreateSolderPaste&&db2.pcb_solder_paste.insert({layer:maybeFlipLayer(props.layer??"top"),shape:"rotated_rect",width:pcb_smtpad2.width*.7,height:pcb_smtpad2.height*.7,x:position2.x,y:position2.y,ccw_rotation:padRotation,pcb_component_id,pcb_smtpad_id:pcb_smtpad2.pcb_smtpad_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else if(props.shape==="polygon"){let transformedPoints=props.points.map(point6=>{let transformed=applyToPoint2(globalTransform,{x:distance.parse(point6.x),y:distance.parse(point6.y)});return{x:transformed.x,y:transformed.y}});pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"polygon",points:transformedPoints,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0})}else props.shape==="pill"&&(pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,layer:maybeFlipLayer(props.layer??"top"),shape:"pill",x:position2.x,y:position2.y,radius:props.radius,height:props.height,width:props.width,port_hints:portHints2,is_covered_with_solder_mask:isCoveredWithSolderMask,soldermask_margin:soldermaskMargin,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0}));pcb_smtpad2&&(this.pcb_smtpad_id=pcb_smtpad2.pcb_smtpad_id)}doInitialPcbPortAttachment(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{pcb_port_id:this.matchedPort?.pcb_port_id})}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,smtpad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(smtpad2.shape==="rect")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.width/2,top:smtpad2.y+smtpad2.height/2,right:smtpad2.x+smtpad2.width/2,bottom:smtpad2.y-smtpad2.height/2},width:smtpad2.width,height:smtpad2.height};if(smtpad2.shape==="rotated_rect"){let angleRad=smtpad2.ccw_rotation*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),w22=smtpad2.width/2,h22=smtpad2.height/2,xExtent=Math.abs(w22*cosAngle)+Math.abs(h22*sinAngle),yExtent=Math.abs(w22*sinAngle)+Math.abs(h22*cosAngle);return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-xExtent,right:smtpad2.x+xExtent,top:smtpad2.y-yExtent,bottom:smtpad2.y+yExtent},width:xExtent*2,height:yExtent*2}}if(smtpad2.shape==="circle")return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-smtpad2.radius,top:smtpad2.y-smtpad2.radius,right:smtpad2.x+smtpad2.radius,bottom:smtpad2.y+smtpad2.radius},width:smtpad2.radius*2,height:smtpad2.radius*2};if(smtpad2.shape==="polygon"){let points=smtpad2.points,xs3=points.map(p4=>p4.x),ys3=points.map(p4=>p4.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{center:{x:(minX+maxX)/2,y:(minY+maxY)/2},bounds:{left:minX,top:maxY,right:maxX,bottom:minY},width:maxX-minX,height:maxY-minY}}if(smtpad2.shape==="pill"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;return{center:{x:smtpad2.x,y:smtpad2.y},bounds:{left:smtpad2.x-halfWidth,top:smtpad2.y-halfHeight,right:smtpad2.x+halfWidth,bottom:smtpad2.y+halfHeight},width:smtpad2.width,height:smtpad2.height}}throw new Error(`circuitJson bounds calculation not implemented for shape "${smtpad2.shape}"`)}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y});let solderPaste=db2.pcb_solder_paste.list().find(elm=>elm.pcb_smtpad_id===this.pcb_smtpad_id);solderPaste&&db2.pcb_solder_paste.update(solderPaste.pcb_solder_paste_id,{x:newCenter.x,y:newCenter.y}),this.matchedPort?._setPositionFromLayout(newCenter)}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);if(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill")this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY});else if(pad2.shape==="polygon"){db2.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))});let newCenter={x:this._getPcbCircuitJsonBounds().center.x+deltaX/2,y:this._getPcbCircuitJsonBounds().center.y+deltaY/2};this.matchedPort?._setPositionFromLayout(newCenter)}}},createPinrowSilkscreenText=({elm,pinLabels,layer,readableRotation,anchorAlignment})=>{let pinNum=elm.text.replace(/[{}]/g,"").toLowerCase(),label=pinNum;if(Array.isArray(pinLabels)){let index=parseInt(pinNum.replace(/[^\d]/g,""),10)-1;label=String(pinLabels[index]??pinNum)}else typeof pinLabels=="object"&&(label=String(pinLabels[pinNum]??pinNum));let silkscreenText=new SilkscreenText({anchorAlignment:anchorAlignment||"center",text:label??pinNum,layer:layer||"top",pcbX:isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:readableRotation??0});return silkscreenText._footprinterFontSize=elm.font_size+.2,silkscreenText},calculateCcwRotation=(componentRotationStr,elementCcwRotation)=>{let componentAngle=parseInt(componentRotationStr||"0",10),totalRotation;return elementCcwRotation!=null?totalRotation=elementCcwRotation-componentAngle:totalRotation=componentAngle,(totalRotation%360+360)%360},createComponentsFromCircuitJson=({componentName,componentRotation,footprinterString,pinLabels,pcbPinLabels},circuitJson)=>{let components=[];for(let elm of circuitJson)if(elm.type==="pcb_smtpad"&&elm.shape==="rect")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"rect",height:elm.height,width:elm.width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius}));else if(elm.type==="pcb_smtpad"&&elm.shape==="circle")components.push(new SmtPad({pcbX:elm.x,pcbY:elm.y,layer:elm.layer,shape:"circle",radius:elm.radius,portHints:elm.port_hints}));else if(elm.type==="pcb_smtpad"&&elm.shape==="pill")components.push(new SmtPad({shape:"pill",height:elm.height,width:elm.width,radius:elm.radius,portHints:elm.port_hints,pcbX:elm.x,pcbY:elm.y,layer:elm.layer}));else if(elm.type==="pcb_smtpad"&&elm.shape==="polygon")components.push(new SmtPad({shape:"polygon",points:elm.points,portHints:elm.port_hints,layer:elm.layer}));else if(elm.type==="pcb_silkscreen_path")components.push(new SilkscreenPath({layer:elm.layer,route:elm.route,strokeWidth:elm.stroke_width}));else if(elm.type==="pcb_plated_hole")elm.shape==="circle"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circle",holeDiameter:elm.hole_diameter,outerDiameter:elm.outer_diameter,portHints:elm.port_hints})):elm.shape==="circular_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"circular_hole_with_rect_pad",holeDiameter:elm.hole_diameter,rectPadHeight:elm.rect_pad_height,rectPadWidth:elm.rect_pad_width,portHints:elm.port_hints,rectBorderRadius:elm.rect_border_radius,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="pill"||elm.shape==="oval"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:elm.shape,holeWidth:elm.hole_width,holeHeight:elm.hole_height,outerWidth:elm.outer_width,outerHeight:elm.outer_height,portHints:elm.port_hints})):elm.shape==="pill_hole_with_rect_pad"?components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"pill_hole_with_rect_pad",holeShape:"pill",padShape:"rect",holeWidth:elm.hole_width,holeHeight:elm.hole_height,rectPadWidth:elm.rect_pad_width,rectPadHeight:elm.rect_pad_height,portHints:elm.port_hints,holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y})):elm.shape==="hole_with_polygon_pad"&&components.push(new PlatedHole({pcbX:elm.x,pcbY:elm.y,shape:"hole_with_polygon_pad",holeShape:elm.hole_shape||"circle",holeDiameter:elm.hole_diameter,holeWidth:elm.hole_width,holeHeight:elm.hole_height,padOutline:elm.pad_outline||[],holeOffsetX:elm.hole_offset_x,holeOffsetY:elm.hole_offset_y,portHints:elm.port_hints}));else if(elm.type==="pcb_keepout"&&elm.shape==="circle")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius}));else if(elm.type==="pcb_keepout"&&elm.shape==="rect")components.push(new Keepout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="circle")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,diameter:elm.hole_diameter}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rect")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"rect",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height}));else if(elm.type==="pcb_hole"&&elm.hole_shape==="rotated_pill")components.push(new Hole({pcbX:elm.x,pcbY:elm.y,shape:"pill",width:elm.hole_width,height:elm.hole_height,pcbRotation:elm.ccw_rotation}));else if(elm.type==="pcb_cutout")elm.shape==="rect"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"rect",width:elm.width,height:elm.height})):elm.shape==="circle"?components.push(new Cutout({pcbX:elm.center.x,pcbY:elm.center.y,shape:"circle",radius:elm.radius})):elm.shape==="polygon"&&components.push(new Cutout({shape:"polygon",points:elm.points}));else if(elm.type==="pcb_silkscreen_text"){let ccwRotation=calculateCcwRotation(componentRotation,elm.ccw_rotation);if(footprinterString?.includes("pinrow")&&elm.text.includes("PIN"))components.push(createPinrowSilkscreenText({elm,pinLabels:pcbPinLabels??pinLabels??{},layer:elm.layer,readableRotation:ccwRotation,anchorAlignment:elm.anchor_alignment}));else{let silkscreenText=new SilkscreenText({anchorAlignment:elm.anchor_alignment||"center",text:componentName||elm.text,pcbX:Number.isNaN(elm.anchor_position.x)?0:elm.anchor_position.x,pcbY:elm.anchor_position.y,pcbRotation:ccwRotation??0});silkscreenText._footprinterFontSize=elm.font_size+.2,components.push(silkscreenText)}}else elm.type==="pcb_trace"?components.push(new PcbTrace({route:elm.route})):elm.type==="pcb_silkscreen_rect"?components.push(new SilkscreenRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer,strokeWidth:elm.stroke_width,filled:elm.is_filled,cornerRadius:elm.corner_radius})):elm.type==="pcb_silkscreen_circle"?components.push(new SilkscreenCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_silkscreen_line"?components.push(new SilkscreenLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,layer:elm.layer,strokeWidth:elm.stroke_width})):elm.type==="pcb_fabrication_note_text"?components.push(new FabricationNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text,fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_fabrication_note_path"?components.push(new FabricationNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color,layer:elm.layer})):elm.type==="pcb_fabrication_note_rect"?components.push(new FabricationNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,layer:elm.layer,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_text"?components.push(new PcbNoteText({pcbX:elm.anchor_position.x,pcbY:elm.anchor_position.y,text:elm.text??"",fontSize:elm.font_size,anchorAlignment:elm.anchor_alignment,color:elm.color,font:elm.font})):elm.type==="pcb_note_rect"?components.push(new PcbNoteRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,strokeWidth:elm.stroke_width,isFilled:elm.is_filled,color:elm.color,cornerRadius:elm.corner_radius,hasStroke:elm.has_stroke,isStrokeDashed:elm.is_stroke_dashed})):elm.type==="pcb_note_path"?components.push(new PcbNotePath({route:elm.route,strokeWidth:elm.stroke_width,color:elm.color})):elm.type==="pcb_note_line"?components.push(new PcbNoteLine({x1:elm.x1,y1:elm.y1,x2:elm.x2,y2:elm.y2,strokeWidth:elm.stroke_width,color:elm.color,isDashed:elm.is_dashed})):elm.type==="pcb_courtyard_rect"?components.push(new CourtyardRect({pcbX:elm.center.x,pcbY:elm.center.y,width:elm.width,height:elm.height,layer:elm.layer})):elm.type==="pcb_courtyard_circle"?components.push(new CourtyardCircle({pcbX:elm.center.x,pcbY:elm.center.y,radius:elm.radius,layer:elm.layer})):elm.type==="pcb_courtyard_outline"&&components.push(new CourtyardOutline({outline:elm.outline,layer:elm.layer}));return components};function filterPinLabels(pinLabels){if(!pinLabels)return{validPinLabels:pinLabels,invalidPinLabelsMessages:[]};let validPinLabels={},invalidPinLabelsMessages=[];for(let[pin,labelOrLabels]of Object.entries(pinLabels)){let labels=Array.isArray(labelOrLabels)?labelOrLabels.slice():[labelOrLabels],validLabels=[];for(let label of labels)isValidPinLabel(pin,label)?validLabels.push(label):invalidPinLabelsMessages.push(`Invalid pin label: ${pin} = '${label}' - excluding from component. Pin labels can only contain letters, numbers and underscores.`);validLabels.length>0&&(validPinLabels[pin]=Array.isArray(labelOrLabels)?validLabels:validLabels[0])}return{validPinLabels:Object.keys(validPinLabels).length>0?validPinLabels:void 0,invalidPinLabelsMessages}}function isValidPinLabel(pin,label){try{let testProps={name:"test",footprint:"test",pinLabels:{[pin]:label}};return chipProps.safeParse(testProps).success}catch{return!1}}var NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES=["Silkscreen","PcbNote","Courtyard","FabricationNote"];function getBoundsOfPcbComponents(components){let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,hasValidComponents=!1;for(let child of components)if(child.isPcbPrimitive&&!NON_PHYSICAL_PCB_PRIMITIVE_PREFIXES.some(prefix=>child.componentName.startsWith(prefix))){let{x:x5,y:y5}=child._getGlobalPcbPositionBeforeLayout(),{width:width2,height:height2}=child.getPcbSize();minX=Math.min(minX,x5-width2/2),minY=Math.min(minY,y5-height2/2),maxX=Math.max(maxX,x5+width2/2),maxY=Math.max(maxY,y5+height2/2),hasValidComponents=!0}else if(child.children.length>0){let childBounds=getBoundsOfPcbComponents(child.children);(childBounds.width>0||childBounds.height>0)&&(minX=Math.min(minX,childBounds.minX),minY=Math.min(minY,childBounds.minY),maxX=Math.max(maxX,childBounds.maxX),maxY=Math.max(maxY,childBounds.maxY),hasValidComponents=!0)}if(!hasValidComponents)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};let width=maxX-minX,height=maxY-minY;return width<0&&(width=0),height<0&&(height=0),{minX,minY,maxX,maxY,width,height}}function getRelativeDirection(pointA,pointB){let dx3=pointB.x-pointA.x,dy3=pointB.y-pointA.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}var stringProxy=new Proxy({},{get:(target,prop)=>prop}),FTYPE=stringProxy,SCHEMATIC_COMPONENT_OUTLINE_COLOR="rgba(132, 0, 0)",SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH=.12,areAllPcbPrimitivesOverlapping=pcbPrimitives=>{if(pcbPrimitives.length<=1)return!0;let bounds=pcbPrimitives.map(p4=>{let circuitBounds=p4._getPcbCircuitJsonBounds();return{left:circuitBounds.bounds.left,right:circuitBounds.bounds.right,top:circuitBounds.bounds.top,bottom:circuitBounds.bounds.bottom}}),overlaps=Array(bounds.length).fill(!1).map(()=>Array(bounds.length).fill(!1));for(let i2=0;i2<bounds.length;i2++)for(let j4=i2+1;j4<bounds.length;j4++){let a2=bounds[i2],b3=bounds[j4];overlaps[i2][j4]=overlaps[j4][i2]=!(a2.right<b3.left||a2.left>b3.right||a2.bottom>b3.top||a2.top<b3.bottom)}let visited=new Set,dfs=node=>{visited.add(node);for(let i2=0;i2<bounds.length;i2++)overlaps[node][i2]&&!visited.has(i2)&&dfs(i2)};return dfs(0),visited.size===bounds.length},getCenterOfPcbPrimitives=pcbPrimitives=>{if(pcbPrimitives.length===0)throw new Error("Cannot get center of empty PCB primitives array");let positions=pcbPrimitives.map(p4=>p4._getPcbCircuitJsonBounds().center).filter(Boolean),sumX=positions.reduce((sum,pos)=>sum+pos.x,0),sumY=positions.reduce((sum,pos)=>sum+pos.y,0);return{x:sumX/positions.length,y:sumY/positions.length}},portProps2=external_exports.object({name:external_exports.string().optional(),pinNumber:external_exports.number().optional(),schStemLength:external_exports.number().optional(),aliases:external_exports.array(external_exports.string()).optional(),layer:external_exports.string().optional(),layers:external_exports.array(external_exports.string()).optional(),schX:external_exports.number().optional(),schY:external_exports.number().optional(),direction:external_exports.enum(["up","down","left","right"]).optional(),connectsTo:external_exports.union([external_exports.string(),external_exports.array(external_exports.string())]).optional()}),Port=class extends PrimitiveComponent2{constructor(props,opts={}){if(!props.name&&props.pinNumber!==void 0&&(props.name=`pin${props.pinNumber}`),!props.name)throw new Error("Port must have a name or a pinNumber");super(props);__publicField(this,"source_port_id",null);__publicField(this,"pcb_port_id",null);__publicField(this,"schematic_port_id",null);__publicField(this,"schematic_stem_line_id",null);__publicField(this,"schematicSymbolPortDef",null);__publicField(this,"matchedComponents");__publicField(this,"facingDirection",null);__publicField(this,"originDescription",null);opts.originDescription&&(this.originDescription=opts.originDescription),this.matchedComponents=[]}get config(){return{componentName:"Port",zodProps:portProps2}}isGroupPort(){return this.parent?.componentName==="Group"}isComponentPort(){return!this.isGroupPort()}_getConnectedPortsFromConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo;if(!connectsTo)return[];let connectedPorts=[],connectsToArray=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let connection of connectsToArray){let port=this.getSubcircuit().selectOne(connection,{type:"port"});port&&connectedPorts.push(port)}return connectedPorts}_isBoardPinoutFromAttributes(){let parent=this.parent;if(parent?._parsedProps?.pinAttributes){let pinAttributes=parent._parsedProps.pinAttributes;for(let alias of this.getNameAndAliases())if(pinAttributes[alias]?.includeInBoardPinout)return!0}}_getGlobalPcbPositionBeforeLayout(){let matchedPcbElm=this.matchedComponents.find(c3=>c3.isPcbPrimitive),parentComponent=this.parent;if(parentComponent&&!parentComponent.props.footprint)throw new Error(`${parentComponent.componentName} "${parentComponent.props.name}" does not have a footprint. Add a footprint prop, e.g. <${parentComponent.componentName.toLowerCase()} footprint="..." />`);if(!matchedPcbElm)throw new Error(`Port ${this} has no matching PCB primitives. This often means the footprint's pads lack matching port hints.`);return matchedPcbElm?._getGlobalPcbPositionBeforeLayout()??{x:0,y:0}}_getPcbCircuitJsonBounds(){if(!this.pcb_port_id)return super._getPcbCircuitJsonBounds();let{db:db2}=this.root,pcb_port2=db2.pcb_port.get(this.pcb_port_id);return{center:{x:pcb_port2.x,y:pcb_port2.y},bounds:{left:0,top:0,right:0,bottom:0},width:0,height:0}}_getGlobalPcbPositionAfterLayout(){return this._getPcbCircuitJsonBounds().center}_getPortsInternallyConnectedToThisPort(){let parent=this.parent;if(!parent||!parent._getInternallyConnectedPins)return[];let internallyConnectedPorts=parent._getInternallyConnectedPins();for(let ports of internallyConnectedPorts)if(ports.some(port=>port===this))return ports;return[]}_hasSchematicPort(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return!0;let parentNormalComponent=this.getParentNormalComponent();if(parentNormalComponent?.getSchematicSymbol())return!!(this.schematicSymbolPortDef||this._getPortsInternallyConnectedToThisPort().some(p4=>p4.schematicSymbolPortDef));let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();return!!(parentBoxDim&&this.props.pinNumber!==void 0&&parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber))}_getGlobalSchematicPositionBeforeLayout(){let{schX,schY}=this._parsedProps;if(schX!==void 0&&schY!==void 0)return{x:schX,y:schY};let parentNormalComponent=this.getParentNormalComponent(),symbol=parentNormalComponent?.getSchematicSymbol();if(symbol){let schematicSymbolPortDef=this.schematicSymbolPortDef;if(!schematicSymbolPortDef&&(schematicSymbolPortDef=this._getPortsInternallyConnectedToThisPort().find(p4=>p4.schematicSymbolPortDef)?.schematicSymbolPortDef??null,!schematicSymbolPortDef))throw new Error(`Couldn't find schematicSymbolPortDef for port ${this.getString()}, searched internally connected ports and none had a schematicSymbolPortDef. Why are we trying to get the schematic position of this port?`);let transform5=compose2(parentNormalComponent.computeSchematicGlobalTransform(),translate2(-symbol.center.x,-symbol.center.y));return applyToPoint2(transform5,schematicSymbolPortDef)}let parentBoxDim=parentNormalComponent?._getSchematicBoxDimensions();if(parentBoxDim&&this.props.pinNumber!==void 0){let localPortPosition=parentBoxDim.getPortPositionByPinNumber(this.props.pinNumber);if(!localPortPosition)throw new Error(`Couldn't find position for schematic_port for port ${this.getString()} inside of the schematic box`);return applyToPoint2(parentNormalComponent.computeSchematicGlobalTransform(),localPortPosition)}throw new Error(`Couldn't find position for schematic_port for port ${this.getString()}`)}_getGlobalSchematicPositionAfterLayout(){let{db:db2}=this.root;if(!this.schematic_port_id)throw new Error(`Can't get schematic port position after layout for "${this.getString()}", no schematic_port_id`);let schematic_port2=db2.schematic_port.get(this.schematic_port_id);if(!schematic_port2)throw new Error(`Schematic port not found when trying to get post-layout position: ${this.schematic_port_id}`);return schematic_port2.center}registerMatch(component){this.matchedComponents.push(component)}getNameAndAliases(){let{_parsedProps:props}=this;return Array.from(new Set([...props.name?[props.name]:[],...props.aliases??[],...typeof props.pinNumber=="number"?[`pin${props.pinNumber}`,props.pinNumber.toString()]:[],...this.externallyAddedAliases??[]]))}_getMatchingPinAttributes(){let pinAttributes=this.parent?._parsedProps?.pinAttributes;if(!pinAttributes)return[];let matches=[];for(let alias of this.getNameAndAliases()){let attributes2=pinAttributes[alias];attributes2&&matches.push(attributes2)}return matches}_shouldIncludeInBoardPinout(){return this._getMatchingPinAttributes().some(attributes2=>attributes2.includeInBoardPinout===!0)}isMatchingPort(port){return this.isMatchingAnyOf(port.getNameAndAliases())}getPortSelector(){return`.${(this.getParentNormalComponent()??this.parent)?.props.name} > port.${this.props.name}`}getAvailablePcbLayers(){let{layer,layers}=this._parsedProps;return layers||(layer?[layer]:Array.from(new Set(this.matchedComponents.flatMap(c3=>c3.getAvailablePcbLayers()))))}_getDirectlyConnectedTraces(){return this.getSubcircuit().selectAll("trace").filter(trace=>!trace._couldNotFindPort).filter(trace=>trace._isExplicitlyConnectedToPort(this))}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,port_hints=this.getNameAndAliases(),parentNormalComponent=this.getParentNormalComponent(),source_component_id=(this.parent?.source_component_id?this.parent:parentNormalComponent)?.source_component_id??null,pinAttributes=this._getMatchingPinAttributes(),portAttributesFromParent={};for(let attributes2 of pinAttributes)attributes2.mustBeConnected!==void 0&&(portAttributesFromParent.must_be_connected=attributes2.mustBeConnected);let source_port2=db2.source_port.insert({name:props.name,pin_number:props.pinNumber,port_hints,source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,...portAttributesFromParent});this.source_port_id=source_port2.source_port_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentNormalComponent=this.getParentNormalComponent(),parentWithSourceId=this.parent?.source_component_id?this.parent:parentNormalComponent;if(this.isGroupPort()){db2.source_port.update(this.source_port_id,{source_component_id:null,subcircuit_id:this.getSubcircuit()?.subcircuit_id});return}if(!parentWithSourceId?.source_component_id)throw new Error(`${this.getString()} has no parent source component (parent: ${this.parent?.getString()})`);db2.source_port.update(this.source_port_id,{source_component_id:parentWithSourceId.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id}),this.source_component_id=parentWithSourceId.source_component_id}doInitialPcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{matchedComponents}=this;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit=this.getSubcircuit(),pcb_port2=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port2.pcb_port_id;return}let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent;if(!parentWithPcbComponentId?.pcb_component_id)throw new Error(`${this.getString()} has no parent pcb component, cannot render pcb_port (parent: ${this.parent?.getString()}, parentNormalComponent: ${parentNormalComponent?.getString()})`);let pcbMatches=matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1){if(!areAllPcbPrimitivesOverlapping(pcbMatches)){let portName=this.props.name,componentName=this.getParentNormalComponent()?.props.name??"unknown",altAliases=this.getNameAndAliases().filter(h4=>h4!==portName),altMsg=altAliases.length>0?` (consider using alternate aliases: ${altAliases.join(", ")})`:"";db2.source_ambiguous_port_reference.insert({error_type:"source_ambiguous_port_reference",message:`${componentName}.${portName} is ambiguous: ${componentName}.${portName} references multiple non-overlapping pads: ${pcbMatches.map(c3=>c3.getString()).join(", ")}${altMsg}`,source_port_id:this.source_port_id??void 0,source_component_id:this.getParentNormalComponent()?.source_component_id??void 0});return}matchCenter=getCenterOfPcbPrimitives(pcbMatches)}if(matchCenter){let subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}else{let pcbMatch=pcbMatches[0];throw new Error(`${pcbMatch.getString()} does not have a center or _getGlobalPcbPositionBeforeLayout method (needed for pcb_port placement)`)}}updatePcbPortRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(this.pcb_port_id)return;if(this.isGroupPort()){let connectedPorts=this._getConnectedPortsFromConnectsTo();if(connectedPorts.length===0)return;let connectedPort=connectedPorts[0];if(!connectedPort.pcb_port_id)return;let connectedPcbPort=db2.pcb_port.get(connectedPort.pcb_port_id),matchCenter2={x:connectedPcbPort.x,y:connectedPcbPort.y},subcircuit2=this.getSubcircuit(),pcb_port22=db2.pcb_port.insert({pcb_component_id:void 0,layers:connectedPort.getAvailablePcbLayers(),subcircuit_id:subcircuit2?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...matchCenter2,source_port_id:this.source_port_id,is_board_pinout:!1});this.pcb_port_id=pcb_port22.pcb_port_id;return}let pcbMatches=this.matchedComponents.filter(c3=>c3.isPcbPrimitive);if(pcbMatches.length===0)return;let matchCenter=null;if(pcbMatches.length===1&&(matchCenter=pcbMatches[0]._getPcbCircuitJsonBounds().center),pcbMatches.length>1)try{areAllPcbPrimitivesOverlapping(pcbMatches)&&(matchCenter=getCenterOfPcbPrimitives(pcbMatches))}catch{}if(!matchCenter)return;let parentNormalComponent=this.getParentNormalComponent(),parentWithPcbComponentId=this.parent?.pcb_component_id?this.parent:parentNormalComponent,subcircuit=this.getSubcircuit(),isBoardPinout=this._shouldIncludeInBoardPinout(),pcb_port2=db2.pcb_port.insert({pcb_component_id:parentWithPcbComponentId?.pcb_component_id,layers:this.getAvailablePcbLayers(),subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,...isBoardPinout?{is_board_pinout:!0}:{},...matchCenter,source_port_id:this.source_port_id,is_board_pinout:this._isBoardPinoutFromAttributes()});this.pcb_port_id=pcb_port2.pcb_port_id}_getBestDisplayPinLabel(){let{db:db2}=this.root,sourcePort=db2.source_port.get(this.source_port_id),labelHints=[];for(let portHint of sourcePort?.port_hints??[])portHint.match(/^(pin)?\d+$/)||portHint.match(/^(left|right)/)&&!sourcePort?.name.match(/^(left|right)/)||labelHints.push(portHint);if(this.getParentNormalComponent()?.props?.showPinAliases&&labelHints.length>0)return labelHints.join("/");if(labelHints.length>0)return labelHints[0]}doInitialSchematicPortRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{schX,schY}=props,container=schX!==void 0&&schY!==void 0?this.getParentNormalComponent():this.getPrimitiveContainer();if(!container||!this._hasSchematicPort())return;let containerCenter=container._getGlobalSchematicPositionBeforeLayout(),portCenter=this._getGlobalSchematicPositionBeforeLayout(),localPortInfo=null,containerDims=container._getSchematicBoxDimensions();containerDims&&props.pinNumber!==void 0&&(localPortInfo=containerDims.getPortPositionByPinNumber(props.pinNumber)),this.getSubcircuit().props._schDebugObjectsEnabled&&db2.schematic_debug_object.insert({shape:"rect",center:portCenter,size:{width:.1,height:.1},label:"obstacle"}),localPortInfo?.side?this.facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[localPortInfo.side]:this.facingDirection=getRelativeDirection(containerCenter,portCenter);let bestDisplayPinLabel=this._getBestDisplayPinLabel(),parentNormalComponent=this.getParentNormalComponent(),sideOfComponent=localPortInfo?.side??(props.direction==="up"?"top":props.direction==="down"?"bottom":props.direction),schematicPortInsertProps={type:"schematic_port",schematic_component_id:parentNormalComponent?.schematic_component_id,center:portCenter,source_port_id:this.source_port_id,facing_direction:this.facingDirection,distance_from_component_edge:props.schStemLength??.4,side_of_component:sideOfComponent,pin_number:props.pinNumber,true_ccw_index:localPortInfo?.trueIndex,display_pin_label:bestDisplayPinLabel,is_connected:!1};for(let attributes2 of this._getMatchingPinAttributes())attributes2.requiresPower&&(schematicPortInsertProps.has_input_arrow=!0),attributes2.providesPower&&(schematicPortInsertProps.has_output_arrow=!0);let schematic_port2=db2.schematic_port.insert(schematicPortInsertProps);if(this.schematic_port_id=schematic_port2.schematic_port_id,props.schStemLength!==void 0&&props.schStemLength!==0){let{schStemLength,direction:direction2}=props,x22=portCenter.x,y22=portCenter.y;direction2==="right"?x22-=schStemLength:direction2==="left"?x22+=schStemLength:direction2==="up"?y22-=schStemLength:direction2==="down"&&(y22+=schStemLength);let stemLine=db2.schematic_line.insert({schematic_component_id:parentNormalComponent?.schematic_component_id,x1:portCenter.x,y1:portCenter.y,x2:x22,y2:y22,stroke_width:.02,color:SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1});this.schematic_stem_line_id=stemLine.schematic_line_id}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_port_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,schPort=db2.schematic_port.get(this.schematic_port_id);if(schPort){let newCenter=applyToPoint2(transform5,schPort.center);if(db2.schematic_port.update(this.schematic_port_id,{center:newCenter}),this.schematic_stem_line_id){let line2=db2.schematic_line.get(this.schematic_stem_line_id);if(line2){let p12=applyToPoint2(transform5,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform5,{x:line2.x2,y:line2.y2});db2.schematic_line.update(this.schematic_stem_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y});let scaledStemLength=Math.sqrt((p12.x-p22.x)**2+(p12.y-p22.y)**2);db2.schematic_port.update(this.schematic_port_id,{distance_from_component_edge:scaledStemLength})}}}}_getSubcircuitConnectivityKey(){return this.root?.db.source_port.get(this.source_port_id)?.subcircuit_connectivity_map_key}_setPositionFromLayout(newCenter){let{db:db2}=this.root;this.pcb_port_id&&db2.pcb_port.update(this.pcb_port_id,{x:newCenter.x,y:newCenter.y})}_hasMatchedPcbPrimitive(){return this.matchedComponents.some(c3=>c3.isPcbPrimitive)}_getNetLabelText(){return`${this.parent?.props.name}_${this.props.name}`}},getPinNumberFromLabels=labels=>{let pinNumber=labels.find(p4=>/^(pin)?\d+$/.test(p4));return pinNumber?Number.parseInt(pinNumber.replace(/^pin/,"")):null};function getPortFromHints(hints,opts){let pinNumber=getPinNumberFromLabels(hints);if(!pinNumber)return null;let aliases2=[...hints.filter(p4=>p4.toString()!==pinNumber.toString()&&p4!==`pin${pinNumber}`&&p4.trim()!==""),...opts?.additionalAliases?.[`pin${pinNumber}`]??[]];return new Port({pinNumber,aliases:aliases2})}function getPinsFromSideDefinition(sideDefinition){return sideDefinition?Array.isArray(sideDefinition)?sideDefinition:sideDefinition.pins??[]:[]}var hasExplicitPinMapping=pa3=>{for(let side of["leftSide","rightSide","topSide","bottomSide"])if(side in pa3&&typeof pa3[side]=="number")throw new Error(`A number was specified for "${side}", you probably meant to use "size" not "side"`);return"leftSide"in pa3||"rightSide"in pa3||"topSide"in pa3||"bottomSide"in pa3},getSizeOfSidesFromPortArrangement=pa3=>{if(hasExplicitPinMapping(pa3))return{leftSize:getPinsFromSideDefinition(pa3.leftSide).length,rightSize:getPinsFromSideDefinition(pa3.rightSide).length,topSize:getPinsFromSideDefinition(pa3.topSide).length,bottomSize:getPinsFromSideDefinition(pa3.bottomSide).length};let{leftSize=0,rightSize=0,topSize=0,bottomSize=0}=pa3;return{leftSize,rightSize,topSize,bottomSize}},DEFAULT_SCHEMATIC_BOX_PADDING_MM=.4;function isExplicitPinMappingArrangement(arrangement){let a2=arrangement;return a2.leftSide!==void 0||a2.rightSide!==void 0||a2.topSide!==void 0||a2.bottomSide!==void 0}var getAllDimensionsForSchematicBox=params=>{let portDistanceFromEdge=params.portDistanceFromEdge??.4,sidePinCounts=params.schPortArrangement?getSizeOfSidesFromPortArrangement(params.schPortArrangement):null,sideLengths={left:0,right:0,top:0,bottom:0},pinCount=params.pinCount??null;if(pinCount===null)if(sidePinCounts)pinCount=sidePinCounts.leftSize+sidePinCounts.rightSize+sidePinCounts.topSize;else throw new Error("Could not determine pin count for the schematic box");if(pinCount&&!sidePinCounts){let rightSize=Math.floor(pinCount/2);sidePinCounts={leftSize:pinCount-rightSize,rightSize,topSize:0,bottomSize:0}}sidePinCounts||(sidePinCounts={leftSize:0,rightSize:0,topSize:0,bottomSize:0});let getPinNumberUsingSideIndex=({side,sideIndex,truePinIndex:truePinIndex2})=>{if(!params.schPortArrangement||!isExplicitPinMappingArrangement(params.schPortArrangement))return truePinIndex2+1;let normalCcwDirection={left:"top-to-bottom",bottom:"left-to-right",right:"bottom-to-top",top:"right-to-left"}[side],directionAlongSide=params.schPortArrangement?.[`${side}Side`]?.direction??normalCcwDirection,pinsDefinitionForSide=params.schPortArrangement?.[`${side}Side`]?.pins,sideIndexWithDirectionCorrection=sideIndex;return directionAlongSide!==normalCcwDirection&&(sideIndexWithDirectionCorrection=pinsDefinitionForSide.length-sideIndex-1),parsePinNumberFromLabelsOrThrow(pinsDefinitionForSide[sideIndexWithDirectionCorrection],params.pinLabels)},orderedTruePorts=[],currentDistanceFromEdge=0,truePinIndex=0;for(let sideIndex=0;sideIndex<sidePinCounts.leftSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"left",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"left",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),sideIndex===sidePinCounts.leftSize-1?sideLengths.left=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.bottomSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"bottom",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"bottom",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),sideIndex===sidePinCounts.bottomSize-1?sideLengths.bottom=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.rightSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"right",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.bottomMargin&&(currentDistanceFromEdge+=pinStyle.bottomMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"right",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.topMargin&&(currentDistanceFromEdge+=pinStyle.topMargin),sideIndex===sidePinCounts.rightSize-1?sideLengths.right=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}currentDistanceFromEdge=0;for(let sideIndex=0;sideIndex<sidePinCounts.topSize;sideIndex++){let pinNumber=getPinNumberUsingSideIndex({side:"top",sideIndex,truePinIndex}),pinStyle=params.numericSchPinStyle?.[`pin${pinNumber}`]??params.numericSchPinStyle?.[pinNumber];pinStyle?.rightMargin&&(currentDistanceFromEdge+=pinStyle.rightMargin),orderedTruePorts.push({trueIndex:truePinIndex,pinNumber,side:"top",distanceFromOrthogonalEdge:currentDistanceFromEdge}),pinStyle?.leftMargin&&(currentDistanceFromEdge+=pinStyle.leftMargin),sideIndex===sidePinCounts.topSize-1?sideLengths.top=currentDistanceFromEdge:currentDistanceFromEdge+=params.schPinSpacing,truePinIndex++}let resolvedSchWidth=params.schWidth;if(resolvedSchWidth===void 0){resolvedSchWidth=Math.max(sideLengths.top+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.bottom+DEFAULT_SCHEMATIC_BOX_PADDING_MM),params.pinLabels&&orderedTruePorts.filter(p4=>p4.side==="left"||p4.side==="right").some(p4=>params.pinLabels?.[`pin${p4.pinNumber}`]||params.pinLabels?.[p4.pinNumber])&&(resolvedSchWidth=Math.max(resolvedSchWidth,.5));let labelWidth=params.pinLabels?Math.max(...Object.values(params.pinLabels).map(label=>label.length*.1)):0,LABEL_PADDING=labelWidth>0?1.1:0;resolvedSchWidth=Math.max(resolvedSchWidth,labelWidth+LABEL_PADDING)}let schHeight=params.schHeight;schHeight||(schHeight=Math.max(sideLengths.left+DEFAULT_SCHEMATIC_BOX_PADDING_MM,sideLengths.right+DEFAULT_SCHEMATIC_BOX_PADDING_MM));let trueEdgePositions={left:{x:-resolvedSchWidth/2-portDistanceFromEdge,y:sideLengths.left/2},bottom:{x:-sideLengths.bottom/2,y:-schHeight/2-portDistanceFromEdge},right:{x:resolvedSchWidth/2+portDistanceFromEdge,y:-sideLengths.right/2},top:{x:sideLengths.top/2,y:schHeight/2+portDistanceFromEdge}},trueEdgeTraversalDirections={left:{x:0,y:-1},right:{x:0,y:1},top:{x:-1,y:0},bottom:{x:1,y:0}},truePortsWithPositions=orderedTruePorts.map(p4=>{let{distanceFromOrthogonalEdge,side}=p4,edgePos=trueEdgePositions[side],edgeDir=trueEdgeTraversalDirections[side];return{x:edgePos.x+distanceFromOrthogonalEdge*edgeDir.x,y:edgePos.y+distanceFromOrthogonalEdge*edgeDir.y,...p4}});return{getPortPositionByPinNumber(pinNumber){let port=truePortsWithPositions.find(p4=>p4.pinNumber.toString()===pinNumber.toString());return port||null},getSize(){return{width:resolvedSchWidth,height:schHeight}},getSizeIncludingPins(){return{width:resolvedSchWidth+(sidePinCounts.leftSize||sidePinCounts.rightSize?.4:0),height:schHeight+(sidePinCounts.topSize||sidePinCounts.bottomSize?.4:0)}},pinCount}},getNumericSchPinStyle=(pinStyles,pinLabels)=>{if(!pinStyles)return;let numericPinStyles={};for(let[pinNameOrLabel,pinStyle]of Object.entries(pinStyles)){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNameOrLabel,pinLabels),pinStyleWithSideFirst={leftMargin:pinStyle.marginLeft??pinStyle.leftMargin,rightMargin:pinStyle.marginRight??pinStyle.rightMargin,topMargin:pinStyle.marginTop??pinStyle.topMargin,bottomMargin:pinStyle.marginBottom??pinStyle.bottomMargin};numericPinStyles[`pin${pinNumber}`]={...numericPinStyles[`pin${pinNumber}`],...pinStyleWithSideFirst}}return numericPinStyles},CadAssembly=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"CadAssembly",zodProps:cadassemblyProps}}},getFileExtension=filename=>{if(!filename)return null;let fragmentMatch=filename.match(/#ext=(\w+)$/);if(fragmentMatch)return fragmentMatch[1].toLowerCase();let sanitized=filename.split("?")[0].split("#")[0],lastSegment=sanitized.split("/").pop()??sanitized;return lastSegment.includes(".")?lastSegment.split(".").pop()?.toLowerCase()??null:null},joinUrlPath=(base,path)=>{let trimmedBase=base.replace(/\/+$/,""),trimmedPath=path.replace(/^\/+/,"");return`${trimmedBase}/${trimmedPath}`},constructAssetUrl=(targetUrl,baseUrl)=>{if(!baseUrl||!targetUrl.startsWith("/"))return targetUrl;try{let baseUrlObj=new URL(baseUrl);return baseUrlObj.pathname!=="/"&&targetUrl.startsWith(baseUrlObj.pathname)?new URL(targetUrl,baseUrlObj.origin).toString():joinUrlPath(baseUrl,targetUrl)}catch{return targetUrl}},rotation2=external_exports.union([external_exports.number(),external_exports.string()]),rotation3=external_exports.object({x:rotation2,y:rotation2,z:rotation2}),CadModel=class extends PrimitiveComponent2{get config(){return{componentName:"CadModel",zodProps:cadmodelProps}}doInitialCadModelRender(){let parent=this._findParentWithPcbComponent();if(!parent||!parent.pcb_component_id)return;let{db:db2}=this.root,{boardThickness=0}=parent._getBoard()??{},bounds=parent._getPcbCircuitJsonBounds(),pcb_component2=db2.pcb_component.get(parent.pcb_component_id),props=this._parsedProps;if(!props||typeof props.modelUrl!="string"&&typeof props.stepUrl!="string")return;let parentTransform=parent._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(parentTransform).rotation.angle*180/Math.PI,sourceRotationOffset=props.pcbRotationOffset??props.rotationOffset,rotationOffset=rotation3.parse({x:0,y:0,z:0});if(typeof sourceRotationOffset=="number")rotationOffset.z=Number(sourceRotationOffset);else if(typeof sourceRotationOffset=="object"){let parsed=rotation3.parse(sourceRotationOffset);rotationOffset.x=Number(parsed.x),rotationOffset.y=Number(parsed.y),rotationOffset.z=Number(parsed.z)}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),positionOffset=point32.parse({x:pcbX,y:pcbY,z:props.pcbZ??0,...typeof props.positionOffset=="object"?props.positionOffset:{}}),zOffsetFromSurface=props.zOffsetFromSurface!==void 0?distance.parse(props.zOffsetFromSurface):0,layer=parent.props.layer==="bottom"?"bottom":"top",ext=props.modelUrl?getFileExtension(props.modelUrl):void 0,modelUrlWithoutExtFragment=props.modelUrl?.replace(/#ext=\w+$/,""),urlProps={};if(ext==="stl"?urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="obj"?urlProps.model_obj_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="gltf"?urlProps.model_gltf_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="glb"?urlProps.model_glb_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="step"||ext==="stp"?urlProps.model_step_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):ext==="wrl"||ext==="vrml"?urlProps.model_wrl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment):urlProps.model_stl_url=this._addCachebustToModelUrl(modelUrlWithoutExtFragment),props.stepUrl){let transformed=this._addCachebustToModelUrl(props.stepUrl);transformed&&(urlProps.model_step_url=transformed)}let cad=db2.cad_component.insert({position:{x:bounds.center.x+Number(positionOffset.x),y:bounds.center.y+Number(positionOffset.y),z:(layer==="bottom"?-boardThickness/2:boardThickness/2)+(layer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+Number(positionOffset.z)},rotation:{x:Number(rotationOffset.x),y:(layer==="top"?0:180)+Number(rotationOffset.y),z:layer==="bottom"?-(accumulatedRotation+Number(rotationOffset.z))+180:accumulatedRotation+Number(rotationOffset.z)},pcb_component_id:parent.pcb_component_id,model_board_normal_direction:props.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:props.modelOriginPosition,source_component_id:parent.source_component_id,model_unit_to_mm_scale_factor:typeof props.modelUnitToMmScale=="number"?props.modelUnitToMmScale:void 0,show_as_translucent_model:props.showAsTranslucentModel??parent._parsedProps.showAsTranslucentModel,...urlProps});this.cad_component_id=cad.cad_component_id}_findParentWithPcbComponent(){let p4=this.parent;for(;p4&&!p4.pcb_component_id;)p4=p4.parent;return p4}_addCachebustToModelUrl(url2){if(!url2)return url2;let baseUrl=this.root?.platform?.projectBaseUrl,transformedUrl=constructAssetUrl(url2,baseUrl);if(!transformedUrl.includes("modelcdn.tscircuit.com"))return transformedUrl;let origin=this.root?.getClientOrigin()??"";return`${transformedUrl}${transformedUrl.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}},debug22=(0,import_debug9.default)("tscircuit:core:footprint"),Footprint=class extends PrimitiveComponent2{get config(){return{componentName:"Footprint",zodProps:footprintProps}}doInitialPcbFootprintLayout(){if(this.root?.pcbDisabled)return;let constraints=this.children.filter(child=>child.componentName==="Constraint");if(constraints.length===0)return;let{isFlipped}=this._getPcbPrimitiveFlippedHelpers(),maybeFlipLeftRight=props=>isFlipped&&"left"in props&&"right"in props?{...props,left:props.right,right:props.left}:props,involvedComponents=constraints.flatMap(constraint=>constraint._getAllReferencedComponents().componentsWithSelectors).map(({component,selector,componentSelector,edge})=>({component,selector,componentSelector,edge,bounds:component._getPcbCircuitJsonBounds()}));if(involvedComponents.some(c3=>c3.edge))throw new Error("edge constraints not implemented yet for footprint layout, contributions welcome!");function getComponentDetails(selector){return involvedComponents.find(({selector:s2})=>s2===selector)}let solver=new Solver,kVars={};function getKVar(name){return name in kVars||(kVars[name]=new Variable(name),solver.addEditVariable(kVars[name],Strength.weak)),kVars[name]}for(let{selector,bounds:bounds2}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);solver.suggestValue(kvx,bounds2.center.x),solver.suggestValue(kvy,bounds2.center.y)}for(let constraint of constraints){let props=constraint._parsedProps;if("xDist"in props){let{xDist,left,right,edgeToEdge,centerToCenter}=maybeFlipLeftRight(props),leftVar=getKVar(`${left}_x`),rightVar=getKVar(`${right}_x`),leftBounds=getComponentDetails(left)?.bounds,rightBounds=getComponentDetails(right)?.bounds;if(centerToCenter){let expr=new Expression(rightVar,[-1,leftVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(rightVar,-rightBounds.width/2,[-1,leftVar],-leftBounds.width/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.xDist,Strength.required))}}else if("yDist"in props){let{yDist,top,bottom,edgeToEdge,centerToCenter}=props,topVar=getKVar(`${top}_y`),bottomVar=getKVar(`${bottom}_y`),topBounds=getComponentDetails(top)?.bounds,bottomBounds=getComponentDetails(bottom)?.bounds;if(centerToCenter){let expr=new Expression(topVar,[-1,bottomVar]);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}else if(edgeToEdge){let expr=new Expression(topVar,topBounds.height/2,[-1,bottomVar],-bottomBounds.height/2);solver.addConstraint(new Constraint(expr,Operator.Eq,props.yDist,Strength.required))}}else if("sameY"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_y`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}else if("sameX"in props){let{for:selectors}=props;if(selectors.length<2)continue;let vars=selectors.map(selector=>getKVar(`${selector}_x`)),expr=new Expression(...vars.slice(1));solver.addConstraint(new Constraint(expr,Operator.Eq,vars[0],Strength.required))}}solver.updateVariables(),debug22.enabled&&(console.log("Solution to layout constraints:"),console.table(Object.entries(kVars).map(([key,kvar])=>({var:key,val:kvar.value()}))));let bounds={left:1/0,right:-1/0,top:-1/0,bottom:1/0};for(let{selector,bounds:{width,height}}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`),newLeft=kvx.value()-width/2,newRight=kvx.value()+width/2,newTop=kvy.value()+height/2,newBottom=kvy.value()-height/2;bounds.left=Math.min(bounds.left,newLeft),bounds.right=Math.max(bounds.right,newRight),bounds.top=Math.max(bounds.top,newTop),bounds.bottom=Math.min(bounds.bottom,newBottom)}let globalOffset={x:-(bounds.right+bounds.left)/2,y:-(bounds.top+bounds.bottom)/2},containerPos=this.getPrimitiveContainer()._getGlobalPcbPositionBeforeLayout();globalOffset.x+=containerPos.x,globalOffset.y+=containerPos.y;for(let{component,selector}of involvedComponents){let kvx=getKVar(`${selector}_x`),kvy=getKVar(`${selector}_y`);component._setPositionFromLayout({x:kvx.value()+globalOffset.x,y:kvy.value()+globalOffset.y})}}},NormalComponent__getMinimumFlexContainerSize=component=>{let{db:db2}=component.root;if(component.pcb_component_id){let pcbComponent=db2.pcb_component.get(component.pcb_component_id);return pcbComponent?{width:pcbComponent.width,height:pcbComponent.height}:null}if(component.pcb_group_id){let pcbGroup=db2.pcb_group.get(component.pcb_group_id);if(!pcbGroup)return null;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);return bounds?{width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY}:null}return{width:pcbGroup.width??0,height:pcbGroup.height??0}}return null},NormalComponent__repositionOnPcb=(component,position2)=>{let{db:db2}=component.root,allCircuitJson=db2.toArray();if(component.pcb_component_id){repositionPcbComponentTo(allCircuitJson,component.pcb_component_id,position2);return}if(component.source_group_id){repositionPcbGroupTo(allCircuitJson,component.source_group_id,position2);return}throw new Error(`Cannot reposition component ${component.getString()}: no pcb_component_id or source_group_id`)};function NormalComponent_doInitialPcbComponentAnchorAlignment(component){if(component.root?.pcbDisabled||!component.pcb_component_id)return;let{pcbX,pcbY}=component._parsedProps,pcbPositionAnchor=component.props?.pcbPositionAnchor;if(!pcbPositionAnchor||pcbX===void 0&&pcbY===void 0)return;let bounds=getBoundsOfPcbComponents(component.children);if(bounds.width===0||bounds.height===0)return;let currentCenter={...{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2}},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor)){let b3={left:bounds.minX,right:bounds.maxX,top:bounds.minY,bottom:bounds.maxY};switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:b3.left,y:b3.top};break;case"top_center":anchorPos={x:currentCenter.x,y:b3.top};break;case"top_right":anchorPos={x:b3.right,y:b3.top};break;case"center_left":anchorPos={x:b3.left,y:currentCenter.y};break;case"center_right":anchorPos={x:b3.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:b3.left,y:b3.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:b3.bottom};break;case"bottom_right":anchorPos={x:b3.right,y:b3.bottom};break}}else try{let port=component.portMap[pcbPositionAnchor];port&&(anchorPos=port._getGlobalPcbPositionBeforeLayout())}catch{}if(!anchorPos)return;let newCenter={...currentCenter};pcbX!==void 0&&(newCenter.x+=pcbX-anchorPos.x),pcbY!==void 0&&(newCenter.y+=pcbY-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&component._repositionOnPcb(newCenter)}var isHttpUrl=s2=>s2.startsWith("http://")||s2.startsWith("https://"),parseLibraryFootprintRef=s2=>{if(isHttpUrl(s2))return null;let idx=s2.indexOf(":");if(idx<=0)return null;let footprintLib=s2.slice(0,idx),footprintName=s2.slice(idx+1);return!footprintLib||!footprintName?null:{footprintLib,footprintName}},isStaticAssetPath=s2=>s2.startsWith("/")||s2.startsWith("./"),resolveStaticFileImportDebug=(0,import_debug10.default)("tscircuit:core:resolveStaticFileImport");async function resolveStaticFileImport(path,platform){if(!path)return path;let normalizedPath=path.startsWith("./")?path.slice(1):path,resolver=platform?.resolveProjectStaticFileImportUrl;if(resolver&&(path.startsWith("/")||path.startsWith("./")))try{let resolved=await resolver(normalizedPath);if(resolved)return resolved}catch(error){resolveStaticFileImportDebug("failed to resolve static file via platform resolver",error)}return constructAssetUrl(normalizedPath,platform?.projectBaseUrl)}function NormalComponent_doInitialPcbFootprintStringRender(component,queueAsyncEffect){let{footprint}=component.props;if(footprint??(footprint=component._getImpliedFootprintString?.()),!footprint)return;let{pcbRotation,pinLabels,pcbPinLabels}=component.props,fileExtension=getFileExtension(String(footprint)),footprintParser=fileExtension?component.root?.platform?.footprintFileParserMap?.[fileExtension]:null;if(typeof footprint=="string"&&(isHttpUrl(footprint)||isStaticAssetPath(footprint))&&footprintParser){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0,queueAsyncEffect("load-footprint-from-platform-file-parser",async()=>{let footprintUrl=isHttpUrl(footprint)?footprint:await resolveStaticFileImport(footprint,component.root?.platform);try{let result=await footprintParser.loadFromUrl(footprintUrl),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprintUrl,pinLabels,pcbPinLabels},result.footprintCircuitJson);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load footprint "${footprintUrl}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprintUrl});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"&&isHttpUrl(footprint)){if(component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let url2=footprint;queueAsyncEffect("load-footprint-url",async()=>{try{let res2=await fetch(url2);if(!res2.ok)throw new Error(`Failed to fetch footprint: ${res2.status}`);let soup=await res2.json(),fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:url2,pinLabels,pcbPinLabels},soup);component.addAll(fpComponents),component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${url2}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:url2});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(typeof footprint=="string"){let libRef=parseLibraryFootprintRef(footprint);if(!libRef||component._hasStartedFootprintUrlLoad)return;component._hasStartedFootprintUrlLoad=!0;let libMap=component.root?.platform?.footprintLibraryMap?.[libRef.footprintLib],resolverFn;if(typeof libMap=="function"&&(resolverFn=libMap),!resolverFn)return;queueAsyncEffect("load-lib-footprint",async()=>{try{let result=await resolverFn(libRef.footprintName),circuitJson=null;if(Array.isArray(result)?circuitJson=result:Array.isArray(result.footprintCircuitJson)&&(circuitJson=result.footprintCircuitJson),!circuitJson)return;let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},circuitJson),fpWrapper=new Footprint({src:footprint});for(let c3 of fpComponents)fpWrapper.add(c3);component.add(fpWrapper),!Array.isArray(result)&&result.cadModel&&(component._asyncFootprintCadModel=result.cadModel);for(let child of component.children)child.componentName==="Port"&&child._markDirty?.("PcbPortRender");component._markDirty("InitializePortsFromChildren")}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load external footprint "${footprint}": `+(err instanceof Error?err.message:String(err)),errorObj=external_footprint_load_error.parse({type:"external_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0,footprinter_string:footprint});db2.external_footprint_load_error.insert(errorObj)}throw err}});return}if(!(0,import_react3.isValidElement)(footprint)&&footprint.componentName==="Footprint"&&component.add(footprint),Array.isArray(footprint)&&!(0,import_react3.isValidElement)(footprint)&&footprint.length>0){try{let fpComponents=createComponentsFromCircuitJson({componentName:component.name,componentRotation:pcbRotation,footprinterString:"",pinLabels,pcbPinLabels},footprint);component.addAll(fpComponents)}catch(err){let db2=component.root?.db;if(db2&&component.source_component_id&&component.pcb_component_id){let subcircuit=component.getSubcircuit(),errorMsg=`${component.getString()} failed to load json footprint: `+(err instanceof Error?err.message:String(err)),errorObj=circuit_json_footprint_load_error.parse({type:"circuit_json_footprint_load_error",message:errorMsg,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:component.getGroup()?.pcb_group_id??void 0});db2.circuit_json_footprint_load_error.insert(errorObj)}throw err}return}}function getPcbTextBounds(text){let fontSize=text.font_size,textWidth=text.text.length*fontSize*.6,textHeight=fontSize,anchorAlignment=text.anchor_alignment||"center",centerX=text.anchor_position.x,centerY=text.anchor_position.y;switch(anchorAlignment){case"top_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"top_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y+textHeight/2;break;case"top_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y+textHeight/2;break;case"center_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y;break;case"center":centerX=text.anchor_position.x,centerY=text.anchor_position.y;break;case"center_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y;break;case"bottom_left":centerX=text.anchor_position.x+textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_center":centerX=text.anchor_position.x,centerY=text.anchor_position.y-textHeight/2;break;case"bottom_right":centerX=text.anchor_position.x-textWidth/2,centerY=text.anchor_position.y-textHeight/2;break;default:centerX=text.anchor_position.x,centerY=text.anchor_position.y;break}return{x:centerX-textWidth/2,y:centerY-textHeight/2,width:textWidth,height:textHeight}}function NormalComponent_doInitialSilkscreenOverlapAdjustment(component){if(!component._adjustSilkscreenTextAutomatically||component.root?.pcbDisabled||!component.pcb_component_id)return;let{db:db2}=component.root,componentCenter=component._getPcbCircuitJsonBounds().center,silkscreenTexts=db2.pcb_silkscreen_text.list({pcb_component_id:component.pcb_component_id}).filter(text=>text.text===component.name);if(silkscreenTexts.length===0)return;let obstacleBounds=component.getSubcircuit().selectAll("[_isNormalComponent=true]").filter(comp=>comp!==component&&comp.pcb_component_id).map(comp=>{let bounds=comp._getPcbCircuitJsonBounds(),box2={center:bounds.center,width:bounds.width,height:bounds.height};return getBoundingBox(box2)});for(let silkscreenText of silkscreenTexts){let currentPosition=silkscreenText.anchor_position,textBounds=getPcbTextBounds(silkscreenText),textBox={center:{x:textBounds.x+textBounds.width/2,y:textBounds.y+textBounds.height/2},width:textBounds.width,height:textBounds.height},textBoundsBox=getBoundingBox(textBox);if(!obstacleBounds.some(obstacle=>doBoundsOverlap(textBoundsBox,obstacle)))continue;let flippedX=2*componentCenter.x-currentPosition.x,flippedY=2*componentCenter.y-currentPosition.y,flippedTextBox={center:{x:flippedX,y:flippedY},width:textBounds.width,height:textBounds.height},flippedTextBounds=getBoundingBox(flippedTextBox);obstacleBounds.some(obstacle=>doBoundsOverlap(flippedTextBounds,obstacle))||db2.pcb_silkscreen_text.update(silkscreenText.pcb_silkscreen_text_id,{anchor_position:{x:flippedX,y:flippedY}})}}var NormalComponent_doInitialSourceDesignRuleChecks=component=>{let{db:db2}=component.root;if(!component.source_component_id)return;let ports=component.selectAll("port"),traces=db2.source_trace.list(),connected=new Set;for(let trace of traces)for(let id2 of trace.connected_source_port_ids)connected.add(id2);let internalGroups=component._getInternallyConnectedPins();for(let group of internalGroups)if(group.some(p4=>p4.source_port_id&&connected.has(p4.source_port_id)))for(let p4 of group)p4.source_port_id&&connected.add(p4.source_port_id);for(let port of ports)port.source_port_id&&shouldCheckPortForMissingTrace(component,port)&&(connected.has(port.source_port_id)||db2.source_pin_missing_trace_warning.insert({message:`Port ${port.getNameAndAliases()[0]} on ${component.props.name} is missing a trace`,source_component_id:component.source_component_id,source_port_id:port.source_port_id,subcircuit_id:component.getSubcircuit().subcircuit_id??void 0,warning_type:"source_pin_missing_trace_warning"}))},shouldCheckPortForMissingTrace=(component,port)=>{if(component.config.componentName==="Interconnect")return!1;if(component.config.componentName==="Chip"){let pinAttributes=component.props.pinAttributes;if(!pinAttributes)return!1;for(let alias of port.getNameAndAliases()){let attrs=pinAttributes[alias];if(attrs?.requiresPower||attrs?.requiresGround||attrs?.requiresVoltage!==void 0)return!0}return!1}return!0},debug32=(0,import_debug6.default)("tscircuit:core"),rotation32=external_exports.object({x:rotation,y:rotation,z:rotation}),NormalComponent3=class extends PrimitiveComponent2{constructor(props){let filteredProps={...props},invalidPinLabelsMessages=[];if(filteredProps.pinLabels&&!Array.isArray(filteredProps.pinLabels)){let{validPinLabels,invalidPinLabelsMessages:messages}=filterPinLabels(filteredProps.pinLabels);filteredProps.pinLabels=validPinLabels,invalidPinLabelsMessages=messages}super(filteredProps);__publicField(this,"reactSubtrees",[]);__publicField(this,"_impliedFootprint");__publicField(this,"_resolvedPcbCalcOffsetX");__publicField(this,"_resolvedPcbCalcOffsetY");__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"_isNormalComponent",!0);__publicField(this,"_attributeLowerToCamelNameMap",{_isnormalcomponent:"_isNormalComponent"});__publicField(this,"_asyncSupplierPartNumbers");__publicField(this,"_asyncFootprintCadModel");__publicField(this,"_isCadModelChild");__publicField(this,"pcb_missing_footprint_error_id");__publicField(this,"_hasStartedFootprintUrlLoad",!1);__publicField(this,"_invalidPinLabelMessages",[]);__publicField(this,"_adjustSilkscreenTextAutomatically",!1);this._invalidPinLabelMessages=invalidPinLabelsMessages,this._addChildrenFromStringFootprint(),this.initPorts()}get defaultInternallyConnectedPinNames(){return[]}get internallyConnectedPinNames(){return(this._parsedProps.internallyConnectedPins??this.defaultInternallyConnectedPinNames).map(pinGroup=>pinGroup.map(pin=>typeof pin=="number"?`pin${pin}`:pin))}doInitialSourceNameDuplicateComponentRemoval(){if(!this.name)return;let root=this.root;if((this.getSubcircuit().getNormalComponentNameMap?.()?.get(this.props.name)??[]).filter(component=>component!==this&&component.renderPhaseStates.SourceNameDuplicateComponentRemoval.initialized).length>0){let pcbPosition2=this._getGlobalPcbPositionBeforeLayout(),schematicPosition=this._getGlobalSchematicPositionBeforeLayout();root.db.source_failed_to_create_component_error.insert({component_name:this.name,error_type:"source_failed_to_create_component_error",message:`Cannot create component "${this.name}": A component with the same name already exists`,pcb_center:pcbPosition2,schematic_center:schematicPosition}),this.shouldBeRemoved=!0;let childrenToRemove=[...this.children];for(let child of childrenToRemove)this.remove(child)}}initPorts(opts={}){if(this.root?.schematicDisabled)return;let{config}=this,portsToCreate=[],schPortArrangement=this._getSchematicPortArrangement();if(schPortArrangement&&!this._parsedProps.pinLabels){for(let side in schPortArrangement){let pins=schPortArrangement[side].pins;if(Array.isArray(pins))for(let pinNumberOrLabel of pins){let pinNumber=parsePinNumberFromLabelsOrThrow(pinNumberOrLabel,this._parsedProps.pinLabels);portsToCreate.push(new Port({pinNumber,aliases:opts.additionalAliases?.[`pin${pinNumber}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let sides=["left","right","top","bottom"],pinNum=1;for(let side of sides){let size2=schPortArrangement[`${side}Size`];for(let i2=0;i2<size2;i2++)portsToCreate.push(new Port({pinNumber:pinNum++,aliases:opts.additionalAliases?.[`pin${pinNum}`]??[]},{originDescription:`schPortArrangement:${side}`}))}}let pinLabels=this._parsedProps.pinLabels;if(pinLabels)for(let[pinNumber,label]of Object.entries(pinLabels)){pinNumber=pinNumber.replace("pin","");let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber)),primaryLabel=Array.isArray(label)?label[0]:label,otherLabels=Array.isArray(label)?label.slice(1):[];existingPort?(existingPort.externallyAddedAliases.push(primaryLabel,...otherLabels),existingPort.props.name=primaryLabel):(existingPort=new Port({pinNumber:parseInt(pinNumber),name:primaryLabel,aliases:[...otherLabels,...opts.additionalAliases?.[`pin${parseInt(pinNumber)}`]??[]]},{originDescription:`pinLabels:pin${pinNumber}`}),portsToCreate.push(existingPort))}if(config.schematicSymbolName&&!opts.ignoreSymbolPorts){let sym=Vf[this._getSchematicSymbolNameOrThrow()];if(!sym)return;for(let symPort of sym.ports){let pinNumber=getPinNumberFromLabels(symPort.labels);if(!pinNumber)continue;let existingPort=portsToCreate.find(p4=>p4._parsedProps.pinNumber===Number(pinNumber));if(existingPort)existingPort.schematicSymbolPortDef=symPort;else{let port=getPortFromHints(symPort.labels.concat(opts.additionalAliases?.[`pin${pinNumber}`]??[]));port&&(port.originDescription=`schematicSymbol:labels[0]:${symPort.labels[0]}`,port.schematicSymbolPortDef=symPort,portsToCreate.push(port))}}this.addAll(portsToCreate)}if(!this._getSchematicPortArrangement()){let hasReactSymbol=(0,import_react2.isValidElement)(this.props.symbol),symbolAlreadyAdded=this.children.some(c3=>c3.componentName==="Symbol");if(!(hasReactSymbol&&!symbolAlreadyAdded)){let portsFromFootprint=this.getPortsFromFootprint(opts),existingPorts=this._getAllPortsFromChildren();for(let port of portsFromFootprint){let matchingPort=existingPorts.find(p4=>p4.isMatchingAnyOf(port.getNameAndAliases()))??portsToCreate.find(p4=>p4.isMatchingAnyOf(port.getNameAndAliases()));if(matchingPort){let mergedAliases=port.getNameAndAliases().filter(alias=>!matchingPort.getNameAndAliases().includes(alias));matchingPort.externallyAddedAliases.push(...mergedAliases)}else portsToCreate.push(port)}}}let requiredPinCount=opts.pinCount??this._getPinCount()??0;for(let pn3=1;pn3<=requiredPinCount;pn3++){if(portsToCreate.find(p4=>p4._parsedProps.pinNumber===pn3))continue;if(!schPortArrangement){portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]}));continue}let explicitlyListedPinNumbersInSchPortArrangement=[...getPinsFromSideDefinition(schPortArrangement.leftSide),...getPinsFromSideDefinition(schPortArrangement.rightSide),...getPinsFromSideDefinition(schPortArrangement.topSide),...getPinsFromSideDefinition(schPortArrangement.bottomSide)].map(pn22=>parsePinNumberFromLabelsOrThrow(pn22,this._parsedProps.pinLabels));["leftSize","rightSize","topSize","bottomSize","leftPinCount","rightPinCount","topPinCount","bottomPinCount"].some(key=>key in schPortArrangement)&&(explicitlyListedPinNumbersInSchPortArrangement=Array.from({length:this._getPinCount()},(_5,i2)=>i2+1)),explicitlyListedPinNumbersInSchPortArrangement.includes(pn3)&&portsToCreate.push(new Port({pinNumber:pn3,aliases:opts.additionalAliases?.[`pin${pn3}`]??[]},{originDescription:`notOtherwiseAddedButDeducedFromPinCount:${pn3}`}))}portsToCreate.length>0&&this.addAll(portsToCreate)}_getImpliedFootprintString(){return null}_addChildrenFromStringFootprint(){let{pcbRotation,pinLabels,pcbPinLabels}=this.props,{footprint}=this.props;if(footprint??(footprint=this._getImpliedFootprintString?.()),!!footprint&&typeof footprint=="string"){if(isHttpUrl(footprint)||isStaticAssetPath(footprint)||parseLibraryFootprintRef(footprint))return;let fpSoup=fp.string(footprint).soup(),fpComponents=createComponentsFromCircuitJson({componentName:this.name??this.componentName,componentRotation:pcbRotation,footprinterString:footprint,pinLabels,pcbPinLabels},fpSoup);this.addAll(fpComponents)}}get portMap(){return new Proxy({},{get:(target,prop)=>{let port=this.children.find(c3=>c3.componentName==="Port"&&c3.isMatchingNameOrAlias(prop));if(!port)throw new Error(`There was an issue finding the port "${prop.toString()}" inside of a ${this.componentName} component with name: "${this.props.name}". This is a bug in @tscircuit/core`);return port}})}getInstanceForReactElement(element){for(let subtree of this.reactSubtrees)if(subtree.element===element)return subtree.component;return null}doInitialSourceRender(){let ftype=this.config.sourceFtype;if(!ftype)return;let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype,name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,internallyConnectedSourcePortIds=this._getInternallyConnectedPins().map(ports=>ports.map(port=>port.source_port_id).filter(id2=>id2!==null)).filter(sourcePortIds=>sourcePortIds.length>=2);this.source_component_id&&internallyConnectedSourcePortIds.length>0&&db2.source_component.update(this.source_component_id,{internally_connected_source_port_ids:internallyConnectedSourcePortIds});for(let sourcePortIds of internallyConnectedSourcePortIds)db2.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root;if(this._invalidPinLabelMessages?.length&&this.root?.db)for(let message of this._invalidPinLabelMessages){let property_name="pinLabels",match2=message.match(/^Invalid pin label:\s*([^=]+)=\s*'([^']+)'/);match2&&(property_name=`pinLabels['${match2[2]}']`),this.root.db.source_property_ignored_warning.insert({source_component_id:this.source_component_id,property_name,message,error_type:"source_property_ignored_warning"})}let{schematicSymbolName}=this.config,{_parsedProps:props}=this;props.symbol&&(0,import_react2.isValidElement)(props.symbol)?this._doInitialSchematicComponentRenderWithReactSymbol(props.symbol):schematicSymbolName?this._doInitialSchematicComponentRenderWithSymbol():this._getSchematicBoxDimensions()&&this._doInitialSchematicComponentRenderWithSchematicBoxDimensions();let manualPlacement=this.getSubcircuit()?._getSchematicManualPlacementForComponent(this);if(this.schematic_component_id&&(this.props.schX!==void 0||this.props.schY!==void 0)&&manualPlacement){if(!this.schematic_component_id)return;let warning=schematic_manual_edit_conflict_warning.parse({type:"schematic_manual_edit_conflict_warning",schematic_manual_edit_conflict_warning_id:`schematic_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. schX and schY will be used. Remove schX/schY or clear the manual placement.`,schematic_component_id:this.schematic_component_id,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.schematic_manual_edit_conflict_warning.insert(warning)}}_getSchematicSymbolDisplayValue(){}_getInternallyConnectedPins(){if(this.internallyConnectedPinNames.length===0)return[];let internallyConnectedPorts=[];for(let netPortNames of this.internallyConnectedPinNames){let ports=[];for(let portName of netPortNames)ports.push(this.portMap[portName]);internallyConnectedPorts.push(ports)}return internallyConnectedPorts}_doInitialSchematicComponentRenderWithSymbol(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,symbol_name=this._getSchematicSymbolNameOrThrow(),symbol=Vf[symbol_name],center2=this._getGlobalSchematicPositionBeforeLayout();if(symbol){let schematic_component2=db2.schematic_component.insert({center:center2,size:{...symbol.size},source_component_id:this.source_component_id,is_box_with_pins:!0,symbol_name,symbol_display_value:this._getSchematicSymbolDisplayValue()});this.schematic_component_id=schematic_component2.schematic_component_id}}_doInitialSchematicComponentRenderWithReactSymbol(symbolElement){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,center2=this._getGlobalSchematicPositionBeforeLayout(),schematic_component2=db2.schematic_component.insert({center:center2,size:{width:0,height:0},source_component_id:this.source_component_id,symbol_display_value:this._getSchematicSymbolDisplayValue(),is_box_with_pins:!1});this.schematic_component_id=schematic_component2.schematic_component_id}_doInitialSchematicComponentRenderWithSchematicBoxDimensions(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,dimensions=this._getSchematicBoxDimensions(),primaryPortLabels={};if(Array.isArray(props.pinLabels))props.pinLabels.forEach((label,index)=>{primaryPortLabels[String(index+1)]=label});else for(let[port,label]of Object.entries(props.pinLabels??{}))primaryPortLabels[port]=Array.isArray(label)?label[0]:label;let center2=this._getGlobalSchematicPositionBeforeLayout(),schPortArrangement=this._getSchematicPortArrangement(),schematic_component2=db2.schematic_component.insert({center:center2,rotation:props.schRotation??0,size:dimensions.getSize(),port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:props.schPinSpacing??.2,pin_styles:underscorifyPinStyles(props.schPinStyle,props.pinLabels),port_labels:primaryPortLabels,source_component_id:this.source_component_id}),hasTopOrBottomPins=schPortArrangement?.topSide!==void 0||schPortArrangement?.bottomSide!==void 0,schematic_box_width=dimensions?.getSize().width,schematic_box_height=dimensions?.getSize().height,manufacturer_part_number_schematic_text=db2.schematic_text.insert({text:props.manufacturerPartNumber??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.35:center2.y-(schematic_box_height??0)/2-.13},color:"#006464",font_size:.18}),component_name_text=db2.schematic_text.insert({text:props.displayName??props.name??"",schematic_component_id:schematic_component2.schematic_component_id,anchor:"left",rotation:0,position:{x:hasTopOrBottomPins?center2.x+(schematic_box_width??0)/2+.1:center2.x-(schematic_box_width??0)/2,y:hasTopOrBottomPins?center2.y+(schematic_box_height??0)/2+.55:center2.y+(schematic_box_height??0)/2+.13},color:"#006464",font_size:.18});this.schematic_component_id=schematic_component2.schematic_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,subcircuit=this.getSubcircuit(),componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error)}let globalTransform=this._computePcbGlobalTransformBeforeLayout(),accumulatedRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,pcb_component2=db2.pcb_component.insert({center:this._getGlobalPcbPositionBeforeLayout(),width:0,height:0,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??accumulatedRotation,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0}),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c3=>c3.componentName==="Footprint");if(!footprint&&!hasFootprintChild&&!this.isGroup){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}this.pcb_component_id=pcb_component2.pcb_component_id;let manualPlacement=this.getSubcircuit()._getPcbManualPlacementForComponent(this);if((this.props.pcbX!==void 0||this.props.pcbY!==void 0)&&manualPlacement){let warning=pcb_manual_edit_conflict_warning.parse({type:"pcb_manual_edit_conflict_warning",pcb_manual_edit_conflict_warning_id:`pcb_manual_edit_conflict_${this.source_component_id}`,message:`${this.getString()} has both manual placement and prop coordinates. pcbX and pcbY will be used. Remove pcbX/pcbY or clear the manual placement.`,pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_manual_edit_conflict_warning.insert(warning)}}doInitialPcbComponentSizeCalculation(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,bounds=getBoundsOfPcbComponents(this.children);if(bounds.width===0||bounds.height===0)return;let center2={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2};db2.pcb_component.update(this.pcb_component_id,{center:center2,width:bounds.width,height:bounds.height})}updatePcbComponentSizeCalculation(){this.doInitialPcbComponentSizeCalculation()}doInitialSchematicComponentSizeCalculation(){if(this.root?.schematicDisabled||!this.schematic_component_id)return;let{db:db2}=this.root;if(!db2.schematic_component.get(this.schematic_component_id))return;let schematicElements=[],collectSchematicPrimitives=children=>{for(let child of children){if(child.isSchematicPrimitive&&child.componentName==="SchematicLine"){let line2=db2.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicRect"){let rect=db2.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}if(child.isSchematicPrimitive&&child.componentName==="SchematicCircle"){let circle2=db2.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicArc"){let arc2=db2.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}if(child.isSchematicPrimitive&&child.componentName==="SchematicText"){let text=db2.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}if(child.isSchematicPrimitive&&child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db2.schematic_path.get(pathId);path&&schematicElements.push(path)}}child.children&&child.children.length>0&&collectSchematicPrimitives(child.children)}};if(collectSchematicPrimitives(this.children),schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements),width=Math.abs(bounds.maxX-bounds.minX),height=Math.abs(bounds.maxY-bounds.minY);if(width===0&&height===0)return;let centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;db2.schematic_component.update(this.schematic_component_id,{center:{x:centerX,y:centerY},size:{width,height}})}updateSchematicComponentSizeCalculation(){this.doInitialSchematicComponentSizeCalculation()}doInitialPcbComponentAnchorAlignment(){NormalComponent_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}_renderReactSubtree(element){let component=createInstanceFromReactElement(element);return{element,component}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}doInitialReactSubtreesRender(){let fpElm=this.props.footprint;(0,import_react2.isValidElement)(fpElm)&&(this.children.some(c3=>c3.componentName==="Footprint")||this.add(fpElm));let symElm=this.props.symbol;(0,import_react2.isValidElement)(symElm)&&(this.children.some(c3=>c3.componentName==="Symbol")||this.add(symElm));let cmElm=this.props.cadModel;if((0,import_react2.isValidElement)(cmElm)){this._isCadModelChild=!0;let hasCadAssemblyChild=this.children.some(c3=>c3.componentName==="CadAssembly"),hasCadModelChild=this.children.some(c3=>c3.componentName==="CadModel");!hasCadAssemblyChild&&!hasCadModelChild&&this.add(cmElm)}}doInitialPcbFootprintStringRender(){NormalComponent_doInitialPcbFootprintStringRender(this,(name,effect)=>this._queueAsyncEffect(name,effect))}_getAllPortsFromChildren(){let ports=[],collectPorts=component=>{component.componentName==="Port"&&ports.push(component);for(let child of component.children)collectPorts(child)};for(let child of this.children)collectPorts(child);return ports}_hasExistingPortExactly(port1){return this._getAllPortsFromChildren().some(port2=>{let aliases1=port1.getNameAndAliases(),aliases2=port2.getNameAndAliases();return aliases1.length===aliases2.length&&aliases1.every(alias=>aliases2.includes(alias))})}_hasMatchingPort(port1){let existingPorts=this._getAllPortsFromChildren(),pinNumber1=port1._parsedProps.pinNumber;return pinNumber1===void 0?!1:existingPorts.some(port2=>port2._parsedProps.pinNumber===pinNumber1)}add(componentOrElm){let component;if((0,import_react2.isValidElement)(componentOrElm)){let subtree=this._renderReactSubtree(componentOrElm);this.reactSubtrees.push(subtree),component=subtree.component}else component=componentOrElm;if(component.componentName==="Port"){if(this._hasExistingPortExactly(component))return;if(this._hasMatchingPort(component)){debug32(`Skipping port ${component} because a matching port already exists`);return}}super.add(component)}getPortsFromFootprint(opts){let{footprint}=this.props;if(typeof footprint=="string"&&parseLibraryFootprintRef(footprint)&&this.children.some(c3=>c3.componentName==="Footprint")?footprint=this.children.find(c3=>c3.componentName==="Footprint"):(!footprint||(0,import_react2.isValidElement)(footprint))&&(footprint=this.children.find(c3=>c3.componentName==="Footprint")),typeof footprint=="string"){if(isHttpUrl(footprint))return[];if(isStaticAssetPath(footprint))return[];if(parseLibraryFootprintRef(footprint))return[];let fpSoup=fp.string(footprint).soup(),newPorts2=[];for(let elm of fpSoup)if("port_hints"in elm&&elm.port_hints){let newPort=getPortFromHints(elm.port_hints,opts);if(!newPort)continue;newPort.originDescription=`footprint:string:${footprint}:port_hints[0]:${elm.port_hints[0]}`,newPorts2.push(newPort)}return newPorts2}if(!(0,import_react2.isValidElement)(footprint)&&footprint&&footprint.componentName==="Footprint"){let fp22=footprint,pinNumber=1,newPorts2=[];for(let fpChild of fp22.children){if(!fpChild.props.portHints)continue;let filteredPortHints=fpChild.props.portHints.filter(hint=>hint&&hint.trim()!=="");if(filteredPortHints.length===0)continue;let portHintsList=filteredPortHints;portHintsList.some(hint=>hint.startsWith("pin")||/^(?:pin)?\d+$/.test(hint))||(portHintsList=[...portHintsList,`pin${pinNumber}`]),pinNumber++;let newPort=getPortFromHints(portHintsList);newPort&&(newPort.originDescription=`footprint:${footprint}`,newPorts2.push(newPort))}return newPorts2}let newPorts=[];if(!footprint){for(let child of this.children)if(child.props.portHints&&child.isPcbPrimitive){let port=getPortFromHints(child.props.portHints);port&&newPorts.push(port)}}return newPorts}getPortsFromSchematicSymbol(){if(this.root?.schematicDisabled)return[];let{config}=this;if(!config.schematicSymbolName)return[];let symbol=Vf[config.schematicSymbolName];if(!symbol)return[];let newPorts=[];for(let symbolPort of symbol.ports){let port=getPortFromHints(symbolPort.labels);port&&(port.schematicSymbolPortDef=symbolPort,newPorts.push(port))}return newPorts}doInitialCreateNetsFromProps(){this._createNetsFromProps(this._getNetsFromConnectionsProp())}_getNetsFromConnectionsProp(){let{_parsedProps:props}=this,propsWithConnections=[];if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)propsWithConnections.push(String(targetPath))}return propsWithConnections}_createNetsFromProps(propsWithConnections){createNetsFromProps(this,propsWithConnections)}_getPcbCircuitJsonBounds(){let{db:db2}=this.root;if(!this.pcb_component_id)return super._getPcbCircuitJsonBounds();let pcb_component2=db2.pcb_component.get(this.pcb_component_id);return{center:{x:pcb_component2.center.x,y:pcb_component2.center.y},bounds:{left:pcb_component2.center.x-pcb_component2.width/2,top:pcb_component2.center.y-pcb_component2.height/2,right:pcb_component2.center.x+pcb_component2.width/2,bottom:pcb_component2.center.y+pcb_component2.height/2},width:pcb_component2.width,height:pcb_component2.height}}_getPinCountFromSchematicPortArrangement(){let schPortArrangement=this._getSchematicPortArrangement();if(!schPortArrangement)return 0;if(!isExplicitPinMappingArrangement(schPortArrangement))return(schPortArrangement.leftSize??schPortArrangement.leftPinCount??0)+(schPortArrangement.rightSize??schPortArrangement.rightPinCount??0)+(schPortArrangement.topSize??schPortArrangement.topPinCount??0)+(schPortArrangement.bottomSize??schPortArrangement.bottomPinCount??0);let{leftSide,rightSide,topSide,bottomSide}=schPortArrangement;return Math.max(...leftSide?.pins??[],...rightSide?.pins??[],...topSide?.pins??[],...bottomSide?.pins??[])}_getPinCount(){if(this._getSchematicPortArrangement())return this._getPinCountFromSchematicPortArrangement();let portsFromFootprint=this.getPortsFromFootprint();if(portsFromFootprint.length>0)return portsFromFootprint.length;let{pinLabels}=this._parsedProps;if(pinLabels){if(Array.isArray(pinLabels))return pinLabels.length;let pinNumbers=Object.keys(pinLabels).map(k4=>k4.startsWith("pin")?parseInt(k4.slice(3)):parseInt(k4)).filter(n3=>!Number.isNaN(n3));return pinNumbers.length>0?Math.max(...pinNumbers):Object.keys(pinLabels).length}return 0}_getSchematicPortArrangement(){return this._parsedProps.schPinArrangement??this._parsedProps.schPortArrangement}_getPinLabelsFromPorts(){let ports=this.selectAll("port"),pinLabels={};for(let port of ports){let pinNumber=port.props.pinNumber;if(pinNumber!==void 0){let bestLabel=port._getBestDisplayPinLabel();bestLabel&&(pinLabels[`pin${pinNumber}`]=bestLabel)}}return pinLabels}_getSchematicBoxDimensions(){if(this.getSchematicSymbol()||!this.config.shouldRenderAsSchematicBox)return null;let{_parsedProps:props}=this,pinCount=this._getPinCount(),pinSpacing=props.schPinSpacing??.2,allPinLabels={...this._getPinLabelsFromPorts(),...props.pinLabels};return getAllDimensionsForSchematicBox({schWidth:props.schWidth,schHeight:props.schHeight,schPinSpacing:pinSpacing,numericSchPinStyle:getNumericSchPinStyle(props.schPinStyle,allPinLabels),pinCount,schPortArrangement:this._getSchematicPortArrangement(),pinLabels:allPinLabels})}getFootprinterString(){return typeof this._parsedProps.footprint=="string"?this._parsedProps.footprint:null}doInitialCadModelRender(){if(this._isCadModelChild||this.props.doNotPlace)return;let{db:db2}=this.root,{boardThickness=0}=this._getBoard()??{},cadModelProp2=this._parsedProps.cadModel,cadModel=cadModelProp2===void 0?this._asyncFootprintCadModel:cadModelProp2,footprint=this.getFootprinterString()??this._getImpliedFootprintString();if(!this.pcb_component_id||!cadModel&&!footprint||cadModel===null)return;let bounds=this._getPcbCircuitJsonBounds();if(typeof cadModel=="string")throw new Error("String cadModel not yet implemented");let sourceRotationOffset=cadModel?.pcbRotationOffset??cadModel?.rotationOffset,rotationOffset=rotation32.parse({x:0,y:0,z:typeof sourceRotationOffset=="number"?sourceRotationOffset:0,...typeof sourceRotationOffset=="object"?sourceRotationOffset:{}}),positionOffset=point3.parse({x:0,y:0,z:0,...typeof cadModel?.positionOffset=="object"?cadModel.positionOffset:{}}),zOffsetFromSurface=cadModel&&typeof cadModel=="object"&&"zOffsetFromSurface"in cadModel&&cadModel.zOffsetFromSurface!==void 0?distance.parse(cadModel.zOffsetFromSurface):0,computedLayer=this.props.layer==="bottom"?"bottom":"top",pcbComponent=db2.pcb_component.get(this.pcb_component_id),globalTransform=this._computePcbGlobalTransformBeforeLayout(),preLayoutRotation=decomposeTSR2(globalTransform).rotation.angle*180/Math.PI,totalRotation=pcbComponent?.position_mode==="packed"?pcbComponent.rotation??preLayoutRotation:preLayoutRotation,isBottomLayer=computedLayer==="bottom",rotationWithOffset=totalRotation+(rotationOffset.z??0),cadRotationZ=normalizeDegrees(rotationWithOffset),cad_model=db2.cad_component.insert({position:{x:bounds.center.x+positionOffset.x,y:bounds.center.y+positionOffset.y,z:(computedLayer==="bottom"?-boardThickness/2:boardThickness/2)+(computedLayer==="bottom"?-zOffsetFromSurface:zOffsetFromSurface)+positionOffset.z},rotation:{x:rotationOffset.x,y:rotationOffset.y+(isBottomLayer?180:0),z:normalizeDegrees(isBottomLayer?-cadRotationZ:cadRotationZ)},pcb_component_id:this.pcb_component_id,source_component_id:this.source_component_id,model_stl_url:"stlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stlUrl):void 0,model_obj_url:"objUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.objUrl):void 0,model_mtl_url:"mtlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.mtlUrl):void 0,model_gltf_url:"gltfUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.gltfUrl):void 0,model_glb_url:"glbUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.glbUrl):void 0,model_step_url:"stepUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.stepUrl):void 0,model_wrl_url:"wrlUrl"in(cadModel??{})?this._addCachebustToModelUrl(cadModel.wrlUrl):void 0,model_jscad:"jscad"in(cadModel??{})?cadModel.jscad:void 0,model_unit_to_mm_scale_factor:typeof cadModel?.modelUnitToMmScale=="number"?cadModel.modelUnitToMmScale:void 0,model_board_normal_direction:cadModel?.modelBoardNormalDirection,model_origin_alignment:"center_of_component_on_board_surface",anchor_alignment:"center_of_component_on_board_surface",model_origin_position:cadModel?.modelOriginPosition,footprinter_string:typeof footprint=="string"&&!cadModel?footprint:void 0,show_as_translucent_model:this._parsedProps.showAsTranslucentModel});this.cad_component_id=cad_model.cad_component_id}_addCachebustToModelUrl(url2){if(!url2||!url2.includes("modelcdn.tscircuit.com"))return url2;let origin=this.root?.getClientOrigin()??"";return`${url2}${url2.includes("?")?"&":"?"}cachebust_origin=${encodeURIComponent(origin)}`}_getPartsEngineCacheKey(source_component,footprinterString){return JSON.stringify({ftype:source_component.ftype,name:source_component.name,manufacturer_part_number:source_component.manufacturer_part_number,footprinterString})}async _getSupplierPartNumbers(partsEngine2,source_component,footprinterString){if(this.props.doNotPlace)return{};let cacheEngine=this.root?.platform?.localCacheEngine,cacheKey=this._getPartsEngineCacheKey(source_component,footprinterString);if(cacheEngine){let cached=await cacheEngine.getItem(cacheKey);if(cached)try{return JSON.parse(cached)}catch{}}let result=await Promise.resolve(partsEngine2.findPart({sourceComponent:source_component,footprinterString}));if(typeof result=="string"){if(result.includes("<!DOCTYPE")||result.includes("<html"))throw new Error(`Failed to fetch supplier part numbers: Received HTML response instead of JSON. Response starts with: ${result.substring(0,100)}`);if(result==="Not found")return{};throw new Error(`Invalid supplier part numbers format: Expected object but got string: "${result}"`)}if(!result||Array.isArray(result)||typeof result!="object"){let actualType=result===null?"null":Array.isArray(result)?"array":typeof result;throw new Error(`Invalid supplier part numbers format: Expected object but got ${actualType}`)}let supplierPartNumbers=result;if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(supplierPartNumbers))}catch{}return supplierPartNumbers}doInitialPartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let partsEngine2=this.getInheritedProperty("partsEngine");if(!partsEngine2)return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(!source_component||source_component.supplier_part_numbers)return;let footprinterString;this.props.footprint&&typeof this.props.footprint=="string"&&(footprinterString=this.props.footprint);let supplierPartNumbersMaybePromise=this._getSupplierPartNumbers(partsEngine2,source_component,footprinterString);if(!(supplierPartNumbersMaybePromise instanceof Promise)){db2.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbersMaybePromise});return}this._queueAsyncEffect("get-supplier-part-numbers",async()=>{await supplierPartNumbersMaybePromise.then(supplierPartNumbers=>{this._asyncSupplierPartNumbers=supplierPartNumbers,this._markDirty("PartsEngineRender")}).catch(error=>{this._asyncSupplierPartNumbers={};let errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch supplier part numbers for ${this.getString()}: ${error.message}`,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id});db2.unknown_error_finding_part.insert(errorObj),this._markDirty("PartsEngineRender")})})}updatePartsEngineRender(){if(this.props.doNotPlace||this.getInheritedProperty("bomDisabled")||this.getInheritedProperty("partsEngineDisabled"))return;let{db:db2}=this.root,source_component=db2.source_component.get(this.source_component_id);if(source_component&&!source_component.supplier_part_numbers&&this._asyncSupplierPartNumbers){db2.source_component.update(this.source_component_id,{supplier_part_numbers:this._asyncSupplierPartNumbers});return}}doInitialAssignFallbackProps(){let{_parsedProps:props}=this;props.connections&&!this.name&&(this.fallbackUnassignedName=this.getSubcircuit().getNextAvailableName(this))}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}_createTracesFromConnectionsProp(){let{_parsedProps:props}=this;if(props.connections)for(let[pinName,target]of Object.entries(props.connections)){let targets=Array.isArray(target)?target:[target];for(let targetPath of targets)this.add(new Trace3({from:`.${this.name} > .${pinName}`,to:String(targetPath)}))}}doInitialSourceDesignRuleChecks(){NormalComponent_doInitialSourceDesignRuleChecks(this)}doInitialValidatePcbCoordinates(){if(super.doInitialValidatePcbCoordinates(),this.root?.pcbDisabled)return;let props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=typeof rawProps.pcbLeftEdgeX=="string"?rawProps.pcbLeftEdgeX:props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=typeof rawProps.pcbRightEdgeX=="string"?rawProps.pcbRightEdgeX:props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=typeof rawProps.pcbTopEdgeY=="string"?rawProps.pcbTopEdgeY:props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=typeof rawProps.pcbBottomEdgeY=="string"?rawProps.pcbBottomEdgeY:props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0)&&(pcbLeftEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbLeftEdgeX,axis:"pcbX",propertyName:"pcbLeftEdgeX"}),pcbRightEdgeX!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbRightEdgeX,axis:"pcbX",propertyName:"pcbRightEdgeX"}),pcbTopEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbTopEdgeY,axis:"pcbY",propertyName:"pcbTopEdgeY"}),pcbBottomEdgeY!==void 0&&this._validatePcbCoordinateReferences({rawValue:pcbBottomEdgeY,axis:"pcbY",propertyName:"pcbBottomEdgeY"}))}doInitialPcbLayout(){if(this.root?.pcbDisabled||!this.pcb_component_id)return;let{db:db2}=this.root,props=this._parsedProps,rawProps=this.props,pcbLeftEdgeX=props.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=props.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=props.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=props.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;if(!(props.pcbX!==void 0||props.pcbY!==void 0||pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0))return;if(pcbLeftEdgeX!==void 0&&pcbRightEdgeX!==void 0)throw new Error(`${this.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(pcbTopEdgeY!==void 0&&pcbBottomEdgeY!==void 0)throw new Error(`${this.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let pcbComponent=db2.pcb_component.get(this.pcb_component_id),componentWidth=pcbComponent?.width??0,componentHeight=pcbComponent?.height??0,positionedRelativeToGroupId=this.getGroup()?.pcb_group_id??void 0,positionedRelativeToBoardId=positionedRelativeToGroupId?void 0:this._getBoard()?.pcb_board_id??void 0,resolvedPcbX=this._resolvedPcbCalcOffsetX??(props.pcbX!==void 0?this._resolvePcbCoordinate(props.pcbX,"pcbX"):pcbLeftEdgeX!==void 0?this._resolvePcbCoordinate(pcbLeftEdgeX,"pcbX",{propertyName:"pcbLeftEdgeX"})+componentWidth/2:pcbRightEdgeX!==void 0?this._resolvePcbCoordinate(pcbRightEdgeX,"pcbX",{propertyName:"pcbRightEdgeX"})-componentWidth/2:void 0),resolvedPcbY=this._resolvedPcbCalcOffsetY??(props.pcbY!==void 0?this._resolvePcbCoordinate(props.pcbY,"pcbY"):pcbTopEdgeY!==void 0?this._resolvePcbCoordinate(pcbTopEdgeY,"pcbY",{propertyName:"pcbTopEdgeY"})-componentHeight/2:pcbBottomEdgeY!==void 0?this._resolvePcbCoordinate(pcbBottomEdgeY,"pcbY",{propertyName:"pcbBottomEdgeY"})+componentHeight/2:void 0);db2.pcb_component.update(this.pcb_component_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:positionedRelativeToGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:resolvedPcbX,display_offset_y:resolvedPcbY})}_getMinimumFlexContainerSize(){return NormalComponent__getMinimumFlexContainerSize(this)}_repositionOnPcb(position2){return NormalComponent__repositionOnPcb(this,position2)}doInitialSilkscreenOverlapAdjustment(){return NormalComponent_doInitialSilkscreenOverlapAdjustment(this)}isRelativelyPositioned(){let rawProps=this.props;return this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0||this._parsedProps.pcbLeftEdgeX!==void 0||this._parsedProps.pcbRightEdgeX!==void 0||this._parsedProps.pcbTopEdgeY!==void 0||this._parsedProps.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0}},getDescendantSubcircuitIds=(db2,root_subcircuit_id)=>{let groups=db2.source_group.list(),result=[],findDescendants=parentId=>{let children=groups.filter(group=>group.parent_subcircuit_id===parentId);for(let child of children)child.subcircuit_id&&(result.push(child.subcircuit_id),findDescendants(child.subcircuit_id))};return findDescendants(root_subcircuit_id),result},getBoardCenterFromAnchor=({boardAnchorPosition,boardAnchorAlignment,width,height})=>{let{x:ax3,y:ay3}=boardAnchorPosition,cx3=ax3,cy3=ay3;switch(boardAnchorAlignment){case"top_left":cx3=ax3+width/2,cy3=ay3-height/2;break;case"top_right":cx3=ax3-width/2,cy3=ay3-height/2;break;case"bottom_left":cx3=ax3+width/2,cy3=ay3+height/2;break;case"bottom_right":cx3=ax3-width/2,cy3=ay3+height/2;break;case"top":cx3=ax3,cy3=ay3-height/2;break;case"bottom":cx3=ax3,cy3=ay3+height/2;break;case"left":cx3=ax3+width/2,cy3=ay3;break;case"right":cx3=ax3-width/2,cy3=ay3;break;default:break}return{x:cx3,y:cy3}};function inflatePcbBoard(pcbBoard,inflatorContext){let{subcircuit}=inflatorContext;if(subcircuit.lowercaseComponentName==="board"||subcircuit.lowercaseComponentName==="mountedboard"||subcircuit.parent?.lowercaseComponentName==="board")return;let boardProps2={name:"inflated_board"};pcbBoard.width&&(boardProps2.width=pcbBoard.width),pcbBoard.height&&(boardProps2.height=pcbBoard.height),pcbBoard.center&&(boardProps2.pcbX=pcbBoard.center.x,boardProps2.pcbY=pcbBoard.center.y),pcbBoard.outline&&(boardProps2.outline=pcbBoard.outline),pcbBoard.thickness&&(boardProps2.thickness=pcbBoard.thickness),pcbBoard.material&&(boardProps2.material=pcbBoard.material);let board=new Board(boardProps2);return board.pcb_board_id=pcbBoard.pcb_board_id,subcircuit.add(board),board}var Capacitor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Capacitor",schematicSymbolName:this.props.polarized?"capacitor_polarized":this.props.symbolName??"capacitor",zodProps:capacitorProps,sourceFtype:FTYPE.simple_capacitor}}initPorts(){typeof this.props.footprint=="string"?super.initPorts({additionalAliases:{pin1:["anode","pos"],pin2:["cathode","neg"]}}):super.initPorts()}_getSchematicSymbolDisplayValue(){let inputCapacitance=this.props.capacitance,capacitanceDisplay=typeof inputCapacitance=="string"?inputCapacitance:`${formatSiUnit(this._parsedProps.capacitance)}F`;return this._parsedProps.schShowRatings&&this._parsedProps.maxVoltageRating?`${capacitanceDisplay}/${formatSiUnit(this._parsedProps.maxVoltageRating)}V`:capacitanceDisplay}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.decouplingFor,this.props.decouplingTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.decouplingFor&&this.props.decouplingTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.decouplingFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.decouplingTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_capacitor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,capacitance:props.capacitance,max_voltage_rating:props.maxVoltageRating,max_decoupling_trace_length:props.maxDecouplingTraceLength,display_capacitance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!props.polarized,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},extractPcbPrimitivesFromCircuitJson=({pcbComponent,db:db2,componentName})=>{let componentCenter=pcbComponent.center||{x:0,y:0},componentRotation=pcbComponent.rotation||0,absoluteToComponentRelativeTransform=inverse2(compose2(translate2(componentCenter.x,componentCenter.y),rotate2(componentRotation*Math.PI/180))),relativeElements=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===pcbComponent.pcb_component_id),clonedRelativeElements=structuredClone(relativeElements);return transformPCBElements(clonedRelativeElements,absoluteToComponentRelativeTransform),createComponentsFromCircuitJson({componentName,componentRotation:"0deg"},clonedRelativeElements)},inflateFootprintComponent=(pcbElm,inflatorContext)=>{let{injectionDb,normalComponent}=inflatorContext;if(!normalComponent)return null;let primitives=extractPcbPrimitivesFromCircuitJson({pcbComponent:pcbElm,db:injectionDb,componentName:normalComponent.name});if(primitives.length===0)return null;let footprint=new Footprint({});return footprint.addAll(primitives),footprint};function inflateSourceCapacitor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),capacitor=new Capacitor({name:sourceElm.name,capacitance:sourceElm.capacitance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:capacitor});footprint&&capacitor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(capacitor):subcircuit.add(capacitor)}var Chip=class extends NormalComponent3{constructor(props){super(props);__publicField(this,"schematicBoxDimensions",null)}get config(){return{componentName:"Chip",zodProps:chipProps,shouldRenderAsSchematicBox:!0}}initPorts(opts={}){super.initPorts(opts);let{_parsedProps:props}=this;if(props.externallyConnectedPins){let requiredPorts=new Set;for(let[pin1,pin2]of props.externallyConnectedPins)requiredPorts.add(pin1),requiredPorts.add(pin2);for(let pinIdentifier of requiredPorts)if(!this.children.find(child=>child instanceof Port&&child.isMatchingAnyOf([pinIdentifier]))){let pinMatch=pinIdentifier.match(/^pin(\d+)$/);if(pinMatch){let pinNumber=parseInt(pinMatch[1]);this.add(new Port({pinNumber,aliases:[pinIdentifier]}))}else this.add(new Port({name:pinIdentifier,aliases:[pinIdentifier]}))}}}doInitialSchematicComponentRender(){let{_parsedProps:props}=this;props?.noSchematicRepresentation!==!0&&super.doInitialSchematicComponentRender()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),footprint=props.footprint??this._getImpliedFootprintString(),hasFootprintChild=this.children.some(c3=>c3.componentName==="Footprint");if(!footprint&&!hasFootprintChild){let footprint_error=db2.pcb_missing_footprint_error.insert({message:`No footprint specified for component: ${this.getString()}`,source_component_id:`${this.source_component_id}`,error_type:"pcb_missing_footprint_error"});this.pcb_missing_footprint_error_id=footprint_error.pcb_missing_footprint_error_id}let componentLayer=props.layer??"top";if(componentLayer!=="top"&&componentLayer!=="bottom"){let subcircuit=this.getSubcircuit(),error=pcb_component_invalid_layer_error.parse({type:"pcb_component_invalid_layer_error",message:`Component cannot be placed on layer '${componentLayer}'. Components can only be placed on 'top' or 'bottom' layers.`,source_component_id:this.source_component_id,layer:componentLayer,subcircuit_id:subcircuit.subcircuit_id??void 0});db2.pcb_component_invalid_layer_error.insert(error)}let pcb_component2=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:componentLayer==="top"||componentLayer==="bottom"?componentLayer:"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,is_allowed_to_be_off_board:props.allowOffBoard??!1,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialCreateTracesFromProps(){let{_parsedProps:props}=this;if(props.externallyConnectedPins)for(let[pin1,pin2]of props.externallyConnectedPins)this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.${pin1}`,to:`${this.getSubcircuitSelector()} > port.${pin2}`}));this._createTracesFromConnectionsProp()}doInitialSimulationRender(){let{db:db2}=this.root,{pinAttributes}=this.props;if(!pinAttributes)return;let powerPort=null,groundPort=null,voltage2,ports=this.selectAll("port");for(let port of ports)for(let alias of port.getNameAndAliases())if(pinAttributes[alias]){let attributes2=pinAttributes[alias];attributes2.providesPower&&(powerPort=port,voltage2=attributes2.providesVoltage),attributes2.providesGround&&(groundPort=port)}if(!powerPort||!groundPort||voltage2===void 0)return;let powerSourcePort=db2.source_port.get(powerPort.source_port_id);if(!powerSourcePort?.subcircuit_connectivity_map_key)return;let groundSourcePort=db2.source_port.get(groundPort.source_port_id);if(!groundSourcePort?.subcircuit_connectivity_map_key)return;let powerNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:powerSourcePort.subcircuit_connectivity_map_key}),groundNet=db2.source_net.getWhere({subcircuit_connectivity_map_key:groundSourcePort.subcircuit_connectivity_map_key});!powerNet||!groundNet||db2.simulation_voltage_source.insert({type:"simulation_voltage_source",positive_source_port_id:powerPort.source_port_id,positive_source_net_id:powerNet.source_net_id,negative_source_port_id:groundPort.source_port_id,negative_source_net_id:groundNet.source_net_id,voltage:voltage2})}},mapInternallyConnectedSourcePortIdsToPinLabels=(sourcePortIds,inflatorContext)=>{if(!sourcePortIds||sourcePortIds.length===0)return;let{injectionDb}=inflatorContext,mapped=sourcePortIds.map(group=>group.map(sourcePortId=>{let port=injectionDb.source_port.get(sourcePortId);return port?port.pin_number!==void 0&&port.pin_number!==null?`pin${port.pin_number}`:port.name:null}).filter(value=>value!==null)).filter(group=>group.length>0);return mapped.length>0?mapped:void 0},inflateSourceChip=(sourceElm,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),schematicElm=injectionDb.schematic_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),internallyConnectedPins=mapInternallyConnectedSourcePortIdsToPinLabels(sourceElm.internally_connected_source_port_ids,inflatorContext),footprinterString=cadElm?.footprinter_string??null,chip=new Chip({name:sourceElm.name,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,pinLabels:schematicElm?.port_labels??void 0,schWidth:schematicElm?.size?.width,schHeight:schematicElm?.size?.height,schPinSpacing:schematicElm?.pin_spacing,schX:schematicElm?.center?.x,schY:schematicElm?.center?.y,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds,internallyConnectedPins});if(footprinterString&&(Object.assign(chip.props,{footprint:footprinterString}),Object.assign(chip._parsedProps,{footprint:footprinterString})),pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:chip});footprint&&chip.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(chip):subcircuit.add(chip)},Diode=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={schottky:"schottky_diode",avalanche:"avalanche_diode",zener:"zener_diode",photodiode:"photodiode"},variantSymbol=this.props.schottky?"schottky":this.props.avalanche?"avalanche":this.props.zener?"zener":this.props.photo?"photodiode":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"diode",componentName:"Diode",zodProps:diodeProps,sourceFtype:"simple_diode"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_diode",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceDiode(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),diode2=new Diode({name:sourceElm.name,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:diode2});footprint&&diode2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(diode2):subcircuit.add(diode2)}var SOLVERS={PackSolver2,AutoroutingPipelineSolver:nb2,AssignableAutoroutingPipeline2:Kg2,AssignableAutoroutingPipeline3:sx2,AutoroutingPipeline1_OriginalUnravel:_g,AutoroutingPipelineSolver3_HgPortPointPathing:bx2,AutoroutingPipelineSolver4:nb2,AutoroutingPipelineSolver5:ub,CopperPourPipelineSolver},TscircuitAutorouter=class{constructor(input2,options={}){__publicField(this,"input");__publicField(this,"isRouting",!1);__publicField(this,"solver");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});__publicField(this,"cycleCount",0);__publicField(this,"stepDelay");__publicField(this,"timeoutId");this.input=input2;let{capacityDepth,targetMinCapacity,stepDelay=0,useAssignableSolver=!1,useAutoJumperSolver=!1,autorouterVersion:autorouterVersion2,effort,onSolverStarted}=options,solverName;autorouterVersion2==="v1"?solverName="AutoroutingPipeline1_OriginalUnravel":autorouterVersion2==="v3"?solverName="AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion2==="v4"||autorouterVersion2==="latest"?solverName="AutoroutingPipelineSolver4":autorouterVersion2==="v5"?solverName="AutoroutingPipelineSolver5":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver4";let SolverClass=SOLVERS[solverName];this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:null,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:null,effort}}}),this.stepDelay=stepDelay}start(){this.isRouting||(this.isRouting=!0,this.cycleCount=0,this.runCycleAndQueueNextCycle())}async stepSolver(){if("stepAsync"in this.solver&&typeof this.solver.stepAsync=="function"){await this.solver.stepAsync();return}this.solver.step()}async runCycleAndQueueNextCycle(){if(this.isRouting)try{if(this.solver.solved||this.solver.failed){this.solver.failed?this.emitEvent({type:"error",error:new AutorouterError(this.solver.error||"Routing failed")}):this.emitEvent({type:"complete",traces:this.solver.getOutputSimpleRouteJson().traces||[]}),this.isRouting=!1;return}let startTime=Date.now(),startIterations=this.solver.iterations;for(;Date.now()-startTime<250&&!this.solver.failed&&!this.solver.solved;)await this.stepSolver();let iterationsPerSecond=(this.solver.iterations-startIterations)/(Date.now()-startTime)*1e3;this.cycleCount++;let debugGraphics=this.solver?.preview()||void 0,progress=this.solver.progress;this.emitEvent({type:"progress",steps:this.cycleCount,iterationsPerSecond,progress,phase:this.solver.getCurrentPhase(),debugGraphics}),this.stepDelay>0?this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},this.stepDelay):this.timeoutId=setTimeout(()=>{this.runCycleAndQueueNextCycle()},0)}catch(error){this.emitEvent({type:"error",error:error instanceof Error?new AutorouterError(error.message):new AutorouterError(String(error))}),this.isRouting=!1}}stop(){this.isRouting&&(this.isRouting=!1,this.timeoutId!==void 0&&(clearTimeout(this.timeoutId),this.timeoutId=void 0))}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):event==="progress"&&this.eventHandlers.progress.push(callback)}emitEvent(event){if(event.type==="complete")for(let handler of this.eventHandlers.complete)handler(event);else if(event.type==="error")for(let handler of this.eventHandlers.error)handler(event);else if(event.type==="progress")for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){if(this.solver.solve(),this.solver.failed)throw new AutorouterError(this.solver.error||"Routing failed");return this.solver.getOutputSimpleRouteJson().traces||[]}getConnectedOffboardObstacles(){return"getConnectedOffboardObstacles"in this.solver?this.solver.getConnectedOffboardObstacles():{}}},createSourceTracesFromOffboardConnections=({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id})=>{if(Object.keys(connectedOffboardObstacles).length===0)return;let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}let obstacleById=new Map;for(let obstacle of simpleRouteJson.obstacles)obstacle.obstacleId&&obstacleById.set(obstacle.obstacleId,obstacle);let connectionGroups=new Map;for(let[obstacleId,rootConnectionName]of Object.entries(connectedOffboardObstacles))connectionGroups.has(rootConnectionName)||connectionGroups.set(rootConnectionName,[]),connectionGroups.get(rootConnectionName).push(obstacleId);for(let[rootConnectionName,obstacleIds]of connectionGroups){let sourcePortIds=new Set;for(let obstacleId of obstacleIds){let obstacle=obstacleById.get(obstacleId);if(obstacle)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);sourcePortId&&sourcePortIds.add(sourcePortId)}}if(sourcePortIds.size<2)continue;let sourcePortIdArray=Array.from(sourcePortIds);db2.source_trace.list().some(trace=>{let tracePortIds=new Set(trace.connected_source_port_ids);return sourcePortIdArray.every(id2=>tracePortIds.has(id2))})||db2.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}};function getPresetAutoroutingConfig(autorouterConfig2){let defaults={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{};switch(typeof preset=="string"?preset.replace(/_/g,"-"):preset){case"auto-local":return{local:!0,groupMode:"subcircuit"};case"sequential-trace":return{local:!0,groupMode:"sequential-trace"};case"subcircuit":return{local:!0,groupMode:"subcircuit"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults,...rest}}case"laser-prefab":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"laser_prefab",...rest}}case"auto-jumper":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!0,groupMode:"subcircuit",preset:"auto_jumper",...rest}}default:return{local:!0,groupMode:"subcircuit"}}}var applyPcbEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,pcb_placements:[...manualEditsFile.pcb_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let{pcb_component_id,new_center}=editEvent,pcb_component2=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component2)continue;let source_component=su2(circuitJson).source_component.get(pcb_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.pcb_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.pcb_placements.push(newPlacement)}return updatedManualEditsFile},applySchematicEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let updatedManualEditsFile={...manualEditsFile,schematic_placements:[...manualEditsFile.schematic_placements??[]]};for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_schematic_component_location"){let{schematic_component_id,new_center}=editEvent,schematic_component2=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component2||!schematic_component2.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component2.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p4=>p4.selector===source_component.name),newPlacement={selector:source_component.name,center:new_center,relative_to:"group_center"};existingPlacementIndex>=0?updatedManualEditsFile.schematic_placements[existingPlacementIndex]=newPlacement:updatedManualEditsFile.schematic_placements.push(newPlacement)}return updatedManualEditsFile},applyEditEventsToManualEditsFile=({circuitJson,editEvents,manualEditsFile})=>{let schematicEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_schematic_component_location"),pcbEditEvents=editEvents.filter(event=>event.edit_event_type==="edit_pcb_component_location"),updatedManualEditsFile=manualEditsFile;return schematicEditEvents.length>0&&(updatedManualEditsFile=applySchematicEditEventsToManualEditsFile({circuitJson,editEvents:schematicEditEvents,manualEditsFile:updatedManualEditsFile})),pcbEditEvents.length>0&&(updatedManualEditsFile=applyPcbEditEventsToManualEditsFile({circuitJson,editEvents:pcbEditEvents,manualEditsFile:updatedManualEditsFile})),updatedManualEditsFile},applyTraceHintEditEvent=(circuitJson,edit_event)=>{if(su2(circuitJson).pcb_trace_hint.get(edit_event.pcb_trace_hint_id))circuitJson=circuitJson.map(e4=>e4.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e4,route:edit_event.route}:e4);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e4=>!(e4.type==="pcb_trace_hint"&&e4.pcb_port_id===edit_event.pcb_port_id)).concat([{type:"pcb_trace_hint",pcb_trace_hint_id:edit_event.pcb_trace_hint_id,route:edit_event.route,pcb_port_id:edit_event.pcb_port_id,pcb_component_id:pcbPort?.pcb_component_id}])}return circuitJson},applyEditEvents=({circuitJson,editEvents})=>{circuitJson=JSON.parse(JSON.stringify(circuitJson));for(let editEvent of editEvents)if(editEvent.edit_event_type==="edit_pcb_component_location"){let component=circuitJson.find(e4=>e4.type==="pcb_component"&&e4.pcb_component_id===editEvent.pcb_component_id);if((!component||component.center.x!==editEvent.new_center.x||component.center.y!==editEvent.new_center.y)&&editEvent.original_center){let mat=translate2(editEvent.new_center.x-editEvent.original_center.x,editEvent.new_center.y-editEvent.original_center.y);circuitJson=circuitJson.map(e4=>e4.pcb_component_id!==editEvent.pcb_component_id?e4:transformPCBElement(e4,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e4=>e4.type==="schematic_component"&&e4.schematic_component_id===editEvent.schematic_component_id?{...e4,center:editEvent.new_center}:e4):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},getSimpleRouteJsonFromCircuitJson=({db:db2,circuitJson,subcircuit_id,minTraceWidth=.1,nominalTraceWidth})=>{if(!db2&&circuitJson&&(db2=su2(circuitJson)),!db2)throw new Error("db or circuitJson is required");let traceHints=db2.pcb_trace_hint.list(),relevantSubcircuitIds=subcircuit_id?new Set([subcircuit_id]):null;if(subcircuit_id){let descendantSubcircuitIds=getDescendantSubcircuitIds(db2,subcircuit_id);for(let id2 of descendantSubcircuitIds)relevantSubcircuitIds.add(id2)}let subcircuitElements=(circuitJson??db2.toArray()).filter(e4=>!subcircuit_id||"subcircuit_id"in e4&&relevantSubcircuitIds.has(e4.subcircuit_id)),board=null;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board2=db2.source_board.getWhere({source_group_id});source_board2&&(board=db2.pcb_board.getWhere({source_board_id:source_board2.source_board_id}))}board||(board=db2.pcb_board.list()[0]),db2=su2(subcircuitElements);let connMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),obstacles=getObstaclesFromCircuitJson2([...db2.pcb_component.list(),...db2.pcb_smtpad.list(),...db2.pcb_plated_hole.list(),...db2.pcb_hole.list(),...db2.pcb_via.list(),...db2.pcb_cutout.list()].filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connMap);for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id2=>connMap.getIdsConnectedToNet(id2));obstacle.connectedTo.push(...additionalIds)}let internalConnections=db2.source_component_internal_connection.list(),sourcePortIdToInternalConnectionId=new Map;for(let ic3 of internalConnections)for(let sourcePortId of ic3.source_port_ids)sourcePortIdToInternalConnectionId.set(sourcePortId,ic3.source_component_internal_connection_id);let pcbElementIdToSourcePortId=new Map;for(let pcbPort of db2.pcb_port.list())if(pcbPort.source_port_id){let smtpad2=db2.pcb_smtpad.getWhere({pcb_port_id:pcbPort.pcb_port_id});smtpad2&&pcbElementIdToSourcePortId.set(smtpad2.pcb_smtpad_id,pcbPort.source_port_id);let platedHole=db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPort.pcb_port_id});platedHole&&pcbElementIdToSourcePortId.set(platedHole.pcb_plated_hole_id,pcbPort.source_port_id)}for(let obstacle of obstacles)for(let connectedId of obstacle.connectedTo){let sourcePortId=pcbElementIdToSourcePortId.get(connectedId);if(sourcePortId){let internalConnectionId=sourcePortIdToInternalConnectionId.get(sourcePortId);if(internalConnectionId){obstacle.offBoardConnectsTo=[internalConnectionId],obstacle.netIsAssignable=!0;break}}}let allPoints=obstacles.flatMap(o3=>[{x:o3.center.x-o3.width/2,y:o3.center.y-o3.height/2},{x:o3.center.x+o3.width/2,y:o3.center.y+o3.height/2}]).concat(board?.outline??[]),bounds;if(board&&!board.outline?bounds={minX:board.center.x-board.width/2,maxX:board.center.x+board.width/2,minY:board.center.y-board.height/2,maxY:board.center.y+board.height/2}:bounds={minX:Math.min(...allPoints.map(p4=>p4.x))-1,maxX:Math.max(...allPoints.map(p4=>p4.x))+1,minY:Math.min(...allPoints.map(p4=>p4.y))-1,maxY:Math.max(...allPoints.map(p4=>p4.y))+1},subcircuit_id){let group=db2.pcb_group.getWhere({subcircuit_id});if(group?.width&&group.height){let groupBounds={minX:group.center.x-group.width/2,maxX:group.center.x+group.width/2,minY:group.center.y-group.height/2,maxY:group.center.y+group.height/2};bounds={minX:Math.min(bounds.minX,groupBounds.minX),maxX:Math.max(bounds.maxX,groupBounds.maxX),minY:Math.min(bounds.minY,groupBounds.minY),maxY:Math.max(bounds.maxY,groupBounds.maxY)}}}let routedTraceIds=new Set(db2.pcb_trace.list().map(t35=>t35.source_trace_id).filter(id2=>!!id2)),directTraceConnections=db2.source_trace.list().filter(trace=>!routedTraceIds.has(trace.source_trace_id)).map(trace=>{let connectedPorts=trace.connected_source_port_ids.map(id2=>{let source_port2=db2.source_port.get(id2),pcb_port2=db2.pcb_port.getWhere({source_port_id:id2});return{...source_port2,...pcb_port2}});if(connectedPorts.length<2)return null;let[portA,portB]=connectedPorts;if(portA.x===void 0||portA.y===void 0)return console.error(`(source_port_id: ${portA.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;if(portB.x===void 0||portB.y===void 0)return console.error(`(source_port_id: ${portB.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let layerA=portA.layers?.[0]??"top",layerB=portB.layers?.[0]??"top",matchingHints=traceHints.filter(hint=>hint.pcb_port_id===portA.pcb_port_id||hint.pcb_port_id===portB.pcb_port_id),hintPoints=[];for(let hint of matchingHints){let layer=db2.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt4 of hint.route)hintPoints.push({x:pt4.x,y:pt4.y,layer})}return{name:trace.source_trace_id??connMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[{x:portA.x,y:portA.y,layer:layerA,pointId:portA.pcb_port_id,pcb_port_id:portA.pcb_port_id},...hintPoints,{x:portB.x,y:portB.y,layer:layerB,pointId:portB.pcb_port_id,pcb_port_id:portB.pcb_port_id}]}}).filter(c3=>c3!==null),directTraceConnectionsById=new Map(directTraceConnections.map(c3=>[c3.source_trace_id,c3])),source_nets=db2.source_net.list().filter(e4=>!subcircuit_id||relevantSubcircuitIds?.has(e4.subcircuit_id)),connectionsFromNets=[];for(let net of source_nets){let connectedSourceTraces=db2.source_trace.list().filter(st4=>st4.connected_source_net_ids?.includes(net.source_net_id));connectionsFromNets.push({name:net.source_net_id??connMap.getNetConnectedToId(net.source_net_id),pointsToConnect:connectedSourceTraces.flatMap(st4=>db2.pcb_port.list().filter(p4=>st4.connected_source_port_ids.includes(p4.source_port_id)).map(p4=>({x:p4.x,y:p4.y,layer:p4.layers?.[0]??"top",pointId:p4.pcb_port_id,pcb_port_id:p4.pcb_port_id})))})}let breakoutPoints=db2.pcb_breakout_point.list().filter(bp3=>!subcircuit_id||relevantSubcircuitIds?.has(bp3.subcircuit_id)),connectionsFromBreakoutPoints=[],breakoutTraceConnectionsById=new Map;for(let bp3 of breakoutPoints){let pt4={x:bp3.x,y:bp3.y,layer:"top"};if(bp3.source_trace_id){let conn=directTraceConnectionsById.get(bp3.source_trace_id)??breakoutTraceConnectionsById.get(bp3.source_trace_id);if(conn)conn.pointsToConnect.push(pt4);else{let newConn={name:bp3.source_trace_id,source_trace_id:bp3.source_trace_id,pointsToConnect:[pt4]};connectionsFromBreakoutPoints.push(newConn),breakoutTraceConnectionsById.set(bp3.source_trace_id,newConn)}}else if(bp3.source_net_id){let conn=connectionsFromNets.find(c3=>c3.name===bp3.source_net_id);conn?conn.pointsToConnect.push(pt4):connectionsFromBreakoutPoints.push({name:bp3.source_net_id,pointsToConnect:[pt4]})}else if(bp3.source_port_id){let pcb_port2=db2.pcb_port.getWhere({source_port_id:bp3.source_port_id});pcb_port2&&connectionsFromBreakoutPoints.push({name:bp3.source_port_id,source_trace_id:void 0,pointsToConnect:[{x:pcb_port2.x,y:pcb_port2.y,layer:pcb_port2.layers?.[0]??"top",pointId:pcb_port2.pcb_port_id,pcb_port_id:pcb_port2.pcb_port_id},pt4]})}}let allConns=[...directTraceConnections,...connectionsFromNets,...connectionsFromBreakoutPoints],pointIdToConn=new Map;for(let conn of allConns)for(let pt4 of conn.pointsToConnect)pt4.pointId&&pointIdToConn.set(pt4.pointId,conn);let existingTraces=db2.pcb_trace.list().filter(t35=>!subcircuit_id||relevantSubcircuitIds?.has(t35.subcircuit_id));for(let tr4 of existingTraces){let tracePortIds=new Set;for(let seg of tr4.route)seg.start_pcb_port_id&&tracePortIds.add(seg.start_pcb_port_id),seg.end_pcb_port_id&&tracePortIds.add(seg.end_pcb_port_id);if(tracePortIds.size<2)continue;let firstId=tracePortIds.values().next().value;if(!firstId)continue;let conn=pointIdToConn.get(firstId);conn&&[...tracePortIds].every(pid=>pointIdToConn.get(pid)===conn)&&(conn.externallyConnectedPointIds??(conn.externallyConnectedPointIds=[]),conn.externallyConnectedPointIds.push([...tracePortIds]))}return{simpleRouteJson:{bounds,obstacles,connections:allConns,layerCount:board?.num_layers??2,minTraceWidth,nominalTraceWidth,outline:board?.outline?.map(point6=>({...point6}))},connMap}},getPhaseTimingsFromRenderEvents=renderEvents=>{let phaseTimings={};if(!renderEvents)return phaseTimings;for(let renderPhase of orderedRenderPhases)phaseTimings[renderPhase]=0;let startEvents=new Map;for(let event of renderEvents){let[,,phase,eventType]=event.type.split(":");if(eventType==="start"){startEvents.set(`${phase}:${event.renderId}`,event);continue}if(eventType==="end"){let startEvent=startEvents.get(`${phase}:${event.renderId}`);if(startEvent){let duration=event.createdAt-startEvent.createdAt;phaseTimings[phase]=(phaseTimings[phase]||0)+duration}}}return phaseTimings},normalizePinLabels=inputPinLabels=>{let unqInputPinLabels=inputPinLabels.map(labels=>[...new Set(labels)]),result=unqInputPinLabels.map(()=>[]),desiredNumbers=unqInputPinLabels.map(()=>null);for(let i2=0;i2<unqInputPinLabels.length;i2++)for(let label of unqInputPinLabels[i2])if(/^\d+$/.test(label)){desiredNumbers[i2]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i2=0;i2<desiredNumbers.length;i2++){let desiredNumber=desiredNumbers[i2];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i2].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i2])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i2].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i2=0;i2<result.length;i2++)result[i2][0]?.includes("_alt")&&(highestPinNumber++,result[i2].unshift(`pin${highestPinNumber}`));for(let i2=0;i2<result.length;i2++)result[i2].length===0&&(highestPinNumber++,result[i2].push(`pin${highestPinNumber}`));let totalLabelCounts={};for(let inputLabels of unqInputPinLabels)for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]=(totalLabelCounts[label]??0)+1);let incrementalLabelCounts={};for(let i2=0;i2<unqInputPinLabels.length;i2++){let inputLabels=unqInputPinLabels[i2];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i2].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i2].push(`${label}${incrementalLabelCounts[label]}`)))}return result},TraceHint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"matchedPort",null)}get config(){return{componentName:"TraceHint",zodProps:traceHintProps}}doInitialPortMatching(){let{db:db2}=this.root,{_parsedProps:props,parent}=this;if(!parent)return;if(parent.componentName==="Trace"){this.renderError(`Port inference inside trace is not yet supported (${this})`);return}if(!parent)throw new Error("TraceHint has no parent");if(!props.for){this.renderError(`TraceHint has no for property (${this})`);return}let port=parent.selectOne(props.for,{type:"port"});port||this.renderError(`${this} could not find port for selector "${props.for}"`),this.matchedPort=port,port.registerMatch(this)}getPcbRouteHints(){let{_parsedProps:props}=this,offsets=props.offset?[props.offset]:props.offsets;if(!offsets)return[];let globalTransform=this._computePcbGlobalTransformBeforeLayout();return offsets.map(offset=>({...applyToPoint2(globalTransform,offset),via:offset.via,to_layer:offset.to_layer,trace_width:offset.trace_width}))}doInitialPcbTraceHintRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this;db2.pcb_trace_hint.insert({pcb_component_id:this.matchedPort?.pcb_component_id,pcb_port_id:this.matchedPort?.pcb_port_id,route:this.getPcbRouteHints()})}},SUPPORTED_COMPONENT_FIELDS=new Set(["x","y","minx","maxx","miny","maxy","width","height"]);function Group_doInitialPcbCalcPlacementResolution(group){if(group.root?.pcbDisabled||!group.isSubcircuit)return;let{db:db2}=group.root,normalComponentNameMap=group.getNormalComponentNameMap?.()??new Map,allNormalComponents=collectNormalComponentsInSubcircuit(group),namedComponentVars={};for(let component of allNormalComponents)updateVarsForNamedComponent(component,namedComponentVars);let candidatesByName=new Map,inDegree=new Map,dependents=new Map;for(let component of allNormalComponents){if(!shouldResolvePlacementInCalcPhase(component))continue;let refs=getComponentRefsForCalcPlacement(component);if(!component.name)throw new Error(`Invalid pcb position expression for ${component.getString()}: component-relative calc requires the component to have a name`);candidatesByName.set(component.name,{component,refs}),inDegree.set(component.name,0)}for(let[candidateName,candidate]of candidatesByName.entries()){let referencedCandidateNames=new Set;for(let token of candidate.refs){let{referencePath,field}=parseComponentReferenceToken(token);if(!SUPPORTED_COMPONENT_FIELDS.has(field))throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unsupported component field "${field}" in "${token}"`);let referencedComponentName=resolveReferencedComponentName({token,referencePath,candidate,normalComponentNameMap});candidatesByName.has(referencedComponentName)&&referencedComponentName!==candidateName&&referencedCandidateNames.add(referencedComponentName)}for(let referencedComponentName of referencedCandidateNames)inDegree.set(candidateName,(inDegree.get(candidateName)??0)+1),dependents.has(referencedComponentName)||dependents.set(referencedComponentName,new Set),dependents.get(referencedComponentName).add(candidateName)}let queue=[...inDegree.entries()].filter(([,degree])=>degree===0).map(([name])=>name),resolvedCount=0;for(;queue.length>0;){let name=queue.shift(),candidate=candidatesByName.get(name);if(candidate){resolveCandidatePlacement(candidate.component,namedComponentVars),resolvedCount++;for(let dependentName of dependents.get(name)??[]){let nextDegree=(inDegree.get(dependentName)??0)-1;inDegree.set(dependentName,nextDegree),nextDegree===0&&queue.push(dependentName)}}}if(resolvedCount<candidatesByName.size){let unresolvedNames=[...candidatesByName.keys()].filter(name=>(inDegree.get(name)??0)>0);throw new Error(`Circular pcb position calc references detected among: ${unresolvedNames.join(", ")}`)}function resolveCandidatePlacement(component,componentVars){if(!component.pcb_component_id)return;let pcbComponent=db2.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY;if(rawPcbLeftEdgeX!==void 0&&rawPcbRightEdgeX!==void 0)throw new Error(`${component.componentName} cannot set both pcbLeftEdgeX and pcbRightEdgeX`);if(rawPcbTopEdgeY!==void 0&&rawPcbBottomEdgeY!==void 0)throw new Error(`${component.componentName} cannot set both pcbTopEdgeY and pcbBottomEdgeY`);let componentWidth=pcbComponent.width??0,componentHeight=pcbComponent.height??0,nextCenter={x:pcbComponent.center.x,y:pcbComponent.center.y};if(rawPcbX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbLeftEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbLeftEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbLeftEdgeX"})+componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}else if(rawPcbRightEdgeX!==void 0){let resolvedPcbX=component.resolvePcbCoordinate({rawValue:rawPcbRightEdgeX,axis:"pcbX",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbRightEdgeX"})-componentWidth/2;component._resolvedPcbCalcOffsetX=resolvedPcbX,nextCenter.x=resolvedPcbX}if(rawPcbY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars});component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbTopEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbTopEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbTopEdgeY"})-componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}else if(rawPcbBottomEdgeY!==void 0){let resolvedPcbY=component.resolvePcbCoordinate({rawValue:rawPcbBottomEdgeY,axis:"pcbY",allowComponentVariables:!0,componentVariables:componentVars,propertyName:"pcbBottomEdgeY"})+componentHeight/2;component._resolvedPcbCalcOffsetY=resolvedPcbY,nextCenter.y=resolvedPcbY}component._repositionOnPcb(nextCenter),updateVarsForNamedComponent(component,componentVars)}}function shouldResolvePlacementInCalcPhase(component){let parsedProps=component._parsedProps,rawProps=component.props,pcbX=parsedProps.pcbX,pcbY=parsedProps.pcbY,pcbLeftEdgeX=parsedProps.pcbLeftEdgeX??rawProps.pcbLeftEdgeX,pcbRightEdgeX=parsedProps.pcbRightEdgeX??rawProps.pcbRightEdgeX,pcbTopEdgeY=parsedProps.pcbTopEdgeY??rawProps.pcbTopEdgeY,pcbBottomEdgeY=parsedProps.pcbBottomEdgeY??rawProps.pcbBottomEdgeY;return pcbLeftEdgeX!==void 0||pcbRightEdgeX!==void 0||pcbTopEdgeY!==void 0||pcbBottomEdgeY!==void 0?!0:typeof pcbX=="string"||typeof pcbY=="string"}function collectNormalComponentsInSubcircuit(group){let components=[],walk=node=>{node._isNormalComponent&&components.push(node);for(let child of node.children)child.isSubcircuit||walk(child)};for(let child of group.children)child.isSubcircuit||walk(child);return components}function getComponentRefsForCalcPlacement(component){let refs=new Set,rawPcbX=component._parsedProps.pcbX,rawPcbY=component._parsedProps.pcbY,rawComponentProps=component.props,rawPcbLeftEdgeX=component._parsedProps.pcbLeftEdgeX??rawComponentProps.pcbLeftEdgeX,rawPcbRightEdgeX=component._parsedProps.pcbRightEdgeX??rawComponentProps.pcbRightEdgeX,rawPcbTopEdgeY=component._parsedProps.pcbTopEdgeY??rawComponentProps.pcbTopEdgeY,rawPcbBottomEdgeY=component._parsedProps.pcbBottomEdgeY??rawComponentProps.pcbBottomEdgeY,addRefs=rawValue=>{if(typeof rawValue!="string")return;let identifiers=extractCalcIdentifiers(rawValue);for(let identifier of identifiers)identifier.startsWith("board.")||refs.add(identifier)};return addRefs(rawPcbX),addRefs(rawPcbY),addRefs(rawPcbLeftEdgeX),addRefs(rawPcbRightEdgeX),addRefs(rawPcbTopEdgeY),addRefs(rawPcbBottomEdgeY),refs}function parseComponentReferenceToken(token){let dotIndex=token.lastIndexOf(".");if(dotIndex<=0||dotIndex===token.length-1)throw new Error(`Invalid component reference token: "${token}"`);return{referencePath:token.slice(0,dotIndex),field:token.slice(dotIndex+1).toLowerCase()}}function resolveReferencedComponentName(params){let{token,referencePath,candidate,normalComponentNameMap}=params,directComponents=normalComponentNameMap.get(referencePath);if(directComponents&&directComponents.length>0){if(directComponents.length>1)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: ambiguous component reference "${referencePath}" in "${token}"`);return referencePath}let bestMatch=null;for(let componentName of normalComponentNameMap.keys())referencePath.startsWith(`${componentName}.`)&&(!bestMatch||componentName.length>bestMatch.length)&&(bestMatch=componentName);if(!bestMatch)throw new Error(`Invalid pcb position expression for ${candidate.component.getString()}: unknown component reference "${referencePath}" in "${token}"`);return bestMatch}function updateVarsForNamedComponent(component,vars){if(!component.name||!component.pcb_component_id||!component.root)return;let pcbComponent=component.root.db.pcb_component.get(component.pcb_component_id);if(!pcbComponent)return;let width=pcbComponent.width??0,height=pcbComponent.height??0,x5=pcbComponent.center.x,y5=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x5,y:y5},size:{width,height}});let padElementsByReference=collectPadElementsByReference(component);for(let[referencePath,elements]of padElementsByReference.entries()){let bounds=getBoundsOfPcbElements(elements),minX=bounds.minX,maxX=bounds.maxX,minY=bounds.minY,maxY=bounds.maxY;vars[`${referencePath}.x`]=(minX+maxX)/2,vars[`${referencePath}.y`]=(minY+maxY)/2,vars[`${referencePath}.width`]=maxX-minX,vars[`${referencePath}.height`]=maxY-minY,vars[`${referencePath}.minX`]=minX,vars[`${referencePath}.maxX`]=maxX,vars[`${referencePath}.minY`]=minY,vars[`${referencePath}.maxY`]=maxY}}function collectPadElementsByReference(component){let refsToElements=new Map;if(!component.name||!component.pcb_component_id||!component.root)return refsToElements;let{db:db2}=component.root,padElements=[...db2.pcb_smtpad.list({pcb_component_id:component.pcb_component_id}),...db2.pcb_plated_hole.list({pcb_component_id:component.pcb_component_id})];for(let pad2 of padElements){let aliases2=new Set;for(let hint of pad2.port_hints??[])typeof hint=="string"&&hint.length>0&&aliases2.add(hint);let pcbPortId=pad2.pcb_port_id;if(pcbPortId){let pcbPort=db2.pcb_port.get(pcbPortId),sourcePort=pcbPort?.source_port_id?db2.source_port.get(pcbPort.source_port_id):null;sourcePort?.name&&aliases2.add(sourcePort.name),sourcePort?.pin_number!=null&&aliases2.add(`pin${sourcePort.pin_number}`)}for(let alias of aliases2){let referencePath=`${component.name}.${alias}`;refsToElements.has(referencePath)||refsToElements.set(referencePath,[]),refsToElements.get(referencePath).push(pad2)}}return refsToElements}function Group_doInitialPcbComponentAnchorAlignment(group){if(group.root?.pcbDisabled||!group.pcb_group_id)return;let pcbPositionAnchor=group._parsedProps?.pcbPositionAnchor;if(!pcbPositionAnchor)return;let targetPosition=group._getGlobalPcbPositionBeforeLayout(),{pcbX,pcbY}=group._parsedProps;if(pcbX===void 0&&pcbY===void 0)return;let{db:db2}=group.root,pcbGroup=db2.pcb_group.get(group.pcb_group_id);if(!pcbGroup)return;let width=pcbGroup.width,height=pcbGroup.height,{center:center2}=pcbGroup;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds2=getBoundsFromPoints(pcbGroup.outline);bounds2&&(width=bounds2.maxX-bounds2.minX,height=bounds2.maxY-bounds2.minY)}if(!width||!height)return;let bounds={left:center2.x-width/2,right:center2.x+width/2,top:center2.y+height/2,bottom:center2.y-height/2},currentCenter={...center2},anchorPos=null;if(new Set(["center","top_left","top_center","top_right","center_left","center_right","bottom_left","bottom_center","bottom_right"]).has(pcbPositionAnchor))switch(pcbPositionAnchor){case"center":anchorPos=currentCenter;break;case"top_left":anchorPos={x:bounds.left,y:bounds.top};break;case"top_center":anchorPos={x:currentCenter.x,y:bounds.top};break;case"top_right":anchorPos={x:bounds.right,y:bounds.top};break;case"center_left":anchorPos={x:bounds.left,y:currentCenter.y};break;case"center_right":anchorPos={x:bounds.right,y:currentCenter.y};break;case"bottom_left":anchorPos={x:bounds.left,y:bounds.bottom};break;case"bottom_center":anchorPos={x:currentCenter.x,y:bounds.bottom};break;case"bottom_right":anchorPos={x:bounds.right,y:bounds.bottom};break}if(!anchorPos)return;let newCenter={...currentCenter};targetPosition.x!==void 0&&(newCenter.x+=targetPosition.x-anchorPos.x),targetPosition.y!==void 0&&(newCenter.y+=targetPosition.y-anchorPos.y),(Math.abs(newCenter.x-currentCenter.x)>1e-6||Math.abs(newCenter.y-currentCenter.y)>1e-6)&&(group._repositionOnPcb(newCenter),db2.pcb_group.update(group.pcb_group_id,{center:newCenter})),db2.pcb_group.update(group.pcb_group_id,{anchor_position:targetPosition,anchor_alignment:pcbPositionAnchor,display_offset_x:pcbX,display_offset_y:pcbY})}var Group_doInitialPcbLayoutFlex=group=>{let{db:db2}=group.root,{_parsedProps:props}=group,pcbChildren=group.children.filter(c3=>c3.pcb_component_id||c3.pcb_group_id);if(pcbChildren.some(child=>{let childProps=child._parsedProps;return childProps?.pcbX!==void 0||childProps?.pcbY!==void 0}))return;let rawJustify=props.pcbJustifyContent??props.justifyContent,rawAlign=props.pcbAlignItems??props.alignItems,rawGap=props.pcbFlexGap??props.pcbGap??props.gap,direction2=props.pcbFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.pcbWidth??void 0,height=props.height??props.pcbHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(pcbChildren.map(child=>child._getMinimumFlexContainerSize()).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of pcbChildren){let size2=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let groupCenter=group._getGlobalPcbPositionBeforeLayout(),offset={x:groupCenter.x-(bounds.maxX+bounds.minX)/2,y:groupCenter.y-(bounds.maxY+bounds.minY)/2};for(let child of flexBox.children)child.metadata._repositionOnPcb({x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y});db2.pcb_group.update(group.pcb_group_id,{width:bounds.width,height:bounds.height,center:groupCenter})},MIN_GAP=1;function Group_doInitialPcbLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,pcbChildren=getPcbChildren(group);if(pcbChildren.length===0)return;let childDimensions=calculateChildDimensions({db:db2,pcbChildren}),gridConfig=parseGridConfiguration(props),gridLayout=createGridLayout({props,pcbChildren,childDimensions,gridConfig}),cssGrid=createCssGrid({pcbChildren,childDimensions,gridLayout,gridConfig}),{itemCoordinates}=cssGrid.layout();positionChildren({db:db2,group,pcbChildren,itemCoordinates,gridLayout}),updateGroupDimensions({db:db2,group,props,gridLayout})}function getPcbChildren(group){return group.children.filter(child=>child.pcb_component_id||child.pcb_group_id)}function calculateChildDimensions(params){let{db:db2,pcbChildren}=params,maxWidth=0,maxHeight=0;for(let child of pcbChildren){let width=0,height=0;if(child.pcb_group_id){let pcbGroup=db2.pcb_group.get(child.pcb_group_id);width=pcbGroup?.width??0,height=pcbGroup?.height??0}else if(child.pcb_component_id){let pcbComp=db2.pcb_component.get(child.pcb_component_id);width=pcbComp?.width??0,height=pcbComp?.height??0}maxWidth=Math.max(maxWidth,width),maxHeight=Math.max(maxHeight,height)}return{width:maxWidth,height:maxHeight}}function parseGridConfiguration(props){let cols=props.pcbGridCols??props.gridCols??props.pcbLayout?.grid?.cols,rows=props.pcbGridRows??props.pcbLayout?.grid?.rows,templateColumns=props.pcbGridTemplateColumns,templateRows=props.pcbGridTemplateRows,parseGap=gapValue=>gapValue===void 0?MIN_GAP:typeof gapValue=="number"?gapValue:length.parse(gapValue),gridGapOption=props.pcbGridGap??props.gridGap??props.pcbLayout?.gridGap,rowGapOption=props.pcbGridRowGap??props.gridRowGap??props.pcbLayout?.gridRowGap,colGapOption=props.pcbGridColumnGap??props.gridColumnGap??props.pcbLayout?.gridColumnGap,gapX=MIN_GAP,gapY=MIN_GAP;if(rowGapOption!==void 0||colGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"?gridGapOption?.x:gridGapOption,fallbackY=typeof gridGapOption=="object"?gridGapOption?.y:gridGapOption;gapX=parseGap(colGapOption??fallbackX),gapY=parseGap(rowGapOption??fallbackY)}else if(typeof gridGapOption=="object"&&gridGapOption!==null)gapX=parseGap(gridGapOption.x),gapY=parseGap(gridGapOption.y);else{let gap=parseGap(gridGapOption);gapX=gap,gapY=gap}return{cols,rows,gapX,gapY,templateColumns,templateRows}}function createGridLayout(params){let{props,pcbChildren,childDimensions,gridConfig}=params;return props.pcbGridTemplateColumns||props.pcbGridTemplateRows?createTemplateBasedLayout({props,gridConfig,pcbChildren,childDimensions}):createDefaultLayout({gridConfig,pcbChildren,childDimensions})}function createTemplateBasedLayout(params){let{props,gridConfig,pcbChildren,childDimensions}=params,gridTemplateColumns=props.pcbGridTemplateColumns??"",gridTemplateRows=props.pcbGridTemplateRows??"",extractRepeatCount=template=>{let match2=template.match(/repeat\((\d+),/);return match2?parseInt(match2[1]):Math.ceil(Math.sqrt(pcbChildren.length))},numCols=props.pcbGridTemplateColumns?extractRepeatCount(gridTemplateColumns):Math.ceil(Math.sqrt(pcbChildren.length)),numRows=props.pcbGridTemplateRows?extractRepeatCount(gridTemplateRows):Math.ceil(pcbChildren.length/numCols),containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createDefaultLayout(params){let{gridConfig,pcbChildren,childDimensions}=params,numCols,numRows;gridConfig.cols!==void 0&&gridConfig.rows!==void 0?(numCols=gridConfig.cols,numRows=gridConfig.rows):gridConfig.cols!==void 0?(numCols=gridConfig.cols,numRows=Math.ceil(pcbChildren.length/numCols)):gridConfig.rows!==void 0?(numRows=gridConfig.rows,numCols=Math.ceil(pcbChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(pcbChildren.length)),numRows=Math.ceil(pcbChildren.length/numCols)),numCols=Math.max(1,numCols),numRows=Math.max(1,numRows);let containerWidth=numCols*childDimensions.width+Math.max(0,numCols-1)*gridConfig.gapX,containerHeight=numRows*childDimensions.height+Math.max(0,numRows-1)*gridConfig.gapY,gridTemplateColumns=`repeat(${numCols}, ${childDimensions.width}px)`,gridTemplateRows=`repeat(${numRows}, ${childDimensions.height}px)`;return{gridTemplateColumns,gridTemplateRows,containerWidth,containerHeight}}function createCssGrid(params){let{pcbChildren,childDimensions,gridLayout,gridConfig}=params,gridChildren=pcbChildren.map((child,index)=>({key:child.getString()||`child-${index}`,contentWidth:childDimensions.width,contentHeight:childDimensions.height}));return new CssGrid({containerWidth:gridLayout.containerWidth,containerHeight:gridLayout.containerHeight,gridTemplateColumns:gridLayout.gridTemplateColumns,gridTemplateRows:gridLayout.gridTemplateRows,gap:[gridConfig.gapY,gridConfig.gapX],children:gridChildren})}function positionChildren(params){let{db:db2,group,pcbChildren,itemCoordinates,gridLayout}=params,groupCenter=group._getGlobalPcbPositionBeforeLayout(),allCircuitJson=db2.toArray();for(let i2=0;i2<pcbChildren.length;i2++){let child=pcbChildren[i2],childKey=child.getString()||`child-${i2}`,coordinates=itemCoordinates[childKey];if(!coordinates){console.warn(`PCB grid layout: No coordinates found for child ${childKey}`);continue}let targetX=groupCenter.x-gridLayout.containerWidth/2+coordinates.x+coordinates.width/2,targetY=groupCenter.y+gridLayout.containerHeight/2-coordinates.y-coordinates.height/2;if(child.pcb_component_id)repositionPcbComponentTo(allCircuitJson,child.pcb_component_id,{x:targetX,y:targetY});else{let groupChild=child;groupChild.pcb_group_id&&groupChild.source_group_id&&repositionPcbGroupTo(allCircuitJson,groupChild.source_group_id,{x:targetX,y:targetY})}}}function updateGroupDimensions(params){let{db:db2,group,props,gridLayout}=params;if(group.pcb_group_id){let groupCenter=group._getGlobalPcbPositionBeforeLayout();db2.pcb_group.update(group.pcb_group_id,{width:props.width??gridLayout.containerWidth,height:props.height??gridLayout.containerHeight,center:groupCenter})}}var applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c3=>c3.componentName==="Constraint"&&c3._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x5=>(parent[x5]!==x5&&(parent[x5]=find2(parent[x5])),parent[x5]),union2=(a2,b3)=>{let ra3=find2(a2),rb2=find2(b3);ra3!==rb2&&(parent[rb2]=ra3)},makeSet=x5=>{x5 in parent||(parent[x5]=x5)},getIdFromSelector=sel2=>{let name=sel2.startsWith(".")?sel2.slice(1):sel2;return group.children.find(c3=>c3.name===name)?.pcb_component_id??void 0};for(let constraint of constraints){let props=constraint._parsedProps;if("left"in props&&"right"in props){let a2=getIdFromSelector(props.left),b3=getIdFromSelector(props.right);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("top"in props&&"bottom"in props){let a2=getIdFromSelector(props.top),b3=getIdFromSelector(props.bottom);a2&&b3&&(makeSet(a2),makeSet(b3),union2(a2,b3))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);for(let id2 of ids)makeSet(id2);for(let i2=1;i2<ids.length;i2++)union2(ids[0],ids[i2])}}for(let id2 of Object.keys(parent)){let rootId=find2(id2);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id2)}for(let constraint of constraints){let props=constraint._parsedProps,compId;if("left"in props?compId=getIdFromSelector(props.left):"top"in props?compId=getIdFromSelector(props.top):"for"in props&&(compId=getIdFromSelector(props.for[0])),!compId)continue;let root=find2(compId);clusterByRoot.get(root)?.constraints.push(constraint)}let clusterMap={},packCompById=Object.fromEntries(packInput.components.map(c3=>[c3.componentId,c3]));for(let[rootId,info]of clusterByRoot.entries()){if(info.componentIds.length<=1)continue;let solver=new Solver,kVars={},getVar=(id2,axis)=>{let key=`${id2}_${axis}`;return kVars[key]||(kVars[key]=new Variable(key)),kVars[key]},anchor=info.componentIds[0];solver.addConstraint(new Constraint(getVar(anchor,"x"),Operator.Eq,0,Strength.required)),solver.addConstraint(new Constraint(getVar(anchor,"y"),Operator.Eq,0,Strength.required));for(let constraint of info.constraints){let props=constraint._parsedProps;if("xDist"in props){let left=getIdFromSelector(props.left),right=getIdFromSelector(props.right);left&&right&&solver.addConstraint(new Constraint(new Expression(getVar(right,"x"),[-1,getVar(left,"x")]),Operator.Eq,props.xDist,Strength.required))}else if("yDist"in props){let top=getIdFromSelector(props.top),bottom=getIdFromSelector(props.bottom);top&&bottom&&solver.addConstraint(new Constraint(new Expression(getVar(top,"y"),[-1,getVar(bottom,"y")]),Operator.Eq,props.yDist,Strength.required))}else if("sameX"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"x");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s2=>getIdFromSelector(s2)).filter(s2=>!!s2);if(ids.length>1){let base=getVar(ids[0],"y");for(let i2=1;i2<ids.length;i2++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i2],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id2 of info.componentIds)positions[id2]={x:getVar(id2,"x").value(),y:getVar(id2,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp)for(let pad2 of comp.pads){let ax3=pos.x+pad2.offset.x,ay3=pos.y+pad2.offset.y;minX=Math.min(minX,ax3-pad2.size.x/2),maxX=Math.max(maxX,ax3+pad2.size.x/2),minY=Math.min(minY,ay3-pad2.size.y/2),maxY=Math.max(maxY,ay3+pad2.size.y/2)}}let clusterCenter={x:(minX+maxX)/2,y:(minY+maxY)/2},mergedPads=[],relCenters={};for(let id2 of info.componentIds){let comp=packCompById[id2],pos=positions[id2];if(comp){relCenters[id2]={x:pos.x-clusterCenter.x,y:pos.y-clusterCenter.y};for(let pad2 of comp.pads)mergedPads.push({padId:pad2.padId,networkId:pad2.networkId,type:pad2.type,size:pad2.size,offset:{x:pos.x+pad2.offset.x-clusterCenter.x,y:pos.y+pad2.offset.y-clusterCenter.y}})}}packInput.components=packInput.components.filter(c3=>!info.componentIds.includes(c3.componentId)),packInput.components.push({componentId:info.componentIds[0],pads:mergedPads,availableRotationDegrees:[0]}),info.relativeCenters=relCenters,clusterMap[info.componentIds[0]]=info}return clusterMap},updateCadRotation=({db:db2,pcbComponentId,rotationDegrees,layer})=>{if(rotationDegrees==null||!db2?.cad_component?.list)return;let cadComponent=db2.cad_component.getWhere({pcb_component_id:pcbComponentId});if(!cadComponent)return;let delta=layer?.toLowerCase?.()==="bottom"?-rotationDegrees:rotationDegrees,currentRotationZ=cadComponent.rotation?.z??0,nextRotation={...cadComponent.rotation??{x:0,y:0,z:0},z:normalizeDegrees(currentRotationZ+delta)};db2.cad_component.update(cadComponent.cad_component_id,{rotation:nextRotation}),cadComponent.rotation=nextRotation},isDescendantGroup=(db2,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group=db2.source_group.get(groupId);return!group||!group.parent_source_group_id?!1:isDescendantGroup(db2,group.parent_source_group_id,ancestorId)},applyPackOutput=(group,packOutput,clusterMap)=>{let{db:db2}=group.root;for(let packedComponent of packOutput.components){let{center:center2,componentId,ccwRotationOffset,ccwRotationDegrees}=packedComponent,cluster=clusterMap[componentId];if(cluster){let rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,angleRad=rotationDegrees2*Math.PI/180;for(let memberId of cluster.componentIds){let rel=cluster.relativeCenters[memberId];if(!rel)continue;db2.pcb_component.update(memberId,{position_mode:"packed"});let rotatedRel={x:rel.x*Math.cos(angleRad)-rel.y*Math.sin(angleRad),y:rel.x*Math.sin(angleRad)+rel.y*Math.cos(angleRad)},member=db2.pcb_component.get(memberId);if(!member)continue;let originalCenter2=member.center,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x+rotatedRel.x,center2.y+rotatedRel.y),rotate2(angleRad),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===memberId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:memberId,rotationDegrees:rotationDegrees2,layer:member.layer})}continue}let pcbComponent=db2.pcb_component.get(componentId);if(pcbComponent){db2.pcb_component.update(componentId,{position_mode:"packed"});let currentGroupId=group.source_group_id,componentGroupId=db2.source_component.get(pcbComponent.source_component_id)?.source_group_id;if(componentGroupId!==void 0&&!isDescendantGroup(db2,componentGroupId,currentGroupId))continue;let originalCenter2=pcbComponent.center,rotationDegrees2=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix2=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees2*Math.PI/180),translate2(-originalCenter2.x,-originalCenter2.y)),related=db2.toArray().filter(elm=>"pcb_component_id"in elm&&elm.pcb_component_id===componentId);transformPCBElements(related,transformMatrix2),updateCadRotation({db:db2,pcbComponentId:componentId,rotationDegrees:rotationDegrees2,layer:pcbComponent.layer});continue}let pcbGroup=db2.pcb_group.list().find(g7=>g7.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=pcbGroup.center,rotationDegrees=ccwRotationDegrees??ccwRotationOffset??0,transformMatrix=compose2(group._computePcbGlobalTransformBeforeLayout(),translate2(center2.x,center2.y),rotate2(rotationDegrees*Math.PI/180),translate2(-originalCenter.x,-originalCenter.y)),relatedElements=db2.toArray().filter(elm=>{if("source_group_id"in elm&&elm.source_group_id&&(elm.source_group_id===componentId||isDescendantGroup(db2,elm.source_group_id,componentId)))return!0;if("source_component_id"in elm&&elm.source_component_id){let sourceComponent=db2.source_component.get(elm.source_component_id);if(sourceComponent?.source_group_id&&(sourceComponent.source_group_id===componentId||isDescendantGroup(db2,sourceComponent.source_group_id,componentId)))return!0}if("pcb_component_id"in elm&&elm.pcb_component_id){let pcbComp=db2.pcb_component.get(elm.pcb_component_id);if(pcbComp?.source_component_id){let sourceComp=db2.source_component.get(pcbComp.source_component_id);if(sourceComp?.source_group_id&&(sourceComp.source_group_id===componentId||isDescendantGroup(db2,sourceComp.source_group_id,componentId)))return!0}}return!1});for(let elm of relatedElements)elm.type==="pcb_component"&&db2.pcb_component.update(elm.pcb_component_id,{position_mode:"packed"});transformPCBElements(relatedElements,transformMatrix),db2.pcb_group.update(pcbGroup.pcb_group_id,{center:center2})}},DEFAULT_MIN_GAP="1mm",debug42=(0,import_debug12.default)("Group_doInitialPcbLayoutPack"),Group_doInitialPcbLayoutPack=group=>{let{db:db2}=group.root,{_parsedProps:props}=group;group.root?.emit("packing:start",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()});let{packOrderStrategy,packPlacementStrategy,gap:gapProp,pcbGap,pcbPackGap}=props,gap=pcbPackGap??pcbGap??gapProp,gapMm=length.parse(gap??DEFAULT_MIN_GAP),chipMarginsMap={},staticPcbComponentIds=new Set,collectMargins=comp=>{if(comp?.pcb_component_id&&comp?._parsedProps){let props2=comp._parsedProps,left=length.parse(props2.pcbMarginLeft??props2.pcbMarginX??0),right=length.parse(props2.pcbMarginRight??props2.pcbMarginX??0),top=length.parse(props2.pcbMarginTop??props2.pcbMarginY??0),bottom=length.parse(props2.pcbMarginBottom??props2.pcbMarginY??0);(left||right||top||bottom)&&(chipMarginsMap[comp.pcb_component_id]={left,right,top,bottom})}comp?.children&&comp.children.forEach(collectMargins)};collectMargins(group);let excludedPcbGroupIds=new Set;for(let child of group.children){let childIsGroupOrNormalComponent=child;childIsGroupOrNormalComponent._isNormalComponent&&childIsGroupOrNormalComponent.isRelativelyPositioned?.()&&(childIsGroupOrNormalComponent.pcb_component_id&&staticPcbComponentIds.add(childIsGroupOrNormalComponent.pcb_component_id),childIsGroupOrNormalComponent.pcb_group_id&&excludedPcbGroupIds.add(childIsGroupOrNormalComponent.pcb_group_id))}let isDescendantGroup2=(db22,groupId,ancestorId)=>{if(groupId===ancestorId)return!0;let group2=db22.source_group.get(groupId);return!group2||!group2.parent_source_group_id?!1:isDescendantGroup2(db22,group2.parent_source_group_id,ancestorId)};if(excludedPcbGroupIds.size>0)for(let element of db2.toArray()){if(element.type!=="pcb_component")continue;let sourceComponent=db2.source_component.get(element.source_component_id);if(sourceComponent?.source_group_id)for(let groupId of excludedPcbGroupIds)isDescendantGroup2(db2,sourceComponent.source_group_id,groupId)&&staticPcbComponentIds.add(element.pcb_component_id)}let filteredCircuitJson=db2.toArray(),bounds;if(props.width!==void 0&&props.height!==void 0){let widthMm=length.parse(props.width),heightMm=length.parse(props.height);bounds={minX:-widthMm/2,maxX:widthMm/2,minY:-heightMm/2,maxY:heightMm/2}}let packInput={...convertPackOutputToPackInput(convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)})),orderStrategy:packOrderStrategy??"largest_to_smallest",placementStrategy:packPlacementStrategy??"minimum_sum_squared_distance_to_network",minGap:gapMm,bounds},clusterMap=applyComponentConstraintClusters(group,packInput);debug42.enabled&&(group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-circuitjson-${group.name}`,content:JSON.stringify(db2.toArray())}),group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`packInput-${group.name}`,content:packInput}));let packOutput;try{let solver=new PackSolver2(packInput);group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams:solver.getConstructorParams(),componentName:group.getString()}),solver.solve(),packOutput={...packInput,components:solver.packedComponents}}catch(error){throw group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message:error instanceof Error?error.message:String(error)}}),error}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap),group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},getSizeOfTreeNodeChild=(db2,child)=>{let{sourceComponent,sourceGroup}=child;if(child.nodeType==="component"){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent?.source_component_id});return schComponent?.size?{width:schComponent.size.width,height:schComponent.size.height}:null}if(child.nodeType==="group"){let schGroup=db2.schematic_group.getWhere({source_group_id:sourceGroup?.source_group_id});if(schGroup?.width&&schGroup?.height)return{width:schGroup.width,height:schGroup.height};let groupComponents=db2.schematic_component.list({schematic_group_id:schGroup?.schematic_group_id}),minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let comp of groupComponents)if(comp.center&&comp.size){let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let groupWidth=maxX-minX,groupHeight=maxY-minY;return{width:groupWidth,height:groupHeight}}return null},Group_doInitialSchematicLayoutFlex=group=>{let{db:db2}=group.root,props=group._parsedProps,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id}),rawJustify=props.schJustifyContent??props.justifyContent,rawAlign=props.schAlignItems??props.alignItems,rawGap=props.schFlexGap??props.schGap??props.gap,direction2=props.schFlexDirection??"row",justifyContent={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"space-between","space-between":"space-between","space-around":"space-around","space-evenly":"space-evenly",center:"center"}[rawJustify??"space-between"],alignItems={start:"flex-start",end:"flex-end","flex-start":"flex-start","flex-end":"flex-end",stretch:"stretch",center:"center"}[rawAlign??"center"];if(!justifyContent)throw new Error(`Invalid justifyContent value: "${rawJustify}"`);if(!alignItems)throw new Error(`Invalid alignItems value: "${rawAlign}"`);let rowGap=0,columnGap=0;typeof rawGap=="object"?(rowGap=rawGap.y??0,columnGap=rawGap.x??0):typeof rawGap=="number"?(rowGap=rawGap,columnGap=rawGap):typeof rawGap=="string"&&(rowGap=length.parse(rawGap),columnGap=length.parse(rawGap));let minFlexContainer,width=props.width??props.schWidth??void 0,height=props.height??props.schHeight??void 0;(width===void 0||height===void 0)&&(minFlexContainer=getMinimumFlexContainer(tree.childNodes.map(child=>getSizeOfTreeNodeChild(db2,child)).filter(size2=>size2!==null),{alignItems,justifyContent,direction:direction2,rowGap,columnGap}),width=minFlexContainer.width,height=minFlexContainer.height);let flexBox=new RootFlexBox(width,height,{alignItems,justifyContent,direction:direction2,rowGap,columnGap});for(let child of tree.childNodes){let size2=getSizeOfTreeNodeChild(db2,child);flexBox.addChild({metadata:child,width:size2?.width??0,height:size2?.height??0,flexBasis:size2?direction2==="row"?size2.width:size2.height:void 0})}flexBox.build();let bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0,width:0,height:0};for(let child of flexBox.children)bounds.minX=Math.min(bounds.minX,child.position.x),bounds.minY=Math.min(bounds.minY,child.position.y),bounds.maxX=Math.max(bounds.maxX,child.position.x+child.size.width),bounds.maxY=Math.max(bounds.maxY,child.position.y+child.size.height);bounds.width=bounds.maxX-bounds.minX,bounds.height=bounds.maxY-bounds.minY;let offset={x:-(bounds.maxX+bounds.minX)/2,y:-(bounds.maxY+bounds.minY)/2},allCircuitJson=db2.toArray();for(let child of flexBox.children){let{sourceComponent,sourceGroup}=child.metadata;if(sourceComponent){let schComponent=db2.schematic_component.getWhere({source_component_id:sourceComponent.source_component_id});if(!schComponent)continue;repositionSchematicComponentTo(allCircuitJson,schComponent.schematic_component_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}if(sourceGroup){if(!db2.schematic_group.getWhere({source_group_id:sourceGroup.source_group_id}))continue;repositionSchematicGroupTo(allCircuitJson,sourceGroup.source_group_id,{x:child.position.x+child.size.width/2+offset.x,y:child.position.y+child.size.height/2+offset.y})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:bounds.width,height:bounds.height})};function updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId,deltaX,deltaY}){let rects=db2.schematic_rect.list({schematic_component_id:schematicComponentId});for(let rect of rects)rect.center.x+=deltaX,rect.center.y+=deltaY;let lines=db2.schematic_line.list({schematic_component_id:schematicComponentId});for(let line2 of lines)line2.x1+=deltaX,line2.y1+=deltaY,line2.x2+=deltaX,line2.y2+=deltaY;let circles=db2.schematic_circle.list({schematic_component_id:schematicComponentId});for(let circle2 of circles)circle2.center.x+=deltaX,circle2.center.y+=deltaY;let arcs=db2.schematic_arc.list({schematic_component_id:schematicComponentId});for(let arc2 of arcs)arc2.center.x+=deltaX,arc2.center.y+=deltaY;let paths=db2.schematic_path.list({schematic_component_id:schematicComponentId});for(let path of paths)for(let point6 of path.points)point6.x+=deltaX,point6.y+=deltaY}function Group_doInitialSchematicLayoutGrid(group){let{db:db2}=group.root,props=group._parsedProps,schematicChildren=group.children.filter(child=>{let isExplicitlyPositioned=child._parsedProps?.schX!==void 0||child._parsedProps?.schY!==void 0;return child.schematic_component_id&&!isExplicitlyPositioned});if(schematicChildren.length===0)return;let maxCellWidth=0,maxCellHeight=0;for(let child of schematicChildren){let schComp=db2.schematic_component.get(child.schematic_component_id);schComp?.size&&(maxCellWidth=Math.max(maxCellWidth,schComp.size.width),maxCellHeight=Math.max(maxCellHeight,schComp.size.height))}maxCellWidth===0&&schematicChildren.length>0&&(maxCellWidth=1),maxCellHeight===0&&schematicChildren.length>0&&(maxCellHeight=1);let gridColsOption=props.gridCols,gridRowsOption,gridGapOption=props.gridGap,gridRowGapOption=props.gridRowGap,gridColumnGapOption=props.gridColumnGap;props.schLayout?.grid&&(gridColsOption=props.schLayout.grid.cols??gridColsOption,gridRowsOption=props.schLayout.grid.rows,gridGapOption=props.schLayout.gridGap??gridGapOption,gridRowGapOption=props.schLayout.gridRowGap??gridRowGapOption,gridColumnGapOption=props.schLayout.gridColumnGap??gridColumnGapOption);let numCols,numRows;gridColsOption!==void 0&&gridRowsOption!==void 0?(numCols=gridColsOption,numRows=gridRowsOption):gridColsOption!==void 0?(numCols=gridColsOption,numRows=Math.ceil(schematicChildren.length/numCols)):gridRowsOption!==void 0?(numRows=gridRowsOption,numCols=Math.ceil(schematicChildren.length/numRows)):(numCols=Math.ceil(Math.sqrt(schematicChildren.length)),numRows=Math.ceil(schematicChildren.length/numCols)),numCols===0&&schematicChildren.length>0&&(numCols=1),numRows===0&&schematicChildren.length>0&&(numRows=schematicChildren.length);let gridGapX,gridGapY,parseGap=val=>{if(val!==void 0)return typeof val=="number"?val:length.parse(val)};if(gridRowGapOption!==void 0||gridColumnGapOption!==void 0){let fallbackX=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.x:gridGapOption,fallbackY=typeof gridGapOption=="object"&&gridGapOption!==null?gridGapOption.y:gridGapOption;gridGapX=parseGap(gridColumnGapOption??fallbackX)??1,gridGapY=parseGap(gridRowGapOption??fallbackY)??1}else if(typeof gridGapOption=="number")gridGapX=gridGapOption,gridGapY=gridGapOption;else if(typeof gridGapOption=="string"){let parsed=length.parse(gridGapOption);gridGapX=parsed,gridGapY=parsed}else if(typeof gridGapOption=="object"&&gridGapOption!==null){let xRaw=gridGapOption.x,yRaw=gridGapOption.y;gridGapX=typeof xRaw=="number"?xRaw:length.parse(xRaw??"0mm"),gridGapY=typeof yRaw=="number"?yRaw:length.parse(yRaw??"0mm")}else gridGapX=1,gridGapY=1;let totalGridWidth=numCols*maxCellWidth+Math.max(0,numCols-1)*gridGapX,totalGridHeight=numRows*maxCellHeight+Math.max(0,numRows-1)*gridGapY,groupCenter=group._getGlobalSchematicPositionBeforeLayout(),firstCellCenterX=groupCenter.x-totalGridWidth/2+maxCellWidth/2,firstCellCenterY=groupCenter.y+totalGridHeight/2-maxCellHeight/2;for(let i2=0;i2<schematicChildren.length;i2++){let child=schematicChildren[i2];if(!child.schematic_component_id)continue;let row=Math.floor(i2/numCols),col=i2%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i2} (row ${row}, col ${col}) exceeds specified grid dimensions (${numRows}x${numCols}). Skipping placement.`);continue}let targetCellCenterX=firstCellCenterX+col*(maxCellWidth+gridGapX),targetCellCenterY=firstCellCenterY-row*(maxCellHeight+gridGapY),schComp=db2.schematic_component.get(child.schematic_component_id);if(schComp){let oldChildCenter=schComp.center,newChildCenter={x:targetCellCenterX,y:targetCellCenterY};db2.schematic_component.update(child.schematic_component_id,{center:newChildCenter});let deltaX=newChildCenter.x-oldChildCenter.x,deltaY=newChildCenter.y-oldChildCenter.y,schPorts=db2.schematic_port.list({schematic_component_id:child.schematic_component_id});for(let port of schPorts)db2.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});let schTexts=db2.schematic_text.list({schematic_component_id:child.schematic_component_id});for(let text of schTexts)db2.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:child.schematic_component_id,deltaX,deltaY})}}group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{width:totalGridWidth,height:totalGridHeight,center:groupCenter})}var debug52=(0,import_debug13.default)("Group_doInitialSchematicLayoutMatchAdapt");function Group_doInitialSchematicLayoutMatchAdapt(group){let{db:db2}=group.root,subtreeCircuitJson=buildSubtree(db2.toArray(),{source_group_id:group.source_group_id}),bpcGraphBeforeGeneratedNetLabels=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(bpcGraphBeforeGeneratedNetLabels,{title:`floatingBpcGraph-${group.name}`}));let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson),floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p4=>({...p4,color:p4.color.replace("not_connected","normal")}))},{result:laidOutBpcGraph}=layoutSchematicGraphVariants([{variantName:"default",floatingGraph},{variantName:"noNotConnected",floatingGraph:floatingGraphNoNotConnected}],{singletonKeys:["vcc/2","gnd/2"],centerPinColors:["netlabel_center","component_center"],floatingBoxIdsWithMutablePinOffsets:new Set(floatingGraph.boxes.filter(box2=>floatingGraph.pins.filter(p4=>p4.boxId===box2.boxId).filter(bp3=>!bp3.color.includes("center")).length<=2).map(b3=>b3.boxId)),corpus:{}});debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(laidOutBpcGraph,{title:`laidOutBpcGraph-${group.name}`}));let groupOffset=group._getGlobalSchematicPositionBeforeLayout();for(let box2 of laidOutBpcGraph.boxes){if(!box2.center)continue;let schematic_component2=db2.schematic_component.get(box2.boxId);if(schematic_component2){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db2.schematic_port.list({schematic_component_id:schematic_component2.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematic_component2.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component2.center.x,y:newCenter.y-schematic_component2.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematic_component2.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component2.center=newCenter;continue}let schematic_net_label2=db2.schematic_net_label.get(box2.boxId);if(schematic_net_label2){let pin=laidOutBpcGraph.pins.find(p4=>p4.boxId===box2.boxId&&p4.color==="netlabel_center");if(!pin)throw new Error(`No pin found for net label: ${box2.boxId}`);let finalCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y};schematic_net_label2.center=finalCenter,schematic_net_label2.anchor_position={x:finalCenter.x+pin.offset.x,y:finalCenter.y+pin.offset.y};continue}console.error(`No schematic element found for box: ${box2.boxId}. This is a bug in the matchAdapt binding with @tscircuit/core`)}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack");function facingDirectionToSide(facingDirection){switch(facingDirection){case"up":return"y+";case"down":return"y-";case"left":return"x-";case"right":return"x+";default:return"y+"}}function rotateDirection2(direction2,degrees){let directions=["right","up","left","down"],currentIndex=directions.indexOf(direction2);if(currentIndex===-1)return direction2;let steps=Math.round(degrees/90),newIndex=(currentIndex+steps)%4;return directions[newIndex<0?newIndex+4:newIndex]}function isTreeChildExplicitlyPositioned(treeChild,group){if(treeChild.nodeType==="component"&&treeChild.sourceComponent){let component=group.children.find(groupChild=>groupChild.source_component_id===treeChild.sourceComponent?.source_component_id);return component?._parsedProps?.schX!==void 0||component?._parsedProps?.schY!==void 0}if(treeChild.nodeType==="group"&&treeChild.sourceGroup){let nestedGroup=group.children.find(groupChild=>groupChild.source_group_id===treeChild.sourceGroup?.source_group_id);return nestedGroup?._parsedProps?.schX!==void 0||nestedGroup?._parsedProps?.schY!==void 0}return!1}function convertTreeToInputProblem(tree,db2,group){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2};debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{if(isTreeChildExplicitlyPositioned(child,group)){debug62(`[${group.name}] Skipping explicitly positioned child ${index} from matchpack`);return}if(debug62(`[${group.name}] Processing child ${index}: nodeType=${child.nodeType}`),child.nodeType==="component"?debug62(`[${group.name}] - Component: ${child.sourceComponent?.name}`):child.nodeType==="group"&&debug62(`[${group.name}] - Group: ${child.sourceGroup?.name}`),child.nodeType==="component"&&child.sourceComponent){let chipId=child.sourceComponent.name||`chip_${index}`,schematicComponent=db2.schematic_component.getWhere({source_component_id:child.sourceComponent.source_component_id});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),availableRotations=[0,90,180,270];component?._parsedProps?.schOrientation&&(availableRotations=[0]),component?._parsedProps?.schRotation!==void 0&&(availableRotations=[0]),component?._parsedProps?.facingDirection&&(availableRotations=[0]),component?._parsedProps?.schFacingDirection&&(availableRotations=[0]),component?.componentName==="Chip"&&(availableRotations=[0]);let marginLeft=component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0,marginRight=component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0,marginTop=component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0,marginBottom=component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2;problem.chipMap[chipId]={chipId,pins:[],size:{x:(schematicComponent.size?.width||1)+marginLeft+marginRight,y:(schematicComponent.size?.height||1)+marginTop+marginBottom},availableRotations};let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${chipId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;problem.chipMap[chipId].pins.push(pinId);let side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-(schematicComponent.center.x||0)+marginXShift,y:(port.center?.y||0)-(schematicComponent.center.y||0)+marginYShift},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=child.sourceGroup.name||`group_${index}`;debug62(`[${group.name}] Processing nested group: ${groupId}`);let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:child.sourceGroup.source_group_id}),groupInstance=group.children.find(groupChild=>groupChild.source_group_id===child.sourceGroup?.source_group_id);if(debug62(`[${group.name}] Found schematic_group for ${groupId}:`,schematicGroup),schematicGroup){debug62(`[${group.name}] Treating group ${groupId} as composite chip`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`[${group.name}] Group ${groupId} has ${groupComponents.length} components:`,groupComponents.map(c3=>c3.source_component_id));let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let comp of groupComponents)if(comp.center&&comp.size){hasValidBounds=!0;let halfWidth=comp.size.width/2,halfHeight=comp.size.height/2;minX=Math.min(minX,comp.center.x-halfWidth),maxX=Math.max(maxX,comp.center.x+halfWidth),minY=Math.min(minY,comp.center.y-halfHeight),maxY=Math.max(maxY,comp.center.y+halfHeight)}let marginLeft=groupInstance?._parsedProps?.schMarginLeft??groupInstance?._parsedProps?.schMarginX??0,marginRight=groupInstance?._parsedProps?.schMarginRight??groupInstance?._parsedProps?.schMarginX??0,marginTop=groupInstance?._parsedProps?.schMarginTop??groupInstance?._parsedProps?.schMarginY??0,marginBottom=groupInstance?._parsedProps?.schMarginBottom??groupInstance?._parsedProps?.schMarginY??0,marginXShift=(marginRight-marginLeft)/2,marginYShift=(marginTop-marginBottom)/2,groupWidth=(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,groupHeight=(hasValidBounds?maxY-minY:2)+marginTop+marginBottom;debug62(`[${group.name}] Group ${groupId} computed size: ${groupWidth} x ${groupHeight}`);let groupPins=[];for(let comp of groupComponents){let ports=db2.schematic_port.list({schematic_component_id:comp.schematic_component_id});for(let port of ports){let sourcePort=db2.source_port.get(port.source_port_id);if(!sourcePort)continue;let pinId=`${groupId}.${sourcePort.pin_number||sourcePort.name||port.schematic_port_id}`;groupPins.push(pinId);let groupCenter=schematicGroup.center||{x:0,y:0},side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-groupCenter.x+marginXShift,y:(port.center?.y||0)-groupCenter.y+marginYShift},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:{x:groupWidth,y:groupHeight}},debug62(`[${group.name}] Added group ${groupId} to chipMap`)}else debug62(`[${group.name}] Warning: No schematic_group found for group ${groupId}`)}}),debug62(`[${group.name}] Creating connections using connectivity keys`);let connectivityGroups=new Map;for(let[chipId,chip]of Object.entries(problem.chipMap))for(let pinId of chip.pins){let pinNumber=pinId.split(".").pop(),treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);if(treeNode?.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});for(let comp of groupComponents){let sourcePorts=db2.source_port.list({source_component_id:comp.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber))if(sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] \u2713 Pin ${pinId} has connectivity key: ${connectivityKey}`)}else debug62(`[${group.name}] Pin ${pinId} has no connectivity key`)}}}}else if(treeNode?.nodeType==="component"&&treeNode.sourceComponent){let sourcePorts=db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id});for(let sourcePort of sourcePorts){let portNumber=sourcePort.pin_number||sourcePort.name;if(String(portNumber)===String(pinNumber)&&sourcePort.subcircuit_connectivity_map_key){let connectivityKey=sourcePort.subcircuit_connectivity_map_key;connectivityGroups.has(connectivityKey)||connectivityGroups.set(connectivityKey,[]),connectivityGroups.get(connectivityKey).push(pinId),debug62(`[${group.name}] Pin ${pinId} has connectivity key: ${connectivityKey}`)}}}}debug62(`[${group.name}] Found ${connectivityGroups.size} connectivity groups:`,Array.from(connectivityGroups.entries()).map(([key,pins])=>({key,pins})));for(let[connectivityKey,pins]of connectivityGroups)if(pins.length>=2){let tracesWithThisKey=db2.source_trace.list().filter(trace=>trace.subcircuit_connectivity_map_key===connectivityKey),hasNetConnections=tracesWithThisKey.some(trace=>trace.connected_source_net_ids&&trace.connected_source_net_ids.length>0),hasDirectConnections=tracesWithThisKey.some(trace=>trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2);if(debug62(`[${group.name}] Connectivity ${connectivityKey}: hasNetConnections=${hasNetConnections}, hasDirectConnections=${hasDirectConnections}`),hasDirectConnections){for(let trace of tracesWithThisKey)if(trace.connected_source_port_ids&&trace.connected_source_port_ids.length>=2){let directlyConnectedPins=[];for(let portId of trace.connected_source_port_ids)for(let pinId of pins){let pinNumber=pinId.split(".").pop(),sourcePort=db2.source_port.get(portId);if(sourcePort&&String(sourcePort.pin_number||sourcePort.name)===String(pinNumber)){let chipId=pinId.split(".")[0],treeNode=tree.childNodes.find(child=>child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name===chipId:child.nodeType==="group"&&child.sourceGroup?`group_${tree.childNodes.indexOf(child)}`===chipId:!1);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p4=>p4.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i2=0;i2<directlyConnectedPins.length;i2++)for(let j4=i2+1;j4<directlyConnectedPins.length;j4++){let pin1=directlyConnectedPins[i2],pin2=directlyConnectedPins[j4];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net2=db2.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net2?.is_ground??!1,isPositiveVoltageSource=source_net2?.is_power??!1;problem.netMap[connectivityKey]={netId:connectivityKey,isGround,isPositiveVoltageSource};for(let pinId of pins)problem.netConnMap[`${pinId}-${connectivityKey}`]=!0;debug62(`[${group.name}] Created net ${connectivityKey} with ${pins.length} pins:`,pins)}}return problem}function Group_doInitialSchematicLayoutMatchPack(group){let{db:db2}=group.root,tree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id});if(debug62(`[${group.name}] Starting matchpack layout with ${tree.childNodes.length} children`),debug62(`[${group.name}] Tree structure:`,JSON.stringify(tree,null,2)),tree.childNodes.length<=1){debug62(`[${group.name}] Only ${tree.childNodes.length} children, skipping layout`);return}debug62("Converting circuit tree to InputProblem...");let inputProblem=convertTreeToInputProblem(tree,db2,group);debug62.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:`matchpack-input-problem-${group.name}`,content:JSON.stringify(inputProblem,null,2)});let solver=new LayoutPipelineSolver(inputProblem);if(debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed)throw debug62(`Solver failed with error: ${solver.error}`),new Error(`Matchpack layout solver failed: ${solver.error}`);let outputLayout=solver.getOutputLayout();if(debug62("OutputLayout:",JSON.stringify(outputLayout,null,2)),debug62("Solver completed successfully:",!solver.failed),debug62.enabled&&global?.debugGraphics){let finalViz=solver.visualize();global.debugGraphics.push({...finalViz,title:`matchpack-final-${group.name}`})}let overlaps=solver.checkForOverlaps(outputLayout);if(overlaps.length>0){debug62(`Warning: Found ${overlaps.length} overlapping components:`);for(let overlap of overlaps)debug62(` ${overlap.chip1} overlaps ${overlap.chip2} (area: ${overlap.overlapArea})`)}let groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`Group offset: x=${groupOffset.x}, y=${groupOffset.y}`),debug62(`Applying layout results for ${Object.keys(outputLayout.chipPlacements).length} chip placements`);for(let[chipId,placement]of Object.entries(outputLayout.chipPlacements)){debug62(`Processing placement for chip: ${chipId} at (${placement.x}, ${placement.y})`);let treeNode=tree.childNodes.find(child=>{if(child.nodeType==="component"&&child.sourceComponent){let matches=child.sourceComponent.name===chipId;return debug62(` Checking component ${child.sourceComponent.name}: matches=${matches}`),matches}if(child.nodeType==="group"&&child.sourceGroup){let groupName=child.sourceGroup.name,expectedChipId=`group_${tree.childNodes.indexOf(child)}`,matches=expectedChipId===chipId;return debug62(` Checking group ${groupName} (expected chipId: ${expectedChipId}): matches=${matches}`),matches}return!1});if(!treeNode){debug62(`Warning: No tree node found for chip: ${chipId}`),debug62("Available tree nodes:",tree.childNodes.map((child,idx)=>({type:child.nodeType,name:child.nodeType==="component"?child.sourceComponent?.name:child.sourceGroup?.name,expectedChipId:child.nodeType==="group"?`group_${idx}`:child.sourceComponent?.name})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let schematicComponent=db2.schematic_component.getWhere({source_component_id:treeNode.sourceComponent.source_component_id});if(schematicComponent){debug62(`Moving component ${chipId} to (${newCenter.x}, ${newCenter.y})`);let ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematicComponent.schematic_component_id}),positionDelta={x:newCenter.x-schematicComponent.center.x,y:newCenter.y-schematicComponent.center.y};for(let port of ports)port.center.x+=positionDelta.x,port.center.y+=positionDelta.y;for(let text of texts)text.position.x+=positionDelta.x,text.position.y+=positionDelta.y;if(updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schematicComponent.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematicComponent.center=newCenter,placement.ccwRotationDegrees!==0){debug62(`Component ${chipId} has rotation: ${placement.ccwRotationDegrees}\xB0`);let normalizedRotation=(Math.round(placement.ccwRotationDegrees)%360+360)%360;if((normalizedRotation===90||normalizedRotation===270)&&schematicComponent.size){let prevWidth=schematicComponent.size.width;schematicComponent.size.width=schematicComponent.size.height,schematicComponent.size.height=prevWidth}let angleRad=placement.ccwRotationDegrees*Math.PI/180,cos5=Math.cos(angleRad),sin5=Math.sin(angleRad);for(let port of ports){let dx3=port.center.x-newCenter.x,dy3=port.center.y-newCenter.y,rotatedDx=dx3*cos5-dy3*sin5,rotatedDy=dx3*sin5+dy3*cos5;port.center.x=newCenter.x+rotatedDx,port.center.y=newCenter.y+rotatedDy;let originalDirection=port.facing_direction||"right";port.facing_direction=rotateDirection2(originalDirection,placement.ccwRotationDegrees),port.side_of_component=(port.facing_direction==="up"?"top":port.facing_direction==="down"?"bottom":port.facing_direction)||port.side_of_component}for(let text of texts){let dx3=text.position.x-newCenter.x,dy3=text.position.y-newCenter.y,rotatedDx=dx3*cos5-dy3*sin5,rotatedDy=dx3*sin5+dy3*cos5;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}if(schematicComponent.symbol_name){let schematicSymbolDirection=schematicComponent.symbol_name.match(/_(right|left|up|down)$/);schematicSymbolDirection&&(schematicComponent.symbol_name=schematicComponent.symbol_name.replace(schematicSymbolDirection[0],`_${rotateDirection2(schematicSymbolDirection[1],placement.ccwRotationDegrees)}`))}}}}else if(treeNode.nodeType==="group"&&treeNode.sourceGroup){let schematicGroup=db2.schematic_group?.getWhere?.({source_group_id:treeNode.sourceGroup.source_group_id});if(schematicGroup){debug62(`Moving group ${chipId} to (${newCenter.x}, ${newCenter.y}) from (${schematicGroup.center?.x}, ${schematicGroup.center?.y})`);let groupComponents=db2.schematic_component.list({schematic_group_id:schematicGroup.schematic_group_id});debug62(`Group ${chipId} has ${groupComponents.length} components to move`);let oldCenter=schematicGroup.center||{x:0,y:0},positionDelta={x:newCenter.x-oldCenter.x,y:newCenter.y-oldCenter.y};debug62(`Position delta for group ${chipId}: (${positionDelta.x}, ${positionDelta.y})`);for(let component of groupComponents)if(component.center){let oldComponentCenter={...component.center};component.center.x+=positionDelta.x,component.center.y+=positionDelta.y,debug62(`Moved component ${component.source_component_id} from (${oldComponentCenter.x}, ${oldComponentCenter.y}) to (${component.center.x}, ${component.center.y})`);let ports=db2.schematic_port.list({schematic_component_id:component.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:component.schematic_component_id});for(let port of ports)port.center&&(port.center.x+=positionDelta.x,port.center.y+=positionDelta.y);for(let text of texts)text.position&&(text.position.x+=positionDelta.x,text.position.y+=positionDelta.y)}schematicGroup.center=newCenter,debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function createSchematicTraceSolverInputProblem(group){let{db:db2}=group.root,sckToSourceNet=new Map,sckToUserNetId=new Map,allScks=new Set,displayLabelTraces=group.selectAll("trace").filter(t35=>t35._parsedProps?.schDisplayLabel),childGroups=group.selectAll("group"),allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a2=>a2.schematic_group_id)],schematicComponents=db2.schematic_component.list().filter(a2=>allSchematicGroupIds.includes(a2.schematic_group_id)),chips=[],pinIdToSchematicPortId=new Map,schematicPortIdToPinId=new Map;for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],sourceComponent=db2.source_component.getWhere({source_component_id:schematicComponent.source_component_id}),schematicPorts=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let pinId=`${sourceComponent?.name??schematicComponent.schematic_component_id}.${schematicPort.pin_number}`;pinIdToSchematicPortId.set(pinId,schematicPort.schematic_port_id),schematicPortIdToPinId.set(schematicPort.schematic_port_id,pinId)}for(let schematicPort of schematicPorts){let pinId=schematicPortIdToPinId.get(schematicPort.schematic_port_id);pins.push({pinId,x:schematicPort.center.x,y:schematicPort.center.y})}chips.push({chipId,center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height,pins})}let allSourceAndSchematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToSck=new Map;for(let sc2 of schematicComponents){let ports=db2.schematic_port.list({schematic_component_id:sc2.schematic_component_id});for(let sp3 of ports)allSourceAndSchematicPortIdsInScope.add(sp3.schematic_port_id),sp3.source_port_id&&(schPortIdToSourcePortId.set(sp3.schematic_port_id,sp3.source_port_id),sourcePortIdToSchPortId.set(sp3.source_port_id,sp3.schematic_port_id))}let allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg3 of childGroups)cg3.subcircuit_id&&allowedSubcircuitIds.add(cg3.subcircuit_id);let externalNetIds=db2.source_trace.list().filter(st4=>{if(st4.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st4.connected_source_port_ids)if(sourcePortIdToSchPortId.has(source_port_id))return!0;return!1}).flatMap(st4=>st4.connected_source_net_ids);for(let netId of externalNetIds){let net=db2.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}let directConnections=[],pairKeyToSourceTraceId=new Map;for(let st4 of db2.source_trace.list()){if(st4.subcircuit_id&&!allowedSubcircuitIds.has(st4.subcircuit_id))continue;let connected=(st4.connected_source_port_ids??[]).map(srcId=>sourcePortIdToSchPortId.get(srcId)).filter(sourcePortId=>!!sourcePortId&&allSourceAndSchematicPortIdsInScope.has(sourcePortId));if(connected.length>=2){let[a2,b3]=connected.slice(0,2),pairKey=[a2,b3].sort().join("::");if(!pairKeyToSourceTraceId.has(pairKey)){pairKeyToSourceTraceId.set(pairKey,st4.source_trace_id);let userNetId=st4.display_name??st4.source_trace_id;st4.subcircuit_connectivity_map_key&&(allScks.add(st4.subcircuit_connectivity_map_key),userNetIdToSck.set(userNetId,st4.subcircuit_connectivity_map_key),sckToUserNetId.set(st4.subcircuit_connectivity_map_key,userNetId)),directConnections.push({pinIds:[a2,b3].map(id2=>schematicPortIdToPinId.get(id2)),netId:userNetId})}}}let netConnections=[];for(let net of db2.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.subcircuit_connectivity_map_key&&(allScks.add(net.subcircuit_connectivity_map_key),sckToSourceNet.set(net.subcircuit_connectivity_map_key,net));let sckToPinIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){let sp3=db2.source_port.get(srcPortId);if(!sp3?.subcircuit_connectivity_map_key)continue;let sck=sp3.subcircuit_connectivity_map_key;allScks.add(sck),sckToPinIds.has(sck)||sckToPinIds.set(sck,[]),sckToPinIds.get(sck).push(schId)}for(let[subcircuitConnectivityKey,schematicPortIds]of sckToPinIds){let sourceNet=sckToSourceNet.get(subcircuitConnectivityKey);if(sourceNet&&schematicPortIds.length>=2){let userNetId=String(sourceNet.name||sourceNet.source_net_id||subcircuitConnectivityKey);userNetIdToSck.set(userNetId,subcircuitConnectivityKey),sckToUserNetId.set(subcircuitConnectivityKey,userNetId);let charWidth=.1*(.18/.18),netLabelWidth=Number((String(userNetId).length*charWidth).toFixed(2));netConnections.push({netId:userNetId,pinIds:schematicPortIds.map(portId=>schematicPortIdToPinId.get(portId)),netLabelWidth})}}let availableNetLabelOrientations=(()=>{let netToAllowedOrientations={},presentNetIds=new Set(netConnections.map(nc3=>nc3.netId));for(let net of db2.source_net.list().filter(n3=>!n3.subcircuit_id||allowedSubcircuitIds.has(n3.subcircuit_id)))net.name&&presentNetIds.has(net.name)&&(net.is_ground||net.name.toLowerCase().startsWith("gnd")?netToAllowedOrientations[net.name]=["y-"]:net.is_power||net.name.toLowerCase().startsWith("v")?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections,netConnections,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??2.4},pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,sckToUserNetId,userNetIdToSck,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks}}var TOL=1e-6;function isHorizontalEdge(edge){let dx3=Math.abs(edge.to.x-edge.from.x),dy3=Math.abs(edge.to.y-edge.from.y);return dx3>=dy3}function length6(a2,b3){return Math.hypot(b3.x-a2.x,b3.y-a2.y)}function pointAt(a2,b3,t35){return{x:a2.x+(b3.x-a2.x)*t35,y:a2.y+(b3.y-a2.y)*t35}}function paramAlong(a2,b3,p4){let L4=length6(a2,b3);if(L4<TOL)return 0;let t35=((p4.x-a2.x)*(b3.x-a2.x)+(p4.y-a2.y)*(b3.y-a2.y))/((b3.x-a2.x)*(b3.x-a2.x)+(b3.y-a2.y)*(b3.y-a2.y));return Math.max(0,Math.min(1,t35))*L4}function cross2(ax3,ay3,bx3,by3){return ax3*by3-ay3*bx3}function segmentIntersection(p12,p22,q12,q22){let r4={x:p22.x-p12.x,y:p22.y-p12.y},s2={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross2(r4.x,r4.y,s2.x,s2.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross2(q_p.x,q_p.y,r4.x,r4.y);if(Math.abs(rxs)<TOL&&Math.abs(q_pxr)<TOL||Math.abs(rxs)<TOL&&Math.abs(q_pxr)>=TOL)return null;let t35=cross2(q_p.x,q_p.y,s2.x,s2.y)/rxs,u4=cross2(q_p.x,q_p.y,r4.x,r4.y)/rxs;return t35<-TOL||t35>1+TOL||u4<-TOL||u4>1+TOL?null:{x:p12.x+t35*r4.x,y:p12.y+t35*r4.y}}function mergeIntervals(intervals,tol=TOL){if(intervals.length===0)return intervals;intervals.sort((a2,b3)=>a2.start-b3.start);let merged=[],cur={...intervals[0]};for(let i2=1;i2<intervals.length;i2++){let nxt=intervals[i2];nxt.start<=cur.end+tol?cur.end=Math.max(cur.end,nxt.end):(merged.push(cur),cur={...nxt})}return merged.push(cur),merged}function splitEdgeByCrossings(edge,crossingDistances,crossLen){let L4=length6(edge.from,edge.to);if(L4<TOL||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d3=>({start:Math.max(0,d3-half),end:Math.min(L4,d3+half)})).filter(iv2=>iv2.end-iv2.start>TOL),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL)return;let t02=d02/L4,t110=d12/L4;result.push({from:pointAt(edge.from,edge.to,t02),to:pointAt(edge.from,edge.to,t110),...isCrossing?{is_crossing:!0}:{}})};for(let iv2 of intervals)iv2.start-cursor>TOL&&addSeg(cursor,iv2.start,!1),addSeg(iv2.start,iv2.end,!0),cursor=iv2.end;return L4-cursor>TOL&&addSeg(cursor,L4,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL,crossingsByEdge=new Map,keyOf=ref=>`${ref.traceIdx}:${ref.edgeIdx}`,getEdge=ref=>traces[ref.traceIdx].edges[ref.edgeIdx];for(let ti3=0;ti3<traces.length;ti3++){let A4=traces[ti3];for(let ei3=0;ei3<A4.edges.length;ei3++){let eA=A4.edges[ei3];for(let tj=ti3;tj<traces.length;tj++){let B5=traces[tj];for(let ej=tj===ti3?ei3+1:0;ej<B5.edges.length;ej++){let eB=B5.edges[ej],P5=segmentIntersection(eA.from,eA.to,eB.from,eB.to);if(!P5)continue;let LA=length6(eA.from,eA.to),LB=length6(eB.from,eB.to);if(LA<tol||LB<tol)continue;let dA=paramAlong(eA.from,eA.to,P5),dB=paramAlong(eB.from,eB.to,P5),nearEndpointA=dA<=tol||Math.abs(LA-dA)<=tol||Number.isNaN(dA),nearEndpointB=dB<=tol||Math.abs(LB-dB)<=tol||Number.isNaN(dB);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA),bIsHorizontal=isHorizontalEdge(eB),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax3=Math.abs(eA.to.x-eA.from.x),ay3=Math.abs(eA.to.y-eA.from.y),bx3=Math.abs(eB.to.x-eB.from.x),by3=Math.abs(eB.to.y-eB.from.y),aScore=ax3-ay3,bScore=bx3-by3;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj,edgeIdx:assignToA?ei3:ej}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA:dB),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t35=>({source_trace_id:t35.source_trace_id,edges:[]}));for(let ti3=0;ti3<traces.length;ti3++){let trace=traces[ti3];for(let ei3=0;ei3<trace.edges.length;ei3++){let eRefKey=keyOf({traceIdx:ti3,edgeIdx:ei3}),splittingDistances=crossingsByEdge.get(eRefKey)??[];if(splittingDistances.length===0){out[ti3].edges.push(trace.edges[ei3]);continue}let uniqueSorted=Array.from(new Set(splittingDistances.map(d3=>Number(d3.toFixed(6))))).sort((a2,b3)=>a2-b3),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted,crossLen);out[ti3].edges.push(...split)}}return out}var TOL2=1e-6;function nearlyEqual(a2,b3,tol=TOL2){return Math.abs(a2-b3)<=tol}function pointEq(a2,b3,tol=TOL2){return nearlyEqual(a2.x,b3.x,tol)&&nearlyEqual(a2.y,b3.y,tol)}function onSegment5(p4,a2,b3,tol=TOL2){let minX=Math.min(a2.x,b3.x)-tol,maxX=Math.max(a2.x,b3.x)+tol,minY=Math.min(a2.y,b3.y)-tol,maxY=Math.max(a2.y,b3.y)+tol;return p4.x<minX||p4.x>maxX||p4.y<minY||p4.y>maxY?!1:Math.abs((b3.x-a2.x)*(p4.y-a2.y)-(b3.y-a2.y)*(p4.x-a2.x))<=tol}function dedupePoints(points,tol=TOL2){let map=new Map;for(let p4 of points){let key=`${p4.x.toFixed(6)},${p4.y.toFixed(6)}`;map.has(key)||map.set(key,p4)}return Array.from(map.values())}function edgeVec(e4){return{x:e4.to.x-e4.from.x,y:e4.to.y-e4.from.y}}function isParallel(e12,e22,tol=TOL2){let v12=edgeVec(e12),v22=edgeVec(e22),L12=Math.hypot(v12.x,v12.y),L22=Math.hypot(v22.x,v22.y);if(L12<tol||L22<tol)return!0;let cross22=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross22)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p4,tol=TOL2){return trace.edges.filter(e4=>pointEq(e4.from,p4,tol)||pointEq(e4.to,p4,tol))}function nearestEndpointOnTrace(trace,p4,tol=TOL2){for(let e4 of trace.edges){if(pointEq(e4.from,p4,tol))return e4.from;if(pointEq(e4.to,p4,tol))return e4.to}return null}function edgeDirectionFromPoint(e4,p4,tol=TOL2){let other=pointEq(e4.from,p4,tol)||nearlyEqual(e4.from.x,p4.x,tol)&&nearlyEqual(e4.from.y,p4.y,tol)?e4.to:e4.from,dx3=other.x-p4.x,dy3=other.y-p4.y;return Math.abs(dx3)<tol&&Math.abs(dy3)<tol?null:Math.abs(dx3)>=Math.abs(dy3)?dx3>=0?"right":"left":dy3>=0?"up":"down"}function getCornerOrientationAtPoint(trace,p4,tol=TOL2){let incident=incidentEdgesAtPoint(trace,p4,tol);if(incident.length<2)return null;let dirs=incident.map(e4=>edgeDirectionFromPoint(e4,p4,tol)),hasUp=dirs.includes("up"),hasDown=dirs.includes("down"),hasLeft=dirs.includes("left"),hasRight=dirs.includes("right"),vertical=hasUp?"up":hasDown?"down":null,horizontal=hasRight?"right":hasLeft?"left":null;return vertical&&horizontal?`${vertical}-${horizontal}`:null}function computeJunctions(traces,opts={}){let tol=opts.tolerance??TOL2,result={};for(let t35 of traces)result[t35.source_trace_id]=[];let endpointsByTrace=traces.map(t35=>{let pts=[];for(let e4 of t35.edges)pts.push(e4.from,e4.to);return dedupePoints(pts,tol)});for(let i2=0;i2<traces.length;i2++){let A4=traces[i2],AEnds=endpointsByTrace[i2];for(let j4=i2+1;j4<traces.length;j4++){let B5=traces[j4],BEnds=endpointsByTrace[j4];for(let pa3 of AEnds)for(let pb of BEnds)if(pointEq(pa3,pb,tol)){let aEdgesAtP=incidentEdgesAtPoint(A4,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B5,pb,tol),hasCorner=aEdgesAtP.some(eA=>bEdgesAtP.some(eB=>!isParallel(eA,eB,tol))),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bCorner=getCornerOrientationAtPoint(B5,pb,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pb))}for(let pa3 of AEnds)for(let eB of B5.edges)if(onSegment5(pa3,eB.from,eB.to,tol)){let hasCorner=incidentEdgesAtPoint(A4,pa3,tol).some(eA=>!isParallel(eA,eB,tol)),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B5,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B5,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B5.source_trace_id&&result[B5.source_trace_id].push(pa3))}for(let pb of BEnds)for(let eA of A4.edges)if(onSegment5(pb,eA.from,eA.to,tol)){let hasCorner=incidentEdgesAtPoint(B5,pb,tol).some(eB=>!isParallel(eA,eB,tol)),bCorner=getCornerOrientationAtPoint(B5,pb,tol),aEndpointNearPb=nearestEndpointOnTrace(A4,pb,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A4,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B5.source_trace_id].push(pb),A4.source_trace_id!==B5.source_trace_id&&result[A4.source_trace_id].push(pb))}}}for(let id2 of Object.keys(result))result[id2]=dedupePoints(result[id2],tol);return result}var debug7=(0,import_debug16.default)("Group_doInitialSchematicTraceRender");function applyTracesFromSolverOutput(args){let{group,solver,pinIdToSchematicPortId,userNetIdToSck}=args,{db:db2}=group.root,traces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug7(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug7(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let edges=[];for(let i2=0;i2<points.length-1;i2++)edges.push({from:{x:points[i2].x,y:points[i2].y},to:{x:points[i2+1].x,y:points[i2+1].y}});let source_trace_id=null,subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let pA=pinIdToSchematicPortId.get(solvedTracePath.pins[0]?.pinId),pB=pinIdToSchematicPortId.get(solvedTracePath.pins[1]?.pinId);if(pA&&pB){for(let schPid of[pA,pB])db2.schematic_port.get(schPid)&&db2.schematic_port.update(schPid,{is_connected:!0});subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))}}source_trace_id||(source_trace_id=`solver_${solvedTracePath?.mspPairId}`,subcircuit_connectivity_map_key=userNetIdToSck.get(String(solvedTracePath.userNetId))),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key})}debug7(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t35=>({source_trace_id:t35.source_trace_id,edges:t35.edges}))),junctionsById=computeJunctions(withCrossings);for(let t35 of withCrossings)db2.schematic_trace.insert({source_trace_id:t35.source_trace_id,edges:t35.edges,junctions:junctionsById[t35.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTraces.find(p4=>p4.source_trace_id===t35.source_trace_id)?.subcircuit_connectivity_map_key})}var oppositeSide2=input2=>{switch(input2){case"x+":return"left";case"x-":return"right";case"y+":return"bottom";case"y-":return"top";case"left":return"right";case"top":return"bottom";case"right":return"left";case"bottom":return"top"}},getNetNameFromPorts=ports=>{for(let port of ports){let traces=port._getDirectlyConnectedTraces();for(let trace of traces){let displayLabel=trace._parsedProps.schDisplayLabel;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0}}}return{name:ports.map(p4=>p4._getNetLabelText()).join("/"),wasAssignedDisplayLabel:!1}},debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender");function applyNetLabelPlacements(args){let{group,solver,sckToSourceNet,allScks,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,userNetIdToSck,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}=args,{db:db2}=group.root,netLabelPlacements=solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of netLabelPlacements){debug8(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id2=>userNetIdToSck.get(id2)),placementSck=userNetIdToSck.get(placementUserNetId),anchor_position=placement.anchorPoint,orientation5=placement.orientation,anchor_side=oppositeSide2(orientation5),sourceNet=placementSck?sckToSourceNet.get(placementSck):void 0,schPortIds=placement.pinIds.map(pinId=>pinIdToSchematicPortId.get(pinId));if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let text2=sourceNet.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2});db2.schematic_net_label.insert({text:text2,anchor_position,center:center22,anchor_side,...sourceNet?.source_net_id?{source_net_id:sourceNet.source_net_id}:{}});continue}let ports=group.selectAll("port").filter(p4=>p4._getSubcircuitConnectivityKey()===placementSck),{name:text,wasAssignedDisplayLabel}=getNetNameFromPorts(ports);if(!wasAssignedDisplayLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug8(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed traces and no display label`);continue}let center2=computeSchematicNetLabelCenter({anchor_position,anchor_side,text});db2.schematic_net_label.insert({text,anchor_position,center:center2,anchor_side})}}var insertNetLabelsForPortsMissingTrace=({allSourceAndSchematicPortIdsInScope,group,schPortIdToSourcePortId,sckToSourceNet:connKeyToNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})=>{let{db:db2}=group.root;for(let schOrSrcPortId of Array.from(allSourceAndSchematicPortIdsInScope)){let schPort=db2.schematic_port.get(schOrSrcPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schOrSrcPortId);if(!srcPortId)continue;let key=db2.source_port.get(srcPortId)?.subcircuit_connectivity_map_key;if(!key)continue;let sourceNet=connKeyToNet.get(key);if(!sourceNet||db2.schematic_net_label.list().some(nl3=>Math.abs(nl3.anchor_position.x-schPort.center.x)<.1&&Math.abs(nl3.anchor_position.y-schPort.center.y)<.1?sourceNet.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.text===(sourceNet.name||key):!1))continue;let text=sourceNet.name||sourceNet.source_net_id||key,side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right",center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text});db2.schematic_net_label.insert({text,anchor_position:schPort.center,center:center2,anchor_side:side,...sourceNet.source_net_id?{source_net_id:sourceNet.source_net_id}:{}})}},getSchematicPortIdsWithAssignedNetLabels=group=>{let schematicPortIdsWithNetLabels=new Set,netLabels=group.selectAll("netlabel");for(let netLabel of netLabels){let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(port.schematic_port_id)}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver,pinIdToSchematicPortId})=>{let solvedTraces=solver.schematicTraceLinesSolver.solvedTracePaths,schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces)for(let pinId of solvedTrace.pinIds){let schPortId=pinIdToSchematicPortId.get(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}return schematicPortIdsWithRoutedTraces},debug9=(0,import_debug15.default)("Group_doInitialSchematicTraceRender"),Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let{inputProblem,pinIdToSchematicPortId,pairKeyToSourceTraceId,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,displayLabelTraces,allScks,userNetIdToSck}=createSchematicTraceSolverInputProblem(group),schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(group);debug9.enabled&&group.root?.emit("debug:logOutput",{type:"debug:logOutput",name:"group-trace-render-input-problem",content:JSON.stringify(inputProblem,null,2)});let solver=new SchematicTracePipelineSolver(inputProblem);solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver,pinIdToSchematicPortId});applyTracesFromSolverOutput({group,solver,pinIdToSchematicPortId,userNetIdToSck}),applyNetLabelPlacements({group,solver,sckToSourceNet,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,pinIdToSchematicPortId,allScks,userNetIdToSck,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces}),insertNetLabelsForPortsMissingTrace({group,allSourceAndSchematicPortIdsInScope,schPortIdToSourcePortId,sckToSourceNet,pinIdToSchematicPortId,schematicPortIdsWithPreExistingNetLabels})},getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),SIMULATION_COLOR_PALETTE=["rgb(132, 0, 0)","rgb(194, 194, 0)","rgb(194, 0, 194)","rgb(194, 0, 0)","rgb(0, 132, 132)","rgb(0, 132, 0)","rgb(0, 0, 132)","rgb(132, 132, 132)","rgb(132, 0, 132)","rgb(194, 194, 194)","rgb(132, 0, 132)","rgb(132, 0, 0)","rgb(132, 132, 0)","rgb(194, 194, 194)","rgb(0, 0, 132)","rgb(0, 132, 0)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id2){if(idToColorMap.has(id2))return idToColorMap.get(id2);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id2,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var debug10=(0,import_debug18.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender");function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSims=group.selectAll("analogsimulation");if(analogSims.length===0)return;let voltageProbes=group.selectAll("voltageprobe");resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());let circuitJson=root.db.toArray(),spiceString,spiceNetlist;try{spiceNetlist=circuitJsonToSpice(circuitJson),spiceString=spiceNetlist.toSpiceString(),debug10(`Generated SPICE string:
|
|
650
|
+
${spiceString}`)}catch(error){debug10(`Failed to convert circuit JSON to SPICE: ${error}`);return}for(let analogSim of analogSims){let engineName=analogSim._parsedProps.spiceEngine??"spicey",spiceEngine2=spiceEngineMap[engineName];if(!spiceEngine2)throw new Error(`SPICE engine "${engineName}" not found in platform config. Available engines: ${JSON.stringify(Object.keys(spiceEngineMap).filter(k4=>k4!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${analogSim.source_component_id}`;debug10(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{debug10(`Running simulation with engine: ${engineName}`);let result=await spiceEngine2.simulate(spiceString);debug10(`Simulation completed, received ${result.simulationResultCircuitJson.length} elements`);let simulationExperiment=root.db.simulation_experiment.list()[0];if(!simulationExperiment){debug10("No simulation experiment found, skipping result insertion");return}for(let element of result.simulationResultCircuitJson){if(element.type==="simulation_transient_voltage_graph"){element.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbes.find(p4=>p4.finalProbeName===element.name);probeMatch&&(element.color=probeMatch.color)}let elementType=element.type;elementType&&root.db[elementType]?(root.db[elementType].insert(element),debug10(`Inserted ${elementType} into database`)):(debug10(`Warning: Unknown element type ${elementType}, adding to raw db`),root.db._addElement(element))}group._markDirty("SimulationSpiceEngineRender")}catch(error){debug10(`Simulation failed for engine ${engineName}: ${error}`);let simulationExperiment=root.db.simulation_experiment.list()[0];root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperiment?.simulation_experiment_id,error_type:"simulation_unknown_experiment_error",message:error instanceof Error?error.message:String(error)})}})}}function Group_doInitialSourceAddConnectivityMapKey(group){if(!group.isSubcircuit)return;let{db:db2}=group.root,traces=group.selectAll("trace"),vias=group.selectAll("via"),nets=group.selectAll("net"),connMap=new ConnectivityMap({});connMap.addConnections(traces.map(t35=>{let source_trace2=db2.source_trace.get(t35.source_trace_id);return source_trace2?[source_trace2.source_trace_id,...source_trace2.connected_source_port_ids,...source_trace2.connected_source_net_ids]:null}).filter(c3=>c3!==null));let sourceNets=db2.source_net.list().filter(net=>net.subcircuit_id===group.subcircuit_id);for(let sourceNet of sourceNets)connMap.addConnections([[sourceNet.source_net_id]]);let{name:subcircuitName}=group._parsedProps;for(let trace of traces){if(!trace.source_trace_id)continue;let connNetId=connMap.getNetConnectedToId(trace.source_trace_id);connNetId&&(trace.subcircuit_connectivity_map_key=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`,db2.source_trace.update(trace.source_trace_id,{subcircuit_connectivity_map_key:trace.subcircuit_connectivity_map_key}))}let allSourcePortIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db2.source_trace.get(trace.source_trace_id);if(source_trace2)for(let id2 of source_trace2.connected_source_port_ids)allSourcePortIds.add(id2)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_port.update(portId,{subcircuit_connectivity_map_key:connectivityMapKey})}let allSourceNetIds=new Set;for(let trace of traces){if(!trace.source_trace_id)continue;let source_trace2=db2.source_trace.get(trace.source_trace_id);if(source_trace2)for(let source_net_id of source_trace2.connected_source_net_ids)allSourceNetIds.add(source_net_id)}for(let sourceNet of sourceNets)allSourceNetIds.add(sourceNet.source_net_id);for(let netId of allSourceNetIds){let connNetId=connMap.getNetConnectedToId(netId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group._renderId}`}_${connNetId}`;db2.source_net.update(netId,{subcircuit_connectivity_map_key:connectivityMapKey});let netInstance=nets.find(n3=>n3.source_net_id===netId);netInstance&&(netInstance.subcircuit_connectivity_map_key=connectivityMapKey)}for(let via of vias){let connectedNetOrTrace=via._getConnectedNetOrTrace();connectedNetOrTrace&&connectedNetOrTrace.subcircuit_connectivity_map_key&&(via.subcircuit_connectivity_map_key=connectedNetOrTrace.subcircuit_connectivity_map_key)}}function getJumperPadInfos(db2){let padInfos=[],jumperSmtpads=db2.pcb_smtpad.list().filter(pad2=>{let component=db2.pcb_component.get(pad2.pcb_component_id);return component?db2.source_component.get(component.source_component_id)?.name?.startsWith("__autoplaced_jumper"):!1});for(let smtpad2 of jumperSmtpads)if(smtpad2.shape!=="polygon"&&smtpad2.pcb_port_id){if(smtpad2.shape==="rect"||smtpad2.shape==="rotated_rect"){let halfWidth=smtpad2.width/2,halfHeight=smtpad2.height/2;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-halfWidth,maxX:smtpad2.x+halfWidth,minY:smtpad2.y-halfHeight,maxY:smtpad2.y+halfHeight})}else if(smtpad2.shape==="circle"){let radius=smtpad2.radius;padInfos.push({pcb_port_id:smtpad2.pcb_port_id,x:smtpad2.x,y:smtpad2.y,minX:smtpad2.x-radius,maxX:smtpad2.x+radius,minY:smtpad2.y-radius,maxY:smtpad2.y+radius})}}return padInfos}function findJumperPortAtPosition(padInfos,x5,y5,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x5)<tolerance&&Math.abs(pad2.y-y5)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x5,y5){for(let pad2 of padInfos)if(x5>=pad2.minX&&x5<=pad2.maxX&&y5>=pad2.minY&&y5<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i2=0;i2<route.length;i2++){let point6=route[i2];if(currentSegment.push(point6),point6.route_type==="wire"&&i2>0&&i2<route.length-1){let padInfo=findJumperPortContainingPoint(padInfos,point6.x,point6.y);if(padInfo){point6.end_pcb_port_id||(point6.end_pcb_port_id=padInfo.pcb_port_id),segments.push(currentSegment);let newStartPoint={...point6};delete newStartPoint.end_pcb_port_id,newStartPoint.start_pcb_port_id||(newStartPoint.start_pcb_port_id=padInfo.pcb_port_id),currentSegment=[newStartPoint]}}}return currentSegment.length>0&&segments.push(currentSegment),segments}function addPortIdsToTracesAtJumperPads(segments,db2){let padInfos=getJumperPadInfos(db2);if(padInfos.length===0)return segments;let result=[];for(let segment2 of segments){let subSegments=splitRouteAtJumperPads(segment2,padInfos);for(let subSegment of subSegments)if(subSegment.length>0){let firstPoint=subSegment[0],lastPoint=subSegment[subSegment.length-1];if(firstPoint.route_type==="wire"&&!firstPoint.start_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,firstPoint.x,firstPoint.y);portId&&(firstPoint.start_pcb_port_id=portId)}if(lastPoint.route_type==="wire"&&!lastPoint.end_pcb_port_id){let portId=findJumperPortAtPosition(padInfos,lastPoint.x,lastPoint.y);portId&&(lastPoint.end_pcb_port_id=portId)}result.push(subSegment)}}return result}function groupPadsByInternalConnection(pads,orientation5){let groups=[];for(let pad2 of pads){let key=orientation5==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation5==="vertical"?group[0].center.y:group[0].center.x;if(Math.abs(key-groupKey)<.01){group.push(pad2),foundGroup=!0;break}}foundGroup||groups.push([pad2])}return groups.filter(g7=>g7.length>=2)}function insertAutoplacedJumpers(params){let{db:db2,output_jumpers,subcircuit_id}=params;for(let jumperIndex=0;jumperIndex<output_jumpers.length;jumperIndex++){let jumper=output_jumpers[jumperIndex],sourceComponent=db2.source_component.insert({ftype:"simple_chip",name:`__autoplaced_jumper_${jumperIndex}`,supplier_part_numbers:{}}),rotation4=jumper.orientation==="horizontal"?0:90,firstPadLayer=jumper.pads[0]?.layer||jumper.pads[0]?.layers?.[0]||"top",pcbComponent=db2.pcb_component.insert({source_component_id:sourceComponent.source_component_id,center:jumper.center,rotation:rotation4,layer:firstPadLayer,width:jumper.width||0,height:jumper.height||0,obstructs_within_bounds:!1}),padData=[];for(let padIndex=0;padIndex<jumper.pads.length;padIndex++){let pad2=jumper.pads[padIndex],pinNumber=padIndex+1,sourcePort=db2.source_port.insert({source_component_id:sourceComponent.source_component_id,name:`pin${pinNumber}`,pin_number:pinNumber}),padLayer=pad2.layer||pad2.layers?.[0]||"top",pcbPort=db2.pcb_port.insert({pcb_component_id:pcbComponent.pcb_component_id,source_port_id:sourcePort.source_port_id,x:pad2.center.x,y:pad2.center.y,layers:[padLayer]}),pcbSmtpad=db2.pcb_smtpad.insert({pcb_component_id:pcbComponent.pcb_component_id,pcb_port_id:pcbPort.pcb_port_id,shape:"rect",x:pad2.center.x,y:pad2.center.y,width:pad2.width,height:pad2.height,layer:padLayer});padData.push({pad:pad2,sourcePortId:sourcePort.source_port_id,pcbSmtpadId:pcbSmtpad.pcb_smtpad_id})}let internalGroups=groupPadsByInternalConnection(jumper.pads,jumper.orientation);for(let group of internalGroups){let sourcePortIds=[];for(let groupPad of group){let padInfo=padData.find(p4=>Math.abs(p4.pad.center.x-groupPad.center.x)<.01&&Math.abs(p4.pad.center.y-groupPad.center.y)<.01);padInfo&&sourcePortIds.push(padInfo.sourcePortId)}sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:sourceComponent.source_component_id,subcircuit_id:subcircuit_id??void 0,source_port_ids:sourcePortIds})}}}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p4=>p4.route_type==="jumper"),wireAndViaRoutes=route.filter(p4=>p4.route_type!=="jumper");if(jumperRoutes.length===0)return null;let splitRanges=[];for(let jumperRoute of jumperRoutes){let jumperStart=jumperRoute.start,jumperEnd=jumperRoute.end,startIdx=-1,endIdx=-1,minStartDist=1/0,minEndDist=1/0;for(let i2=0;i2<wireAndViaRoutes.length;i2++){let p4=wireAndViaRoutes[i2];if(p4.route_type!=="wire")continue;let distToStart=Math.hypot(p4.x-jumperStart.x,p4.y-jumperStart.y),distToEnd=Math.hypot(p4.x-jumperEnd.x,p4.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i2),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i2)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a2,b3)=>a2.startIdx-b3.startIdx);let segments=[],currentStart=0;for(let range2 of splitRanges)currentStart<range2.startIdx&&segments.push(wireAndViaRoutes.slice(currentStart,range2.startIdx+1)),currentStart=range2.endIdx;return currentStart<wireAndViaRoutes.length&&segments.push(wireAndViaRoutes.slice(currentStart)),segments}function computeCenterFromAnchorPosition(anchorPosition,ctx){let{width,height,pcbAnchorAlignment}=ctx;if(!pcbAnchorAlignment)return anchorPosition;let alignment=pcbAnchorAlignment;if(typeof width!="number"||typeof height!="number")return console.log("width or height is not a number"),anchorPosition;let ax3=anchorPosition.x,ay3=anchorPosition.y;switch(alignment){case"top_left":return{x:ax3+width/2,y:ay3-height/2};case"top_center":return{x:ax3,y:ay3-height/2};case"top_right":return{x:ax3-width/2,y:ay3-height/2};case"center_left":return{x:ax3+width/2,y:ay3};case"center_right":return{x:ax3-width/2,y:ay3};case"bottom_left":return{x:ax3+width/2,y:ay3+height/2};case"bottom_center":return{x:ax3,y:ay3+height/2};case"bottom_right":return{x:ax3-width/2,y:ay3+height/2};default:return anchorPosition}}var Group6=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pcb_group_id",null);__publicField(this,"schematic_group_id",null);__publicField(this,"subcircuit_id",null);__publicField(this,"_hasStartedAsyncAutorouting",!1);__publicField(this,"_isInflatedFromCircuitJson",!1);__publicField(this,"_isolatedCircuitJson",null);__publicField(this,"_normalComponentNameMap",null);__publicField(this,"_asyncAutoroutingResult",null);__publicField(this,"unnamedElementCounter",{})}get _isIsolatedSubcircuit(){return!!this.getInheritedProperty("_subcircuitCachingEnabled")}getNormalComponentNameMap(){if(this._normalComponentNameMap)return this._normalComponentNameMap;let nameMap=new Map,collectNamedComponents=component=>{if(component._isNormalComponent&&component.name){let componentsWithSameName=nameMap.get(component.name);componentsWithSameName?componentsWithSameName.push(component):nameMap.set(component.name,[component])}for(let child of component.children)child.isSubcircuit||collectNamedComponents(child)};for(let child of this.children)child.isSubcircuit||collectNamedComponents(child);return this._normalComponentNameMap=nameMap,nameMap}get config(){return{zodProps:groupProps,componentName:"Group"}}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group2=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group2.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group2.source_group_id}`,db2.source_group.update(source_group2.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.children)db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id})}doInitialSourceParentAttachment(){let{db:db2}=this.root,parentGroup=this.parent?.getGroup?.();if(parentGroup?.source_group_id&&db2.source_group.update(this.source_group_id,{parent_source_group_id:parentGroup.source_group_id}),!this.isSubcircuit)return;let parent_subcircuit_id=this.parent?.getSubcircuit?.()?.subcircuit_id;parent_subcircuit_id&&db2.source_group.update(this.source_group_id,{parent_subcircuit_id})}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,groupProps2=props,hasOutline=groupProps2.outline&&groupProps2.outline.length>0,numericOutline=hasOutline?groupProps2.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})):void 0,ctx=this.props,anchorPosition=this._getGlobalPcbPositionBeforeLayout(),center2=computeCenterFromAnchorPosition(anchorPosition,ctx),pcb_group2=db2.pcb_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id??this.getSubcircuit()?.subcircuit_id,name:this.name,anchor_position:anchorPosition,center:center2,...hasOutline?{outline:numericOutline}:{width:0,height:0},pcb_component_ids:[],source_group_id:this.source_group_id,autorouter_configuration:props.autorouter?{trace_clearance:props.autorouter.traceClearance}:void 0,anchor_alignment:props.pcbAnchorAlignment??null});this.pcb_group_id=pcb_group2.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group2.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(){if(!this.pcb_group_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps,hasOutline=props.outline&&props.outline.length>0,hasExplicitPositioning=this._parsedProps.pcbX!==void 0||this._parsedProps.pcbY!==void 0;if(hasOutline){let numericOutline=props.outline.map(point6=>({x:distance.parse(point6.x),y:distance.parse(point6.y)})),outlineBounds=getBoundsFromPoints(numericOutline);if(!outlineBounds)return;let centerX2=(outlineBounds.minX+outlineBounds.maxX)/2,centerY2=(outlineBounds.minY+outlineBounds.maxY)/2,center22=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX2,y:centerY2}:{x:centerX2,y:centerY2};db2.pcb_group.update(this.pcb_group_id,{center:center22});return}let bounds=getBoundsOfPcbComponents(this.children),width=bounds.width,height=bounds.height,centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2;if(this.isSubcircuit){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let center2=hasExplicitPositioning?db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY}:{x:centerX,y:centerY};db2.pcb_group.update(this.pcb_group_id,{width:Number(props.width??width),height:Number(props.height??height),center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a360,_b2;return(_a360=this.unnamedElementCounter)[_b2=elm.lowercaseComponentName]??(_a360[_b2]=1),`unnamed_${elm.lowercaseComponentName}${this.unnamedElementCounter[elm.lowercaseComponentName]++}`}_resolvePcbPadding(){let props=this._parsedProps,layout=props.pcbLayout,getPaddingValue=key=>{let layoutValue=layout?.[key],propsValue=props[key];if(typeof layoutValue=="number")return layoutValue;if(typeof propsValue=="number")return propsValue},generalPadding=getPaddingValue("padding")??0,paddingX=getPaddingValue("paddingX"),paddingY=getPaddingValue("paddingY"),padLeft=getPaddingValue("paddingLeft")??paddingX??generalPadding,padRight=getPaddingValue("paddingRight")??paddingX??generalPadding,padTop=getPaddingValue("paddingTop")??paddingY??generalPadding,padBottom=getPaddingValue("paddingBottom")??paddingY??generalPadding;return{padLeft,padRight,padTop,padBottom}}doInitialCreateTraceHintsFromProps(){let{_parsedProps:props}=this,{db:db2}=this.root,groupProps2=props;if(!this.isSubcircuit)return;let manualTraceHints=groupProps2.manualEdits?.manual_trace_hints;if(manualTraceHints)for(let manualTraceHint of manualTraceHints)this.add(new TraceHint({for:manualTraceHint.pcb_port_selector,offsets:manualTraceHint.offsets}))}doInitialSourceAddConnectivityMapKey(){Group_doInitialSourceAddConnectivityMapKey(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this.selectAll("group").filter(g7=>g7.isSubcircuit);for(let subcircuitChild of subcircuitChildren)if(subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_shouldRouteAsync(){let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_hasTracesToRoute(){let debug112=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),traces=this.selectAll("trace");return debug112(`[${this.getString()}] has ${traces.length} traces to route`),traces.length>0}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug112=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug112("fetching",url2),options.headers&&(options.headers["Tscircuit-Core-Version"]=this.root?.getCoreVersion()),fetch(url2,options)),pcbAndSourceCircuitJson=this.root.db.toArray().filter(element=>element.type.startsWith("source_")||element.type.startsWith("pcb_"));if(serverMode==="solve-endpoint"){if(this.props.autorouter?.inputFormat==="simplified"){let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id}).simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result2,this._markDirty("PcbTraceRender");return}let{autorouting_result}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult=autorouting_result,this._markDirty("PcbTraceRender");return}let{autorouting_job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/create`,{method:"POST",body:JSON.stringify({input_circuit_json:pcbAndSourceCircuitJson,provider:"freerouting",autostart:!0,display_name:this.root?.name,subcircuit_id:this.subcircuit_id,server_cache_enabled:autorouterConfig2.serverCacheEnabled}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());for(;;){let{autorouting_job:job}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());if(job.is_finished){let{autorouting_job_output}=await fetchWithDebug(`${serverUrl}/autorouting/jobs/get_output`,{method:"POST",body:JSON.stringify({autorouting_job_id:autorouting_job.autorouting_job_id}),headers:{"Content-Type":"application/json"}}).then(r4=>r4.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err=new AutorouterError(`Autorouting job failed: ${JSON.stringify(job.error)}`);throw db2.pcb_autorouting_error.insert({pcb_error_id:autorouting_job.autorouting_job_id,error_type:"pcb_autorouting_error",message:err.message}),err}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug112=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug112(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:this.props.autorouter?.minTraceWidth??.15,nominalTraceWidth:this.props.nominalTraceWidth,subcircuit_id:this.subcircuit_id});if(isAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,autorouterConfig2.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=autorouterConfig2.availableJumperTypes)),debug112.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug112.enabled){let graphicsObject=qn2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),simpleRouteJson});let autorouter;if(autorouterConfig2.algorithmFn)autorouter=await autorouterConfig2.algorithmFn(simpleRouteJson);else{let autorouterVersion2=this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0;autorouter=new TscircuitAutorouter(simpleRouteJson,{capacityDepth:this.props.autorouter?.capacityDepth,targetMinCapacity:this.props.autorouter?.targetMinCapacity,useAssignableSolver:isLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:isAutoJumperPreset,autorouterVersion:autorouterVersion2,effort,onSolverStarted:({solverName,solverParams})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,componentName:this.getString()})})}let routingPromise=new Promise((resolve,reject)=>{autorouter.on("complete",event=>{debug112(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),autorouter.on("error",event=>{debug112(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});autorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...event})}),autorouter.start();try{let traces=await routingPromise;if(autorouter.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let outputJumpers=[],solver=autorouter.solver;solver?.getOutputJumpers&&(outputJumpers=solver.getOutputJumpers()||[]),this._asyncAutoroutingResult={output_pcb_traces:traces,output_jumpers:outputJumpers},this._markDirty("PcbTraceRender")}catch(error){let{db:db22}=this.root;throw db22.pcb_autorouting_error.insert({pcb_error_id:`pcb_autorouter_error_subcircuit_${this.subcircuit_id}`,error_type:"pcb_autorouting_error",message:error instanceof Error?error.message:String(error)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),error:{message:error instanceof Error?error.message:String(error)},simpleRouteJson}),error}finally{autorouter.stop()}}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("capacity-mesh-autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(this.isSubcircuit&&!this.root?.pcbDisabled&&!(this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))&&!this._isInflatedFromCircuitJson&&!this._shouldUseTraceByTraceRouting()){if(!this._areChildSubcircuitsRouted()){debug112(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}debug112(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),this._hasTracesToRoute()&&this._startAsyncAutorouting()}}doInitialSchematicTraceRender(){Group_doInitialSchematicTraceRender(this)}updatePcbTraceRender(){let debug112=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug112(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson)return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){this._areChildSubcircuitsRouted()&&(debug112(`[${this.getString()}] child subcircuits are now routed, starting async autorouting`),this._startAsyncAutorouting());return}if(!this._asyncAutoroutingResult||this._shouldUseTraceByTraceRouting())return;let{db:db2}=this.root;if(this._asyncAutoroutingResult.output_simple_route_json){debug112(`[${this.getString()}] updating PCB traces from simple route json (${this._asyncAutoroutingResult.output_simple_route_json.traces?.length} traces)`),this._updatePcbTraceRenderFromSimpleRouteJson();return}if(this._asyncAutoroutingResult.output_pcb_traces){debug112(`[${this.getString()}] updating PCB traces from ${this._asyncAutoroutingResult.output_pcb_traces.length} traces`),this._updatePcbTraceRenderFromPcbTraces();return}}_updatePcbTraceRenderFromSimpleRouteJson(){let{db:db2}=this.root,{traces:routedTraces}=this._asyncAutoroutingResult.output_simple_route_json;if(routedTraces)for(let routedTrace of routedTraces){let pcb_trace2=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:routedTrace.route})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2);output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id});for(let pcb_trace2 of output_pcb_traces){if(pcb_trace2.type!=="pcb_trace")continue;if(pcb_trace2.subcircuit_id=this.subcircuit_id,pcb_trace2.connection_name){let sourceTraceId=pcb_trace2.connection_name;pcb_trace2.source_trace_id=sourceTraceId}let segments=splitPcbTracesOnJumperSegments(pcb_trace2.route);segments===null&&(segments=[pcb_trace2.route]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)segment2.length>0&&db2.pcb_trace.insert({...pcb_trace2,route:segment2})}for(let pcb_trace2 of output_pcb_traces)if(pcb_trace2.type!=="pcb_via"&&pcb_trace2.type==="pcb_trace")for(let point6 of pcb_trace2.route)point6.route_type==="via"&&db2.pcb_via.insert({pcb_trace_id:pcb_trace2.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:[point6.from_layer,point6.to_layer],from_layer:point6.from_layer,to_layer:point6.to_layer})}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group2=db2.schematic_group.insert({is_subcircuit:this.isSubcircuit,subcircuit_id:this.subcircuit_id,name:this.name,center:this._getGlobalSchematicPositionBeforeLayout(),width:0,height:0,schematic_component_ids:[],source_group_id:this.source_group_id,show_as_schematic_box:props.showAsSchematicBox??!1});this.schematic_group_id=schematic_group2.schematic_group_id;for(let child of this.children)child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group2.schematic_group_id})}_getSchematicLayoutMode(){let props=this._parsedProps,schAutoLayoutEnabled=props.schAutoLayoutEnabled??!1;if(props.schLayout?.layoutMode==="none"||props.schLayout?.layoutMode==="relative")return"relative";if(props.schLayout?.matchAdapt)return"match-adapt";if(props.schLayout?.flex)return"flex";if(props.schLayout?.grid)return"grid";if(props.schMatchAdapt)return"match-adapt";if(props.schFlex)return"flex";if(props.schGrid)return"grid";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";if(props.relative||props.schRelative)return"relative";let anyLayoutChildHasSchCoords=this.children.some(child=>{let cProps=child._parsedProps;return(child.source_component_id!==null||child.source_group_id!==null)&&(cProps?.schX!==void 0||cProps?.schY!==void 0)}),hasManualEdits=(props.manualEdits?.schematic_placements?.length??0)>0;return schAutoLayoutEnabled&&!hasManualEdits||!anyLayoutChildHasSchCoords&&!hasManualEdits?"match-adapt":"relative"}doInitialSchematicLayout(){let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutMatchAdapt(){Group_doInitialSchematicLayoutMatchAdapt(this)}_doInitialSchematicLayoutMatchpack(){Group_doInitialSchematicLayoutMatchPack(this)}_doInitialSchematicLayoutGrid(){Group_doInitialSchematicLayoutGrid(this)}_doInitialSchematicLayoutFlex(){Group_doInitialSchematicLayoutFlex(this)}_getPcbLayoutMode(){let props=this._parsedProps,rawProps=this.props;if(this._isInflatedFromCircuitJson||props.pcbRelative)return"none";if(props.pcbLayout?.matchAdapt)return"match-adapt";if(props.pcbLayout?.flex)return"flex";if(props.pcbLayout?.grid)return"grid";if(props.pcbLayout?.pack)return"pack";if(props.pcbFlex)return"flex";if(props.pcbGrid)return"grid";if(props.pcbPack||props.pack)return"pack";if(props.matchAdapt)return"match-adapt";if(props.flex)return"flex";if(props.grid)return"grid";let groupHasCoords=props.pcbX!==void 0||props.pcbY!==void 0||props.pcbLeftEdgeX!==void 0||props.pcbRightEdgeX!==void 0||props.pcbTopEdgeY!==void 0||props.pcbBottomEdgeY!==void 0||rawProps.pcbLeftEdgeX!==void 0||rawProps.pcbRightEdgeX!==void 0||rawProps.pcbTopEdgeY!==void 0||rawProps.pcbBottomEdgeY!==void 0,hasManualEdits=(props.manualEdits?.pcb_placements?.length??0)>0,unpositionedDirectChildrenCount=this.children.reduce((count,child)=>{if(!child.pcb_component_id&&!child.pcb_group_id)return count;let childProps=child._parsedProps,rawChildProps=child.props,hasCoords=childProps?.pcbX!==void 0||childProps?.pcbY!==void 0||childProps?.pcbLeftEdgeX!==void 0||childProps?.pcbRightEdgeX!==void 0||childProps?.pcbTopEdgeY!==void 0||childProps?.pcbBottomEdgeY!==void 0||rawChildProps?.pcbLeftEdgeX!==void 0||rawChildProps?.pcbRightEdgeX!==void 0||rawChildProps?.pcbTopEdgeY!==void 0||rawChildProps?.pcbBottomEdgeY!==void 0;return count+(hasCoords?0:1)},0);return!hasManualEdits&&unpositionedDirectChildrenCount>1?"pack":"none"}doInitialPcbLayout(){if(this.root?.pcbDisabled)return;if(this.pcb_group_id){let{db:db2}=this.root,props=this._parsedProps;if(props.pcbX!==void 0||props.pcbY!==void 0){let parentGroup=this.parent?.getGroup?.(),pcbParentGroupId=parentGroup?.pcb_group_id?db2.pcb_group.get(parentGroup.pcb_group_id)?.pcb_group_id:void 0,positionedRelativeToBoardId=pcbParentGroupId?void 0:this._getBoard()?.pcb_board_id??void 0;db2.pcb_group.update(this.pcb_group_id,{position_mode:"relative_to_group_anchor",positioned_relative_to_pcb_group_id:pcbParentGroupId,positioned_relative_to_pcb_board_id:positionedRelativeToBoardId,display_offset_x:props.pcbX,display_offset_y:props.pcbY})}}let pcbLayoutMode=this._getPcbLayoutMode();pcbLayoutMode==="grid"?this._doInitialPcbLayoutGrid():pcbLayoutMode==="pack"?this._doInitialPcbLayoutPack():pcbLayoutMode==="flex"&&this._doInitialPcbLayoutFlex()}_doInitialPcbLayoutGrid(){Group_doInitialPcbLayoutGrid(this)}_doInitialPcbLayoutPack(){Group_doInitialPcbLayoutPack(this)}_doInitialPcbLayoutFlex(){Group_doInitialPcbLayoutFlex(this)}_insertSchematicBorder(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!props.border)return;let width=typeof props.schWidth=="number"?props.schWidth:void 0,height=typeof props.schHeight=="number"?props.schHeight:void 0,paddingGeneral=typeof props.schPadding=="number"?props.schPadding:0,paddingLeft=typeof props.schPaddingLeft=="number"?props.schPaddingLeft:paddingGeneral,paddingRight=typeof props.schPaddingRight=="number"?props.schPaddingRight:paddingGeneral,paddingTop=typeof props.schPaddingTop=="number"?props.schPaddingTop:paddingGeneral,paddingBottom=typeof props.schPaddingBottom=="number"?props.schPaddingBottom:paddingGeneral,schematicGroup=this.schematic_group_id?db2.schematic_group.get(this.schematic_group_id):null;if(schematicGroup&&(width===void 0&&typeof schematicGroup.width=="number"&&(width=schematicGroup.width),height===void 0&&typeof schematicGroup.height=="number"&&(height=schematicGroup.height)),width===void 0||height===void 0)return;let center2=schematicGroup?.center??this._getGlobalSchematicPositionBeforeLayout(),left=center2.x-width/2-paddingLeft,bottom=center2.y-height/2-paddingBottom,finalWidth=width+paddingLeft+paddingRight,finalHeight=height+paddingTop+paddingBottom;db2.schematic_box.insert({width:finalWidth,height:finalHeight,x:left,y:bottom,is_dashed:props.border?.dashed??!1})}_determineSideFromPosition(port,component){if(!port.center||!component.center)return"left";let dx3=port.center.x-component.center.x,dy3=port.center.y-component.center.y;return Math.abs(dx3)>Math.abs(dy3)?dx3>0?"right":"left":dy3>0?"bottom":"top"}_calculateSchematicBounds(boxes){if(boxes.length===0)return{minX:0,maxX:0,minY:0,maxY:0};let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0;for(let box2 of boxes)minX=Math.min(minX,box2.centerX),maxX=Math.max(maxX,box2.centerX),minY=Math.min(minY,box2.centerY),maxY=Math.max(maxY,box2.centerY);let padding=2;return{minX:minX-padding,maxX:maxX+padding,minY:minY-padding,maxY:maxY+padding}}_getAutorouterConfig(){let autorouter=this._parsedProps.autorouter||this.getInheritedProperty("autorouter");return getPresetAutoroutingConfig(autorouter)}_isLaserPrefabAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="laser_prefab"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="laser_prefab":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="laser_prefab":!1}_isAutoJumperAutorouter(autorouterConfig2=this._getAutorouterConfig()){let autorouterProp2=this.props.autorouter,normalize3=value=>value?.replace(/-/g,"_")??value;return autorouterConfig2.preset==="auto_jumper"?!0:typeof autorouterProp2=="string"?normalize3(autorouterProp2)==="auto_jumper":typeof autorouterProp2=="object"&&autorouterProp2?normalize3(autorouterProp2.preset)==="auto_jumper":!1}_getSubcircuitLayerCount(){let layers=this.getInheritedProperty("layers");return typeof layers=="number"?layers:2}_shouldUseTraceByTraceRouting(){return this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let subcircuitComponentsByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=subcircuitComponentsByName.get(child._parsedProps.name)||[];components.push(child),subcircuitComponentsByName.set(child._parsedProps.name,components)}for(let[name,components]of subcircuitComponentsByName.entries())components.length>1&&db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message:`Multiple components found with name "${name}" in subcircuit "${this.name||"unnamed"}". Component names must be unique within a subcircuit.`,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled||!this.isSubcircuit)return;let{db:db2}=this.root,subtree=db2;for(let nl3 of subtree.schematic_net_label.list()){let net=subtree.source_net.get(nl3.source_net_id),text=nl3.text||net?.name||"";if(nl3.anchor_side==="top"&&/^gnd/i.test(text)){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&/^v/i.test(text)&&subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_up"})}}doInitialSimulationSpiceEngineRender(){Group_doInitialSimulationSpiceEngineRender(this)}doInitialPcbComponentAnchorAlignment(){Group_doInitialPcbComponentAnchorAlignment(this)}updatePcbComponentAnchorAlignment(){this.doInitialPcbComponentAnchorAlignment()}doInitialPcbCalcPlacementResolution(){Group_doInitialPcbCalcPlacementResolution(this)}updatePcbCalcPlacementResolution(){this.doInitialPcbCalcPlacementResolution()}_getMinimumFlexContainerSize(){return super._getMinimumFlexContainerSize()}_repositionOnPcb(position2){return super._repositionOnPcb(position2)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{subcircuit,groupsMap}=inflatorContext,group=new Group6({name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`});return group.source_group_id=sourceGroup.source_group_id,groupsMap&&groupsMap.set(sourceGroup.source_group_id,group),sourceGroup.parent_source_group_id&&groupsMap?.has(sourceGroup.parent_source_group_id)?groupsMap.get(sourceGroup.parent_source_group_id).add(group):subcircuit.add(group),group}var Inductor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Inductor",schematicSymbolName:this.props.symbolName??"inductor",zodProps:inductorProps,sourceFtype:FTYPE.simple_inductor}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.inductance)}H`}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_inductor,inductance:this.props.inductance,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceInductor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),inductor=new Inductor({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:inductor});footprint&&inductor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(inductor):subcircuit.add(inductor)}function inflateSourcePort(sourcePort,inflatorContext){let{injectionDb,subcircuit}=inflatorContext;if(sourcePort.source_component_id!==null)return;let pcbPortFromInjection=injectionDb.pcb_port.getWhere({source_port_id:sourcePort.source_port_id}),port=new Port({name:sourcePort.name,pinNumber:sourcePort.pin_number});subcircuit.add(port),port.source_port_id=sourcePort.source_port_id;let root=subcircuit.root;if(root&&pcbPortFromInjection){let{db:db2}=root,pcb_port2=db2.pcb_port.insert({pcb_component_id:void 0,layers:pcbPortFromInjection.layers,subcircuit_id:subcircuit.subcircuit_id??void 0,pcb_group_id:subcircuit.getGroup()?.pcb_group_id??void 0,x:pcbPortFromInjection.x,y:pcbPortFromInjection.y,source_port_id:sourcePort.source_port_id,is_board_pinout:!1});port.pcb_port_id=pcb_port2.pcb_port_id}}var Resistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"_adjustSilkscreenTextAutomatically",!0)}get config(){return{componentName:"Resistor",schematicSymbolName:this.props.symbolName??"boxresistor",zodProps:resistorProps,sourceFtype:"simple_resistor"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.resistance)}\u03A9`}doInitialCreateNetsFromProps(){this._createNetsFromProps([this.props.pullupFor,this.props.pullupTo,this.props.pulldownFor,this.props.pulldownTo,...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this.props.pullupFor&&this.props.pullupTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace3({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pulldownTo}))),this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_resistor",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,resistance:props.resistance,display_resistance:this._getSchematicSymbolDisplayValue(),are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceResistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),resistor=new Resistor({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:resistor});footprint&&resistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(resistor):subcircuit.add(resistor)}function pcbTraceRouteToPcbPath(route){if(route.length<=2)return[];let firstPoint=route[0],lastPoint=route[route.length-1];return route.slice(1,-1).filter(point6=>{let isSameAsFirst=point6.x===firstPoint.x&&point6.y===firstPoint.y,isSameAsLast=point6.x===lastPoint.x&&point6.y===lastPoint.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>point6.route_type==="via"?{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer}:{x:point6.x,y:point6.y})}var getSelectorPath=(component,inflatorContext)=>{let{injectionDb,subcircuit,groupsMap}=inflatorContext,path_parts=[],currentGroupId=component.source_group_id;for(;currentGroupId&¤tGroupId!==subcircuit.source_group_id;){let sourceGroup=injectionDb.source_group.get(currentGroupId),groupInstance=groupsMap?.get(currentGroupId);if(!sourceGroup||!groupInstance)break;let groupName=groupInstance.props.name??groupInstance.fallbackUnassignedName;path_parts.unshift(`.${groupName}`),currentGroupId=sourceGroup.parent_source_group_id}return path_parts.push(`.${component.name}`),path_parts.join(" > ")};function inflateSourceTrace(sourceTrace,inflatorContext){let{injectionDb,subcircuit}=inflatorContext,connectedSelectors=[];for(let sourcePortId of sourceTrace.connected_source_port_ids){let sourcePort=injectionDb.source_port.get(sourcePortId);if(!sourcePort)continue;let selector;if(sourcePort.source_component_id){let sourceComponent=injectionDb.source_component.get(sourcePort.source_component_id);sourceComponent&&(selector=`${getSelectorPath({name:sourceComponent.name,source_group_id:sourceComponent.source_group_id},inflatorContext)} > .${sourcePort.name}`)}else selector=`.${sourcePort.name}`;selector&&connectedSelectors.push(selector)}for(let sourceNetId of sourceTrace.connected_source_net_ids){let sourceNet=injectionDb.source_net.get(sourceNetId);sourceNet&&connectedSelectors.push(`net.${sourceNet.name}`)}if(connectedSelectors.length<2)return;let pcbTrace=injectionDb.pcb_trace.getWhere({source_trace_id:sourceTrace.source_trace_id}),pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt4=>pt4.route_type==="wire");wirePoint&&wirePoint.route_type==="wire"&&(traceWidth=wirePoint.width)}let traceProps2={path:connectedSelectors};traceWidth!==void 0&&(traceProps2.thickness=traceWidth),pcbPath2&&pcbPath2.length>0?traceProps2.pcbPath=pcbPath2:pcbTrace&&(traceProps2.pcbStraightLine=!0);let trace=new Trace3(traceProps2);subcircuit.add(trace)}var Transistor=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"emitter",this.portMap.pin1);__publicField(this,"collector",this.portMap.pin2);__publicField(this,"base",this.portMap.pin3)}get config(){let baseSymbolName=this.props.type==="npn"?"npn_bipolar_transistor":"pnp_bipolar_transistor";return{componentName:"Transistor",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:transistorProps,sourceFtype:"simple_transistor",shouldRenderAsSchematicBox:!1}}initPorts(){let pinAliases={pin1:["collector","c"],pin2:["emitter","e"],pin3:["base","b"]};super.initPorts({pinCount:3,additionalAliases:pinAliases})}doInitialCreateNetsFromProps(){this._createNetsFromProps([...this._getNetsFromConnectionsProp()])}doInitialCreateTracesFromProps(){this._createTracesFromConnectionsProp()}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_transistor",name:this.name,transistor_type:props.type,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceTransistor(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),cadElm=injectionDb.cad_component.getWhere({source_component_id:sourceElm.source_component_id}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX:pcbElm?.center?.x,pcbY:pcbElm?.center?.y,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:transistor});footprint&&transistor.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(transistor):subcircuit.add(transistor)}function inflateStandalonePcbPrimitives(inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,standalonePrimitiveTypes=["pcb_silkscreen_rect","pcb_silkscreen_circle","pcb_silkscreen_line","pcb_silkscreen_path","pcb_silkscreen_text","pcb_fabrication_note_text","pcb_fabrication_note_path","pcb_fabrication_note_rect","pcb_note_text","pcb_note_rect","pcb_note_path","pcb_note_line"],standalonePrimitives=injectionDb.toArray().filter(elm=>standalonePrimitiveTypes.includes(elm.type)&&"pcb_component_id"in elm&&(elm.pcb_component_id===null||elm.pcb_component_id===void 0));if(standalonePrimitives.length===0)return;let components=createComponentsFromCircuitJson({componentName:"",componentRotation:"0deg"},standalonePrimitives);for(let component of components)subcircuit.add(component)}var inflateCircuitJson=(target,circuitJson,children)=>{if(!circuitJson)return;let injectionDb=cju_default(circuitJson);if(circuitJson&&children?.length>0)throw new Error("Component cannot have both circuitJson and children");let inflationCtx={injectionDb,subcircuit:target,groupsMap:new Map},sourceGroups=injectionDb.source_group.list(),renderedGroupIds=new Set,groupsToRender=[...sourceGroups];for(;groupsToRender.length>0;){let groupIndex=groupsToRender.findIndex(g7=>!g7.parent_source_group_id||renderedGroupIds.has(g7.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g7=>g7.source_group_id).join(", ");throw new Error(`Cannot inflate source_groups: cyclic dependency or missing parent detected. Remaining groups: ${remainingIds}`)}let groupToRender=groupsToRender[groupIndex];inflateSourceGroup(groupToRender,inflationCtx),renderedGroupIds.add(groupToRender.source_group_id),groupsToRender.splice(groupIndex,1)}let pcbBoards=injectionDb.pcb_board.list();for(let pcbBoard of pcbBoards)inflatePcbBoard(pcbBoard,inflationCtx);let sourceComponents=injectionDb.source_component.list();for(let sourceComponent of sourceComponents)switch(sourceComponent.ftype){case"simple_resistor":inflateSourceResistor(sourceComponent,inflationCtx);break;case"simple_capacitor":inflateSourceCapacitor(sourceComponent,inflationCtx);break;case"simple_inductor":inflateSourceInductor(sourceComponent,inflationCtx);break;case"simple_diode":inflateSourceDiode(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;default:throw new Error(`No inflator implemented for source component ftype: "${sourceComponent.ftype}"`)}let sourcePorts=injectionDb.source_port.list();for(let sourcePort of sourcePorts)inflateSourcePort(sourcePort,inflationCtx);let sourceTraces=injectionDb.source_trace.list();for(let sourceTrace of sourceTraces)inflateSourceTrace(sourceTrace,inflationCtx);inflateStandalonePcbPrimitives(inflationCtx)},package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1136",types:"dist/index.d.ts",main:"dist/index.js",module:"dist/index.js",exports:{".":{import:"./dist/index.js",types:"./dist/index.d.ts"}},files:["dist"],repository:{type:"git",url:"https://github.com/tscircuit/core"},scripts:{build:"tsup-node index.ts --format esm --dts",format:"biome format . --write","measure-bundle":"howfat -r table .","pkg-pr-new-release":"bunx pkg-pr-new publish --comment=off --peerDeps","smoke-test:dist":"bun run scripts/smoke-tests/test-dist-simple-circuit.tsx","build:benchmarking":"bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist","build:benchmarking:watch":`chokidar "./{benchmarking,lib}/**/*.{ts,tsx}" -c 'bun build --experimental-html ./benchmarking/website/index.html --outdir ./benchmarking-dist'`,"start:benchmarking":'concurrently "bun run build:benchmarking:watch" "live-server ./benchmarking-dist"',"generate-test-plan":"bun run scripts/generate-test-plan.ts"},devDependencies:{"@biomejs/biome":"^1.8.3","@resvg/resvg-js":"^2.6.2","@tscircuit/alphabet":"0.0.25","@tscircuit/capacity-autorouter":"^0.0.400","@tscircuit/checks":"0.0.115","@tscircuit/circuit-json-util":"^0.0.90","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.20","@tscircuit/footprinter":"^0.0.333","@tscircuit/infer-cable-insertion-point":"^0.0.2","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.16","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.8","@tscircuit/props":"^0.0.502","@tscircuit/schematic-match-adapt":"^0.0.16","@tscircuit/schematic-trace-solver":"^v0.0.45","@tscircuit/solver-utils":"^0.0.3","@tscircuit/soup-util":"^0.0.41","@types/bun":"^1.2.16","@types/debug":"^4.1.12","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/react-reconciler":"^0.28.9","bpc-graph":"^0.0.57","bun-match-svg":"0.0.12","calculate-elbow":"^0.0.12","chokidar-cli":"^3.0.0","circuit-json":"^0.0.403","circuit-json-to-bpc":"^0.0.13","circuit-json-to-connectivity-map":"^0.0.23","circuit-json-to-gltf":"^0.0.91","circuit-json-to-simple-3d":"^0.0.9","circuit-json-to-spice":"^0.0.34","circuit-to-svg":"^0.0.337",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6","eecircuit-engine":"^1.5.6",flatbush:"^4.5.0","graphics-debug":"^0.0.89",howfat:"^0.3.8","live-server":"^1.2.2","looks-same":"^9.0.1",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.16",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.208",spicey:"^0.0.14","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/footprinter":"*","@tscircuit/infgrid-ijump-astar":"*","@tscircuit/math-utils":"*","@tscircuit/props":"*","@tscircuit/schematic-match-adapt":"*","circuit-json-to-bpc":"*","bpc-graph":"*","@tscircuit/matchpack":"*","circuit-json":"*","circuit-json-to-connectivity-map":"*","schematic-symbols":"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-packing":"0.0.68","css-select":"5.1.0","format-si-unit":"^0.0.3",nanoid:"^5.0.7","performance-now":"^2.1.0","react-reconciler":"^0.32.0","svg-path-commander":"^2.1.11","transformation-matrix":"^2.16.1",zod:"^3.25.67"}},IsolatedCircuit=class{constructor({platform,projectUrl,cachedSubcircuits,pendingSubcircuitRenders}={}){__publicField(this,"firstChild",null);__publicField(this,"children");__publicField(this,"db");__publicField(this,"root",null);__publicField(this,"isRootCircuit",!1);__publicField(this,"cachedSubcircuits");__publicField(this,"pendingSubcircuitRenders");__publicField(this,"_schematicDisabledOverride");__publicField(this,"pcbDisabled",!1);__publicField(this,"pcbRoutingDisabled",!1);__publicField(this,"_featureMspSchematicTraceRouting",!0);__publicField(this,"name");__publicField(this,"platform");__publicField(this,"projectUrl");__publicField(this,"_hasRenderedAtleastOnce",!1);__publicField(this,"_asyncEffectIdsByPhase",new Map);__publicField(this,"_asyncEffectPhaseById",new Map);__publicField(this,"_runningAsyncEffectsById",new Map);__publicField(this,"_eventListeners",{});this.children=[],this.db=su2([]),this.platform=platform,this.projectUrl=projectUrl,this.pcbDisabled=platform?.pcbDisabled??!1,this.pcbRoutingDisabled=platform?.routingDisabled??!1,this.cachedSubcircuits=cachedSubcircuits,this.pendingSubcircuitRenders=pendingSubcircuitRenders,this.root=this}get schematicDisabled(){return this._schematicDisabledOverride!==void 0?this._schematicDisabledOverride:this.platform?.schematicDisabled!==void 0?this.platform.schematicDisabled:this._getBoard()?._parsedProps?.schematicDisabled??!1}set schematicDisabled(value){this._schematicDisabledOverride=value}add(componentOrElm){let component;(0,import_react4.isValidElement)(componentOrElm)?component=createInstanceFromReactElement(componentOrElm):component=componentOrElm,this.children.push(component)}setPlatform(platform){this.platform={...this.platform,...platform},platform.pcbDisabled!==void 0&&(this.pcbDisabled=platform.pcbDisabled),platform.routingDisabled!==void 0&&(this.pcbRoutingDisabled=platform.routingDisabled)}_getBoard(){let directBoard=this.children.find(c3=>c3.componentName==="Board");if(directBoard)return directBoard}_guessRootComponent(){if(this.firstChild)return;if(this.children.length===0)throw new Error("Not able to guess root component: IsolatedCircuit has no children (use circuit.add(...))");let panels=this.children.filter(child=>child.lowercaseComponentName==="panel");if(panels.length>1)throw new Error("Only one <panel> is allowed per circuit");if(panels.length===1){if(this.children.length!==1)throw new Error("<panel> must be the root element of the circuit");this.firstChild=panels[0];return}if(this.children.length===1&&this.children[0].isGroup){this.firstChild=this.children[0];return}let group=new Group6({subcircuit:!0});group.parent=this,group.addAll(this.children),this.children=[group],this.firstChild=group}render(){this.firstChild||this._guessRootComponent();let{firstChild,db:db2}=this;if(!firstChild)throw new Error("IsolatedCircuit has no root component");firstChild.parent=this,firstChild.runRenderCycle(),this._hasRenderedAtleastOnce=!0}async renderUntilSettled(){for(this.db.source_project_metadata.list()?.[0]||this.db.source_project_metadata.insert({software_used_string:`@tscircuit/core@${this.getCoreVersion()}`,...this.projectUrl?{project_url:this.projectUrl}:{}}),this.render();this._hasIncompleteAsyncEffects();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0?!0:this.children.some(child=>child._hasIncompleteAsyncEffects())}_hasIncompleteAsyncEffectsForPhase(phase){return(this._asyncEffectIdsByPhase.get(phase)?.size??0)>0}getRunningAsyncEffects(){return Array.from(this._runningAsyncEffectsById.values())}getCircuitJson(){return this._hasRenderedAtleastOnce||this.render(),this.db.toArray()}toJson(){return this.getCircuitJson()}async getSvg(options){let circuitToSvg=await Promise.resolve().then(()=>(init_dist8(),dist_exports3)).catch(e4=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
651
651
|
|
|
652
652
|
"${e4.message}"`)});if(options.view==="pcb")return circuitToSvg.convertCircuitJsonToPcbSvg(this.getCircuitJson());if(options.view==="schematic")return circuitToSvg.convertCircuitJsonToSchematicSvg(this.getCircuitJson());throw new Error(`Invalid view: ${options.view}`)}getCoreVersion(){let[major,minor,patch]=package_default3.version.split(".").map(Number);return`${major}.${minor}.${patch+1}`}async preview(previewNameOrOpts){let previewOpts=typeof previewNameOrOpts=="object"?previewNameOrOpts:{previewName:previewNameOrOpts};throw new Error("project.preview is not yet implemented")}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}selectAll(selector){return this._guessRootComponent(),this.firstChild?.selectAll(selector)??[]}selectOne(selector,opts){return this._guessRootComponent(),this.firstChild?.selectOne(selector,opts)??null}emit(event,...args){if(event==="asyncEffect:start"?this._registerAsyncEffectStart(args[0]):event==="asyncEffect:end"&&this._registerAsyncEffectEnd(args[0]),!!this._eventListeners[event])for(let listener of this._eventListeners[event])listener(...args)}on(event,listener){this._eventListeners[event]||(this._eventListeners[event]=[]),this._eventListeners[event].push(listener)}removeListener(event,listener){this._eventListeners[event]&&(this._eventListeners[event]=this._eventListeners[event].filter(l3=>l3!==listener))}enableDebug(debug112){typeof debug112=="string"?import_debug19.default.enable(debug112):(debug112===null||debug112===!1)&&import_debug19.default.disable()}getClientOrigin(){return typeof window<"u"&&window.location?window.location.origin:typeof self<"u"&&self.location?self.location.origin:""}_registerAsyncEffectStart(payload){if(!payload?.asyncEffectId||!payload.phase)return;let{asyncEffectId,phase}=payload,existingPhase=this._asyncEffectPhaseById.get(asyncEffectId);existingPhase&&existingPhase!==phase&&this._asyncEffectIdsByPhase.get(existingPhase)?.delete(asyncEffectId),this._asyncEffectIdsByPhase.has(phase)||this._asyncEffectIdsByPhase.set(phase,new Set),this._asyncEffectIdsByPhase.get(phase).add(asyncEffectId),this._asyncEffectPhaseById.set(asyncEffectId,phase),this._runningAsyncEffectsById.set(asyncEffectId,{asyncEffectId,effectName:payload.effectName,componentDisplayName:payload.componentDisplayName,phase,error:payload.error})}_registerAsyncEffectEnd(payload){if(!payload?.asyncEffectId)return;let{asyncEffectId}=payload,phase=this._asyncEffectPhaseById.get(asyncEffectId)??payload.phase;if(phase){let phaseSet=this._asyncEffectIdsByPhase.get(phase);phaseSet?.delete(asyncEffectId),phaseSet&&phaseSet.size===0&&this._asyncEffectIdsByPhase.delete(phase)}this._asyncEffectPhaseById.delete(asyncEffectId),this._runningAsyncEffectsById.delete(asyncEffectId)}};function Subcircuit_doInitialRenderIsolatedSubcircuits(subcircuit){if(!subcircuit._isIsolatedSubcircuit||subcircuit._isolatedCircuitJson||!subcircuit.getSubcircuitPropHash)return;let propHash=subcircuit.getSubcircuitPropHash(),cachedSubcircuits=subcircuit.root?.cachedSubcircuits,pendingSubcircuitRenders=subcircuit.root?.pendingSubcircuitRenders,cached=cachedSubcircuits?.get(propHash);if(cached){subcircuit._isolatedCircuitJson=cached,subcircuit.children=[],subcircuit._normalComponentNameMap=null;return}let childrenToRender=[...subcircuit.children];subcircuit.children=[],subcircuit._normalComponentNameMap=null;let parentRoot=subcircuit.root;subcircuit._queueAsyncEffect("render-isolated-subcircuit",async()=>{let cachedResult=cachedSubcircuits?.get(propHash);if(cachedResult){subcircuit._isolatedCircuitJson=cachedResult;return}let pendingRenderPromise=pendingSubcircuitRenders?.get(propHash);if(pendingRenderPromise){subcircuit._isolatedCircuitJson=await pendingRenderPromise;return}let resolveRender,rejectRender,renderPromise=new Promise((resolve,reject)=>{resolveRender=resolve,rejectRender=reject});pendingSubcircuitRenders?.set(propHash,renderPromise);try{let isolatedCircuit=new IsolatedCircuit({platform:{...parentRoot.platform,pcbDisabled:parentRoot.pcbDisabled,schematicDisabled:parentRoot.schematicDisabled},cachedSubcircuits,pendingSubcircuitRenders});for(let child of childrenToRender)isolatedCircuit.add(child);await isolatedCircuit.renderUntilSettled();let circuitJson=isolatedCircuit.getCircuitJson();cachedSubcircuits?.set(propHash,circuitJson),subcircuit._isolatedCircuitJson=circuitJson,resolveRender(circuitJson)}catch(error){throw rejectRender(error instanceof Error?error:new Error(String(error))),error}finally{pendingSubcircuitRenders?.delete(propHash)}})}var EXCLUDED_PROPS=new Set(["name","key","pcbX","pcbY","schX","schY","pcbLeftEdgeX","pcbRightEdgeX","pcbTopEdgeY","pcbBottomEdgeY","pcbRotation","schRotation"]);function safeSerialize(value,seen=new WeakSet){if(value===null)return"null";if(value===void 0)return"undefined";let type=typeof value;if(type==="string")return`"${value}"`;if(type==="number"||type==="boolean")return String(value);if(type==="function")return"[function]";if(type==="symbol")return"[symbol]";if(type==="object"){if(seen.has(value))return"[circular]";if(seen.add(value),value.$$typeof!==void 0){let elementType=typeof value.type=="string"?value.type:value.type?.name||"[component]",propsStr=value.props?safeSerialize(value.props,seen):"{}";return`ReactElement(${elementType},${propsStr})`}return Array.isArray(value)?`[${value.map(v5=>safeSerialize(v5,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k4=>`${k4}:${safeSerialize(value[k4],seen)}`).join(",")}}`}return String(value)}function getHashableProps(props){let result={},keys=Object.keys(props).sort();for(let key of keys)!EXCLUDED_PROPS.has(key)&&props[key]!==void 0&&(result[key]=props[key]);return result}function getChildrenHashData(children){return children.map(child=>({componentName:child.componentName,props:getHashableProps(child.props??{}),children:getChildrenHashData(child.children)}))}function fnv1aHash(str){let hash=2166136261;for(let i2=0;i2<str.length;i2++)hash^=str.charCodeAt(i2),hash=Math.imul(hash,16777619);return hash>>>0}function computeHash(data){let serialized=safeSerialize(data),hash1=fnv1aHash(serialized),hash2=fnv1aHash(serialized+hash1.toString());return hash1.toString(16).padStart(8,"0")+hash2.toString(16).padStart(8,"0")}function Subcircuit_getSubcircuitPropHash(subcircuit){let hashableData={props:getHashableProps(subcircuit.props??{}),children:getChildrenHashData(subcircuit.children)};return computeHash(hashableData)}var MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r4=Math.min(radius,w22,h22);if(r4<MIN_EFFECTIVE_BORDER_RADIUS_MM)return[{x:-w22,y:-h22},{x:w22,y:-h22},{x:w22,y:h22},{x:-w22,y:h22}];let segments=Math.max(1,Math.ceil(Math.PI/2*r4/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r4,y:-h22}),outline.push({x:w22-r4,y:-h22});for(let i2=1;i2<=segments;i2++){let theta=-Math.PI/2+i2*step;outline.push({x:w22-r4+r4*Math.cos(theta),y:-h22+r4+r4*Math.sin(theta)})}outline.push({x:w22,y:h22-r4});for(let i2=1;i2<=segments;i2++){let theta=0+i2*step;outline.push({x:w22-r4+r4*Math.cos(theta),y:h22-r4+r4*Math.sin(theta)})}outline.push({x:-w22+r4,y:h22});for(let i2=1;i2<=segments;i2++){let theta=Math.PI/2+i2*step;outline.push({x:-w22+r4+r4*Math.cos(theta),y:h22-r4+r4*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r4});for(let i2=1;i2<=segments;i2++){let theta=Math.PI+i2*step;outline.push({x:-w22+r4+r4*Math.cos(theta),y:-h22+r4+r4*Math.sin(theta)})}return outline},Board=class extends Group6{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"source_board_id",null);__publicField(this,"_drcChecksComplete",!1);__publicField(this,"_drcChecksInProgress",!1);__publicField(this,"_connectedSchematicPortPairs",new Set);__publicField(this,"_panelPositionOffset",null)}get isSubcircuit(){return!0}get isGroup(){return!0}get config(){return{componentName:"Board",zodProps:boardProps}}get boardThickness(){return this._parsedProps.thickness??1.4}get allLayers(){let layerCount=this._parsedProps.layers??2;return layerCount===1?["top"]:layerCount===4?["top","bottom","inner1","inner2"]:["top","bottom"]}_getSubcircuitLayerCount(){return this._parsedProps.layers??2}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??{a:1,b:0,c:0,d:1,e:0,f:0};return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getBoardCalcVariables(){let{_parsedProps:props}=this;if((props.width==null||props.height==null)&&!props.outline)return{};let dbBoard=this.pcb_board_id?this.root?.db.pcb_board.get(this.pcb_board_id):null,width=dbBoard?.width??props.width,height=dbBoard?.height??props.height;if((width==null||height==null)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}let{pcbX,pcbY}=this.getResolvedPcbPositionProp(),center2=dbBoard?.center??{x:pcbX+(props.outlineOffsetX??0),y:pcbY+(props.outlineOffsetY??0)},resolvedWidth=width??0,resolvedHeight=height??0;return{"board.minX":center2.x-resolvedWidth/2,"board.maxX":center2.x+resolvedWidth/2,"board.minY":center2.y-resolvedHeight/2,"board.maxY":center2.y+resolvedHeight/2}}doInitialPcbBoardAutoSize(){if(this.root?.pcbDisabled||!this.pcb_board_id)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcbBoard=db2.pcb_board.get(this.pcb_board_id);if(pcbBoard?.width&&pcbBoard?.height||pcbBoard?.outline&&pcbBoard.outline.length>0)return;let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0,descendantIds=getDescendantSubcircuitIds(db2,this.subcircuit_id),allowedSubcircuitIds=new Set([this.subcircuit_id,...descendantIds]),allPcbComponents=db2.pcb_component.list().filter(c3=>c3.subcircuit_id&&allowedSubcircuitIds.has(c3.subcircuit_id)),allPcbGroups=db2.pcb_group.list().filter(g7=>g7.subcircuit_id&&allowedSubcircuitIds.has(g7.subcircuit_id)),hasComponents=!1,updateBounds=(center22,width,height)=>{width===0||height===0||(hasComponents=!0,minX=Math.min(minX,center22.x-width/2),minY=Math.min(minY,center22.y-height/2),maxX=Math.max(maxX,center22.x+width/2),maxY=Math.max(maxY,center22.y+height/2))};for(let pcbComponent of allPcbComponents)updateBounds(pcbComponent.center,pcbComponent.width,pcbComponent.height);for(let pcbGroup of allPcbGroups){let width=pcbGroup.width??0,height=pcbGroup.height??0;if(pcbGroup.outline&&pcbGroup.outline.length>0){let bounds=getBoundsFromPoints(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x5,y:y5}=props.boardAnchorPosition;minX=Math.min(minX,x5),minY=Math.min(minY,y5),maxX=Math.max(maxX,x5),maxY=Math.max(maxY,y5)}let padding=2,computedWidth=hasComponents?maxX-minX+padding*2:0,computedHeight=hasComponents?maxY-minY+padding*2:0,center2={x:hasComponents?(minX+maxX)/2+(props.outlineOffsetX??0):(props.outlineOffsetX??0)+globalPos.x,y:hasComponents?(minY+maxY)/2+(props.outlineOffsetY??0):(props.outlineOffsetY??0)+globalPos.y},finalWidth=props.width??computedWidth,finalHeight=props.height??computedHeight,outline=props.outline;!outline&&props.borderRadius!=null&&finalWidth>0&&finalHeight>0&&(outline=getRoundedRectOutline(finalWidth,finalHeight,props.borderRadius));let update={width:finalWidth,height:finalHeight,center:center2};outline&&(update.outline=outline.map(point6=>({x:point6.x+(props.outlineOffsetX??0),y:point6.y+(props.outlineOffsetY??0)}))),db2.pcb_board.update(this.pcb_board_id,update)}updatePcbBoardAutoSize(){this.doInitialPcbBoardAutoSize()}_addBoardInformationToSilkscreen(){let platform=this.root?.platform;if(!platform?.printBoardInformationToSilkscreen)return;let pcbBoard=this.root.db.pcb_board.get(this.pcb_board_id);if(!pcbBoard)return;let boardInformation=[];if(platform.projectName&&boardInformation.push(platform.projectName),platform.version&&boardInformation.push(`v${platform.version}`),platform.url&&boardInformation.push(platform.url),boardInformation.length===0)return;let text=boardInformation.join(`
|
|
653
653
|
`),position2={x:pcbBoard.center.x+pcbBoard.width/2-.25,y:pcbBoard.center.y-pcbBoard.height/2+1};this.root.db.pcb_silkscreen_text.insert({pcb_component_id:this.pcb_board_id,layer:"top",font:"tscircuit2024",font_size:.45,text,ccw_rotation:0,anchor_alignment:"bottom_right",anchor_position:position2})}doInitialSourceRender(){let nestedBoard=this.getDescendants().find(d3=>d3.lowercaseComponentName==="board");if(nestedBoard)throw new Error(`Nested boards are not supported: found board "${nestedBoard.name}" inside board "${this.name}"`);super.doInitialSourceRender();let{db:db2}=this.root,source_board2=db2.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=source_board2.source_board_id}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,pcbBoardFromCircuitJson=props.circuitJson?.find(elm=>elm.type==="pcb_board"),computedWidth=props.width??pcbBoardFromCircuitJson?.width??0,computedHeight=props.height??pcbBoardFromCircuitJson?.height??0,globalPos=this._getGlobalPcbPositionBeforeLayout(),center2={x:globalPos.x+(props.outlineOffsetX??0),y:globalPos.y+(props.outlineOffsetY??0)},{boardAnchorPosition,boardAnchorAlignment}=props;if(boardAnchorPosition&&(center2=getBoardCenterFromAnchor({boardAnchorPosition,boardAnchorAlignment:boardAnchorAlignment??"center",width:computedWidth,height:computedHeight})),props.outline){let xValues=props.outline.map(point6=>point6.x),yValues=props.outline.map(point6=>point6.y),minX=Math.min(...xValues),maxX=Math.max(...xValues),minY=Math.min(...yValues),maxY=Math.max(...yValues);computedWidth=maxX-minX,computedHeight=maxY-minY}let outline=props.outline;!outline&&props.borderRadius!=null&&computedWidth>0&&computedHeight>0&&(outline=getRoundedRectOutline(computedWidth,computedHeight,props.borderRadius));let outlineTranslation={x:0,y:0};if(outline&&outline.length>0&&(this.parent?.lowercaseComponentName==="panel"||this.parent?.lowercaseComponentName==="subpanel")){let outlineBounds=getBoundsFromPoints(outline);if(outlineBounds){let outlineCenterX=(outlineBounds.minX+outlineBounds.maxX)/2,outlineCenterY=(outlineBounds.minY+outlineBounds.maxY)/2;outlineTranslation={x:center2.x-outlineCenterX,y:center2.y-outlineCenterY}}}let pcb_board2=db2.pcb_board.insert({source_board_id:this.source_board_id,center:center2,thickness:this.boardThickness,num_layers:this.allLayers.length,width:computedWidth,height:computedHeight,outline:outline?.map(point6=>({x:point6.x+(props.outlineOffsetX??0)+outlineTranslation.x,y:point6.y+(props.outlineOffsetY??0)+outlineTranslation.y})),material:props.material});this.pcb_board_id=pcb_board2.pcb_board_id,this._addBoardInformationToSilkscreen()}removePcbComponentRender(){let{db:db2}=this.root;this.pcb_board_id&&(db2.pcb_board.delete(this.pcb_board_id),this.pcb_board_id=null)}doInitialPcbDesignRuleChecks(){this.root?.pcbDisabled||(super.doInitialPcbDesignRuleChecks(),this.updatePcbDesignRuleChecks())}updatePcbDesignRuleChecks(){let{db:db2}=this.root,routingDisabled=this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"),pcbDisabled=this.root?.pcbDisabled,drcChecksDisabled=this.root?.platform?.drcChecksDisabled??this.getInheritedProperty("drcChecksDisabled"),netlistDrcChecksDisabled=this.root?.platform?.netlistDrcChecksDisabled??this.getInheritedProperty("netlistDrcChecksDisabled"),pinSpecificationDrcChecksDisabled=this.getInheritedProperty("pinSpecificationDrcChecksDisabled"),placementDrcChecksDisabled=this.root?.platform?.placementDrcChecksDisabled??this.getInheritedProperty("placementDrcChecksDisabled"),routingDrcChecksDisabled=this.root?.platform?.routingDrcChecksDisabled??this.getInheritedProperty("routingDrcChecksDisabled"),shouldRunNetlistChecks=!drcChecksDisabled&&!netlistDrcChecksDisabled,shouldRunPinSpecificationChecks=!drcChecksDisabled&&!pinSpecificationDrcChecksDisabled,shouldRunPlacementChecks=!drcChecksDisabled&&!pcbDisabled&&!placementDrcChecksDisabled,shouldRunRoutingChecks=!drcChecksDisabled&&!pcbDisabled&&!routingDisabled&&!routingDrcChecksDisabled;if(shouldRunRoutingChecks&&this._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender"))return;let hasTracesToRoute=this._hasTracesToRoute();if(shouldRunRoutingChecks&&hasTracesToRoute&&!this._areChildSubcircuitsRouted()||this._drcChecksComplete||this._drcChecksInProgress)return;let runDrcChecks=async circuitJson=>{let checksToRun=[];shouldRunRoutingChecks&&checksToRun.push(runAllRoutingChecks(circuitJson)),shouldRunPlacementChecks&&checksToRun.push(runAllPlacementChecks(circuitJson)),shouldRunNetlistChecks&&checksToRun.push(runAllNetlistChecks(circuitJson)),shouldRunPinSpecificationChecks&&checksToRun.push(runAllPinSpecificationChecks(circuitJson));let checkResults=await Promise.all(checksToRun);db2.insertAll(checkResults.flat())},subcircuitCircuitJson=db2.subtree({subcircuit_id:this.subcircuit_id}).toArray();this._drcChecksInProgress=!0,this._queueAsyncEffect("board:drc-checks",async()=>{try{await runDrcChecks(subcircuitCircuitJson),this._drcChecksComplete=!0}finally{this._drcChecksInProgress=!1}})}_emitRenderLifecycleEvent(phase,startOrEnd){super._emitRenderLifecycleEvent(phase,startOrEnd),startOrEnd==="start"&&this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase})}_repositionOnPcb(position2){let{db:db2}=this.root,pcbBoard=this.pcb_board_id?db2.pcb_board.get(this.pcb_board_id):null,oldPos=pcbBoard?.center;if(!oldPos){this.pcb_board_id&&db2.pcb_board.update(this.pcb_board_id,{center:position2});return}let deltaX=position2.x-oldPos.x,deltaY=position2.y-oldPos.y;if(!(Math.abs(deltaX)<1e-6&&Math.abs(deltaY)<1e-6)&&this.pcb_board_id&&(db2.pcb_board.update(this.pcb_board_id,{center:position2}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints(pcbBoard.outline);if(outlineBounds){let oldOutlineCenter={x:(outlineBounds.minX+outlineBounds.maxX)/2,y:(outlineBounds.minY+outlineBounds.maxY)/2},outlineDeltaX=position2.x-oldOutlineCenter.x,outlineDeltaY=position2.y-oldOutlineCenter.y,newOutline=pcbBoard.outline.map(p4=>({x:p4.x+outlineDeltaX,y:p4.y+outlineDeltaY}));db2.pcb_board.update(this.pcb_board_id,{outline:newOutline})}}}},Subcircuit=class extends Group6{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialInflateSubcircuitCircuitJson(){let isolatedJson=this._isolatedCircuitJson;if(isolatedJson){this._isInflatedFromCircuitJson=!0,this._isolatedCircuitJson=null,inflateCircuitJson(this,isolatedJson,[]);return}let{circuitJson,children}=this._parsedProps;circuitJson&&(this._isInflatedFromCircuitJson=!0),inflateCircuitJson(this,circuitJson,children)}},MountedBoard=class extends Subcircuit{constructor(){super(...arguments);__publicField(this,"pcb_board_id",null);__publicField(this,"_connectedSchematicPortPairs",new Set)}get config(){return{componentName:"MountedBoard",zodProps:mountedboardProps}}get boardThickness(){return 1.4}get allLayers(){return["top","bottom"]}_getBoardCalcVariables(){return this._findCarrierBoard()?._getBoardCalcVariables()??{}}_findCarrierBoard(){let current2=this.parent;for(;current2;){if(current2 instanceof Board)return current2;current2=current2.parent}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board2=db2.pcb_board.insert({center:{x:globalPos.x,y:globalPos.y},width:props.width??0,height:props.height??0,is_mounted_to_carrier_board:!0});this.pcb_board_id=pcb_board2.pcb_board_id}doInitialPcbBoardAutoSize(){if(!this.pcb_board_id||!this.root)return;let carrierBoard=this._findCarrierBoard();carrierBoard?.pcb_board_id&&this.root.db.pcb_board.update(this.pcb_board_id,{carrier_pcb_board_id:carrierBoard.pcb_board_id})}},DEFAULT_TAB_LENGTH=5,DEFAULT_TAB_WIDTH=2,generateCutoutsAndMousebitesForOutline=(outline,options)=>{let{gapLength,cutoutWidth,mouseBites,mouseBiteHoleDiameter,mouseBiteHoleSpacing}=options,tabCutouts=[],mouseBiteHoles=[];if(outline.length<2)return{tabCutouts,mouseBiteHoles};let outlinePolygon=new Polygon$1(outline.map(p4=>point4(p4.x,p4.y))),is_ccw;if(outline.length>2){let p02=point4(outline[0].x,outline[0].y),p12=point4(outline[1].x,outline[1].y),segmentDir=vector$1(p02,p12).normalize(),normalToLeft=segmentDir.rotate(Math.PI/2),testPoint=p02.translate(segmentDir.multiply(segment(p02,p12).length/2)).translate(normalToLeft.multiply(.01));is_ccw=outlinePolygon.contains(testPoint)}else is_ccw=outlinePolygon.area()>0;for(let i2=0;i2<outline.length;i2++){let p1_=outline[i2],p2_=outline[(i2+1)%outline.length];if(!p1_||!p2_)continue;let p12=point4(p1_.x,p1_.y),p22=point4(p2_.x,p2_.y),segment2=segment(p12,p22),segmentLength=segment2.length;if(segmentLength<1e-6)continue;let segmentVec=vector$1(p12,p22),segmentDir=segmentVec.normalize(),normalVec=segmentDir.rotate(Math.PI/2),testPoint=segment2.middle().translate(normalVec.multiply(.01));outlinePolygon.contains(testPoint)&&(normalVec=normalVec.multiply(-1));let numBitesInGap=2,totalBitesLength=numBitesInGap*mouseBiteHoleDiameter+(numBitesInGap-1)*mouseBiteHoleSpacing,effectiveGapLength;mouseBites?effectiveGapLength=totalBitesLength:effectiveGapLength=gapLength,effectiveGapLength=Math.min(effectiveGapLength,segmentLength*.9);let gapStartDist=(segmentLength-effectiveGapLength)/2,gapEndDist=gapStartDist+effectiveGapLength;if(mouseBites){let holeAndSpacing=mouseBiteHoleDiameter+mouseBiteHoleSpacing;if(effectiveGapLength>=totalBitesLength&&holeAndSpacing>0){let firstBiteCenterOffsetInGap=(effectiveGapLength-totalBitesLength)/2+mouseBiteHoleDiameter/2,firstBiteDistFromP1=gapStartDist+firstBiteCenterOffsetInGap;for(let k4=0;k4<numBitesInGap;k4++){let biteDist=firstBiteDistFromP1+k4*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i2-1+outline.length)%outline.length],p_next_=outline[(i2+2)%outline.length],start_ext=0,end_ext=0;if(p_prev_&&p_next_){let vec_in_p1=vector$1(point4(p_prev_.x,p_prev_.y),p12),p1_cross=vec_in_p1.cross(segmentVec),is_p1_convex=is_ccw?p1_cross>1e-9:p1_cross<-1e-9,vec_out_p2=vector$1(p22,point4(p_next_.x,p_next_.y)),p2_cross=segmentVec.cross(vec_out_p2),is_p2_convex=is_ccw?p2_cross>1e-9:p2_cross<-1e-9;if(is_p1_convex){let angle=vec_in_p1.angleTo(segmentVec);angle>Math.PI&&(angle=2*Math.PI-angle),start_ext=cutoutWidth*Math.tan(angle/2)}else start_ext=0;if(is_p2_convex){let angle=segmentVec.angleTo(vec_out_p2);angle>Math.PI&&(angle=2*Math.PI-angle),end_ext=cutoutWidth*Math.tan(angle/2)}else end_ext=0}let cutoutParts=[{start:0-start_ext,end:gapStartDist},{start:gapEndDist,end:segmentLength+end_ext}],extrusion=normalVec.multiply(cutoutWidth);for(let part of cutoutParts){let partLength=part.end-part.start;if(partLength<1e-6)continue;let center2=p12.translate(segmentDir.multiply(part.start+partLength/2)).translate(extrusion.multiply(.5)),width=partLength,height=cutoutWidth,rotationDeg=segmentDir.slope*180/Math.PI;tabCutouts.push({type:"pcb_cutout",shape:"rect",center:{x:center2.x,y:center2.y},width,height,rotation:rotationDeg,corner_radius:cutoutWidth/2})}}return{tabCutouts,mouseBiteHoles}};function generatePanelTabsAndMouseBites(boards,options){let finalTabCutouts=[],allMouseBites=[],{tabWidth,tabLength,mouseBites:useMouseBites}=options,boardDimensions=[];for(let board of boards)if(board.width&&board.height)boardDimensions.push(Math.min(board.width,board.height));else if(board.outline&&board.outline.length>0){let outlinePolygon=new Polygon$1(board.outline.map(p4=>point4(p4.x,p4.y))),area=Math.abs(outlinePolygon.area());area>0&&boardDimensions.push(Math.sqrt(area))}if(boardDimensions.length>0){let scaleFactor=Math.min(...boardDimensions)/20;tabWidth=Math.min(tabWidth,DEFAULT_TAB_WIDTH*Math.max(scaleFactor,.3)),tabLength=Math.min(tabLength,DEFAULT_TAB_LENGTH*Math.max(scaleFactor,.3))}let processedBoards=boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let w22=board.width/2,h22=board.height/2;return{...board,outline:[{x:board.center.x-w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y-h22},{x:board.center.x+w22,y:board.center.y+h22},{x:board.center.x-w22,y:board.center.y+h22}]}}return board});for(let board of processedBoards)if(board.outline&&board.outline.length>0){let mouseBiteDiameter2=tabWidth*.45,mouseBiteSpacing=mouseBiteDiameter2*.1,generated=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:tabLength,cutoutWidth:tabWidth,mouseBites:useMouseBites,mouseBiteHoleDiameter:mouseBiteDiameter2,mouseBiteHoleSpacing:mouseBiteSpacing});finalTabCutouts.push(...generated.tabCutouts),allMouseBites.push(...generated.mouseBiteHoles)}let tabCutouts=finalTabCutouts.map((tab,index)=>({...tab,pcb_cutout_id:`panel_tab_${index}`})),mouseBiteDiameter=tabWidth*.45,mouseBiteHoles=allMouseBites.map((bite,index)=>({type:"pcb_hole",pcb_hole_id:`panel_mouse_bite_${index}`,hole_shape:"circle",hole_diameter:mouseBiteDiameter,x:bite.x,y:bite.y}));return{tabCutouts,mouseBiteHoles}}var getBoardDimensionsFromProps=board=>{let props=board._parsedProps,width=props.width!=null?distance.parse(props.width):void 0,height=props.height!=null?distance.parse(props.height):void 0;if((width===void 0||height===void 0)&&props.outline?.length){let outlineBounds=getBoundsFromPoints(props.outline);outlineBounds&&(width??(width=outlineBounds.maxX-outlineBounds.minX),height??(height=outlineBounds.maxY-outlineBounds.minY))}if((width===void 0||height===void 0)&&props.circuitJson?.length){let pcbBoardFromJson=props.circuitJson.find(elm=>elm.type==="pcb_board");pcbBoardFromJson&&(width??(width=pcbBoardFromJson.width),height??(height=pcbBoardFromJson.height))}return{width:width??0,height:height??0}};function packIntoGrid({items,db:db2,row,col,cellWidth,cellHeight,boardGap,availablePanelWidth,availablePanelHeight}){let itemsWithDims=items.map(item=>{let dims=getItemDimensions(item,db2);return{item,width:dims.width,height:dims.height}}).filter(item=>!(item.width===0&&item.height===0));if(itemsWithDims.length===0)return{positions:[],gridWidth:0,gridHeight:0};let cols,rows,minCellWidth=cellWidth?distance.parse(cellWidth):0,minCellHeight=cellHeight?distance.parse(cellHeight):0;if(col!==void 0)cols=col,rows=row??Math.ceil(itemsWithDims.length/cols);else if(row!==void 0)rows=row,cols=Math.ceil(itemsWithDims.length/rows);else if(availablePanelWidth!==void 0&&availablePanelHeight!==void 0){let maxItemWidth=Math.max(...itemsWithDims.map(b3=>b3.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b3=>b3.height),minCellHeight),maxCols=Math.max(1,Math.floor((availablePanelWidth+boardGap)/(maxItemWidth+boardGap))),maxRows=Math.max(1,Math.floor((availablePanelHeight+boardGap)/(maxItemHeight+boardGap)));cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols),rows>maxRows&&(rows=maxRows,cols=Math.ceil(itemsWithDims.length/rows),cols>maxCols&&(cols=maxCols,rows=Math.ceil(itemsWithDims.length/cols))),cols=Math.max(1,cols),rows=Math.max(1,rows)}else cols=Math.ceil(Math.sqrt(itemsWithDims.length)),rows=Math.ceil(itemsWithDims.length/cols);let colWidths=Array(cols).fill(0),rowHeights=Array(rows).fill(0);itemsWithDims.forEach((item,i2)=>{let colIdx=i2%cols,rowIdx=Math.floor(i2/cols);rowIdx<rowHeights.length&&item.height>rowHeights[rowIdx]&&(rowHeights[rowIdx]=item.height),colIdx<colWidths.length&&item.width>colWidths[colIdx]&&(colWidths[colIdx]=item.width)});for(let i2=0;i2<colWidths.length;i2++)colWidths[i2]=Math.max(colWidths[i2],minCellWidth);for(let i2=0;i2<rowHeights.length;i2++)rowHeights[i2]=Math.max(rowHeights[i2],minCellHeight);let gridWidth=colWidths.reduce((a2,b3)=>a2+b3,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a2,b3)=>a2+b3,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i2=1;i2<cols;i2++)colXOffsets.push(colXOffsets[i2-1]+colWidths[i2-1]+boardGap);let rowYOffsets=[startY];for(let i2=1;i2<rows;i2++)rowYOffsets.push(rowYOffsets[i2-1]+rowHeights[i2-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i2)=>{let colIdx=i2%cols,rowIdx=Math.floor(i2/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x5=colXOffsets[colIdx]+colWidths[colIdx]/2,y5=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x5,y:y5}})}),{positions,gridWidth,gridHeight}}function getItemDimensions(item,db2){if(item.componentName==="Board"){let board=item;if(db2&&board.pcb_board_id){let pcbBoard=db2.pcb_board.get(board.pcb_board_id);if(pcbBoard?.width!==void 0&&pcbBoard?.height!==void 0)return{width:pcbBoard.width,height:pcbBoard.height}}return getBoardDimensionsFromProps(board)}if(item.componentName==="Subpanel"){let subpanel=item,props=subpanel._parsedProps;if(props.width!==void 0&&props.height!==void 0)return{width:distance.parse(props.width),height:distance.parse(props.height)};let directBoards=subpanel._getDirectBoardChildren();if(directBoards.length===0){let allBoards=subpanel._getAllBoardInstances();if(allBoards.length===0)return{width:0,height:0};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let board of allBoards){let dims=getBoardDimensionsFromProps(board);if(dims.width===0||dims.height===0)continue;let offset=board._panelPositionOffset??{x:0,y:0};minX=Math.min(minX,offset.x-dims.width/2),maxX=Math.max(maxX,offset.x+dims.width/2),minY=Math.min(minY,offset.y-dims.height/2),maxY=Math.max(maxY,offset.y+dims.height/2)}return minX===1/0?{width:0,height:0}:{width:maxX-minX,height:maxY-minY}}if(directBoards.length===1)return getBoardDimensionsFromProps(directBoards[0]);if(subpanel._cachedGridWidth>0&&subpanel._cachedGridHeight>0){let edgePadding=distance.parse(props.edgePadding??5);return{width:subpanel._cachedGridWidth+edgePadding*2,height:subpanel._cachedGridHeight+edgePadding*2}}let totalWidth=0,totalHeight=0;for(let board of directBoards){let dims=getBoardDimensionsFromProps(board);totalWidth=Math.max(totalWidth,dims.width),totalHeight=Math.max(totalHeight,dims.height)}return{width:totalWidth,height:totalHeight}}return{width:0,height:0}}var Subpanel=class _Subpanel extends Group6{constructor(){super(...arguments);__publicField(this,"pcb_panel_id",null);__publicField(this,"_tabsAndMouseBitesGenerated",!1);__publicField(this,"_cachedGridWidth",0);__publicField(this,"_cachedGridHeight",0);__publicField(this,"_panelPositionOffset",null)}get config(){return{componentName:"Subpanel",zodProps:subpanelProps}}get _errorComponentName(){return this.componentName.toLowerCase()}get isGroup(){return!0}get isSubcircuit(){return!0}_getPcbLayoutMode(){return"none"}add(component){if(component.lowercaseComponentName!=="board"&&component.lowercaseComponentName!=="subpanel")throw new Error(`<${this._errorComponentName}> can only contain <board> or <subpanel> elements`);super.add(component)}_computePcbGlobalTransformBeforeLayout(){if(this._panelPositionOffset){let parentTransform=this.parent?._computePcbGlobalTransformBeforeLayout?.()??identity();return compose2(parentTransform,translate2(this._panelPositionOffset.x,this._panelPositionOffset.y))}return super._computePcbGlobalTransformBeforeLayout()}_getAllBoardInstances(){let boards=[];for(let child of this.children)child instanceof Board?boards.push(child):child instanceof _Subpanel&&boards.push(...child._getAllBoardInstances());return boards}_containsBoards(){for(let child of this.children)if(child.componentName==="Board"||child.componentName==="Subpanel"&&"_containsBoards"in child&&child._containsBoards())return!0;return!1}_getDirectBoardChildren(){return this.children.filter(c3=>c3 instanceof Board)}doInitialPanelBoardLayout(){if(this.root?.pcbDisabled)return;let layoutMode=this._parsedProps.layoutMode??"none",gridItems=this.children.filter(c3=>c3 instanceof Board||c3 instanceof _Subpanel);if(layoutMode!=="none")for(let child of gridItems)child instanceof Board&&child._hasUserDefinedPcbPosition()&&this.root.db.source_property_ignored_warning.insert({source_component_id:child.source_component_id,property_name:"pcbX/pcbY",message:`Board has manual positioning but ${this._errorComponentName} layout mode is "${layoutMode}". Manual positioning will be ignored.`,error_type:"source_property_ignored_warning"});if(layoutMode==="none"&&gridItems.length>1&&gridItems.filter(c3=>!c3._hasUserDefinedPcbPosition()).length>1&&this.root.db.pcb_placement_error.insert({error_type:"pcb_placement_error",message:`Multiple boards/subpanels in ${this._errorComponentName} without positions. When layoutMode="none", each item must have explicit positioning. Use layoutMode="grid" for automatic positioning.`}),layoutMode!=="grid")return;let tabWidth=this._parsedProps.tabWidth??DEFAULT_TAB_WIDTH,boardGap=this._parsedProps.boardGap??tabWidth,availablePanelWidth,availablePanelHeight,hasExplicitRowOrCol=this._parsedProps.row!==void 0||this._parsedProps.col!==void 0,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0;if(!hasExplicitRowOrCol&&hasExplicitWidth&&hasExplicitHeight){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding),panelWidth=distance.parse(this._parsedProps.width),panelHeight=distance.parse(this._parsedProps.height);availablePanelWidth=panelWidth-edgePaddingLeft-edgePaddingRight,availablePanelHeight=panelHeight-edgePaddingTop-edgePaddingBottom}let{positions,gridWidth,gridHeight}=packIntoGrid({items:gridItems,row:this._parsedProps.row,col:this._parsedProps.col,cellWidth:this._parsedProps.cellWidth,cellHeight:this._parsedProps.cellHeight,boardGap,availablePanelHeight,availablePanelWidth});this._cachedGridWidth=gridWidth,this._cachedGridHeight=gridHeight;for(let{item,pos}of positions)item._panelPositionOffset=pos}doInitialPanelLayout(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if((this._parsedProps.layoutMode??"none")==="grid"){for(let child of this.children)if(child instanceof Board){if(!child.pcb_board_id||!child._panelPositionOffset)continue;db2.pcb_board.update(child.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y}mm`})}else if(child instanceof _Subpanel&&child._panelPositionOffset)for(let board of child._getAllBoardInstances()){if(!board.pcb_board_id)continue;let boardOffset=board._panelPositionOffset??{x:0,y:0};db2.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${child._panelPositionOffset.x+boardOffset.x}mm`,display_offset_y:`${child._panelPositionOffset.y+boardOffset.y}mm`})}this._updatePanelDimensions()}else{let panelGlobalPos=this._getGlobalPcbPositionBeforeLayout();for(let board of this._getDirectBoardChildren()){if(!board.pcb_board_id)continue;let boardDb=db2.pcb_board.get(board.pcb_board_id);if(!boardDb)continue;let relativeX=boardDb.center.x-panelGlobalPos.x,relativeY=boardDb.center.y-panelGlobalPos.y;db2.pcb_board.update(board.pcb_board_id,{position_mode:"relative_to_panel_anchor",display_offset_x:`${relativeX}mm`,display_offset_y:`${relativeY}mm`})}}this._generateTabsAndMouseBites()}_updatePanelDimensions(){let{db:db2}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_group_id){if(hasExplicitWidth&&hasExplicitHeight)db2.pcb_group.update(this.pcb_group_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db2.pcb_group.update(this.pcb_group_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}_generateTabsAndMouseBites(){if(this._tabsAndMouseBitesGenerated)return;let{db:db2}=this.root,props=this._parsedProps,panelizationMethod=props.panelizationMethod??"none",childBoardInstances=this._getAllBoardInstances();if(panelizationMethod!=="none"){let childBoardIds=childBoardInstances.map(c3=>c3.pcb_board_id).filter(id2=>!!id2),boardsInPanel=db2.pcb_board.list().filter(b3=>childBoardIds.includes(b3.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH,boardGap=props.boardGap??tabWidth,{tabCutouts,mouseBiteHoles}=generatePanelTabsAndMouseBites(boardsInPanel,{boardGap,tabWidth,tabLength:props.tabLength??DEFAULT_TAB_LENGTH,mouseBites:props.mouseBites??!0});for(let tabCutout of tabCutouts)db2.pcb_cutout.insert(tabCutout);for(let mouseBiteHole of mouseBiteHoles)db2.pcb_hole.insert(mouseBiteHole)}this._tabsAndMouseBitesGenerated=!0}doInitialPcbComponentRender(){if(!this.root?.pcbDisabled){if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);super.doInitialPcbComponentRender()}}},Panel=class extends Subpanel{get config(){return{componentName:"Panel",zodProps:panelProps}}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;if(!this._containsBoards())throw new Error(`<${this._errorComponentName}> must contain at least one <board>`);let{db:db2}=this.root,props=this._parsedProps,inserted=db2.pcb_panel.insert({width:props.width!==void 0?distance.parse(props.width):0,height:props.height!==void 0?distance.parse(props.height):0,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)});this.pcb_panel_id=inserted.pcb_panel_id}_updatePanelDimensions(){let{db:db2}=this.root,hasExplicitWidth=this._parsedProps.width!==void 0,hasExplicitHeight=this._parsedProps.height!==void 0,gridWidth=this._cachedGridWidth,gridHeight=this._cachedGridHeight;if(this.pcb_panel_id){if(hasExplicitWidth&&hasExplicitHeight)db2.pcb_panel.update(this.pcb_panel_id,{width:distance.parse(this._parsedProps.width),height:distance.parse(this._parsedProps.height)});else if(gridWidth>0||gridHeight>0){let{edgePadding:edgePaddingProp,edgePaddingLeft:edgePaddingLeftProp,edgePaddingRight:edgePaddingRightProp,edgePaddingTop:edgePaddingTopProp,edgePaddingBottom:edgePaddingBottomProp}=this._parsedProps,edgePadding=distance.parse(edgePaddingProp??5),edgePaddingLeft=distance.parse(edgePaddingLeftProp??edgePadding),edgePaddingRight=distance.parse(edgePaddingRightProp??edgePadding),edgePaddingTop=distance.parse(edgePaddingTopProp??edgePadding),edgePaddingBottom=distance.parse(edgePaddingBottomProp??edgePadding);db2.pcb_panel.update(this.pcb_panel_id,{width:hasExplicitWidth?distance.parse(this._parsedProps.width):gridWidth+edgePaddingLeft+edgePaddingRight,height:hasExplicitHeight?distance.parse(this._parsedProps.height):gridHeight+edgePaddingTop+edgePaddingBottom})}}}updatePcbComponentRender(){if(this.root?.pcbDisabled||!this.pcb_panel_id)return;let{db:db2}=this.root,props=this._parsedProps,currentPanel=db2.pcb_panel.get(this.pcb_panel_id);db2.pcb_panel.update(this.pcb_panel_id,{width:props.width!==void 0?distance.parse(props.width):currentPanel?.width,height:props.height!==void 0?distance.parse(props.height):currentPanel?.height,center:this._getGlobalPcbPositionBeforeLayout(),covered_with_solder_mask:!(props.noSolderMask??!1)})}removePcbComponentRender(){this.pcb_panel_id&&(this.root?.db.pcb_panel.delete(this.pcb_panel_id),this.pcb_panel_id=null)}},Pinout=class extends Chip{constructor(props){super(props)}get config(){return{...super.config,componentName:"Pinout",zodProps:pinoutProps}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_pinout",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Fuse=class extends NormalComponent3{get config(){return{componentName:"fuse",schematicSymbolName:this.props.symbolName??"fuse",zodProps:fuseProps,sourceFtype:FTYPE.simple_fuse}}_getSchematicSymbolDisplayValue(){let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current2=typeof rawCurrent=="string"?parseFloat(rawCurrent):rawCurrent,voltage2=typeof rawVoltage=="string"?parseFloat(rawVoltage):rawVoltage;return`${formatSiUnit(current2)}A / ${formatSiUnit(voltage2)}V`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,currentRating=typeof props.currentRating=="string"?parseFloat(props.currentRating):props.currentRating,voltageRating=typeof props.voltageRating=="string"?parseFloat(props.voltageRating):props.voltageRating,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,current_rating_amps:currentRating,voltage_rating_volts:voltageRating,display_current_rating:`${formatSiUnit(currentRating)}A`,display_voltage_rating:`${formatSiUnit(voltageRating)}V`,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Jumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}get config(){return{schematicSymbolName:void 0,componentName:"Jumper",zodProps:jumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length),direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),pcb_component2=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialPcbTraceRender(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i2=0;i2<pcb_ports.length;i2++){let port=pcb_ports[i2],sourcePort=db2.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h4=>/^(pin)?\d+$/.test(h4));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db2.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},INTERCONNECT_STANDARD_FOOTPRINTS={"0402":"0402","0603":"0603","0805":"0805",1206:"1206"},Interconnect=class extends NormalComponent3{get config(){return{componentName:"Interconnect",zodProps:interconnectProps,shouldRenderAsSchematicBox:!0,sourceFtype:"interconnect"}}get defaultInternallyConnectedPinNames(){let{standard}=this._parsedProps;return standard&&INTERCONNECT_STANDARD_FOOTPRINTS[standard]?[["pin1","pin2"]]:[]}_getImpliedFootprintString(){let{standard}=this._parsedProps;return standard?INTERCONNECT_STANDARD_FOOTPRINTS[standard]??null:null}doInitialSourceRender(){let{db:db2}=this.root,source_component=db2.source_component.insert({ftype:"interconnect",name:this.name,are_pins_interchangeable:!0,display_name:this._parsedProps.displayName});this.source_component_id=source_component.source_component_id}doInitialSourceParentAttachment(){let{db:db2}=this.root,internallyConnectedPorts=this._getInternallyConnectedPins();for(let ports of internallyConnectedPorts){let sourcePortIds=ports.map(port=>port.source_port_id).filter(id2=>id2!==null);sourcePortIds.length>=2&&db2.source_component_internal_connection.insert({source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id,source_port_ids:sourcePortIds})}}},SolderJumper=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"schematicDimensions",null)}_getPinNumberFromBridgedPinName(pinName){return this.selectOne(`port.${pinName}`,{type:"port"})?._parsedProps.pinNumber??null}get defaultInternallyConnectedPinNames(){if(this._parsedProps.bridged){let pins=this.children.filter(c3=>c3.componentName==="Port").map(p4=>p4.name);return pins.length>0?[pins]:[]}return this._parsedProps.bridgedPins??[]}get config(){let props=this._parsedProps??this.props,resolvedPinCount=props.pinCount;if(props.pinCount==null&&!props.footprint&&(resolvedPinCount=2),props.pinCount==null){let nums=(props.bridgedPins??[]).flat().map(p_str=>this._getPinNumberFromBridgedPinName(p_str)).filter(n3=>n3!==null),maxPinFromBridged=nums.length>0?Math.max(...nums):0,pinCountFromLabels=props.pinLabels?Object.keys(props.pinLabels).length:0,finalPinCount=Math.max(maxPinFromBridged,pinCountFromLabels);(finalPinCount===2||finalPinCount===3)&&(resolvedPinCount=finalPinCount),resolvedPinCount==null&&props.footprint&&[2,3].includes(this.getPortsFromFootprint().length)&&(resolvedPinCount=this.getPortsFromFootprint().length)}let symbolName="";resolvedPinCount?symbolName+=`solderjumper${resolvedPinCount}`:symbolName="solderjumper";let bridgedPinNumbers=[];return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?bridgedPinNumbers=Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinName(pinName)).filter(n3=>n3!==null))).sort((a2,b3)=>a2-b3):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_5,i2)=>i2+1)),bridgedPinNumbers.length>0&&(symbolName+=`_bridged${bridgedPinNumbers.join("")}`),{schematicSymbolName:props.symbolName??symbolName,componentName:"SolderJumper",zodProps:solderjumperProps,shouldRenderAsSchematicBox:!0}}_getSchematicPortArrangement(){let arrangement=super._getSchematicPortArrangement();if(arrangement&&Object.keys(arrangement).length>0)return arrangement;let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:this.getPortsFromFootprint().length);pinCount==null&&!this._parsedProps.footprint&&(pinCount=2);let direction2=this._parsedProps.schDirection??"right";return{leftSize:direction2==="left"?pinCount:0,rightSize:direction2==="right"?pinCount:0}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),source_component=db2.source_component.insert({ftype:"simple_chip",name:this.name,manufacturer_part_number:props.manufacturerPartNumber,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,{pcbX,pcbY}=this.getResolvedPcbPositionProp(),pcb_component2=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:props.pcbRotation??0,source_component_id:this.source_component_id,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0,do_not_place:props.doNotPlace??!1,obstructs_within_bounds:props.obstructsWithinBounds??!0,metadata:props.kicadFootprintMetadata?{kicad_footprint:props.kicadFootprintMetadata}:void 0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialPcbTraceRender(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i2=0;i2<pcb_ports.length;i2++){let port=pcb_ports[i2],sourcePort=db2.source_port.get(port.source_port_id),pinLabel="";if(typeof sourcePort?.pin_number=="number")pinLabel=sourcePort.pin_number.toString();else if(Array.isArray(sourcePort?.port_hints)){let matchedHint=sourcePort.port_hints.find(h4=>/^(pin)?\d+$/.test(h4));matchedHint&&(/^pin\d+$/.test(matchedHint)?pinLabel=matchedHint.replace(/^pin/,""):pinLabel=matchedHint)}pinLabelToPortId[pinLabel]=port.pcb_port_id}let traces=db2.pcb_trace.list({pcb_component_id:this.pcb_component_id}),updatePortId=portId=>{if(portId&&typeof portId=="string"&&portId.startsWith("{PIN")){let pin=portId.replace("{PIN","").replace("}","");return pinLabelToPortId[pin]||portId}return portId};for(let trace of traces)if(trace.route)for(let segment2 of trace.route)segment2.route_type==="wire"&&(segment2.start_pcb_port_id=updatePortId(segment2.start_pcb_port_id),segment2.end_pcb_port_id=updatePortId(segment2.end_pcb_port_id))}},Led=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"anode",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"cathode",this.portMap.pin2)}get config(){let symbolMap={laser:"laser_diode"},variantSymbol=this.props.laser?"laser":null;return{schematicSymbolName:variantSymbol?symbolMap[variantSymbol]:this.props.symbolName??"led",componentName:"Led",zodProps:ledProps,sourceFtype:"simple_led"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}_getSchematicSymbolDisplayValue(){return this._parsedProps.schDisplayValue||this._parsedProps.color||void 0}getFootprinterString(){let baseFootprint=super.getFootprinterString();return baseFootprint&&this.props.color?`${baseFootprint}_color(${this.props.color})`:baseFootprint}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_led",name:this.name,wave_length:props.wavelength,color:props.color,symbol_display_value:this._getSchematicSymbolDisplayValue(),manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PowerSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pin1);__publicField(this,"positive",this.portMap.pin1);__publicField(this,"neg",this.portMap.pin2);__publicField(this,"negative",this.portMap.pin2)}get config(){return{schematicSymbolName:this.props.symbolName??"power_factor_meter_horz",componentName:"PowerSource",zodProps:powerSourceProps,sourceFtype:"simple_power_source"}}initPorts(){this.add(new Port({name:"pin1",pinNumber:1,aliases:["positive","pos"]})),this.add(new Port({name:"pin2",pinNumber:2,aliases:["negative","neg"]}))}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_power_source",name:this.name,voltage:props.voltage,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"terminal1",this.portMap.terminal1);__publicField(this,"terminal2",this.portMap.terminal2)}get config(){return{componentName:"VoltageSource",schematicSymbolName:this.props.waveShape==="square"?"square_wave":"ac_voltmeter",zodProps:voltageSourceProps,sourceFtype:"simple_voltage_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("VoltageSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["terminal1"],pin2:["terminal2"]}})}_getSchematicSymbolDisplayValue(){let{voltage:voltage2,frequency:frequency2}=this._parsedProps,parts=[];return voltage2!==void 0&&parts.push(`${formatSiUnit(voltage2)}V`),frequency2!==void 0&&parts.push(`${formatSiUnit(frequency2)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_voltage_source",name:this.name,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,{_parsedProps:props}=this,terminal1Port=this.portMap.terminal1,terminal2Port=this.portMap.terminal2;db2.simulation_voltage_source.insert({type:"simulation_voltage_source",is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id,terminal2_source_port_id:terminal2Port.source_port_id,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle})}},CurrentSource=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"CurrentSource",schematicSymbolName:"current_source",zodProps:currentSourceProps,sourceFtype:"simple_current_source"}}runRenderPhaseForChildren(phase){if(!phase.startsWith("Pcb"))for(let child of this.children)child.runRenderPhaseForChildren(phase),child.runRenderPhase(phase)}doInitialPcbComponentRender(){let hasExplicitPcbPosition=this._hasUserDefinedPcbPosition();if(!this._parsedProps.footprint){if(!hasExplicitPcbPosition)return;throw new Error("CurrentSource requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({additionalAliases:{pin1:["pos"],pin2:["neg"]}})}_getSchematicSymbolDisplayValue(){let{current:current2,frequency:frequency2,peakToPeakCurrent}=this._parsedProps,parts=[];return current2!==void 0&&parts.push(`${formatSiUnit(current2)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency2!==void 0&&parts.push(`${formatSiUnit(frequency2)}Hz`),parts.length>0?parts.join(" "):void 0}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_current_source",name:this.name,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,{_parsedProps:props}=this,isAc=props.frequency!==void 0||props.peakToPeakCurrent!==void 0||props.waveShape!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc)db2.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id,terminal2_source_port_id:negPort.source_port_id,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle});else{if(props.current===void 0)return;db2.simulation_current_source.insert({type:"simulation_current_source",is_dc_source:!0,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,current:props.current})}}},edgeSpecifiers=["leftedge","rightedge","topedge","bottomedge","center"],Constraint3=class extends PrimitiveComponent2{get config(){return{componentName:"Constraint",zodProps:constraintProps}}constructor(props){if(super(props),("xdist"in props||"ydist"in props)&&!("edgeToEdge"in props)&&!("centerToCenter"in props))throw new Error(`edgeToEdge, centerToCenter must be set for xDist or yDist for ${this}`);if("for"in props&&props.for.length<2)throw new Error(`"for" must have at least two selectors for ${this}`)}_getAllReferencedComponents(){let componentsWithSelectors=[],container=this.getPrimitiveContainer();function addComponentFromSelector(selector){let maybeEdge=selector.split(" ").pop(),edge=edgeSpecifiers.includes(maybeEdge)?maybeEdge:void 0,componentSelector=edge?selector.replace(` ${edge}`,""):selector,component=container.selectOne(componentSelector,{pcbPrimitive:!0});component&&componentsWithSelectors.push({selector,component,componentSelector,edge})}for(let key of["left","right","top","bottom"])key in this._parsedProps&&addComponentFromSelector(this._parsedProps[key]);if("for"in this._parsedProps)for(let selector of this._parsedProps.for)addComponentFromSelector(selector);return{componentsWithSelectors}}},FabricationNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"fabrication_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"FabricationNoteDimension",zodProps:fabricationNoteDimensionProps}}_resolvePoint(input2,transform5){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform5,{x:0,y:0}))}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform5,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform5),to3=this._resolvePoint(props.to,transform5),subcircuit=this.getSubcircuit(),group=this.getGroup(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),layer=maybeFlipLayer(props.layer??"top");if(layer!=="top"&&layer!=="bottom")throw new Error(`Invalid layer "${layer}" for FabricationNoteDimension. Must be "top" or "bottom".`);let pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),fabrication_note_dimension=db2.pcb_fabrication_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,layer,from,to:to3,text,offset:props.offset,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.fabrication_note_dimension_id=fabrication_note_dimension.pcb_fabrication_note_dimension_id}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.fabrication_note_dimension_id)return;let dimension=db2.pcb_fabrication_note_dimension.get(this.fabrication_note_dimension_id);dimension&&db2.pcb_fabrication_note_dimension.update(this.fabrication_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}getPcbSize(){let transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}},PcbNoteDimension=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_note_dimension_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"PcbNoteDimension",zodProps:pcbNoteDimensionProps}}_resolvePoint(input2,transform5){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform5,{x:0,y:0});let targetPcbComponentId=target.pcb_component_id,root=this.root;if(targetPcbComponentId&&root){let pcbComponent=root.db.pcb_component.get(targetPcbComponentId);if(pcbComponent?.center)return{x:pcbComponent.center.x,y:pcbComponent.center.y}}return target._getGlobalPcbPositionBeforeLayout()}let numericX=typeof input2.x=="string"?parseFloat(input2.x):input2.x,numericY=typeof input2.y=="string"?parseFloat(input2.y):input2.y;return applyToPoint2(transform5,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform5),to3=this._resolvePoint(props.to,transform5),subcircuit=this.getSubcircuit(),group=this.getGroup(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??void 0,text=props.text??this._formatDistanceText({from,to:to3,units:props.units??"mm"}),pcb_note_dimension2=db2.pcb_note_dimension.insert({pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:group?.pcb_group_id??void 0,from,to:to3,text,font:props.font??"tscircuit2024",font_size:props.fontSize??1,color:props.color,arrow_size:props.arrowSize??1});this.pcb_note_dimension_id=pcb_note_dimension2.pcb_note_dimension_id}doInitialPcbLayout(){let root=this.root;if(!root||root.pcbDisabled||!this.pcb_note_dimension_id)return;let{db:db2}=root,transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);db2.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform5=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform5),to3=this._resolvePoint(this._parsedProps.to,transform5);return{width:Math.abs(to3.x-from.x),height:Math.abs(to3.y-from.y)}}_formatDistanceText({from,to:to3,units}){let dx3=to3.x-from.x,dy3=to3.y-from.y,distanceInMillimeters=Math.sqrt(dx3*dx3+dy3*dy3),distanceInUnits=units==="in"?distanceInMillimeters/25.4:distanceInMillimeters,roundedDistance=Math.round(distanceInUnits);if(Math.abs(distanceInUnits-roundedDistance)<1e-9)return`${roundedDistance}${units}`;let decimalPlaces=units==="in"?3:2;return`${units==="in"?Number(distanceInUnits.toFixed(decimalPlaces)).toString():distanceInUnits.toFixed(decimalPlaces)}${units}`}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_note_dimension_id)return;let dimension=db2.pcb_note_dimension.get(this.pcb_note_dimension_id);dimension&&db2.pcb_note_dimension.update(this.pcb_note_dimension_id,{from:{x:dimension.from.x+deltaX,y:dimension.from.y+deltaY},to:{x:dimension.to.x+deltaX,y:dimension.to.y+deltaY}})}},Breakout=class extends Group6{constructor(props){super({...props,subcircuit:!0})}doInitialPcbPrimitiveRender(){if(super.doInitialPcbPrimitiveRender(),this.root?.pcbDisabled)return;let{db:db2}=this.root,props=this._parsedProps;if(!this.pcb_group_id)return;let pcb_group2=db2.pcb_group.get(this.pcb_group_id),padLeft=props.paddingLeft??props.padding??0,padRight=props.paddingRight??props.padding??0,padTop=props.paddingTop??props.padding??0,padBottom=props.paddingBottom??props.padding??0;db2.pcb_group.update(this.pcb_group_id,{width:(pcb_group2.width??0)+padLeft+padRight,height:(pcb_group2.height??0)+padTop+padBottom,center:{x:pcb_group2.center.x+(padRight-padLeft)/2,y:pcb_group2.center.y+(padTop-padBottom)/2}})}},BreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){let{connection}=this._parsedProps,subcircuit=this.getSubcircuit();subcircuit&&(this.matchedPort=subcircuit.selectOne(connection,{type:"port"}),this.matchedPort||(this.matchedNet=subcircuit.selectOne(connection,{type:"net"})),!this.matchedPort&&!this.matchedNet&&this.renderError(`Could not find connection target "${connection}"`))}_getSourceTraceIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st4=>st4.connected_source_port_ids.includes(port.source_port_id))?.source_trace_id}_getSourceNetIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st4=>st4.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;this._matchConnection();let position2=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point2=db2.pcb_breakout_point.insert({pcb_group_id:group.pcb_group_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,source_port_id:this.matchedPort?.source_port_id??void 0,source_trace_id:this.matchedPort?this._getSourceTraceIdForPort(this.matchedPort):void 0,source_net_id:this.matchedNet?this.matchedNet.source_net_id:this.matchedPort?this._getSourceNetIdForPort(this.matchedPort):void 0,x:position2.x,y:position2.y});this.pcb_breakout_point_id=pcb_breakout_point2.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position2=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position2.x,y:position2.y},bounds:{left:position2.x,top:position2.y,right:position2.x,bottom:position2.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;this.pcb_breakout_point_id&&db2.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_breakout_point_id)return;let point6=db2.pcb_breakout_point.get(this.pcb_breakout_point_id);point6&&db2.pcb_breakout_point.update(this.pcb_breakout_point_id,{x:point6.x+deltaX,y:point6.y+deltaY})}getPcbSize(){return{width:0,height:0}}},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id")}get config(){return{componentName:"NetLabel",zodProps:netLabelProps}}_getAnchorSide(){let{_parsedProps:props}=this;if(props.anchorSide)return props.anchorSide;if(!this._resolveConnectsTo())return"right";let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),connectedPorts=this._getConnectedPorts();if(connectedPorts.length===0)return"right";let connectedPortPosition=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),dx3=connectedPortPosition.x-anchorPos.x,dy3=connectedPortPosition.y-anchorPos.y;if(Math.abs(dx3)>Math.abs(dy3)){if(dx3>0)return"right";if(dx3<0)return"left"}else{if(dy3>0)return"top";if(dy3<0)return"bottom"}return"right"}_getConnectedPorts(){let connectsTo=this._resolveConnectsTo();if(!connectsTo)return[];let connectedPorts=[];for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection);port&&connectedPorts.push(port)}return connectedPorts}computeSchematicPropsTransform(){let{_parsedProps:props}=this;if(props.schX===void 0&&props.schY===void 0){let connectedPorts=this._getConnectedPorts();if(connectedPorts.length>0){let portPos=connectedPorts[0]._getGlobalSchematicPositionBeforeLayout(),parentCenter=applyToPoint2(this.parent?.computeSchematicGlobalTransform?.()??identity(),{x:0,y:0});return translate2(portPos.x-parentCenter.x,portPos.y-parentCenter.y)}}return super.computeSchematicPropsTransform()}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,anchorPos=this._getGlobalSchematicPositionBeforeLayout(),net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),anchorSide=props.anchorSide??"right",center2=computeSchematicNetLabelCenter({anchor_position:anchorPos,anchor_side:anchorSide,text:props.net}),netLabel=db2.schematic_net_label.insert({text:props.net,source_net_id:net.source_net_id,anchor_position:anchorPos,center:center2,anchor_side:this._getAnchorSide()});this.source_net_label_id=netLabel.source_net_id}_resolveConnectsTo(){let{_parsedProps:props}=this,connectsTo=props.connectsTo??props.connection;if(Array.isArray(connectsTo))return connectsTo;if(typeof connectsTo=="string")return[connectsTo]}_getNetName(){let{_parsedProps:props}=this;return props.net}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;props.net&&createNetsFromProps(this,[`net.${props.net}`])}doInitialCreateTracesFromNetLabels(){if(this.root?.schematicDisabled)return;let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace3({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled)return;let{db:db2}=this.root,connectsTo=this._resolveConnectsTo();if(!connectsTo||connectsTo.length===0)return;let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),anchorSide=this._getAnchorSide(),anchorFacing={left:"x-",right:"x+",top:"y+",bottom:"y-"}[anchorSide],net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`);for(let connection of connectsTo){let port=this.getSubcircuit().selectOne(connection,{type:"port"});if(!port||!port.schematic_port_id)continue;let existingTraceForThisConnection=!1;if(net?.source_net_id){let candidateSourceTrace=db2.source_trace.list().find(st4=>st4.connected_source_net_ids?.includes(net.source_net_id)&&st4.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db2.schematic_trace.list().some(t35=>t35.source_trace_id===candidateSourceTrace.source_trace_id)),existingTraceForThisConnection)continue}let portPos=port._getGlobalSchematicPositionAfterLayout(),portFacing=convertFacingDirectionToElbowDirection(port.facingDirection??"right")??"x+",path=calculateElbow({x:portPos.x,y:portPos.y,facingDirection:portFacing},{x:anchorPos.x,y:anchorPos.y,facingDirection:anchorFacing});if(!Array.isArray(path)||path.length<2)continue;let edges=[];for(let i2=0;i2<path.length-1;i2++)edges.push({from:{x:path[i2].x,y:path[i2].y},to:{x:path[i2+1].x,y:path[i2+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st4=db2.source_trace.list().find(s2=>s2.connected_source_net_ids?.includes(net.source_net_id)&&s2.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st4?.source_trace_id,subcircuit_connectivity_map_key=st4?.subcircuit_connectivity_map_key||db2.source_net.get(net.source_net_id)?.subcircuit_connectivity_map_key}db2.schematic_trace.insert({source_trace_id,edges,junctions:[],subcircuit_connectivity_map_key}),db2.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},Fiducial=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_smtpad_id",null);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"Fiducial",zodProps:fiducialProps,sourceFtype:"simple_fiducial"}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,position2=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_smtpad2=db2.pcb_smtpad.insert({pcb_component_id,layer:maybeFlipLayer(props.layer||"top"),shape:"circle",x:position2.x,y:position2.y,radius:distance.parse(props.padDiameter)/2,soldermask_margin:props.soldermaskPullback?distance.parse(props.soldermaskPullback):distance.parse(props.padDiameter)/2,is_covered_with_solder_mask:!0});this.pcb_smtpad_id=pcb_smtpad2.pcb_smtpad_id}getPcbSize(){let{_parsedProps:props}=this,d3=distance.parse(props.padDiameter);return{width:d3,height:d3}}_setPositionFromLayout(newCenter){if(!this.pcb_smtpad_id)return;let{db:db2}=this.root;db2.pcb_smtpad.update(this.pcb_smtpad_id,{x:newCenter.x,y:newCenter.y})}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_smtpad_id)return;let pad2=db2.pcb_smtpad.get(this.pcb_smtpad_id);pad2&&(pad2.shape==="rect"||pad2.shape==="circle"||pad2.shape==="rotated_rect"||pad2.shape==="pill"?this._setPositionFromLayout({x:pad2.x+deltaX,y:pad2.y+deltaY}):pad2.shape==="polygon"&&db2.pcb_smtpad.update(this.pcb_smtpad_id,{points:pad2.points.map(p4=>({x:p4.x+deltaX,y:p4.y+deltaY}))}))}},Via=class extends PrimitiveComponent2{constructor(props){super(props);__publicField(this,"pcb_via_id",null);__publicField(this,"matchedPort",null);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"source_manually_placed_via_id",null);__publicField(this,"subcircuit_connectivity_map_key",null);let layers=this._getLayers();this._parsedProps.layers=layers,this.initPorts()}get config(){return{componentName:"Via",zodProps:viaProps}}getAvailablePcbLayers(){return["top","inner1","inner2","bottom"]}_getResolvedViaDiameters(pcbStyle2){return getViaDiameterDefaultsWithOverrides({holeDiameter:this._parsedProps.holeDiameter,padDiameter:this._parsedProps.outerDiameter},pcbStyle2)}getPcbSize(){let pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2);return{width:padDiameter,height:padDiameter}}_getPcbCircuitJsonBounds(){let{db:db2}=this.root,via=db2.pcb_via.get(this.pcb_via_id),size2=this.getPcbSize();return{center:{x:via.x,y:via.y},bounds:{left:via.x-size2.width/2,top:via.y-size2.height/2,right:via.x+size2.width/2,bottom:via.y+size2.height/2},width:size2.width,height:size2.height}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;db2.pcb_via.update(this.pcb_via_id,{x:newCenter.x,y:newCenter.y})}_getLayers(){let{fromLayer="top",toLayer="bottom"}=this._parsedProps;return fromLayer===toLayer?[fromLayer]:[fromLayer,toLayer]}initPorts(){let layers=this._parsedProps.layers;for(let layer of layers){let port2=new Port({name:layer,layer});port2.registerMatch(this),this.add(port2)}let port=new Port({name:"pin1"});port.registerMatch(this),this.add(port)}_getConnectedNetOrTrace(){let connectsTo=this._parsedProps.connectsTo;if(!connectsTo)return null;let subcircuit=this.getSubcircuit(),selectors=Array.isArray(connectsTo)?connectsTo:[connectsTo];for(let selector of selectors)if(selector.startsWith("net.")){let net=subcircuit.selectOne(selector,{type:"net"});if(net)return net}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_component2=db2.pcb_component.insert({center:position2,width:padDiameter,height:padDiameter,layer:this._parsedProps.fromLayer??"top",rotation:0,source_component_id:this.source_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,obstructs_within_bounds:!0});this.pcb_component_id=pcb_component2.pcb_component_id}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,group=this.getGroup(),subcircuit=this.getSubcircuit(),source_via=db2.source_manually_placed_via.insert({source_group_id:group?.source_group_id,source_net_id:props.net??"",subcircuit_id:subcircuit?.subcircuit_id??void 0});this.source_component_id=source_via.source_manually_placed_via_id}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=this._getResolvedViaDiameters(pcbStyle2),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_via2=db2.pcb_via.insert({x:position2.x,y:position2.y,hole_diameter:holeDiameter,outer_diameter:padDiameter,layers:["bottom","top"],from_layer:this._parsedProps.fromLayer||"bottom",to_layer:this._parsedProps.toLayer||"top",subcircuit_id:subcircuit?.subcircuit_id??void 0,subcircuit_connectivity_map_key:this.subcircuit_connectivity_map_key??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,net_is_assignable:this._parsedProps.netIsAssignable??void 0});this.pcb_via_id=pcb_via2.pcb_via_id;let connected=this._getConnectedNetOrTrace();connected&&"source_net_id"in connected&&connected.source_net_id&&db2.pcb_via.update(this.pcb_via_id,{pcb_trace_id:connected.source_net_id})}},EPSILON3=1e-9,isWireRoutePoint=routePoint=>routePoint.route_type==="wire",isPointOnSegment2=(p4,a2,b3)=>{let cross22=(p4.y-a2.y)*(b3.x-a2.x)-(p4.x-a2.x)*(b3.y-a2.y);if(Math.abs(cross22)>EPSILON3)return!1;let dot2=(p4.x-a2.x)*(b3.x-a2.x)+(p4.y-a2.y)*(b3.y-a2.y);if(dot2<-EPSILON3)return!1;let squaredLength=(b3.x-a2.x)**2+(b3.y-a2.y)**2;return!(dot2-squaredLength>EPSILON3)},isPointInRing=(point6,ring2)=>{if(ring2.length<3)return!1;let inside2=!1,previous=ring2[ring2.length-1];for(let current2 of ring2){if(isPointOnSegment2(point6,previous,current2))return!0;current2.y>point6.y!=previous.y>point6.y&&point6.x<(previous.x-current2.x)*(point6.y-current2.y)/(previous.y-current2.y)+current2.x&&(inside2=!inside2),previous=current2}return inside2},isPointInRectPour=(p4,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx3=p4.x-center2.x,dy3=p4.y-center2.y,localX=dx3*cosR-dy3*sinR,localY=dx3*sinR+dy3*cosR;return Math.abs(localX)<=width/2+EPSILON3&&Math.abs(localY)<=height/2+EPSILON3},isPointInBrepPour=(p4,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v5=>({x:v5.x,y:v5.y}));if(!isPointInRing(p4,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v5=>({x:v5.x,y:v5.y}));if(isPointInRing(p4,points))return!1}return!0},isPointInCopperPour=(point6,pour)=>pour.shape==="rect"?isPointInRectPour(point6,pour):pour.shape==="brep"?isPointInBrepPour(point6,pour):!1,isTraceConnectedToSourceNet=(trace,sourceNetId,sourceTraceById)=>{if(trace.source_trace_id===sourceNetId)return!0;if(!trace.source_trace_id)return!1;let sourceTrace=sourceTraceById.get(trace.source_trace_id);return sourceTrace?sourceTrace.connected_source_net_ids.includes(sourceNetId):!1},isSegmentFullyInsideCopperPour=(start,end,pour)=>{let dx3=end.x-start.x,dy3=end.y-start.y;return Math.hypot(dx3,dy3)<=EPSILON3?!1:[0,.25,.5,.75,1].every(t35=>isPointInCopperPour({x:start.x+dx3*t35,y:start.y+dy3*t35},pour))},markTraceSegmentsInsideCopperPour=({db:db2,copperPour})=>{if(!copperPour.source_net_id)return;let sourceTraceById=new Map(db2.source_trace.list().map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace]));for(let trace of db2.pcb_trace.list()){if(!isTraceConnectedToSourceNet(trace,copperPour.source_net_id,sourceTraceById))continue;let routeChanged=!1,nextRoute=trace.route.map(routePoint=>({...routePoint}));for(let i2=0;i2<nextRoute.length-1;i2++){let fromRoutePoint=nextRoute[i2],toRoutePoint=nextRoute[i2+1];!fromRoutePoint||!toRoutePoint||!isWireRoutePoint(fromRoutePoint)||!isWireRoutePoint(toRoutePoint)||fromRoutePoint.layer!==copperPour.layer||toRoutePoint.layer!==copperPour.layer||isSegmentFullyInsideCopperPour({x:fromRoutePoint.x,y:fromRoutePoint.y},{x:toRoutePoint.x,y:toRoutePoint.y},copperPour)&&(fromRoutePoint.is_inside_copper_pour=!0,fromRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,toRoutePoint.is_inside_copper_pour=!0,toRoutePoint.copper_pour_id=copperPour.pcb_copper_pour_id,routeChanged=!0)}routeChanged&&db2.pcb_trace.update(trace.pcb_trace_id,{route:nextRoute})}},CopperPour=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"CopperPour",zodProps:copperPourProps}}getPcbSize(){return{width:0,height:0}}doInitialCreateNetsFromProps(){let{_parsedProps:props}=this;createNetsFromProps(this,[props.connectsTo])}doInitialPcbCopperPourRender(){this.root?.pcbDisabled||this._queueAsyncEffect("PcbCopperPourRender",async()=>{let{db:db2}=this.root,{_parsedProps:props}=this,net=this.getSubcircuit().selectOne(props.connectsTo);if(!net||!net.source_net_id){this.renderError(`Net "${props.connectsTo}" not found for copper pour`);return}let subcircuit=this.getSubcircuit(),circuitJson=db2.toArray(),sourceNet=circuitJson.find(elm=>elm.type==="source_net"&&elm.name===net.name),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson),connectedNetId=sourceNet?.source_net_id??net.source_net_id,pourConnectivityKey=(connectedNetId?connectivityMap.getNetConnectedToId(connectedNetId):void 0)||sourceNet?.subcircuit_connectivity_map_key||"",clearance=props.clearance??.2,inputProblem=convertCircuitJsonToInputProblem(circuitJson,{layer:props.layer,pour_connectivity_key:pourConnectivityKey,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,board_edge_margin:props.boardEdgeMargin??clearance,cutout_margin:props.cutoutMargin??clearance,outline:props.outline}),solver=new CopperPourPipelineSolver(inputProblem);this.root.emit("solver:started",{solverName:"CopperPourPipelineSolver",solverParams:inputProblem,componentName:this.props.name});let{brep_shapes}=solver.getOutput(),coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brep_shape2 of brep_shapes){let insertedPour=db2.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brep_shape2,source_net_id:net.source_net_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db2,copperPour:insertedPour})}})}},CopperText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPcbPrimitive",!0);__publicField(this,"pcb_copper_text_id",null)}get config(){return{componentName:"CopperText",zodProps:copperTextProps}}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,container=this.getPrimitiveContainer(),position2=this._getGlobalPcbPositionBeforeLayout(),subcircuit=this.getSubcircuit(),pcb_copper_text2=db2.pcb_copper_text.insert({anchor_alignment:props.anchorAlignment,anchor_position:{x:position2.x,y:position2.y},font:"tscircuit2024",font_size:props.fontSize,layer:props.layer??"top",text:normalizeTextForCircuitJson(props.text),ccw_rotation:props.pcbRotation,is_mirrored:props.mirrored,is_knockout:props.knockout,pcb_component_id:container.pcb_component_id,subcircuit_id:subcircuit?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_copper_text_id=pcb_copper_text2.pcb_copper_text_id}getPcbSize(){let{_parsedProps:props}=this,fontSize=props.fontSize??1,textWidth=(props.text??"").length*fontSize,textHeight=fontSize;return{width:textWidth*fontSize,height:textHeight*fontSize}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root;if(!this.pcb_copper_text_id)return;let text=db2.pcb_copper_text.get(this.pcb_copper_text_id);text&&db2.pcb_copper_text.update(this.pcb_copper_text_id,{anchor_position:{x:text.anchor_position.x+deltaX,y:text.anchor_position.y+deltaY}})}},Battery=class extends NormalComponent3{get config(){return{componentName:"Battery",schematicSymbolName:this.props.symbolName??"battery",zodProps:batteryProps,sourceFtype:"simple_power_source"}}initPorts(){super.initPorts({additionalAliases:{pin1:["anode","pos","left"],pin2:["cathode","neg","right"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:"simple_power_source",capacity:props.capacity,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},PIN_HINT_RE=/^(?:pin)?(\d+)$/i,USB_C_STANDARD_PORT_HINT_ALIASES={GND1:[],VBUS1:[],SBU2:[],CC1:[],DM2:["DN2"],DP1:[],DM1:["DN1"],DP2:[],SBU1:[],CC2:[],VBUS2:[],GND2:[],SHELL1:[],SHELL2:[],SHELL3:[],SHELL4:[]},unique=hints=>Array.from(new Set(hints)),rewriteToStandardUsbCPortHints=circuitJson=>{let aliasToStandardHint={};for(let[standardHint,aliases2]of Object.entries(USB_C_STANDARD_PORT_HINT_ALIASES)){aliasToStandardHint[standardHint]=standardHint;for(let alias of aliases2)aliasToStandardHint[alias]=standardHint}let sourceAliasesByPin=new Map;for(let elm of circuitJson)if(elm&&typeof elm=="object"&&elm.type==="source_port"&&typeof elm.pin_number=="number"){let pin=elm.pin_number,hints=Array.isArray(elm.port_hints)?elm.port_hints.filter(h4=>typeof h4=="string").map(h4=>h4.trim()).filter(h4=>h4.length>0&&!PIN_HINT_RE.test(h4)):[];hints.length>0&&sourceAliasesByPin.set(pin,unique(hints))}return sourceAliasesByPin.size===0?circuitJson:circuitJson.map(elm=>{if(!elm||typeof elm!="object"||!("port_hints"in elm)||!Array.isArray(elm.port_hints))return elm;let originalHints=elm.port_hints.filter(h4=>typeof h4=="string").map(h4=>h4.trim()).filter(h4=>h4.length>0);if(originalHints.length===0)return elm;let pinNumbers=new Set;elm.type==="source_port"&&typeof elm.pin_number=="number"&&pinNumbers.add(elm.pin_number);for(let hint of originalHints){let m3=hint.match(PIN_HINT_RE);m3&&pinNumbers.add(Number.parseInt(m3[1],10))}let sourceAliases=[];for(let pin of pinNumbers)sourceAliases.push(...sourceAliasesByPin.get(pin)??[]);let standardHints=new Set;for(let hint of[...originalHints,...sourceAliases]){let standard=aliasToStandardHint[hint.toUpperCase()];standard&&standardHints.add(standard)}let addedHints=[];for(let standardHint of standardHints)addedHints.push(standardHint,...USB_C_STANDARD_PORT_HINT_ALIASES[standardHint]);let rewrittenPortHints=unique([...originalHints,...sourceAliases,...addedHints]);return{...elm,port_hints:rewrittenPortHints}})},Connector=class extends Chip{_getConnectorProps(){return this._parsedProps}_hasExplicitFootprint(){return this._getConnectorProps().footprint!==void 0||this.children.some(child=>child.componentName==="Footprint")}_shouldUseStandardPartsEngineCircuitJsonFlow(){return!(!this._getConnectorProps().standard||this._hasExplicitFootprint()||this.getInheritedProperty("partsEngineDisabled"))}_insertStandardConnectorCircuitJsonError(standard,message){let{db:db2}=this.root,errorObj=unknown_error_finding_part.parse({type:"unknown_error_finding_part",message:`Failed to fetch circuit JSON for ${this.getString()} (standard="${standard}"): ${message}`,source_component_id:this.source_component_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0});db2.unknown_error_finding_part.insert(errorObj)}_getSupplierPartNumbersToTry(supplierPartNumbers){let partNumbers=[];for(let supplier of Object.keys(supplierPartNumbers??{})){let nums=supplierPartNumbers?.[supplier];Array.isArray(nums)&&nums.length>0&&partNumbers.push(nums[0])}return partNumbers}async _tryFetchPartCircuitJson(fetchPartCircuitJson,params){let maybeCircuitJson=await Promise.resolve(fetchPartCircuitJson(params))??null;return Array.isArray(maybeCircuitJson)&&maybeCircuitJson.length>0?maybeCircuitJson:null}async _fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,manufacturerPartNumber){for(let supplierPartNumber of this._getSupplierPartNumbersToTry(supplierPartNumbers)){let circuitJson=await this._tryFetchPartCircuitJson(fetchPartCircuitJson,{supplierPartNumber});if(circuitJson)return circuitJson}return manufacturerPartNumber?this._tryFetchPartCircuitJson(fetchPartCircuitJson,{manufacturerPartNumber}):null}_addConnectorFootprintFromCircuitJson(standard,circuitJson){let rewrittenCircuitJson=standard==="usb_c"?rewriteToStandardUsbCPortHints(circuitJson):circuitJson,props=this._getConnectorProps(),fpComponents=createComponentsFromCircuitJson({componentName:this.name,componentRotation:String(props.pcbRotation??0),footprinterString:`standard:${standard}`,pinLabels:props.pinLabels,pcbPinLabels:props.pcbPinLabels},rewrittenCircuitJson);this.addAll(fpComponents),this._markDirty("InitializePortsFromChildren")}get config(){return{componentName:"Connector",zodProps:connectorProps,shouldRenderAsSchematicBox:!0}}doInitialSourceRender(){let{db:db2}=this.root,props=this._getConnectorProps(),source_component=db2.source_component.insert({ftype:"simple_connector",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName,standard:props.standard});this.source_component_id=source_component.source_component_id}_isUsingStandardPartsEngineCircuitJsonFlow(){return this._shouldUseStandardPartsEngineCircuitJsonFlow()?!!this.getInheritedProperty("partsEngine")?.fetchPartCircuitJson:!1}doInitialFetchPartFootprint(){let props=this._getConnectorProps(),standard=props.standard;if(!standard||!this._shouldUseStandardPartsEngineCircuitJsonFlow()||this._hasStartedFootprintUrlLoad)return;let partsEngine2=this.getInheritedProperty("partsEngine");if(partsEngine2&&!partsEngine2.fetchPartCircuitJson){this._insertStandardConnectorCircuitJsonError(standard,"partsEngine.fetchPartCircuitJson is not configured");return}let fetchPartCircuitJson=partsEngine2?.fetchPartCircuitJson;if(!fetchPartCircuitJson)return;this._hasStartedFootprintUrlLoad=!0;let sourceComponentForQuery={ftype:"simple_connector",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,standard};this._queueAsyncEffect("load-standard-connector-circuit-json",async()=>{let{db:db2}=this.root;try{let supplierPartNumbers=await this._getSupplierPartNumbers(partsEngine2,sourceComponentForQuery,`standard:${standard}`);this.source_component_id&&db2.source_component.update(this.source_component_id,{supplier_part_numbers:supplierPartNumbers});let circuitJson=await this._fetchStandardConnectorCircuitJson(fetchPartCircuitJson,supplierPartNumbers,sourceComponentForQuery.manufacturer_part_number);if(!circuitJson)return;this._addConnectorFootprintFromCircuitJson(standard,circuitJson)}catch(error){this._insertStandardConnectorCircuitJsonError(standard,error.message)}})}doInitialPartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.doInitialPartsEngineRender()}updatePartsEngineRender(){this._isUsingStandardPartsEngineCircuitJsonFlow()||super.updatePartsEngineRender()}doInitialPcbComponentSizeCalculation(){if(super.doInitialPcbComponentSizeCalculation(),this.root?.pcbDisabled||!this.pcb_component_id||!this.source_component_id)return;let{db:db2}=this.root,connectorCircuitJson=db2.toArray().filter(elm=>elm.type==="pcb_component"?elm.pcb_component_id===this.pcb_component_id:elm.type==="source_component"?elm.source_component_id===this.source_component_id:"pcb_component_id"in elm&&elm.pcb_component_id===this.pcb_component_id||"source_component_id"in elm&&elm.source_component_id===this.source_component_id);if(connectorCircuitJson.length===0)return;let inferredInsertionCenter=guessCableInsertCenter(connectorCircuitJson);db2.pcb_component.update(this.pcb_component_id,{cable_insertion_center:{x:inferredInsertionCenter.x,y:inferredInsertionCenter.y}})}},PinHeader=class extends NormalComponent3{_getPcbRotationBeforeLayout(){let orientationRotation=this.props.pcbOrientation==="vertical"?-90:0;return(super._getPcbRotationBeforeLayout()??0)+orientationRotation}get config(){return{componentName:"PinHeader",zodProps:pinHeaderProps,shouldRenderAsSchematicBox:!0}}_getImpliedFootprintString(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:0),holeDiameter=this._parsedProps.holeDiameter,platedDiameter=this._parsedProps.platedDiameter,pitch=this._parsedProps.pitch,showSilkscreenPinLabels=this._parsedProps.showSilkscreenPinLabels,rows=this._parsedProps.doubleRow?2:1;if(pinCount>0){let footprintString;if(pitch)!holeDiameter&&!platedDiameter?footprintString=`pinrow${pinCount}_p${pitch}`:footprintString=`pinrow${pinCount}_p${pitch}_id${holeDiameter}_od${platedDiameter}`;else if(!holeDiameter&&!platedDiameter)footprintString=`pinrow${pinCount}`;else return null;return showSilkscreenPinLabels!==!0&&(footprintString+="_nopinlabels"),rows>1&&(footprintString+=`_rows${rows}`),footprintString}return null}initPorts(){let pinCount=this._parsedProps.pinCount??(Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels.length:this._parsedProps.pinLabels?Object.keys(this._parsedProps.pinLabels).length:1);for(let i2=1;i2<=pinCount;i2++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i2-1]:this._parsedProps.pinLabels?.[`pin${i2}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i2,name:primaryLabel,aliases:[`pin${i2}`,...otherLabels]}))}else this.add(new Port({pinNumber:i2,name:`pin${i2}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement;return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??Array.from({length:pinCount},(_5,i2)=>`pin${i2+1}`)}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??Array.from({length:pinCount},(_5,i2)=>`pin${i2+1}`)}}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_pin_header",name:this.name,supplier_part_numbers:props.supplierPartNumbers,pin_count:props.pinCount,gender:props.gender,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function getResonatorSymbolName(variant){switch(variant){case"two_ground_pins":return"crystal_4pin";case"ground_pin":return"resonator";case"no_ground":return"crystal";default:return"crystal"}}var Resonator=class extends NormalComponent3{get config(){return{componentName:"Resonator",schematicSymbolName:this.props.symbolName??getResonatorSymbolName(this.props.pinVariant),zodProps:resonatorProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"no_ground",source_component=db2.source_component.insert({ftype:"simple_resonator",name:this.name,frequency:props.frequency,load_capacitance:props.loadCapacitance,supplier_part_numbers:props.supplierPartNumbers,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="no_ground"||pinVariant==="ground_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}};function getPotentiometerSymbolName(variant){switch(variant){case"three_pin":return"potentiometer3";case"two_pin":return"potentiometer2";default:return"potentiometer2"}}var Potentiometer=class extends NormalComponent3{get config(){return{componentName:"Potentiometer",schematicSymbolName:this.props.symbolName??getPotentiometerSymbolName(this.props.pinVariant),zodProps:potentiometerProps,shouldRenderAsSchematicBox:!1}}_getSchematicSymbolDisplayValue(){return`${formatSiUnit(this._parsedProps.maxResistance)}\u03A9`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,pinVariant=props.pinVariant||"two_pin",source_component=db2.source_component.insert({ftype:"simple_potentiometer",name:this.name,max_resistance:props.maxResistance,pin_variant:pinVariant,are_pins_interchangeable:pinVariant==="two_pin",display_name:props.displayName,display_max_resistance:this._getSchematicSymbolDisplayValue()});this.source_component_id=source_component.source_component_id}},PushButton=class extends NormalComponent3{get config(){return{componentName:"PushButton",schematicSymbolName:this.props.symbolName??"push_button_normally_open_momentary",zodProps:pushButtonProps,sourceFtype:FTYPE.simple_push_button}}get defaultInternallyConnectedPinNames(){return[]}initPorts(){super.initPorts({pinCount:2,ignoreSymbolPorts:!0});let symbol=Vf[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p4=>p4.labels.includes("1")),symPort2=symbol.ports.find(p4=>p4.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p4=>p4.props.pinNumber===1),pin2Port=ports.find(p4=>p4.props.pinNumber===2),pin3Port=ports.find(p4=>p4.props.pinNumber===3),pin4Port=ports.find(p4=>p4.props.pinNumber===4),{internallyConnectedPins}=this._parsedProps;pin1Port.schematicSymbolPortDef=symPort1,(!internallyConnectedPins||internallyConnectedPins.length===0)&&(pin2Port.schematicSymbolPortDef=symPort2);for(let[pn3,port]of[[2,pin2Port],[3,pin3Port],[4,pin4Port]]){let internallyConnectedRow=internallyConnectedPins?.find(([pin1,pin2])=>pin1===`pin${pn3}`||pin2===`pin${pn3}`);if(!internallyConnectedRow){port.schematicSymbolPortDef=symPort2;break}(internallyConnectedRow?.[0]===`pin${pn3}`?internallyConnectedRow[1]:internallyConnectedRow?.[0])!=="pin1"&&(port.schematicSymbolPortDef=symPort2)}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_push_button,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Crystal=class extends NormalComponent3{get config(){return{schematicSymbolName:this.props.symbolName??(this.props.pinVariant==="four_pin"?"crystal_4pin":"crystal"),componentName:"Crystal",zodProps:crystalProps,sourceFtype:"simple_crystal"}}initPorts(){let additionalAliases=this.props.pinVariant==="four_pin"?{pin1:["left1","1"],pin2:["top1","2","gnd1"],pin3:["right1","3"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left"],pin2:["neg","right"]};super.initPorts({additionalAliases})}_getSchematicSymbolDisplayValue(){let freqDisplay=`${formatSiUnit(this._parsedProps.frequency)}Hz`;return this._parsedProps.loadCapacitance?`${freqDisplay} / ${formatSiUnit(this._parsedProps.loadCapacitance)}F`:freqDisplay}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({name:this.name,ftype:"simple_crystal",frequency:props.frequency,load_capacitance:props.loadCapacitance,pin_variant:props.pinVariant||"two_pin",are_pins_interchangeable:(props.pinVariant||"two_pin")==="two_pin",display_name:props.displayName});this.source_component_id=source_component.source_component_id}},Mosfet=class extends NormalComponent3{get config(){let mosfetMode=this.props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${this.props.channelType}_channel_${mosfetMode}_mosfet_transistor`;return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??baseSymbolName,zodProps:mosfetProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_mosfet",name:this.name,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},OpAmp=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"inverting_input",this.portMap.inverting_input);__publicField(this,"non_inverting_input",this.portMap.non_inverting_input);__publicField(this,"output",this.portMap.output);__publicField(this,"positive_supply",this.portMap.positive_supply);__publicField(this,"negative_supply",this.portMap.negative_supply)}get config(){let hasPowerConnections=this.props.connections?.positive_supply||this.props.connections?.negative_supply;return{componentName:"OpAmp",schematicSymbolName:this.props.symbolName?this.props.symbolName:hasPowerConnections?"opamp_with_power":"opamp_no_power",zodProps:opampProps,sourceFtype:"simple_op_amp"}}initPorts(){super.initPorts({pinCount:5,additionalAliases:{pin1:["non_inverting_input"],pin2:["inverting_input"],pin3:["output"],pin4:["positive_supply","vcc","vdd"],pin5:["negative_supply","vee","vss","gnd"]}})}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"simple_op_amp",name:this.name,supplier_part_numbers:props.supplierPartNumbers,display_name:props.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,invertingInputPort=this.portMap.inverting_input,nonInvertingInputPort=this.portMap.non_inverting_input,outputPort=this.portMap.output,positiveSupplyPort=this.portMap.positive_supply,negativeSupplyPort=this.portMap.negative_supply;!invertingInputPort?.source_port_id||!nonInvertingInputPort?.source_port_id||!outputPort?.source_port_id||!positiveSupplyPort?.source_port_id||!negativeSupplyPort?.source_port_id||db2.simulation_op_amp.insert({type:"simulation_op_amp",source_component_id:this.source_component_id,inverting_input_source_port_id:invertingInputPort.source_port_id,non_inverting_input_source_port_id:nonInvertingInputPort.source_port_id,output_source_port_id:outputPort.source_port_id,positive_supply_source_port_id:positiveSupplyPort.source_port_id,negative_supply_source_port_id:negativeSupplyPort.source_port_id})}};function hasSimProps(props){return props.simSwitchFrequency!==void 0||props.simCloseAt!==void 0||props.simOpenAt!==void 0||props.simStartClosed!==void 0||props.simStartOpen!==void 0}var Switch=class extends NormalComponent3{_getSwitchType(){let props=this._parsedProps;return props?props.dpdt?"dpdt":props.spst?"spst":props.spdt?"spdt":props.dpst?"dpst":props.type??"spst":"spst"}get config(){let switchType=this._getSwitchType(),isNormallyClosed=this._parsedProps?.isNormallyClosed??!1,symbolMap={spst:isNormallyClosed?"spst_normally_closed_switch":"spst_switch",spdt:isNormallyClosed?"spdt_normally_closed_switch":"spdt_switch",dpst:isNormallyClosed?"dpst_normally_closed_switch":"dpst_switch",dpdt:isNormallyClosed?"dpdt_normally_closed_switch":"dpdt_switch"};return{componentName:"Switch",schematicSymbolName:this.props.symbolName??symbolMap[switchType],zodProps:switchProps,shouldRenderAsSchematicBox:!1}}doInitialSourceRender(){let{db:db2}=this.root,props=this._parsedProps??{},source_component=db2.source_component.insert({ftype:"simple_switch",name:this.name,are_pins_interchangeable:this._getSwitchType()==="spst",display_name:props?.displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{_parsedProps:props}=this;if(!hasSimProps(props))return;let{db:db2}=this.root,simulationSwitch={type:"simulation_switch",source_component_id:this.source_component_id||""};props.simSwitchFrequency!==void 0&&(simulationSwitch.switching_frequency=frequency.parse(props.simSwitchFrequency)),props.simCloseAt!==void 0&&(simulationSwitch.closes_at=ms.parse(props.simCloseAt)),props.simOpenAt!==void 0&&(simulationSwitch.opens_at=ms.parse(props.simOpenAt)),props.simStartOpen!==void 0&&(simulationSwitch.starts_closed=!props.simStartOpen),props.simStartClosed!==void 0&&(simulationSwitch.starts_closed=props.simStartClosed),db2.simulation_switch.insert(simulationSwitch)}},TESTPOINT_DEFAULTS={HOLE_DIAMETER:.5,SMT_CIRCLE_DIAMETER:1.2,SMT_RECT_SIZE:2},TestPoint=class extends NormalComponent3{get config(){return{componentName:"TestPoint",schematicSymbolName:this.props.symbolName??"testpoint",zodProps:testpointProps,sourceFtype:FTYPE.simple_test_point}}_getPropsWithDefaults(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._parsedProps;return!footprintVariant&&holeDiameter&&(footprintVariant="through_hole"),footprintVariant??(footprintVariant="through_hole"),padShape??(padShape="circle"),footprintVariant==="pad"?padShape==="circle"?padDiameter??(padDiameter=TESTPOINT_DEFAULTS.SMT_CIRCLE_DIAMETER):padShape==="rect"&&(width??(width=TESTPOINT_DEFAULTS.SMT_RECT_SIZE),height??(height=width)):footprintVariant==="through_hole"&&(holeDiameter??(holeDiameter=TESTPOINT_DEFAULTS.HOLE_DIAMETER)),{padShape,holeDiameter,footprintVariant,padDiameter,width,height}}_getImpliedFootprintString(){let{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults();if(footprintVariant==="through_hole")return`platedhole_d${holeDiameter}`;if(footprintVariant==="pad"){if(padShape==="circle")return`smtpad_circle_d${padDiameter}`;if(padShape==="rect")return`smtpad_rect_w${width}_h${height}`}throw new Error(`Footprint variant "${footprintVariant}" with pad shape "${padShape}" not implemented`)}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,{padShape,holeDiameter,footprintVariant,padDiameter,width,height}=this._getPropsWithDefaults(),source_component=db2.source_component.insert({ftype:FTYPE.simple_test_point,name:this.name,supplier_part_numbers:props.supplierPartNumbers,footprint_variant:footprintVariant,pad_shape:padShape,pad_diameter:padDiameter,hole_diameter:holeDiameter,width,height,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},SchematicText=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_text_id")}get config(){return{componentName:"SchematicText",zodProps:schematicTextProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,text=this._resolveText(),schematic_text2=db2.schematic_text.insert({schematic_symbol_id,anchor:props.anchor??"center",text:normalizeTextForCircuitJson(text),font_size:props.fontSize,color:props.color||"#000000",position:{x:globalPos.x,y:globalPos.y},rotation:props.schRotation??0});this.schematic_text_id=schematic_text2.schematic_text_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_text_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,text=db2.schematic_text.get(this.schematic_text_id);if(!text)return;let newPosition=applyToPoint2(transform5,text.position);db2.schematic_text.update(this.schematic_text_id,{position:{x:newPosition.x,y:newPosition.y}})}},SchematicLine=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_line_id")}get config(){return{componentName:"SchematicLine",zodProps:schematicLineProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_line2=db2.schematic_line.insert({schematic_component_id,schematic_symbol_id,x1:props.x1+globalPos.x,y1:props.y1+globalPos.y,x2:props.x2+globalPos.x,y2:props.y2+globalPos.y,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:!1,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_line_id=schematic_line2.schematic_line_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_line_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,line2=db2.schematic_line.get(this.schematic_line_id);if(!line2)return;let p12=applyToPoint2(transform5,{x:line2.x1,y:line2.y1}),p22=applyToPoint2(transform5,{x:line2.x2,y:line2.y2});db2.schematic_line.update(this.schematic_line_id,{x1:p12.x,y1:p12.y,x2:p22.x,y2:p22.y})}},SchematicRect=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_rect_id")}get config(){return{componentName:"SchematicRect",zodProps:schematicRectProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_rect2=db2.schematic_rect.insert({schematic_symbol_id,center:{x:globalPos.x,y:globalPos.y},width:props.width,height:props.height,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,schematic_component_id,is_dashed:props.isDashed,rotation:props.rotation??0,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_rect_id=schematic_rect2.schematic_rect_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_rect_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,rect=db2.schematic_rect.get(this.schematic_rect_id);if(!rect)return;let topLeft=applyToPoint2(transform5,{x:rect.center.x-rect.width/2,y:rect.center.y+rect.height/2}),bottomRight=applyToPoint2(transform5,{x:rect.center.x+rect.width/2,y:rect.center.y-rect.height/2}),newWidth=Math.abs(bottomRight.x-topLeft.x),newHeight=Math.abs(topLeft.y-bottomRight.y),newCenter={x:(topLeft.x+bottomRight.x)/2,y:(topLeft.y+bottomRight.y)/2};db2.schematic_rect.update(this.schematic_rect_id,{center:newCenter,width:newWidth,height:newHeight})}},SchematicArc=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_arc_id")}get config(){return{componentName:"SchematicArc",zodProps:schematicArcProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_arc2=db2.schematic_arc.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,start_angle_degrees:props.startAngleDegrees,end_angle_degrees:props.endAngleDegrees,direction:props.direction,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_arc_id=schematic_arc2.schematic_arc_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_arc_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,arc2=db2.schematic_arc.get(this.schematic_arc_id);if(!arc2)return;let newCenter=applyToPoint2(transform5,arc2.center),edgePoint=applyToPoint2(transform5,{x:arc2.center.x+arc2.radius,y:arc2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db2.schematic_arc.update(this.schematic_arc_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}},SchematicCircle=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_circle_id")}get config(){return{componentName:"SchematicCircle",zodProps:schematicCircleProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,schematic_circle2=db2.schematic_circle.insert({schematic_component_id,schematic_symbol_id,center:{x:props.center.x+globalPos.x,y:props.center.y+globalPos.y},radius:props.radius,stroke_width:props.strokeWidth??SCHEMATIC_COMPONENT_OUTLINE_STROKE_WIDTH,color:props.color??SCHEMATIC_COMPONENT_OUTLINE_COLOR,is_filled:props.isFilled,fill_color:props.fillColor,is_dashed:props.isDashed,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_circle_id=schematic_circle2.schematic_circle_id}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||!this.schematic_circle_id)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root,circle2=db2.schematic_circle.get(this.schematic_circle_id);if(!circle2)return;let newCenter=applyToPoint2(transform5,circle2.center),edgePoint=applyToPoint2(transform5,{x:circle2.center.x+circle2.radius,y:circle2.center.y}),newRadius=Math.abs(edgePoint.x-newCenter.x);db2.schematic_circle.update(this.schematic_circle_id,{center:{x:newCenter.x,y:newCenter.y},radius:newRadius})}};function sampleCurveSegment(segmentPath,samplesPerUnit){let commander=new Ci3(segmentPath),length7=commander.getTotalLength(),numSamples=Math.max(2,Math.ceil(length7*samplesPerUnit)),points=[];for(let i2=1;i2<=numSamples;i2++){let t35=i2/numSamples*length7,point6=commander.getPointAtLength(t35);points.push({x:point6.x,y:point6.y})}return points}function svgPathToPoints(svgPath,samplesPerUnit=10){let pathCommander=new Ci3(svgPath);pathCommander.toAbsolute();let segments=pathCommander.segments,result=[],currentPoints=[],currentX=0,currentY=0,subpathStartX=0,subpathStartY=0;for(let segment2 of segments)switch(segment2[0]){case"M":{currentPoints.length>0&&result.push(currentPoints),currentX=segment2[1],currentY=segment2[2],subpathStartX=currentX,subpathStartY=currentY,currentPoints=[{x:currentX,y:currentY}];break}case"L":{currentX=segment2[1],currentY=segment2[2],currentPoints.push({x:currentX,y:currentY});break}case"H":{currentX=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"V":{currentY=segment2[1],currentPoints.push({x:currentX,y:currentY});break}case"Z":{(currentX!==subpathStartX||currentY!==subpathStartY)&¤tPoints.push({x:subpathStartX,y:subpathStartY}),currentX=subpathStartX,currentY=subpathStartY;break}case"C":{let endX=segment2[5],endY=segment2[6],segmentPath=`M ${currentX} ${currentY} C ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"S":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} S ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"Q":{let endX=segment2[3],endY=segment2[4],segmentPath=`M ${currentX} ${currentY} Q ${segment2[1]} ${segment2[2]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"T":{let endX=segment2[1],endY=segment2[2],segmentPath=`M ${currentX} ${currentY} T ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}case"A":{let endX=segment2[6],endY=segment2[7],segmentPath=`M ${currentX} ${currentY} A ${segment2[1]} ${segment2[2]} ${segment2[3]} ${segment2[4]} ${segment2[5]} ${endX} ${endY}`,sampledPoints=sampleCurveSegment(segmentPath,samplesPerUnit);currentPoints.push(...sampledPoints),currentX=endX,currentY=endY;break}}return currentPoints.length>0&&result.push(currentPoints),result.map(points=>{let deduped=[];for(let point6 of points)(deduped.length===0||Math.abs(deduped[deduped.length-1].x-point6.x)>1e-9||Math.abs(deduped[deduped.length-1].y-point6.y)>1e-9)&&deduped.push(point6);return deduped})}var SchematicPath=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_path_ids",[])}get config(){return{componentName:"SchematicPath",zodProps:schematicPathProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalSchematicPositionBeforeLayout(),schematic_component_id=this.getPrimitiveContainer()?.parent?.schematic_component_id,schematic_symbol_id=this._getSymbolAncestor()?.schematic_symbol_id,subcircuit_id=this.getSubcircuit().subcircuit_id??void 0;if(this.schematic_path_ids=[],props.svgPath){let subpaths=svgPathToPoints(props.svgPath);for(let subpathPoints of subpaths){let schematic_path2=db2.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:subpathPoints.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path2.schematic_path_id)}}else if(props.points&&props.points.length>0){let schematic_path2=db2.schematic_path.insert({schematic_component_id,schematic_symbol_id,points:props.points.map(point6=>({x:point6.x+globalPos.x,y:point6.y+globalPos.y})),is_filled:props.isFilled,fill_color:props.fillColor,stroke_color:props.strokeColor,stroke_width:props.strokeWidth,subcircuit_id});this.schematic_path_ids.push(schematic_path2.schematic_path_id)}}doInitialSchematicSymbolResize(){if(this.root?.schematicDisabled||this.schematic_path_ids.length===0)return;let transform5=this._getSymbolAncestor()?.getUserCoordinateToResizedSymbolTransform();if(!transform5)return;let{db:db2}=this.root;for(let pathId of this.schematic_path_ids){let path=db2.schematic_path.get(pathId);if(!path)continue;let newPoints=path.points.map(point6=>{let transformed=applyToPoint2(transform5,point6);return{x:transformed.x,y:transformed.y}});db2.schematic_path.update(pathId,{points:newPoints})}}};function getTitleAnchorAndPosition({anchor,x:x5,y:y5,width,height,isInside}){switch(anchor){case"top_left":return{x:x5,y:y5+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x5+width/2,y:y5+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x5+width,y:y5+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x5,y:y5+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x5+width/2,y:y5+height/2,textAnchor:"center"};case"center_right":return{x:x5+width,y:y5+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x5,y:y5,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x5+width/2,y:y5,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x5+width,y:y5,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x5+width/2,y:y5+height,textAnchor:"center"}}}var SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,basePadding=.6,generalPadding=typeof props.padding=="number"?props.padding:0,paddingTop=typeof props.paddingTop=="number"?props.paddingTop:generalPadding,paddingBottom=typeof props.paddingBottom=="number"?props.paddingBottom:generalPadding,paddingLeft=typeof props.paddingLeft=="number"?props.paddingLeft:generalPadding,paddingRight=typeof props.paddingRight=="number"?props.paddingRight:generalPadding,hasOverlay=props.overlay&&props.overlay.length>0,hasFixedSize=typeof props.width=="number"&&typeof props.height=="number",width,height,x5,y5,centerX,centerY;if(hasOverlay){let portsWithPosition=props.overlay.map(selector=>({selector,port:this.getSubcircuit().selectOne(selector,{type:"port"})})).filter(({port})=>port!=null).map(({port})=>({position:port._getGlobalSchematicPositionAfterLayout()}));if(portsWithPosition.length===0)return;let xs3=portsWithPosition.map(p4=>p4.position.x),ys3=portsWithPosition.map(p4=>p4.position.y),minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3),rawWidth=maxX-minX,rawHeight=maxY-minY,defaultHorizontalPadding=rawWidth===0?basePadding:0,defaultVerticalPadding=rawHeight===0?basePadding:0,finalPaddingLeft=paddingLeft+defaultHorizontalPadding/2,finalPaddingRight=paddingRight+defaultHorizontalPadding/2,finalPaddingTop=paddingTop+defaultVerticalPadding/2,finalPaddingBottom=paddingBottom+defaultVerticalPadding/2,left=minX-finalPaddingLeft,right=maxX+finalPaddingRight,top=minY-finalPaddingBottom,bottom=maxY+finalPaddingTop;width=right-left,height=bottom-top,x5=left+(props.schX??0),y5=top+(props.schY??0),centerX=x5+width/2,centerY=y5+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x5=centerX-width/2,y5=centerY-height/2}else return;if(db2.schematic_box.insert({height,width,x:x5,y:y5,is_dashed:props.strokeStyle==="dashed"}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x5,y:y5,width,height,isInside}),titleOffsetY,titleOffsetX,textAnchor=anchorPos.textAnchor;isInside?(titleOffsetY=anchor.includes("top")?-TITLE_PADDING:anchor.includes("bottom")?TITLE_PADDING:0,titleOffsetX=anchor.includes("left")?TITLE_PADDING:anchor.includes("right")?-TITLE_PADDING:0):(titleOffsetY=anchor.includes("top")?TITLE_PADDING:anchor.includes("bottom")?-TITLE_PADDING:0,titleOffsetX=anchor.includes("center_left")?-TITLE_PADDING:anchor.includes("center_right")?TITLE_PADDING:0);let titleX=anchorPos.x+titleOffsetX,titleY=anchorPos.y+titleOffsetY;db2.schematic_text.insert({anchor:textAnchor,text:props.title,font_size:props.titleFontSize??.18,color:props.titleColor??"#000000",position:{x:titleX,y:titleY},rotation:0})}}},SchematicTable=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"schematic_table_id",null)}get config(){return{componentName:"SchematicTable",zodProps:schematicTableProps}}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,rows=this.children.filter(c3=>c3.componentName==="SchematicRow");if(rows.length===0)return;let grid4=[],maxCols=0;for(let row of rows){let cells=row.children.filter(c3=>c3.componentName==="SchematicCell");maxCols=Math.max(maxCols,cells.length)}for(let i2=0;i2<rows.length;i2++)grid4[i2]=[];for(let i2=0;i2<rows.length;i2++){let cells=rows[i2].children.filter(c3=>c3.componentName==="SchematicCell"),k4=0;for(let j4=0;j4<cells.length;j4++){for(;grid4[i2][k4];)k4++;let cell=cells[j4],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r4=0;r4<rowSpan;r4++)for(let c3=0;c3<colSpan;c3++)grid4[i2+r4]||(grid4[i2+r4]=[]),grid4[i2+r4][k4+c3]=cell;k4+=colSpan}}maxCols=Math.max(0,...grid4.map(r4=>r4.length));let rowHeights=rows.map((row,i2)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_5,j4)=>{let maxWidth=0;for(let i2=0;i2<rows.length;i2++){let cell=grid4[i2]?.[j4];if(cell){let text=cell._parsedProps.text??cell._parsedProps.children,cellWidth=cell._parsedProps.width??(text?.length??2)*.5;cellWidth>maxWidth&&(maxWidth=cellWidth)}}return maxWidth||10}),anchorPos=this._getGlobalSchematicPositionBeforeLayout(),table=db2.schematic_table.insert({anchor_position:anchorPos,column_widths:colWidths,row_heights:rowHeights,cell_padding:props.cellPadding,border_width:props.borderWidth,anchor:props.anchor,subcircuit_id:this.getSubcircuit()?.subcircuit_id||"",schematic_component_id:this.parent?.schematic_component_id||""});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i2=0;i2<rows.length;i2++){let xOffset=0;for(let j4=0;j4<maxCols;j4++){let cell=grid4[i2]?.[j4];if(cell&&!processedCells.has(cell)){processedCells.add(cell);let cellProps=cell._parsedProps,rowSpan=cellProps.rowSpan??1,colSpan=cellProps.colSpan??1,cellWidth=0;for(let c3=0;c3<colSpan;c3++)cellWidth+=colWidths[j4+c3];let cellHeight=0;for(let r4=0;r4<rowSpan;r4++)cellHeight+=rowHeights[i2+r4];db2.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i2,end_row_index:i2+rowSpan-1,start_column_index:j4,end_column_index:j4+colSpan-1,text:cellProps.text??cellProps.children,center:{x:anchorPos.x+xOffset+cellWidth/2,y:anchorPos.y-yOffset-cellHeight/2},width:cellWidth,height:cellHeight,horizontal_align:cellProps.horizontalAlign,vertical_align:cellProps.verticalAlign,font_size:cellProps.fontSize??props.fontSize,subcircuit_id:this.getSubcircuit()?.subcircuit_id||""})}colWidths[j4]&&(xOffset+=colWidths[j4])}yOffset+=rowHeights[i2]}}},SchematicRow=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicRow",zodProps:schematicRowProps}}},SchematicCell=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"canHaveTextChildren",!0)}get config(){return{componentName:"SchematicCell",zodProps:schematicCellProps}}},SymbolComponent=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isPrimitiveContainer",!0);__publicField(this,"schematic_symbol_id");__publicField(this,"userCoordinateToResizedSymbolTransformMat");__publicField(this,"schematicSymbolBoundsInUserCoordinates")}get config(){return{componentName:"Symbol",zodProps:symbolProps}}hasExplicitSize(){let{_parsedProps:props}=this;return props.width!==void 0||props.height!==void 0}doInitialSymbolContainerRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,kicadSymbolMetadata3=this.getParentNormalComponent()?._parsedProps?.kicadSymbolMetadata,schematic_symbol2=db2.schematic_symbol.insert({name:props.name,metadata:kicadSymbolMetadata3?{kicad_symbol:kicadSymbolMetadata3}:void 0});this.schematic_symbol_id=schematic_symbol2.schematic_symbol_id}getSchematicSymbolBounds(){return this.schematicSymbolBoundsInUserCoordinates?this.schematicSymbolBoundsInUserCoordinates:(this._computeSchematicSymbolBounds(),this.schematicSymbolBoundsInUserCoordinates??null)}getUserCoordinateToResizedSymbolTransform(){return this.hasExplicitSize()?this.userCoordinateToResizedSymbolTransformMat?this.userCoordinateToResizedSymbolTransformMat:(this._computeUserCoordinateToResizedSymbolTransform(),this.userCoordinateToResizedSymbolTransformMat??null):null}_computeSchematicSymbolBounds(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,schematicElements=[];for(let child of this.children){if(child.componentName==="Port"){let portId=child.schematic_port_id;if(portId){let port=db2.schematic_port.get(portId);port&&schematicElements.push(port)}continue}if(child.isSchematicPrimitive){if(child.componentName==="SchematicLine"){let line2=db2.schematic_line.get(child.schematic_line_id);line2&&schematicElements.push(line2)}else if(child.componentName==="SchematicRect"){let rect=db2.schematic_rect.get(child.schematic_rect_id);rect&&schematicElements.push(rect)}else if(child.componentName==="SchematicCircle"){let circle2=db2.schematic_circle.get(child.schematic_circle_id);circle2&&schematicElements.push(circle2)}else if(child.componentName==="SchematicArc"){let arc2=db2.schematic_arc.get(child.schematic_arc_id);arc2&&schematicElements.push(arc2)}else if(child.componentName==="SchematicText"){let text=db2.schematic_text.get(child.schematic_text_id);text&&schematicElements.push(text)}else if(child.componentName==="SchematicPath"){let pathIds=child.schematic_path_ids;if(pathIds)for(let pathId of pathIds){let path=db2.schematic_path.get(pathId);path&&schematicElements.push(path)}}}}if(schematicElements.length===0)return;let bounds=getBoundsForSchematic(schematicElements);this.schematicSymbolBoundsInUserCoordinates=bounds}_computeUserCoordinateToResizedSymbolTransform(){let bounds=this.getSchematicSymbolBounds();if(!bounds)return;let{_parsedProps:props}=this,targetWidth=props.width,targetHeight=props.height;if(targetWidth===void 0&&targetHeight===void 0)return;let currentWidth=bounds.maxX-bounds.minX,currentHeight=bounds.maxY-bounds.minY;if(currentWidth===0&¤tHeight===0)return;let currentCenterX=(bounds.minX+bounds.maxX)/2,currentCenterY=(bounds.minY+bounds.maxY)/2,scaleX=targetWidth!==void 0&¤tWidth>0?targetWidth/currentWidth:1,scaleY=targetHeight!==void 0&¤tHeight>0?targetHeight/currentHeight:1,globalPos=this._getGlobalSchematicPositionBeforeLayout();this.userCoordinateToResizedSymbolTransformMat=compose2(translate2(globalPos.x,globalPos.y),scale2(scaleX,scaleY),translate2(-currentCenterX,-currentCenterY))}},AnalogSimulation=class extends PrimitiveComponent2{get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}doInitialSimulationRender(){let{db:db2}=this.root,{duration,timePerStep}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01;db2.simulation_experiment.insert({name:"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,time_per_step:timePerStepMs})}};function getLabelBounds(probePosition,labelText,alignment,labelOffset=.3){let labelWidth=Math.max(labelText.length*.1,.3),labelHeightWithPadding=.25+.2,anchorX=probePosition.x,anchorY=probePosition.y,offsetMultiplier=labelOffset+labelWidth/2;alignment.includes("top")?anchorY+=offsetMultiplier:alignment.includes("bottom")&&(anchorY-=offsetMultiplier),alignment.includes("right")?anchorX+=offsetMultiplier:alignment.includes("left")&&(anchorX-=offsetMultiplier);let minX,maxX,minY,maxY;return alignment.includes("left")?(minX=anchorX,maxX=anchorX+labelWidth):alignment.includes("right")?(minX=anchorX-labelWidth,maxX=anchorX):(minX=anchorX-labelWidth/2,maxX=anchorX+labelWidth/2),alignment.includes("top")?(minY=anchorY-labelHeightWithPadding,maxY=anchorY):alignment.includes("bottom")?(minY=anchorY,maxY=anchorY+labelHeightWithPadding):(minY=anchorY-labelHeightWithPadding/2,maxY=anchorY+labelHeightWithPadding/2),{minX,maxX,minY,maxY}}function getElementBounds(elm){let cx3,cy3,w4,h4;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w4=elm.size?.width,h4=elm.size?.height;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w4=(elm.text?.length??0)*.1,h4=.2;else return null;return typeof cx3=="number"&&typeof cy3=="number"&&typeof w4=="number"&&typeof h4=="number"?{minX:cx3-w4/2,maxX:cx3+w4/2,minY:cy3-h4/2,maxY:cy3+h4/2}:null}function getOverlapArea(a2,b3){if(!doBoundsOverlap(a2,b3))return 0;let overlapWidth=Math.min(a2.maxX,b3.maxX)-Math.max(a2.minX,b3.minX),overlapHeight=Math.min(a2.maxY,b3.maxY)-Math.max(a2.minY,b3.minY);return overlapWidth*overlapHeight}function selectBestLabelAlignment({probePosition,labelText,schematicElements,defaultAlignment="top_right"}){let orderedAlignments=[defaultAlignment,...["top_right","top_left","bottom_right","bottom_left","top_center","bottom_center","center_right","center_left"].filter(a2=>a2!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds(probePosition,labelText,alignment),totalOverlapArea=0;for(let element of schematicElements){let elementBounds=getElementBounds(element);elementBounds&&(totalOverlapArea+=getOverlapArea(labelBounds,elementBounds))}if(totalOverlapArea===0)return alignment;totalOverlapArea<minOverlapArea&&(minOverlapArea=totalOverlapArea,bestAlignment=alignment)}return bestAlignment}var VoltageProbe=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_voltage_probe_id",null);__publicField(this,"schematic_voltage_probe_id",null);__publicField(this,"finalProbeName",null);__publicField(this,"color",null)}get config(){return{componentName:"VoltageProbe",zodProps:voltageProbeProps}}doInitialSimulationRender(){let{db:db2}=this.root,{connectsTo,name,referenceTo,color}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit){this.renderError("VoltageProbe must be inside a subcircuit");return}let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1){this.renderError("VoltageProbe must connect to exactly one port or net");return}let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"}),net=port?null:subcircuit.selectOne(targetSelector,{type:"net"});if(net&&net.componentName!=="Net"){this.renderError(`VoltageProbe connection target "${targetSelector}" resolved to a non-net component "${net.componentName}".`);return}if(!port&&!net){this.renderError(`VoltageProbe could not find connection target "${targetSelector}"`);return}let connectedId=port?.source_port_id??net?.source_net_id;if(!connectedId){this.renderError("Could not identify connected source for VoltageProbe");return}let referencePort=null,referenceNet=null;if(referenceTo){let referenceTargets=Array.isArray(referenceTo)?referenceTo:[referenceTo];if(referenceTargets.length!==1){this.renderError("VoltageProbe must reference exactly one port or net");return}let referenceSelector=referenceTargets[0];if(referencePort=subcircuit.selectOne(referenceSelector,{type:"port"}),referenceNet=referencePort?null:subcircuit.selectOne(referenceSelector,{type:"net"}),referenceNet&&referenceNet.componentName!=="Net"){this.renderError(`VoltageProbe reference target "${referenceSelector}" resolved to a non-net component "${referenceNet.componentName}".`);return}if(!referencePort&&!referenceNet){this.renderError(`VoltageProbe could not find reference target "${referenceSelector}"`);return}}this.color=color??getSimulationColorForId(connectedId);let finalName=name;finalName||(finalName=targets[0].split(" > ").map(s2=>s2.replace(/^\./,"")).join(".")),this.finalProbeName=finalName??null;let{simulation_voltage_probe_id}=db2.simulation_voltage_probe.insert({name:finalName,signal_input_source_port_id:port?.source_port_id??void 0,signal_input_source_net_id:net?.source_net_id??void 0,reference_input_source_port_id:referencePort?.source_port_id??void 0,reference_input_source_net_id:referenceNet?.source_net_id??void 0,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color});this.simulation_voltage_probe_id=simulation_voltage_probe_id}doInitialSchematicReplaceNetLabelsWithSymbols(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{connectsTo,name}=this._parsedProps,subcircuit=this.getSubcircuit();if(!subcircuit)return;let targets=Array.isArray(connectsTo)?connectsTo:[connectsTo];if(targets.length!==1)return;let targetSelector=targets[0],port=subcircuit.selectOne(targetSelector,{type:"port"});if(!port||!port.schematic_port_id)return;let position2=port._getGlobalSchematicPositionAfterLayout(),targetTraceId=null;for(let trace of db2.schematic_trace.list()){for(let edge of trace.edges)if(Math.abs(edge.from.x-position2.x)<1e-6&&Math.abs(edge.from.y-position2.y)<1e-6||Math.abs(edge.to.x-position2.x)<1e-6&&Math.abs(edge.to.y-position2.y)<1e-6){targetTraceId=trace.schematic_trace_id;break}if(targetTraceId)break}if(!targetTraceId)return;let probeName=this.finalProbeName,labelAlignment=selectBestLabelAlignment({probePosition:position2,labelText:probeName,schematicElements:[...db2.schematic_component.list(),...db2.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe2=db2.schematic_voltage_probe.insert({name:probeName,position:position2,schematic_trace_id:targetTraceId,subcircuit_id:subcircuit.subcircuit_id||void 0,color:this.color??void 0,label_alignment:labelAlignment});this.schematic_voltage_probe_id=schematic_voltage_probe2.schematic_voltage_probe_id}},RootCircuit=class extends IsolatedCircuit{constructor({platform,projectUrl}={}){super({platform,projectUrl,cachedSubcircuits:new Map,pendingSubcircuitRenders:new Map});__publicField(this,"isRootCircuit",!0);this.root=this}},Project=RootCircuit,Circuit=RootCircuit,useRenderedCircuit=reactElements=>{let[isLoading,setIsLoading]=import_react5.default.useState(!0),[error,setError]=import_react5.default.useState(null),[circuit,setCircuit]=import_react5.default.useState(),[circuitJson,setCircuitJson]=import_react5.default.useState();return import_react5.default.useEffect(()=>{setIsLoading(!0),setError(null),reactElements&&setTimeout(()=>{try{let circuit2=new RootCircuit;circuit2.add(reactElements),setCircuit(circuit2),setCircuitJson(circuit2.toJson())}catch(error2){setError(error2)}setIsLoading(!1)},1)},[reactElements]),{isLoading,error,circuit,circuitJson}},createUseComponent=(Component2,pins)=>(name,props)=>{let pinLabelsFlatArray=[];Array.isArray(pins)?pinLabelsFlatArray.push(...pins.flat()):typeof pins=="object"&&pinLabelsFlatArray.push(...Object.values(pins).flat(),...Object.keys(pins));let R5=props2=>{if(props2?.name&&props2.name!==name)throw new Error(`Component name mismatch. Hook name: ${name}, Component prop name: ${props2.name}`);let combinedProps={...props,...props2,name},tracesToCreate=[];for(let portLabel of pinLabelsFlatArray)if(combinedProps[portLabel]){let from=`.${name} > .${portLabel}`,to3=combinedProps[portLabel];tracesToCreate.push({from,to:to3}),delete combinedProps[portLabel]}return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Component2,{...combinedProps}),tracesToCreate.map((trace,i2)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i2))]})};for(let port of pinLabelsFlatArray)R5[port]=`.${name} > .${port}`;return R5},useCapacitor=createUseComponent(props=>(0,import_jsx_runtime2.jsx)("capacitor",{...props}),capacitorPins),useChip=pinLabels=>createUseComponent(props=>(0,import_jsx_runtime3.jsx)("chip",{pinLabels,...props}),pinLabels),useDiode=createUseComponent(props=>(0,import_jsx_runtime4.jsx)("diode",{...props}),diodePins),useLed=createUseComponent(props=>(0,import_jsx_runtime5.jsx)("led",{...props}),ledPins),useResistor=createUseComponent(props=>(0,import_jsx_runtime6.jsx)("resistor",{...props}),resistorPins),sel=new Proxy(refdes=>new Proxy({},{get:(_5,pin)=>`.${refdes} > .${pin}`}),{get:(_5,prop1)=>{let fn3=(...args)=>{let chipFnOrPinType=args[0];return new Proxy({},{get:(_22,pinName)=>`.${prop1} > .${pinName}`})};return new Proxy(fn3,{get:(_22,prop2)=>prop1==="net"?`net.${prop2}`:prop1==="subcircuit"?new Proxy({},{get:(_32,prop3)=>new Proxy({},{get:(_42,prop4)=>`subcircuit.${prop2} > .${prop3} > .${prop4}`})}):`.${prop1} > .${prop2}`,apply:(target,_22,args)=>prop1==="net"?new Proxy({},{get:(_32,netName)=>`net.${netName}`}):new Proxy({},{get:(_32,pinOrSubComponentName)=>{let pinResult=`.${prop1} > .${pinOrSubComponentName}`;return["U","J","CN"].some(p4=>prop1.startsWith(p4))?pinResult:new Proxy(new String(pinResult),{get:(_42,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({Bug:Chip});var React=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var getFootprinterStringFromKicad=kicadFootprint=>{let match2=kicadFootprint.match(/:[RC]_(\d{4})_/);if(match2||(match2=kicadFootprint.match(/:(SOIC-\d+|SOT-\d+|SOD-\d+|SSOP-\d+|TSSOP-\d+|QFP-\d+|QFN-\d+)/),match2))return match2[1]};var getJlcPackageFromFootprinterString=footprinterString=>footprinterString.includes("cap")?footprinterString.replace(/cap/g,""):footprinterString;var getJlcpcbPackageName=footprint=>{if(footprint){if(footprint.startsWith("kicad:")){let footprinterString=getFootprinterStringFromKicad(footprint);return footprinterString?getJlcPackageFromFootprinterString(footprinterString):footprint}return getJlcPackageFromFootprinterString(footprint)}};var cache=new Map,getJlcPartsCached=async(name,params)=>{let paramString=new URLSearchParams({...params,json:"true"}).toString();if(cache.has(paramString))return cache.get(paramString);let responseJson=await(await fetch(`https://jlcsearch.tscircuit.com/${name}/list?${paramString}`)).json();return cache.set(paramString,responseJson),responseJson},withBasicPartPreference=parts=>parts?[...parts].sort((a2,b3)=>Number(b3.is_basic??!1)-Number(a2.is_basic??!1)):[],jlcPartsEngine={findPart:async({sourceComponent,footprinterString})=>{let jlcpcbPackage=getJlcpcbPackageName(footprinterString);if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resistor"){let{resistors}=await getJlcPartsCached("resistors",{resistance:sourceComponent.resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resistors).map(r4=>`C${r4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_capacitor"){let{capacitors}=await getJlcPartsCached("capacitors",{capacitance:sourceComponent.capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(capacitors).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_pin_header"){let pitch;footprinterString?.includes("_p")&&(pitch=Number(footprinterString.split("_p")[1]));let{headers}=await getJlcPartsCached("headers",pitch?{pitch,num_pins:sourceComponent.pin_count,gender:sourceComponent.gender}:{num_pins:sourceComponent.pin_count,gender:sourceComponent.gender});return{jlcpcb:withBasicPartPreference(headers).map(h4=>`C${h4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_potentiometer"){let{potentiometers}=await getJlcPartsCached("potentiometers",{resistance:sourceComponent.max_resistance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(potentiometers).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_diode"){let{diodes}=await getJlcPartsCached("diodes",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(diodes).map(d3=>`C${d3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_chip"){if(!jlcpcbPackage||!footprinterString)return{};let{chips}=await getJlcPartsCached("chips",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(chips).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_transistor"){let{transistors}=await getJlcPartsCached("transistors",{package:jlcpcbPackage,transistor_type:sourceComponent.transistor_type});return{jlcpcb:withBasicPartPreference(transistors).map(t35=>`C${t35.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_power_source"){let{power_sources}=await getJlcPartsCached("power_sources",{voltage:sourceComponent.voltage,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(power_sources).map(p4=>`C${p4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_inductor"){let{inductors}=await getJlcPartsCached("inductors",{inductance:sourceComponent.inductance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(inductors).map(i2=>`C${i2.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_crystal"){let{crystals}=await getJlcPartsCached("crystals",{frequency:sourceComponent.frequency,load_capacitance:sourceComponent.load_capacitance,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(crystals).map(c3=>`C${c3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_mosfet"){let{mosfets}=await getJlcPartsCached("mosfets",{package:jlcpcbPackage,mosfet_mode:sourceComponent.mosfet_mode,channel_type:sourceComponent.channel_type});return{jlcpcb:withBasicPartPreference(mosfets).map(m3=>`C${m3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_resonator"){let{resonators}=await getJlcPartsCached("resonators",{frequency:sourceComponent.frequency,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(resonators).map(r4=>`C${r4.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_switch"){let{switches}=await getJlcPartsCached("switches",{switch_type:sourceComponent.type,package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(switches).map(s2=>`C${s2.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_led"){let{leds}=await getJlcPartsCached("leds",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(leds).map(l3=>`C${l3.lcsc}`).slice(0,3)}}else if(sourceComponent.type==="source_component"&&sourceComponent.ftype==="simple_fuse"){let{fuses}=await getJlcPartsCached("fuses",{package:jlcpcbPackage});return{jlcpcb:withBasicPartPreference(fuses).map(l3=>`C${l3.lcsc}`).slice(0,3)}}return{}}};var import_s_expression=__toESM(require_s_expression(),1);init_zod();var import_debug20=__toESM(require_browser(),1),import_debug21=__toESM(require_browser(),1),point22=external_exports.tuple([external_exports.coerce.number(),external_exports.coerce.number()]),point33=external_exports.tuple([external_exports.number(),external_exports.number(),external_exports.number()]),point5=external_exports.union([point22,point33]),fp_poly_arc_segment_def=external_exports.object({kind:external_exports.literal("arc"),start:point22,mid:point22,end:point22}),fp_poly_point_def=external_exports.union([point22,fp_poly_arc_segment_def]),attributes_def=external_exports.object({at:point5,size:point22,layer:external_exports.string(),layers:external_exports.array(external_exports.string()),roundrect_rratio:external_exports.number(),uuid:external_exports.string()}).partial(),property_def=external_exports.object({key:external_exports.string(),val:external_exports.string(),attributes:attributes_def}),drill_def=external_exports.object({oval:external_exports.boolean().default(!1),width:external_exports.number().optional(),height:external_exports.number().optional(),offset:point22.optional()}),hole_def=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point5,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a2=>typeof a2=="number"?{oval:!1,width:a2,height:a2}:"oval"in a2?a2:a2.length===2?{oval:!1,width:Number.parseFloat(a2[0]),height:Number.parseFloat(a2[0]),offset:point22.parse(a2[1].slice(1))}:a2.length===3||a2.length===4?{oval:a2[0]==="oval",width:Number.parseFloat(a2[1]),height:Number.parseFloat(a2[2]),offset:a2[3]?point22.parse(a2[3].slice(1)):void 0}:a2).pipe(drill_def),size:external_exports.union([external_exports.array(external_exports.number()).length(2).transform(([w4,h4])=>({width:w4,height:h4})),external_exports.object({width:external_exports.number(),height:external_exports.number()})]),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),uuid:external_exports.string().optional()}),pad_def2=external_exports.object({name:external_exports.string(),pad_type:external_exports.enum(["thru_hole","smd","np_thru_hole","connect"]),pad_shape:external_exports.enum(["roundrect","circle","rect","oval","trapezoid","custom"]),at:point5,size:point22,drill:external_exports.union([external_exports.number(),external_exports.array(external_exports.any()),drill_def]).transform(a2=>typeof a2=="number"?{oval:!1,width:a2,height:a2}:"oval"in a2?a2:a2.length===2?{oval:!1,width:Number.parseFloat(a2[0]),height:Number.parseFloat(a2[0]),offset:point22.parse(a2[1].slice(1))}:a2.length===3||a2.length===4?{oval:a2[0]==="oval",width:Number.parseFloat(a2[1]),height:Number.parseFloat(a2[2]),offset:a2[3]?point22.parse(a2[3].slice(1)):void 0}:a2).pipe(drill_def).optional(),layers:external_exports.array(external_exports.string()).optional(),roundrect_rratio:external_exports.number().optional(),chamfer_ratio:external_exports.number().optional(),solder_paste_margin:external_exports.number().optional(),solder_paste_margin_ratio:external_exports.number().optional(),clearance:external_exports.number().optional(),zone_connection:external_exports.union([external_exports.literal(0).describe("Pad is not connect to zone"),external_exports.literal(1).describe("Pad is connected to zone using thermal relief"),external_exports.literal(2).describe("Pad is connected to zone using solid fill")]).optional(),thermal_width:external_exports.number().optional(),thermal_gap:external_exports.number().optional(),uuid:external_exports.string().optional()}),effects_def=external_exports.object({font:external_exports.object({size:point22,thickness:external_exports.number().optional()})}).partial(),fp_text_def=external_exports.object({fp_text_type:external_exports.literal("user"),text:external_exports.string(),at:point5,layer:external_exports.string(),uuid:external_exports.string().optional(),effects:effects_def.partial()}),fp_arc_def=external_exports.object({start:point22,mid:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_circle_def=external_exports.object({center:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}),fp_poly_def=external_exports.object({pts:external_exports.array(fp_poly_point_def),stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional(),fill:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_rect_def=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),fill:external_exports.string().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),fp_line=external_exports.object({start:point22,end:point22,stroke:external_exports.object({width:external_exports.number(),type:external_exports.string()}).optional(),width:external_exports.number().optional(),layer:external_exports.string(),uuid:external_exports.string().optional()}).transform(data=>({...data,width:void 0,stroke:data.stroke??{width:data.width}})),kicad_mod_json_def=external_exports.object({footprint_name:external_exports.string(),version:external_exports.string().optional(),generator:external_exports.string().optional(),generator_version:external_exports.string().optional(),layer:external_exports.string(),descr:external_exports.string().default(""),tags:external_exports.array(external_exports.string()).optional(),properties:external_exports.array(property_def),fp_lines:external_exports.array(fp_line),fp_rects:external_exports.array(fp_rect_def).optional(),fp_texts:external_exports.array(fp_text_def),fp_arcs:external_exports.array(fp_arc_def),fp_circles:external_exports.array(fp_circle_def).optional(),fp_polys:external_exports.array(fp_poly_def).optional(),pads:external_exports.array(pad_def2),holes:external_exports.array(hole_def).optional()}),formatAttr=(val,attrKey)=>{if(attrKey==="effects"&&Array.isArray(val)){let effectsObj={};for(let elm of val)if(elm[0]==="font"){let fontObj={};for(let fontElm of elm.slice(1))fontElm.length===2?fontObj[fontElm[0].valueOf()]=Number.parseFloat(fontElm[1].valueOf()):fontObj[fontElm[0].valueOf()]=fontElm.slice(1).map(n3=>Number.parseFloat(n3.valueOf()));effectsObj.font=fontObj}return effects_def.parse(effectsObj)}if(attrKey==="pts")return val.map(segment2=>{let segmentType=segment2[0]?.valueOf?.()??segment2[0];if(segmentType==="xy")return segment2.slice(1).map(n3=>Number.parseFloat(n3.valueOf()));if(segmentType==="arc"){let arcObj={kind:"arc"};for(let arcAttr of segment2.slice(1)){let key=arcAttr[0].valueOf();arcObj[key]=arcAttr.slice(1).map(n3=>Number.parseFloat(n3.valueOf()))}return arcObj}return segment2});if(attrKey==="stroke"){let strokeObj={};for(let strokeElm of val){let strokePropKey=strokeElm[0].valueOf();strokeObj[strokePropKey]=formatAttr(strokeElm.slice(1),strokePropKey)}return strokeObj}return attrKey==="at"||attrKey==="size"||attrKey==="start"||attrKey==="mid"||attrKey==="end"?(Array.isArray(val)?val:[val]).map(n3=>n3?.valueOf?.()??n3).filter(v5=>typeof v5=="number"||typeof v5=="string"&&/^[-+]?\d*\.?\d+(e[-+]?\d+)?$/i.test(v5)).map(v5=>typeof v5=="number"?v5:Number.parseFloat(v5)):attrKey==="tags"?val.map(n3=>n3.valueOf()):attrKey==="generator_version"||attrKey==="version"?val[0].valueOf():val.length===2?val.valueOf():attrKey==="uuid"?Array.isArray(val)?val[0].valueOf():val.valueOf():/^[\d\.]+$/.test(val)&&!Number.isNaN(Number.parseFloat(val))?Number.parseFloat(val):Array.isArray(val)&&val.length===1?val[0].valueOf():Array.isArray(val)?val.map(s2=>s2.valueOf()):val},getAttr=(s2,key)=>{for(let elm of s2)if(Array.isArray(elm)&&elm[0]===key)return formatAttr(elm.slice(1),key)},debug11=(0,import_debug20.default)("kicad-mod-converter"),parseKicadModToKicadJson=fileContent=>{let kicadSExpr=(0,import_s_expression.default)(fileContent),footprintName=kicadSExpr[1].valueOf(),topLevelAttributes={},simpleTopLevelAttributes=Object.entries(kicad_mod_json_def.shape).filter(([attributeKey,def])=>def._def.typeName==="ZodString"||attributeKey==="tags").map(([attributeKey])=>attributeKey);for(let kicadSExprRow of kicadSExpr.slice(2)){if(!simpleTopLevelAttributes.includes(kicadSExprRow[0]))continue;let key=kicadSExprRow[0].valueOf(),val=formatAttr(kicadSExprRow.slice(1),key);topLevelAttributes[key]=val}let properties=kicadSExpr.slice(2).filter(row=>row[0]==="property").map(row=>{let key=row[1].valueOf(),val=row[2].valueOf(),attributes2=attributes_def.parse(row.slice(3).reduce((acc,attrAr)=>{let attrKey=attrAr[0].valueOf();return acc[attrKey]=formatAttr(attrAr.slice(1),attrKey),acc},{}));return{key,val,attributes:attributes2}}),padRows=kicadSExpr.slice(2).filter(row=>row[0]==="pad"),pads=[];for(let row of padRows){let at4=getAttr(row,"at"),size2=getAttr(row,"size"),drill=getAttr(row,"drill"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let padType=row[2].valueOf(),isCu=layers.some(l3=>l3.endsWith(".Cu")||l3==="*.Cu"||l3.includes(".Cu"));if(padType==="thru_hole")continue;if(!isCu&&padType!=="np_thru_hole"){debug11(`Skipping pad without copper layer: layers=${layers.join(", ")}`);continue}let roundrect_rratio=getAttr(row,"roundrect_rratio"),uuid=getAttr(row,"uuid"),padRaw={name:row[1].valueOf(),pad_type:row[2].valueOf(),pad_shape:row[3].valueOf(),at:at4,drill,size:size2,layers,roundrect_rratio,uuid};debug11(`attempting to parse pad: ${JSON.stringify(padRaw,null," ")}`),pads.push(pad_def2.parse(padRaw))}let fp_texts_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_text"),fp_texts=[];for(let fp_text_row of fp_texts_rows){let text=fp_text_row[2].valueOf(),at4=getAttr(fp_text_row,"at"),layer=getAttr(fp_text_row,"layer"),uuid=getAttr(fp_text_row,"uuid"),effects=getAttr(fp_text_row,"effects");fp_texts.push({fp_text_type:"user",text,at:at4,layer,uuid,effects})}let fp_lines=[],fp_lines_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_line");for(let fp_line_row of fp_lines_rows){let start=getAttr(fp_line_row,"start"),end=getAttr(fp_line_row,"end"),stroke=getAttr(fp_line_row,"stroke"),layer=getAttr(fp_line_row,"layer"),uuid=getAttr(fp_line_row,"uuid");fp_lines.push({start,end,stroke,layer,uuid})}let fp_rects=[],fp_rect_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_rect");for(let fp_rect_row of fp_rect_rows){let start=getAttr(fp_rect_row,"start"),end=getAttr(fp_rect_row,"end"),stroke=getAttr(fp_rect_row,"stroke"),layer=getAttr(fp_rect_row,"layer"),fill=getAttr(fp_rect_row,"fill"),uuid=getAttr(fp_rect_row,"uuid");!start||!end||!layer||fp_rects.push({start,end,stroke,fill,layer,uuid})}let fp_arcs=[],fp_arcs_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_arc");for(let fp_arc_row of fp_arcs_rows){let start=getAttr(fp_arc_row,"start"),mid=getAttr(fp_arc_row,"mid"),end=getAttr(fp_arc_row,"end"),stroke=getAttr(fp_arc_row,"stroke"),layer=getAttr(fp_arc_row,"layer"),uuid=getAttr(fp_arc_row,"uuid");!start||!end||!mid||!stroke||!layer||fp_arcs.push({start,mid,end,stroke,layer,uuid})}let fp_circles=[],fp_circles_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_circle");for(let fp_circle_row of fp_circles_rows){let center2=getAttr(fp_circle_row,"center"),end=getAttr(fp_circle_row,"end"),stroke=getAttr(fp_circle_row,"stroke"),fill=getAttr(fp_circle_row,"fill"),layer=getAttr(fp_circle_row,"layer"),uuid=getAttr(fp_circle_row,"uuid");!center2||!end||!stroke||!layer||fp_circles.push({center:center2,end,stroke,fill,layer,uuid})}let fp_polys=[],fp_polys_rows=kicadSExpr.slice(2).filter(row=>row[0]==="fp_poly");for(let fp_poly_row of fp_polys_rows){let pts=getAttr(fp_poly_row,"pts"),stroke=getAttr(fp_poly_row,"stroke"),width=getAttr(fp_poly_row,"width"),layer=getAttr(fp_poly_row,"layer"),uuid=getAttr(fp_poly_row,"uuid"),fill=getAttr(fp_poly_row,"fill"),normalizedStroke=stroke;!normalizedStroke&&typeof width=="number"?normalizedStroke={width,type:"solid"}:normalizedStroke&&typeof normalizedStroke=="object"&&typeof width=="number"&&normalizedStroke.width===void 0&&(normalizedStroke={...normalizedStroke,width}),fp_polys.push({pts,stroke:normalizedStroke,layer,uuid,fill})}let holes=[];for(let row of kicadSExpr.slice(2)){if(row[0]!=="pad"||row[2]?.valueOf?.()!=="thru_hole")continue;let name=row[1]?.valueOf?.(),pad_type=row[2]?.valueOf?.(),pad_shape=row[3]?.valueOf?.(),at4=getAttr(row,"at"),drill=getAttr(row,"drill"),size2=getAttr(row,"size");Array.isArray(size2)&&(size2[0]==="size"&&(size2=size2.slice(1)),size2={width:Number(size2[0]),height:Number(size2[1])});let uuid=getAttr(row,"uuid"),roundrect_rratio=getAttr(row,"roundrect_rratio"),layers=getAttr(row,"layers");Array.isArray(layers)?layers=layers.map(layer=>layer.valueOf()):typeof layers=="string"?layers=[layers]:layers||(layers=[]);let holeRaw={name,pad_type,pad_shape,at:at4,drill,size:size2,layers,roundrect_rratio,uuid};debug11(`attempting to parse holes: ${JSON.stringify(holeRaw,null,2)}`),holes.push(hole_def.parse(holeRaw))}return kicad_mod_json_def.parse({footprint_name:footprintName,...topLevelAttributes,properties,fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,holes,fp_polys})},TWO_PI=Math.PI*2,normalizeAngle2=angle=>{let result=angle%TWO_PI;return result<0&&(result+=TWO_PI),result},directedAngleCCW=(start,target)=>{let startNorm=normalizeAngle2(start),delta=normalizeAngle2(target)-startNorm;return delta<0&&(delta+=TWO_PI),delta};function calculateCenter(start,mid,end){let mid1={x:(start.x+mid.x)/2,y:(start.y+mid.y)/2},mid2={x:(mid.x+end.x)/2,y:(mid.y+end.y)/2},slope1=-(start.x-mid.x)/(start.y-mid.y),slope2=-(mid.x-end.x)/(mid.y-end.y),centerX=(mid1.y-mid2.y+slope2*mid2.x-slope1*mid1.x)/(slope2-slope1),centerY=mid1.y+slope1*(centerX-mid1.x);return{x:centerX,y:centerY}}function calculateRadius(center2,point42){return Math.sqrt((center2.x-point42.x)**2+(center2.y-point42.y)**2)}function calculateAngle(center2,point42){return Math.atan2(point42.y-center2.y,point42.x-center2.x)}var getArcLength=(start,mid,end)=>{let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;return ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI),Math.abs(radius*angleDelta)};function generateArcPath(start,mid,end,numPoints){let center2=calculateCenter(start,mid,end),radius=calculateRadius(center2,start),angleStart=calculateAngle(center2,start),angleMid=calculateAngle(center2,mid),angleEnd=calculateAngle(center2,end),ccwToMid=directedAngleCCW(angleStart,angleMid),ccwToEnd=directedAngleCCW(angleStart,angleEnd),angleDelta=ccwToEnd;ccwToMid>ccwToEnd&&(angleDelta=ccwToEnd-TWO_PI);let path=[];for(let i2=0;i2<=numPoints;i2++){let angle=angleStart+i2/numPoints*angleDelta,x5=center2.x+radius*Math.cos(angle),y5=center2.y+radius*Math.sin(angle);path.push({x:x5,y:y5})}return path}var makePoint=p4=>Array.isArray(p4)?{x:p4[0],y:p4[1]}:p4,pointsEqual=(p12,p22,tolerance=1e-4)=>Math.abs(p12.x-p22.x)<tolerance&&Math.abs(p12.y-p22.y)<tolerance,findClosedPolygons=segments=>{let polygons=[],used=new Set;for(let i2=0;i2<segments.length;i2++){if(used.has(i2))continue;let polygon2=[segments[i2]];used.add(i2);let currentEnd=segments[i2].end,foundNext=!0;for(;foundNext;){if(foundNext=!1,polygon2.length>1&&pointsEqual(currentEnd,polygon2[0].start)){polygons.push(polygon2);break}for(let j4=0;j4<segments.length;j4++)if(!used.has(j4)){if(pointsEqual(currentEnd,segments[j4].start)){polygon2.push(segments[j4]),used.add(j4),currentEnd=segments[j4].end,foundNext=!0;break}else if(pointsEqual(currentEnd,segments[j4].end)){segments[j4].type==="arc"?polygon2.push({...segments[j4],reversed:!0}):polygon2.push({...segments[j4],start:segments[j4].end,end:segments[j4].start}),used.add(j4),currentEnd=segments[j4].start,foundNext=!0;break}}if(!foundNext){for(let k4=polygon2.length-1;k4>=0;k4--){let idx=segments.indexOf(polygon2[k4]);idx!==-1&&used.delete(idx)}break}}}return polygons},polygonToPoints=polygon2=>{let points=[];for(let segment2 of polygon2)if(segment2.type==="line")points.push(segment2.start);else if(segment2.type==="arc"&&segment2.mid){let arcLength=getArcLength(segment2.start,segment2.mid,segment2.end),numPoints=Math.max(3,Math.ceil(arcLength)),arcPoints=generateArcPath(segment2.start,segment2.mid,segment2.end,numPoints);segment2.reversed&&(arcPoints=arcPoints.reverse()),points.push(...arcPoints.slice(0,-1))}return points};function getSilkscreenFontSizeFromFpTexts(fp_texts){if(!Array.isArray(fp_texts))return null;let refText=fp_texts.find(t35=>t35.layer?.toLowerCase()==="f.silks"&&(t35.text?.includes("${REFERENCE}")||t35.fp_text_type?.toLowerCase()==="reference"||t35.text?.match(/^R\d+|C\d+|U\d+/))),fallbackText=refText||fp_texts.find(t35=>t35.layer?.toLowerCase()==="f.fab"&&(t35.text?.includes("${REFERENCE}")||t35.fp_text_type?.toLowerCase()==="reference")),target=refText||fallbackText;if(!target?.effects?.font?.size)return null;let[width,height]=target.effects.font.size;return height??width??1}var degToRad=deg=>deg*Math.PI/180,rotatePoint3=(x5,y5,deg)=>{let r4=degToRad(deg),cos5=Math.cos(r4),sin5=Math.sin(r4);return{x:x5*cos5-y5*sin5,y:x5*sin5+y5*cos5}},getAxisAlignedRectFromPoints=points=>{let uniquePoints=[...new Map(points.map(p4=>[`${p4.x},${p4.y}`,p4])).values()];if(uniquePoints.length!==4)return null;let xs3=uniquePoints.map(p4=>p4.x),ys3=uniquePoints.map(p4=>p4.y),uniqueXs=[...new Set(xs3)],uniqueYs=[...new Set(ys3)];if(uniqueXs.length!==2||uniqueYs.length!==2)return null;let[minX,maxX]=uniqueXs.sort((a2,b3)=>a2-b3),[minY,maxY]=uniqueYs.sort((a2,b3)=>a2-b3);return minX===void 0||maxX===void 0||minY===void 0||maxY===void 0?null:{x:(minX+maxX)/2,y:(minY+maxY)/2,width:maxX-minX,height:maxY-minY}},fpPolyHasFill=fill=>{if(!fill)return!1;let normalized=fill.toLowerCase();return normalized!=="no"&&normalized!=="none"&&normalized!=="outline"},getRotationDeg=at4=>at4&&Array.isArray(at4)&&at4.length>=3&&typeof at4[2]=="number"?at4[2]:0,isNinetyLike=deg=>{let n3=(deg%360+360)%360;return n3===90||n3===270},normalizePortName=name=>{if(name!=null)return`${name}`},getPinNumber=name=>{let normalized=normalizePortName(name),parsed=normalized!==void 0?Number(normalized):NaN;return Number.isFinite(parsed)?parsed:void 0},debug23=(0,import_debug21.default)("kicad-mod-converter"),convertKicadLayerToTscircuitLayer=kicadLayer=>{switch(kicadLayer.toLowerCase()){case"f.cu":case"f.fab":case"f.silks":case"f.crtyd":case"edge.cuts":return"top";case"b.cu":case"b.fab":case"b.silks":case"b.crtyd":return"bottom"}},convertKicadJsonToTsCircuitSoup=async kicadJson=>{let{fp_lines,fp_rects,fp_texts,fp_arcs,fp_circles,pads,properties,holes,fp_polys}=kicadJson,circuitJson=[];circuitJson.push({type:"source_component",source_component_id:"source_component_0",supplier_part_numbers:{}}),circuitJson.push({type:"schematic_component",schematic_component_id:"schematic_component_0",source_component_id:"source_component_0",center:{x:0,y:0},rotation:0,size:{width:0,height:0}});let portNames=new Set,portNameToPinNumber=new Map;for(let pad2 of pads){let portName=normalizePortName(pad2.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(pad2.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name);if(portName){portNames.add(portName);let pinNumber=getPinNumber(hole.name);pinNumber!==void 0&&portNameToPinNumber.set(portName,pinNumber)}}let sourcePortId=0,portNameToSourcePortId=new Map;for(let portName of portNames){let source_port_id=`source_port_${sourcePortId++}`;portNameToSourcePortId.set(portName,source_port_id);let pinNumber=portNameToPinNumber.get(portName);circuitJson.push({type:"source_port",source_port_id,source_component_id:"source_component_0",name:portName,port_hints:[portName],pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0}),circuitJson.push({type:"schematic_port",schematic_port_id:`schematic_port_${sourcePortId++}`,source_port_id,schematic_component_id:"schematic_component_0",center:{x:0,y:0}})}let minX=Number.POSITIVE_INFINITY,maxX=Number.NEGATIVE_INFINITY,minY=Number.POSITIVE_INFINITY,maxY=Number.NEGATIVE_INFINITY;for(let pad2 of pads){let x5=pad2.at[0],y5=-pad2.at[1],w4=pad2.size[0],h4=pad2.size[1];minX=Math.min(minX,x5-w4/2),maxX=Math.max(maxX,x5+w4/2),minY=Math.min(minY,y5-h4/2),maxY=Math.max(maxY,y5+h4/2)}let pcb_component_id="pcb_component_0";circuitJson.push({type:"pcb_component",source_component_id:"source_component_0",pcb_component_id,layer:"top",center:{x:0,y:0},rotation:0,width:Number.isFinite(minX)?maxX-minX:0,height:Number.isFinite(minY)?maxY-minY:0});let pcbPortId=0,portNameToPcbPortId=new Map;for(let portName of portNames){let pcb_port_id=`pcb_port_${pcbPortId++}`,source_port_id=portNameToSourcePortId.get(portName);portNameToPcbPortId.set(portName,pcb_port_id);let x5=0,y5=0,layers=["top","bottom"],pad2=pads.find(p4=>normalizePortName(p4.name)===portName);if(pad2)x5=pad2.at[0],y5=-pad2.at[1],layers=pad2.layers?pad2.layers.map(l3=>convertKicadLayerToTscircuitLayer(l3)).filter(Boolean):["top","bottom"];else if(holes){let hole=holes.find(h4=>normalizePortName(h4.name)===portName);hole&&(x5=hole.at[0],y5=-hole.at[1],layers=hole.layers?hole.layers.map(l3=>convertKicadLayerToTscircuitLayer(l3)).filter(Boolean):["top","bottom"])}circuitJson.push({type:"pcb_port",pcb_port_id,source_port_id,pcb_component_id,x:x5,y:y5,layers})}let smtpadId=0,platedHoleId=0,holeId=0;for(let pad2 of pads){let portName=normalizePortName(pad2.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0;if(pad2.pad_type==="smd"){let rotation4=getRotationDeg(pad2.at),width=isNinetyLike(rotation4)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation4)?pad2.size[0]:pad2.size[1],pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:pad2.at[0],y:-pad2.at[1],width,height,layer:convertKicadLayerToTscircuitLayer(pad2.layers?.[0]??"F.Cu"),pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_type==="thru_hole"){if(pad2.pad_shape==="rect"){let rotation4=getRotationDeg(pad2.at),width=isNinetyLike(rotation4)?pad2.size[1]:pad2.size[0],height=isNinetyLike(rotation4)?pad2.size[0]:pad2.size[1],offX=pad2.drill?.offset?.[0]??0,offY=pad2.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation4),pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:pad2.at[0],y:-pad2.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:pad2.drill?.width,rect_pad_width:width,rect_pad_height:height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="circle"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:pad2.at[0],y:-pad2.at[1],outer_diameter:pad2.size[0],hole_diameter:pad2.drill?.width,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}else if(pad2.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,pinLabel=pinNumber!==void 0?`pin${pinNumber}`:void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:pad2.at[0],y:-pad2.at[1],outer_width:pad2.size[0],outer_height:pad2.size[1],hole_width:pad2.drill?.width,hole_height:pad2.drill?.height,layers:["top","bottom"],pcb_component_id,port_hints:pinLabel?[pinLabel]:portName?[portName]:[],pcb_port_id,pin_number:pinNumber,pin_label:pinLabel})}}else pad2.pad_type==="np_thru_hole"&&pad2.pad_shape==="circle"&&circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:pad2.at[0],y:-pad2.at[1],hole_shape:"circle",hole_diameter:pad2.drill?.width??pad2.size[0],pcb_component_id})}if(holes)for(let hole of holes){let portName=normalizePortName(hole.name),pinNumber=portName?portNameToPinNumber.get(portName):void 0,hasCuLayer=hole.layers?.some(l3=>l3.endsWith(".Cu")||l3==="*.Cu"),rotation4=getRotationDeg(hole.at),offX=hole.drill?.offset?.[0]??0,offY=hole.drill?.offset?.[1]??0,rotOff=rotatePoint3(offX,offY,rotation4),x5=hole.at[0]+rotOff.x,y5=-(hole.at[1]+rotOff.y),holeDiameter=hole.drill?.width??0,outerDiameter=hole.size?.width??holeDiameter,rr4=hole.roundrect_rratio??0,rectBorderRadius=rr4>0?Math.min(isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter)/2*rr4:0;if(hasCuLayer)if(hole.pad_shape==="rect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:hole.at[0],y:-hole.at[1],hole_offset_x:-rotOff.x,hole_offset_y:-rotOff.y,hole_diameter:holeDiameter,rect_pad_width:isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,rect_pad_height:isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="oval"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"pill",x:x5,y:y5,outer_width:isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,outer_height:isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter,hole_width:isNinetyLike(rotation4)?hole.drill?.height??holeDiameter:hole.drill?.width??holeDiameter,hole_height:isNinetyLike(rotation4)?hole.drill?.width??holeDiameter:hole.drill?.height??holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else if(hole.pad_shape==="roundrect"){let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0,offX2=hole.drill?.offset?.[0]??0,offY2=hole.drill?.offset?.[1]??0,rotOff2=rotatePoint3(offX2,offY2,rotation4),width=isNinetyLike(rotation4)?hole.size?.height??outerDiameter:hole.size?.width??outerDiameter,height=isNinetyLike(rotation4)?hole.size?.width??outerDiameter:hole.size?.height??outerDiameter;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circular_hole_with_rect_pad",hole_shape:"circle",pad_shape:"rect",x:x5,y:y5,hole_offset_x:-rotOff2.x,hole_offset_y:rotOff2.y,hole_diameter:holeDiameter,rect_pad_width:width,rect_pad_height:height,rect_border_radius:rectBorderRadius,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else{let pcb_port_id=portName?portNameToPcbPortId.get(portName):void 0;circuitJson.push({type:"pcb_plated_hole",pcb_plated_hole_id:`pcb_plated_hole_${platedHoleId++}`,shape:"circle",x:x5,y:y5,outer_diameter:outerDiameter,hole_diameter:holeDiameter,port_hints:pinNumber!==void 0?[`pin${pinNumber}`]:portName?[portName]:[],layers:["top","bottom"],pcb_component_id,pcb_port_id,pin_number:pinNumber,pin_label:pinNumber!==void 0?`pin${pinNumber}`:void 0})}else circuitJson.push({type:"pcb_hole",pcb_hole_id:`pcb_hole_${holeId++}`,x:x5,y:y5,hole_shape:"circle",hole_diameter:holeDiameter,pcb_component_id})}let edgeCutSegments=[],frontCourtyardSegments=[],backCourtyardSegments=[];for(let fp_line2 of fp_lines){let lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"line",start:{x:fp_line2.start[0],y:fp_line2.start[1]},end:{x:fp_line2.end[0],y:fp_line2.end[1]},strokeWidth:fp_line2.stroke.width})}for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();lowerLayer==="edge.cuts"?edgeCutSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="f.crtyd"?frontCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width}):lowerLayer==="b.crtyd"&&backCourtyardSegments.push({type:"arc",start:{x:fp_arc.start[0],y:fp_arc.start[1]},mid:{x:fp_arc.mid[0],y:fp_arc.mid[1]},end:{x:fp_arc.end[0],y:fp_arc.end[1]},strokeWidth:fp_arc.stroke.width})}let closedPolygons=findClosedPolygons(edgeCutSegments),cutoutId=0;for(let polygon2 of closedPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_cutout",pcb_cutout_id:`pcb_cutout_${cutoutId++}`,shape:"polygon",points:points.map(p4=>({x:p4.x,y:-p4.y})),pcb_component_id})}let courtyardOutlineId=0;for(let[segments,layer]of[[frontCourtyardSegments,"top"],[backCourtyardSegments,"bottom"]]){let closedCourtyardPolygons=findClosedPolygons(segments);for(let polygon2 of closedCourtyardPolygons){let points=polygonToPoints(polygon2);points.length>=3&&circuitJson.push({type:"pcb_courtyard_outline",pcb_courtyard_outline_id:`pcb_courtyard_outline_${courtyardOutlineId++}`,layer,pcb_component_id,outline:points.map(p4=>({x:p4.x,y:-p4.y}))})}}if(fp_rects)for(let fp_rect of fp_rects){let lowerLayer=fp_rect.layer.toLowerCase();if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){let x12=fp_rect.start[0],y12=fp_rect.start[1],x22=fp_rect.end[0],y22=fp_rect.end[1];circuitJson.push({type:"pcb_courtyard_rect",pcb_courtyard_rect_id:`pcb_courtyard_rect_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_rect.layer),center:{x:(x12+x22)/2,y:-((y12+y22)/2)},width:Math.abs(x22-x12),height:Math.abs(y22-y12)})}else debug23("Unhandled layer for fp_rect",fp_rect.layer)}let traceId=0,silkPathId=0,fabPathId=0,noteLineId=0;for(let fp_line2 of fp_lines){let route=[{x:fp_line2.start[0],y:-fp_line2.start[1]},{x:fp_line2.end[0],y:-fp_line2.end[1]}],lowerLayer=fp_line2.layer.toLowerCase();lowerLayer==="f.cu"?circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_line2.layer),route,thickness:fp_line2.stroke.width}):lowerLayer==="f.silks"?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width}):lowerLayer==="edge.cuts"?debug23("Skipping Edge.Cuts fp_line (converted to pcb_cutout)",fp_line2.layer):lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"?debug23("Skipping CrtYd fp_line (converted to pcb_courtyard_outline)",fp_line2.layer):lowerLayer==="f.fab"?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:"top",route,stroke_width:fp_line2.stroke.width,port_hints:[]}):lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_line",pcb_note_line_id:`pcb_note_line_${noteLineId++}`,pcb_component_id,x1:fp_line2.start[0],y1:-fp_line2.start[1],x2:fp_line2.end[0],y2:-fp_line2.end[1],stroke_width:fp_line2.stroke.width}):debug23("Unhandled layer for fp_line",fp_line2.layer)}if(fp_polys)for(let fp_poly of fp_polys){let route=[],pushRoutePoint=point42=>{!Number.isFinite(point42.x)||!Number.isFinite(point42.y)||route.push(point42)};for(let segment2 of fp_poly.pts){if(Array.isArray(segment2)){pushRoutePoint({x:segment2[0],y:-segment2[1]});continue}if(segment2&&typeof segment2=="object"&&"kind"in segment2){if(segment2.kind==="arc"){let start=makePoint(segment2.start),mid=makePoint(segment2.mid),end=makePoint(segment2.end),arcLength=getArcLength(start,mid,end),adjustedNumPoints=Math.max(2,Math.ceil(arcLength/.1)),arcPoints=generateArcPath(start,mid,end,adjustedNumPoints).map(p4=>({x:p4.x,y:-p4.y}));for(let point42 of arcPoints)pushRoutePoint(point42)}continue}}let routePoints=route,polygonPoints=routePoints.length>2&&routePoints[0].x===routePoints[routePoints.length-1].x&&routePoints[0].y===routePoints[routePoints.length-1].y?routePoints.slice(0,-1):routePoints;if(routePoints.length===0)continue;let strokeWidth=fp_poly.stroke?.width??0;if(fp_poly.layer.endsWith(".Cu")){let rect=getAxisAlignedRectFromPoints(polygonPoints);rect?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"rect",x:rect.x,y:rect.y,width:rect.width,height:rect.height,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):fpPolyHasFill(fp_poly.fill)?polygonPoints.length>=3?circuitJson.push({type:"pcb_smtpad",pcb_smtpad_id:`pcb_smtpad_${smtpadId++}`,shape:"polygon",points:polygonPoints,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth}):polygonPoints.length>=2&&circuitJson.push({type:"pcb_trace",pcb_trace_id:`pcb_trace_${traceId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,thickness:strokeWidth})}else fp_poly.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:routePoints,stroke_width:strokeWidth}):fp_poly.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_path",fabrication_note_path_id:`fabrication_note_path_${fabPathId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),route:polygonPoints,stroke_width:strokeWidth,port_hints:[]}):fp_poly.layer.toLowerCase().endsWith(".crtyd")?polygonPoints.length>=3&&circuitJson.push({type:"pcb_courtyard_polygon",pcb_courtyard_polygon_id:`pcb_courtyard_polygon_${courtyardOutlineId++}`,layer:convertKicadLayerToTscircuitLayer(fp_poly.layer),pcb_component_id,points:polygonPoints}):debug23("Unhandled layer for fp_poly",fp_poly.layer)}let notePathId=0;for(let fp_arc of fp_arcs){let lowerLayer=fp_arc.layer.toLowerCase();if(lowerLayer==="edge.cuts"){debug23("Skipping Edge.Cuts fp_arc (converted to pcb_cutout)",fp_arc.layer);continue}if(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd"){debug23("Skipping CrtYd fp_arc (converted to pcb_courtyard_outline)",fp_arc.layer);continue}let start=makePoint(fp_arc.start),mid=makePoint(fp_arc.mid),end=makePoint(fp_arc.end),arcLength=getArcLength(start,mid,end),arcPoints=generateArcPath(start,mid,end,Math.ceil(arcLength));if(lowerLayer.startsWith("user.")){circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width});continue}let tscircuitLayer=convertKicadLayerToTscircuitLayer(fp_arc.layer);if(!tscircuitLayer){debug23("Unable to convert layer for fp_arc",fp_arc.layer);continue}circuitJson.push({type:"pcb_silkscreen_path",pcb_silkscreen_path_id:`pcb_silkscreen_path_${silkPathId++}`,layer:tscircuitLayer,pcb_component_id,route:arcPoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_arc.stroke.width})}if(fp_circles)for(let fp_circle of fp_circles){let lowerLayer=fp_circle.layer.toLowerCase(),center2=makePoint(fp_circle.center),endPoint=makePoint(fp_circle.end),radius=Math.sqrt((endPoint.x-center2.x)**2+(endPoint.y-center2.y)**2),numPoints=Math.max(16,Math.ceil(2*Math.PI*radius)),circlePoints=[];for(let i2=0;i2<=numPoints;i2++){let angle=i2/numPoints*2*Math.PI;circlePoints.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}lowerLayer.startsWith("user.")?circuitJson.push({type:"pcb_note_path",pcb_note_path_id:`pcb_note_path_${notePathId++}`,pcb_component_id,route:circlePoints.map(p4=>({x:p4.x,y:-p4.y})),stroke_width:fp_circle.stroke.width}):(lowerLayer==="f.crtyd"||lowerLayer==="b.crtyd")&&circuitJson.push({type:"pcb_courtyard_circle",pcb_courtyard_circle_id:`pcb_courtyard_circle_${courtyardOutlineId++}`,pcb_component_id,layer:convertKicadLayerToTscircuitLayer(fp_circle.layer),center:{x:center2.x,y:-center2.y},radius})}for(let fp_text of fp_texts){let layerRef=convertKicadLayerToTscircuitLayer(fp_text.layer);fp_text.layer.endsWith(".SilkS")?circuitJson.push({type:"pcb_silkscreen_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):fp_text.layer.endsWith(".Fab")?circuitJson.push({type:"pcb_fabrication_note_text",layer:layerRef,font:"tscircuit2024",font_size:fp_text.effects?.font?.size[0]??1,pcb_component_id,anchor_position:{x:fp_text.at[0],y:-fp_text.at[1]},anchor_alignment:"center",text:fp_text.text}):debug23("Unhandled layer for fp_text",fp_text.layer)}let refProp=properties.find(prop=>prop.key==="Reference"),valProp=properties.find(prop=>prop.key==="Value"),propFabTexts=[refProp,valProp].filter(p4=>p4&&!!p4.val);for(let propFab of propFabTexts){let at4=propFab.attributes.at;if(!at4)continue;let isFabLayer=propFab.attributes.layer?.toLowerCase()?.endsWith(".fab"),font_size=getSilkscreenFontSizeFromFpTexts(fp_texts);circuitJson.push({type:isFabLayer?"pcb_fabrication_note_text":"pcb_silkscreen_text",layer:"top",font:"tscircuit2024",font_size,pcb_component_id,anchor_position:{x:at4[0],y:-at4[1]},anchor_alignment:"center",text:propFab.val})}return circuitJson},parseKicadModToCircuitJson=async kicadMod=>{let kicadJson=parseKicadModToKicadJson(kicadMod);return await convertKicadJsonToTsCircuitSoup(kicadJson)};var transformJsDelivrImports=code=>code.replace(/from\s*["']\/npm\//g,'from "https://cdn.jsdelivr.net/npm/').replace(/import\s*\(\s*["']\/npm\//g,'import("https://cdn.jsdelivr.net/npm/'),dynamicallyLoadDependencyWithCdnBackup=async packageName=>{try{return(await import(packageName)).default}catch{console.log(`Failed to load ${packageName} locally, trying CDN fallback...`);try{let res2=await fetch(`https://cdn.jsdelivr.net/npm/${packageName}/+esm`);if(!res2.ok)throw new Error(`Failed to fetch ${packageName} from CDN: ${res2.statusText}`);let code=await res2.text();code=transformJsDelivrImports(code);let blob=new Blob([code],{type:"application/javascript"}),url2=URL.createObjectURL(blob);try{let{default:loadedModule}=await import(url2);return loadedModule}finally{URL.revokeObjectURL(url2)}}catch(cdnError){throw console.error(`CDN fallback for ${packageName} also failed:`,cdnError),cdnError}}};var KICAD_FOOTPRINT_CACHE_URL="https://kicad-mod-cache.tscircuit.com",ngspiceEngineCache=null,getPlatformConfig=(overrides={})=>({localCacheEngine:overrides.localCacheEngine,partsEngine:jlcPartsEngine,spiceEngineMap:{ngspice:{simulate:async spice=>{if(!ngspiceEngineCache){let createNgspiceSpiceEngine=await dynamicallyLoadDependencyWithCdnBackup("@tscircuit/ngspice-spice-engine").catch(error=>{throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.",{cause:error})});createNgspiceSpiceEngine&&(ngspiceEngineCache=await createNgspiceSpiceEngine())}if(!ngspiceEngineCache)throw new Error("Could not load ngspice engine from local node_modules or CDN fallback.");return ngspiceEngineCache.simulate(spice)}}},footprintLibraryMap:{kicad:async footprintName=>{let baseUrl=`${KICAD_FOOTPRINT_CACHE_URL}/${footprintName}`,circuitJsonUrl=`${baseUrl}.circuit.json`,res2=await fetch(circuitJsonUrl);if(!res2.ok){let bodyPreview=(await res2.text()).slice(0,200);throw new Error(`Failed to load KiCad footprint "${footprintName}" from ${circuitJsonUrl} (HTTP ${res2.status}). ${bodyPreview}`)}let raw;try{raw=await res2.json()}catch{throw new Error(`Failed to parse KiCad footprint JSON for "${footprintName}" from ${circuitJsonUrl}`)}let filtered=Array.isArray(raw)?raw.filter(el3=>el3?.type==="pcb_silkscreen_text"?el3?.text==="REF**":!0):[raw],wrlUrl=`${baseUrl}.wrl`,stepUrl=`${baseUrl}.step`;return{footprintCircuitJson:filtered,cadModel:{wrlUrl,stepUrl,modelUnitToMmScale:2.54}}}},footprintFileParserMap:{kicad_mod:{loadFromUrl:async url2=>{let kicadContent=await fetch(url2).then(res2=>res2.text()),kicadJson=await parseKicadModToCircuitJson(kicadContent);return{footprintCircuitJson:Array.isArray(kicadJson)?kicadJson:[kicadJson]}}}}});var tslib_es6_exports={};__export(tslib_es6_exports,{__addDisposableResource:()=>__addDisposableResource,__assign:()=>__assign,__asyncDelegator:()=>__asyncDelegator,__asyncGenerator:()=>__asyncGenerator,__asyncValues:()=>__asyncValues,__await:()=>__await,__awaiter:()=>__awaiter,__classPrivateFieldGet:()=>__classPrivateFieldGet,__classPrivateFieldIn:()=>__classPrivateFieldIn,__classPrivateFieldSet:()=>__classPrivateFieldSet,__createBinding:()=>__createBinding,__decorate:()=>__decorate,__disposeResources:()=>__disposeResources,__esDecorate:()=>__esDecorate,__exportStar:()=>__exportStar,__extends:()=>__extends,__generator:()=>__generator,__importDefault:()=>__importDefault,__importStar:()=>__importStar,__makeTemplateObject:()=>__makeTemplateObject,__metadata:()=>__metadata,__param:()=>__param,__propKey:()=>__propKey,__read:()=>__read,__rest:()=>__rest,__rewriteRelativeImportExtension:()=>__rewriteRelativeImportExtension,__runInitializers:()=>__runInitializers,__setFunctionName:()=>__setFunctionName,__spread:()=>__spread,__spreadArray:()=>__spreadArray,__spreadArrays:()=>__spreadArrays,__values:()=>__values,default:()=>tslib_es6_default});var extendStatics=function(d3,b3){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d4,b4){d4.__proto__=b4}||function(d4,b4){for(var p4 in b4)Object.prototype.hasOwnProperty.call(b4,p4)&&(d4[p4]=b4[p4])},extendStatics(d3,b3)};function __extends(d3,b3){if(typeof b3!="function"&&b3!==null)throw new TypeError("Class extends value "+String(b3)+" is not a constructor or null");extendStatics(d3,b3);function __(){this.constructor=d3}d3.prototype=b3===null?Object.create(b3):(__.prototype=b3.prototype,new __)}var __assign=function(){return __assign=Object.assign||function(t35){for(var s2,i2=1,n3=arguments.length;i2<n3;i2++){s2=arguments[i2];for(var p4 in s2)Object.prototype.hasOwnProperty.call(s2,p4)&&(t35[p4]=s2[p4])}return t35},__assign.apply(this,arguments)};function __rest(s2,e4){var t35={};for(var p4 in s2)Object.prototype.hasOwnProperty.call(s2,p4)&&e4.indexOf(p4)<0&&(t35[p4]=s2[p4]);if(s2!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i2=0,p4=Object.getOwnPropertySymbols(s2);i2<p4.length;i2++)e4.indexOf(p4[i2])<0&&Object.prototype.propertyIsEnumerable.call(s2,p4[i2])&&(t35[p4[i2]]=s2[p4[i2]]);return t35}function __decorate(decorators,target,key,desc){var c3=arguments.length,r4=c3<3?target:desc===null?desc=Object.getOwnPropertyDescriptor(target,key):desc,d3;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r4=Reflect.decorate(decorators,target,key,desc);else for(var i2=decorators.length-1;i2>=0;i2--)(d3=decorators[i2])&&(r4=(c3<3?d3(r4):c3>3?d3(target,key,r4):d3(target,key))||r4);return c3>3&&r4&&Object.defineProperty(target,key,r4),r4}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __esDecorate(ctor,descriptorIn,decorators,contextIn,initializers,extraInitializers){function accept(f2){if(f2!==void 0&&typeof f2!="function")throw new TypeError("Function expected");return f2}for(var kind=contextIn.kind,key=kind==="getter"?"get":kind==="setter"?"set":"value",target=!descriptorIn&&ctor?contextIn.static?ctor:ctor.prototype:null,descriptor=descriptorIn||(target?Object.getOwnPropertyDescriptor(target,contextIn.name):{}),_5,done=!1,i2=decorators.length-1;i2>=0;i2--){var context={};for(var p4 in contextIn)context[p4]=p4==="access"?{}:contextIn[p4];for(var p4 in contextIn.access)context.access[p4]=contextIn.access[p4];context.addInitializer=function(f2){if(done)throw new TypeError("Cannot add initializers after decoration has completed");extraInitializers.push(accept(f2||null))};var result=(0,decorators[i2])(kind==="accessor"?{get:descriptor.get,set:descriptor.set}:descriptor[key],context);if(kind==="accessor"){if(result===void 0)continue;if(result===null||typeof result!="object")throw new TypeError("Object expected");(_5=accept(result.get))&&(descriptor.get=_5),(_5=accept(result.set))&&(descriptor.set=_5),(_5=accept(result.init))&&initializers.unshift(_5)}else(_5=accept(result))&&(kind==="field"?initializers.unshift(_5):descriptor[key]=_5)}target&&Object.defineProperty(target,contextIn.name,descriptor),done=!0}function __runInitializers(thisArg,initializers,value){for(var useValue=arguments.length>2,i2=0;i2<initializers.length;i2++)value=useValue?initializers[i2].call(thisArg,value):initializers[i2].call(thisArg);return useValue?value:void 0}function __propKey(x5){return typeof x5=="symbol"?x5:"".concat(x5)}function __setFunctionName(f2,name,prefix){return typeof name=="symbol"&&(name=name.description?"[".concat(name.description,"]"):""),Object.defineProperty(f2,"name",{configurable:!0,value:prefix?"".concat(prefix," ",name):name})}function __metadata(metadataKey,metadataValue){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(metadataKey,metadataValue)}function __awaiter(thisArg,_arguments,P5,generator){function adopt(value){return value instanceof P5?value:new P5(function(resolve){resolve(value)})}return new(P5||(P5=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e4){reject(e4)}}function rejected(value){try{step(generator.throw(value))}catch(e4){reject(e4)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}function __generator(thisArg,body){var _5={label:0,sent:function(){if(t35[0]&1)throw t35[1];return t35[1]},trys:[],ops:[]},f2,y5,t35,g7=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return g7.next=verb(0),g7.throw=verb(1),g7.return=verb(2),typeof Symbol=="function"&&(g7[Symbol.iterator]=function(){return this}),g7;function verb(n3){return function(v5){return step([n3,v5])}}function step(op3){if(f2)throw new TypeError("Generator is already executing.");for(;g7&&(g7=0,op3[0]&&(_5=0)),_5;)try{if(f2=1,y5&&(t35=op3[0]&2?y5.return:op3[0]?y5.throw||((t35=y5.return)&&t35.call(y5),0):y5.next)&&!(t35=t35.call(y5,op3[1])).done)return t35;switch(y5=0,t35&&(op3=[op3[0]&2,t35.value]),op3[0]){case 0:case 1:t35=op3;break;case 4:return _5.label++,{value:op3[1],done:!1};case 5:_5.label++,y5=op3[1],op3=[0];continue;case 7:op3=_5.ops.pop(),_5.trys.pop();continue;default:if(t35=_5.trys,!(t35=t35.length>0&&t35[t35.length-1])&&(op3[0]===6||op3[0]===2)){_5=0;continue}if(op3[0]===3&&(!t35||op3[1]>t35[0]&&op3[1]<t35[3])){_5.label=op3[1];break}if(op3[0]===6&&_5.label<t35[1]){_5.label=t35[1],t35=op3;break}if(t35&&_5.label<t35[2]){_5.label=t35[2],_5.ops.push(op3);break}t35[2]&&_5.ops.pop(),_5.trys.pop();continue}op3=body.call(thisArg,_5)}catch(e4){op3=[6,e4],y5=0}finally{f2=t35=0}if(op3[0]&5)throw op3[1];return{value:op3[0]?op3[1]:void 0,done:!0}}}var __createBinding=Object.create?(function(o3,m3,k4,k22){k22===void 0&&(k22=k4);var desc=Object.getOwnPropertyDescriptor(m3,k4);(!desc||("get"in desc?!m3.__esModule:desc.writable||desc.configurable))&&(desc={enumerable:!0,get:function(){return m3[k4]}}),Object.defineProperty(o3,k22,desc)}):(function(o3,m3,k4,k22){k22===void 0&&(k22=k4),o3[k22]=m3[k4]});function __exportStar(m3,o3){for(var p4 in m3)p4!=="default"&&!Object.prototype.hasOwnProperty.call(o3,p4)&&__createBinding(o3,m3,p4)}function __values(o3){var s2=typeof Symbol=="function"&&Symbol.iterator,m3=s2&&o3[s2],i2=0;if(m3)return m3.call(o3);if(o3&&typeof o3.length=="number")return{next:function(){return o3&&i2>=o3.length&&(o3=void 0),{value:o3&&o3[i2++],done:!o3}}};throw new TypeError(s2?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(o3,n3){var m3=typeof Symbol=="function"&&o3[Symbol.iterator];if(!m3)return o3;var i2=m3.call(o3),r4,ar4=[],e4;try{for(;(n3===void 0||n3-- >0)&&!(r4=i2.next()).done;)ar4.push(r4.value)}catch(error){e4={error}}finally{try{r4&&!r4.done&&(m3=i2.return)&&m3.call(i2)}finally{if(e4)throw e4.error}}return ar4}function __spread(){for(var ar4=[],i2=0;i2<arguments.length;i2++)ar4=ar4.concat(__read(arguments[i2]));return ar4}function __spreadArrays(){for(var s2=0,i2=0,il3=arguments.length;i2<il3;i2++)s2+=arguments[i2].length;for(var r4=Array(s2),k4=0,i2=0;i2<il3;i2++)for(var a2=arguments[i2],j4=0,jl3=a2.length;j4<jl3;j4++,k4++)r4[k4]=a2[j4];return r4}function __spreadArray(to3,from,pack2){if(pack2||arguments.length===2)for(var i2=0,l3=from.length,ar4;i2<l3;i2++)(ar4||!(i2 in from))&&(ar4||(ar4=Array.prototype.slice.call(from,0,i2)),ar4[i2]=from[i2]);return to3.concat(ar4||Array.prototype.slice.call(from))}function __await(v5){return this instanceof __await?(this.v=v5,this):new __await(v5)}function __asyncGenerator(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var g7=generator.apply(thisArg,_arguments||[]),i2,q4=[];return i2=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i2[Symbol.asyncIterator]=function(){return this},i2;function awaitReturn(f2){return function(v5){return Promise.resolve(v5).then(f2,reject)}}function verb(n3,f2){g7[n3]&&(i2[n3]=function(v5){return new Promise(function(a2,b3){q4.push([n3,v5,a2,b3])>1||resume(n3,v5)})},f2&&(i2[n3]=f2(i2[n3])))}function resume(n3,v5){try{step(g7[n3](v5))}catch(e4){settle(q4[0][3],e4)}}function step(r4){r4.value instanceof __await?Promise.resolve(r4.value.v).then(fulfill,reject):settle(q4[0][2],r4)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f2,v5){f2(v5),q4.shift(),q4.length&&resume(q4[0][0],q4[0][1])}}function __asyncDelegator(o3){var i2,p4;return i2={},verb("next"),verb("throw",function(e4){throw e4}),verb("return"),i2[Symbol.iterator]=function(){return this},i2;function verb(n3,f2){i2[n3]=o3[n3]?function(v5){return(p4=!p4)?{value:__await(o3[n3](v5)),done:!1}:f2?f2(v5):v5}:f2}}function __asyncValues(o3){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var m3=o3[Symbol.asyncIterator],i2;return m3?m3.call(o3):(o3=typeof __values=="function"?__values(o3):o3[Symbol.iterator](),i2={},verb("next"),verb("throw"),verb("return"),i2[Symbol.asyncIterator]=function(){return this},i2);function verb(n3){i2[n3]=o3[n3]&&function(v5){return new Promise(function(resolve,reject){v5=o3[n3](v5),settle(resolve,reject,v5.done,v5.value)})}}function settle(resolve,reject,d3,v5){Promise.resolve(v5).then(function(v7){resolve({value:v7,done:d3})},reject)}}function __makeTemplateObject(cooked,raw){return Object.defineProperty?Object.defineProperty(cooked,"raw",{value:raw}):cooked.raw=raw,cooked}var __setModuleDefault=Object.create?(function(o3,v5){Object.defineProperty(o3,"default",{enumerable:!0,value:v5})}):function(o3,v5){o3.default=v5},ownKeys=function(o3){return ownKeys=Object.getOwnPropertyNames||function(o4){var ar4=[];for(var k4 in o4)Object.prototype.hasOwnProperty.call(o4,k4)&&(ar4[ar4.length]=k4);return ar4},ownKeys(o3)};function __importStar(mod){if(mod&&mod.__esModule)return mod;var result={};if(mod!=null)for(var k4=ownKeys(mod),i2=0;i2<k4.length;i2++)k4[i2]!=="default"&&__createBinding(result,mod,k4[i2]);return __setModuleDefault(result,mod),result}function __importDefault(mod){return mod&&mod.__esModule?mod:{default:mod}}function __classPrivateFieldGet(receiver,state2,kind,f2){if(kind==="a"&&!f2)throw new TypeError("Private accessor was defined without a getter");if(typeof state2=="function"?receiver!==state2||!f2:!state2.has(receiver))throw new TypeError("Cannot read private member from an object whose class did not declare it");return kind==="m"?f2:kind==="a"?f2.call(receiver):f2?f2.value:state2.get(receiver)}function __classPrivateFieldSet(receiver,state2,value,kind,f2){if(kind==="m")throw new TypeError("Private method is not writable");if(kind==="a"&&!f2)throw new TypeError("Private accessor was defined without a setter");if(typeof state2=="function"?receiver!==state2||!f2:!state2.has(receiver))throw new TypeError("Cannot write private member to an object whose class did not declare it");return kind==="a"?f2.call(receiver,value):f2?f2.value=value:state2.set(receiver,value),value}function __classPrivateFieldIn(state2,receiver){if(receiver===null||typeof receiver!="object"&&typeof receiver!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof state2=="function"?receiver===state2:state2.has(receiver)}function __addDisposableResource(env,value,async){if(value!=null){if(typeof value!="object"&&typeof value!="function")throw new TypeError("Object expected.");var dispose,inner;if(async){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");dispose=value[Symbol.asyncDispose]}if(dispose===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");dispose=value[Symbol.dispose],async&&(inner=dispose)}if(typeof dispose!="function")throw new TypeError("Object not disposable.");inner&&(dispose=function(){try{inner.call(this)}catch(e4){return Promise.reject(e4)}}),env.stack.push({value,dispose,async})}else async&&env.stack.push({async:!0});return value}var _SuppressedError=typeof SuppressedError=="function"?SuppressedError:function(error,suppressed,message){var e4=new Error(message);return e4.name="SuppressedError",e4.error=error,e4.suppressed=suppressed,e4};function __disposeResources(env){function fail(e4){env.error=env.hasError?new _SuppressedError(e4,env.error,"An error was suppressed during disposal."):e4,env.hasError=!0}var r4,s2=0;function next2(){for(;r4=env.stack.pop();)try{if(!r4.async&&s2===1)return s2=0,env.stack.push(r4),Promise.resolve().then(next2);if(r4.dispose){var result=r4.dispose.call(r4.value);if(r4.async)return s2|=2,Promise.resolve(result).then(next2,function(e4){return fail(e4),next2()})}else s2|=1}catch(e4){fail(e4)}if(s2===1)return env.hasError?Promise.reject(env.error):Promise.resolve();if(env.hasError)throw env.error}return next2()}function __rewriteRelativeImportExtension(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m3,tsx,d3,ext,cm3){return tsx?preserveJsx?".jsx":".js":d3&&(!ext||!cm3)?m3:d3+ext+"."+cm3.toLowerCase()+"js"}):path}var tslib_es6_default={__extends,__assign,__rest,__decorate,__param,__esDecorate,__runInitializers,__propKey,__setFunctionName,__metadata,__awaiter,__generator,__createBinding,__exportStar,__values,__read,__spread,__spreadArrays,__spreadArray,__await,__asyncGenerator,__asyncDelegator,__asyncValues,__makeTemplateObject,__importStar,__importDefault,__classPrivateFieldGet,__classPrivateFieldSet,__classPrivateFieldIn,__addDisposableResource,__disposeResources,__rewriteRelativeImportExtension};var import_debug22=__toESM(require_browser(),1),debug12=(0,import_debug22.default)("tsci:eval:execution-context");function createExecutionContext(webWorkerConfiguration,opts={}){globalThis.React=React;let basePlatform=opts.platform||getPlatformConfig(),platform=opts.projectConfig?{...basePlatform,...opts.projectConfig}:basePlatform;platform.partsEngineDisabled&&(platform.partsEngine=void 0);let circuit=new RootCircuit({platform});opts.name&&(circuit.name=opts.name),opts.debugNamespace&&circuit.enableDebug(opts.debugNamespace);let logs=[];return{fsMap:{},entrypoint:"",logger:{info:message=>{logs.push({msg:message})},getLogs:()=>logs,stringifyLogs:()=>logs.map(log=>log.msg).join(`
|