@tscircuit/eval 0.0.1239 → 0.0.1241
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 +2 -2
- package/package.json +3 -3
|
@@ -320,7 +320,7 @@ ${face.svg()}`;return svgStr+=`" >
|
|
|
320
320
|
`).map(x6=>x6.match(/\(([^)]+)\)/)[1]).map(parseSinglePoint)}function parseArrayOfLineStrings(str){return str.split(`
|
|
321
321
|
`).map(x6=>x6.match(/\(([^)]+)\)/)[1]).map(parseLineString).reduce((acc,x6)=>[...acc,...x6],[])}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(x6=>x6 instanceof Array?x6:[x6]).reduce((acc,x6)=>[...acc,...x6],[])}else{if(isArrayOfPoints(str))return parseArrayOfPoints(str);if(isArrayOfLines(str))return parseArrayOfLineStrings(str)}}return[]}function isArrayOfPoints(str){return str.split(`
|
|
322
322
|
`)?.every(str2=>str2.includes("POINT"))}function isArrayOfLines(str){return str.split(`
|
|
323
|
-
`)?.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;var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.822",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","run-sample":"bun scripts/run-sample.ts","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","@tsci/seveibar.dataset-srj13":"git+https://github.com/tscircuit/dataset-srj13.git#56db70039aeb28a76540fe951b5a96be60f9e949","@tsci/dataset-srj23-partially-routed-subcircuits":"git+https://github.com/tscircuit/dataset-srj23-partially-routed-subcircuits.git#53fc559","@tsci/tscircuit.dataset-srj16-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj16-bga-breakouts.git#e8b2e70e1f50a0dba3ad977e140766f53b9b75fb","@tsci/tscircuit.dataset-srj19-bga-passive-overlays":"git+https://github.com/tscircuit/dataset-srj19.git#5104d03ed72a9090d76ea1f42ae9f4bc439f7534","@tsci/tscircuit.dataset-srj20-partial-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj20.git#9384fb8f45fb479b97178ddfa42fc74c69afbbec","@tsci/0hmX.multi-component-dataset-srj01":"git+https://github.com/tscircuit/multi-component-dataset-srj01.git#abf9d17c966d466b56ac21b735c6bb6f4518919d","@tsci/tscircuit.dataset-srj12-bus-routing":"git+https://github.com/tscircuit/dataset-srj12-bus-routing.git#ba82f86a7d1288566b7144eb8661ad2549c5f328","@tscircuit/autorouting-dataset-01":"git+https://github.com/tscircuit/autorouting-dataset-01.git#b97f5052a2359ab2da3f186765c6a5e839535efb","@tscircuit/checks":"^0.0.163","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/core":"0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/dataset-srj24":"git+https://github.com/tscircuit/dataset-srj24.git#0973fa8a123276ff0f5de1fc7edef31efccb9cc9","@tscircuit/dataset-srj27-power-traces":"git+https://github.com/tscircuit/dataset-srj27-power-traces.git#eb24d36","@tscircuit/dataset-srj28-partially-prerouted":"git+https://github.com/tscircuit/dataset-srj28-partially-prerouted.git#5b1673544b6ade4480612539ba6574ad414fddc0","@tscircuit/dataset-srj29-ddr3-bga-pairs":"git+https://github.com/ShiboSoftwareDev/dataset-srj29-ddr3-bga-pairs.git#585c3abd4c6ce4be52bbc430b1d5e6dcc9b4ea30","@tscircuit/fanout-solver":"^0.0.29","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/krt-wasm":"^0.1.0","@tscircuit/length-matching-solver":"git+https://github.com/tscircuit/length-matching-solver.git#a429b4db4e46896a03259949d7975da2514b6c14","@tscircuit/math-utils":"^0.0.36","@tscircuit/power-trace-expander":"git+https://github.com/tscircuit/power-trace-expander.git#6fa2ac79cf13129c47432db3a23e61c17067e912","@tscircuit/rectdiff":"git+https://github.com/tscircuit/rectdiff.git#262f1b7e2c70021785f0ccdbe8e2562f827c7dbf","@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-json":"^0.0.450","circuit-to-svg":"^0.0.220",clsx:"^2.1.1","dataset-srj11-45-degree":"git+https://github.com/tscircuit/dataset-srj11-45-degree.git#c49dd43c38f85fa2777c7d67393df413ca8d5a75","dataset-srj18":"git+https://github.com/tscircuit/dataset-srj18.git#c0aad90256a95256fcac814f9f7da81a82a2fdea",flatbush:"^4.4.0","format-si-unit":"0.0.12","graphics-debug":"0.0.99","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2","kicad-to-circuit-json":"0.0.77",kleur:"^4.1.5","looks-same":"9","pcb-poly-hyper-graph":"https://codeload.github.com/tscircuit/pcb-poly-hyper-graph/tar.gz/80db1463c4a47506eeda15b2c14d59679de900f8",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/tscircuit/tiny-hypergraph.git#b3dac2244e5c660f21566d9e79dc3b9f68d1c251","tiny-hypergraph-poly":"git+https://github.com/tscircuit/tiny-hypergraph.git#7b93b4c",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","high-density-repair01":"git+https://github.com/tscircuit/high-density-repair01.git#8eaa775e7c7a2c32c12a82da4edef22477549027","high-density-repair02":"https://codeload.github.com/tscircuit/high-density-repair02/tar.gz/2afc0cbba3bf2f7eb6b9cd33615d21e9ad9352d4","high-density-repair03":"git+https://github.com/tscircuit/high-density-repair03.git#d32a90310dce1132c500ecf2f97054c92f6a87be","@tscircuit/high-density-a01":"git+https://github.com/tscircuit/high-density-a01.git#9a3a3d","@tscircuit/high-density-b01":"git+https://github.com/tscircuit/high-density-b01.git#1309684"},dependencies:{"fast-json-stable-stringify":"^2.1.0","object-hash":"^3.0.0","stack-svgs":"^0.0.1"}};init_dist5();init_dist2();init_dist4();init_dist4();init_dist6();init_dist2();var import_react2=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants=__toESM(require_constants(),1);init_zod();init_dist2();init_dist2();init_zod();init_dist2();init_dist2();init_zod();init_dist2();var JSON_KEYS=Object.keys({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}),isCompatibleArray=array2=>(array2 instanceof Float64Array||array2 instanceof Float32Array||Array.isArray(array2)&&array2.every(x6=>typeof x6=="number"))&&[6,16].some(x6=>array2.length===x6),isCompatibleObject=object=>typeof DOMMatrix<"u"&&object instanceof DOMMatrix||object instanceof CSSMatrix||typeof object=="object"&&JSON_KEYS.every(k7=>object&&k7 in object),fromArray=(array2,target)=>{if(!isCompatibleArray(array2))throw TypeError(`CSSMatrix: "${Array.from(array2).join(",")}" must be an array with 6/16 numbers.`);if(array2.length===16){let[m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44]=array2;return writeValues(target??new CSSMatrix,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)}let[M11,M12,M21,M22,M41,M42]=array2;return writeValues(target??new CSSMatrix,M11,M12,0,0,M21,M22,0,0,0,0,1,0,M41,M42,0,1)},writeValues=(target,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)=>(target.m11=m11,target.a=m11,target.m21=m21,target.c=m21,target.m31=m31,target.m41=m41,target.e=m41,target.m12=m12,target.b=m12,target.m22=m22,target.d=m22,target.m32=m32,target.m42=m42,target.f=m42,target.m13=m13,target.m23=m23,target.m33=m33,target.m43=m43,target.m14=m14,target.m24=m24,target.m34=m34,target.m44=m44,target),fromValues=(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)=>writeValues(new CSSMatrix,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44),fromMatrix=(m6,target)=>{if(isCompatibleObject(m6))return writeValues(target??new CSSMatrix,m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44);throw TypeError(`CSSMatrix: "${JSON.stringify(m6)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},fromString=source=>{if(typeof source!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(source)}" is not a string.`);let str=String(source).replace(/\s/g,""),m6=new CSSMatrix,invalidStringError=`CSSMatrix: invalid transform string "${source}"`,transformFn=/([\w-]+)\(([^)]*)\)/g,consumed=0,match2;for(;match2=transformFn.exec(str);){let prop=match2[1],value=match2[2];if(consumed+=match2[0].length,!value)throw TypeError(invalidStringError);let components=value.split(",").map(n3=>n3.includes("rad")?parseFloat(n3)*(180/Math.PI):parseFloat(n3)),[x6,y2,z6,a6]=components,xyz=[x6,y2,z6],xyza=[x6,y2,z6,a6];if(prop==="perspective"&&x6&&[y2,z6].every(n3=>n3===void 0))m6.m34=-1/x6;else if(prop.includes("matrix")&&[6,16].includes(components.length)&&components.every(n3=>!Number.isNaN(+n3))){let values=components.map(n3=>Math.abs(n3)<1e-6?0:n3);m6.multiplySelf(fromArray(values))}else if(prop==="translate3d"&&xyz.every(n3=>!Number.isNaN(+n3)))m6.translateSelf(x6,y2,z6);else if(prop==="translate"&&x6&&z6===void 0)m6.translateSelf(x6,y2||0,0);else if(prop==="rotate3d"&&xyza.every(n3=>!Number.isNaN(+n3))&&a6)m6.rotateAxisAngleSelf(x6,y2,z6,a6);else if(prop==="rotate"&&x6&&[y2,z6].every(n3=>n3===void 0))m6.rotateSelf(0,0,x6);else if(prop==="scale3d"&&xyz.every(n3=>!Number.isNaN(+n3))&&xyz.some(n3=>n3!==1))m6.scaleSelf(x6,y2,z6);else if(prop==="scale"&&!Number.isNaN(x6)&&(x6!==1||y2!==1)&&z6===void 0){let sy3=Number.isNaN(+y2)?x6:y2;m6.scaleSelf(x6,sy3,1)}else if(prop==="skew"&&(x6||!Number.isNaN(x6)&&y2)&&z6===void 0)m6.skewSelf(x6,y2||0);else if(["translate","rotate","scale","skew"].some(p3=>prop.includes(p3))&&/[XYZ]/.test(prop)&&x6&&[y2,z6].every(n3=>n3===void 0))if(prop==="skewX"||prop==="skewY")m6[prop==="skewX"?"skewXSelf":"skewYSelf"](x6);else{let fn3=prop.replace(/[XYZ]/,""),axis=prop.replace(fn3,""),idx=["X","Y","Z"].indexOf(axis),def=fn3==="scale"?1:0,method=fn3+"Self",axeValues=[idx===0?x6:def,idx===1?x6:def,idx===2?x6:def];m6[method](...axeValues)}else throw TypeError(invalidStringError)}if(consumed!==str.length)throw TypeError(invalidStringError);return m6},toArray=(m6,is2D)=>is2D?[m6.a,m6.b,m6.c,m6.d,m6.e,m6.f]:[m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44],Translate=(x6,y2,z6)=>{let m6=new CSSMatrix;return m6.m41=x6,m6.e=x6,m6.m42=y2,m6.f=y2,m6.m43=z6,m6},Rotate=(rx3,ry3,rz2)=>{let m6=new CSSMatrix,degToRad=Math.PI/180,radX=rx3*degToRad,radY=ry3*degToRad,radZ=rz2*degToRad,cosx=Math.cos(radX),sinx=-Math.sin(radX),cosy=Math.cos(radY),siny=-Math.sin(radY),cosz=Math.cos(radZ),sinz=-Math.sin(radZ),m11=cosy*cosz,m12=-cosy*sinz;m6.m11=m11,m6.a=m11,m6.m12=m12,m6.b=m12,m6.m13=siny;let m21=sinx*siny*cosz+cosx*sinz;m6.m21=m21,m6.c=m21;let m22=cosx*cosz-sinx*siny*sinz;return m6.m22=m22,m6.d=m22,m6.m23=-sinx*cosy,m6.m31=sinx*sinz-cosx*siny*cosz,m6.m32=sinx*cosz+cosx*siny*sinz,m6.m33=cosx*cosy,m6},RotateAxisAngle=(x6=0,y2=0,z6=0,alpha=0)=>{let m6=new CSSMatrix,length4=Math.sqrt(x6*x6+y2*y2+z6*z6);if(length4===0)return m6;let X6=x6/length4,Y6=y2/length4,Z3=z6/length4,angle=alpha*(Math.PI/360),sinA=Math.sin(angle),cosA=Math.cos(angle),sinA2=sinA*sinA,x22=X6*X6,y22=Y6*Y6,z22=Z3*Z3,m11=1-2*(y22+z22)*sinA2;m6.m11=m11,m6.a=m11;let m12=2*(X6*Y6*sinA2+Z3*sinA*cosA);m6.m12=m12,m6.b=m12,m6.m13=2*(X6*Z3*sinA2-Y6*sinA*cosA);let m21=2*(Y6*X6*sinA2-Z3*sinA*cosA);m6.m21=m21,m6.c=m21;let m22=1-2*(z22+x22)*sinA2;return m6.m22=m22,m6.d=m22,m6.m23=2*(Y6*Z3*sinA2+X6*sinA*cosA),m6.m31=2*(Z3*X6*sinA2+Y6*sinA*cosA),m6.m32=2*(Z3*Y6*sinA2-X6*sinA*cosA),m6.m33=1-2*(x22+y22)*sinA2,m6},Scale=(x6,y2,z6)=>{let m6=new CSSMatrix;return m6.m11=x6,m6.a=x6,m6.m22=y2,m6.d=y2,m6.m33=z6,m6},Skew=(angleX,angleY)=>{let m6=new CSSMatrix;if(angleX){let radX=angleX*Math.PI/180,tX2=Math.tan(radX);m6.m21=tX2,m6.c=tX2}if(angleY){let radY=angleY*Math.PI/180,tY2=Math.tan(radY);m6.m12=tY2,m6.b=tY2}return m6},SkewX=angle=>Skew(angle,0),SkewY=angle=>Skew(0,angle),multiplyInto=(m12,m22,m6)=>{let m11=m22.m11*m12.m11+m22.m12*m12.m21+m22.m13*m12.m31+m22.m14*m12.m41,m122=m22.m11*m12.m12+m22.m12*m12.m22+m22.m13*m12.m32+m22.m14*m12.m42,m13=m22.m11*m12.m13+m22.m12*m12.m23+m22.m13*m12.m33+m22.m14*m12.m43,m14=m22.m11*m12.m14+m22.m12*m12.m24+m22.m13*m12.m34+m22.m14*m12.m44,m21=m22.m21*m12.m11+m22.m22*m12.m21+m22.m23*m12.m31+m22.m24*m12.m41,m222=m22.m21*m12.m12+m22.m22*m12.m22+m22.m23*m12.m32+m22.m24*m12.m42,m23=m22.m21*m12.m13+m22.m22*m12.m23+m22.m23*m12.m33+m22.m24*m12.m43,m24=m22.m21*m12.m14+m22.m22*m12.m24+m22.m23*m12.m34+m22.m24*m12.m44,m31=m22.m31*m12.m11+m22.m32*m12.m21+m22.m33*m12.m31+m22.m34*m12.m41,m32=m22.m31*m12.m12+m22.m32*m12.m22+m22.m33*m12.m32+m22.m34*m12.m42,m33=m22.m31*m12.m13+m22.m32*m12.m23+m22.m33*m12.m33+m22.m34*m12.m43,m34=m22.m31*m12.m14+m22.m32*m12.m24+m22.m33*m12.m34+m22.m34*m12.m44,m41=m22.m41*m12.m11+m22.m42*m12.m21+m22.m43*m12.m31+m22.m44*m12.m41,m42=m22.m41*m12.m12+m22.m42*m12.m22+m22.m43*m12.m32+m22.m44*m12.m42,m43=m22.m41*m12.m13+m22.m42*m12.m23+m22.m43*m12.m33+m22.m44*m12.m43,m44=m22.m41*m12.m14+m22.m42*m12.m24+m22.m43*m12.m34+m22.m44*m12.m44;return m6.m11=m11,m6.a=m11,m6.m21=m21,m6.c=m21,m6.m31=m31,m6.m41=m41,m6.e=m41,m6.m12=m122,m6.b=m122,m6.m22=m222,m6.d=m222,m6.m32=m32,m6.m42=m42,m6.f=m42,m6.m13=m13,m6.m23=m23,m6.m33=m33,m6.m43=m43,m6.m14=m14,m6.m24=m24,m6.m34=m34,m6.m44=m44,m6},Multiply=(m12,m22)=>multiplyInto(m12,m22,new CSSMatrix),_a3,CSSMatrix=(_a3=class{constructor(init){if(init){if(typeof init=="string"&&init.length&&init!=="none")return fromString(init);if(Array.isArray(init)||init instanceof Float64Array||init instanceof Float32Array)return fromArray(init);if(typeof init=="object")return fromMatrix(init)}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,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(source){if(typeof source=="string"&&source.length&&source!=="none"){let m6=fromString(source);return writeValues(this,m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44)}return Array.isArray(source)||source instanceof Float64Array||source instanceof Float32Array?fromArray(source,this):typeof source=="object"?fromMatrix(source,this):this}toFloat32Array(is2D){return is2D?new Float32Array([this.a,this.b,this.c,this.d,this.e,this.f]):new Float32Array([this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44])}toFloat64Array(is2D){return is2D?new Float64Array([this.a,this.b,this.c,this.d,this.e,this.f]):new Float64Array([this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44])}toString(){let{is2D}=this,values=this.toFloat64Array(is2D).join(", ");return`${is2D?"matrix":"matrix3d"}(${values})`}toJSON(){let{is2D,isIdentity}=this;return{a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,m11:this.m11,m12:this.m12,m13:this.m13,m14:this.m14,m21:this.m21,m22:this.m22,m23:this.m23,m24:this.m24,m31:this.m31,m32:this.m32,m33:this.m33,m34:this.m34,m41:this.m41,m42:this.m42,m43:this.m43,m44:this.m44,is2D,isIdentity}}multiply(m22){return Multiply(this,m22)}translate(x6,y2,z6){let ty3=y2??0,tz2=z6??0,{m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44}=this,n41=x6*m11+ty3*m21+tz2*m31+m41,n42=x6*m12+ty3*m22+tz2*m32+m42,n43=x6*m13+ty3*m23+tz2*m33+m43,n44=x6*m14+ty3*m24+tz2*m34+m44;return fromValues(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,n41,n42,n43,n44)}scale(x6,y2,z6){let sy3=y2??x6,sz3=z6??1,{m41,m42,m43,m44}=this;return fromValues(this.m11*x6,this.m12*x6,this.m13*x6,this.m14*x6,this.m21*sy3,this.m22*sy3,this.m23*sy3,this.m24*sy3,this.m31*sz3,this.m32*sz3,this.m33*sz3,this.m34*sz3,m41,m42,m43,m44)}rotate(rx3,ry3,rz2){let RX=rx3,RY2=ry3||0,RZ2=rz2||0;return typeof rx3=="number"&&typeof ry3>"u"&&typeof rz2>"u"&&(RZ2=RX,RX=0,RY2=0),this.multiply(Rotate(RX,RY2,RZ2))}rotateAxisAngle(x6=0,y2=0,z6=0,angle=0){if([x6,y2,z6,angle].some(n3=>!Number.isFinite(n3)))throw new TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(x6*x6+y2*y2+z6*z6)===0?fromMatrix(this):this.multiply(RotateAxisAngle(x6,y2,z6,angle))}skewX(angle){return this.skew(angle,0)}skewY(angle){return this.skew(0,angle)}skew(angleX,angleY){let tX2=angleX?Math.tan(angleX*Math.PI/180):0,tY2=angleY?Math.tan(angleY*Math.PI/180):0,{m11,m12,m13,m14,m21,m22,m23,m24}=this;return fromValues(m11+tY2*m21,m12+tY2*m22,m13+tY2*m23,m14+tY2*m24,tX2*m11+m21,tX2*m12+m22,tX2*m13+m23,tX2*m14+m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44)}multiplySelf(m22){return multiplyInto(this,m22,this),this}translateSelf(x6,y2,z6){let ty3=y2??0,tz2=z6??0,{m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44}=this,n41=x6*m11+ty3*m21+tz2*m31+m41,n42=x6*m12+ty3*m22+tz2*m32+m42,n43=x6*m13+ty3*m23+tz2*m33+m43,n44=x6*m14+ty3*m24+tz2*m34+m44;return this.m41=n41,this.e=n41,this.m42=n42,this.f=n42,this.m43=n43,this.m44=n44,this}scaleSelf(x6,y2,z6){let sy3=y2??x6,sz3=z6??1;return this.m11*=x6,this.a*=x6,this.m12*=x6,this.b*=x6,this.m13*=x6,this.m14*=x6,this.m21*=sy3,this.c*=sy3,this.m22*=sy3,this.d*=sy3,this.m23*=sy3,this.m24*=sy3,this.m31*=sz3,this.m32*=sz3,this.m33*=sz3,this.m34*=sz3,this}rotateSelf(rx3,ry3,rz2){let RX=rx3,RY2=ry3||0,RZ2=rz2||0;return typeof rx3=="number"&&typeof ry3>"u"&&typeof rz2>"u"&&(RZ2=RX,RX=0,RY2=0),this.multiplySelf(Rotate(RX,RY2,RZ2))}rotateAxisAngleSelf(x6=0,y2=0,z6=0,angle=0){if([x6,y2,z6,angle].some(n3=>!Number.isFinite(n3)))throw new TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(x6*x6+y2*y2+z6*z6)===0?this:this.multiplySelf(RotateAxisAngle(x6,y2,z6,angle))}skewXSelf(angle){return this.skewSelf(angle,0)}skewYSelf(angle){return this.skewSelf(0,angle)}skewSelf(angleX,angleY){let tX2=angleX?Math.tan(angleX*Math.PI/180):0,tY2=angleY?Math.tan(angleY*Math.PI/180):0,{m11,m12,m13,m14,m21,m22,m23,m24}=this,n11=m11+tY2*m21,n12=m12+tY2*m22,n13=m13+tY2*m23,n14=m14+tY2*m24,n21=tX2*m11+m21,n22=tX2*m12+m22,n23=tX2*m13+m23,n24=tX2*m14+m24;return this.m11=n11,this.a=n11,this.m12=n12,this.b=n12,this.m13=n13,this.m14=n14,this.m21=n21,this.c=n21,this.m22=n22,this.d=n22,this.m23=n23,this.m24=n24,this}transformPoint(t53){let x6=this.m11*t53.x+this.m21*t53.y+this.m31*t53.z+this.m41*t53.w,y2=this.m12*t53.x+this.m22*t53.y+this.m32*t53.z+this.m42*t53.w,z6=this.m13*t53.x+this.m23*t53.y+this.m33*t53.z+this.m43*t53.w,w3=this.m14*t53.x+this.m24*t53.y+this.m34*t53.z+this.m44*t53.w;return typeof DOMPoint<"u"&&t53 instanceof DOMPoint?new DOMPoint(x6,y2,z6,w3):{x:x6,y:y2,z:z6,w:w3}}},__publicField(_a3,"Translate",Translate),__publicField(_a3,"Rotate",Rotate),__publicField(_a3,"RotateAxisAngle",RotateAxisAngle),__publicField(_a3,"Scale",Scale),__publicField(_a3,"SkewX",SkewX),__publicField(_a3,"SkewY",SkewY),__publicField(_a3,"Skew",Skew),__publicField(_a3,"Multiply",Multiply),__publicField(_a3,"fromArray",fromArray),__publicField(_a3,"fromMatrix",fromMatrix),__publicField(_a3,"fromString",fromString),__publicField(_a3,"toArray",toArray),__publicField(_a3,"isCompatibleArray",isCompatibleArray),__publicField(_a3,"isCompatibleObject",isCompatibleObject),_a3);var version="2.3.1",midPoint=([ax3,ay3],[bx3,by3],t53)=>[ax3+(bx3-ax3)*t53,ay3+(by3-ay3)*t53],distanceSquareRoot=(a6,b6)=>Math.sqrt((a6[0]-b6[0])*(a6[0]-b6[0])+(a6[1]-b6[1])*(a6[1]-b6[1])),getLineLength=(x12,y12,x22,y2)=>distanceSquareRoot([x12,y12],[x22,y2]),getPointAtLineLength=(x12,y12,x22,y2,distance8)=>{let point6={x:x12,y:y12};if(typeof distance8=="number"){let length4=distanceSquareRoot([x12,y12],[x22,y2]);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x22,y:y2};else{let[x6,y6]=midPoint([x12,y12],[x22,y2],distance8/length4);point6={x:x6,y:y6}}}return point6},getLineBBox=(x12,y12,x22,y2)=>{let{min,max:max2}=Math;return[min(x12,x22),min(y12,y2),max2(x12,x22),max2(y12,y2)]},lineTools={getLineBBox,getLineLength,getPointAtLineLength},Tvalues=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],deriveBezier=points=>{let dpoints=[];for(let p3=points,d3=p3.length,c3=d3-1;d3>1;d3-=1,c3-=1){let list=[];for(let j6=0;j6<c3;j6+=1)list.push({x:c3*(p3[j6+1].x-p3[j6].x),y:c3*(p3[j6+1].y-p3[j6].y),t:0});dpoints.push(list),p3=list}return dpoints},computeBezier=(points,t53)=>{if(t53===0)return points[0].t=0,points[0];let order=points.length-1;if(t53===1)return points[order].t=1,points[order];let mt3=1-t53,p3=points;if(order===0)return points[0].t=t53,points[0];if(order===1)return{x:mt3*p3[0].x+t53*p3[1].x,y:mt3*p3[0].y+t53*p3[1].y,t:t53};let mt22=mt3*mt3,t210=t53*t53,a6=0,b6=0,c3=0,d3=0;return order===2?(p3=[p3[0],p3[1],p3[2],{x:0,y:0}],a6=mt22,b6=mt3*t53*2,c3=t210):order===3&&(a6=mt22*mt3,b6=mt22*t53*3,c3=mt3*t210*3,d3=t53*t210),{x:a6*p3[0].x+b6*p3[1].x+c3*p3[2].x+d3*p3[3].x,y:a6*p3[0].y+b6*p3[1].y+c3*p3[2].y+d3*p3[3].y,t:t53}},calculateBezier=(derivativeFn,t53)=>{let d3=derivativeFn(t53),l6=d3.x*d3.x+d3.y*d3.y;return Math.sqrt(l6)},bezierLength=derivativeFn=>bezierLengthAtT(derivativeFn,1),bezierLengthAtT=(derivativeFn,t53)=>{let z6=t53/2,len=Tvalues.length,sum=0;for(let i6=0,tMid;i6<len;i6++)tMid=z6*Tvalues[i6]+z6,sum+=Cvalues[i6]*calculateBezier(derivativeFn,tMid);return z6*sum},getBezierPoints=curve=>{let points=[];for(let idx=0,len=curve.length,step=2;idx<len;idx+=step)points.push({x:curve[idx],y:curve[idx+1]});return points},getBezierLengthAtT=(curve,t53)=>{let dpoints=deriveBezier(getBezierPoints(curve));return bezierLengthAtT(ratio=>computeBezier(dpoints[0],ratio),t53)},getTAtBezierLength=(curve,distance8)=>{let dpoints=deriveBezier(getBezierPoints(curve)),derivativeFn=ratio=>computeBezier(dpoints[0],ratio),lo3=0,hi3=1;for(let i6=0;i6<25;i6+=1){let mid=(lo3+hi3)/2;bezierLengthAtT(derivativeFn,mid)<distance8?lo3=mid:hi3=mid}return(lo3+hi3)/2},getBezierLength=curve=>{let points=getBezierPoints(curve),dpoints=deriveBezier(points);return bezierLength(t53=>computeBezier(dpoints[0],t53))},CBEZIER_MINMAX_EPSILON=1e-8,minmaxQ=([v12,cp3,v22])=>{let min=Math.min(v12,v22),max2=Math.max(v12,v22);if(cp3>=v12?v22>=cp3:v22<=cp3)return[min,max2];let E7=(v12*v22-cp3*cp3)/(v12-2*cp3+v22);return E7<min?[E7,max2]:[min,E7]},minmaxC=([v12,cp1,cp22,v22])=>{let K3=v12-3*cp1+3*cp22-v22;if(Math.abs(K3)<1e-8)return v12===v22&&v12===cp1?[v12,v22]:minmaxQ([v12,-.5*v12+1.5*cp1,v12-3*cp1+3*cp22]);let T6=-v12*cp22+v12*v22-cp1*cp22-cp1*v22+cp1*cp1+cp22*cp22;if(T6<=0)return[Math.min(v12,v22),Math.max(v12,v22)];let S3=Math.sqrt(T6),min=Math.min(v12,v22),max2=Math.max(v12,v22),L5=v12-2*cp1+cp22;for(let R3=(L5+S3)/K3,i6=1;i6<=2;R3=(L5-S3)/K3,i6++)if(R3>0&&R3<1){let Q3=v12*(1-R3)*(1-R3)*(1-R3)+cp1*3*(1-R3)*(1-R3)*R3+cp22*3*(1-R3)*R3*R3+v22*R3*R3*R3;Q3<min&&(min=Q3),Q3>max2&&(max2=Q3)}return[min,max2]},bezierTools={bezierLength,bezierLengthAtT,calculateBezier,CBEZIER_MINMAX_EPSILON,computeBezier,Cvalues,deriveBezier,getBezierLength,getBezierLengthAtT,getBezierPoints,getTAtBezierLength,minmaxC,minmaxQ,Tvalues},arcLengthAtAngle=(rx3,ry3,theta)=>{let sign=theta<0?-1:1,absTheta=Math.abs(theta),step=Math.PI/2,total=0,remaining=absTheta,offset=0;for(;remaining>0;){let span=Math.min(step,remaining),z6=span/2,sum=0;for(let i6=0,len=Tvalues.length;i6<len;i6+=1){let phi=offset+z6*Tvalues[i6]+z6;sum+=Cvalues[i6]*Math.sqrt((rx3*Math.sin(phi))**2+(ry3*Math.cos(phi))**2)}total+=z6*sum,offset+=span,remaining-=span}return sign*total},arcLengthBetween=(rx3,ry3,from,to3)=>arcLengthAtAngle(rx3,ry3,to3)-arcLengthAtAngle(rx3,ry3,from),arcLength=(rx3,ry3,theta)=>Math.abs(arcLengthAtAngle(rx3,ry3,theta)),arcPoint=(cx3,cy3,rx3,ry3,alpha,theta)=>{let{sin:sin6,cos:cos6}=Math,cosA=cos6(alpha),sinA=sin6(alpha),x6=rx3*cos6(theta),y2=ry3*sin6(theta);return[cx3+cosA*x6-sinA*y2,cy3+sinA*x6+cosA*y2]},angleBetween=(v02,v12)=>{let{x:v0x,y:v0y}=v02,{x:v1x,y:v1y}=v12,p3=v0x*v1x+v0y*v1y,n3=Math.sqrt((v0x**2+v0y**2)*(v1x**2+v1y**2));return(v0x*v1y-v0y*v1x<0?-1:1)*Math.acos(p3/n3)},getArcProps=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{abs,sin:sin6,cos:cos6,sqrt,PI:PI7}=Math,rx3=abs(RX),ry3=abs(RY2),xRotRad=(angle%360+360)%360*(PI7/180);if(x12===x6&&y12===y2)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:x6,y:y2}};if(rx3===0||ry3===0)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:(x6+x12)/2,y:(y2+y12)/2}};let dx3=(x12-x6)/2,dy3=(y12-y2)/2,transformedPoint={x:cos6(xRotRad)*dx3+sin6(xRotRad)*dy3,y:-sin6(xRotRad)*dx3+cos6(xRotRad)*dy3},radiiCheck=transformedPoint.x**2/rx3**2+transformedPoint.y**2/ry3**2;radiiCheck>1&&(rx3*=sqrt(radiiCheck),ry3*=sqrt(radiiCheck));let cRadicand=(rx3**2*ry3**2-rx3**2*transformedPoint.y**2-ry3**2*transformedPoint.x**2)/(rx3**2*transformedPoint.y**2+ry3**2*transformedPoint.x**2);cRadicand=cRadicand<0?0:cRadicand;let cCoef=(LAF!==SF2?1:-1)*sqrt(cRadicand),transformedCenter={x:cCoef*(rx3*transformedPoint.y/ry3),y:cCoef*(-(ry3*transformedPoint.x)/rx3)},center2={x:cos6(xRotRad)*transformedCenter.x-sin6(xRotRad)*transformedCenter.y+(x12+x6)/2,y:sin6(xRotRad)*transformedCenter.x+cos6(xRotRad)*transformedCenter.y+(y12+y2)/2},startVector={x:(transformedPoint.x-transformedCenter.x)/rx3,y:(transformedPoint.y-transformedCenter.y)/ry3},startAngle=angleBetween({x:1,y:0},startVector),endVector={x:(-transformedPoint.x-transformedCenter.x)/rx3,y:(-transformedPoint.y-transformedCenter.y)/ry3},sweepAngle=angleBetween(startVector,endVector);return!SF2&&sweepAngle>0?sweepAngle-=2*PI7:SF2&&sweepAngle<0&&(sweepAngle+=2*PI7),sweepAngle%=2*PI7,{center:center2,startAngle,endAngle:startAngle+sweepAngle,rx:rx3,ry:ry3}},getArcLength=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2);return Math.abs(arcLengthBetween(rx3,ry3,startAngle,endAngle))},getPointAtArcLength=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2,distance8)=>{let point6={x:x12,y:y12},{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2);if(typeof distance8=="number"){let sweepAngle=endAngle-startAngle,length4=Math.abs(arcLengthBetween(rx3,ry3,startAngle,endAngle));if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x6,y:y2};else{if(x12===x6&&y12===y2)return{x:x6,y:y2};if(rx3===0||ry3===0)return getPointAtLineLength(x12,y12,x6,y2,distance8);let{PI:PI7,cos:cos6,sin:sin6}=Math,xRotRad=(angle%360+360)%360*(PI7/180),lo3=0,hi3=1;for(let i6=0;i6<25;i6+=1){let mid=(lo3+hi3)/2;Math.abs(arcLengthBetween(rx3,ry3,startAngle,startAngle+sweepAngle*mid))<distance8?lo3=mid:hi3=mid}let alpha=startAngle+sweepAngle*((lo3+hi3)/2),ellipseComponentX=rx3*cos6(alpha),ellipseComponentY=ry3*sin6(alpha);point6={x:cos6(xRotRad)*ellipseComponentX-sin6(xRotRad)*ellipseComponentY+center2.x,y:sin6(xRotRad)*ellipseComponentX+cos6(xRotRad)*ellipseComponentY+center2.y}}}return point6},getArcBBox=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2),deltaAngle=endAngle-startAngle,{min,max:max2,tan:tan6,atan2,PI:PI7}=Math,{x:cx3,y:cy3}=center2,alpha=angle*PI7/180,tangent=tan6(alpha),theta=atan2(-ry3*tangent,rx3),angle1=theta,angle2=theta+PI7,angle3=atan2(ry3,rx3*tangent),angle4=angle3+PI7,xArray=[x6],yArray=[y2],xMin=min(x12,x6),xMax=max2(x12,x6),yMin=min(y12,y2),yMax=max2(y12,y2),angleAfterStart=endAngle-deltaAngle*1e-5,pP2=arcPoint(cx3,cy3,rx3,ry3,alpha,angleAfterStart),angleBeforeEnd=endAngle-deltaAngle*.99999,pP3=arcPoint(cx3,cy3,rx3,ry3,alpha,angleBeforeEnd);if(pP2[0]>xMax||pP3[0]>xMax){let p12=arcPoint(cx3,cy3,rx3,ry3,alpha,angle1);xArray.push(p12[0]),yArray.push(p12[1])}if(pP2[0]<xMin||pP3[0]<xMin){let p22=arcPoint(cx3,cy3,rx3,ry3,alpha,angle2);xArray.push(p22[0]),yArray.push(p22[1])}if(pP2[1]<yMin||pP3[1]<yMin){let p42=arcPoint(cx3,cy3,rx3,ry3,alpha,angle4);xArray.push(p42[0]),yArray.push(p42[1])}if(pP2[1]>yMax||pP3[1]>yMax){let p3=arcPoint(cx3,cy3,rx3,ry3,alpha,angle3);xArray.push(p3[0]),yArray.push(p3[1])}return xMin=min.apply([],xArray),yMin=min.apply([],yArray),xMax=max2.apply([],xArray),yMax=max2.apply([],yArray),[xMin,yMin,xMax,yMax]},arcTools={angleBetween,arcLength,arcLengthAtAngle,arcLengthBetween,arcPoint,getArcBBox,getArcLength,getArcProps,getPointAtArcLength},getPointAtCubicSegmentLength=([x12,y12,c1x,c1y,c2x,c2y,x22,y2],t53)=>{let t110=1-t53;return{x:t110**3*x12+3*t110**2*t53*c1x+3*t110*t53**2*c2x+t53**3*x22,y:t110**3*y12+3*t110**2*t53*c1y+3*t110*t53**2*c2y+t53**3*y2}},getCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y2]),getPointAtCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y2,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let coords=[x12,y12,c1x,c1y,c2x,c2y,x22,y2],currentLength=getBezierLength(coords);if(!(distance8<=0))if(distance8>=currentLength)point6={x:x22,y:y2};else{let t53=getTAtBezierLength(coords,distance8);point6=getPointAtCubicSegmentLength(coords,t53)}}return point6},getCubicBBox=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>{let cxMinMax=minmaxC([x12,c1x,c2x,x22]),cyMinMax=minmaxC([y12,c1y,c2y,y2]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},cubicTools={getCubicBBox,getCubicLength,getPointAtCubicLength,getPointAtCubicSegmentLength},getPointAtQuadSegmentLength=([x12,y12,cx3,cy3,x22,y2],t53)=>{let t110=1-t53;return{x:t110**2*x12+2*t110*t53*cx3+t53**2*x22,y:t110**2*y12+2*t110*t53*cy3+t53**2*y2}},getQuadLength=(x12,y12,cx3,cy3,x22,y2)=>getBezierLength([x12,y12,cx3,cy3,x22,y2]),getPointAtQuadLength=(x12,y12,cx3,cy3,x22,y2,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let coords=[x12,y12,cx3,cy3,x22,y2],currentLength=getBezierLength(coords);if(!(distance8<=0))if(distance8>=currentLength)point6={x:x22,y:y2};else{let t53=getTAtBezierLength(coords,distance8);point6=getPointAtQuadSegmentLength(coords,t53)}}return point6},getQuadBBox=(x12,y12,cx3,cy3,x22,y2)=>{let cxMinMax=minmaxQ([x12,cx3,x22]),cyMinMax=minmaxQ([y12,cy3,y2]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},quadTools={getPointAtQuadLength,getPointAtQuadSegmentLength,getQuadBBox,getQuadLength},polygonArea=polygon2=>{let n3=polygon2.length,i6=-1,a6,b6=polygon2[n3-1],area=0;for(;++i6<n3;)a6=b6,b6=polygon2[i6],area+=a6[1]*b6[0]-a6[0]*b6[1];return area/2},polygonLength=polygon2=>polygon2.reduce((length4,point6,i6)=>i6?length4+distanceSquareRoot(polygon2[i6-1],point6):0,0),polygonCentroid=polygon2=>{if(polygon2.length===0)return[0,0];let sumX=0,sumY=0;for(let[x6,y2]of polygon2)sumX+=x6,sumY+=y2;let count=polygon2.length;return[sumX/count,sumY/count]},polygonTools={polygonArea,polygonLength,polygonCentroid},rotateVector=(x6,y2,rad)=>{let{sin:sin6,cos:cos6}=Math;return{x:x6*cos6(rad)-y2*sin6(rad),y:x6*sin6(rad)+y2*cos6(rad)}},roundTo=(n3,round)=>{let pow=round>=1?10**round:1;return round>0?Math.round(n3*pow)/pow:Math.round(n3)},defaultOptions2={origin:[0,0,0],round:4},paramsCounts={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},finalizeSegment=path=>{let pathCommand=path.pathValue[path.segmentStart],relativeCommand=pathCommand.toLowerCase(),{data}=path,index=0;for(;data.length-index>=paramsCounts[relativeCommand];){if(relativeCommand==="m"&&data.length-index>2){let segment2=new Array(3);segment2[0]=pathCommand,segment2[1]=data[index],segment2[2]=data[index+1],path.segments.push(segment2),index+=2,relativeCommand="l",pathCommand=pathCommand==="m"?"l":"L"}else{let paramCount=paramsCounts[relativeCommand],segment2=new Array(paramCount+1);segment2[0]=pathCommand;for(let i6=0;i6<paramCount;i6+=1)segment2[i6+1]=data[index+i6];path.segments.push(segment2),index+=paramCount}if(!paramsCounts[relativeCommand])break}},error="SVGPathCommanderError",scanFlag=path=>{let{index,pathValue}=path,code=pathValue.charCodeAt(index);if(code===48){path.param=0,path.index+=1;return}if(code===49){path.param=1,path.index+=1;return}path.err=`${error}: invalid Arc flag "${pathValue[index]}", expecting 0 or 1 at index ${index}`},isDigit=code=>code>=48&&code<=57,invalidPathValue="Invalid path value",scanParam=path=>{let{max:max2,pathValue,index:start}=path,index=start,zeroFirst=!1,hasCeiling=!1,hasDecimal=!1,hasDot=!1,ch2;if(index>=max2){path.err=`${error}: ${invalidPathValue} at index ${index}, "pathValue" is missing param`;return}if(ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1,ch2=pathValue.charCodeAt(index)),!isDigit(ch2)&&ch2!==46){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" is not a number`;return}if(ch2!==46){if(zeroFirst=ch2===48,index+=1,ch2=pathValue.charCodeAt(index),zeroFirst&&index<max2&&ch2&&isDigit(ch2)){path.err=`${error}: ${invalidPathValue} at index ${start}, "${pathValue[start]}" illegal number`;return}for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1,hasCeiling=!0;ch2=pathValue.charCodeAt(index)}if(ch2===46){for(hasDot=!0,index+=1;isDigit(pathValue.charCodeAt(index));)index+=1,hasDecimal=!0;ch2=pathValue.charCodeAt(index)}if(ch2===101||ch2===69){if(hasDot&&!hasCeiling&&!hasDecimal){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid float exponent`;return}if(index+=1,ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1),index<max2&&isDigit(pathValue.charCodeAt(index)))for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1;else{path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid integer exponent`;return}}path.index=index,path.param=scanNumber(pathValue,start,index)},scanNumber=(str,start,end)=>{let i6=start,sign=1,param=0,decimals=0,sigDigits=0,inFraction=!1,expSign=1,exp=0,ch2=str.charCodeAt(i6);for(ch2===43?i6+=1:ch2===45&&(sign=-1,i6+=1);i6<end;i6+=1){let code=str.charCodeAt(i6);if(code===46)inFraction=!0;else if(code===101||code===69){i6+=1;let expCode=str.charCodeAt(i6);for(expCode===43?i6+=1:expCode===45&&(expSign=-1,i6+=1);i6<end;i6+=1)exp=exp*10+(str.charCodeAt(i6)-48)}else{let digit=code-48;(digit!==0||param!==0)&&(sigDigits+=1),param=param*10+digit,inFraction&&(decimals+=1)}}if(sigDigits>15||sigDigits===0)return+str.slice(start,end);let scale6=expSign*exp-decimals;return scale6>22||scale6<-22?+str.slice(start,end):scale6>=0?sign*param*10**scale6:sign*param/10**-scale6},isSpace=ch2=>[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(ch2),skipSpaces=path=>{let{pathValue,max:max2}=path;for(;path.index<max2&&isSpace(pathValue.charCodeAt(path.index));)path.index+=1},isPathCommand=code=>{switch(code|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}},isDigitStart=code=>isDigit(code)||code===43||code===45||code===46,isArcCommand=code=>(code|32)===97,isMoveCommand=code=>{switch(code|32){case 109:case 77:return!0;default:return!1}},scanSegment=path=>{let{max:max2,pathValue,index,segments}=path,cmdCode=pathValue.charCodeAt(index),reqParams=paramsCounts[pathValue[index].toLowerCase()];if(path.segmentStart=index,!isPathCommand(cmdCode)){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a path command at index ${index}`;return}let lastSegment=segments[segments.length-1];if(!isMoveCommand(cmdCode)&&lastSegment?.[0]?.toLocaleLowerCase()==="z"){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a MoveTo path command at index ${index}`;return}if(path.index+=1,skipSpaces(path),path.data=[],!reqParams){finalizeSegment(path);return}for(;;){for(let i6=reqParams;i6>0;i6-=1){if(isArcCommand(cmdCode)&&(i6===3||i6===4)?scanFlag(path):scanParam(path),path.err.length)return;path.data.push(path.param),skipSpaces(path),path.index<max2&&pathValue.charCodeAt(path.index)===44&&(path.index+=1,skipSpaces(path))}if(path.index>=path.max||!isDigitStart(pathValue.charCodeAt(path.index)))break}finalizeSegment(path)},PathParser=class{constructor(pathString){this.segments=[],this.pathValue=pathString,this.max=pathString.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}},parsePathString=pathInput=>{if(typeof pathInput!="string")return pathInput.slice(0);let path=new PathParser(pathInput);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);if(!path.err.length)path.segments.length&&(path.segments[0][0]="M");else throw TypeError(path.err);return path.segments},absolutizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase();if(index===0||absCommand===pathCommand)return segment2;if(absCommand==="A")return[absCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]+lastX,segment2[7]+lastY];if(absCommand==="V")return[absCommand,segment2[1]+lastY];if(absCommand==="H")return[absCommand,segment2[1]+lastX];if(absCommand==="L")return[absCommand,segment2[1]+lastX,segment2[2]+lastY];if(absCommand==="C")return[absCommand,segment2[1]+lastX,segment2[2]+lastY,segment2[3]+lastX,segment2[4]+lastY,segment2[5]+lastX,segment2[6]+lastY];{let absValues=[],seglen=segment2.length;for(let j6=1;j6<seglen;j6+=1)absValues.push(segment2[j6]+(j6%2?lastX:lastY));return[absCommand].concat(absValues)}},iterate=(path,iterator)=>{let x6=0,y2=0,mx3=0,my3=0,i6=0;for(;i6<path.length;){let segment2=path[i6],[pathCommand]=segment2,commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,iteratorResult=iterator(segment2,i6,x6,y2);if(iteratorResult===!1)break;if(absCommand==="Z")x6=mx3,y2=my3;else if(absCommand==="H")x6=segment2[1]+(isRelative?x6:0);else if(absCommand==="V")y2=segment2[1]+(isRelative?y2:0);else{let segLen=segment2.length;x6=segment2[segLen-2]+(isRelative?x6:0),y2=segment2[segLen-1]+(isRelative?y2:0),absCommand==="M"&&(mx3=x6,my3=y2)}iteratorResult&&(path[i6]=iteratorResult),i6+=1}return path},pathToAbsolute=pathInput=>{let path=parsePathString(pathInput);return iterate(path,absolutizeSegment)},relativizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,relCommand=pathCommand.toLowerCase();if(index===0||pathCommand===relCommand)return segment2;if(relCommand==="a")return[relCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]-lastX,segment2[7]-lastY];if(relCommand==="v")return[relCommand,segment2[1]-lastY];if(relCommand==="h")return[relCommand,segment2[1]-lastX];if(relCommand==="l")return[relCommand,segment2[1]-lastX,segment2[2]-lastY];{let relValues=[],seglen=segment2.length;for(let j6=1;j6<seglen;j6+=1)relValues.push(segment2[j6]-(j6%2?lastX:lastY));return[relCommand].concat(relValues)}},pathToRelative=pathInput=>{let path=parsePathString(pathInput);return iterate(path,relativizeSegment)},arcToCubic=(X12,Y12,RX,RY2,angle,LAF,SF2,X22,Y22,recursive)=>{let x12=X12,y12=Y12,rx3=RX,ry3=RY2,x22=X22,y2=Y22,d120=Math.PI*120/180,rad=Math.PI/180*(+angle||0),res2=[],xy3,f12,f2,cx3,cy3;if(recursive)[f12,f2,cx3,cy3]=recursive;else{xy3=rotateVector(x12,y12,-rad),x12=xy3.x,y12=xy3.y,xy3=rotateVector(x22,y2,-rad),x22=xy3.x,y2=xy3.y;let x6=(x12-x22)/2,y6=(y12-y2)/2,h3=x6*x6/(rx3*rx3)+y6*y6/(ry3*ry3);h3>1&&(h3=Math.sqrt(h3),rx3*=h3,ry3*=h3);let rx22=rx3*rx3,ry22=ry3*ry3,k7=(LAF===SF2?-1:1)*Math.sqrt(Math.abs((rx22*ry22-rx22*y6*y6-ry22*x6*x6)/(rx22*y6*y6+ry22*x6*x6)));cx3=k7*rx3*y6/ry3+(x12+x22)/2,cy3=k7*-ry3*x6/rx3+(y12+y2)/2,f12=Math.asin(((y12-cy3)/ry3*10**9>>0)/10**9),f2=Math.asin(((y2-cy3)/ry3*10**9>>0)/10**9),f12=x12<cx3?Math.PI-f12:f12,f2=x22<cx3?Math.PI-f2:f2,f12<0&&(f12=Math.PI*2+f12),f2<0&&(f2=Math.PI*2+f2),SF2&&f12>f2&&(f12-=Math.PI*2),!SF2&&f2>f12&&(f2-=Math.PI*2)}let df3=f2-f12;if(Math.abs(df3)>d120){let f2old=f2,x2old=x22,y2old=y2;f2=f12+d120*(SF2&&f2>f12?1:-1),x22=cx3+rx3*Math.cos(f2),y2=cy3+ry3*Math.sin(f2),res2=arcToCubic(x22,y2,rx3,ry3,angle,0,SF2,x2old,y2old,[f2,f2old,cx3,cy3])}df3=f2-f12;let c12=Math.cos(f12),s12=Math.sin(f12),c22=Math.cos(f2),s22=Math.sin(f2),t53=Math.tan(df3/4),hx3=4/3*rx3*t53,hy3=4/3*ry3*t53,m12=[x12,y12],m22=[x12+hx3*s12,y12-hy3*c12],m32=[x22+hx3*s22,y2-hy3*c22],m42=[x22,y2];if(m22[0]=2*m12[0]-m22[0],m22[1]=2*m12[1]-m22[1],recursive)return[m22[0],m22[1],m32[0],m32[1],m42[0],m42[1]].concat(res2);res2=[m22[0],m22[1],m32[0],m32[1],m42[0],m42[1]].concat(res2);let newres=[];for(let i6=0,ii3=res2.length;i6<ii3;i6+=1)newres[i6]=i6%2?rotateVector(res2[i6-1],res2[i6],rad).y:rotateVector(res2[i6],res2[i6+1],rad).x;return newres},quadToCubic=(x12,y12,qx3,qy3,x22,y2)=>{let r13=.3333333333333333,r23=2/3;return[r13*x12+r23*qx3,r13*y12+r23*qy3,r13*x22+r23*qx3,r13*y2+r23*qy3,x22,y2]},lineToCubic=(x12,y12,x22,y2)=>{let c12=midPoint([x12,y12],[x22,y2],.3333333333333333),c22=midPoint([x12,y12],[x22,y2],2/3);return[c12[0],c12[1],c22[0],c22[1],x22,y2]},segmentToCubic=(segment2,params)=>{let pathCommand=segment2[0],values=segment2.slice(1).map(Number),[x6,y2]=values,{x1:px1,y1:py1}=params;return"TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="M"?(params.mx=x6,params.my=y2,params.x=x6,params.y=y2,segment2):pathCommand==="A"?["C"].concat(arcToCubic(px1,py1,values[0],values[1],values[2],values[3],values[4],values[5],values[6])):pathCommand==="Q"?(params.qx=x6,params.qy=y2,["C"].concat(quadToCubic(px1,py1,values[0],values[1],values[2],values[3]))):pathCommand==="L"?["C"].concat(lineToCubic(px1,py1,x6,y2)):pathCommand==="Z"?["C"].concat(lineToCubic(px1,py1,params.mx,params.my)):segment2},normalizeSegment=(segment2,params)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=pathCommand!==absCommand,{x1:px1,y1:py1,x2:px22,y2:py22,x:x6,y:y2}=params,values=segment2.slice(1),absValues=values.map((n3,j6)=>n3+(isRelative?j6%2?y2:x6:0));if("TQ".includes(absCommand)||(params.qx=null,params.qy=null),absCommand==="A")return absValues=values.slice(0,-2).concat(values[5]+(isRelative?x6:0),values[6]+(isRelative?y2:0)),["A"].concat(absValues);if(absCommand==="H")return["L",segment2[1]+(isRelative?x6:0),py1];if(absCommand==="V")return["L",px1,segment2[1]+(isRelative?y2:0)];if(absCommand==="L")return["L",segment2[1]+(isRelative?x6:0),segment2[2]+(isRelative?y2:0)];if(absCommand==="M")return["M",segment2[1]+(isRelative?x6:0),segment2[2]+(isRelative?y2:0)];if(absCommand==="C")return["C"].concat(absValues);if(absCommand==="S"){let x12=px1*2-px22,y12=py1*2-py22;return params.x1=x12,params.y1=y12,["C",x12,y12].concat(absValues)}else if(absCommand==="T"){let qx3=px1*2-(params.qx?params.qx:0),qy3=py1*2-(params.qy?params.qy:0);return params.qx=qx3,params.qy=qy3,["Q",qx3,qy3].concat(absValues)}else if(absCommand==="Q"){let[nqx,nqy]=absValues;return params.qx=nqx,params.qy=nqy,["Q"].concat(absValues)}else if(absCommand==="Z")return["Z"];return segment2},paramsParser={mx:0,my:0,x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},pathToCurve=pathInput=>{let params={...paramsParser},path=parsePathString(pathInput);return iterate(path,(seg,index,lastX,lastY)=>{params.x=lastX,params.y=lastY;let normalSegment=normalizeSegment(seg,params);normalSegment[0]==="M"&&(params.mx=normalSegment[1],params.my=normalSegment[2]);let result=segmentToCubic(normalSegment,params);result[0]==="C"&&result.length>7&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=result.slice(0,7));let seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},pathToString=(path,roundOption)=>{let pathLen=path.length,{round}=defaultOptions2,segment2=path[0],result="";round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off";let pow=round==="off"?0:10**round;for(let i6=0;i6<pathLen;i6+=1){segment2=path[i6];let pathCommand=segment2[0],segLen=segment2.length;if(result+=pathCommand,round==="off")for(let j6=1;j6<segLen;j6+=1)result+=segment2[j6],j6!==segLen-1&&(result+=" ");else for(let j6=1;j6<segLen;j6+=1)result+=Math.round(segment2[j6]*pow)/pow,j6!==segLen-1&&(result+=" ")}return result},getPathBBox=pathInput=>{if(!pathInput)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let path=parsePathString(pathInput),pathCommand="M",mx3=0,my3=0,{max:max2,min}=Math,xMin=1/0,yMin=1/0,xMax=-1/0,yMax=-1/0,minX=0,minY=0,maxX=0,maxY=0,paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0;iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,absoluteSegment=isRelative?absolutizeSegment(seg,index,lastX,lastY):seg,normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,absCommand!=="T"&&absCommand!=="Q"&&(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment,minX=mx3,minY=my3,maxX=mx3,maxY=my3;else if(pathCommand==="L")[minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")[minX,minY,maxX,maxY]=getArcBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&([minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,mx3,my3));if(xMin=min(minX,xMin),yMin=min(minY,yMin),xMax=max2(maxX,xMax),yMax=max2(maxY,yMax),pathCommand==="Z")paramX1=mx3,paramY1=my3;else{let segLen=normalSegment.length;paramX1=normalSegment[segLen-2],paramY1=normalSegment[segLen-1]}pathCommand==="C"?(paramX2=normalSegment[3],paramY2=normalSegment[4]):pathCommand==="S"?(paramX2=normalSegment[1],paramY2=normalSegment[2]):(paramX2=paramX1,paramY2=paramY1)});let width=xMax-xMin,height=yMax-yMin;return{width,height,x:xMin,y:yMin,x2:xMax,y2:yMax,cx:xMin+width/2,cy:yMin+height/2,cz:Math.max(width,height)+Math.min(width,height)/2}},getTotalLength=pathInput=>{let path=parsePathString(pathInput),paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0,pathCommand="M",mx3=0,my3=0,totalLength=0;return iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment;else if(pathCommand==="L")totalLength+=getLineLength(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")totalLength+=getArcLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;totalLength+=getCubicLength(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?totalLength+=getCubicLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,totalLength+=getQuadLength(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],totalLength+=getQuadLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&(totalLength+=getLineLength(lastX,lastY,mx3,my3));[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]}),totalLength},DISTANCE_EPSILON=1e-5,normalizePath=pathInput=>{let path=parsePathString(pathInput),params={...paramsParser};return iterate(path,(seg,_3,lastX,lastY)=>{params.x=lastX,params.y=lastY;let result=normalizeSegment(seg,params),seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},getPointAtLength=(pathInput,distance8)=>{let path=normalizePath(pathInput),isM=!1,data=[],[mx3,my3]=path[0].slice(1),distanceIsNumber=typeof distance8=="number",point6={x:mx3,y:my3},length4=0,POINT=point6,totalLength=0;return!distanceIsNumber||distance8<1e-5?point6:(iterate(path,(seg,_3,lastX,lastY)=>{let pathCommand=seg[0];if(isM=pathCommand==="M",data=isM?data:[lastX,lastY].concat(seg.slice(1)),isM?([,mx3,my3]=seg,point6={x:mx3,y:my3},length4=0):pathCommand==="L"?(point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])):pathCommand==="A"?(point6=getPointAtArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],distance8-totalLength),length4=getArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])):pathCommand==="C"?(point6=getPointAtCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],distance8-totalLength),length4=getCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])):pathCommand==="Q"?(point6=getPointAtQuadLength(data[0],data[1],data[2],data[3],data[4],data[5],distance8-totalLength),length4=getQuadLength(data[0],data[1],data[2],data[3],data[4],data[5])):pathCommand==="Z"&&(data=[lastX,lastY,mx3,my3],point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])),totalLength<distance8)POINT=point6;else return!1;totalLength+=length4}),POINT)},getPropertiesAtLength=(pathInput,distance8)=>{let pathArray=parsePathString(pathInput),pathTemp=pathArray.slice(0),pathLength4=getTotalLength(pathTemp),index=pathTemp.length-1,lengthAtSegment=0,length4=0,segment2=pathArray[0];if(index<=0||!distance8||!Number.isFinite(distance8))return{segment:segment2,index:0,length:length4,lengthAtSegment};if(distance8>=pathLength4)return pathTemp=pathArray.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,segment2=pathArray[index],{segment:segment2,index,length:length4,lengthAtSegment};let segments=[];for(;index>0;)segment2=pathTemp[index],pathTemp=pathTemp.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,pathLength4=lengthAtSegment,segments.push({segment:segment2,index,length:length4,lengthAtSegment}),index-=1;return segments.find(({lengthAtSegment:l6})=>l6<=distance8)},getPropertiesAtPoint=(pathInput,point6)=>{let path=parsePathString(pathInput),normalPath=normalizePath(path),pathLength4=getTotalLength(normalPath),distanceTo=p3=>{let dx3=p3.x-point6.x,dy3=p3.y-point6.y;return dx3*dx3+dy3*dy3},precision=8,scan,closest={x:0,y:0},scanDistance=0,bestLength=0,bestDistance=1/0;for(let scanLength=0;scanLength<=pathLength4;scanLength+=precision)scan=getPointAtLength(normalPath,scanLength),scanDistance=distanceTo(scan),scanDistance<bestDistance&&(closest=scan,bestLength=scanLength,bestDistance=scanDistance);precision/=2;let before,after,beforeLength=0,afterLength=0,beforeDistance=0,afterDistance=0;for(;precision>1e-6&&(beforeLength=bestLength-precision,before=getPointAtLength(normalPath,beforeLength),beforeDistance=distanceTo(before),afterLength=bestLength+precision,after=getPointAtLength(normalPath,afterLength),afterDistance=distanceTo(after),beforeLength>=0&&beforeDistance<bestDistance?(closest=before,bestLength=beforeLength,bestDistance=beforeDistance):afterLength<=pathLength4&&afterDistance<bestDistance?(closest=after,bestLength=afterLength,bestDistance=afterDistance):precision/=2,!(precision<1e-5)););let segment2=getPropertiesAtLength(path,bestLength);return{closest,distance:Math.sqrt(bestDistance),segment:segment2}},getClosestPoint=(pathInput,point6)=>getPropertiesAtPoint(pathInput,point6).closest,getCubicSegArea=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>3*((y2-y12)*(c1x+c2x)-(x22-x12)*(c1y+c2y)+c1y*(x12-c2x)-c1x*(y12-c2y)+y2*(c2x+x12/3)-x22*(c2y+y12/3))/20,getPathArea=path=>{let x6=0,y2=0,len=0;return pathToCurve(path).map(seg=>seg[0]==="M"?([,x6,y2]=seg,0):(len=getCubicSegArea(x6,y2,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]),[x6,y2]=seg.slice(-2),len)).reduce((a6,b6)=>a6+b6,0)},getDrawDirection=path=>getPathArea(pathToCurve(path))>=0,getSegmentAtLength=(pathInput,distance8)=>getPropertiesAtLength(pathInput,distance8).segment,getSegmentOfPoint=(path,point6)=>getPropertiesAtPoint(path,point6).segment,isPathArray=path=>Array.isArray(path)&&path.every(seg=>{let lk2=seg[0].toLowerCase();return paramsCounts[lk2]===seg.length-1&&"achlmqstvz".includes(lk2)&&seg.slice(1).every(Number.isFinite)})&&path.length>0,isAbsoluteArray=path=>isPathArray(path)&&path.every(([x6])=>x6===x6.toUpperCase()),isNormalizedArray=path=>isAbsoluteArray(path)&&path.every(([pc2])=>"ACLMQZ".includes(pc2)),isPolygonArray=path=>isNormalizedArray(path)&&path.every(([pc2])=>"MLVHZ".includes(pc2)),isCurveArray=path=>isNormalizedArray(path)&&path.every(([pc2])=>"MC".includes(pc2)),isPointInStroke=(pathInput,point6)=>{let{distance:distance8}=getPropertiesAtPoint(pathInput,point6);return Math.abs(distance8)<DISTANCE_EPSILON},isRelativeArray=path=>isPathArray(path)&&path.slice(1).every(([pc2])=>pc2===pc2.toLowerCase()),isValidPath=pathString=>{if(typeof pathString!="string"||!pathString.length)return!1;let path=new PathParser(pathString);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);return!path.err.length&&"mM".includes(path.segments[0][0])};function samplePolygon(path){let points=[],[mx3,my3]=[0,0];return iterate(path,seg=>{let cmd=seg[0];if(cmd==="M")[mx3,my3]=[seg[1],seg[2]],points.push([mx3,my3]);else if(cmd==="L")points.push([seg[1],seg[2]]);else if(cmd==="C")points.push([seg[5],seg[6]]);else if(cmd==="A")points.push([seg[6],seg[7]]);else if(cmd==="Z")points.push([mx3,my3]);else throw new TypeError(`${error}: path command "${cmd}" is not supported`)}),points}var shapeParams={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"]},isElement=node=>node!=null&&typeof node=="object"&&node.nodeType===1,getLinePath=attr=>{let{x1:x12,y1:y12,x2:x22,y2}=attr;return[x12,y12,x22,y2]=[x12,y12,x22,y2].map(a6=>+a6),[["M",x12,y12],["L",x22,y2]]},getPolyPath=attr=>{let pathArray=[],points=(attr.points||"").trim().split(/[\s|,]/).map(a6=>+a6),index=0;for(;index<points.length;)pathArray.push([index?"L":"M",points[index],points[index+1]]),index+=2;return attr.type==="polygon"?[...pathArray,["z"]]:pathArray},getCirclePath=attr=>{let{cx:cx3,cy:cy3,r:r6}=attr;return[cx3,cy3,r6]=[cx3,cy3,r6].map(a6=>+a6),[["M",cx3-r6,cy3],["a",r6,r6,0,1,0,2*r6,0],["a",r6,r6,0,1,0,-2*r6,0]]},getEllipsePath=attr=>{let{cx:cx3,cy:cy3}=attr,rx3=attr.rx||0,ry3=attr.ry||rx3;return[cx3,cy3,rx3,ry3]=[cx3,cy3,rx3,ry3].map(a6=>+a6),[["M",cx3-rx3,cy3],["a",rx3,ry3,0,1,0,2*rx3,0],["a",rx3,ry3,0,1,0,-2*rx3,0]]},getRectanglePath=attr=>{let x6=+attr.x||0,y2=+attr.y||0,w3=+attr.width,h3=+attr.height,rx3=+(attr.rx||0),ry3=+(attr.ry||rx3);return rx3||ry3?(rx3*2>w3&&(rx3-=(rx3*2-w3)/2),ry3*2>h3&&(ry3-=(ry3*2-h3)/2),[["M",x6+rx3,y2],["h",w3-rx3*2],["s",rx3,0,rx3,ry3],["v",h3-ry3*2],["s",0,ry3,-rx3,ry3],["h",-w3+rx3*2],["s",-rx3,0,-rx3,-ry3],["v",-h3+ry3*2],["s",0,-ry3,rx3,-ry3]]):[["M",x6,y2],["h",w3],["v",h3],["H",x6],["Z"]]},shapeToPathArray=element=>{let supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName&&[...supportedShapes,"path"].every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type};targetIsElement?shapeAttrs.forEach(p3=>{config[p3]=element.getAttribute(p3)}):Object.assign(config,element);let pathArray=[];return type==="circle"?pathArray=getCirclePath(config):type==="ellipse"?pathArray=getEllipsePath(config):["polyline","polygon"].includes(type)?pathArray=getPolyPath(config):type==="rect"?pathArray=getRectanglePath(config):type==="line"?pathArray=getLinePath(config):["glyph","path"].includes(type)&&(pathArray=parsePathString(targetIsElement?element.getAttribute("d")||"":element.d||"")),isPathArray(pathArray)&&pathArray.length?pathArray:!1},shapeToPath=(element,replace,ownerDocument)=>{let doc=ownerDocument||document,supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName==="path")throw TypeError(`${error}: "${tagName}" is already SVGPathElement`);if(tagName&&supportedShapes.every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let path=doc.createElementNS("http://www.w3.org/2000/svg","path"),type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type},round=defaultOptions2.round,pathArray=shapeToPathArray(element),description=pathArray&&pathArray.length?pathToString(pathArray,round):"";if(targetIsElement){shapeAttrs.forEach(p3=>{config[p3]=element.getAttribute(p3)});for(let i6=0;i6<element.attributes.length;i6++){let attr=element.attributes[i6];attr&&!shapeAttrs.includes(attr.name)&&path.setAttribute(attr.name,attr.value)}}else Object.assign(config,element),Object.keys(config).forEach(k7=>{!shapeAttrs.includes(k7)&&k7!=="type"&&path.setAttribute(k7.replace(/[A-Z]/g,m6=>`-${m6.toLowerCase()}`),config[k7])});return isValidPath(description)?(path.setAttribute("d",description),replace&&targetIsElement&&(element.before(path,element),element.remove()),path):!1},isMultiPath=path=>{if(typeof path=="string"){let matches=path.match(/[Mm]/g);return matches?matches.length>1:!1}if(isPathArray(path)){let moveCount=0;for(let segment2 of path)if(segment2[0].toUpperCase()==="M"&&(moveCount++,moveCount>1))return!0;return!1}throw new TypeError("SVGPathCommanderError: expected string or PathArray")};function isPolylineArray(path){return isNormalizedArray(path)&&path.every(([pc2])=>"MLVH".includes(pc2))}var isClosedPath=path=>path[path.length-1][0].toUpperCase()==="Z",shortenSegment=(segment2,normalSegment,params,prevCommand)=>{let[pathCommand]=segment2,{round:defaultRound}=defaultOptions2,round=typeof defaultRound=="number"?defaultRound:4,normalValues=normalSegment.slice(1),{x1:x12,y1:y12,x2:x22,y2,x:x6,y:y6}=params,[nx3,ny3]=normalValues.slice(-2),result=segment2;if("TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="L"){if(roundTo(x6,round)===roundTo(nx3,round))return["V",ny3];if(roundTo(y6,round)===roundTo(ny3,round))return["H",nx3]}else if(pathCommand==="C"){let[nx1,ny1]=normalValues;if(params.x1=nx1,params.y1=ny1,"CS".includes(prevCommand)&&(roundTo(nx1,round)===roundTo(x12*2-x22,round)&&roundTo(ny1,round)===roundTo(y12*2-y2,round)||roundTo(x12,round)===roundTo(x22*2-x6,round)&&roundTo(y12,round)===roundTo(y2*2-y6,round)))return["S",normalValues[2],normalValues[3],normalValues[4],normalValues[5]]}else if(pathCommand==="Q"){let[qx3,qy3]=normalValues;if(params.qx=qx3,params.qy=qy3,"QT".includes(prevCommand)&&roundTo(qx3,round)===roundTo(x12*2-x22,round)&&roundTo(qy3,round)===roundTo(y12*2-y2,round))return["T",normalValues[2],normalValues[3]]}return result},roundSegment=(segment2,roundOption)=>{let values=segment2.slice(1).map(n3=>roundTo(n3,roundOption));return[segment2[0]].concat(values)},optimizePath=(pathInput,roundOption)=>{let path=pathToAbsolute(pathInput),round=typeof roundOption=="number"&&roundOption>=0?roundOption:2,optimParams={...paramsParser},allPathCommands=[],pathCommand="M",prevCommand="Z";return iterate(path,(seg,i6,lastX,lastY)=>{optimParams.x=lastX,optimParams.y=lastY;let normalizedSegment=normalizeSegment(seg,optimParams),result=seg;if(pathCommand=seg[0],allPathCommands[i6]=pathCommand,i6){prevCommand=allPathCommands[i6-1];let shortSegment=shortenSegment(seg,normalizedSegment,optimParams,prevCommand),absSegment=roundSegment(shortSegment,round),absString=absSegment.join(""),relativeSegment=relativizeSegment(shortSegment,i6,lastX,lastY),relSegment=roundSegment(relativeSegment,round),relString=relSegment.join("");result=absString.length<relString.length?absSegment:relSegment}let seglen=normalizedSegment.length;return optimParams.x1=+normalizedSegment[seglen-2],optimParams.y1=+normalizedSegment[seglen-1],optimParams.x2=+normalizedSegment[seglen-4]||optimParams.x1,optimParams.y2=+normalizedSegment[seglen-3]||optimParams.y1,result})},reversePath=pathInput=>{let absolutePath=pathToAbsolute(pathInput),normalizedPath=normalizePath(absolutePath),pLen=absolutePath.length,isClosed=absolutePath[pLen-1][0]==="Z",reversedPath=iterate(absolutePath,(segment2,i6)=>{let normalizedSegment=normalizedPath[i6],prevSeg=i6&&absolutePath[i6-1],prevCommand=prevSeg&&prevSeg[0],nextSeg=absolutePath[i6+1],nextCommand=nextSeg&&nextSeg[0],pathCommand=segment2[0],[x6,y2]=normalizedPath[i6?i6-1:pLen-1].slice(-2),result=segment2;switch(pathCommand){case"M":result=isClosed?["Z"]:[pathCommand,x6,y2];break;case"A":result=[pathCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5]===1?0:1,x6,y2];break;case"C":nextSeg&&nextCommand==="S"?result=["S",segment2[1],segment2[2],x6,y2]:result=[pathCommand,segment2[3],segment2[4],segment2[1],segment2[2],x6,y2];break;case"S":prevCommand&&"CS".includes(prevCommand)&&(!nextSeg||nextCommand!=="S")?result=["C",normalizedSegment[3],normalizedSegment[4],normalizedSegment[1],normalizedSegment[2],x6,y2]:result=[pathCommand,normalizedSegment[1],normalizedSegment[2],x6,y2];break;case"Q":nextSeg&&nextCommand==="T"?result=["T",x6,y2]:result=[pathCommand,segment2[1],segment2[2],x6,y2];break;case"T":prevCommand&&"QT".includes(prevCommand)&&(!nextSeg||nextCommand!=="T")?result=["Q",normalizedSegment[1],normalizedSegment[2],x6,y2]:result=[pathCommand,x6,y2];break;case"Z":result=["M",x6,y2];break;case"H":result=[pathCommand,x6];break;case"V":result=[pathCommand,y2];break;default:result=[pathCommand].concat(segment2.slice(1,-2),x6,y2)}return result});return isClosed?reversedPath.reverse():[reversedPath[0]].concat(reversedPath.slice(1).reverse())},splitPath=pathInput=>{let composite=[],parsedPath=parsePathString(pathInput),path=[],pi3=-1,x6=0,y2=0,mx3=0,my3=0;return iterate(parsedPath,(seg,_3,prevX,prevY)=>{let cmd=seg[0],absCommand=cmd.toUpperCase(),isRelative=cmd===cmd.toLowerCase(),values=seg.slice(1);absCommand==="M"?(pi3+=1,[x6,y2]=values,x6+=isRelative?prevX:0,y2+=isRelative?prevY:0,mx3=x6,my3=y2,path=[isRelative?[absCommand,mx3,my3]:seg]):(absCommand==="Z"?(x6=mx3,y2=my3):absCommand==="H"?([,x6]=seg,x6+=isRelative?prevX:0):absCommand==="V"?([,y2]=seg,y2+=isRelative?prevY:0):([x6,y2]=seg.slice(-2),x6+=isRelative?prevX:0,y2+=isRelative?prevY:0),path.push(seg)),composite[pi3]=path}),composite},getSVGMatrix=transform7=>{let matrix2=new CSSMatrix,{origin}=transform7,[originX,originY]=origin,{translate:translate7}=transform7,{rotate:rotate5}=transform7,{skew}=transform7,{scale:scale6}=transform7;return Array.isArray(translate7)&&translate7.length>=2&&translate7.every(x6=>!Number.isNaN(+x6))&&translate7.some(x6=>x6!==0)?matrix2=matrix2.translate(...translate7):typeof translate7=="number"&&!Number.isNaN(translate7)&&(matrix2=matrix2.translate(translate7)),(rotate5||skew||scale6)&&(matrix2=matrix2.translate(originX,originY),Array.isArray(rotate5)&&rotate5.length>=2&&rotate5.every(x6=>!Number.isNaN(+x6))&&rotate5.some(x6=>x6!==0)?matrix2=matrix2.rotate(...rotate5):typeof rotate5=="number"&&!Number.isNaN(rotate5)&&(matrix2=matrix2.rotate(rotate5)),Array.isArray(skew)&&skew.length===2&&skew.every(x6=>!Number.isNaN(+x6))&&skew.some(x6=>x6!==0)?(matrix2=skew[0]?matrix2.skewX(skew[0]):matrix2,matrix2=skew[1]?matrix2.skewY(skew[1]):matrix2):typeof skew=="number"&&!Number.isNaN(skew)&&(matrix2=matrix2.skewX(skew)),Array.isArray(scale6)&&scale6.length>=2&&scale6.every(x6=>!Number.isNaN(+x6))&&scale6.some(x6=>x6!==1)?matrix2=matrix2.scale(...scale6):typeof scale6=="number"&&!Number.isNaN(scale6)&&(matrix2=matrix2.scale(scale6)),matrix2=matrix2.translate(-originX,-originY)),matrix2},translatePoint=(cssm,v6)=>{if(cssm.is2D)return[cssm.a*v6[0]+cssm.c*v6[1]+cssm.e*v6[3],cssm.b*v6[0]+cssm.d*v6[1]+cssm.f*v6[3],0,1];let m6=CSSMatrix.Translate(v6[0],v6[1],v6[2]);return[,,,m6.m44]=v6,m6=cssm.multiply(m6),[m6.m41,m6.m42,m6.m43,m6.m44]},projection2d=(m6,point2D,origin)=>{let[originX,originY,originZ]=origin,[x6,y2,z6]=translatePoint(m6,[point2D[0],point2D[1],0,1]),relativePositionX=x6-originX,relativePositionY=y2-originY,relativePositionZ=z6-originZ;return[relativePositionX*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originX,relativePositionY*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originY]},transform2D=(path,a6,b6,c3,d3,e6,f2,originX,originY)=>{let result=[],x6=0,y2=0,lx3=0,ly3=0,ox3=0,oy3=0,omx=0,omy=0;for(let i6=0,len=path.length;i6<len;i6+=1){let seg=path[i6],pathCommand=seg[0],commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,outCommand=i6===0&&isRelative?pathCommand:absCommand;if(absCommand==="Z"){result.push(["Z"]),ox3=omx,oy3=omy;continue}if(absCommand==="V"){let absY=seg[1]+(isRelative?oy3:0);lx3=a6*ox3+c3*absY+e6-originX+originX,ly3=b6*ox3+d3*absY+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",ox3,absY]),oy3=absY,x6=lx3,y2=ly3;continue}if(absCommand==="H"){let absX=seg[1]+(isRelative?ox3:0);lx3=a6*absX+c3*oy3+e6-originX+originX,ly3=b6*absX+d3*oy3+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",absX,oy3]),ox3=absX,x6=lx3,y2=ly3;continue}if(absCommand==="A"){let absX=seg[6]+(isRelative?ox3:0),absY=seg[7]+(isRelative?oy3:0),cubics=arcToCubic(ox3,oy3,seg[1],seg[2],seg[3],seg[4],seg[5],absX,absY),cubicsLen=cubics.length,k7=0;if(cubicsLen>0)do{let piece=["C"],end=k7+6;for(let j6=k7;j6<end;j6+=2)lx3=a6*cubics[j6]+c3*cubics[j6+1]+e6-originX+originX,ly3=b6*cubics[j6]+d3*cubics[j6+1]+f2-originY+originY,piece.push(lx3,ly3);result.push(piece),k7=end}while(k7<cubicsLen);else result.push(["C"]);cubicsLen>0?(ox3=cubics[cubicsLen-2],oy3=cubics[cubicsLen-1]):(ox3=absX,oy3=absY),x6=lx3,y2=ly3;continue}if(absCommand==="L"){let absX=seg[1]+(isRelative?ox3:0),absY=seg[2]+(isRelative?oy3:0);lx3=a6*absX+c3*absY+e6-originX+originX,ly3=b6*absX+d3*absY+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",absX,absY]),ox3=absX,oy3=absY,x6=lx3,y2=ly3;continue}{let piece=[outCommand],segLen=seg.length;for(let j6=1;j6<segLen;j6+=2){let absX=seg[j6]+(isRelative?ox3:0),absY=seg[j6+1]+(isRelative?oy3:0);lx3=a6*absX+c3*absY+e6-originX+originX,ly3=b6*absX+d3*absY+f2-originY+originY,piece.push(lx3,ly3)}result.push(piece),ox3=seg[segLen-2]+(isRelative?ox3:0),oy3=seg[segLen-1]+(isRelative?oy3:0),absCommand==="M"&&(omx=ox3,omy=oy3),x6=lx3,y2=ly3}}return result},transformPath=(pathInput,transform7)=>{let path=parsePathString(pathInput),transformProps=transform7&&Object.keys(transform7);if(!transform7||transformProps&&!transformProps.length)return path.slice(0);transform7.origin||Object.assign(transform7,{origin:defaultOptions2.origin});let origin=transform7.origin,matrixInstance=getSVGMatrix(transform7);if(matrixInstance.isIdentity)return path.slice(0);if(matrixInstance.is2D)return transform2D(path,matrixInstance.a,matrixInstance.b,matrixInstance.c,matrixInstance.d,matrixInstance.e,matrixInstance.f,origin[0],origin[1]);let x6=0,y2=0,lx3=0,ly3=0,j6=0,jj2=0;return iterate(path,(seg,index,lastX,lastY)=>{let[pathCommand]=seg,absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),result=absCommand==="A"?["C"].concat(arcToCubic(lastX,lastY,absoluteSegment[1],absoluteSegment[2],absoluteSegment[3],absoluteSegment[4],absoluteSegment[5],absoluteSegment[6],absoluteSegment[7])):absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if(result[0]==="C"&&result.length>7){let tempSegment=result.slice(0,7);path.splice(index+1,0,["C"].concat(result.slice(7))),result=tempSegment}if(result[0]==="L")[lx3,ly3]=projection2d(matrixInstance,[result[1],result[2]],origin),x6!==lx3&&y2!==ly3?result=["L",lx3,ly3]:y2===ly3?result=["H",lx3]:x6===lx3&&(result=["V",ly3]);else for(j6=1,jj2=result.length;j6<jj2;j6+=2)[lx3,ly3]=projection2d(matrixInstance,[+result[j6],+result[j6+1]],origin),result[j6]=lx3,result[j6+1]=ly3;return x6=lx3,y2=ly3,result})},reverseCurve=path=>{let rotatedCurve=path.slice(1).map((x6,i6,curveOnly)=>i6?curveOnly[i6-1].slice(-2).concat(x6.slice(1)):path[0].slice(1).concat(x6.slice(1))).map(x6=>x6.map((_3,i6)=>x6[x6.length-i6-2*(1-i6%2)])).reverse();return[["M"].concat(rotatedCurve[0].slice(0,2))].concat(rotatedCurve.map(x6=>["C"].concat(x6.slice(2))))},roundPath=(path,roundOption)=>{let{round}=defaultOptions2;return round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off",round==="off"?path.slice(0):iterate(path,segment2=>roundSegment(segment2,round))},fixPath=pathInput=>{let pathArray=parsePathString(pathInput);if(isClosedPath(pathArray)){let normalArray=normalizePath(pathArray),length4=pathArray.length,segBeforeZ=length4-2,[mx3,my3]=normalArray[0].slice(1),[x6,y2]=normalArray[segBeforeZ].slice(-2);mx3===x6&&my3===y2&&pathArray.splice(length4-1,1)}};function splitCubicSegment(x12,y12,x22,y2,x32,y32,x42,y42,t53){let[px01,py01]=midPoint([x12,y12],[x22,y2],t53),[px12,py12]=midPoint([x22,y2],[x32,y32],t53),[px23,py23]=midPoint([x32,y32],[x42,y42],t53),[cx0,cy0]=midPoint([px01,py01],[px12,py12],t53),[cx1,cy1]=midPoint([px12,py12],[px23,py23],t53),[px3,py3]=midPoint([cx0,cy0],[cx1,cy1],t53);return[[x12,y12,px01,py01,cx0,cy0,px3,py3],[px3,py3,cx1,cy1,px23,py23,x42,y42]]}var pathToPolyline=path=>{let normal=normalizePath(path);if(!isPolygonArray(normal)&&!isPolylineArray(normal))throw TypeError(`${error}: pathValue is not a polyline/polygon`);if(!isClosedPath(normal))return normal;let result=[normal[0]],[mx3,my3]=normal[0].slice(1);for(let i6=1;i6<normal.length;i6++){let seg=normal[i6];seg[0].toUpperCase()==="Z"?result.push(["L",mx3,my3]):result.push(seg)}return result};function splitLineToCount(x12,y12,x22,y2,count){if(count<=1)return[[x12,y12,x22,y2]];let result=[],dx3=x22-x12,dy3=y2-y12,currentX=x12,currentY=y12,i6=0;for(;i6<count;){let t53=1/(count-i6),nextX=x12+t53*dx3,nextY=y12+t53*dy3;result.push([currentX,currentY,nextX,nextY]),currentX=nextX,currentY=nextY,i6++}return result}function getPathSplits(path,target){if(target<=1)throw new TypeError(`${error}: target must be >= 2`);let totalLength=getTotalLength(path);if(totalLength===0)return Array(path.length).fill(1);let idealSegLen=totalLength/target,isPoly=isPolylineArray(path),splits=[1],lengths=[0];iterate(path,(seg,i6,prevX,prevY)=>{if(i6>0){let[endX,endY]=seg.slice(-2),segLen=isPoly?getLineLength(prevX,prevY,endX,endY):getCubicLength(prevX,prevY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]);lengths.push(segLen),splits.push(1)}});let totalAllocated=1;for(let i6=1;i6<lengths.length;i6++){let segLen=lengths[i6],desired=segLen>idealSegLen?Math.round(segLen/idealSegLen):1;splits[i6]=desired,totalAllocated+=desired}let diff=target-totalAllocated;if(diff!==0){let candidates=[];for(let i6=1;i6<lengths.length;i6++)lengths[i6]>0&&candidates.push([i6,lengths[i6]]);let cLen=candidates.length;if(diff<0){candidates.sort((a6,b6)=>a6[1]-b6[1]);for(let i6=0;i6<cLen;i6++){let idx=candidates[i6][0];if(splits[idx]>1&&candidates[i6][1]>0&&(splits[idx]--,diff++),diff===0)break;i6===cLen-1&&(i6=0)}}else if(diff>0){candidates.sort((a6,b6)=>b6[1]-a6[1]);for(let i6=0;i6<cLen;i6++){let idx=candidates[i6][0];if(candidates[i6][1]>0&&(splits[idx]++,diff--),diff===0)break;i6===cLen-1&&(i6=0)}}}return splits}function splitLinePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i6=1;i6<pathLen;i6++){let[endX,endY]=path[i6].slice(1),count=splits[i6];if(count>=1){let subLines=splitLineToCount(currentX,currentY,endX,endY,count);for(let sub of subLines)newPath.push(["L",sub[2],sub[3]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`),newPath}function splitCubicToCount(x12,y12,x22,y2,x32,y32,x42,y42,count){if(count<=1)return[[x12,y12,x22,y2,x32,y32,x42,y42]];let result=[],cx1=x12,cy1=y12,cx22=x22,cy22=y2,cx3=x32,cy3=y32,cx4=x42,cy4=y42,i6=0;for(;i6<count;){let t53=1/(count-i6),[first,second]=splitCubicSegment(cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4,t53);result.push(first),[cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4]=second,i6++}return result}function splitCurvePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i6=1;i6<pathLen;i6++){let seg=path[i6],[endX,endY]=seg.slice(-2),count=splits[i6];if(count>=1){let subs=splitCubicToCount(currentX,currentY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],count);for(let sub of subs)newPath.push(["C",sub[2],sub[3],sub[4],sub[5],sub[6],sub[7]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}.`),newPath}function getRotations(a6){let pathLen=a6.length,pointCount=pathLen-1,path,result=[];for(let idx=0;idx<pathLen;idx++){path=[];for(let i6=0;i6<pathLen;i6++){let oldSegIdx=idx+i6,seg;if(i6===0||a6[oldSegIdx]&&a6[oldSegIdx][0]==="M"){seg=a6[oldSegIdx],path.push(["M",...seg.slice(-2)]);continue}oldSegIdx>=pathLen&&(oldSegIdx-=pointCount),path.push(a6[oldSegIdx])}result.push(path)}return result}function getRotatedPath(pathA,pathB,computedRotations){let rotations=computedRotations||getRotations(pathA);if(pathA.length!==pathB.length)throw new TypeError("SVGPathCommanderError: paths must have the same number of segments after equalization");let bestIndex=0,minDistanceSq=1/0;for(let ri3=0;ri3<rotations.length;ri3++){let rotation5=rotations[ri3],rLen=rotation5.length,sumDistSq=0;for(let i6=0;i6<rLen;i6++){let segA=rotation5[i6],segB=pathB[i6],endA=segA.slice(-2),endB=segB.slice(-2),dx3=endA[0]-endB[0],dy3=endA[1]-endB[1];sumDistSq+=dx3*dx3+dy3*dy3}sumDistSq<minDistanceSq&&(minDistanceSq=sumDistSq,bestIndex=ri3)}return rotations[bestIndex]}var equalizeSegmentsDefaults={mode:"auto",sampleSize:10,roundValues:4,reverse:!0,close:!1,target:void 0},equalizeSegments=(path1,path2,initialCfg={})=>{let{close,mode,reverse,roundValues,target:initialTarget}=Object.assign(equalizeSegmentsDefaults,initialCfg),p12=normalizePath(path1),p22=normalizePath(path2);fixPath(p12),fixPath(p22);let bothPoly=(isPolygonArray(p12)||isPolylineArray(p12))&&(isPolygonArray(p22)||isPolylineArray(p22));bothPoly&&mode==="auto"?(p12=pathToPolyline(p12),p22=pathToPolyline(p22)):(bothPoly=!1,p12=pathToCurve(p12),p22=pathToCurve(p22));let area1=polygonArea(samplePolygon(p12)),area2=polygonArea(samplePolygon(p22));reverse!==!1&&Math.sign(area1)!==Math.sign(area2)&&(p22=reversePath(p22));let segCount1=p12.length,segCount2=p22.length,minTarget=Math.max(segCount1,segCount2),target=minTarget;if(typeof initialTarget!="number"){let avgLen=(getTotalLength(p12)+getTotalLength(p22))/2,avgSegLen=avgLen/Math.max(segCount1,segCount2),idealSegCount=Math.max(minTarget,Math.round(avgLen/Math.max(avgSegLen,1)));target=Math.min(idealSegCount,Math.max(segCount1,segCount2)*3)}else initialTarget>=minTarget?target=initialTarget:console.warn('equalizeSegments "target" option: '+initialTarget+", expected >= "+minTarget);let equalP1=p12,equalP2=p22;return bothPoly?(equalP1=splitLinePathToCount(p12,target),equalP2=splitLinePathToCount(p22,target)):(equalP1=splitCurvePathToCount(p12,target),equalP2=splitCurvePathToCount(p22,target)),equalP2=getRotatedPath(equalP2,equalP1),typeof roundValues=="number"&&roundValues!==4&&(equalP1=roundPath(equalP1,roundValues),equalP2=roundPath(equalP2,roundValues)),close&&(equalP1.push(["Z"]),equalP2.push(["Z"])),[equalP1,equalP2]},isPointInsideBBox=(bbox,[x6,y2])=>{let[minX,minY,maxX,maxY]=bbox;return x6>=minX&&x6<=maxX&&y2>=minY&&y2<=maxY},boundingBoxIntersect=(a6,b6)=>{let[ax1,ay1,ax22,ay22]=a6,[bx1,by1,bx22,by22]=b6;return isPointInsideBBox(b6,[ax1,ay1])||isPointInsideBBox(b6,[ax22,ay1])||isPointInsideBBox(b6,[ax1,ay22])||isPointInsideBBox(b6,[ax22,ay22])||isPointInsideBBox(a6,[bx1,by1])||isPointInsideBBox(a6,[bx22,by1])||isPointInsideBBox(a6,[bx1,by22])||isPointInsideBBox(a6,[bx22,by22])||(ax1<bx22&&ax1>bx1||bx1<ax22&&bx1>ax1)&&(ay1<by22&&ay1>by1||by1<ay22&&by1>ay1)},createPlaceholder=([atx,aty])=>[["M",atx,aty],["L",atx+.001,aty],["L",atx+.001,aty+.001],["L",atx,aty+.001],["L",atx,aty],["Z"]];function getBestMatch(target,candidates){let targetBBox=target.bbox,potentialCandidates=[];for(let i6=0;i6<candidates.length;i6++){let{bbox,size:size3}=candidates[i6],dx3=targetBBox.cx-bbox.cx,dy3=targetBBox.cy-bbox.cy,centeredDistance=Math.sqrt(dx3*dx3+dy3*dy3),sizeDifference=Math.abs(target.size-size3)/Math.max(target.size,size3,1e-6),hasOverlap=isPointInsideBBox([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.cx,bbox.cy])||isPointInsideBBox([bbox.x,bbox.y,bbox.x2,bbox.y2],[targetBBox.cx,targetBBox.cy]),boxIntersect=boundingBoxIntersect([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.x,bbox.y,bbox.x2,bbox.y2]);potentialCandidates.push({index:i6,hasOverlap,boxIntersect,sizeDifference,centeredDistance})}let overlaping=potentialCandidates.filter(c3=>c3.hasOverlap&&c3.boxIntersect);if(overlaping.length>0){let best=overlaping[0];for(let i6=1;i6<overlaping.length;i6++)overlaping[i6].centeredDistance<best.centeredDistance&&(best=overlaping[i6]);return candidates.splice(best.index,1)[0]}return null}function matchPaths(fromPaths,toPaths){let pairs5=[];for(fromPaths.sort((a6,b6)=>b6.size-a6.size),toPaths.sort((a6,b6)=>b6.size-a6.size);fromPaths.length>0;){let from=fromPaths.shift(),bestTo=getBestMatch(from,toPaths);if(bestTo)pairs5.push([from.path,bestTo.path]);else{let fromCentroid=[from.bbox.cx,from.bbox.cy];pairs5.push([from.path,createPlaceholder(fromCentroid)])}}for(;toPaths.length>0;){let to3=toPaths.shift(),toCentroid=[to3.bbox.cx,to3.bbox.cy];pairs5.push([createPlaceholder(toCentroid),to3.path])}return pairs5}var classifyPaths=paths=>{let outers=[],inners=[];for(let path of paths){let signedArea3=polygonArea(samplePolygon(path)),bbox=getPathBBox(path),feature={isPoly:isPolygonArray(path)||isPolylineArray(path),size:bbox.width*bbox.height,path,signedArea:signedArea3,area:Math.abs(signedArea3),bbox};signedArea3>0?outers.push(feature):inners.push(feature)}return{outers,inners}},equalizePathsDefaults={mode:"auto",roundValues:4,close:!1,sampleSize:10},equalizePaths=(pathInput1,pathInput2,initialCfg={})=>{let cfg=Object.assign(equalizePathsDefaults,initialCfg),p12=normalizePath(pathInput1),p22=normalizePath(pathInput2),multi1=isMultiPath(p12),multi2=isMultiPath(p22);if(!multi1&&!multi2)return equalizeSegments(p12,p22,cfg);let globalArea1=polygonArea(samplePolygon(p12)),globalArea2=polygonArea(samplePolygon(p22)),path1=p12,path2=p22;Math.sign(globalArea1)<0&&(path1=reversePath(path1)),Math.sign(globalArea2)<0&&(path2=reversePath(path2));let multiPath1=splitPath(path1),multiPath2=splitPath(path2),{outers:outers1,inners:inners1}=classifyPaths(multiPath1),{outers:outers2,inners:inners2}=classifyPaths(multiPath2),outerPairs=matchPaths(outers1,outers2),innerPairs=matchPaths(inners1,inners2),equalizedPairs=[];for(let[from,to3]of[...outerPairs,...innerPairs]){let[eqFrom,eqTo]=equalizeSegments(from,to3,{...cfg,reverse:!1});equalizedPairs.push([eqFrom,eqTo])}return[equalizedPairs.map(p3=>p3[0]).flat(),equalizedPairs.map(p3=>p3[1]).flat()]},intersect2=(x12,y12,x22,y2,x32,y32,x42,y42)=>{if(Math.max(x12,x22)<Math.min(x32,x42)||Math.min(x12,x22)>Math.max(x32,x42)||Math.max(y12,y2)<Math.min(y32,y42)||Math.min(y12,y2)>Math.max(y32,y42))return;let nx3=(x12*y2-y12*x22)*(x32-x42)-(x12-x22)*(x32*y42-y32*x42),ny3=(x12*y2-y12*x22)*(y32-y42)-(y12-y2)*(x32*y42-y32*x42),denominator=(x12-x22)*(y32-y42)-(y12-y2)*(x32-x42);if(!denominator)return;let px3=nx3/denominator,py3=ny3/denominator,px22=roundTo(px3,2),py22=roundTo(py3,2);if(!(px22<roundTo(Math.min(x12,x22),2)||px22>roundTo(Math.max(x12,x22),2)||px22<roundTo(Math.min(x32,x42),2)||px22>roundTo(Math.max(x32,x42),2)||py22<roundTo(Math.min(y12,y2),2)||py22>roundTo(Math.max(y12,y2),2)||py22<roundTo(Math.min(y32,y42),2)||py22>roundTo(Math.max(y32,y42),2)))return{x:px3,y:py3}},interHelper=(bez1,bez2,config)=>{let bbox1=getCubicBBox(...bez1),bbox2=getCubicBBox(...bez2),{justCount,epsilon}=Object.assign({justCount:!0,epsilon:DISTANCE_EPSILON},config);if(!boundingBoxIntersect(bbox1,bbox2))return justCount?0:[];let l12=getCubicLength(...bez1),l22=getCubicLength(...bez2),n12=Math.max(l12/5>>0,1),n22=Math.max(l22/5>>0,1),points1=[],points2=[],xy3={},res2=justCount?0:[];for(let i6=0;i6<n12+1;i6++){let p3=getPointAtCubicLength(...bez1,i6/n12*l12);points1.push({x:p3.x,y:p3.y,t:i6/n12})}for(let i6=0;i6<n22+1;i6++){let p3=getPointAtCubicLength(...bez2,i6/n22*l22);points2.push({x:p3.x,y:p3.y,t:i6/n22})}for(let i6=0;i6<n12;i6++)for(let j6=0;j6<n22;j6++){let maxLimit=1+epsilon,di3=points1[i6],di1=points1[i6+1],dj2=points2[j6],dj1=points2[j6+1],ci3=Math.abs(di1.x-di3.x)<.001?"y":"x",cj2=Math.abs(dj1.x-dj2.x)<.001?"y":"x",is4=intersect2(di3.x,di3.y,di1.x,di1.y,dj2.x,dj2.y,dj1.x,dj1.y);if(is4){if(xy3[is4.x.toFixed(4)]==is4.y.toFixed(4))continue;xy3[is4.x.toFixed(4)]=is4.y.toFixed(4);let t110=di3.t+Math.abs((is4[ci3]-di3[ci3])/(di1[ci3]-di3[ci3]))*(di1.t-di3.t),t210=dj2.t+Math.abs((is4[cj2]-dj2[cj2])/(dj1[cj2]-dj2[cj2]))*(dj1.t-dj2.t);t110>=0&&t110<=maxLimit&&t210>=0&&t210<=maxLimit&&(justCount?res2++:res2.push({x:is4.x,y:is4.y,t1:Math.min(t110,1),t2:Math.min(t210,1)}))}}return res2},pathsIntersection=(pathInput1,pathInput2,justCount=!0)=>{let path1=pathToCurve(pathInput1),path2=pathToCurve(pathInput2),x12=0,y12=0,x22=0,y2=0,x1m=0,y1m=0,x2m=0,y2m=0,bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],bez2=[x22,y2,x22,y2,x2m,y2m,x2m,y2m],countResult=0,pointsResult=[],pathLen1=path1.length,pathLen2=path2.length;for(let i6=0;i6<pathLen1;i6++){let seg1=path1[i6];if(seg1[0]=="M")x12=seg1[1],y12=seg1[2],x1m=x12,y1m=y12;else{seg1[0]=="C"?(bez1=[x12,y12,seg1[1],seg1[2],seg1[3],seg1[4],seg1[5],seg1[6]],x12=bez1[6],y12=bez1[7]):(bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],x12=x1m,y12=y1m);for(let j6=0;j6<pathLen2;j6++){let seg2=path2[j6];seg2[0]=="M"?(x22=seg2[1],y2=seg2[2],x2m=x22,y2m=y2):seg2[0]=="C"&&(bez2=[x22,y2,seg2[1],seg2[2],seg2[3],seg2[4],seg2[5],seg2[6]],x22=bez2[6],y2=bez2[7]);let intr=interHelper(bez1,bez2,{justCount});justCount?countResult+=intr:pointsResult.push(...intr)}}}return justCount?countResult:pointsResult},_a4,SVGPathCommander=(_a4=class{constructor(pathValue,config){let instanceOptions=config||{},undefPath=typeof pathValue>"u";if(undefPath||!pathValue.length)throw TypeError(`${error}: "pathValue" is ${undefPath?"undefined":"empty"}`);this.segments=parsePathString(pathValue);let{round:roundOption,origin:originOption}=instanceOptions,round;Number.isInteger(roundOption)||roundOption==="off"?round=roundOption:round=defaultOptions2.round;let origin=defaultOptions2.origin;if(Array.isArray(originOption)&&originOption.length>=2){let[originX,originY,originZ]=originOption.map(Number);origin=[Number.isNaN(originX)?0:originX,Number.isNaN(originY)?0:originY,Number.isNaN(originZ)?0:originZ]}return this.round=round,this.origin=origin,this}get bbox(){return getPathBBox(this.segments)}get length(){return getTotalLength(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(length4){return getPointAtLength(this.segments,length4)}toAbsolute(){let{segments}=this;return this.segments=pathToAbsolute(segments),this}toRelative(){let{segments}=this;return this.segments=pathToRelative(segments),this}toCurve(){let{segments}=this;return this.segments=pathToCurve(segments),this}reverse(onlySubpath){let{segments}=this,split=splitPath(segments),subPath=split.length>1?split:!1,absoluteMultiPath=subPath?subPath.map((x6,i6)=>onlySubpath?i6?reversePath(x6):x6.slice(0):reversePath(x6)):segments.slice(0),path=[];return subPath?path=absoluteMultiPath.flat(1):path=onlySubpath?segments:reversePath(segments),this.segments=path.slice(0),this}normalize(){let{segments}=this;return this.segments=normalizePath(segments),this}optimize(){let{segments}=this,round=this.round==="off"?2:this.round;return this.segments=optimizePath(segments,round),this}transform(source){if(!source||typeof source!="object"||typeof source=="object"&&!["translate","rotate","skew","scale"].some(x6=>x6 in source))return this;let{segments,origin:[cx3,cy3,cz2]}=this,transform7={};for(let[k7,v6]of Object.entries(source))k7==="skew"&&Array.isArray(v6)||(k7==="rotate"||k7==="translate"||k7==="origin"||k7==="scale")&&Array.isArray(v6)?transform7[k7]=v6.map(Number):k7!=="origin"&&typeof Number(v6)=="number"&&(transform7[k7]=Number(v6));let{origin}=transform7;if(Array.isArray(origin)&&origin.length>=2){let[originX,originY,originZ]=origin.map(Number);transform7.origin=[Number.isNaN(originX)?cx3:originX,Number.isNaN(originY)?cy3:originY,originZ||cz2]}else transform7.origin=[cx3,cy3,cz2];return this.segments=transformPath(segments,transform7),this}flipX(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[0,180,0],origin:[cx3,cy3,0]}),this}flipY(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[180,0,0],origin:[cx3,cy3,0]}),this}toString(){return pathToString(this.segments,this.round)}dispose(){Object.keys(this).forEach(key=>delete this[key])}},__publicField(_a4,"options",defaultOptions2),__publicField(_a4,"CSSMatrix",CSSMatrix),__publicField(_a4,"arcTools",arcTools),__publicField(_a4,"bezierTools",bezierTools),__publicField(_a4,"cubicTools",cubicTools),__publicField(_a4,"lineTools",lineTools),__publicField(_a4,"polygonTools",polygonTools),__publicField(_a4,"quadTools",quadTools),__publicField(_a4,"pathToAbsolute",pathToAbsolute),__publicField(_a4,"pathToRelative",pathToRelative),__publicField(_a4,"pathToCurve",pathToCurve),__publicField(_a4,"pathToString",pathToString),__publicField(_a4,"distanceSquareRoot",distanceSquareRoot),__publicField(_a4,"midPoint",midPoint),__publicField(_a4,"rotateVector",rotateVector),__publicField(_a4,"roundTo",roundTo),__publicField(_a4,"parsePathString",parsePathString),__publicField(_a4,"finalizeSegment",finalizeSegment),__publicField(_a4,"invalidPathValue",invalidPathValue),__publicField(_a4,"isArcCommand",isArcCommand),__publicField(_a4,"isDigit",isDigit),__publicField(_a4,"isDigitStart",isDigitStart),__publicField(_a4,"isMoveCommand",isMoveCommand),__publicField(_a4,"isPathCommand",isPathCommand),__publicField(_a4,"isSpace",isSpace),__publicField(_a4,"paramsCount",paramsCounts),__publicField(_a4,"paramsParser",paramsParser),__publicField(_a4,"PathParser",PathParser),__publicField(_a4,"scanFlag",scanFlag),__publicField(_a4,"scanParam",scanParam),__publicField(_a4,"scanSegment",scanSegment),__publicField(_a4,"skipSpaces",skipSpaces),__publicField(_a4,"distanceEpsilon",DISTANCE_EPSILON),__publicField(_a4,"fixPath",fixPath),__publicField(_a4,"getClosestPoint",getClosestPoint),__publicField(_a4,"getDrawDirection",getDrawDirection),__publicField(_a4,"getPathArea",getPathArea),__publicField(_a4,"getPathBBox",getPathBBox),__publicField(_a4,"getPointAtLength",getPointAtLength),__publicField(_a4,"getPropertiesAtLength",getPropertiesAtLength),__publicField(_a4,"getPropertiesAtPoint",getPropertiesAtPoint),__publicField(_a4,"getSegmentAtLength",getSegmentAtLength),__publicField(_a4,"getSegmentOfPoint",getSegmentOfPoint),__publicField(_a4,"getTotalLength",getTotalLength),__publicField(_a4,"isAbsoluteArray",isAbsoluteArray),__publicField(_a4,"isCurveArray",isCurveArray),__publicField(_a4,"isPolygonArray",isPolygonArray),__publicField(_a4,"isNormalizedArray",isNormalizedArray),__publicField(_a4,"isPathArray",isPathArray),__publicField(_a4,"isPointInStroke",isPointInStroke),__publicField(_a4,"isRelativeArray",isRelativeArray),__publicField(_a4,"isValidPath",isValidPath),__publicField(_a4,"samplePolygon",samplePolygon),__publicField(_a4,"shapeParams",shapeParams),__publicField(_a4,"shapeToPath",shapeToPath),__publicField(_a4,"shapeToPathArray",shapeToPathArray),__publicField(_a4,"absolutizeSegment",absolutizeSegment),__publicField(_a4,"arcToCubic",arcToCubic),__publicField(_a4,"getSVGMatrix",getSVGMatrix),__publicField(_a4,"iterate",iterate),__publicField(_a4,"lineToCubic",lineToCubic),__publicField(_a4,"normalizePath",normalizePath),__publicField(_a4,"normalizeSegment",normalizeSegment),__publicField(_a4,"optimizePath",optimizePath),__publicField(_a4,"projection2d",projection2d),__publicField(_a4,"quadToCubic",quadToCubic),__publicField(_a4,"relativizeSegment",relativizeSegment),__publicField(_a4,"reverseCurve",reverseCurve),__publicField(_a4,"reversePath",reversePath),__publicField(_a4,"roundPath",roundPath),__publicField(_a4,"roundSegment",roundSegment),__publicField(_a4,"segmentToCubic",segmentToCubic),__publicField(_a4,"shortenSegment",shortenSegment),__publicField(_a4,"splitPath",splitPath),__publicField(_a4,"equalizePaths",equalizePaths),__publicField(_a4,"equalizeSegments",equalizeSegments),__publicField(_a4,"splitCubicSegment",splitCubicSegment),__publicField(_a4,"transformPath",transformPath),__publicField(_a4,"isPointInsideBBox",isPointInsideBBox),__publicField(_a4,"pathsIntersection",pathsIntersection),__publicField(_a4,"boundingBoxIntersect",boundingBoxIntersect),__publicField(_a4,"isMultiPath",isMultiPath),__publicField(_a4,"isClosedPath",isClosedPath),__publicField(_a4,"isPolylineArray",isPolylineArray),__publicField(_a4,"version",version),_a4),src_default=SVGPathCommander;init_dist2();init_dist2();var import_react3=__toESM(require_react(),1);init_dist5();init_zod();init_zod();init_dist2();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 i6=this.index[key.id()];return i6===void 0?void 0:this.array[i6]}setDefault(key,factory){let i6=this.index[key.id()];if(i6===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[i6]}insert(key,value){let pair=new Pair(key,value),i6=this.index[key.id()];return i6===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i6]=pair,pair}erase(key){let i6=this.index[key.id()];if(i6===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i6],last=this.array.pop();return pair!==last&&(this.array[i6]=last,this.index[last.first.id()]=i6),pair}copy(){let copy=new _IndexedMap;for(let i6=0;i6<this.array.length;i6++){let pair=this.array[i6].copy();copy.array[i6]=pair,copy.index[pair.first.id()]=i6}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 i6=0,n3=this._terms.size();i6<n3;i6++){let pair=this._terms.itemAt(i6);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 i6=0,n3=args.length;i6<n3;++i6){let item=args[i6];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 j6=0,k7=terms2.size();j6<k7;j6++){let termPair=terms2.itemAt(j6);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 j6=0,k7=terms2.size();j6<k7;j6++){let termPair=terms2.itemAt(j6);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(a6,b6,c3,w3=1){let result=0;return result+=Math.max(0,Math.min(1e3,a6*w3))*1e6,result+=Math.max(0,Math.min(1e3,b6*w3))*1e3,result+=Math.max(0,Math.min(1e3,c3*w3)),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 i6=0,n3=rows.size();i6<n3;++i6){let rowPair2=rows.itemAt(i6),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 i6=0,n3=vars.size();i6<n3;++i6){let pair=vars.itemAt(i6),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 i6=0,n3=terms.size();i6<n3;++i6){let termPair=terms.itemAt(i6);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 error2=this._makeSymbol(SymbolType.Error);tag.other=error2,row.insertSymbol(error2,-coeff),objective.insertSymbol(error2,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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);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 i6=0,n3=rows.size();i6<n3;++i6)rows.itemAt(i6).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6);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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),symbol=pair.first,c3=pair.second;if(c3>0&&symbol.type()!==SymbolType.Dummy){let r6=this._objective.coefficientFor(symbol)/c3;r6<ratio&&(ratio=r6,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6),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 i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6),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 r6=-row.constant()/c3;r6<r12&&(r12=r6,first=symbol)}else{let r6=row.constant()/c3;r6<r22&&(r22=r6,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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),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,id3){__publicField(this,"_id");__publicField(this,"_type");this._id=id3,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 i6=0,n3=cells.size();i6<n3;++i6)if(cells.itemAt(i6).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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i6=0,n3=cells.size();i6<n3;++i6)cells.itemAt(i6).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_dist7();init_dist7();init_dist2();init_dist2();var import_debug10=__toESM(require_browser(),1),import_react4=__toESM(require_react(),1);init_dist2();var import_react5=__toESM(require_react(),1);init_dist7();init_dist2();init_dist4();init_dist7();init_dist7();init_dist7();init_dist4();init_dist7();init_dist2();init_dist7();init_dist7();init_src();init_src();init_src();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist4();init_dist4();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist7();init_dist7();init_dist7();init_dist7();var rotatePoint2=(point6,angleDegrees)=>{let angle=angleDegrees*Math.PI/180;return{x:point6.x*Math.cos(angle)-point6.y*Math.sin(angle),y:point6.x*Math.sin(angle)+point6.y*Math.cos(angle)}},getRotatedRectPoints=({x:x6,y:y2,width,height,ccwRotation})=>{let halfWidth=width/2,halfHeight=height/2;return[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight}].map(point6=>{let rotated=rotatePoint2(point6,ccwRotation);return{x:x6+rotated.x,y:y2+rotated.y}})},getPillCenterLineForPad=pad2=>{let ccwRotation=pad2.shape==="rotated_pill"?pad2.ccw_rotation:0,halfLineLength=Math.max(Math.max(pad2.width,pad2.height)/2-pad2.radius,0),axis=pad2.width>=pad2.height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},rotatedAxis=rotatePoint2(axis,ccwRotation);return{start:{x:pad2.x-rotatedAxis.x,y:pad2.y-rotatedAxis.y},end:{x:pad2.x+rotatedAxis.x,y:pad2.y+rotatedAxis.y},radius:pad2.radius}},getPolygonPointsForPad=pad2=>{if(pad2.type==="pcb_smtpad"){if(pad2.shape==="polygon")return pad2.points;if(pad2.shape==="rotated_rect")return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,ccwRotation:pad2.ccw_rotation})}if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.rect_pad_width,height:pad2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in pad2&&typeof pad2.rect_ccw_rotation=="number"?pad2.rect_ccw_rotation:0});throw new Error(`Expected polygonal pad geometry, got ${pad2.type} with shape "${pad2.shape}"`)},getPolygonEdges3=points=>points.map((point6,index)=>[point6,points[(index+1)%points.length]]),getClosestPointsBetweenSegments=(a12,a22,b12,b22)=>{let intersection=getSegmentIntersection(a12,a22,b12,b22);if(intersection)return{distance:0,pointOnA:intersection,pointOnB:intersection,center:intersection};let candidates=[{pointOnA:a12,pointOnB:pointToSegmentClosestPoint(a12,b12,b22)},{pointOnA:a22,pointOnB:pointToSegmentClosestPoint(a22,b12,b22)},{pointOnA:pointToSegmentClosestPoint(b12,a12,a22),pointOnB:b12},{pointOnA:pointToSegmentClosestPoint(b22,a12,a22),pointOnB:b22}],best=candidates[0],bestDistanceSquared=distSq(best.pointOnA,best.pointOnB);for(let candidate of candidates.slice(1)){let candidateDistanceSquared=distSq(candidate.pointOnA,candidate.pointOnB);candidateDistanceSquared<bestDistanceSquared&&(best=candidate,bestDistanceSquared=candidateDistanceSquared)}return{distance:segmentToSegmentMinDistance(a12,a22,b12,b22),pointOnA:best.pointOnA,pointOnB:best.pointOnB,center:{x:(best.pointOnA.x+best.pointOnB.x)/2,y:(best.pointOnA.y+best.pointOnB.y)/2}}},getSegmentToPolygonClearanceFromPoints=(start,end,polygon2)=>{if(polygon2.length<3)return{distance:Number.POSITIVE_INFINITY,center:start,tracePoint:start,obstaclePoint:start};let intersections=getPolygonEdges3(polygon2).map(([edgeStart,edgeEnd])=>getSegmentIntersection(start,end,edgeStart,edgeEnd)).filter(point6=>point6!==null);if(intersections.length>0){let dx3=end.x-start.x,dy3=end.y-start.y,lengthSquared=dx3*dx3+dy3*dy3;return intersections.sort((a6,b6)=>{let ta3=((a6.x-start.x)*dx3+(a6.y-start.y)*dy3)/lengthSquared,tb2=((b6.x-start.x)*dx3+(b6.y-start.y)*dy3)/lengthSquared;return ta3-tb2}),{distance:0,center:intersections[0],tracePoint:intersections[0],obstaclePoint:intersections[0]}}if(isPointInsidePolygon(start,polygon2)||isPointInsidePolygon(end,polygon2)){let center2={x:(start.x+end.x)/2,y:(start.y+end.y)/2};return{distance:0,center:center2,tracePoint:center2,obstaclePoint:center2}}let best=getClosestPointsBetweenSegments(start,end,polygon2[0],polygon2[1]);for(let[edgeStart,edgeEnd]of getPolygonEdges3(polygon2).slice(1)){let candidate=getClosestPointsBetweenSegments(start,end,edgeStart,edgeEnd);candidate.distance<best.distance&&(best=candidate)}return{distance:best.distance,center:best.center,tracePoint:best.pointOnA,obstaclePoint:best.pointOnB}},getSegmentToPillClearance=(segment2,pad2)=>{let pill2=getPillCenterLineForPad(pad2),closest=getClosestPointsBetweenSegments({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},pill2.start,pill2.end);return{distance:closest.distance,center:closest.center,radius:pill2.radius,tracePoint:closest.pointOnA,obstaclePoint:closest.pointOnB}};function getDistanceBetweenPoints(pointA,pointB){return Math.sqrt((pointB.x-pointA.x)**2+(pointB.y-pointA.y)**2)}var POINT_ON_SEGMENT_TOLERANCE_MM=1e-9,POINT_IN_PAD_TOLERANCE_MM=1e-9;function isPointOnSegment3(point6,segment2){let crossProduct=(point6.y-segment2.start.y)*(segment2.end.x-segment2.start.x)-(point6.x-segment2.start.x)*(segment2.end.y-segment2.start.y);if(Math.abs(crossProduct)>POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let dotProduct=(point6.x-segment2.start.x)*(segment2.end.x-segment2.start.x)+(point6.y-segment2.start.y)*(segment2.end.y-segment2.start.y);if(dotProduct<-POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let squaredLength=(segment2.end.x-segment2.start.x)**2+(segment2.end.y-segment2.start.y)**2;return dotProduct<=squaredLength+POINT_ON_SEGMENT_TOLERANCE_MM}function isPointInPolygon2(point6,polygon2){let inside2=!1;for(let i6=0,j6=polygon2.length-1;i6<polygon2.length;j6=i6++){let pi3=polygon2[i6],pj2=polygon2[j6];if(isPointOnSegment3(point6,{start:pi3,end:pj2}))return!0;pi3.y>point6.y!=pj2.y>point6.y&&point6.x<(pj2.x-pi3.x)*(point6.y-pi3.y)/(pj2.y-pi3.y)+pi3.x&&(inside2=!inside2)}return inside2}function isPointInPad(point6,pad2){if(pad2.type==="pcb_smtpad"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.radius+POINT_IN_PAD_TOLERANCE_MM;if(pad2.shape==="rect"){let halfWidth=pad2.width/2,halfHeight=pad2.height/2;return Math.abs(point6.x-pad2.x)<=halfWidth+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=halfHeight+POINT_IN_PAD_TOLERANCE_MM}if(pad2.shape==="rotated_rect")return isPointInPolygon2(point6,getPolygonPointsForPad(pad2));if(pad2.shape==="pill"||pad2.shape==="rotated_pill"){if(pad2.shape==="rotated_pill"){let pill2=getPillCenterLineForPad(pad2);return pointToSegmentDistance(point6,pill2.start,pill2.end)<=pill2.radius+POINT_IN_PAD_TOLERANCE_MM}let halfWidth=pad2.width/2,halfHeight=pad2.height/2,radius=pad2.radius;if(Math.abs(point6.x-pad2.x)<=halfWidth-radius+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=halfHeight+POINT_IN_PAD_TOLERANCE_MM)return!0;let cornerX=Math.max(Math.abs(point6.x-pad2.x)-(halfWidth-radius),0),cornerY=Math.max(Math.abs(point6.y-pad2.y)-(halfHeight-radius),0),radiusWithTolerance=radius+POINT_IN_PAD_TOLERANCE_MM;return cornerX*cornerX+cornerY*cornerY<=radiusWithTolerance*radiusWithTolerance}if(pad2.shape==="polygon")return isPointInPolygon2(point6,pad2.points)}if(pad2.type==="pcb_plated_hole"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.outer_diameter/2+POINT_IN_PAD_TOLERANCE_MM;if("rect_pad_width"in pad2&&"rect_pad_height"in pad2)return isPointInPolygon2(point6,getPolygonPointsForPad(pad2));if(pad2.shape==="oval"||pad2.shape==="pill")return Math.abs(point6.x-pad2.x)<=pad2.outer_width/2+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=pad2.outer_height/2+POINT_IN_PAD_TOLERANCE_MM}return!1}function distance5(x12,y12,x22,y2){return Math.sqrt((x22-x12)**2+(y2-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(pad2.shape==="pill"||pad2.shape==="rotated_pill")return isPointInPad(point6,pad2)});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,id3,fallbackLabel)=>!candidate||candidate===id3||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id3)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id3,"");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")};var getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function getReadableNameForFootprintPad(circuitJson,pad2,ordinal){let padKind=pad2.type==="pcb_smtpad"?"SMD pad":"through-hole pad",portRef2=pad2.pcb_port_id?getReadableNameForPort(circuitJson,pad2.pcb_port_id):null,bounds=getBoundsOfPcbElements([pad2]),centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2,location=`(${centerX.toFixed(2)}mm, ${centerY.toFixed(2)}mm)`;return portRef2?`${padKind} ${portRef2} at ${location}`:`${padKind} #${ordinal+1} at ${location}`}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(id3=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id3||"route_id"in element&&element.route_id===id3))).length===0&&new Set(pcbPortsInTrace.map(p3=>p3.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p3=>getReadableNameForPort(circuitJson,p3.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p3=>p3.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p3=>p3.pcb_component_id).filter(id3=>id3!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var jlcMinTolerances={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=jlcMinTolerances.min_trace_width,DEFAULT_VIA_DIAMETER=jlcMinTolerances.min_via_pad_diameter,DEFAULT_VIA_BOARD_MARGIN=jlcMinTolerances.min_board_edge_clearance,DEFAULT_SAME_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_DIFFERENT_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_PAD_PAD_CLEARANCE=jlcMinTolerances.min_pad_edge_to_pad_edge_clearance,EPSILON2=.005,getPcbBoard=circuitJson=>circuitJson.find(el3=>el3.type==="pcb_board"),getBoardDrcValue=(board,key)=>board?.[key],getPadBounds2=pad2=>getBoundsOfPcbElements([pad2]),getPadCenter3=pad2=>{let bounds=getPadBounds2(pad2);return midpoint({x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY})},getPadRadius=pad2=>{let bounds=getPadBounds2(pad2);return Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/2},isCircularPad=pad2=>pad2.type==="pcb_via"||pad2.shape==="circle",isPillPad=pad2=>pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill"),getCircleShape=pad2=>{let center2=getPadCenter3(pad2);return{kind:"circle",x:center2.x,y:center2.y,radius:getPadRadius(pad2)}},getPolygonShape=pad2=>{if(pad2.type==="pcb_smtpad"&&(pad2.shape==="polygon"||pad2.shape==="rotated_rect"))return{kind:"polygon",points:getPolygonPointsForPad(pad2)};if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return{kind:"polygon",points:getPolygonPointsForPad(pad2)};let bounds=getPadBounds2(pad2);return{kind:"polygon",points:[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}]}},getPadToPadGap=(padA,padB)=>{if(isPillPad(padA)&&isPillPad(padB)){let pillA=getPillCenterLineForPad(padA),pillB=getPillCenterLineForPad(padB);return segmentToSegmentMinDistance(pillA.start,pillA.end,pillB.start,pillB.end)-pillA.radius-pillB.radius}if(isPillPad(padA)&&isCircularPad(padB)){let pill2=getPillCenterLineForPad(padA);return segmentToCircleMinDistance(pill2.start,pill2.end,getCircleShape(padB))-pill2.radius}if(isCircularPad(padA)&&isPillPad(padB)){let pill2=getPillCenterLineForPad(padB);return segmentToCircleMinDistance(pill2.start,pill2.end,getCircleShape(padA))-pill2.radius}if(isPillPad(padA)){let pill2=getPillCenterLineForPad(padA);return getSegmentToPolygonClearanceFromPoints(pill2.start,pill2.end,getPolygonShape(padB).points).distance-pill2.radius}if(isPillPad(padB)){let pill2=getPillCenterLineForPad(padB);return getSegmentToPolygonClearanceFromPoints(pill2.start,pill2.end,getPolygonShape(padA).points).distance-pill2.radius}return isCircularPad(padA)&&isCircularPad(padB)?distanceBetweenCircleAndCircle(getCircleShape(padA),getCircleShape(padB)):isCircularPad(padA)?distanceBetweenCircleAndPolygon(getCircleShape(padA),getPolygonShape(padB)):isCircularPad(padB)?distanceBetweenCircleAndPolygon(getCircleShape(padB),getPolygonShape(padA)):distanceBetweenPolygonAndPolygon(getPolygonShape(padA),getPolygonShape(padB))},getPads=circuitJson=>[...cju_default(circuitJson).pcb_smtpad.list(),...cju_default(circuitJson).pcb_plated_hole.list()],getTraceSegments=circuitJson=>cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i6=0;i6<pcbTrace.route.length-1;i6++){let p12=pcbTrace.route[i6],p22=pcbTrace.route[i6+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}),getTraceCenter=segment2=>{let routePoints=segment2._pcbTrace.route.flatMap(routePoint=>routePoint.route_type==="through_pad"?[routePoint.start,routePoint.end]:[{x:routePoint.x,y:routePoint.y}]),firstPoint=routePoints[0],lastPoint=routePoints[routePoints.length-1];return!firstPoint||!lastPoint?midpoint({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2}):midpoint(firstPoint,lastPoint)},getCenterBetweenCopperEdges=({tracePoint,obstaclePoint,traceRadius,obstacleRadius})=>{let dx3=obstaclePoint.x-tracePoint.x,dy3=obstaclePoint.y-tracePoint.y,distance33=Math.hypot(dx3,dy3);if(distance33===0)return midpoint(tracePoint,obstaclePoint);let unitX=dx3/distance33,unitY=dy3/distance33,traceEdge={x:tracePoint.x+unitX*traceRadius,y:tracePoint.y+unitY*traceRadius},obstacleEdge={x:obstaclePoint.x-unitX*obstacleRadius,y:obstaclePoint.y-unitY*obstacleRadius};return midpoint(traceEdge,obstacleEdge)},getTraceObstacleClearance=(segment2,obstacle)=>{let start={x:segment2.x1,y:segment2.y1},end={x:segment2.x2,y:segment2.y2},traceRadius=segment2.thickness/2;if(obstacle.type==="pcb_via"||isCircularPad(obstacle)){let circle2=obstacle.type==="pcb_via"?{x:obstacle.x,y:obstacle.y,radius:obstacle.outer_diameter/2}:getCircleShape(obstacle),closestPoint=pointToSegmentClosestPoint(circle2,start,end);return{gap:segmentToCircleMinDistance(start,end,circle2)-traceRadius,center:getCenterBetweenCopperEdges({tracePoint:closestPoint,obstaclePoint:circle2,traceRadius,obstacleRadius:circle2.radius})}}if(isPillPad(obstacle)){let clearance2=getSegmentToPillClearance(segment2,obstacle);return{gap:clearance2.distance-traceRadius-clearance2.radius,center:getCenterBetweenCopperEdges({tracePoint:clearance2.tracePoint,obstaclePoint:clearance2.obstaclePoint,traceRadius,obstacleRadius:clearance2.radius})}}let clearance=getSegmentToPolygonClearanceFromPoints(start,end,getPolygonShape(obstacle).points);return{gap:clearance.distance-traceRadius,center:getCenterBetweenCopperEdges({tracePoint:clearance.tracePoint,obstaclePoint:clearance.obstaclePoint,traceRadius,obstacleRadius:0})}},isTraceObstacleOverlap=gap=>gap<=0,SpatialObjectIndex=class{constructor({objects,getBounds:getBounds5,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=getBounds5,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(id3){let obj=this.objectsById.get(id3);if(!obj)return!1;this.objectsById.delete(id3);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===id3);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x6,y2){return`${Math.floor(x6/this.CELL_SIZE)}x${Math.floor(y2/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 id3=obj.spatialIndexId;addedIds.has(id3)||(addedIds.add(id3),objects.push(obj))}}return objects}};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:[]:[]}var 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 t53=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t53*dx3,y:p12.y+t53*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,max2)=>Math.max(min,Math.min(max2,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},w3={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*w3.x+va3.y*w3.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w3.x+vb2.y*w3.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB2=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp22(tA2,0,1),tB2=clamp22(tB2,0,1);let closestOnSegment={x:p12.x+tA2*va3.x,y:p12.y+tA2*va3.y},closestOnEdge={x:edge.start.x+tB2*vb2.x,y:edge.start.y+tB2*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},getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a22={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a22.x-a12.x,y:a22.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=clamp4(((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 t53=clamp4(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t53*va3.x,y:a12.y+t53*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w3={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*w3.x+va3.y*w3.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w3.x+vb2.y*w3.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB2=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp4(tA2,0,1),tB2=clamp4(tB2,0,1),tB2=(tA2*dotAB+dotBW)/dotBB,tB2=clamp4(tB2,0,1),tA2=(tB2*dotAB-dotAW)/dotAA,tA2=clamp4(tA2,0,1);let closestOnA={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},closestOnB={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance33=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA2=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA2=clamp4(tA2,0,1);let pointOnA1={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tA22=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA22=clamp4(tA22,0,1);let pointOnA2={x:a12.x+tA22*va3.x,y:a12.y+tA22*va3.y},tB2=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp4(tB2,0,1);let pointOnB1={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},tB22=((a22.x-b12.x)*vb2.x+(a22.y-b12.y)*vb2.y)/lenSqrB;tB22=clamp4(tB22,0,1);let pointOnB2={x:b12.x+tB22*vb2.x,y:b12.y+tB22*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:a22,pointB:pointOnB2,distance:Math.sqrt((a22.x-pointOnB2.x)**2+(a22.y-pointOnB2.y)**2)}].reduce((closest,current3)=>current3.distance<closest.distance?current3:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp4=(value,min,max2)=>Math.max(min,Math.min(max2,value)),getCollidableBounds=collidable=>{if(collidable.type==="pcb_trace_segment")return{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)};if(collidable.type==="pcb_smtpad"||collidable.type==="pcb_plated_hole"){if(collidable.type==="pcb_smtpad"&&(collidable.shape==="rotated_rect"||collidable.shape==="polygon")||collidable.type==="pcb_plated_hole"&&"rect_pad_width"in collidable&&"rect_pad_height"in collidable){let polygonPoints=getPolygonPointsForPad(collidable);return{minX:Math.min(...polygonPoints.map(point6=>point6.x)),minY:Math.min(...polygonPoints.map(point6=>point6.y)),maxX:Math.max(...polygonPoints.map(point6=>point6.x)),maxY:Math.max(...polygonPoints.map(point6=>point6.y))}}if(collidable.type==="pcb_smtpad"&&collidable.shape==="rotated_pill"){let pill2=getPillCenterLineForPad(collidable);return{minX:Math.min(pill2.start.x,pill2.end.x)-pill2.radius,minY:Math.min(pill2.start.y,pill2.end.y)-pill2.radius,maxX:Math.max(pill2.start.x,pill2.end.x)+pill2.radius,maxY:Math.max(pill2.start.y,pill2.end.y)+pill2.radius}}}return getBoundsOfPcbElements([collidable])};function getPcbPortIdsConnectedToRoutePoint(routePoint){return routePoint.route_type!=="wire"?[]:[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id].filter(portId=>!!portId)}function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)for(let portId of getPcbPortIdsConnectedToRoutePoint(segment2))connectedPcbPorts.add(portId);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 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)}`)},getPcbComponentConnectionElementId=element=>element.type==="pcb_port"?element.pcb_port_id:element.type==="pcb_smtpad"?element.pcb_smtpad_id:element.pcb_plated_hole_id;function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minClearance}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??DEFAULT_TRACE_MARGIN);let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i6=0;i6<pcbTrace.route.length-1;i6++){let p12=pcbTrace.route[i6],p22=pcbTrace.route[i6+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(),pcbPorts=cju_default(circuitJson).pcb_port.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),pcbComponentConnectionElements=[...pcbPorts,...pcbSmtPads,...pcbPlatedHoles],excludedConnectionIdsByKeepoutId=new Map;for(let keepout of pcbKeepouts){let excludedPcbComponentIds=new Set(keepout.excluded_pcb_component_ids??[]);excludedPcbComponentIds.size!==0&&excludedConnectionIdsByKeepoutId.set(keepout.pcb_keepout_id,pcbComponentConnectionElements.filter(element=>element.pcb_component_id&&excludedPcbComponentIds.has(element.pcb_component_id)).map(getPcbComponentConnectionElementId))}let allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id3=>getReadableNameForElement(circuitJson,id3),constructErrorMessage=(traceName,otherName,gap)=>isTraceObstacleOverlap(gap)?`PCB trace ${traceName} overlaps with ${otherName} (accidental contact)`:`PCB trace ${traceName} is too close to ${otherName} (gap: ${gap.toFixed(3)}mm)`,errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minClearance,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)||obj.type==="pcb_keepout"&&(excludedConnectionIdsByKeepoutId.get(obj.pcb_keepout_id)??[]).some(connectionId=>connMap.areIdsConnected(segmentA.pcb_trace_id,connectionId)))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>minClearance-EPSILON2)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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),getReadableName(segmentB.pcb_trace_id),gap2),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_smtpad"||obj.type==="pcb_plated_hole"||obj.type==="pcb_via"){let{gap:gap2,center:center2}=getTraceObstacleClearance(segmentA,obj);if(!isTraceObstacleOverlap(gap2))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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(primaryObjId)}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,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)});continue}if(obj.type==="pcb_hole"){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>minClearance-EPSILON2)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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),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+EPSILON2<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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap),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}var toPcbComponentId=id3=>id3,GEOMETRY_EPSILON=1e-9,pointsToPolygon=points=>points.length<3?null:new Polygon$1(points.map(({x:x6,y:y2})=>new Point$2(x6,y2))),brepRingToPolygon=vertices=>{let ring3=vertices.filter((vertex,index)=>{let previous=vertices[index-1];return!previous||Math.abs(previous.x-vertex.x)>GEOMETRY_EPSILON||Math.abs(previous.y-vertex.y)>GEOMETRY_EPSILON});if(ring3.length>1&&Math.abs(ring3[0].x-ring3.at(-1).x)<=GEOMETRY_EPSILON&&Math.abs(ring3[0].y-ring3.at(-1).y)<=GEOMETRY_EPSILON&&ring3.pop(),ring3.length<3)return null;let edges=[];for(let index=0;index<ring3.length;index++){let start=ring3[index],end=ring3[(index+1)%ring3.length],startPoint=new Point$2(start.x,start.y),endPoint=new Point$2(end.x,end.y),bulge=start.bulge??0;if(Math.abs(bulge)<=GEOMETRY_EPSILON){edges.push(new Segment$1(startPoint,endPoint));continue}let chordLength=startPoint.distanceTo(endPoint)[0];if(chordLength<=GEOMETRY_EPSILON)continue;let midpoint22={x:(start.x+end.x)/2,y:(start.y+end.y)/2},leftNormal={x:-(end.y-start.y)/chordLength,y:(end.x-start.x)/chordLength},centerOffset=chordLength*(1-bulge*bulge)/(4*bulge),center2=new Point$2(midpoint22.x+leftNormal.x*centerOffset,midpoint22.y+leftNormal.y*centerOffset),radius=chordLength*(1+bulge*bulge)/(4*Math.abs(bulge));edges.push(new Arc(center2,radius,Math.atan2(start.y-center2.y,start.x-center2.x),Math.atan2(end.y-center2.y,end.x-center2.x),bulge>0))}if(edges.length<3)return null;let polygon2=new Polygon$1;return polygon2.addFace(edges),polygon2},boardToPolygon=board=>{if(board.outline&&board.outline.length>=3)return pointsToPolygon(board.outline);if(!board.center||typeof board.width!="number"||typeof board.height!="number")return null;let halfWidth=board.width/2,halfHeight=board.height/2;return pointsToPolygon([{x:board.center.x-halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y+halfHeight},{x:board.center.x-halfWidth,y:board.center.y+halfHeight}])},getRectanglePolygon=({x:x6,y:y2,width,height,ccwRotationDegrees=0})=>{let halfWidth=width/2,halfHeight=height/2,rotationMatrix=rotateDEG(ccwRotationDegrees,x6,y2);return pointsToPolygon([{x:x6-halfWidth,y:y2-halfHeight},{x:x6+halfWidth,y:y2-halfHeight},{x:x6+halfWidth,y:y2+halfHeight},{x:x6-halfWidth,y:y2+halfHeight}].map(point6=>applyToPoint(rotationMatrix,point6)))},roundedRect=({x:x6,y:y2,width,height,cornerRadius,ccwRotationDegrees=0})=>{let radius=Math.max(0,Math.min(cornerRadius,width/2,height/2));if(radius<=GEOMETRY_EPSILON){let polygon2=getRectanglePolygon({x:x6,y:y2,width,height,ccwRotationDegrees});return polygon2?{kind:"shapes",shapes:[polygon2]}:null}let shapes=[],innerWidth=width-2*radius,innerHeight=height-2*radius;if(innerWidth>GEOMETRY_EPSILON){let verticalBand=getRectanglePolygon({x:x6,y:y2,width:innerWidth,height,ccwRotationDegrees});verticalBand&&shapes.push(verticalBand)}if(innerHeight>GEOMETRY_EPSILON){let horizontalBand=getRectanglePolygon({x:x6,y:y2,width,height:innerHeight,ccwRotationDegrees});horizontalBand&&shapes.push(horizontalBand)}let halfInnerWidth=innerWidth/2,halfInnerHeight=innerHeight/2,rotationMatrix=rotateDEG(ccwRotationDegrees,x6,y2),cornerCenters=[{x:x6-halfInnerWidth,y:y2-halfInnerHeight},{x:x6+halfInnerWidth,y:y2-halfInnerHeight},{x:x6+halfInnerWidth,y:y2+halfInnerHeight},{x:x6-halfInnerWidth,y:y2+halfInnerHeight}].map(point6=>applyToPoint(rotationMatrix,point6)).filter((point6,index,points)=>points.findIndex(candidate=>Math.abs(candidate.x-point6.x)<=GEOMETRY_EPSILON&&Math.abs(candidate.y-point6.y)<=GEOMETRY_EPSILON)===index);return shapes.push(...cornerCenters.map(center2=>new Circle$1(new Point$2(center2.x,center2.y),radius))),shapes.length>0?{kind:"shapes",shapes}:null},pill=({x:x6,y:y2,width,height,radius,ccwRotationDegrees=0})=>{let halfLineLength=Math.max(Math.max(width,height)/2-radius,0),localAxis=width>=height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},axis=applyToPoint(rotateDEG(ccwRotationDegrees),localAxis);return halfLineLength<=GEOMETRY_EPSILON?{kind:"shapes",shapes:[new Circle$1(new Point$2(x6,y2),radius)]}:{kind:"pill",centerLine:new Segment$1(new Point$2(x6-axis.x,y2-axis.y),new Point$2(x6+axis.x,y2+axis.y)),radius}},getSmtPadGeometry=pad2=>{switch(pad2.shape){case"circle":return{kind:"shapes",shapes:[new Circle$1(new Point$2(pad2.x,pad2.y),pad2.radius)]};case"rect":return roundedRect({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,cornerRadius:pad2.rect_border_radius??pad2.corner_radius??0});case"rotated_rect":return roundedRect({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,cornerRadius:pad2.rect_border_radius??pad2.corner_radius??0,ccwRotationDegrees:pad2.ccw_rotation});case"pill":return pill({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,radius:pad2.radius});case"rotated_pill":return pill({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,radius:pad2.radius,ccwRotationDegrees:pad2.ccw_rotation});case"polygon":{let polygon2=pointsToPolygon(pad2.points);return polygon2?{kind:"shapes",shapes:[polygon2]}:null}}},getPlatedHoleGeometry=(platedHole,componentCcwRotationDegrees)=>{switch(platedHole.shape){case"circle":return{kind:"shapes",shapes:[new Circle$1(new Point$2(platedHole.x,platedHole.y),platedHole.outer_diameter/2)]};case"oval":case"pill":return pill({x:platedHole.x,y:platedHole.y,width:platedHole.outer_width,height:platedHole.outer_height,radius:Math.min(platedHole.outer_width/2,platedHole.outer_height/2),ccwRotationDegrees:platedHole.ccw_rotation});case"circular_hole_with_rect_pad":case"pill_hole_with_rect_pad":case"rotated_pill_hole_with_rect_pad":return roundedRect({x:platedHole.x,y:platedHole.y,width:platedHole.rect_pad_width,height:platedHole.rect_pad_height,cornerRadius:platedHole.rect_border_radius??0,ccwRotationDegrees:"rect_ccw_rotation"in platedHole?platedHole.rect_ccw_rotation??0:0});case"hole_with_polygon_pad":{let ccwRotationDegrees=platedHole.ccw_rotation??componentCcwRotationDegrees,rotationMatrix=rotateDEG(ccwRotationDegrees),polygon2=pointsToPolygon(platedHole.pad_outline.map(point6=>{let rotatedPoint=applyToPoint(rotationMatrix,point6);return{x:platedHole.x+rotatedPoint.x,y:platedHole.y+rotatedPoint.y}}));return polygon2?{kind:"shapes",shapes:[polygon2]}:null}}},getCopperGeometry=(element,componentCcwRotationsById)=>{if(element.type==="pcb_via")return{kind:"shapes",shapes:[new Circle$1(new Point$2(element.x,element.y),element.outer_diameter/2)]};if(element.type==="pcb_smtpad")return getSmtPadGeometry(element);if(element.type==="pcb_plated_hole")return getPlatedHoleGeometry(element,element.pcb_component_id?componentCcwRotationsById.get(toPcbComponentId(element.pcb_component_id))??0:0);let polygon2;switch(element.shape){case"rect":polygon2=getRectanglePolygon({x:element.center.x,y:element.center.y,width:element.width,height:element.height,ccwRotationDegrees:element.rotation??0});break;case"polygon":polygon2=pointsToPolygon(element.points);break;case"brep":polygon2=brepRingToPolygon(element.brep_shape.outer_ring.vertices);break}return polygon2?{kind:"shapes",shapes:[polygon2]}:null},getCopperElementId=element=>element.type==="pcb_via"?element.pcb_via_id:element.type==="pcb_smtpad"?element.pcb_smtpad_id:element.type==="pcb_plated_hole"?element.pcb_plated_hole_id:element.pcb_copper_pour_id,getCopperElementLabel=element=>element.type==="pcb_via"?"Via":element.type==="pcb_smtpad"?"SMT pad":element.type==="pcb_plated_hole"?"Plated hole":"Copper pour",measureClearance=(board,geometry)=>{if(geometry.kind==="shapes"){let isInside2=geometry.shapes.every(shape=>board.contains(shape));return{isInside:isInside2,clearance:isInside2?Math.min(...geometry.shapes.map(shape=>board.distanceTo(shape)[0])):0}}let clearance=board.distanceTo(geometry.centerLine)[0]-geometry.radius,isInside=board.contains(geometry.centerLine)&&clearance>=-GEOMETRY_EPSILON;return{isInside,clearance:isInside?Math.max(0,clearance):0}};function checkCopperToBoardEdgeClearance(circuitJson){let board=getPcbBoard(circuitJson);if(!board)return[];let boardPolygon=boardToPolygon(board);if(!boardPolygon)return[];let requiredClearance=getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance;if(requiredClearance===void 0)return[];let copperElements=circuitJson.filter(element=>element.type==="pcb_via"||element.type==="pcb_smtpad"||element.type==="pcb_plated_hole"||element.type==="pcb_copper_pour"),componentCcwRotationsById=new Map(circuitJson.filter(element=>element.type==="pcb_component").map(component=>[toPcbComponentId(component.pcb_component_id),component.rotation])),errors=[];for(let element of copperElements){let geometry=getCopperGeometry(element,componentCcwRotationsById);if(!geometry)continue;let{isInside,clearance}=measureClearance(boardPolygon,geometry);if(isInside&&clearance+GEOMETRY_EPSILON>=requiredClearance)continue;let id3=getCopperElementId(element),label=getCopperElementLabel(element);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`copper_too_close_to_board_edge_${id3}`,error_type:"pcb_placement_error",message:`${label} ${id3} violates copper-to-board-edge clearance (measured ${clearance.toFixed(3)}mm, required ${requiredClearance.toFixed(3)}mm)`})}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size3,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size3.width/2,hh3=size3.height/2,corners=[new Point$2(cx3-hw2,cy3-hh3),new Point$2(cx3+hw2,cy3-hh3),new Point$2(cx3+hw2,cy3+hh3),new Point$2(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt3=>{let p3=applyToPoint(matrix2,{x:pt3.x,y:pt3.y});return new Point$2(p3.x,p3.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon2({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p3=>new Point$2(p3.x,p3.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$2(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 i6=0;i6<4;i6++){let next2=(i6+1)%4;midpoints.push({x:(corners[i6].x+corners[next2].x)/2,y:(corners[i6].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint22=pt3=>{let p3=applyToPoint(matrix2,pt3);return new Point$2(p3.x,p3.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint22),maxDistance=0;for(let pt3 of rotatedPoints)if(!boardPoly.contains(pt3)){let dist=boardPoly.distanceTo(pt3),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,p3)=>sum+(typeof p3.area=="function"?p3.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=boardToPolygon2({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}var CUTOUT_CIRCLE_SEGMENTS=32;function rectanglePolygon2({center:center2,width,height,rotation:rotation5=0}){let halfWidth=width/2,halfHeight=height/2,corners=[{x:center2.x-halfWidth,y:center2.y-halfHeight},{x:center2.x+halfWidth,y:center2.y-halfHeight},{x:center2.x+halfWidth,y:center2.y+halfHeight},{x:center2.x-halfWidth,y:center2.y+halfHeight}],matrix2=rotateDEG(rotation5,center2.x,center2.y);return new Polygon$1(corners.map(corner=>{let rotated=rotation5?applyToPoint(matrix2,corner):corner;return new Point$2(rotated.x,rotated.y)}))}function circlePolygon({center:center2,radius}){return new Polygon$1(Array.from({length:CUTOUT_CIRCLE_SEGMENTS},(_3,index)=>{let angle=2*Math.PI*index/CUTOUT_CIRCLE_SEGMENTS;return new Point$2(center2.x+Math.cos(angle)*radius,center2.y+Math.sin(angle)*radius)}))}function cutoutToPolygon(cutout){return cutout.shape==="rect"?rectanglePolygon2({center:cutout.center,width:cutout.width,height:cutout.height,rotation:cutout.rotation??0}):cutout.shape==="circle"?circlePolygon({center:cutout.center,radius:cutout.radius}):cutout.shape==="polygon"?new Polygon$1(cutout.points.map(point6=>new Point$2(point6.x,point6.y))):null}function polygonBoxToBounds(polygon2){return{minX:polygon2.box.xmin,minY:polygon2.box.ymin,maxX:polygon2.box.xmax,maxY:polygon2.box.ymax}}function doPolygonsOverlap(polygonA,polygonB){if(!doBoundsOverlap(polygonBoxToBounds(polygonA),polygonBoxToBounds(polygonB)))return!1;if(polygonA.contains(polygonB)||polygonB.contains(polygonA))return!0;try{let intersections=BooleanOperations.intersect(polygonA,polygonB);return Array.isArray(intersections)?intersections.some(polygon2=>polygon2.area()>0):intersections.area()>0}catch{return!1}}function checkPcbComponentOverCutout(circuitJson){let cutouts=circuitJson.filter(element=>element.type==="pcb_cutout"),components=circuitJson.filter(element=>element.type==="pcb_component");if(cutouts.length===0||components.length===0)return[];let cutoutPolygons=cutouts.map(cutout=>({cutout,polygon:cutoutToPolygon(cutout)})).filter(entry=>entry.polygon!==null&&entry.polygon.area()>0),errors=[];for(let component of components){if(!component.center||component.width<=0||component.height<=0)continue;let componentPolygon=rectanglePolygon2({center:component.center,width:component.width,height:component.height});for(let{cutout,polygon:cutoutPolygon}of cutoutPolygons){if(!doPolygonsOverlap(componentPolygon,cutoutPolygon))continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id),cutoutId=cutout.pcb_cutout_id;errors.push({type:"pcb_placement_error",pcb_placement_error_id:`component_over_cutout_${component.pcb_component_id}_${cutoutId}`,error_type:"pcb_placement_error",message:`Component ${componentName} overlaps with pcb_cutout [${cutoutId}]`,subcircuit_id:component.subcircuit_id})}}return errors}function distance22(a6,b6){return Math.hypot(a6.x-b6.x,a6.y-b6.y)}function viasAreAtSameLocation(a6,b6){return distance22(a6,b6)<=EPSILON2}function checkSameNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i6=0;i6<vias.length;i6++)for(let j6=i6+1;j6<vias.length;j6++){let viaA=vias[i6],viaB=vias[j6];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)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:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i6=0;i6<vias.length;i6++)for(let j6=i6+1;j6<vias.length;j6++){let viaA=vias[i6],viaB=vias[j6];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)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:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),sourcePortToPcbPort=new Map(pcbPorts.map(pcbPort=>[pcbPort.source_port_id,pcbPort])),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson);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=>connectivityMap.areIdsConnected(sourceTrace.source_trace_id,pcbTrace.pcb_trace_id))){let connectedPcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortToPcbPort.get(sourcePortId)).filter(pcbPort=>pcbPort!==void 0),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id3=>id3!==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}function getRoutePointCenter(point6){return point6.route_type==="through_pad"?{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2}:{x:point6.x,y:point6.y}}function routePointConnectsToAnotherExpectedPort(point6,expectedPorts,missingPcbPortId,padMap){return point6.route_type!=="wire"?!1:expectedPorts.some(expectedPort=>!expectedPort.pcb_port_id||expectedPort.pcb_port_id===missingPcbPortId?!1:padMap.get(expectedPort.pcb_port_id)?.some(pad2=>isPointInPad({x:point6.x,y:point6.y},pad2))??!1)}function getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap}){let errorLocation,firstWirePoint=firstPoint.route_type==="wire"?firstPoint:void 0,lastWirePoint=lastPoint.route_type==="wire"?lastPoint:void 0,firstWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(firstPoint).includes(port.pcb_port_id),lastWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(lastPoint).includes(port.pcb_port_id);firstWirePointReferencesPort&&firstWirePoint?errorLocation=firstWirePoint:lastWirePointReferencesPort&&lastWirePoint||routePointConnectsToAnotherExpectedPort(firstPoint,expectedPorts,port.pcb_port_id,padMap)&&lastWirePoint?errorLocation=lastWirePoint:routePointConnectsToAnotherExpectedPort(lastPoint,expectedPorts,port.pcb_port_id,padMap)&&firstWirePoint?errorLocation=firstWirePoint:firstWirePoint&&lastWirePoint?errorLocation=distance22(firstWirePoint,port)<=distance22(lastWirePoint,port)?firstWirePoint:lastWirePoint:firstWirePoint?errorLocation=firstWirePoint:lastWirePoint&&(errorLocation=lastWirePoint);let firstPointCenter=getRoutePointCenter(firstPoint),lastPointCenter=getRoutePointCenter(lastPoint);return errorLocation?{x:errorLocation.x,y:errorLocation.y}:{x:(firstPointCenter.x+lastPointCenter.x)/2,y:(firstPointCenter.y+lastPointCenter.y)/2}}function checkTracesAreContiguous(circuitJson){let errors=[],pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbSmtPads=circuitJson.filter(el3=>el3.type==="pcb_smtpad"),pcbPlatedHoles=circuitJson.filter(el3=>el3.type==="pcb_plated_hole"),padMap=new Map,pcbConnectivityMap=new PcbConnectivityMap(circuitJson),checkedSourceTraceIds=new Set;for(let pad2 of pcbSmtPads)pad2.pcb_port_id&&padMap.set(pad2.pcb_port_id,[...padMap.get(pad2.pcb_port_id)??[],pad2]);for(let hole of pcbPlatedHoles)hole.pcb_port_id&&padMap.set(hole.pcb_port_id,[...padMap.get(hole.pcb_port_id)??[],hole]);for(let trace of pcbTraces){if(trace.route.length===0)continue;let firstPoint=trace.route[0],lastPoint=trace.route[trace.route.length-1],sourceTrace=sourceTraces.find(st3=>st3.source_trace_id===trace.source_trace_id),expectedPorts=sourceTrace?pcbPorts.filter(port=>sourceTrace.connected_source_port_ids?.includes(port.source_port_id)):[];for(let i6=1;i6<trace.route.length-1;i6++){let prevPoint=trace.route[i6-1],currentPoint=trace.route[i6],nextPoint=trace.route[i6+1];if(currentPoint.route_type==="via"){let prevIsWire=prevPoint.route_type==="wire",nextIsWire=nextPoint.route_type==="wire";if(prevIsWire&&nextIsWire){let prevAligned=Math.abs(prevPoint.x-currentPoint.x)<.01&&Math.abs(prevPoint.y-currentPoint.y)<.01,nextAligned=Math.abs(nextPoint.x-currentPoint.x)<.01&&Math.abs(nextPoint.y-currentPoint.y)<.01;if(!prevAligned||!nextAligned){let traceName2=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);errors.push({type:"pcb_trace_error",message:`Via in trace [${traceName2}] is misaligned at position {x: ${currentPoint.x}, y: ${currentPoint.y}}.`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`misaligned_via_${trace.pcb_trace_id}_${i6}`,pcb_component_ids:[],pcb_port_ids:[]})}}}}let traceName=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);if(sourceTrace&&expectedPorts.length>0){if(checkedSourceTraceIds.has(sourceTrace.source_trace_id))continue;checkedSourceTraceIds.add(sourceTrace.source_trace_id)}for(let port of expectedPorts){if(!port.pcb_port_id)continue;let pads=padMap.get(port.pcb_port_id);if(!pads?.length)continue;let isConnectedByRoutedSourceTrace=!1,candidateTraces=[...pcbConnectivityMap.getAllTracesConnectedToTrace(trace.pcb_trace_id),...pcbTraces.filter(candidateTrace=>candidateTrace.source_trace_id===sourceTrace?.source_trace_id)];for(let candidateTrace of candidateTraces){if(candidateTrace.pcb_trace_id===trace.pcb_trace_id||!candidateTrace.source_trace_id)continue;let candidateSourceTrace=sourceTraces.find(st3=>st3.source_trace_id===candidateTrace.source_trace_id);if(!sourceTrace||candidateTrace.source_trace_id!==sourceTrace.source_trace_id&&!candidateSourceTrace?.connected_source_port_ids.includes(port.source_port_id))continue;let candidateFirstPoint=candidateTrace.route[0],candidateLastPoint=candidateTrace.route.at(-1);if(getPcbPortIdsConnectedToTrace(candidateTrace).includes(port.pcb_port_id)||candidateFirstPoint?.route_type==="wire"&&pads.some(pad2=>isPointInPad(candidateFirstPoint,pad2))||candidateLastPoint?.route_type==="wire"&&pads.some(pad2=>isPointInPad(candidateLastPoint,pad2))){isConnectedByRoutedSourceTrace=!0;break}}if(isConnectedByRoutedSourceTrace)continue;let isFirstPointConnected=firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2)),isLastPointConnected=lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2));if(!isFirstPointConnected&&!isLastPointConnected){let portName=getReadableNameForPcbPort(circuitJson,port.pcb_port_id).replace("pcb_port",""),padType=pads[0].type.replace(/pcb_/,""),errorCenter=getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap});errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] is missing a connection to ${padType}${portName}`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`missing_connection_${trace.pcb_trace_id}_${port.pcb_port_id}`,center:errorCenter,pcb_component_ids:[],pcb_port_ids:[port.pcb_port_id]})}}if(expectedPorts.length===0){let firstConnectsToAnyPad=!1,lastConnectsToAnyPad=!1,endpointsAreSame=firstPoint.route_type==="wire"&&lastPoint.route_type==="wire"&&Math.abs(firstPoint.x-lastPoint.x)<.01&&Math.abs(firstPoint.y-lastPoint.y)<.01;for(let pads of padMap.values())firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2))&&(firstConnectsToAnyPad=!0),lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2))&&(lastConnectsToAnyPad=!0);!firstConnectsToAnyPad&&firstPoint.route_type==="wire"&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${firstPoint.x.toFixed(2)}, ${firstPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_start`,center:{x:firstPoint.x,y:firstPoint.y},pcb_component_ids:[],pcb_port_ids:[]}),!lastConnectsToAnyPad&&lastPoint.route_type==="wire"&&!(endpointsAreSame&&!firstConnectsToAnyPad)&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${lastPoint.x.toFixed(2)}, ${lastPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_end`,center:{x:lastPoint.x,y:lastPoint.y},pcb_component_ids:[],pcb_port_ids:[]})}}return errors}function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p3=>({x:p3.x,y:p3.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=[],board=getPcbBoard(circuitJson);if(!board)return errors;let margin=config.margin??getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,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 i6=0;i6<trace.route.length-1;i6++){let p12=trace.route[i6],p22=trace.route[i6+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=Number.POSITIVE_INFINITY;for(let j6=0;j6<boardPoints.length;j6++){let edgeStart=boardPoints[j6],edgeEnd=boardPoints[(j6+1)%boardPoints.length],distance33=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance33<minDistance&&(minDistance=distance33)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error2={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i6}`,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(error2)}}return errors}function getElementLayers(elem){return elem.type==="pcb_courtyard_circle"||elem.type==="pcb_courtyard_outline"||elem.type==="pcb_courtyard_polygon"||elem.type==="pcb_courtyard_rect"?[elem.layer]:getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l6=>layers2.includes(l6))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;if(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad")return getPadToPadGap(elem1,elem2)<=0;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var isCourtyardElement=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id3=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id3);return readableName==="element"?`[${id3}]`: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(),courtyards=circuitJson.filter(isCourtyardElement),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:[]}),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:[]}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=hole.pcb_component_id||`standalone_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[hole]})}for(let courtyard of courtyards){let componentId=courtyard.pcb_component_id;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(courtyard)}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i6=0;i6<componentsWithElements.length;i6++)for(let j6=i6+1;j6<componentsWithElements.length;j6++){let comp1=componentsWithElements[i6],comp2=componentsWithElements[j6];if(!(!comp1.bounds||!comp2.bounds)&&doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id22=getPrimaryId(elem2);if(!((isCourtyardElement(elem1)||isCourtyardElement(elem2))&&elem1.type!=="pcb_hole"&&elem2.type!=="pcb_hole")&&!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id22))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error2={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id22}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error2.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id22)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error2.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id22)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error2.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error2.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error2.pcb_hole_ids.push(id22)),errors.push(error2)}}}return errors}var courtyardTypes=new Set(["pcb_courtyard_circle","pcb_courtyard_outline","pcb_courtyard_polygon","pcb_courtyard_pill","pcb_courtyard_rect"]);function checkPcbComponentsMissingCourtyard(circuitJson){let componentIdsWithCourtyards=new Set(circuitJson.filter(element=>courtyardTypes.has(element.type)).flatMap(element=>"pcb_component_id"in element&&element.pcb_component_id?[element.pcb_component_id]:[]));return circuitJson.filter(element=>element.type==="pcb_component").filter(component=>!componentIdsWithCourtyards.has(component.pcb_component_id)).map(component=>{let sourceComponent=component.source_component_id?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===component.source_component_id):void 0,componentName=sourceComponent?.type==="source_component"?sourceComponent.name:getReadableNameForComponent(circuitJson,component.pcb_component_id);return{type:"pcb_component_missing_courtyard_warning",pcb_component_missing_courtyard_warning_id:`pcb_component_missing_courtyard_warning_${component.pcb_component_id}`,warning_type:"pcb_component_missing_courtyard_warning",message:`${componentName} has no courtyard`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:component.subcircuit_id}})}var DEFAULT_VIA_LENGTH_MM=1.6,getRoutePointPosition=routePoint=>routePoint.route_type==="through_pad"?routePoint.start:{x:routePoint.x,y:routePoint.y},getPcbTraceLength=pcbTrace=>{if(pcbTrace.trace_length!==void 0)return pcbTrace.trace_length;let traceLength2=0;for(let routePointIndex=0;routePointIndex<pcbTrace.route.length;routePointIndex++){let routePoint=pcbTrace.route[routePointIndex];if(!routePoint)continue;if(routePoint.route_type==="via"){traceLength2+=DEFAULT_VIA_LENGTH_MM;continue}let nextRoutePoint=pcbTrace.route[routePointIndex+1];if(!nextRoutePoint)continue;let routePointPosition=getRoutePointPosition(routePoint),nextRoutePointPosition=getRoutePointPosition(nextRoutePoint);traceLength2+=Math.hypot(nextRoutePointPosition.x-routePointPosition.x,nextRoutePointPosition.y-routePointPosition.y)}return traceLength2},checkPcbTraceLengths=circuitJson=>{let sourceTraces=circuitJson.filter(element=>element.type==="source_trace"),pcbTraces=circuitJson.filter(element=>element.type==="pcb_trace"),sourceTracesById=new Map(sourceTraces.map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace])),warnings=[];for(let pcbTrace of pcbTraces){if(!pcbTrace.source_trace_id)continue;let sourceTrace=sourceTracesById.get(pcbTrace.source_trace_id);if(!sourceTrace)continue;let maximumTraceLength=sourceTrace.max_length;if(typeof maximumTraceLength!="number")continue;let actualTraceLength=getPcbTraceLength(pcbTrace);actualTraceLength<=maximumTraceLength||warnings.push({type:"pcb_trace_too_long_warning",pcb_trace_too_long_warning_id:`pcb_trace_too_long_warning_${pcbTrace.pcb_trace_id}`,warning_type:"pcb_trace_too_long_warning",message:`PCB trace is ${actualTraceLength.toFixed(2)}mm long, exceeding the ${maximumTraceLength}mm maximum`,pcb_trace_id:pcbTrace.pcb_trace_id,source_trace_id:sourceTrace.source_trace_id,source_net_id:sourceTrace.connected_source_net_ids[0],actual_trace_length:actualTraceLength,maximum_trace_length:maximumTraceLength,subcircuit_id:pcbTrace.subcircuit_id??sourceTrace.subcircuit_id})}return warnings};function checkPadPadClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson);if(pads.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let padA of pads){let padAId=getPrimaryId(padA),nearbyPads=spatialIndex.getObjectsInBounds(getPadBounds2(padA),minClearance);for(let padB of nearbyPads){let padBId=getPrimaryId(padB);if(padAId===padBId||!getLayersOfPcbElement(padA).some(layer=>getLayersOfPcbElement(padB).includes(layer))||connMap.areIdsConnected(padAId,padBId))continue;let pairId=[padAId,padBId].sort().join("_"),gap=getPadToPadGap(padA,padB);if(gap+EPSILON2>=minClearance)continue;let centerA=getPadCenter3(padA),centerB=getPadCenter3(padB),nextError={type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`pad_pad_clearance_${pairId}`,error_type:"pcb_pad_pad_clearance_error",message:`Pads ${getReadableNameForElement(circuitJson,padAId)} and ${getReadableNameForElement(circuitJson,padBId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_ids:[padAId,padBId],minimum_clearance:minClearance,actual_clearance:gap,center:{x:(centerA.x+centerB.x)/2,y:(centerA.y+centerB.y)/2}};errors.has(pairId)||errors.set(pairId,nextError)}}return Array.from(errors.values())}function checkPadTraceClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson),segments=getTraceSegments(circuitJson);if(pads.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:pad2=>getPrimaryId(pad2)}),errors=new Map,overlappingPairIds=new Set;for(let segment2 of segments){let nearbyPads=spatialIndex.getObjectsInBounds(getCollidableBounds(segment2),minClearance+segment2.thickness/2);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(pad2).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,padId))continue;let pairId=`${padId}_${segment2.pcb_trace_id}`,{gap}=getTraceObstacleClearance(segment2,pad2);if(isTraceObstacleOverlap(gap)){errors.delete(pairId),overlappingPairIds.add(pairId);continue}if(overlappingPairIds.has(pairId)||gap+EPSILON2>=minClearance)continue;let nextError={type:"pcb_pad_trace_clearance_error",pcb_pad_trace_clearance_error_id:`pad_trace_clearance_${pairId}`,error_type:"pcb_pad_trace_clearance_error",message:`Pad ${getReadableNameForElement(circuitJson,padId)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_id:padId,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:getTraceCenter(segment2)},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkViaTraceClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via"),segments=getTraceSegments(circuitJson);if(vias.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=new Map,overlappingPairIds=new Set;for(let via of vias)for(let segment2 of segments){if(!getLayersOfPcbElement(via).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,via.pcb_via_id))continue;let pairId=`${via.pcb_via_id}_${segment2.pcb_trace_id}`,{gap}=getTraceObstacleClearance(segment2,via);if(isTraceObstacleOverlap(gap)){errors.delete(pairId),overlappingPairIds.add(pairId);continue}if(overlappingPairIds.has(pairId)||gap+EPSILON2>=minClearance)continue;let nextError={type:"pcb_via_trace_clearance_error",pcb_via_trace_clearance_error_id:`via_trace_clearance_${pairId}`,error_type:"pcb_via_trace_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_via_id:via.pcb_via_id,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:getTraceCenter(segment2)},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkViaPadClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(element=>element.type==="pcb_via"),pads=getPads(circuitJson);if(vias.length===0||pads.length===0)return[];let board=getPcbBoard(circuitJson),requiredClearance=minClearance??getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance;connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let padIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:getPrimaryId}),errors=[];for(let via of vias){let nearbyPads=padIndex.getObjectsInBounds(getPadBounds2(via),requiredClearance);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(via).some(layer=>getLayersOfPcbElement(pad2).includes(layer))||connMap.areIdsConnected(via.pcb_via_id,padId))continue;let gap=getPadToPadGap(via,pad2);if(gap+EPSILON2>=requiredClearance)continue;let viaCenter=getPadCenter3(via),padCenter=getPadCenter3(pad2);errors.push({type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`via_pad_clearance_${via.pcb_via_id}_${padId}`,error_type:"pcb_pad_pad_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and pad ${getReadableNameForElement(circuitJson,padId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(requiredClearance)})`,pcb_pad_ids:[via.pcb_via_id,padId],minimum_clearance:requiredClearance,actual_clearance:gap,center:{x:(viaCenter.x+padCenter.x)/2,y:(viaCenter.y+padCenter.y)/2}})}}return errors}function checkViasInPads(circuitJson){let board=getPcbBoard(circuitJson);if(board&&"is_via_in_pad_allowed"in board&&board.is_via_in_pad_allowed===!0)return[];let vias=circuitJson.filter(element=>element.type==="pcb_via"),pads=getPads(circuitJson);if(vias.length===0||pads.length===0)return[];let padOrdinals=new Map(pads.map((pad2,index)=>[getPrimaryId(pad2),index])),padIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:getPrimaryId}),errors=[];for(let via of vias){let nearbyPads=padIndex.getObjectsInBounds({minX:via.x,minY:via.y,maxX:via.x,maxY:via.y});for(let pad2 of nearbyPads){let viaLayers=getLayersOfPcbElement(via),padLayers=getLayersOfPcbElement(pad2);if(!viaLayers.some(layer=>padLayers.includes(layer))||!isPointInPad(via,pad2))continue;let padId=getPrimaryId(pad2),padOrdinal=padOrdinals.get(padId)??0,padName=getReadableNameForFootprintPad(circuitJson,pad2,padOrdinal);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`via_in_pad_${via.pcb_via_id}_${padId}`,error_type:"pcb_placement_error",message:`Via at (${via.x.toFixed(2)}mm, ${via.y.toFixed(2)}mm) is inside ${padName}`,subcircuit_id:via.subcircuit_id??pad2.subcircuit_id})}}return errors}var dedupePcbDrcErrors=errors=>{let specificallyReportedPairIds=new Set;for(let error2 of errors)error2.type==="pcb_pad_trace_clearance_error"&&typeof error2.pcb_trace_id=="string"&&typeof error2.pcb_pad_id=="string"&&specificallyReportedPairIds.add(`overlap_${error2.pcb_trace_id}_${error2.pcb_pad_id}`),error2.type==="pcb_via_trace_clearance_error"&&typeof error2.pcb_trace_id=="string"&&typeof error2.pcb_via_id=="string"&&specificallyReportedPairIds.add(`overlap_${error2.pcb_trace_id}_${error2.pcb_via_id}`);return errors.filter(element=>{let error2=element;return!(error2.type==="pcb_trace_error"&&typeof error2.pcb_trace_error_id=="string"&&specificallyReportedPairIds.has(error2.pcb_trace_error_id))})};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 getFacingDirectionFromInsertionDirection(component){switch(component.insertion_direction){case"from_left":return"x-";case"from_right":return"x+";case"from_top":return"y+";case"from_bottom":return"y-";case"from_above":case"from_below":return null;default:return null}}function getFacingDirection(component){if(component.insertion_direction)return getFacingDirectionFromInsertionDirection(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((a6,b6)=>a6.distance-b6.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){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}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,cos6=Math.cos(angle),sin6=Math.sin(angle);return corners.map(({x:x6,y:y2})=>({x:el3.center.x+x6*cos6-y2*sin6,y:el3.center.y+x6*sin6+y2*cos6}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_3,i6)=>{let a6=2*Math.PI*i6/32;return{x:el3.center.x+el3.radius*Math.cos(a6),y:el3.center.y+el3.radius*Math.sin(a6)}}):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(p3=>isPointInsidePolygon(p3,polyB))||polyB.some(p3=>isPointInsidePolygon(p3,polyA)))return!0;for(let i6=0;i6<polyA.length;i6++){let a12=polyA[i6],a22=polyA[(i6+1)%polyA.length];for(let j6=0;j6<polyB.length;j6++){let b12=polyB[j6],b22=polyB[(j6+1)%polyB.length];if(doSegmentsIntersect(a12,a22,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 id3=el3.pcb_component_id;byComponent.has(id3)||byComponent.set(id3,[]),byComponent.get(id3).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i6=0;i6<componentIds.length;i6++)for(let j6=i6+1;j6<componentIds.length;j6++){let idA=componentIds[i6],idB=componentIds[j6],overlapping=!1;outer:for(let a6 of byComponent.get(idA))for(let b6 of byComponent.get(idB)){if("layer"in a6&&"layer"in b6&&a6.layer!==b6.layer)continue;let polyA=getCourtyardPolygon(a6),polyB=getCourtyardPolygon(b6);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}var isCourtyardElement2=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",isPointInsideCourtyard=(point6,courtyard)=>{if(courtyard.type==="pcb_courtyard_circle"){let dx3=point6.x-courtyard.center.x,dy3=point6.y-courtyard.center.y;return dx3*dx3+dy3*dy3<=courtyard.radius*courtyard.radius}if(courtyard.type==="pcb_courtyard_rect"){let angle=-1*(courtyard.ccw_rotation??0)*Math.PI/180,dx3=point6.x-courtyard.center.x,dy3=point6.y-courtyard.center.y,localX=dx3*Math.cos(angle)-dy3*Math.sin(angle),localY=dx3*Math.sin(angle)+dy3*Math.cos(angle);return Math.abs(localX)<=courtyard.width/2&&Math.abs(localY)<=courtyard.height/2}let polygon2=courtyard.type==="pcb_courtyard_polygon"?courtyard.points:courtyard.outline;return isPointInsidePolygon(point6,polygon2)},getPcbComponentName=(circuitJson,pcbComponentId)=>{let pcbComponent=circuitJson.find(element=>element.type==="pcb_component"&&element.pcb_component_id===pcbComponentId),sourceComponent=circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===pcbComponent?.source_component_id);return(sourceComponent&&"name"in sourceComponent?sourceComponent.name:void 0)??getReadableNameForComponent(circuitJson,pcbComponentId)};function checkTestPointAccessibility(circuitJson){let sourceTestPoints=circuitJson.filter(element=>element.type==="source_component"&&element.ftype==="simple_test_point"),sourceTestPointIds=new Set(sourceTestPoints.map(testPoint=>testPoint.source_component_id)),testPointNames=new Map(sourceTestPoints.map(testPoint=>[testPoint.source_component_id,testPoint.name])),testPointComponents=circuitJson.filter(element=>element.type==="pcb_component"&&sourceTestPointIds.has(element.source_component_id)),courtyards=circuitJson.filter(isCourtyardElement2),errors=[],reportedComponentPairs=new Set;for(let testPoint of testPointComponents)for(let courtyard of courtyards){if(courtyard.pcb_component_id===testPoint.pcb_component_id||courtyard.layer!==testPoint.layer||!isPointInsideCourtyard(testPoint.center,courtyard))continue;let componentPair=`${testPoint.pcb_component_id}:${courtyard.pcb_component_id}`;if(reportedComponentPairs.has(componentPair))continue;reportedComponentPairs.add(componentPair);let testPointName=testPointNames.get(testPoint.source_component_id)??"Test point",obstructingComponentName=getPcbComponentName(circuitJson,courtyard.pcb_component_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`testpoint_in_courtyard_${testPoint.pcb_component_id}_${courtyard.pcb_component_id}`,error_type:"pcb_placement_error",message:`Test point ${testPointName} is not accessible because it is inside the courtyard of ${obstructingComponentName}`,subcircuit_id:testPoint.subcircuit_id})}return errors}async function runAllPlacementChecks(circuitJson){return[...checkCopperToBoardEdgeClearance(circuitJson),...checkViasInPads(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverCutout(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkPcbComponentsMissingCourtyard(circuitJson),...checkPadPadClearance(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson),...checkTestPointAccessibility(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),...checkPcbTraceLengths(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkPadTraceClearance(circuitJson),...checkViaTraceClearance(circuitJson),...checkViaPadClearance(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkTracesAreContiguous(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist7();init_dist();init_dist7();init_dist2();var emptyBounds=()=>({minX:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY}),includePoint=(bounds,x6,y2)=>{bounds.minX=Math.min(bounds.minX,x6),bounds.maxX=Math.max(bounds.maxX,x6),bounds.minY=Math.min(bounds.minY,y2),bounds.maxY=Math.max(bounds.maxY,y2)},includeRect=(bounds,x6,y2,width,height)=>{includePoint(bounds,x6-width/2,y2-height/2),includePoint(bounds,x6+width/2,y2+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):[],sideFromInsertionDirection=direction2=>{switch(direction2){case"from_left":case"from_x_neg":return"left";case"from_right":case"from_x_pos":return"right";case"from_top":case"from_y_pos":case"from_front":return"top";case"from_bottom":case"from_y_neg":case"from_back":return"bottom";case"from_above":case"from_z_pos":return"above";case"from_below":case"from_z_neg":return"below";default:return}},getInsertionDirection=component=>{if("insertion_direction"in component)return typeof component.insertion_direction=="string"?component.insertion_direction:void 0},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},inferredSide=Object.entries(sideMargins).sort((a6,b6)=>b6[1]-a6[1])[0]?.[0]??"bottom",side=sideFromInsertionDirection(getInsertionDirection(pcbComponent))??inferredSide,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==="above"||side==="below"?{x:centerX,y:centerY,side,pcbComponentId:pcbComponent.pcb_component_id}: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_dist2();init_dist5();var import_object_hash=__toESM(require_object_hash(),1),import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var t=Object.create,e4=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o5=Object.getOwnPropertyNames,i=Object.getPrototypeOf,r=Object.prototype.hasOwnProperty,s3=(t53,e6)=>function(){return e6||(0,t53[o5(t53)[0]])((e6={exports:{}}).exports,e6),e6.exports},a=(t53,n3)=>{for(var o6 in n3)e4(t53,o6,{get:n3[o6],enumerable:!0})},c=(s6,a6,c3)=>(c3=s6!=null?t(i(s6)):{},((t53,i6,s7,a7)=>{if(i6&&typeof i6=="object"||typeof i6=="function")for(let c4 of o5(i6))r.call(t53,c4)||c4===s7||e4(t53,c4,{get:()=>i6[c4],enumerable:!(a7=n(i6,c4))||a7.enumerable});return t53})(!a6&&s6&&s6.__esModule?c3:e4(c3,"default",{value:s6,enumerable:!0}),s6)),l=s3({"node_modules/is-buffer/index.js"(t53,e6){function n3(t54){return!!t54.constructor&&typeof t54.constructor.isBuffer=="function"&&t54.constructor.isBuffer(t54)}e6.exports=function(t54){return t54!=null&&(n3(t54)||(function(t55){return typeof t55.readFloatLE=="function"&&typeof t55.slice=="function"&&n3(t55.slice(0,0))})(t54)||!!t54._isBuffer)}}}),h=s3({"node_modules/kind-of/index.js"(t53,e6){var n3=l(),o6=Object.prototype.toString;e6.exports=function(t54){if(t54===void 0)return"undefined";if(t54===null)return"null";if(t54===!0||t54===!1||t54 instanceof Boolean)return"boolean";if(typeof t54=="string"||t54 instanceof String)return"string";if(typeof t54=="number"||t54 instanceof Number)return"number";if(typeof t54=="function"||t54 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t54))return"array";if(t54 instanceof RegExp)return"regexp";if(t54 instanceof Date)return"date";var e7=o6.call(t54);return e7==="[object RegExp]"?"regexp":e7==="[object Date]"?"date":e7==="[object Arguments]"?"arguments":e7==="[object Error]"?"error":n3(t54)?"buffer":e7==="[object Set]"?"set":e7==="[object WeakSet]"?"weakset":e7==="[object Map]"?"map":e7==="[object WeakMap]"?"weakmap":e7==="[object Symbol]"?"symbol":e7==="[object Int8Array]"?"int8array":e7==="[object Uint8Array]"?"uint8array":e7==="[object Uint8ClampedArray]"?"uint8clampedarray":e7==="[object Int16Array]"?"int16array":e7==="[object Uint16Array]"?"uint16array":e7==="[object Int32Array]"?"int32array":e7==="[object Uint32Array]"?"uint32array":e7==="[object Float32Array]"?"float32array":e7==="[object Float64Array]"?"float64array":"object"}}}),d=s3({"node_modules/rename-keys/index.js"(t53,e6){(function(){function t54(t55,e7){if(typeof e7!="function")return t55;var n3={};for(var o6 in t55)Object.prototype.hasOwnProperty.call(t55,o6)&&(n3[e7(o6,t55[o6])||o6]=t55[o6]);return n3}e6!==void 0&&e6.exports?e6.exports=t54:typeof define=="function"&&define.amd?define([],function(){return t54}):window.rename=t54})()}}),u3=s3({"node_modules/deep-rename-keys/index.js"(t53,e6){var n3=h(),o6=d();e6.exports=function t54(e7,i6){var r6=n3(e7);if(r6!=="object"&&r6!=="array")throw new Error("expected an object");var s6=[];for(var a6 in r6==="object"&&(e7=o6(e7,i6),s6={}),e7)if(e7.hasOwnProperty(a6)){var c3=e7[a6];n3(c3)==="object"||n3(c3)==="array"?s6[a6]=t54(c3,i6):s6[a6]=c3}return s6}}}),p=s3({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t53,e6){var n3=Object.prototype.hasOwnProperty,o6="~";function i6(){}function r6(t54,e7,n6){this.fn=t54,this.context=e7,this.once=n6||!1}function s6(){this._events=new i6,this._eventsCount=0}Object.create&&(i6.prototype=Object.create(null),new i6().__proto__||(o6=!1)),s6.prototype.eventNames=function(){var t54,e7,i7=[];if(this._eventsCount===0)return i7;for(e7 in t54=this._events)n3.call(t54,e7)&&i7.push(o6?e7.slice(1):e7);return Object.getOwnPropertySymbols?i7.concat(Object.getOwnPropertySymbols(t54)):i7},s6.prototype.listeners=function(t54,e7){var n6=o6?o6+t54:t54,i7=this._events[n6];if(e7)return!!i7;if(!i7)return[];if(i7.fn)return[i7.fn];for(var r10=0,s7=i7.length,a6=new Array(s7);r10<s7;r10++)a6[r10]=i7[r10].fn;return a6},s6.prototype.emit=function(t54,e7,n6,i7,r10,s7){var a6=o6?o6+t54:t54;if(!this._events[a6])return!1;var c3,l6,h3=this._events[a6],d3=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t54,h3.fn,void 0,!0),d3){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e7),!0;case 3:return h3.fn.call(h3.context,e7,n6),!0;case 4:return h3.fn.call(h3.context,e7,n6,i7),!0;case 5:return h3.fn.call(h3.context,e7,n6,i7,r10),!0;case 6:return h3.fn.call(h3.context,e7,n6,i7,r10,s7),!0}for(l6=1,c3=new Array(d3-1);l6<d3;l6++)c3[l6-1]=arguments[l6];h3.fn.apply(h3.context,c3)}else{var u6,p3=h3.length;for(l6=0;l6<p3;l6++)switch(h3[l6].once&&this.removeListener(t54,h3[l6].fn,void 0,!0),d3){case 1:h3[l6].fn.call(h3[l6].context);break;case 2:h3[l6].fn.call(h3[l6].context,e7);break;case 3:h3[l6].fn.call(h3[l6].context,e7,n6);break;case 4:h3[l6].fn.call(h3[l6].context,e7,n6,i7);break;default:if(!c3)for(u6=1,c3=new Array(d3-1);u6<d3;u6++)c3[u6-1]=arguments[u6];h3[l6].fn.apply(h3[l6].context,c3)}}return!0},s6.prototype.on=function(t54,e7,n6){var i7=new r6(e7,n6||this),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.once=function(t54,e7,n6){var i7=new r6(e7,n6||this,!0),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.removeListener=function(t54,e7,n6,r10){var s7=o6?o6+t54:t54;if(!this._events[s7])return this;if(!e7)return--this._eventsCount===0?this._events=new i6:delete this._events[s7],this;var a6=this._events[s7];if(a6.fn)a6.fn!==e7||r10&&!a6.once||n6&&a6.context!==n6||(--this._eventsCount===0?this._events=new i6:delete this._events[s7]);else{for(var c3=0,l6=[],h3=a6.length;c3<h3;c3++)(a6[c3].fn!==e7||r10&&!a6[c3].once||n6&&a6[c3].context!==n6)&&l6.push(a6[c3]);l6.length?this._events[s7]=l6.length===1?l6[0]:l6:--this._eventsCount===0?this._events=new i6:delete this._events[s7]}return this},s6.prototype.removeAllListeners=function(t54){var e7;return t54?(e7=o6?o6+t54:t54,this._events[e7]&&(--this._eventsCount===0?this._events=new i6:delete this._events[e7])):(this._events=new i6,this._eventsCount=0),this},s6.prototype.off=s6.prototype.removeListener,s6.prototype.addListener=s6.prototype.on,s6.prototype.setMaxListeners=function(){return this},s6.prefixed=o6,s6.EventEmitter=s6,e6!==void 0&&(e6.exports=s6)}}),m=s3({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t53,e6){var n3=Object.prototype.hasOwnProperty,o6="~";function i6(){}function r6(t54,e7,n6){this.fn=t54,this.context=e7,this.once=n6||!1}function s6(){this._events=new i6,this._eventsCount=0}Object.create&&(i6.prototype=Object.create(null),new i6().__proto__||(o6=!1)),s6.prototype.eventNames=function(){var t54,e7,i7=[];if(this._eventsCount===0)return i7;for(e7 in t54=this._events)n3.call(t54,e7)&&i7.push(o6?e7.slice(1):e7);return Object.getOwnPropertySymbols?i7.concat(Object.getOwnPropertySymbols(t54)):i7},s6.prototype.listeners=function(t54,e7){var n6=o6?o6+t54:t54,i7=this._events[n6];if(e7)return!!i7;if(!i7)return[];if(i7.fn)return[i7.fn];for(var r10=0,s7=i7.length,a6=new Array(s7);r10<s7;r10++)a6[r10]=i7[r10].fn;return a6},s6.prototype.emit=function(t54,e7,n6,i7,r10,s7){var a6=o6?o6+t54:t54;if(!this._events[a6])return!1;var c3,l6,h3=this._events[a6],d3=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t54,h3.fn,void 0,!0),d3){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e7),!0;case 3:return h3.fn.call(h3.context,e7,n6),!0;case 4:return h3.fn.call(h3.context,e7,n6,i7),!0;case 5:return h3.fn.call(h3.context,e7,n6,i7,r10),!0;case 6:return h3.fn.call(h3.context,e7,n6,i7,r10,s7),!0}for(l6=1,c3=new Array(d3-1);l6<d3;l6++)c3[l6-1]=arguments[l6];h3.fn.apply(h3.context,c3)}else{var u6,p3=h3.length;for(l6=0;l6<p3;l6++)switch(h3[l6].once&&this.removeListener(t54,h3[l6].fn,void 0,!0),d3){case 1:h3[l6].fn.call(h3[l6].context);break;case 2:h3[l6].fn.call(h3[l6].context,e7);break;case 3:h3[l6].fn.call(h3[l6].context,e7,n6);break;case 4:h3[l6].fn.call(h3[l6].context,e7,n6,i7);break;default:if(!c3)for(u6=1,c3=new Array(d3-1);u6<d3;u6++)c3[u6-1]=arguments[u6];h3[l6].fn.apply(h3[l6].context,c3)}}return!0},s6.prototype.on=function(t54,e7,n6){var i7=new r6(e7,n6||this),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.once=function(t54,e7,n6){var i7=new r6(e7,n6||this,!0),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.removeListener=function(t54,e7,n6,r10){var s7=o6?o6+t54:t54;if(!this._events[s7])return this;if(!e7)return--this._eventsCount===0?this._events=new i6:delete this._events[s7],this;var a6=this._events[s7];if(a6.fn)a6.fn!==e7||r10&&!a6.once||n6&&a6.context!==n6||(--this._eventsCount===0?this._events=new i6:delete this._events[s7]);else{for(var c3=0,l6=[],h3=a6.length;c3<h3;c3++)(a6[c3].fn!==e7||r10&&!a6[c3].once||n6&&a6[c3].context!==n6)&&l6.push(a6[c3]);l6.length?this._events[s7]=l6.length===1?l6[0]:l6:--this._eventsCount===0?this._events=new i6:delete this._events[s7]}return this},s6.prototype.removeAllListeners=function(t54){var e7;return t54?(e7=o6?o6+t54:t54,this._events[e7]&&(--this._eventsCount===0?this._events=new i6:delete this._events[e7])):(this._events=new i6,this._eventsCount=0),this},s6.prototype.off=s6.prototype.removeListener,s6.prototype.addListener=s6.prototype.on,s6.prototype.setMaxListeners=function(){return this},s6.prefixed=o6,s6.EventEmitter=s6,e6!==void 0&&(e6.exports=s6)}}),g3=s3({"node_modules/xml-lexer/dist/lexer.js"(t53,e6){function n3(t54,e7,n6){return e7 in t54?Object.defineProperty(t54,e7,{value:n6,enumerable:!0,configurable:!0,writable:!0}):t54[e7]=n6,t54}var o6=m(),i6=function(){},r6={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"},s6={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a6={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c3={" ":s6.space," ":s6.space,"\n":s6.space,"\r":s6.space,"<":s6.lt,">":s6.gt,'"':s6.quote,"'":s6.quote,"=":s6.equal,"/":s6.slash};e6.exports={State:r6,Action:s6,Type:a6,create:function(t54){var e7,l6,h3,d3,u6,p3,m6,g4,f2,y2;t54=Object.assign({debug:!1},t54);var _3=new o6,b6=r6.data,x6="",v6="",S3="",I5="",P3="",C4="",M6=function(e8,n6){if(v6[0]!=="?"&&v6[0]!=="!"){var o7={type:e8,value:n6};t54.debug&&console.log("emit:",o7),_3.emit("data",o7)}};_3.stateMachine=(n3(y2={},r6.data,(n3(e7={},s6.lt,function(){x6.trim()&&M6(a6.text,x6),v6="",P3=!1,b6=r6.tagBegin}),n3(e7,s6.char,function(t55){x6+=t55}),e7)),n3(y2,r6.cdata,n3({},s6.char,function(t55){(x6+=t55).substr(-3)==="]]>"&&(M6(a6.text,x6.slice(0,-3)),x6="",b6=r6.data)})),n3(y2,r6.tagBegin,(n3(l6={},s6.space,i6),n3(l6,s6.char,function(t55){v6=t55,b6=r6.tagName}),n3(l6,s6.slash,function(){v6="",P3=!0}),l6)),n3(y2,r6.tagName,(n3(h3={},s6.space,function(){P3?b6=r6.tagEnd:(b6=r6.attributeNameStart,M6(a6.openTag,v6))}),n3(h3,s6.gt,function(){M6(P3?a6.closeTag:a6.openTag,v6),x6="",b6=r6.data}),n3(h3,s6.slash,function(){b6=r6.tagEnd,M6(a6.openTag,v6)}),n3(h3,s6.char,function(t55){(v6+=t55)==="![CDATA["&&(b6=r6.cdata,x6="",v6="")}),h3)),n3(y2,r6.tagEnd,(n3(d3={},s6.gt,function(){M6(a6.closeTag,v6),x6="",b6=r6.data}),n3(d3,s6.char,i6),d3)),n3(y2,r6.attributeNameStart,(n3(u6={},s6.char,function(t55){S3=t55,b6=r6.attributeName}),n3(u6,s6.gt,function(){x6="",b6=r6.data}),n3(u6,s6.space,i6),n3(u6,s6.slash,function(){P3=!0,b6=r6.tagEnd}),u6)),n3(y2,r6.attributeName,(n3(p3={},s6.space,function(){b6=r6.attributeNameEnd}),n3(p3,s6.equal,function(){M6(a6.attributeName,S3),b6=r6.attributeValueBegin}),n3(p3,s6.gt,function(){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),x6="",b6=r6.data}),n3(p3,s6.slash,function(){P3=!0,I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),b6=r6.tagEnd}),n3(p3,s6.char,function(t55){S3+=t55}),p3)),n3(y2,r6.attributeNameEnd,(n3(m6={},s6.space,i6),n3(m6,s6.equal,function(){M6(a6.attributeName,S3),b6=r6.attributeValueBegin}),n3(m6,s6.gt,function(){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),x6="",b6=r6.data}),n3(m6,s6.char,function(t55){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),S3=t55,b6=r6.attributeName}),m6)),n3(y2,r6.attributeValueBegin,(n3(g4={},s6.space,i6),n3(g4,s6.quote,function(t55){C4=t55,I5="",b6=r6.attributeValue}),n3(g4,s6.gt,function(){M6(a6.attributeValue,I5=""),x6="",b6=r6.data}),n3(g4,s6.char,function(t55){C4="",I5=t55,b6=r6.attributeValue}),g4)),n3(y2,r6.attributeValue,(n3(f2={},s6.space,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),b6=r6.attributeNameStart)}),n3(f2,s6.quote,function(t55){C4===t55?(M6(a6.attributeValue,I5),b6=r6.attributeNameStart):I5+=t55}),n3(f2,s6.gt,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),x6="",b6=r6.data)}),n3(f2,s6.slash,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),P3=!0,b6=r6.tagEnd)}),n3(f2,s6.char,function(t55){I5+=t55}),f2)),y2);var N5=function(e8){t54.debug&&console.log(b6,e8);var n6=_3.stateMachine[b6],o7=n6[(function(t55){return c3[t55]||s6.char})(e8)]||n6[s6.error]||n6[s6.char];o7(e8)};return _3.write=function(t55){for(var e8=t55.length,n6=0;n6<e8;n6++)N5(t55[n6])},_3}}}}),f=s3({"node_modules/xml-reader/dist/reader.js"(t53,e6){var n3=p(),o6=g3(),i6=o6.Type,r6={element:"element",text:"text"},s6=function(t54){return Object.assign({name:"",type:r6.element,value:"",parent:null,attributes:{},children:[]},t54)},a6=function(t54){t54=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t54);var e7=void 0,a7=void 0,c3=void 0,l6=void 0,h3=new n3,d3=function(n6){switch(n6.type){case i6.openTag:if(c3===null)(c3=a7).name=n6.value;else{var o7=s6({name:n6.value,parent:c3});c3.children.push(o7),c3=o7}break;case i6.closeTag:var d4=c3.parent;if(t54.parentNodes||(c3.parent=null),c3.name!==n6.value)break;t54.stream&&d4===a7&&(a7.children=[],c3.parent=null),t54.emitTopLevelOnly&&d4!==a7||(h3.emit(t54.tagPrefix+c3.name,c3),h3.emit("tag",c3.name,c3)),c3===a7&&(e7.removeAllListeners("data"),h3.emit(t54.doneEvent,c3),a7=null),c3=d4;break;case i6.text:c3&&c3.children.push(s6({type:r6.text,value:n6.value,parent:t54.parentNodes?c3:null}));break;case i6.attributeName:l6=n6.value,c3.attributes[l6]="";break;case i6.attributeValue:c3.attributes[l6]=n6.value}};return h3.reset=function(){(e7=o6.create({debug:t54.debug})).on("data",d3),a7=s6(),c3=null,l6="",h3.parse=e7.write},h3.reset(),h3};e6.exports={parseSync:function(t54,e7){e7=Object.assign({},e7,{stream:!1,tagPrefix:":"});var n6=a6(e7),o7=void 0;return n6.on("done",function(t55){o7=t55}),n6.parse(t54),o7},create:a6,NodeType:r6}}}),y=s3({"node_modules/binary-search-bounds/search-bounds.js"(t53,e6){function n3(t54,e7,n6,o7,i7){for(var r10=i7+1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)>=0?(r10=s7,i7=s7-1):o7=s7+1}return r10}function o6(t54,e7,n6,o7,i7){for(var r10=i7+1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)>0?(r10=s7,i7=s7-1):o7=s7+1}return r10}function i6(t54,e7,n6,o7,i7){for(var r10=o7-1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)<0?(r10=s7,o7=s7+1):i7=s7-1}return r10}function r6(t54,e7,n6,o7,i7){for(var r10=o7-1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)<=0?(r10=s7,o7=s7+1):i7=s7-1}return r10}function s6(t54,e7,n6,o7,i7){for(;o7<=i7;){var r10=o7+i7>>>1,s7=t54[r10],a7=n6!==void 0?n6(s7,e7):s7-e7;if(a7===0)return r10;a7<=0?o7=r10+1:i7=r10-1}return-1}function a6(t54,e7,n6,o7,i7,r10){return typeof n6=="function"?r10(t54,e7,n6,o7===void 0?0:0|o7,i7===void 0?t54.length-1:0|i7):r10(t54,e7,void 0,n6===void 0?0:0|n6,o7===void 0?t54.length-1:0|o7)}e6.exports={ge:function(t54,e7,o7,i7,r10){return a6(t54,e7,o7,i7,r10,n3)},gt:function(t54,e7,n6,i7,r10){return a6(t54,e7,n6,i7,r10,o6)},lt:function(t54,e7,n6,o7,r10){return a6(t54,e7,n6,o7,r10,i6)},le:function(t54,e7,n6,o7,i7){return a6(t54,e7,n6,o7,i7,r6)},eq:function(t54,e7,n6,o7,i7){return a6(t54,e7,n6,o7,i7,s6)}}}}),_=s3({"node_modules/two-product/two-product.js"(t53,e6){e6.exports=function(t54,e7,o6){var i6=t54*e7,r6=n3*t54,s6=r6-(r6-t54),a6=t54-s6,c3=n3*e7,l6=c3-(c3-e7),h3=e7-l6,d3=a6*h3-(i6-s6*l6-a6*l6-s6*h3);return o6?(o6[0]=d3,o6[1]=i6,o6):[d3,i6]};var n3=+(Math.pow(2,27)+1)}}),b3=s3({"node_modules/robust-sum/robust-sum.js"(t53,e6){e6.exports=function(t54,e7){var n3=0|t54.length,o6=0|e7.length;if(n3===1&&o6===1)return(function(t55,e8){var n6=t55+e8,o7=n6-t55,i7=n6-o7,r10=e8-o7,s7=t55-i7,a7=s7+r10;return a7?[a7,n6]:[n6]})(t54[0],e7[0]);var i6,r6,s6=new Array(n3+o6),a6=0,c3=0,l6=0,h3=Math.abs,d3=t54[c3],u6=h3(d3),p3=e7[l6],m6=h3(p3);u6<m6?(r6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(r6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6]))),c3<n3&&u6<m6||l6>=o6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6])));for(var g4,f2,y2=i6+r6,_3=y2-i6,b6=r6-_3,x6=b6,v6=y2;c3<n3&&l6<o6;)u6<m6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6]))),(b6=(r6=x6)-(_3=(y2=i6+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4;for(;c3<n3;)(b6=(r6=x6)-(_3=(y2=(i6=d3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(c3+=1)<n3&&(d3=t54[c3]);for(;l6<o6;)(b6=(r6=x6)-(_3=(y2=(i6=p3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(l6+=1)<o6&&(p3=e7[l6]);return x6&&(s6[a6++]=x6),v6&&(s6[a6++]=v6),a6||(s6[a6++]=0),s6.length=a6,s6}}}),x3=s3({"node_modules/two-sum/two-sum.js"(t53,e6){e6.exports=function(t54,e7,n3){var o6=t54+e7,i6=o6-t54,r6=e7-i6,s6=t54-(o6-i6);return n3?(n3[0]=s6+r6,n3[1]=o6,n3):[s6+r6,o6]}}}),v3=s3({"node_modules/robust-scale/robust-scale.js"(t53,e6){var n3=_(),o6=x3();e6.exports=function(t54,e7){var i6=t54.length;if(i6===1){var r6=n3(t54[0],e7);return r6[0]?r6:[r6[1]]}var s6=new Array(2*i6),a6=[.1,.1],c3=[.1,.1],l6=0;n3(t54[0],e7,a6),a6[0]&&(s6[l6++]=a6[0]);for(var h3=1;h3<i6;++h3){n3(t54[h3],e7,c3);var d3=a6[1];o6(d3,c3[0],a6),a6[0]&&(s6[l6++]=a6[0]);var u6=c3[1],p3=a6[1],m6=u6+p3,g4=p3-(m6-u6);a6[1]=m6,g4&&(s6[l6++]=g4)}return a6[1]&&(s6[l6++]=a6[1]),l6===0&&(s6[l6++]=0),s6.length=l6,s6}}}),S2=s3({"node_modules/robust-subtract/robust-diff.js"(t53,e6){e6.exports=function(t54,e7){var n3=0|t54.length,o6=0|e7.length;if(n3===1&&o6===1)return(function(t55,e8){var n6=t55+e8,o7=n6-t55,i7=n6-o7,r10=e8-o7,s7=t55-i7,a7=s7+r10;return a7?[a7,n6]:[n6]})(t54[0],-e7[0]);var i6,r6,s6=new Array(n3+o6),a6=0,c3=0,l6=0,h3=Math.abs,d3=t54[c3],u6=h3(d3),p3=-e7[l6],m6=h3(p3);u6<m6?(r6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(r6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6]))),c3<n3&&u6<m6||l6>=o6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6])));for(var g4,f2,y2=i6+r6,_3=y2-i6,b6=r6-_3,x6=b6,v6=y2;c3<n3&&l6<o6;)u6<m6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6]))),(b6=(r6=x6)-(_3=(y2=i6+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4;for(;c3<n3;)(b6=(r6=x6)-(_3=(y2=(i6=d3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(c3+=1)<n3&&(d3=t54[c3]);for(;l6<o6;)(b6=(r6=x6)-(_3=(y2=(i6=p3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(l6+=1)<o6&&(p3=-e7[l6]);return x6&&(s6[a6++]=x6),v6&&(s6[a6++]=v6),a6||(s6[a6++]=0),s6.length=a6,s6}}}),I3=s3({"node_modules/robust-orientation/orientation.js"(t53,e6){var n3=_(),o6=b3(),i6=v3(),r6=S2();function s6(t54,e7,n6,o7){return function(n7,i7,r10){var s7=t54(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),t54(e7(n7[1],i7[0]),e7(-i7[1],n7[0]))),a7=t54(e7(n7[1],r10[0]),e7(-r10[1],n7[0])),c4=o7(s7,a7);return c4[c4.length-1]}}function a6(t54,e7,n6,o7){return function(i7,r10,s7,a7){var c4=t54(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2])))),l7=t54(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2])))),h4=o7(c4,l7);return h4[h4.length-1]}}function c3(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4){var l7=t54(t54(t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),s7[2]),t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),-a7[2]),n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),c4[2]))),r10[3]),t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-a7[2]),n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),c4[2]))),-s7[3]),n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),c4[2]))),a7[3]))),t54(n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),-c4[3]),t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-a7[2]),n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-a7[2]),n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),c4[2]))),-r10[3])))),t54(t54(n6(t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),c4[2]))),a7[3]),t54(n6(t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2]))),-c4[3]),n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),i7[3]))),t54(n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),-r10[3]),t54(n6(t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2]))),s7[3]),n6(t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2]))),-a7[3]))))),h4=t54(t54(t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),s7[2]),t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),-a7[2]),n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-a7[2]),n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),c4[2]))),-s7[3])),t54(n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),c4[2]))),a7[3]),n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),-c4[3]))),t54(t54(n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),c4[2]))),-r10[3])),t54(n6(t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),c4[2]))),s7[3]),n6(t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2]))),-c4[3])))),d4=o7(l7,h4);return d4[d4.length-1]}}function l6(t54){return(t54===3?s6:t54===4?a6:c3)(o6,n3,i6,r6)}var h3=l6(3),d3=l6(4),u6=[function(){return 0},function(){return 0},function(t54,e7){return e7[0]-t54[0]},function(t54,e7,n6){var o7,i7=(t54[1]-n6[1])*(e7[0]-n6[0]),r10=(t54[0]-n6[0])*(e7[1]-n6[1]),s7=i7-r10;if(i7>0){if(r10<=0)return s7;o7=i7+r10}else{if(!(i7<0)||r10>=0)return s7;o7=-(i7+r10)}var a7=33306690738754716e-32*o7;return s7>=a7||s7<=-a7?s7:h3(t54,e7,n6)},function(t54,e7,n6,o7){var i7=t54[0]-o7[0],r10=e7[0]-o7[0],s7=n6[0]-o7[0],a7=t54[1]-o7[1],c4=e7[1]-o7[1],l7=n6[1]-o7[1],h4=t54[2]-o7[2],u7=e7[2]-o7[2],p6=n6[2]-o7[2],m7=r10*l7,g4=s7*c4,f2=s7*a7,y2=i7*l7,_3=i7*c4,b6=r10*a7,x6=h4*(m7-g4)+u7*(f2-y2)+p6*(_3-b6),v6=7771561172376103e-31*((Math.abs(m7)+Math.abs(g4))*Math.abs(h4)+(Math.abs(f2)+Math.abs(y2))*Math.abs(u7)+(Math.abs(_3)+Math.abs(b6))*Math.abs(p6));return x6>v6||-x6>v6?x6:d3(t54,e7,n6,o7)}];function p3(t54){var e7=u6[t54.length];return e7||(e7=u6[t54.length]=l6(t54.length)),e7.apply(void 0,t54)}function m6(t54,e7,n6,o7,i7,r10,s7){return function(e8,n7,a7,c4,l7){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e8,n7);case 3:return i7(e8,n7,a7);case 4:return r10(e8,n7,a7,c4);case 5:return s7(e8,n7,a7,c4,l7)}for(var h4=new Array(arguments.length),d4=0;d4<arguments.length;++d4)h4[d4]=arguments[d4];return t54(h4)}}(function(){for(;u6.length<=5;)u6.push(l6(u6.length));e6.exports=m6.apply(void 0,[p3].concat(u6));for(var t54=0;t54<=5;++t54)e6.exports[t54]=u6[t54]})()}}),P2=s3({"node_modules/cdt2d/lib/monotone.js"(t53,e6){var n3=y(),o6=I3()[3];function i6(t54,e7,n6,o7,i7){this.a=t54,this.b=e7,this.idx=n6,this.lowerIds=o7,this.upperIds=i7}function r6(t54,e7,n6,o7){this.a=t54,this.b=e7,this.type=n6,this.idx=o7}function s6(t54,e7){var n6=t54.a[0]-e7.a[0]||t54.a[1]-e7.a[1]||t54.type-e7.type;return n6||(t54.type!==0&&(n6=o6(t54.a,t54.b,e7.b))?n6:t54.idx-e7.idx)}function a6(t54,e7){return o6(t54.a,t54.b,e7)}function c3(t54,e7,i7,r10,s7){for(var c4=n3.lt(e7,r10,a6),l7=n3.gt(e7,r10,a6),h4=c4;h4<l7;++h4){for(var d4=e7[h4],u6=d4.lowerIds,p3=u6.length;p3>1&&o6(i7[u6[p3-2]],i7[u6[p3-1]],r10)>0;)t54.push([u6[p3-1],u6[p3-2],s7]),p3-=1;u6.length=p3,u6.push(s7);var m6=d4.upperIds;for(p3=m6.length;p3>1&&o6(i7[m6[p3-2]],i7[m6[p3-1]],r10)<0;)t54.push([m6[p3-2],m6[p3-1],s7]),p3-=1;m6.length=p3,m6.push(s7)}}function l6(t54,e7){var n6;return(n6=t54.a[0]<e7.a[0]?o6(t54.a,t54.b,e7.a):o6(e7.b,e7.a,t54.a))?n6:(n6=e7.b[0]<t54.b[0]?o6(t54.a,t54.b,e7.b):o6(e7.b,e7.a,t54.b))||t54.idx-e7.idx}function h3(t54,e7,o7){var r10=n3.le(t54,o7,l6),s7=t54[r10],a7=s7.upperIds,c4=a7[a7.length-1];s7.upperIds=[c4],t54.splice(r10+1,0,new i6(o7.a,o7.b,o7.idx,[c4],a7))}function d3(t54,e7,o7){var i7=o7.a;o7.a=o7.b,o7.b=i7;var r10=n3.eq(t54,o7,l6),s7=t54[r10];t54[r10-1].upperIds=s7.upperIds,t54.splice(r10,1)}e6.exports=function(t54,e7){for(var n6=t54.length,o7=e7.length,a7=[],l7=0;l7<n6;++l7)a7.push(new r6(t54[l7],null,0,l7));for(l7=0;l7<o7;++l7){var u6=e7[l7],p3=t54[u6[0]],m6=t54[u6[1]];p3[0]<m6[0]?a7.push(new r6(p3,m6,2,l7),new r6(m6,p3,1,l7)):p3[0]>m6[0]&&a7.push(new r6(m6,p3,2,l7),new r6(p3,m6,1,l7))}a7.sort(s6);for(var g4=a7[0].a[0]-(1+Math.abs(a7[0].a[0]))*Math.pow(2,-52),f2=[new i6([g4,1],[g4,0],-1,[],[],[],[])],y2=[],_3=(l7=0,a7.length);l7<_3;++l7){var b6=a7[l7],x6=b6.type;x6===0?c3(y2,f2,t54,b6.a,b6.idx):x6===2?h3(f2,t54,b6):d3(f2,t54,b6)}return y2}}}),C3=s3({"node_modules/cdt2d/lib/triangulation.js"(t53,e6){var n3=y();function o6(t54,e7){this.stars=t54,this.edges=e7}e6.exports=function(t54,e7){for(var n6=new Array(t54),i7=0;i7<t54;++i7)n6[i7]=[];return new o6(n6,e7)};var i6=o6.prototype;function r6(t54,e7,n6){for(var o7=1,i7=t54.length;o7<i7;o7+=2)if(t54[o7-1]===e7&&t54[o7]===n6)return t54[o7-1]=t54[i7-2],t54[o7]=t54[i7-1],void(t54.length=i7-2)}i6.isConstraint=(function(){var t54=[0,0];function e7(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]}return function(o7,i7){return t54[0]=Math.min(o7,i7),t54[1]=Math.max(o7,i7),n3.eq(this.edges,t54,e7)>=0}})(),i6.removeTriangle=function(t54,e7,n6){var o7=this.stars;r6(o7[t54],e7,n6),r6(o7[e7],n6,t54),r6(o7[n6],t54,e7)},i6.addTriangle=function(t54,e7,n6){var o7=this.stars;o7[t54].push(e7,n6),o7[e7].push(n6,t54),o7[n6].push(t54,e7)},i6.opposite=function(t54,e7){for(var n6=this.stars[e7],o7=1,i7=n6.length;o7<i7;o7+=2)if(n6[o7]===t54)return n6[o7-1];return-1},i6.flip=function(t54,e7){var n6=this.opposite(t54,e7),o7=this.opposite(e7,t54);this.removeTriangle(t54,e7,n6),this.removeTriangle(e7,t54,o7),this.addTriangle(t54,o7,n6),this.addTriangle(e7,n6,o7)},i6.edges=function(){for(var t54=this.stars,e7=[],n6=0,o7=t54.length;n6<o7;++n6)for(var i7=t54[n6],r10=0,s6=i7.length;r10<s6;r10+=2)e7.push([i7[r10],i7[r10+1]]);return e7},i6.cells=function(){for(var t54=this.stars,e7=[],n6=0,o7=t54.length;n6<o7;++n6)for(var i7=t54[n6],r10=0,s6=i7.length;r10<s6;r10+=2){var a6=i7[r10],c3=i7[r10+1];n6<Math.min(a6,c3)&&e7.push([n6,a6,c3])}return e7}}}),M3=s3({"node_modules/robust-in-sphere/in-sphere.js"(t53,e6){var n3=_(),o6=b3(),i6=S2(),r6=v3();function s6(t54){return(t54===3?a6:t54===4?c3:t54===5?l6:h3)(o6,i6,n3,r6)}function a6(t54,e7,n6,o7){return function(i7,r10,s7){var a7=n6(i7[0],i7[0]),c4=o7(a7,r10[0]),l7=o7(a7,s7[0]),h4=n6(r10[0],r10[0]),d4=o7(h4,i7[0]),u7=o7(h4,s7[0]),p6=n6(s7[0],s7[0]),m6=o7(p6,i7[0]),g4=o7(p6,r10[0]),f2=t54(e7(g4,u7),e7(d4,c4)),y2=e7(m6,l7),_3=e7(f2,y2);return _3[_3.length-1]}}function c3(t54,e7,n6,o7){return function(i7,r10,s7,a7){var c4=t54(n6(i7[0],i7[0]),n6(i7[1],i7[1])),l7=o7(c4,r10[0]),h4=o7(c4,s7[0]),d4=o7(c4,a7[0]),u7=t54(n6(r10[0],r10[0]),n6(r10[1],r10[1])),p6=o7(u7,i7[0]),m6=o7(u7,s7[0]),g4=o7(u7,a7[0]),f2=t54(n6(s7[0],s7[0]),n6(s7[1],s7[1])),y2=o7(f2,i7[0]),_3=o7(f2,r10[0]),b6=o7(f2,a7[0]),x6=t54(n6(a7[0],a7[0]),n6(a7[1],a7[1])),v6=o7(x6,i7[0]),S3=o7(x6,r10[0]),I5=o7(x6,s7[0]),P3=t54(t54(o7(e7(I5,b6),r10[1]),t54(o7(e7(S3,g4),-s7[1]),o7(e7(_3,m6),a7[1]))),t54(o7(e7(S3,g4),i7[1]),t54(o7(e7(v6,d4),-r10[1]),o7(e7(p6,l7),a7[1])))),C4=t54(t54(o7(e7(I5,b6),i7[1]),t54(o7(e7(v6,d4),-s7[1]),o7(e7(y2,h4),a7[1]))),t54(o7(e7(_3,m6),i7[1]),t54(o7(e7(y2,h4),-r10[1]),o7(e7(p6,l7),s7[1])))),M6=e7(P3,C4);return M6[M6.length-1]}}function l6(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4){var l7=t54(n6(i7[0],i7[0]),t54(n6(i7[1],i7[1]),n6(i7[2],i7[2]))),h4=o7(l7,r10[0]),d4=o7(l7,s7[0]),u7=o7(l7,a7[0]),p6=o7(l7,c4[0]),m6=t54(n6(r10[0],r10[0]),t54(n6(r10[1],r10[1]),n6(r10[2],r10[2]))),g4=o7(m6,i7[0]),f2=o7(m6,s7[0]),y2=o7(m6,a7[0]),_3=o7(m6,c4[0]),b6=t54(n6(s7[0],s7[0]),t54(n6(s7[1],s7[1]),n6(s7[2],s7[2]))),x6=o7(b6,i7[0]),v6=o7(b6,r10[0]),S3=o7(b6,a7[0]),I5=o7(b6,c4[0]),P3=t54(n6(a7[0],a7[0]),t54(n6(a7[1],a7[1]),n6(a7[2],a7[2]))),C4=o7(P3,i7[0]),M6=o7(P3,r10[0]),N5=o7(P3,s7[0]),w3=o7(P3,c4[0]),T6=t54(n6(c4[0],c4[0]),t54(n6(c4[1],c4[1]),n6(c4[2],c4[2]))),R3=o7(T6,i7[0]),E7=o7(T6,r10[0]),A4=o7(T6,s7[0]),O6=o7(T6,a7[0]),L5=t54(t54(t54(o7(t54(o7(e7(O6,w3),s7[1]),t54(o7(e7(A4,I5),-a7[1]),o7(e7(N5,S3),c4[1]))),r10[2]),t54(o7(t54(o7(e7(O6,w3),r10[1]),t54(o7(e7(E7,_3),-a7[1]),o7(e7(M6,y2),c4[1]))),-s7[2]),o7(t54(o7(e7(A4,I5),r10[1]),t54(o7(e7(E7,_3),-s7[1]),o7(e7(v6,f2),c4[1]))),a7[2]))),t54(o7(t54(o7(e7(N5,S3),r10[1]),t54(o7(e7(M6,y2),-s7[1]),o7(e7(v6,f2),a7[1]))),-c4[2]),t54(o7(t54(o7(e7(O6,w3),r10[1]),t54(o7(e7(E7,_3),-a7[1]),o7(e7(M6,y2),c4[1]))),i7[2]),o7(t54(o7(e7(O6,w3),i7[1]),t54(o7(e7(R3,p6),-a7[1]),o7(e7(C4,u7),c4[1]))),-r10[2])))),t54(t54(o7(t54(o7(e7(E7,_3),i7[1]),t54(o7(e7(R3,p6),-r10[1]),o7(e7(g4,h4),c4[1]))),a7[2]),t54(o7(t54(o7(e7(M6,y2),i7[1]),t54(o7(e7(C4,u7),-r10[1]),o7(e7(g4,h4),a7[1]))),-c4[2]),o7(t54(o7(e7(N5,S3),r10[1]),t54(o7(e7(M6,y2),-s7[1]),o7(e7(v6,f2),a7[1]))),i7[2]))),t54(o7(t54(o7(e7(N5,S3),i7[1]),t54(o7(e7(C4,u7),-s7[1]),o7(e7(x6,d4),a7[1]))),-r10[2]),t54(o7(t54(o7(e7(M6,y2),i7[1]),t54(o7(e7(C4,u7),-r10[1]),o7(e7(g4,h4),a7[1]))),s7[2]),o7(t54(o7(e7(v6,f2),i7[1]),t54(o7(e7(x6,d4),-r10[1]),o7(e7(g4,h4),s7[1]))),-a7[2]))))),D5=t54(t54(t54(o7(t54(o7(e7(O6,w3),s7[1]),t54(o7(e7(A4,I5),-a7[1]),o7(e7(N5,S3),c4[1]))),i7[2]),o7(t54(o7(e7(O6,w3),i7[1]),t54(o7(e7(R3,p6),-a7[1]),o7(e7(C4,u7),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(A4,I5),i7[1]),t54(o7(e7(R3,p6),-s7[1]),o7(e7(x6,d4),c4[1]))),a7[2]),o7(t54(o7(e7(N5,S3),i7[1]),t54(o7(e7(C4,u7),-s7[1]),o7(e7(x6,d4),a7[1]))),-c4[2]))),t54(t54(o7(t54(o7(e7(A4,I5),r10[1]),t54(o7(e7(E7,_3),-s7[1]),o7(e7(v6,f2),c4[1]))),i7[2]),o7(t54(o7(e7(A4,I5),i7[1]),t54(o7(e7(R3,p6),-s7[1]),o7(e7(x6,d4),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(E7,_3),i7[1]),t54(o7(e7(R3,p6),-r10[1]),o7(e7(g4,h4),c4[1]))),s7[2]),o7(t54(o7(e7(v6,f2),i7[1]),t54(o7(e7(x6,d4),-r10[1]),o7(e7(g4,h4),s7[1]))),-c4[2])))),k7=e7(L5,D5);return k7[k7.length-1]}}function h3(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4,l7){var h4=t54(t54(n6(i7[0],i7[0]),n6(i7[1],i7[1])),t54(n6(i7[2],i7[2]),n6(i7[3],i7[3]))),d4=o7(h4,r10[0]),u7=o7(h4,s7[0]),p6=o7(h4,a7[0]),m6=o7(h4,c4[0]),g4=o7(h4,l7[0]),f2=t54(t54(n6(r10[0],r10[0]),n6(r10[1],r10[1])),t54(n6(r10[2],r10[2]),n6(r10[3],r10[3]))),y2=o7(f2,i7[0]),_3=o7(f2,s7[0]),b6=o7(f2,a7[0]),x6=o7(f2,c4[0]),v6=o7(f2,l7[0]),S3=t54(t54(n6(s7[0],s7[0]),n6(s7[1],s7[1])),t54(n6(s7[2],s7[2]),n6(s7[3],s7[3]))),I5=o7(S3,i7[0]),P3=o7(S3,r10[0]),C4=o7(S3,a7[0]),M6=o7(S3,c4[0]),N5=o7(S3,l7[0]),w3=t54(t54(n6(a7[0],a7[0]),n6(a7[1],a7[1])),t54(n6(a7[2],a7[2]),n6(a7[3],a7[3]))),T6=o7(w3,i7[0]),R3=o7(w3,r10[0]),E7=o7(w3,s7[0]),A4=o7(w3,c4[0]),O6=o7(w3,l7[0]),L5=t54(t54(n6(c4[0],c4[0]),n6(c4[1],c4[1])),t54(n6(c4[2],c4[2]),n6(c4[3],c4[3]))),D5=o7(L5,i7[0]),k7=o7(L5,r10[0]),z6=o7(L5,s7[0]),F6=o7(L5,a7[0]),B4=o7(L5,l7[0]),$3=t54(t54(n6(l7[0],l7[0]),n6(l7[1],l7[1])),t54(n6(l7[2],l7[2]),n6(l7[3],l7[3]))),j6=o7($3,i7[0]),Y6=o7($3,r10[0]),X6=o7($3,s7[0]),W5=o7($3,a7[0]),H3=o7($3,c4[0]),V6=t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),s7[2]),o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),-l7[2]))),r10[3]),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-l7[2]))),-s7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),-l7[2]))),a7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),r10[2]),o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-l7[2]))),-c4[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),r10[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-c4[2]))),l7[3])),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-l7[2]))),i7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-l7[2]))),-r10[3])))),t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),c4[2]),o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),-l7[2]))),a7[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-l7[2]))),-c4[3])),t54(o7(t54(t54(o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-c4[2]))),l7[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),r10[2]),o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-l7[2]))),i7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-l7[2]))),-r10[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-l7[2]))),s7[3])),t54(o7(t54(t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),i7[2]),o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-l7[2]))),-a7[3]),o7(t54(t54(o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),i7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-r10[2])),t54(o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-a7[2]))),l7[3]))))),G3=t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),s7[2]),o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),-l7[2]))),i7[3]),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-l7[2]))),-s7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-l7[2]))),a7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-l7[2]))),-c4[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-c4[2]))),l7[3])),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),-l7[2]))),i7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-l7[2]))),-r10[3])))),t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),c4[2]),o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),-l7[2]))),s7[3]),o7(t54(t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),i7[2]),o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-l7[2]))),-c4[3])),t54(o7(t54(t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),i7[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-c4[2]))),l7[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),r10[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-c4[2]))),i7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-c4[2]))),-r10[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-c4[2]))),s7[3])),t54(o7(t54(t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),i7[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-c4[2]))),-a7[3]),o7(t54(t54(o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),i7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-r10[2])),t54(o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-a7[2]))),c4[3]))))),U3=e7(V6,G3);return U3[U3.length-1]}}var d3=[function(){return 0},function(){return 0},function(){return 0}];function u6(t54){var e7=d3[t54.length];return e7||(e7=d3[t54.length]=s6(t54.length)),e7.apply(void 0,t54)}function p3(t54,e7,n6,o7,i7,r10,s7,a7){return function(e8,n7,c4,l7,h4,d4){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e8,n7);case 3:return i7(e8,n7,c4);case 4:return r10(e8,n7,c4,l7);case 5:return s7(e8,n7,c4,l7,h4);case 6:return a7(e8,n7,c4,l7,h4,d4)}for(var u7=new Array(arguments.length),p6=0;p6<arguments.length;++p6)u7[p6]=arguments[p6];return t54(u7)}}(function(){for(;d3.length<=6;)d3.push(s6(d3.length));e6.exports=p3.apply(void 0,[u6].concat(d3));for(var t54=0;t54<=6;++t54)e6.exports[t54]=d3[t54]})()}}),N3=s3({"node_modules/cdt2d/lib/delaunay.js"(t53,e6){var n3=M3()[4];y();function o6(t54,e7,o7,i6,r6,s6){var a6=e7.opposite(i6,r6);if(!(a6<0)){if(r6<i6){var c3=i6;i6=r6,r6=c3,c3=s6,s6=a6,a6=c3}e7.isConstraint(i6,r6)||n3(t54[i6],t54[r6],t54[s6],t54[a6])<0&&o7.push(i6,r6)}}e6.exports=function(t54,e7){for(var i6=[],r6=t54.length,s6=e7.stars,a6=0;a6<r6;++a6)for(var c3=s6[a6],l6=1;l6<c3.length;l6+=2)if(!((p3=c3[l6])<a6)&&!e7.isConstraint(a6,p3)){for(var h3=c3[l6-1],d3=-1,u6=1;u6<c3.length;u6+=2)if(c3[u6-1]===p3){d3=c3[u6];break}d3<0||n3(t54[a6],t54[p3],t54[h3],t54[d3])<0&&i6.push(a6,p3)}for(;i6.length>0;){for(var p3=i6.pop(),m6=(h3=-1,d3=-1,c3=s6[a6=i6.pop()],1);m6<c3.length;m6+=2){var g4=c3[m6-1],f2=c3[m6];g4===p3?d3=f2:f2===p3&&(h3=g4)}h3<0||d3<0||n3(t54[a6],t54[p3],t54[h3],t54[d3])>=0||(e7.flip(a6,p3),o6(t54,e7,i6,h3,a6,d3),o6(t54,e7,i6,a6,d3,h3),o6(t54,e7,i6,d3,p3,h3),o6(t54,e7,i6,p3,h3,d3))}}}}),w2=s3({"node_modules/cdt2d/lib/filter.js"(t53,e6){var n3=y();function o6(t54,e7,n6,o7,i7,r6,s6){this.cells=t54,this.neighbor=e7,this.flags=o7,this.constraint=n6,this.active=i7,this.next=r6,this.boundary=s6}function i6(t54,e7){return t54[0]-e7[0]||t54[1]-e7[1]||t54[2]-e7[2]}e6.exports=function(t54,e7,n6){var r6=(function(t55,e8){for(var n7=t55.cells(),r10=n7.length,s7=0;s7<r10;++s7){var a7=(y6=n7[s7])[0],c4=y6[1],l7=y6[2];c4<l7?c4<a7&&(y6[0]=c4,y6[1]=l7,y6[2]=a7):l7<a7&&(y6[0]=l7,y6[1]=a7,y6[2]=c4)}n7.sort(i6);var h4=new Array(r10);for(s7=0;s7<h4.length;++s7)h4[s7]=0;var d4=[],u7=[],p6=new Array(3*r10),m7=new Array(3*r10),g6=null;e8&&(g6=[]);var f3=new o6(n7,p6,m7,h4,d4,u7,g6);for(s7=0;s7<r10;++s7)for(var y6=n7[s7],_3=0;_3<3;++_3){a7=y6[_3],c4=y6[(_3+1)%3];var b6=p6[3*s7+_3]=f3.locate(c4,a7,t55.opposite(c4,a7)),x6=m7[3*s7+_3]=t55.isConstraint(a7,c4);b6<0&&(x6?u7.push(s7):(d4.push(s7),h4[s7]=1),e8&&g6.push([c4,a7,-1]))}return f3})(t54,n6);if(e7===0)return n6?r6.cells.concat(r6.boundary):r6.cells;for(var s6=1,a6=r6.active,c3=r6.next,l6=r6.flags,h3=r6.cells,d3=r6.constraint,u6=r6.neighbor;a6.length>0||c3.length>0;){for(;a6.length>0;){var p3=a6.pop();if(l6[p3]!==-s6){l6[p3]=s6,h3[p3];for(var m6=0;m6<3;++m6){var g4=u6[3*p3+m6];g4>=0&&l6[g4]===0&&(d3[3*p3+m6]?c3.push(g4):(a6.push(g4),l6[g4]=s6))}}}var f2=c3;c3=a6,a6=f2,c3.length=0,s6=-s6}var y2=(function(t55,e8,n7){for(var o7=0,i7=0;i7<t55.length;++i7)e8[i7]===n7&&(t55[o7++]=t55[i7]);return t55.length=o7,t55})(h3,l6,e7);return n6?y2.concat(r6.boundary):y2},o6.prototype.locate=(function(){var t54=[0,0,0];return function(e7,o7,r6){var s6=e7,a6=o7,c3=r6;return o7<r6?o7<e7&&(s6=o7,a6=r6,c3=e7):r6<e7&&(s6=r6,a6=e7,c3=o7),s6<0?-1:(t54[0]=s6,t54[1]=a6,t54[2]=c3,n3.eq(this.cells,t54,i6))}})()}}),T3=s3({"node_modules/cdt2d/cdt2d.js"(t53,e6){var n3=P2(),o6=C3(),i6=N3(),r6=w2();function s6(t54){return[Math.min(t54[0],t54[1]),Math.max(t54[0],t54[1])]}function a6(t54,e7){return t54[0]-e7[0]||t54[1]-e7[1]}function c3(t54,e7,n6){return e7 in t54?t54[e7]:n6}e6.exports=function(t54,e7,l6){Array.isArray(e7)?(l6=l6||{},e7=e7||[]):(l6=e7||{},e7=[]);var h3=!!c3(l6,"delaunay",!0),d3=!!c3(l6,"interior",!0),u6=!!c3(l6,"exterior",!0),p3=!!c3(l6,"infinity",!1);if(!d3&&!u6||t54.length===0)return[];var m6=n3(t54,e7);if(h3||d3!==u6||p3){for(var g4=o6(t54.length,(function(t55){return t55.map(s6).sort(a6)})(e7)),f2=0;f2<m6.length;++f2){var y2=m6[f2];g4.addTriangle(y2[0],y2[1],y2[2])}return h3&&i6(t54,g4),u6?d3?p3?r6(g4,0,p3):g4.cells():r6(g4,1,p3):r6(g4,-1)}return m6}}});function R(t53,e6){return Array.isArray(e6)?[t53.a*e6[0]+t53.c*e6[1]+t53.e,t53.b*e6[0]+t53.d*e6[1]+t53.f]:{x:t53.a*e6.x+t53.c*e6.y+t53.e,y:t53.b*e6.x+t53.d*e6.y+t53.f}}function E6(t53,e6=0){return{a:1,c:0,e:t53,b:0,d:1,f:e6}}var{cos:A3,sin:O3,PI:L3}=Math,{tan:D3}=Math,k6=(c(u3()),c(f()),new TextEncoder,(()=>{let t53=new Uint8Array(4);new Uint32Array(t53.buffer)[0]=1,t53[0]})(),globalThis.Int8Array,globalThis.Uint8Array,globalThis.Int16Array,globalThis.Uint16Array,globalThis.Int32Array,globalThis.Uint32Array,globalThis.BigUint64Array,globalThis.BigInt64Array,globalThis.Float32Array,globalThis.Float64Array,[]);for(let t53=0;t53<256;t53++){let e6=t53;for(let t54=0;t54<8;t54++)1&e6?e6=3988292384^e6>>>1:e6>>>=1;k6[t53]=e6}var z3=new Uint16Array([255]),F3=(new Uint8Array(z3.buffer)[0],new Uint16Array([255]));new Uint8Array(F3.buffer)[0],new Uint8Array(0),Uint8Array.of(137,80,78,71,13,10,26,10),new TextDecoder("latin1");function B3(){return B3=Object.assign?Object.assign.bind():function(t53){for(var e6=1;e6<arguments.length;e6++){var n3=arguments[e6];for(var o6 in n3)({}).hasOwnProperty.call(n3,o6)&&(t53[o6]=n3[o6])}return t53},B3.apply(null,arguments)}function $2(t53,e6){return($2=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t54,e7){return t54.__proto__=e7,t54})(t53,e6)}function j3(t53){return(j3=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t54){return t54.__proto__||Object.getPrototypeOf(t54)})(t53)}function Y3(){try{var t53=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Y3=function(){return!!t53})()}function X3(t53){var e6=typeof Map=="function"?new Map:void 0;return X3=function(t54){if(t54===null||!(function(t55){try{return Function.toString.call(t55).indexOf("[native code]")!==-1}catch{return typeof t55=="function"}})(t54))return t54;if(typeof t54!="function")throw new TypeError("Super expression must either be null or a function");if(e6!==void 0){if(e6.has(t54))return e6.get(t54);e6.set(t54,n3)}function n3(){return(function(t55,e7,n6){if(Y3())return Reflect.construct.apply(null,arguments);var o6=[null];o6.push.apply(o6,e7);var i6=new(t55.bind.apply(t55,o6));return n6&&$2(i6,n6.prototype),i6})(t54,arguments,j3(this).constructor)}return n3.prototype=Object.create(t54.prototype,{constructor:{value:n3,enumerable:!1,writable:!0,configurable:!0}}),$2(n3,t54)},X3(t53)}var W3={1:`Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).
|
|
323
|
+
`)?.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;var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.822",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","run-sample":"bun scripts/run-sample.ts","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","@tsci/seveibar.dataset-srj13":"git+https://github.com/tscircuit/dataset-srj13.git#56db70039aeb28a76540fe951b5a96be60f9e949","@tsci/dataset-srj23-partially-routed-subcircuits":"git+https://github.com/tscircuit/dataset-srj23-partially-routed-subcircuits.git#53fc559","@tsci/tscircuit.dataset-srj16-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj16-bga-breakouts.git#e8b2e70e1f50a0dba3ad977e140766f53b9b75fb","@tsci/tscircuit.dataset-srj19-bga-passive-overlays":"git+https://github.com/tscircuit/dataset-srj19.git#5104d03ed72a9090d76ea1f42ae9f4bc439f7534","@tsci/tscircuit.dataset-srj20-partial-bga-breakouts":"git+https://github.com/tscircuit/dataset-srj20.git#9384fb8f45fb479b97178ddfa42fc74c69afbbec","@tsci/0hmX.multi-component-dataset-srj01":"git+https://github.com/tscircuit/multi-component-dataset-srj01.git#abf9d17c966d466b56ac21b735c6bb6f4518919d","@tsci/tscircuit.dataset-srj12-bus-routing":"git+https://github.com/tscircuit/dataset-srj12-bus-routing.git#ba82f86a7d1288566b7144eb8661ad2549c5f328","@tscircuit/autorouting-dataset-01":"git+https://github.com/tscircuit/autorouting-dataset-01.git#b97f5052a2359ab2da3f186765c6a5e839535efb","@tscircuit/checks":"^0.0.163","@tscircuit/circuit-json-util":"^0.0.94","@tscircuit/core":"0.0.337","@tscircuit/curvy-trace-solver":"^0.0.10","@tscircuit/dataset-srj05":"git+https://github.com/tscircuit/dataset-srj05.git#9a49c126a89c083dc4d2b72cd17184735f637762","@tscircuit/dataset-srj24":"git+https://github.com/tscircuit/dataset-srj24.git#0973fa8a123276ff0f5de1fc7edef31efccb9cc9","@tscircuit/dataset-srj27-power-traces":"git+https://github.com/tscircuit/dataset-srj27-power-traces.git#eb24d36","@tscircuit/dataset-srj28-partially-prerouted":"git+https://github.com/tscircuit/dataset-srj28-partially-prerouted.git#5b1673544b6ade4480612539ba6574ad414fddc0","@tscircuit/dataset-srj29-ddr3-bga-pairs":"git+https://github.com/ShiboSoftwareDev/dataset-srj29-ddr3-bga-pairs.git#585c3abd4c6ce4be52bbc430b1d5e6dcc9b4ea30","@tscircuit/fanout-solver":"^0.0.29","@tscircuit/fixed-via-hypergraph-solver":"https://codeload.github.com/tscircuit/fixed-via-hypergraph-solver/tar.gz/bed37a6201b5dd07c9cc68b828917ecc20d6d049","@tscircuit/hypergraph":"^0.0.71","@tscircuit/jumper-topology-generator":"^0.0.4","@tscircuit/krt-wasm":"^0.1.0","@tscircuit/length-matching-solver":"git+https://github.com/tscircuit/length-matching-solver.git#a429b4db4e46896a03259949d7975da2514b6c14","@tscircuit/math-utils":"^0.0.36","@tscircuit/power-trace-expander":"git+https://github.com/tscircuit/power-trace-expander.git#6fa2ac79cf13129c47432db3a23e61c17067e912","@tscircuit/rectdiff":"git+https://github.com/tscircuit/rectdiff.git#262f1b7e2c70021785f0ccdbe8e2562f827c7dbf","@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-json":"^0.0.450","circuit-to-svg":"^0.0.220",clsx:"^2.1.1","dataset-srj11-45-degree":"git+https://github.com/tscircuit/dataset-srj11-45-degree.git#c49dd43c38f85fa2777c7d67393df413ca8d5a75","dataset-srj18":"git+https://github.com/tscircuit/dataset-srj18.git#c0aad90256a95256fcac814f9f7da81a82a2fdea",flatbush:"^4.4.0","format-si-unit":"0.0.12","graphics-debug":"0.0.99","high-density-dataset-z04":"git+https://github.com/tscircuit/high-density-dataset-z04.git#b9128ed52f5a50102b6526319be1d4ec33dca2c2","kicad-to-circuit-json":"0.0.77",kleur:"^4.1.5","looks-same":"9","pcb-poly-hyper-graph":"https://codeload.github.com/tscircuit/pcb-poly-hyper-graph/tar.gz/80db1463c4a47506eeda15b2c14d59679de900f8",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/tscircuit/tiny-hypergraph.git#b3dac2244e5c660f21566d9e79dc3b9f68d1c251","tiny-hypergraph-poly":"git+https://github.com/tscircuit/tiny-hypergraph.git#7b93b4c",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","high-density-repair01":"git+https://github.com/tscircuit/high-density-repair01.git#8eaa775e7c7a2c32c12a82da4edef22477549027","high-density-repair02":"https://codeload.github.com/tscircuit/high-density-repair02/tar.gz/2afc0cbba3bf2f7eb6b9cd33615d21e9ad9352d4","high-density-repair03":"git+https://github.com/tscircuit/high-density-repair03.git#d32a90310dce1132c500ecf2f97054c92f6a87be","@tscircuit/high-density-a01":"git+https://github.com/tscircuit/high-density-a01.git#9a3a3d","@tscircuit/high-density-b01":"git+https://github.com/tscircuit/high-density-b01.git#1309684"},dependencies:{"fast-json-stable-stringify":"^2.1.0","object-hash":"^3.0.0","stack-svgs":"^0.0.1"}};init_dist5();init_dist2();init_dist4();init_dist4();init_dist6();init_dist2();var import_react2=__toESM(require_react(),1),import_react_reconciler=__toESM(require_react_reconciler(),1),import_constants=__toESM(require_constants(),1);init_zod();init_dist2();init_dist2();init_zod();init_dist2();init_dist2();init_zod();init_dist2();var JSON_KEYS=Object.keys({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}),isCompatibleArray=array2=>(array2 instanceof Float64Array||array2 instanceof Float32Array||Array.isArray(array2)&&array2.every(x6=>typeof x6=="number"))&&[6,16].some(x6=>array2.length===x6),isCompatibleObject=object=>typeof DOMMatrix<"u"&&object instanceof DOMMatrix||object instanceof CSSMatrix||typeof object=="object"&&JSON_KEYS.every(k7=>object&&k7 in object),fromArray=(array2,target)=>{if(!isCompatibleArray(array2))throw TypeError(`CSSMatrix: "${Array.from(array2).join(",")}" must be an array with 6/16 numbers.`);if(array2.length===16){let[m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44]=array2;return writeValues(target??new CSSMatrix,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)}let[M11,M12,M21,M22,M41,M42]=array2;return writeValues(target??new CSSMatrix,M11,M12,0,0,M21,M22,0,0,0,0,1,0,M41,M42,0,1)},writeValues=(target,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)=>(target.m11=m11,target.a=m11,target.m21=m21,target.c=m21,target.m31=m31,target.m41=m41,target.e=m41,target.m12=m12,target.b=m12,target.m22=m22,target.d=m22,target.m32=m32,target.m42=m42,target.f=m42,target.m13=m13,target.m23=m23,target.m33=m33,target.m43=m43,target.m14=m14,target.m24=m24,target.m34=m34,target.m44=m44,target),fromValues=(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44)=>writeValues(new CSSMatrix,m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44),fromMatrix=(m6,target)=>{if(isCompatibleObject(m6))return writeValues(target??new CSSMatrix,m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44);throw TypeError(`CSSMatrix: "${JSON.stringify(m6)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},fromString=source=>{if(typeof source!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(source)}" is not a string.`);let str=String(source).replace(/\s/g,""),m6=new CSSMatrix,invalidStringError=`CSSMatrix: invalid transform string "${source}"`,transformFn=/([\w-]+)\(([^)]*)\)/g,consumed=0,match2;for(;match2=transformFn.exec(str);){let prop=match2[1],value=match2[2];if(consumed+=match2[0].length,!value)throw TypeError(invalidStringError);let components=value.split(",").map(n3=>n3.includes("rad")?parseFloat(n3)*(180/Math.PI):parseFloat(n3)),[x6,y2,z6,a6]=components,xyz=[x6,y2,z6],xyza=[x6,y2,z6,a6];if(prop==="perspective"&&x6&&[y2,z6].every(n3=>n3===void 0))m6.m34=-1/x6;else if(prop.includes("matrix")&&[6,16].includes(components.length)&&components.every(n3=>!Number.isNaN(+n3))){let values=components.map(n3=>Math.abs(n3)<1e-6?0:n3);m6.multiplySelf(fromArray(values))}else if(prop==="translate3d"&&xyz.every(n3=>!Number.isNaN(+n3)))m6.translateSelf(x6,y2,z6);else if(prop==="translate"&&x6&&z6===void 0)m6.translateSelf(x6,y2||0,0);else if(prop==="rotate3d"&&xyza.every(n3=>!Number.isNaN(+n3))&&a6)m6.rotateAxisAngleSelf(x6,y2,z6,a6);else if(prop==="rotate"&&x6&&[y2,z6].every(n3=>n3===void 0))m6.rotateSelf(0,0,x6);else if(prop==="scale3d"&&xyz.every(n3=>!Number.isNaN(+n3))&&xyz.some(n3=>n3!==1))m6.scaleSelf(x6,y2,z6);else if(prop==="scale"&&!Number.isNaN(x6)&&(x6!==1||y2!==1)&&z6===void 0){let sy3=Number.isNaN(+y2)?x6:y2;m6.scaleSelf(x6,sy3,1)}else if(prop==="skew"&&(x6||!Number.isNaN(x6)&&y2)&&z6===void 0)m6.skewSelf(x6,y2||0);else if(["translate","rotate","scale","skew"].some(p3=>prop.includes(p3))&&/[XYZ]/.test(prop)&&x6&&[y2,z6].every(n3=>n3===void 0))if(prop==="skewX"||prop==="skewY")m6[prop==="skewX"?"skewXSelf":"skewYSelf"](x6);else{let fn3=prop.replace(/[XYZ]/,""),axis=prop.replace(fn3,""),idx=["X","Y","Z"].indexOf(axis),def=fn3==="scale"?1:0,method=fn3+"Self",axeValues=[idx===0?x6:def,idx===1?x6:def,idx===2?x6:def];m6[method](...axeValues)}else throw TypeError(invalidStringError)}if(consumed!==str.length)throw TypeError(invalidStringError);return m6},toArray=(m6,is2D)=>is2D?[m6.a,m6.b,m6.c,m6.d,m6.e,m6.f]:[m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44],Translate=(x6,y2,z6)=>{let m6=new CSSMatrix;return m6.m41=x6,m6.e=x6,m6.m42=y2,m6.f=y2,m6.m43=z6,m6},Rotate=(rx3,ry3,rz2)=>{let m6=new CSSMatrix,degToRad=Math.PI/180,radX=rx3*degToRad,radY=ry3*degToRad,radZ=rz2*degToRad,cosx=Math.cos(radX),sinx=-Math.sin(radX),cosy=Math.cos(radY),siny=-Math.sin(radY),cosz=Math.cos(radZ),sinz=-Math.sin(radZ),m11=cosy*cosz,m12=-cosy*sinz;m6.m11=m11,m6.a=m11,m6.m12=m12,m6.b=m12,m6.m13=siny;let m21=sinx*siny*cosz+cosx*sinz;m6.m21=m21,m6.c=m21;let m22=cosx*cosz-sinx*siny*sinz;return m6.m22=m22,m6.d=m22,m6.m23=-sinx*cosy,m6.m31=sinx*sinz-cosx*siny*cosz,m6.m32=sinx*cosz+cosx*siny*sinz,m6.m33=cosx*cosy,m6},RotateAxisAngle=(x6=0,y2=0,z6=0,alpha=0)=>{let m6=new CSSMatrix,length4=Math.sqrt(x6*x6+y2*y2+z6*z6);if(length4===0)return m6;let X6=x6/length4,Y6=y2/length4,Z3=z6/length4,angle=alpha*(Math.PI/360),sinA=Math.sin(angle),cosA=Math.cos(angle),sinA2=sinA*sinA,x22=X6*X6,y22=Y6*Y6,z22=Z3*Z3,m11=1-2*(y22+z22)*sinA2;m6.m11=m11,m6.a=m11;let m12=2*(X6*Y6*sinA2+Z3*sinA*cosA);m6.m12=m12,m6.b=m12,m6.m13=2*(X6*Z3*sinA2-Y6*sinA*cosA);let m21=2*(Y6*X6*sinA2-Z3*sinA*cosA);m6.m21=m21,m6.c=m21;let m22=1-2*(z22+x22)*sinA2;return m6.m22=m22,m6.d=m22,m6.m23=2*(Y6*Z3*sinA2+X6*sinA*cosA),m6.m31=2*(Z3*X6*sinA2+Y6*sinA*cosA),m6.m32=2*(Z3*Y6*sinA2-X6*sinA*cosA),m6.m33=1-2*(x22+y22)*sinA2,m6},Scale=(x6,y2,z6)=>{let m6=new CSSMatrix;return m6.m11=x6,m6.a=x6,m6.m22=y2,m6.d=y2,m6.m33=z6,m6},Skew=(angleX,angleY)=>{let m6=new CSSMatrix;if(angleX){let radX=angleX*Math.PI/180,tX2=Math.tan(radX);m6.m21=tX2,m6.c=tX2}if(angleY){let radY=angleY*Math.PI/180,tY2=Math.tan(radY);m6.m12=tY2,m6.b=tY2}return m6},SkewX=angle=>Skew(angle,0),SkewY=angle=>Skew(0,angle),multiplyInto=(m12,m22,m6)=>{let m11=m22.m11*m12.m11+m22.m12*m12.m21+m22.m13*m12.m31+m22.m14*m12.m41,m122=m22.m11*m12.m12+m22.m12*m12.m22+m22.m13*m12.m32+m22.m14*m12.m42,m13=m22.m11*m12.m13+m22.m12*m12.m23+m22.m13*m12.m33+m22.m14*m12.m43,m14=m22.m11*m12.m14+m22.m12*m12.m24+m22.m13*m12.m34+m22.m14*m12.m44,m21=m22.m21*m12.m11+m22.m22*m12.m21+m22.m23*m12.m31+m22.m24*m12.m41,m222=m22.m21*m12.m12+m22.m22*m12.m22+m22.m23*m12.m32+m22.m24*m12.m42,m23=m22.m21*m12.m13+m22.m22*m12.m23+m22.m23*m12.m33+m22.m24*m12.m43,m24=m22.m21*m12.m14+m22.m22*m12.m24+m22.m23*m12.m34+m22.m24*m12.m44,m31=m22.m31*m12.m11+m22.m32*m12.m21+m22.m33*m12.m31+m22.m34*m12.m41,m32=m22.m31*m12.m12+m22.m32*m12.m22+m22.m33*m12.m32+m22.m34*m12.m42,m33=m22.m31*m12.m13+m22.m32*m12.m23+m22.m33*m12.m33+m22.m34*m12.m43,m34=m22.m31*m12.m14+m22.m32*m12.m24+m22.m33*m12.m34+m22.m34*m12.m44,m41=m22.m41*m12.m11+m22.m42*m12.m21+m22.m43*m12.m31+m22.m44*m12.m41,m42=m22.m41*m12.m12+m22.m42*m12.m22+m22.m43*m12.m32+m22.m44*m12.m42,m43=m22.m41*m12.m13+m22.m42*m12.m23+m22.m43*m12.m33+m22.m44*m12.m43,m44=m22.m41*m12.m14+m22.m42*m12.m24+m22.m43*m12.m34+m22.m44*m12.m44;return m6.m11=m11,m6.a=m11,m6.m21=m21,m6.c=m21,m6.m31=m31,m6.m41=m41,m6.e=m41,m6.m12=m122,m6.b=m122,m6.m22=m222,m6.d=m222,m6.m32=m32,m6.m42=m42,m6.f=m42,m6.m13=m13,m6.m23=m23,m6.m33=m33,m6.m43=m43,m6.m14=m14,m6.m24=m24,m6.m34=m34,m6.m44=m44,m6},Multiply=(m12,m22)=>multiplyInto(m12,m22,new CSSMatrix),_a3,CSSMatrix=(_a3=class{constructor(init){if(init){if(typeof init=="string"&&init.length&&init!=="none")return fromString(init);if(Array.isArray(init)||init instanceof Float64Array||init instanceof Float32Array)return fromArray(init);if(typeof init=="object")return fromMatrix(init)}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,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(source){if(typeof source=="string"&&source.length&&source!=="none"){let m6=fromString(source);return writeValues(this,m6.m11,m6.m12,m6.m13,m6.m14,m6.m21,m6.m22,m6.m23,m6.m24,m6.m31,m6.m32,m6.m33,m6.m34,m6.m41,m6.m42,m6.m43,m6.m44)}return Array.isArray(source)||source instanceof Float64Array||source instanceof Float32Array?fromArray(source,this):typeof source=="object"?fromMatrix(source,this):this}toFloat32Array(is2D){return is2D?new Float32Array([this.a,this.b,this.c,this.d,this.e,this.f]):new Float32Array([this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44])}toFloat64Array(is2D){return is2D?new Float64Array([this.a,this.b,this.c,this.d,this.e,this.f]):new Float64Array([this.m11,this.m12,this.m13,this.m14,this.m21,this.m22,this.m23,this.m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44])}toString(){let{is2D}=this,values=this.toFloat64Array(is2D).join(", ");return`${is2D?"matrix":"matrix3d"}(${values})`}toJSON(){let{is2D,isIdentity}=this;return{a:this.a,b:this.b,c:this.c,d:this.d,e:this.e,f:this.f,m11:this.m11,m12:this.m12,m13:this.m13,m14:this.m14,m21:this.m21,m22:this.m22,m23:this.m23,m24:this.m24,m31:this.m31,m32:this.m32,m33:this.m33,m34:this.m34,m41:this.m41,m42:this.m42,m43:this.m43,m44:this.m44,is2D,isIdentity}}multiply(m22){return Multiply(this,m22)}translate(x6,y2,z6){let ty3=y2??0,tz2=z6??0,{m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44}=this,n41=x6*m11+ty3*m21+tz2*m31+m41,n42=x6*m12+ty3*m22+tz2*m32+m42,n43=x6*m13+ty3*m23+tz2*m33+m43,n44=x6*m14+ty3*m24+tz2*m34+m44;return fromValues(m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,n41,n42,n43,n44)}scale(x6,y2,z6){let sy3=y2??x6,sz3=z6??1,{m41,m42,m43,m44}=this;return fromValues(this.m11*x6,this.m12*x6,this.m13*x6,this.m14*x6,this.m21*sy3,this.m22*sy3,this.m23*sy3,this.m24*sy3,this.m31*sz3,this.m32*sz3,this.m33*sz3,this.m34*sz3,m41,m42,m43,m44)}rotate(rx3,ry3,rz2){let RX=rx3,RY2=ry3||0,RZ2=rz2||0;return typeof rx3=="number"&&typeof ry3>"u"&&typeof rz2>"u"&&(RZ2=RX,RX=0,RY2=0),this.multiply(Rotate(RX,RY2,RZ2))}rotateAxisAngle(x6=0,y2=0,z6=0,angle=0){if([x6,y2,z6,angle].some(n3=>!Number.isFinite(n3)))throw new TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(x6*x6+y2*y2+z6*z6)===0?fromMatrix(this):this.multiply(RotateAxisAngle(x6,y2,z6,angle))}skewX(angle){return this.skew(angle,0)}skewY(angle){return this.skew(0,angle)}skew(angleX,angleY){let tX2=angleX?Math.tan(angleX*Math.PI/180):0,tY2=angleY?Math.tan(angleY*Math.PI/180):0,{m11,m12,m13,m14,m21,m22,m23,m24}=this;return fromValues(m11+tY2*m21,m12+tY2*m22,m13+tY2*m23,m14+tY2*m24,tX2*m11+m21,tX2*m12+m22,tX2*m13+m23,tX2*m14+m24,this.m31,this.m32,this.m33,this.m34,this.m41,this.m42,this.m43,this.m44)}multiplySelf(m22){return multiplyInto(this,m22,this),this}translateSelf(x6,y2,z6){let ty3=y2??0,tz2=z6??0,{m11,m12,m13,m14,m21,m22,m23,m24,m31,m32,m33,m34,m41,m42,m43,m44}=this,n41=x6*m11+ty3*m21+tz2*m31+m41,n42=x6*m12+ty3*m22+tz2*m32+m42,n43=x6*m13+ty3*m23+tz2*m33+m43,n44=x6*m14+ty3*m24+tz2*m34+m44;return this.m41=n41,this.e=n41,this.m42=n42,this.f=n42,this.m43=n43,this.m44=n44,this}scaleSelf(x6,y2,z6){let sy3=y2??x6,sz3=z6??1;return this.m11*=x6,this.a*=x6,this.m12*=x6,this.b*=x6,this.m13*=x6,this.m14*=x6,this.m21*=sy3,this.c*=sy3,this.m22*=sy3,this.d*=sy3,this.m23*=sy3,this.m24*=sy3,this.m31*=sz3,this.m32*=sz3,this.m33*=sz3,this.m34*=sz3,this}rotateSelf(rx3,ry3,rz2){let RX=rx3,RY2=ry3||0,RZ2=rz2||0;return typeof rx3=="number"&&typeof ry3>"u"&&typeof rz2>"u"&&(RZ2=RX,RX=0,RY2=0),this.multiplySelf(Rotate(RX,RY2,RZ2))}rotateAxisAngleSelf(x6=0,y2=0,z6=0,angle=0){if([x6,y2,z6,angle].some(n3=>!Number.isFinite(n3)))throw new TypeError("CSSMatrix: expecting 4 values");return Math.sqrt(x6*x6+y2*y2+z6*z6)===0?this:this.multiplySelf(RotateAxisAngle(x6,y2,z6,angle))}skewXSelf(angle){return this.skewSelf(angle,0)}skewYSelf(angle){return this.skewSelf(0,angle)}skewSelf(angleX,angleY){let tX2=angleX?Math.tan(angleX*Math.PI/180):0,tY2=angleY?Math.tan(angleY*Math.PI/180):0,{m11,m12,m13,m14,m21,m22,m23,m24}=this,n11=m11+tY2*m21,n12=m12+tY2*m22,n13=m13+tY2*m23,n14=m14+tY2*m24,n21=tX2*m11+m21,n22=tX2*m12+m22,n23=tX2*m13+m23,n24=tX2*m14+m24;return this.m11=n11,this.a=n11,this.m12=n12,this.b=n12,this.m13=n13,this.m14=n14,this.m21=n21,this.c=n21,this.m22=n22,this.d=n22,this.m23=n23,this.m24=n24,this}transformPoint(t53){let x6=this.m11*t53.x+this.m21*t53.y+this.m31*t53.z+this.m41*t53.w,y2=this.m12*t53.x+this.m22*t53.y+this.m32*t53.z+this.m42*t53.w,z6=this.m13*t53.x+this.m23*t53.y+this.m33*t53.z+this.m43*t53.w,w3=this.m14*t53.x+this.m24*t53.y+this.m34*t53.z+this.m44*t53.w;return typeof DOMPoint<"u"&&t53 instanceof DOMPoint?new DOMPoint(x6,y2,z6,w3):{x:x6,y:y2,z:z6,w:w3}}},__publicField(_a3,"Translate",Translate),__publicField(_a3,"Rotate",Rotate),__publicField(_a3,"RotateAxisAngle",RotateAxisAngle),__publicField(_a3,"Scale",Scale),__publicField(_a3,"SkewX",SkewX),__publicField(_a3,"SkewY",SkewY),__publicField(_a3,"Skew",Skew),__publicField(_a3,"Multiply",Multiply),__publicField(_a3,"fromArray",fromArray),__publicField(_a3,"fromMatrix",fromMatrix),__publicField(_a3,"fromString",fromString),__publicField(_a3,"toArray",toArray),__publicField(_a3,"isCompatibleArray",isCompatibleArray),__publicField(_a3,"isCompatibleObject",isCompatibleObject),_a3);var version="2.3.1",midPoint=([ax3,ay3],[bx3,by3],t53)=>[ax3+(bx3-ax3)*t53,ay3+(by3-ay3)*t53],distanceSquareRoot=(a6,b6)=>Math.sqrt((a6[0]-b6[0])*(a6[0]-b6[0])+(a6[1]-b6[1])*(a6[1]-b6[1])),getLineLength=(x12,y12,x22,y2)=>distanceSquareRoot([x12,y12],[x22,y2]),getPointAtLineLength=(x12,y12,x22,y2,distance8)=>{let point6={x:x12,y:y12};if(typeof distance8=="number"){let length4=distanceSquareRoot([x12,y12],[x22,y2]);if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x22,y:y2};else{let[x6,y6]=midPoint([x12,y12],[x22,y2],distance8/length4);point6={x:x6,y:y6}}}return point6},getLineBBox=(x12,y12,x22,y2)=>{let{min,max:max2}=Math;return[min(x12,x22),min(y12,y2),max2(x12,x22),max2(y12,y2)]},lineTools={getLineBBox,getLineLength,getPointAtLineLength},Tvalues=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],deriveBezier=points=>{let dpoints=[];for(let p3=points,d3=p3.length,c3=d3-1;d3>1;d3-=1,c3-=1){let list=[];for(let j6=0;j6<c3;j6+=1)list.push({x:c3*(p3[j6+1].x-p3[j6].x),y:c3*(p3[j6+1].y-p3[j6].y),t:0});dpoints.push(list),p3=list}return dpoints},computeBezier=(points,t53)=>{if(t53===0)return points[0].t=0,points[0];let order=points.length-1;if(t53===1)return points[order].t=1,points[order];let mt3=1-t53,p3=points;if(order===0)return points[0].t=t53,points[0];if(order===1)return{x:mt3*p3[0].x+t53*p3[1].x,y:mt3*p3[0].y+t53*p3[1].y,t:t53};let mt22=mt3*mt3,t210=t53*t53,a6=0,b6=0,c3=0,d3=0;return order===2?(p3=[p3[0],p3[1],p3[2],{x:0,y:0}],a6=mt22,b6=mt3*t53*2,c3=t210):order===3&&(a6=mt22*mt3,b6=mt22*t53*3,c3=mt3*t210*3,d3=t53*t210),{x:a6*p3[0].x+b6*p3[1].x+c3*p3[2].x+d3*p3[3].x,y:a6*p3[0].y+b6*p3[1].y+c3*p3[2].y+d3*p3[3].y,t:t53}},calculateBezier=(derivativeFn,t53)=>{let d3=derivativeFn(t53),l6=d3.x*d3.x+d3.y*d3.y;return Math.sqrt(l6)},bezierLength=derivativeFn=>bezierLengthAtT(derivativeFn,1),bezierLengthAtT=(derivativeFn,t53)=>{let z6=t53/2,len=Tvalues.length,sum=0;for(let i6=0,tMid;i6<len;i6++)tMid=z6*Tvalues[i6]+z6,sum+=Cvalues[i6]*calculateBezier(derivativeFn,tMid);return z6*sum},getBezierPoints=curve=>{let points=[];for(let idx=0,len=curve.length,step=2;idx<len;idx+=step)points.push({x:curve[idx],y:curve[idx+1]});return points},getBezierLengthAtT=(curve,t53)=>{let dpoints=deriveBezier(getBezierPoints(curve));return bezierLengthAtT(ratio=>computeBezier(dpoints[0],ratio),t53)},getTAtBezierLength=(curve,distance8)=>{let dpoints=deriveBezier(getBezierPoints(curve)),derivativeFn=ratio=>computeBezier(dpoints[0],ratio),lo3=0,hi3=1;for(let i6=0;i6<25;i6+=1){let mid=(lo3+hi3)/2;bezierLengthAtT(derivativeFn,mid)<distance8?lo3=mid:hi3=mid}return(lo3+hi3)/2},getBezierLength=curve=>{let points=getBezierPoints(curve),dpoints=deriveBezier(points);return bezierLength(t53=>computeBezier(dpoints[0],t53))},CBEZIER_MINMAX_EPSILON=1e-8,minmaxQ=([v12,cp3,v22])=>{let min=Math.min(v12,v22),max2=Math.max(v12,v22);if(cp3>=v12?v22>=cp3:v22<=cp3)return[min,max2];let E7=(v12*v22-cp3*cp3)/(v12-2*cp3+v22);return E7<min?[E7,max2]:[min,E7]},minmaxC=([v12,cp1,cp22,v22])=>{let K3=v12-3*cp1+3*cp22-v22;if(Math.abs(K3)<1e-8)return v12===v22&&v12===cp1?[v12,v22]:minmaxQ([v12,-.5*v12+1.5*cp1,v12-3*cp1+3*cp22]);let T6=-v12*cp22+v12*v22-cp1*cp22-cp1*v22+cp1*cp1+cp22*cp22;if(T6<=0)return[Math.min(v12,v22),Math.max(v12,v22)];let S3=Math.sqrt(T6),min=Math.min(v12,v22),max2=Math.max(v12,v22),L5=v12-2*cp1+cp22;for(let R3=(L5+S3)/K3,i6=1;i6<=2;R3=(L5-S3)/K3,i6++)if(R3>0&&R3<1){let Q3=v12*(1-R3)*(1-R3)*(1-R3)+cp1*3*(1-R3)*(1-R3)*R3+cp22*3*(1-R3)*R3*R3+v22*R3*R3*R3;Q3<min&&(min=Q3),Q3>max2&&(max2=Q3)}return[min,max2]},bezierTools={bezierLength,bezierLengthAtT,calculateBezier,CBEZIER_MINMAX_EPSILON,computeBezier,Cvalues,deriveBezier,getBezierLength,getBezierLengthAtT,getBezierPoints,getTAtBezierLength,minmaxC,minmaxQ,Tvalues},arcLengthAtAngle=(rx3,ry3,theta)=>{let sign=theta<0?-1:1,absTheta=Math.abs(theta),step=Math.PI/2,total=0,remaining=absTheta,offset=0;for(;remaining>0;){let span=Math.min(step,remaining),z6=span/2,sum=0;for(let i6=0,len=Tvalues.length;i6<len;i6+=1){let phi=offset+z6*Tvalues[i6]+z6;sum+=Cvalues[i6]*Math.sqrt((rx3*Math.sin(phi))**2+(ry3*Math.cos(phi))**2)}total+=z6*sum,offset+=span,remaining-=span}return sign*total},arcLengthBetween=(rx3,ry3,from,to3)=>arcLengthAtAngle(rx3,ry3,to3)-arcLengthAtAngle(rx3,ry3,from),arcLength=(rx3,ry3,theta)=>Math.abs(arcLengthAtAngle(rx3,ry3,theta)),arcPoint=(cx3,cy3,rx3,ry3,alpha,theta)=>{let{sin:sin6,cos:cos6}=Math,cosA=cos6(alpha),sinA=sin6(alpha),x6=rx3*cos6(theta),y2=ry3*sin6(theta);return[cx3+cosA*x6-sinA*y2,cy3+sinA*x6+cosA*y2]},angleBetween=(v02,v12)=>{let{x:v0x,y:v0y}=v02,{x:v1x,y:v1y}=v12,p3=v0x*v1x+v0y*v1y,n3=Math.sqrt((v0x**2+v0y**2)*(v1x**2+v1y**2));return(v0x*v1y-v0y*v1x<0?-1:1)*Math.acos(p3/n3)},getArcProps=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{abs,sin:sin6,cos:cos6,sqrt,PI:PI7}=Math,rx3=abs(RX),ry3=abs(RY2),xRotRad=(angle%360+360)%360*(PI7/180);if(x12===x6&&y12===y2)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:x6,y:y2}};if(rx3===0||ry3===0)return{rx:rx3,ry:ry3,startAngle:0,endAngle:0,center:{x:(x6+x12)/2,y:(y2+y12)/2}};let dx3=(x12-x6)/2,dy3=(y12-y2)/2,transformedPoint={x:cos6(xRotRad)*dx3+sin6(xRotRad)*dy3,y:-sin6(xRotRad)*dx3+cos6(xRotRad)*dy3},radiiCheck=transformedPoint.x**2/rx3**2+transformedPoint.y**2/ry3**2;radiiCheck>1&&(rx3*=sqrt(radiiCheck),ry3*=sqrt(radiiCheck));let cRadicand=(rx3**2*ry3**2-rx3**2*transformedPoint.y**2-ry3**2*transformedPoint.x**2)/(rx3**2*transformedPoint.y**2+ry3**2*transformedPoint.x**2);cRadicand=cRadicand<0?0:cRadicand;let cCoef=(LAF!==SF2?1:-1)*sqrt(cRadicand),transformedCenter={x:cCoef*(rx3*transformedPoint.y/ry3),y:cCoef*(-(ry3*transformedPoint.x)/rx3)},center2={x:cos6(xRotRad)*transformedCenter.x-sin6(xRotRad)*transformedCenter.y+(x12+x6)/2,y:sin6(xRotRad)*transformedCenter.x+cos6(xRotRad)*transformedCenter.y+(y12+y2)/2},startVector={x:(transformedPoint.x-transformedCenter.x)/rx3,y:(transformedPoint.y-transformedCenter.y)/ry3},startAngle=angleBetween({x:1,y:0},startVector),endVector={x:(-transformedPoint.x-transformedCenter.x)/rx3,y:(-transformedPoint.y-transformedCenter.y)/ry3},sweepAngle=angleBetween(startVector,endVector);return!SF2&&sweepAngle>0?sweepAngle-=2*PI7:SF2&&sweepAngle<0&&(sweepAngle+=2*PI7),sweepAngle%=2*PI7,{center:center2,startAngle,endAngle:startAngle+sweepAngle,rx:rx3,ry:ry3}},getArcLength=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2);return Math.abs(arcLengthBetween(rx3,ry3,startAngle,endAngle))},getPointAtArcLength=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2,distance8)=>{let point6={x:x12,y:y12},{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2);if(typeof distance8=="number"){let sweepAngle=endAngle-startAngle,length4=Math.abs(arcLengthBetween(rx3,ry3,startAngle,endAngle));if(distance8<=0)point6={x:x12,y:y12};else if(distance8>=length4)point6={x:x6,y:y2};else{if(x12===x6&&y12===y2)return{x:x6,y:y2};if(rx3===0||ry3===0)return getPointAtLineLength(x12,y12,x6,y2,distance8);let{PI:PI7,cos:cos6,sin:sin6}=Math,xRotRad=(angle%360+360)%360*(PI7/180),lo3=0,hi3=1;for(let i6=0;i6<25;i6+=1){let mid=(lo3+hi3)/2;Math.abs(arcLengthBetween(rx3,ry3,startAngle,startAngle+sweepAngle*mid))<distance8?lo3=mid:hi3=mid}let alpha=startAngle+sweepAngle*((lo3+hi3)/2),ellipseComponentX=rx3*cos6(alpha),ellipseComponentY=ry3*sin6(alpha);point6={x:cos6(xRotRad)*ellipseComponentX-sin6(xRotRad)*ellipseComponentY+center2.x,y:sin6(xRotRad)*ellipseComponentX+cos6(xRotRad)*ellipseComponentY+center2.y}}}return point6},getArcBBox=(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2)=>{let{center:center2,rx:rx3,ry:ry3,startAngle,endAngle}=getArcProps(x12,y12,RX,RY2,angle,LAF,SF2,x6,y2),deltaAngle=endAngle-startAngle,{min,max:max2,tan:tan6,atan2,PI:PI7}=Math,{x:cx3,y:cy3}=center2,alpha=angle*PI7/180,tangent=tan6(alpha),theta=atan2(-ry3*tangent,rx3),angle1=theta,angle2=theta+PI7,angle3=atan2(ry3,rx3*tangent),angle4=angle3+PI7,xArray=[x6],yArray=[y2],xMin=min(x12,x6),xMax=max2(x12,x6),yMin=min(y12,y2),yMax=max2(y12,y2),angleAfterStart=endAngle-deltaAngle*1e-5,pP2=arcPoint(cx3,cy3,rx3,ry3,alpha,angleAfterStart),angleBeforeEnd=endAngle-deltaAngle*.99999,pP3=arcPoint(cx3,cy3,rx3,ry3,alpha,angleBeforeEnd);if(pP2[0]>xMax||pP3[0]>xMax){let p12=arcPoint(cx3,cy3,rx3,ry3,alpha,angle1);xArray.push(p12[0]),yArray.push(p12[1])}if(pP2[0]<xMin||pP3[0]<xMin){let p22=arcPoint(cx3,cy3,rx3,ry3,alpha,angle2);xArray.push(p22[0]),yArray.push(p22[1])}if(pP2[1]<yMin||pP3[1]<yMin){let p42=arcPoint(cx3,cy3,rx3,ry3,alpha,angle4);xArray.push(p42[0]),yArray.push(p42[1])}if(pP2[1]>yMax||pP3[1]>yMax){let p3=arcPoint(cx3,cy3,rx3,ry3,alpha,angle3);xArray.push(p3[0]),yArray.push(p3[1])}return xMin=min.apply([],xArray),yMin=min.apply([],yArray),xMax=max2.apply([],xArray),yMax=max2.apply([],yArray),[xMin,yMin,xMax,yMax]},arcTools={angleBetween,arcLength,arcLengthAtAngle,arcLengthBetween,arcPoint,getArcBBox,getArcLength,getArcProps,getPointAtArcLength},getPointAtCubicSegmentLength=([x12,y12,c1x,c1y,c2x,c2y,x22,y2],t53)=>{let t110=1-t53;return{x:t110**3*x12+3*t110**2*t53*c1x+3*t110*t53**2*c2x+t53**3*x22,y:t110**3*y12+3*t110**2*t53*c1y+3*t110*t53**2*c2y+t53**3*y2}},getCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>getBezierLength([x12,y12,c1x,c1y,c2x,c2y,x22,y2]),getPointAtCubicLength=(x12,y12,c1x,c1y,c2x,c2y,x22,y2,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let coords=[x12,y12,c1x,c1y,c2x,c2y,x22,y2],currentLength=getBezierLength(coords);if(!(distance8<=0))if(distance8>=currentLength)point6={x:x22,y:y2};else{let t53=getTAtBezierLength(coords,distance8);point6=getPointAtCubicSegmentLength(coords,t53)}}return point6},getCubicBBox=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>{let cxMinMax=minmaxC([x12,c1x,c2x,x22]),cyMinMax=minmaxC([y12,c1y,c2y,y2]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},cubicTools={getCubicBBox,getCubicLength,getPointAtCubicLength,getPointAtCubicSegmentLength},getPointAtQuadSegmentLength=([x12,y12,cx3,cy3,x22,y2],t53)=>{let t110=1-t53;return{x:t110**2*x12+2*t110*t53*cx3+t53**2*x22,y:t110**2*y12+2*t110*t53*cy3+t53**2*y2}},getQuadLength=(x12,y12,cx3,cy3,x22,y2)=>getBezierLength([x12,y12,cx3,cy3,x22,y2]),getPointAtQuadLength=(x12,y12,cx3,cy3,x22,y2,distance8)=>{let distanceIsNumber=typeof distance8=="number",point6={x:x12,y:y12};if(distanceIsNumber){let coords=[x12,y12,cx3,cy3,x22,y2],currentLength=getBezierLength(coords);if(!(distance8<=0))if(distance8>=currentLength)point6={x:x22,y:y2};else{let t53=getTAtBezierLength(coords,distance8);point6=getPointAtQuadSegmentLength(coords,t53)}}return point6},getQuadBBox=(x12,y12,cx3,cy3,x22,y2)=>{let cxMinMax=minmaxQ([x12,cx3,x22]),cyMinMax=minmaxQ([y12,cy3,y2]);return[cxMinMax[0],cyMinMax[0],cxMinMax[1],cyMinMax[1]]},quadTools={getPointAtQuadLength,getPointAtQuadSegmentLength,getQuadBBox,getQuadLength},polygonArea=polygon2=>{let n3=polygon2.length,i6=-1,a6,b6=polygon2[n3-1],area=0;for(;++i6<n3;)a6=b6,b6=polygon2[i6],area+=a6[1]*b6[0]-a6[0]*b6[1];return area/2},polygonLength=polygon2=>polygon2.reduce((length4,point6,i6)=>i6?length4+distanceSquareRoot(polygon2[i6-1],point6):0,0),polygonCentroid=polygon2=>{if(polygon2.length===0)return[0,0];let sumX=0,sumY=0;for(let[x6,y2]of polygon2)sumX+=x6,sumY+=y2;let count=polygon2.length;return[sumX/count,sumY/count]},polygonTools={polygonArea,polygonLength,polygonCentroid},rotateVector=(x6,y2,rad)=>{let{sin:sin6,cos:cos6}=Math;return{x:x6*cos6(rad)-y2*sin6(rad),y:x6*sin6(rad)+y2*cos6(rad)}},roundTo=(n3,round)=>{let pow=round>=1?10**round:1;return round>0?Math.round(n3*pow)/pow:Math.round(n3)},defaultOptions2={origin:[0,0,0],round:4},paramsCounts={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},finalizeSegment=path=>{let pathCommand=path.pathValue[path.segmentStart],relativeCommand=pathCommand.toLowerCase(),{data}=path,index=0;for(;data.length-index>=paramsCounts[relativeCommand];){if(relativeCommand==="m"&&data.length-index>2){let segment2=new Array(3);segment2[0]=pathCommand,segment2[1]=data[index],segment2[2]=data[index+1],path.segments.push(segment2),index+=2,relativeCommand="l",pathCommand=pathCommand==="m"?"l":"L"}else{let paramCount=paramsCounts[relativeCommand],segment2=new Array(paramCount+1);segment2[0]=pathCommand;for(let i6=0;i6<paramCount;i6+=1)segment2[i6+1]=data[index+i6];path.segments.push(segment2),index+=paramCount}if(!paramsCounts[relativeCommand])break}},error="SVGPathCommanderError",scanFlag=path=>{let{index,pathValue}=path,code=pathValue.charCodeAt(index);if(code===48){path.param=0,path.index+=1;return}if(code===49){path.param=1,path.index+=1;return}path.err=`${error}: invalid Arc flag "${pathValue[index]}", expecting 0 or 1 at index ${index}`},isDigit=code=>code>=48&&code<=57,invalidPathValue="Invalid path value",scanParam=path=>{let{max:max2,pathValue,index:start}=path,index=start,zeroFirst=!1,hasCeiling=!1,hasDecimal=!1,hasDot=!1,ch2;if(index>=max2){path.err=`${error}: ${invalidPathValue} at index ${index}, "pathValue" is missing param`;return}if(ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1,ch2=pathValue.charCodeAt(index)),!isDigit(ch2)&&ch2!==46){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" is not a number`;return}if(ch2!==46){if(zeroFirst=ch2===48,index+=1,ch2=pathValue.charCodeAt(index),zeroFirst&&index<max2&&ch2&&isDigit(ch2)){path.err=`${error}: ${invalidPathValue} at index ${start}, "${pathValue[start]}" illegal number`;return}for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1,hasCeiling=!0;ch2=pathValue.charCodeAt(index)}if(ch2===46){for(hasDot=!0,index+=1;isDigit(pathValue.charCodeAt(index));)index+=1,hasDecimal=!0;ch2=pathValue.charCodeAt(index)}if(ch2===101||ch2===69){if(hasDot&&!hasCeiling&&!hasDecimal){path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid float exponent`;return}if(index+=1,ch2=pathValue.charCodeAt(index),(ch2===43||ch2===45)&&(index+=1),index<max2&&isDigit(pathValue.charCodeAt(index)))for(;index<max2&&isDigit(pathValue.charCodeAt(index));)index+=1;else{path.err=`${error}: ${invalidPathValue} at index ${index}, "${pathValue[index]}" invalid integer exponent`;return}}path.index=index,path.param=scanNumber(pathValue,start,index)},scanNumber=(str,start,end)=>{let i6=start,sign=1,param=0,decimals=0,sigDigits=0,inFraction=!1,expSign=1,exp=0,ch2=str.charCodeAt(i6);for(ch2===43?i6+=1:ch2===45&&(sign=-1,i6+=1);i6<end;i6+=1){let code=str.charCodeAt(i6);if(code===46)inFraction=!0;else if(code===101||code===69){i6+=1;let expCode=str.charCodeAt(i6);for(expCode===43?i6+=1:expCode===45&&(expSign=-1,i6+=1);i6<end;i6+=1)exp=exp*10+(str.charCodeAt(i6)-48)}else{let digit=code-48;(digit!==0||param!==0)&&(sigDigits+=1),param=param*10+digit,inFraction&&(decimals+=1)}}if(sigDigits>15||sigDigits===0)return+str.slice(start,end);let scale6=expSign*exp-decimals;return scale6>22||scale6<-22?+str.slice(start,end):scale6>=0?sign*param*10**scale6:sign*param/10**-scale6},isSpace=ch2=>[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(ch2),skipSpaces=path=>{let{pathValue,max:max2}=path;for(;path.index<max2&&isSpace(pathValue.charCodeAt(path.index));)path.index+=1},isPathCommand=code=>{switch(code|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}},isDigitStart=code=>isDigit(code)||code===43||code===45||code===46,isArcCommand=code=>(code|32)===97,isMoveCommand=code=>{switch(code|32){case 109:case 77:return!0;default:return!1}},scanSegment=path=>{let{max:max2,pathValue,index,segments}=path,cmdCode=pathValue.charCodeAt(index),reqParams=paramsCounts[pathValue[index].toLowerCase()];if(path.segmentStart=index,!isPathCommand(cmdCode)){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a path command at index ${index}`;return}let lastSegment=segments[segments.length-1];if(!isMoveCommand(cmdCode)&&lastSegment?.[0]?.toLocaleLowerCase()==="z"){path.err=`${error}: ${invalidPathValue} "${pathValue[index]}" is not a MoveTo path command at index ${index}`;return}if(path.index+=1,skipSpaces(path),path.data=[],!reqParams){finalizeSegment(path);return}for(;;){for(let i6=reqParams;i6>0;i6-=1){if(isArcCommand(cmdCode)&&(i6===3||i6===4)?scanFlag(path):scanParam(path),path.err.length)return;path.data.push(path.param),skipSpaces(path),path.index<max2&&pathValue.charCodeAt(path.index)===44&&(path.index+=1,skipSpaces(path))}if(path.index>=path.max||!isDigitStart(pathValue.charCodeAt(path.index)))break}finalizeSegment(path)},PathParser=class{constructor(pathString){this.segments=[],this.pathValue=pathString,this.max=pathString.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}},parsePathString=pathInput=>{if(typeof pathInput!="string")return pathInput.slice(0);let path=new PathParser(pathInput);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);if(!path.err.length)path.segments.length&&(path.segments[0][0]="M");else throw TypeError(path.err);return path.segments},absolutizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase();if(index===0||absCommand===pathCommand)return segment2;if(absCommand==="A")return[absCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]+lastX,segment2[7]+lastY];if(absCommand==="V")return[absCommand,segment2[1]+lastY];if(absCommand==="H")return[absCommand,segment2[1]+lastX];if(absCommand==="L")return[absCommand,segment2[1]+lastX,segment2[2]+lastY];if(absCommand==="C")return[absCommand,segment2[1]+lastX,segment2[2]+lastY,segment2[3]+lastX,segment2[4]+lastY,segment2[5]+lastX,segment2[6]+lastY];{let absValues=[],seglen=segment2.length;for(let j6=1;j6<seglen;j6+=1)absValues.push(segment2[j6]+(j6%2?lastX:lastY));return[absCommand].concat(absValues)}},iterate=(path,iterator)=>{let x6=0,y2=0,mx3=0,my3=0,i6=0;for(;i6<path.length;){let segment2=path[i6],[pathCommand]=segment2,commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,iteratorResult=iterator(segment2,i6,x6,y2);if(iteratorResult===!1)break;if(absCommand==="Z")x6=mx3,y2=my3;else if(absCommand==="H")x6=segment2[1]+(isRelative?x6:0);else if(absCommand==="V")y2=segment2[1]+(isRelative?y2:0);else{let segLen=segment2.length;x6=segment2[segLen-2]+(isRelative?x6:0),y2=segment2[segLen-1]+(isRelative?y2:0),absCommand==="M"&&(mx3=x6,my3=y2)}iteratorResult&&(path[i6]=iteratorResult),i6+=1}return path},pathToAbsolute=pathInput=>{let path=parsePathString(pathInput);return iterate(path,absolutizeSegment)},relativizeSegment=(segment2,index,lastX,lastY)=>{let[pathCommand]=segment2,relCommand=pathCommand.toLowerCase();if(index===0||pathCommand===relCommand)return segment2;if(relCommand==="a")return[relCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5],segment2[6]-lastX,segment2[7]-lastY];if(relCommand==="v")return[relCommand,segment2[1]-lastY];if(relCommand==="h")return[relCommand,segment2[1]-lastX];if(relCommand==="l")return[relCommand,segment2[1]-lastX,segment2[2]-lastY];{let relValues=[],seglen=segment2.length;for(let j6=1;j6<seglen;j6+=1)relValues.push(segment2[j6]-(j6%2?lastX:lastY));return[relCommand].concat(relValues)}},pathToRelative=pathInput=>{let path=parsePathString(pathInput);return iterate(path,relativizeSegment)},arcToCubic=(X12,Y12,RX,RY2,angle,LAF,SF2,X22,Y22,recursive)=>{let x12=X12,y12=Y12,rx3=RX,ry3=RY2,x22=X22,y2=Y22,d120=Math.PI*120/180,rad=Math.PI/180*(+angle||0),res2=[],xy3,f12,f2,cx3,cy3;if(recursive)[f12,f2,cx3,cy3]=recursive;else{xy3=rotateVector(x12,y12,-rad),x12=xy3.x,y12=xy3.y,xy3=rotateVector(x22,y2,-rad),x22=xy3.x,y2=xy3.y;let x6=(x12-x22)/2,y6=(y12-y2)/2,h3=x6*x6/(rx3*rx3)+y6*y6/(ry3*ry3);h3>1&&(h3=Math.sqrt(h3),rx3*=h3,ry3*=h3);let rx22=rx3*rx3,ry22=ry3*ry3,k7=(LAF===SF2?-1:1)*Math.sqrt(Math.abs((rx22*ry22-rx22*y6*y6-ry22*x6*x6)/(rx22*y6*y6+ry22*x6*x6)));cx3=k7*rx3*y6/ry3+(x12+x22)/2,cy3=k7*-ry3*x6/rx3+(y12+y2)/2,f12=Math.asin(((y12-cy3)/ry3*10**9>>0)/10**9),f2=Math.asin(((y2-cy3)/ry3*10**9>>0)/10**9),f12=x12<cx3?Math.PI-f12:f12,f2=x22<cx3?Math.PI-f2:f2,f12<0&&(f12=Math.PI*2+f12),f2<0&&(f2=Math.PI*2+f2),SF2&&f12>f2&&(f12-=Math.PI*2),!SF2&&f2>f12&&(f2-=Math.PI*2)}let df3=f2-f12;if(Math.abs(df3)>d120){let f2old=f2,x2old=x22,y2old=y2;f2=f12+d120*(SF2&&f2>f12?1:-1),x22=cx3+rx3*Math.cos(f2),y2=cy3+ry3*Math.sin(f2),res2=arcToCubic(x22,y2,rx3,ry3,angle,0,SF2,x2old,y2old,[f2,f2old,cx3,cy3])}df3=f2-f12;let c12=Math.cos(f12),s12=Math.sin(f12),c22=Math.cos(f2),s22=Math.sin(f2),t53=Math.tan(df3/4),hx3=4/3*rx3*t53,hy3=4/3*ry3*t53,m12=[x12,y12],m22=[x12+hx3*s12,y12-hy3*c12],m32=[x22+hx3*s22,y2-hy3*c22],m42=[x22,y2];if(m22[0]=2*m12[0]-m22[0],m22[1]=2*m12[1]-m22[1],recursive)return[m22[0],m22[1],m32[0],m32[1],m42[0],m42[1]].concat(res2);res2=[m22[0],m22[1],m32[0],m32[1],m42[0],m42[1]].concat(res2);let newres=[];for(let i6=0,ii3=res2.length;i6<ii3;i6+=1)newres[i6]=i6%2?rotateVector(res2[i6-1],res2[i6],rad).y:rotateVector(res2[i6],res2[i6+1],rad).x;return newres},quadToCubic=(x12,y12,qx3,qy3,x22,y2)=>{let r13=.3333333333333333,r23=2/3;return[r13*x12+r23*qx3,r13*y12+r23*qy3,r13*x22+r23*qx3,r13*y2+r23*qy3,x22,y2]},lineToCubic=(x12,y12,x22,y2)=>{let c12=midPoint([x12,y12],[x22,y2],.3333333333333333),c22=midPoint([x12,y12],[x22,y2],2/3);return[c12[0],c12[1],c22[0],c22[1],x22,y2]},segmentToCubic=(segment2,params)=>{let pathCommand=segment2[0],values=segment2.slice(1).map(Number),[x6,y2]=values,{x1:px1,y1:py1}=params;return"TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="M"?(params.mx=x6,params.my=y2,params.x=x6,params.y=y2,segment2):pathCommand==="A"?["C"].concat(arcToCubic(px1,py1,values[0],values[1],values[2],values[3],values[4],values[5],values[6])):pathCommand==="Q"?(params.qx=x6,params.qy=y2,["C"].concat(quadToCubic(px1,py1,values[0],values[1],values[2],values[3]))):pathCommand==="L"?["C"].concat(lineToCubic(px1,py1,x6,y2)):pathCommand==="Z"?["C"].concat(lineToCubic(px1,py1,params.mx,params.my)):segment2},normalizeSegment=(segment2,params)=>{let[pathCommand]=segment2,absCommand=pathCommand.toUpperCase(),isRelative=pathCommand!==absCommand,{x1:px1,y1:py1,x2:px22,y2:py22,x:x6,y:y2}=params,values=segment2.slice(1),absValues=values.map((n3,j6)=>n3+(isRelative?j6%2?y2:x6:0));if("TQ".includes(absCommand)||(params.qx=null,params.qy=null),absCommand==="A")return absValues=values.slice(0,-2).concat(values[5]+(isRelative?x6:0),values[6]+(isRelative?y2:0)),["A"].concat(absValues);if(absCommand==="H")return["L",segment2[1]+(isRelative?x6:0),py1];if(absCommand==="V")return["L",px1,segment2[1]+(isRelative?y2:0)];if(absCommand==="L")return["L",segment2[1]+(isRelative?x6:0),segment2[2]+(isRelative?y2:0)];if(absCommand==="M")return["M",segment2[1]+(isRelative?x6:0),segment2[2]+(isRelative?y2:0)];if(absCommand==="C")return["C"].concat(absValues);if(absCommand==="S"){let x12=px1*2-px22,y12=py1*2-py22;return params.x1=x12,params.y1=y12,["C",x12,y12].concat(absValues)}else if(absCommand==="T"){let qx3=px1*2-(params.qx?params.qx:0),qy3=py1*2-(params.qy?params.qy:0);return params.qx=qx3,params.qy=qy3,["Q",qx3,qy3].concat(absValues)}else if(absCommand==="Q"){let[nqx,nqy]=absValues;return params.qx=nqx,params.qy=nqy,["Q"].concat(absValues)}else if(absCommand==="Z")return["Z"];return segment2},paramsParser={mx:0,my:0,x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},pathToCurve=pathInput=>{let params={...paramsParser},path=parsePathString(pathInput);return iterate(path,(seg,index,lastX,lastY)=>{params.x=lastX,params.y=lastY;let normalSegment=normalizeSegment(seg,params);normalSegment[0]==="M"&&(params.mx=normalSegment[1],params.my=normalSegment[2]);let result=segmentToCubic(normalSegment,params);result[0]==="C"&&result.length>7&&(path.splice(index+1,0,["C"].concat(result.slice(7))),result=result.slice(0,7));let seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},pathToString=(path,roundOption)=>{let pathLen=path.length,{round}=defaultOptions2,segment2=path[0],result="";round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off";let pow=round==="off"?0:10**round;for(let i6=0;i6<pathLen;i6+=1){segment2=path[i6];let pathCommand=segment2[0],segLen=segment2.length;if(result+=pathCommand,round==="off")for(let j6=1;j6<segLen;j6+=1)result+=segment2[j6],j6!==segLen-1&&(result+=" ");else for(let j6=1;j6<segLen;j6+=1)result+=Math.round(segment2[j6]*pow)/pow,j6!==segLen-1&&(result+=" ")}return result},getPathBBox=pathInput=>{if(!pathInput)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let path=parsePathString(pathInput),pathCommand="M",mx3=0,my3=0,{max:max2,min}=Math,xMin=1/0,yMin=1/0,xMax=-1/0,yMax=-1/0,minX=0,minY=0,maxX=0,maxY=0,paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0;iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,absoluteSegment=isRelative?absolutizeSegment(seg,index,lastX,lastY):seg,normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,absCommand!=="T"&&absCommand!=="Q"&&(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment,minX=mx3,minY=my3,maxX=mx3,maxY=my3;else if(pathCommand==="L")[minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")[minX,minY,maxX,maxY]=getArcBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?[minX,minY,maxX,maxY]=getCubicBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],[minX,minY,maxX,maxY]=getQuadBBox(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&([minX,minY,maxX,maxY]=getLineBBox(lastX,lastY,mx3,my3));if(xMin=min(minX,xMin),yMin=min(minY,yMin),xMax=max2(maxX,xMax),yMax=max2(maxY,yMax),pathCommand==="Z")paramX1=mx3,paramY1=my3;else{let segLen=normalSegment.length;paramX1=normalSegment[segLen-2],paramY1=normalSegment[segLen-1]}pathCommand==="C"?(paramX2=normalSegment[3],paramY2=normalSegment[4]):pathCommand==="S"?(paramX2=normalSegment[1],paramY2=normalSegment[2]):(paramX2=paramX1,paramY2=paramY1)});let width=xMax-xMin,height=yMax-yMin;return{width,height,x:xMin,y:yMin,x2:xMax,y2:yMax,cx:xMin+width/2,cy:yMin+height/2,cz:Math.max(width,height)+Math.min(width,height)/2}},getTotalLength=pathInput=>{let path=parsePathString(pathInput),paramX1=0,paramY1=0,paramX2=0,paramY2=0,paramQX=0,paramQY=0,pathCommand="M",mx3=0,my3=0,totalLength=0;return iterate(path,(seg,index,lastX,lastY)=>{[pathCommand]=seg;let absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),normalSegment=absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if([pathCommand]=normalSegment,"TQ".includes(absCommand)||(paramQX=0,paramQY=0),pathCommand==="M")[,mx3,my3]=normalSegment;else if(pathCommand==="L")totalLength+=getLineLength(lastX,lastY,normalSegment[1],normalSegment[2]);else if(pathCommand==="A")totalLength+=getArcLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6],normalSegment[7]);else if(pathCommand==="S"){let cp1x=paramX1*2-paramX2,cp1y=paramY1*2-paramY2;totalLength+=getCubicLength(lastX,lastY,cp1x,cp1y,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])}else pathCommand==="C"?totalLength+=getCubicLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4],normalSegment[5],normalSegment[6]):pathCommand==="T"?(paramQX=paramX1*2-paramQX,paramQY=paramY1*2-paramQY,totalLength+=getQuadLength(lastX,lastY,paramQX,paramQY,normalSegment[1],normalSegment[2])):pathCommand==="Q"?(paramQX=normalSegment[1],paramQY=normalSegment[2],totalLength+=getQuadLength(lastX,lastY,normalSegment[1],normalSegment[2],normalSegment[3],normalSegment[4])):pathCommand==="Z"&&(totalLength+=getLineLength(lastX,lastY,mx3,my3));[paramX1,paramY1]=pathCommand==="Z"?[mx3,my3]:normalSegment.slice(-2),[paramX2,paramY2]=pathCommand==="C"?[normalSegment[3],normalSegment[4]]:pathCommand==="S"?[normalSegment[1],normalSegment[2]]:[paramX1,paramY1]}),totalLength},DISTANCE_EPSILON=1e-5,normalizePath=pathInput=>{let path=parsePathString(pathInput),params={...paramsParser};return iterate(path,(seg,_3,lastX,lastY)=>{params.x=lastX,params.y=lastY;let result=normalizeSegment(seg,params),seglen=result.length;return params.x1=+result[seglen-2],params.y1=+result[seglen-1],params.x2=+result[seglen-4]||params.x1,params.y2=+result[seglen-3]||params.y1,result})},getPointAtLength=(pathInput,distance8)=>{let path=normalizePath(pathInput),isM=!1,data=[],[mx3,my3]=path[0].slice(1),distanceIsNumber=typeof distance8=="number",point6={x:mx3,y:my3},length4=0,POINT=point6,totalLength=0;return!distanceIsNumber||distance8<1e-5?point6:(iterate(path,(seg,_3,lastX,lastY)=>{let pathCommand=seg[0];if(isM=pathCommand==="M",data=isM?data:[lastX,lastY].concat(seg.slice(1)),isM?([,mx3,my3]=seg,point6={x:mx3,y:my3},length4=0):pathCommand==="L"?(point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])):pathCommand==="A"?(point6=getPointAtArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],distance8-totalLength),length4=getArcLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8])):pathCommand==="C"?(point6=getPointAtCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],distance8-totalLength),length4=getCubicLength(data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7])):pathCommand==="Q"?(point6=getPointAtQuadLength(data[0],data[1],data[2],data[3],data[4],data[5],distance8-totalLength),length4=getQuadLength(data[0],data[1],data[2],data[3],data[4],data[5])):pathCommand==="Z"&&(data=[lastX,lastY,mx3,my3],point6=getPointAtLineLength(data[0],data[1],data[2],data[3],distance8-totalLength),length4=getLineLength(data[0],data[1],data[2],data[3])),totalLength<distance8)POINT=point6;else return!1;totalLength+=length4}),POINT)},getPropertiesAtLength=(pathInput,distance8)=>{let pathArray=parsePathString(pathInput),pathTemp=pathArray.slice(0),pathLength4=getTotalLength(pathTemp),index=pathTemp.length-1,lengthAtSegment=0,length4=0,segment2=pathArray[0];if(index<=0||!distance8||!Number.isFinite(distance8))return{segment:segment2,index:0,length:length4,lengthAtSegment};if(distance8>=pathLength4)return pathTemp=pathArray.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,segment2=pathArray[index],{segment:segment2,index,length:length4,lengthAtSegment};let segments=[];for(;index>0;)segment2=pathTemp[index],pathTemp=pathTemp.slice(0,-1),lengthAtSegment=getTotalLength(pathTemp),length4=pathLength4-lengthAtSegment,pathLength4=lengthAtSegment,segments.push({segment:segment2,index,length:length4,lengthAtSegment}),index-=1;return segments.find(({lengthAtSegment:l6})=>l6<=distance8)},getPropertiesAtPoint=(pathInput,point6)=>{let path=parsePathString(pathInput),normalPath=normalizePath(path),pathLength4=getTotalLength(normalPath),distanceTo=p3=>{let dx3=p3.x-point6.x,dy3=p3.y-point6.y;return dx3*dx3+dy3*dy3},precision=8,scan,closest={x:0,y:0},scanDistance=0,bestLength=0,bestDistance=1/0;for(let scanLength=0;scanLength<=pathLength4;scanLength+=precision)scan=getPointAtLength(normalPath,scanLength),scanDistance=distanceTo(scan),scanDistance<bestDistance&&(closest=scan,bestLength=scanLength,bestDistance=scanDistance);precision/=2;let before,after,beforeLength=0,afterLength=0,beforeDistance=0,afterDistance=0;for(;precision>1e-6&&(beforeLength=bestLength-precision,before=getPointAtLength(normalPath,beforeLength),beforeDistance=distanceTo(before),afterLength=bestLength+precision,after=getPointAtLength(normalPath,afterLength),afterDistance=distanceTo(after),beforeLength>=0&&beforeDistance<bestDistance?(closest=before,bestLength=beforeLength,bestDistance=beforeDistance):afterLength<=pathLength4&&afterDistance<bestDistance?(closest=after,bestLength=afterLength,bestDistance=afterDistance):precision/=2,!(precision<1e-5)););let segment2=getPropertiesAtLength(path,bestLength);return{closest,distance:Math.sqrt(bestDistance),segment:segment2}},getClosestPoint=(pathInput,point6)=>getPropertiesAtPoint(pathInput,point6).closest,getCubicSegArea=(x12,y12,c1x,c1y,c2x,c2y,x22,y2)=>3*((y2-y12)*(c1x+c2x)-(x22-x12)*(c1y+c2y)+c1y*(x12-c2x)-c1x*(y12-c2y)+y2*(c2x+x12/3)-x22*(c2y+y12/3))/20,getPathArea=path=>{let x6=0,y2=0,len=0;return pathToCurve(path).map(seg=>seg[0]==="M"?([,x6,y2]=seg,0):(len=getCubicSegArea(x6,y2,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]),[x6,y2]=seg.slice(-2),len)).reduce((a6,b6)=>a6+b6,0)},getDrawDirection=path=>getPathArea(pathToCurve(path))>=0,getSegmentAtLength=(pathInput,distance8)=>getPropertiesAtLength(pathInput,distance8).segment,getSegmentOfPoint=(path,point6)=>getPropertiesAtPoint(path,point6).segment,isPathArray=path=>Array.isArray(path)&&path.every(seg=>{let lk2=seg[0].toLowerCase();return paramsCounts[lk2]===seg.length-1&&"achlmqstvz".includes(lk2)&&seg.slice(1).every(Number.isFinite)})&&path.length>0,isAbsoluteArray=path=>isPathArray(path)&&path.every(([x6])=>x6===x6.toUpperCase()),isNormalizedArray=path=>isAbsoluteArray(path)&&path.every(([pc2])=>"ACLMQZ".includes(pc2)),isPolygonArray=path=>isNormalizedArray(path)&&path.every(([pc2])=>"MLVHZ".includes(pc2)),isCurveArray=path=>isNormalizedArray(path)&&path.every(([pc2])=>"MC".includes(pc2)),isPointInStroke=(pathInput,point6)=>{let{distance:distance8}=getPropertiesAtPoint(pathInput,point6);return Math.abs(distance8)<DISTANCE_EPSILON},isRelativeArray=path=>isPathArray(path)&&path.slice(1).every(([pc2])=>pc2===pc2.toLowerCase()),isValidPath=pathString=>{if(typeof pathString!="string"||!pathString.length)return!1;let path=new PathParser(pathString);for(skipSpaces(path);path.index<path.max&&!path.err.length;)scanSegment(path);return!path.err.length&&"mM".includes(path.segments[0][0])};function samplePolygon(path){let points=[],[mx3,my3]=[0,0];return iterate(path,seg=>{let cmd=seg[0];if(cmd==="M")[mx3,my3]=[seg[1],seg[2]],points.push([mx3,my3]);else if(cmd==="L")points.push([seg[1],seg[2]]);else if(cmd==="C")points.push([seg[5],seg[6]]);else if(cmd==="A")points.push([seg[6],seg[7]]);else if(cmd==="Z")points.push([mx3,my3]);else throw new TypeError(`${error}: path command "${cmd}" is not supported`)}),points}var shapeParams={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"]},isElement=node=>node!=null&&typeof node=="object"&&node.nodeType===1,getLinePath=attr=>{let{x1:x12,y1:y12,x2:x22,y2}=attr;return[x12,y12,x22,y2]=[x12,y12,x22,y2].map(a6=>+a6),[["M",x12,y12],["L",x22,y2]]},getPolyPath=attr=>{let pathArray=[],points=(attr.points||"").trim().split(/[\s|,]/).map(a6=>+a6),index=0;for(;index<points.length;)pathArray.push([index?"L":"M",points[index],points[index+1]]),index+=2;return attr.type==="polygon"?[...pathArray,["z"]]:pathArray},getCirclePath=attr=>{let{cx:cx3,cy:cy3,r:r6}=attr;return[cx3,cy3,r6]=[cx3,cy3,r6].map(a6=>+a6),[["M",cx3-r6,cy3],["a",r6,r6,0,1,0,2*r6,0],["a",r6,r6,0,1,0,-2*r6,0]]},getEllipsePath=attr=>{let{cx:cx3,cy:cy3}=attr,rx3=attr.rx||0,ry3=attr.ry||rx3;return[cx3,cy3,rx3,ry3]=[cx3,cy3,rx3,ry3].map(a6=>+a6),[["M",cx3-rx3,cy3],["a",rx3,ry3,0,1,0,2*rx3,0],["a",rx3,ry3,0,1,0,-2*rx3,0]]},getRectanglePath=attr=>{let x6=+attr.x||0,y2=+attr.y||0,w3=+attr.width,h3=+attr.height,rx3=+(attr.rx||0),ry3=+(attr.ry||rx3);return rx3||ry3?(rx3*2>w3&&(rx3-=(rx3*2-w3)/2),ry3*2>h3&&(ry3-=(ry3*2-h3)/2),[["M",x6+rx3,y2],["h",w3-rx3*2],["s",rx3,0,rx3,ry3],["v",h3-ry3*2],["s",0,ry3,-rx3,ry3],["h",-w3+rx3*2],["s",-rx3,0,-rx3,-ry3],["v",-h3+ry3*2],["s",0,-ry3,rx3,-ry3]]):[["M",x6,y2],["h",w3],["v",h3],["H",x6],["Z"]]},shapeToPathArray=element=>{let supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName&&[...supportedShapes,"path"].every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type};targetIsElement?shapeAttrs.forEach(p3=>{config[p3]=element.getAttribute(p3)}):Object.assign(config,element);let pathArray=[];return type==="circle"?pathArray=getCirclePath(config):type==="ellipse"?pathArray=getEllipsePath(config):["polyline","polygon"].includes(type)?pathArray=getPolyPath(config):type==="rect"?pathArray=getRectanglePath(config):type==="line"?pathArray=getLinePath(config):["glyph","path"].includes(type)&&(pathArray=parsePathString(targetIsElement?element.getAttribute("d")||"":element.d||"")),isPathArray(pathArray)&&pathArray.length?pathArray:!1},shapeToPath=(element,replace,ownerDocument)=>{let doc=ownerDocument||document,supportedShapes=Object.keys(shapeParams),targetIsElement=isElement(element),tagName=targetIsElement?element.tagName:null;if(tagName==="path")throw TypeError(`${error}: "${tagName}" is already SVGPathElement`);if(tagName&&supportedShapes.every(s6=>tagName!==s6))throw TypeError(`${error}: "${tagName}" is not SVGElement`);let path=doc.createElementNS("http://www.w3.org/2000/svg","path"),type=targetIsElement?tagName:element.type,shapeAttrs=shapeParams[type],config={type},round=defaultOptions2.round,pathArray=shapeToPathArray(element),description=pathArray&&pathArray.length?pathToString(pathArray,round):"";if(targetIsElement){shapeAttrs.forEach(p3=>{config[p3]=element.getAttribute(p3)});for(let i6=0;i6<element.attributes.length;i6++){let attr=element.attributes[i6];attr&&!shapeAttrs.includes(attr.name)&&path.setAttribute(attr.name,attr.value)}}else Object.assign(config,element),Object.keys(config).forEach(k7=>{!shapeAttrs.includes(k7)&&k7!=="type"&&path.setAttribute(k7.replace(/[A-Z]/g,m6=>`-${m6.toLowerCase()}`),config[k7])});return isValidPath(description)?(path.setAttribute("d",description),replace&&targetIsElement&&(element.before(path,element),element.remove()),path):!1},isMultiPath=path=>{if(typeof path=="string"){let matches=path.match(/[Mm]/g);return matches?matches.length>1:!1}if(isPathArray(path)){let moveCount=0;for(let segment2 of path)if(segment2[0].toUpperCase()==="M"&&(moveCount++,moveCount>1))return!0;return!1}throw new TypeError("SVGPathCommanderError: expected string or PathArray")};function isPolylineArray(path){return isNormalizedArray(path)&&path.every(([pc2])=>"MLVH".includes(pc2))}var isClosedPath=path=>path[path.length-1][0].toUpperCase()==="Z",shortenSegment=(segment2,normalSegment,params,prevCommand)=>{let[pathCommand]=segment2,{round:defaultRound}=defaultOptions2,round=typeof defaultRound=="number"?defaultRound:4,normalValues=normalSegment.slice(1),{x1:x12,y1:y12,x2:x22,y2,x:x6,y:y6}=params,[nx3,ny3]=normalValues.slice(-2),result=segment2;if("TQ".includes(pathCommand)||(params.qx=null,params.qy=null),pathCommand==="L"){if(roundTo(x6,round)===roundTo(nx3,round))return["V",ny3];if(roundTo(y6,round)===roundTo(ny3,round))return["H",nx3]}else if(pathCommand==="C"){let[nx1,ny1]=normalValues;if(params.x1=nx1,params.y1=ny1,"CS".includes(prevCommand)&&(roundTo(nx1,round)===roundTo(x12*2-x22,round)&&roundTo(ny1,round)===roundTo(y12*2-y2,round)||roundTo(x12,round)===roundTo(x22*2-x6,round)&&roundTo(y12,round)===roundTo(y2*2-y6,round)))return["S",normalValues[2],normalValues[3],normalValues[4],normalValues[5]]}else if(pathCommand==="Q"){let[qx3,qy3]=normalValues;if(params.qx=qx3,params.qy=qy3,"QT".includes(prevCommand)&&roundTo(qx3,round)===roundTo(x12*2-x22,round)&&roundTo(qy3,round)===roundTo(y12*2-y2,round))return["T",normalValues[2],normalValues[3]]}return result},roundSegment=(segment2,roundOption)=>{let values=segment2.slice(1).map(n3=>roundTo(n3,roundOption));return[segment2[0]].concat(values)},optimizePath=(pathInput,roundOption)=>{let path=pathToAbsolute(pathInput),round=typeof roundOption=="number"&&roundOption>=0?roundOption:2,optimParams={...paramsParser},allPathCommands=[],pathCommand="M",prevCommand="Z";return iterate(path,(seg,i6,lastX,lastY)=>{optimParams.x=lastX,optimParams.y=lastY;let normalizedSegment=normalizeSegment(seg,optimParams),result=seg;if(pathCommand=seg[0],allPathCommands[i6]=pathCommand,i6){prevCommand=allPathCommands[i6-1];let shortSegment=shortenSegment(seg,normalizedSegment,optimParams,prevCommand),absSegment=roundSegment(shortSegment,round),absString=absSegment.join(""),relativeSegment=relativizeSegment(shortSegment,i6,lastX,lastY),relSegment=roundSegment(relativeSegment,round),relString=relSegment.join("");result=absString.length<relString.length?absSegment:relSegment}let seglen=normalizedSegment.length;return optimParams.x1=+normalizedSegment[seglen-2],optimParams.y1=+normalizedSegment[seglen-1],optimParams.x2=+normalizedSegment[seglen-4]||optimParams.x1,optimParams.y2=+normalizedSegment[seglen-3]||optimParams.y1,result})},reversePath=pathInput=>{let absolutePath=pathToAbsolute(pathInput),normalizedPath=normalizePath(absolutePath),pLen=absolutePath.length,isClosed=absolutePath[pLen-1][0]==="Z",reversedPath=iterate(absolutePath,(segment2,i6)=>{let normalizedSegment=normalizedPath[i6],prevSeg=i6&&absolutePath[i6-1],prevCommand=prevSeg&&prevSeg[0],nextSeg=absolutePath[i6+1],nextCommand=nextSeg&&nextSeg[0],pathCommand=segment2[0],[x6,y2]=normalizedPath[i6?i6-1:pLen-1].slice(-2),result=segment2;switch(pathCommand){case"M":result=isClosed?["Z"]:[pathCommand,x6,y2];break;case"A":result=[pathCommand,segment2[1],segment2[2],segment2[3],segment2[4],segment2[5]===1?0:1,x6,y2];break;case"C":nextSeg&&nextCommand==="S"?result=["S",segment2[1],segment2[2],x6,y2]:result=[pathCommand,segment2[3],segment2[4],segment2[1],segment2[2],x6,y2];break;case"S":prevCommand&&"CS".includes(prevCommand)&&(!nextSeg||nextCommand!=="S")?result=["C",normalizedSegment[3],normalizedSegment[4],normalizedSegment[1],normalizedSegment[2],x6,y2]:result=[pathCommand,normalizedSegment[1],normalizedSegment[2],x6,y2];break;case"Q":nextSeg&&nextCommand==="T"?result=["T",x6,y2]:result=[pathCommand,segment2[1],segment2[2],x6,y2];break;case"T":prevCommand&&"QT".includes(prevCommand)&&(!nextSeg||nextCommand!=="T")?result=["Q",normalizedSegment[1],normalizedSegment[2],x6,y2]:result=[pathCommand,x6,y2];break;case"Z":result=["M",x6,y2];break;case"H":result=[pathCommand,x6];break;case"V":result=[pathCommand,y2];break;default:result=[pathCommand].concat(segment2.slice(1,-2),x6,y2)}return result});return isClosed?reversedPath.reverse():[reversedPath[0]].concat(reversedPath.slice(1).reverse())},splitPath=pathInput=>{let composite=[],parsedPath=parsePathString(pathInput),path=[],pi3=-1,x6=0,y2=0,mx3=0,my3=0;return iterate(parsedPath,(seg,_3,prevX,prevY)=>{let cmd=seg[0],absCommand=cmd.toUpperCase(),isRelative=cmd===cmd.toLowerCase(),values=seg.slice(1);absCommand==="M"?(pi3+=1,[x6,y2]=values,x6+=isRelative?prevX:0,y2+=isRelative?prevY:0,mx3=x6,my3=y2,path=[isRelative?[absCommand,mx3,my3]:seg]):(absCommand==="Z"?(x6=mx3,y2=my3):absCommand==="H"?([,x6]=seg,x6+=isRelative?prevX:0):absCommand==="V"?([,y2]=seg,y2+=isRelative?prevY:0):([x6,y2]=seg.slice(-2),x6+=isRelative?prevX:0,y2+=isRelative?prevY:0),path.push(seg)),composite[pi3]=path}),composite},getSVGMatrix=transform7=>{let matrix2=new CSSMatrix,{origin}=transform7,[originX,originY]=origin,{translate:translate7}=transform7,{rotate:rotate5}=transform7,{skew}=transform7,{scale:scale6}=transform7;return Array.isArray(translate7)&&translate7.length>=2&&translate7.every(x6=>!Number.isNaN(+x6))&&translate7.some(x6=>x6!==0)?matrix2=matrix2.translate(...translate7):typeof translate7=="number"&&!Number.isNaN(translate7)&&(matrix2=matrix2.translate(translate7)),(rotate5||skew||scale6)&&(matrix2=matrix2.translate(originX,originY),Array.isArray(rotate5)&&rotate5.length>=2&&rotate5.every(x6=>!Number.isNaN(+x6))&&rotate5.some(x6=>x6!==0)?matrix2=matrix2.rotate(...rotate5):typeof rotate5=="number"&&!Number.isNaN(rotate5)&&(matrix2=matrix2.rotate(rotate5)),Array.isArray(skew)&&skew.length===2&&skew.every(x6=>!Number.isNaN(+x6))&&skew.some(x6=>x6!==0)?(matrix2=skew[0]?matrix2.skewX(skew[0]):matrix2,matrix2=skew[1]?matrix2.skewY(skew[1]):matrix2):typeof skew=="number"&&!Number.isNaN(skew)&&(matrix2=matrix2.skewX(skew)),Array.isArray(scale6)&&scale6.length>=2&&scale6.every(x6=>!Number.isNaN(+x6))&&scale6.some(x6=>x6!==1)?matrix2=matrix2.scale(...scale6):typeof scale6=="number"&&!Number.isNaN(scale6)&&(matrix2=matrix2.scale(scale6)),matrix2=matrix2.translate(-originX,-originY)),matrix2},translatePoint=(cssm,v6)=>{if(cssm.is2D)return[cssm.a*v6[0]+cssm.c*v6[1]+cssm.e*v6[3],cssm.b*v6[0]+cssm.d*v6[1]+cssm.f*v6[3],0,1];let m6=CSSMatrix.Translate(v6[0],v6[1],v6[2]);return[,,,m6.m44]=v6,m6=cssm.multiply(m6),[m6.m41,m6.m42,m6.m43,m6.m44]},projection2d=(m6,point2D,origin)=>{let[originX,originY,originZ]=origin,[x6,y2,z6]=translatePoint(m6,[point2D[0],point2D[1],0,1]),relativePositionX=x6-originX,relativePositionY=y2-originY,relativePositionZ=z6-originZ;return[relativePositionX*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originX,relativePositionY*(Math.abs(originZ)/Math.abs(relativePositionZ)||1)+originY]},transform2D=(path,a6,b6,c3,d3,e6,f2,originX,originY)=>{let result=[],x6=0,y2=0,lx3=0,ly3=0,ox3=0,oy3=0,omx=0,omy=0;for(let i6=0,len=path.length;i6<len;i6+=1){let seg=path[i6],pathCommand=seg[0],commandCode=pathCommand.charCodeAt(0),isRelative=commandCode>=97,absCommand=isRelative?String.fromCharCode(commandCode-32):pathCommand,outCommand=i6===0&&isRelative?pathCommand:absCommand;if(absCommand==="Z"){result.push(["Z"]),ox3=omx,oy3=omy;continue}if(absCommand==="V"){let absY=seg[1]+(isRelative?oy3:0);lx3=a6*ox3+c3*absY+e6-originX+originX,ly3=b6*ox3+d3*absY+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",ox3,absY]),oy3=absY,x6=lx3,y2=ly3;continue}if(absCommand==="H"){let absX=seg[1]+(isRelative?ox3:0);lx3=a6*absX+c3*oy3+e6-originX+originX,ly3=b6*absX+d3*oy3+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",absX,oy3]),ox3=absX,x6=lx3,y2=ly3;continue}if(absCommand==="A"){let absX=seg[6]+(isRelative?ox3:0),absY=seg[7]+(isRelative?oy3:0),cubics=arcToCubic(ox3,oy3,seg[1],seg[2],seg[3],seg[4],seg[5],absX,absY),cubicsLen=cubics.length,k7=0;if(cubicsLen>0)do{let piece=["C"],end=k7+6;for(let j6=k7;j6<end;j6+=2)lx3=a6*cubics[j6]+c3*cubics[j6+1]+e6-originX+originX,ly3=b6*cubics[j6]+d3*cubics[j6+1]+f2-originY+originY,piece.push(lx3,ly3);result.push(piece),k7=end}while(k7<cubicsLen);else result.push(["C"]);cubicsLen>0?(ox3=cubics[cubicsLen-2],oy3=cubics[cubicsLen-1]):(ox3=absX,oy3=absY),x6=lx3,y2=ly3;continue}if(absCommand==="L"){let absX=seg[1]+(isRelative?ox3:0),absY=seg[2]+(isRelative?oy3:0);lx3=a6*absX+c3*absY+e6-originX+originX,ly3=b6*absX+d3*absY+f2-originY+originY,x6!==lx3&&y2!==ly3?result.push(["L",lx3,ly3]):y2===ly3?result.push(["H",lx3]):x6===lx3?result.push(["V",ly3]):result.push(["L",absX,absY]),ox3=absX,oy3=absY,x6=lx3,y2=ly3;continue}{let piece=[outCommand],segLen=seg.length;for(let j6=1;j6<segLen;j6+=2){let absX=seg[j6]+(isRelative?ox3:0),absY=seg[j6+1]+(isRelative?oy3:0);lx3=a6*absX+c3*absY+e6-originX+originX,ly3=b6*absX+d3*absY+f2-originY+originY,piece.push(lx3,ly3)}result.push(piece),ox3=seg[segLen-2]+(isRelative?ox3:0),oy3=seg[segLen-1]+(isRelative?oy3:0),absCommand==="M"&&(omx=ox3,omy=oy3),x6=lx3,y2=ly3}}return result},transformPath=(pathInput,transform7)=>{let path=parsePathString(pathInput),transformProps=transform7&&Object.keys(transform7);if(!transform7||transformProps&&!transformProps.length)return path.slice(0);transform7.origin||Object.assign(transform7,{origin:defaultOptions2.origin});let origin=transform7.origin,matrixInstance=getSVGMatrix(transform7);if(matrixInstance.isIdentity)return path.slice(0);if(matrixInstance.is2D)return transform2D(path,matrixInstance.a,matrixInstance.b,matrixInstance.c,matrixInstance.d,matrixInstance.e,matrixInstance.f,origin[0],origin[1]);let x6=0,y2=0,lx3=0,ly3=0,j6=0,jj2=0;return iterate(path,(seg,index,lastX,lastY)=>{let[pathCommand]=seg,absCommand=pathCommand.toUpperCase(),absoluteSegment=absCommand!==pathCommand?absolutizeSegment(seg,index,lastX,lastY):seg.slice(0),result=absCommand==="A"?["C"].concat(arcToCubic(lastX,lastY,absoluteSegment[1],absoluteSegment[2],absoluteSegment[3],absoluteSegment[4],absoluteSegment[5],absoluteSegment[6],absoluteSegment[7])):absCommand==="V"?["L",lastX,absoluteSegment[1]]:absCommand==="H"?["L",absoluteSegment[1],lastY]:absoluteSegment;if(result[0]==="C"&&result.length>7){let tempSegment=result.slice(0,7);path.splice(index+1,0,["C"].concat(result.slice(7))),result=tempSegment}if(result[0]==="L")[lx3,ly3]=projection2d(matrixInstance,[result[1],result[2]],origin),x6!==lx3&&y2!==ly3?result=["L",lx3,ly3]:y2===ly3?result=["H",lx3]:x6===lx3&&(result=["V",ly3]);else for(j6=1,jj2=result.length;j6<jj2;j6+=2)[lx3,ly3]=projection2d(matrixInstance,[+result[j6],+result[j6+1]],origin),result[j6]=lx3,result[j6+1]=ly3;return x6=lx3,y2=ly3,result})},reverseCurve=path=>{let rotatedCurve=path.slice(1).map((x6,i6,curveOnly)=>i6?curveOnly[i6-1].slice(-2).concat(x6.slice(1)):path[0].slice(1).concat(x6.slice(1))).map(x6=>x6.map((_3,i6)=>x6[x6.length-i6-2*(1-i6%2)])).reverse();return[["M"].concat(rotatedCurve[0].slice(0,2))].concat(rotatedCurve.map(x6=>["C"].concat(x6.slice(2))))},roundPath=(path,roundOption)=>{let{round}=defaultOptions2;return round=roundOption==="off"||typeof roundOption=="number"&&roundOption>=0?roundOption:typeof round=="number"&&round>=0?round:"off",round==="off"?path.slice(0):iterate(path,segment2=>roundSegment(segment2,round))},fixPath=pathInput=>{let pathArray=parsePathString(pathInput);if(isClosedPath(pathArray)){let normalArray=normalizePath(pathArray),length4=pathArray.length,segBeforeZ=length4-2,[mx3,my3]=normalArray[0].slice(1),[x6,y2]=normalArray[segBeforeZ].slice(-2);mx3===x6&&my3===y2&&pathArray.splice(length4-1,1)}};function splitCubicSegment(x12,y12,x22,y2,x32,y32,x42,y42,t53){let[px01,py01]=midPoint([x12,y12],[x22,y2],t53),[px12,py12]=midPoint([x22,y2],[x32,y32],t53),[px23,py23]=midPoint([x32,y32],[x42,y42],t53),[cx0,cy0]=midPoint([px01,py01],[px12,py12],t53),[cx1,cy1]=midPoint([px12,py12],[px23,py23],t53),[px3,py3]=midPoint([cx0,cy0],[cx1,cy1],t53);return[[x12,y12,px01,py01,cx0,cy0,px3,py3],[px3,py3,cx1,cy1,px23,py23,x42,y42]]}var pathToPolyline=path=>{let normal=normalizePath(path);if(!isPolygonArray(normal)&&!isPolylineArray(normal))throw TypeError(`${error}: pathValue is not a polyline/polygon`);if(!isClosedPath(normal))return normal;let result=[normal[0]],[mx3,my3]=normal[0].slice(1);for(let i6=1;i6<normal.length;i6++){let seg=normal[i6];seg[0].toUpperCase()==="Z"?result.push(["L",mx3,my3]):result.push(seg)}return result};function splitLineToCount(x12,y12,x22,y2,count){if(count<=1)return[[x12,y12,x22,y2]];let result=[],dx3=x22-x12,dy3=y2-y12,currentX=x12,currentY=y12,i6=0;for(;i6<count;){let t53=1/(count-i6),nextX=x12+t53*dx3,nextY=y12+t53*dy3;result.push([currentX,currentY,nextX,nextY]),currentX=nextX,currentY=nextY,i6++}return result}function getPathSplits(path,target){if(target<=1)throw new TypeError(`${error}: target must be >= 2`);let totalLength=getTotalLength(path);if(totalLength===0)return Array(path.length).fill(1);let idealSegLen=totalLength/target,isPoly=isPolylineArray(path),splits=[1],lengths=[0];iterate(path,(seg,i6,prevX,prevY)=>{if(i6>0){let[endX,endY]=seg.slice(-2),segLen=isPoly?getLineLength(prevX,prevY,endX,endY):getCubicLength(prevX,prevY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6]);lengths.push(segLen),splits.push(1)}});let totalAllocated=1;for(let i6=1;i6<lengths.length;i6++){let segLen=lengths[i6],desired=segLen>idealSegLen?Math.round(segLen/idealSegLen):1;splits[i6]=desired,totalAllocated+=desired}let diff=target-totalAllocated;if(diff!==0){let candidates=[];for(let i6=1;i6<lengths.length;i6++)lengths[i6]>0&&candidates.push([i6,lengths[i6]]);let cLen=candidates.length;if(diff<0){candidates.sort((a6,b6)=>a6[1]-b6[1]);for(let i6=0;i6<cLen;i6++){let idx=candidates[i6][0];if(splits[idx]>1&&candidates[i6][1]>0&&(splits[idx]--,diff++),diff===0)break;i6===cLen-1&&(i6=0)}}else if(diff>0){candidates.sort((a6,b6)=>b6[1]-a6[1]);for(let i6=0;i6<cLen;i6++){let idx=candidates[i6][0];if(candidates[i6][1]>0&&(splits[idx]++,diff--),diff===0)break;i6===cLen-1&&(i6=0)}}}return splits}function splitLinePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i6=1;i6<pathLen;i6++){let[endX,endY]=path[i6].slice(1),count=splits[i6];if(count>=1){let subLines=splitLineToCount(currentX,currentY,endX,endY,count);for(let sub of subLines)newPath.push(["L",sub[2],sub[3]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`),newPath}function splitCubicToCount(x12,y12,x22,y2,x32,y32,x42,y42,count){if(count<=1)return[[x12,y12,x22,y2,x32,y32,x42,y42]];let result=[],cx1=x12,cy1=y12,cx22=x22,cy22=y2,cx3=x32,cy3=y32,cx4=x42,cy4=y42,i6=0;for(;i6<count;){let t53=1/(count-i6),[first,second]=splitCubicSegment(cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4,t53);result.push(first),[cx1,cy1,cx22,cy22,cx3,cy3,cx4,cy4]=second,i6++}return result}function splitCurvePathToCount(path,target){if(path.length<2||target<=1)return path;let splits=getPathSplits(path,target),totalAdded=0,newPath=[path[0]],pathLen=path.length,currentX=path[0][1],currentY=path[0][2];for(let i6=1;i6<pathLen;i6++){let seg=path[i6],[endX,endY]=seg.slice(-2),count=splits[i6];if(count>=1){let subs=splitCubicToCount(currentX,currentY,seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],count);for(let sub of subs)newPath.push(["C",sub[2],sub[3],sub[4],sub[5],sub[6],sub[7]]),totalAdded++}currentX=endX,currentY=endY}return newPath.length!==target&&console.warn(`${error}: requested ${target} segments, got ${newPath.length}.`),newPath}function getRotations(a6){let pathLen=a6.length,pointCount=pathLen-1,path,result=[];for(let idx=0;idx<pathLen;idx++){path=[];for(let i6=0;i6<pathLen;i6++){let oldSegIdx=idx+i6,seg;if(i6===0||a6[oldSegIdx]&&a6[oldSegIdx][0]==="M"){seg=a6[oldSegIdx],path.push(["M",...seg.slice(-2)]);continue}oldSegIdx>=pathLen&&(oldSegIdx-=pointCount),path.push(a6[oldSegIdx])}result.push(path)}return result}function getRotatedPath(pathA,pathB,computedRotations){let rotations=computedRotations||getRotations(pathA);if(pathA.length!==pathB.length)throw new TypeError("SVGPathCommanderError: paths must have the same number of segments after equalization");let bestIndex=0,minDistanceSq=1/0;for(let ri3=0;ri3<rotations.length;ri3++){let rotation5=rotations[ri3],rLen=rotation5.length,sumDistSq=0;for(let i6=0;i6<rLen;i6++){let segA=rotation5[i6],segB=pathB[i6],endA=segA.slice(-2),endB=segB.slice(-2),dx3=endA[0]-endB[0],dy3=endA[1]-endB[1];sumDistSq+=dx3*dx3+dy3*dy3}sumDistSq<minDistanceSq&&(minDistanceSq=sumDistSq,bestIndex=ri3)}return rotations[bestIndex]}var equalizeSegmentsDefaults={mode:"auto",sampleSize:10,roundValues:4,reverse:!0,close:!1,target:void 0},equalizeSegments=(path1,path2,initialCfg={})=>{let{close,mode,reverse,roundValues,target:initialTarget}=Object.assign(equalizeSegmentsDefaults,initialCfg),p12=normalizePath(path1),p22=normalizePath(path2);fixPath(p12),fixPath(p22);let bothPoly=(isPolygonArray(p12)||isPolylineArray(p12))&&(isPolygonArray(p22)||isPolylineArray(p22));bothPoly&&mode==="auto"?(p12=pathToPolyline(p12),p22=pathToPolyline(p22)):(bothPoly=!1,p12=pathToCurve(p12),p22=pathToCurve(p22));let area1=polygonArea(samplePolygon(p12)),area2=polygonArea(samplePolygon(p22));reverse!==!1&&Math.sign(area1)!==Math.sign(area2)&&(p22=reversePath(p22));let segCount1=p12.length,segCount2=p22.length,minTarget=Math.max(segCount1,segCount2),target=minTarget;if(typeof initialTarget!="number"){let avgLen=(getTotalLength(p12)+getTotalLength(p22))/2,avgSegLen=avgLen/Math.max(segCount1,segCount2),idealSegCount=Math.max(minTarget,Math.round(avgLen/Math.max(avgSegLen,1)));target=Math.min(idealSegCount,Math.max(segCount1,segCount2)*3)}else initialTarget>=minTarget?target=initialTarget:console.warn('equalizeSegments "target" option: '+initialTarget+", expected >= "+minTarget);let equalP1=p12,equalP2=p22;return bothPoly?(equalP1=splitLinePathToCount(p12,target),equalP2=splitLinePathToCount(p22,target)):(equalP1=splitCurvePathToCount(p12,target),equalP2=splitCurvePathToCount(p22,target)),equalP2=getRotatedPath(equalP2,equalP1),typeof roundValues=="number"&&roundValues!==4&&(equalP1=roundPath(equalP1,roundValues),equalP2=roundPath(equalP2,roundValues)),close&&(equalP1.push(["Z"]),equalP2.push(["Z"])),[equalP1,equalP2]},isPointInsideBBox=(bbox,[x6,y2])=>{let[minX,minY,maxX,maxY]=bbox;return x6>=minX&&x6<=maxX&&y2>=minY&&y2<=maxY},boundingBoxIntersect=(a6,b6)=>{let[ax1,ay1,ax22,ay22]=a6,[bx1,by1,bx22,by22]=b6;return isPointInsideBBox(b6,[ax1,ay1])||isPointInsideBBox(b6,[ax22,ay1])||isPointInsideBBox(b6,[ax1,ay22])||isPointInsideBBox(b6,[ax22,ay22])||isPointInsideBBox(a6,[bx1,by1])||isPointInsideBBox(a6,[bx22,by1])||isPointInsideBBox(a6,[bx1,by22])||isPointInsideBBox(a6,[bx22,by22])||(ax1<bx22&&ax1>bx1||bx1<ax22&&bx1>ax1)&&(ay1<by22&&ay1>by1||by1<ay22&&by1>ay1)},createPlaceholder=([atx,aty])=>[["M",atx,aty],["L",atx+.001,aty],["L",atx+.001,aty+.001],["L",atx,aty+.001],["L",atx,aty],["Z"]];function getBestMatch(target,candidates){let targetBBox=target.bbox,potentialCandidates=[];for(let i6=0;i6<candidates.length;i6++){let{bbox,size:size3}=candidates[i6],dx3=targetBBox.cx-bbox.cx,dy3=targetBBox.cy-bbox.cy,centeredDistance=Math.sqrt(dx3*dx3+dy3*dy3),sizeDifference=Math.abs(target.size-size3)/Math.max(target.size,size3,1e-6),hasOverlap=isPointInsideBBox([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.cx,bbox.cy])||isPointInsideBBox([bbox.x,bbox.y,bbox.x2,bbox.y2],[targetBBox.cx,targetBBox.cy]),boxIntersect=boundingBoxIntersect([targetBBox.x,targetBBox.y,targetBBox.x2,targetBBox.y2],[bbox.x,bbox.y,bbox.x2,bbox.y2]);potentialCandidates.push({index:i6,hasOverlap,boxIntersect,sizeDifference,centeredDistance})}let overlaping=potentialCandidates.filter(c3=>c3.hasOverlap&&c3.boxIntersect);if(overlaping.length>0){let best=overlaping[0];for(let i6=1;i6<overlaping.length;i6++)overlaping[i6].centeredDistance<best.centeredDistance&&(best=overlaping[i6]);return candidates.splice(best.index,1)[0]}return null}function matchPaths(fromPaths,toPaths){let pairs5=[];for(fromPaths.sort((a6,b6)=>b6.size-a6.size),toPaths.sort((a6,b6)=>b6.size-a6.size);fromPaths.length>0;){let from=fromPaths.shift(),bestTo=getBestMatch(from,toPaths);if(bestTo)pairs5.push([from.path,bestTo.path]);else{let fromCentroid=[from.bbox.cx,from.bbox.cy];pairs5.push([from.path,createPlaceholder(fromCentroid)])}}for(;toPaths.length>0;){let to3=toPaths.shift(),toCentroid=[to3.bbox.cx,to3.bbox.cy];pairs5.push([createPlaceholder(toCentroid),to3.path])}return pairs5}var classifyPaths=paths=>{let outers=[],inners=[];for(let path of paths){let signedArea3=polygonArea(samplePolygon(path)),bbox=getPathBBox(path),feature={isPoly:isPolygonArray(path)||isPolylineArray(path),size:bbox.width*bbox.height,path,signedArea:signedArea3,area:Math.abs(signedArea3),bbox};signedArea3>0?outers.push(feature):inners.push(feature)}return{outers,inners}},equalizePathsDefaults={mode:"auto",roundValues:4,close:!1,sampleSize:10},equalizePaths=(pathInput1,pathInput2,initialCfg={})=>{let cfg=Object.assign(equalizePathsDefaults,initialCfg),p12=normalizePath(pathInput1),p22=normalizePath(pathInput2),multi1=isMultiPath(p12),multi2=isMultiPath(p22);if(!multi1&&!multi2)return equalizeSegments(p12,p22,cfg);let globalArea1=polygonArea(samplePolygon(p12)),globalArea2=polygonArea(samplePolygon(p22)),path1=p12,path2=p22;Math.sign(globalArea1)<0&&(path1=reversePath(path1)),Math.sign(globalArea2)<0&&(path2=reversePath(path2));let multiPath1=splitPath(path1),multiPath2=splitPath(path2),{outers:outers1,inners:inners1}=classifyPaths(multiPath1),{outers:outers2,inners:inners2}=classifyPaths(multiPath2),outerPairs=matchPaths(outers1,outers2),innerPairs=matchPaths(inners1,inners2),equalizedPairs=[];for(let[from,to3]of[...outerPairs,...innerPairs]){let[eqFrom,eqTo]=equalizeSegments(from,to3,{...cfg,reverse:!1});equalizedPairs.push([eqFrom,eqTo])}return[equalizedPairs.map(p3=>p3[0]).flat(),equalizedPairs.map(p3=>p3[1]).flat()]},intersect2=(x12,y12,x22,y2,x32,y32,x42,y42)=>{if(Math.max(x12,x22)<Math.min(x32,x42)||Math.min(x12,x22)>Math.max(x32,x42)||Math.max(y12,y2)<Math.min(y32,y42)||Math.min(y12,y2)>Math.max(y32,y42))return;let nx3=(x12*y2-y12*x22)*(x32-x42)-(x12-x22)*(x32*y42-y32*x42),ny3=(x12*y2-y12*x22)*(y32-y42)-(y12-y2)*(x32*y42-y32*x42),denominator=(x12-x22)*(y32-y42)-(y12-y2)*(x32-x42);if(!denominator)return;let px3=nx3/denominator,py3=ny3/denominator,px22=roundTo(px3,2),py22=roundTo(py3,2);if(!(px22<roundTo(Math.min(x12,x22),2)||px22>roundTo(Math.max(x12,x22),2)||px22<roundTo(Math.min(x32,x42),2)||px22>roundTo(Math.max(x32,x42),2)||py22<roundTo(Math.min(y12,y2),2)||py22>roundTo(Math.max(y12,y2),2)||py22<roundTo(Math.min(y32,y42),2)||py22>roundTo(Math.max(y32,y42),2)))return{x:px3,y:py3}},interHelper=(bez1,bez2,config)=>{let bbox1=getCubicBBox(...bez1),bbox2=getCubicBBox(...bez2),{justCount,epsilon}=Object.assign({justCount:!0,epsilon:DISTANCE_EPSILON},config);if(!boundingBoxIntersect(bbox1,bbox2))return justCount?0:[];let l12=getCubicLength(...bez1),l22=getCubicLength(...bez2),n12=Math.max(l12/5>>0,1),n22=Math.max(l22/5>>0,1),points1=[],points2=[],xy3={},res2=justCount?0:[];for(let i6=0;i6<n12+1;i6++){let p3=getPointAtCubicLength(...bez1,i6/n12*l12);points1.push({x:p3.x,y:p3.y,t:i6/n12})}for(let i6=0;i6<n22+1;i6++){let p3=getPointAtCubicLength(...bez2,i6/n22*l22);points2.push({x:p3.x,y:p3.y,t:i6/n22})}for(let i6=0;i6<n12;i6++)for(let j6=0;j6<n22;j6++){let maxLimit=1+epsilon,di3=points1[i6],di1=points1[i6+1],dj2=points2[j6],dj1=points2[j6+1],ci3=Math.abs(di1.x-di3.x)<.001?"y":"x",cj2=Math.abs(dj1.x-dj2.x)<.001?"y":"x",is4=intersect2(di3.x,di3.y,di1.x,di1.y,dj2.x,dj2.y,dj1.x,dj1.y);if(is4){if(xy3[is4.x.toFixed(4)]==is4.y.toFixed(4))continue;xy3[is4.x.toFixed(4)]=is4.y.toFixed(4);let t110=di3.t+Math.abs((is4[ci3]-di3[ci3])/(di1[ci3]-di3[ci3]))*(di1.t-di3.t),t210=dj2.t+Math.abs((is4[cj2]-dj2[cj2])/(dj1[cj2]-dj2[cj2]))*(dj1.t-dj2.t);t110>=0&&t110<=maxLimit&&t210>=0&&t210<=maxLimit&&(justCount?res2++:res2.push({x:is4.x,y:is4.y,t1:Math.min(t110,1),t2:Math.min(t210,1)}))}}return res2},pathsIntersection=(pathInput1,pathInput2,justCount=!0)=>{let path1=pathToCurve(pathInput1),path2=pathToCurve(pathInput2),x12=0,y12=0,x22=0,y2=0,x1m=0,y1m=0,x2m=0,y2m=0,bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],bez2=[x22,y2,x22,y2,x2m,y2m,x2m,y2m],countResult=0,pointsResult=[],pathLen1=path1.length,pathLen2=path2.length;for(let i6=0;i6<pathLen1;i6++){let seg1=path1[i6];if(seg1[0]=="M")x12=seg1[1],y12=seg1[2],x1m=x12,y1m=y12;else{seg1[0]=="C"?(bez1=[x12,y12,seg1[1],seg1[2],seg1[3],seg1[4],seg1[5],seg1[6]],x12=bez1[6],y12=bez1[7]):(bez1=[x12,y12,x12,y12,x1m,y1m,x1m,y1m],x12=x1m,y12=y1m);for(let j6=0;j6<pathLen2;j6++){let seg2=path2[j6];seg2[0]=="M"?(x22=seg2[1],y2=seg2[2],x2m=x22,y2m=y2):seg2[0]=="C"&&(bez2=[x22,y2,seg2[1],seg2[2],seg2[3],seg2[4],seg2[5],seg2[6]],x22=bez2[6],y2=bez2[7]);let intr=interHelper(bez1,bez2,{justCount});justCount?countResult+=intr:pointsResult.push(...intr)}}}return justCount?countResult:pointsResult},_a4,SVGPathCommander=(_a4=class{constructor(pathValue,config){let instanceOptions=config||{},undefPath=typeof pathValue>"u";if(undefPath||!pathValue.length)throw TypeError(`${error}: "pathValue" is ${undefPath?"undefined":"empty"}`);this.segments=parsePathString(pathValue);let{round:roundOption,origin:originOption}=instanceOptions,round;Number.isInteger(roundOption)||roundOption==="off"?round=roundOption:round=defaultOptions2.round;let origin=defaultOptions2.origin;if(Array.isArray(originOption)&&originOption.length>=2){let[originX,originY,originZ]=originOption.map(Number);origin=[Number.isNaN(originX)?0:originX,Number.isNaN(originY)?0:originY,Number.isNaN(originZ)?0:originZ]}return this.round=round,this.origin=origin,this}get bbox(){return getPathBBox(this.segments)}get length(){return getTotalLength(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(length4){return getPointAtLength(this.segments,length4)}toAbsolute(){let{segments}=this;return this.segments=pathToAbsolute(segments),this}toRelative(){let{segments}=this;return this.segments=pathToRelative(segments),this}toCurve(){let{segments}=this;return this.segments=pathToCurve(segments),this}reverse(onlySubpath){let{segments}=this,split=splitPath(segments),subPath=split.length>1?split:!1,absoluteMultiPath=subPath?subPath.map((x6,i6)=>onlySubpath?i6?reversePath(x6):x6.slice(0):reversePath(x6)):segments.slice(0),path=[];return subPath?path=absoluteMultiPath.flat(1):path=onlySubpath?segments:reversePath(segments),this.segments=path.slice(0),this}normalize(){let{segments}=this;return this.segments=normalizePath(segments),this}optimize(){let{segments}=this,round=this.round==="off"?2:this.round;return this.segments=optimizePath(segments,round),this}transform(source){if(!source||typeof source!="object"||typeof source=="object"&&!["translate","rotate","skew","scale"].some(x6=>x6 in source))return this;let{segments,origin:[cx3,cy3,cz2]}=this,transform7={};for(let[k7,v6]of Object.entries(source))k7==="skew"&&Array.isArray(v6)||(k7==="rotate"||k7==="translate"||k7==="origin"||k7==="scale")&&Array.isArray(v6)?transform7[k7]=v6.map(Number):k7!=="origin"&&typeof Number(v6)=="number"&&(transform7[k7]=Number(v6));let{origin}=transform7;if(Array.isArray(origin)&&origin.length>=2){let[originX,originY,originZ]=origin.map(Number);transform7.origin=[Number.isNaN(originX)?cx3:originX,Number.isNaN(originY)?cy3:originY,originZ||cz2]}else transform7.origin=[cx3,cy3,cz2];return this.segments=transformPath(segments,transform7),this}flipX(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[0,180,0],origin:[cx3,cy3,0]}),this}flipY(){let{cx:cx3,cy:cy3}=this.bbox;return this.transform({rotate:[180,0,0],origin:[cx3,cy3,0]}),this}toString(){return pathToString(this.segments,this.round)}dispose(){Object.keys(this).forEach(key=>delete this[key])}},__publicField(_a4,"options",defaultOptions2),__publicField(_a4,"CSSMatrix",CSSMatrix),__publicField(_a4,"arcTools",arcTools),__publicField(_a4,"bezierTools",bezierTools),__publicField(_a4,"cubicTools",cubicTools),__publicField(_a4,"lineTools",lineTools),__publicField(_a4,"polygonTools",polygonTools),__publicField(_a4,"quadTools",quadTools),__publicField(_a4,"pathToAbsolute",pathToAbsolute),__publicField(_a4,"pathToRelative",pathToRelative),__publicField(_a4,"pathToCurve",pathToCurve),__publicField(_a4,"pathToString",pathToString),__publicField(_a4,"distanceSquareRoot",distanceSquareRoot),__publicField(_a4,"midPoint",midPoint),__publicField(_a4,"rotateVector",rotateVector),__publicField(_a4,"roundTo",roundTo),__publicField(_a4,"parsePathString",parsePathString),__publicField(_a4,"finalizeSegment",finalizeSegment),__publicField(_a4,"invalidPathValue",invalidPathValue),__publicField(_a4,"isArcCommand",isArcCommand),__publicField(_a4,"isDigit",isDigit),__publicField(_a4,"isDigitStart",isDigitStart),__publicField(_a4,"isMoveCommand",isMoveCommand),__publicField(_a4,"isPathCommand",isPathCommand),__publicField(_a4,"isSpace",isSpace),__publicField(_a4,"paramsCount",paramsCounts),__publicField(_a4,"paramsParser",paramsParser),__publicField(_a4,"PathParser",PathParser),__publicField(_a4,"scanFlag",scanFlag),__publicField(_a4,"scanParam",scanParam),__publicField(_a4,"scanSegment",scanSegment),__publicField(_a4,"skipSpaces",skipSpaces),__publicField(_a4,"distanceEpsilon",DISTANCE_EPSILON),__publicField(_a4,"fixPath",fixPath),__publicField(_a4,"getClosestPoint",getClosestPoint),__publicField(_a4,"getDrawDirection",getDrawDirection),__publicField(_a4,"getPathArea",getPathArea),__publicField(_a4,"getPathBBox",getPathBBox),__publicField(_a4,"getPointAtLength",getPointAtLength),__publicField(_a4,"getPropertiesAtLength",getPropertiesAtLength),__publicField(_a4,"getPropertiesAtPoint",getPropertiesAtPoint),__publicField(_a4,"getSegmentAtLength",getSegmentAtLength),__publicField(_a4,"getSegmentOfPoint",getSegmentOfPoint),__publicField(_a4,"getTotalLength",getTotalLength),__publicField(_a4,"isAbsoluteArray",isAbsoluteArray),__publicField(_a4,"isCurveArray",isCurveArray),__publicField(_a4,"isPolygonArray",isPolygonArray),__publicField(_a4,"isNormalizedArray",isNormalizedArray),__publicField(_a4,"isPathArray",isPathArray),__publicField(_a4,"isPointInStroke",isPointInStroke),__publicField(_a4,"isRelativeArray",isRelativeArray),__publicField(_a4,"isValidPath",isValidPath),__publicField(_a4,"samplePolygon",samplePolygon),__publicField(_a4,"shapeParams",shapeParams),__publicField(_a4,"shapeToPath",shapeToPath),__publicField(_a4,"shapeToPathArray",shapeToPathArray),__publicField(_a4,"absolutizeSegment",absolutizeSegment),__publicField(_a4,"arcToCubic",arcToCubic),__publicField(_a4,"getSVGMatrix",getSVGMatrix),__publicField(_a4,"iterate",iterate),__publicField(_a4,"lineToCubic",lineToCubic),__publicField(_a4,"normalizePath",normalizePath),__publicField(_a4,"normalizeSegment",normalizeSegment),__publicField(_a4,"optimizePath",optimizePath),__publicField(_a4,"projection2d",projection2d),__publicField(_a4,"quadToCubic",quadToCubic),__publicField(_a4,"relativizeSegment",relativizeSegment),__publicField(_a4,"reverseCurve",reverseCurve),__publicField(_a4,"reversePath",reversePath),__publicField(_a4,"roundPath",roundPath),__publicField(_a4,"roundSegment",roundSegment),__publicField(_a4,"segmentToCubic",segmentToCubic),__publicField(_a4,"shortenSegment",shortenSegment),__publicField(_a4,"splitPath",splitPath),__publicField(_a4,"equalizePaths",equalizePaths),__publicField(_a4,"equalizeSegments",equalizeSegments),__publicField(_a4,"splitCubicSegment",splitCubicSegment),__publicField(_a4,"transformPath",transformPath),__publicField(_a4,"isPointInsideBBox",isPointInsideBBox),__publicField(_a4,"pathsIntersection",pathsIntersection),__publicField(_a4,"boundingBoxIntersect",boundingBoxIntersect),__publicField(_a4,"isMultiPath",isMultiPath),__publicField(_a4,"isClosedPath",isClosedPath),__publicField(_a4,"isPolylineArray",isPolylineArray),__publicField(_a4,"version",version),_a4),src_default=SVGPathCommander;init_dist2();init_dist2();var import_react3=__toESM(require_react(),1);init_dist5();init_zod();init_zod();init_dist2();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 i6=this.index[key.id()];return i6===void 0?void 0:this.array[i6]}setDefault(key,factory){let i6=this.index[key.id()];if(i6===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[i6]}insert(key,value){let pair=new Pair(key,value),i6=this.index[key.id()];return i6===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i6]=pair,pair}erase(key){let i6=this.index[key.id()];if(i6===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i6],last=this.array.pop();return pair!==last&&(this.array[i6]=last,this.index[last.first.id()]=i6),pair}copy(){let copy=new _IndexedMap;for(let i6=0;i6<this.array.length;i6++){let pair=this.array[i6].copy();copy.array[i6]=pair,copy.index[pair.first.id()]=i6}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 i6=0,n3=this._terms.size();i6<n3;i6++){let pair=this._terms.itemAt(i6);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 i6=0,n3=args.length;i6<n3;++i6){let item=args[i6];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 j6=0,k7=terms2.size();j6<k7;j6++){let termPair=terms2.itemAt(j6);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 j6=0,k7=terms2.size();j6<k7;j6++){let termPair=terms2.itemAt(j6);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(a6,b6,c3,w3=1){let result=0;return result+=Math.max(0,Math.min(1e3,a6*w3))*1e6,result+=Math.max(0,Math.min(1e3,b6*w3))*1e3,result+=Math.max(0,Math.min(1e3,c3*w3)),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 i6=0,n3=rows.size();i6<n3;++i6){let rowPair2=rows.itemAt(i6),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 i6=0,n3=vars.size();i6<n3;++i6){let pair=vars.itemAt(i6),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 i6=0,n3=terms.size();i6<n3;++i6){let termPair=terms.itemAt(i6);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 error2=this._makeSymbol(SymbolType.Error);tag.other=error2,row.insertSymbol(error2,-coeff),objective.insertSymbol(error2,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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);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 i6=0,n3=rows.size();i6<n3;++i6)rows.itemAt(i6).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6);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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),symbol=pair.first,c3=pair.second;if(c3>0&&symbol.type()!==SymbolType.Dummy){let r6=this._objective.coefficientFor(symbol)/c3;r6<ratio&&(ratio=r6,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6),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 i6=0,n3=rows.size();i6<n3;++i6){let pair=rows.itemAt(i6),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 r6=-row.constant()/c3;r6<r12&&(r12=r6,first=symbol)}else{let r6=row.constant()/c3;r6<r22&&(r22=r6,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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6),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,id3){__publicField(this,"_id");__publicField(this,"_type");this._id=id3,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 i6=0,n3=cells.size();i6<n3;++i6)if(cells.itemAt(i6).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 i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i6=0,n3=cells.size();i6<n3;++i6){let pair=cells.itemAt(i6);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i6=0,n3=cells.size();i6<n3;++i6)cells.itemAt(i6).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_dist7();init_dist7();init_dist2();init_dist2();var import_debug10=__toESM(require_browser(),1),import_react4=__toESM(require_react(),1);init_dist2();var import_react5=__toESM(require_react(),1);init_dist7();init_dist2();init_dist4();init_dist7();init_dist7();init_dist7();init_dist4();init_dist7();init_dist2();init_dist7();init_dist7();init_src();init_src();init_src();init_dist7();init_dist4();init_dist7();init_dist4();init_dist7();init_dist4();init_dist4();init_dist7();init_dist4();init_dist7();init_dist7();init_dist4();init_dist7();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist();init_dist4();init_dist7();init_dist7();init_dist7();init_dist7();init_dist7();var rotatePoint2=(point6,angleDegrees)=>{let angle=angleDegrees*Math.PI/180;return{x:point6.x*Math.cos(angle)-point6.y*Math.sin(angle),y:point6.x*Math.sin(angle)+point6.y*Math.cos(angle)}},getRotatedRectPoints=({x:x6,y:y2,width,height,ccwRotation})=>{let halfWidth=width/2,halfHeight=height/2;return[{x:-halfWidth,y:-halfHeight},{x:halfWidth,y:-halfHeight},{x:halfWidth,y:halfHeight},{x:-halfWidth,y:halfHeight}].map(point6=>{let rotated=rotatePoint2(point6,ccwRotation);return{x:x6+rotated.x,y:y2+rotated.y}})},getPillCenterLineForPad=pad2=>{let ccwRotation=pad2.shape==="rotated_pill"?pad2.ccw_rotation:0,halfLineLength=Math.max(Math.max(pad2.width,pad2.height)/2-pad2.radius,0),axis=pad2.width>=pad2.height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},rotatedAxis=rotatePoint2(axis,ccwRotation);return{start:{x:pad2.x-rotatedAxis.x,y:pad2.y-rotatedAxis.y},end:{x:pad2.x+rotatedAxis.x,y:pad2.y+rotatedAxis.y},radius:pad2.radius}},getPolygonPointsForPad=pad2=>{if(pad2.type==="pcb_smtpad"){if(pad2.shape==="polygon")return pad2.points;if(pad2.shape==="rotated_rect")return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,ccwRotation:pad2.ccw_rotation})}if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return getRotatedRectPoints({x:pad2.x,y:pad2.y,width:pad2.rect_pad_width,height:pad2.rect_pad_height,ccwRotation:"rect_ccw_rotation"in pad2&&typeof pad2.rect_ccw_rotation=="number"?pad2.rect_ccw_rotation:0});throw new Error(`Expected polygonal pad geometry, got ${pad2.type} with shape "${pad2.shape}"`)},getPolygonEdges3=points=>points.map((point6,index)=>[point6,points[(index+1)%points.length]]),getClosestPointsBetweenSegments=(a12,a22,b12,b22)=>{let intersection=getSegmentIntersection(a12,a22,b12,b22);if(intersection)return{distance:0,pointOnA:intersection,pointOnB:intersection,center:intersection};let candidates=[{pointOnA:a12,pointOnB:pointToSegmentClosestPoint(a12,b12,b22)},{pointOnA:a22,pointOnB:pointToSegmentClosestPoint(a22,b12,b22)},{pointOnA:pointToSegmentClosestPoint(b12,a12,a22),pointOnB:b12},{pointOnA:pointToSegmentClosestPoint(b22,a12,a22),pointOnB:b22}],best=candidates[0],bestDistanceSquared=distSq(best.pointOnA,best.pointOnB);for(let candidate of candidates.slice(1)){let candidateDistanceSquared=distSq(candidate.pointOnA,candidate.pointOnB);candidateDistanceSquared<bestDistanceSquared&&(best=candidate,bestDistanceSquared=candidateDistanceSquared)}return{distance:segmentToSegmentMinDistance(a12,a22,b12,b22),pointOnA:best.pointOnA,pointOnB:best.pointOnB,center:{x:(best.pointOnA.x+best.pointOnB.x)/2,y:(best.pointOnA.y+best.pointOnB.y)/2}}},getSegmentToPolygonClearanceFromPoints=(start,end,polygon2)=>{if(polygon2.length<3)return{distance:Number.POSITIVE_INFINITY,center:start,tracePoint:start,obstaclePoint:start};let intersections=getPolygonEdges3(polygon2).map(([edgeStart,edgeEnd])=>getSegmentIntersection(start,end,edgeStart,edgeEnd)).filter(point6=>point6!==null);if(intersections.length>0){let dx3=end.x-start.x,dy3=end.y-start.y,lengthSquared=dx3*dx3+dy3*dy3;return intersections.sort((a6,b6)=>{let ta3=((a6.x-start.x)*dx3+(a6.y-start.y)*dy3)/lengthSquared,tb2=((b6.x-start.x)*dx3+(b6.y-start.y)*dy3)/lengthSquared;return ta3-tb2}),{distance:0,center:intersections[0],tracePoint:intersections[0],obstaclePoint:intersections[0]}}if(isPointInsidePolygon(start,polygon2)||isPointInsidePolygon(end,polygon2)){let center2={x:(start.x+end.x)/2,y:(start.y+end.y)/2};return{distance:0,center:center2,tracePoint:center2,obstaclePoint:center2}}let best=getClosestPointsBetweenSegments(start,end,polygon2[0],polygon2[1]);for(let[edgeStart,edgeEnd]of getPolygonEdges3(polygon2).slice(1)){let candidate=getClosestPointsBetweenSegments(start,end,edgeStart,edgeEnd);candidate.distance<best.distance&&(best=candidate)}return{distance:best.distance,center:best.center,tracePoint:best.pointOnA,obstaclePoint:best.pointOnB}},getSegmentToPillClearance=(segment2,pad2)=>{let pill2=getPillCenterLineForPad(pad2),closest=getClosestPointsBetweenSegments({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2},pill2.start,pill2.end);return{distance:closest.distance,center:closest.center,radius:pill2.radius,tracePoint:closest.pointOnA,obstaclePoint:closest.pointOnB}};function getDistanceBetweenPoints(pointA,pointB){return Math.sqrt((pointB.x-pointA.x)**2+(pointB.y-pointA.y)**2)}var POINT_ON_SEGMENT_TOLERANCE_MM=1e-9,POINT_IN_PAD_TOLERANCE_MM=1e-9;function isPointOnSegment3(point6,segment2){let crossProduct=(point6.y-segment2.start.y)*(segment2.end.x-segment2.start.x)-(point6.x-segment2.start.x)*(segment2.end.y-segment2.start.y);if(Math.abs(crossProduct)>POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let dotProduct=(point6.x-segment2.start.x)*(segment2.end.x-segment2.start.x)+(point6.y-segment2.start.y)*(segment2.end.y-segment2.start.y);if(dotProduct<-POINT_ON_SEGMENT_TOLERANCE_MM)return!1;let squaredLength=(segment2.end.x-segment2.start.x)**2+(segment2.end.y-segment2.start.y)**2;return dotProduct<=squaredLength+POINT_ON_SEGMENT_TOLERANCE_MM}function isPointInPolygon2(point6,polygon2){let inside2=!1;for(let i6=0,j6=polygon2.length-1;i6<polygon2.length;j6=i6++){let pi3=polygon2[i6],pj2=polygon2[j6];if(isPointOnSegment3(point6,{start:pi3,end:pj2}))return!0;pi3.y>point6.y!=pj2.y>point6.y&&point6.x<(pj2.x-pi3.x)*(point6.y-pi3.y)/(pj2.y-pi3.y)+pi3.x&&(inside2=!inside2)}return inside2}function isPointInPad(point6,pad2){if(pad2.type==="pcb_smtpad"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.radius+POINT_IN_PAD_TOLERANCE_MM;if(pad2.shape==="rect"){let halfWidth=pad2.width/2,halfHeight=pad2.height/2;return Math.abs(point6.x-pad2.x)<=halfWidth+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=halfHeight+POINT_IN_PAD_TOLERANCE_MM}if(pad2.shape==="rotated_rect")return isPointInPolygon2(point6,getPolygonPointsForPad(pad2));if(pad2.shape==="pill"||pad2.shape==="rotated_pill"){if(pad2.shape==="rotated_pill"){let pill2=getPillCenterLineForPad(pad2);return pointToSegmentDistance(point6,pill2.start,pill2.end)<=pill2.radius+POINT_IN_PAD_TOLERANCE_MM}let halfWidth=pad2.width/2,halfHeight=pad2.height/2,radius=pad2.radius;if(Math.abs(point6.x-pad2.x)<=halfWidth-radius+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=halfHeight+POINT_IN_PAD_TOLERANCE_MM)return!0;let cornerX=Math.max(Math.abs(point6.x-pad2.x)-(halfWidth-radius),0),cornerY=Math.max(Math.abs(point6.y-pad2.y)-(halfHeight-radius),0),radiusWithTolerance=radius+POINT_IN_PAD_TOLERANCE_MM;return cornerX*cornerX+cornerY*cornerY<=radiusWithTolerance*radiusWithTolerance}if(pad2.shape==="polygon")return isPointInPolygon2(point6,pad2.points)}if(pad2.type==="pcb_plated_hole"){if(pad2.shape==="circle")return getDistanceBetweenPoints(point6,pad2)<=pad2.outer_diameter/2+POINT_IN_PAD_TOLERANCE_MM;if("rect_pad_width"in pad2&&"rect_pad_height"in pad2)return isPointInPolygon2(point6,getPolygonPointsForPad(pad2));if(pad2.shape==="oval"||pad2.shape==="pill")return Math.abs(point6.x-pad2.x)<=pad2.outer_width/2+POINT_IN_PAD_TOLERANCE_MM&&Math.abs(point6.y-pad2.y)<=pad2.outer_height/2+POINT_IN_PAD_TOLERANCE_MM}return!1}function distance5(x12,y12,x22,y2){return Math.sqrt((x22-x12)**2+(y2-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(pad2.shape==="pill"||pad2.shape==="rotated_pill")return isPointInPad(point6,pad2)});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,id3,fallbackLabel)=>!candidate||candidate===id3||CIRCUIT_JSON_ID_PATTERN.test(candidate)?fallbackLabel:candidate,firstReadableName=(candidates,id3)=>{for(let candidate of candidates){let readableName=sanitizeReadableName(candidate,id3,"");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")};var getReadableNameForElementId=(circuitJson,elementId)=>sanitizeReadableName(getReadableNameForElement(circuitJson,elementId),elementId,"element"),containsCircuitJsonId=message=>CIRCUIT_JSON_ID_PATTERN.test(message);function getReadableNameForFootprintPad(circuitJson,pad2,ordinal){let padKind=pad2.type==="pcb_smtpad"?"SMD pad":"through-hole pad",portRef2=pad2.pcb_port_id?getReadableNameForPort(circuitJson,pad2.pcb_port_id):null,bounds=getBoundsOfPcbElements([pad2]),centerX=(bounds.minX+bounds.maxX)/2,centerY=(bounds.minY+bounds.maxY)/2,location=`(${centerX.toFixed(2)}mm, ${centerY.toFixed(2)}mm)`;return portRef2?`${padKind} ${portRef2} at ${location}`:`${padKind} #${ordinal+1} at ${location}`}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(id3=>circuitJson.some(element=>element.type==="pcb_trace"&&("pcb_trace_id"in element&&element.pcb_trace_id===id3||"route_id"in element&&element.route_id===id3))).length===0&&new Set(pcbPortsInTrace.map(p3=>p3.pcb_component_id)).size>1&&errors.push({type:"pcb_port_not_connected_error",message:`Ports [${pcbPortsInTrace.map(p3=>getReadableNameForPort(circuitJson,p3.pcb_port_id)).join(", ")}] are not connected together through the same net.`,error_type:"pcb_port_not_connected_error",pcb_port_ids:pcbPortsInTrace.map(p3=>p3.pcb_port_id),pcb_component_ids:pcbPortsInTrace.map(p3=>p3.pcb_component_id).filter(id3=>id3!==void 0),pcb_port_not_connected_error_id:`pcb_port_not_connected_error_trace_${sourceTrace.source_trace_id}`})}return errors}var jlcMinTolerances={min_trace_width:.1,min_via_hole_edge_to_via_hole_edge_clearance:.1,min_plated_hole_drill_edge_to_drill_edge_clearance:.15,min_trace_to_pad_edge_clearance:.1,min_pad_edge_to_pad_edge_clearance:.1,min_board_edge_clearance:.2,min_via_hole_diameter:.2,min_via_pad_diameter:.3},DEFAULT_TRACE_MARGIN=.1,DEFAULT_TRACE_THICKNESS=jlcMinTolerances.min_trace_width,DEFAULT_VIA_DIAMETER=jlcMinTolerances.min_via_pad_diameter,DEFAULT_VIA_BOARD_MARGIN=jlcMinTolerances.min_board_edge_clearance,DEFAULT_SAME_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_DIFFERENT_NET_VIA_MARGIN=jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance,DEFAULT_PAD_PAD_CLEARANCE=jlcMinTolerances.min_pad_edge_to_pad_edge_clearance,EPSILON2=.005,getPcbBoard=circuitJson=>circuitJson.find(el3=>el3.type==="pcb_board"),getBoardDrcValue=(board,key)=>board?.[key],getPadBounds2=pad2=>getBoundsOfPcbElements([pad2]),getPadCenter3=pad2=>{let bounds=getPadBounds2(pad2);return midpoint({x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY})},getPadRadius=pad2=>{let bounds=getPadBounds2(pad2);return Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/2},isCircularPad=pad2=>pad2.type==="pcb_via"||pad2.shape==="circle",isPillPad=pad2=>pad2.type==="pcb_smtpad"&&(pad2.shape==="pill"||pad2.shape==="rotated_pill"),getCircleShape=pad2=>{let center2=getPadCenter3(pad2);return{kind:"circle",x:center2.x,y:center2.y,radius:getPadRadius(pad2)}},getPolygonShape=pad2=>{if(pad2.type==="pcb_smtpad"&&(pad2.shape==="polygon"||pad2.shape==="rotated_rect"))return{kind:"polygon",points:getPolygonPointsForPad(pad2)};if(pad2.type==="pcb_plated_hole"&&"rect_pad_width"in pad2&&"rect_pad_height"in pad2)return{kind:"polygon",points:getPolygonPointsForPad(pad2)};let bounds=getPadBounds2(pad2);return{kind:"polygon",points:[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}]}},getPadToPadGap=(padA,padB)=>{if(isPillPad(padA)&&isPillPad(padB)){let pillA=getPillCenterLineForPad(padA),pillB=getPillCenterLineForPad(padB);return segmentToSegmentMinDistance(pillA.start,pillA.end,pillB.start,pillB.end)-pillA.radius-pillB.radius}if(isPillPad(padA)&&isCircularPad(padB)){let pill2=getPillCenterLineForPad(padA);return segmentToCircleMinDistance(pill2.start,pill2.end,getCircleShape(padB))-pill2.radius}if(isCircularPad(padA)&&isPillPad(padB)){let pill2=getPillCenterLineForPad(padB);return segmentToCircleMinDistance(pill2.start,pill2.end,getCircleShape(padA))-pill2.radius}if(isPillPad(padA)){let pill2=getPillCenterLineForPad(padA);return getSegmentToPolygonClearanceFromPoints(pill2.start,pill2.end,getPolygonShape(padB).points).distance-pill2.radius}if(isPillPad(padB)){let pill2=getPillCenterLineForPad(padB);return getSegmentToPolygonClearanceFromPoints(pill2.start,pill2.end,getPolygonShape(padA).points).distance-pill2.radius}return isCircularPad(padA)&&isCircularPad(padB)?distanceBetweenCircleAndCircle(getCircleShape(padA),getCircleShape(padB)):isCircularPad(padA)?distanceBetweenCircleAndPolygon(getCircleShape(padA),getPolygonShape(padB)):isCircularPad(padB)?distanceBetweenCircleAndPolygon(getCircleShape(padB),getPolygonShape(padA)):distanceBetweenPolygonAndPolygon(getPolygonShape(padA),getPolygonShape(padB))},getPads=circuitJson=>[...cju_default(circuitJson).pcb_smtpad.list(),...cju_default(circuitJson).pcb_plated_hole.list()],getTraceSegments=circuitJson=>cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i6=0;i6<pcbTrace.route.length-1;i6++){let p12=pcbTrace.route[i6],p22=pcbTrace.route[i6+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}),getTraceCenter=segment2=>{let routePoints=segment2._pcbTrace.route.flatMap(routePoint=>routePoint.route_type==="through_pad"?[routePoint.start,routePoint.end]:[{x:routePoint.x,y:routePoint.y}]),firstPoint=routePoints[0],lastPoint=routePoints[routePoints.length-1];return!firstPoint||!lastPoint?midpoint({x:segment2.x1,y:segment2.y1},{x:segment2.x2,y:segment2.y2}):midpoint(firstPoint,lastPoint)},getCenterBetweenCopperEdges=({tracePoint,obstaclePoint,traceRadius,obstacleRadius})=>{let dx3=obstaclePoint.x-tracePoint.x,dy3=obstaclePoint.y-tracePoint.y,distance33=Math.hypot(dx3,dy3);if(distance33===0)return midpoint(tracePoint,obstaclePoint);let unitX=dx3/distance33,unitY=dy3/distance33,traceEdge={x:tracePoint.x+unitX*traceRadius,y:tracePoint.y+unitY*traceRadius},obstacleEdge={x:obstaclePoint.x-unitX*obstacleRadius,y:obstaclePoint.y-unitY*obstacleRadius};return midpoint(traceEdge,obstacleEdge)},getTraceObstacleClearance=(segment2,obstacle)=>{let start={x:segment2.x1,y:segment2.y1},end={x:segment2.x2,y:segment2.y2},traceRadius=segment2.thickness/2;if(obstacle.type==="pcb_via"||isCircularPad(obstacle)){let circle2=obstacle.type==="pcb_via"?{x:obstacle.x,y:obstacle.y,radius:obstacle.outer_diameter/2}:getCircleShape(obstacle),closestPoint=pointToSegmentClosestPoint(circle2,start,end);return{gap:segmentToCircleMinDistance(start,end,circle2)-traceRadius,center:getCenterBetweenCopperEdges({tracePoint:closestPoint,obstaclePoint:circle2,traceRadius,obstacleRadius:circle2.radius})}}if(isPillPad(obstacle)){let clearance2=getSegmentToPillClearance(segment2,obstacle);return{gap:clearance2.distance-traceRadius-clearance2.radius,center:getCenterBetweenCopperEdges({tracePoint:clearance2.tracePoint,obstaclePoint:clearance2.obstaclePoint,traceRadius,obstacleRadius:clearance2.radius})}}let clearance=getSegmentToPolygonClearanceFromPoints(start,end,getPolygonShape(obstacle).points);return{gap:clearance.distance-traceRadius,center:getCenterBetweenCopperEdges({tracePoint:clearance.tracePoint,obstaclePoint:clearance.obstaclePoint,traceRadius,obstacleRadius:0})}},isTraceObstacleOverlap=gap=>gap<=0,SpatialObjectIndex=class{constructor({objects,getBounds:getBounds5,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=getBounds5,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(id3){let obj=this.objectsById.get(id3);if(!obj)return!1;this.objectsById.delete(id3);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===id3);index!==-1&&(bucket.splice(index,1),bucket.length===0&&this.buckets.delete(bucketKey))}}return!0}getBucketKey(x6,y2){return`${Math.floor(x6/this.CELL_SIZE)}x${Math.floor(y2/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 id3=obj.spatialIndexId;addedIds.has(id3)||(addedIds.add(id3),objects.push(obj))}}return objects}};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:[]:[]}var 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 t53=Math.max(0,Math.min(1,tEnter));return{x:p12.x+t53*dx3,y:p12.y+t53*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,max2)=>Math.max(min,Math.min(max2,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},w3={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*w3.x+va3.y*w3.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w3.x+vb2.y*w3.y,denominator=dotAA*dotBB-dotAB*dotAB;if(Math.abs(denominator)<1e-10)continue;let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB2=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp22(tA2,0,1),tB2=clamp22(tB2,0,1);let closestOnSegment={x:p12.x+tA2*va3.x,y:p12.y+tA2*va3.y},closestOnEdge={x:edge.start.x+tB2*vb2.x,y:edge.start.y+tB2*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},getClosestPointBetweenSegments=(segmentA,segmentB)=>{let a12={x:segmentA.x1,y:segmentA.y1},a22={x:segmentA.x2,y:segmentA.y2},b12={x:segmentB.x1,y:segmentB.y1},b22={x:segmentB.x2,y:segmentB.y2},va3={x:a22.x-a12.x,y:a22.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=clamp4(((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 t53=clamp4(((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA,0,1),closestOnA2={x:a12.x+t53*va3.x,y:a12.y+t53*va3.y};return{x:(closestOnA2.x+b12.x)/2,y:(closestOnA2.y+b12.y)/2}}let w3={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*w3.x+va3.y*w3.y,dotBB=vb2.x*vb2.x+vb2.y*vb2.y,dotBW=vb2.x*w3.x+vb2.y*w3.y,denominator=dotAA*dotBB-dotAB*dotAB;if(denominator<1e-10)return closestPointsParallelSegments(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB);let tA2=(dotAB*dotBW-dotBB*dotAW)/denominator,tB2=(dotAA*dotBW-dotAB*dotAW)/denominator;tA2=clamp4(tA2,0,1),tB2=clamp4(tB2,0,1),tB2=(tA2*dotAB+dotBW)/dotBB,tB2=clamp4(tB2,0,1),tA2=(tB2*dotAB-dotAW)/dotAA,tA2=clamp4(tA2,0,1);let closestOnA={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},closestOnB={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},dx3=closestOnA.x-closestOnB.x,dy3=closestOnA.y-closestOnB.y,distance33=Math.sqrt(dx3*dx3+dy3*dy3);return{x:(closestOnA.x+closestOnB.x)/2,y:(closestOnA.y+closestOnB.y)/2}},closestPointsParallelSegments=(a12,a22,b12,b22,va3,vb2,lenSqrA,lenSqrB)=>{let tA2=((b12.x-a12.x)*va3.x+(b12.y-a12.y)*va3.y)/lenSqrA;tA2=clamp4(tA2,0,1);let pointOnA1={x:a12.x+tA2*va3.x,y:a12.y+tA2*va3.y},tA22=((b22.x-a12.x)*va3.x+(b22.y-a12.y)*va3.y)/lenSqrA;tA22=clamp4(tA22,0,1);let pointOnA2={x:a12.x+tA22*va3.x,y:a12.y+tA22*va3.y},tB2=((a12.x-b12.x)*vb2.x+(a12.y-b12.y)*vb2.y)/lenSqrB;tB2=clamp4(tB2,0,1);let pointOnB1={x:b12.x+tB2*vb2.x,y:b12.y+tB2*vb2.y},tB22=((a22.x-b12.x)*vb2.x+(a22.y-b12.y)*vb2.y)/lenSqrB;tB22=clamp4(tB22,0,1);let pointOnB2={x:b12.x+tB22*vb2.x,y:b12.y+tB22*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:a22,pointB:pointOnB2,distance:Math.sqrt((a22.x-pointOnB2.x)**2+(a22.y-pointOnB2.y)**2)}].reduce((closest,current3)=>current3.distance<closest.distance?current3:closest);return{x:(closestPair.pointA.x+closestPair.pointB.x)/2,y:(closestPair.pointA.y+closestPair.pointB.y)/2}},clamp4=(value,min,max2)=>Math.max(min,Math.min(max2,value)),getCollidableBounds=collidable=>{if(collidable.type==="pcb_trace_segment")return{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)};if(collidable.type==="pcb_smtpad"||collidable.type==="pcb_plated_hole"){if(collidable.type==="pcb_smtpad"&&(collidable.shape==="rotated_rect"||collidable.shape==="polygon")||collidable.type==="pcb_plated_hole"&&"rect_pad_width"in collidable&&"rect_pad_height"in collidable){let polygonPoints=getPolygonPointsForPad(collidable);return{minX:Math.min(...polygonPoints.map(point6=>point6.x)),minY:Math.min(...polygonPoints.map(point6=>point6.y)),maxX:Math.max(...polygonPoints.map(point6=>point6.x)),maxY:Math.max(...polygonPoints.map(point6=>point6.y))}}if(collidable.type==="pcb_smtpad"&&collidable.shape==="rotated_pill"){let pill2=getPillCenterLineForPad(collidable);return{minX:Math.min(pill2.start.x,pill2.end.x)-pill2.radius,minY:Math.min(pill2.start.y,pill2.end.y)-pill2.radius,maxX:Math.max(pill2.start.x,pill2.end.x)+pill2.radius,maxY:Math.max(pill2.start.y,pill2.end.y)+pill2.radius}}}return getBoundsOfPcbElements([collidable])};function getPcbPortIdsConnectedToRoutePoint(routePoint){return routePoint.route_type!=="wire"?[]:[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id].filter(portId=>!!portId)}function getPcbPortIdsConnectedToTrace(trace){let connectedPcbPorts=new Set;for(let segment2 of trace.route)for(let portId of getPcbPortIdsConnectedToRoutePoint(segment2))connectedPcbPorts.add(portId);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 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)}`)},getPcbComponentConnectionElementId=element=>element.type==="pcb_port"?element.pcb_port_id:element.type==="pcb_smtpad"?element.pcb_smtpad_id:element.pcb_plated_hole_id;function checkEachPcbTraceNonOverlapping(circuitJson,{connMap,minClearance}={}){let errors=[];addStartAndEndPortIdsIfMissing(circuitJson),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??DEFAULT_TRACE_MARGIN);let pcbTraceSegments=cju_default(circuitJson).pcb_trace.list().flatMap(pcbTrace=>{let segments=[];for(let i6=0;i6<pcbTrace.route.length-1;i6++){let p12=pcbTrace.route[i6],p22=pcbTrace.route[i6+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(),pcbPorts=cju_default(circuitJson).pcb_port.list(),pcbHoles=cju_default(circuitJson).pcb_hole.list(),pcbVias=cju_default(circuitJson).pcb_via.list(),pcbKeepouts=cju_default(circuitJson).pcb_keepout.list(),pcbComponentConnectionElements=[...pcbPorts,...pcbSmtPads,...pcbPlatedHoles],excludedConnectionIdsByKeepoutId=new Map;for(let keepout of pcbKeepouts){let excludedPcbComponentIds=new Set(keepout.excluded_pcb_component_ids??[]);excludedPcbComponentIds.size!==0&&excludedConnectionIdsByKeepoutId.set(keepout.pcb_keepout_id,pcbComponentConnectionElements.filter(element=>element.pcb_component_id&&excludedPcbComponentIds.has(element.pcb_component_id)).map(getPcbComponentConnectionElementId))}let allObjects=[...pcbTraceSegments,...pcbSmtPads,...pcbPlatedHoles,...pcbHoles,...pcbVias,...pcbKeepouts],spatialIndex=new SpatialObjectIndex({objects:allObjects,getBounds:getCollidableBounds}),getReadableName=id3=>getReadableNameForElement(circuitJson,id3),constructErrorMessage=(traceName,otherName,gap)=>isTraceObstacleOverlap(gap)?`PCB trace ${traceName} overlaps with ${otherName} (accidental contact)`:`PCB trace ${traceName} is too close to ${otherName} (gap: ${gap.toFixed(3)}mm)`,errorIds=new Set;for(let segmentA of pcbTraceSegments){let requiredMargin=minClearance,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)||obj.type==="pcb_keepout"&&(excludedConnectionIdsByKeepoutId.get(obj.pcb_keepout_id)??[]).some(connectionId=>connMap.areIdsConnected(segmentA.pcb_trace_id,connectionId)))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>minClearance-EPSILON2)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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),getReadableName(segmentB.pcb_trace_id),gap2),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_smtpad"||obj.type==="pcb_plated_hole"||obj.type==="pcb_via"){let{gap:gap2,center:center2}=getTraceObstacleClearance(segmentA,obj);if(!isTraceObstacleOverlap(gap2))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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(primaryObjId)}"`,gap2),pcb_trace_id:segmentA.pcb_trace_id,center:center2,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)});continue}if(obj.type==="pcb_hole"){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>minClearance-EPSILON2)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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap2),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+EPSILON2<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:constructErrorMessage(getReadableName(segmentA.pcb_trace_id),`${obj.type} "${getReadableName(getPrimaryId(obj))}"`,gap),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}var toPcbComponentId=id3=>id3,GEOMETRY_EPSILON=1e-9,pointsToPolygon=points=>points.length<3?null:new Polygon$1(points.map(({x:x6,y:y2})=>new Point$2(x6,y2))),brepRingToPolygon=vertices=>{let ring3=vertices.filter((vertex,index)=>{let previous=vertices[index-1];return!previous||Math.abs(previous.x-vertex.x)>GEOMETRY_EPSILON||Math.abs(previous.y-vertex.y)>GEOMETRY_EPSILON});if(ring3.length>1&&Math.abs(ring3[0].x-ring3.at(-1).x)<=GEOMETRY_EPSILON&&Math.abs(ring3[0].y-ring3.at(-1).y)<=GEOMETRY_EPSILON&&ring3.pop(),ring3.length<3)return null;let edges=[];for(let index=0;index<ring3.length;index++){let start=ring3[index],end=ring3[(index+1)%ring3.length],startPoint=new Point$2(start.x,start.y),endPoint=new Point$2(end.x,end.y),bulge=start.bulge??0;if(Math.abs(bulge)<=GEOMETRY_EPSILON){edges.push(new Segment$1(startPoint,endPoint));continue}let chordLength=startPoint.distanceTo(endPoint)[0];if(chordLength<=GEOMETRY_EPSILON)continue;let midpoint22={x:(start.x+end.x)/2,y:(start.y+end.y)/2},leftNormal={x:-(end.y-start.y)/chordLength,y:(end.x-start.x)/chordLength},centerOffset=chordLength*(1-bulge*bulge)/(4*bulge),center2=new Point$2(midpoint22.x+leftNormal.x*centerOffset,midpoint22.y+leftNormal.y*centerOffset),radius=chordLength*(1+bulge*bulge)/(4*Math.abs(bulge));edges.push(new Arc(center2,radius,Math.atan2(start.y-center2.y,start.x-center2.x),Math.atan2(end.y-center2.y,end.x-center2.x),bulge>0))}if(edges.length<3)return null;let polygon2=new Polygon$1;return polygon2.addFace(edges),polygon2},boardToPolygon=board=>{if(board.outline&&board.outline.length>=3)return pointsToPolygon(board.outline);if(!board.center||typeof board.width!="number"||typeof board.height!="number")return null;let halfWidth=board.width/2,halfHeight=board.height/2;return pointsToPolygon([{x:board.center.x-halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y+halfHeight},{x:board.center.x-halfWidth,y:board.center.y+halfHeight}])},getRectanglePolygon=({x:x6,y:y2,width,height,ccwRotationDegrees=0})=>{let halfWidth=width/2,halfHeight=height/2,rotationMatrix=rotateDEG(ccwRotationDegrees,x6,y2);return pointsToPolygon([{x:x6-halfWidth,y:y2-halfHeight},{x:x6+halfWidth,y:y2-halfHeight},{x:x6+halfWidth,y:y2+halfHeight},{x:x6-halfWidth,y:y2+halfHeight}].map(point6=>applyToPoint(rotationMatrix,point6)))},roundedRect=({x:x6,y:y2,width,height,cornerRadius,ccwRotationDegrees=0})=>{let radius=Math.max(0,Math.min(cornerRadius,width/2,height/2));if(radius<=GEOMETRY_EPSILON){let polygon2=getRectanglePolygon({x:x6,y:y2,width,height,ccwRotationDegrees});return polygon2?{kind:"shapes",shapes:[polygon2]}:null}let shapes=[],innerWidth=width-2*radius,innerHeight=height-2*radius;if(innerWidth>GEOMETRY_EPSILON){let verticalBand=getRectanglePolygon({x:x6,y:y2,width:innerWidth,height,ccwRotationDegrees});verticalBand&&shapes.push(verticalBand)}if(innerHeight>GEOMETRY_EPSILON){let horizontalBand=getRectanglePolygon({x:x6,y:y2,width,height:innerHeight,ccwRotationDegrees});horizontalBand&&shapes.push(horizontalBand)}let halfInnerWidth=innerWidth/2,halfInnerHeight=innerHeight/2,rotationMatrix=rotateDEG(ccwRotationDegrees,x6,y2),cornerCenters=[{x:x6-halfInnerWidth,y:y2-halfInnerHeight},{x:x6+halfInnerWidth,y:y2-halfInnerHeight},{x:x6+halfInnerWidth,y:y2+halfInnerHeight},{x:x6-halfInnerWidth,y:y2+halfInnerHeight}].map(point6=>applyToPoint(rotationMatrix,point6)).filter((point6,index,points)=>points.findIndex(candidate=>Math.abs(candidate.x-point6.x)<=GEOMETRY_EPSILON&&Math.abs(candidate.y-point6.y)<=GEOMETRY_EPSILON)===index);return shapes.push(...cornerCenters.map(center2=>new Circle$1(new Point$2(center2.x,center2.y),radius))),shapes.length>0?{kind:"shapes",shapes}:null},pill=({x:x6,y:y2,width,height,radius,ccwRotationDegrees=0})=>{let halfLineLength=Math.max(Math.max(width,height)/2-radius,0),localAxis=width>=height?{x:halfLineLength,y:0}:{x:0,y:halfLineLength},axis=applyToPoint(rotateDEG(ccwRotationDegrees),localAxis);return halfLineLength<=GEOMETRY_EPSILON?{kind:"shapes",shapes:[new Circle$1(new Point$2(x6,y2),radius)]}:{kind:"pill",centerLine:new Segment$1(new Point$2(x6-axis.x,y2-axis.y),new Point$2(x6+axis.x,y2+axis.y)),radius}},getSmtPadGeometry=pad2=>{switch(pad2.shape){case"circle":return{kind:"shapes",shapes:[new Circle$1(new Point$2(pad2.x,pad2.y),pad2.radius)]};case"rect":return roundedRect({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,cornerRadius:pad2.rect_border_radius??pad2.corner_radius??0});case"rotated_rect":return roundedRect({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,cornerRadius:pad2.rect_border_radius??pad2.corner_radius??0,ccwRotationDegrees:pad2.ccw_rotation});case"pill":return pill({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,radius:pad2.radius});case"rotated_pill":return pill({x:pad2.x,y:pad2.y,width:pad2.width,height:pad2.height,radius:pad2.radius,ccwRotationDegrees:pad2.ccw_rotation});case"polygon":{let polygon2=pointsToPolygon(pad2.points);return polygon2?{kind:"shapes",shapes:[polygon2]}:null}}},getPlatedHoleGeometry=(platedHole,componentCcwRotationDegrees)=>{switch(platedHole.shape){case"circle":return{kind:"shapes",shapes:[new Circle$1(new Point$2(platedHole.x,platedHole.y),platedHole.outer_diameter/2)]};case"oval":case"pill":return pill({x:platedHole.x,y:platedHole.y,width:platedHole.outer_width,height:platedHole.outer_height,radius:Math.min(platedHole.outer_width/2,platedHole.outer_height/2),ccwRotationDegrees:platedHole.ccw_rotation});case"circular_hole_with_rect_pad":case"pill_hole_with_rect_pad":case"rotated_pill_hole_with_rect_pad":return roundedRect({x:platedHole.x,y:platedHole.y,width:platedHole.rect_pad_width,height:platedHole.rect_pad_height,cornerRadius:platedHole.rect_border_radius??0,ccwRotationDegrees:"rect_ccw_rotation"in platedHole?platedHole.rect_ccw_rotation??0:0});case"hole_with_polygon_pad":{let ccwRotationDegrees=platedHole.ccw_rotation??componentCcwRotationDegrees,rotationMatrix=rotateDEG(ccwRotationDegrees),polygon2=pointsToPolygon(platedHole.pad_outline.map(point6=>{let rotatedPoint=applyToPoint(rotationMatrix,point6);return{x:platedHole.x+rotatedPoint.x,y:platedHole.y+rotatedPoint.y}}));return polygon2?{kind:"shapes",shapes:[polygon2]}:null}}},getCopperGeometry=(element,componentCcwRotationsById)=>{if(element.type==="pcb_via")return{kind:"shapes",shapes:[new Circle$1(new Point$2(element.x,element.y),element.outer_diameter/2)]};if(element.type==="pcb_smtpad")return getSmtPadGeometry(element);if(element.type==="pcb_plated_hole")return getPlatedHoleGeometry(element,element.pcb_component_id?componentCcwRotationsById.get(toPcbComponentId(element.pcb_component_id))??0:0);let polygon2;switch(element.shape){case"rect":polygon2=getRectanglePolygon({x:element.center.x,y:element.center.y,width:element.width,height:element.height,ccwRotationDegrees:element.rotation??0});break;case"polygon":polygon2=pointsToPolygon(element.points);break;case"brep":polygon2=brepRingToPolygon(element.brep_shape.outer_ring.vertices);break}return polygon2?{kind:"shapes",shapes:[polygon2]}:null},getCopperElementId=element=>element.type==="pcb_via"?element.pcb_via_id:element.type==="pcb_smtpad"?element.pcb_smtpad_id:element.type==="pcb_plated_hole"?element.pcb_plated_hole_id:element.pcb_copper_pour_id,getCopperElementLabel=element=>element.type==="pcb_via"?"Via":element.type==="pcb_smtpad"?"SMT pad":element.type==="pcb_plated_hole"?"Plated hole":"Copper pour",measureClearance=(board,geometry)=>{if(geometry.kind==="shapes"){let isInside2=geometry.shapes.every(shape=>board.contains(shape));return{isInside:isInside2,clearance:isInside2?Math.min(...geometry.shapes.map(shape=>board.distanceTo(shape)[0])):0}}let clearance=board.distanceTo(geometry.centerLine)[0]-geometry.radius,isInside=board.contains(geometry.centerLine)&&clearance>=-GEOMETRY_EPSILON;return{isInside,clearance:isInside?Math.max(0,clearance):0}};function checkCopperToBoardEdgeClearance(circuitJson){let board=getPcbBoard(circuitJson);if(!board)return[];let boardPolygon=boardToPolygon(board);if(!boardPolygon)return[];let requiredClearance=getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance;if(requiredClearance===void 0)return[];let copperElements=circuitJson.filter(element=>element.type==="pcb_via"||element.type==="pcb_smtpad"||element.type==="pcb_plated_hole"||element.type==="pcb_copper_pour"),componentCcwRotationsById=new Map(circuitJson.filter(element=>element.type==="pcb_component").map(component=>[toPcbComponentId(component.pcb_component_id),component.rotation])),errors=[];for(let element of copperElements){let geometry=getCopperGeometry(element,componentCcwRotationsById);if(!geometry)continue;let{isInside,clearance}=measureClearance(boardPolygon,geometry);if(isInside&&clearance+GEOMETRY_EPSILON>=requiredClearance)continue;let id3=getCopperElementId(element),label=getCopperElementLabel(element);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`copper_too_close_to_board_edge_${id3}`,error_type:"pcb_placement_error",message:`${label} ${id3} violates copper-to-board-edge clearance (measured ${clearance.toFixed(3)}mm, required ${requiredClearance.toFixed(3)}mm)`})}return errors}function isPolygonCCW(poly){return poly.area()>=0}function rectanglePolygon({center:center2,size:size3,rotationDeg=0}){let cx3=center2.x,cy3=center2.y,hw2=size3.width/2,hh3=size3.height/2,corners=[new Point$2(cx3-hw2,cy3-hh3),new Point$2(cx3+hw2,cy3-hh3),new Point$2(cx3+hw2,cy3+hh3),new Point$2(cx3-hw2,cy3+hh3)],poly=new Polygon$1(corners);if(rotationDeg){let matrix2=rotateDEG(rotationDeg,cx3,cy3),rotatedCorners=corners.map(pt3=>{let p3=applyToPoint(matrix2,{x:pt3.x,y:pt3.y});return new Point$2(p3.x,p3.y)});poly=new Polygon$1(rotatedCorners)}return isPolygonCCW(poly)||poly.reverse(),poly}function boardToPolygon2({board}){if(board.outline&&board.outline.length>0){let points=board.outline.map(p3=>new Point$2(p3.x,p3.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$2(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 i6=0;i6<4;i6++){let next2=(i6+1)%4;midpoints.push({x:(corners[i6].x+corners[next2].x)/2,y:(corners[i6].y+corners[next2].y)/2})}let matrix2=rotateDEG(rotationDeg,componentCenter.x,componentCenter.y),rotatePoint22=pt3=>{let p3=applyToPoint(matrix2,pt3);return new Point$2(p3.x,p3.y)},rotatedPoints=corners.concat(midpoints).map(rotatePoint22),maxDistance=0;for(let pt3 of rotatedPoints)if(!boardPoly.contains(pt3)){let dist=boardPoly.distanceTo(pt3),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,p3)=>sum+(typeof p3.area=="function"?p3.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=boardToPolygon2({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}var CUTOUT_CIRCLE_SEGMENTS=32;function rectanglePolygon2({center:center2,width,height,rotation:rotation5=0}){let halfWidth=width/2,halfHeight=height/2,corners=[{x:center2.x-halfWidth,y:center2.y-halfHeight},{x:center2.x+halfWidth,y:center2.y-halfHeight},{x:center2.x+halfWidth,y:center2.y+halfHeight},{x:center2.x-halfWidth,y:center2.y+halfHeight}],matrix2=rotateDEG(rotation5,center2.x,center2.y);return new Polygon$1(corners.map(corner=>{let rotated=rotation5?applyToPoint(matrix2,corner):corner;return new Point$2(rotated.x,rotated.y)}))}function circlePolygon({center:center2,radius}){return new Polygon$1(Array.from({length:CUTOUT_CIRCLE_SEGMENTS},(_3,index)=>{let angle=2*Math.PI*index/CUTOUT_CIRCLE_SEGMENTS;return new Point$2(center2.x+Math.cos(angle)*radius,center2.y+Math.sin(angle)*radius)}))}function cutoutToPolygon(cutout){return cutout.shape==="rect"?rectanglePolygon2({center:cutout.center,width:cutout.width,height:cutout.height,rotation:cutout.rotation??0}):cutout.shape==="circle"?circlePolygon({center:cutout.center,radius:cutout.radius}):cutout.shape==="polygon"?new Polygon$1(cutout.points.map(point6=>new Point$2(point6.x,point6.y))):null}function polygonBoxToBounds(polygon2){return{minX:polygon2.box.xmin,minY:polygon2.box.ymin,maxX:polygon2.box.xmax,maxY:polygon2.box.ymax}}function doPolygonsOverlap(polygonA,polygonB){if(!doBoundsOverlap(polygonBoxToBounds(polygonA),polygonBoxToBounds(polygonB)))return!1;if(polygonA.contains(polygonB)||polygonB.contains(polygonA))return!0;try{let intersections=BooleanOperations.intersect(polygonA,polygonB);return Array.isArray(intersections)?intersections.some(polygon2=>polygon2.area()>0):intersections.area()>0}catch{return!1}}function checkPcbComponentOverCutout(circuitJson){let cutouts=circuitJson.filter(element=>element.type==="pcb_cutout"),components=circuitJson.filter(element=>element.type==="pcb_component");if(cutouts.length===0||components.length===0)return[];let cutoutPolygons=cutouts.map(cutout=>({cutout,polygon:cutoutToPolygon(cutout)})).filter(entry=>entry.polygon!==null&&entry.polygon.area()>0),errors=[];for(let component of components){if(!component.center||component.width<=0||component.height<=0)continue;let componentPolygon=rectanglePolygon2({center:component.center,width:component.width,height:component.height});for(let{cutout,polygon:cutoutPolygon}of cutoutPolygons){if(!doPolygonsOverlap(componentPolygon,cutoutPolygon))continue;let componentName=getReadableNameForComponent(circuitJson,component.pcb_component_id),cutoutId=cutout.pcb_cutout_id;errors.push({type:"pcb_placement_error",pcb_placement_error_id:`component_over_cutout_${component.pcb_component_id}_${cutoutId}`,error_type:"pcb_placement_error",message:`Component ${componentName} overlaps with pcb_cutout [${cutoutId}]`,subcircuit_id:component.subcircuit_id})}}return errors}function distance22(a6,b6){return Math.hypot(a6.x-b6.x,a6.y-b6.y)}function viasAreAtSameLocation(a6,b6){return distance22(a6,b6)<=EPSILON2}function checkSameNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i6=0;i6<vias.length;i6++)for(let j6=i6+1;j6<vias.length;j6++){let viaA=vias[i6],viaB=vias[j6];if(viasAreAtSameLocation(viaA,viaB)||!connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)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:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkDifferentNetViaSpacing(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via");if(vias.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_via_hole_edge_to_via_hole_edge_clearance")??jlcMinTolerances.min_via_hole_edge_to_via_hole_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=[],reported=new Set;for(let i6=0;i6<vias.length;i6++)for(let j6=i6+1;j6<vias.length;j6++){let viaA=vias[i6],viaB=vias[j6];if(viasAreAtSameLocation(viaA,viaB)||connMap.areIdsConnected(viaA.pcb_via_id,viaB.pcb_via_id))continue;let gap=distance22(viaA,viaB)-viaA.hole_diameter/2-viaB.hole_diameter/2;if(gap+EPSILON2>=minClearance)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:minClearance,actual_clearance:gap,pcb_center:{x:(viaA.x+viaB.x)/2,y:(viaA.y+viaB.y)/2}}))}return errors}function checkSourceTracesHavePcbTraces(circuitJson){let errors=[],sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),sourcePortToPcbPort=new Map(pcbPorts.map(pcbPort=>[pcbPort.source_port_id,pcbPort])),connectivityMap=getFullConnectivityMapFromCircuitJson(circuitJson);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=>connectivityMap.areIdsConnected(sourceTrace.source_trace_id,pcbTrace.pcb_trace_id))){let connectedPcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortToPcbPort.get(sourcePortId)).filter(pcbPort=>pcbPort!==void 0),connectedPcbComponentIds=Array.from(new Set(connectedPcbPorts.map(port=>port.pcb_component_id).filter(id3=>id3!==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}function getRoutePointCenter(point6){return point6.route_type==="through_pad"?{x:(point6.start.x+point6.end.x)/2,y:(point6.start.y+point6.end.y)/2}:{x:point6.x,y:point6.y}}function routePointConnectsToAnotherExpectedPort(point6,expectedPorts,missingPcbPortId,padMap){return point6.route_type!=="wire"?!1:expectedPorts.some(expectedPort=>!expectedPort.pcb_port_id||expectedPort.pcb_port_id===missingPcbPortId?!1:padMap.get(expectedPort.pcb_port_id)?.some(pad2=>isPointInPad({x:point6.x,y:point6.y},pad2))??!1)}function getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap}){let errorLocation,firstWirePoint=firstPoint.route_type==="wire"?firstPoint:void 0,lastWirePoint=lastPoint.route_type==="wire"?lastPoint:void 0,firstWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(firstPoint).includes(port.pcb_port_id),lastWirePointReferencesPort=getPcbPortIdsConnectedToRoutePoint(lastPoint).includes(port.pcb_port_id);firstWirePointReferencesPort&&firstWirePoint?errorLocation=firstWirePoint:lastWirePointReferencesPort&&lastWirePoint||routePointConnectsToAnotherExpectedPort(firstPoint,expectedPorts,port.pcb_port_id,padMap)&&lastWirePoint?errorLocation=lastWirePoint:routePointConnectsToAnotherExpectedPort(lastPoint,expectedPorts,port.pcb_port_id,padMap)&&firstWirePoint?errorLocation=firstWirePoint:firstWirePoint&&lastWirePoint?errorLocation=distance22(firstWirePoint,port)<=distance22(lastWirePoint,port)?firstWirePoint:lastWirePoint:firstWirePoint?errorLocation=firstWirePoint:lastWirePoint&&(errorLocation=lastWirePoint);let firstPointCenter=getRoutePointCenter(firstPoint),lastPointCenter=getRoutePointCenter(lastPoint);return errorLocation?{x:errorLocation.x,y:errorLocation.y}:{x:(firstPointCenter.x+lastPointCenter.x)/2,y:(firstPointCenter.y+lastPointCenter.y)/2}}function checkTracesAreContiguous(circuitJson){let errors=[],pcbPorts=circuitJson.filter(el3=>el3.type==="pcb_port"),pcbTraces=circuitJson.filter(el3=>el3.type==="pcb_trace"),sourceTraces=circuitJson.filter(el3=>el3.type==="source_trace"),pcbSmtPads=circuitJson.filter(el3=>el3.type==="pcb_smtpad"),pcbPlatedHoles=circuitJson.filter(el3=>el3.type==="pcb_plated_hole"),padMap=new Map,pcbConnectivityMap=new PcbConnectivityMap(circuitJson),checkedSourceTraceIds=new Set;for(let pad2 of pcbSmtPads)pad2.pcb_port_id&&padMap.set(pad2.pcb_port_id,[...padMap.get(pad2.pcb_port_id)??[],pad2]);for(let hole of pcbPlatedHoles)hole.pcb_port_id&&padMap.set(hole.pcb_port_id,[...padMap.get(hole.pcb_port_id)??[],hole]);for(let trace of pcbTraces){if(trace.route.length===0)continue;let firstPoint=trace.route[0],lastPoint=trace.route[trace.route.length-1],sourceTrace=sourceTraces.find(st3=>st3.source_trace_id===trace.source_trace_id),expectedPorts=sourceTrace?pcbPorts.filter(port=>sourceTrace.connected_source_port_ids?.includes(port.source_port_id)):[];for(let i6=1;i6<trace.route.length-1;i6++){let prevPoint=trace.route[i6-1],currentPoint=trace.route[i6],nextPoint=trace.route[i6+1];if(currentPoint.route_type==="via"){let prevIsWire=prevPoint.route_type==="wire",nextIsWire=nextPoint.route_type==="wire";if(prevIsWire&&nextIsWire){let prevAligned=Math.abs(prevPoint.x-currentPoint.x)<.01&&Math.abs(prevPoint.y-currentPoint.y)<.01,nextAligned=Math.abs(nextPoint.x-currentPoint.x)<.01&&Math.abs(nextPoint.y-currentPoint.y)<.01;if(!prevAligned||!nextAligned){let traceName2=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);errors.push({type:"pcb_trace_error",message:`Via in trace [${traceName2}] is misaligned at position {x: ${currentPoint.x}, y: ${currentPoint.y}}.`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`misaligned_via_${trace.pcb_trace_id}_${i6}`,pcb_component_ids:[],pcb_port_ids:[]})}}}}let traceName=getReadableNameForPcbTrace(circuitJson,trace.pcb_trace_id);if(sourceTrace&&expectedPorts.length>0){if(checkedSourceTraceIds.has(sourceTrace.source_trace_id))continue;checkedSourceTraceIds.add(sourceTrace.source_trace_id)}for(let port of expectedPorts){if(!port.pcb_port_id)continue;let pads=padMap.get(port.pcb_port_id);if(!pads?.length)continue;let isConnectedByRoutedSourceTrace=!1,candidateTraces=[...pcbConnectivityMap.getAllTracesConnectedToTrace(trace.pcb_trace_id),...pcbTraces.filter(candidateTrace=>candidateTrace.source_trace_id===sourceTrace?.source_trace_id)];for(let candidateTrace of candidateTraces){if(candidateTrace.pcb_trace_id===trace.pcb_trace_id||!candidateTrace.source_trace_id)continue;let candidateSourceTrace=sourceTraces.find(st3=>st3.source_trace_id===candidateTrace.source_trace_id);if(!sourceTrace||candidateTrace.source_trace_id!==sourceTrace.source_trace_id&&!candidateSourceTrace?.connected_source_port_ids.includes(port.source_port_id))continue;let candidateFirstPoint=candidateTrace.route[0],candidateLastPoint=candidateTrace.route.at(-1);if(getPcbPortIdsConnectedToTrace(candidateTrace).includes(port.pcb_port_id)||candidateFirstPoint?.route_type==="wire"&&pads.some(pad2=>isPointInPad(candidateFirstPoint,pad2))||candidateLastPoint?.route_type==="wire"&&pads.some(pad2=>isPointInPad(candidateLastPoint,pad2))){isConnectedByRoutedSourceTrace=!0;break}}if(isConnectedByRoutedSourceTrace)continue;let isFirstPointConnected=firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2)),isLastPointConnected=lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2));if(!isFirstPointConnected&&!isLastPointConnected){let portName=getReadableNameForPcbPort(circuitJson,port.pcb_port_id).replace("pcb_port",""),padType=pads[0].type.replace(/pcb_/,""),errorCenter=getMissingConnectionErrorCenter({firstPoint,lastPoint,port,expectedPorts,padMap});errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] is missing a connection to ${padType}${portName}`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`missing_connection_${trace.pcb_trace_id}_${port.pcb_port_id}`,center:errorCenter,pcb_component_ids:[],pcb_port_ids:[port.pcb_port_id]})}}if(expectedPorts.length===0){let firstConnectsToAnyPad=!1,lastConnectsToAnyPad=!1,endpointsAreSame=firstPoint.route_type==="wire"&&lastPoint.route_type==="wire"&&Math.abs(firstPoint.x-lastPoint.x)<.01&&Math.abs(firstPoint.y-lastPoint.y)<.01;for(let pads of padMap.values())firstPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:firstPoint.x,y:firstPoint.y},pad2))&&(firstConnectsToAnyPad=!0),lastPoint.route_type==="wire"&&pads.some(pad2=>isPointInPad({x:lastPoint.x,y:lastPoint.y},pad2))&&(lastConnectsToAnyPad=!0);!firstConnectsToAnyPad&&firstPoint.route_type==="wire"&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${firstPoint.x.toFixed(2)}, ${firstPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_start`,center:{x:firstPoint.x,y:firstPoint.y},pcb_component_ids:[],pcb_port_ids:[]}),!lastConnectsToAnyPad&&lastPoint.route_type==="wire"&&!(endpointsAreSame&&!firstConnectsToAnyPad)&&errors.push({type:"pcb_trace_error",message:`Trace [${traceName}] has disconnected endpoint at (${lastPoint.x.toFixed(2)}, ${lastPoint.y.toFixed(2)})`,source_trace_id:sourceTrace?.source_trace_id||trace.source_trace_id||`!${trace.pcb_trace_id}`,error_type:"pcb_trace_error",pcb_trace_id:trace.pcb_trace_id,pcb_trace_error_id:`disconnected_endpoint_${trace.pcb_trace_id}_end`,center:{x:lastPoint.x,y:lastPoint.y},pcb_component_ids:[],pcb_port_ids:[]})}}return errors}function getBoardPolygonPoints(board){if(board.outline&&board.outline.length>0)return board.outline.map(p3=>({x:p3.x,y:p3.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=[],board=getPcbBoard(circuitJson);if(!board)return errors;let margin=config.margin??getBoardDrcValue(board,"min_board_edge_clearance")??jlcMinTolerances.min_board_edge_clearance,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 i6=0;i6<trace.route.length-1;i6++){let p12=trace.route[i6],p22=trace.route[i6+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=Number.POSITIVE_INFINITY;for(let j6=0;j6<boardPoints.length;j6++){let edgeStart=boardPoints[j6],edgeEnd=boardPoints[(j6+1)%boardPoints.length],distance33=segmentToSegmentMinDistance(segmentStart,segmentEnd,edgeStart,edgeEnd);distance33<minDistance&&(minDistance=distance33)}let minimumDistance=traceWidth/2+margin;if(minDistance<minimumDistance){let error2={type:"pcb_trace_error",error_type:"pcb_trace_error",pcb_trace_error_id:`trace_too_close_to_board_${trace.pcb_trace_id}_segment_${i6}`,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(error2)}}return errors}function getElementLayers(elem){return elem.type==="pcb_courtyard_circle"||elem.type==="pcb_courtyard_outline"||elem.type==="pcb_courtyard_polygon"||elem.type==="pcb_courtyard_rect"?[elem.layer]:getLayersOfPcbElement(elem)}function doLayersOverlap(layers1,layers2){return layers1.length===0||layers2.length===0?!0:layers1.some(l6=>layers2.includes(l6))}function doPcbElementsOverlap(elem1,elem2){let layers1=getElementLayers(elem1),layers2=getElementLayers(elem2);if(!doLayersOverlap(layers1,layers2))return!1;if(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad")return getPadToPadGap(elem1,elem2)<=0;let bounds1=getBoundsOfPcbElements([elem1]),bounds2=getBoundsOfPcbElements([elem2]);return doBoundsOverlap(bounds1,bounds2)}var isCourtyardElement=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",formatOverlapElementDescription=(circuitJson,element)=>{if("pcb_port_id"in element&&element.pcb_port_id)return getReadableNameForPort(circuitJson,element.pcb_port_id);let id3=getPrimaryId(element),readableName=getReadableNameForElementId(circuitJson,id3);return readableName==="element"?`[${id3}]`: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(),courtyards=circuitJson.filter(isCourtyardElement),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:[]}),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:[]}),componentMap.get(componentId).elements.push(hole)}for(let hole of holes){let componentId=hole.pcb_component_id||`standalone_hole_${getPrimaryId(hole)}`;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[hole]})}for(let courtyard of courtyards){let componentId=courtyard.pcb_component_id;componentMap.has(componentId)||componentMap.set(componentId,{component_id:componentId,elements:[]}),componentMap.get(componentId).elements.push(courtyard)}for(let[componentId,componentData]of componentMap)componentData.elements.length>0&&(componentData.bounds=getBoundsOfPcbElements(componentData.elements));let componentsWithElements=Array.from(componentMap.values());for(let i6=0;i6<componentsWithElements.length;i6++)for(let j6=i6+1;j6<componentsWithElements.length;j6++){let comp1=componentsWithElements[i6],comp2=componentsWithElements[j6];if(!(!comp1.bounds||!comp2.bounds)&&doBoundsOverlap(comp1.bounds,comp2.bounds))for(let elem1 of comp1.elements)for(let elem2 of comp2.elements){let id1=getPrimaryId(elem1),id22=getPrimaryId(elem2);if(!((isCourtyardElement(elem1)||isCourtyardElement(elem2))&&elem1.type!=="pcb_hole"&&elem2.type!=="pcb_hole")&&!(elem1.type==="pcb_smtpad"&&elem2.type==="pcb_smtpad"&&connMap.areIdsConnected(id1,id22))&&doPcbElementsOverlap(elem1,elem2)){let elem1Description=formatOverlapElementDescription(circuitJson,elem1),elem2Description=formatOverlapElementDescription(circuitJson,elem2),error2={type:"pcb_footprint_overlap_error",pcb_error_id:`pcb_footprint_overlap_${id1}_${id22}`,error_type:"pcb_footprint_overlap_error",message:`${elem1.type} ${elem1Description} overlaps with ${elem2.type} ${elem2Description}`};(elem1.type==="pcb_smtpad"||elem2.type==="pcb_smtpad")&&(error2.pcb_smtpad_ids=[],elem1.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id1),elem2.type==="pcb_smtpad"&&error2.pcb_smtpad_ids.push(id22)),(elem1.type==="pcb_plated_hole"||elem2.type==="pcb_plated_hole")&&(error2.pcb_plated_hole_ids=[],elem1.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id1),elem2.type==="pcb_plated_hole"&&error2.pcb_plated_hole_ids.push(id22)),(elem1.type==="pcb_hole"||elem2.type==="pcb_hole")&&(error2.pcb_hole_ids=[],elem1.type==="pcb_hole"&&error2.pcb_hole_ids.push(id1),elem2.type==="pcb_hole"&&error2.pcb_hole_ids.push(id22)),errors.push(error2)}}}return errors}var courtyardTypes=new Set(["pcb_courtyard_circle","pcb_courtyard_outline","pcb_courtyard_polygon","pcb_courtyard_pill","pcb_courtyard_rect"]);function checkPcbComponentsMissingCourtyard(circuitJson){let componentIdsWithCourtyards=new Set(circuitJson.filter(element=>courtyardTypes.has(element.type)).flatMap(element=>"pcb_component_id"in element&&element.pcb_component_id?[element.pcb_component_id]:[]));return circuitJson.filter(element=>element.type==="pcb_component").filter(component=>!componentIdsWithCourtyards.has(component.pcb_component_id)).map(component=>{let sourceComponent=component.source_component_id?circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===component.source_component_id):void 0,componentName=sourceComponent?.type==="source_component"?sourceComponent.name:getReadableNameForComponent(circuitJson,component.pcb_component_id);return{type:"pcb_component_missing_courtyard_warning",pcb_component_missing_courtyard_warning_id:`pcb_component_missing_courtyard_warning_${component.pcb_component_id}`,warning_type:"pcb_component_missing_courtyard_warning",message:`${componentName} has no courtyard`,pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,subcircuit_id:component.subcircuit_id}})}var DEFAULT_VIA_LENGTH_MM=1.6,getRoutePointPosition=routePoint=>routePoint.route_type==="through_pad"?routePoint.start:{x:routePoint.x,y:routePoint.y},getPcbTraceLength=pcbTrace=>{if(pcbTrace.trace_length!==void 0)return pcbTrace.trace_length;let traceLength2=0;for(let routePointIndex=0;routePointIndex<pcbTrace.route.length;routePointIndex++){let routePoint=pcbTrace.route[routePointIndex];if(!routePoint)continue;if(routePoint.route_type==="via"){traceLength2+=DEFAULT_VIA_LENGTH_MM;continue}let nextRoutePoint=pcbTrace.route[routePointIndex+1];if(!nextRoutePoint)continue;let routePointPosition=getRoutePointPosition(routePoint),nextRoutePointPosition=getRoutePointPosition(nextRoutePoint);traceLength2+=Math.hypot(nextRoutePointPosition.x-routePointPosition.x,nextRoutePointPosition.y-routePointPosition.y)}return traceLength2},checkPcbTraceLengths=circuitJson=>{let sourceTraces=circuitJson.filter(element=>element.type==="source_trace"),pcbTraces=circuitJson.filter(element=>element.type==="pcb_trace"),sourceTracesById=new Map(sourceTraces.map(sourceTrace=>[sourceTrace.source_trace_id,sourceTrace])),warnings=[];for(let pcbTrace of pcbTraces){if(!pcbTrace.source_trace_id)continue;let sourceTrace=sourceTracesById.get(pcbTrace.source_trace_id);if(!sourceTrace)continue;let maximumTraceLength=sourceTrace.max_length;if(typeof maximumTraceLength!="number")continue;let actualTraceLength=getPcbTraceLength(pcbTrace);actualTraceLength<=maximumTraceLength||warnings.push({type:"pcb_trace_too_long_warning",pcb_trace_too_long_warning_id:`pcb_trace_too_long_warning_${pcbTrace.pcb_trace_id}`,warning_type:"pcb_trace_too_long_warning",message:`PCB trace is ${actualTraceLength.toFixed(2)}mm long, exceeding the ${maximumTraceLength}mm maximum`,pcb_trace_id:pcbTrace.pcb_trace_id,source_trace_id:sourceTrace.source_trace_id,source_net_id:sourceTrace.connected_source_net_ids[0],actual_trace_length:actualTraceLength,maximum_trace_length:maximumTraceLength,subcircuit_id:pcbTrace.subcircuit_id??sourceTrace.subcircuit_id})}return warnings},checkPcbTraceViaCounts=circuitJson=>{let sourceTraces=circuitJson.filter(element=>element.type==="source_trace"),pcbTraces=circuitJson.filter(element=>element.type==="pcb_trace"),pcbPorts=circuitJson.filter(element=>element.type==="pcb_port"),errors=[];for(let sourceTrace of sourceTraces){let maximumViaCount=sourceTrace.max_via_count;if(typeof maximumViaCount!="number")continue;let routedPcbTraces=pcbTraces.filter(pcbTrace=>pcbTrace.source_trace_id===sourceTrace.source_trace_id);if(routedPcbTraces.length===0)continue;let actualViaCount=routedPcbTraces.reduce((viaCount,pcbTrace)=>viaCount+pcbTrace.route.filter(routePoint=>routePoint.route_type==="via").length,0);if(actualViaCount<=maximumViaCount)continue;let connectedPcbPorts=pcbPorts.filter(pcbPort=>pcbPort.source_port_id!==void 0&&sourceTrace.connected_source_port_ids.includes(pcbPort.source_port_id));errors.push({type:"pcb_trace_error",pcb_trace_error_id:`max_via_count_exceeded_${sourceTrace.source_trace_id}`,error_type:"pcb_trace_error",message:`PCB trace uses ${actualViaCount} vias, exceeding the ${maximumViaCount} maximum`,pcb_trace_id:routedPcbTraces[0].pcb_trace_id,source_trace_id:sourceTrace.source_trace_id,pcb_component_ids:[...new Set(connectedPcbPorts.map(pcbPort=>pcbPort.pcb_component_id).filter(pcbComponentId=>pcbComponentId!==void 0))],pcb_port_ids:connectedPcbPorts.map(pcbPort=>pcbPort.pcb_port_id),subcircuit_id:routedPcbTraces[0].subcircuit_id??sourceTrace.subcircuit_id})}return errors};function checkPadPadClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson);if(pads.length<2)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:pad2=>getPrimaryId(pad2)}),errors=new Map;for(let padA of pads){let padAId=getPrimaryId(padA),nearbyPads=spatialIndex.getObjectsInBounds(getPadBounds2(padA),minClearance);for(let padB of nearbyPads){let padBId=getPrimaryId(padB);if(padAId===padBId||!getLayersOfPcbElement(padA).some(layer=>getLayersOfPcbElement(padB).includes(layer))||connMap.areIdsConnected(padAId,padBId))continue;let pairId=[padAId,padBId].sort().join("_"),gap=getPadToPadGap(padA,padB);if(gap+EPSILON2>=minClearance)continue;let centerA=getPadCenter3(padA),centerB=getPadCenter3(padB),nextError={type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`pad_pad_clearance_${pairId}`,error_type:"pcb_pad_pad_clearance_error",message:`Pads ${getReadableNameForElement(circuitJson,padAId)} and ${getReadableNameForElement(circuitJson,padBId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_ids:[padAId,padBId],minimum_clearance:minClearance,actual_clearance:gap,center:{x:(centerA.x+centerB.x)/2,y:(centerA.y+centerB.y)/2}};errors.has(pairId)||errors.set(pairId,nextError)}}return Array.from(errors.values())}function checkPadTraceClearance(circuitJson,{connMap,minClearance}={}){let pads=getPads(circuitJson),segments=getTraceSegments(circuitJson);if(pads.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let spatialIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:pad2=>getPrimaryId(pad2)}),errors=new Map,overlappingPairIds=new Set;for(let segment2 of segments){let nearbyPads=spatialIndex.getObjectsInBounds(getCollidableBounds(segment2),minClearance+segment2.thickness/2);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(pad2).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,padId))continue;let pairId=`${padId}_${segment2.pcb_trace_id}`,{gap}=getTraceObstacleClearance(segment2,pad2);if(isTraceObstacleOverlap(gap)){errors.delete(pairId),overlappingPairIds.add(pairId);continue}if(overlappingPairIds.has(pairId)||gap+EPSILON2>=minClearance)continue;let nextError={type:"pcb_pad_trace_clearance_error",pcb_pad_trace_clearance_error_id:`pad_trace_clearance_${pairId}`,error_type:"pcb_pad_trace_clearance_error",message:`Pad ${getReadableNameForElement(circuitJson,padId)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_pad_id:padId,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:getTraceCenter(segment2)},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkViaTraceClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(el3=>el3.type==="pcb_via"),segments=getTraceSegments(circuitJson);if(vias.length===0||segments.length===0)return[];let board=getPcbBoard(circuitJson);minClearance??(minClearance=getBoardDrcValue(board,"min_trace_to_pad_edge_clearance")??jlcMinTolerances.min_trace_to_pad_edge_clearance),connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let errors=new Map,overlappingPairIds=new Set;for(let via of vias)for(let segment2 of segments){if(!getLayersOfPcbElement(via).includes(segment2.layer)||connMap.areIdsConnected(segment2.pcb_trace_id,via.pcb_via_id))continue;let pairId=`${via.pcb_via_id}_${segment2.pcb_trace_id}`,{gap}=getTraceObstacleClearance(segment2,via);if(isTraceObstacleOverlap(gap)){errors.delete(pairId),overlappingPairIds.add(pairId);continue}if(overlappingPairIds.has(pairId)||gap+EPSILON2>=minClearance)continue;let nextError={type:"pcb_via_trace_clearance_error",pcb_via_trace_clearance_error_id:`via_trace_clearance_${pairId}`,error_type:"pcb_via_trace_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and trace ${getReadableNameForElement(circuitJson,segment2.pcb_trace_id)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(minClearance)})`,pcb_via_id:via.pcb_via_id,pcb_trace_id:segment2.pcb_trace_id,minimum_clearance:minClearance,actual_clearance:gap,center:getTraceCenter(segment2)},current3=errors.get(pairId);(!current3||gap<current3.gap)&&errors.set(pairId,{error:nextError,gap})}return Array.from(errors.values()).map(({error:error2})=>error2)}function checkViaPadClearance(circuitJson,{connMap,minClearance}={}){let vias=circuitJson.filter(element=>element.type==="pcb_via"),pads=getPads(circuitJson);if(vias.length===0||pads.length===0)return[];let board=getPcbBoard(circuitJson),requiredClearance=minClearance??getBoardDrcValue(board,"min_pad_edge_to_pad_edge_clearance")??jlcMinTolerances.min_pad_edge_to_pad_edge_clearance;connMap??(connMap=getFullConnectivityMapFromCircuitJson(circuitJson));let padIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:getPrimaryId}),errors=[];for(let via of vias){let nearbyPads=padIndex.getObjectsInBounds(getPadBounds2(via),requiredClearance);for(let pad2 of nearbyPads){let padId=getPrimaryId(pad2);if(!getLayersOfPcbElement(via).some(layer=>getLayersOfPcbElement(pad2).includes(layer))||connMap.areIdsConnected(via.pcb_via_id,padId))continue;let gap=getPadToPadGap(via,pad2);if(gap+EPSILON2>=requiredClearance)continue;let viaCenter=getPadCenter3(via),padCenter=getPadCenter3(pad2);errors.push({type:"pcb_pad_pad_clearance_error",pcb_pad_pad_clearance_error_id:`via_pad_clearance_${via.pcb_via_id}_${padId}`,error_type:"pcb_pad_pad_clearance_error",message:`Via ${getReadableNameForElement(circuitJson,via.pcb_via_id)} and pad ${getReadableNameForElement(circuitJson,padId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(requiredClearance)})`,pcb_pad_ids:[via.pcb_via_id,padId],minimum_clearance:requiredClearance,actual_clearance:gap,center:{x:(viaCenter.x+padCenter.x)/2,y:(viaCenter.y+padCenter.y)/2}})}}return errors}function checkViasInPads(circuitJson){let board=getPcbBoard(circuitJson);if(board&&"is_via_in_pad_allowed"in board&&board.is_via_in_pad_allowed===!0)return[];let vias=circuitJson.filter(element=>element.type==="pcb_via"),pads=getPads(circuitJson);if(vias.length===0||pads.length===0)return[];let padOrdinals=new Map(pads.map((pad2,index)=>[getPrimaryId(pad2),index])),padIndex=new SpatialObjectIndex({objects:pads,getBounds:getPadBounds2,getId:getPrimaryId}),errors=[];for(let via of vias){let nearbyPads=padIndex.getObjectsInBounds({minX:via.x,minY:via.y,maxX:via.x,maxY:via.y});for(let pad2 of nearbyPads){let viaLayers=getLayersOfPcbElement(via),padLayers=getLayersOfPcbElement(pad2);if(!viaLayers.some(layer=>padLayers.includes(layer))||!isPointInPad(via,pad2))continue;let padId=getPrimaryId(pad2),padOrdinal=padOrdinals.get(padId)??0,padName=getReadableNameForFootprintPad(circuitJson,pad2,padOrdinal);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`via_in_pad_${via.pcb_via_id}_${padId}`,error_type:"pcb_placement_error",message:`Via at (${via.x.toFixed(2)}mm, ${via.y.toFixed(2)}mm) is inside ${padName}`,subcircuit_id:via.subcircuit_id??pad2.subcircuit_id})}}return errors}var dedupePcbDrcErrors=errors=>{let specificallyReportedPairIds=new Set;for(let error2 of errors)error2.type==="pcb_pad_trace_clearance_error"&&typeof error2.pcb_trace_id=="string"&&typeof error2.pcb_pad_id=="string"&&specificallyReportedPairIds.add(`overlap_${error2.pcb_trace_id}_${error2.pcb_pad_id}`),error2.type==="pcb_via_trace_clearance_error"&&typeof error2.pcb_trace_id=="string"&&typeof error2.pcb_via_id=="string"&&specificallyReportedPairIds.add(`overlap_${error2.pcb_trace_id}_${error2.pcb_via_id}`);return errors.filter(element=>{let error2=element;return!(error2.type==="pcb_trace_error"&&typeof error2.pcb_trace_error_id=="string"&&specificallyReportedPairIds.has(error2.pcb_trace_error_id))})};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 getFacingDirectionFromInsertionDirection(component){switch(component.insertion_direction){case"from_left":return"x-";case"from_right":return"x+";case"from_top":return"y+";case"from_bottom":return"y-";case"from_above":case"from_below":return null;default:return null}}function getFacingDirection(component){if(component.insertion_direction)return getFacingDirectionFromInsertionDirection(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((a6,b6)=>a6.distance-b6.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){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}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,cos6=Math.cos(angle),sin6=Math.sin(angle);return corners.map(({x:x6,y:y2})=>({x:el3.center.x+x6*cos6-y2*sin6,y:el3.center.y+x6*sin6+y2*cos6}))}return el3.type==="pcb_courtyard_circle"?Array.from({length:32},(_3,i6)=>{let a6=2*Math.PI*i6/32;return{x:el3.center.x+el3.radius*Math.cos(a6),y:el3.center.y+el3.radius*Math.sin(a6)}}):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(p3=>isPointInsidePolygon(p3,polyB))||polyB.some(p3=>isPointInsidePolygon(p3,polyA)))return!0;for(let i6=0;i6<polyA.length;i6++){let a12=polyA[i6],a22=polyA[(i6+1)%polyA.length];for(let j6=0;j6<polyB.length;j6++){let b12=polyB[j6],b22=polyB[(j6+1)%polyB.length];if(doSegmentsIntersect(a12,a22,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 id3=el3.pcb_component_id;byComponent.has(id3)||byComponent.set(id3,[]),byComponent.get(id3).push(el3)}let componentIds=Array.from(byComponent.keys()),errors=[];for(let i6=0;i6<componentIds.length;i6++)for(let j6=i6+1;j6<componentIds.length;j6++){let idA=componentIds[i6],idB=componentIds[j6],overlapping=!1;outer:for(let a6 of byComponent.get(idA))for(let b6 of byComponent.get(idB)){if("layer"in a6&&"layer"in b6&&a6.layer!==b6.layer)continue;let polyA=getCourtyardPolygon(a6),polyB=getCourtyardPolygon(b6);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}var isCourtyardElement2=element=>element.type==="pcb_courtyard_circle"||element.type==="pcb_courtyard_outline"||element.type==="pcb_courtyard_polygon"||element.type==="pcb_courtyard_rect",isPointInsideCourtyard=(point6,courtyard)=>{if(courtyard.type==="pcb_courtyard_circle"){let dx3=point6.x-courtyard.center.x,dy3=point6.y-courtyard.center.y;return dx3*dx3+dy3*dy3<=courtyard.radius*courtyard.radius}if(courtyard.type==="pcb_courtyard_rect"){let angle=-1*(courtyard.ccw_rotation??0)*Math.PI/180,dx3=point6.x-courtyard.center.x,dy3=point6.y-courtyard.center.y,localX=dx3*Math.cos(angle)-dy3*Math.sin(angle),localY=dx3*Math.sin(angle)+dy3*Math.cos(angle);return Math.abs(localX)<=courtyard.width/2&&Math.abs(localY)<=courtyard.height/2}let polygon2=courtyard.type==="pcb_courtyard_polygon"?courtyard.points:courtyard.outline;return isPointInsidePolygon(point6,polygon2)},getPcbComponentName=(circuitJson,pcbComponentId)=>{let pcbComponent=circuitJson.find(element=>element.type==="pcb_component"&&element.pcb_component_id===pcbComponentId),sourceComponent=circuitJson.find(element=>element.type==="source_component"&&element.source_component_id===pcbComponent?.source_component_id);return(sourceComponent&&"name"in sourceComponent?sourceComponent.name:void 0)??getReadableNameForComponent(circuitJson,pcbComponentId)};function checkTestPointAccessibility(circuitJson){let sourceTestPoints=circuitJson.filter(element=>element.type==="source_component"&&element.ftype==="simple_test_point"),sourceTestPointIds=new Set(sourceTestPoints.map(testPoint=>testPoint.source_component_id)),testPointNames=new Map(sourceTestPoints.map(testPoint=>[testPoint.source_component_id,testPoint.name])),testPointComponents=circuitJson.filter(element=>element.type==="pcb_component"&&sourceTestPointIds.has(element.source_component_id)),courtyards=circuitJson.filter(isCourtyardElement2),errors=[],reportedComponentPairs=new Set;for(let testPoint of testPointComponents)for(let courtyard of courtyards){if(courtyard.pcb_component_id===testPoint.pcb_component_id||courtyard.layer!==testPoint.layer||!isPointInsideCourtyard(testPoint.center,courtyard))continue;let componentPair=`${testPoint.pcb_component_id}:${courtyard.pcb_component_id}`;if(reportedComponentPairs.has(componentPair))continue;reportedComponentPairs.add(componentPair);let testPointName=testPointNames.get(testPoint.source_component_id)??"Test point",obstructingComponentName=getPcbComponentName(circuitJson,courtyard.pcb_component_id);errors.push({type:"pcb_placement_error",pcb_placement_error_id:`testpoint_in_courtyard_${testPoint.pcb_component_id}_${courtyard.pcb_component_id}`,error_type:"pcb_placement_error",message:`Test point ${testPointName} is not accessible because it is inside the courtyard of ${obstructingComponentName}`,subcircuit_id:testPoint.subcircuit_id})}return errors}async function runAllPlacementChecks(circuitJson){return[...checkCopperToBoardEdgeClearance(circuitJson),...checkViasInPads(circuitJson),...checkPcbComponentsOutOfBoard(circuitJson),...checkPcbComponentOverCutout(circuitJson),...checkPcbComponentOverlap(circuitJson),...checkPcbComponentsMissingCourtyard(circuitJson),...checkPadPadClearance(circuitJson),...checkCourtyardOverlap(circuitJson),...checkConnectorAccessibleOrientation(circuitJson),...checkTestPointAccessibility(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),...checkPcbTraceLengths(circuitJson),...checkPcbTraceViaCounts(circuitJson),...checkEachPcbTraceNonOverlapping(circuitJson),...checkPadTraceClearance(circuitJson),...checkViaTraceClearance(circuitJson),...checkViaPadClearance(circuitJson),...checkSameNetViaSpacing(circuitJson),...checkDifferentNetViaSpacing(circuitJson),...checkTracesAreContiguous(circuitJson),...checkPcbTracesOutOfBoard(circuitJson)]}init_dist7();init_dist();init_dist7();init_dist2();var emptyBounds=()=>({minX:Number.POSITIVE_INFINITY,maxX:Number.NEGATIVE_INFINITY,minY:Number.POSITIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY}),includePoint=(bounds,x6,y2)=>{bounds.minX=Math.min(bounds.minX,x6),bounds.maxX=Math.max(bounds.maxX,x6),bounds.minY=Math.min(bounds.minY,y2),bounds.maxY=Math.max(bounds.maxY,y2)},includeRect=(bounds,x6,y2,width,height)=>{includePoint(bounds,x6-width/2,y2-height/2),includePoint(bounds,x6+width/2,y2+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):[],sideFromInsertionDirection=direction2=>{switch(direction2){case"from_left":case"from_x_neg":return"left";case"from_right":case"from_x_pos":return"right";case"from_top":case"from_y_pos":case"from_front":return"top";case"from_bottom":case"from_y_neg":case"from_back":return"bottom";case"from_above":case"from_z_pos":return"above";case"from_below":case"from_z_neg":return"below";default:return}},getInsertionDirection=component=>{if("insertion_direction"in component)return typeof component.insertion_direction=="string"?component.insertion_direction:void 0},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},inferredSide=Object.entries(sideMargins).sort((a6,b6)=>b6[1]-a6[1])[0]?.[0]??"bottom",side=sideFromInsertionDirection(getInsertionDirection(pcbComponent))??inferredSide,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==="above"||side==="below"?{x:centerX,y:centerY,side,pcbComponentId:pcbComponent.pcb_component_id}: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_dist2();init_dist5();var import_object_hash=__toESM(require_object_hash(),1),import_object_hash2=__toESM(require_object_hash(),1),import_object_hash3=__toESM(require_object_hash(),1);var t=Object.create,e4=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o5=Object.getOwnPropertyNames,i=Object.getPrototypeOf,r=Object.prototype.hasOwnProperty,s3=(t53,e6)=>function(){return e6||(0,t53[o5(t53)[0]])((e6={exports:{}}).exports,e6),e6.exports},a=(t53,n3)=>{for(var o6 in n3)e4(t53,o6,{get:n3[o6],enumerable:!0})},c=(s6,a6,c3)=>(c3=s6!=null?t(i(s6)):{},((t53,i6,s7,a7)=>{if(i6&&typeof i6=="object"||typeof i6=="function")for(let c4 of o5(i6))r.call(t53,c4)||c4===s7||e4(t53,c4,{get:()=>i6[c4],enumerable:!(a7=n(i6,c4))||a7.enumerable});return t53})(!a6&&s6&&s6.__esModule?c3:e4(c3,"default",{value:s6,enumerable:!0}),s6)),l=s3({"node_modules/is-buffer/index.js"(t53,e6){function n3(t54){return!!t54.constructor&&typeof t54.constructor.isBuffer=="function"&&t54.constructor.isBuffer(t54)}e6.exports=function(t54){return t54!=null&&(n3(t54)||(function(t55){return typeof t55.readFloatLE=="function"&&typeof t55.slice=="function"&&n3(t55.slice(0,0))})(t54)||!!t54._isBuffer)}}}),h=s3({"node_modules/kind-of/index.js"(t53,e6){var n3=l(),o6=Object.prototype.toString;e6.exports=function(t54){if(t54===void 0)return"undefined";if(t54===null)return"null";if(t54===!0||t54===!1||t54 instanceof Boolean)return"boolean";if(typeof t54=="string"||t54 instanceof String)return"string";if(typeof t54=="number"||t54 instanceof Number)return"number";if(typeof t54=="function"||t54 instanceof Function)return"function";if(Array.isArray!==void 0&&Array.isArray(t54))return"array";if(t54 instanceof RegExp)return"regexp";if(t54 instanceof Date)return"date";var e7=o6.call(t54);return e7==="[object RegExp]"?"regexp":e7==="[object Date]"?"date":e7==="[object Arguments]"?"arguments":e7==="[object Error]"?"error":n3(t54)?"buffer":e7==="[object Set]"?"set":e7==="[object WeakSet]"?"weakset":e7==="[object Map]"?"map":e7==="[object WeakMap]"?"weakmap":e7==="[object Symbol]"?"symbol":e7==="[object Int8Array]"?"int8array":e7==="[object Uint8Array]"?"uint8array":e7==="[object Uint8ClampedArray]"?"uint8clampedarray":e7==="[object Int16Array]"?"int16array":e7==="[object Uint16Array]"?"uint16array":e7==="[object Int32Array]"?"int32array":e7==="[object Uint32Array]"?"uint32array":e7==="[object Float32Array]"?"float32array":e7==="[object Float64Array]"?"float64array":"object"}}}),d=s3({"node_modules/rename-keys/index.js"(t53,e6){(function(){function t54(t55,e7){if(typeof e7!="function")return t55;var n3={};for(var o6 in t55)Object.prototype.hasOwnProperty.call(t55,o6)&&(n3[e7(o6,t55[o6])||o6]=t55[o6]);return n3}e6!==void 0&&e6.exports?e6.exports=t54:typeof define=="function"&&define.amd?define([],function(){return t54}):window.rename=t54})()}}),u3=s3({"node_modules/deep-rename-keys/index.js"(t53,e6){var n3=h(),o6=d();e6.exports=function t54(e7,i6){var r6=n3(e7);if(r6!=="object"&&r6!=="array")throw new Error("expected an object");var s6=[];for(var a6 in r6==="object"&&(e7=o6(e7,i6),s6={}),e7)if(e7.hasOwnProperty(a6)){var c3=e7[a6];n3(c3)==="object"||n3(c3)==="array"?s6[a6]=t54(c3,i6):s6[a6]=c3}return s6}}}),p=s3({"node_modules/xml-reader/node_modules/eventemitter3/index.js"(t53,e6){var n3=Object.prototype.hasOwnProperty,o6="~";function i6(){}function r6(t54,e7,n6){this.fn=t54,this.context=e7,this.once=n6||!1}function s6(){this._events=new i6,this._eventsCount=0}Object.create&&(i6.prototype=Object.create(null),new i6().__proto__||(o6=!1)),s6.prototype.eventNames=function(){var t54,e7,i7=[];if(this._eventsCount===0)return i7;for(e7 in t54=this._events)n3.call(t54,e7)&&i7.push(o6?e7.slice(1):e7);return Object.getOwnPropertySymbols?i7.concat(Object.getOwnPropertySymbols(t54)):i7},s6.prototype.listeners=function(t54,e7){var n6=o6?o6+t54:t54,i7=this._events[n6];if(e7)return!!i7;if(!i7)return[];if(i7.fn)return[i7.fn];for(var r10=0,s7=i7.length,a6=new Array(s7);r10<s7;r10++)a6[r10]=i7[r10].fn;return a6},s6.prototype.emit=function(t54,e7,n6,i7,r10,s7){var a6=o6?o6+t54:t54;if(!this._events[a6])return!1;var c3,l6,h3=this._events[a6],d3=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t54,h3.fn,void 0,!0),d3){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e7),!0;case 3:return h3.fn.call(h3.context,e7,n6),!0;case 4:return h3.fn.call(h3.context,e7,n6,i7),!0;case 5:return h3.fn.call(h3.context,e7,n6,i7,r10),!0;case 6:return h3.fn.call(h3.context,e7,n6,i7,r10,s7),!0}for(l6=1,c3=new Array(d3-1);l6<d3;l6++)c3[l6-1]=arguments[l6];h3.fn.apply(h3.context,c3)}else{var u6,p3=h3.length;for(l6=0;l6<p3;l6++)switch(h3[l6].once&&this.removeListener(t54,h3[l6].fn,void 0,!0),d3){case 1:h3[l6].fn.call(h3[l6].context);break;case 2:h3[l6].fn.call(h3[l6].context,e7);break;case 3:h3[l6].fn.call(h3[l6].context,e7,n6);break;case 4:h3[l6].fn.call(h3[l6].context,e7,n6,i7);break;default:if(!c3)for(u6=1,c3=new Array(d3-1);u6<d3;u6++)c3[u6-1]=arguments[u6];h3[l6].fn.apply(h3[l6].context,c3)}}return!0},s6.prototype.on=function(t54,e7,n6){var i7=new r6(e7,n6||this),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.once=function(t54,e7,n6){var i7=new r6(e7,n6||this,!0),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.removeListener=function(t54,e7,n6,r10){var s7=o6?o6+t54:t54;if(!this._events[s7])return this;if(!e7)return--this._eventsCount===0?this._events=new i6:delete this._events[s7],this;var a6=this._events[s7];if(a6.fn)a6.fn!==e7||r10&&!a6.once||n6&&a6.context!==n6||(--this._eventsCount===0?this._events=new i6:delete this._events[s7]);else{for(var c3=0,l6=[],h3=a6.length;c3<h3;c3++)(a6[c3].fn!==e7||r10&&!a6[c3].once||n6&&a6[c3].context!==n6)&&l6.push(a6[c3]);l6.length?this._events[s7]=l6.length===1?l6[0]:l6:--this._eventsCount===0?this._events=new i6:delete this._events[s7]}return this},s6.prototype.removeAllListeners=function(t54){var e7;return t54?(e7=o6?o6+t54:t54,this._events[e7]&&(--this._eventsCount===0?this._events=new i6:delete this._events[e7])):(this._events=new i6,this._eventsCount=0),this},s6.prototype.off=s6.prototype.removeListener,s6.prototype.addListener=s6.prototype.on,s6.prototype.setMaxListeners=function(){return this},s6.prefixed=o6,s6.EventEmitter=s6,e6!==void 0&&(e6.exports=s6)}}),m=s3({"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(t53,e6){var n3=Object.prototype.hasOwnProperty,o6="~";function i6(){}function r6(t54,e7,n6){this.fn=t54,this.context=e7,this.once=n6||!1}function s6(){this._events=new i6,this._eventsCount=0}Object.create&&(i6.prototype=Object.create(null),new i6().__proto__||(o6=!1)),s6.prototype.eventNames=function(){var t54,e7,i7=[];if(this._eventsCount===0)return i7;for(e7 in t54=this._events)n3.call(t54,e7)&&i7.push(o6?e7.slice(1):e7);return Object.getOwnPropertySymbols?i7.concat(Object.getOwnPropertySymbols(t54)):i7},s6.prototype.listeners=function(t54,e7){var n6=o6?o6+t54:t54,i7=this._events[n6];if(e7)return!!i7;if(!i7)return[];if(i7.fn)return[i7.fn];for(var r10=0,s7=i7.length,a6=new Array(s7);r10<s7;r10++)a6[r10]=i7[r10].fn;return a6},s6.prototype.emit=function(t54,e7,n6,i7,r10,s7){var a6=o6?o6+t54:t54;if(!this._events[a6])return!1;var c3,l6,h3=this._events[a6],d3=arguments.length;if(h3.fn){switch(h3.once&&this.removeListener(t54,h3.fn,void 0,!0),d3){case 1:return h3.fn.call(h3.context),!0;case 2:return h3.fn.call(h3.context,e7),!0;case 3:return h3.fn.call(h3.context,e7,n6),!0;case 4:return h3.fn.call(h3.context,e7,n6,i7),!0;case 5:return h3.fn.call(h3.context,e7,n6,i7,r10),!0;case 6:return h3.fn.call(h3.context,e7,n6,i7,r10,s7),!0}for(l6=1,c3=new Array(d3-1);l6<d3;l6++)c3[l6-1]=arguments[l6];h3.fn.apply(h3.context,c3)}else{var u6,p3=h3.length;for(l6=0;l6<p3;l6++)switch(h3[l6].once&&this.removeListener(t54,h3[l6].fn,void 0,!0),d3){case 1:h3[l6].fn.call(h3[l6].context);break;case 2:h3[l6].fn.call(h3[l6].context,e7);break;case 3:h3[l6].fn.call(h3[l6].context,e7,n6);break;case 4:h3[l6].fn.call(h3[l6].context,e7,n6,i7);break;default:if(!c3)for(u6=1,c3=new Array(d3-1);u6<d3;u6++)c3[u6-1]=arguments[u6];h3[l6].fn.apply(h3[l6].context,c3)}}return!0},s6.prototype.on=function(t54,e7,n6){var i7=new r6(e7,n6||this),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.once=function(t54,e7,n6){var i7=new r6(e7,n6||this,!0),s7=o6?o6+t54:t54;return this._events[s7]?this._events[s7].fn?this._events[s7]=[this._events[s7],i7]:this._events[s7].push(i7):(this._events[s7]=i7,this._eventsCount++),this},s6.prototype.removeListener=function(t54,e7,n6,r10){var s7=o6?o6+t54:t54;if(!this._events[s7])return this;if(!e7)return--this._eventsCount===0?this._events=new i6:delete this._events[s7],this;var a6=this._events[s7];if(a6.fn)a6.fn!==e7||r10&&!a6.once||n6&&a6.context!==n6||(--this._eventsCount===0?this._events=new i6:delete this._events[s7]);else{for(var c3=0,l6=[],h3=a6.length;c3<h3;c3++)(a6[c3].fn!==e7||r10&&!a6[c3].once||n6&&a6[c3].context!==n6)&&l6.push(a6[c3]);l6.length?this._events[s7]=l6.length===1?l6[0]:l6:--this._eventsCount===0?this._events=new i6:delete this._events[s7]}return this},s6.prototype.removeAllListeners=function(t54){var e7;return t54?(e7=o6?o6+t54:t54,this._events[e7]&&(--this._eventsCount===0?this._events=new i6:delete this._events[e7])):(this._events=new i6,this._eventsCount=0),this},s6.prototype.off=s6.prototype.removeListener,s6.prototype.addListener=s6.prototype.on,s6.prototype.setMaxListeners=function(){return this},s6.prefixed=o6,s6.EventEmitter=s6,e6!==void 0&&(e6.exports=s6)}}),g3=s3({"node_modules/xml-lexer/dist/lexer.js"(t53,e6){function n3(t54,e7,n6){return e7 in t54?Object.defineProperty(t54,e7,{value:n6,enumerable:!0,configurable:!0,writable:!0}):t54[e7]=n6,t54}var o6=m(),i6=function(){},r6={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"},s6={lt:"action-lt",gt:"action-gt",space:"action-space",equal:"action-equal",quote:"action-quote",slash:"action-slash",char:"action-char",error:"action-error"},a6={text:"text",openTag:"open-tag",closeTag:"close-tag",attributeName:"attribute-name",attributeValue:"attribute-value"},c3={" ":s6.space," ":s6.space,"\n":s6.space,"\r":s6.space,"<":s6.lt,">":s6.gt,'"':s6.quote,"'":s6.quote,"=":s6.equal,"/":s6.slash};e6.exports={State:r6,Action:s6,Type:a6,create:function(t54){var e7,l6,h3,d3,u6,p3,m6,g4,f2,y2;t54=Object.assign({debug:!1},t54);var _3=new o6,b6=r6.data,x6="",v6="",S3="",I5="",P3="",C4="",M6=function(e8,n6){if(v6[0]!=="?"&&v6[0]!=="!"){var o7={type:e8,value:n6};t54.debug&&console.log("emit:",o7),_3.emit("data",o7)}};_3.stateMachine=(n3(y2={},r6.data,(n3(e7={},s6.lt,function(){x6.trim()&&M6(a6.text,x6),v6="",P3=!1,b6=r6.tagBegin}),n3(e7,s6.char,function(t55){x6+=t55}),e7)),n3(y2,r6.cdata,n3({},s6.char,function(t55){(x6+=t55).substr(-3)==="]]>"&&(M6(a6.text,x6.slice(0,-3)),x6="",b6=r6.data)})),n3(y2,r6.tagBegin,(n3(l6={},s6.space,i6),n3(l6,s6.char,function(t55){v6=t55,b6=r6.tagName}),n3(l6,s6.slash,function(){v6="",P3=!0}),l6)),n3(y2,r6.tagName,(n3(h3={},s6.space,function(){P3?b6=r6.tagEnd:(b6=r6.attributeNameStart,M6(a6.openTag,v6))}),n3(h3,s6.gt,function(){M6(P3?a6.closeTag:a6.openTag,v6),x6="",b6=r6.data}),n3(h3,s6.slash,function(){b6=r6.tagEnd,M6(a6.openTag,v6)}),n3(h3,s6.char,function(t55){(v6+=t55)==="![CDATA["&&(b6=r6.cdata,x6="",v6="")}),h3)),n3(y2,r6.tagEnd,(n3(d3={},s6.gt,function(){M6(a6.closeTag,v6),x6="",b6=r6.data}),n3(d3,s6.char,i6),d3)),n3(y2,r6.attributeNameStart,(n3(u6={},s6.char,function(t55){S3=t55,b6=r6.attributeName}),n3(u6,s6.gt,function(){x6="",b6=r6.data}),n3(u6,s6.space,i6),n3(u6,s6.slash,function(){P3=!0,b6=r6.tagEnd}),u6)),n3(y2,r6.attributeName,(n3(p3={},s6.space,function(){b6=r6.attributeNameEnd}),n3(p3,s6.equal,function(){M6(a6.attributeName,S3),b6=r6.attributeValueBegin}),n3(p3,s6.gt,function(){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),x6="",b6=r6.data}),n3(p3,s6.slash,function(){P3=!0,I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),b6=r6.tagEnd}),n3(p3,s6.char,function(t55){S3+=t55}),p3)),n3(y2,r6.attributeNameEnd,(n3(m6={},s6.space,i6),n3(m6,s6.equal,function(){M6(a6.attributeName,S3),b6=r6.attributeValueBegin}),n3(m6,s6.gt,function(){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),x6="",b6=r6.data}),n3(m6,s6.char,function(t55){I5="",M6(a6.attributeName,S3),M6(a6.attributeValue,I5),S3=t55,b6=r6.attributeName}),m6)),n3(y2,r6.attributeValueBegin,(n3(g4={},s6.space,i6),n3(g4,s6.quote,function(t55){C4=t55,I5="",b6=r6.attributeValue}),n3(g4,s6.gt,function(){M6(a6.attributeValue,I5=""),x6="",b6=r6.data}),n3(g4,s6.char,function(t55){C4="",I5=t55,b6=r6.attributeValue}),g4)),n3(y2,r6.attributeValue,(n3(f2={},s6.space,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),b6=r6.attributeNameStart)}),n3(f2,s6.quote,function(t55){C4===t55?(M6(a6.attributeValue,I5),b6=r6.attributeNameStart):I5+=t55}),n3(f2,s6.gt,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),x6="",b6=r6.data)}),n3(f2,s6.slash,function(t55){C4?I5+=t55:(M6(a6.attributeValue,I5),P3=!0,b6=r6.tagEnd)}),n3(f2,s6.char,function(t55){I5+=t55}),f2)),y2);var N5=function(e8){t54.debug&&console.log(b6,e8);var n6=_3.stateMachine[b6],o7=n6[(function(t55){return c3[t55]||s6.char})(e8)]||n6[s6.error]||n6[s6.char];o7(e8)};return _3.write=function(t55){for(var e8=t55.length,n6=0;n6<e8;n6++)N5(t55[n6])},_3}}}}),f=s3({"node_modules/xml-reader/dist/reader.js"(t53,e6){var n3=p(),o6=g3(),i6=o6.Type,r6={element:"element",text:"text"},s6=function(t54){return Object.assign({name:"",type:r6.element,value:"",parent:null,attributes:{},children:[]},t54)},a6=function(t54){t54=Object.assign({stream:!1,parentNodes:!0,doneEvent:"done",tagPrefix:"tag:",emitTopLevelOnly:!1,debug:!1},t54);var e7=void 0,a7=void 0,c3=void 0,l6=void 0,h3=new n3,d3=function(n6){switch(n6.type){case i6.openTag:if(c3===null)(c3=a7).name=n6.value;else{var o7=s6({name:n6.value,parent:c3});c3.children.push(o7),c3=o7}break;case i6.closeTag:var d4=c3.parent;if(t54.parentNodes||(c3.parent=null),c3.name!==n6.value)break;t54.stream&&d4===a7&&(a7.children=[],c3.parent=null),t54.emitTopLevelOnly&&d4!==a7||(h3.emit(t54.tagPrefix+c3.name,c3),h3.emit("tag",c3.name,c3)),c3===a7&&(e7.removeAllListeners("data"),h3.emit(t54.doneEvent,c3),a7=null),c3=d4;break;case i6.text:c3&&c3.children.push(s6({type:r6.text,value:n6.value,parent:t54.parentNodes?c3:null}));break;case i6.attributeName:l6=n6.value,c3.attributes[l6]="";break;case i6.attributeValue:c3.attributes[l6]=n6.value}};return h3.reset=function(){(e7=o6.create({debug:t54.debug})).on("data",d3),a7=s6(),c3=null,l6="",h3.parse=e7.write},h3.reset(),h3};e6.exports={parseSync:function(t54,e7){e7=Object.assign({},e7,{stream:!1,tagPrefix:":"});var n6=a6(e7),o7=void 0;return n6.on("done",function(t55){o7=t55}),n6.parse(t54),o7},create:a6,NodeType:r6}}}),y=s3({"node_modules/binary-search-bounds/search-bounds.js"(t53,e6){function n3(t54,e7,n6,o7,i7){for(var r10=i7+1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)>=0?(r10=s7,i7=s7-1):o7=s7+1}return r10}function o6(t54,e7,n6,o7,i7){for(var r10=i7+1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)>0?(r10=s7,i7=s7-1):o7=s7+1}return r10}function i6(t54,e7,n6,o7,i7){for(var r10=o7-1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)<0?(r10=s7,o7=s7+1):i7=s7-1}return r10}function r6(t54,e7,n6,o7,i7){for(var r10=o7-1;o7<=i7;){var s7=o7+i7>>>1,a7=t54[s7];(n6!==void 0?n6(a7,e7):a7-e7)<=0?(r10=s7,o7=s7+1):i7=s7-1}return r10}function s6(t54,e7,n6,o7,i7){for(;o7<=i7;){var r10=o7+i7>>>1,s7=t54[r10],a7=n6!==void 0?n6(s7,e7):s7-e7;if(a7===0)return r10;a7<=0?o7=r10+1:i7=r10-1}return-1}function a6(t54,e7,n6,o7,i7,r10){return typeof n6=="function"?r10(t54,e7,n6,o7===void 0?0:0|o7,i7===void 0?t54.length-1:0|i7):r10(t54,e7,void 0,n6===void 0?0:0|n6,o7===void 0?t54.length-1:0|o7)}e6.exports={ge:function(t54,e7,o7,i7,r10){return a6(t54,e7,o7,i7,r10,n3)},gt:function(t54,e7,n6,i7,r10){return a6(t54,e7,n6,i7,r10,o6)},lt:function(t54,e7,n6,o7,r10){return a6(t54,e7,n6,o7,r10,i6)},le:function(t54,e7,n6,o7,i7){return a6(t54,e7,n6,o7,i7,r6)},eq:function(t54,e7,n6,o7,i7){return a6(t54,e7,n6,o7,i7,s6)}}}}),_=s3({"node_modules/two-product/two-product.js"(t53,e6){e6.exports=function(t54,e7,o6){var i6=t54*e7,r6=n3*t54,s6=r6-(r6-t54),a6=t54-s6,c3=n3*e7,l6=c3-(c3-e7),h3=e7-l6,d3=a6*h3-(i6-s6*l6-a6*l6-s6*h3);return o6?(o6[0]=d3,o6[1]=i6,o6):[d3,i6]};var n3=+(Math.pow(2,27)+1)}}),b3=s3({"node_modules/robust-sum/robust-sum.js"(t53,e6){e6.exports=function(t54,e7){var n3=0|t54.length,o6=0|e7.length;if(n3===1&&o6===1)return(function(t55,e8){var n6=t55+e8,o7=n6-t55,i7=n6-o7,r10=e8-o7,s7=t55-i7,a7=s7+r10;return a7?[a7,n6]:[n6]})(t54[0],e7[0]);var i6,r6,s6=new Array(n3+o6),a6=0,c3=0,l6=0,h3=Math.abs,d3=t54[c3],u6=h3(d3),p3=e7[l6],m6=h3(p3);u6<m6?(r6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(r6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6]))),c3<n3&&u6<m6||l6>=o6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6])));for(var g4,f2,y2=i6+r6,_3=y2-i6,b6=r6-_3,x6=b6,v6=y2;c3<n3&&l6<o6;)u6<m6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=e7[l6]))),(b6=(r6=x6)-(_3=(y2=i6+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4;for(;c3<n3;)(b6=(r6=x6)-(_3=(y2=(i6=d3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(c3+=1)<n3&&(d3=t54[c3]);for(;l6<o6;)(b6=(r6=x6)-(_3=(y2=(i6=p3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(l6+=1)<o6&&(p3=e7[l6]);return x6&&(s6[a6++]=x6),v6&&(s6[a6++]=v6),a6||(s6[a6++]=0),s6.length=a6,s6}}}),x3=s3({"node_modules/two-sum/two-sum.js"(t53,e6){e6.exports=function(t54,e7,n3){var o6=t54+e7,i6=o6-t54,r6=e7-i6,s6=t54-(o6-i6);return n3?(n3[0]=s6+r6,n3[1]=o6,n3):[s6+r6,o6]}}}),v3=s3({"node_modules/robust-scale/robust-scale.js"(t53,e6){var n3=_(),o6=x3();e6.exports=function(t54,e7){var i6=t54.length;if(i6===1){var r6=n3(t54[0],e7);return r6[0]?r6:[r6[1]]}var s6=new Array(2*i6),a6=[.1,.1],c3=[.1,.1],l6=0;n3(t54[0],e7,a6),a6[0]&&(s6[l6++]=a6[0]);for(var h3=1;h3<i6;++h3){n3(t54[h3],e7,c3);var d3=a6[1];o6(d3,c3[0],a6),a6[0]&&(s6[l6++]=a6[0]);var u6=c3[1],p3=a6[1],m6=u6+p3,g4=p3-(m6-u6);a6[1]=m6,g4&&(s6[l6++]=g4)}return a6[1]&&(s6[l6++]=a6[1]),l6===0&&(s6[l6++]=0),s6.length=l6,s6}}}),S2=s3({"node_modules/robust-subtract/robust-diff.js"(t53,e6){e6.exports=function(t54,e7){var n3=0|t54.length,o6=0|e7.length;if(n3===1&&o6===1)return(function(t55,e8){var n6=t55+e8,o7=n6-t55,i7=n6-o7,r10=e8-o7,s7=t55-i7,a7=s7+r10;return a7?[a7,n6]:[n6]})(t54[0],-e7[0]);var i6,r6,s6=new Array(n3+o6),a6=0,c3=0,l6=0,h3=Math.abs,d3=t54[c3],u6=h3(d3),p3=-e7[l6],m6=h3(p3);u6<m6?(r6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(r6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6]))),c3<n3&&u6<m6||l6>=o6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6])));for(var g4,f2,y2=i6+r6,_3=y2-i6,b6=r6-_3,x6=b6,v6=y2;c3<n3&&l6<o6;)u6<m6?(i6=d3,(c3+=1)<n3&&(u6=h3(d3=t54[c3]))):(i6=p3,(l6+=1)<o6&&(m6=h3(p3=-e7[l6]))),(b6=(r6=x6)-(_3=(y2=i6+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4;for(;c3<n3;)(b6=(r6=x6)-(_3=(y2=(i6=d3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(c3+=1)<n3&&(d3=t54[c3]);for(;l6<o6;)(b6=(r6=x6)-(_3=(y2=(i6=p3)+r6)-i6))&&(s6[a6++]=b6),x6=v6-((g4=v6+y2)-(f2=g4-v6))+(y2-f2),v6=g4,(l6+=1)<o6&&(p3=-e7[l6]);return x6&&(s6[a6++]=x6),v6&&(s6[a6++]=v6),a6||(s6[a6++]=0),s6.length=a6,s6}}}),I3=s3({"node_modules/robust-orientation/orientation.js"(t53,e6){var n3=_(),o6=b3(),i6=v3(),r6=S2();function s6(t54,e7,n6,o7){return function(n7,i7,r10){var s7=t54(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),t54(e7(n7[1],i7[0]),e7(-i7[1],n7[0]))),a7=t54(e7(n7[1],r10[0]),e7(-r10[1],n7[0])),c4=o7(s7,a7);return c4[c4.length-1]}}function a6(t54,e7,n6,o7){return function(i7,r10,s7,a7){var c4=t54(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2])))),l7=t54(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2])))),h4=o7(c4,l7);return h4[h4.length-1]}}function c3(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4){var l7=t54(t54(t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),s7[2]),t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),-a7[2]),n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),c4[2]))),r10[3]),t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-a7[2]),n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),c4[2]))),-s7[3]),n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),c4[2]))),a7[3]))),t54(n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),-c4[3]),t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-a7[2]),n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-a7[2]),n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),c4[2]))),-r10[3])))),t54(t54(n6(t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),c4[2]))),a7[3]),t54(n6(t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2]))),-c4[3]),n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),a7[2]))),i7[3]))),t54(n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),-r10[3]),t54(n6(t54(n6(t54(e7(r10[1],a7[0]),e7(-a7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),a7[2]))),s7[3]),n6(t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2]))),-a7[3]))))),h4=t54(t54(t54(n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),s7[2]),t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),-a7[2]),n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(a7[1],c4[0]),e7(-c4[1],a7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-a7[2]),n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),c4[2]))),-s7[3])),t54(n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),c4[2]))),a7[3]),n6(t54(n6(t54(e7(s7[1],a7[0]),e7(-a7[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],a7[0]),e7(-a7[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),a7[2]))),-c4[3]))),t54(t54(n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),r10[2]),t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),-s7[2]),n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),c4[2]))),i7[3]),n6(t54(n6(t54(e7(s7[1],c4[0]),e7(-c4[1],s7[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-s7[2]),n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),c4[2]))),-r10[3])),t54(n6(t54(n6(t54(e7(r10[1],c4[0]),e7(-c4[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],c4[0]),e7(-c4[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),c4[2]))),s7[3]),n6(t54(n6(t54(e7(r10[1],s7[0]),e7(-s7[1],r10[0])),i7[2]),t54(n6(t54(e7(i7[1],s7[0]),e7(-s7[1],i7[0])),-r10[2]),n6(t54(e7(i7[1],r10[0]),e7(-r10[1],i7[0])),s7[2]))),-c4[3])))),d4=o7(l7,h4);return d4[d4.length-1]}}function l6(t54){return(t54===3?s6:t54===4?a6:c3)(o6,n3,i6,r6)}var h3=l6(3),d3=l6(4),u6=[function(){return 0},function(){return 0},function(t54,e7){return e7[0]-t54[0]},function(t54,e7,n6){var o7,i7=(t54[1]-n6[1])*(e7[0]-n6[0]),r10=(t54[0]-n6[0])*(e7[1]-n6[1]),s7=i7-r10;if(i7>0){if(r10<=0)return s7;o7=i7+r10}else{if(!(i7<0)||r10>=0)return s7;o7=-(i7+r10)}var a7=33306690738754716e-32*o7;return s7>=a7||s7<=-a7?s7:h3(t54,e7,n6)},function(t54,e7,n6,o7){var i7=t54[0]-o7[0],r10=e7[0]-o7[0],s7=n6[0]-o7[0],a7=t54[1]-o7[1],c4=e7[1]-o7[1],l7=n6[1]-o7[1],h4=t54[2]-o7[2],u7=e7[2]-o7[2],p6=n6[2]-o7[2],m7=r10*l7,g4=s7*c4,f2=s7*a7,y2=i7*l7,_3=i7*c4,b6=r10*a7,x6=h4*(m7-g4)+u7*(f2-y2)+p6*(_3-b6),v6=7771561172376103e-31*((Math.abs(m7)+Math.abs(g4))*Math.abs(h4)+(Math.abs(f2)+Math.abs(y2))*Math.abs(u7)+(Math.abs(_3)+Math.abs(b6))*Math.abs(p6));return x6>v6||-x6>v6?x6:d3(t54,e7,n6,o7)}];function p3(t54){var e7=u6[t54.length];return e7||(e7=u6[t54.length]=l6(t54.length)),e7.apply(void 0,t54)}function m6(t54,e7,n6,o7,i7,r10,s7){return function(e8,n7,a7,c4,l7){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e8,n7);case 3:return i7(e8,n7,a7);case 4:return r10(e8,n7,a7,c4);case 5:return s7(e8,n7,a7,c4,l7)}for(var h4=new Array(arguments.length),d4=0;d4<arguments.length;++d4)h4[d4]=arguments[d4];return t54(h4)}}(function(){for(;u6.length<=5;)u6.push(l6(u6.length));e6.exports=m6.apply(void 0,[p3].concat(u6));for(var t54=0;t54<=5;++t54)e6.exports[t54]=u6[t54]})()}}),P2=s3({"node_modules/cdt2d/lib/monotone.js"(t53,e6){var n3=y(),o6=I3()[3];function i6(t54,e7,n6,o7,i7){this.a=t54,this.b=e7,this.idx=n6,this.lowerIds=o7,this.upperIds=i7}function r6(t54,e7,n6,o7){this.a=t54,this.b=e7,this.type=n6,this.idx=o7}function s6(t54,e7){var n6=t54.a[0]-e7.a[0]||t54.a[1]-e7.a[1]||t54.type-e7.type;return n6||(t54.type!==0&&(n6=o6(t54.a,t54.b,e7.b))?n6:t54.idx-e7.idx)}function a6(t54,e7){return o6(t54.a,t54.b,e7)}function c3(t54,e7,i7,r10,s7){for(var c4=n3.lt(e7,r10,a6),l7=n3.gt(e7,r10,a6),h4=c4;h4<l7;++h4){for(var d4=e7[h4],u6=d4.lowerIds,p3=u6.length;p3>1&&o6(i7[u6[p3-2]],i7[u6[p3-1]],r10)>0;)t54.push([u6[p3-1],u6[p3-2],s7]),p3-=1;u6.length=p3,u6.push(s7);var m6=d4.upperIds;for(p3=m6.length;p3>1&&o6(i7[m6[p3-2]],i7[m6[p3-1]],r10)<0;)t54.push([m6[p3-2],m6[p3-1],s7]),p3-=1;m6.length=p3,m6.push(s7)}}function l6(t54,e7){var n6;return(n6=t54.a[0]<e7.a[0]?o6(t54.a,t54.b,e7.a):o6(e7.b,e7.a,t54.a))?n6:(n6=e7.b[0]<t54.b[0]?o6(t54.a,t54.b,e7.b):o6(e7.b,e7.a,t54.b))||t54.idx-e7.idx}function h3(t54,e7,o7){var r10=n3.le(t54,o7,l6),s7=t54[r10],a7=s7.upperIds,c4=a7[a7.length-1];s7.upperIds=[c4],t54.splice(r10+1,0,new i6(o7.a,o7.b,o7.idx,[c4],a7))}function d3(t54,e7,o7){var i7=o7.a;o7.a=o7.b,o7.b=i7;var r10=n3.eq(t54,o7,l6),s7=t54[r10];t54[r10-1].upperIds=s7.upperIds,t54.splice(r10,1)}e6.exports=function(t54,e7){for(var n6=t54.length,o7=e7.length,a7=[],l7=0;l7<n6;++l7)a7.push(new r6(t54[l7],null,0,l7));for(l7=0;l7<o7;++l7){var u6=e7[l7],p3=t54[u6[0]],m6=t54[u6[1]];p3[0]<m6[0]?a7.push(new r6(p3,m6,2,l7),new r6(m6,p3,1,l7)):p3[0]>m6[0]&&a7.push(new r6(m6,p3,2,l7),new r6(p3,m6,1,l7))}a7.sort(s6);for(var g4=a7[0].a[0]-(1+Math.abs(a7[0].a[0]))*Math.pow(2,-52),f2=[new i6([g4,1],[g4,0],-1,[],[],[],[])],y2=[],_3=(l7=0,a7.length);l7<_3;++l7){var b6=a7[l7],x6=b6.type;x6===0?c3(y2,f2,t54,b6.a,b6.idx):x6===2?h3(f2,t54,b6):d3(f2,t54,b6)}return y2}}}),C3=s3({"node_modules/cdt2d/lib/triangulation.js"(t53,e6){var n3=y();function o6(t54,e7){this.stars=t54,this.edges=e7}e6.exports=function(t54,e7){for(var n6=new Array(t54),i7=0;i7<t54;++i7)n6[i7]=[];return new o6(n6,e7)};var i6=o6.prototype;function r6(t54,e7,n6){for(var o7=1,i7=t54.length;o7<i7;o7+=2)if(t54[o7-1]===e7&&t54[o7]===n6)return t54[o7-1]=t54[i7-2],t54[o7]=t54[i7-1],void(t54.length=i7-2)}i6.isConstraint=(function(){var t54=[0,0];function e7(t55,e8){return t55[0]-e8[0]||t55[1]-e8[1]}return function(o7,i7){return t54[0]=Math.min(o7,i7),t54[1]=Math.max(o7,i7),n3.eq(this.edges,t54,e7)>=0}})(),i6.removeTriangle=function(t54,e7,n6){var o7=this.stars;r6(o7[t54],e7,n6),r6(o7[e7],n6,t54),r6(o7[n6],t54,e7)},i6.addTriangle=function(t54,e7,n6){var o7=this.stars;o7[t54].push(e7,n6),o7[e7].push(n6,t54),o7[n6].push(t54,e7)},i6.opposite=function(t54,e7){for(var n6=this.stars[e7],o7=1,i7=n6.length;o7<i7;o7+=2)if(n6[o7]===t54)return n6[o7-1];return-1},i6.flip=function(t54,e7){var n6=this.opposite(t54,e7),o7=this.opposite(e7,t54);this.removeTriangle(t54,e7,n6),this.removeTriangle(e7,t54,o7),this.addTriangle(t54,o7,n6),this.addTriangle(e7,n6,o7)},i6.edges=function(){for(var t54=this.stars,e7=[],n6=0,o7=t54.length;n6<o7;++n6)for(var i7=t54[n6],r10=0,s6=i7.length;r10<s6;r10+=2)e7.push([i7[r10],i7[r10+1]]);return e7},i6.cells=function(){for(var t54=this.stars,e7=[],n6=0,o7=t54.length;n6<o7;++n6)for(var i7=t54[n6],r10=0,s6=i7.length;r10<s6;r10+=2){var a6=i7[r10],c3=i7[r10+1];n6<Math.min(a6,c3)&&e7.push([n6,a6,c3])}return e7}}}),M3=s3({"node_modules/robust-in-sphere/in-sphere.js"(t53,e6){var n3=_(),o6=b3(),i6=S2(),r6=v3();function s6(t54){return(t54===3?a6:t54===4?c3:t54===5?l6:h3)(o6,i6,n3,r6)}function a6(t54,e7,n6,o7){return function(i7,r10,s7){var a7=n6(i7[0],i7[0]),c4=o7(a7,r10[0]),l7=o7(a7,s7[0]),h4=n6(r10[0],r10[0]),d4=o7(h4,i7[0]),u7=o7(h4,s7[0]),p6=n6(s7[0],s7[0]),m6=o7(p6,i7[0]),g4=o7(p6,r10[0]),f2=t54(e7(g4,u7),e7(d4,c4)),y2=e7(m6,l7),_3=e7(f2,y2);return _3[_3.length-1]}}function c3(t54,e7,n6,o7){return function(i7,r10,s7,a7){var c4=t54(n6(i7[0],i7[0]),n6(i7[1],i7[1])),l7=o7(c4,r10[0]),h4=o7(c4,s7[0]),d4=o7(c4,a7[0]),u7=t54(n6(r10[0],r10[0]),n6(r10[1],r10[1])),p6=o7(u7,i7[0]),m6=o7(u7,s7[0]),g4=o7(u7,a7[0]),f2=t54(n6(s7[0],s7[0]),n6(s7[1],s7[1])),y2=o7(f2,i7[0]),_3=o7(f2,r10[0]),b6=o7(f2,a7[0]),x6=t54(n6(a7[0],a7[0]),n6(a7[1],a7[1])),v6=o7(x6,i7[0]),S3=o7(x6,r10[0]),I5=o7(x6,s7[0]),P3=t54(t54(o7(e7(I5,b6),r10[1]),t54(o7(e7(S3,g4),-s7[1]),o7(e7(_3,m6),a7[1]))),t54(o7(e7(S3,g4),i7[1]),t54(o7(e7(v6,d4),-r10[1]),o7(e7(p6,l7),a7[1])))),C4=t54(t54(o7(e7(I5,b6),i7[1]),t54(o7(e7(v6,d4),-s7[1]),o7(e7(y2,h4),a7[1]))),t54(o7(e7(_3,m6),i7[1]),t54(o7(e7(y2,h4),-r10[1]),o7(e7(p6,l7),s7[1])))),M6=e7(P3,C4);return M6[M6.length-1]}}function l6(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4){var l7=t54(n6(i7[0],i7[0]),t54(n6(i7[1],i7[1]),n6(i7[2],i7[2]))),h4=o7(l7,r10[0]),d4=o7(l7,s7[0]),u7=o7(l7,a7[0]),p6=o7(l7,c4[0]),m6=t54(n6(r10[0],r10[0]),t54(n6(r10[1],r10[1]),n6(r10[2],r10[2]))),g4=o7(m6,i7[0]),f2=o7(m6,s7[0]),y2=o7(m6,a7[0]),_3=o7(m6,c4[0]),b6=t54(n6(s7[0],s7[0]),t54(n6(s7[1],s7[1]),n6(s7[2],s7[2]))),x6=o7(b6,i7[0]),v6=o7(b6,r10[0]),S3=o7(b6,a7[0]),I5=o7(b6,c4[0]),P3=t54(n6(a7[0],a7[0]),t54(n6(a7[1],a7[1]),n6(a7[2],a7[2]))),C4=o7(P3,i7[0]),M6=o7(P3,r10[0]),N5=o7(P3,s7[0]),w3=o7(P3,c4[0]),T6=t54(n6(c4[0],c4[0]),t54(n6(c4[1],c4[1]),n6(c4[2],c4[2]))),R3=o7(T6,i7[0]),E7=o7(T6,r10[0]),A4=o7(T6,s7[0]),O6=o7(T6,a7[0]),L5=t54(t54(t54(o7(t54(o7(e7(O6,w3),s7[1]),t54(o7(e7(A4,I5),-a7[1]),o7(e7(N5,S3),c4[1]))),r10[2]),t54(o7(t54(o7(e7(O6,w3),r10[1]),t54(o7(e7(E7,_3),-a7[1]),o7(e7(M6,y2),c4[1]))),-s7[2]),o7(t54(o7(e7(A4,I5),r10[1]),t54(o7(e7(E7,_3),-s7[1]),o7(e7(v6,f2),c4[1]))),a7[2]))),t54(o7(t54(o7(e7(N5,S3),r10[1]),t54(o7(e7(M6,y2),-s7[1]),o7(e7(v6,f2),a7[1]))),-c4[2]),t54(o7(t54(o7(e7(O6,w3),r10[1]),t54(o7(e7(E7,_3),-a7[1]),o7(e7(M6,y2),c4[1]))),i7[2]),o7(t54(o7(e7(O6,w3),i7[1]),t54(o7(e7(R3,p6),-a7[1]),o7(e7(C4,u7),c4[1]))),-r10[2])))),t54(t54(o7(t54(o7(e7(E7,_3),i7[1]),t54(o7(e7(R3,p6),-r10[1]),o7(e7(g4,h4),c4[1]))),a7[2]),t54(o7(t54(o7(e7(M6,y2),i7[1]),t54(o7(e7(C4,u7),-r10[1]),o7(e7(g4,h4),a7[1]))),-c4[2]),o7(t54(o7(e7(N5,S3),r10[1]),t54(o7(e7(M6,y2),-s7[1]),o7(e7(v6,f2),a7[1]))),i7[2]))),t54(o7(t54(o7(e7(N5,S3),i7[1]),t54(o7(e7(C4,u7),-s7[1]),o7(e7(x6,d4),a7[1]))),-r10[2]),t54(o7(t54(o7(e7(M6,y2),i7[1]),t54(o7(e7(C4,u7),-r10[1]),o7(e7(g4,h4),a7[1]))),s7[2]),o7(t54(o7(e7(v6,f2),i7[1]),t54(o7(e7(x6,d4),-r10[1]),o7(e7(g4,h4),s7[1]))),-a7[2]))))),D5=t54(t54(t54(o7(t54(o7(e7(O6,w3),s7[1]),t54(o7(e7(A4,I5),-a7[1]),o7(e7(N5,S3),c4[1]))),i7[2]),o7(t54(o7(e7(O6,w3),i7[1]),t54(o7(e7(R3,p6),-a7[1]),o7(e7(C4,u7),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(A4,I5),i7[1]),t54(o7(e7(R3,p6),-s7[1]),o7(e7(x6,d4),c4[1]))),a7[2]),o7(t54(o7(e7(N5,S3),i7[1]),t54(o7(e7(C4,u7),-s7[1]),o7(e7(x6,d4),a7[1]))),-c4[2]))),t54(t54(o7(t54(o7(e7(A4,I5),r10[1]),t54(o7(e7(E7,_3),-s7[1]),o7(e7(v6,f2),c4[1]))),i7[2]),o7(t54(o7(e7(A4,I5),i7[1]),t54(o7(e7(R3,p6),-s7[1]),o7(e7(x6,d4),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(E7,_3),i7[1]),t54(o7(e7(R3,p6),-r10[1]),o7(e7(g4,h4),c4[1]))),s7[2]),o7(t54(o7(e7(v6,f2),i7[1]),t54(o7(e7(x6,d4),-r10[1]),o7(e7(g4,h4),s7[1]))),-c4[2])))),k7=e7(L5,D5);return k7[k7.length-1]}}function h3(t54,e7,n6,o7){return function(i7,r10,s7,a7,c4,l7){var h4=t54(t54(n6(i7[0],i7[0]),n6(i7[1],i7[1])),t54(n6(i7[2],i7[2]),n6(i7[3],i7[3]))),d4=o7(h4,r10[0]),u7=o7(h4,s7[0]),p6=o7(h4,a7[0]),m6=o7(h4,c4[0]),g4=o7(h4,l7[0]),f2=t54(t54(n6(r10[0],r10[0]),n6(r10[1],r10[1])),t54(n6(r10[2],r10[2]),n6(r10[3],r10[3]))),y2=o7(f2,i7[0]),_3=o7(f2,s7[0]),b6=o7(f2,a7[0]),x6=o7(f2,c4[0]),v6=o7(f2,l7[0]),S3=t54(t54(n6(s7[0],s7[0]),n6(s7[1],s7[1])),t54(n6(s7[2],s7[2]),n6(s7[3],s7[3]))),I5=o7(S3,i7[0]),P3=o7(S3,r10[0]),C4=o7(S3,a7[0]),M6=o7(S3,c4[0]),N5=o7(S3,l7[0]),w3=t54(t54(n6(a7[0],a7[0]),n6(a7[1],a7[1])),t54(n6(a7[2],a7[2]),n6(a7[3],a7[3]))),T6=o7(w3,i7[0]),R3=o7(w3,r10[0]),E7=o7(w3,s7[0]),A4=o7(w3,c4[0]),O6=o7(w3,l7[0]),L5=t54(t54(n6(c4[0],c4[0]),n6(c4[1],c4[1])),t54(n6(c4[2],c4[2]),n6(c4[3],c4[3]))),D5=o7(L5,i7[0]),k7=o7(L5,r10[0]),z6=o7(L5,s7[0]),F6=o7(L5,a7[0]),B4=o7(L5,l7[0]),$3=t54(t54(n6(l7[0],l7[0]),n6(l7[1],l7[1])),t54(n6(l7[2],l7[2]),n6(l7[3],l7[3]))),j6=o7($3,i7[0]),Y6=o7($3,r10[0]),X6=o7($3,s7[0]),W5=o7($3,a7[0]),H3=o7($3,c4[0]),V6=t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),s7[2]),o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),-l7[2]))),r10[3]),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-l7[2]))),-s7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),-l7[2]))),a7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),r10[2]),o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-l7[2]))),-c4[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),r10[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-c4[2]))),l7[3])),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-l7[2]))),i7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-l7[2]))),-r10[3])))),t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),c4[2]),o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),-l7[2]))),a7[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-l7[2]))),-c4[3])),t54(o7(t54(t54(o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-c4[2]))),l7[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),r10[2]),o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-l7[2]))),i7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-l7[2]))),-r10[3]),o7(t54(t54(o7(t54(o7(e7(W5,O6),r10[1]),t54(o7(e7(Y6,v6),-a7[1]),o7(e7(R3,b6),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-l7[2]))),s7[3])),t54(o7(t54(t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),i7[2]),o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-l7[2]))),-a7[3]),o7(t54(t54(o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),i7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-r10[2])),t54(o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-a7[2]))),l7[3]))))),G3=t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),s7[2]),o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),-l7[2]))),i7[3]),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),a7[1]),t54(o7(e7(W5,O6),-c4[1]),o7(e7(F6,A4),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-a7[2])),t54(o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),c4[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-l7[2]))),-s7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-l7[2]))),a7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(W5,O6),s7[1]),t54(o7(e7(X6,N5),-a7[1]),o7(e7(E7,C4),l7[1]))),i7[2]),o7(t54(o7(e7(W5,O6),i7[1]),t54(o7(e7(j6,g4),-a7[1]),o7(e7(T6,p6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-l7[2]))),-c4[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-c4[2]))),l7[3])),t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),r10[2]),o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),-l7[2]))),i7[3]),o7(t54(t54(o7(t54(o7(e7(H3,B4),s7[1]),t54(o7(e7(X6,N5),-c4[1]),o7(e7(z6,M6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-s7[2])),t54(o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),c4[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-l7[2]))),-r10[3])))),t54(t54(t54(o7(t54(t54(o7(t54(o7(e7(H3,B4),r10[1]),t54(o7(e7(Y6,v6),-c4[1]),o7(e7(k7,x6),l7[1]))),i7[2]),o7(t54(o7(e7(H3,B4),i7[1]),t54(o7(e7(j6,g4),-c4[1]),o7(e7(D5,m6),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),c4[2]),o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),-l7[2]))),s7[3]),o7(t54(t54(o7(t54(o7(e7(X6,N5),r10[1]),t54(o7(e7(Y6,v6),-s7[1]),o7(e7(P3,_3),l7[1]))),i7[2]),o7(t54(o7(e7(X6,N5),i7[1]),t54(o7(e7(j6,g4),-s7[1]),o7(e7(I5,u7),l7[1]))),-r10[2])),t54(o7(t54(o7(e7(Y6,v6),i7[1]),t54(o7(e7(j6,g4),-r10[1]),o7(e7(y2,d4),l7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-l7[2]))),-c4[3])),t54(o7(t54(t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),i7[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-c4[2]))),l7[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),r10[2]),o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),-c4[2]))),i7[3]))),t54(t54(o7(t54(t54(o7(t54(o7(e7(F6,A4),s7[1]),t54(o7(e7(z6,M6),-a7[1]),o7(e7(E7,C4),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-s7[2])),t54(o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),a7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-c4[2]))),-r10[3]),o7(t54(t54(o7(t54(o7(e7(F6,A4),r10[1]),t54(o7(e7(k7,x6),-a7[1]),o7(e7(R3,b6),c4[1]))),i7[2]),o7(t54(o7(e7(F6,A4),i7[1]),t54(o7(e7(D5,m6),-a7[1]),o7(e7(T6,p6),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),a7[2]),o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),-c4[2]))),s7[3])),t54(o7(t54(t54(o7(t54(o7(e7(z6,M6),r10[1]),t54(o7(e7(k7,x6),-s7[1]),o7(e7(P3,_3),c4[1]))),i7[2]),o7(t54(o7(e7(z6,M6),i7[1]),t54(o7(e7(D5,m6),-s7[1]),o7(e7(I5,u7),c4[1]))),-r10[2])),t54(o7(t54(o7(e7(k7,x6),i7[1]),t54(o7(e7(D5,m6),-r10[1]),o7(e7(y2,d4),c4[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-c4[2]))),-a7[3]),o7(t54(t54(o7(t54(o7(e7(E7,C4),r10[1]),t54(o7(e7(R3,b6),-s7[1]),o7(e7(P3,_3),a7[1]))),i7[2]),o7(t54(o7(e7(E7,C4),i7[1]),t54(o7(e7(T6,p6),-s7[1]),o7(e7(I5,u7),a7[1]))),-r10[2])),t54(o7(t54(o7(e7(R3,b6),i7[1]),t54(o7(e7(T6,p6),-r10[1]),o7(e7(y2,d4),a7[1]))),s7[2]),o7(t54(o7(e7(P3,_3),i7[1]),t54(o7(e7(I5,u7),-r10[1]),o7(e7(y2,d4),s7[1]))),-a7[2]))),c4[3]))))),U3=e7(V6,G3);return U3[U3.length-1]}}var d3=[function(){return 0},function(){return 0},function(){return 0}];function u6(t54){var e7=d3[t54.length];return e7||(e7=d3[t54.length]=s6(t54.length)),e7.apply(void 0,t54)}function p3(t54,e7,n6,o7,i7,r10,s7,a7){return function(e8,n7,c4,l7,h4,d4){switch(arguments.length){case 0:case 1:return 0;case 2:return o7(e8,n7);case 3:return i7(e8,n7,c4);case 4:return r10(e8,n7,c4,l7);case 5:return s7(e8,n7,c4,l7,h4);case 6:return a7(e8,n7,c4,l7,h4,d4)}for(var u7=new Array(arguments.length),p6=0;p6<arguments.length;++p6)u7[p6]=arguments[p6];return t54(u7)}}(function(){for(;d3.length<=6;)d3.push(s6(d3.length));e6.exports=p3.apply(void 0,[u6].concat(d3));for(var t54=0;t54<=6;++t54)e6.exports[t54]=d3[t54]})()}}),N3=s3({"node_modules/cdt2d/lib/delaunay.js"(t53,e6){var n3=M3()[4];y();function o6(t54,e7,o7,i6,r6,s6){var a6=e7.opposite(i6,r6);if(!(a6<0)){if(r6<i6){var c3=i6;i6=r6,r6=c3,c3=s6,s6=a6,a6=c3}e7.isConstraint(i6,r6)||n3(t54[i6],t54[r6],t54[s6],t54[a6])<0&&o7.push(i6,r6)}}e6.exports=function(t54,e7){for(var i6=[],r6=t54.length,s6=e7.stars,a6=0;a6<r6;++a6)for(var c3=s6[a6],l6=1;l6<c3.length;l6+=2)if(!((p3=c3[l6])<a6)&&!e7.isConstraint(a6,p3)){for(var h3=c3[l6-1],d3=-1,u6=1;u6<c3.length;u6+=2)if(c3[u6-1]===p3){d3=c3[u6];break}d3<0||n3(t54[a6],t54[p3],t54[h3],t54[d3])<0&&i6.push(a6,p3)}for(;i6.length>0;){for(var p3=i6.pop(),m6=(h3=-1,d3=-1,c3=s6[a6=i6.pop()],1);m6<c3.length;m6+=2){var g4=c3[m6-1],f2=c3[m6];g4===p3?d3=f2:f2===p3&&(h3=g4)}h3<0||d3<0||n3(t54[a6],t54[p3],t54[h3],t54[d3])>=0||(e7.flip(a6,p3),o6(t54,e7,i6,h3,a6,d3),o6(t54,e7,i6,a6,d3,h3),o6(t54,e7,i6,d3,p3,h3),o6(t54,e7,i6,p3,h3,d3))}}}}),w2=s3({"node_modules/cdt2d/lib/filter.js"(t53,e6){var n3=y();function o6(t54,e7,n6,o7,i7,r6,s6){this.cells=t54,this.neighbor=e7,this.flags=o7,this.constraint=n6,this.active=i7,this.next=r6,this.boundary=s6}function i6(t54,e7){return t54[0]-e7[0]||t54[1]-e7[1]||t54[2]-e7[2]}e6.exports=function(t54,e7,n6){var r6=(function(t55,e8){for(var n7=t55.cells(),r10=n7.length,s7=0;s7<r10;++s7){var a7=(y6=n7[s7])[0],c4=y6[1],l7=y6[2];c4<l7?c4<a7&&(y6[0]=c4,y6[1]=l7,y6[2]=a7):l7<a7&&(y6[0]=l7,y6[1]=a7,y6[2]=c4)}n7.sort(i6);var h4=new Array(r10);for(s7=0;s7<h4.length;++s7)h4[s7]=0;var d4=[],u7=[],p6=new Array(3*r10),m7=new Array(3*r10),g6=null;e8&&(g6=[]);var f3=new o6(n7,p6,m7,h4,d4,u7,g6);for(s7=0;s7<r10;++s7)for(var y6=n7[s7],_3=0;_3<3;++_3){a7=y6[_3],c4=y6[(_3+1)%3];var b6=p6[3*s7+_3]=f3.locate(c4,a7,t55.opposite(c4,a7)),x6=m7[3*s7+_3]=t55.isConstraint(a7,c4);b6<0&&(x6?u7.push(s7):(d4.push(s7),h4[s7]=1),e8&&g6.push([c4,a7,-1]))}return f3})(t54,n6);if(e7===0)return n6?r6.cells.concat(r6.boundary):r6.cells;for(var s6=1,a6=r6.active,c3=r6.next,l6=r6.flags,h3=r6.cells,d3=r6.constraint,u6=r6.neighbor;a6.length>0||c3.length>0;){for(;a6.length>0;){var p3=a6.pop();if(l6[p3]!==-s6){l6[p3]=s6,h3[p3];for(var m6=0;m6<3;++m6){var g4=u6[3*p3+m6];g4>=0&&l6[g4]===0&&(d3[3*p3+m6]?c3.push(g4):(a6.push(g4),l6[g4]=s6))}}}var f2=c3;c3=a6,a6=f2,c3.length=0,s6=-s6}var y2=(function(t55,e8,n7){for(var o7=0,i7=0;i7<t55.length;++i7)e8[i7]===n7&&(t55[o7++]=t55[i7]);return t55.length=o7,t55})(h3,l6,e7);return n6?y2.concat(r6.boundary):y2},o6.prototype.locate=(function(){var t54=[0,0,0];return function(e7,o7,r6){var s6=e7,a6=o7,c3=r6;return o7<r6?o7<e7&&(s6=o7,a6=r6,c3=e7):r6<e7&&(s6=r6,a6=e7,c3=o7),s6<0?-1:(t54[0]=s6,t54[1]=a6,t54[2]=c3,n3.eq(this.cells,t54,i6))}})()}}),T3=s3({"node_modules/cdt2d/cdt2d.js"(t53,e6){var n3=P2(),o6=C3(),i6=N3(),r6=w2();function s6(t54){return[Math.min(t54[0],t54[1]),Math.max(t54[0],t54[1])]}function a6(t54,e7){return t54[0]-e7[0]||t54[1]-e7[1]}function c3(t54,e7,n6){return e7 in t54?t54[e7]:n6}e6.exports=function(t54,e7,l6){Array.isArray(e7)?(l6=l6||{},e7=e7||[]):(l6=e7||{},e7=[]);var h3=!!c3(l6,"delaunay",!0),d3=!!c3(l6,"interior",!0),u6=!!c3(l6,"exterior",!0),p3=!!c3(l6,"infinity",!1);if(!d3&&!u6||t54.length===0)return[];var m6=n3(t54,e7);if(h3||d3!==u6||p3){for(var g4=o6(t54.length,(function(t55){return t55.map(s6).sort(a6)})(e7)),f2=0;f2<m6.length;++f2){var y2=m6[f2];g4.addTriangle(y2[0],y2[1],y2[2])}return h3&&i6(t54,g4),u6?d3?p3?r6(g4,0,p3):g4.cells():r6(g4,1,p3):r6(g4,-1)}return m6}}});function R(t53,e6){return Array.isArray(e6)?[t53.a*e6[0]+t53.c*e6[1]+t53.e,t53.b*e6[0]+t53.d*e6[1]+t53.f]:{x:t53.a*e6.x+t53.c*e6.y+t53.e,y:t53.b*e6.x+t53.d*e6.y+t53.f}}function E6(t53,e6=0){return{a:1,c:0,e:t53,b:0,d:1,f:e6}}var{cos:A3,sin:O3,PI:L3}=Math,{tan:D3}=Math,k6=(c(u3()),c(f()),new TextEncoder,(()=>{let t53=new Uint8Array(4);new Uint32Array(t53.buffer)[0]=1,t53[0]})(),globalThis.Int8Array,globalThis.Uint8Array,globalThis.Int16Array,globalThis.Uint16Array,globalThis.Int32Array,globalThis.Uint32Array,globalThis.BigUint64Array,globalThis.BigInt64Array,globalThis.Float32Array,globalThis.Float64Array,[]);for(let t53=0;t53<256;t53++){let e6=t53;for(let t54=0;t54<8;t54++)1&e6?e6=3988292384^e6>>>1:e6>>>=1;k6[t53]=e6}var z3=new Uint16Array([255]),F3=(new Uint8Array(z3.buffer)[0],new Uint16Array([255]));new Uint8Array(F3.buffer)[0],new Uint8Array(0),Uint8Array.of(137,80,78,71,13,10,26,10),new TextDecoder("latin1");function B3(){return B3=Object.assign?Object.assign.bind():function(t53){for(var e6=1;e6<arguments.length;e6++){var n3=arguments[e6];for(var o6 in n3)({}).hasOwnProperty.call(n3,o6)&&(t53[o6]=n3[o6])}return t53},B3.apply(null,arguments)}function $2(t53,e6){return($2=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t54,e7){return t54.__proto__=e7,t54})(t53,e6)}function j3(t53){return(j3=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t54){return t54.__proto__||Object.getPrototypeOf(t54)})(t53)}function Y3(){try{var t53=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Y3=function(){return!!t53})()}function X3(t53){var e6=typeof Map=="function"?new Map:void 0;return X3=function(t54){if(t54===null||!(function(t55){try{return Function.toString.call(t55).indexOf("[native code]")!==-1}catch{return typeof t55=="function"}})(t54))return t54;if(typeof t54!="function")throw new TypeError("Super expression must either be null or a function");if(e6!==void 0){if(e6.has(t54))return e6.get(t54);e6.set(t54,n3)}function n3(){return(function(t55,e7,n6){if(Y3())return Reflect.construct.apply(null,arguments);var o6=[null];o6.push.apply(o6,e7);var i6=new(t55.bind.apply(t55,o6));return n6&&$2(i6,n6.prototype),i6})(t54,arguments,j3(this).constructor)}return n3.prototype=Object.create(t54.prototype,{constructor:{value:n3,enumerable:!1,writable:!0,configurable:!0}}),$2(n3,t54)},X3(t53)}var W3={1:`Passed invalid arguments to hsl, please pass multiple numbers e.g. hsl(360, 0.75, 0.4) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75 }).
|
|
324
324
|
|
|
325
325
|
`,2:`Passed invalid arguments to hsla, please pass multiple numbers e.g. hsla(360, 0.75, 0.4, 0.7) or an object e.g. rgb({ hue: 255, saturation: 0.4, lightness: 0.75, alpha: 0.7 }).
|
|
326
326
|
|
|
@@ -738,7 +738,7 @@ ${rootLabel}`:layerName).join(`
|
|
|
738
738
|
`)}};function visualizeSimpleRouteJson(srj){let layerNames=getCopperLayerNames(srj.layerCount),hasArbitraryCopperLayer=(srj.traces??[]).some(trace=>trace.route.some((routePoint,routePointIndex)=>{let nextRoutePoint=trace.route[routePointIndex+1];return routePoint.route_type==="wire"&&nextRoutePoint?.route_type==="wire"&&nextRoutePoint.layer===routePoint.layer&&!LEGACY_VISUALIZATION_LAYERS.has(routePoint.layer)})),connectionNames=new Set(srj.connections.map(({name})=>name)),traceOnlyConnections=hasArbitraryCopperLayer?[...new Set((srj.traces??[]).map(({connection_name})=>connection_name).filter(connectionName=>connectionName&&!connectionNames.has(connectionName)))].map(name=>({name,pointsToConnect:[]})):[],visualizedConnections=[...srj.connections,...traceOnlyConnections],colorMap2=getColorMap(visualizedConnections),formatObstacleLabel=createObstacleLabelFormatter({...srj,connections:visualizedConnections}),lines=[],circles=[],rects=[],points=[];for(let connection of visualizedConnections)for(let point6 of connection.pointsToConnect){let pointLayers=getPointLayers4(point6),rootNames=connection.__rootConnectionNames??[connection.name];points.push({x:point6.x,y:point6.y,color:colorMap2[connection.name],layer:getGraphicsLayer(layerNames,pointLayers),label:[connection.name,rootNames.join(", "),pointLayers.join(",")].join(`
|
|
739
739
|
`)})}for(let trace of srj.traces??[]){let jumpers=trace.route.filter(routePoint=>routePoint.route_type==="jumper"),isWireSegmentInsideJumper=(start,end)=>jumpers.some(jumper=>Math.abs(start.x-jumper.start.x)<.01&&Math.abs(start.y-jumper.start.y)<.01&&Math.abs(end.x-jumper.end.x)<.01&&Math.abs(end.y-jumper.end.y)<.01||Math.abs(start.x-jumper.end.x)<.01&&Math.abs(start.y-jumper.end.y)<.01&&Math.abs(end.x-jumper.start.x)<.01&&Math.abs(end.y-jumper.start.y)<.01);for(let routePoint of trace.route)if(routePoint.route_type==="via"){let viaLayers=getViaLayerNames(layerNames,routePoint.from_layer,routePoint.to_layer);circles.push({center:{x:routePoint.x,y:routePoint.y},radius:(routePoint.via_diameter??getViaPadDiameter(srj))/2,fill:hasArbitraryCopperLayer?colorMap2[trace.connection_name]:"blue",stroke:"none",layer:getGraphicsLayer(layerNames,viaLayers)})}else routePoint.route_type==="through_obstacle"&&lines.push({points:[routePoint.start,routePoint.end],strokeColor:transparentize(colorMap2[trace.connection_name]??"purple",.35),strokeWidth:routePoint.width,strokeDash:[.1,.1],layer:getGraphicsLayer(layerNames,[routePoint.from_layer,routePoint.to_layer]),label:`${trace.connection_name} through_obstacle`});for(let routePointIndex=0;routePointIndex<trace.route.length-1;routePointIndex++){let routePoint=trace.route[routePointIndex],nextRoutePoint=trace.route[routePointIndex+1];if(routePoint.route_type==="jumper"){let color=colorMap2[trace.connection_name]??"rgba(255, 165, 0, 0.8)",dimensions=JUMPER_DIMENSIONS[routePoint.footprint==="1206x4_pair"?"1206x4_pair":"0603"],horizontal=Math.abs(routePoint.end.x-routePoint.start.x)>Math.abs(routePoint.end.y-routePoint.start.y),padWidth=horizontal?dimensions.padLength:dimensions.padWidth,padHeight=horizontal?dimensions.padWidth:dimensions.padLength,layer=getGraphicsLayer(layerNames,[routePoint.layer]);for(let center2 of[routePoint.start,routePoint.end])rects.push({center:center2,width:padWidth,height:padHeight,fill:transparentize(color,.5),stroke:"rgba(0, 0, 0, 0.5)",layer});lines.push({points:[routePoint.start,routePoint.end],strokeColor:"rgba(100, 100, 100, 0.8)",strokeWidth:dimensions.padWidth*.3,layer})}else if(routePoint.route_type==="wire"&&nextRoutePoint.route_type==="wire"&&nextRoutePoint.layer===routePoint.layer&&!isWireSegmentInsideJumper(routePoint,nextRoutePoint)){let layerIndex=getLayerIndex2(layerNames,routePoint.layer);lines.push({points:[{x:routePoint.x,y:routePoint.y},{x:nextRoutePoint.x,y:nextRoutePoint.y}],layer:`z${layerIndex}`,strokeWidth:routePoint.width,strokeColor:getCopperLayerColor(layerIndex),...hasArbitraryCopperLayer?{label:trace.connection_name}:{}})}}}for(let obstacle of srj.obstacles){if(obstacle.isCopperPour)continue;let layerIndexes=getObstacleLayerIndexes(obstacle,layerNames);if(layerIndexes.length===0)throw new Error(`FanoutSolver: cannot visualize obstacle "${obstacle.obstacleId??"unknown"}" without a valid layer`);let onlyLayerName=layerIndexes.length===1?layerNames[layerIndexes[0]]:void 0,fill=transparentize(onlyLayerName==="bottom"?"blue":"red",.5**layerIndexes.length),shape=obstacle.shape,common={center:obstacle.center,fill,layer:`z${layerIndexes.join(",")}`,label:formatObstacleLabel(obstacle)};shape==="circle"?circles.push({...common,radius:Math.min(obstacle.width,obstacle.height)/2}):rects.push({...common,width:obstacle.width,height:obstacle.height,ccwRotationDegrees:obstacle.ccwRotationDegrees})}for(let jumper of srj.jumpers??[])for(let pad2 of jumper.pads)rects.push({center:pad2.center,width:pad2.width,height:pad2.height,ccwRotationDegrees:pad2.ccwRotationDegrees,fill:"rgba(255, 165, 0, 0.3)",stroke:"rgba(255, 165, 0, 0.8)",layer:getGraphicsLayer(layerNames,pad2.layers)});return{rects,circles,lines,points}}function resolvePositiveNumber(label,value){if(!Number.isFinite(value)||value<=0)throw new Error(`FanoutSolver: ${label} must be a positive number, received ${value}`);return value}function resolveConfig(srj,options){let traceWidth=resolvePositiveNumber("traceWidth",options.traceWidth??srj.nominalTraceWidth??srj.minTraceWidth),viaDiameter=resolvePositiveNumber("viaDiameter",options.viaDiameter??srj.minViaPadDiameter??srj.min_via_pad_diameter??srj.minViaDiameter??Math.max(traceWidth*2,.3)),viaHoleDiameter=resolvePositiveNumber("viaHoleDiameter",options.viaHoleDiameter??srj.minViaHoleDiameter??srj.min_via_hole_diameter??viaDiameter*.5);if(viaHoleDiameter>=viaDiameter)throw new Error(`FanoutSolver: viaHoleDiameter ${viaHoleDiameter} must be smaller than viaDiameter ${viaDiameter}`);let clearance=resolvePositiveNumber("clearance",options.clearance??srj.minViaEdgeToPadEdgeClearance??srj.minTraceToPadEdgeClearance??srj.defaultObstacleMargin??srj.minTraceWidth),layerNames=getCopperLayerNames(srj.layerCount),escapeLayers=options.escapeLayers??layerNames;for(let layer of escapeLayers)if(!layerNames.includes(layer))throw new Error(`FanoutSolver: escape layer "${layer}" is not available in a ${srj.layerCount}-layer SimpleRouteJson`);if(new Set(escapeLayers).size!==escapeLayers.length)throw new Error("FanoutSolver: escapeLayers contains duplicates");let borderDistribution=options.borderDistribution??"preserve";if(borderDistribution!=="preserve"&&borderDistribution!=="even")throw new Error(`FanoutSolver: borderDistribution must be "preserve" or "even", received "${borderDistribution}"`);return{traceWidth,viaDiameter,viaHoleDiameter,clearance,compactBusTracks:options.compactBusTracks??!1,allowSameNetMerges:options.allowSameNetMerges??!1,singleLayerPushAndShove:options.singleLayerPushAndShove??!1,singleLayerAdaptiveExits:options.singleLayerAdaptiveExits??!1,borderDistribution,layerNames,escapeLayers,maxLayerCombinations:options.maxLayerCombinations===void 0?256:resolvePositiveNumber("maxLayerCombinations",options.maxLayerCombinations),balanceLayerLoadByConnectionCount:options.balanceLayerLoadByConnectionCount??!1}}function assignmentLoadPenalty(assignment,buses,weightByConnectionCount){let connectionCountByBusId=new Map(buses.map(bus=>[bus.busId,bus.connections.length])),loadByLayer=new Map;for(let[busId,layer]of Object.entries(assignment))loadByLayer.set(layer,(loadByLayer.get(layer)??0)+(weightByConnectionCount?connectionCountByBusId.get(busId)??1:1));return[...loadByLayer.values()].reduce((penalty,load)=>penalty+load*load,0)}function getLayerLoadPenaltyWeight(config){return config.balanceLayerLoadByConnectionCount?.25:.01}function getPlanViaCount(plans){return plans.reduce((count,plan)=>count+ +!!plan.via+ +!!plan.planeEndpointVia,0)}function getBusDistanceToBoundary(bus){let averageSource=bus.connections.reduce((sum,connection)=>{let sourceAxis=bus.direction==="left"||bus.direction==="right"?connection.sourcePoint.x:connection.sourcePoint.y;return sum+sourceAxis},0)/bus.connections.length;switch(bus.direction){case"right":return bus.sharedBoundary.maxX-averageSource;case"left":return averageSource-bus.sharedBoundary.minX;case"up":return bus.sharedBoundary.maxY-averageSource;case"down":return averageSource-bus.sharedBoundary.minY}}function busUsesDestinationGuidedTracks(bus){let isHorizontal32=bus.direction==="left"||bus.direction==="right";return bus.connections.some(connection=>{let exitTargetPoint=connection.exitTargetPoint??connection.targetPoint,sourceTrack=isHorizontal32?connection.sourcePoint.y:connection.sourcePoint.x,targetTrack=isHorizontal32?exitTargetPoint.y:exitTargetPoint.x;return Math.abs(sourceTrack-targetTrack)>1e-6})}function busIsOnOutwardComponentEdge2(bus){let isHorizontal32=bus.direction==="left"||bus.direction==="right",directionalCoordinates=isHorizontal32?bus.xCoordinates:bus.yCoordinates,averageSource=bus.connections.reduce((sum,connection)=>sum+(isHorizontal32?connection.sourcePoint.x:connection.sourcePoint.y),0)/bus.connections.length,outwardCoordinate=bus.direction==="right"||bus.direction==="up"?Math.max(...directionalCoordinates):Math.min(...directionalCoordinates);return Math.abs(averageSource-outwardCoordinate)<1e-6}function getBusDepthInRows(bus){let isHorizontal32=bus.direction==="left"||bus.direction==="right",directionalCoordinates=isHorizontal32?bus.xCoordinates:bus.yCoordinates,averageSource=bus.connections.reduce((sum,connection)=>sum+(isHorizontal32?connection.sourcePoint.x:connection.sourcePoint.y),0)/bus.connections.length,outwardCoordinate=bus.direction==="right"||bus.direction==="up"?Math.max(...directionalCoordinates):Math.min(...directionalCoordinates),directionalPitch=isHorizontal32?bus.pitchX:bus.pitchY;return Math.round(Math.abs(averageSource-outwardCoordinate)/directionalPitch)}function createInitialLayerAssignment(params){let{buses,escapeLayers,escapeLayersByBusId}=params,assignment={},directionsByComponent=new Map,nextViaLayerIndex=0;for(let bus of buses){let directions=directionsByComponent.get(bus.componentId)??new Set;directions.add(bus.direction),directionsByComponent.set(bus.componentId,directions)}for(let bus of buses){let sourceLayer=bus.connections[0]?.sourceLayer;if(!sourceLayer)throw new Error(`FanoutSolver: bus "${bus.busId}" has no connections`);if(bus.termination.type==="plane"){assignment[bus.busId]=bus.termination.layer;continue}let routableEscapeLayers=escapeLayersByBusId[bus.busId]??escapeLayers,viaLayers=routableEscapeLayers.filter(layer=>layer!==sourceLayer);if(routableEscapeLayers.includes(sourceLayer)&&(busUsesDestinationGuidedTracks(bus)||busIsOnOutwardComponentEdge2(bus)))assignment[bus.busId]=sourceLayer;else if(viaLayers.length>0){let componentDirections=directionsByComponent.get(bus.componentId);if(componentDirections.has("left")&&componentDirections.has("right")||componentDirections.has("up")&&componentDirections.has("down")){let depthInRows=getBusDepthInRows(bus);assignment[bus.busId]=viaLayers[Math.max(depthInRows-1,0)%viaLayers.length]}else assignment[bus.busId]=viaLayers[nextViaLayerIndex%viaLayers.length],nextViaLayerIndex++}else assignment[bus.busId]=sourceLayer}return assignment}function prioritizeLayerAssignment(params){let{initialAssignment,generatedAssignments,maxAssignments}=params,initialKey=JSON.stringify(initialAssignment);return[initialAssignment,...generatedAssignments.filter(assignment=>JSON.stringify(assignment)!==initialKey)].slice(0,maxAssignments)}function getCandidateEscapeLayersForBus(params){let{bus,srj,config,staticClearanceCache}=params,busAllowedLayers=bus.allowedLayers,allowedEscapeLayers=busAllowedLayers===void 0?config.escapeLayers:config.escapeLayers.filter(layer=>busAllowedLayers.includes(layer)),individuallyRoutableLayers=allowedEscapeLayers.filter(targetLayer=>routeBus({srj,bus,targetLayer,acceptedPlans:[],layerNames:config.layerNames,traceWidth:config.traceWidth,viaDiameter:config.viaDiameter,viaHoleDiameter:config.viaHoleDiameter,clearance:config.clearance,compactBusTracks:config.compactBusTracks,allowSameNetMerges:config.allowSameNetMerges,staticClearanceCache})!==null);return individuallyRoutableLayers.length>0?individuallyRoutableLayers:allowedEscapeLayers}var FanoutSolver=class extends BaseSolver{constructor(inputSrj,options={}){super();__publicField(this,"inputSrj");__publicField(this,"options");__publicField(this,"preparedBuses");__publicField(this,"attempts",[]);__publicField(this,"layerAssignments");__publicField(this,"config");__publicField(this,"routingSrj");__publicField(this,"escapeLayersByBusId");__publicField(this,"evaluatedAssignmentKeys",new Set);__publicField(this,"queuedAssignmentKeys",new Set);__publicField(this,"assignmentRepairDepthByKey",new Map);__publicField(this,"pendingRepairAssignments",[]);__publicField(this,"routeStaticClearanceCache",new Map);__publicField(this,"routingPrefixCache",new Map);__publicField(this,"groupedBeamEvaluated",!1);__publicField(this,"nextAssignmentIndex",0);__publicField(this,"nextGeneratedAssignmentIndex",0);__publicField(this,"bestAttempt",null);__publicField(this,"endpointCompletion",null);this.inputSrj=inputSrj,this.options=options,this.routingSrj={...inputSrj,obstacles:[...inputSrj.obstacles]},this.config=resolveConfig(inputSrj,options),this.preparedBuses=prepareFanoutBuses(this.routingSrj,options);for(let bus of this.preparedBuses){for(let allowedLayer of bus.allowedLayers??[])if(!this.config.layerNames.includes(allowedLayer))throw new Error(`FanoutSolver: bus "${bus.busId}" allows unavailable layer "${allowedLayer}"`);if(bus.termination.type==="boundary"&&bus.allowedLayers!==void 0&&!bus.allowedLayers.some(layer=>this.config.escapeLayers.includes(layer)))throw new Error(`FanoutSolver: bus "${bus.busId}" has no allowed layer in escapeLayers`);if(bus.termination.type!=="plane")continue;let planeLayer=bus.termination.layer;if(!this.config.layerNames.includes(planeLayer))throw new Error(`FanoutSolver: plane-terminated bus "${bus.busId}" targets unavailable layer "${planeLayer}"`);if(bus.allowedLayers!==void 0&&!bus.allowedLayers.includes(planeLayer))throw new Error(`FanoutSolver: plane-terminated bus "${bus.busId}" targets disallowed layer "${planeLayer}"`);if(bus.connections.some(connection=>connection.sourceLayer===planeLayer))throw new Error(`FanoutSolver: plane-terminated bus "${bus.busId}" must target a layer below its source pad`)}let boundaryBusIds=this.preparedBuses.filter(bus=>bus.termination.type==="boundary").map(bus=>bus.busId),fixedPlaneAssignments=Object.fromEntries(this.preparedBuses.flatMap(bus=>bus.termination.type==="plane"?[[bus.busId,bus.termination.layer]]:[])),escapeLayersByBusId=Object.fromEntries(this.preparedBuses.flatMap(bus=>bus.termination.type==="plane"?[]:[[bus.busId,getCandidateEscapeLayersForBus({bus,srj:this.routingSrj,config:this.config,staticClearanceCache:this.routeStaticClearanceCache})]]));this.escapeLayersByBusId=escapeLayersByBusId;let generatedAssignments=generateLayerAssignments({busIds:boundaryBusIds,layers:this.config.escapeLayers,layersByBusId:escapeLayersByBusId,maxAssignments:this.config.maxLayerCombinations}).map(assignment=>({...assignment,...fixedPlaneAssignments}));this.layerAssignments=prioritizeLayerAssignment({initialAssignment:createInitialLayerAssignment({buses:this.preparedBuses,escapeLayers:this.config.escapeLayers,escapeLayersByBusId}),generatedAssignments,maxAssignments:this.config.maxLayerCombinations}),this.MAX_ITERATIONS=this.config.maxLayerCombinations+2}getSolverName(){return"FanoutSolver"}completeBestAttemptEndpoints(){!this.options.completeOriginalEndpoints||this.endpointCompletion||!this.bestAttempt||(this.endpointCompletion=completeOriginalEndpoints({inputSrj:this.routingSrj,fanoutSrj:this.bestAttempt.outputSrj,plans:this.bestAttempt.plans,traceWidth:this.config.traceWidth,viaDiameter:this.config.viaDiameter,viaHoleDiameter:this.config.viaHoleDiameter,clearance:this.config.clearance,effort:this.options.endpointCompletionEffort,routeDownstreamConnections:this.options.routeDownstreamConnections}))}getValidationBoundary(){if(this.options.sharedBoundary)return this.options.sharedBoundary;let firstBoundary=this.preparedBuses[0]?.sharedBoundary;return firstBoundary?this.preparedBuses.slice(1).reduce((boundary,bus)=>({minX:Math.min(boundary.minX,bus.sharedBoundary.minX),maxX:Math.max(boundary.maxX,bus.sharedBoundary.maxX),minY:Math.min(boundary.minY,bus.sharedBoundary.minY),maxY:Math.max(boundary.maxY,bus.sharedBoundary.maxY)}),{...firstBoundary}):this.inputSrj.bounds}validateCompletePlans(plans,outputSrj){return validateFanoutSolution({inputSrj:this.inputSrj,outputSrj,plans,preparedBuses:this.preparedBuses,sharedBoundary:this.getValidationBoundary(),clearance:this.config.clearance})}evaluateAssignmentWithStrategy(assignmentIndex,busLayerAssignments,routingStrategy){let plans=[],failedBusIds=[],blockingBusCounts=new Map,isSingleLayerFanout=this.config.escapeLayers.length===1;if(isSingleLayerFanout&&this.config.singleLayerPushAndShove){let singleLayerParams={srj:this.routingSrj,buses:this.preparedBuses,traceWidth:this.config.traceWidth,clearance:this.config.clearance,borderDistribution:this.config.borderDistribution},singleLayerPlans=routeSingleLayerWithPushAndShove(singleLayerParams)??(this.config.singleLayerAdaptiveExits?routeSingleLayerWithAdaptiveExits({...singleLayerParams,availableBoundaryRegions:resolveAvailableBoundaryRegions(this.options.availableCornersAndSides)}):null);singleLayerPlans?plans.push(...singleLayerPlans):failedBusIds.push(...this.preparedBuses.map(bus=>bus.busId))}let busesInRoutingOrder=[...this.preparedBuses].sort((a6,b6)=>+(b6.termination.type==="plane")-+(a6.termination.type==="plane")||(routingStrategy==="group-by-layer"?(busLayerAssignments[a6.busId]??"").localeCompare(busLayerAssignments[b6.busId]??""):0)||b6.componentObstacles.length-a6.componentObstacles.length||(isSingleLayerFanout?getBusDistanceToBoundary(b6)-getBusDistanceToBoundary(a6):b6.connections.length-a6.connections.length||(routingStrategy==="deep-first"?getBusDistanceToBoundary(b6)-getBusDistanceToBoundary(a6):getBusDistanceToBoundary(a6)-getBusDistanceToBoundary(b6)))),routingPrefixKey=`${routingStrategy}|`;for(let bus of isSingleLayerFanout&&this.config.singleLayerPushAndShove?[]:busesInRoutingOrder){let targetLayer=busLayerAssignments[bus.busId];if(!targetLayer)throw new Error(`FanoutSolver: assignment ${assignmentIndex} has no layer for bus "${bus.busId}"`);routingPrefixKey+=`${bus.busId.length}:${bus.busId};${targetLayer.length}:${targetLayer};`;let cachedPrefix=this.routingPrefixCache.get(routingPrefixKey);if(cachedPrefix){plans=[...cachedPrefix.plans],failedBusIds=[...cachedPrefix.failedBusIds],blockingBusCounts=new Map(cachedPrefix.blockingBusCounts);continue}let currentBusBlockingCounts=new Map,busPlans=routeBus({srj:this.routingSrj,bus,targetLayer,acceptedPlans:plans,layerNames:this.config.layerNames,traceWidth:this.config.traceWidth,viaDiameter:this.config.viaDiameter,viaHoleDiameter:this.config.viaHoleDiameter,clearance:this.config.clearance,compactBusTracks:this.config.compactBusTracks,allowSameNetMerges:this.config.allowSameNetMerges,staticClearanceCache:this.routeStaticClearanceCache,blockingBusCounts:currentBusBlockingCounts});if(busPlans)plans.push(...busPlans);else{failedBusIds.push(bus.busId);for(let[blockingBusId,count]of currentBusBlockingCounts)blockingBusCounts.set(blockingBusId,(blockingBusCounts.get(blockingBusId)??0)+count)}this.routingPrefixCache.set(routingPrefixKey,{plans:[...plans],failedBusIds:[...failedBusIds],blockingBusCounts:new Map(blockingBusCounts)})}let validationIssues,outputSrj=buildOutputSimpleRouteJson({inputSrj:this.inputSrj,plans,layerNames:this.config.layerNames}),validation=plans.length===this.inputSrj.connections.length?this.validateCompletePlans(plans,outputSrj):null;validation&&!validation.valid&&(validationIssues=validation.issues,plans=[],failedBusIds=this.preparedBuses.map(bus=>bus.busId),blockingBusCounts.clear(),outputSrj=buildOutputSimpleRouteJson({inputSrj:this.inputSrj,plans,layerNames:this.config.layerNames}));let routedBusCount=this.preparedBuses.length-failedBusIds.length,routeLength=plans.reduce((total,plan)=>total+plan.length,0),score=(this.inputSrj.connections.length-plans.length)*1e6+failedBusIds.length*1e5+routeLength+getPlanViaCount(plans)*.1+assignmentLoadPenalty(busLayerAssignments,this.preparedBuses,this.config.balanceLayerLoadByConnectionCount)*getLayerLoadPenaltyWeight(this.config);return{summary:{assignmentIndex,busLayerAssignments,routedBusCount,routedConnectionCount:plans.length,failedBusIds,score,...validationIssues?{validationIssues}:{}},plans,blockingBusIds:[...blockingBusCounts.entries()].toSorted(([,firstCount],[,secondCount])=>secondCount-firstCount).map(([busId])=>busId),outputSrj}}evaluateAssignment(assignmentIndex,busLayerAssignments){let bestAttempt=this.evaluateAssignmentWithStrategy(assignmentIndex,busLayerAssignments,"default");if(bestAttempt.summary.routedConnectionCount===this.inputSrj.connections.length)return bestAttempt;for(let routingStrategy of["group-by-layer","deep-first"]){let attempt=this.evaluateAssignmentWithStrategy(assignmentIndex,busLayerAssignments,routingStrategy);if(attempt.summary.score<bestAttempt.summary.score&&(bestAttempt=attempt),bestAttempt.summary.routedConnectionCount===this.inputSrj.connections.length)return bestAttempt}return bestAttempt}evaluateGroupedBeam(assignmentIndex,groupByDirection=!1){if(this.config.escapeLayers.length<2||this.preparedBuses.length>56)return null;let totalConnections=this.inputSrj.connections.length;if(totalConnections>64||new Set(this.preparedBuses.map(bus=>bus.componentId)).size!==1)return null;let busesInSearchOrder=[...this.preparedBuses].sort((a6,b6)=>{let aLayerCount=a6.termination.type==="plane"?1:this.escapeLayersByBusId[a6.busId]?.length??this.config.escapeLayers.length,bLayerCount=b6.termination.type==="plane"?1:this.escapeLayersByBusId[b6.busId]?.length??this.config.escapeLayers.length;return+(b6.termination.type==="plane")-+(a6.termination.type==="plane")||(groupByDirection?a6.direction.localeCompare(b6.direction):0)||aLayerCount-bLayerCount||b6.componentObstacles.length-a6.componentObstacles.length||b6.connections.length-a6.connections.length||getBusDepthInRows(b6)-getBusDepthInRows(a6)||a6.busId.localeCompare(b6.busId)}),isSmallProblem=totalConnections<=24,hasMultiConnectionBus=this.preparedBuses.some(bus=>bus.connections.length>1),beamWidth=isSmallProblem?48:totalConnections<=32?24:12,alternativesPerLayer=isSmallProblem&&!hasMultiConnectionBus?4:1,states=[{assignment:{},plans:[]}],getStateScore=state2=>{let routeLength=state2.plans.reduce((total,plan)=>total+plan.length,0),viaCount=getPlanViaCount(state2.plans),offEndpointLayerConnectionCount=this.preparedBuses.reduce((count,bus)=>{if(bus.termination.type!=="boundary"||!busUsesDestinationGuidedTracks(bus))return count;let sourceLayer=bus.connections[0]?.sourceLayer;return state2.assignment[bus.busId]===sourceLayer?count:count+bus.connections.length},0);return routeLength+viaCount*.1+offEndpointLayerConnectionCount*1e4+assignmentLoadPenalty(state2.assignment,this.preparedBuses,this.config.balanceLayerLoadByConnectionCount)*getLayerLoadPenaltyWeight(this.config)};for(let bus of busesInSearchOrder){let nextStates=[];for(let state2 of states){let candidateLayers=bus.termination.type==="plane"?[bus.termination.layer]:this.escapeLayersByBusId[bus.busId]??this.config.escapeLayers,layerLoads=new Map;for(let[assignedBusId,layer]of Object.entries(state2.assignment)){let assignedBus=this.preparedBuses.find(candidate=>candidate.busId===assignedBusId);layerLoads.set(layer,(layerLoads.get(layer)??0)+(this.config.balanceLayerLoadByConnectionCount?assignedBus?.connections.length??1:1))}let sourceLayer=bus.connections[0]?.sourceLayer,preferSourceLayer=busUsesDestinationGuidedTracks(bus),orderedLayers=candidateLayers.toSorted((first,second)=>(layerLoads.get(first)??0)-(layerLoads.get(second)??0)||(preferSourceLayer?+(second===sourceLayer)-+(first===sourceLayer):+(first===sourceLayer)-+(second===sourceLayer))||first.localeCompare(second));for(let targetLayer of orderedLayers){let busAlternatives=routeBusAlternatives({srj:this.routingSrj,bus,targetLayer,acceptedPlans:state2.plans,layerNames:this.config.layerNames,traceWidth:this.config.traceWidth,viaDiameter:this.config.viaDiameter,viaHoleDiameter:this.config.viaHoleDiameter,clearance:this.config.clearance,compactBusTracks:this.config.compactBusTracks,allowSameNetMerges:this.config.allowSameNetMerges,staticClearanceCache:this.routeStaticClearanceCache},alternativesPerLayer);for(let busPlans of busAlternatives)nextStates.push({assignment:{...state2.assignment,[bus.busId]:targetLayer},plans:[...state2.plans,...busPlans]})}}if(nextStates.length===0)return null;nextStates.sort((first,second)=>{let scoreDifference=getStateScore(first)-getStateScore(second);return Math.abs(scoreDifference)>1e-9?scoreDifference:JSON.stringify(first.assignment).localeCompare(JSON.stringify(second.assignment))});let statesByAssignment=new Map;states=[];for(let state2 of nextStates){let key=JSON.stringify(state2.assignment),sameAssignmentCount=statesByAssignment.get(key)??0;if(!(sameAssignmentCount>=2)&&(statesByAssignment.set(key,sameAssignmentCount+1),states.push(state2),states.length>=beamWidth))break}}let bestState=states[0];if(!bestState)return null;let outputSrj=buildOutputSimpleRouteJson({inputSrj:this.inputSrj,plans:bestState.plans,layerNames:this.config.layerNames});if(bestState.plans.length===this.inputSrj.connections.length&&!this.validateCompletePlans(bestState.plans,outputSrj).valid)return null;let score=bestState.plans.length===this.inputSrj.connections.length?bestState.plans.reduce((total,plan)=>total+plan.length,0)+getPlanViaCount(bestState.plans)*.1+assignmentLoadPenalty(bestState.assignment,this.preparedBuses,this.config.balanceLayerLoadByConnectionCount)*getLayerLoadPenaltyWeight(this.config):Number.POSITIVE_INFINITY;return Number.isFinite(score)?{summary:{assignmentIndex,busLayerAssignments:bestState.assignment,routedBusCount:this.preparedBuses.length,routedConnectionCount:bestState.plans.length,failedBusIds:[],score},plans:bestState.plans,blockingBusIds:[],outputSrj}:null}prioritizeFailedBusRepairs(assignment,failedBusIds,blockingBusIds){let assignmentKey=JSON.stringify(assignment),repairDepth=this.assignmentRepairDepthByKey.get(assignmentKey)??0;if(repairDepth>=2)return;let maximumRepairs=8,repairs=[],repairKeys=new Set,addRepair=repair=>{let key=JSON.stringify(repair);repairKeys.has(key)||this.evaluatedAssignmentKeys.has(key)||this.queuedAssignmentKeys.has(key)||(repairKeys.add(key),this.queuedAssignmentKeys.add(key),this.assignmentRepairDepthByKey.set(key,repairDepth+1),repairs.push(repair))},repairBusIds=[];for(let index=0;index<Math.max(failedBusIds.length,blockingBusIds.length);index++){let failedBusId=failedBusIds[index],blockingBusId=blockingBusIds[index];failedBusId&&!repairBusIds.includes(failedBusId)&&repairBusIds.push(failedBusId),blockingBusId&&!repairBusIds.includes(blockingBusId)&&repairBusIds.push(blockingBusId)}for(let failedBusId of failedBusIds){let failedLayer=assignment[failedBusId],failedCandidateLayers=this.escapeLayersByBusId[failedBusId];if(!(!failedLayer||!failedCandidateLayers)){for(let blockingBusId of blockingBusIds.slice(0,4)){let blockingLayer=assignment[blockingBusId],blockingCandidateLayers=this.escapeLayersByBusId[blockingBusId];if(!(!blockingLayer||!blockingCandidateLayers||!failedCandidateLayers.includes(blockingLayer)||!blockingCandidateLayers.includes(failedLayer))&&(addRepair({...assignment,[failedBusId]:blockingLayer,[blockingBusId]:failedLayer}),repairs.length>=maximumRepairs))break}if(repairs.length>=maximumRepairs)break}}for(let busId of repairBusIds){let currentLayer=assignment[busId],candidateLayers=this.escapeLayersByBusId[busId];if(!currentLayer||!candidateLayers)continue;let currentLayerIndex=candidateLayers.indexOf(currentLayer);for(let shift=1;shift<candidateLayers.length;shift++){let candidateLayer=candidateLayers[(Math.max(currentLayerIndex,0)+shift)%candidateLayers.length];if(candidateLayer!==currentLayer&&(addRepair({...assignment,[busId]:candidateLayer}),repairs.length>=maximumRepairs))break}if(repairs.length>=maximumRepairs)break}this.pendingRepairAssignments.push(...repairs)}hasCompleteBestAttempt(){return this.bestAttempt?.summary.routedConnectionCount===this.inputSrj.connections.length}shouldEvaluateGroupedBeam(){return this.groupedBeamEvaluated||this.nextAssignmentIndex===0?!1:this.hasCompleteBestAttempt()||this.pendingRepairAssignments.length===0||this.nextAssignmentIndex>=this.config.maxLayerCombinations}_step(){if(this.shouldEvaluateGroupedBeam()){this.groupedBeamEvaluated=!0;let beamAttempt=this.evaluateGroupedBeam(-1);if(beamAttempt||(beamAttempt=this.evaluateGroupedBeam(-1,!0)),beamAttempt){this.attempts.push(beamAttempt.summary),(!this.bestAttempt||beamAttempt.summary.score<this.bestAttempt.summary.score)&&(this.bestAttempt=beamAttempt);let bestSummary=this.bestAttempt.summary;this.stats={assignment:bestSummary.assignmentIndex<0?0:bestSummary.assignmentIndex+1,assignmentCount:this.config.maxLayerCombinations,routedBuses:`${bestSummary.routedBusCount}/${this.preparedBuses.length}`,routedConnections:`${bestSummary.routedConnectionCount}/${this.inputSrj.connections.length}`,failedBuses:"none",bestScore:bestSummary.score},this.completeBestAttemptEndpoints(),this.solved=!0;return}if(this.hasCompleteBestAttempt()){this.completeBestAttemptEndpoints(),this.solved=!0;return}}let assignment;for(;!assignment&&this.nextAssignmentIndex<this.config.maxLayerCombinations;){let preferGeneratedAssignment=this.nextAssignmentIndex%3===0,candidate,candidateCameFromRepairQueue=!1;if(!this.groupedBeamEvaluated&&this.nextAssignmentIndex>0?(candidate=this.pendingRepairAssignments.pop(),candidateCameFromRepairQueue=candidate!==void 0):preferGeneratedAssignment?candidate=this.layerAssignments[this.nextGeneratedAssignmentIndex++]:(candidate=this.pendingRepairAssignments.pop(),candidateCameFromRepairQueue=candidate!==void 0),!candidate&&(this.groupedBeamEvaluated||this.nextAssignmentIndex===0)&&(candidate=preferGeneratedAssignment?this.pendingRepairAssignments.pop():this.layerAssignments[this.nextGeneratedAssignmentIndex++],candidateCameFromRepairQueue=preferGeneratedAssignment&&candidate!==void 0),!candidate)break;let candidateKey=JSON.stringify(candidate);candidateCameFromRepairQueue&&this.queuedAssignmentKeys.delete(candidateKey),!this.evaluatedAssignmentKeys.has(candidateKey)&&(assignment=candidate)}if(!assignment&&!this.groupedBeamEvaluated)return;if(!assignment){this.hasCompleteBestAttempt()?(this.completeBestAttemptEndpoints(),this.solved=!0):(this.failed=!0,this.error=this.bestAttempt?`FanoutSolver: best layer assignment routed ${this.bestAttempt.summary.routedConnectionCount}/${this.inputSrj.connections.length} connections`:"FanoutSolver: no layer assignment could be evaluated");return}let attempt=this.evaluateAssignment(this.nextAssignmentIndex,assignment);this.nextAssignmentIndex++,this.evaluatedAssignmentKeys.add(JSON.stringify(assignment)),(!this.bestAttempt||attempt.summary.routedConnectionCount>=this.bestAttempt.summary.routedConnectionCount)&&this.prioritizeFailedBusRepairs(assignment,attempt.summary.failedBusIds,attempt.blockingBusIds),this.attempts.push(attempt.summary),(!this.bestAttempt||attempt.summary.score<this.bestAttempt.summary.score)&&(this.bestAttempt=attempt),this.stats={assignment:attempt.summary.assignmentIndex+1,assignmentCount:this.config.maxLayerCombinations,routedBuses:`${attempt.summary.routedBusCount}/${this.preparedBuses.length}`,routedConnections:`${attempt.summary.routedConnectionCount}/${this.inputSrj.connections.length}`,failedBuses:attempt.summary.failedBusIds.join(", ")||"none",bestScore:this.bestAttempt.summary.score},this.groupedBeamEvaluated&&attempt.summary.routedConnectionCount===this.inputSrj.connections.length&&(this.completeBestAttemptEndpoints(),this.solved=!0)}computeProgress(){return this.solved||this.failed?1:this.nextAssignmentIndex/this.config.maxLayerCombinations}getConstructorParams(){return[this.inputSrj,this.options]}getOutput(){if(!this.solved||!this.bestAttempt)throw new Error("FanoutSolver: getOutput() called before a complete fanout was solved");let validation=this.validateCompletePlans(this.bestAttempt.plans,this.bestAttempt.outputSrj);if(!validation.valid)throw new Error(`FanoutSolver: completed output failed validation: ${validation.issues[0]?.message??"unknown validation error"}`);let finalSrj=this.endpointCompletion?.simpleRouteJson??this.bestAttempt.outputSrj,finalTraceById=new Map((finalSrj.traces??[]).map(trace=>[trace.pcb_trace_id,trace]));return{simpleRouteJson:this.endpointCompletion?.simpleRouteJson??this.bestAttempt.outputSrj,fanoutTraces:this.bestAttempt.plans.flatMap(plan=>[finalTraceById.get(plan.trace.pcb_trace_id)??plan.trace,...plan.planeEndpointTrace?[finalTraceById.get(plan.planeEndpointTrace.pcb_trace_id)??plan.planeEndpointTrace]:[]]),completionTraces:this.endpointCompletion?.traces??[],...this.endpointCompletion?{endpointCompletion:this.endpointCompletion.report}:{},planeTerminations:this.bestAttempt.plans.flatMap(plan=>plan.termination.type==="plane"&&plan.via?[{busId:plan.busId,connectionName:plan.connectionName,layer:plan.termination.layer,via:plan.via}]:[]),busLayerAssignments:this.bestAttempt.summary.busLayerAssignments,busDirections:Object.fromEntries(this.preparedBuses.map(bus=>[bus.busId,bus.direction])),attempts:[...this.attempts],validation}}getOutputSimpleRouteJson(){return this.getOutput().simpleRouteJson}visualize(){let visualizedSrj=this.endpointCompletion?.simpleRouteJson??this.bestAttempt?.outputSrj??this.inputSrj;return visualizeSimpleRouteJson(visualizedSrj)}},getDirectionalPadding=padding=>{if(typeof padding!="object"){let parsedPadding=distance.parse(padding);return{top:parsedPadding,right:parsedPadding,bottom:parsedPadding,left:parsedPadding}}return{top:padding.top===void 0?0:distance.parse(padding.top),right:padding.right===void 0?0:distance.parse(padding.right),bottom:padding.bottom===void 0?0:distance.parse(padding.bottom),left:padding.left===void 0?0:distance.parse(padding.left)}},getObstacleHalfExtents=obstacle=>{let rotationRadians=(obstacle.ccwRotationDegrees??0)*Math.PI/180,absoluteCosine=Math.abs(Math.cos(rotationRadians)),absoluteSine=Math.abs(Math.sin(rotationRadians));return{x:(absoluteCosine*obstacle.width+absoluteSine*obstacle.height)/2,y:(absoluteSine*obstacle.width+absoluteCosine*obstacle.height)/2}},getFanoutSharedBoundary=({preparedBuses,padding})=>{if(padding===void 0)return;let sourcePadsByComponentId=new Map;for(let bus of preparedBuses)sourcePadsByComponentId.has(bus.componentId)||sourcePadsByComponentId.set(bus.componentId,bus.componentObstacles.filter(obstacle=>obstacle.connectedTo.length>0));let sourcePadObstacles=[...sourcePadsByComponentId.values()].flat();if(sourcePadObstacles.length===0)throw new Error("Cannot apply fanout boundary padding without source pad obstacles");let obstacleBounds=sourcePadObstacles.map(obstacle=>{let halfExtents=getObstacleHalfExtents(obstacle);return{minX:obstacle.center.x-halfExtents.x,maxX:obstacle.center.x+halfExtents.x,minY:obstacle.center.y-halfExtents.y,maxY:obstacle.center.y+halfExtents.y}}),directionalPadding=getDirectionalPadding(padding),sharedBoundary={minX:Math.min(...obstacleBounds.map(bounds=>bounds.minX))-directionalPadding.left,maxX:Math.max(...obstacleBounds.map(bounds=>bounds.maxX))+directionalPadding.right,minY:Math.min(...obstacleBounds.map(bounds=>bounds.minY))-directionalPadding.bottom,maxY:Math.max(...obstacleBounds.map(bounds=>bounds.maxY))+directionalPadding.top};for(let bus of preparedBuses)if(bus.termination.type==="boundary")for(let connection of bus.connections)bus.direction==="left"||bus.direction==="right"?(sharedBoundary.minY=Math.min(sharedBoundary.minY,connection.targetPoint.y),sharedBoundary.maxY=Math.max(sharedBoundary.maxY,connection.targetPoint.y)):(sharedBoundary.minX=Math.min(sharedBoundary.minX,connection.targetPoint.x),sharedBoundary.maxX=Math.max(sharedBoundary.maxX,connection.targetPoint.x));return sharedBoundary},roundMm=value=>Math.round(value*1e3)/1e3,getPadBoundsForComponents=(input2,componentIds)=>{let bounds;for(let obstacle of input2.obstacles){if(!obstacle.componentId||!componentIds.has(obstacle.componentId))continue;let 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;bounds=bounds?{minX:Math.min(bounds.minX,minX),maxX:Math.max(bounds.maxX,maxX),minY:Math.min(bounds.minY,minY),maxY:Math.max(bounds.maxY,maxY)}:{minX,maxX,minY,maxY}}return bounds},getNarrowestGap=(padBounds,boundary)=>Math.min(padBounds.minX-boundary.minX,boundary.maxX-padBounds.maxX,padBounds.minY-boundary.minY,boundary.maxY-padBounds.maxY),getFanoutSpaceErrorMessage=({input:input2,solverError,componentIds,sharedBoundary,componentNamesById})=>{let routedMatch=solverError?.match(/routed (\d+)\/(\d+) connections/),routedCount=routedMatch?Number(routedMatch[1]):void 0,connectionCount=routedMatch?Number(routedMatch[2]):input2.connections.length,componentLabels=[...componentIds].map(componentId=>componentNamesById?.get(componentId)??componentId).sort(),componentSummary=componentLabels.length>0?` for ${componentLabels.join(", ")}`:"",lines=[routedCount===void 0?`Fanout failed${componentSummary}: ${solverError??"the fanout solver did not report a reason"}.`:`Fanout failed${componentSummary}: only ${routedCount} of ${connectionCount} connections could escape to the breakout boundary.`],padBounds=getPadBoundsForComponents(input2,componentIds);if(padBounds&&sharedBoundary){let gap=getNarrowestGap(padBounds,sharedBoundary);lines.push(`The breakout boundary is ${roundMm(gap)}mm from the pads at its narrowest point, which all ${connectionCount} escapes have to share.`)}return lines.push("Give the fanout more room by increasing the breakout's padding, or by extending the breakout to include the parts crowding it (decoupling capacitors, series resistors) so their pads sit inside the boundary instead of against it."),lines.join(" ")},boundsDiffer=(first,second)=>Math.abs(first.minX-second.minX)>1e-6||Math.abs(first.maxX-second.maxX)>1e-6||Math.abs(first.minY-second.minY)>1e-6||Math.abs(first.maxY-second.maxY)>1e-6,expandBoundsToIncludePoints=(bounds,points)=>{if(!(!bounds&&points.length===0))return{minX:Math.min(bounds?.minX??Number.POSITIVE_INFINITY,...points.map(p3=>p3.x)),maxX:Math.max(bounds?.maxX??Number.NEGATIVE_INFINITY,...points.map(p3=>p3.x)),minY:Math.min(bounds?.minY??Number.POSITIVE_INFINITY,...points.map(p3=>p3.y)),maxY:Math.max(bounds?.maxY??Number.NEGATIVE_INFINITY,...points.map(p3=>p3.y))}},getFanoutSolverBuses=buses=>buses?.map(bus=>{let{preferredLayer,preferredLayers,...fanoutBusWithoutPreferences}=bus,requestedFanoutLayers=[...preferredLayer===void 0?[]:[preferredLayer],...preferredLayers??[]].filter((layer,index,layers)=>layers.indexOf(layer)===index);if(requestedFanoutLayers.length===0)return fanoutBusWithoutPreferences;let busAllowedLayers=bus.allowedLayers,allowedLayers=busAllowedLayers===void 0?requestedFanoutLayers:requestedFanoutLayers.filter(layer=>busAllowedLayers.includes(layer));return{...fanoutBusWithoutPreferences,allowedLayers}}),getNinePointAnchor=fanoutDirection=>typeof fanoutDirection=="string"?fanoutDirection:fanoutDirection.direction,getFanoutBorderTarget=anchor=>{switch(anchor){case"top_left":return"top-left";case"top_center":return"top";case"top_right":return"top-right";case"center_left":return"left";case"center":return;case"center_right":return"right";case"bottom_left":return"bottom-left";case"bottom_center":return"bottom";case"bottom_right":return"bottom-right"}},getPlaneFanoutDirection=anchor=>{switch(anchor){case"top_left":case"top_center":case"top_right":return"up";case"center_left":return"left";case"center":return;case"center_right":return"right";case"bottom_left":case"bottom_center":case"bottom_right":return"down"}},getSourceComponentIdForPoint=(input2,point6)=>input2.obstacles.find(obstacle=>obstacle.componentId&&obstacle.layers.includes(point6.layer)&&(point6.pointId&&obstacle.connectedTo.includes(point6.pointId)||point6.x>=obstacle.center.x-obstacle.width/2&&point6.x<=obstacle.center.x+obstacle.width/2&&point6.y>=obstacle.center.y-obstacle.height/2&&point6.y<=obstacle.center.y+obstacle.height/2))?.componentId,inferPlaneBusDirection=(input2,bus)=>{let connectionNames=new Set(bus.connectionNames),sourcePointsByComponentId=new Map;for(let connection of input2.connections)if(connectionNames.has(connection.name))for(let point6 of connection.pointsToConnect){let componentId=getSourceComponentIdForPoint(input2,point6);if(!componentId)continue;let sourcePoints2=sourcePointsByComponentId.get(componentId)??[];sourcePoints2.push(point6),sourcePointsByComponentId.set(componentId,sourcePoints2)}let sourceComponent=[...sourcePointsByComponentId.entries()].sort(([firstComponentId,firstPoints],[secondComponentId,secondPoints])=>secondPoints.length-firstPoints.length||firstComponentId.localeCompare(secondComponentId))[0];if(!sourceComponent)return;let[sourceComponentId,sourcePoints]=sourceComponent,componentObstacles=input2.obstacles.filter(obstacle=>obstacle.componentId===sourceComponentId);if(componentObstacles.length===0)return;let componentXCoordinates=componentObstacles.map(obstacle=>obstacle.center.x),componentYCoordinates=componentObstacles.map(obstacle=>obstacle.center.y),minComponentX=Math.min(...componentXCoordinates),maxComponentX=Math.max(...componentXCoordinates),minComponentY=Math.min(...componentYCoordinates),maxComponentY=Math.max(...componentYCoordinates),componentCenter={x:(minComponentX+maxComponentX)/2,y:(minComponentY+maxComponentY)/2},componentHalfSpan={x:Math.max((maxComponentX-minComponentX)/2,1e-6),y:Math.max((maxComponentY-minComponentY)/2,1e-6)},averageSourcePoint={x:sourcePoints.reduce((sum,point6)=>sum+point6.x,0)/sourcePoints.length,y:sourcePoints.reduce((sum,point6)=>sum+point6.y,0)/sourcePoints.length},normalizedOffset={x:(averageSourcePoint.x-componentCenter.x)/componentHalfSpan.x,y:(averageSourcePoint.y-componentCenter.y)/componentHalfSpan.y};return Math.abs(normalizedOffset.x)>Math.abs(normalizedOffset.y)?normalizedOffset.x>=0?"right":"left":Math.abs(normalizedOffset.y)>1e-9?normalizedOffset.y>=0?"up":"down":"right"},createDownstreamSimpleRouteJson=({fanoutSimpleRouteJson,sourceComponentIds})=>{let sourceObstaclesByComponentId=new Map;for(let obstacle of fanoutSimpleRouteJson.obstacles){if(!obstacle.componentId||!sourceComponentIds.has(obstacle.componentId))continue;let sourceObstacles=sourceObstaclesByComponentId.get(obstacle.componentId)??[];sourceObstacles.push(obstacle),sourceObstaclesByComponentId.set(obstacle.componentId,sourceObstacles)}let sourceFootprintKeepouts=[];for(let[componentId,sourceObstacles]of sourceObstaclesByComponentId){let minX=Math.min(...sourceObstacles.map(obstacle=>obstacle.center.x-obstacle.width/2)),maxX=Math.max(...sourceObstacles.map(obstacle=>obstacle.center.x+obstacle.width/2)),minY=Math.min(...sourceObstacles.map(obstacle=>obstacle.center.y-obstacle.height/2)),maxY=Math.max(...sourceObstacles.map(obstacle=>obstacle.center.y+obstacle.height/2));sourceFootprintKeepouts.push({obstacleId:`fanout-source-keepout:${componentId}`,type:"rect",layers:getViaBoardLayers(fanoutSimpleRouteJson.layerCount),center:{x:(minX+maxX)/2,y:(minY+maxY)/2},width:maxX-minX,height:maxY-minY,connectedTo:[]})}return{...fanoutSimpleRouteJson,obstacles:[...fanoutSimpleRouteJson.obstacles.filter(obstacle=>!obstacle.componentId||!sourceComponentIds.has(obstacle.componentId)),...sourceFootprintKeepouts]}},FanoutAutorouter=class _FanoutAutorouter{constructor(input2,options){__publicField(this,"input");__publicField(this,"options");__publicField(this,"isRouting",!1);__publicField(this,"outputSimpleRouteJson");__publicField(this,"startTimeoutId");__publicField(this,"eventHandlers",{complete:[],error:[],progress:[]});this.input=input2,this.options=options}getBusExitPreferences(){if(!this.options.busFanoutDirections)return;let knownBusIds=new Set(this.input.buses?.map(bus=>bus.busId)??[]),planeBusIds=new Set(this.input.buses?.filter(bus=>bus.termination?.type==="plane").map(bus=>bus.busId)??[]),preferences={};for(let[busId,fanoutDirection]of Object.entries(this.options.busFanoutDirections)){if(!knownBusIds.has(busId))throw new Error(`Fanout direction references unknown bus "${busId}" in this autorouting phase`);if(planeBusIds.has(busId))continue;let target=getFanoutBorderTarget(getNinePointAnchor(fanoutDirection));target&&(preferences[busId]=target)}return Object.keys(preferences).length>0?preferences:void 0}getPlaneBusDirections(){let planeBuses=this.input.buses?.filter(bus=>bus.termination?.type==="plane")??[],planeBusIds=new Set(planeBuses.map(bus=>bus.busId)),directions={};for(let[busId,fanoutDirection]of Object.entries(this.options.busFanoutDirections??{})){if(!planeBusIds.has(busId))continue;let direction2=getPlaneFanoutDirection(getNinePointAnchor(fanoutDirection));direction2&&(directions[busId]=direction2)}for(let planeBus of planeBuses){if(directions[planeBus.busId])continue;let direction2=inferPlaneBusDirection(this.input,planeBus);direction2&&(directions[planeBus.busId]=direction2)}return Object.keys(directions).length>0?directions:void 0}getFanoutSolverOptions(){let commonOptions={buses:getFanoutSolverBuses(this.input.buses),borderDistribution:"even",compactBusTracks:!0,busDirections:this.getPlaneBusDirections(),busExitPreferences:this.getBusExitPreferences(),escapeLayers:this.options.fanoutRoutingLayers};return this.options.mode==="single_layer_fanout"?{...commonOptions,escapeLayers:["top"],singleLayerPushAndShove:!0}:commonOptions}static resolveFanoutBounds(input2,options){let paddingBounds;if(options.fanoutBoundaryPadding!==void 0){let boundsResolver=new _FanoutAutorouter(input2,options),fanoutSolver=new FanoutSolver(input2,boundsResolver.getFanoutSolverOptions());paddingBounds=getFanoutSharedBoundary({preparedBuses:fanoutSolver.preparedBuses,padding:options.fanoutBoundaryPadding})}return options.fanoutBounds&&paddingBounds&&boundsDiffer(options.fanoutBounds,paddingBounds)&&options.onFanoutBoundsConflict?.(),expandBoundsToIncludePoints(options.fanoutBounds??paddingBounds,options.breakoutPoints??[])}solveFanout(){let fanoutSolverOptions=this.getFanoutSolverOptions(),fanoutSolver=new FanoutSolver(this.input,{...fanoutSolverOptions,...this.options.fanoutBounds?{sharedBoundary:this.options.fanoutBounds}:{}}),solverConstructorArgs=fanoutSolver.getConstructorParams();if(this.options.onSolverStarted?.({solverName:"FanoutSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs}),fanoutSolver.solve(),fanoutSolver.failed)throw new Error(getFanoutSpaceErrorMessage({input:this.input,solverError:fanoutSolver.error,componentIds:new Set(fanoutSolver.preparedBuses.map(bus=>bus.componentId)),sharedBoundary:this.options.fanoutBounds??fanoutSolverOptions.sharedBoundary,componentNamesById:this.options.componentNamesById}));let output=fanoutSolver.getOutput(),fanoutSimpleRouteJson=output.simpleRouteJson,fanoutTraces=output.fanoutTraces;return{downstreamSimpleRouteJson:createDownstreamSimpleRouteJson({fanoutSimpleRouteJson,sourceComponentIds:new Set(fanoutSolver.preparedBuses.map(bus=>bus.componentId))}),fanoutTraces,debugGraphics:fanoutSolver.visualize()}}startFanout(){try{let{downstreamSimpleRouteJson,fanoutTraces,debugGraphics}=this.solveFanout();if(!this.isRouting)return;this.outputSimpleRouteJson=downstreamSimpleRouteJson,this.emitEvent({type:"progress",steps:1,progress:1,phase:this.options.mode,debugGraphics}),this.isRouting=!1,this.emitEvent({type:"complete",traces:fanoutTraces})}catch(caughtError){this.isRouting=!1,this.emitEvent({type:"error",error:caughtError instanceof Error?caughtError:new Error(String(caughtError))})}}start(){this.isRouting||(this.isRouting=!0,this.startTimeoutId=setTimeout(()=>{this.startTimeoutId=void 0,this.startFanout()},0))}stop(){this.startTimeoutId!==void 0&&(clearTimeout(this.startTimeoutId),this.startTimeoutId=void 0),this.isRouting=!1}on(event,callback){event==="complete"?this.eventHandlers.complete.push(callback):event==="error"?this.eventHandlers.error.push(callback):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 for(let handler of this.eventHandlers.progress)handler(event)}solveSync(){let{downstreamSimpleRouteJson,fanoutTraces}=this.solveFanout();return this.outputSimpleRouteJson=downstreamSimpleRouteJson,fanoutTraces}getOutputSimpleRouteJson(){return this.outputSimpleRouteJson}},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(id3=>tracePortIds.has(id3))})||db2.source_trace.insert({connected_source_port_ids:sourcePortIdArray,connected_source_net_ids:[],subcircuit_id:subcircuit_id??void 0,display_name:`offboard_${rootConnectionName}`})}},getPcbComponentNamesById=db2=>{let namesById=new Map;for(let pcbComponent of db2.pcb_component.list()){let sourceComponent=db2.source_component.get(pcbComponent.source_component_id);sourceComponent?.name&&namesById.set(pcbComponent.pcb_component_id,sourceComponent.name)}return namesById},normalizeAutorouterName=value=>value?.replace(/-/g,"_");function getLegacyAutorouterPreset(autorouterConfig2){if(!autorouterConfig2)return null;if(typeof autorouterConfig2=="string"){let normalizedAutorouterName=normalizeAutorouterName(autorouterConfig2);return normalizedAutorouterName==="sequential_trace"||normalizedAutorouterName==="auto_cloud"?normalizedAutorouterName:null}let normalizedPreset=normalizeAutorouterName(autorouterConfig2.preset);return normalizedPreset==="sequential_trace"||normalizedPreset==="auto_cloud"?normalizedPreset:normalizeAutorouterName(autorouterConfig2.groupMode)==="sequential_trace"?"sequential_trace":null}function getPresetAutoroutingConfig(autorouterConfig2,platformConfig2){let defaults2={serverUrl:"https://registry-api.tscircuit.com",serverMode:"job",serverCacheEnabled:!0};if(typeof autorouterConfig2=="object"&&!autorouterConfig2.preset)return{local:!(autorouterConfig2.serverUrl||autorouterConfig2.serverMode||autorouterConfig2.serverCacheEnabled),...defaults2,...autorouterConfig2};let preset=typeof autorouterConfig2=="object"?autorouterConfig2.preset:autorouterConfig2,providedConfig=typeof autorouterConfig2=="object"?autorouterConfig2:{},normalizedPreset=typeof preset=="string"?preset.replace(/_/g,"-"):preset,platformAutorouter=normalizedPreset&&typeof normalizedPreset=="string"?platformConfig2?.autorouterMap?.[normalizedPreset]:void 0;if(platformAutorouter)return{local:!0,groupMode:"subcircuit",algorithmFn:async simpleRouteJson=>platformAutorouter.createAutorouter(simpleRouteJson)};switch(normalizedPreset){case"default":case"auto":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"beta-pipeline9":return{local:!0,groupMode:"subcircuit",autorouterVersion:"beta_pipeline9"};case"single-layer-fanout":return{local:!0,groupMode:"subcircuit",preset:"single_layer_fanout"};case"fanout":return{local:!0,groupMode:"subcircuit",preset:"fanout"};case"auto-cloud":{let{preset:_preset,local:_local,groupMode:_groupMode,...rest}=providedConfig;return{local:!1,groupMode:"subcircuit",...defaults2,...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 SOLVERS={PackSolver2,LayoutPipelineSolver,AutoroutingPipelineSolver:vq,AssignableAutoroutingPipeline2:Ol2,AssignableAutoroutingPipeline3:Xg,AutoroutingPipeline1_OriginalUnravel:rl2,AutoroutingPipelineSolver3_HgPortPointPathing:gf2,AutoroutingPipelineSolver4:_Y,AutoroutingPipelineSolver5:wY,AutoroutingPipelineSolver7_MultiGraph:vq,AutoroutingPipelineSolver8:Cq,AutoroutingPipelineSolver9_PreloadedTraceGraph:wQ,CopperPourPipelineSolver,CreateFdmEnclosureSolver,FanoutSolver,SchematicTracePipelineSolver},AUTOROUTER_CACHE_KEY_PREFIX="capacity-autorouter:",cacheProvidersByLocalCacheEngine=new WeakMap;function isPromiseLike(value){return typeof value=="object"&&value!==null&&"then"in value&&typeof value.then=="function"}function isAsyncFunction(fn3){return fn3.constructor.name==="AsyncFunction"}var LocalCacheEngineCacheProvider=class{constructor(localCacheEngine2){__publicField(this,"localCacheEngine");__publicField(this,"isSyncCache");__publicField(this,"cacheHits",0);__publicField(this,"cacheMisses",0);__publicField(this,"cacheHitsByPrefix",{});__publicField(this,"cacheMissesByPrefix",{});__publicField(this,"knownCacheKeys",new Set);this.localCacheEngine=localCacheEngine2,this.isSyncCache=!isAsyncFunction(localCacheEngine2.getItem)&&!isAsyncFunction(localCacheEngine2.setItem)}getCachedSolutionSync(cacheKey){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let cachedItem=this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));if(isPromiseLike(cachedItem)){this.isSyncCache=!1,Promise.resolve(cachedItem).catch(()=>{}),this.recordCacheMiss(cacheKey);return}return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}}async getCachedSolution(cacheKey){this.knownCacheKeys.add(cacheKey);try{let cachedItem=await this.localCacheEngine.getItem(this.getLocalCacheEngineKey(cacheKey));return this.parseCachedItem(cacheKey,cachedItem)}catch{this.recordCacheMiss(cacheKey);return}}setCachedSolutionSync(cacheKey,cachedSolution){if(this.isSyncCache){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;let writeResult=this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution);isPromiseLike(writeResult)&&(this.isSyncCache=!1,Promise.resolve(writeResult).catch(()=>{}))}catch{}}}async setCachedSolution(cacheKey,cachedSolution){this.knownCacheKeys.add(cacheKey);try{let serializedSolution=JSON.stringify(cachedSolution);if(serializedSolution===void 0)return;await this.localCacheEngine.setItem(this.getLocalCacheEngineKey(cacheKey),serializedSolution)}catch{}}getAllCacheKeys(){return[...this.knownCacheKeys]}clearCache(){for(let cacheKey of this.knownCacheKeys){let localCacheEngineKey=this.getLocalCacheEngineKey(cacheKey);try{let clearResult=this.localCacheEngine.removeItem?this.localCacheEngine.removeItem(localCacheEngineKey):this.localCacheEngine.setItem(localCacheEngineKey,"null");isPromiseLike(clearResult)&&Promise.resolve(clearResult).catch(()=>{})}catch{}}this.knownCacheKeys.clear(),this.cacheHits=0,this.cacheMisses=0,this.cacheHitsByPrefix={},this.cacheMissesByPrefix={}}getLocalCacheEngineKey(cacheKey){return`${AUTOROUTER_CACHE_KEY_PREFIX}${cacheKey}`}parseCachedItem(cacheKey,cachedItem){if(cachedItem===null){this.recordCacheMiss(cacheKey);return}try{let cachedSolution=JSON.parse(cachedItem);if(cachedSolution===null){this.recordCacheMiss(cacheKey);return}return this.recordCacheHit(cacheKey),cachedSolution}catch{this.recordCacheMiss(cacheKey);return}}recordCacheHit(cacheKey){this.cacheHits++;let prefix=cacheKey.split(":")[0];this.cacheHitsByPrefix[prefix]=(this.cacheHitsByPrefix[prefix]??0)+1}recordCacheMiss(cacheKey){this.cacheMisses++;let prefix=cacheKey.split(":")[0];this.cacheMissesByPrefix[prefix]=(this.cacheMissesByPrefix[prefix]??0)+1}};function getCacheProviderForLocalCacheEngine(localCacheEngine2){let cacheProvider=cacheProvidersByLocalCacheEngine.get(localCacheEngine2);return cacheProvider||(cacheProvider=new LocalCacheEngineCacheProvider(localCacheEngine2),cacheProvidersByLocalCacheEngine.set(localCacheEngine2,cacheProvider)),cacheProvider}function getCapacityAutorouterCacheProvider(platformConfig2){return platformConfig2?.localCacheEngine?getCacheProviderForLocalCacheEngine(platformConfig2.localCacheEngine):null}var 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:autorouterVersion22,useLaserPrefabSolver=!1,effort,platformConfig:platformConfig2,onSolverStarted}=options,solverName;autorouterVersion22==="beta_pipeline1"?solverName="AutoroutingPipeline1_OriginalUnravel":autorouterVersion22==="beta_pipeline3"?solverName="AutoroutingPipelineSolver3_HgPortPointPathing":autorouterVersion22==="beta_pipeline4"?solverName="AutoroutingPipelineSolver4":autorouterVersion22==="beta_pipeline5"?solverName="AutoroutingPipelineSolver5":autorouterVersion22==="beta_pipeline7"||autorouterVersion22==="latest"?solverName="AutoroutingPipelineSolver7_MultiGraph":autorouterVersion22==="beta_pipeline9"?solverName="AutoroutingPipelineSolver9_PreloadedTraceGraph":useLaserPrefabSolver?solverName="AutoroutingPipelineSolver8":useAutoJumperSolver?solverName="AssignableAutoroutingPipeline3":useAssignableSolver?solverName="AssignableAutoroutingPipeline2":solverName="AutoroutingPipelineSolver7_MultiGraph";let SolverClass=SOLVERS[solverName],solverCacheProvider=getCapacityAutorouterCacheProvider(platformConfig2);this.solver=new SolverClass(input2,{capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,effort}),onSolverStarted?.({solverName,solverParams:{input:input2,options:{capacityDepth,targetMinCapacity,cacheProvider:solverCacheProvider,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(error2){this.emitEvent({type:"error",error:error2 instanceof Error?new AutorouterError(error2.message):new AutorouterError(String(error2))}),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():{}}},defaultLocalAutorouterStrategy={cacheable:!0,create:({simpleRouteJson,commonAutorouterOptions,onSolverStarted})=>new TscircuitAutorouter(simpleRouteJson,{...commonAutorouterOptions,onSolverStarted:details=>onSolverStarted?.({...details,solverConstructorArgs:[details.solverParams]})})},createFanoutAutorouterStrategy=mode=>({cacheable:!1,followUpAutorouter:"default",create:({simpleRouteJson,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,componentNamesById,onSolverStarted})=>new FanoutAutorouter(simpleRouteJson,{mode,busFanoutDirections,fanoutBounds,fanoutRoutingLayers,componentNamesById,onSolverStarted})}),localAutorouterStrategies=new Map([["single_layer_fanout",createFanoutAutorouterStrategy("single_layer_fanout")],["fanout",createFanoutAutorouterStrategy("fanout")]]),getLocalAutorouterStrategy=preset=>localAutorouterStrategies.get(preset??"")??defaultLocalAutorouterStrategy,getLocalAutoroutingStages=(autorouterConfig2,platformConfig2)=>{let strategy=getLocalAutorouterStrategy(autorouterConfig2.preset),stages=[{autorouterConfig:autorouterConfig2,strategy,usesPreviousStageOutput:!1}];if(strategy.followUpAutorouter){let followUpAutorouterConfig=getPresetAutoroutingConfig(strategy.followUpAutorouter,platformConfig2);stages.push({autorouterConfig:followUpAutorouterConfig,strategy:getLocalAutorouterStrategy(followUpAutorouterConfig.preset),usesPreviousStageOutput:!0})}return stages},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_component3=su2(circuitJson).pcb_component.get(pcb_component_id);if(!pcb_component3)continue;let source_component=su2(circuitJson).source_component.get(pcb_component3.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.pcb_placements?.findIndex(p3=>p3.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_component22=su2(circuitJson).schematic_component.get(schematic_component_id);if(!schematic_component22||!schematic_component22.source_component_id)continue;let source_component=su2(circuitJson).source_component.get(schematic_component22.source_component_id);if(!source_component)continue;let existingPlacementIndex=updatedManualEditsFile.schematic_placements?.findIndex(p3=>p3.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(e6=>e6.pcb_trace_hint_id===edit_event.pcb_trace_hint_id?{...e6,route:edit_event.route}:e6);else{let pcbPort=su2(circuitJson).pcb_port.get(edit_event.pcb_port_id);circuitJson=circuitJson.filter(e6=>!(e6.type==="pcb_trace_hint"&&e6.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(e6=>e6.type==="pcb_component"&&e6.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(e6=>e6.pcb_component_id!==editEvent.pcb_component_id?e6:transformPCBElement(e6,mat))}}else editEvent.edit_event_type==="edit_schematic_component_location"?circuitJson=circuitJson.map(e6=>e6.type==="schematic_component"&&e6.schematic_component_id===editEvent.schematic_component_id?{...e6,center:editEvent.new_center}:e6):editEvent.edit_event_type==="edit_pcb_trace_hint"&&(circuitJson=applyTraceHintEditEvent(circuitJson,editEvent));return circuitJson},Bus=class extends PrimitiveComponent2{get config(){return{componentName:"Bus",zodProps:busProps}}},resolvePointToPointConnection=(differentialPair,connectionSelector)=>{let{db:db2}=differentialPair.root,subcircuit=differentialPair.getSubcircuit(),matchingSourceTraces=db2.source_trace.list().filter(sourceTrace=>sourceTrace.subcircuit_id===subcircuit.subcircuit_id).filter(sourceTrace=>sourceTrace.name===connectionSelector),connectivityMapKeys=new Set;if(matchingSourceTraces.length>0)for(let sourceTrace of matchingSourceTraces)sourceTrace.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourceTrace.subcircuit_connectivity_map_key);else{let selectedPort=subcircuit.selectOne(connectionSelector,{type:"port"});if(selectedPort?.source_port_id){let sourcePort=db2.source_port.get(selectedPort.source_port_id);sourcePort?.subcircuit_connectivity_map_key&&connectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key)}}if(connectivityMapKeys.size!==1)return;let connectivityMapKey=connectivityMapKeys.values().next().value;return connectivityMapKey?{sourcePorts:db2.source_port.list().filter(sourcePort=>sourcePort.subcircuit_connectivity_map_key===connectivityMapKey),sourceTraceName:matchingSourceTraces.length>0?connectionSelector:void 0}:void 0},formatTerminalPinList=terminalPinSelectors=>terminalPinSelectors.length<=1?terminalPinSelectors.join(""):terminalPinSelectors.length===2?`${terminalPinSelectors[0]} and ${terminalPinSelectors[1]}`:`${terminalPinSelectors.slice(0,-1).join(", ")}, and ${terminalPinSelectors.at(-1)}`,getTerminalPinSelector=(sourcePort,sourceComponentsById)=>{let sourceComponent;if(sourcePort.source_component_id&&(sourceComponent=sourceComponentsById.get(sourcePort.source_component_id)),!sourceComponent?.name)return sourcePort.source_port_id;let portName=sourcePort.most_frequently_referenced_by_name??sourcePort.name;return`.${sourceComponent.name} > .${portName}`},getPointToPointWarningMessage=({differentialPairName,connectionPolarity,connectionSelector,sourceTraceName,terminalPinSelectors})=>{let terminalList=formatTerminalPinList(terminalPinSelectors),terminalListDescription=terminalList?`: ${terminalList}`:"";return sourceTraceName&&terminalPinSelectors.length>2?`Differential pair "${differentialPairName}" ${connectionPolarity}Connection uses the ambiguous trace name "${sourceTraceName}": its connection has more than 2 terminal pins${terminalListDescription}.`:`Differential pair "${differentialPairName}" ${connectionPolarity}Connection="${connectionSelector}" is not point-to-point: expected exactly 2 terminal pins, found ${terminalPinSelectors.length}${terminalListDescription}.`},DifferentialPair_doInitialSourceDesignRuleChecks=differentialPair=>{let{db:db2}=differentialPair.root,sourceComponentsById=new Map;for(let sourceComponent of db2.source_component.list())sourceComponentsById.set(sourceComponent.source_component_id,{name:sourceComponent.name});for(let connectionPolarity of["positive","negative"]){let connectionSelector=differentialPair._parsedProps.negativeConnection;connectionPolarity==="positive"&&(connectionSelector=differentialPair._parsedProps.positiveConnection);let resolvedConnection=resolvePointToPointConnection(differentialPair,connectionSelector);if(!resolvedConnection)continue;let terminalSourcePorts=resolvedConnection.sourcePorts;if(terminalSourcePorts.length===2)continue;let warningSourceComponentId="",firstTerminalSourcePort=terminalSourcePorts[0];if(firstTerminalSourcePort){if(!firstTerminalSourcePort.source_component_id)throw new Error(`Differential pair "${differentialPair.name}" resolved terminal port "${firstTerminalSourcePort.source_port_id}" without a source_component_id`);warningSourceComponentId=firstTerminalSourcePort.source_component_id}let terminalPinSelectors=terminalSourcePorts.map(sourcePort=>getTerminalPinSelector(sourcePort,sourceComponentsById)).sort((selectorA,selectorB)=>selectorA.localeCompare(selectorB));db2.source_property_ignored_warning.insert({source_component_id:warningSourceComponentId,property_name:`${connectionPolarity}Connection`,error_type:"source_property_ignored_warning",message:getPointToPointWarningMessage({differentialPairName:differentialPair.name,connectionPolarity,connectionSelector,sourceTraceName:resolvedConnection.sourceTraceName,terminalPinSelectors}),subcircuit_id:differentialPair.getSubcircuit().subcircuit_id??void 0})}},DifferentialPair=class extends PrimitiveComponent2{get config(){return{componentName:"DifferentialPair",zodProps:differentialPairProps}}doInitialSourceDesignRuleChecks(){DifferentialPair_doInitialSourceDesignRuleChecks(this)}},expandSrjBoundsToIncludeConnectionPoints=input2=>{let expandedBounds={...input2.bounds};for(let connection of input2.connections)if(!connection.isOffBoard)for(let point6 of connection.pointsToConnect)expandedBounds.minX=Math.min(expandedBounds.minX,point6.x),expandedBounds.maxX=Math.max(expandedBounds.maxX,point6.x),expandedBounds.minY=Math.min(expandedBounds.minY,point6.y),expandedBounds.maxY=Math.max(expandedBounds.maxY,point6.y);return expandedBounds},getBusSourceTraceSubcircuitConnectivityMapKeyOrThrow=({bus,busSourceTraces,traceNameOrPortSelector})=>{let sourceTracesWithMatchingName=busSourceTraces.filter(sourceTrace2=>sourceTrace2.name===traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?bus.getSubcircuit().selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?busSourceTraces.filter(sourceTrace2=>sourceTrace2.connected_source_port_ids.includes(selectedSourcePortId)):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in bus "${bus.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces in bus "${bus.name}"`);let sourceTrace=matchingSourceTraces[0];if(!sourceTrace?.subcircuit_connectivity_map_key)throw new Error(`Source trace for "${traceNameOrPortSelector}" does not have a subcircuit connectivity map key in bus "${bus.name}"`);return sourceTrace.subcircuit_connectivity_map_key},getBusSrjConnectionNamesOrThrow=({srjConnections,bus,busSourceTraces,traceSubcircuitConnectivityMapKey,traceNameOrPortSelector})=>{let sourceTraceIds=busSourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_connectivity_map_key===traceSubcircuitConnectivityMapKey).map(sourceTrace=>sourceTrace.source_trace_id),matchingSrjConnections=srjConnections.filter(srjConnection=>srjConnection.source_trace_id&&sourceTraceIds.includes(srjConnection.source_trace_id));if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for "${traceNameOrPortSelector}" in bus "${bus.name}"`);return matchingSrjConnections.map(srjConnection=>srjConnection.name)},normalizeNetName=netNameOrSelector=>netNameOrSelector.trim().replace(/^net\./,"").replace(/^\./,""),getPlaneTerminatedSourceTraceLayers=({fanoutPourNetMap,sourceNets,sourceTraces,subcircuitId})=>{let traceLayers=new Map;if(!fanoutPourNetMap)return traceLayers;let planeLayerBySourceNetId=new Map;for(let[layer,netOrNets]of Object.entries(fanoutPourNetMap)){let netNames=Array.isArray(netOrNets)?netOrNets:[netOrNets];for(let netNameOrSelector of netNames){let netName=normalizeNetName(netNameOrSelector);for(let sourceNet of sourceNets){if(sourceNet.name!==netName)continue;let previousLayer=planeLayerBySourceNetId.get(sourceNet.source_net_id);if(previousLayer&&previousLayer!==layer)throw new Error(`Fanout plane net "${netName}" maps to multiple layers ("${previousLayer}" and "${layer}"); use fanoutPourNetMap to select one`);planeLayerBySourceNetId.set(sourceNet.source_net_id,layer)}}}for(let sourceTrace of sourceTraces){if(subcircuitId&&sourceTrace.subcircuit_id!==subcircuitId||sourceTrace.connected_source_port_ids.length!==1)continue;let mappedLayers=new Set((sourceTrace.connected_source_net_ids??[]).map(sourceNetId=>planeLayerBySourceNetId.get(sourceNetId)).filter(layer2=>layer2!==void 0));if(mappedLayers.size>1)throw new Error(`Source trace "${sourceTrace.name??sourceTrace.source_trace_id}" connects to fanout planes on multiple layers`);let layer=mappedLayers.values().next().value;layer&&traceLayers.set(sourceTrace.source_trace_id,layer)}return traceLayers},getBusesForSimpleRouteJson=({srjConnections,buses,sourceTraces,subcircuitId,planeTerminatedSourceTraceLayers})=>{let declaredSrjBuses=[];for(let bus of buses){let busSubcircuitId=bus.getSubcircuit().subcircuit_id;if(subcircuitId&&busSubcircuitId!==subcircuitId)continue;let busSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===busSubcircuitId),connectionNames=bus._parsedProps.connections.flatMap(traceNameOrPortSelector=>{let traceSubcircuitConnectivityMapKey=getBusSourceTraceSubcircuitConnectivityMapKeyOrThrow({bus,busSourceTraces,traceNameOrPortSelector});return getBusSrjConnectionNamesOrThrow({srjConnections,bus,busSourceTraces,traceSubcircuitConnectivityMapKey,traceNameOrPortSelector})});if(new Set(connectionNames).size!==connectionNames.length)throw new Error(`Bus "${bus.name}" resolves multiple entries to one trace`);declaredSrjBuses.push({busId:bus.name,name:bus.name,connectionNames,...bus._parsedProps.maxLengthSkew!==void 0?{maxLengthSkew:bus._parsedProps.maxLengthSkew}:{},...bus._parsedProps.pcbTraceWidth!==void 0?{traceWidth:bus._parsedProps.pcbTraceWidth}:{},...bus._parsedProps.pcbAllowedLayers!==void 0?{allowedLayers:bus._parsedProps.pcbAllowedLayers}:{},...bus._parsedProps.preferredLayer!==void 0?{preferredLayer:bus._parsedProps.preferredLayer}:{},...bus._parsedProps.preferredLayers!==void 0?{preferredLayers:bus._parsedProps.preferredLayers}:{}})}let planeSrjBuses=[];for(let[sourceTraceId,layer]of planeTerminatedSourceTraceLayers??[]){let sourceTrace=sourceTraces.find(candidate=>candidate.source_trace_id===sourceTraceId),srjConnection=srjConnections.find(connection=>connection.source_trace_id===sourceTraceId);if(!sourceTrace||!srjConnection)continue;let busId=sourceTrace.name??sourceTrace.source_trace_id;if([...declaredSrjBuses,...planeSrjBuses].some(bus=>bus.busId===busId))throw new Error(`Fanout plane trace "${busId}" conflicts with an existing bus name`);planeSrjBuses.push({busId,name:busId,connectionNames:[srjConnection.name],termination:{type:"plane",layer}})}let srjBuses=[...planeSrjBuses,...declaredSrjBuses];return srjBuses.length>0?srjBuses:void 0},getDifferentialPairSourceTracesByTraceName=(differentialPairSourceTraces,traceName)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.name===traceName),getDifferentialPairSourceTracesByPortId=(differentialPairSourceTraces,sourcePortId)=>differentialPairSourceTraces.filter(sourceTrace=>sourceTrace.connected_source_port_ids.includes(sourcePortId)),getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow=({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector})=>{let differentialPairSubcircuit=differentialPair.getSubcircuit(),sourceTracesWithMatchingName=getDifferentialPairSourceTracesByTraceName(differentialPairSourceTraces,traceNameOrPortSelector),selectedSourcePortId=(sourceTracesWithMatchingName.length===0?differentialPairSubcircuit.selectOne(traceNameOrPortSelector,{type:"port"}):null)?.source_port_id??void 0,matchingSourceTraces=selectedSourcePortId?getDifferentialPairSourceTracesByPortId(differentialPairSourceTraces,selectedSourcePortId):sourceTracesWithMatchingName;if(matchingSourceTraces.length===0)throw new Error(`Could not find source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);if(matchingSourceTraces.length>1)throw new Error(`Trace name or port selector "${traceNameOrPortSelector}" matches multiple source traces for differential pair "${differentialPair.name}"`);let sourceTrace=matchingSourceTraces[0];if(!sourceTrace)throw new Error(`Expected one source trace for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPair.name}"`);let subcircuitConnectivityMapKey=sourceTrace.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)throw new Error(`Source trace "${sourceTrace.source_trace_id}" does not have a subcircuit connectivity map key for differential pair "${differentialPair.name}"`);return subcircuitConnectivityMapKey},getDifferentialPairSrjConnectionNameOrThrow=({srjConnections,differentialPairName,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey,traceNameOrPortSelector})=>{let differentialPairSourceTraceIds=[];for(let sourceTrace of differentialPairSourceTraces)sourceTrace.subcircuit_connectivity_map_key===traceSubcircuitConnectivityMapKey&&differentialPairSourceTraceIds.push(sourceTrace.source_trace_id);let matchingSrjConnections=[];for(let srjConnection2 of srjConnections)srjConnection2.source_trace_id&&differentialPairSourceTraceIds.includes(srjConnection2.source_trace_id)&&matchingSrjConnections.push(srjConnection2);if(matchingSrjConnections.length===0)throw new Error(`Could not find an SRJ connection for trace name or port selector "${traceNameOrPortSelector}" in differential pair "${differentialPairName}"`);if(matchingSrjConnections.length>1)throw new Error(`Subcircuit connectivity map key "${traceSubcircuitConnectivityMapKey}" matches multiple SRJ connections for differential pair "${differentialPairName}"`);let srjConnection=matchingSrjConnections[0];if(!srjConnection)throw new Error(`Expected one SRJ connection for subcircuit connectivity map key "${traceSubcircuitConnectivityMapKey}"`);return srjConnection.name},getDifferentialPairsForSimpleRouteJson=({srjConnections,differentialPairs,sourceTraces,subcircuitId})=>{let srjDifferentialPairs=[];for(let differentialPair of differentialPairs){let differentialPairSubcircuitId=differentialPair.getSubcircuit().subcircuit_id;if(subcircuitId&&differentialPairSubcircuitId!==subcircuitId)continue;let differentialPairSourceTraces=sourceTraces.filter(sourceTrace=>sourceTrace.subcircuit_id===differentialPairSubcircuitId),positiveTraceNameOrPortSelector=differentialPair._parsedProps.positiveConnection,negativeTraceNameOrPortSelector=differentialPair._parsedProps.negativeConnection,positiveSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSubcircuitConnectivityMapKey=getDifferentialPairTraceSubcircuitConnectivityMapKeyOrThrow({differentialPair,differentialPairSourceTraces,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),positiveSrjConnectionName=getDifferentialPairSrjConnectionNameOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:positiveSubcircuitConnectivityMapKey,traceNameOrPortSelector:positiveTraceNameOrPortSelector}),negativeSrjConnectionName=getDifferentialPairSrjConnectionNameOrThrow({srjConnections,differentialPairName:differentialPair.name,differentialPairSourceTraces,traceSubcircuitConnectivityMapKey:negativeSubcircuitConnectivityMapKey,traceNameOrPortSelector:negativeTraceNameOrPortSelector}),lengthTolerance=differentialPair._parsedProps.maxLengthSkew??.1;srjDifferentialPairs.push({connectionNames:[positiveSrjConnectionName,negativeSrjConnectionName],lengthTolerance,...differentialPair._parsedProps.pcbTraceGap!==void 0?{traceGap:differentialPair._parsedProps.pcbTraceGap}:{},...differentialPair._parsedProps.maxUncoupledLength!==void 0?{maxUncoupledLength:differentialPair._parsedProps.maxUncoupledLength}:{}})}return srjDifferentialPairs.length>0?srjDifferentialPairs:void 0},getLayerName=layer=>typeof layer=="string"?layer:layer.name,getPreservedTraceConnectionName=trace=>trace.source_trace_id??trace.connection_name??trace.pcb_trace_id,getPhysicalConnectionIdsForPreservedTrace=trace=>{let physicallyConnectedIds=new Set(trace.connectsTo??[]);for(let routePoint of trace.route)if(routePoint.route_type==="wire")for(let pcbPortId of[routePoint.start_pcb_port_id,routePoint.end_pcb_port_id])pcbPortId&&physicallyConnectedIds.add(pcbPortId);return Array.from(physicallyConnectedIds)},getSimpleRouteForPreservedTrace=trace=>trace.route.map(routePoint=>routePoint.route_type==="wire"?{route_type:"wire",x:routePoint.x,y:routePoint.y,width:routePoint.width,layer:getLayerName(routePoint.layer)}:routePoint.route_type==="via"?{route_type:"via",x:routePoint.x,y:routePoint.y,from_layer:getLayerName(routePoint.from_layer),to_layer:getLayerName(routePoint.to_layer),...routePoint.outer_diameter!==void 0?{via_diameter:routePoint.outer_diameter}:{},...routePoint.hole_diameter!==void 0?{via_hole_diameter:routePoint.hole_diameter}:{}}:{route_type:"through_obstacle",start:routePoint.start,end:routePoint.end,from_layer:getLayerName(routePoint.start_layer),to_layer:getLayerName(routePoint.end_layer),width:routePoint.width}),getPreservedRoutedSubcircuitTraces=({scopedDb,relevantSubcircuitIds})=>scopedDb.pcb_trace.list().filter(trace=>trace.subcircuit_id?relevantSubcircuitIds===null||relevantSubcircuitIds.has(trace.subcircuit_id):!1).map(trace=>{let preservedTrace=trace,connectionName=getPreservedTraceConnectionName(preservedTrace);return{type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,source_trace_id:trace.source_trace_id,connection_name:connectionName,connectsTo:getPhysicalConnectionIdsForPreservedTrace(preservedTrace),route:getSimpleRouteForPreservedTrace(preservedTrace)}}).filter(trace=>trace.route.length>=2),COPPER_POUR_RECT_HEIGHT=.5,dedupeStrings2=values=>Array.from(new Set(values.filter(value=>!!value))),getLayerName2=layer=>typeof layer=="string"?layer:layer.name,createCopperPourObstacle=({layer,connectedTo,center:center2,width,height})=>({type:"rect",layers:[layer],center:center2,width,height,connectedTo,isCopperPour:!0}),getCopperPourBoundary=({outline,group,board})=>outline&&outline.length>=3?outline:group?.outline&&group.outline.length>=3?group.outline:board?.outline&&board.outline.length>=3?board.outline:null,getCopperPourBoundsRect=({group,board})=>group?.width&&group.height?{center:group.center,width:group.width,height:group.height}:board?.width&&board.height?{center:board.center,width:board.width,height:board.height}:null,getCopperPourConnectedTo=(net,connMap)=>dedupeStrings2([net.source_net_id,net.subcircuit_connectivity_map_key,net.source_net_id?connMap.getNetConnectedToId(net.source_net_id):null]),getUnbrokenCopperPourObstacles=({connMap,subcircuitComponent,board,group})=>{if(!subcircuitComponent)return[];let obstacles=[],copperPours=subcircuitComponent.selectAll("copperpour");for(let copperPour of copperPours){let props=copperPour._parsedProps;if(!props.unbroken)continue;let net=copperPour.getSubcircuit().selectOne(props.connectsTo);if(!net?.source_net_id)continue;let layer=getLayerName2(props.layer),connectedTo=getCopperPourConnectedTo(net,connMap);if(connectedTo.length===0)continue;let boundary=getCopperPourBoundary({outline:props.outline,group,board});if(boundary){let rects=fillPolygonWithRects(boundary,{rectHeight:COPPER_POUR_RECT_HEIGHT});if(rects.length>0){obstacles.push(...rects.map(rect=>createCopperPourObstacle({layer,connectedTo,center:rect.center,width:rect.width,height:rect.height})));continue}}let boundsRect=getCopperPourBoundsRect({group,board});boundsRect&&obstacles.push(createCopperPourObstacle({layer,connectedTo,center:boundsRect.center,width:boundsRect.width,height:boundsRect.height}))}return obstacles},getSimpleRouteJsonFromCircuitJson=({db:db2,circuitJson,subcircuit_id,minTraceWidth,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaHoleDiameter,minViaPadDiameter,nominalTraceWidth,subcircuitComponent,fanoutPourNetMap,ignoreExistingTopLevelPcbRouteState=!1})=>{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=getDescendantSubcircuitIds2(db2,subcircuit_id);for(let id3 of descendantSubcircuitIds)relevantSubcircuitIds.add(id3)}let subcircuitElements=(circuitJson??db2.toArray()).filter(e6=>!subcircuit_id||"subcircuit_id"in e6&&relevantSubcircuitIds.has(e6.subcircuit_id)),board=null,subcircuitIsBoard=!1;if(subcircuit_id){let source_group_id=subcircuit_id.replace(/^subcircuit_/,""),source_board3=db2.source_board.getWhere({source_group_id});source_board3&&(board=db2.pcb_board.getWhere({source_board_id:source_board3.source_board_id}),board&&(subcircuitIsBoard=!0))}board||(board=db2.pcb_board.list()[0]),db2=su2(subcircuitElements);let getPortSelector=sourcePort=>{if(!sourcePort?.source_component_id)return;let sourceComponent=db2.source_component.get(sourcePort.source_component_id);if(sourceComponent?.name)return`${sourceComponent.name}.${sourcePort.name}`},pcbGroup=subcircuit_id?db2.pcb_group.getWhere({subcircuit_id}):void 0,activeRoutingPcbGroupId=subcircuitComponent?.pcb_group_id??(subcircuitIsBoard?void 0:pcbGroup?.pcb_group_id),sharedConnMap=getFullConnectivityMapFromCircuitJson(subcircuitElements),breakoutPoints=db2.pcb_breakout_point.list().filter(bp3=>!subcircuit_id||relevantSubcircuitIds?.has(bp3.subcircuit_id)),breakoutPointIsInActiveRoutingGroup=breakoutPoint=>breakoutPoint.subcircuit_id===subcircuit_id&&(activeRoutingPcbGroupId?breakoutPoint.pcb_group_id===activeRoutingPcbGroupId:!subcircuitIsBoard),obstacles=getObstaclesFromCircuitJson2([...board?[board]:[],...db2.source_component.list(),...db2.source_port.list(),...db2.pcb_port.list(),...db2.pcb_component.list(),...db2.pcb_smtpad.list(),...db2.pcb_plated_hole.list(),...db2.pcb_hole.list(),...db2.pcb_trace.list().filter(trace=>!trace.source_trace_id),...db2.pcb_via.list().filter(via=>!ignoreExistingTopLevelPcbRouteState||!!via.subcircuit_id),...db2.pcb_keepout.list(),...db2.pcb_cutout.list()].filter(e6=>e6.type==="pcb_board"||!subcircuit_id||relevantSubcircuitIds?.has(e6.subcircuit_id)),sharedConnMap);obstacles.push(...getUnbrokenCopperPourObstacles({connMap:sharedConnMap,subcircuitComponent,board,group:pcbGroup}));let preservedRoutedSubcircuitTraces=getPreservedRoutedSubcircuitTraces({scopedDb:db2,relevantSubcircuitIds});for(let obstacle of obstacles){let additionalIds=obstacle.connectedTo.flatMap(id3=>sharedConnMap.getIdsConnectedToNet(id3));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(o6=>[{x:o6.center.x-o6.width/2,y:o6.center.y-o6.height/2},{x:o6.center.x+o6.width/2,y:o6.center.y+o6.height/2}]).concat(board?.outline??[]),bounds,useGroupBoundsAsSrjBounds=!!(pcbGroup?.width&&pcbGroup.height&&subcircuit_id&&!subcircuitIsBoard);if(useGroupBoundsAsSrjBounds?bounds={minX:pcbGroup.center.x-pcbGroup.width/2,maxX:pcbGroup.center.x+pcbGroup.width/2,minY:pcbGroup.center.y-pcbGroup.height/2,maxY:pcbGroup.center.y+pcbGroup.height/2}: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(p3=>p3.x))-1,maxX:Math.max(...allPoints.map(p3=>p3.x))+1,minY:Math.min(...allPoints.map(p3=>p3.y))-1,maxY:Math.max(...allPoints.map(p3=>p3.y))+1},pcbGroup?.width&&pcbGroup.height&&!useGroupBoundsAsSrjBounds){let groupBounds={minX:pcbGroup.center.x-pcbGroup.width/2,maxX:pcbGroup.center.x+pcbGroup.width/2,minY:pcbGroup.center.y-pcbGroup.height/2,maxY:pcbGroup.center.y+pcbGroup.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 sourceTraceIdsAlreadyPreservedAsSrjTraces=new Set(db2.pcb_trace.list().filter(t53=>t53.source_trace_id?subcircuit_id?t53.subcircuit_id===subcircuit_id:t53.subcircuit_id?db2.source_trace.get(t53.source_trace_id)?.subcircuit_id===t53.subcircuit_id:!1:!1).map(t53=>t53.source_trace_id).filter(id3=>!!id3)),sourcePortIdToBreakoutPoint=new Map;for(let bp3 of breakoutPoints){let spId=bp3.source_port_id;spId&&sourcePortIdToBreakoutPoint.set(spId,bp3)}let getPcbPortRoutePoint=pcbPort=>{let layer=pcbPort.layers?.[0]??"top",breakoutPoint=sourcePortIdToBreakoutPoint.get(pcbPort.source_port_id),portSelector=getPortSelector(db2.source_port.get(pcbPort.source_port_id));return breakoutPoint&&!breakoutPointIsInActiveRoutingGroup(breakoutPoint)?{x:breakoutPoint.x,y:breakoutPoint.y,layer,pointId:breakoutPoint.pcb_breakout_point_id,port_selector:portSelector}:{x:pcbPort.x,y:pcbPort.y,layer,pointId:pcbPort.pcb_port_id,pcb_port_id:pcbPort.pcb_port_id,port_selector:portSelector}},sourceTraces=db2.source_trace.list(),planeTerminatedSourceTraceLayers=getPlaneTerminatedSourceTraceLayers({fanoutPourNetMap,sourceNets:db2.source_net.list(),sourceTraces,subcircuitId:subcircuit_id}),directTraceConnections=sourceTraces.filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id).map(trace=>{let connectedPcbPorts=trace.connected_source_port_ids.map(sourcePortId=>db2.pcb_port.getWhere({source_port_id:sourcePortId})).filter(pcbPort=>pcbPort!==null),isPlaneTerminatedSourceTrace=planeTerminatedSourceTraceLayers.has(trace.source_trace_id);if(connectedPcbPorts.length<2&&!(isPlaneTerminatedSourceTrace&&connectedPcbPorts.length===1))return null;for(let connectedPort of connectedPcbPorts)if(connectedPort.x===void 0||connectedPort.y===void 0)return console.error(`(source_port_id: ${connectedPort.source_port_id}) for trace ${trace.source_trace_id} does not have x/y coordinates. Skipping this trace.`),null;let connectedPcbPortIds=new Set(connectedPcbPorts.map(port=>port.pcb_port_id)),matchingHints=traceHints.filter(hint=>connectedPcbPortIds.has(hint.pcb_port_id)),hintPoints=[];for(let hint of matchingHints){let layer=db2.pcb_port.get(hint.pcb_port_id)?.layers?.[0]??"top";for(let pt3 of hint.route)hintPoints.push({x:pt3.x,y:pt3.y,layer})}let connectedPortRoutePoints=connectedPcbPorts.map(port=>getPcbPortRoutePoint(port)),[firstConnectedPortRoutePoint,...remainingPortRoutePoints]=connectedPortRoutePoints;return{name:trace.source_trace_id??sharedConnMap.getNetConnectedToId(trace.source_trace_id)??"",source_trace_id:trace.source_trace_id,nominalTraceWidth:trace.min_trace_thickness,width:trace.min_trace_thickness,pointsToConnect:[firstConnectedPortRoutePoint,...hintPoints,...remainingPortRoutePoints]}}).filter(c3=>c3!==null),source_nets=db2.source_net.list().filter(e6=>!subcircuit_id||e6.subcircuit_id===subcircuit_id),connectionsFromNets=[],connectionFromNetId=new Map,handledNetConnectivityKeys=new Set,sourceNetIds=new Set(source_nets.map(net=>net.source_net_id)),currentSubcircuitSourceTraces=db2.source_trace.list().filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id),exposedBridgeSourceTraceIds=new Set((subcircuitComponent?.selectAll("trace")??[]).flatMap(trace=>{let candidate=trace;return candidate._exposesSubcircuitConnection&&candidate.source_trace_id?[candidate.source_trace_id]:[]})),exposedDescendantSourceNetIds=new Set;for(let trace of currentSubcircuitSourceTraces)if(exposedBridgeSourceTraceIds.has(trace.source_trace_id))for(let sourceNetId of trace.connected_source_net_ids??[])sourceNetIds.has(sourceNetId)||exposedDescendantSourceNetIds.add(sourceNetId);let routedDescendantSourceTraceIds=new Set(subcircuit_id?db2.pcb_trace.list().filter(trace=>trace.subcircuit_id&&trace.subcircuit_id!==subcircuit_id&&relevantSubcircuitIds?.has(trace.subcircuit_id)).map(trace=>trace.source_trace_id).filter(id3=>!!id3):[]),sourceTracesEligibleForNetConnections=db2.source_trace.list().filter(trace=>!planeTerminatedSourceTraceLayers.has(trace.source_trace_id)).filter(trace=>!sourceTraceIdsAlreadyPreservedAsSrjTraces.has(trace.source_trace_id)||subcircuit_id!=null&&trace.subcircuit_id===subcircuit_id).filter(trace=>!subcircuit_id||trace.subcircuit_id===subcircuit_id||(trace.connected_source_net_ids?.some(id3=>sourceNetIds.has(id3))??!1)||(trace.connected_source_net_ids?.some(id3=>exposedDescendantSourceNetIds.has(id3))??!1)&&!routedDescendantSourceTraceIds.has(trace.source_trace_id)),getSourceConnectivityKey=id3=>id3?sharedConnMap.getNetConnectedToId(id3)??id3:null;for(let net of source_nets){let netConnectivityKey=getSourceConnectivityKey(net.source_net_id);if(!netConnectivityKey||handledNetConnectivityKeys.has(netConnectivityKey))continue;handledNetConnectivityKeys.add(netConnectivityKey);let connectedSourceNetIds=source_nets.filter(sourceNet=>getSourceConnectivityKey(sourceNet.source_net_id)===netConnectivityKey).map(sourceNet=>sourceNet.source_net_id),connectedSourceTraces=sourceTracesEligibleForNetConnections.filter(st3=>[st3.source_trace_id,...st3.connected_source_net_ids??[]].some(id3=>getSourceConnectivityKey(id3)===netConnectivityKey)),nominalTraceWidthFromConnectedTraces;for(let sourceTrace of connectedSourceTraces)sourceTrace.min_trace_thickness!==void 0&&(nominalTraceWidthFromConnectedTraces=Math.max(nominalTraceWidthFromConnectedTraces??0,sourceTrace.min_trace_thickness));let pointsToConnect=[],addedPointIds=new Set;for(let st3 of connectedSourceTraces){let pcb_ports=db2.pcb_port.list().filter(p3=>st3.connected_source_port_ids.includes(p3.source_port_id));for(let p3 of pcb_ports){let routePoint=getPcbPortRoutePoint(p3);addedPointIds.has(routePoint.pointId)||(addedPointIds.add(routePoint.pointId),pointsToConnect.push(routePoint))}}let connection={name:net.source_net_id??sharedConnMap.getNetConnectedToId(net.source_net_id),nominalTraceWidth:nominalTraceWidthFromConnectedTraces,width:nominalTraceWidthFromConnectedTraces,pointsToConnect};if(pointsToConnect.length!==0){connectionsFromNets.push(connection);for(let sourceNetId of connectedSourceNetIds)connectionFromNetId.set(sourceNetId,connection)}}let connectionsFromBreakoutPoints=[];for(let bp3 of breakoutPoints){let bpSourcePortId=bp3.source_port_id,pt3={x:bp3.x,y:bp3.y,layer:"top",pointId:bp3.pcb_breakout_point_id};if(bpSourcePortId){let pcb_port3=db2.pcb_port.getWhere({source_port_id:bpSourcePortId});if(!pcb_port3)continue;let portPt={x:pcb_port3.x,y:pcb_port3.y,layer:pcb_port3.layers?.[0]??"top",pointId:pcb_port3.pcb_port_id,pcb_port_id:pcb_port3.pcb_port_id,port_selector:getPortSelector(db2.source_port.get(pcb_port3.source_port_id))},isInActiveRoutingGroup=breakoutPointIsInActiveRoutingGroup(bp3),isInTransparentChildRoutingGroup=!isInActiveRoutingGroup&&bp3.subcircuit_id===subcircuit_id;if(isInActiveRoutingGroup||isInTransparentChildRoutingGroup){connectionsFromBreakoutPoints.push({name:isInTransparentChildRoutingGroup?`breakout:${bp3.pcb_breakout_point_id}`:bpSourcePortId,source_trace_id:bp3.source_trace_id,routingPcbGroupId:isInTransparentChildRoutingGroup?bp3.pcb_group_id:void 0,pointsToConnect:[portPt,pt3]});continue}bp3.source_trace_id||connectionsFromBreakoutPoints.push({name:bpSourcePortId,pointsToConnect:[portPt,pt3]});continue}if(bp3.source_net_id){let conn=connectionFromNetId.get(bp3.source_net_id);conn?conn.pointsToConnect.push(pt3):connectionsFromBreakoutPoints.push({name:bp3.source_net_id,pointsToConnect:[pt3]})}}let routableConnectionsFromNets=connectionsFromNets.filter(connection=>connection.pointsToConnect.length>=2),allConns=[...directTraceConnections,...routableConnectionsFromNets,...connectionsFromBreakoutPoints],defaultTraceWidth=minTraceWidth??board?.min_trace_width??.1;for(let conn of allConns)conn.nominalTraceWidth??(conn.nominalTraceWidth=nominalTraceWidth??defaultTraceWidth),conn.width??(conn.width=nominalTraceWidth??defaultTraceWidth);bounds=expandSrjBoundsToIncludeConnectionPoints({bounds,connections:allConns});let differentialPairs=subcircuitComponent?.selectAll("differentialpair")??[],buses=subcircuitComponent?.selectAll("bus")??[],srjDifferentialPairs=getDifferentialPairsForSimpleRouteJson({srjConnections:allConns,differentialPairs,sourceTraces:db2.source_trace.list(),subcircuitId:subcircuit_id}),srjBuses=getBusesForSimpleRouteJson({srjConnections:allConns,buses,sourceTraces:db2.source_trace.list(),subcircuitId:subcircuit_id,planeTerminatedSourceTraceLayers});if(subcircuit_id){let pointIdToConn=new Map;for(let conn of allConns)for(let pt3 of conn.pointsToConnect)pt3.pointId&&pointIdToConn.set(pt3.pointId,conn);let existingTraces=db2.pcb_trace.list().filter(t53=>relevantSubcircuitIds?.has(t53.subcircuit_id));for(let tr3 of existingTraces){let tracePortIds=new Set;for(let seg of tr3.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]))}}let resolvedMinViaHoleDiameter=minViaHoleDiameter??board?.min_via_hole_diameter,resolvedMinViaPadDiameter=minViaPadDiameter??board?.min_via_pad_diameter,resolvedMinTraceToPadEdgeClearance=minTraceToPadEdgeClearance??board?.min_trace_to_pad_edge_clearance,resolvedMinViaEdgeToPadEdgeClearance=minViaEdgeToPadEdgeClearance??board?.min_via_edge_to_pad_edge_clearance,resolvedMinViaHoleEdgeToViaHoleEdgeClearance=minViaHoleEdgeToViaHoleEdgeClearance??board?.min_via_hole_edge_to_via_hole_edge_clearance,resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance=minPlatedHoleDrillEdgeToDrillEdgeClearance??board?.min_plated_hole_drill_edge_to_drill_edge_clearance,resolvedMinPadEdgeToPadEdgeClearance=minPadEdgeToPadEdgeClearance??board?.min_pad_edge_to_pad_edge_clearance,resolvedMinBoardEdgeClearance=minBoardEdgeClearance??board?.min_board_edge_clearance;return{simpleRouteJson:{bounds,obstacles,connections:allConns,differentialPairs:srjDifferentialPairs,...srjBuses?{buses:srjBuses}:{},traces:preservedRoutedSubcircuitTraces.length>0?preservedRoutedSubcircuitTraces:void 0,layerCount:board?.num_layers??2,minTraceWidth:Math.min(defaultTraceWidth,...allConns.map(c3=>c3.width)),minViaDiameter:resolvedMinViaPadDiameter,minViaHoleDiameter:resolvedMinViaHoleDiameter,minViaPadDiameter:resolvedMinViaPadDiameter,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,minTraceToPadEdgeClearance:resolvedMinTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance:resolvedMinViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance:resolvedMinViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance:resolvedMinPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance:resolvedMinPadEdgeToPadEdgeClearance,minBoardEdgeClearance:resolvedMinBoardEdgeClearance,nominalTraceWidth,outline:board?.outline?.map(point6=>({...point6}))},connMap:sharedConnMap}},unroutedElementTypes=new Set(["pcb_trace","pcb_trace_error"]),unrouteCircuitJson=circuitJson=>circuitJson.filter(element=>!unroutedElementTypes.has(element.type)),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 i6=0;i6<unqInputPinLabels.length;i6++)for(let label of unqInputPinLabels[i6])if(/^\d+$/.test(label)){desiredNumbers[i6]=Number.parseInt(label);break}let highestPinNumber=0,alreadyAcceptedDesiredNumbers=new Set;for(let i6=0;i6<desiredNumbers.length;i6++){let desiredNumber=desiredNumbers[i6];if(desiredNumber===null||desiredNumber<1)continue;if(!alreadyAcceptedDesiredNumbers.has(desiredNumber)){alreadyAcceptedDesiredNumbers.add(desiredNumber),result[i6].push(`pin${desiredNumber}`),highestPinNumber=Math.max(highestPinNumber,desiredNumber);continue}let existingAltsForPin=0;for(let label of result[i6])label.startsWith(`pin${desiredNumber}_alt`)&&existingAltsForPin++;result[i6].push(`pin${desiredNumber}_alt${existingAltsForPin+1}`)}for(let i6=0;i6<result.length;i6++)result[i6][0]?.includes("_alt")&&(highestPinNumber++,result[i6].unshift(`pin${highestPinNumber}`));for(let i6=0;i6<result.length;i6++)result[i6].length===0&&(highestPinNumber++,result[i6].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 i6=0;i6<unqInputPinLabels.length;i6++){let inputLabels=unqInputPinLabels[i6];for(let label of inputLabels)/^\d+$/.test(label)||(totalLabelCounts[label]===1?result[i6].push(label):(incrementalLabelCounts[label]=(incrementalLabelCounts[label]??0)+1,result[i6].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()})}};function getTitleAnchorAndPosition({anchor,x:x6,y:y2,width,height,isInside}){switch(anchor){case"top_left":return{x:x6,y:y2+height,textAnchor:isInside?"top_left":"bottom_left"};case"top_center":return{x:x6+width/2,y:y2+height,textAnchor:isInside?"top_center":"bottom_center"};case"top_right":return{x:x6+width,y:y2+height,textAnchor:isInside?"top_right":"bottom_right"};case"center_left":return{x:x6,y:y2+height/2,textAnchor:isInside?"center_left":"center_right"};case"center":return{x:x6+width/2,y:y2+height/2,textAnchor:"center"};case"center_right":return{x:x6+width,y:y2+height/2,textAnchor:isInside?"center_right":"center_left"};case"bottom_left":return{x:x6,y:y2,textAnchor:isInside?"bottom_left":"top_left"};case"bottom_center":return{x:x6+width/2,y:y2,textAnchor:isInside?"bottom_center":"top_center"};case"bottom_right":return{x:x6+width,y:y2,textAnchor:isInside?"bottom_right":"top_right"};default:return{x:x6+width/2,y:y2+height,textAnchor:"center"}}}var getSchematicBoxPinLabels=pinLabels=>pinLabels?Object.entries(pinLabels).map(([pinKey,pinLabel])=>{let pinNumber=getPinNumberFromPinLabelsKey(pinKey);if(pinNumber===null)throw new Error(`Invalid schematicbox pinLabels key "${pinKey}". Expected pin<number>.`);let pinAliases=typeof pinLabel=="string"?[pinLabel]:[...pinLabel];return{pinNumber,displayPinLabel:pinAliases[0]??pinKey,pinAliases}}):[],SchematicBox_doInitialSchematicComponentRender=schematicBox=>{if(schematicBox.root?.schematicDisabled)return;let{db:db2}=schematicBox.root,props=schematicBox._parsedProps;if(!props.chipRef)return;let referencedChip=schematicBox.getSubcircuit().selectOne(props.chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${props.chipRef}" for ${schematicBox.getString()}`);let schematicBoxPinLabels=getSchematicBoxPinLabels(props.pinLabels),pinLabelsByPinKey=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[`pin${pinNumber}`,displayPinLabel])),sourcePorts=db2.source_port.list({source_component_id:referencedChip.source_component_id}),dimensions=getAllDimensionsForSchematicBox({schWidth:props.width,schHeight:props.height,schPinSpacing:.2,pinCount:schematicBoxPinLabels.length,schPortArrangement:props.schPinArrangement,pinLabels:pinLabelsByPinKey}),center2=schematicBox._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),schematicSheetId=schematicBox._resolveSchematicSheetId(),portLabels=Object.fromEntries(schematicBoxPinLabels.map(({pinNumber,displayPinLabel})=>[String(pinNumber),displayPinLabel])),schematicComponent=db2.schematic_component.insert({center:center2,size:size3,source_component_id:referencedChip.source_component_id,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(props.schPinArrangement),port_labels:portLabels,pin_spacing:.2,schematic_sheet_id:schematicSheetId});schematicBox.schematic_component_id=schematicComponent.schematic_component_id;for(let{pinNumber,displayPinLabel,pinAliases}of schematicBoxPinLabels){let referencedSourcePort=sourcePorts.find(sourcePort=>pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)));if(!referencedSourcePort)throw new Error(`Could not find pin "${displayPinLabel}" on chipRef "${props.chipRef}"`);let portPosition=dimensions.getPortPositionByPinNumber(pinNumber);if(!portPosition)throw new Error(`Could not determine schematic position for ${schematicBox.getString()} pin${pinNumber}`);let facingDirection={left:"left",right:"right",top:"up",bottom:"down"}[portPosition.side];db2.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:{x:center2.x+portPosition.x,y:center2.y+portPosition.y},source_port_id:referencedSourcePort.source_port_id,facing_direction:facingDirection,distance_from_component_edge:.4,side_of_component:portPosition.side,pin_number:pinNumber,true_ccw_index:portPosition.trueIndex,display_pin_label:displayPinLabel,is_connected:!1,schematic_sheet_id:schematicSheetId})}let sectionName=props.name??props.chipRef;db2.schematic_text.insert({text:sectionName,schematic_component_id:schematicComponent.schematic_component_id,anchor:"left",rotation:0,position:{x:center2.x-size3.width/2,y:center2.y+size3.height/2+.13},color:"#006464",font_size:.18,schematic_sheet_id:schematicSheetId});let referencedSourceComponent=db2.source_component.get(referencedChip.source_component_id);db2.schematic_text.insert({text:referencedSourceComponent?.manufacturer_part_number??"",schematic_component_id:schematicComponent.schematic_component_id,anchor:"left",rotation:0,position:{x:center2.x-size3.width/2,y:center2.y-size3.height/2-.13},color:"#006464",font_size:.18,schematic_sheet_id:schematicSheetId})},SchematicBox=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicBox",zodProps:schematicBoxProps,shouldRenderAsSchematicBox:!0}}doInitialSchematicComponentRender(){SchematicBox_doInitialSchematicComponentRender(this)}doInitialSchematicPrimitiveRender(){if(this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this;if(props.chipRef)return;let 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,x6,y2,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(p3=>p3.position.x),ys3=portsWithPosition.map(p3=>p3.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,x6=left+(props.schX??0),y2=top+(props.schY??0),centerX=x6+width/2,centerY=y2+height/2}else if(hasFixedSize){width=props.width,height=props.height;let center2=this._getGlobalSchematicPositionBeforeLayout();centerX=center2.x,centerY=center2.y,x6=centerX-width/2,y2=centerY-height/2}else return;if(db2.schematic_box.insert({height,width,x:x6,y:y2,is_dashed:props.strokeStyle==="dashed",schematic_sheet_id:this._resolveSchematicSheetId()}),props.title){let isInside=props.titleInside,TITLE_PADDING=.1,anchor=props.titleAlignment,anchorPos=getTitleAnchorAndPosition({anchor,x:x6,y:y2,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,schematic_sheet_id:this._resolveSchematicSheetId()})}}},Group_doInitialAssignSchematicSheetToConnectedComponents=group=>{if(!group.isSubcircuit||group.root?.schematicDisabled)return;let{db:db2}=group.root,schematicSheetIdsBySubcircuitConnectivityMapKey=new Map,schematicBoxReferencedSourceComponentIds=new Set,schematicBoxes=group.getDescendants().filter(component=>component instanceof SchematicBox&&component.getSubcircuit()===group);for(let schematicBox of schematicBoxes){let{chipRef,pinLabels}=schematicBox._parsedProps,schematicSheetId=schematicBox._resolveSchematicSheetId();if(!chipRef||!schematicSheetId)continue;let referencedComponent=schematicBox.getSubcircuit().selectOne(chipRef);if(!(referencedComponent instanceof NormalComponent3)||!referencedComponent.source_component_id)continue;schematicBoxReferencedSourceComponentIds.add(referencedComponent.source_component_id);let referencedSourcePorts=db2.source_port.list({source_component_id:referencedComponent.source_component_id});for(let{pinAliases}of getSchematicBoxPinLabels(pinLabels)){let subcircuitConnectivityMapKey=referencedSourcePorts.find(sourcePort=>pinAliases.some(pinAlias=>sourcePort.name===pinAlias||sourcePort.port_hints?.includes(pinAlias)))?.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey)??new Set;schematicSheetIds.add(schematicSheetId),schematicSheetIdsBySubcircuitConnectivityMapKey.set(subcircuitConnectivityMapKey,schematicSheetIds)}}let normalComponents=group.getDescendants().filter(component=>component instanceof NormalComponent3&&component.getSubcircuit()===group);for(let normalComponent of normalComponents){if(!normalComponent.source_component_id||schematicBoxReferencedSourceComponentIds.has(normalComponent.source_component_id)||normalComponent._resolveSchematicSheetId())continue;let connectedSchematicSheetIds=new Set,sourcePorts=db2.source_port.list({source_component_id:normalComponent.source_component_id});for(let sourcePort of sourcePorts){let subcircuitConnectivityMapKey=sourcePort.subcircuit_connectivity_map_key;if(!subcircuitConnectivityMapKey)continue;let schematicSheetIds=schematicSheetIdsBySubcircuitConnectivityMapKey.get(subcircuitConnectivityMapKey);if(schematicSheetIds)for(let schematicSheetId of schematicSheetIds)connectedSchematicSheetIds.add(schematicSheetId)}if(connectedSchematicSheetIds.size!==1)continue;let[inferredSchematicSheetId]=connectedSchematicSheetIds;inferredSchematicSheetId&&(normalComponent.schematic_sheet_id=inferredSchematicSheetId)}},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,x6=pcbComponent.center.x,y2=pcbComponent.center.y;setSubcircuitPcbComponentCalcVariables({vars,componentName:component.name,position:{x:x6,y:y2},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=getBoundsFromPoints2(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(size3=>size3!==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 size3=child._getMinimumFlexContainerSize();flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.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 i6=0;i6<pcbChildren.length;i6++){let child=pcbChildren[i6],childKey=child.getString()||`child-${i6}`,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 solvePackSolverWithTimeout=(solver,timeoutMs,getCurrentTime=()=>performance.now())=>{if(timeoutMs===void 0||!Number.isFinite(timeoutMs)||timeoutMs<=0)return solver.solve(),{elapsedMs:0,timedOut:!1};let startedAt=getCurrentTime(),elapsedMs=0;for(;!solver.solved&&!solver.failed&&(solver.step(),!(solver.solved||solver.failed));)if(elapsedMs=getCurrentTime()-startedAt,elapsedMs>=timeoutMs)return{elapsedMs,timedOut:!0};return{elapsedMs,timedOut:!1}},applyComponentConstraintClusters=(group,packInput)=>{let constraints=group.children.filter(c3=>c3.componentName==="Constraint"&&c3._parsedProps.pcb),clusterByRoot=new Map,parent={},find2=x6=>(parent[x6]!==x6&&(parent[x6]=find2(parent[x6])),parent[x6]),union2=(a6,b6)=>{let ra3=find2(a6),rb2=find2(b6);ra3!==rb2&&(parent[rb2]=ra3)},makeSet=x6=>{x6 in parent||(parent[x6]=x6)},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 a6=getIdFromSelector(props.left),b6=getIdFromSelector(props.right);a6&&b6&&(makeSet(a6),makeSet(b6),union2(a6,b6))}else if("top"in props&&"bottom"in props){let a6=getIdFromSelector(props.top),b6=getIdFromSelector(props.bottom);a6&&b6&&(makeSet(a6),makeSet(b6),union2(a6,b6))}else if("for"in props&&Array.isArray(props.for)){let ids=props.for.map(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);for(let id3 of ids)makeSet(id3);for(let i6=1;i6<ids.length;i6++)union2(ids[0],ids[i6])}}for(let id3 of Object.keys(parent)){let rootId=find2(id3);clusterByRoot.has(rootId)||clusterByRoot.set(rootId,{componentIds:[],constraints:[]}),clusterByRoot.get(rootId).componentIds.push(id3)}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=(id3,axis)=>{let key=`${id3}_${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(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);if(ids.length>1){let base=getVar(ids[0],"x");for(let i6=1;i6<ids.length;i6++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i6],"x"),[-1,base]),Operator.Eq,0,Strength.required))}}else if("sameY"in props&&Array.isArray(props.for)){let ids=props.for.map(s6=>getIdFromSelector(s6)).filter(s6=>!!s6);if(ids.length>1){let base=getVar(ids[0],"y");for(let i6=1;i6<ids.length;i6++)solver.addConstraint(new Constraint(new Expression(getVar(ids[i6],"y"),[-1,base]),Operator.Eq,0,Strength.required))}}}solver.updateVariables();let positions={};for(let id3 of info.componentIds)positions[id3]={x:getVar(id3,"x").value(),y:getVar(id3,"y").value()};let minX=1/0,minY=1/0,maxX=-1/0,maxY=-1/0;for(let id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];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 id3 of info.componentIds){let comp=packCompById[id3],pos=positions[id3];if(comp){relCenters[id3]={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,initialPackOutput)=>{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(g4=>g4.source_group_id===componentId);if(!pcbGroup)continue;let originalCenter=initialPackOutput.components.find(component=>component.componentId===componentId)?.center??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})}if(group.pcb_group_id){let groupPcbComponents=db2.pcb_component.list({pcb_group_id:group.pcb_group_id});group.calculatePcbGroupBounds(findBoundsAndCenter(groupPcbComponents))}},normalizeLayer=layer=>(layer??"top").toLowerCase(),getComponentLayer=(component,db2)=>{let layers=new Set,directPcbComponent=db2.pcb_component.get(component.componentId);directPcbComponent&&layers.add(normalizeLayer(directPcbComponent.layer));for(let pad2 of component.pads){let via=db2.pcb_via.get(pad2.padId),pcbComponentId=db2.pcb_smtpad.get(pad2.padId)?.pcb_component_id??db2.pcb_plated_hole.get(pad2.padId)?.pcb_component_id??via?.pcb_component_id;if(!pcbComponentId)continue;let pcbComponent=db2.pcb_component.get(pcbComponentId);pcbComponent&&layers.add(normalizeLayer(pcbComponent.layer))}return layers.size===1?layers.values().next().value:void 0},getPackInputsByPcbLayer=(packInput,db2)=>{let componentsByLayer=new Map;for(let component of packInput.components){let layer=getComponentLayer(component,db2);if(!layer)return[packInput];let components=componentsByLayer.get(layer)??[];components.push(component),componentsByLayer.set(layer,components)}if(componentsByLayer.size<=1)return[packInput];let layerPriority=layer=>layer==="top"?0:layer==="bottom"?1:2;return Array.from(componentsByLayer.entries()).sort(([layerA],[layerB])=>layerPriority(layerA)-layerPriority(layerB)||layerA.localeCompare(layerB)).map(([,components])=>({...packInput,components}))},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 initialPackOutput=convertCircuitJsonToPackOutput(filteredCircuitJson,{source_group_id:group.source_group_id,chipMarginsMap,staticPcbComponentIds:Array.from(staticPcbComponentIds)}),packInput={...convertPackOutputToPackInput(initialPackOutput),packOrderStrategy:packOrderStrategy??"largest_to_smallest",packPlacementStrategy: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 packInputs=getPackInputsByPcbLayer(packInput,db2),packOutput={...packInput,components:[]},packingFailed=!1,reportPackingError=solverErrorMessage=>{let message=`Unable to pack all PCB components within the layout bounds: ${solverErrorMessage}`;db2.pcb_packing_error.insert({error_type:"pcb_packing_error",message,pcb_group_id:group.pcb_group_id??void 0,subcircuit_id:group.subcircuit_id??void 0}),group.root?.emit("packing:error",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString(),error:{message}})};try{for(let layerPackInput of packInputs){let componentIdsForLayer=new Set(layerPackInput.components.map(component=>component.componentId)),networkReferenceComponents=packOutput.components.map(component=>({...component,componentId:`network_reference_${component.componentId}`,isStatic:!0,courtyard:{offsetFromCenter:{x:0,y:0},width:Number.EPSILON,height:Number.EPSILON}})),solverInput={...layerPackInput,components:[...networkReferenceComponents,...layerPackInput.components]},solver=new PackSolver2(solverInput),solverParams=solver.getConstructorParams();group.root?.emit("solver:started",{type:"solver:started",solverName:"PackSolver2",solverParams,solverConstructorArgs:[solverParams],componentName:group.getString()});let pcbPackSolverTimeoutMs=group.root?.platform?.pcbPackSolverTimeoutMs,{timedOut}=solvePackSolverWithTimeout(solver,pcbPackSolverTimeoutMs);if(timedOut&&(packingFailed=!0,reportPackingError(`PackSolver2 timed out after ${pcbPackSolverTimeoutMs}ms`)),solver.failed){packingFailed=!0;let solverErrorMessage=solver.error??solver.activeSubSolver?.error??"No valid packing solution found";reportPackingError(solverErrorMessage)}if(packOutput.components.push(...solver.packedComponents.filter(component=>componentIdsForLayer.has(component.componentId))),timedOut)break}}catch(error2){throw reportPackingError(error2 instanceof Error?error2.message:String(error2)),error2}if(debug42.enabled&&global?.debugGraphics){let graphics=getGraphicsFromPackOutput(packOutput);graphics.title=`packOutput-${group.name}`,global.debugGraphics?.push(graphics)}applyPackOutput(group,packOutput,clusterMap,initialPackOutput),!packingFailed&&group.root?.emit("packing:end",{subcircuit_id:group.subcircuit_id,componentDisplayName:group.getString()})},parsePinNumberFromPortName=name=>{if(!name)return null;let match2=name.match(/^pin(\d+)$/i)??name.match(/^(\d+)$/);if(!match2)return null;let pinNumber=Number(match2[1]);return Number.isFinite(pinNumber)&&pinNumber>0?pinNumber:null},getDirectGroupPorts=group=>group.children.filter(child=>child.componentName==="Port"),normalizeGroupSchematicBoxPorts=group=>{let{db:db2}=group.root,ports=getDirectGroupPorts(group);for(let port of ports){if(port._parsedProps.pinNumber!==void 0)continue;let pinNumber=parsePinNumberFromPortName(port._parsedProps.name);pinNumber!==null&&(port._parsedProps.pinNumber=pinNumber)}let usedPinNumbers=new Set(ports.map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0)),nextPinNumber=1;for(let port of ports){if(port._parsedProps.pinNumber===void 0){for(;usedPinNumbers.has(nextPinNumber);)nextPinNumber++;port._parsedProps.pinNumber=nextPinNumber,usedPinNumbers.add(nextPinNumber)}port.source_port_id&&db2.source_port.update(port.source_port_id,{pin_number:port._parsedProps.pinNumber,port_hints:port.getNameAndAliases()})}},getGroupSchematicBoxPinLabels=group=>{let pinLabels={};for(let port of getDirectGroupPorts(group)){let pinNumber=port._parsedProps.pinNumber,name=port._parsedProps.name;pinNumber===void 0||!name||name===`pin${pinNumber}`||name===String(pinNumber)||(pinLabels[`pin${pinNumber}`]=name)}return pinLabels},Group_doInitialSchematicBoxComponentRender=group=>{if(group.root?.schematicDisabled)return;let{db:db2}=group.root,props=group._parsedProps;props.schPinSpacing!==void 0&&db2.source_property_ignored_warning.insert({source_component_id:group.source_group_id??"",property_name:"schPinSpacing",error_type:"source_property_ignored_warning",message:"schPinSpacing is deprecated and will be ignored. Pin spacing is always 0.2."}),normalizeGroupSchematicBoxPorts(group);let dimensions=group._getSchematicBoxDimensions();if(!dimensions)return;let center2=group._getGlobalSchematicPositionBeforeLayout(),size3=dimensions.getSize(),portLabels=group._getPinLabelsFromPorts(),schPortArrangement=group._getSchematicPortArrangement(),schematicComponent=db2.schematic_component.insert({center:center2,size:size3,source_group_id:group.source_group_id,schematic_group_id:group.schematic_group_id??void 0,subcircuit_id:group.subcircuit_id??group.getSubcircuit()?.subcircuit_id??void 0,is_schematic_group:!0,is_box_with_pins:!0,port_arrangement:underscorifyPortArrangement(schPortArrangement),pin_spacing:.2,pin_styles:underscorifyPinStyles(props.schPinStyle,portLabels),port_labels:portLabels,schematic_sheet_id:group._resolveSchematicSheetId()});group.schematic_component_id=schematicComponent.schematic_component_id,group.schematic_group_id&&db2.schematic_group.update(group.schematic_group_id,{center:center2,width:size3.width,height:size3.height,schematic_component_ids:[schematicComponent.schematic_component_id]});let title=props.schTitle??props.name;title&&db2.schematic_text.insert({text:title,schematic_component_id:schematicComponent.schematic_component_id,anchor:"left",rotation:0,position:{x:center2.x-size3.width/2,y:center2.y+size3.height/2+.13},color:"#006464",font_size:.18,schematic_sheet_id:group._resolveSchematicSheetId()})},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(size3=>size3!==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 size3=getSizeOfTreeNodeChild(db2,child);flexBox.addChild({metadata:child,width:size3?.width??0,height:size3?.height??0,flexBasis:size3?direction2==="row"?size3.width:size3.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 i6=0;i6<schematicChildren.length;i6++){let child=schematicChildren[i6];if(!child.schematic_component_id)continue;let row=Math.floor(i6/numCols),col=i6%numCols;if(row>=numRows||col>=numCols){console.warn(`Schematic grid layout: Child ${child.getString()} at index ${i6} (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});if(subtreeCircuitJson.filter(item=>item.type==="source_component").length<=1)return;let floatingGraph=convertCircuitJsonToBpc(subtreeCircuitJson);debug52.enabled&&global?.debugGraphics&&global.debugGraphics?.push(getGraphicsForBpcGraph(floatingGraph,{title:`floatingBpcGraph-${group.name}`}));let floatingGraphNoNotConnected={boxes:floatingGraph.boxes,pins:floatingGraph.pins.map(p3=>({...p3,color:p3.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(p3=>p3.boxId===box2.boxId).filter(bp3=>!bp3.color.includes("center")).length<=2).map(b6=>b6.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_component22=db2.schematic_component.get(box2.boxId);if(schematic_component22){let newCenter={x:box2.center.x+groupOffset.x,y:box2.center.y+groupOffset.y},ports=db2.schematic_port.list({schematic_component_id:schematic_component22.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schematic_component22.schematic_component_id}),positionDelta={x:newCenter.x-schematic_component22.center.x,y:newCenter.y-schematic_component22.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_component22.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y}),schematic_component22.center=newCenter;continue}let schematic_net_label3=db2.schematic_net_label.get(box2.boxId);if(schematic_net_label3){let pin=laidOutBpcGraph.pins.find(p3=>p3.boxId===box2.boxId&&p3.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_label3.center=finalCenter,schematic_net_label3.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`)}}function getSchematicTextWidth({text,fontSize}){let charWidth=.12*(fontSize/.18);return text.length*charWidth}var SYMBOL_TEXT_FONT_SIZE=.18,TEXT_BOX_ENABLED_FTYPES=new Set(["simple_resistor","simple_capacitor","simple_inductor","simple_crystal","simple_resonator","simple_potentiometer","simple_fuse","simple_diode","simple_led","simple_transistor","simple_mosfet","simple_op_amp","simple_voltage_source","simple_test_point"]);function getTextBounds({text,position:position4,anchor,fontSize}){let width=getSchematicTextWidth({text,fontSize}),height=fontSize,relMinX,relMaxX;anchor.includes("left")?(relMinX=0,relMaxX=width):anchor.includes("right")?(relMinX=-width,relMaxX=0):(relMinX=-width/2,relMaxX=width/2);let relMinY,relMaxY;return anchor.includes("top")?(relMinY=-height,relMaxY=0):anchor.includes("bottom")?(relMinY=0,relMaxY=height):(relMinY=-height/2,relMaxY=height/2),{minX:position4.x+relMinX,maxX:position4.x+relMaxX,minY:position4.y+relMinY,maxY:position4.y+relMaxY}}function getSymbolTextBounds({schematicComponent,sourceComponent}){if(!schematicComponent.symbol_name)return[];let symbol=hc[schematicComponent.symbol_name];if(!symbol?.primitives||!symbol.center)return[];let textBounds=[];for(let primitive of symbol.primitives){if(primitive.type!=="text")continue;let value;primitive.text==="{REF}"?value=sourceComponent?.display_name??sourceComponent?.name??"":primitive.text==="{VAL}"?value=schematicComponent.symbol_display_value??"":value=primitive.text??"",value&&textBounds.push(getTextBounds({text:value,position:{x:primitive.x-symbol.center.x+schematicComponent.center.x,y:primitive.y-symbol.center.y+schematicComponent.center.y},anchor:primitive.anchor??"center",fontSize:SYMBOL_TEXT_FONT_SIZE}))}return textBounds}function getSymbolBoxBounds(schematicComponent){return getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height})}function getSchematicComponentTextInclusiveBounds(db2,schematicComponent){if(!schematicComponent.center||!schematicComponent.size)return null;let sourceComponent=schematicComponent.source_component_id?db2.source_component.get(schematicComponent.source_component_id):void 0;if(!sourceComponent||!TEXT_BOX_ENABLED_FTYPES.has(sourceComponent.ftype))return null;let textBounds=getSymbolTextBounds({schematicComponent,sourceComponent});if(textBounds.length===0)return null;let boxBounds=getSymbolBoxBounds(schematicComponent),bounds={...boxBounds};for(let textBound of textBounds)bounds.minX=Math.min(bounds.minX,textBound.minX),bounds.maxX=Math.max(bounds.maxX,textBound.maxX),bounds.minY=Math.min(bounds.minY,textBound.minY),bounds.maxY=Math.max(bounds.maxY,textBound.maxY);return bounds.minX===boxBounds.minX&&bounds.maxX===boxBounds.maxX&&bounds.minY===boxBounds.minY&&bounds.maxY===boxBounds.maxY?null:bounds}function getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees){let size3=schematicComponent.size;return size3&&(size3=getRotatedSize2(size3,ccwRotationDegrees)),{...schematicComponent,symbol_name:getRotatedSymbolName(schematicComponent.symbol_name,ccwRotationDegrees),size:size3}}function getSchematicComponentWithTextBounds({db:db2,schematicComponent,ccwRotationDegrees=0}){let orientedComponent=getOrientedSchematicComponent(schematicComponent,ccwRotationDegrees),textBounds=getSchematicComponentTextInclusiveBounds(db2,orientedComponent);if(!textBounds)return null;let boxBounds=getSymbolBoxBounds(orientedComponent);if(orientedComponent.size.height>orientedComponent.size.width)return textBounds;let padLeft=Math.max(0,boxBounds.minX-textBounds.minX),padRight=Math.max(0,textBounds.maxX-boxBounds.maxX),padTop=Math.max(0,textBounds.maxY-boxBounds.maxY),padBottom=Math.max(0,boxBounds.minY-textBounds.minY),left=padLeft,right=padRight;padLeft>0&&padRight>0&&(left=Math.max(padLeft,padRight),right=left);let top=padTop,bottom=padBottom;return padTop>0&&padBottom>0&&(top=Math.max(padTop,padBottom),bottom=top),{minX:boxBounds.minX-left,maxX:boxBounds.maxX+right,minY:boxBounds.minY-bottom,maxY:boxBounds.maxY+top}}var debug62=(0,import_debug14.default)("Group_doInitialSchematicLayoutMatchpack"),DEFAULT_AVAILABLE_ROTATIONS=[0,90,180,270],ROTATION_TO_PLACE_SIDE_ON_TOP={"y+":0,"x+":90,"y-":180,"x-":270};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 getPowerGroundForcedRotation(db2,ports){if(ports.length!==2)return null;let powerGroundRotations=new Set;for(let port of ports){let connectivityKey=db2.source_port.get(port.source_port_id)?.subcircuit_connectivity_map_key;if(!connectivityKey)continue;let net=db2.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey});if(!net)continue;let isGround=net.is_ground??!1,isPositiveVoltageSource=net.is_power===!0||net.is_positive_voltage_source===!0;if(isPositiveVoltageSource===isGround)continue;let rotationToPlacePinOnTop=ROTATION_TO_PLACE_SIDE_ON_TOP[facingDirectionToSide(port.facing_direction)],rotation42=isPositiveVoltageSource?rotationToPlacePinOnTop:(rotationToPlacePinOnTop+180)%360;powerGroundRotations.add(rotation42)}return powerGroundRotations.size===1?powerGroundRotations.values().next().value:null}function getChipSize({db:db2,schematicComponent,component,ccwRotationDegrees}){let orientedSymbolSize=schematicComponent.size;orientedSymbolSize&&(orientedSymbolSize=getRotatedSize2(orientedSymbolSize,ccwRotationDegrees));let componentWithTextBounds=getSchematicComponentWithTextBounds({db:db2,schematicComponent,ccwRotationDegrees}),textPadLeft=0,textPadRight=0,textPadTop=0,textPadBottom=0;if(componentWithTextBounds&&schematicComponent.center){let halfWidth=(orientedSymbolSize?.width??0)/2,halfHeight=(orientedSymbolSize?.height??0)/2;textPadLeft=schematicComponent.center.x-halfWidth-componentWithTextBounds.minX,textPadRight=componentWithTextBounds.maxX-(schematicComponent.center.x+halfWidth),textPadTop=componentWithTextBounds.maxY-(schematicComponent.center.y+halfHeight),textPadBottom=schematicComponent.center.y-halfHeight-componentWithTextBounds.minY}let marginLeft=(component?._parsedProps?.schMarginLeft??component?._parsedProps?.schMarginX??0)+textPadLeft,marginRight=(component?._parsedProps?.schMarginRight??component?._parsedProps?.schMarginX??0)+textPadRight,marginTop=(component?._parsedProps?.schMarginTop??component?._parsedProps?.schMarginY??0)+textPadTop,marginBottom=(component?._parsedProps?.schMarginBottom??component?._parsedProps?.schMarginY??0)+textPadBottom;component?.config.shouldRenderAsSchematicBox&&(marginTop+=.4,marginBottom+=.4);let orientedFootprint={width:(orientedSymbolSize?.width||1)+marginLeft+marginRight,height:(orientedSymbolSize?.height||1)+marginTop+marginBottom},chipSize=getRotatedSize2(orientedFootprint,ccwRotationDegrees);return{x:chipSize.width,y:chipSize.height}}function getReservedChipSize({db:db2,schematicComponent,component,ccwRotationDegrees,chipGap}){let unrotatedSize=getChipSize({db:db2,schematicComponent,component,ccwRotationDegrees:0});if(!shouldSwapOrientation(ccwRotationDegrees))return unrotatedSize;let rotatedSize=getChipSize({db:db2,schematicComponent,component,ccwRotationDegrees});return rotatedSize.x-unrotatedSize.x>=chipGap||rotatedSize.y-unrotatedSize.y>=chipGap?rotatedSize:unrotatedSize}function getNestedGroupMatchpackProxy({db:db2,schematicGroup,groupComponents,groupInstance}){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,hasValidBounds=!1;for(let component of groupComponents){if(!component.center||!component.size)continue;hasValidBounds=!0;let componentBounds=getSchematicComponentWithTextBounds({db:db2,schematicComponent:component})??getBoundFromCenteredRect({center:component.center,width:component.size.width,height:component.size.height});minX=Math.min(minX,componentBounds.minX),maxX=Math.max(maxX,componentBounds.maxX),minY=Math.min(minY,componentBounds.minY),maxY=Math.max(maxY,componentBounds.maxY)}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,contentCenter=hasValidBounds?{x:(minX+maxX)/2,y:(minY+maxY)/2}:schematicGroup.center??{x:0,y:0};return{center:{x:contentCenter.x+(marginRight-marginLeft)/2,y:contentCenter.y+(marginTop-marginBottom)/2},size:{x:(hasValidBounds?maxX-minX:2)+marginLeft+marginRight,y:(hasValidBounds?maxY-minY:2)+marginTop+marginBottom}}}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 getTreeChildChipId(child,index){return child.nodeType==="component"&&child.sourceComponent?child.sourceComponent.name||`chip_${index}`:child.nodeType==="group"&&child.sourceGroup?child.sourceGroup.name||`group_${index}`:null}var getSchematicComponentForSourceComponent=({db:db2,sourceComponentId,schematicSheetId})=>db2.schematic_component.getWhere({source_component_id:sourceComponentId,...schematicSheetId?{schematic_sheet_id:schematicSheetId}:{}});function convertTreeToMatchPackInputProblem(tree,db2,group,opts={}){let problem={chipMap:{},chipPinMap:{},netMap:{},pinStrongConnMap:{},netConnMap:{},chipGap:.6,decouplingCapsGap:.4,partitionGap:1.2},nestedGroupMatchpackProxyMap={},groupOffset=group._getGlobalSchematicPositionBeforeLayout();debug62(`[${group.name}] Processing ${tree.childNodes.length} child nodes for input problem`),tree.childNodes.forEach((child,index)=>{let explicitlyPositioned=isTreeChildExplicitlyPositioned(child,group);if(debug62(explicitlyPositioned?`[${group.name}] Child ${index} explicitly positioned, including as fixed chip`:`[${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=getTreeChildChipId(child,index),schematicComponent=getSchematicComponentForSourceComponent({db:db2,sourceComponentId:child.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});if(!schematicComponent)return;let component=group.children.find(groupChild=>groupChild.source_component_id===child.sourceComponent?.source_component_id),ports=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id}),availableRotations=[...DEFAULT_AVAILABLE_ROTATIONS];if(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]),availableRotations.length===DEFAULT_AVAILABLE_ROTATIONS.length){let forcedRotation=getPowerGroundForcedRotation(db2,ports);forcedRotation!==null&&(availableRotations=[forcedRotation])}let ccwRotationDegrees=availableRotations.length===1?availableRotations[0]:0;problem.chipMap[chipId]={chipId,pins:[],size:getReservedChipSize({db:db2,schematicComponent,component,ccwRotationDegrees,chipGap:problem.chipGap}),isCapacitor:child.sourceComponent.ftype==="simple_capacitor",isCrystal:child.sourceComponent.ftype==="simple_crystal",isResistor:child.sourceComponent.ftype==="simple_resistor",isTestPoint:child.sourceComponent.ftype==="simple_test_point",availableRotations,...explicitlyPositioned&&{fixedPosition:{x:schematicComponent.center.x-groupOffset.x,y:schematicComponent.center.y-groupOffset.y}}};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),y:(port.center?.y||0)-(schematicComponent.center.y||0)},side}}}else if(child.nodeType==="group"&&child.sourceGroup){let groupId=getTreeChildChipId(child,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 matchpackProxy=getNestedGroupMatchpackProxy({db:db2,schematicGroup,groupComponents,groupInstance});nestedGroupMatchpackProxyMap[groupId]=matchpackProxy,debug62(`[${group.name}] Group ${groupId} computed proxy: ${matchpackProxy.size.x} x ${matchpackProxy.size.y} centered at (${matchpackProxy.center.x}, ${matchpackProxy.center.y})`);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 side=facingDirectionToSide(port.facing_direction);problem.chipPinMap[pinId]={pinId,offset:{x:(port.center?.x||0)-matchpackProxy.center.x,y:(port.center?.y||0)-matchpackProxy.center.y},side}}}debug62(`[${group.name}] Group ${groupId} has ${groupPins.length} pins:`,groupPins),problem.chipMap[groupId]={chipId:groupId,pins:groupPins,size:matchpackProxy.size},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=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);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){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}`),pins.length>=2&&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=>getTreeChildChipId(child,tree.childNodes.indexOf(child))===chipId);treeNode?.nodeType==="component"&&treeNode.sourceComponent&&db2.source_port.list({source_component_id:treeNode.sourceComponent.source_component_id}).some(p3=>p3.source_port_id===portId)&&directlyConnectedPins.push(pinId)}}for(let i6=0;i6<directlyConnectedPins.length;i6++)for(let j6=i6+1;j6<directlyConnectedPins.length;j6++){let pin1=directlyConnectedPins[i6],pin2=directlyConnectedPins[j6];problem.pinStrongConnMap[`${pin1}-${pin2}`]=!0,problem.pinStrongConnMap[`${pin2}-${pin1}`]=!0,debug62(`[${group.name}] Created strong connection: ${pin1} <-> ${pin2}`)}}}if(hasNetConnections){let source_net3=db2.source_net.getWhere({subcircuit_connectivity_map_key:connectivityKey}),isGround=source_net3?.is_ground??!1,isPositiveVoltageSource=source_net3?.is_power===!0||source_net3?.is_positive_voltage_source===!0;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{inputProblem:problem,nestedGroupMatchpackProxyMap}}function applySchematicMatchPackLayoutToTree(group,tree,opts={}){let{db:db2}=group.root;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,nestedGroupMatchpackProxyMap}=convertTreeToMatchPackInputProblem(tree,db2,group,opts);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(group.root?.emit("solver:started",{type:"solver:started",solverName:"LayoutPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:group.getString()}),debug62("Starting LayoutPipelineSolver..."),debug62.enabled&&global?.debugGraphics){let initialViz=solver.visualize();global.debugGraphics.push({...initialViz,title:`matchpack-initial-${group.name}`})}if(solver.solve(),group.root?.emit("solver:ended",{type:"solver:ended",solverName:"LayoutPipelineSolver",componentName:group.getString(),solved:solver.solved,failed:solver.failed,iterations:solver.iterations,error:solver.error}),debug62(`Solver completed in ${solver.iterations} iterations`),debug62(`Solved: ${solver.solved}, Failed: ${solver.failed}`),solver.failed){let solverError=solver.error??"Unknown Matchpack failure";debug62(`Solver failed with error: ${solverError}`),db2.schematic_layout_error.insert({error_type:"schematic_layout_error",message:`Matchpack layout solver failed: ${solverError}`,is_fatal:!1,source_group_id:group.source_group_id,schematic_group_id:group.schematic_group_id,subcircuit_id:group.subcircuit_id??void 0});return}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=>{let expectedChipId=getTreeChildChipId(child,tree.childNodes.indexOf(child)),matches=expectedChipId===chipId;return debug62(` Checking child ${expectedChipId}: matches=${matches}`),matches});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:getTreeChildChipId(child,idx)})));continue}let newCenter={x:placement.x+groupOffset.x,y:placement.y+groupOffset.y};if(treeNode.nodeType==="component"&&treeNode.sourceComponent){let groupChild=group.children.find(c3=>c3.source_component_id===treeNode.sourceComponent?.source_component_id);if(groupChild?._parsedProps?.schX!==void 0||groupChild?._parsedProps?.schY!==void 0){debug62(`Skipping position update for fixed chip ${chipId}`);continue}let schematicComponent=getSchematicComponentForSourceComponent({db:db2,sourceComponentId:treeNode.sourceComponent.source_component_id,schematicSheetId:opts.schematicSheetId});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,cos6=Math.cos(angleRad),sin6=Math.sin(angleRad);for(let port of ports){let dx3=port.center.x-newCenter.x,dy3=port.center.y-newCenter.y,rotatedDx=dx3*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;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*cos6-dy3*sin6,rotatedDy=dx3*sin6+dy3*cos6;text.position.x=newCenter.x+rotatedDx,text.position.y=newCenter.y+rotatedDy}schematicComponent.symbol_name&&(schematicComponent.symbol_name=getRotatedSymbolName(schematicComponent.symbol_name,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 matchpackProxy=nestedGroupMatchpackProxyMap[chipId],oldCenter=matchpackProxy?.center??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);updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:component.schematic_component_id,deltaX:positionDelta.x,deltaY:positionDelta.y})}schematicGroup.center=newCenter,matchpackProxy&&(schematicGroup.width=matchpackProxy.size.x,schematicGroup.height=matchpackProxy.size.y),debug62(`Updated group ${chipId} center to (${newCenter.x}, ${newCenter.y})`)}}}debug62("Matchpack layout completed successfully")}function getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId}){let parentBySourceGroupId=new Map;for(let element of circuitJson)element.type==="source_group"&&parentBySourceGroupId.set(element.source_group_id,element.parent_source_group_id);let schematicSheetIdsBySourceGroupId=new Map;for(let element of circuitJson){if(element.type!=="source_component"||!element.source_group_id)continue;let schematicSheetIds=schematicSheetIdsBySourceComponentId.get(element.source_component_id);if(schematicSheetIds!==void 0)for(let schematicSheetId of schematicSheetIds){let sourceGroupId=element.source_group_id,visitedSourceGroupIds=new Set;for(;sourceGroupId&&!visitedSourceGroupIds.has(sourceGroupId);){visitedSourceGroupIds.add(sourceGroupId);let groupSchematicSheetIds=schematicSheetIdsBySourceGroupId.get(sourceGroupId)??new Set;groupSchematicSheetIds.add(schematicSheetId),schematicSheetIdsBySourceGroupId.set(sourceGroupId,groupSchematicSheetIds),sourceGroupId=parentBySourceGroupId.get(sourceGroupId)}}}return schematicSheetIdsBySourceGroupId}function getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}){let isGroupOnSheet=sourceGroupId=>sourceGroupId===rootSourceGroupId||schematicSheetIdsBySourceGroupId.get(sourceGroupId)?.has(schematicSheetId)===!0;return circuitJson.filter(element=>element.type==="source_group"?isGroupOnSheet(element.source_group_id):element.type==="source_component"?schematicSheetIdsBySourceComponentId.get(element.source_component_id)?.has(schematicSheetId)!==!0?!1:element.source_group_id?isGroupOnSheet(element.source_group_id):!0:!0)}function getSchematicCircuitJsonTrees(circuitJson,opts){let{source_group_id}=opts,schematicSheetIdsBySourceComponentId=new Map;for(let element of circuitJson){if(element.type!=="schematic_component"||!element.source_component_id||!element.schematic_sheet_id)continue;let schematicSheetIds2=schematicSheetIdsBySourceComponentId.get(element.source_component_id)??new Set;schematicSheetIds2.add(element.schematic_sheet_id),schematicSheetIdsBySourceComponentId.set(element.source_component_id,schematicSheetIds2)}let schematicSheetIds=new Set;for(let componentSchematicSheetIds of schematicSheetIdsBySourceComponentId.values())for(let schematicSheetId of componentSchematicSheetIds)schematicSheetIds.add(schematicSheetId);if(schematicSheetIds.size<=1)return[{tree:getCircuitJsonTree(circuitJson,{source_group_id}),schematicSheetId:schematicSheetIds.values().next().value}];let schematicSheetIdsBySourceGroupId=getSchematicSheetIdsBySourceGroupId({circuitJson,schematicSheetIdsBySourceComponentId});return Array.from(schematicSheetIds).map(schematicSheetId=>({tree:getCircuitJsonTree(getCircuitJsonScopedToSchematicSheet({circuitJson,schematicSheetId,rootSourceGroupId:source_group_id,schematicSheetIdsBySourceComponentId,schematicSheetIdsBySourceGroupId}),{source_group_id}),schematicSheetId}))}function Group_doInitialSchematicLayoutMatchPack(group){let{db:db2}=group.root,trees=getSchematicCircuitJsonTrees(db2.toArray(),{source_group_id:group.source_group_id});for(let{tree,schematicSheetId}of trees)applySchematicMatchPackLayoutToTree(group,tree,{schematicSheetId})}var SECTION_GAP=1,MARGIN2=1.5;function computeSchematicSectionLayoutUsingRows({sectionBlocks,groupSchPositionBeforeLayout:groupOffset}){let totalArea=sectionBlocks.reduce((sum,block)=>{let paddedWidth=Math.max(block.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(block.size.y,.5)+MARGIN2*2;return sum+paddedWidth*paddedHeight},0),targetRowWidth=Math.sqrt(totalArea)*2,computedSectionsMatrix=[],currentSectionRow=[],currentRowSectionWidth=0;for(let section of sectionBlocks){let paddedWidth=Math.max(section.size.x,.5)+MARGIN2*2,paddedHeight=Math.max(section.size.y,.5)+MARGIN2*2,neededWidth=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP+paddedWidth:paddedWidth;currentSectionRow.length>0&&neededWidth>targetRowWidth&&(computedSectionsMatrix.push(currentSectionRow),currentSectionRow=[],currentRowSectionWidth=0);let xOffsetInRow=currentRowSectionWidth>0?currentRowSectionWidth+SECTION_GAP:0;currentSectionRow.push({sectionName:section.sectionName,rowOffset:xOffsetInRow,width:paddedWidth,height:paddedHeight}),currentRowSectionWidth=xOffsetInRow+paddedWidth}currentSectionRow.length>0&&computedSectionsMatrix.push(currentSectionRow);let sectionPlacements=new Map,rowY=0;for(let sectionRow of computedSectionsMatrix){let rowHeight=Math.max(...sectionRow.map(rowEntry=>rowEntry.height)),rowCenteringOffsetX=-(sectionRow[sectionRow.length-1].rowOffset+sectionRow[sectionRow.length-1].width)/2;for(let section of sectionRow)sectionPlacements.set(section.sectionName,{x:rowCenteringOffsetX+section.rowOffset+section.width/2+groupOffset.x,y:rowY-rowHeight/2+groupOffset.y});rowY-=rowHeight+SECTION_GAP}return sectionPlacements}var debug7=(0,import_debug15.default)("Group_doInitialSchematicLayoutSections");function Group_doInitialSchematicLayoutSections(group){let{db:db2}=group.root,sectionNamesUsedByChildren=new Set,hasChildrenWithoutSection=!1;for(let child of group.children){if(!child.source_component_id)continue;let sectionName=child.getSchematicSectionName();sectionName!==null?sectionNamesUsedByChildren.add(sectionName):hasChildrenWithoutSection=!0}let sectionNamesToLayout=Array.from(sectionNamesUsedByChildren);if(hasChildrenWithoutSection&§ionNamesToLayout.push(null),sectionNamesToLayout.length===0)return;for(let sectionName of sectionNamesToLayout){let sectionTree=getCircuitJsonTree(db2.toArray(),{source_group_id:group.source_group_id});sectionTree.childNodes=sectionTree.childNodes.filter(child=>child.nodeType!=="component"||!child.sourceComponent?!1:(group.children.find(c3=>c3.source_component_id===child.sourceComponent?.source_component_id)?.getSchematicSectionName()??null)===sectionName),applySchematicMatchPackLayoutToTree(group,sectionTree)}if(sectionNamesToLayout.length<=1)return;let sectionNameToBoundsWithChildren=new Map;for(let sectionName of sectionNamesToLayout){let minX=1/0,maxX=-1/0,minY=1/0,maxY=-1/0,sourceCompIds=new Set;for(let child of group.children){let sourceComponentId=child.source_component_id;if(!sourceComponentId||child.getSchematicSectionName()!==sectionName)continue;let schComp=db2.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;sourceCompIds.add(sourceComponentId);let hw2=schComp.size.width/2,hh3=schComp.size.height/2;minX=Math.min(minX,schComp.center.x-hw2),maxX=Math.max(maxX,schComp.center.x+hw2),minY=Math.min(minY,schComp.center.y-hh3),maxY=Math.max(maxY,schComp.center.y+hh3)}!Number.isFinite(minX)||sourceCompIds.size===0||sectionNameToBoundsWithChildren.set(sectionName,{sectionName,center:{x:(minX+maxX)/2,y:(minY+maxY)/2},size:{x:maxX-minX,y:maxY-minY},sourceCompIds})}if(sectionNameToBoundsWithChildren.size<=1)return;let anchoredSections=new Set;for(let child of group.children){if(!child.source_component_id)continue;let props=child._parsedProps;(props?.schX!==void 0||props?.schY!==void 0)&&anchoredSections.add(child.getSchematicSectionName())}let groupSchPositionBeforeLayout=group._getGlobalSchematicPositionBeforeLayout(),sectionPlacements=computeSchematicSectionLayoutUsingRows({sectionBlocks:Array.from(sectionNameToBoundsWithChildren.values()).map(bounds=>({sectionName:bounds.sectionName,size:bounds.size})),groupSchPositionBeforeLayout});for(let[sectionName,placement]of sectionPlacements){let boundsWithChildren=sectionNameToBoundsWithChildren.get(sectionName);if(!boundsWithChildren)continue;if(anchoredSections.has(sectionName)){debug7(`[${group.name}] Section "${sectionName}" anchored by manual position, skipping shift`);continue}let delta={x:placement.x-boundsWithChildren.center.x,y:placement.y-boundsWithChildren.center.y};for(let sourceComponentId of boundsWithChildren.sourceCompIds){let schComp=db2.schematic_component.getWhere({source_component_id:sourceComponentId});if(!schComp)continue;let ports=db2.schematic_port.list({schematic_component_id:schComp.schematic_component_id}),texts=db2.schematic_text.list({schematic_component_id:schComp.schematic_component_id});for(let port of ports)port.center.x+=delta.x,port.center.y+=delta.y;for(let text of texts)text.position.x+=delta.x,text.position.y+=delta.y;updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId:schComp.schematic_component_id,deltaX:delta.x,deltaY:delta.y}),schComp.center={x:schComp.center.x+delta.x,y:schComp.center.y+delta.y}}}}var MISSING_SCHEMATIC_SHEET_ISSUE_TYPE="missing_schematic_sheet",updateMissingSchematicSheetWarning=({db:db2,schematicDisabled})=>{let existingWarning=db2.schematic_component_styling_warning.list().find(warning=>warning.styling_issue_type===MISSING_SCHEMATIC_SHEET_ISSUE_TYPE),firstSchematicComponent=db2.schematic_component.list()[0];if(!(!schematicDisabled&&!!firstSchematicComponent&&db2.schematic_sheet.list().length===0)){existingWarning&&db2.schematic_component_styling_warning.delete(existingWarning.schematic_component_styling_warning_id);return}existingWarning||!firstSchematicComponent||db2.schematic_component_styling_warning.insert({warning_type:"schematic_component_styling_warning",message:"No <schematicsheet> was found. Add a <schematicsheet> to define the schematic drawing area.",schematic_component_id:firstSchematicComponent.schematic_component_id,source_component_id:firstSchematicComponent.source_component_id,subcircuit_id:firstSchematicComponent.subcircuit_id,styling_issue_type:MISSING_SCHEMATIC_SHEET_ISSUE_TYPE})},Group_doInitialSchematicSheetRender=group=>{let root=group.root;if(!root?.isRootCircuit)return;let isRootGroup=root.firstChild===group,isRootAssemblyChild=isAssemblyDeviceContainer(root.firstChild)&&group.parent===root.firstChild;!isRootGroup&&!isRootAssemblyChild||updateMissingSchematicSheetWarning({db:root.db,schematicDisabled:root.schematicDisabled})},Group_updateSchematicSheetRender=group=>{Group_doInitialSchematicSheetRender(group)},NetLabel=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"source_net_label_id");__publicField(this,"schematic_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 net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),sourceNet;if(net?.source_net_id&&(sourceNet=this.root?.db.source_net.get(net.source_net_id)),sourceNet?.is_ground)return"top";if(sourceNet?.is_power)return"bottom";let anchorPos=this._getGlobalSchematicPositionBeforeLayout(),connectedPorts=this._getConnectedPorts();if(connectedPorts.length===0)return"right";let port=connectedPorts[0];if(port.facingDirection)return getEnteringEdgeFromDirection(port.facingDirection);let connectedPortPosition=port._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||this.getCollapsedSchematicBoxAncestor())return;let{db:db2}=this.root,{_parsedProps:props}=this,anchorPos=this._getGlobalSchematicPositionBeforeLayout(),net=this.getSubcircuit().selectOne(`net.${this._getNetName()}`),anchorSide=this._getAnchorSide(),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:anchorSide,schematic_sheet_id:this._resolveSchematicSheetId()});this.source_net_label_id=netLabel.source_net_id,this.schematic_net_label_id=netLabel.schematic_net_label_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(){let connectsTo=this._resolveConnectsTo();if(connectsTo)for(let connection of connectsTo)this.add(new Trace({from:connection,to:`net.${this._getNetName()}`}))}doInitialSchematicTraceRender(){if(!this.root?._featureMspSchematicTraceRouting||this.root?.schematicDisabled||this.getCollapsedSchematicBoxAncestor())return;let{schX,schY}=this._parsedProps;if(schX===void 0&&schY===void 0)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(st3=>st3.connected_source_net_ids?.includes(net.source_net_id)&&st3.connected_source_port_ids?.includes(port.source_port_id??""));if(candidateSourceTrace&&(existingTraceForThisConnection=db2.schematic_trace.list().some(t53=>t53.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 i6=0;i6<path.length-1;i6++)edges.push({from:{x:path[i6].x,y:path[i6].y},to:{x:path[i6+1].x,y:path[i6+1].y}});let source_trace_id,subcircuit_connectivity_map_key;if(net?.source_net_id&&port.source_port_id){let st3=db2.source_trace.list().find(s6=>s6.connected_source_net_ids?.includes(net.source_net_id)&&s6.connected_source_port_ids?.includes(port.source_port_id));source_trace_id=st3?.source_trace_id,subcircuit_connectivity_map_key=st3?.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,schematic_sheet_id:this._resolveSchematicSheetId()}),db2.schematic_port.update(port.schematic_port_id,{is_connected:!0})}}},getNetNameFromPorts=ports=>{let directlyConnectedTraces=[...new Set(ports.flatMap(port=>port._getDirectlyConnectedTraces()))],displayLabel=directlyConnectedTraces.find(trace=>trace._parsedProps.schDisplayLabel)?._parsedProps.schDisplayLabel??directlyConnectedTraces.find(trace=>trace._parsedProps.displayName)?._parsedProps.displayName??directlyConnectedTraces.find(trace=>trace._parsedProps.name)?._parsedProps.name;if(displayLabel)return{name:displayLabel,wasAssignedDisplayLabel:!0};let db2=ports.find(port=>port.root)?.root?.db,sourcePortIds=ports.map(port=>port.source_port_id).filter(sourcePortId=>!!sourcePortId);return{name:(db2?getNetNameFromSourcePorts(db2,sourcePortIds):ports.map(port=>port._getNetLabelText()).filter(name=>!!name).sort((a6,b6)=>a6.localeCompare(b6,void 0,{numeric:!0,sensitivity:"base"}))[0])??"",wasAssignedDisplayLabel:!1}},appendToMap=(map,key,value)=>{let values=map.get(key);values?values.push(value):map.set(key,[value])},createCanonicalSchematicNetLabelTextResolver=group=>{let{db:db2}=group.root,sourceNetByConnectionKey=new Map,portsByConnectionKey=new Map,sourcePortIdsByConnectionKey=new Map,resolvedTextByConnectionKey=new Map;for(let sourceNet of db2.source_net.list())sourceNet.subcircuit_connectivity_map_key&&sourceNetByConnectionKey.set(sourceNet.subcircuit_connectivity_map_key,sourceNet);for(let port of group.selectAll("port")){let connectionKey=port._getSubcircuitConnectivityKey();connectionKey&&appendToMap(portsByConnectionKey,connectionKey,port)}for(let sourcePort of db2.source_port.list())sourcePort.subcircuit_connectivity_map_key&&appendToMap(sourcePortIdsByConnectionKey,sourcePort.subcircuit_connectivity_map_key,sourcePort.source_port_id);return({subcircuitConnectivityMapKey})=>{let cached=resolvedTextByConnectionKey.get(subcircuitConnectivityMapKey);if(cached)return cached;let resolvedSourceNet=sourceNetByConnectionKey.get(subcircuitConnectivityMapKey);if(resolvedSourceNet?.name){let result2={name:resolvedSourceNet.name,wasAssignedDisplayLabel:!0};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result2),result2}let portLabel=getNetNameFromPorts(portsByConnectionKey.get(subcircuitConnectivityMapKey)??[]);if(portLabel.name)return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,portLabel),portLabel;let result={name:getNetNameFromSourcePorts(db2,sourcePortIdsByConnectionKey.get(subcircuitConnectivityMapKey)??[])??"",wasAssignedDisplayLabel:!1};return resolvedTextByConnectionKey.set(subcircuitConnectivityMapKey,result),result}},asSchematicPortId=id3=>id3,asSourcePortId=id3=>id3,debug8=(0,import_debug17.default)("Group_doInitialSchematicTraceRender"),INLINE_NET_LABEL_COLOR="rgb(132, 0, 0)",VERTICAL_INLINE_NET_LABEL_ROTATION=-90;function applyInlineNetLabelPlacements(args){let{group,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey}=args,{db:db2}=group.root,inlineNetLabelPlacements=solver.inlineNetLabelSolver?.getOutput().inlineNetLabelPlacements??[];if(inlineNetLabelPlacements.length===0)return;let resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group),globalConnMap=solver.mspConnectionPairSolver.globalConnMap;for(let placement of inlineNetLabelPlacements){let schematicPortIds=placement.pinIds.map(asSchematicPortId),placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.has(id3)),connKey=placementUserNetId?userNetIdToConnKey.get(placementUserNetId):void 0,text=connKey?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey}).name:placement.netId??placement.globalConnNetId;if(!text){debug8(`skipping inline net label for "${placement.netId}" REASON:no resolvable text`);continue}let schematicSheetId=group._resolveSchematicSheetId(),schematicPort=db2.schematic_port.get(schematicPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let position4={...placement.center},halfHeight=placement.height/2;switch(placement.side){case"y+":position4.y=placement.anchorPoint.y+halfHeight;break;case"y-":position4.y=placement.anchorPoint.y-halfHeight;break;case"x+":position4.x=placement.anchorPoint.x+halfHeight;break;case"x-":position4.x=placement.anchorPoint.x-halfHeight;break}db2.schematic_text.insert({text,source_trace_id:sourceTraceIdByPinPairKey.get([...schematicPortIds].sort().join("::")),anchor:"center",position:position4,rotation:placement.axis==="y"?VERTICAL_INLINE_NET_LABEL_ROTATION:0,font_size:placement.height,color:INLINE_NET_LABEL_COLOR,schematic_sheet_id:schematicSheetId})}}var NET_LABEL_TEXT_HEIGHT=.18,getNetLabelTextBounds=({center:center2,text})=>{let halfWidth=getSchematicNetLabelTextWidth2({text})/2,halfHeight=NET_LABEL_TEXT_HEIGHT/2;return{minX:center2.x-halfWidth,maxX:center2.x+halfWidth,minY:center2.y-halfHeight,maxY:center2.y+halfHeight}},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"}},debug9=(0,import_debug18.default)("Group_doInitialSchematicTraceRender"),isSameNet=(label,sourceNet)=>label.schematicNetLabel.source_net_id!=null&&label.schematicNetLabel.source_net_id===sourceNet.source_net_id,isUserDefinedNetLabelRedundantWithPlacement=(label,solverPlacement)=>isSameNet(label,solverPlacement.sourceNet)?label.schematicPortIds.some(id3=>solverPlacement.schematicPortIds.has(id3))?!0:label.schematicNetLabel.center?doBoundsOverlap(getNetLabelTextBounds({center:label.schematicNetLabel.center,text:label.schematicNetLabel.text}),solverPlacement.bounds):!1:!1;function applyNetLabelPlacements(args){let{group,solver,connKeyToSourceNet,userNetIdToConnKey,crossSubcircuitTraceLabelTextBySchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels}=args,{db:db2}=group.root,resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group),netLabelPlacements=solver.inlineNetLabelSolver?.getOutput().netLabelPlacements??solver.netLabelNetLabelCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelTraceCollisionSolver?.getOutput().netLabelPlacements??solver.netLabelPlacementSolver?.netLabelPlacements??solver.traceLabelOverlapAvoidanceSolver?.getOutput().netLabelPlacements??[],dedupedNetLabelPlacements=[],netLabelPlacementKeys=new Set;for(let placement of netLabelPlacements){let pinIds=[...placement.pinIds??[]].sort(),key=`${placement.globalConnNetId}|${pinIds.join("::")}|${placement.netId??""}`;if(netLabelPlacementKeys.has(key)){debug9(`skipping duplicate placement for "${placement.netId}" REASON:identical net label placement`);continue}netLabelPlacementKeys.add(key),dedupedNetLabelPlacements.push(placement)}let netLabelPlacementCountByGlobalNetId=new Map,routedPairKeysByGlobalNetId=new Map,globalNetIdsWithPortOnlyPlacements=new Set;for(let placement of dedupedNetLabelPlacements)netLabelPlacementCountByGlobalNetId.set(placement.globalConnNetId,(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)+1),(placement.pinIds?.length??0)>1&&(routedPairKeysByGlobalNetId.has(placement.globalConnNetId)||routedPairKeysByGlobalNetId.set(placement.globalConnNetId,new Set),routedPairKeysByGlobalNetId.get(placement.globalConnNetId).add(placement.pinIds.slice().sort().join("::"))),(placement.pinIds?.length??0)<=1&&globalNetIdsWithPortOnlyPlacements.add(placement.globalConnNetId);let globalConnMap=solver.mspConnectionPairSolver.globalConnMap,userDefinedNetLabels=netLabels.map(label=>{if(!label.schematic_net_label_id)return null;let dbLabel=db2.schematic_net_label.get(label.schematic_net_label_id);return dbLabel?{schematicNetLabel:dbLabel,schematicPortIds:label._getConnectedPorts().map(port=>port.schematic_port_id).filter(id3=>!!id3),shouldUseSchematicTraceSolver:label._parsedProps.schX===void 0&&label._parsedProps.schY===void 0}:null}).filter(label=>label!==null);for(let placement of dedupedNetLabelPlacements){debug9(`processing placement: ${placement.netId}`);let placementUserNetId=globalConnMap.getIdsConnectedToNet(placement.globalConnNetId).find(id3=>userNetIdToConnKey.get(id3)),placementConnKey=userNetIdToConnKey.get(placementUserNetId),orientation4=placement.orientation,anchor_side=oppositeSide2(orientation4),sourceNet;placementConnKey&&(sourceNet=connKeyToSourceNet.get(placementConnKey));let crossSubcircuitTraceLabelText=placement.pinIds.length===1?crossSubcircuitTraceLabelTextBySchematicPortId.get(asSchematicPortId(placement.pinIds[0])):void 0,canonicalNetLabel=placementConnKey?crossSubcircuitTraceLabelText?{name:crossSubcircuitTraceLabelText,wasAssignedDisplayLabel:!1}:resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:placementConnKey}):{name:placement.netId??placement.globalConnNetId,wasAssignedDisplayLabel:!1},schPortIds=placement.pinIds.map(asSchematicPortId),schematicSheetId=group._resolveSchematicSheetId(),schematicPort=db2.schematic_port.get(schPortIds[0]);schematicPort?.schematic_sheet_id&&(schematicSheetId=schematicPort.schematic_sheet_id);let anchor_position=placement.anchorPoint;if(schPortIds.length===1&&schPortIds[0]){let anchorSchPort=db2.schematic_port.get(schPortIds[0]);anchorSchPort?.center&&!anchorSchPort.is_connected&&(anchor_position=anchorSchPort.center)}if(schPortIds.some(schPortId=>schematicPortIdsWithPreExistingNetLabels.has(schPortId))){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has pre-existing net label`);continue}if(sourceNet){let isPowerOrGroundNet=sourceNet.is_ground||sourceNet.is_power,hasExplicitPortNetTrace=connKeysWithExplicitPortNetTraces.has(placementConnKey),hasRoutedTraceForPlacementPort=schPortIds.some(id3=>schematicPortIdsWithRoutedTraces.has(id3)),hasSingleLabelPlacement=(netLabelPlacementCountByGlobalNetId.get(placement.globalConnNetId)??0)<=1;if(!hasExplicitPortNetTrace&&!isPowerOrGroundNet&&hasRoutedTraceForPlacementPort&&hasSingleLabelPlacement){debug9(`skipping net label placement for "${placement.netId}" REASON:schematic port has routed trace`);continue}let text2=canonicalNetLabel.name,center22=computeSchematicNetLabelCenter({anchor_position,anchor_side,text:text2}),solverManagedUserNetLabel=userDefinedNetLabels.find(label=>label.shouldUseSchematicTraceSolver&&isSameNet(label,sourceNet)&&label.schematicPortIds.some(id3=>schPortIds.includes(id3)));if(solverManagedUserNetLabel){db2.schematic_net_label.update(solverManagedUserNetLabel.schematicNetLabel.schematic_net_label_id,{anchor_position,center:center22,anchor_side,schematic_sheet_id:schematicSheetId});continue}if(!isPowerOrGroundNet){let solverPlacement={sourceNet,text:text2,schematicPortIds:new Set(schPortIds),bounds:getNetLabelTextBounds({center:center22,text:text2})};if(userDefinedNetLabels.some(label=>isUserDefinedNetLabelRedundantWithPlacement(label,solverPlacement)))continue}let netLabel2={text:text2,source_net_id:sourceNet.source_net_id,anchor_position,center:center22,anchor_side,schematic_sheet_id:schematicSheetId};db2.schematic_net_label.insert(netLabel2);continue}let{name:text,wasAssignedDisplayLabel}=canonicalNetLabel,shouldKeepRoutedPairLabel=(placement.pinIds?.length??0)>1&&(globalNetIdsWithPortOnlyPlacements.has(placement.globalConnNetId)||(routedPairKeysByGlobalNetId.get(placement.globalConnNetId)?.size??0)>1);if(!wasAssignedDisplayLabel&&!shouldKeepRoutedPairLabel&&schPortIds.some(schPortId=>schematicPortIdsWithRoutedTraces.has(schPortId))){debug9(`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}),netLabel={text,source_net_id:placementConnKey??placement.netId??placement.globalConnNetId,anchor_position,center:center2,anchor_side,schematic_sheet_id:schematicSheetId};db2.schematic_net_label.insert(netLabel)}}var cross22=(ax3,ay3,bx3,by3)=>ax3*by3-ay3*bx3;function segmentIntersection(p12,p22,q12,q22,tol){let r6={x:p22.x-p12.x,y:p22.y-p12.y},s6={x:q22.x-q12.x,y:q22.y-q12.y},rxs=cross22(r6.x,r6.y,s6.x,s6.y),q_p={x:q12.x-p12.x,y:q12.y-p12.y},q_pxr=cross22(q_p.x,q_p.y,r6.x,r6.y);if(Math.abs(rxs)<tol&&Math.abs(q_pxr)<tol||Math.abs(rxs)<tol&&Math.abs(q_pxr)>=tol)return null;let t53=cross22(q_p.x,q_p.y,s6.x,s6.y)/rxs,u6=cross22(q_p.x,q_p.y,r6.x,r6.y)/rxs;return t53<-tol||t53>1+tol||u6<-tol||u6>1+tol?null:{x:p12.x+t53*r6.x,y:p12.y+t53*r6.y}}var TOL4=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(a6,b6){return Math.hypot(b6.x-a6.x,b6.y-a6.y)}function pointAt(a6,b6,t53){return{x:a6.x+(b6.x-a6.x)*t53,y:a6.y+(b6.y-a6.y)*t53}}function paramAlong(a6,b6,p3){let L5=length6(a6,b6);if(L5<TOL4)return 0;let t53=((p3.x-a6.x)*(b6.x-a6.x)+(p3.y-a6.y)*(b6.y-a6.y))/((b6.x-a6.x)*(b6.x-a6.x)+(b6.y-a6.y)*(b6.y-a6.y));return Math.max(0,Math.min(1,t53))*L5}function mergeIntervals(intervals,tol=TOL4){if(intervals.length===0)return intervals;intervals.sort((a6,b6)=>a6.start-b6.start);let merged=[],cur={...intervals[0]};for(let i6=1;i6<intervals.length;i6++){let nxt=intervals[i6];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 L5=length6(edge.from,edge.to);if(L5<TOL4||crossingDistances.length===0)return[edge];let half=crossLen/2,rawIntervals=crossingDistances.map(d3=>({start:Math.max(0,d3-half),end:Math.min(L5,d3+half)})).filter(iv2=>iv2.end-iv2.start>TOL4),intervals=mergeIntervals(rawIntervals),result=[],cursor=0,dir2={x:edge.to.x-edge.from.x,y:edge.to.y-edge.from.y},addSeg=(d02,d12,isCrossing)=>{if(d12-d02<=TOL4)return;let t02=d02/L5,t110=d12/L5;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>TOL4&&addSeg(cursor,iv2.start,!1),addSeg(iv2.start,iv2.end,!0),cursor=iv2.end;return L5-cursor>TOL4&&addSeg(cursor,L5,!1),result.length>0?result:[edge]}function computeCrossings(traces,opts={}){let crossLen=opts.crossSegmentLength??.075,tol=opts.tolerance??TOL4,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 eA2=A4.edges[ei3];for(let tj2=ti3;tj2<traces.length;tj2++){let B4=traces[tj2];for(let ej2=tj2===ti3?ei3+1:0;ej2<B4.edges.length;ej2++){let eB2=B4.edges[ej2];if(A4.connectivity_key!==void 0&&A4.connectivity_key===B4.connectivity_key)continue;let P3=segmentIntersection(eA2.from,eA2.to,eB2.from,eB2.to,tol);if(!P3)continue;let LA2=length6(eA2.from,eA2.to),LB2=length6(eB2.from,eB2.to);if(LA2<tol||LB2<tol)continue;let dA2=paramAlong(eA2.from,eA2.to,P3),dB2=paramAlong(eB2.from,eB2.to,P3),nearEndpointA=dA2<=tol||Math.abs(LA2-dA2)<=tol||Number.isNaN(dA2),nearEndpointB=dB2<=tol||Math.abs(LB2-dB2)<=tol||Number.isNaN(dB2);if(!nearEndpointA&&!nearEndpointB){let aIsHorizontal=isHorizontalEdge(eA2),bIsHorizontal=isHorizontalEdge(eB2),assignToA;if(aIsHorizontal!==bIsHorizontal)assignToA=aIsHorizontal;else{let ax3=Math.abs(eA2.to.x-eA2.from.x),ay3=Math.abs(eA2.to.y-eA2.from.y),bx3=Math.abs(eB2.to.x-eB2.from.x),by3=Math.abs(eB2.to.y-eB2.from.y),aScore=ax3-ay3,bScore=bx3-by3;assignToA=aScore===bScore?!0:aScore>bScore}let chosenKey=keyOf({traceIdx:assignToA?ti3:tj2,edgeIdx:assignToA?ei3:ej2}),chosenList=crossingsByEdge.get(chosenKey)??[];chosenList.push(assignToA?dA2:dB2),crossingsByEdge.set(chosenKey,chosenList)}}}}}let out=traces.map(t53=>({source_trace_id:t53.source_trace_id,connectivity_key:t53.connectivity_key,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 uniqueSorted2=Array.from(new Set(splittingDistances.map(d3=>Number(d3.toFixed(6))))).sort((a6,b6)=>a6-b6),split=splitEdgeByCrossings(trace.edges[ei3],uniqueSorted2,crossLen);out[ti3].edges.push(...split)}}return out}var TOL22=1e-6;function nearlyEqual2(a6,b6,tol=TOL22){return Math.abs(a6-b6)<=tol}function pointEq(a6,b6,tol=TOL22){return nearlyEqual2(a6.x,b6.x,tol)&&nearlyEqual2(a6.y,b6.y,tol)}function onSegment4(p3,a6,b6,tol=TOL22){let minX=Math.min(a6.x,b6.x)-tol,maxX=Math.max(a6.x,b6.x)+tol,minY=Math.min(a6.y,b6.y)-tol,maxY=Math.max(a6.y,b6.y)+tol;return p3.x<minX||p3.x>maxX||p3.y<minY||p3.y>maxY?!1:Math.abs((b6.x-a6.x)*(p3.y-a6.y)-(b6.y-a6.y)*(p3.x-a6.x))<=tol}function dedupePoints(points,tol=TOL22){let map=new Map;for(let p3 of points){let key=`${p3.x.toFixed(6)},${p3.y.toFixed(6)}`;map.has(key)||map.set(key,p3)}return Array.from(map.values())}function edgeVec(e6){return{x:e6.to.x-e6.from.x,y:e6.to.y-e6.from.y}}function isEndpointOfEdge(p3,e6,tol=TOL22){return pointEq(p3,e6.from,tol)||pointEq(p3,e6.to,tol)}function isParallel(e12,e22,tol=TOL22){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 cross32=v12.x*v22.y-v12.y*v22.x;return Math.abs(cross32)<=tol*L12*L22}function incidentEdgesAtPoint(trace,p3,tol=TOL22){return trace.edges.filter(e6=>pointEq(e6.from,p3,tol)||pointEq(e6.to,p3,tol))}function nearestEndpointOnTrace(trace,p3,tol=TOL22){for(let e6 of trace.edges){if(pointEq(e6.from,p3,tol))return e6.from;if(pointEq(e6.to,p3,tol))return e6.to}return null}function edgeDirectionFromPoint(e6,p3,tol=TOL22){let other=pointEq(e6.from,p3,tol)||nearlyEqual2(e6.from.x,p3.x,tol)&&nearlyEqual2(e6.from.y,p3.y,tol)?e6.to:e6.from,dx3=other.x-p3.x,dy3=other.y-p3.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,p3,tol=TOL22){let incident=incidentEdgesAtPoint(trace,p3,tol);if(incident.length<2)return null;let dirs=incident.map(e6=>edgeDirectionFromPoint(e6,p3,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??TOL22,result={};for(let t53 of traces)result[t53.source_trace_id]=[];let endpointsByTrace=traces.map(t53=>{let pts=[];for(let e6 of t53.edges)pts.push(e6.from,e6.to);return dedupePoints(pts,tol)});for(let i6=0;i6<traces.length;i6++){let A4=traces[i6],AEnds=endpointsByTrace[i6];for(let j6=i6+1;j6<traces.length;j6++){let B4=traces[j6],BEnds=endpointsByTrace[j6];if(A4.connectivity_key!==void 0&&A4.connectivity_key===B4.connectivity_key){for(let eA2 of A4.edges)for(let eB2 of B4.edges){let p3=segmentIntersection(eA2.from,eA2.to,eB2.from,eB2.to,tol);p3&&(isEndpointOfEdge(p3,eA2,tol)||isEndpointOfEdge(p3,eB2,tol)||(result[A4.source_trace_id].push(p3),A4.source_trace_id!==B4.source_trace_id&&result[B4.source_trace_id].push(p3)))}for(let pa3 of AEnds)for(let pb2 of BEnds)if(pointEq(pa3,pb2,tol)){let aEdgesAtP=incidentEdgesAtPoint(A4,pa3,tol),bEdgesAtP=incidentEdgesAtPoint(B4,pb2,tol),hasCorner=aEdgesAtP.some(eA2=>bEdgesAtP.some(eB2=>!isParallel(eA2,eB2,tol))),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bCorner=getCornerOrientationAtPoint(B4,pb2,tol);hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B4.source_trace_id&&result[B4.source_trace_id].push(pb2))}for(let pa3 of AEnds)for(let eB2 of B4.edges)if(onSegment4(pa3,eB2.from,eB2.to,tol)){let hasCorner=incidentEdgesAtPoint(A4,pa3,tol).some(eA2=>!isParallel(eA2,eB2,tol)),aCorner=getCornerOrientationAtPoint(A4,pa3,tol),bEndpointNearPa=nearestEndpointOnTrace(B4,pa3,tol*1e3),bCorner=bEndpointNearPa?getCornerOrientationAtPoint(B4,bEndpointNearPa,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[A4.source_trace_id].push(pa3),A4.source_trace_id!==B4.source_trace_id&&result[B4.source_trace_id].push(pa3))}for(let pb2 of BEnds)for(let eA2 of A4.edges)if(onSegment4(pb2,eA2.from,eA2.to,tol)){let hasCorner=incidentEdgesAtPoint(B4,pb2,tol).some(eB2=>!isParallel(eA2,eB2,tol)),bCorner=getCornerOrientationAtPoint(B4,pb2,tol),aEndpointNearPb=nearestEndpointOnTrace(A4,pb2,tol*1e3),aCorner=aEndpointNearPb?getCornerOrientationAtPoint(A4,aEndpointNearPb,tol):null;hasCorner&&!(aCorner!==null&&bCorner!==null&&aCorner===bCorner)&&(result[B4.source_trace_id].push(pb2),A4.source_trace_id!==B4.source_trace_id&&result[A4.source_trace_id].push(pb2))}}}}for(let id3 of Object.keys(result))result[id3]=dedupePoints(result[id3],tol);return result}var getPortForSchematicSymbolPort=port=>{let{schX,schY}=port._parsedProps;if(schX!==void 0&&schY!==void 0||!port.getParentNormalComponent()?.getSchematicSymbol())return port;let internallyConnectedPorts=port._getPortsInternallyConnectedToThisPort(),schematicSymbolPortDef=port.schematicSymbolPortDef??internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef)?.schematicSymbolPortDef;return schematicSymbolPortDef?internallyConnectedPorts.find(connectedPort=>connectedPort.schematicSymbolPortDef===schematicSymbolPortDef)??port:port},TOL32=1e-6;function isCollinear(a6,b6,tol=TOL32){let adx=a6.to.x-a6.from.x,ady=a6.to.y-a6.from.y,bdx=b6.to.x-b6.from.x,bdy=b6.to.y-b6.from.y,aLen=Math.hypot(adx,ady),bLen=Math.hypot(bdx,bdy);if(aLen<=tol||bLen<=tol)return!1;let directionCross=adx*bdy-ady*bdx;if(Math.abs(directionCross)>tol*aLen*bLen)return!1;let offsetCross=adx*(b6.from.y-a6.from.y)-ady*(b6.from.x-a6.from.x);return Math.abs(offsetCross)<=tol*aLen}function splitEdgeAroundIntervals(edge,intervals){let merged=mergeIntervals(intervals);if(merged.length===0)return[edge];let edgeLength=length6(edge.from,edge.to);if(edgeLength<=TOL32)return[edge];let result=[],cursor=0;for(let interval of merged)interval.start-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:pointAt(edge.from,edge.to,interval.start/edgeLength)}),interval.end-interval.start>TOL32&&result.push({from:pointAt(edge.from,edge.to,interval.start/edgeLength),to:pointAt(edge.from,edge.to,interval.end/edgeLength),is_crossing:!0}),cursor=Math.max(cursor,interval.end);return edgeLength-cursor>TOL32&&result.push({from:pointAt(edge.from,edge.to,cursor/edgeLength),to:edge.to}),result}function removeOverlappingSameNetCrossingSegments(traces){let intervalsToRemove=new Map;for(let crossingTraceIndex=0;crossingTraceIndex<traces.length;crossingTraceIndex++){let crossingTrace=traces[crossingTraceIndex];if(crossingTrace.connectivity_key){for(let crossingEdge of crossingTrace.edges)if(!(!crossingEdge.is_crossing||length6(crossingEdge.from,crossingEdge.to)<=TOL32))for(let traceIndex=0;traceIndex<traces.length;traceIndex++){let candidateTrace=traces[traceIndex];if(!(traceIndex===crossingTraceIndex||candidateTrace.connectivity_key!==crossingTrace.connectivity_key))for(let edgeIndex=0;edgeIndex<candidateTrace.edges.length;edgeIndex++){let candidateEdge=candidateTrace.edges[edgeIndex],candidateLength=length6(candidateEdge.from,candidateEdge.to);if(candidateEdge.is_crossing||candidateLength<=TOL32||!isCollinear(candidateEdge,crossingEdge))continue;let start=Math.max(0,Math.min(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to))),end=Math.min(candidateLength,Math.max(paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.from),paramAlong(candidateEdge.from,candidateEdge.to,crossingEdge.to)));if(end-start<=TOL32)continue;let key=`${traceIndex}:${edgeIndex}`,intervals=intervalsToRemove.get(key)??[];intervals.push({start,end}),intervalsToRemove.set(key,intervals)}}}}return intervalsToRemove.size===0?traces:traces.map((trace,traceIndex)=>({...trace,edges:trace.edges.flatMap((edge,edgeIndex)=>{let intervals=intervalsToRemove.get(`${traceIndex}:${edgeIndex}`);return intervals?splitEdgeAroundIntervals(edge,intervals):[edge]})}))}var debug10=(0,import_debug19.default)("Group_doInitialSchematicTraceRender"),MAX_PIN_SNAP_GAP=1.5;function extendTraceEndpointsToReachPinsInsideExpandedBoundingBox(params,db2){let{points,schematicPortIds,componentBoundsByPortId}=params,centers=schematicPortIds.map(id3=>{let center2=db2.schematic_port.get(id3)?.center,bounds=componentBoundsByPortId.get(id3);return!center2||!bounds?null:{center:center2,bounds}}).filter(port=>!!port);if(centers.length===0)return points;let result=points.map(p3=>({x:p3.x,y:p3.y})),d22=(a6,b6)=>(a6.x-b6.x)**2+(a6.y-b6.y)**2,usedCenters=new Set;for(let i6=0;i6<centers.length;i6++)result.some(p3=>d22(centers[i6].center,p3)<=1e-12)&&usedCenters.add(i6);let ALIGN_EPS=.001,endpoints=["start","end"],candidates=[];for(let endpoint of endpoints){let endpointPoint=endpoint==="start"?result[0]:result[result.length-1];for(let i6=0;i6<centers.length;i6++){if(usedCenters.has(i6))continue;let{center:center2,bounds}=centers[i6],dist=d22(center2,endpointPoint);Math.abs(center2.x-endpointPoint.x)>ALIGN_EPS&&Math.abs(center2.y-endpointPoint.y)>ALIGN_EPS||dist>MAX_PIN_SNAP_GAP**2&&pointToBoundsDistance(endpointPoint,bounds)>ALIGN_EPS||candidates.push({endpoint,centerIndex:i6,dist})}}candidates.sort((a6,b6)=>a6.dist-b6.dist);let usedEndpoints=new Set;for(let{endpoint,centerIndex,dist}of candidates){if(usedEndpoints.has(endpoint)||usedCenters.has(centerIndex)||(usedCenters.add(centerIndex),usedEndpoints.add(endpoint),dist<=1e-12))continue;let center2=centers[centerIndex].center;endpoint==="start"?result.unshift({x:center2.x,y:center2.y}):result.push({x:center2.x,y:center2.y})}return result}function applyTracesFromSolverOutput(args){let{group,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}=args,{db:db2}=group.root,schematicPortIdsByRoutedSchematicPortId=new Map;for(let port of group.selectAll("port")){let routedSchematicPortIdValue=getPortForSchematicSymbolPort(port).schematic_port_id,schematicPortIdValue=port.schematic_port_id;if(!routedSchematicPortIdValue||!schematicPortIdValue)continue;let routedSchematicPortId=asSchematicPortId(routedSchematicPortIdValue),schematicPortId=asSchematicPortId(schematicPortIdValue),schematicPortIds=schematicPortIdsByRoutedSchematicPortId.get(routedSchematicPortId)??[];schematicPortIds.push(schematicPortId),schematicPortIdsByRoutedSchematicPortId.set(routedSchematicPortId,schematicPortIds)}let customSymbolPortIds=new Set(group.selectAll("port").filter(port=>{if(!port._getSymbolAncestor())return!1;let symbol=port.getParentNormalComponent()?._parsedProps.symbol;return(0,import_react6.isValidElement)(symbol)||isCircuitJsonSymbol(symbol)}).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId)),componentBoundsByPortId=new Map;for(let schematicComponent of db2.schematic_component.list()){let textInclusiveBounds=getSchematicComponentWithTextBounds({db:db2,schematicComponent}),componentBounds=getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});for(let port of db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id})){let isInsideComponentBounds=port.center.x>componentBounds.minX&&port.center.x<componentBounds.maxX&&port.center.y>componentBounds.minY&&port.center.y<componentBounds.maxY,schematicPortId=asSchematicPortId(port.schematic_port_id);!textInclusiveBounds&&!customSymbolPortIds.has(schematicPortId)||!textInclusiveBounds&&isInsideComponentBounds||componentBoundsByPortId.set(schematicPortId,textInclusiveBounds??componentBounds)}}let traces=solver.sameNetJunctionAlignmentSolver?.getOutput().traces??solver.netLabelTraceCollisionSolver?.getOutput().traces??solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths,pendingTraces=[];debug10(`Traces inside SchematicTraceSolver output: ${(traces??[]).length}`);for(let solvedTracePath of traces??[]){let solvedTraceSchematicPortIds=Array.from(new Set(solvedTracePath.pinIds??[])).map(asSchematicPortId);if(solvedTraceSchematicPortIds.length>0&&solvedTraceSchematicPortIds.every(id3=>schematicPortIdsWithPreExistingNetLabels.has(id3))){debug10(`Skipping solver netlabel-covered trace ${solvedTracePath?.mspPairId} because all schematic ports already have netlabels`);continue}let points=solvedTracePath?.tracePath;if(!Array.isArray(points)||points.length<2){debug10(`Skipping trace ${solvedTracePath?.pinIds.join(",")} because it has less than 2 points`);continue}let snappedPoints=extendTraceEndpointsToReachPinsInsideExpandedBoundingBox({points,schematicPortIds:solvedTraceSchematicPortIds,componentBoundsByPortId},db2),edges=[];for(let i6=0;i6<snappedPoints.length-1;i6++)edges.push({from:{x:snappedPoints[i6].x,y:snappedPoints[i6].y},to:{x:snappedPoints[i6+1].x,y:snappedPoints[i6+1].y}});let source_trace_id=String(solvedTracePath?.mspPairId),subcircuit_connectivity_map_key;if(Array.isArray(solvedTracePath?.pins)&&solvedTracePath.pins.length===2){let firstPinId=solvedTracePath.pins[0]?.pinId,secondPinId=solvedTracePath.pins[1]?.pinId,pA2=firstPinId?asSchematicPortId(firstPinId):void 0,pB2=secondPinId?asSchematicPortId(secondPinId):void 0;if(pA2&&pB2){let routedSchematicPortIds=new Set([pA2,pB2]);for(let routedSchematicPortId of routedSchematicPortIds){db2.schematic_port.update(routedSchematicPortId,{is_connected:!0});for(let schematicPortId of schematicPortIdsByRoutedSchematicPortId.get(routedSchematicPortId)??[])db2.schematic_port.update(schematicPortId,{is_connected:!0})}subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))}}if(subcircuit_connectivity_map_key||(subcircuit_connectivity_map_key=userNetIdToConnKey.get(String(solvedTracePath.userNetId))),!subcircuit_connectivity_map_key){let sourcePortConnKeys=solvedTraceSchematicPortIds.map(schematicPortId=>{let sourcePortId=db2.schematic_port.get(schematicPortId)?.source_port_id;if(sourcePortId)return db2.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key}).filter(key=>!!key);new Set(sourcePortConnKeys).size===1&&(subcircuit_connectivity_map_key=sourcePortConnKeys[0])}let endpointSchematicSheetIds=new Set(solvedTraceSchematicPortIds.map(schematicPortId=>db2.schematic_port.get(schematicPortId)?.schematic_sheet_id).filter(sheetId=>!!sheetId)),schematicSheetId2;endpointSchematicSheetIds.size===1?schematicSheetId2=endpointSchematicSheetIds.values().next().value:endpointSchematicSheetIds.size===0&&(schematicSheetId2=group._resolveSchematicSheetId()),pendingTraces.push({source_trace_id,edges,subcircuit_connectivity_map_key,schematic_sheet_id:schematicSheetId2})}debug10(`Applying ${pendingTraces.length} traces from SchematicTraceSolver output`);let withCrossings=computeCrossings(pendingTraces.map(t53=>({source_trace_id:t53.source_trace_id,edges:t53.edges,connectivity_key:t53.subcircuit_connectivity_map_key}))),existingTracesForJunctions=[],schematicSheetId=group._resolveSchematicSheetId();for(let t53 of db2.schematic_trace.list()){if(t53.edges.length===0||t53.schematic_sheet_id!==schematicSheetId)continue;let sourceTrace=t53.source_trace_id?db2.source_trace.get(t53.source_trace_id):void 0;existingTracesForJunctions.push({schematic_trace_id:t53.schematic_trace_id,source_trace_id:t53.source_trace_id??t53.schematic_trace_id,edges:t53.edges,connectivity_key:t53.subcircuit_connectivity_map_key??sourceTrace?.subcircuit_connectivity_map_key})}let tracesWithTrimmedCrossingOverlaps=removeOverlappingSameNetCrossingSegments([...withCrossings,...existingTracesForJunctions]),visibleTraces=tracesWithTrimmedCrossingOverlaps.slice(0,withCrossings.length),visibleExistingTraces=tracesWithTrimmedCrossingOverlaps.slice(withCrossings.length);for(let trace of visibleExistingTraces)trace.schematic_trace_id&&db2.schematic_trace.update(trace.schematic_trace_id,{edges:trace.edges});let junctionsById=computeJunctions([...visibleTraces,...visibleExistingTraces]);for(let t53 of visibleTraces){let pendingTrace=pendingTraces.find(pendingTrace2=>pendingTrace2.source_trace_id===t53.source_trace_id),traceSchematicSheetId=schematicSheetId;pendingTrace?.schematic_sheet_id&&(traceSchematicSheetId=pendingTrace.schematic_sheet_id),db2.schematic_trace.insert({source_trace_id:t53.source_trace_id,edges:t53.edges,junctions:junctionsById[t53.source_trace_id]??[],subcircuit_connectivity_map_key:pendingTrace?.subcircuit_connectivity_map_key,schematic_sheet_id:traceSchematicSheetId})}}var INLINE_NET_LABEL_FONT_SIZE=.12,applyInlineNetLabelEligibility=({directConnections,connKeyToSchematicPortIds,connKeyToSourceNet,resolveCanonicalNetLabelText})=>{for(let directConnection of directConnections){let{connKey}=directConnection;if(!connKey||connKeyToSchematicPortIds.get(connKey)?.length!==2)continue;let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet?.is_power||sourceNet?.is_ground)continue;let{name,wasAssignedDisplayLabel}=resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:connKey});!name||!wasAssignedDisplayLabel||(directConnection.allowInlineNetLabel=!0,directConnection.inlineNetLabelHeight=INLINE_NET_LABEL_FONT_SIZE,directConnection.inlineNetLabelWidth=Number(getSchematicNetLabelTextWidth2({text:name,font_size:INLINE_NET_LABEL_FONT_SIZE}).toFixed(2)))}},isDirectConnectionEndpointOutsideSchematicScope=({db:db2,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(sourcePortIdsInSchematicScope.has(otherSourcePortId))return!1;let sourcePort=db2.source_port.get(sourcePortId),otherSourcePort=db2.source_port.get(otherSourcePortId);if(!sourcePort||!otherSourcePort)return!1;if(sourcePort.subcircuit_id!==otherSourcePort.subcircuit_id)return!0;if(!schematicSheetId)return!1;let otherEndpointSchematicPorts=db2.schematic_port.list({source_port_id:otherSourcePortId});return otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id===schematicSheetId)?!1:otherEndpointSchematicPorts.some(schematicPort=>schematicPort.schematic_sheet_id!==void 0)},getDirectConnectionOutsideSchematicScopeSourcePortId=({db:db2,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId})=>{if(db2.source_port.get(sourcePortId))for(let sourceTrace of db2.source_trace.list()){let connectedSourcePortIds=(sourceTrace.connected_source_port_ids??[]).map(asSourcePortId);if(connectedSourcePortIds.length!==2||(sourceTrace.connected_source_net_ids??[]).length>0||!connectedSourcePortIds.includes(sourcePortId))continue;let otherSourcePortId=connectedSourcePortIds.find(portId=>portId!==sourcePortId);if(otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db2,sourcePortId,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}))return otherSourcePortId}},resolveNetLabelForPortMissingTrace=({group,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId,connKey,sourceNet})=>{let{db:db2}=group.root,connectedPortsForKey=group.selectAll("port").filter(port=>port._getSubcircuitConnectivityKey()===connKey),{name:resolvedPortNetLabelText,wasAssignedDisplayLabel}=getNetNameFromPorts(connectedPortsForKey),assignedPortNetLabelText=wasAssignedDisplayLabel?resolvedPortNetLabelText:void 0,fallbackPortNetLabelText=wasAssignedDisplayLabel?void 0:resolvedPortNetLabelText||void 0,implicitPortLabelText=getNetNameFromSourcePorts(db2,connectedSourcePortIdsForKey),directConnectionOutsideSchematicScopeSourcePortId=getDirectConnectionOutsideSchematicScopeSourcePortId({db:db2,sourcePortId,sourcePortIdsInSchematicScope,schematicSheetId}),directConnectionOutsideSchematicScopeLabelText=directConnectionOutsideSchematicScopeSourcePortId?getSourcePortNetLabelText(db2,directConnectionOutsideSchematicScopeSourcePortId):void 0;return{text:sourceNet?.name||sourceNet?.source_net_id||assignedPortNetLabelText||directConnectionOutsideSchematicScopeLabelText||fallbackPortNetLabelText||implicitPortLabelText||connKey,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}},DEFAULT_SCHEMATIC_TEXT_FONT_SIZE=.18;function getSchematicTextBounds(text){let fontSize=text.font_size??DEFAULT_SCHEMATIC_TEXT_FONT_SIZE,width=getSchematicTextWidth({text:text.text??"",fontSize}),height=fontSize,anchor=text.anchor??"center",minX,maxX;anchor.includes("left")?(minX=0,maxX=width):anchor.includes("right")?(minX=-width,maxX=0):(minX=-width/2,maxX=width/2);let minY,maxY;anchor.includes("top")?(minY=-height,maxY=0):anchor.includes("bottom")?(minY=0,maxY=height):(minY=-height/2,maxY=height/2);let rotation42=(text.rotation??0)*Math.PI/180,cos6=Math.cos(rotation42),sin6=Math.sin(rotation42),corners=[{x:minX,y:minY},{x:minX,y:maxY},{x:maxX,y:minY},{x:maxX,y:maxY}].map(corner=>({x:text.position.x+corner.x*cos6-corner.y*sin6,y:text.position.y+corner.x*sin6+corner.y*cos6}));return getBoundsFromPoints2(corners)}var REFDES_TEXT_BOX_CHIP_OVERLAP=.01,REFDES_TEXT_BOX_CLEARANCE=.06;function isReferenceDesignatorText(text,sourceComponent){return sourceComponent?text.text===sourceComponent.display_name||text.text===sourceComponent.name:!1}function schematicTextToTextBox(text,options={}){if(!text.text)return null;let bounds=getSchematicTextBounds(text);if(isReferenceDesignatorText(text,options.sourceComponent)&&options.schematicComponent?.center&&options.schematicComponent?.size){let componentBounds=getBoundFromCenteredRect({center:options.schematicComponent.center,width:options.schematicComponent.size.width,height:options.schematicComponent.size.height}),textHeight=bounds.maxY-bounds.minY;bounds.minY>componentBounds.maxY&&(bounds.minX-=REFDES_TEXT_BOX_CLEARANCE,bounds.maxX+=REFDES_TEXT_BOX_CLEARANCE,bounds.minY=componentBounds.maxY-REFDES_TEXT_BOX_CHIP_OVERLAP,bounds.maxY=componentBounds.maxY+textHeight+REFDES_TEXT_BOX_CLEARANCE)}return{chipId:text.schematic_component_id,center:getBoundsCenter2(bounds),width:bounds.maxX-bounds.minX,height:bounds.maxY-bounds.minY,text:text.text}}var DEFAULT_MAX_MSP_PAIR_DISTANCE2=2.4,SCHEMATIC_RAIL_NET_LABEL_HEIGHT=.42;function createSchematicTraceSolverInputProblem(group,opts={}){let{db:db2}=group.root,connKeyToSourceNet=new Map,childGroups=[],componentsToVisit=[...group.children].reverse();for(;componentsToVisit.length>0;){let child=componentsToVisit.pop();if(child instanceof Group5){if(child.isSubcircuit){child._parsedProps.showAsSchematicBox&&childGroups.push(child);continue}childGroups.push(child)}componentsToVisit.push(...[...child.children].reverse())}let allSchematicGroupIds=[group.schematic_group_id,...childGroups.map(a6=>a6.schematic_group_id)],schematicComponents=db2.schematic_component.list().filter(component=>allSchematicGroupIds.includes(component.schematic_group_id)).filter(component=>opts.schematicSheetId===void 0||component.schematic_sheet_id===opts.schematicSheetId),schematicComponentIds=new Set(schematicComponents.map(component=>component.schematic_component_id)),schematicComponentsById=new Map(schematicComponents.map(component=>[component.schematic_component_id,component])),textBoxes=db2.schematic_text.list().filter(text=>text.schematic_component_id&&schematicComponentIds.has(text.schematic_component_id)).map(text=>{let schematicComponent=schematicComponentsById.get(text.schematic_component_id);if(!schematicComponent)return;let sourceComponent=db2.source_component.get(schematicComponent.source_component_id);return schematicTextToTextBox(text,{schematicComponent,sourceComponent})}).filter(textBox=>!!textBox),sectionIdBySchematicComponentId=new Map;for(let component of group.getDescendants()){let schematicComponentId=component.schematic_component_id,sectionId=component.getSchematicSectionName();schematicComponentId&§ionId&§ionIdBySchematicComponentId.set(schematicComponentId,sectionId)}let chips=[];for(let schematicComponent of schematicComponents){let chipId=schematicComponent.schematic_component_id,pins=[],schematicPorts=db2.schematic_port.list({schematic_component_id:schematicComponent.schematic_component_id});for(let schematicPort of schematicPorts){let schematicPortId=asSchematicPortId(schematicPort.schematic_port_id);pins.push({pinId:schematicPortId,x:schematicPort.center.x,y:schematicPort.center.y,_facingDirection:convertFacingDirectionToElbowDirection(schematicPort.facing_direction??null)})}let sectionId=sectionIdBySchematicComponentId.get(schematicComponent.schematic_component_id),layoutBounds=getSchematicComponentWithTextBounds({db:db2,schematicComponent})??getBoundFromCenteredRect({center:schematicComponent.center,width:schematicComponent.size.width,height:schematicComponent.size.height});chips.push({chipId,center:getBoundsCenter2(layoutBounds),width:layoutBounds.maxX-layoutBounds.minX,height:layoutBounds.maxY-layoutBounds.minY,pins,sectionId})}let schematicPortIdsInScope=new Set,schPortIdToSourcePortId=new Map,sourcePortIdToSchPortId=new Map,userNetIdToConnKey=new Map,componentPortBySchematicPortId=new Map(group.selectAll("port").filter(port=>port.schematic_port_id).map(port=>[asSchematicPortId(port.schematic_port_id),port])),resolveCanonicalNetLabelText=createCanonicalSchematicNetLabelTextResolver(group);for(let sc3 of schematicComponents){let ports=db2.schematic_port.list({schematic_component_id:sc3.schematic_component_id});for(let sp3 of ports){let schematicPortId=asSchematicPortId(sp3.schematic_port_id);if(schematicPortIdsInScope.add(schematicPortId),sp3.source_port_id){let sourcePortId=asSourcePortId(sp3.source_port_id);schPortIdToSourcePortId.set(schematicPortId,sourcePortId),sourcePortIdToSchPortId.set(sourcePortId,schematicPortId)}}}let sourcePortIdsInSchematicScope=new Set(sourcePortIdToSchPortId.keys()),netLabelsInScope=(opts.netLabels??[]).filter(netLabel=>netLabel._getConnectedPorts().some(port=>port.schematic_port_id?schematicPortIdsInScope.has(asSchematicPortId(port.schematic_port_id)):!1)),solverManagedNetLabelSchematicPortIds=new Set(netLabelsInScope.filter(netLabel=>netLabel._parsedProps.schX===void 0&&netLabel._parsedProps.schY===void 0).flatMap(netLabel=>netLabel._getConnectedPorts()).map(port=>port.schematic_port_id).filter(schematicPortId=>schematicPortId!=null).map(asSchematicPortId)),allowedSubcircuitIds=new Set;group.subcircuit_id&&allowedSubcircuitIds.add(group.subcircuit_id);for(let cg2 of childGroups)cg2.subcircuit_id&&allowedSubcircuitIds.add(cg2.subcircuit_id);let tracesInScope=db2.source_trace.list().filter(st3=>{if(st3.subcircuit_id===group.subcircuit_id)return!0;for(let source_port_id of st3.connected_source_port_ids)if(sourcePortIdToSchPortId.has(asSourcePortId(source_port_id)))return!0;return!1}),schematicPortIdsWithExternallyRoutedRepresentations=new Set;for(let sourceTrace of tracesInScope)if(sourceTrace.subcircuit_id!==group.subcircuit_id&&sourceTrace.connected_source_net_ids.length!==0)for(let sourcePortId of sourceTrace.connected_source_port_ids){let typedSourcePortId=asSourcePortId(sourcePortId),schematicPortId=sourcePortIdToSchPortId.get(typedSourcePortId);!schematicPortId||solverManagedNetLabelSchematicPortIds.has(schematicPortId)||!db2.schematic_port.list({source_port_id:sourcePortId}).some(port=>port.schematic_port_id===schematicPortId?!1:(port.schematic_component_id?db2.schematic_component.get(port.schematic_component_id):void 0)?.schematic_sheet_id===opts.schematicSheetId)||schematicPortIdsWithExternallyRoutedRepresentations.add(schematicPortId)}let externalNetIds=tracesInScope.flatMap(st3=>st3.connected_source_net_ids);for(let netId of externalNetIds){let net=db2.source_net.get(netId);net?.subcircuit_id&&allowedSubcircuitIds.add(net.subcircuit_id)}for(let net of db2.source_net.list().filter(sourceNet=>!sourceNet.subcircuit_id||allowedSubcircuitIds.has(sourceNet.subcircuit_id)))net.subcircuit_connectivity_map_key&&connKeyToSourceNet.set(net.subcircuit_connectivity_map_key,net);let directConnections=[],singlePortTraceNetConnections=[],connectedPairKeys=new Set,crossSubcircuitTraceLabelTextBySchematicPortId=new Map,sourceTraceIdByPinPairKey=new Map,connKeysWithExplicitPortNetTraces=new Set;for(let sourceTrace of tracesInScope)sourceTrace?.subcircuit_connectivity_map_key&&(sourceTrace.connected_source_port_ids?.length??0)>0&&(sourceTrace.connected_source_net_ids?.length??0)>0&&connKeysWithExplicitPortNetTraces.add(sourceTrace.subcircuit_connectivity_map_key);for(let st3 of tracesInScope){let connected=(st3.connected_source_port_ids??[]).map(sourcePortId=>sourcePortIdToSchPortId.get(asSourcePortId(sourcePortId))).filter(schematicPortId=>!!schematicPortId&&schematicPortIdsInScope.has(schematicPortId)),sourcePortIdForSingleConnectedEndpoint=connected.length===1?schPortIdToSourcePortId.get(connected[0]):void 0,otherSourcePortId=sourcePortIdForSingleConnectedEndpoint?st3.connected_source_port_ids.map(asSourcePortId).find(sourcePortId=>sourcePortId!==sourcePortIdForSingleConnectedEndpoint):void 0,crossesSchematicScopeBoundary=!!(sourcePortIdForSingleConnectedEndpoint&&otherSourcePortId&&isDirectConnectionEndpointOutsideSchematicScope({db:db2,sourcePortId:sourcePortIdForSingleConnectedEndpoint,otherSourcePortId,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId}));if(connected.length===1&&st3.connected_source_port_ids.length===2&&crossesSchematicScopeBoundary&&st3.connected_source_net_ids.length===0&&st3.subcircuit_connectivity_map_key){let schematicPortId=connected[0],sourcePortId=schPortIdToSourcePortId.get(schematicPortId);if(sourcePortId){let connKey=st3.subcircuit_connectivity_map_key,connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId2=>sourcePortId2?db2.source_port.get(sourcePortId2)?.subcircuit_connectivity_map_key===connKey:!1),{text}=resolveNetLabelForPortMissingTrace({group,sourcePortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:opts.schematicSheetId,connKey,sourceNet:connKeyToSourceNet.get(connKey)});text&&!crossSubcircuitTraceLabelTextBySchematicPortId.has(schematicPortId)&&(crossSubcircuitTraceLabelTextBySchematicPortId.set(schematicPortId,text),userNetIdToConnKey.set(text,connKey),singlePortTraceNetConnections.push({netId:text,schematicPortIds:[schematicPortId],netLabelWidth:Number(getSchematicNetLabelTextWidth2({text}).toFixed(2))}))}}else if(connected.length>=2){let traceLabel=st3.name??st3.display_name,userNetId=traceLabel??st3.source_trace_id;st3.subcircuit_connectivity_map_key&&userNetIdToConnKey.set(userNetId,st3.subcircuit_connectivity_map_key);let maxMspDist=group._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2,portsForConnection=connected.map(schematicPortId=>componentPortBySchematicPortId.get(schematicPortId)).filter(port=>!!port),renderedNetLabelText=st3.subcircuit_connectivity_map_key?resolveCanonicalNetLabelText({subcircuitConnectivityMapKey:st3.subcircuit_connectivity_map_key}).name:getNetNameFromPorts(portsForConnection).name||traceLabel,shouldRenderNetLabels=connected.slice(1).some((b6,index)=>{let a6=connected[index],portA=db2.schematic_port.get(a6),portB=db2.schematic_port.get(b6);return!portA||!portB?!1:Math.sqrt((portA.center.x-portB.center.x)**2+(portA.center.y-portB.center.y)**2)>maxMspDist}),netLabelWidth=renderedNetLabelText&&shouldRenderNetLabels?Number(getSchematicNetLabelTextWidth2({text:renderedNetLabelText}).toFixed(2)):void 0;for(let i6=0;i6<connected.length-1;i6++){let a6=connected[i6],b6=connected[i6+1],pairKey=[a6,b6].sort().join("::");connectedPairKeys.has(pairKey)||(connectedPairKeys.add(pairKey),sourceTraceIdByPinPairKey.set(pairKey,st3.source_trace_id),directConnections.push({schematicPortIds:[a6,b6],netId:userNetId,netLabelWidth,connKey:st3.subcircuit_connectivity_map_key}))}}}let netConnections=[...singlePortTraceNetConnections],connKeyToSchematicPortIds=new Map;for(let[schId,srcPortId]of schPortIdToSourcePortId){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schId))continue;let sp3=db2.source_port.get(srcPortId);if(!sp3?.subcircuit_connectivity_map_key)continue;let connKey=sp3.subcircuit_connectivity_map_key;connKeyToSchematicPortIds.has(connKey)||connKeyToSchematicPortIds.set(connKey,[]),connKeyToSchematicPortIds.get(connKey).push(schId)}applyInlineNetLabelEligibility({directConnections,connKeyToSchematicPortIds,connKeyToSourceNet,resolveCanonicalNetLabelText});for(let[connKey,schematicPortIds]of connKeyToSchematicPortIds){let sourceNet=connKeyToSourceNet.get(connKey);if(sourceNet&&schematicPortIds.length>=1){let seenRoutedSchematicPortIds=new Set,uniqueSchematicPortIds=schematicPortIds.filter(schematicPortId=>{let componentPort=componentPortBySchematicPortId.get(schematicPortId),routedSchematicPortIdValue=componentPort?getPortForSchematicSymbolPort(componentPort).schematic_port_id:null,routedSchematicPortId=routedSchematicPortIdValue?asSchematicPortId(routedSchematicPortIdValue):schematicPortId;return seenRoutedSchematicPortIds.has(routedSchematicPortId)?!1:(seenRoutedSchematicPortIds.add(routedSchematicPortId),!0)}),userNetId=String(sourceNet.name||sourceNet.source_net_id||connKey);userNetIdToConnKey.set(userNetId,connKey);let netLabelTextWidth=Number(getSchematicNetLabelTextWidth2({text:String(userNetId)}).toFixed(2)),netLabelWidth=netLabelTextWidth,netLabelHeight;(sourceNet.is_ground||sourceNet.is_power)&&(netLabelWidth=SCHEMATIC_RAIL_NET_LABEL_HEIGHT,netLabelHeight=netLabelTextWidth),netConnections.push({netId:userNetId,schematicPortIds:uniqueSchematicPortIds,netLabelWidth,netLabelHeight})}}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?netToAllowedOrientations[net.name]=["y-"]:net.is_power?netToAllowedOrientations[net.name]=["y+"]:netToAllowedOrientations[net.name]=["x-","x+"]);for(let{netId}of singlePortTraceNetConnections)netToAllowedOrientations[netId]??(netToAllowedOrientations[netId]=["x-","x+"]);return netToAllowedOrientations})();return{inputProblem:{chips,directConnections:directConnections.map(({schematicPortIds,connKey,...connection})=>({...connection,pinIds:schematicPortIds})),netConnections:netConnections.map(({schematicPortIds,...connection})=>({...connection,pinIds:schematicPortIds})),textBoxes,availableNetLabelOrientations,maxMspPairDistance:group._parsedProps.schMaxTraceDistance??DEFAULT_MAX_MSP_PAIR_DISTANCE2},connKeyToSourceNet,userNetIdToConnKey,crossSubcircuitTraceLabelTextBySchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,netLabelsInScope,sourceTraceIdByPinPairKey}}var getSchematicPortIdsWithAssignedNetLabels=netLabels=>{let schematicPortIdsWithNetLabels=new Set;for(let netLabel of netLabels){let{schX,schY}=netLabel._parsedProps;if(schX===void 0&&schY===void 0)continue;let netLabelPorts=netLabel._getConnectedPorts();for(let port of netLabelPorts)port.schematic_port_id&&schematicPortIdsWithNetLabels.add(asSchematicPortId(port.schematic_port_id))}return schematicPortIdsWithNetLabels},getSchematicPortIdsWithRoutedTraces=({solver})=>{let solvedTraces=solver.traceCleanupSolver?.getOutput().traces??solver.traceLabelOverlapAvoidanceSolver?.getOutput().traces??solver.schematicTraceLinesSolver?.solvedTracePaths??[],schematicPortIdsWithRoutedTraces=new Set;for(let solvedTrace of solvedTraces){let points=solvedTrace?.tracePath;if(!Array.isArray(points)||points.length<2)continue;let pinIds=Array.isArray(solvedTrace.pins)?solvedTrace.pins.map(pin=>pin.pinId):solvedTrace.pinIds;for(let pinId of pinIds){let schPortId=asSchematicPortId(pinId);schPortId&&schematicPortIdsWithRoutedTraces.add(schPortId)}}return schematicPortIdsWithRoutedTraces},NEAR_EXISTING_NET_LABEL_DISTANCE=.5,SAME_ANCHOR_POSITION_DISTANCE=.1,doesSchematicNetLabelRepresentCurrentSourceConnection=args=>{let{nl:nl3,connKey,sourceNet,text}=args;return sourceNet?.source_net_id&&nl3.source_net_id?nl3.source_net_id===sourceNet.source_net_id:nl3.source_net_id?nl3.source_net_id===connKey:nl3.text===text},insertNetLabelsForPortsMissingTrace=({schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,group,schPortIdToSourcePortId,connKeyToSourceNet})=>{let{db:db2}=group.root,sourcePortIdsInSchematicScope=new Set(Array.from(schematicPortIdsInScope).map(schematicPortId=>schPortIdToSourcePortId.get(schematicPortId)).filter(sourcePortId=>sourcePortId!==void 0));for(let schematicPortId of schematicPortIdsInScope){if(schematicPortIdsWithExternallyRoutedRepresentations.has(schematicPortId))continue;let schPort=db2.schematic_port.get(schematicPortId);if(!schPort||schPort.is_connected)continue;let srcPortId=schPortIdToSourcePortId.get(schematicPortId);if(!srcPortId)continue;let sourcePort=db2.source_port.get(srcPortId);if(group._parsedProps.showAsSchematicBox&&sourcePort?.subcircuit_id===group.subcircuit_id&&!sourcePort.source_component_id&&getDirectConnectionOutsideSchematicScopeSourcePortId({db:db2,sourcePortId:srcPortId,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id}))continue;let connKey=sourcePort?.subcircuit_connectivity_map_key;if(!connKey)continue;let sourceNet=connKeyToSourceNet.get(connKey),schComponent=schPort.schematic_component_id?db2.schematic_component.get(schPort.schematic_component_id):void 0,portSchematicSheetId=schComponent?.schematic_sheet_id??group._resolveSchematicSheetId(),connectedSourcePortIdsForKey=Array.from(schematicPortIdsInScope).map(portId=>schPortIdToSourcePortId.get(portId)).filter(sourcePortId=>sourcePortId?db2.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1),{text,wasAssignedDisplayLabel,directConnectionOutsideSchematicScopeSourcePortId}=resolveNetLabelForPortMissingTrace({group,sourcePortId:srcPortId,connectedSourcePortIdsForKey,sourcePortIdsInSchematicScope,schematicSheetId:schPort.schematic_sheet_id,connKey,sourceNet}),shouldPreserveDirectConnectionEndpointLabels=(directConnectionOutsideSchematicScopeSourcePortId?db2.schematic_port.list({source_port_id:directConnectionOutsideSchematicScopeSourcePortId}).some(port=>!port.is_connected):!1)&&!wasAssignedDisplayLabel,isCollapsedBoxPort=schComponent?.is_box_with_pins&&sourcePort&&!sourcePort.source_component_id,hasExternalTrace=db2.source_trace.list().some(trace=>trace.connected_source_port_ids.includes(srcPortId)&&trace.subcircuit_id!==sourcePort?.subcircuit_id);if(isCollapsedBoxPort&&!hasExternalTrace&&!!!(sourceNet||wasAssignedDisplayLabel))continue;let connectedPortCountForKey=Array.from(schematicPortIdsInScope).filter(portId=>{let sourcePortId=schPortIdToSourcePortId.get(portId);return sourcePortId?db2.source_port.get(sourcePortId)?.subcircuit_connectivity_map_key===connKey:!1}).length,isGndNet=sourceNet?.is_ground??!1,isPowerNet=!isGndNet&&(sourceNet?.is_power??!1),side;isGndNet?side="top":isPowerNet?side="bottom":side=getEnteringEdgeFromDirection(schPort.facing_direction||"right")||"right";let center2=computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side:side,text}),existingNetLabelForCurrentSourceConnection=db2.schematic_net_label.list().find(nl3=>nl3.schematic_sheet_id!==portSchematicSheetId?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text}));if(existingNetLabelForCurrentSourceConnection&&connectedPortCountForKey<=1&&!shouldPreserveDirectConnectionEndpointLabels){db2.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:center2,anchor_side:side});continue}if(existingNetLabelForCurrentSourceConnection){let dx3=existingNetLabelForCurrentSourceConnection.anchor_position.x-schPort.center.x,dy3=existingNetLabelForCurrentSourceConnection.anchor_position.y-schPort.center.y;if(dx3*dx3+dy3*dy3<NEAR_EXISTING_NET_LABEL_DISTANCE*NEAR_EXISTING_NET_LABEL_DISTANCE){if(isGndNet){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db2.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side,text}),anchor_side})}else if(!isPowerNet&&existingNetLabelForCurrentSourceConnection.text===text){let anchor_side=existingNetLabelForCurrentSourceConnection.anchor_side??side;db2.schematic_net_label.update(existingNetLabelForCurrentSourceConnection.schematic_net_label_id,{text,anchor_position:schPort.center,center:computeSchematicNetLabelCenter({anchor_position:schPort.center,anchor_side,text}),anchor_side})}continue}if(db2.schematic_net_label.list().some(nl3=>{if(nl3.schematic_sheet_id!==portSchematicSheetId)return!1;let dx22=nl3.anchor_position.x-schPort.center.x,dy22=nl3.anchor_position.y-schPort.center.y;return dx22*dx22+dy22*dy22>=SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE?!1:doesSchematicNetLabelRepresentCurrentSourceConnection({nl:nl3,connKey,sourceNet,text})}))continue}if(!sourceNet&&!shouldPreserveDirectConnectionEndpointLabels)for(let nl3 of db2.schematic_net_label.list()){if(nl3.source_net_id!==connKey||nl3.schematic_sheet_id!==portSchematicSheetId)continue;connectedSourcePortIdsForKey.some(sourcePortId=>{let schPortId=Array.from(schPortIdToSourcePortId.entries()).find(([,id3])=>id3===sourcePortId)?.[0],connectedSchPort;if(schPortId&&(connectedSchPort=db2.schematic_port.get(schPortId)),!connectedSchPort?.center||!nl3.anchor_position)return!1;let dx3=nl3.anchor_position.x-connectedSchPort.center.x,dy3=nl3.anchor_position.y-connectedSchPort.center.y;return dx3*dx3+dy3*dy3<SAME_ANCHOR_POSITION_DISTANCE*SAME_ANCHOR_POSITION_DISTANCE})||db2.schematic_net_label.delete(nl3.schematic_net_label_id)}let netLabel={text,source_net_id:sourceNet?.source_net_id??connKey,anchor_position:schPort.center,center:center2,anchor_side:side,schematic_sheet_id:portSchematicSheetId};db2.schematic_net_label.insert(netLabel)}},debug11=(0,import_debug16.default)("Group_doInitialSchematicTraceRender"),renderSchematicTracesForSheet=({group,schematicSheetId,netLabels})=>{let{inputProblem,connKeyToSourceNet,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,userNetIdToConnKey,crossSubcircuitTraceLabelTextBySchematicPortId,connKeysWithExplicitPortNetTraces,netLabelsInScope,sourceTraceIdByPinPairKey}=createSchematicTraceSolverInputProblem(group,{schematicSheetId,netLabels});if(inputProblem.chips.length===0)return;let schematicPortIdsWithPreExistingNetLabels=getSchematicPortIdsWithAssignedNetLabels(netLabelsInScope);if(!(inputProblem.directConnections.length>0||inputProblem.netConnections.length>0)){insertNetLabelsForPortsMissingTrace({group,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet});return}debug11.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),solverConstructorArgs=solver.getConstructorParams();group.root?.emit("solver:started",{type:"solver:started",solverName:"SchematicTracePipelineSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:group.getString()}),solver.solve();let schematicPortIdsWithRoutedTraces=getSchematicPortIdsWithRoutedTraces({solver});applyTracesFromSolverOutput({group,solver,userNetIdToConnKey,schematicPortIdsWithPreExistingNetLabels}),applyNetLabelPlacements({group,solver,connKeyToSourceNet,userNetIdToConnKey,crossSubcircuitTraceLabelTextBySchematicPortId,connKeysWithExplicitPortNetTraces,schematicPortIdsWithPreExistingNetLabels,schematicPortIdsWithRoutedTraces,netLabels:netLabelsInScope}),applyInlineNetLabelPlacements({group,solver,userNetIdToConnKey,sourceTraceIdByPinPairKey}),insertNetLabelsForPortsMissingTrace({group,schematicPortIdsInScope,schematicPortIdsWithExternallyRoutedRepresentations,schPortIdToSourcePortId,connKeyToSourceNet})},Group_doInitialSchematicTraceRender=group=>{if(!group.root?._featureMspSchematicTraceRouting||!group.isSubcircuit||group.root?.schematicDisabled)return;let netLabels=new Set,board=group._getBoard(),schematicScope=group;for(;schematicScope;){if(schematicScope instanceof Group5)for(let netLabel of schematicScope.selectAll("netlabel"))netLabels.add(netLabel);if(schematicScope===board)break;schematicScope=schematicScope.parent}let netLabelComponents=[...netLabels],schematicGroupIds=new Set([group,...group.getDescendants().filter(component=>component instanceof Group5)].map(schematicGroup=>schematicGroup.schematic_group_id).filter(schematicGroupId=>!!schematicGroupId)),schematicSheetIds=new Set(group.root.db.schematic_component.list().filter(schematicComponent=>schematicGroupIds.has(schematicComponent.schematic_group_id)).map(schematicComponent=>schematicComponent.schematic_sheet_id).filter(schematicSheetId=>!!schematicSheetId));if(schematicSheetIds.size===0){renderSchematicTracesForSheet({group,netLabels:netLabelComponents});return}for(let schematicSheetId of schematicSheetIds)renderSchematicTracesForSheet({group,schematicSheetId,netLabels:netLabelComponents})};function getTransientVoltageGraphNamesFromSpiceNetlist(spiceNetlist){let graphNames=[];for(let printStatement of spiceNetlist.printStatements){let match2=printStatement.match(/^\.PRINT\s+TRAN\s+(.+)$/i);if(match2)for(let voltageExpression of match2[1].match(/V\(([^)]+)\)/g)??[]){let nodeList=voltageExpression.slice(2,-1);graphNames.push(nodeList.replace(",","-"))}}return graphNames}var SIMULATION_COLOR_PALETTE=["rgb(0, 150, 0)","rgb(0, 0, 220)","rgb(220, 0, 0)","rgb(0, 160, 160)","rgb(180, 0, 180)","rgb(170, 140, 0)","rgb(220, 120, 0)","rgb(128, 128, 128)","rgb(100, 0, 180)","rgb(140, 70, 0)","rgb(220, 80, 120)","rgb(0, 120, 220)","rgb(0, 120, 120)","rgb(120, 0, 0)","rgb(0, 0, 132)","rgb(80, 80, 80)"],idToColorMap=new Map,colorIndex=0;function getSimulationColorForId(id3){if(idToColorMap.has(id3))return idToColorMap.get(id3);let color=SIMULATION_COLOR_PALETTE[colorIndex];return colorIndex=(colorIndex+1)%SIMULATION_COLOR_PALETTE.length,idToColorMap.set(id3,color),color}function resetSimulationColorState(){idToColorMap.clear(),colorIndex=0}var getSpiceyEngine=()=>({async simulate(spiceString){let simulation_experiment_id="spice-experiment-1",{circuit:parsedCircuit,tran}=simulate(spiceString);return{simulationResultCircuitJson:spiceyTranToVGraphs(tran,parsedCircuit,simulation_experiment_id)}}}),isCurrentGraph2=element=>element.type==="simulation_transient_current_graph",isSimulationCurrentResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_current"||circuitElement.type==="simulation_dc_sweep_current_graph"||circuitElement.type==="simulation_ac_sweep_current_graph",isSimulationVoltageResult=circuitElement=>circuitElement.type==="simulation_dc_operating_point_voltage"||circuitElement.type==="simulation_dc_sweep_voltage_graph"||circuitElement.type==="simulation_ac_sweep_voltage_graph",isVoltageGraph=element=>element.type==="simulation_transient_voltage_graph",isSimulationAnalysisResult2=circuitElement=>isVoltageGraph(circuitElement)||isCurrentGraph2(circuitElement)||isSimulationVoltageResult(circuitElement)||isSimulationCurrentResult(circuitElement),attachSweepCoordinateToSimulationResult=({simulationResult,simulationParameterSweepCoordinate})=>{if(!simulationParameterSweepCoordinate||!isSimulationAnalysisResult2(simulationResult))return simulationResult;let simulationResultWithSweepCoordinate={...simulationResult},simulationResultIdKey=`${simulationResultWithSweepCoordinate.type}_id`;return Reflect.deleteProperty(simulationResultWithSweepCoordinate,simulationResultIdKey),simulationResultWithSweepCoordinate.simulation_parameter_sweep_coordinate=simulationParameterSweepCoordinate,simulationResultWithSweepCoordinate},getSourceComponentOrThrow=({circuitJson,sourceComponentId,isMatchingSourceComponent})=>{let sourceComponent=circuitJson.find(circuitElement=>isMatchingSourceComponent(circuitElement)&&circuitElement.source_component_id===sourceComponentId);if(!sourceComponent)throw new Error(`Parameter sweep target ${sourceComponentId} was not found`);return sourceComponent},applyParameterSweepCoordinate=({circuitJson,parameterSweep,simulationParameterSweepCoordinate})=>{let sweptCircuitJson=structuredClone(circuitJson),parameterValue=simulationParameterSweepCoordinate.parameter_value;if(parameterSweep.parameter_type==="resistance"){let resistor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.resistor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_resistor"});return resistor.resistance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="capacitance"){let capacitor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.capacitor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_capacitor"});return capacitor.capacitance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="inductance"){let inductor=getSourceComponentOrThrow({circuitJson:sweptCircuitJson,sourceComponentId:parameterSweep.inductor_source_component_id,isMatchingSourceComponent:circuitElement=>circuitElement.type==="source_component"&&circuitElement.ftype==="simple_inductor"});return inductor.inductance=parameterValue,sweptCircuitJson}if(parameterSweep.parameter_type==="voltage"){let groundNet=sweptCircuitJson.find(circuitElement=>circuitElement.type==="source_net"&&circuitElement.name.toUpperCase()==="GND");if(!groundNet||groundNet.type!=="source_net")throw new Error("A voltage parameter sweep requires a GND net");let sweepVoltageSource={type:"simulation_voltage_source",simulation_voltage_source_id:`simulation_voltage_source_${simulationParameterSweepCoordinate.simulation_parameter_sweep_id}_${simulationParameterSweepCoordinate.sweep_index}`,is_dc_source:!0,positive_source_net_id:parameterSweep.source_net_id,negative_source_net_id:groundNet.source_net_id,voltage:parameterValue};return sweptCircuitJson.push(sweepVoltageSource),sweptCircuitJson}if(parameterSweep.parameter_type==="current"){let currentSourcePortIds=new Set(sweptCircuitJson.filter(circuitElement=>circuitElement.type==="source_port"&&circuitElement.source_component_id===parameterSweep.current_source_component_id).map(sourcePort=>sourcePort.source_port_id)),currentSource=sweptCircuitJson.find(circuitElement=>circuitElement.type==="simulation_current_source"&&(circuitElement.is_dc_source?!!(circuitElement.positive_source_port_id&¤tSourcePortIds.has(circuitElement.positive_source_port_id)):!!(circuitElement.terminal1_source_port_id&¤tSourcePortIds.has(circuitElement.terminal1_source_port_id))));if(!currentSource)throw new Error(`Current sweep target ${parameterSweep.current_source_component_id} has no simulation source`);return currentSource.current=parameterValue,sweptCircuitJson}throw new Error("Parameter sweep target is incomplete")},createSimulationRun=({circuitJson,simulationParameterSweepCoordinate})=>{let spiceNetlist=circuitJsonToSpice(circuitJson);return{spiceNetlist,spiceString:spiceNetlist.toSpiceString(),simulationParameterSweepCoordinate}},createSimulationRuns=({circuitJson,simulationExperimentId})=>{let parameterSweep=circuitJson.find(circuitElement=>circuitElement.type==="simulation_parameter_sweep"&&circuitElement.simulation_experiment_id===simulationExperimentId);return parameterSweep?parameterSweep.parameter_values.map((parameterValue,sweepIndex)=>{let simulationParameterSweepCoordinate={simulation_parameter_sweep_id:parameterSweep.simulation_parameter_sweep_id,sweep_index:sweepIndex,parameter_value:parameterValue,parameter_unit:parameterSweep.parameter_unit};return createSimulationRun({circuitJson:applyParameterSweepCoordinate({circuitJson,parameterSweep,simulationParameterSweepCoordinate}),simulationParameterSweepCoordinate})}):[createSimulationRun({circuitJson})]},SI_PREFIX_MULTIPLIERS={p:1e-12,n:1e-9,u:1e-6,\u00B5:1e-6,m:.001,"":1,k:1e3,K:1e3,M:1e6,G:1e9},parseSimulationGraphValue=value=>{if(value===void 0)return;if(typeof value=="number")return value;let match2=value.trim().match(/^([+-]?(?:\d+(?:\.\d*)?|\.\d+))\s*([pnumµkKMG]?)/);if(!match2)return;let numericValue=Number(match2[1]);if(Number.isFinite(numericValue))return numericValue*(SI_PREFIX_MULTIPLIERS[match2[2]??""]??1)},getVoltageProbeGraphDisplayOverrides=probe=>{let{graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=probe._parsedProps;return{displayName:graphDisplayName,color:probe.color??void 0,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphVoltagePerDiv)}},getAmmeterGraphDisplayOverrides=ammeter=>{let{color,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=ammeter._parsedProps;return{displayName:graphDisplayName,color,center:graphCenter,verticalOffset:parseSimulationGraphValue(graphVerticalOffset),valuePerDiv:parseSimulationGraphValue(graphCurrentPerDiv)}},getFiniteBounds=values=>{let min=Number.POSITIVE_INFINITY,max2=Number.NEGATIVE_INFINITY;for(let value of values)Number.isFinite(value)&&(min=Math.min(min,value),max2=Math.max(max2,value));return min===Number.POSITIVE_INFINITY||max2===Number.NEGATIVE_INFINITY?null:{min,max:max2}},getGraphLevels2=graph=>graph.type==="simulation_transient_current_graph"?graph.current_levels:graph.voltage_levels,DISPLAY_SECTION_HEIGHT_DIVS=2,DISPLAY_SECTION_DATA_FILL=.8,getAutoDisplayScale=({graph,index,graphCount})=>{let bounds=getFiniteBounds(getGraphLevels2(graph));if(!bounds)return null;let center2=(bounds.min+bounds.max)/2,span=bounds.max-bounds.min,valuePerDiv=span>0?span/(DISPLAY_SECTION_HEIGHT_DIVS*DISPLAY_SECTION_DATA_FILL):Math.max(Math.abs(center2)/10,Number.EPSILON);return{display_center_value:center2,display_center_offset_divs:((graphCount-1)/2-index)*DISPLAY_SECTION_HEIGHT_DIVS,value_per_div:valuePerDiv}},isDefinedString=value=>value!==void 0,getTraceByVoltageProbeId=traces=>{let traceByVoltageProbeId=new Map;for(let trace of traces)trace.simulation_voltage_probe_id&&traceByVoltageProbeId.set(trace.simulation_voltage_probe_id,trace);return traceByVoltageProbeId},getTraceByCurrentProbeId=traces=>{let traceByCurrentProbeId=new Map;for(let trace of traces)trace.simulation_current_probe_id&&traceByCurrentProbeId.set(trace.simulation_current_probe_id,trace);return traceByCurrentProbeId},insertIndependentAxisScopeTraces=({db:db2,graphs,graphDisplayOverridesByProbeId})=>{if(graphs.length===0)return;let existingScopeTraces=db2.simulation_oscilloscope_trace.list(),traceByVoltageProbeId=getTraceByVoltageProbeId(existingScopeTraces),traceByCurrentProbeId=getTraceByCurrentProbeId(existingScopeTraces),graphIdsWithTrace=new Set(existingScopeTraces.flatMap(trace=>[trace.simulation_transient_voltage_graph_id,trace.simulation_transient_current_graph_id]).filter(isDefinedString));for(let[index,{type,graph}]of graphs.entries()){let scale22=getAutoDisplayScale({graph,index,graphCount:graphs.length});if(!scale22)continue;let graphId=type==="voltage"?graph.simulation_transient_voltage_graph_id:graph.simulation_transient_current_graph_id;if(graphIdsWithTrace.has(graphId))continue;let sourceProbeId=graph.source_probe_id??void 0,probeTrace=sourceProbeId===void 0?void 0:type==="voltage"?traceByVoltageProbeId.get(sourceProbeId):traceByCurrentProbeId.get(sourceProbeId),overrides=sourceProbeId===void 0?void 0:graphDisplayOverridesByProbeId?.get(sourceProbeId),valuePerDiv=overrides?.valuePerDiv??scale22.value_per_div,displayCenter=overrides?.center??scale22.display_center_value,displayCenterOffsetDivs=overrides?.verticalOffset!==void 0&&valuePerDiv!==0?overrides.verticalOffset/valuePerDiv:probeTrace?.display_center_offset_divs??scale22.display_center_offset_divs;db2.simulation_oscilloscope_trace.insert({...type==="voltage"?{simulation_transient_voltage_graph_id:graph.simulation_transient_voltage_graph_id,volts_per_div:valuePerDiv}:{simulation_transient_current_graph_id:graph.simulation_transient_current_graph_id,amps_per_div:valuePerDiv},display_name:overrides?.displayName??probeTrace?.display_name,color:overrides?.color??probeTrace?.color??graph.color,display_center_value:displayCenter,display_center_offset_divs:displayCenterOffsetDivs})}},isCircuitElementInput=element=>!!(element&&typeof element=="object"&&"type"in element),debug12=(0,import_debug20.default)("tscircuit:core:Group_doInitialSimulationSpiceEngineRender"),getCircuitJsonForAnalogSimulation=({circuitJson,simulationExperimentId,voltageProbes,ammeters})=>{let voltageProbeIds=new Set(voltageProbes.map(voltageProbe=>voltageProbe.simulation_voltage_probe_id).filter(simulationVoltageProbeId=>!!simulationVoltageProbeId)),currentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId));return circuitJson.filter(element=>{if(element.type==="simulation_experiment")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_voltage_probe")return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.type==="simulation_current_probe")return currentProbeIds.has(element.simulation_current_probe_id);if(element.type==="simulation_parameter_sweep")return element.simulation_experiment_id===simulationExperimentId;if(element.type==="simulation_oscilloscope_trace"){if(element.simulation_voltage_probe_id)return voltageProbeIds.has(element.simulation_voltage_probe_id);if(element.simulation_current_probe_id)return currentProbeIds.has(element.simulation_current_probe_id)}return!(element.type==="simulation_transient_voltage_graph"||element.type==="simulation_transient_current_graph"||element.type==="simulation_dc_operating_point_voltage"||element.type==="simulation_dc_operating_point_current"||element.type==="simulation_dc_sweep_voltage_graph"||element.type==="simulation_dc_sweep_current_graph"||element.type==="simulation_ac_sweep_voltage_graph"||element.type==="simulation_ac_sweep_current_graph"||element.type==="simulation_unknown_experiment_error")})};function Group_doInitialSimulationSpiceEngineRender(group){if(!group.isSubcircuit)return;let{root}=group;if(!root)return;let analogSimulations=[...group.selectAll("analogsimulation"),...group.selectAll("analogtransientsimulation"),...group.selectAll("analogdcoperatingpointsimulation"),...group.selectAll("analogdcsweepsimulation"),...group.selectAll("analogacsweepsimulation")];if(analogSimulations.length===0)return;resetSimulationColorState();let spiceEngineMap={...root.platform?.spiceEngineMap};spiceEngineMap.spicey||(spiceEngineMap.spicey=getSpiceyEngine());for(let analogSimulation of analogSimulations){let simulationExperimentId=analogSimulation.simulation_experiment_id;if(!simulationExperimentId){debug12("No simulation experiment id found, skipping simulation");continue}let simulationExperiment=root.db.simulation_experiment.get(simulationExperimentId);if(!simulationExperiment){debug12("No simulation experiment found, skipping simulation");continue}let simulationScope=analogSimulation.getGroup()??group,voltageProbes=simulationScope.selectAll("voltageprobe"),ammeters=simulationScope.selectAll("ammeter"),circuitJson=getCircuitJsonForAnalogSimulation({circuitJson:root.db.toArray(),simulationExperimentId,voltageProbes,ammeters}),simulationRuns;try{simulationRuns=createSimulationRuns({circuitJson,simulationExperimentId}),debug12(`Generated ${simulationRuns.length} SPICE run(s):
|
|
740
740
|
${simulationRuns.map(simulationRun=>simulationRun.spiceString).join(`
|
|
741
|
-
`)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&¤tProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"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(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine2.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}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(t53=>{let source_trace3=db2.source_trace.get(t53.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.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.subcircuit_id??group.source_group_id??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_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??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_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.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.subcircuit_id??group.source_group_id??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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group=>{let isRootSubcircuit=group.root?.firstChild===group;if(!group.isSubcircuit||!isRootSubcircuit||group._getBoard())return;let routingDisabled=group.root?.pcbRoutingDisabled||group.getInheritedProperty("routingDisabled"),drcChecksDisabled=group.root?.platform?.drcChecksDisabled??group.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group.root?.platform?.routingDrcChecksDisabled??group.getInheritedProperty("routingDrcChecksDisabled");if(group.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group._hasTracesToRoute()&&!group._areChildSubcircuitsRouted()||group._standaloneSubcircuitDrcChecksComplete||group._standaloneSubcircuitDrcChecksInProgress)return;let{db:db2}=group.root,subcircuitCircuitJson=db2.subtree({subcircuit_id:group.subcircuit_id}).toArray();group._standaloneSubcircuitDrcChecksInProgress=!0,group._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db2.insertAll(dedupePcbDrcErrors(results)),group._standaloneSubcircuitDrcChecksComplete=!0}finally{group._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},baseBreakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}),BaseBreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"matchedSourceTraceId",null);__publicField(this,"isPcbPrimitive",!0)}_getSourceTraceIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st3=>st3.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(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint(){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point3=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.matchedSourceTraceId??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:position4.x,y:position4.y});this.pcb_breakout_point_id=pcb_breakout_point3.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position4=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position4.x,y:position4.y},bounds:{left:position4.x,top:position4.y,right:position4.x,bottom:position4.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;if(!this.pcb_breakout_point_id)return;let updatedProperties={x:newCenter.x,y:newCenter.y};this.matchedSourceTraceId&&(updatedProperties.source_trace_id=this.matchedSourceTraceId),db2.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_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}}},BreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){if(this.matchedPort)return;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}"`))}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint()}};function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a6,b6){return getPhaseSortValue(a6.routingPhaseIndex)-getPhaseSortValue(b6.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function convertPortSelectorToEndpointKey(selector){return selector.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){return trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey)}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),buses=group.selectAll("bus"),breakouts=group.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),groupFanoutProps=group._parsedProps,hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex),connectionSelectorEndpointKeys=connectionSelectors.map(convertPortSelectorToEndpointKey);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(!breakoutByTrace.has(trace)&&connectionSelectorEndpointKeys.some(endpointKey=>traceHasEndpointMatchingConnectionSelector(trace,endpointKey))){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex)}let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps2=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints2(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,routingBounds,fanoutBounds:hasExplicitGeometry?routingBounds:hasExplicitFanoutBoundaryPadding?void 0:routingBounds,autorouter:breakoutProps2.autorouter??"fanout",busFanoutDirections:breakoutProps2.busFanoutDirections,fanoutBoundaryPadding:breakoutProps2.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps2.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps2.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps2.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps2.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1723",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",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","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/breakout-point-solver":"github:tscircuit/breakout-point-solver#bac9629","@tscircuit/capacity-autorouter":"^0.0.822","@tscircuit/checks":"^0.0.166","@tscircuit/circuit-json-util":"^0.0.106","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.49","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/fanout-solver":"0.0.33","@tscircuit/footprinter":"^0.0.418","@tscircuit/image-utils":"^0.0.8","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.84","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.624","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"^0.0.140","@tscircuit/solver-utils":"^0.0.16","@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.469","circuit-json-to-bpc":"^0.0.13","circuit-json-to-gltf":"^0.0.118","circuit-json-to-connectivity-map":"^0.0.27","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.400",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.117",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.27",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.239",spicets:"^0.0.4",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/create-fdm-enclosure":"*","@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":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.19","calculate-packing":"^0.0.86","css-select":"5.1.0","format-si-unit":"^0.0.12",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"},overrides:{"@tscircuit/circuit-json-util":"^0.0.106","@tscircuit/props":"^0.0.624","circuit-json":"^0.0.469"}},getFnv1aHash=value=>{let hash=2166136261;for(let i6=0;i6<value.length;i6++)hash^=value.charCodeAt(i6),hash=Math.imul(hash,16777619);return hash>>>0},getSrjHash=simpleRouteJson=>{let serializedSrj=JSON.stringify(simpleRouteJson),hash1=getFnv1aHash(serializedSrj),hash2=getFnv1aHash(`${serializedSrj}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=simpleRouteJson=>`routes:core@${package_default3.version}:srj:${getSrjHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(trace.source_trace_id)))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPcbGroupId||plan.routingPhaseIndex!==null)return!0;return!1}var pointsReferToSameEndpoint=(first,second)=>first.pointId&&second.pointId?first.pointId===second.pointId:Math.abs(first.x-second.x)<=1e-6&&Math.abs(first.y-second.y)<=1e-6,getPairedExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>pointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>pointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?{x:pairedPoints[0].x,y:pairedPoints[0].y}:void 0};function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let connectionByName=new Map(connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=connectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var POINT_MATCH_TOLERANCE=1e-6,pointsMatch3=(first,second)=>Math.abs(first.x-second.x)<=POINT_MATCH_TOLERANCE&&Math.abs(first.y-second.y)<=POINT_MATCH_TOLERANCE&&first.layer===second.layer,removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}};function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point6=>({...point6}))})),synchronizedBreakoutPoints=[];for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalConnection=baseConnections.find(connection=>connection.routingPcbGroupId!==routingPcbGroupId&&connection.source_trace_id===inputConnection.source_trace_id&&connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>pointsMatch3(globalPoint,inputPoint))));if(!globalConnection)continue;let previousGlobalPointIndex=globalConnection.pointsToConnect.findIndex(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>pointsMatch3(globalPoint,inputPoint)));if(previousGlobalPointIndex<0)continue;let previousPoint=globalConnection.pointsToConnect[previousGlobalPointIndex],changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!pointsMatch3(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex],{layers:_previousLayers,terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.layers?{layers:[...fanoutExitPoint.layers]}:{},...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[previousGlobalPointIndex]=synchronizedGlobalPoint,synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(fanoutOutputSimpleRouteJson,routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections},synchronizedBreakoutPoints}}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,x6,y2,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x6)<tolerance&&Math.abs(pad2.y-y2)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x6,y2){for(let pad2 of padInfos)if(x6>=pad2.minX&&x6<=pad2.maxX&&y2>=pad2.minY&&y2<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i6=0;i6<route.length;i6++){let point6=route[i6];if(currentSegment.push(point6),point6.route_type==="wire"&&i6>0&&i6<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}var claimSrjAssignablePcbViasTraversedByRoute=({db:db2,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint of routeWithSrjMetadata){if(routePoint.route_type!=="through_pad")continue;let pcbViaId=routePoint.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db2.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db2.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let stageOutputPcbTraceIds=new Set(stageOutputPcbTraces.map(trace=>trace.pcb_trace_id));return[...accumulatedPcbTraces.filter(trace=>!stageOutputPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON=1e-6;function isPointOnWireSegment({point:point6,segmentStart,segmentEnd}){return point6.layer&&(segmentStart.layer!==point6.layer||segmentEnd.layer!==point6.layer)?!1:pointToSegmentDistance(point6,segmentStart,segmentEnd)<=POINT_EPSILON}function isPointInSmtPad({point:point6,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point6.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point6,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point6,hole,traceWidth=0}){return distance2(point6,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db2,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point6=>!!point6&&point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db2.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db2.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db2.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db2.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db2.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point6=>point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);return[route[0],route[route.length-1]].filter(point6=>!!point6)}function getSourceIdsFromConnectedPcbTraces(db2,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db2.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db2.source_trace.get(existingTrace.source_trace_id)&&!db2.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point6=>point6.route_type==="wire");for(let i6=0;i6<existingRoute.length-1;i6++){let segmentStart=existingRoute[i6],segmentEnd=existingRoute[i6+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db2,trace){let sourcePortIds=new Set;for(let point6 of trace.route)for(let pcbPortId of[point6.start_pcb_port_id,point6.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db2.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db2,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db2,trace,subcircuit_id}){if(trace.source_trace_id&&(db2.source_trace.get(trace.source_trace_id)??db2.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db2,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db2,trace)[0];let sourceTraces=db2.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="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(g4=>g4.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:{}}),rotation42=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:rotation42,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(p3=>Math.abs(p3.pad.center.x-groupPad.center.x)<.01&&Math.abs(p3.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 convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point6=>({...point6}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db2=group.root?.db;if(!db2)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db2,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db2=group.root?.db;if(!db2)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db2.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db2=group.root?.db;if(!db2)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group.subcircuit_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db2.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db2.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db2.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p3=>p3.route_type==="jumper"),wireAndViaRoutes=route.filter(p3=>p3.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 i6=0;i6<wireAndViaRoutes.length;i6++){let p3=wireAndViaRoutes[i6];if(p3.route_type!=="wire")continue;let distToStart=Math.hypot(p3.x-jumperStart.x,p3.y-jumperStart.y),distToEnd=Math.hypot(p3.x-jumperEnd.x,p3.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i6),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i6)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a6,b6)=>a6.startIdx-b6.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 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 getDistanceToPoint=(routePoint,targetPoint)=>{let position4=getRoutePointPosition2(routePoint);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},removeSrjMetadataFromPcbTraceRoute=route=>route.map(routePoint=>{let{circuitJsonMetadata:_circuitJsonMetadata,...circuitJsonRoutePoint}=routePoint;return circuitJsonRoutePoint}),platformAllowsLegacyAutorouters=group=>{let platform=group.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group=>{if(platformAllowsLegacyAutorouters(group))return null;let resolvedGroupAutorouter=group._parsedProps.autorouter??group.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group=>{if(platformAllowsLegacyAutorouters(group))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},reversePcbTraceRoute=route=>route.slice().reverse().map(point6=>point6.route_type==="via"?{...point6}:point6.route_type==="through_pad"?{...point6,start:point6.end,end:point6.start,start_layer:point6.end_layer,end_layer:point6.start_layer}:{...point6}),ensureRouteStartsAtSourceTraceStart=({db:db2,route,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db2.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db2.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route;let firstPoint=route[0],lastPoint=route[route.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route):route},Group5=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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db2.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db2.source_property_ignored_warning.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",subcircuit_id:this.subcircuit_id??void 0,error_type:"source_property_ignored_warning",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated, so autorouting has been disabled for this subcircuit. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}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||isAssemblyDeviceContainer(this.parent))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_group3=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_group3.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){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=getBoundsFromPoints2(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 contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingCenter=db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db2.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a527,_b4;return(_a527=this.unnamedElementCounter)[_b4=elm.lowercaseComponentName]??(_a527[_b4]=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),Group_doInitialAssignSchematicSheetToConnectedComponents(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug132("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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig2.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.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(r6=>r6.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(r6=>r6.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(r6=>r6.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(r6=>r6.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=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:err2.message}),err2}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,stages=getLocalAutoroutingStages(phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)},previousStageOutputSimpleRouteJson;for(let{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}of routingStages){if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=v52(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces]}}if(simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad,(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0){previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout"){let breakoutPoints=routingPhasePlan.routingPcbGroupId?db2.pcb_breakout_point.list().filter(point6=>point6.pcb_group_id===routingPhasePlan.routingPcbGroupId).map(point6=>({x:point6.x,y:point6.y})):[],emitFanoutBoundsConflictWarning=()=>{let routingPcbGroupId2=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId2)return;let pcbGroup=db2.pcb_group.get(routingPcbGroupId2),sourceComponentId=db2.pcb_component.list().find(component=>component.pcb_group_id===routingPcbGroupId2)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db2.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db2.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})};routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,breakoutPoints,onFanoutBoundsConflict:emitFanoutBoundsConflictWarning});let{fanoutBounds,routingPcbGroupId}=routingPhasePlan;fanoutBounds&&routingPcbGroupId&&db2.pcb_group.update(routingPcbGroupId,{center:{x:(fanoutBounds.minX+fanoutBounds.maxX)/2,y:(fanoutBounds.minY+fanoutBounds.maxY)/2},width:fanoutBounds.maxX-fanoutBounds.minX,height:fanoutBounds.maxY-fanoutBounds.minY})}if(debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Fo2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},simpleRouteJson});let cacheEngine=phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,autorouter;try{let traces;if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort};autorouter=localAutorouterStrategy.create({simpleRouteJson,commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,componentNamesById:getPcbComponentNamesById(db2),onSolverStarted:({solverName,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,solverConstructorArgs,componentName:this.getString()})})}if(!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...event})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=autorouter?.getOutputSimpleRouteJson?.();if(transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db2.pcb_breakout_point.list().find(point6=>point6.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point6.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point6.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point6.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db2.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y})}}let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=[...simpleRouteJson.traces??[],...traces]);let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:stageOutputTraces};if(previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}}),this.root?.emit("autorouting:end",{type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter?.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=S52(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}catch(error2){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:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter?.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${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){debug132(`[${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){debug132(`[${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 cjRoute=routedTrace.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width,circuitJsonMetadata:point6.circuitJsonMetadata}),pcb_trace3=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:removeSrjMetadataFromPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db2,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db2.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width,circuitJsonMetadata:point6.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db2,route:cjRoute,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=removeSrjMetadataFromPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db2.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db2,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db2.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db2.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point6 of pcb_trace3.route)if(point6.route_type==="via"){let routedViaPoint=point6,fromLayer=point6.from_layer,toLayer=point6.to_layer;db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getViaSpanLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount()}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group3=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_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.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(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}if(this.children.some(c3=>c3.source_component_id!==null&&c3._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_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,this.root?.platform)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_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 getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}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||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,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 Inductor2=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,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor2({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,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)}var Led=class extends NormalComponent3{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(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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}get pos(){return this.portMap.pos}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};function inflateSourceLed(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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation42=>{let normalizedRotation=(rotation42%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation42} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation4=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation4[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a6,b6)=>{let score=orientation4=>Object.keys(baseline).filter(portName=>orientation4[portName]!==baseline[portName]).length;return score(a6)-score(b6)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent3{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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_port3=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_port3.pcb_port_id}}var 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=hc[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p3=>p3.labels.includes("1")),symPort2=symbol.ports.find(p3=>p3.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p3=>p3.props.pinNumber===1),pin2Port=ports.find(p3=>p3.props.pinNumber===2),pin3Port=ports.find(p3=>p3.props.pinNumber===3),pin4Port=ports.find(p3=>p3.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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor2=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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor2({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,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 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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}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 position4=getRoutePointPosition2(point6),firstPosition=getRoutePointPosition2(firstPoint),lastPosition=getRoutePointPosition2(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>{if(point6.route_type==="via")return{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer};let position4=getRoutePointPosition2(point6);return{x:position4.x,y:position4.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 pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.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&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace(traceProps2);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent3{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,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","pcb_via","pcb_hole","pcb_plated_hole","pcb_cutout"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point6=>point6.route_type==="via"&&Math.abs(point6.x-elm.x)<1e-4&&Math.abs(point6.y-elm.y)<1e-4))}return elm.type==="pcb_cutout"?!0:"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(g4=>!g4.parent_source_group_id||renderedGroupIds.has(g4.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g4=>g4.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_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)},isSelectionResultPort=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourcePort=="function",isSelectionResultNet=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourceNet=="function",isSelectionResultComponent=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getPorts=="function",isCircuitJsonElement=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.type=="string",isNonEmptyString=value=>typeof value=="string"&&value.length>0,SelectionResultPortImpl=class{constructor(port){__publicField(this,"port");this.port=port}getPcbPort(){let pcbPortId=this.port.pcb_port_id;return pcbPortId?this.port.root?.db.pcb_port.get(pcbPortId)??null:null}getSourcePort(){let sourcePortId=this.port.source_port_id;return sourcePortId?this.port.root?.db.source_port.get(sourcePortId)??null:null}},SelectionResultNetImpl=class{constructor(net){__publicField(this,"net");this.net=net}getSourceNet(){let sourceNetId=this.net.source_net_id;return sourceNetId?this.net.root?.db.source_net.get(sourceNetId)??null:null}},SelectionResultComponentImpl=class{constructor(component){__publicField(this,"component");this.component=component}getPort(name){let port=this.component.selectOne(`port.${name}`,{type:"port"})??this.component.selectOne(`.${name}`,{type:"port"});return port?new SelectionResultPortImpl(port):null}getPorts(){return this.component.selectAll("port").map(port=>new SelectionResultPortImpl(port))}getPcbComponent(){let pcbComponentId=this.component.pcb_component_id;return pcbComponentId?this.component.root?.db.pcb_component.get(pcbComponentId)??null:null}getSourceComponent(){let sourceComponentId=this.component.source_component_id;return sourceComponentId?this.component.root?.db.source_component.get(sourceComponentId)??null:null}},DrcCheck=class extends PrimitiveComponent2{get config(){return{componentName:"DrcCheck",zodProps:drcCheckProps}}constructor(props){super(props)}async runCustomDrcCheck(circuitJson){let result=await this._parsedProps.checkFn(this.createCustomDrcCheckContext(circuitJson)),diagnostics=[];return Array.isArray(result)?diagnostics=result:result&&(diagnostics=[result]),diagnostics.map((diagnostic,index)=>this.createCircuitJsonDiagnostic(diagnostic,index)).filter(diagnostic=>!!diagnostic)}createCustomDrcCheckContext(circuitJson){return{select:this.selectCustomDrcElement.bind(this),selectAll:this.selectAllCustomDrcElements.bind(this),isConnected:(a6,b6)=>this.isConnected(a6,b6,circuitJson),isPulledUp:a6=>this.isConnected(a6,"net.VCC",circuitJson)||this.isConnected(a6,"net.VDD",circuitJson)||this.getResistanceBetween(a6,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a6,"net.VDD",circuitJson)!==null,isPulledDown:a6=>this.isConnected(a6,"net.GND",circuitJson)||this.getResistanceBetween(a6,"net.GND",circuitJson)!==null,getResistanceBetween:(a6,b6)=>this.getResistanceBetween(a6,b6,circuitJson)}}selectCustomDrcElement(selector){return this.wrapSelectionResult(this.getSubcircuit().selectOne(selector))}selectAllCustomDrcElements(selector){let selectionResults=[];for(let component of this.getSubcircuit().selectAll(selector)){let selectionResult=this.wrapSelectionResult(component);selectionResult&&selectionResults.push(selectionResult)}return selectionResults}wrapSelectionResult(component){return component?component instanceof Port?new SelectionResultPortImpl(component):component instanceof Net?new SelectionResultNetImpl(component):new SelectionResultComponentImpl(component):null}createCircuitJsonDiagnostic(diagnostic,index){let diagnosticRecord=diagnostic,diagnosticType="source_component_misconfigured_error";typeof diagnosticRecord.error_type=="string"?diagnosticType=diagnosticRecord.error_type:typeof diagnosticRecord.warning_type=="string"&&(diagnosticType=diagnosticRecord.warning_type);let diagnosticWithCircuitJsonDefaults={...diagnostic};typeof diagnosticRecord.type=="string"?diagnosticWithCircuitJsonDefaults.type=diagnosticRecord.type:diagnosticWithCircuitJsonDefaults.type=diagnosticType,typeof diagnosticRecord.warning_type!="string"&&(typeof diagnosticRecord.error_type=="string"?diagnosticWithCircuitJsonDefaults.error_type=diagnosticRecord.error_type:diagnosticWithCircuitJsonDefaults.error_type=diagnosticType);let diagnosticIdField=`${diagnosticType}_id`;return diagnosticRecord[diagnosticIdField]?diagnosticWithCircuitJsonDefaults[diagnosticIdField]=diagnosticRecord[diagnosticIdField]:diagnosticWithCircuitJsonDefaults[diagnosticIdField]=`${diagnosticType}_${this._renderId}_${index}`,any_circuit_element.parse(diagnosticWithCircuitJsonDefaults)}isConnected(a6,b6,circuitJson){let aKeys=this.getConnectivityKeys(a6,circuitJson),bKeys=this.getConnectivityKeys(b6,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a6,b6,circuitJson){if(this.isConnected(a6,b6,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a6,circuitJson),bKeys=this.getConnectivityKeys(b6,circuitJson);if(aKeys.length===0||bKeys.length===0)return null;let sourceResistors=circuitJson.filter(elm=>elm.type==="source_component"&&elm.ftype==="simple_resistor"),root=this.root;if(!root)return null;for(let resistor of sourceResistors){let resistorPorts=root.db.source_port.list({source_component_id:resistor.source_component_id});if(resistorPorts.length!==2)continue;let resistorKeys=resistorPorts.map(port=>port.subcircuit_connectivity_map_key),connectsA=resistorKeys.some(key=>key&&aKeys.includes(key)),connectsB=resistorKeys.some(key=>key&&bKeys.includes(key));if(connectsA&&connectsB)return resistor.resistance}return null}getConnectivityKeys(connectable,circuitJson){if(!connectable)return[];if(typeof connectable=="string"){let selected=this.selectCustomDrcElement(connectable);return selected?this.getConnectivityKeys(selected,circuitJson):[]}return isSelectionResultPort(connectable)?[connectable.getSourcePort()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultNet(connectable)?[connectable.getSourceNet()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultComponent(connectable)?connectable.getPorts().flatMap(port=>this.getConnectivityKeys(port,circuitJson)):isCircuitJsonElement(connectable)?this.getCircuitJsonElementConnectivityKeys(connectable,circuitJson):[]}getCircuitJsonElementConnectivityKeys(element,circuitJson){if(!element)return[];if(element.type==="source_port")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="source_net")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="pcb_port")return this.getConnectivityKeys(element.source_port_id,circuitJson);if(element.type==="source_component"){let root=this.root;return root?root.db.source_port.list({source_component_id:element.source_component_id}).map(port=>port.subcircuit_connectivity_map_key).filter(isNonEmptyString):[]}return[]}},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,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__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_react7.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group=new Group5({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._hasUnrenderedUpdatesFromAsyncEffects=!1,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.isDoneRendering();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!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_dist9(),dist_exports3)).catch(e6=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
741
|
+
`)}`)}catch(error2){debug12(`Failed to convert circuit JSON to SPICE: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)});continue}let voltageProbeByGraphName=new Map,voltageProbeById=new Map,graphDisplayOverridesByProbeId=new Map;for(let probe of voltageProbes)probe.finalProbeName&&voltageProbeByGraphName.set(probe.finalProbeName,probe),probe.simulation_voltage_probe_id&&(voltageProbeById.set(probe.simulation_voltage_probe_id,probe),graphDisplayOverridesByProbeId.set(probe.simulation_voltage_probe_id,getVoltageProbeGraphDisplayOverrides(probe)));for(let ammeter of ammeters)ammeter.simulation_current_probe_id&&graphDisplayOverridesByProbeId.set(ammeter.simulation_current_probe_id,getAmmeterGraphDisplayOverrides(ammeter));let scopedCurrentProbeIds=new Set(ammeters.map(ammeter=>ammeter.simulation_current_probe_id).filter(simulationCurrentProbeId=>!!simulationCurrentProbeId)),currentProbeById=new Map,currentProbeByName=new Map;for(let probe of root.db.simulation_current_probe.list().filter(probe2=>scopedCurrentProbeIds.has(probe2.simulation_current_probe_id)))currentProbeById.set(probe.simulation_current_probe_id,probe),probe.name!==void 0&¤tProbeByName.set(probe.name,probe);let orderedSimulationProbes=root.db.simulation_voltage_probe.list().filter(probe=>voltageProbeById.has(probe.simulation_voltage_probe_id)),firstSpiceNetlist=simulationRuns[0]?.spiceNetlist,graphNamesFromNetlist=firstSpiceNetlist?getTransientVoltageGraphNamesFromSpiceNetlist(firstSpiceNetlist):[];if(graphNamesFromNetlist.length===orderedSimulationProbes.length)for(let[simulationProbeIndex,simulationProbe]of orderedSimulationProbes.entries()){let probe=voltageProbeById.get(simulationProbe.simulation_voltage_probe_id),graphName=graphNamesFromNetlist[simulationProbeIndex];probe&&graphName&&voltageProbeByGraphName.set(graphName,probe)}else debug12(`Skipping probe-to-graph order mapping because counts differ: probes=${orderedSimulationProbes.length} graphNames=${graphNamesFromNetlist.length}`);let engineName=analogSimulation.getSpiceEngineName()??"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(spiceEngineName=>spiceEngineName!=="spicey"))}`);let effectId=`spice-simulation-${engineName}-${simulationExperimentId}`;debug12(`Queueing simulation for spice engine: ${engineName} (id: ${effectId})`),group._queueAsyncEffect(effectId,async()=>{try{let insertedVoltageGraphs=[],insertedCurrentGraphs=[];for(let simulationRun of simulationRuns){debug12(`Running simulation with engine: ${engineName}`);let simulationResult=await spiceEngine2.simulate(simulationRun.spiceString);debug12(`Simulation completed, received ${simulationResult.simulationResultCircuitJson.length} elements`);for(let simulationResultCircuitElement of simulationResult.simulationResultCircuitJson){if(!isCircuitElementInput(simulationResultCircuitElement)){debug12("Skipping invalid simulation result element");continue}let simulationResultWithSweepCoordinate=attachSweepCoordinateToSimulationResult({simulationResult:simulationResultCircuitElement,simulationParameterSweepCoordinate:simulationRun.simulationParameterSweepCoordinate});if(isVoltageGraph(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0;probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_voltage_probe_id??void 0)}else if(isSimulationVoltageResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=voltageProbeById.get(simulationResultWithSweepCoordinate.simulation_voltage_probe_id)??(simulationResultWithSweepCoordinate.name?voltageProbeByGraphName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch?.simulation_voltage_probe_id&&(simulationResultWithSweepCoordinate.color=probeMatch.color??void 0,simulationResultWithSweepCoordinate.simulation_voltage_probe_id=probeMatch.simulation_voltage_probe_id)}if(isCurrentGraph2(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=(simulationResultWithSweepCoordinate.source_probe_id?currentProbeById.get(simulationResultWithSweepCoordinate.source_probe_id):void 0)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.source_probe_id=probeMatch.simulation_current_probe_id)}else if(isSimulationCurrentResult(simulationResultWithSweepCoordinate)){simulationResultWithSweepCoordinate.simulation_experiment_id=simulationExperiment.simulation_experiment_id;let probeMatch=currentProbeById.get(simulationResultWithSweepCoordinate.simulation_current_probe_id)??(simulationResultWithSweepCoordinate.name?currentProbeByName.get(simulationResultWithSweepCoordinate.name):void 0);probeMatch&&(simulationResultWithSweepCoordinate.color=probeMatch.color,simulationResultWithSweepCoordinate.simulation_current_probe_id=probeMatch.simulation_current_probe_id)}let insertedSimulationResult=root.db.insert(simulationResultWithSweepCoordinate);isVoltageGraph(insertedSimulationResult)&&insertedVoltageGraphs.push({type:"voltage",graph:insertedSimulationResult}),isCurrentGraph2(insertedSimulationResult)&&insertedCurrentGraphs.push({type:"current",graph:insertedSimulationResult}),debug12(`Inserted ${simulationResultWithSweepCoordinate.type} into database`)}}analogSimulation.usesIndependentGraphAxes()&&insertIndependentAxisScopeTraces({db:root.db,graphs:[...insertedVoltageGraphs,...insertedCurrentGraphs],graphDisplayOverridesByProbeId}),group._markDirty("SimulationSpiceEngineRender")}catch(error2){debug12(`Simulation failed for engine ${engineName}: ${error2}`),root.db.simulation_unknown_experiment_error.insert({simulation_experiment_id:simulationExperimentId,error_type:"simulation_unknown_experiment_error",message:error2 instanceof Error?error2.message:String(error2)})}})}}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(t53=>{let source_trace3=db2.source_trace.get(t53.source_trace_id);return source_trace3?[source_trace3.source_trace_id,...source_trace3.connected_source_port_ids,...source_trace3.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.subcircuit_id??group.source_group_id??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_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let id3 of source_trace3.connected_source_port_ids)allSourcePortIds.add(id3)}for(let portId of allSourcePortIds){let connNetId=connMap.getNetConnectedToId(portId);if(!connNetId)continue;let connectivityMapKey=`${subcircuitName??`unnamedsubcircuit${group.subcircuit_id??group.source_group_id??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_trace3=db2.source_trace.get(trace.source_trace_id);if(source_trace3)for(let source_net_id of source_trace3.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.subcircuit_id??group.source_group_id??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)}}var Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks=group=>{let isRootSubcircuit=group.root?.firstChild===group;if(!group.isSubcircuit||!isRootSubcircuit||group._getBoard())return;let routingDisabled=group.root?.pcbRoutingDisabled||group.getInheritedProperty("routingDisabled"),drcChecksDisabled=group.root?.platform?.drcChecksDisabled??group.getInheritedProperty("drcChecksDisabled"),routingDrcChecksDisabled=group.root?.platform?.routingDrcChecksDisabled??group.getInheritedProperty("routingDrcChecksDisabled");if(group.root?.pcbDisabled||routingDisabled||drcChecksDisabled||routingDrcChecksDisabled||group._hasIncompleteAsyncEffectsInSubtreeForPhase("PcbTraceRender")||group._hasTracesToRoute()&&!group._areChildSubcircuitsRouted()||group._standaloneSubcircuitDrcChecksComplete||group._standaloneSubcircuitDrcChecksInProgress)return;let{db:db2}=group.root,subcircuitCircuitJson=db2.subtree({subcircuit_id:group.subcircuit_id}).toArray();group._standaloneSubcircuitDrcChecksInProgress=!0,group._queueAsyncEffect("standalone-subcircuit:routing-drc-checks",async()=>{try{let results=await runAllRoutingChecks(subcircuitCircuitJson);db2.insertAll(dedupePcbDrcErrors(results)),group._standaloneSubcircuitDrcChecksComplete=!0}finally{group._standaloneSubcircuitDrcChecksInProgress=!1}})},addPourNetMap=(target,pourNetMap)=>{for(let[layer,netOrNets]of Object.entries(pourNetMap)){if(!netOrNets)continue;let nets=Array.isArray(netOrNets)?netOrNets:[netOrNets],layerNets=target.get(layer)??new Set;for(let net of nets)layerNets.add(net);target.set(layer,layerNets)}},toFanoutPourNetMap=netsByLayer=>Object.fromEntries(Array.from(netsByLayer,([layer,nets])=>[layer,nets.size===1?Array.from(nets)[0]:Array.from(nets)])),Group_getFanoutPourNetMap=(group,routingPhasePlans)=>{let explicitMaps=routingPhasePlans.map(plan=>plan.fanoutPourNetMap).filter(map=>map!==void 0),netsByLayer=new Map;if(explicitMaps.length>0){for(let explicitMap of explicitMaps)addPourNetMap(netsByLayer,explicitMap);return toFanoutPourNetMap(netsByLayer)}let scope=group;for(;scope;){if(scope.isSubcircuit){let subcircuit=scope,copperPours=subcircuit.selectAll("copperpour");for(let copperPour of copperPours){if(copperPour.getSubcircuit()!==subcircuit)continue;let{layer,connectsTo}=copperPour._parsedProps;addPourNetMap(netsByLayer,{[layer]:connectsTo})}}scope=scope.parent}return netsByLayer.size>0?toFanoutPourNetMap(netsByLayer):void 0},baseBreakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}),BaseBreakoutPoint=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_breakout_point_id",null);__publicField(this,"matchedPort",null);__publicField(this,"matchedNet",null);__publicField(this,"matchedSourceTraceId",null);__publicField(this,"isPcbPrimitive",!0)}_getSourceTraceIdForPort(port){let{db:db2}=this.root;return db2.source_trace.list().find(st3=>st3.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(st3=>st3.connected_source_port_ids.includes(port.source_port_id))?.connected_source_net_ids[0]}_renderPcbBreakoutPoint(){if(this.pcb_breakout_point_id||this.root?.pcbDisabled)return;let{db:db2}=this.root,position4=this._getGlobalPcbPositionBeforeLayout(),group=this.parent?.getGroup(),subcircuit=this.getSubcircuit();if(!group||!group.pcb_group_id)return;let pcb_breakout_point3=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.matchedSourceTraceId??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:position4.x,y:position4.y});this.pcb_breakout_point_id=pcb_breakout_point3.pcb_breakout_point_id}_getPcbCircuitJsonBounds(){let position4=this._getGlobalPcbPositionBeforeLayout();return{center:{x:position4.x,y:position4.y},bounds:{left:position4.x,top:position4.y,right:position4.x,bottom:position4.y},width:0,height:0}}_setPositionFromLayout(newCenter){let{db:db2}=this.root;if(!this.pcb_breakout_point_id)return;let updatedProperties={x:newCenter.x,y:newCenter.y};this.matchedSourceTraceId&&(updatedProperties.source_trace_id=this.matchedSourceTraceId),db2.pcb_breakout_point.update(this.pcb_breakout_point_id,updatedProperties)}_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}}},BreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"BreakoutPoint",zodProps:breakoutPointProps}}_matchConnection(){if(this.matchedPort)return;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}"`))}doInitialPcbPrimitiveRender(){this._matchConnection(),this._renderPcbBreakoutPoint()}};function getPhaseSortValue(routingPhaseIndex){return routingPhaseIndex===null?Number.POSITIVE_INFINITY:routingPhaseIndex}function compareRoutingPhasePlans(a6,b6){return getPhaseSortValue(a6.routingPhaseIndex)-getPhaseSortValue(b6.routingPhaseIndex)}function getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex){let plan=plansByPhaseIndex.get(routingPhaseIndex);return plan||(plan={routingPhaseIndex,nets:[],traces:[]},plansByPhaseIndex.set(routingPhaseIndex,plan)),plan}function getNetRoutingPhaseIndex(net){return net.props.routingPhaseIndex??null}function getTraceRoutingPhaseIndex(trace,buses=[]){let busRoutingPhaseIndexes=new Set;for(let bus of buses){if(bus._parsedProps.routingPhaseIndex===void 0)continue;bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection)))&&busRoutingPhaseIndexes.add(bus._parsedProps.routingPhaseIndex)}if(busRoutingPhaseIndexes.size>1)throw new Error(`Trace "${trace.name}" belongs to buses with different routing phases`);let busRoutingPhaseIndex=busRoutingPhaseIndexes.values().next().value;if(busRoutingPhaseIndex!==void 0)return busRoutingPhaseIndex;let traceRoutingPhaseIndex=trace.props.routingPhaseIndex;if(traceRoutingPhaseIndex!==void 0)return traceRoutingPhaseIndex;let routingPhaseIndex=null,connectedNets=trace._findConnectedNets().nets;for(let net of connectedNets){let netRoutingPhaseIndex=getNetRoutingPhaseIndex(net);typeof netRoutingPhaseIndex=="number"&&(routingPhaseIndex===null||netRoutingPhaseIndex<routingPhaseIndex)&&(routingPhaseIndex=netRoutingPhaseIndex)}return routingPhaseIndex}function convertPortSelectorToEndpointKey(selector){return selector.trim().replace(/\s*>\s*/g,".").replace(/\s+/g,".").replace(/^\./,"").replace(/\.\./g,".")}function getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps){return[...phaseProps.connection?[phaseProps.connection]:[],...phaseProps.connections??[]]}function traceHasEndpointMatchingConnectionSelector(trace,connectionSelectorEndpointKey){return trace.getTracePortPathSelectors().some(selector=>convertPortSelectorToEndpointKey(selector)===connectionSelectorEndpointKey)}function getAutoroutersByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),autoroutersByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let{phaseIndex,autorouter}=autoroutingPhase._parsedProps;autorouter!==void 0&&autoroutersByPhaseIndex.set(phaseIndex??null,autorouter)}return autoroutersByPhaseIndex}function getAutoroutingPhasePropsByPhaseIndex(group){let autoroutingPhases=group.selectAll("autoroutingphase"),propsByPhaseIndex=new Map;for(let autoroutingPhase of autoroutingPhases){let props=autoroutingPhase._parsedProps;propsByPhaseIndex.set(props.phaseIndex??null,props)}return propsByPhaseIndex}function toParsedDistance(value){if(value!==void 0)return Number(value)}function getDrcTolerancesFromAutoroutingPhaseProps(phaseProps){let{minTraceWidth,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minTraceToPadEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleDiameter,minViaPadDiameter}=phaseProps;if(!(minTraceWidth===void 0&&minViaHoleEdgeToViaHoleEdgeClearance===void 0&&minPlatedHoleDrillEdgeToDrillEdgeClearance===void 0&&minTraceToPadEdgeClearance===void 0&&minPadEdgeToPadEdgeClearance===void 0&&minBoardEdgeClearance===void 0&&minViaEdgeToPadEdgeClearance===void 0&&minViaHoleDiameter===void 0&&minViaPadDiameter===void 0))return{minTraceWidth:toParsedDistance(minTraceWidth),minViaHoleEdgeToViaHoleEdgeClearance:toParsedDistance(minViaHoleEdgeToViaHoleEdgeClearance),minPlatedHoleDrillEdgeToDrillEdgeClearance:toParsedDistance(minPlatedHoleDrillEdgeToDrillEdgeClearance),minTraceToPadEdgeClearance:toParsedDistance(minTraceToPadEdgeClearance),minPadEdgeToPadEdgeClearance:toParsedDistance(minPadEdgeToPadEdgeClearance),minBoardEdgeClearance:toParsedDistance(minBoardEdgeClearance),minViaEdgeToPadEdgeClearance:toParsedDistance(minViaEdgeToPadEdgeClearance),minViaHoleDiameter:toParsedDistance(minViaHoleDiameter),minViaPadDiameter:toParsedDistance(minViaPadDiameter)}}function Group_getRoutingPhasePlans(group){let traces=group.selectAll("trace"),nets=group.selectAll("net"),buses=group.selectAll("bus"),breakouts=group.selectAll("group").filter(candidate=>candidate.isRoutingDirective),breakoutByTrace=new Map,breakoutByNet=new Map;for(let trace of traces){let ancestor=trace.parent;for(;ancestor&&ancestor!==group;){if(ancestor.isRoutingDirective){breakoutByTrace.set(trace,ancestor);break}ancestor=ancestor.parent}}for(let net of nets)net.parent?.isRoutingDirective&&breakouts.includes(net.parent)&&breakoutByNet.set(net,net.parent);let plansByPhaseIndex=new Map,autoroutersByPhaseIndex=getAutoroutersByPhaseIndex(group),phasePropsByPhaseIndex=getAutoroutingPhasePropsByPhaseIndex(group),groupFanoutProps=group._parsedProps,hasDirectRoutingTargets=traces.length>0||nets.length>0,hasReroutePhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>phaseProps.reroute),hasConnectionTargetedPhase=Array.from(phasePropsByPhaseIndex.values()).some(phaseProps=>getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps).length>0);if(!hasDirectRoutingTargets&&!hasReroutePhase&&!hasConnectionTargetedPhase&&breakouts.length===0)return[];for(let net of nets){if(breakoutByNet.has(net))continue;let routingPhaseIndex=getNetRoutingPhaseIndex(net);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).nets.push(net)}for(let trace of traces){if(breakoutByTrace.has(trace))continue;let routingPhaseIndex=getTraceRoutingPhaseIndex(trace,buses);getOrCreateRoutingPhasePlan(plansByPhaseIndex,routingPhaseIndex).traces.push(trace)}for(let[phaseIndex,phaseProps]of phasePropsByPhaseIndex){let connectionSelectors=getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps);if(connectionSelectors.length>0){let plan=getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex),connectionSelectorEndpointKeys=connectionSelectors.map(convertPortSelectorToEndpointKey);plan.connectionSelectors=connectionSelectors;for(let trace of traces)if(!breakoutByTrace.has(trace)&&connectionSelectorEndpointKeys.some(endpointKey=>traceHasEndpointMatchingConnectionSelector(trace,endpointKey))){if(!phaseProps.reroute)for(let existingPlan of plansByPhaseIndex.values())existingPlan!==plan&&(existingPlan.traces=existingPlan.traces.filter(existingTrace=>existingTrace!==trace));if(plan.traces.includes(trace))continue;plan.traces.push(trace)}}phaseProps.reroute&&getOrCreateRoutingPhasePlan(plansByPhaseIndex,phaseIndex)}let plans=Array.from(plansByPhaseIndex.values()).sort(compareRoutingPhasePlans);for(let plan of plans){plan.autorouter=autoroutersByPhaseIndex.get(plan.routingPhaseIndex);let phaseProps=phasePropsByPhaseIndex.get(plan.routingPhaseIndex);plan.phaseName=phaseProps?.name,plan.reroute=phaseProps?.reroute,plan.region=phaseProps?.region,plan.connectionSelectors=phaseProps?getConnectionSelectorsFromAutoroutingPhaseProps(phaseProps):void 0,plan.busFanoutDirections=phaseProps?.busFanoutDirections??groupFanoutProps.busFanoutDirections,plan.fanoutBoundaryPadding=phaseProps?.fanoutBoundaryPadding??groupFanoutProps.fanoutBoundaryPadding;let fanoutRoutingLayers=phaseProps?.fanoutRoutingLayers??groupFanoutProps.fanoutRoutingLayers;plan.fanoutRoutingLayers=fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),plan.fanoutPourNetMap=phaseProps?.fanoutPourNetMap??groupFanoutProps.fanoutPourNetMap,plan.drcTolerances=phaseProps?getDrcTolerancesFromAutoroutingPhaseProps(phaseProps):void 0}let breakoutPlans=[];for(let breakout of breakouts){let breakoutProps2=breakout._parsedProps,shouldUseDefaultAutorouterForBreakoutPoints=breakout.children.some(child=>child instanceof BreakoutPoint)&&breakout.props.autorouter===void 0,breakoutTraces=traces.filter(trace=>breakoutByTrace.get(trace)===breakout),unroutedBreakoutTraces=breakoutTraces.filter(trace=>!trace.pcb_trace_id),pcbGroup=breakout.pcb_group_id?breakout.root?.db.pcb_group.get(breakout.pcb_group_id):null,outlineBounds=pcbGroup?.outline?getBoundsFromPoints2(pcbGroup.outline):null,routingWidth=pcbGroup?.width??(outlineBounds?outlineBounds.maxX-outlineBounds.minX:void 0),routingHeight=pcbGroup?.height??(outlineBounds?outlineBounds.maxY-outlineBounds.minY:void 0),routingBounds=pcbGroup&&routingWidth&&routingHeight?{minX:pcbGroup.center.x-routingWidth/2,maxX:pcbGroup.center.x+routingWidth/2,minY:pcbGroup.center.y-routingHeight/2,maxY:pcbGroup.center.y+routingHeight/2}:void 0,rawBreakoutProps=breakout.props,hasExplicitGeometry=rawBreakoutProps.width!==void 0||rawBreakoutProps.height!==void 0||!!rawBreakoutProps.outline?.length,hasExplicitFanoutBoundaryPadding=rawBreakoutProps.fanoutBoundaryPadding!==void 0,breakoutPlan={routingPhaseIndex:null,routingPcbGroupId:breakout.pcb_group_id??void 0,routingBounds,fanoutBounds:hasExplicitGeometry?routingBounds:hasExplicitFanoutBoundaryPadding?void 0:routingBounds,autorouter:breakoutProps2.autorouter??"fanout",busFanoutDirections:breakoutProps2.busFanoutDirections,fanoutBoundaryPadding:breakoutProps2.fanoutBoundaryPadding,fanoutRoutingLayers:breakoutProps2.fanoutRoutingLayers?.map(layer=>typeof layer=="string"?layer:layer.name),fanoutPourNetMap:breakoutProps2.fanoutPourNetMap,nets:nets.filter(net=>breakoutByNet.get(net)===breakout),traces:breakoutTraces};if(!shouldUseDefaultAutorouterForBreakoutPoints){breakoutPlans.push(breakoutPlan);continue}if(breakoutPlans.push({...breakoutPlan,autorouter:"default",traces:[]}),unroutedBreakoutTraces.length>0){let automaticFanoutBusIds=new Set(buses.filter(bus=>unroutedBreakoutTraces.some(trace=>bus._parsedProps.connections.some(connection=>connection===trace.name||traceHasEndpointMatchingConnectionSelector(trace,convertPortSelectorToEndpointKey(connection))))).map(bus=>bus.name));for(let trace of unroutedBreakoutTraces)trace.name&&automaticFanoutBusIds.add(trace.name);let automaticBusFanoutDirections=breakoutProps2.busFanoutDirections?Object.fromEntries(Object.entries(breakoutProps2.busFanoutDirections).filter(([busId])=>automaticFanoutBusIds.has(busId))):void 0;breakoutPlans.push({...breakoutPlan,routingPcbGroupId:void 0,busFanoutDirections:automaticBusFanoutDirections,traces:unroutedBreakoutTraces})}}let defaultPhaseProps=phasePropsByPhaseIndex.get(null);if(hasDirectRoutingTargets&&phasePropsByPhaseIndex.size===1&&defaultPhaseProps?.reroute&&plans.length===1&&plans[0]?.routingPhaseIndex===null){let reroutePlan=plans[0];return[...breakoutPlans,{routingPhaseIndex:null,nets:[...reroutePlan.nets],traces:[...reroutePlan.traces]},reroutePlan]}return[...breakoutPlans,...plans]}var package_default3={name:"@tscircuit/core",type:"module",version:"0.0.1725",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",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","@tsci/tscircuit.ti":"github:tscircuit/ti#57e314be4b2b06bc546d4def7453e619604d1157","@tscircuit/alphabet":"0.0.25","@tscircuit/breakout-point-solver":"github:tscircuit/breakout-point-solver#bac9629","@tscircuit/capacity-autorouter":"^0.0.822","@tscircuit/checks":"^0.0.168","@tscircuit/circuit-json-util":"^0.0.106","@tscircuit/common":"^0.0.20","@tscircuit/copper-pour-solver":"^0.0.49","@tscircuit/create-fdm-enclosure":"0.0.4","@tscircuit/fanout-solver":"0.0.33","@tscircuit/footprinter":"^0.0.418","@tscircuit/image-utils":"^0.0.8","@tscircuit/infer-cable-insertion-point":"^0.0.4","@tscircuit/infgrid-ijump-astar":"^0.0.35","@tscircuit/jlcpcb-manufacturing-specs":"git+https://github.com/tscircuit/jlcpcb-manufacturing-specs#e08af159db01a37db007e33f0a7268d0e4a279a5","@tscircuit/krt-wasm":"^0.1.1","@tscircuit/log-soup":"^1.0.2","@tscircuit/matchpack":"^0.0.84","@tscircuit/math-utils":"^0.0.36","@tscircuit/miniflex":"^0.0.4","@tscircuit/ngspice-spice-engine":"^0.0.20","@tscircuit/props":"^0.0.624","@tscircuit/schematic-match-adapt":"^0.0.18","@tscircuit/schematic-trace-solver":"^0.0.140","@tscircuit/solver-utils":"^0.0.16","@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.469","circuit-json-to-bpc":"^0.0.13","circuit-json-to-gltf":"^0.0.118","circuit-json-to-connectivity-map":"^0.0.27","circuit-json-to-spice":"^0.0.45","circuit-to-svg":"^0.0.400",concurrently:"^9.1.2","connectivity-map":"^1.0.0",debug:"^4.3.6",flatbush:"^4.5.0","graphics-debug":"^0.0.95",howfat:"^0.3.8","kicad-to-circuit-json":"^0.0.117",kicadts:"^0.0.53","live-server":"^1.2.2",minicssgrid:"^0.0.9","pkg-pr-new":"^0.0.37",poppygl:"^0.0.27",react:"^19.1.0","react-dom":"^19.1.0","schematic-symbols":"^0.0.239",spicets:"^0.0.4",spicey:"^0.0.14","stack-svgs":"^0.0.1","ts-expect":"^1.3.0",tsup:"^8.2.4"},peerDependencies:{"@tscircuit/capacity-autorouter":"*","@tscircuit/checks":"*","@tscircuit/circuit-json-util":"*","@tscircuit/create-fdm-enclosure":"*","@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":"*","circuit-json-to-spice":"*","schematic-symbols":"*",spicets:"*",typescript:"^5.0.0"},dependencies:{"@flatten-js/core":"^1.6.2","@lume/kiwi":"^0.4.3","calculate-cell-boundaries":"^0.0.19","calculate-packing":"^0.0.86","css-select":"5.1.0","format-si-unit":"^0.0.12",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"},overrides:{"@tscircuit/circuit-json-util":"^0.0.106","@tscircuit/props":"^0.0.624","circuit-json":"^0.0.469"}},getFnv1aHash=value=>{let hash=2166136261;for(let i6=0;i6<value.length;i6++)hash^=value.charCodeAt(i6),hash=Math.imul(hash,16777619);return hash>>>0},getSrjHash=simpleRouteJson=>{let serializedSrj=JSON.stringify(simpleRouteJson),hash1=getFnv1aHash(serializedSrj),hash2=getFnv1aHash(`${serializedSrj}${hash1}`);return`${hash1.toString(16).padStart(8,"0")}${hash2.toString(16).padStart(8,"0")}`},getLocalAutoroutingCacheKey=simpleRouteJson=>`routes:core@${package_default3.version}:srj:${getSrjHash(simpleRouteJson)}`,getCachedLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey})=>{if(!cacheEngine)return null;try{let cachedResult=await cacheEngine.getItem(cacheKey);if(!cachedResult)return null;let parsedResult=JSON.parse(cachedResult);return!parsedResult||!Array.isArray(parsedResult.traces)?null:parsedResult}catch{return null}},cacheLocalAutoroutingPhaseResult=async({cacheEngine,cacheKey,result})=>{if(cacheEngine)try{await cacheEngine.setItem(cacheKey,JSON.stringify(result))}catch{}};function connectionIsInRoutingPhase(connection,phasePlan){if(connection.routingPcbGroupId)return connection.routingPcbGroupId===phasePlan.routingPcbGroupId;for(let trace of phasePlan.traces)if(trace.source_trace_id&&(connection.source_trace_id===trace.source_trace_id||connection.name===trace.source_trace_id||connection.rootConnectionName===trace.source_trace_id||connection.mergedConnectionNames?.includes(trace.source_trace_id)))return!0;for(let net of phasePlan.nets)if(net.source_net_id&&connection.name===net.source_net_id)return!0;return!1}function Group_hasPhasedAutorouting(routingPhasePlans){for(let plan of routingPhasePlans)if(plan.routingPcbGroupId||plan.routingPhaseIndex!==null)return!0;return!1}var pointsReferToSameEndpoint=(first,second)=>first.pointId&&second.pointId?first.pointId===second.pointId:Math.abs(first.x-second.x)<=1e-6&&Math.abs(first.y-second.y)<=1e-6,getPairedExitTarget=(simpleRouteJson,connection)=>{if(!connection.routingPcbGroupId||!connection.source_trace_id)return;let globalConnection=simpleRouteJson.connections.find(candidate=>candidate.routingPcbGroupId!==connection.routingPcbGroupId&&candidate.source_trace_id===connection.source_trace_id&&candidate.pointsToConnect.some(globalPoint=>connection.pointsToConnect.some(localPoint=>pointsReferToSameEndpoint(globalPoint,localPoint))));if(!globalConnection)return;let pairedPoints=globalConnection.pointsToConnect.filter(globalPoint=>!connection.pointsToConnect.some(localPoint=>pointsReferToSameEndpoint(globalPoint,localPoint)));return pairedPoints.length===1?{x:pairedPoints[0].x,y:pairedPoints[0].y}:void 0};function Group_filterSimpleRouteJsonForPhase(simpleRouteJson,phasePlan){let connections=[];for(let connection of simpleRouteJson.connections)connectionIsInRoutingPhase(connection,phasePlan)&&connections.push(connection);let includedConnectionNames=new Set;for(let connection of connections)includedConnectionNames.add(connection.name);let differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split across autorouting phases`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let connectionByName=new Map(connections.map(connection=>[connection.name,connection])),buses=(simpleRouteJson.buses??[]).map(bus=>{let connectionNames=bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName)),connectionExitTargets=Object.fromEntries(connectionNames.flatMap(connectionName=>{let connection=connectionByName.get(connectionName);if(!connection)return[];let pairedTarget=getPairedExitTarget(simpleRouteJson,connection);return pairedTarget?[[connectionName,pairedTarget]]:[]}));return{...bus,connectionNames,...Object.keys(connectionExitTargets).length>0?{connectionExitTargets}:{}}}).filter(bus=>bus.connectionNames.length>0),bounds=expandSrjBoundsToIncludeConnectionPoints({bounds:phasePlan.routingBounds??simpleRouteJson.bounds,connections});return{...simpleRouteJson,bounds,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}}function hasDrcTolerances(drcTolerances){return drcTolerances?Object.values(drcTolerances).some(value=>value!==void 0):!1}function applyMinTraceWidthToConnections(connections,minTraceWidth){return minTraceWidth===void 0?connections:connections.map(connection=>({...connection,nominalTraceWidth:Math.max(connection.nominalTraceWidth??minTraceWidth,minTraceWidth),width:Math.max(connection.width??minTraceWidth,minTraceWidth)}))}function Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,drcTolerances){if(!hasDrcTolerances(drcTolerances))return simpleRouteJson;let minTraceWidth=drcTolerances.minTraceWidth??simpleRouteJson.minTraceWidth,minViaHoleDiameter=drcTolerances.minViaHoleDiameter??simpleRouteJson.minViaHoleDiameter,minViaPadDiameter=drcTolerances.minViaPadDiameter??simpleRouteJson.minViaPadDiameter,minTraceToPadEdgeClearance=drcTolerances.minTraceToPadEdgeClearance??simpleRouteJson.minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance=drcTolerances.minViaEdgeToPadEdgeClearance??simpleRouteJson.minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance=drcTolerances.minViaHoleEdgeToViaHoleEdgeClearance??simpleRouteJson.minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance=drcTolerances.minPlatedHoleDrillEdgeToDrillEdgeClearance??simpleRouteJson.minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance=drcTolerances.minPadEdgeToPadEdgeClearance??simpleRouteJson.minPadEdgeToPadEdgeClearance,minBoardEdgeClearance=drcTolerances.minBoardEdgeClearance??simpleRouteJson.minBoardEdgeClearance;return{...simpleRouteJson,connections:applyMinTraceWidthToConnections(simpleRouteJson.connections,drcTolerances.minTraceWidth),minTraceWidth,minViaDiameter:minViaPadDiameter,minViaHoleDiameter,minViaPadDiameter,min_via_hole_diameter:minViaHoleDiameter,min_via_pad_diameter:minViaPadDiameter,minTraceToPadEdgeClearance,minViaEdgeToPadEdgeClearance,minViaHoleEdgeToViaHoleEdgeClearance,minPlatedHoleDrillEdgeToDrillEdgeClearance,minPadEdgeToPadEdgeClearance,minBoardEdgeClearance}}var POINT_MATCH_TOLERANCE=1e-6,pointsMatch3=(first,second)=>Math.abs(first.x-second.x)<=POINT_MATCH_TOLERANCE&&Math.abs(first.y-second.y)<=POINT_MATCH_TOLERANCE&&first.layer===second.layer,removeCompletedFanoutConnections=(simpleRouteJson,routingPcbGroupId)=>{let connections=simpleRouteJson.connections.filter(connection=>connection.routingPcbGroupId!==routingPcbGroupId),includedConnectionNames=new Set(connections.map(connection=>connection.name)),differentialPairs=[];for(let differentialPair of simpleRouteJson.differentialPairs??[]){let positiveConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[0]),negativeConnectionIncluded=includedConnectionNames.has(differentialPair.connectionNames[1]);if(positiveConnectionIncluded!==negativeConnectionIncluded)throw new Error(`Differential pair "${differentialPair.connectionNames.join("/")}" cannot be split at a breakout boundary`);positiveConnectionIncluded&&differentialPairs.push(differentialPair)}let buses=(simpleRouteJson.buses??[]).map(bus=>({...bus,connectionNames:bus.connectionNames.filter(connectionName=>includedConnectionNames.has(connectionName))})).filter(bus=>bus.connectionNames.length>0);return{...simpleRouteJson,connections,differentialPairs:differentialPairs.length>0?differentialPairs:void 0,buses:buses.length>0?buses:void 0}};function Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson,fanoutOutputSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan}){let routingPcbGroupId=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId)return{downstreamSimpleRouteJson:fanoutOutputSimpleRouteJson,baseSimpleRouteJson,synchronizedBreakoutPoints:[]};let outputConnectionByName=new Map(fanoutOutputSimpleRouteJson.connections.map(connection=>[connection.name,connection])),baseConnections=baseSimpleRouteJson.connections.map(connection=>({...connection,pointsToConnect:connection.pointsToConnect.map(point6=>({...point6}))})),synchronizedBreakoutPoints=[];for(let inputConnection of fanoutInputSimpleRouteJson.connections){if(inputConnection.routingPcbGroupId!==routingPcbGroupId||!inputConnection.source_trace_id)continue;let outputConnection=outputConnectionByName.get(inputConnection.name);if(!outputConnection)continue;let globalConnection=baseConnections.find(connection=>connection.routingPcbGroupId!==routingPcbGroupId&&connection.source_trace_id===inputConnection.source_trace_id&&connection.pointsToConnect.some(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>pointsMatch3(globalPoint,inputPoint))));if(!globalConnection)continue;let previousGlobalPointIndex=globalConnection.pointsToConnect.findIndex(globalPoint=>inputConnection.pointsToConnect.some(inputPoint=>pointsMatch3(globalPoint,inputPoint)));if(previousGlobalPointIndex<0)continue;let previousPoint=globalConnection.pointsToConnect[previousGlobalPointIndex],changedPointIndex=outputConnection.pointsToConnect.findIndex((outputPoint,pointIndex)=>{let inputPoint=inputConnection.pointsToConnect[pointIndex];return inputPoint!==void 0&&!pointsMatch3(outputPoint,inputPoint)});if(changedPointIndex<0)continue;let fanoutExitPoint=outputConnection.pointsToConnect[changedPointIndex],{layers:_previousLayers,terminalVia:_previousTerminalVia,...previousPointWithoutLayerOverrides}=previousPoint,synchronizedGlobalPoint={...previousPointWithoutLayerOverrides,x:fanoutExitPoint.x,y:fanoutExitPoint.y,layer:fanoutExitPoint.layer,...fanoutExitPoint.layers?{layers:[...fanoutExitPoint.layers]}:{},...fanoutExitPoint.terminalVia?{terminalVia:{...fanoutExitPoint.terminalVia}}:{}};globalConnection.pointsToConnect[previousGlobalPointIndex]=synchronizedGlobalPoint,synchronizedBreakoutPoints.push({sourceTraceId:inputConnection.source_trace_id,routingPcbGroupId,previousPoint,fanoutExitPoint})}return{downstreamSimpleRouteJson:removeCompletedFanoutConnections(fanoutOutputSimpleRouteJson,routingPcbGroupId),baseSimpleRouteJson:{...baseSimpleRouteJson,connections:baseConnections},synchronizedBreakoutPoints}}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,x6,y2,tolerance=.01){for(let pad2 of padInfos)if(Math.abs(pad2.x-x6)<tolerance&&Math.abs(pad2.y-y2)<tolerance)return pad2.pcb_port_id}function findJumperPortContainingPoint(padInfos,x6,y2){for(let pad2 of padInfos)if(x6>=pad2.minX&&x6<=pad2.maxX&&y2>=pad2.minY&&y2<=pad2.maxY)return pad2}function splitRouteAtJumperPads(route,padInfos){if(route.length===0||padInfos.length===0)return[route];let segments=[],currentSegment=[];for(let i6=0;i6<route.length;i6++){let point6=route[i6];if(currentSegment.push(point6),point6.route_type==="wire"&&i6>0&&i6<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}var claimSrjAssignablePcbViasTraversedByRoute=({db:db2,pcbTrace,routeWithSrjMetadata})=>{for(let routePoint of routeWithSrjMetadata){if(routePoint.route_type!=="through_pad")continue;let pcbViaId=routePoint.circuitJsonMetadata?.pcb_via_id;if(!pcbViaId)continue;let assignablePcbVia=db2.pcb_via.get(pcbViaId);!assignablePcbVia?.net_is_assignable||assignablePcbVia.net_assigned&&assignablePcbVia.pcb_trace_id!==pcbTrace.pcb_trace_id||db2.pcb_via.update(assignablePcbVia.pcb_via_id,{pcb_trace_id:pcbTrace.pcb_trace_id,net_assigned:!0})}};function getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces,stageOutputPcbTraces}){let stageOutputPcbTraceIds=new Set(stageOutputPcbTraces.map(trace=>trace.pcb_trace_id));return[...accumulatedPcbTraces.filter(trace=>!stageOutputPcbTraceIds.has(trace.pcb_trace_id)),...stageOutputPcbTraces]}var POINT_EPSILON=1e-6;function isPointOnWireSegment({point:point6,segmentStart,segmentEnd}){return point6.layer&&(segmentStart.layer!==point6.layer||segmentEnd.layer!==point6.layer)?!1:pointToSegmentDistance(point6,segmentStart,segmentEnd)<=POINT_EPSILON}function isPointInSmtPad({point:point6,pad:pad2,traceWidth=0}){return pad2.shape==="rect"||pad2.shape==="rotated_rect"?Math.abs(point6.x-pad2.x)<=pad2.width/2+traceWidth/2&&Math.abs(point6.y-pad2.y)<=pad2.height/2+traceWidth/2:pad2.shape==="circle"?distance2(point6,pad2)<=pad2.radius+traceWidth/2:!1}function isPointInPlatedHole({point:point6,hole,traceWidth=0}){return distance2(point6,hole)<=(hole.outer_diameter??hole.hole_diameter??0)/2+traceWidth/2}function getEndpointSourcePortIdsFromGeometry(db2,trace){let sourcePortIds=new Set,route=trace.route,endpoints=[route[0],route[route.length-1]].filter(point6=>!!point6&&point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);for(let endpoint of endpoints){for(let pcbPort of db2.pcb_port.list())pcbPort.source_port_id&&(endpoint.layer&&pcbPort.layers&&!pcbPort.layers.includes(endpoint.layer)||distance2(endpoint,pcbPort)<=.01&&sourcePortIds.add(pcbPort.source_port_id));for(let smtpad2 of db2.pcb_smtpad.list()){if(!smtpad2.pcb_port_id||endpoint.layer&&smtpad2.layer!==endpoint.layer||!isPointInSmtPad({point:endpoint,pad:smtpad2,traceWidth:endpoint.width}))continue;let sourcePortId=db2.pcb_port.get(smtpad2.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}for(let hole of db2.pcb_plated_hole.list()){if(!hole.pcb_port_id||!isPointInPlatedHole({point:endpoint,hole,traceWidth:endpoint.width}))continue;let sourcePortId=db2.pcb_port.get(hole.pcb_port_id)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}}return[...sourcePortIds]}function getWireRouteEndpoints(trace){let route=trace.route.filter(point6=>point6.route_type==="wire"&&point6.x!==void 0&&point6.y!==void 0);return[route[0],route[route.length-1]].filter(point6=>!!point6)}function getSourceIdsFromConnectedPcbTraces(db2,trace){let sourceIds=new Set,endpoints=getWireRouteEndpoints(trace);if(endpoints.length===0)return[];for(let existingTrace of db2.pcb_trace.list()){if(!existingTrace.source_trace_id||existingTrace.pcb_trace_id===trace.pcb_trace_id||!db2.source_trace.get(existingTrace.source_trace_id)&&!db2.source_net.get(existingTrace.source_trace_id))continue;let existingRoute=existingTrace.route.filter(point6=>point6.route_type==="wire");for(let i6=0;i6<existingRoute.length-1;i6++){let segmentStart=existingRoute[i6],segmentEnd=existingRoute[i6+1];if(!(!segmentStart||!segmentEnd))for(let endpoint of endpoints)isPointOnWireSegment({point:endpoint,segmentStart,segmentEnd})&&sourceIds.add(existingTrace.source_trace_id)}}return[...sourceIds]}function getSourcePortIdsFromRoutedTrace(db2,trace){let sourcePortIds=new Set;for(let point6 of trace.route)for(let pcbPortId of[point6.start_pcb_port_id,point6.end_pcb_port_id]){if(!pcbPortId)continue;let sourcePortId=db2.pcb_port.get(pcbPortId)?.source_port_id;sourcePortId&&sourcePortIds.add(sourcePortId)}return sourcePortIds.size>0?[...sourcePortIds]:getEndpointSourcePortIdsFromGeometry(db2,trace)}function buildSourceConnectivityMap(sourceTraces){let connMap=new ConnectivityMap({});return connMap.addConnections(sourceTraces.map(trace=>[trace.source_trace_id,...trace.connected_source_port_ids,...trace.connected_source_net_ids])),connMap}function getSourceTraceIdForRoutedTrace({db:db2,trace,subcircuit_id}){if(trace.source_trace_id&&(db2.source_trace.get(trace.source_trace_id)??db2.source_net.get(trace.source_trace_id)))return trace.source_trace_id;let sourcePortIds=getSourcePortIdsFromRoutedTrace(db2,trace);if(sourcePortIds.length===0)return getSourceIdsFromConnectedPcbTraces(db2,trace)[0];let sourceTraces=db2.source_trace.list(),connMap=buildSourceConnectivityMap(sourceTraces),endpointNetIds=sourcePortIds.map(sourcePortId=>connMap.getNetConnectedToId(sourcePortId)).filter(netId=>!!netId),exactSourceTrace=sourcePortIds.length>=2?sourceTraces.find(sourceTrace=>sourcePortIds.every(sourcePortId=>sourceTrace.connected_source_port_ids.includes(sourcePortId))):void 0;if(exactSourceTrace)return exactSourceTrace.source_trace_id;let sourceTracesInEndpointNets=sourceTraces.filter(sourceTrace=>{let sourceTraceNetId=connMap.getNetConnectedToId(sourceTrace.source_trace_id);return endpointNetIds.some(netId=>netId===sourceTraceNetId)}),connectedToEndpoint=sourceTracesInEndpointNets.filter(sourceTrace=>sourceTrace.connected_source_port_ids.some(sourcePortId=>sourcePortIds.includes(sourcePortId))),candidates=connectedToEndpoint.length>0?connectedToEndpoint:sourceTracesInEndpointNets;if(candidates.length!==0)return(candidates.find(sourceTrace=>sourceTrace.subcircuit_id===subcircuit_id)??candidates[0])?.source_trace_id}function groupPadsByInternalConnection(pads,orientation4){let groups=[];for(let pad2 of pads){let key=orientation4==="vertical"?pad2.center.y:pad2.center.x,foundGroup=!1;for(let group of groups){let groupKey=orientation4==="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(g4=>g4.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:{}}),rotation42=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:rotation42,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(p3=>Math.abs(p3.pad.center.x-groupPad.center.x)<.01&&Math.abs(p3.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 convertPcbTraceToSimplifiedPcbTrace(trace){return{...trace,type:"pcb_trace",pcb_trace_id:trace.pcb_trace_id,connection_name:trace.connection_name??trace.source_trace_id??trace.pcb_trace_id,route:trace.route.map(point6=>({...point6}))}}function getRelevantSubcircuitIdsForReroute(group){let relevantSubcircuitIds=new Set;if(!group.subcircuit_id)return relevantSubcircuitIds;relevantSubcircuitIds.add(group.subcircuit_id);let db2=group.root?.db;if(!db2)return relevantSubcircuitIds;for(let subcircuitId of getDescendantSubcircuitIds2(db2,group.subcircuit_id))relevantSubcircuitIds.add(subcircuitId);return relevantSubcircuitIds}function getExistingPcbTracesForReroute(group){let db2=group.root?.db;if(!db2)return[];let relevantSubcircuitIds=getRelevantSubcircuitIdsForReroute(group);return db2.pcb_trace.list().filter(trace=>!trace.route||trace.route.length<2?!1:group.subcircuit_id?!!(trace.subcircuit_id&&relevantSubcircuitIds.has(trace.subcircuit_id)):!0)}function getSourceTraceIdsFromRerouteName(value){return typeof value!="string"||value.length===0?[]:value.split("__").flatMap(connectionNamePart=>{if(connectionNamePart.length===0)return[];let sourceTraceIds=[connectionNamePart],rerouteSuffixIndex=connectionNamePart.indexOf("_reroute_");return rerouteSuffixIndex>0&&sourceTraceIds.push(connectionNamePart.slice(0,rerouteSuffixIndex)),sourceTraceIds})}function addPossibleReplacementSourceTraceId(sourceTraceIds,value){if(!(typeof value!="string"||value.length===0)){sourceTraceIds.add(value);for(let sourceTraceId of getSourceTraceIdsFromRerouteName(value))sourceTraceIds.add(sourceTraceId)}}function deleteExistingPcbTracesReplacedBy({group,outputPcbTraces,pcbTraceIdsToReplace=[]}){let db2=group.root?.db;if(!db2)return;let replacementPcbTraceIds=new Set(pcbTraceIdsToReplace),replacementSourceTraceIds=new Set;for(let trace of outputPcbTraces){if(trace.type!=="pcb_trace")continue;let replacementTrace=trace;replacementPcbTraceIds.add(replacementTrace.pcb_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.source_trace_id),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.connection_name),addPossibleReplacementSourceTraceId(replacementSourceTraceIds,replacementTrace.rootConnectionName)}if(replacementPcbTraceIds.size===0&&replacementSourceTraceIds.size===0)return;let tracesToDelete=getExistingPcbTracesForReroute(group).filter(trace=>replacementPcbTraceIds.has(trace.pcb_trace_id)||!!(trace.source_trace_id&&trace.subcircuit_id===group.subcircuit_id&&replacementSourceTraceIds.has(trace.source_trace_id)));if(tracesToDelete.length===0)return;let deletedPcbTraceIds=new Set(tracesToDelete.map(trace=>trace.pcb_trace_id));for(let via of db2.pcb_via.list())via.pcb_trace_id&&deletedPcbTraceIds.has(via.pcb_trace_id)&&db2.pcb_via.delete(via.pcb_via_id);for(let trace of tracesToDelete)db2.pcb_trace.delete(trace.pcb_trace_id)}function getExistingSimplifiedPcbTracesForReroute(group){return getExistingPcbTracesForReroute(group).map(convertPcbTraceToSimplifiedPcbTrace)}function splitPcbTracesOnJumperSegments(route){let jumperRoutes=route.filter(p3=>p3.route_type==="jumper"),wireAndViaRoutes=route.filter(p3=>p3.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 i6=0;i6<wireAndViaRoutes.length;i6++){let p3=wireAndViaRoutes[i6];if(p3.route_type!=="wire")continue;let distToStart=Math.hypot(p3.x-jumperStart.x,p3.y-jumperStart.y),distToEnd=Math.hypot(p3.x-jumperEnd.x,p3.y-jumperEnd.y);distToStart<minStartDist&&(minStartDist=distToStart,startIdx=i6),distToEnd<minEndDist&&(minEndDist=distToEnd,endIdx=i6)}startIdx>endIdx&&([startIdx,endIdx]=[endIdx,startIdx]),startIdx>=0&&endIdx>=0&&startIdx!==endIdx&&splitRanges.push({startIdx,endIdx})}splitRanges.sort((a6,b6)=>a6.startIdx-b6.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 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 getDistanceToPoint=(routePoint,targetPoint)=>{let position4=getRoutePointPosition2(routePoint);return Math.hypot(position4.x-targetPoint.x,position4.y-targetPoint.y)},removeSrjMetadataFromPcbTraceRoute=route=>route.map(routePoint=>{let{circuitJsonMetadata:_circuitJsonMetadata,...circuitJsonRoutePoint}=routePoint;return circuitJsonRoutePoint}),platformAllowsLegacyAutorouters=group=>{let platform=group.root?.platform;return platform!==void 0&&"allowLegacyAutorouters"in platform&&platform.allowLegacyAutorouters===!0},getDisabledLegacyGroupAutorouterPreset=group=>{if(platformAllowsLegacyAutorouters(group))return null;let resolvedGroupAutorouter=group._parsedProps.autorouter??group.getInheritedProperty("autorouter");return getLegacyAutorouterPreset(resolvedGroupAutorouter)},getDisabledLegacyAutorouterPreset=group=>{if(platformAllowsLegacyAutorouters(group))return null;let legacyGroupAutorouterPreset=getDisabledLegacyGroupAutorouterPreset(group);if(legacyGroupAutorouterPreset)return legacyGroupAutorouterPreset;let routingPhaseAutorouters=group.selectAll("autoroutingphase").map(autoroutingPhase=>autoroutingPhase._parsedProps.autorouter);for(let autorouter of routingPhaseAutorouters){let legacyAutorouterPreset=getLegacyAutorouterPreset(autorouter);if(legacyAutorouterPreset)return legacyAutorouterPreset}return null},reversePcbTraceRoute=route=>route.slice().reverse().map(point6=>point6.route_type==="via"?{...point6}:point6.route_type==="through_pad"?{...point6,start:point6.end,end:point6.start,start_layer:point6.end_layer,end_layer:point6.start_layer}:{...point6}),ensureRouteStartsAtSourceTraceStart=({db:db2,route,sourceTraceId})=>{if(!sourceTraceId||route.length<2)return route;let firstSourcePortId=db2.source_trace.get(sourceTraceId)?.connected_source_port_ids[0];if(!firstSourcePortId)return route;let firstPcbPort=db2.pcb_port.list().find(port=>port.source_port_id===firstSourcePortId);if(!firstPcbPort)return route;let firstPoint=route[0],lastPoint=route[route.length-1];return getDistanceToPoint(lastPoint,firstPcbPort)<getDistanceToPoint(firstPoint,firstPcbPort)?reversePcbTraceRoute(route):route},Group5=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,"_pcbPlacementDrcErrorCount",null);__publicField(this,"_pcbPlacementDrcCheckError",null);__publicField(this,"_pcbPlacementDrcChecksPending",!1);__publicField(this,"_standaloneSubcircuitDrcChecksComplete",!1);__publicField(this,"_standaloneSubcircuitDrcChecksInProgress",!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"}}initPorts(opts={}){let schPinArrangement=this._getSchematicPortArrangement();this._parsedProps?.showAsSchematicBox&&!this._parsedProps.pinLabels&&schPinArrangement&&getPinsFromPortArrangement(schPinArrangement).some(pin=>typeof pin=="string")||super.initPorts(opts)}_getSchematicPortArrangementFromPortDirections(){if(!this._parsedProps?.showAsSchematicBox)return null;let sidePins={leftSide:[],rightSide:[],topSide:[],bottomSide:[]};for(let port of this.children){if(port.componentName!=="Port")continue;let direction2=port._parsedProps.direction;if(!direction2)continue;let pin=port._parsedProps.pinNumber??port._parsedProps.name??void 0;if(pin===void 0)continue;sidePins[direction2==="left"?"leftSide":direction2==="right"?"rightSide":direction2==="up"?"topSide":"bottomSide"].push(pin)}if(sidePins.leftSide.length===0&&sidePins.rightSide.length===0&&sidePins.topSide.length===0&&sidePins.bottomSide.length===0)return null;let arrangement={};return sidePins.leftSide.length>0&&(arrangement.leftSide={pins:sidePins.leftSide,direction:"top-to-bottom"}),sidePins.rightSide.length>0&&(arrangement.rightSide={pins:sidePins.rightSide,direction:"top-to-bottom"}),sidePins.topSide.length>0&&(arrangement.topSide={pins:sidePins.topSide,direction:"left-to-right"}),sidePins.bottomSide.length>0&&(arrangement.bottomSide={pins:sidePins.bottomSide,direction:"left-to-right"}),arrangement}_getSchematicPortArrangement(){return super._getSchematicPortArrangement()??this._getSchematicPortArrangementFromPortDirections()}_ensureSchematicBoxPortsFromConnections(){if(this._parsedProps?.showAsSchematicBox&&this._parsedProps?.connections)for(let[pinName,target]of Object.entries(this._parsedProps.connections)){if(this.children.find(child=>child.componentName==="Port"&&child.isMatchingAnyOf([pinName])))continue;let pinNumberMatch=pinName.match(/^pin(\d+)$/i)??pinName.match(/^(\d+)$/),pinNumber=pinNumberMatch?Number(pinNumberMatch[1]):void 0;this.add(new Port({name:pinName,pinNumber,connectsTo:target}))}}doInitialInitializePortsFromChildren(){super.doInitialInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}updateInitializePortsFromChildren(){super.updateInitializePortsFromChildren(),this._ensureSchematicBoxPortsFromConnections()}_getPrimaryPinCount(){let superPinCount=super._getPrimaryPinCount();if(!this._parsedProps?.showAsSchematicBox)return superPinCount;let directPortPinNumbers=this.children.filter(child=>child.componentName==="Port").map(port=>port._parsedProps.pinNumber).filter(pinNumber=>pinNumber!==void 0);return directPortPinNumbers.length===0?superPinCount:Math.max(superPinCount,...directPortPinNumbers)}_getPinLabelsFromPorts(){return this._parsedProps?.showAsSchematicBox?getGroupSchematicBoxPinLabels(this):super._getPinLabelsFromPorts()}doInitialSourceGroupRender(){let{db:db2}=this.root,hasExplicitName=typeof this._parsedProps.name=="string"&&this._parsedProps.name.length>0,source_group3=db2.source_group.insert({name:this.name,is_subcircuit:this.isSubcircuit,was_automatically_named:!hasExplicitName});this.source_group_id=source_group3.source_group_id,this.isSubcircuit&&(this.subcircuit_id=`subcircuit_${source_group3.source_group_id}`,db2.source_group.update(source_group3.source_group_id,{subcircuit_id:this.subcircuit_id}))}doInitialSourceRender(){let{db:db2}=this.root;for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&db2.source_component.update(child.source_component_id,{source_group_id:this.source_group_id});if(!this.isSubcircuit)return;let disabledLegacyAutorouterPreset=getDisabledLegacyAutorouterPreset(this);disabledLegacyAutorouterPreset&&db2.source_property_ignored_warning.insert({source_component_id:this.source_component_id??"",property_name:"autorouter",subcircuit_id:this.subcircuit_id??void 0,error_type:"source_property_ignored_warning",message:`The "${disabledLegacyAutorouterPreset}" autorouter is deprecated, so autorouting has been disabled for this subcircuit. Use the default autorouter and introduce <autoroutingphase /> or <fanout /> elements as needed.`})}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||isAssemblyDeviceContainer(this.parent))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_group3=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_group3.pcb_group_id;for(let child of this.children)db2.pcb_component.update(child.pcb_component_id,{pcb_group_id:pcb_group3.pcb_group_id})}doInitialPcbPrimitiveRender(){this.calculatePcbGroupBounds()}calculatePcbGroupBounds(pcbContentBounds){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=getBoundsFromPoints2(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 contentBounds=pcbContentBounds;if(!contentBounds){let bounds=getBoundsOfPcbComponents(this.children);contentBounds={center:{x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},width:bounds.width,height:bounds.height}}let{width,height}=contentBounds,{x:centerX,y:centerY}=contentBounds.center;if(this.isSubcircuit||this.isRoutingDirective){let{padLeft,padRight,padTop,padBottom}=this._resolvePcbPadding();width+=padLeft+padRight,height+=padTop+padBottom,centerX+=(padRight-padLeft)/2,centerY+=(padTop-padBottom)/2}let resolvedWidth=Number(props.width??width),resolvedHeight=Number(props.height??height),existingCenter=db2.pcb_group.get(this.pcb_group_id)?.center??{x:centerX,y:centerY},shouldUsePcbContentCenter=this.isSubcircuit||pcbContentBounds!==void 0,center2=hasExplicitPositioning?shouldUsePcbContentCenter?{x:props.width===void 0?centerX:existingCenter.x,y:props.height===void 0?centerY:existingCenter.y}:existingCenter:{x:centerX,y:centerY};if(hasExplicitPositioning&&props.pcbAnchorAlignment){let anchorPosition=this._getGlobalPcbPositionBeforeLayout(),anchorAlignedCenter=computeCenterFromAnchorPosition(anchorPosition,{...this.props,width:resolvedWidth,height:resolvedHeight});(Math.abs(anchorAlignedCenter.x-center2.x)>1e-6||Math.abs(anchorAlignedCenter.y-center2.y)>1e-6)&&this._repositionOnPcb(anchorAlignedCenter),center2=anchorAlignedCenter}db2.pcb_group.update(this.pcb_group_id,{width:resolvedWidth,height:resolvedHeight,center:center2})}updatePcbPrimitiveRender(){this.calculatePcbGroupBounds()}getNextAvailableName(elm){var _a527,_b4;return(_a527=this.unnamedElementCounter)[_b4=elm.lowercaseComponentName]??(_a527[_b4]=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),Group_doInitialAssignSchematicSheetToConnectedComponents(this)}_areChildSubcircuitsRouted(){let subcircuitChildren=this._findDirectChildSubcircuits();for(let subcircuitChild of subcircuitChildren)if(!subcircuitChild._isInflatedFromCircuitJson&&subcircuitChild._hasTracesToRoute()&&subcircuitChild._shouldRouteAsync()&&!subcircuitChild._asyncAutoroutingResult)return!1;return!0}_findDirectChildSubcircuits(){let result=[],visit=children=>{for(let child of children)child.isSubcircuit&&child!==this?result.push(child):visit(child.children)};return visit(this.children),result}_shouldRouteAsync(){if(this._isLegacyAutorouterDisabled())return!1;let autorouter=this._getAutorouterConfig();return autorouter.groupMode==="sequential-trace"?!1:!!(autorouter.local&&autorouter.groupMode==="subcircuit"||!autorouter.local)}_getRoutingPhasePlans(){return Group_getRoutingPhasePlans(this)}_hasTracesToRoute(){let debug132=(0,import_debug11.default)("tscircuit:core:_hasTracesToRoute"),routingPhasePlans=this._getRoutingPhasePlans(),traceCount=0,hasReroutePhaseWithRegion=!1;for(let routingPhasePlan of routingPhasePlans)traceCount+=routingPhasePlan.traces.length,hasReroutePhaseWithRegion||(hasReroutePhaseWithRegion=!!(routingPhasePlan.reroute&&routingPhasePlan.region));if(debug132(`[${this.getString()}] has ${traceCount} traces to route`),traceCount>0)return!0;if(hasReroutePhaseWithRegion){let existingTraceCount=getExistingPcbTracesForReroute(this).length;return debug132(`[${this.getString()}] has ${existingTraceCount} existing pcb traces available for reroute`),existingTraceCount>0}return!1}async _runEffectMakeHttpAutoroutingRequest(){let{db:db2}=this.root,debug132=(0,import_debug11.default)("tscircuit:core:_runEffectMakeHttpAutoroutingRequest"),props=this._parsedProps,autorouterConfig2=this._getAutorouterConfig(),serverUrl=autorouterConfig2.serverUrl,serverMode=autorouterConfig2.serverMode,fetchWithDebug=(url2,options)=>(debug132("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 preferredTraceWidth=props.defaultTraceWidth??props.nominalTraceWidth,{simpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth:Number(props.minTraceWidth??.15),nominalTraceWidth:preferredTraceWidth!=null?Number(preferredTraceWidth):void 0,subcircuit_id:this.subcircuit_id,subcircuitComponent:this});simpleRouteJson.allowViaInPad=autorouterConfig2.allowViaInPad;let{autorouting_result:autorouting_result2}=await fetchWithDebug(`${serverUrl}/autorouting/solve`,{method:"POST",body:JSON.stringify({input_simple_route_json:simpleRouteJson,subcircuit_id:this.subcircuit_id}),headers:{"Content-Type":"application/json"}}).then(r6=>r6.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(r6=>r6.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(r6=>r6.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(r6=>r6.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(r6=>r6.json());this._asyncAutoroutingResult={output_pcb_traces:autorouting_job_output.output_pcb_traces},this._markDirty("PcbTraceRender");break}if(job.has_error){let err2=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:err2.message}),err2}await new Promise(resolve=>setTimeout(resolve,100))}}async _runLocalAutorouting(){let{db:db2}=this.root,props=this._parsedProps,debug132=(0,import_debug11.default)("tscircuit:core:_runLocalAutorouting");debug132(`[${this.getString()}] starting local autorouting`);let autorouterConfig2=this._getAutorouterConfig(),isLaserPrefabPreset=this._isLaserPrefabAutorouter(autorouterConfig2),isAutoJumperPreset=this._isAutoJumperAutorouter(autorouterConfig2),isSingleLayerBoard=this._getSubcircuitLayerCount()===1,minTraceWidth=Number(props.minTraceWidth??.15),nominalTraceWidth=Number(props.defaultTraceWidth??props.nominalTraceWidth??minTraceWidth),routingPhasePlans=this._getRoutingPhasePlans(),hasPhasedAutorouting=Group_hasPhasedAutorouting(routingPhasePlans),routingStages=routingPhasePlans.flatMap(routingPhasePlan=>{let phaseAutorouterConfig=routingPhasePlan.autorouter?getPresetAutoroutingConfig(routingPhasePlan.autorouter,this.root?.platform):autorouterConfig2,stages=getLocalAutoroutingStages(phaseAutorouterConfig,this.root?.platform);return stages.map((stage,phaseStageIndex)=>({...stage,routingPhasePlan,phaseStageIndex,phaseStageCount:stages.length}))}),fanoutPourNetMap=routingStages.some(({autorouterConfig:autorouterConfig22})=>["fanout","single_layer_fanout"].includes(autorouterConfig22.preset??""))?Group_getFanoutPourNetMap(this,routingPhasePlans):void 0,{simpleRouteJson:baseSimpleRouteJson}=getSimpleRouteJsonFromCircuitJson({db:db2,minTraceWidth,nominalTraceWidth,subcircuit_id:this.subcircuit_id,subcircuitComponent:this,fanoutPourNetMap}),outputTraces=[],outputJumpers=[],pcbTraceIdsToDelete=new Set,existingRerouteSeedTraces=getExistingSimplifiedPcbTracesForReroute(this),traceMatchesRoutingPhase=(trace,routingPhasePlan)=>{let connectionName=trace.connection_name??trace.pcb_trace_id,sourceTraceIds=new Set([connectionName,trace.pcb_trace_id,...getSourceTraceIdsFromRerouteName(connectionName),...getSourceTraceIdsFromRerouteName(trace.pcb_trace_id)]);return baseSimpleRouteJson.connections.some(connection=>connectionIsInRoutingPhase(connection,routingPhasePlan)?sourceTraceIds.has(connection.name)||(connection.source_trace_id?sourceTraceIds.has(connection.source_trace_id):!1)||(connection.rootConnectionName?sourceTraceIds.has(connection.rootConnectionName):!1)||connection.mergedConnectionNames?.some(name=>sourceTraceIds.has(name)):!1)},previousStageOutputSimpleRouteJson;for(let{routingPhasePlan,autorouterConfig:phaseAutorouterConfig,strategy:localAutorouterStrategy,usesPreviousStageOutput,phaseStageIndex,phaseStageCount}of routingStages){if(usesPreviousStageOutput||(previousStageOutputSimpleRouteJson=void 0),usesPreviousStageOutput&&previousStageOutputSimpleRouteJson===void 0)throw new Error("Autorouting follow-up stage is missing the preceding stage output");let simpleRouteJson=previousStageOutputSimpleRouteJson??baseSimpleRouteJson,isRegionReroutePhase=!!(routingPhasePlan.reroute&&routingPhasePlan.region),isConnectionReroutePhase=!!(routingPhasePlan.reroute&&!routingPhasePlan.region&&routingPhasePlan.traces.length>0),isReroutePhase=isRegionReroutePhase||isConnectionReroutePhase,rerouteOriginalSrj=isRegionReroutePhase?{...baseSimpleRouteJson,traces:[...existingRerouteSeedTraces,...outputTraces]}:null;if(!usesPreviousStageOutput&&isRegionReroutePhase&&rerouteOriginalSrj)simpleRouteJson=v52(rerouteOriginalSrj,{shape:"rect",...routingPhasePlan.region});else if(!usesPreviousStageOutput&&isConnectionReroutePhase){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan))]}}else if(!usesPreviousStageOutput&&hasPhasedAutorouting){let phaseInput=Group_filterSimpleRouteJsonForPhase(baseSimpleRouteJson,routingPhasePlan);simpleRouteJson={...phaseInput,traces:[...phaseInput.traces??[],...outputTraces]}}if(simpleRouteJson=Group_applyDrcTolerancesToSimpleRouteJson(simpleRouteJson,routingPhasePlan.drcTolerances),simpleRouteJson.allowViaInPad=phaseAutorouterConfig.allowViaInPad,(hasPhasedAutorouting||isReroutePhase)&&simpleRouteJson.connections.length===0){previousStageOutputSimpleRouteJson=simpleRouteJson;continue}let phaseIsAutoJumperPreset=routingPhasePlan.autorouter!==void 0?this._isAutoJumperAutorouter(phaseAutorouterConfig):isAutoJumperPreset,phaseIsLaserPrefabPreset=routingPhasePlan.autorouter!==void 0?this._isLaserPrefabAutorouter(phaseAutorouterConfig):isLaserPrefabPreset;phaseIsAutoJumperPreset&&(simpleRouteJson.allowJumpers=!0,phaseAutorouterConfig.availableJumperTypes&&(simpleRouteJson.availableJumperTypes=phaseAutorouterConfig.availableJumperTypes));let fanoutMode=phaseAutorouterConfig.preset;if(fanoutMode==="fanout"||fanoutMode==="single_layer_fanout"){let breakoutPoints=routingPhasePlan.routingPcbGroupId?db2.pcb_breakout_point.list().filter(point6=>point6.pcb_group_id===routingPhasePlan.routingPcbGroupId).map(point6=>({x:point6.x,y:point6.y})):[],emitFanoutBoundsConflictWarning=()=>{let routingPcbGroupId2=routingPhasePlan.routingPcbGroupId;if(!routingPcbGroupId2)return;let pcbGroup=db2.pcb_group.get(routingPcbGroupId2),sourceComponentId=db2.pcb_component.list().find(component=>component.pcb_group_id===routingPcbGroupId2)?.source_component_id;if(!sourceComponentId)return;let message=`${pcbGroup?.name??"Breakout"} defines conflicting fanout bounds with explicit breakout geometry and fanoutBoundaryPadding. Explicit breakout geometry takes precedence, so fanoutBoundaryPadding is ignored.`;db2.source_property_ignored_warning.list().some(warning=>warning.source_component_id===sourceComponentId&&warning.property_name==="fanoutBoundaryPadding"&&warning.message===message)||db2.source_property_ignored_warning.insert({source_component_id:sourceComponentId,property_name:"fanoutBoundaryPadding",message,error_type:"source_property_ignored_warning",subcircuit_id:pcbGroup?.subcircuit_id})};routingPhasePlan.fanoutBounds=FanoutAutorouter.resolveFanoutBounds(simpleRouteJson,{mode:fanoutMode,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutBoundaryPadding:routingPhasePlan.fanoutBoundaryPadding,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,breakoutPoints,onFanoutBoundsConflict:emitFanoutBoundsConflictWarning});let{fanoutBounds,routingPcbGroupId}=routingPhasePlan;fanoutBounds&&routingPcbGroupId&&db2.pcb_group.update(routingPcbGroupId,{center:{x:(fanoutBounds.minX+fanoutBounds.maxX)/2,y:(fanoutBounds.minY+fanoutBounds.maxY)/2},width:fanoutBounds.maxX-fanoutBounds.minX,height:fanoutBounds.maxY-fanoutBounds.minY})}if(debug132.enabled&&global.debugOutputArray?.push({name:`simpleroutejson-${this.props.name}.json`,obj:simpleRouteJson}),debug132.enabled){let graphicsObject=Fo2(simpleRouteJson);graphicsObject.title=`autorouting-${this.props.name}`,global.debugGraphics?.push(graphicsObject)}this.root?.emit("autorouting:start",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},simpleRouteJson});let cacheEngine=phaseAutorouterConfig.algorithmFn||!localAutorouterStrategy.cacheable?void 0:this.root?.platform?.localCacheEngine,cacheKey=cacheEngine?getLocalAutoroutingCacheKey(simpleRouteJson):void 0,cachedResult=cacheKey?await getCachedLocalAutoroutingPhaseResult({cacheEngine,cacheKey}):null,autorouter;try{let traces;if(cachedResult)debug132(`[${this.getString()}] using cached local autorouting result`),traces=cachedResult.traces;else{if(phaseAutorouterConfig.algorithmFn)autorouter=await phaseAutorouterConfig.algorithmFn(simpleRouteJson);else{let autorouterVersion22=phaseAutorouterConfig.autorouterVersion??this.props.autorouterVersion,effortLevel=this.props.autorouterEffortLevel,effort=effortLevel?Number.parseInt(effortLevel.replace("x",""),10):void 0,commonAutorouterOptions={capacityDepth:phaseAutorouterConfig.capacityDepth,targetMinCapacity:phaseAutorouterConfig.targetMinCapacity,platformConfig:this.root?.platform,useAssignableSolver:phaseIsLaserPrefabPreset||isSingleLayerBoard,useAutoJumperSolver:phaseIsAutoJumperPreset,useLaserPrefabSolver:phaseIsLaserPrefabPreset,autorouterVersion:autorouterVersion22,effort};autorouter=localAutorouterStrategy.create({simpleRouteJson,commonAutorouterOptions,busFanoutDirections:routingPhasePlan.busFanoutDirections,fanoutBounds:routingPhasePlan.fanoutBounds,fanoutRoutingLayers:routingPhasePlan.fanoutRoutingLayers,componentNamesById:getPcbComponentNamesById(db2),onSolverStarted:({solverName,solverParams,solverConstructorArgs})=>this.root?.emit("solver:started",{type:"solver:started",solverName,solverParams,solverConstructorArgs,componentName:this.getString()})})}if(!autorouter)throw new Error("Failed to create local autorouter");let activeAutorouter=autorouter,routingPromise=new Promise((resolve,reject)=>{activeAutorouter.on("complete",event=>{debug132(`[${this.getString()}] local autorouting complete`),resolve(event.traces)}),activeAutorouter.on("error",event=>{debug132(`[${this.getString()}] local autorouting error: ${event.error.message}`),reject(event.error)})});activeAutorouter.on("progress",event=>{this.root?.emit("autorouting:progress",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},...event})}),activeAutorouter.start(),traces=await routingPromise}let transformedSimpleRouteJson=autorouter?.getOutputSimpleRouteJson?.();if(transformedSimpleRouteJson&&!usesPreviousStageOutput&&["fanout","single_layer_fanout"].includes(phaseAutorouterConfig.preset??"")&&routingPhasePlan.routingPcbGroupId){let synchronizedFanout=Group_syncFanoutExitsWithGlobalConnections({fanoutInputSimpleRouteJson:simpleRouteJson,fanoutOutputSimpleRouteJson:transformedSimpleRouteJson,baseSimpleRouteJson,routingPhasePlan});baseSimpleRouteJson=synchronizedFanout.baseSimpleRouteJson,transformedSimpleRouteJson=synchronizedFanout.downstreamSimpleRouteJson;for(let synchronizedPoint of synchronizedFanout.synchronizedBreakoutPoints){let breakoutPoint=db2.pcb_breakout_point.list().find(point6=>point6.pcb_group_id===synchronizedPoint.routingPcbGroupId&&point6.source_trace_id===synchronizedPoint.sourceTraceId&&Math.abs(point6.x-synchronizedPoint.previousPoint.x)<=1e-6&&Math.abs(point6.y-synchronizedPoint.previousPoint.y)<=1e-6);breakoutPoint&&db2.pcb_breakout_point.update(breakoutPoint.pcb_breakout_point_id,{x:synchronizedPoint.fanoutExitPoint.x,y:synchronizedPoint.fanoutExitPoint.y})}}let stageOutputTraces=traces;transformedSimpleRouteJson?.traces?stageOutputTraces=transformedSimpleRouteJson.traces:usesPreviousStageOutput&&(stageOutputTraces=[...simpleRouteJson.traces??[],...traces]);let outputSimpleRouteJson={...transformedSimpleRouteJson??simpleRouteJson,traces:stageOutputTraces};if(previousStageOutputSimpleRouteJson=transformedSimpleRouteJson?outputSimpleRouteJson:void 0,!cachedResult&&cacheKey&&await cacheLocalAutoroutingPhaseResult({cacheEngine,cacheKey,result:{...simpleRouteJson,traces}}),this.root?.emit("autorouting:end",{type:"autorouting:end",subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},simpleRouteJson:outputSimpleRouteJson}),autorouter?.getConnectedOffboardObstacles){let connectedOffboardObstacles=autorouter.getConnectedOffboardObstacles();createSourceTracesFromOffboardConnections({db:db2,connectedOffboardObstacles,simpleRouteJson,subcircuit_id:this.subcircuit_id})}let solver=autorouter?.solver;if(solver?.getOutputJumpers&&outputJumpers.push(...solver.getOutputJumpers()||[]),isRegionReroutePhase&&rerouteOriginalSrj){for(let trace of rerouteOriginalSrj.traces??[])trace.type==="pcb_trace"&&pcbTraceIdsToDelete.add(trace.pcb_trace_id);let reconnectedSrj=S52(rerouteOriginalSrj,{...simpleRouteJson,traces:[...simpleRouteJson.traces??[],...traces]});outputTraces.splice(0,outputTraces.length,...reconnectedSrj.traces??[])}else if(isConnectionReroutePhase){let retainedPcbTraces=outputTraces.filter(trace=>!traceMatchesRoutingPhase(trace,routingPhasePlan));outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:retainedPcbTraces,stageOutputPcbTraces:stageOutputTraces}))}else outputTraces.splice(0,outputTraces.length,...getAccumulatedPcbTracesWithStageOutputReplacements({accumulatedPcbTraces:outputTraces,stageOutputPcbTraces:stageOutputTraces}))}catch(error2){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:error2 instanceof Error?error2.message:String(error2)}),this.root?.emit("autorouting:error",{subcircuit_id:this.subcircuit_id,componentDisplayName:this.getString(),...routingPhasePlan.phaseName!==void 0?{phaseName:routingPhasePlan.phaseName,phaseStageIndex,phaseStageCount}:{},error:{message:error2 instanceof Error?error2.message:String(error2)},simpleRouteJson}),error2}finally{autorouter?.stop()}}this._asyncAutoroutingResult={output_pcb_traces:outputTraces,output_jumpers:outputJumpers,pcb_trace_ids_to_be_replaced:[...pcbTraceIdsToDelete]},this._markDirty("PcbTraceRender")}_startAsyncAutorouting(){this._hasStartedAsyncAutorouting||(this._hasStartedAsyncAutorouting=!0,this._getAutorouterConfig().local?this._queueAsyncEffect("autorouting",async()=>this._runLocalAutorouting()):this._queueAsyncEffect("make-http-autorouting-request",async()=>this._runEffectMakeHttpAutoroutingRequest()))}doInitialPcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:doInitialPcbTraceRender");if(!this.isSubcircuit||this.root?.pcbDisabled||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled")||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled()||this._shouldUseTraceByTraceRouting())return;if(!this._areChildSubcircuitsRouted()){debug132(`[${this.getString()}] child subcircuits are not routed, skipping async autorouting until subcircuits routed`);return}if(debug132(`[${this.getString()}] no child subcircuits to wait for, initiating async routing`),!this._hasTracesToRoute())return;let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations||this._startAsyncAutorouting()}doInitialSchematicTraceRender(){this._parsedProps.showAsSchematicBox||Group_doInitialSchematicTraceRender(this)}doInitialSchematicSheetRender(){Group_doInitialSchematicSheetRender(this)}updateSchematicSheetRender(){Group_updateSchematicSheetRender(this)}updatePcbTraceRender(){let debug132=(0,import_debug11.default)("tscircuit:core:updatePcbTraceRender");if(debug132(`[${this.getString()}] updating...`),!this.isSubcircuit||this._isInflatedFromCircuitJson||this._isLegacyAutorouterDisabled())return;if(this._shouldRouteAsync()&&this._hasTracesToRoute()&&!this._hasStartedAsyncAutorouting){if(this._areChildSubcircuitsRouted()){let shouldSkipBecauseOfPlacementErrors=shouldSkipAutoroutingBecauseOfPlacementErrors({component:this,subcircuit:this}),shouldSkipBecauseOfTraceLengthViolations=shouldSkipAutoroutingBecauseOfTraceLengthViolations({component:this,subcircuit:this});if(shouldSkipBecauseOfPlacementErrors||shouldSkipBecauseOfTraceLengthViolations)return;debug132(`[${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){debug132(`[${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){debug132(`[${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 cjRoute=routedTrace.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width,circuitJsonMetadata:point6.circuitJsonMetadata}),pcb_trace3=db2.pcb_trace.insert({subcircuit_id:this.subcircuit_id,route:removeSrjMetadataFromPcbTraceRoute(cjRoute)});claimSrjAssignablePcbViasTraversedByRoute({db:db2,pcbTrace:pcb_trace3,routeWithSrjMetadata:cjRoute})}}_updatePcbTraceRenderFromPcbTraces(){let{output_pcb_traces,output_jumpers,pcb_trace_ids_to_be_replaced}=this._asyncAutoroutingResult;if(!output_pcb_traces)return;let{db:db2}=this.root,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),{holeDiameter,padDiameter}=getViaDiameterDefaults(pcbStyle2),board=db2.pcb_board.list()[0],routedViaHoleDiameter=board?.min_via_hole_diameter??holeDiameter,routedViaPadDiameter=board?.min_via_pad_diameter??padDiameter;output_jumpers&&output_jumpers.length>0&&insertAutoplacedJumpers({db:db2,output_jumpers,subcircuit_id:this.subcircuit_id}),deleteExistingPcbTracesReplacedBy({group:this,outputPcbTraces:output_pcb_traces,pcbTraceIdsToReplace:pcb_trace_ids_to_be_replaced});for(let pcb_trace3 of output_pcb_traces){if(pcb_trace3.type!=="pcb_trace")continue;pcb_trace3.subcircuit_id??(pcb_trace3.subcircuit_id=this.subcircuit_id);let cjRoute=pcb_trace3.route.map(point6=>point6.route_type!=="through_obstacle"?point6:{route_type:"through_pad",start:point6.start,end:point6.end,start_layer:point6.from_layer,end_layer:point6.to_layer,width:point6.width,circuitJsonMetadata:point6.circuitJsonMetadata}),routeSourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:{...pcb_trace3,route:cjRoute},subcircuit_id:this.subcircuit_id});cjRoute=ensureRouteStartsAtSourceTraceStart({db:db2,route:cjRoute,sourceTraceId:routeSourceTraceId}),pcb_trace3.route=cjRoute;let segments=splitPcbTracesOnJumperSegments(cjRoute);segments===null&&(segments=[cjRoute]);let processedSegments=addPortIdsToTracesAtJumperPads(segments,db2);for(let segment2 of processedSegments)if(segment2.length>0){let circuitJsonSegment=removeSrjMetadataFromPcbTraceRoute(segment2),sourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:{...pcb_trace3,route:circuitJsonSegment},subcircuit_id:this.subcircuit_id}),insertedPcbTrace=db2.pcb_trace.insert({...pcb_trace3,source_trace_id:sourceTraceId,route:circuitJsonSegment});claimSrjAssignablePcbViasTraversedByRoute({db:db2,pcbTrace:insertedPcbTrace,routeWithSrjMetadata:segment2})}}for(let pcb_trace3 of output_pcb_traces)if(pcb_trace3.type!=="pcb_via"&&pcb_trace3.type==="pcb_trace"){let sourceTraceId=getSourceTraceIdForRoutedTrace({db:db2,trace:pcb_trace3,subcircuit_id:this.subcircuit_id}),{connection_name:inputConnectionName}=pcb_trace3,subcircuitConnectivityMapKey;if(sourceTraceId&&(subcircuitConnectivityMapKey=db2.source_trace.get(sourceTraceId)?.subcircuit_connectivity_map_key),!subcircuitConnectivityMapKey&&inputConnectionName){let sourceNet=db2.source_net.get(inputConnectionName);sourceNet&&(subcircuitConnectivityMapKey=sourceNet.subcircuit_connectivity_map_key)}for(let point6 of pcb_trace3.route)if(point6.route_type==="via"){let routedViaPoint=point6,fromLayer=point6.from_layer,toLayer=point6.to_layer;db2.pcb_via.insert({pcb_trace_id:pcb_trace3.pcb_trace_id,x:point6.x,y:point6.y,hole_diameter:routedViaPoint.via_hole_diameter??routedViaPoint.hole_diameter??routedViaHoleDiameter,outer_diameter:routedViaPoint.via_diameter??routedViaPoint.outer_diameter??routedViaPadDiameter,layers:getViaSpanLayers({fromLayer,toLayer,layerCount:this._getSubcircuitLayerCount()}),from_layer:fromLayer,to_layer:toLayer,subcircuit_id:this.subcircuit_id,pcb_group_id:this.pcb_group_id??void 0,subcircuit_connectivity_map_key:subcircuitConnectivityMapKey})}}}doInitialSchematicComponentRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematic_group3=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_group3.schematic_group_id,props.showAsSchematicBox&&Group_doInitialSchematicBoxComponentRender(this);for(let child of this.getDescendants())child.getGroup()?.source_group_id===this.source_group_id&&(child._parsedProps?.showAsSchematicBox||child.schematic_component_id&&db2.schematic_component.update(child.schematic_component_id,{schematic_group_id:schematic_group3.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(){if(this._parsedProps.showAsSchematicBox){this._insertSchematicBorder();return}if(this.children.some(c3=>c3.source_component_id!==null&&c3._parsedProps?.schSectionName!==void 0)){this._doInitialSchematicLayoutSections(),this._insertSchematicBorder();return}let schematicLayoutMode=this._getSchematicLayoutMode();schematicLayoutMode==="match-adapt"&&this._doInitialSchematicLayoutMatchpack(),schematicLayoutMode==="grid"&&this._doInitialSchematicLayoutGrid(),schematicLayoutMode==="flex"&&this._doInitialSchematicLayoutFlex(),this._insertSchematicBorder()}_doInitialSchematicLayoutSections(){Group_doInitialSchematicLayoutSections(this)}_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,this.root?.platform)}_isLegacyAutorouterDisabled(){return getDisabledLegacyAutorouterPreset(this)!==null}_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 getDisabledLegacyGroupAutorouterPreset(this)?!1:this._getAutorouterConfig().groupMode==="sequential-trace"}doInitialPcbDesignRuleChecks(){if(this.root?.pcbDisabled||this._isLegacyAutorouterDisabled()||this.root?.pcbRoutingDisabled||this.getInheritedProperty("routingDisabled"))return;let{db:db2}=this.root;if(this.isSubcircuit){let immediateChildrenByName=new Map;for(let child of this.children)if(!child.isSubcircuit&&child._parsedProps.name){let components=immediateChildrenByName.get(child._parsedProps.name)||[];components.push(child),immediateChildrenByName.set(child._parsedProps.name,components)}for(let[name,components]of immediateChildrenByName.entries()){if(components.length<=1)continue;let sameNamedTraces=components.filter(child=>child instanceof Trace),duplicateNameIsOnlyTraces=sameNamedTraces.length===components.length,mutuallyConnectedTraceKeys=sameNamedTraces.map(trace=>trace.subcircuit_connectivity_map_key),sameNamedTracesAreMutuallyConnected=duplicateNameIsOnlyTraces&&mutuallyConnectedTraceKeys.every(Boolean)&&new Set(mutuallyConnectedTraceKeys).size===1;if(!duplicateNameIsOnlyTraces||!sameNamedTracesAreMutuallyConnected){let displaySubcircuitName=this.name||"unnamed",message=duplicateNameIsOnlyTraces?`Trace "${name}" in subcircuit "${displaySubcircuitName}" shares a name with another trace, but the traces are not mutually connected. Same-named traces must have the same subcircuit connectivity map key.`:`Multiple immediate children found with name "${name}" in subcircuit "${displaySubcircuitName}". Names must be unique.`;db2.pcb_trace_error.insert({error_type:"pcb_trace_error",message,source_trace_id:"",pcb_trace_id:"",pcb_component_ids:components.map(c3=>c3.pcb_component_id).filter(Boolean),pcb_port_ids:[]})}}}Group_doInitialStandaloneSubcircuitPcbDesignRuleChecks(this)}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||"",isGroundNet=net?.is_ground||GROUND_NET_REGEX.test(text),isPowerNet=net?.is_power||POWER_NET_REGEX.test(text);if(nl3.anchor_side==="top"&&isGroundNet){subtree.schematic_net_label.update(nl3.schematic_net_label_id,{symbol_name:"rail_down"});continue}nl3.anchor_side==="bottom"&&isPowerNet&&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(position4){return super._repositionOnPcb(position4)}};function inflateSourceGroup(sourceGroup,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.source_group_id}),groupProps2={name:sourceGroup.name??`inflated_group_${sourceGroup.source_group_id}`};if(pcbGroup?.position_mode==="relative_to_group_anchor"&&pcbGroup.anchor_position){let baseAnchor={x:0,y:0};if(sourceGroup.parent_source_group_id){let parentPcbGroup=injectionDb.pcb_group.getWhere({source_group_id:sourceGroup.parent_source_group_id});parentPcbGroup?.anchor_position&&(baseAnchor=parentPcbGroup.anchor_position)}groupProps2.pcbX=pcbGroup.anchor_position.x-baseAnchor.x,groupProps2.pcbY=pcbGroup.anchor_position.y-baseAnchor.y}pcbGroup?.anchor_alignment&&(groupProps2.pcbAnchorAlignment=pcbGroup.anchor_alignment);let group=new Group5(groupProps2);return group._isInflatedFromCircuitJson=!0,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 Inductor2=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,max_current_rating:props.maxCurrentRating===void 0?void 0:parseAndConvertSiUnit(props.maxCurrentRating,"A").value,display_inductance:this._getSchematicSymbolDisplayValue(),supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),inductor=new Inductor2({name:sourceElm.name,inductance:sourceElm.inductance,layer:pcbElm?.layer,pcbX,pcbY,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)}var Led=class extends NormalComponent3{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(){let hasFootprintChild=this.children.some(child=>child.componentName==="Footprint"),footprint=this.resolveFootprint(),hasPinLabels=!!this._resolvePinLabels(),shouldAddDefaultAliases=!hasPinLabels&&!hasFootprintChild&&(!footprint||isFootprinterString(footprint));super.initPorts({pinCount:2,ignoreSymbolPorts:!hasPinLabels&&!shouldAddDefaultAliases,additionalAliases:{pin1:shouldAddDefaultAliases?["anode","pos","left"]:[],pin2:shouldAddDefaultAliases?["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}get pos(){return this.portMap.pos}get anode(){return this.portMap.anode}get neg(){return this.portMap.neg}get cathode(){return this.portMap.cathode}};function inflateSourceLed(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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),led2=new Led({name:sourceElm.name,color:sourceElm.color,wavelength:sourceElm.wavelength??sourceElm.wave_length,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:led2});footprint&&led2.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(led2):subcircuit.add(led2)}var possibleOrientations=[{gate:"left",drain:"top",source:"bottom"},{gate:"left",drain:"bottom",source:"top"},{gate:"right",drain:"top",source:"bottom"},{gate:"right",drain:"bottom",source:"top"},{gate:"top",drain:"left",source:"right"},{gate:"top",drain:"right",source:"left"},{gate:"bottom",drain:"left",source:"right"},{gate:"bottom",drain:"right",source:"left"}],getBaselineOrientation=rotation42=>{let normalizedRotation=(rotation42%360+360)%360;if(normalizedRotation%90!==0)throw new Error(`Schematic rotation ${rotation42} is not supported for Mosfet`);return[{gate:"left",drain:"top",source:"bottom"},{gate:"top",drain:"right",source:"left"},{gate:"right",drain:"bottom",source:"top"},{gate:"bottom",drain:"left",source:"right"}][normalizedRotation/90]},getRequestedOrientation=props=>{let requestedSides={drain:props.symbolDrainSide,source:props.symbolSourceSide,gate:props.symbolGateSide},baseline=getBaselineOrientation(Number(props.schRotation??0)),matchingOrientations=possibleOrientations.filter(orientation4=>Object.keys(requestedSides).every(portName=>requestedSides[portName]===void 0||requestedSides[portName]===orientation4[portName]));if(matchingOrientations.length===0){let requestedDescription=Object.entries(requestedSides).filter(([,side])=>side!==void 0).map(([portName,side])=>`${portName}=${side}`).join(", ");throw new Error(`Invalid MOSFET symbol port side combination (${requestedDescription}). The gate must be perpendicular to the drain and source, and the drain and source must be opposite.`)}return matchingOrientations.sort((a6,b6)=>{let score=orientation4=>Object.keys(baseline).filter(portName=>orientation4[portName]!==baseline[portName]).length;return score(a6)-score(b6)})[0]},getMosfetSchematicSymbolName=props=>{let mosfetMode=props.mosfetMode==="depletion"?"d":"e",baseSymbolName=`${props.channelType}_channel_${mosfetMode}_mosfet_transistor`;if(!(props.symbolDrainSide!==void 0||props.symbolSourceSide!==void 0||props.symbolGateSide!==void 0))return baseSymbolName;let{gate,drain}=getRequestedOrientation(props);return`${baseSymbolName}_gate_${gate}_drain_${drain}`},Mosfet2=class extends NormalComponent3{get config(){return{componentName:"Mosfet",schematicSymbolName:this.props.symbolName??getMosfetSchematicSymbolName(this.props),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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,mosfet_mode:props.mosfetMode,channel_type:props.channelType,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourceMosfet(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),mosfet=new Mosfet2({name:sourceElm.name,channelType:sourceElm.channel_type,mosfetMode:sourceElm.mosfet_mode,manufacturerPartNumber:sourceElm.manufacturer_part_number,supplierPartNumbers:sourceElm.supplier_part_numbers??void 0,displayName:sourceElm.display_name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:mosfet});footprint&&mosfet.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(mosfet):subcircuit.add(mosfet)}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_port3=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_port3.pcb_port_id}}var 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=hc[this._getSchematicSymbolNameOrThrow()],symPort1=symbol.ports.find(p3=>p3.labels.includes("1")),symPort2=symbol.ports.find(p3=>p3.labels.includes("2")),ports=this.selectAll("port"),pin1Port=ports.find(p3=>p3.props.pinNumber===1),pin2Port=ports.find(p3=>p3.props.pinNumber===2),pin3Port=ports.find(p3=>p3.props.pinNumber===3),pin4Port=ports.find(p3=>p3.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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!0,display_name:props.displayName});this.source_component_id=source_component.source_component_id}};function inflateSourcePushButton(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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),pushButton=new PushButton({name:sourceElm.name,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:pushButton});footprint&&pushButton.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(pushButton):subcircuit.add(pushButton)}var Resistor2=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 Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pullupFor})),this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.2`,to:this.props.pullupTo}))),this.props.pulldownFor&&this.props.pulldownTo&&(this.add(new Trace({from:`${this.getSubcircuitSelector()} > port.1`,to:this.props.pulldownFor})),this.add(new Trace({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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),resistor=new Resistor2({name:sourceElm.name,resistance:sourceElm.resistance,layer:pcbElm?.layer,pcbX,pcbY,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 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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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)}},getImportedSwitchProps=(sourceElm,inflatorContext)=>{let sourcePorts=inflatorContext.injectionDb.source_port.list().filter(port=>port.source_component_id===sourceElm.source_component_id),pinLabels={},highestPinNumber=0;for(let sourcePort of sourcePorts){let pinNumber=sourcePort.pin_number;if(pinNumber==null)continue;highestPinNumber=Math.max(highestPinNumber,pinNumber);let labels=Array.from(new Set([sourcePort.name,...sourcePort.port_hints??[]].filter(label=>typeof label=="string"&&label.length>0)));labels.length>0&&(pinLabels[`pin${pinNumber}`]=labels)}let type="spst";return highestPinNumber>=5?type="dpdt":highestPinNumber===4?type="dpst":highestPinNumber===3&&(type="spdt"),{type,pinLabels:Object.keys(pinLabels).length>0?pinLabels:void 0}};function inflateSourceSwitch(sourceElm,inflatorContext){let{injectionDb,subcircuit,groupsMap}=inflatorContext,pcbElm=injectionDb.pcb_component.getWhere({source_component_id:sourceElm.source_component_id}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),importedSwitchProps=getImportedSwitchProps(sourceElm,inflatorContext),switchComponent=new Switch({name:sourceElm.name,displayName:sourceElm.display_name,...importedSwitchProps,layer:pcbElm?.layer,pcbX,pcbY,pcbRotation:pcbElm?.rotation,doNotPlace:pcbElm?.do_not_place,obstructsWithinBounds:pcbElm?.obstructs_within_bounds});if(pcbElm){let footprint=inflateFootprintComponent(pcbElm,{...inflatorContext,normalComponent:switchComponent});footprint&&switchComponent.add(footprint)}sourceElm.source_group_id&&groupsMap?.has(sourceElm.source_group_id)?groupsMap.get(sourceElm.source_group_id).add(switchComponent):subcircuit.add(switchComponent)}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 position4=getRoutePointPosition2(point6),firstPosition=getRoutePointPosition2(firstPoint),lastPosition=getRoutePointPosition2(lastPoint),isSameAsFirst=position4.x===firstPosition.x&&position4.y===firstPosition.y,isSameAsLast=position4.x===lastPosition.x&&position4.y===lastPosition.y;return!isSameAsFirst&&!isSameAsLast}).map(point6=>{if(point6.route_type==="via")return{x:point6.x,y:point6.y,via:!0,fromLayer:point6.from_layer,toLayer:point6.to_layer};let position4=getRoutePointPosition2(point6);return{x:position4.x,y:position4.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 pcbTraces=injectionDb.pcb_trace.list().filter(trace2=>trace2.source_trace_id===sourceTrace.source_trace_id),pcbTrace=pcbTraces[0],pcbPath2;pcbTrace&&(pcbPath2=pcbTraceRouteToPcbPath(pcbTrace.route));let traceWidth=sourceTrace.min_trace_thickness;if(!traceWidth&&pcbTrace?.route){let wirePoint=pcbTrace.route.find(pt3=>pt3.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&&sourceTrace.connected_source_port_ids.length===2&&sourceTrace.connected_source_net_ids.length===0&&(traceProps2.pcbStraightLine=!0);let trace=new Trace(traceProps2);trace._inflatedPcbTraces=pcbTraces.length>0?pcbTraces:void 0,trace._inflatedPcbVias=pcbTrace?injectionDb.pcb_via.list().filter(via=>pcbTraces.some(trace2=>via.pcb_trace_id===trace2.pcb_trace_id)):void 0,subcircuit.add(trace)}var SHORT_ALIASES={collector:["c"],base:["b"],emitter:["e"]},Transistor=class extends NormalComponent3{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 additionalAliases={},symbol=this.getSchematicSymbol();for(let symPort of symbol?.ports??[]){let pinNumber=getPinNumberFromLabels(symPort.labels);if(pinNumber)for(let label of symPort.labels){let shortAliases=SHORT_ALIASES[label];shortAliases&&(additionalAliases[`pin${pinNumber}`]=shortAliases)}}super.initPorts({pinCount:3,additionalAliases})}get collector(){return this.portMap.collector}get base(){return this.portMap.base}get emitter(){return this.portMap.emitter}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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}),{pcbX,pcbY}=getInflatedPcbPlacement({pcbComponent:pcbElm,sourceGroupId:sourceElm.source_group_id,inflatorContext}),transistor=new Transistor({name:sourceElm.name,type:sourceElm.transistor_type,layer:pcbElm?.layer,pcbX,pcbY,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","pcb_via","pcb_hole","pcb_plated_hole","pcb_cutout"],standalonePrimitives=injectionDb.toArray().filter(elm=>{if(!standalonePrimitiveTypes.includes(elm.type))return!1;if(elm.type==="pcb_via"){if(!elm.pcb_trace_id)return!0;let pcbTrace=injectionDb.pcb_trace.get(elm.pcb_trace_id),sourceTraceId=pcbTrace?.source_trace_id;return!(sourceTraceId&&injectionDb.source_trace.get(sourceTraceId)&&pcbTrace?.route.some(point6=>point6.route_type==="via"&&Math.abs(point6.x-elm.x)<1e-4&&Math.abs(point6.y-elm.y)<1e-4))}return elm.type==="pcb_cutout"?!0:"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(g4=>!g4.parent_source_group_id||renderedGroupIds.has(g4.parent_source_group_id));if(groupIndex===-1){let remainingIds=groupsToRender.map(g4=>g4.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_fiducial":inflateSourceFiducial(sourceComponent,inflationCtx);break;case"simple_led":inflateSourceLed(sourceComponent,inflationCtx);break;case"simple_chip":inflateSourceChip(sourceComponent,inflationCtx);break;case"simple_connector":inflateSourceConnector(sourceComponent,inflationCtx);break;case"simple_transistor":inflateSourceTransistor(sourceComponent,inflationCtx);break;case"simple_mosfet":inflateSourceMosfet(sourceComponent,inflationCtx);break;case"simple_push_button":inflateSourcePushButton(sourceComponent,inflationCtx);break;case"simple_switch":inflateSourceSwitch(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)},isSelectionResultPort=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourcePort=="function",isSelectionResultNet=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getSourceNet=="function",isSelectionResultComponent=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.getPorts=="function",isCircuitJsonElement=connectable=>!connectable||typeof connectable!="object"?!1:typeof connectable.type=="string",isNonEmptyString=value=>typeof value=="string"&&value.length>0,SelectionResultPortImpl=class{constructor(port){__publicField(this,"port");this.port=port}getPcbPort(){let pcbPortId=this.port.pcb_port_id;return pcbPortId?this.port.root?.db.pcb_port.get(pcbPortId)??null:null}getSourcePort(){let sourcePortId=this.port.source_port_id;return sourcePortId?this.port.root?.db.source_port.get(sourcePortId)??null:null}},SelectionResultNetImpl=class{constructor(net){__publicField(this,"net");this.net=net}getSourceNet(){let sourceNetId=this.net.source_net_id;return sourceNetId?this.net.root?.db.source_net.get(sourceNetId)??null:null}},SelectionResultComponentImpl=class{constructor(component){__publicField(this,"component");this.component=component}getPort(name){let port=this.component.selectOne(`port.${name}`,{type:"port"})??this.component.selectOne(`.${name}`,{type:"port"});return port?new SelectionResultPortImpl(port):null}getPorts(){return this.component.selectAll("port").map(port=>new SelectionResultPortImpl(port))}getPcbComponent(){let pcbComponentId=this.component.pcb_component_id;return pcbComponentId?this.component.root?.db.pcb_component.get(pcbComponentId)??null:null}getSourceComponent(){let sourceComponentId=this.component.source_component_id;return sourceComponentId?this.component.root?.db.source_component.get(sourceComponentId)??null:null}},DrcCheck=class extends PrimitiveComponent2{get config(){return{componentName:"DrcCheck",zodProps:drcCheckProps}}constructor(props){super(props)}async runCustomDrcCheck(circuitJson){let result=await this._parsedProps.checkFn(this.createCustomDrcCheckContext(circuitJson)),diagnostics=[];return Array.isArray(result)?diagnostics=result:result&&(diagnostics=[result]),diagnostics.map((diagnostic,index)=>this.createCircuitJsonDiagnostic(diagnostic,index)).filter(diagnostic=>!!diagnostic)}createCustomDrcCheckContext(circuitJson){return{select:this.selectCustomDrcElement.bind(this),selectAll:this.selectAllCustomDrcElements.bind(this),isConnected:(a6,b6)=>this.isConnected(a6,b6,circuitJson),isPulledUp:a6=>this.isConnected(a6,"net.VCC",circuitJson)||this.isConnected(a6,"net.VDD",circuitJson)||this.getResistanceBetween(a6,"net.VCC",circuitJson)!==null||this.getResistanceBetween(a6,"net.VDD",circuitJson)!==null,isPulledDown:a6=>this.isConnected(a6,"net.GND",circuitJson)||this.getResistanceBetween(a6,"net.GND",circuitJson)!==null,getResistanceBetween:(a6,b6)=>this.getResistanceBetween(a6,b6,circuitJson)}}selectCustomDrcElement(selector){return this.wrapSelectionResult(this.getSubcircuit().selectOne(selector))}selectAllCustomDrcElements(selector){let selectionResults=[];for(let component of this.getSubcircuit().selectAll(selector)){let selectionResult=this.wrapSelectionResult(component);selectionResult&&selectionResults.push(selectionResult)}return selectionResults}wrapSelectionResult(component){return component?component instanceof Port?new SelectionResultPortImpl(component):component instanceof Net?new SelectionResultNetImpl(component):new SelectionResultComponentImpl(component):null}createCircuitJsonDiagnostic(diagnostic,index){let diagnosticRecord=diagnostic,diagnosticType="source_component_misconfigured_error";typeof diagnosticRecord.error_type=="string"?diagnosticType=diagnosticRecord.error_type:typeof diagnosticRecord.warning_type=="string"&&(diagnosticType=diagnosticRecord.warning_type);let diagnosticWithCircuitJsonDefaults={...diagnostic};typeof diagnosticRecord.type=="string"?diagnosticWithCircuitJsonDefaults.type=diagnosticRecord.type:diagnosticWithCircuitJsonDefaults.type=diagnosticType,typeof diagnosticRecord.warning_type!="string"&&(typeof diagnosticRecord.error_type=="string"?diagnosticWithCircuitJsonDefaults.error_type=diagnosticRecord.error_type:diagnosticWithCircuitJsonDefaults.error_type=diagnosticType);let diagnosticIdField=`${diagnosticType}_id`;return diagnosticRecord[diagnosticIdField]?diagnosticWithCircuitJsonDefaults[diagnosticIdField]=diagnosticRecord[diagnosticIdField]:diagnosticWithCircuitJsonDefaults[diagnosticIdField]=`${diagnosticType}_${this._renderId}_${index}`,any_circuit_element.parse(diagnosticWithCircuitJsonDefaults)}isConnected(a6,b6,circuitJson){let aKeys=this.getConnectivityKeys(a6,circuitJson),bKeys=this.getConnectivityKeys(b6,circuitJson);return aKeys.some(key=>bKeys.includes(key))}getResistanceBetween(a6,b6,circuitJson){if(this.isConnected(a6,b6,circuitJson))return 0;let aKeys=this.getConnectivityKeys(a6,circuitJson),bKeys=this.getConnectivityKeys(b6,circuitJson);if(aKeys.length===0||bKeys.length===0)return null;let sourceResistors=circuitJson.filter(elm=>elm.type==="source_component"&&elm.ftype==="simple_resistor"),root=this.root;if(!root)return null;for(let resistor of sourceResistors){let resistorPorts=root.db.source_port.list({source_component_id:resistor.source_component_id});if(resistorPorts.length!==2)continue;let resistorKeys=resistorPorts.map(port=>port.subcircuit_connectivity_map_key),connectsA=resistorKeys.some(key=>key&&aKeys.includes(key)),connectsB=resistorKeys.some(key=>key&&bKeys.includes(key));if(connectsA&&connectsB)return resistor.resistance}return null}getConnectivityKeys(connectable,circuitJson){if(!connectable)return[];if(typeof connectable=="string"){let selected=this.selectCustomDrcElement(connectable);return selected?this.getConnectivityKeys(selected,circuitJson):[]}return isSelectionResultPort(connectable)?[connectable.getSourcePort()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultNet(connectable)?[connectable.getSourceNet()?.subcircuit_connectivity_map_key].filter(isNonEmptyString):isSelectionResultComponent(connectable)?connectable.getPorts().flatMap(port=>this.getConnectivityKeys(port,circuitJson)):isCircuitJsonElement(connectable)?this.getCircuitJsonElementConnectivityKeys(connectable,circuitJson):[]}getCircuitJsonElementConnectivityKeys(element,circuitJson){if(!element)return[];if(element.type==="source_port")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="source_net")return[element.subcircuit_connectivity_map_key].filter(isNonEmptyString);if(element.type==="pcb_port")return this.getConnectivityKeys(element.source_port_id,circuitJson);if(element.type==="source_component"){let root=this.root;return root?root.db.source_port.list({source_component_id:element.source_component_id}).map(port=>port.subcircuit_connectivity_map_key).filter(isNonEmptyString):[]}return[]}},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,"_hasUnrenderedUpdatesFromAsyncEffects",!1);__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_react7.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 findBoard=components=>{for(let child of components){if(child.componentName==="Board")return child;if(isAssemblyDeviceContainer(child)){let nested=findBoard(child.children);if(nested)return nested}}};return findBoard(this.children)}_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||isAssemblyDeviceContainer(this.children[0]))){this.firstChild=this.children[0];return}let group=new Group5({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._hasUnrenderedUpdatesFromAsyncEffects=!1,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.isDoneRendering();)await new Promise(resolve=>setTimeout(resolve,100)),this.render();this.emit("renderComplete")}isDoneRendering(){return this._hasRenderedAtleastOnce&&!this._hasIncompleteAsyncEffects()}_hasIncompleteAsyncEffects(){return this._asyncEffectPhaseById.size>0||this._hasUnrenderedUpdatesFromAsyncEffects?!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_dist9(),dist_exports3)).catch(e6=>{throw new Error(`To use circuit.getSvg, you must install the "circuit-to-svg" package.
|
|
742
742
|
|
|
743
743
|
"${e6.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(l6=>l6!==listener))}enableDebug(debug132){typeof debug132=="string"?import_debug21.default.enable(debug132):(debug132===null||debug132===!1)&&import_debug21.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),this._hasUnrenderedUpdatesFromAsyncEffects=!0}};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(error2){throw rejectRender(error2 instanceof Error?error2:new Error(String(error2))),error2}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(v6=>safeSerialize(v6,seen)).join(",")}]`:`{${Object.keys(value).sort().map(k7=>`${k7}:${safeSerialize(value[k7],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 i6=0;i6<str.length;i6++)hash^=str.charCodeAt(i6),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 resetPcbTraceRenderInSubtree=renderable=>{renderable._pcbTraceRenderWaitingForPlacementChecks&&(renderable.renderPhaseStates.PcbTraceRender.initialized=!1,renderable.renderPhaseStates.PcbTraceRender.dirty=!1,renderable._pcbTraceRenderWaitingForPlacementChecks=!1);for(let child of renderable.children)resetPcbTraceRenderInSubtree(child)},Board_doInitialPcbPlacementDesignRuleChecks=board=>{if(board.root?.pcbDisabled)return;let placementDrcChecksDisabled=board.root?.platform?.placementDrcChecksDisabled??board.getInheritedProperty("placementDrcChecksDisabled"),drcChecksDisabled=board.root?.platform?.drcChecksDisabled??board.getInheritedProperty("drcChecksDisabled");if(board._pcbPlacementDrcErrorCount=null,board._pcbPlacementDrcCheckError=null,board._pcbPlacementDrcChecksPending=!1,placementDrcChecksDisabled||drcChecksDisabled){board._pcbPlacementDrcErrorCount=0;return}let{db:db2}=board.root,subcircuitCircuitJson=db2.subtree({subcircuit_id:board.subcircuit_id}).toArray(),existingPlacementDiagnostics=db2.toArray();board._pcbPlacementDrcChecksPending=!0,board._queueAsyncEffect("board:pre-route-placement-checks",async()=>{try{let placementCheckResults=await runAllPlacementChecks(subcircuitCircuitJson),newPlacementDiagnostics=placementCheckResults.filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message));db2.insertAll(newPlacementDiagnostics),board._pcbPlacementDrcErrorCount=placementCheckResults.filter(result=>result.type.endsWith("_error")).length}catch(error2){board._pcbPlacementDrcCheckError=error2 instanceof Error?error2.message:String(error2)}finally{board._pcbPlacementDrcChecksPending=!1,resetPcbTraceRenderInSubtree(board)}})},MIN_EFFECTIVE_BORDER_RADIUS_MM=.01,DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM=.15,getRoundedRectOutline=(width,height,radius)=>{let w22=width/2,h22=height/2,r6=Math.min(radius,w22,h22);if(r6<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*r6/.1)),step=Math.PI/2/segments,outline=[];outline.push({x:-w22+r6,y:-h22}),outline.push({x:w22-r6,y:-h22});for(let i6=1;i6<=segments;i6++){let theta=-Math.PI/2+i6*step;outline.push({x:w22-r6+r6*Math.cos(theta),y:-h22+r6+r6*Math.sin(theta)})}outline.push({x:w22,y:h22-r6});for(let i6=1;i6<=segments;i6++){let theta=0+i6*step;outline.push({x:w22-r6+r6*Math.cos(theta),y:h22-r6+r6*Math.sin(theta)})}outline.push({x:-w22+r6,y:h22});for(let i6=1;i6<=segments;i6++){let theta=Math.PI/2+i6*step;outline.push({x:-w22+r6+r6*Math.cos(theta),y:h22-r6+r6*Math.sin(theta)})}outline.push({x:-w22,y:-h22+r6});for(let i6=1;i6<=segments;i6++){let theta=Math.PI+i6*step;outline.push({x:-w22+r6+r6*Math.cos(theta),y:-h22+r6+r6*Math.sin(theta)})}return outline},Board=class extends Group5{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(){return getBoardAvailableLayers(this._parsedProps.layers??2)}_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=getBoundsFromPoints2(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=getDescendantSubcircuitIds2(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(g4=>g4.subcircuit_id&&allowedSubcircuitIds.has(g4.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=getBoundsFromPoints2(pcbGroup.outline);bounds&&(width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY)}updateBounds(pcbGroup.center,width,height)}if(props.boardAnchorPosition){let{x:x6,y:y2}=props.boardAnchorPosition;minX=Math.min(minX,x6),minY=Math.min(minY,y2),maxX=Math.max(maxX,x6),maxY=Math.max(maxY,y2)}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(`
|
|
744
744
|
`),position4={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:position4})}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_board3=db2.source_board.insert({source_group_id:this.source_group_id,title:this.props.title||this.props.name});this.source_board_id=source_board3.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=getBoundsFromPoints2(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 subcircuitProps2=this.getSubcircuit()._parsedProps,pcbStyle2=this.getInheritedMergedProperty("pcbStyle"),styledViaDimensions=getViaDiameterDefaults(pcbStyle2),configuredViaHoleDiameter=subcircuitProps2.minViaHoleDiameter??(pcbStyle2?.viaHoleDiameter!==void 0?styledViaDimensions.holeDiameter:void 0),resolvedMinViaHoleDiameter=configuredViaHoleDiameter??jlcMinTolerances2.min_via_hole_diameter,resolvedMinViaPadDiameter=subcircuitProps2.minViaPadDiameter??(pcbStyle2?.viaPadDiameter!==void 0?styledViaDimensions.padDiameter:configuredViaHoleDiameter!==void 0?configuredViaHoleDiameter+DEFAULT_VIA_PAD_DIAMETER_OVER_HOLE_DIAMETER_MM:jlcMinTolerances2.min_via_pad_diameter),pcb_board3=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,...props.isViaInPadAllowed!==void 0&&{is_via_in_pad_allowed:props.isViaInPadAllowed},...props.solderMaskColor!==void 0&&{solder_mask_color:props.solderMaskColor},...props.silkscreenColor!==void 0&&{silkscreen_color:props.silkscreenColor},min_trace_width:subcircuitProps2.minTraceWidth??jlcMinTolerances2.min_trace_width,min_via_hole_diameter:resolvedMinViaHoleDiameter,min_via_pad_diameter:resolvedMinViaPadDiameter,min_via_hole_edge_to_via_hole_edge_clearance:subcircuitProps2.minViaHoleEdgeToViaHoleEdgeClearance??jlcMinTolerances2.min_via_hole_edge_to_via_hole_edge_clearance,min_via_edge_to_pad_edge_clearance:subcircuitProps2.minViaEdgeToPadEdgeClearance??jlcMinTolerances2.min_via_edge_to_pad_edge_clearance,min_trace_to_pad_edge_clearance:subcircuitProps2.minTraceToPadEdgeClearance??jlcMinTolerances2.min_trace_to_pad_edge_clearance,min_pad_edge_to_pad_edge_clearance:subcircuitProps2.minPadEdgeToPadEdgeClearance??jlcMinTolerances2.min_pad_edge_to_pad_edge_clearance,min_plated_hole_drill_edge_to_drill_edge_clearance:subcircuitProps2.minPlatedHoleDrillEdgeToDrillEdgeClearance??jlcMinTolerances2.min_plated_hole_drill_edge_to_drill_edge_clearance,min_board_edge_clearance:subcircuitProps2.minBoardEdgeClearance??jlcMinTolerances2.min_board_edge_clearance});this.pcb_board_id=pcb_board3.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())}doInitialPcbPlacementDesignRuleChecks(){Board_doInitialPcbPlacementDesignRuleChecks(this)}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=[];if(shouldRunRoutingChecks&&checksToRun.push(runAllRoutingChecks(circuitJson)),shouldRunPlacementChecks){let existingPlacementDiagnostics=db2.toArray();checksToRun.push(runAllPlacementChecks(circuitJson).then(results=>results.filter(result=>!existingPlacementDiagnostics.some(existing=>existing.type===result.type&&"message"in existing&&existing.message===result.message))))}if(shouldRunNetlistChecks&&checksToRun.push(runAllNetlistChecks(circuitJson)),shouldRunPinSpecificationChecks&&checksToRun.push(runAllPinSpecificationChecks(circuitJson)),!drcChecksDisabled)for(let drcCheck of this.selectAll("drccheck"))checksToRun.push(drcCheck.runCustomDrcCheck(circuitJson));let checkResults=await Promise.all(checksToRun);db2.insertAll(dedupePcbDrcErrors(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}})}runRenderPhaseForChildren(phase){this.root?.emit("board:renderPhaseStarted",{renderId:this._renderId,phase}),super.runRenderPhaseForChildren(phase)}_repositionOnPcb(position4){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:position4});return}let deltaX=position4.x-oldPos.x,deltaY=position4.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:position4}),pcbBoard?.outline)){let outlineBounds=getBoundsFromPoints2(pcbBoard.outline);if(outlineBounds){let oldOutlineCenter={x:(outlineBounds.minX+outlineBounds.maxX)/2,y:(outlineBounds.minY+outlineBounds.maxY)/2},outlineDeltaX=position4.x-oldOutlineCenter.x,outlineDeltaY=position4.y-oldOutlineCenter.y,newOutline=pcbBoard.outline.map(p3=>({x:p3.x+outlineDeltaX,y:p3.y+outlineDeltaY}));db2.pcb_board.update(this.pcb_board_id,{outline:newOutline})}}}},Subcircuit=class extends Group5{constructor(props){super({...props,subcircuit:!0})}getSubcircuitPropHash(){return Subcircuit_getSubcircuitPropHash(this)}doInitialRenderIsolatedSubcircuits(){Subcircuit_doInitialRenderIsolatedSubcircuits(this)}doInitialCreateNetsFromProps(){super.doInitialCreateNetsFromProps(),this._createTracesForExposedConnections()}_createTracesForExposedConnections(){let exposedNets=this._getNetNamesToExpose();if(!exposedNets?.length)return;let parentSubcircuit=this.parent?.getSubcircuit?.();if(parentSubcircuit&&this.name)for(let exposedNetName of exposedNets){let netName=normalizeExposedNetName(exposedNetName),parentNetSelector=`> net.${netName}`,childNetSelector=`.${this.name} > net.${netName}`;if(parentSubcircuit.children.find(child=>child instanceof Net&&child._parsedProps.name===netName)||parentSubcircuit.add(new Net({name:netName})),parentSubcircuit.children.find(child=>{if(!(child instanceof Trace)||!child._exposesSubcircuitConnection)return!1;let childProps=child._parsedProps;return childProps.from===childNetSelector&&childProps.to===parentNetSelector}))continue;let trace=new Trace({from:childNetSelector,to:parentNetSelector,displayName:netName});trace._exposesSubcircuitConnection=!0,parentSubcircuit.add(trace)}}_getNetNamesToExpose(){let explicitExposedNets=this._parsedProps.exposedNets??[];if(!this._parsedProps.exposeNets)return explicitExposedNets;let childNetNames=this.selectAll("net").filter(net=>net instanceof Net&&net.getSubcircuit()===this).map(net=>net._parsedProps.name);return Array.from(new Set([...explicitExposedNets,...childNetNames]))}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)}},normalizeExposedNetName=netName=>netName.startsWith("net.")?netName.slice(4):netName,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 current3=this.parent;for(;current3;){if(current3 instanceof Board)return current3;current3=current3.parent}return null}doInitialPcbComponentRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,globalPos=this._getGlobalPcbPositionBeforeLayout(),pcb_board3=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_board3.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(p3=>point4(p3.x,p3.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 i6=0;i6<outline.length;i6++){let p1_=outline[i6],p2_=outline[(i6+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 k7=0;k7<numBitesInGap;k7++){let biteDist=firstBiteDistFromP1+k7*holeAndSpacing,pos=p12.translate(segmentDir.multiply(biteDist));mouseBiteHoles.push({x:pos.x,y:pos.y})}}}let p_prev_=outline[(i6-1+outline.length)%outline.length],p_next_=outline[(i6+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=effectiveGapLength<1e-6?[{start:0-start_ext,end:segmentLength+end_ext}]:[{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(p3=>point4(p3.x,p3.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}}function generatePanelOutlineRoutingCutouts(boards,options){return boards.map(board=>{if((!board.outline||board.outline.length===0)&&board.width&&board.height){let halfWidth=board.width/2,halfHeight=board.height/2;return{...board,outline:[{x:board.center.x-halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y-halfHeight},{x:board.center.x+halfWidth,y:board.center.y+halfHeight},{x:board.center.x-halfWidth,y:board.center.y+halfHeight}]}}return board}).flatMap(board=>{if(!board.outline||board.outline.length===0)return[];let{tabCutouts}=generateCutoutsAndMousebitesForOutline(board.outline,{gapLength:0,cutoutWidth:options.cutoutWidth,mouseBites:!1,mouseBiteHoleDiameter:0,mouseBiteHoleSpacing:0});return tabCutouts.map(cutout=>({...cutout,pcb_board_id:board.pcb_board_id}))}).map((cutout,outlineRoutingCutoutIndex)=>({...cutout,pcb_cutout_id:`panel_outline_routing_cutout_${outlineRoutingCutoutIndex}`}))}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=getBoundsFromPoints2(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(b6=>b6.width),minCellWidth),maxItemHeight=Math.max(...itemsWithDims.map(b6=>b6.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,i6)=>{let colIdx=i6%cols,rowIdx=Math.floor(i6/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 i6=0;i6<colWidths.length;i6++)colWidths[i6]=Math.max(colWidths[i6],minCellWidth);for(let i6=0;i6<rowHeights.length;i6++)rowHeights[i6]=Math.max(rowHeights[i6],minCellHeight);let gridWidth=colWidths.reduce((a6,b6)=>a6+b6,0)+(cols>1?(cols-1)*boardGap:0),gridHeight=rowHeights.reduce((a6,b6)=>a6+b6,0)+(rows>1?(rows-1)*boardGap:0),startX=-gridWidth/2,startY=-gridHeight/2,colXOffsets=[startX];for(let i6=1;i6<cols;i6++)colXOffsets.push(colXOffsets[i6-1]+colWidths[i6-1]+boardGap);let rowYOffsets=[startY];for(let i6=1;i6<rows;i6++)rowYOffsets.push(rowYOffsets[i6-1]+rowHeights[i6-1]+boardGap);let positions=[];return itemsWithDims.forEach((itemWithDims,i6)=>{let colIdx=i6%cols,rowIdx=Math.floor(i6/cols);if(rowIdx>=rowYOffsets.length||colIdx>=colXOffsets.length)return;let x6=colXOffsets[colIdx]+colWidths[colIdx]/2,y2=rowYOffsets[rowIdx]+rowHeights[rowIdx]/2;positions.push({item:itemWithDims.item,pos:{x:x6,y:y2}})}),{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 Group5{constructor(){super(...arguments);__publicField(this,"pcb_panel_id",null);__publicField(this,"_panelizationFeaturesGenerated",!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"}doInitialSchematicComponentRender(){}doInitialSchematicLayout(){}doInitialSchematicTraceRender(){}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._generatePanelizationFeatures()}_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})}}}_generatePanelizationFeatures(){if(this._panelizationFeaturesGenerated)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(id3=>!!id3),boardsInPanel=db2.pcb_board.list().filter(b6=>childBoardIds.includes(b6.pcb_board_id));if(boardsInPanel.length===0)return;let tabWidth=props.tabWidth??DEFAULT_TAB_WIDTH;if(panelizationMethod==="outline_routing"){let outlineRoutingCutouts=generatePanelOutlineRoutingCutouts(boardsInPanel,{cutoutWidth:tabWidth});for(let outlineRoutingCutout of outlineRoutingCutouts)db2.pcb_cutout.insert({...outlineRoutingCutout,pcb_group_id:this.pcb_group_id??void 0,pcb_panel_id:this.pcb_panel_id??void 0})}else{let 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._panelizationFeaturesGenerated=!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,thickness:1.6,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(){if(this._parsedProps.schShowRatings===!1)return"";let rawCurrent=this._parsedProps.currentRating,rawVoltage=this._parsedProps.voltageRating,current3=parseAndConvertSiUnit(rawCurrent,"A").value,voltage3=parseAndConvertSiUnit(rawVoltage,"V").value;return`${formatSiUnit(current3)}A / ${formatSiUnit(voltage3)}V`}doInitialSourceRender(){let{db:db2}=this.root,{_parsedProps:props}=this,currentRating=parseAndConvertSiUnit(props.currentRating,"A").value,voltageRating=parseAndConvertSiUnit(props.voltageRating,"V").value,display_current_rating,display_voltage_rating;props.schShowRatings!==!1&&(display_current_rating=`${formatSiUnit(currentRating)}A`,display_voltage_rating=`${formatSiUnit(voltageRating)}V`);let source_component=db2.source_component.insert({name:this.name,ftype:FTYPE.simple_fuse,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,...currentRating!=null?{current_rating_amps:currentRating}:{},...voltageRating!=null?{voltage_rating_volts:voltageRating}:{},display_current_rating,display_voltage_rating,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(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(globalTransformRotation),insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),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_component3.pcb_component_id}doInitialPcbPortAttachment(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i6=0;i6<pcb_ports.length;i6++){let port=pcb_ports[i6],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(h3=>/^(pin)?\d+$/.test(h3));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,{_parsedProps:props}=this,source_component=db2.source_component.insert({ftype:"interconnect",name:this.name,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,are_pins_interchangeable:!0,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(id3=>id3!==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)}_getPinCountFromFootprintString(footprint){let match2=footprint.match(/^solderjumper([23])(?:_|$)/);return match2?Number(match2[1]):null}_getPinNumberFromBridgedPinsProp(pinName){let numericPinMatch=pinName.match(/^(?:pin)?(\d+)$/i);if(numericPinMatch)return Number(numericPinMatch[1]);let pinLabels=this._parsedProps.pinLabels??this.props.pinLabels;if(Array.isArray(pinLabels)){let labelIndex=pinLabels.findIndex(label=>label===pinName);return labelIndex>=0?labelIndex+1:null}if(pinLabels&&typeof pinLabels=="object")for(let[pinKey,labelOrLabels]of Object.entries(pinLabels)){if(!(Array.isArray(labelOrLabels)?labelOrLabels:[labelOrLabels]).includes(pinName))continue;let pinNumberMatch=pinKey.match(/^(?:pin)?(\d+)$/i);return pinNumberMatch?Number(pinNumberMatch[1]):null}return null}_getBridgedPinNumbersForFootprint(pinCount){let props=this._parsedProps??this.props;return Array.isArray(props.bridgedPins)&&props.bridgedPins.length>0?Array.from(new Set(props.bridgedPins.flat().map(pinName=>this._getPinNumberFromBridgedPinsProp(pinName)).filter(pinNumber=>pinNumber!==null&&pinNumber>=1&&pinNumber<=pinCount))).sort((a6,b6)=>a6-b6):props.bridged?Array.from({length:pinCount},(_3,index)=>index+1):[]}resolveFootprint(){let footprint=super.resolveFootprint();if(typeof footprint!="string")return footprint;let pinCount=this._getPinCountFromFootprintString(footprint);if(!pinCount||/_bridged\d+/.test(footprint))return footprint;let bridgedPinNumbers=this._getBridgedPinNumbersForFootprint(pinCount);return bridgedPinNumbers.length===0?footprint:footprint.replace(/^solderjumper[23]/,`solderjumper${pinCount}_bridged${bridgedPinNumbers.join("")}`)}_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(p3=>p3.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((a6,b6)=>a6-b6):props.bridged&&resolvedPinCount&&(bridgedPinNumbers=Array.from({length:resolvedPinCount},(_3,i6)=>i6+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(),globalTransformRotation=this.getGlobalTransformRotation(),pcb_component3=db2.pcb_component.insert({center:{x:pcbX,y:pcbY},width:2,height:3,layer:props.layer??"top",rotation:normalizeDegrees(globalTransformRotation),insertion_direction:this._getPcbComponentInsertionDirection(props.layer??"top",globalTransformRotation),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_component3.pcb_component_id}doInitialPcbPortAttachment(){let{db:db2}=this.root,pcb_ports=db2.pcb_port.list({pcb_component_id:this.pcb_component_id}),pinLabelToPortId={};for(let i6=0;i6<pcb_ports.length;i6++){let port=pcb_ports[i6],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(h3=>/^(pin)?\d+$/.test(h3));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))}},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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},VoltageSource2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"simulation_voltage_source_id",null);__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:voltage3,frequency:frequency22}=this._parsedProps,parts=[];return voltage3!==void 0&&parts.push(`${formatSiUnit(voltage3)}V`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}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,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period,supplier_part_numbers:props.supplierPartNumbers,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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,simulationVoltageSource=db2.simulation_voltage_source.insert({is_dc_source:!1,terminal1_source_port_id:terminal1Port.source_port_id??void 0,terminal2_source_port_id:terminal2Port.source_port_id??void 0,voltage:props.voltage,frequency:props.frequency,peak_to_peak_voltage:props.peakToPeakVoltage,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,pulse_delay:props.pulseDelay,rise_time:props.riseTime,fall_time:props.fallTime,pulse_width:props.pulseWidth,period:props.period,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_voltage_source_id=simulationVoltageSource.simulation_voltage_source_id}},CurrentSource2=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"simulation_current_source_id",null);__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:current3,frequency:frequency22,peakToPeakCurrent}=this._parsedProps,parts=[];return current3!==void 0&&parts.push(`${formatSiUnit(current3)}A`),peakToPeakCurrent!==void 0&&parts.push(`${formatSiUnit(peakToPeakCurrent)}A p-p`),frequency22!==void 0&&parts.push(`${formatSiUnit(frequency22)}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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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||props.acMagnitude!==void 0||props.acPhase!==void 0,posPort=this.portMap.pos,negPort=this.portMap.neg;if(isAc){let simulationCurrentSource=db2.simulation_current_source.insert({is_dc_source:!1,terminal1_source_port_id:posPort.source_port_id??void 0,terminal2_source_port_id:negPort.source_port_id??void 0,current:props.current,frequency:props.frequency,peak_to_peak_current:props.peakToPeakCurrent,wave_shape:props.waveShape,phase:props.phase,duty_cycle:props.dutyCycle,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}else{if(props.current===void 0)return;let simulationCurrentSource=db2.simulation_current_source.insert({is_dc_source:!0,positive_source_port_id:posPort.source_port_id??void 0,negative_source_port_id:negPort.source_port_id??void 0,current:props.current,ac_magnitude:props.acMagnitude,ac_phase:props.acPhase});this.simulation_current_source_id=simulationCurrentSource.simulation_current_source_id}}},PLACEMENT_MARGIN=.25,rectForComponent=(component,margin)=>({left:component.center.x-component.size.width/2-margin,right:component.center.x+component.size.width/2+margin,bottom:component.center.y-component.size.height/2-margin,top:component.center.y+component.size.height/2+margin}),rectsOverlap5=(a6,b6)=>a6.left<b6.right&&a6.right>b6.left&&a6.bottom<b6.top&&a6.top>b6.bottom,getCandidateCenters=({baseCenter,size:size3})=>{let xStep=size3.width+PLACEMENT_MARGIN*2,yStep=size3.height+PLACEMENT_MARGIN*2;return[baseCenter,{x:baseCenter.x,y:baseCenter.y+yStep},{x:baseCenter.x,y:baseCenter.y-yStep},{x:baseCenter.x+xStep,y:baseCenter.y},{x:baseCenter.x-xStep,y:baseCenter.y},{x:baseCenter.x+xStep,y:baseCenter.y+yStep},{x:baseCenter.x-xStep,y:baseCenter.y+yStep},{x:baseCenter.x+xStep,y:baseCenter.y-yStep},{x:baseCenter.x-xStep,y:baseCenter.y-yStep},{x:baseCenter.x,y:baseCenter.y+yStep*2},{x:baseCenter.x,y:baseCenter.y-yStep*2}]},getConnectedSchematicPort=({ammeterSourcePortId,schematicPorts,sourceTraces})=>{for(let sourceTrace of sourceTraces){if(!sourceTrace.connected_source_port_ids.includes(ammeterSourcePortId))continue;let connectedSourcePortId=sourceTrace.connected_source_port_ids.find(sourcePortId=>sourcePortId!==ammeterSourcePortId);if(connectedSourcePortId===void 0)continue;let schematicPort=schematicPorts.find(port=>port.source_port_id===connectedSourcePortId);if(schematicPort)return schematicPort}return null},midpoint3=ports=>({x:ports.reduce((sum,port)=>sum+port.center.x,0)/ports.length,y:ports.reduce((sum,port)=>sum+port.center.y,0)/ports.length}),shiftAmmeterSchematicElements=({ammeter,db:db2,oldCenter,newCenter})=>{let schematicComponentId=ammeter.schematic_component_id;if(!schematicComponentId)return;let deltaX=newCenter.x-oldCenter.x,deltaY=newCenter.y-oldCenter.y;if(!(deltaX===0&&deltaY===0)){db2.schematic_component.update(schematicComponentId,{center:newCenter});for(let port of db2.schematic_port.list({schematic_component_id:schematicComponentId}))db2.schematic_port.update(port.schematic_port_id,{center:{x:port.center.x+deltaX,y:port.center.y+deltaY}});for(let text of db2.schematic_text.list({schematic_component_id:schematicComponentId}))db2.schematic_text.update(text.schematic_text_id,{position:{x:text.position.x+deltaX,y:text.position.y+deltaY}});updateSchematicPrimitivesForLayoutShift({db:db2,schematicComponentId,deltaX,deltaY})}},Ammeter_doInitialSchematicLayout=ammeter=>{let{root}=ammeter;if(!root||root.schematicDisabled||!ammeter.schematic_component_id||ammeter._parsedProps.schX!==void 0||ammeter._parsedProps.schY!==void 0||ammeter.getGroup()?._getSchematicLayoutMode()!=="relative")return;let{db:db2}=root,schematicComponent=db2.schematic_component.get(ammeter.schematic_component_id);if(!schematicComponent)return;let ammeterSourcePortIds=[ammeter.portMap.pos.source_port_id,ammeter.portMap.neg.source_port_id].filter(sourcePortId=>typeof sourcePortId=="string");if(ammeterSourcePortIds.length===0)return;let schematicPorts=db2.schematic_port.list(),sourceTraces=db2.source_trace.list(),connectedSchematicPorts=ammeterSourcePortIds.map(ammeterSourcePortId=>getConnectedSchematicPort({ammeterSourcePortId,schematicPorts,sourceTraces})).filter(port=>port!==null);if(connectedSchematicPorts.length===0)return;let baseCenter=midpoint3(connectedSchematicPorts),obstacles=db2.schematic_component.list().filter(component=>component.schematic_component_id!==schematicComponent.schematic_component_id&&!component.is_schematic_group&&component.schematic_sheet_id===schematicComponent.schematic_sheet_id).map(component=>rectForComponent(component,PLACEMENT_MARGIN)),bestCenter=getCandidateCenters({baseCenter,size:schematicComponent.size}).find(candidateCenter=>{let candidateRect=rectForComponent({...schematicComponent,center:candidateCenter},PLACEMENT_MARGIN);return!obstacles.some(obstacle=>rectsOverlap5(candidateRect,obstacle))})??baseCenter;shiftAmmeterSchematicElements({ammeter,db:db2,oldCenter:schematicComponent.center,newCenter:bestCenter})},Ammeter=class extends NormalComponent3{constructor(){super(...arguments);__publicField(this,"simulation_current_probe_id",null);__publicField(this,"pos",this.portMap.pos);__publicField(this,"neg",this.portMap.neg)}get config(){return{componentName:"Ammeter",schematicSymbolName:"dc_ammeter",zodProps:ammeterProps,sourceFtype:"simple_ammeter"}}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("Ammeter requires a footprint when pcbX/pcbY or pcb edge position props are used")}super.doInitialPcbComponentRender()}initPorts(){super.initPorts({ignoreSymbolPorts:!0,pinCount:2,additionalAliases:{pin1:["pos"],pin2:["neg"]}});let symbol=hc[this._getSchematicSymbolNameOrThrow()];this.portMap.pos.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("1"))??null,this.portMap.neg.schematicSymbolPortDef=symbol.ports.find(port=>port.labels.includes("2"))??null}doInitialSourceRender(){let{db:db2}=this.root,{supplierPartNumbers,displayName}=this._parsedProps,source_component=db2.source_component.insert({ftype:"simple_ammeter",name:this.name,supplier_part_numbers:supplierPartNumbers,manufacturer_part_number:this._parsedProps.manufacturerPartNumber??this._parsedProps.mfn,display_name:displayName});this.source_component_id=source_component.source_component_id}doInitialSimulationRender(){let{db:db2}=this.root,{color,graphDisplayName,graphCenter,graphVerticalOffset,graphCurrentPerDiv}=this._parsedProps,posPort=this.portMap.pos,negPort=this.portMap.neg,{simulation_current_probe_id}=db2.simulation_current_probe.insert({type:"simulation_current_probe",name:this.name,source_component_id:this.source_component_id,positive_source_port_id:posPort.source_port_id,negative_source_port_id:negPort.source_port_id,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,color});if(this.simulation_current_probe_id=simulation_current_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphCurrentPerDiv!==void 0){let graphCurrentPerDivValue=parseSimulationGraphValue(graphCurrentPerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db2.simulation_oscilloscope_trace.insert({simulation_current_probe_id,display_name:graphDisplayName,color,display_center_value:graphCenter,amps_per_div:graphCurrentPerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphCurrentPerDivValue!==void 0&&graphCurrentPerDivValue!==0?graphVerticalOffsetValue/graphCurrentPerDivValue:void 0})}}doInitialSchematicLayout(){Ammeter_doInitialSchematicLayout(this)}},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}}},AutoroutingPhase=class extends PrimitiveComponent2{get config(){return{componentName:"AutoroutingPhase",zodProps:autoroutingPhaseProps}}add(_component){throw new Error("<autoroutingphase> cannot contain children")}},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,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(input2);return target?target._getGlobalPcbPositionBeforeLayout():(this.renderError(`FabricationNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{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(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),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 transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);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,transform7){if(typeof input2=="string"){let target=this.getSubcircuit().selectOne(`.${input2}`);if(!target)return this.renderError(`PcbNoteDimension could not find selector "${input2}"`),applyToPoint2(transform7,{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(transform7,{x:numericX,y:numericY})}doInitialPcbPrimitiveRender(){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(props.from,transform7),to3=this._resolvePoint(props.to,transform7),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_dimension3=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,layer:props.layer==="bottom"?"bottom":"top",color:props.color,arrow_size:props.arrowSize??1});this.pcb_note_dimension_id=pcb_note_dimension3.pcb_note_dimension_id}doInitialPcbLayout(){let root=this.root;if(!root||root.pcbDisabled||!this.pcb_note_dimension_id)return;let{db:db2}=root,transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);db2.pcb_note_dimension.update(this.pcb_note_dimension_id,{from,to:to3})}getPcbSize(){let transform7=this._computePcbGlobalTransformBeforeLayout(),from=this._resolvePoint(this._parsedProps.from,transform7),to3=this._resolvePoint(this._parsedProps.to,transform7);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}})}},getBreakoutBoundaryIntersection=({from,to:to3,bounds})=>{if(from.x===to3.x&&from.y===to3.y)return null;let candidates=[[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY}],[{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY}],[{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}],[{x:bounds.minX,y:bounds.maxY},{x:bounds.minX,y:bounds.minY}]].map(([start,end])=>getSegmentIntersection(from,to3,start,end)).filter(point6=>point6!==null);return candidates.sort((a6,b6)=>distance2(from,a6)-distance2(from,b6)),candidates[0]??null},degreesToRadians=degrees2=>degrees2*Math.PI/180,rotatePoint6=(point6,radians2)=>{let cos6=Math.cos(radians2),sin6=Math.sin(radians2);return{x:point6.x*cos6-point6.y*sin6,y:point6.x*sin6+point6.y*cos6}},getLocalPadPoint=(point6,pad2)=>{let translatedPoint={x:point6.x-pad2.center.x,y:point6.y-pad2.center.y};return rotatePoint6(translatedPoint,-degreesToRadians(pad2.ccwRotationDegrees??0))},getInflatedPadRect=pad2=>{let clearance=pad2.clearance??0;return getBoundFromCenteredRect({center:{x:0,y:0},width:pad2.width+clearance*2,height:pad2.height+clearance*2})},isBreakoutPadIgnoredForSourcePort=({pad:pad2,sourcePortId})=>pad2.sourcePortIds?pad2.sourcePortIds.includes(sourcePortId):!1,isBreakoutPadIgnoredForLayer=({pad:pad2,layer})=>!pad2.layer||!layer?!1:pad2.layer!==layer,doesBreakoutSegmentIntersectPad=({from,to:to3,pad:pad2})=>doesSegmentIntersectRect(getLocalPadPoint(from,pad2),getLocalPadPoint(to3,pad2),getInflatedPadRect(pad2)),doesBreakoutSegmentIntersectNonIgnoredPads=({from,to:to3,pads,ignoredSourcePortIds,layer})=>{for(let pad2 of pads)if(!(ignoredSourcePortIds.some(sourcePortId=>isBreakoutPadIgnoredForSourcePort({pad:pad2,sourcePortId}))||isBreakoutPadIgnoredForLayer({pad:pad2,layer}))&&doesBreakoutSegmentIntersectPad({from,to:to3,pad:pad2}))return!0;return!1},doesBreakoutSegmentIntersectPads=({from,to:to3,pads,sourcePortId,layer})=>doesBreakoutSegmentIntersectNonIgnoredPads({from,to:to3,pads,ignoredSourcePortIds:[sourcePortId],layer}),BOUNDARY_POINT_DISTANCE_TOLERANCE=1e-6,isInsideRequiredSpacing=({candidate,usedPoint,boundaryPointSpacing})=>distance2(usedPoint,candidate)<boundaryPointSpacing-BOUNDARY_POINT_DISTANCE_TOLERANCE,getBoundsEdge=(point6,bounds)=>Math.abs(point6.x-bounds.minX)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"left":Math.abs(point6.x-bounds.maxX)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"right":Math.abs(point6.y-bounds.minY)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"bottom":Math.abs(point6.y-bounds.maxY)<BOUNDARY_POINT_DISTANCE_TOLERANCE?"top":null,getBoundsEdgeCandidates=({edge,bounds,step})=>{let candidates=[];if(edge==="left"||edge==="right"){let x6=edge==="left"?bounds.minX:bounds.maxX;for(let y2=bounds.minY;y2<=bounds.maxY+step/2;y2+=step)candidates.push({x:x6,y:Math.min(y2,bounds.maxY)})}else{let y2=edge==="bottom"?bounds.minY:bounds.maxY;for(let x6=bounds.minX;x6<=bounds.maxX+step/2;x6+=step)candidates.push({x:Math.min(x6,bounds.maxX),y:y2})}return candidates},getAllBoundsCandidates=({bounds,step})=>{let candidatesByCoordinate=new Map;for(let edge of["left","right","bottom","top"])for(let candidate of getBoundsEdgeCandidates({edge,bounds,step}))candidatesByCoordinate.set(`${candidate.x}:${candidate.y}`,candidate);return[...candidatesByCoordinate.values()]},getBoundaryCandidateSearchStep=({bounds,boundaryPointSpacing})=>boundaryPointSpacing>0?boundaryPointSpacing:Math.min(bounds.maxX-bounds.minX,bounds.maxY-bounds.minY)/40,hasBoundarySpacingConflict=({candidate,usedBoundaryPoints,boundaryPointSpacing})=>{for(let usedPoint of usedBoundaryPoints)if(isInsideRequiredSpacing({candidate,usedPoint,boundaryPointSpacing}))return!0;return!1},isBoundaryCandidateBlocked=({candidate,routeFrom,pads,sourcePortId,layer})=>!routeFrom||!pads||!sourcePortId?!1:doesBreakoutSegmentIntersectPads({from:routeFrom,to:candidate,pads,sourcePortId,layer}),isCandidateAvailable=({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})=>hasBoundarySpacingConflict({candidate,usedBoundaryPoints,boundaryPointSpacing})?!1:!isBoundaryCandidateBlocked({candidate,routeFrom,pads,sourcePortId,layer}),hasOutsideAccessConflict=({candidate,outsidePorts,pads,sourcePortId,layer})=>{if(!outsidePorts||!pads||!sourcePortId)return!1;for(let outsidePort of outsidePorts)if(doesBreakoutSegmentIntersectNonIgnoredPads({from:candidate,to:outsidePort.position,pads,ignoredSourcePortIds:[sourcePortId,outsidePort.sourcePortId],layer}))return!0;return!1},isCandidateAvailableForOutsidePorts=({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer})=>isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})?!hasOutsideAccessConflict({candidate,outsidePorts,pads,sourcePortId,layer}):!1,getAvailableBreakoutBoundaryPoint=({idealPoint,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer})=>{if(isCandidateAvailable({candidate:idealPoint,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return idealPoint;let edge=getBoundsEdge(idealPoint,bounds);if(!edge)return null;let step=getBoundaryCandidateSearchStep({bounds,boundaryPointSpacing});if(step<=0)return null;let edgeCandidates=getBoundsEdgeCandidates({edge,bounds,step});edgeCandidates.sort((a6,b6)=>distance2(a6,idealPoint)-distance2(b6,idealPoint));for(let candidate of edgeCandidates)if(isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return candidate;let candidates=getAllBoundsCandidates({bounds,step});candidates.sort((a6,b6)=>distance2(a6,idealPoint)-distance2(b6,idealPoint));for(let candidate of candidates)if(isCandidateAvailable({candidate,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,layer}))return candidate;return null},getAvailableBreakoutBoundaryPointForOutsidePorts=({idealPoints,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer})=>{let step=getBoundaryCandidateSearchStep({bounds,boundaryPointSpacing});if(step<=0)return null;for(let idealPoint of idealPoints){if(isCandidateAvailableForOutsidePorts({candidate:idealPoint,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return idealPoint;let edge=getBoundsEdge(idealPoint,bounds);if(!edge)continue;let edgeCandidates=getBoundsEdgeCandidates({edge,bounds,step});edgeCandidates.sort((a6,b6)=>distance2(a6,idealPoint)-distance2(b6,idealPoint));for(let candidate of edgeCandidates)if(isCandidateAvailableForOutsidePorts({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return candidate}for(let idealPoint of idealPoints){let candidates=getAllBoundsCandidates({bounds,step});candidates.sort((a6,b6)=>distance2(a6,idealPoint)-distance2(b6,idealPoint));for(let candidate of candidates)if(isCandidateAvailableForOutsidePorts({candidate,bounds,usedBoundaryPoints,boundaryPointSpacing,routeFrom,pads,sourcePortId,outsidePorts,layer}))return candidate}return null},getLayerVisualStyle=layer=>layer==="bottom"?{insidePadFill:"rgba(2, 132, 199, 0.28)",insidePadStroke:"#0369a1",insidePointColor:"#0369a1",outsidePadFill:"rgba(30, 64, 175, 0.2)",outsidePadStroke:"#1e40af",outsidePointColor:"#1e40af",padFill:"rgba(37, 99, 235, 0.18)",padStroke:"#1d4ed8",componentFill:"rgba(245, 158, 11, 0.1)",componentStroke:"#b45309",traceStroke:"#2563eb",breakoutPointColor:"#0f766e"}:{insidePadFill:"rgba(46, 125, 50, 0.28)",insidePadStroke:"#1b5e20",insidePointColor:"#1b5e20",outsidePadFill:"rgba(106, 27, 154, 0.2)",outsidePadStroke:"#6a1b9a",outsidePointColor:"#6a1b9a",padFill:"rgba(220, 38, 38, 0.22)",padStroke:"#b91c1c",componentFill:"rgba(245, 158, 11, 0.1)",componentStroke:"#b45309",traceStroke:"#7e8794",breakoutPointColor:"#0d47a1"},getPortPadRect=({port,fill,stroke,fallbackLabel})=>port.width===void 0||port.height===void 0?null:{center:port.position,width:port.width,height:port.height,ccwRotationDegrees:port.ccwRotationDegrees,fill,stroke,label:port.label??fallbackLabel},getAveragePortPosition=ports=>{if(ports.length===0)return null;let total=ports.reduce((sum,port)=>({x:sum.x+port.position.x,y:sum.y+port.position.y}),{x:0,y:0});return{x:total.x/ports.length,y:total.y/ports.length}},getOutsideTarget=trace=>getAveragePortPosition(trace.outsidePorts),getInsidePortKey=port=>`${port.sourcePortId}:${port.layer??"top"}`,getOutsidePortsForInsidePort=({traces,insidePort})=>{let outsidePorts=[],insidePortKey=getInsidePortKey(insidePort);for(let trace of traces)trace.insidePorts.some(port=>getInsidePortKey(port)===insidePortKey)&&outsidePorts.push(...trace.outsidePorts);return outsidePorts},getIdealBoundaryPoints=({insidePort,outsidePorts,bounds})=>{let idealBoundaryPoints=[];for(let outsidePort of outsidePorts){let idealBoundaryPoint=getBreakoutBoundaryIntersection({from:insidePort.position,to:outsidePort.position,bounds});idealBoundaryPoint&&idealBoundaryPoints.push(idealBoundaryPoint)}return idealBoundaryPoints},BreakoutPointSolver=class extends BaseSolver{constructor(input2){super();__publicField(this,"input");__publicField(this,"output",{breakoutPoints:[]});this.input=input2}_step(){let breakoutPoints=[],boundaryPointsByInsidePort=new Map;for(let trace of this.input.traces)for(let insidePort of trace.insidePorts){let insidePortKey=getInsidePortKey(insidePort),boundaryPoint=boundaryPointsByInsidePort.get(insidePortKey)??null;if(!boundaryPoint){let outsidePorts=getOutsidePortsForInsidePort({traces:this.input.traces,insidePort}),idealBoundaryPoints=getIdealBoundaryPoints({insidePort,outsidePorts,bounds:this.input.bounds});if(idealBoundaryPoints.length===0)continue;let usedBoundaryPoints=[...this.input.usedBoundaryPoints??[],...boundaryPointsByInsidePort.values()];if(outsidePorts.length>1&&(boundaryPoint=getAvailableBreakoutBoundaryPointForOutsidePorts({idealPoints:idealBoundaryPoints,bounds:this.input.bounds,usedBoundaryPoints,boundaryPointSpacing:this.input.boundaryPointSpacing??0,routeFrom:insidePort.position,pads:this.input.pads,sourcePortId:insidePort.sourcePortId,outsidePorts,layer:insidePort.layer})),boundaryPoint??(boundaryPoint=getAvailableBreakoutBoundaryPoint({idealPoint:idealBoundaryPoints[0],bounds:this.input.bounds,usedBoundaryPoints,boundaryPointSpacing:this.input.boundaryPointSpacing??0,routeFrom:insidePort.position,pads:this.input.pads,sourcePortId:insidePort.sourcePortId,layer:insidePort.layer})),!boundaryPoint)continue;boundaryPointsByInsidePort.set(insidePortKey,boundaryPoint)}breakoutPoints.push({sourcePortId:insidePort.sourcePortId,sourceTraceId:trace.sourceTraceId,x:boundaryPoint.x,y:boundaryPoint.y,...insidePort.layer?{layer:insidePort.layer}:{}})}this.output={breakoutPoints},this.solved=!0}getConstructorParams(){return[this.input]}getOutput(){return this.output}visualize(){let{bounds}=this.input,width=bounds.maxX-bounds.minX,height=bounds.maxY-bounds.minY;return{title:"BreakoutPointSolver - generated breakout points",rects:[{center:{x:bounds.minX+width/2,y:bounds.minY+height/2},width,height,fill:"rgba(210, 225, 255, 0.25)",stroke:"#315fba",label:"breakout bounds"},...(this.input.components??[]).map(component=>({center:component.center,width:component.width,height:component.height,ccwRotationDegrees:component.ccwRotationDegrees,fill:getLayerVisualStyle(component.layer).componentFill,stroke:getLayerVisualStyle(component.layer).componentStroke,label:component.label??"component"})),...(this.input.pads??[]).map(pad2=>({center:pad2.center,width:pad2.width+(pad2.clearance??0)*2,height:pad2.height+(pad2.clearance??0)*2,ccwRotationDegrees:pad2.ccwRotationDegrees,fill:getLayerVisualStyle(pad2.layer).padFill,stroke:getLayerVisualStyle(pad2.layer).padStroke,label:pad2.label??"pad"})),...this.input.traces.flatMap(trace=>trace.insidePorts.flatMap(port=>{let rect=getPortPadRect({port,fill:getLayerVisualStyle(port.layer).insidePadFill,stroke:getLayerVisualStyle(port.layer).insidePadStroke,fallbackLabel:`inside pad ${port.sourcePortId}`});return rect?[rect]:[]})),...this.input.traces.flatMap(trace=>trace.outsidePorts.flatMap(port=>{let rect=getPortPadRect({port,fill:getLayerVisualStyle(port.layer).outsidePadFill,stroke:getLayerVisualStyle(port.layer).outsidePadStroke,fallbackLabel:`outside pad ${port.sourcePortId}`});return rect?[rect]:[]}))],lines:this.input.traces.flatMap(trace=>trace.insidePorts.flatMap(insidePort=>{let outsideTarget=getOutsideTarget(trace);if(!outsideTarget)return[];let breakoutPoint=this.output.breakoutPoints.find(point6=>point6.sourceTraceId===trace.sourceTraceId&&point6.sourcePortId===insidePort.sourcePortId);return breakoutPoint?[{points:[insidePort.position,{x:breakoutPoint.x,y:breakoutPoint.y}],strokeColor:getLayerVisualStyle(insidePort.layer).traceStroke,label:`breakout segment ${trace.sourceTraceId}`},{points:[{x:breakoutPoint.x,y:breakoutPoint.y},outsideTarget],strokeColor:getLayerVisualStyle(insidePort.layer).traceStroke,strokeDash:"0.15 0.15",label:`target guide ${trace.sourceTraceId}`}]:[]})),points:[...this.input.traces.flatMap(trace=>trace.insidePorts.map(port=>({...port.position,color:getLayerVisualStyle(port.layer).insidePointColor,label:`inside pad ${port.sourcePortId}`}))),...this.input.traces.flatMap(trace=>trace.outsidePorts.map(port=>({...port.position,color:getLayerVisualStyle(port.layer).outsidePointColor,label:`outside target ${port.sourcePortId}`}))),...this.output.breakoutPoints.map(point6=>({x:point6.x,y:point6.y,color:getLayerVisualStyle(point6.layer).breakoutPointColor,label:`selected breakout ${point6.sourcePortId}`})),...(this.input.usedBoundaryPoints??[]).map(point6=>({...point6,color:"#ef6c00",label:"pre-existing breakout point"}))]}}},AutoplacedBreakoutPoint=class extends BaseBreakoutPoint{get config(){return{componentName:"AutoplacedBreakoutPoint",zodProps:baseBreakoutPointProps}}doInitialPcbPrimitiveRender(){this._renderPcbBreakoutPoint()}},getPortLabel=(db2,sourcePortId)=>{if(!sourcePortId)return;let sourcePort=db2.source_port.get(sourcePortId),sourceComponent=sourcePort?.source_component_id?db2.source_component.get(sourcePort.source_component_id):void 0;if(sourcePort)return sourceComponent?.name?`${sourceComponent.name}.${sourcePort.name}`:sourcePort.name},getPadElement=(db2,pcbPortId)=>db2.pcb_smtpad.getWhere({pcb_port_id:pcbPortId})??db2.pcb_plated_hole.getWhere({pcb_port_id:pcbPortId}),toBreakoutPort=(db2,pcbPort)=>{let pad2=getPadElement(db2,pcbPort.pcb_port_id),padBounds=pad2?findBoundsAndCenter([pad2]):null;return{sourcePortId:pcbPort.source_port_id,position:{x:pcbPort.x,y:pcbPort.y},...padBounds?{width:padBounds.width,height:padBounds.height}:{},layer:pcbPort.layers?.[0]??"top",label:getPortLabel(db2,pcbPort.source_port_id)}},createBreakoutPointSolverInput=breakout=>{if(!breakout.root||!breakout.pcb_group_id)return null;let{db:db2}=breakout.root,pcbGroup=db2.pcb_group.get(breakout.pcb_group_id);if(!pcbGroup||!pcbGroup.width||!pcbGroup.height)return null;let sourcePortIdToPcbPort=new Map;for(let pcbPort of db2.pcb_port.list())pcbPort.source_port_id&&sourcePortIdToPcbPort.set(pcbPort.source_port_id,pcbPort);let boundsMinX=pcbGroup.center.x-pcbGroup.width/2,boundsMaxX=pcbGroup.center.x+pcbGroup.width/2,boundsMinY=pcbGroup.center.y-pcbGroup.height/2,boundsMaxY=pcbGroup.center.y+pcbGroup.height/2,board=db2.pcb_board.list()[0],traceWidth=board?.min_trace_width??.15,traceToPadEdgeClearance=board?.min_trace_to_pad_edge_clearance??.1,boundaryPointClearance=board?.min_trace_to_pad_edge_clearance??.2,viaPadDiameter=board?.min_via_pad_diameter??.3,padEscapeClearance=traceWidth/2+traceToPadEdgeClearance,traces=[];for(let sourceTrace of db2.source_trace.list()){let pcbPorts=sourceTrace.connected_source_port_ids.map(sourcePortId=>sourcePortIdToPcbPort.get(sourcePortId)).filter(port=>!!port),insidePorts=pcbPorts.filter(port=>port.pcb_group_id===breakout.pcb_group_id),outsidePorts=pcbPorts.filter(port=>port.pcb_group_id!==breakout.pcb_group_id&&!(port.x>=boundsMinX&&port.x<=boundsMaxX&&port.y>=boundsMinY&&port.y<=boundsMaxY));insidePorts.length===0||outsidePorts.length===0||traces.push({sourceTraceId:sourceTrace.source_trace_id,insidePorts:insidePorts.map(port=>toBreakoutPort(db2,port)),outsidePorts:outsidePorts.map(port=>toBreakoutPort(db2,port))})}if(traces.length===0)return null;let allPadElements=[...db2.pcb_smtpad.list(),...db2.pcb_plated_hole.list()],pads=[];for(let pad2 of allPadElements){let padBounds=findBoundsAndCenter([pad2]);if(!padBounds.width||!padBounds.height)continue;let pcbPort=pad2.pcb_port_id?db2.pcb_port.get(pad2.pcb_port_id):null;pads.push({center:padBounds.center,width:padBounds.width,height:padBounds.height,...pcbPort?.pcb_group_id===breakout.pcb_group_id?{clearance:padEscapeClearance}:{},layer:pad2.layer??"top",sourcePortIds:pcbPort?.source_port_id?[pcbPort.source_port_id]:[],label:getPortLabel(db2,pcbPort?.source_port_id)})}let components=db2.pcb_component.list().filter(component=>component.width&&component.height).map(component=>({center:component.center,width:component.width,height:component.height,ccwRotationDegrees:component.rotation,layer:component.layer,label:component.pcb_component_id})),usedBoundaryPoints=db2.pcb_breakout_point.list().filter(point6=>point6.pcb_group_id===breakout.pcb_group_id).map(point6=>({x:point6.x,y:point6.y})),boundaryPointSpacing=viaPadDiameter+2*(traceWidth+boundaryPointClearance);return{bounds:{minX:boundsMinX,maxX:boundsMaxX,minY:boundsMinY,maxY:boundsMaxY},boundaryPointSpacing,traces,pads,components,usedBoundaryPoints}},Breakout=class extends Group5{get isRoutingDirective(){return!0}get config(){return{...super.config,zodProps:breakoutProps}}doInitialCreateAutoplacedBreakoutPoints(){let portsInBreakout=this.selectAll("port"),breakoutPortSet=new Set(portsInBreakout),manualBreakoutPoints=this.children.filter(c3=>c3 instanceof BreakoutPoint),manuallyMappedPorts=new Set(manualBreakoutPoints.map(bp3=>(bp3._matchConnection(),bp3.matchedPort)).filter(Boolean)),allTraces=this.getSubcircuit().selectAll("trace"),autoPlacedPorts=new Set;for(let trace of allTraces){let result=trace._findConnectedPorts();if(!(!result.allPortsFound||!result.ports))for(let port of result.ports){let isInside=breakoutPortSet.has(port),hasOutsidePort=result.ports.some(p3=>!breakoutPortSet.has(p3));if(!isInside||!hasOutsidePort||manuallyMappedPorts.has(port)||autoPlacedPorts.has(port))continue;autoPlacedPorts.add(port);let breakoutPoint=new AutoplacedBreakoutPoint({});breakoutPoint.matchedPort=port,breakoutPoint.matchedSourceTraceId=trace.source_trace_id,this.add(breakoutPoint)}}}doInitialPcbAutoplaceBreakoutPoints(){if(this.root?.pcbDisabled)return;let solverInput=createBreakoutPointSolverInput(this);if(!solverInput)return;let solver=new BreakoutPointSolver(solverInput);solver.solve();let output=solver.getOutput(),autoBreakoutPoints=this.children.filter(c3=>c3 instanceof AutoplacedBreakoutPoint),BOUNDARY_INSET_MM=1e-4,{bounds}=solverInput,insetWithinBounds=(x6,y2)=>({x:Math.max(bounds.minX+BOUNDARY_INSET_MM,Math.min(bounds.maxX-BOUNDARY_INSET_MM,x6)),y:Math.max(bounds.minY+BOUNDARY_INSET_MM,Math.min(bounds.maxY-BOUNDARY_INSET_MM,y2))});for(let solvedPoint of output.breakoutPoints){let matchingBreakoutPoint=autoBreakoutPoints.find(child=>child.matchedPort?.source_port_id===solvedPoint.sourcePortId);if(matchingBreakoutPoint){matchingBreakoutPoint.matchedSourceTraceId=solvedPoint.sourceTraceId;let insetPoint=insetWithinBounds(solvedPoint.x,solvedPoint.y);matchingBreakoutPoint._setPositionFromLayout({x:insetPoint.x,y:insetPoint.y})}}}doInitialPcbPrimitiveRender(){super.doInitialPcbPrimitiveRender()}},SilkscreenGraphic=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"pcb_silkscreen_graphic_id",null);__publicField(this,"pcb_silkscreen_graphic_ids",[]);__publicField(this,"pcb_silkscreen_path_ids",[]);__publicField(this,"isPcbPrimitive",!0)}get config(){return{componentName:"SilkscreenGraphic",zodProps:silkscreenGraphicProps}}doInitialPcbPrimitiveRender(){this.root?.pcbDisabled||this._queueAsyncEffect("SilkscreenGraphicRender",async()=>{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 SilkscreenGraphic. Must be "top" or "bottom".`);let sourceImage=await loadImageSource(props.imageUrl);if(sourceImage.mimetype!==SVG_MIMETYPE&&sourceImage.mimetype!==PNG_MIMETYPE)throw new Error(`Unsupported imageUrl for SilkscreenGraphic: "${props.imageUrl}". Expected an SVG or PNG image.`);let imageAsset={project_relative_path:sourceImage.projectRelativePath,url:sourceImage.dataUrl,mimetype:sourceImage.mimetype},brepShapes=sourceImage.mimetype===SVG_MIMETYPE?getSvgBRepShapes({svg:sourceImage.text,width:props.width,height:props.height,transform:this._computePcbGlobalTransformBeforeLayout()}):[this.getPlacementBoxBRepShape()],pcbComponentId=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let brepShape of brepShapes){let graphic=db2.insert({type:"pcb_silkscreen_graphic",pcb_component_id:pcbComponentId,pcb_group_id:this.getGroup()?.pcb_group_id??void 0,subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,layer,shape:"brep",brep_shape:brepShape,image_asset:imageAsset});this.pcb_silkscreen_graphic_ids.push(graphic.pcb_silkscreen_graphic_id)}this.pcb_silkscreen_graphic_id=this.pcb_silkscreen_graphic_ids[0]??null,sourceImage.mimetype===SVG_MIMETYPE&&this.insertRenderableSilkscreenPaths(sourceImage.text,layer)})}insertRenderableSilkscreenPaths(svg,layer){let{db:db2}=this.root,{_parsedProps:props}=this,transform7=this._computePcbGlobalTransformBeforeLayout(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id??"";for(let route of getTransformedSvgPathRoutes({svg,width:props.width,height:props.height,transform:transform7})){if(route.length<2)continue;let path=db2.pcb_silkscreen_path.insert({pcb_component_id,layer,route,stroke_width:Math.max(Math.min(props.width,props.height)/60,.05),subcircuit_id:this.getSubcircuit()?.subcircuit_id??void 0,pcb_group_id:this.getGroup()?.pcb_group_id??void 0});this.pcb_silkscreen_path_ids.push(path.pcb_silkscreen_path_id)}}getPcbSize(){let{_parsedProps:props}=this;return{width:props.width,height:props.height}}getPlacementBoxBRepShape(){let{_parsedProps:props}=this,halfWidth=props.width/2,halfHeight=props.height/2,transform7=this._computePcbGlobalTransformBeforeLayout();return{outer_ring:{vertices:ensureClockwise([{x:-halfWidth,y:halfHeight},{x:halfWidth,y:halfHeight},{x:halfWidth,y:-halfHeight},{x:-halfWidth,y:-halfHeight}]).map(point6=>applyToPoint2(transform7,point6))},inner_rings:[]}}_moveCircuitJsonElements({deltaX,deltaY}){if(this.root?.pcbDisabled)return;let{db:db2}=this.root,moveVertex=vertex=>({...vertex,x:vertex.x+deltaX,y:vertex.y+deltaY});for(let graphicId of this.pcb_silkscreen_graphic_ids){let graphic=db2.pcb_silkscreen_graphic.get(graphicId);graphic&&db2.pcb_silkscreen_graphic.update(graphicId,{brep_shape:{outer_ring:{vertices:graphic.brep_shape.outer_ring.vertices.map(moveVertex)},inner_rings:graphic.brep_shape.inner_rings.map(ring3=>({vertices:ring3.vertices.map(moveVertex)}))}})}for(let pathId of this.pcb_silkscreen_path_ids){let path=db2.pcb_silkscreen_path.get(pathId);path&&db2.pcb_silkscreen_path.update(pathId,{route:path.route.map(point6=>({...point6,x:point6.x+deltaX,y:point6.y+deltaY}))})}}},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,position4=this._getGlobalPcbPositionBeforeLayout(),{maybeFlipLayer}=this._getPcbPrimitiveFlippedHelpers(),pcb_component_id=this.parent?.pcb_component_id??this.getPrimitiveContainer()?.pcb_component_id,pcb_smtpad3=db2.pcb_smtpad.insert({pcb_component_id,layer:maybeFlipLayer(props.layer||"top"),shape:"circle",x:position4.x,y:position4.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_smtpad3.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(p3=>({x:p3.x+deltaX,y:p3.y+deltaY}))}))}},EPSILON7=1e-9,isWireRoutePoint=routePoint=>routePoint.route_type==="wire",isPointOnSegment5=(p3,a6,b6)=>{let cross32=(p3.y-a6.y)*(b6.x-a6.x)-(p3.x-a6.x)*(b6.y-a6.y);if(Math.abs(cross32)>EPSILON7)return!1;let dot3=(p3.x-a6.x)*(b6.x-a6.x)+(p3.y-a6.y)*(b6.y-a6.y);if(dot3<-EPSILON7)return!1;let squaredLength=(b6.x-a6.x)**2+(b6.y-a6.y)**2;return!(dot3-squaredLength>EPSILON7)},isPointInRing=(point6,ring3)=>{if(ring3.length<3)return!1;let inside2=!1,previous=ring3[ring3.length-1];for(let current3 of ring3){if(isPointOnSegment5(point6,previous,current3))return!0;current3.y>point6.y!=previous.y>point6.y&&point6.x<(previous.x-current3.x)*(point6.y-current3.y)/(previous.y-current3.y)+current3.x&&(inside2=!inside2),previous=current3}return inside2},isPointInRectPour=(p3,pour)=>{let{center:center2,width,height}=pour,rotationRad=(pour.rotation??0)*Math.PI/180,cosR=Math.cos(-rotationRad),sinR=Math.sin(-rotationRad),dx3=p3.x-center2.x,dy3=p3.y-center2.y,localX=dx3*cosR-dy3*sinR,localY=dx3*sinR+dy3*cosR;return Math.abs(localX)<=width/2+EPSILON7&&Math.abs(localY)<=height/2+EPSILON7},isPointInBrepPour=(p3,pour)=>{let outerRing=pour.brep_shape.outer_ring.vertices.map(v6=>({x:v6.x,y:v6.y}));if(!isPointInRing(p3,outerRing))return!1;for(let innerRing of pour.brep_shape.inner_rings){let points=innerRing.vertices.map(v6=>({x:v6.x,y:v6.y}));if(isPointInRing(p3,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)<=EPSILON7?!1:[0,.25,.5,.75,1].every(t53=>isPointInCopperPour({x:start.x+dx3*t53,y:start.y+dy3*t53},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 i6=0;i6<nextRoute.length-1;i6++){let fromRoutePoint=nextRoute[i6],toRoutePoint=nextRoute[i6+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})}},pendingCopperPourRenders=new WeakMap,DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM=.3,renderAllCopperPoursForSubcircuit=async subcircuit=>{if(!subcircuit.root)return;let{db:db2}=subcircuit.root,copperPours=subcircuit.selectAll("copperpour").filter(copperPour=>copperPour.getSubcircuit()===subcircuit),resolvedCopperPours=[];for(let copperPour of copperPours){let{_parsedProps:props}=copperPour,sourceNetId=subcircuit.selectOne(props.connectsTo)?.source_net_id;if(!sourceNetId){copperPour.renderError(`Net "${props.connectsTo}" not found for copper pour`);continue}resolvedCopperPours.push({copperPour,sourceNetId})}if(resolvedCopperPours.length===0)return;let circuitJson=db2.toArray(),pcbBoard=circuitJson.find(element=>element.type==="pcb_board"),resolvedPcbBoardOutline=pcbBoard?.outline?.length?pcbBoard.outline:void 0;if(!resolvedPcbBoardOutline&&pcbBoard?.width!==void 0&&pcbBoard.height!==void 0){let{center:center2,width,height}=pcbBoard;resolvedPcbBoardOutline=[{x:center2.x-width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y-height/2},{x:center2.x+width/2,y:center2.y+height/2},{x:center2.x-width/2,y:center2.y+height/2}]}let inputProblem=convertCircuitJsonToInputProblem(circuitJson,resolvedCopperPours.map(({copperPour,sourceNetId})=>{let{_parsedProps:props}=copperPour,clearance=props.clearance??.2;return{layer:props.layer,subcircuit_id:subcircuit.subcircuit_id??void 0,source_net_id:sourceNetId,pad_margin:props.padMargin??clearance,trace_margin:props.traceMargin??clearance,pour_margin:clearance,board_edge_margin:props.boardEdgeMargin??clearance,cutout_margin:props.cutoutMargin??clearance,...props.useThermalReliefs?{use_thermal_reliefs:!0,thermal_relief_spoke_width:DEFAULT_THERMAL_RELIEF_SPOKE_WIDTH_MM}:{},outline:props.outline??resolvedPcbBoardOutline}}));await initializeManifoldGeometry();let solver=new CopperPourPipelineSolver(inputProblem);subcircuit.root.emit("solver:started",{type:"solver:started",solverName:"CopperPourPipelineSolver",solverParams:inputProblem,solverConstructorArgs:[inputProblem],componentName:subcircuit.getString()});let{brep_shapes_by_region}=solver.getOutput();for(let[regionIndex,{copperPour,sourceNetId}]of resolvedCopperPours.entries()){let{_parsedProps:props}=copperPour,coveredWithSolderMask=props.coveredWithSolderMask??!1;for(let brepShape of brep_shapes_by_region[regionIndex]??[]){let insertedPour=db2.pcb_copper_pour.insert({shape:"brep",layer:props.layer,brep_shape:brepShape,source_net_id:sourceNetId,subcircuit_id:subcircuit.subcircuit_id??void 0,covered_with_solder_mask:coveredWithSolderMask});markTraceSegmentsInsideCopperPour({db:db2,copperPour:insertedPour})}}};function CopperPour_doInitialPcbCopperPourRender(copperPour){copperPour.root?.pcbDisabled||copperPour._queueAsyncEffect("PcbCopperPourRender",async()=>{let subcircuit=copperPour.getSubcircuit(),pendingRender=pendingCopperPourRenders.get(subcircuit);if(pendingRender){await pendingRender;return}let renderPromise=renderAllCopperPoursForSubcircuit(subcircuit);pendingCopperPourRenders.set(subcircuit,renderPromise);try{await renderPromise}finally{pendingCopperPourRenders.delete(subcircuit)}})}var 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(){CopperPour_doInitialPcbCopperPourRender(this)}},AssemblyDevice=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isAssemblyDeviceContainer",!0)}get config(){return{componentName:"AssemblyDevice",zodProps:assemblyDeviceProps}}doInitialAssignNameToUnnamedComponents(){}computeSchematicGlobalTransform(){return identity()}_computePcbGlobalTransformBeforeLayout(){return identity()}},getModelReachAboveOrigin=({cad,authoredModel})=>{let bounds=cad.model_bounds??authoredModel?.modelBounds,origin=cad.model_origin_position??authoredModel?.modelOriginPosition;if(!bounds?.min||!bounds?.max||!origin)return;let normal=cad.model_board_normal_direction??authoredModel?.modelBoardNormalDirection??"z+",axis=normal[0];if(axis!=="x"&&axis!=="y"&&axis!=="z")return;let min=bounds.min[axis],max2=bounds.max[axis],at3=origin[axis];if(min===void 0||max2===void 0||at3===void 0)return;let reach=normal.endsWith("-")?at3-min:max2-at3;return Number.isFinite(reach)&&reach>=0?reach:void 0},getComponentBody=({owner,pcbComponent,cadComponent,boardSurfaceZ})=>{let cadModelProp2=owner?._parsedProps?.cadModel,authoredModel=cadModelProp2&&typeof cadModelProp2=="object"?cadModelProp2:void 0,size3=cadComponent?.size??authoredModel?.size,x6=size3?.x,y2=size3?.y,z18=size3?.z,reach=cadComponent?getModelReachAboveOrigin({cad:cadComponent,authoredModel}):void 0,originZ=cadComponent?.position?.z,aboveBoardHeight=reach!==void 0&&originZ!==void 0?reach+Math.abs(originZ-boardSurfaceZ):void 0;return{size:x6!==void 0&&y2!==void 0?{x:x6,y:y2,z:z18}:void 0,aboveBoardHeight,rotation:cadComponent?.rotation?.z??pcbComponent.rotation??0,footprint:{width:pcbComponent.width,height:pcbComponent.height}}},getNearestBoardWall=({point:point6,board})=>{let halfWidth=(board.width??0)/2,halfHeight=(board.height??0)/2,distances=[["x_neg",Math.abs(point6.x-(board.center.x-halfWidth))],["x_pos",Math.abs(point6.x-(board.center.x+halfWidth))],["y_neg",Math.abs(point6.y-(board.center.y-halfHeight))],["y_pos",Math.abs(point6.y-(board.center.y+halfHeight))]];return distances.sort((a6,b6)=>a6[1]-b6[1]),distances[0][0]},getSolverWall=boardWall=>boardWall,INSERTION_DIRECTION_TO_BOARD_WALL={from_top:"y_pos",from_bottom:"y_neg",from_left:"x_neg",from_right:"x_pos"},getFdmEnclosureSolverInput=(apertureComponent,{board,pcbBoard})=>{let owner=apertureComponent.parent;for(;owner&&owner!==board&&!owner.pcb_component_id;)owner=owner.parent;let pcbComponent=owner?.pcb_component_id?apertureComponent.root?.db.pcb_component.get(owner.pcb_component_id):null;if(!pcbComponent)throw new Error("<enclosure.cutoutaperture /> must be nested inside a component with a PCB footprint");let aperture=apertureComponent._parsedProps,apertureAxisDirection=owner?._getEnclosureApertureAxisDirection?.(pcbComponent.layer,pcbComponent.rotation??0),apertureDirection=apertureAxisDirection?apertureAxisDirection.z!==0?apertureAxisDirection.z>0?"from_above":"from_below":Math.abs(apertureAxisDirection.x)>=Math.abs(apertureAxisDirection.y)?apertureAxisDirection.x>=0?"from_right":"from_left":apertureAxisDirection.y>=0?"from_top":"from_bottom":pcbComponent.insertion_direction,verticalFace=apertureDirection==="from_above"?"z_pos":apertureDirection==="from_below"?"z_neg":void 0,boardSide=pcbComponent.layer==="bottom"?"bottom":"top",face,center2;if(verticalFace)face=verticalFace,center2={x:pcbComponent.center.x-pcbBoard.center.x,y:pcbComponent.center.y-pcbBoard.center.y};else{let point6=pcbComponent.cable_insertion_center??pcbComponent.center,boardWall=INSERTION_DIRECTION_TO_BOARD_WALL[apertureDirection]??getNearestBoardWall({point:point6,board:pcbBoard}),cableDelta=pcbComponent.cable_insertion_center?{x:pcbComponent.cable_insertion_center.x-pcbComponent.center.x,y:pcbComponent.cable_insertion_center.y-pcbComponent.center.y}:null,cableProjectionMatchesWall=cableDelta!=null&&(boardWall==="x_neg"||boardWall==="x_pos"?Math.abs(cableDelta.x)>=Math.abs(cableDelta.y):Math.abs(cableDelta.y)>=Math.abs(cableDelta.x)),tangentPoint=apertureAxisDirection?pcbComponent.center:cableProjectionMatchesWall?point6:pcbComponent.center;face=getSolverWall(boardWall),center2={x:tangentPoint.x-pcbBoard.center.x,y:tangentPoint.y-pcbBoard.center.y}}let cadComponent=apertureComponent.root?.db.cad_component.getWhere({pcb_component_id:pcbComponent.pcb_component_id})??null,boardSurfaceZ=(boardSide==="bottom"?-1:1)*((pcbBoard.thickness??board.boardThickness)/2),componentBody=getComponentBody({owner,pcbComponent,cadComponent,boardSurfaceZ}),commonInput={face,center:center2,boardSide,apertureAxisDirection,rotation:pcbComponent.rotation??void 0,depth:aperture.depth,componentBody,widthDimensionOffset:aperture.widthDimensionOffset,heightDimensionOffset:aperture.heightDimensionOffset,margin:aperture.margin};switch(aperture.shape){case"pill":case"rect":return{...commonInput,shape:aperture.shape,width:aperture.width,height:aperture.height};case"circle":return{...commonInput,shape:"circle",radius:aperture.radius}}},EnclosureCutoutAperture=class extends PrimitiveComponent2{get config(){return{componentName:"EnclosureCutoutAperture",zodProps:enclosureCutoutApertureProps}}getFdmEnclosureSolverInput(params){return getFdmEnclosureSolverInput(this,params)}},getReferencedEnclosureBoard=(component,boardRef)=>{let rootComponent=component.root?.firstChild,selectedComponent=rootComponent?selectOne(boardRef,rootComponent,{adapter:cssSelectPrimitiveComponentAdapter}):null,board=selectedComponent instanceof Board?selectedComponent:[rootComponent,...rootComponent?.getDescendants()??[]].find(descendant=>descendant instanceof Board&&descendant.isMatchingNameOrAlias(boardRef));if(!(board instanceof Board))throw new Error(`Could not find a <board /> matching enclosure boardRef "${boardRef}"`);return board},EnclosureFdmBox_doInitialCadModelRender=component=>{let root=component.root;if(!root||root.pcbDisabled||!component.source_component_id||!component.pcb_component_id)return;let{db:db2}=root,props=component._parsedProps,board=getReferencedEnclosureBoard(component,props.boardRef),pcbBoard=board.pcb_board_id?db2.pcb_board.get(board.pcb_board_id):null;if(!pcbBoard?.width||!pcbBoard.height)throw new Error(`Could not resolve dimensions for boardRef "${props.boardRef}"`);let boardThickness=pcbBoard.thickness??board.boardThickness,inputProblem={board:{width:pcbBoard.width,height:pcbBoard.height,thickness:boardThickness},width:props.width,height:props.height,depth:props.depth,wallThickness:props.wallThickness,floorThickness:props.floorThickness,lidThickness:props.lidThickness,boardClearance:props.boardClearance,standoffHeight:props.standoffHeight,topHeadroom:props.topHeadroom,lidLipDepth:props.lidLipDepth,apertures:props.disableCutouts?[]:board.getDescendants().filter(descendant=>descendant instanceof EnclosureCutoutAperture).map(aperture=>aperture.getFdmEnclosureSolverInput({board,pcbBoard}))},solver=new CreateFdmEnclosureSolver(inputProblem),solverConstructorArgs=solver.getConstructorParams();if(root.emit("solver:started",{type:"solver:started",solverName:"CreateFdmEnclosureSolver",solverParams:solverConstructorArgs[0],solverConstructorArgs,componentName:component.getString()}),solver.solve(),solver.failed)throw new Error(solver.error??"Failed to create FDM enclosure");let output=solver.getOutput();db2.pcb_component.update(component.pcb_component_id,{center:pcbBoard.center,width:output.dimensions.width,height:output.dimensions.height});let position4={x:pcbBoard.center.x,y:pcbBoard.center.y,z:-boardThickness/2-output.dimensions.floorThickness-output.dimensions.standoffHeight},cadComponents=output.parts.map(part=>db2.cad_component.insert({position:position4,rotation:{x:0,y:0,z:0},pcb_component_id:component.pcb_component_id,source_component_id:component.source_component_id,model_jscad:part.jscadPlan,model_unit_to_mm_scale_factor:1,model_object_fit:"contain_within_bounds",model_origin_alignment:"bottom_center_of_component",anchor_alignment:"center",show_as_translucent_model:!1,show_hidden_edges:props.showHiddenEdges}));component.cad_component_id=cadComponents[0]?.cad_component_id??null},EnclosureFdmBox=class _EnclosureFdmBox extends PrimitiveComponent2{get config(){return{componentName:"EnclosureFdmBox",zodProps:enclosureFdmBoxProps}}doInitialAssignNameToUnnamedComponents(){if(this._parsedProps.name)return;let top=this;for(;top.parent instanceof PrimitiveComponent2;)top=top.parent;let index=[top,...top.getDescendants()].filter(component=>component instanceof _EnclosureFdmBox).indexOf(this);this.fallbackUnassignedName=`unnamed_enclosure_fdm_box_${index===-1?0:index+1}`}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name});this.source_component_id=sourceComponent.source_component_id}doInitialPcbComponentRender(){let root=this.root;if(!root||root.pcbDisabled||!this.source_component_id)return;let board=getReferencedEnclosureBoard(this,this._parsedProps.boardRef),center2=(board.pcb_board_id?root.db.pcb_board.get(board.pcb_board_id):null)?.center??board._getGlobalPcbPositionBeforeLayout(),pcbComponent=root.db.pcb_component.insert({center:center2,width:0,height:0,layer:"top",rotation:0,source_component_id:this.source_component_id,obstructs_within_bounds:!1,do_not_place:!0,is_allowed_to_be_off_board:!0});this.pcb_component_id=pcbComponent.pcb_component_id}doInitialCadModelRender(){EnclosureFdmBox_doInitialCadModelRender(this)}},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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,are_pins_interchangeable:!1,display_name:props.displayName});this.source_component_id=source_component.source_component_id}},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,gender=this._parsedProps.gender;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"),gender==="female"&&(footprintString+="_female"),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 i6=1;i6<=pinCount;i6++){let rawLabel=Array.isArray(this._parsedProps.pinLabels)?this._parsedProps.pinLabels[i6-1]:this._parsedProps.pinLabels?.[`pin${i6}`];if(rawLabel){let primaryLabel=Array.isArray(rawLabel)?rawLabel[0]:rawLabel,otherLabels=Array.isArray(rawLabel)?rawLabel.slice(1):[];this.add(new Port({pinNumber:i6,name:primaryLabel,aliases:[`pin${i6}`,...otherLabels]}))}else this.add(new Port({pinNumber:i6,name:`pin${i6}`}))}}_getSchematicPortArrangement(){let pinCount=this._parsedProps.pinCount??1,facingDirection=this._parsedProps.schFacingDirection??this._parsedProps.facingDirection??"right",schPinArrangement=this._parsedProps.schPinArrangement,pins=Array.from({length:pinCount},(_3,i6)=>`pin${i6+1}`);return facingDirection==="left"?{leftSide:{direction:schPinArrangement?.leftSide?.direction??"top-to-bottom",pins:schPinArrangement?.leftSide?.pins??pins}}:facingDirection==="up"?{topSide:{direction:schPinArrangement?.topSide?.direction??"left-to-right",pins:schPinArrangement?.topSide?.pins??pins}}:facingDirection==="down"?{bottomSide:{direction:schPinArrangement?.bottomSide?.direction??"left-to-right",pins:schPinArrangement?.bottomSide?.pins??pins}}:{rightSide:{direction:schPinArrangement?.rightSide?.direction??"top-to-bottom",pins:schPinArrangement?.rightSide?.pins??pins}}}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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}},DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM=10,DEFAULT_CRYSTAL_MAX_VIA_COUNT=0,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","X1"],pin2:["top1","2","gnd1"],pin3:["right1","3","X2"],pin4:["bottom1","4","gnd2"]}:{pin1:["pos","left","X1"],pin2:["neg","right","X2"]};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",manufacturer_part_number:props.manufacturerPartNumber??props.mfn,supplier_part_numbers:props.supplierPartNumbers,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}doInitialSourceDesignRuleChecks(){if(super.doInitialSourceDesignRuleChecks(),!this.source_component_id)return;let{db:db2}=this.root,maximumTraceLength=this._parsedProps.maxTraceLength??DEFAULT_CRYSTAL_MAX_TRACE_LENGTH_MM,crystalSignalSourcePortIds=new Set,crystalSignalConnectivityMapKeys=new Set;for(let signalPort of[this.portMap.X1,this.portMap.X2]){if(!signalPort.source_port_id)continue;let sourcePort=db2.source_port.get(signalPort.source_port_id);sourcePort&&(crystalSignalSourcePortIds.add(signalPort.source_port_id),sourcePort.subcircuit_connectivity_map_key&&crystalSignalConnectivityMapKeys.add(sourcePort.subcircuit_connectivity_map_key))}for(let sourceTrace of db2.source_trace.list()){let isDirectlyConnectedToCrystal=sourceTrace.connected_source_port_ids.some(sourcePortId=>crystalSignalSourcePortIds.has(sourcePortId)),isOnCrystalNet=sourceTrace.subcircuit_connectivity_map_key!==void 0&&crystalSignalConnectivityMapKeys.has(sourceTrace.subcircuit_connectivity_map_key);if(!isDirectlyConnectedToCrystal&&!isOnCrystalNet)continue;let needsMaximumTraceLength=typeof sourceTrace.max_length!="number"||sourceTrace.max_length>maximumTraceLength,needsMaximumViaCount=sourceTrace.max_via_count!==DEFAULT_CRYSTAL_MAX_VIA_COUNT;!needsMaximumTraceLength&&!needsMaximumViaCount||db2.source_trace.update(sourceTrace.source_trace_id,{...needsMaximumTraceLength?{max_length:maximumTraceLength}:{},...needsMaximumViaCount?{max_via_count:DEFAULT_CRYSTAL_MAX_VIA_COUNT}:{}})}}},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)}getSchematicSymbolName(){return this.props.symbolName?this.props.symbolName:this.props.connections?.positive_supply||this.props.connections?.negative_supply?"opamp_with_power":"opamp_no_power"}get config(){return{componentName:"OpAmp",schematicSymbolName:this.getSchematicSymbolName(),zodProps:opampProps,sourceFtype:"simple_op_amp"}}initPorts(){let additionalAliases={pin1:["non_inverting_input"],pin2:["inverting_input"]};this.getSchematicSymbolName()==="opamp_with_power"?Object.assign(additionalAliases,{pin4:["output"],pin5:["positive_supply","vcc","vdd"],pin3:["negative_supply","vee","vss","gnd"]}):Object.assign(additionalAliases,{pin3:["output"],pin4:["positive_supply","vcc","vdd"],pin5:["negative_supply","vee","vss","gnd"]}),super.initPorts({pinCount:5,additionalAliases})}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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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})}},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,manufacturer_part_number:props.manufacturerPartNumber??props.mfn,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}},SchematicSymbol_doInitialSchematicComponentRender=schematicSymbol=>{if(schematicSymbol.root?.schematicDisabled||schematicSymbol.getCollapsedSchematicBoxAncestor())return;let{db:db2}=schematicSymbol.root,symbolName=schematicSymbol._getSchematicSymbolNameOrThrow(),symbol=hc[symbolName];if(!symbol)throw new Error(`No schematic symbol found for "${symbolName}"`);let center2=schematicSymbol._getGlobalSchematicPositionBeforeLayout(),schematicSheetId=schematicSymbol._resolveSchematicSheetId(),subcircuitId=schematicSymbol.getSubcircuit().subcircuit_id??void 0,schematicComponent=db2.schematic_component.insert({center:center2,size:{...symbol.size},is_box_with_pins:!0,symbol_name:symbolName,source_component_id:schematicSymbol.source_component_id??void 0,schematic_sheet_id:schematicSheetId});schematicSymbol.schematic_component_id=schematicComponent.schematic_component_id;for(let symbolPort of symbol.ports){let port=schematicSymbol.getPortForSymbolPort(symbolPort);if(!port?.source_port_id)throw new Error(`Missing source port for schematic symbol port "${symbolPort.labels.join("/")}" on ${schematicSymbol.getString()}`);let portCenter={x:center2.x+symbolPort.x-symbol.center.x,y:center2.y+symbolPort.y-symbol.center.y},schematicPort=db2.schematic_port.insert({schematic_component_id:schematicComponent.schematic_component_id,center:portCenter,source_port_id:port.source_port_id,facing_direction:getRelativeDirection(center2,portCenter),distance_from_component_edge:.4,pin_number:port._parsedProps.pinNumber,display_pin_label:port._parsedProps.aliases?.[0],is_connected:!1,schematic_sheet_id:schematicSheetId,subcircuit_id:subcircuitId});port.schematic_port_id=schematicPort.schematic_port_id}},getSingleConnectionTarget=(connectionName,target)=>{let targets=Array.isArray(target)?target:[target];if(targets.length!==1)throw new Error(`SchematicSymbol connection "${connectionName}" must select exactly one physical port`);return targets[0]},SchematicSymbol_doInitialPortMatching=schematicSymbol=>{let{db:db2}=schematicSymbol.root,{chipRef,connections}=schematicSymbol._parsedProps;if(chipRef&&!connections){db2.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"chipRef",message:`${schematicSymbol.getString()} has chipRef "${chipRef}" without connections. chipRef will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(connections&&!chipRef){db2.source_property_ignored_warning.insert({source_component_id:schematicSymbol.source_component_id,property_name:"connections",message:`${schematicSymbol.getString()} has connections without chipRef. connections will be ignored.`,error_type:"source_property_ignored_warning",subcircuit_id:schematicSymbol.getSubcircuit().subcircuit_id??void 0});return}if(!chipRef||!connections)return;let referencedChip=schematicSymbol.getSubcircuit().selectOne(chipRef);if(!referencedChip?.source_component_id)throw new Error(`Could not resolve chipRef "${chipRef}" for ${schematicSymbol.getString()}`);let usedConnectionNames=new Set;for(let schematicPort of schematicSymbol.ports){let symbolPort=schematicPort.schematicSymbolPortDef,matchingConnections=Object.entries(connections).filter(([connectionName2])=>schematicPort.isMatchingAnyOf([connectionName2]));if(matchingConnections.length===0)throw new Error(`${schematicSymbol.getString()} is missing an explicit connection for symbol port "${symbolPort.labels.join("/")}"`);if(matchingConnections.length>1)throw new Error(`${schematicSymbol.getString()} has multiple connections for symbol port "${symbolPort.labels.join("/")}"`);let[connectionName,connectionTarget4]=matchingConnections[0];usedConnectionNames.add(connectionName);let targetSelector=getSingleConnectionTarget(connectionName,connectionTarget4),physicalPort=schematicSymbol.getSubcircuit().selectOne(targetSelector,{type:"port"});if(!physicalPort?.source_port_id)throw new Error(`Could not resolve connection "${connectionName}" target "${targetSelector}" for ${schematicSymbol.getString()}`);if(db2.source_port.get(physicalPort.source_port_id)?.source_component_id!==referencedChip.source_component_id)throw new Error(`Connection "${connectionName}" target "${targetSelector}" does not belong to chipRef "${chipRef}"`);schematicPort.source_port_id=physicalPort.source_port_id,schematicPort.source_component_id=physicalPort.source_component_id}let unusedConnectionNames=Object.keys(connections).filter(connectionName=>!usedConnectionNames.has(connectionName));if(unusedConnectionNames.length>0)throw new Error(`${schematicSymbol.getString()} has connections that do not match symbol ports: ${unusedConnectionNames.join(", ")}`)},SchematicSymbol=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0);__publicField(this,"isPrimitiveContainer",!0)}get config(){return{componentName:"SchematicSymbol",schematicSymbolName:this.props.symbolName,zodProps:schematicSymbolProps}}initPorts(){let symbol=hc[this._getSchematicSymbolNameOrThrow()],shouldCreateSourcePort=!(this._parsedProps.chipRef&&this._parsedProps.connections);for(let symbolPort of symbol.ports){let pinNumber=getPinNumberFromLabels(symbolPort.labels);if(!pinNumber)throw new Error(`Schematic symbol port must have a numeric pin label: ${symbolPort.labels.join("/")}`);let existingPort=this.ports.find(port2=>port2._parsedProps.pinNumber===pinNumber);if(existingPort){existingPort.schematicSymbolPortDef=symbolPort;continue}let aliases2=symbolPort.labels.filter(label=>label!==pinNumber.toString()&&label!==`pin${pinNumber}`),port=new Port({pinNumber,aliases:aliases2},{shouldCreateSourcePort});port.schematicSymbolPortDef=symbolPort,this.add(port)}}doInitialInitializePortsFromChildren(){this.initPorts()}updateInitializePortsFromChildren(){this.initPorts()}get ports(){return this.children.filter(child=>child instanceof Port)}getPortForSymbolPort(symbolPort){return this.ports.find(port=>port.schematicSymbolPortDef===symbolPort)??null}doInitialSourceRender(){let sourceComponent=this.root.db.source_component.insert({ftype:"simple_chip",name:this.name,display_name:this._parsedProps.displayName,are_pins_interchangeable:!1});this.source_component_id=sourceComponent.source_component_id}doInitialPortMatching(){SchematicSymbol_doInitialPortMatching(this)}doInitialSchematicComponentRender(){SchematicSymbol_doInitialSchematicComponentRender(this)}},SchematicSection=class _SchematicSection extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSection",zodProps:schematicSectionProps}}_computeSectionBounds(board,sectionName,schematicSheetId){let{db:db2}=this.root,members=board.getDescendants().filter(c3=>c3.getSchematicSectionName()===sectionName);if(members.length===0)return null;let positions=[];for(let member of members){let schematicComponentId=member.schematic_component_id;if(!schematicComponentId)continue;let schComp=db2.schematic_component.get(schematicComponentId);if(!schComp||schComp.schematic_sheet_id!==schematicSheetId)continue;let hw2=schComp.size.width/2,hh3=schComp.size.height/2;positions.push({minX:schComp.center.x-hw2,maxX:schComp.center.x+hw2,minY:schComp.center.y-hh3,maxY:schComp.center.y+hh3})}return positions.length===0?null:computeBoundsFromCellContents(positions)}doInitialSchematicSectionRender(){if(this.root?.schematicDisabled)return;let board=this.root?._getBoard();if(!board)return;let schematicSheetId=this._resolveSchematicSheetId(),allSections=board.getDescendants().filter(component=>component instanceof _SchematicSection&&component._resolveSchematicSheetId()===schematicSheetId);if(allSections[0]!==this)return;let{db:db2}=this.root,PADDING=.5,LABEL_PADDING=.2,STROKE_WIDTH=.02,TOL42=.001,namedSectionsWithBounds=allSections.map(section=>{let bounds=section._computeSectionBounds(board,section._parsedProps.name,schematicSheetId);return bounds?{displayName:section._parsedProps.displayName,sectionTitleFontSize:section._parsedProps.sectionTitleFontSize,rawBounds:bounds,cell:{minX:bounds.minX-PADDING,maxX:bounds.maxX+PADDING,minY:bounds.minY-PADDING,maxY:bounds.maxY+PADDING}}:null}).filter(s6=>s6!==null),unsectionedBounds=this._computeSectionBounds(board,null,schematicSheetId),allSectionsWithBounds=[...namedSectionsWithBounds];if(unsectionedBounds&&allSectionsWithBounds.push({displayName:void 0,sectionTitleFontSize:void 0,rawBounds:unsectionedBounds,cell:{minX:unsectionedBounds.minX-PADDING,maxX:unsectionedBounds.maxX+PADDING,minY:unsectionedBounds.minY-PADDING,maxY:unsectionedBounds.maxY+PADDING}}),allSectionsWithBounds.length===0)return;let allCells=allSectionsWithBounds.map(s6=>s6.cell),outer=computeBoundsFromCellContents(allCells),CELL_MARGIN=1,dividers=calculateCellBoundaries2(allSectionsWithBounds.map(s6=>({minX:s6.rawBounds.minX-CELL_MARGIN,maxX:s6.rawBounds.maxX+CELL_MARGIN,minY:s6.rawBounds.minY-CELL_MARGIN,maxY:s6.rawBounds.maxY+CELL_MARGIN})));for(let line2 of dividers)db2.schematic_line.insert({x1:line2.start.x,y1:line2.start.y,x2:line2.end.x,y2:line2.end.y,stroke_width:STROKE_WIDTH,color:"#000000",is_dashed:!0,schematic_sheet_id:schematicSheetId});let hDividers=dividers.filter(l6=>Math.abs(l6.start.y-l6.end.y)<TOL42),vDividers=dividers.filter(l6=>Math.abs(l6.start.x-l6.end.x)<TOL42);for(let{displayName,sectionTitleFontSize,rawBounds}of allSectionsWithBounds){if(!displayName)continue;let dividersAbove=hDividers.map(l6=>l6.start.y).filter(y2=>y2>rawBounds.maxY),topBoundary=dividersAbove.length>0?Math.min(...dividersAbove):outer.maxY,dividersToLeft=vDividers.map(l6=>l6.start.x).filter(x6=>x6<rawBounds.minX),leftBoundary=dividersToLeft.length>0?Math.max(...dividersToLeft):outer.minX;db2.schematic_text.insert({anchor:"top_left",text:displayName,font_size:sectionTitleFontSize??.18,color:"#000000",position:{x:leftBoundary+LABEL_PADDING,y:topBoundary-LABEL_PADDING},rotation:0,schematic_sheet_id:schematicSheetId})}}},SCHEMATIC_UNIT_TO_MM2=10.16/1.1,DEFAULT_SCHEMATIC_SHEET_WIDTH2=297/SCHEMATIC_UNIT_TO_MM2,DEFAULT_SCHEMATIC_SHEET_HEIGHT2=210/SCHEMATIC_UNIT_TO_MM2,SCHEMATIC_SHEET_INNER_MARGIN2=5/SCHEMATIC_UNIT_TO_MM2,BOUNDS_EPSILON=1e-6,getSchematicElementId=schematicElement=>{switch(schematicElement.type){case"schematic_component":return schematicElement.schematic_component_id;case"schematic_net_label":return schematicElement.schematic_net_label_id;case"schematic_trace":return schematicElement.schematic_trace_id}},insertSchematicElementOutsideSheetWarnings=({db:db2,schematicSheetId,schematicSheetName,schematicSheetCenter})=>{let sheetContentBounds={minX:schematicSheetCenter.x-DEFAULT_SCHEMATIC_SHEET_WIDTH2/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxX:schematicSheetCenter.x+DEFAULT_SCHEMATIC_SHEET_WIDTH2/2-SCHEMATIC_SHEET_INNER_MARGIN2,minY:schematicSheetCenter.y-DEFAULT_SCHEMATIC_SHEET_HEIGHT2/2+SCHEMATIC_SHEET_INNER_MARGIN2,maxY:schematicSheetCenter.y+DEFAULT_SCHEMATIC_SHEET_HEIGHT2/2-SCHEMATIC_SHEET_INNER_MARGIN2},checkedElements=[...db2.schematic_component.list(),...db2.schematic_net_label.list(),...db2.schematic_trace.list()].filter(schematicElement=>schematicElement.schematic_sheet_id===schematicSheetId);for(let schematicElement of checkedElements){let elementBounds=getSchematicElementBounds(schematicElement);if(!elementBounds||!(elementBounds.minX<sheetContentBounds.minX-BOUNDS_EPSILON||elementBounds.maxX>sheetContentBounds.maxX+BOUNDS_EPSILON||elementBounds.minY<sheetContentBounds.minY-BOUNDS_EPSILON||elementBounds.maxY>sheetContentBounds.maxY+BOUNDS_EPSILON))continue;let schematicElementId=getSchematicElementId(schematicElement);db2.schematic_element_outside_sheet_warning.insert({warning_type:"schematic_element_outside_sheet_warning",message:`${schematicElement.type} ${schematicElementId} extends outside the drawing area of schematic sheet "${schematicSheetName}"`,schematic_sheet_id:schematicSheetId,schematic_element_type:schematicElement.type,schematic_element_id:schematicElementId})}},SchematicSheet=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"isSchematicPrimitive",!0)}get config(){return{componentName:"SchematicSheet",zodProps:schematicSheetProps}}doInitialSourceGroupRender(){if(this.root?.schematicDisabled)return;let{db:db2}=this.root,{_parsedProps:props}=this,schematicSheet=db2.schematic_sheet.insert({name:props.name,display_name:props.displayName,sheet_index:props.sheetIndex,subcircuit_id:this.getSubcircuit().subcircuit_id??void 0});this.schematic_sheet_id=schematicSheet.schematic_sheet_id}doInitialSchematicSheetRender(){if(this.root?.schematicDisabled||!this.schematic_sheet_id)return;let{db:db2}=this.root,schematicElements=[...db2.schematic_component.list(),...db2.schematic_port.list(),...db2.schematic_text.list(),...db2.schematic_line.list(),...db2.schematic_rect.list(),...db2.schematic_circle.list(),...db2.schematic_arc.list(),...db2.schematic_path.list()].filter(element=>element.schematic_sheet_id===this.schematic_sheet_id),schematicSheetCenter={x:0,y:0};if(schematicElements.length>0){let bounds=getBoundsForSchematic(schematicElements);Number.isFinite(bounds.minX)&&Number.isFinite(bounds.maxX)&&Number.isFinite(bounds.minY)&&Number.isFinite(bounds.maxY)&&(schematicSheetCenter={x:(bounds.minX+bounds.maxX)/2,y:(bounds.minY+bounds.maxY)/2},db2.schematic_sheet.update(this.schematic_sheet_id,{center:schematicSheetCenter}))}insertSchematicElementOutsideSheetWarnings({db:db2,schematicSheetId:this.schematic_sheet_id,schematicSheetName:this._parsedProps.displayName,schematicSheetCenter})}},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||this.getCollapsedSchematicBoxAncestor())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 i6=0;i6<rows.length;i6++)grid4[i6]=[];for(let i6=0;i6<rows.length;i6++){let cells=rows[i6].children.filter(c3=>c3.componentName==="SchematicCell"),k7=0;for(let j6=0;j6<cells.length;j6++){for(;grid4[i6][k7];)k7++;let cell=cells[j6],colSpan=cell._parsedProps.colSpan??1,rowSpan=cell._parsedProps.rowSpan??1;for(let r6=0;r6<rowSpan;r6++)for(let c3=0;c3<colSpan;c3++)grid4[i6+r6]||(grid4[i6+r6]=[]),grid4[i6+r6][k7+c3]=cell;k7+=colSpan}}maxCols=Math.max(0,...grid4.map(r6=>r6.length));let rowHeights=rows.map((row,i6)=>row._parsedProps.height??1),colWidths=Array.from({length:maxCols},(_3,j6)=>{let maxWidth=0;for(let i6=0;i6<rows.length;i6++){let cell=grid4[i6]?.[j6];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||"",schematic_sheet_id:this._resolveSchematicSheetId()});this.schematic_table_id=table.schematic_table_id;let processedCells=new Set,yOffset=0;for(let i6=0;i6<rows.length;i6++){let xOffset=0;for(let j6=0;j6<maxCols;j6++){let cell=grid4[i6]?.[j6];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[j6+c3];let cellHeight=0;for(let r6=0;r6<rowSpan;r6++)cellHeight+=rowHeights[i6+r6];db2.schematic_table_cell.insert({schematic_table_id:this.schematic_table_id,start_row_index:i6,end_row_index:i6+rowSpan-1,start_column_index:j6,end_column_index:j6+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[j6]&&(xOffset+=colWidths[j6])}yOffset+=rowHeights[i6]}}},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}}},AnalogSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}get config(){return{componentName:"AnalogSimulation",zodProps:analogSimulationProps}}getSpiceEngineName(){return this._parsedProps.spiceEngine}usesIndependentGraphAxes(){return this._parsedProps.graphIndependentAxes===!0}doInitialSimulationRender(){let{db:db2}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions2}=this._parsedProps,durationMs=duration||10,timePerStepMs=timePerStep||.01,simulationExperiment=db2.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:durationMs,start_time_ms:startTime,time_per_step:timePerStepMs,spice_options:spiceOptions2});this.simulation_experiment_id=simulationExperiment.simulation_experiment_id}},AnalogAnalysisSimulation=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_experiment_id",null)}getSpiceEngineName(){return typeof this.props.spiceEngine=="string"?this.props.spiceEngine:void 0}usesIndependentGraphAxes(){return this.props.graphIndependentAxes===!0}getOrCreateSimulationExperiment(){if(this.simulation_experiment_id)return this.root?.db.simulation_experiment.get(this.simulation_experiment_id)??null;if(this.children.filter(child=>child.componentName==="AnalogSweepParameter").length>1)return this.renderError("An analog simulation can contain at most one sweep parameter."),null;let simulationExperiment=this.insertSimulationExperiment();return this.simulation_experiment_id=simulationExperiment?.simulation_experiment_id??null,simulationExperiment}doInitialSimulationRender(){this.getOrCreateSimulationExperiment()}},AnalogTransientSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogTransientSimulation",zodProps:analogTransientSimulationProps}}insertSimulationExperiment(){let{db:db2}=this.root,{duration,name,startTime,timePerStep,spiceOptions:spiceOptions2}=this._parsedProps;return db2.simulation_experiment.insert({name:name??"spice_transient_analysis",experiment_type:"spice_transient_analysis",end_time_ms:duration,start_time_ms:startTime,time_per_step:timePerStep,spice_options:spiceOptions2})}},AnalogDcOperatingPointSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcOperatingPointSimulation",zodProps:analogDcOperatingPointSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_operating_point",experiment_type:"spice_dc_operating_point",spice_options:spiceOptions2})}},AnalogDcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogDcSweepSimulation",zodProps:analogDcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2,sweepSource,sweepStart,sweepStop,sweepStep}=this._parsedProps,sweepSourceComponent=(this.getGroup()??this.getSubcircuit())?.selectOne(sweepSource),dcSweepSourceFields;if(sweepSourceComponent instanceof VoltageSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationVoltageSourceId=sweepSourceComponent.simulation_voltage_source_id;if(!simulationVoltageSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_voltage_source_id:simulationVoltageSourceId,dc_sweep_unit:"V"}}else if(sweepSourceComponent instanceof CurrentSource2){sweepSourceComponent.runRenderPhase("SimulationRender");let simulationCurrentSourceId=sweepSourceComponent.simulation_current_source_id;if(!simulationCurrentSourceId)return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;dcSweepSourceFields={dc_sweep_current_source_id:simulationCurrentSourceId,dc_sweep_unit:"A"}}else return this.renderError(`DC sweep source "${sweepSource}" must resolve to one voltage or current source.`),null;return this.root.db.simulation_experiment.insert({name:name??"spice_dc_sweep",experiment_type:"spice_dc_sweep",spice_options:spiceOptions2,...dcSweepSourceFields,dc_sweep_start:sweepStart,dc_sweep_stop:sweepStop,dc_sweep_step:sweepStep})}},AnalogAcSweepSimulation=class extends AnalogAnalysisSimulation{get config(){return{componentName:"AnalogAcSweepSimulation",zodProps:analogAcSweepSimulationProps}}insertSimulationExperiment(){let{name,spiceOptions:spiceOptions2,sweepType,samplesPerInterval,sampleCount,startFrequency,stopFrequency}=this._parsedProps;return this.root.db.simulation_experiment.insert({name:name??"spice_ac_analysis",experiment_type:"spice_ac_analysis",spice_options:spiceOptions2,ac_sweep_type:sweepType,ac_samples_per_interval:samplesPerInterval,ac_sample_count:sampleCount,ac_start_frequency_hz:startFrequency,ac_stop_frequency_hz:stopFrequency})}},parameterUnits={resistance:"\u03A9",capacitance:"F",inductance:"H",voltage:"V",current:"A"},isParameterSweepCoordinateInRange=({parameterSweepCoordinate,stop,step})=>{let tolerance=Math.abs(step)*1e-9;return step>0?parameterSweepCoordinate<=stop+tolerance:parameterSweepCoordinate>=stop-tolerance},getGeneratedParameterSweepCoordinates=({start,stop,step})=>{let parameterSweepCoordinates=[];for(let parameterSweepCoordinate=start;isParameterSweepCoordinateInRange({parameterSweepCoordinate,stop,step});parameterSweepCoordinate=start+parameterSweepCoordinates.length*step)if(parameterSweepCoordinates.push(parameterSweepCoordinate),parameterSweepCoordinates.length>1e6)throw new Error("Parameter sweep exceeds 1,000,000 points");return parameterSweepCoordinates},getParameterSweepTargetSelector=props=>props.parameterType==="resistance"?props.resistorRef:props.parameterType==="capacitance"?props.capacitorRef:props.parameterType==="inductance"?props.inductorRef:props.parameterType==="voltage"?props.net:props.currentSourceRef,AnalogSweepParameter_doInitialSimulationRender=analogSweepParameter=>{if(!(analogSweepParameter.parent instanceof AnalogAnalysisSimulation)){analogSweepParameter.renderError("analog.sweepparameter must be nested directly in an analog simulation.");return}let simulationExperiment=analogSweepParameter.parent.getOrCreateSimulationExperiment();if(!simulationExperiment)return;let props=analogSweepParameter._parsedProps,parameterSweepCoordinates=props.values??getGeneratedParameterSweepCoordinates({start:props.start,stop:props.stop,step:props.step}),simulationScope=analogSweepParameter.parent.getGroup()??analogSweepParameter.parent.getSubcircuit(),targetSelector=getParameterSweepTargetSelector(props),parameterUnit=parameterUnits[props.parameterType],simulationParameterSweepTable=analogSweepParameter.root.db.simulation_parameter_sweep,simulationParameterSweepFields={simulation_experiment_id:simulationExperiment.simulation_experiment_id,name:props.name,parameter_type:props.parameterType,parameter_values:parameterSweepCoordinates,parameter_unit:parameterUnit},simulationParameterSweepId;if(props.parameterType==="voltage"){let sweepNet=simulationScope?.selectOne(targetSelector,{type:"net"});if(!sweepNet?.source_net_id){analogSweepParameter.renderError(`Voltage sweep net "${targetSelector}" could not be resolved.`);return}simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"voltage",source_net_id:sweepNet.source_net_id}).simulation_parameter_sweep_id}else{let sourceComponentId=simulationScope?.selectOne(targetSelector)?.source_component_id;if(!sourceComponentId){analogSweepParameter.renderError(`Parameter sweep target "${targetSelector}" could not be resolved.`);return}props.parameterType==="resistance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"resistance",resistor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="capacitance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"capacitance",capacitor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:props.parameterType==="inductance"?simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"inductance",inductor_source_component_id:sourceComponentId}).simulation_parameter_sweep_id:simulationParameterSweepId=simulationParameterSweepTable.insert({...simulationParameterSweepFields,parameter_type:"current",current_source_component_id:sourceComponentId}).simulation_parameter_sweep_id}analogSweepParameter.simulation_parameter_sweep_id=simulationParameterSweepId},AnalogSweepParameter=class extends PrimitiveComponent2{constructor(){super(...arguments);__publicField(this,"simulation_parameter_sweep_id",null)}get config(){return{componentName:"AnalogSweepParameter",zodProps:analogSweepParameterProps}}doInitialSimulationRender(){AnalogSweepParameter_doInitialSimulationRender(this)}};function getLabelBounds2(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,w3,h3;if(elm.type==="schematic_component")cx3=elm.center?.x,cy3=elm.center?.y,w3=elm.size?.width,h3=elm.size?.height;else if(elm.type==="schematic_text")cx3=elm.position?.x,cy3=elm.position?.y,w3=(elm.text?.length??0)*.1,h3=.2;else return null;return typeof cx3=="number"&&typeof cy3=="number"&&typeof w3=="number"&&typeof h3=="number"?{minX:cx3-w3/2,maxX:cx3+w3/2,minY:cy3-h3/2,maxY:cy3+h3/2}:null}function getOverlapArea(a6,b6){if(!doBoundsOverlap(a6,b6))return 0;let overlapWidth=Math.min(a6.maxX,b6.maxX)-Math.max(a6.minX,b6.minX),overlapHeight=Math.min(a6.maxY,b6.maxY)-Math.max(a6.minY,b6.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(a6=>a6!==defaultAlignment)],bestAlignment=defaultAlignment,minOverlapArea=1/0;for(let alignment of orderedAlignments){let labelBounds=getLabelBounds2(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,graphDisplayName,graphCenter,graphVerticalOffset,graphVoltagePerDiv}=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(s6=>s6.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});if(this.simulation_voltage_probe_id=simulation_voltage_probe_id,graphDisplayName!==void 0||graphCenter!==void 0||graphVerticalOffset!==void 0||graphVoltagePerDiv!==void 0){let graphVoltagePerDivValue=parseSimulationGraphValue(graphVoltagePerDiv),graphVerticalOffsetValue=parseSimulationGraphValue(graphVerticalOffset);db2.simulation_oscilloscope_trace.insert({simulation_voltage_probe_id,display_name:graphDisplayName,color:color??void 0,display_center_value:graphCenter,volts_per_div:graphVoltagePerDivValue,display_center_offset_divs:graphVerticalOffsetValue!==void 0&&graphVoltagePerDivValue!==void 0&&graphVoltagePerDivValue!==0?graphVerticalOffsetValue/graphVoltagePerDivValue:void 0})}}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 position4=port._getGlobalSchematicPositionAfterLayout(),targetTraceId=null;for(let trace of db2.schematic_trace.list()){for(let edge of trace.edges)if(Math.abs(edge.from.x-position4.x)<1e-6&&Math.abs(edge.from.y-position4.y)<1e-6||Math.abs(edge.to.x-position4.x)<1e-6&&Math.abs(edge.to.y-position4.y)<1e-6){targetTraceId=trace.schematic_trace_id;break}if(targetTraceId)break}if(!targetTraceId)return;let probeName=this.finalProbeName,labelAlignment=selectBestLabelAlignment({probePosition:position4,labelText:probeName,schematicElements:[...db2.schematic_component.list(),...db2.schematic_text.list()],defaultAlignment:"top_right"}),schematic_voltage_probe3=db2.schematic_voltage_probe.insert({name:probeName,position:position4,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_probe3.schematic_voltage_probe_id}},SpiceModel=class extends PrimitiveComponent2{get config(){return{componentName:"SpiceModel",zodProps:spicemodelProps}}doInitialSimulationRender(){let parent=this.parent;if(!parent)return;let parentSourceComponentId=parent.source_component_id;if(!parentSourceComponentId){this._insertSpiceModelError("spicemodel must be attached to a source component.",this._parsedProps);return}let{source,spicePinMapping}=this._parsedProps,subckt=parseSpiceNetlist(source).subckts[0]??null,spicePinNames=subckt?.pins.map(pin=>pin.name);if(!subckt||!spicePinNames||spicePinNames.length===0){this._insertSpiceModelError("spicemodel source must contain a .subckt declaration with a model name and pins.",source);return}let mapping=spicePinMapping??{};for(let spicePinName of Object.keys(mapping))if(!spicePinNames.includes(spicePinName)){this._insertSpiceModelError(`spicePinMapping references SPICE pin "${spicePinName}", but it is not present in .subckt ${subckt.name}.`,mapping);return}let spicePinToSourcePortMap={},seenSourcePortIds=new Set;for(let spicePinName of spicePinNames){let componentPinName=mapping[spicePinName]??spicePinName,matchingPorts=parent.selectAll("port").filter(port=>port instanceof Port&&port.isMatchingAnyOf([componentPinName]));if(matchingPorts.length!==1||!matchingPorts[0].source_port_id){this._insertSpiceModelError(`Could not resolve SPICE pin "${spicePinName}" to exactly one component port using "${componentPinName}".`,mapping);return}let sourcePortId=matchingPorts[0].source_port_id;if(seenSourcePortIds.has(sourcePortId)){this._insertSpiceModelError(`spicePinMapping maps more than one SPICE pin to component port "${componentPinName}".`,mapping);return}seenSourcePortIds.add(sourcePortId),spicePinToSourcePortMap[spicePinName]=sourcePortId}this.root.db.simulation_spice_subcircuit.insert({source_component_id:parentSourceComponentId,spice_pin_to_source_port_map:spicePinToSourcePortMap,subcircuit_source:source})}_insertSpiceModelError(message,propertyValue){this.root.db.source_invalid_component_property_error.insert({source_component_id:this.parent?.source_component_id||"",property_name:"spiceModel",property_value:propertyValue,message,error_type:"source_invalid_component_property_error"})}},createNamespacedElement=hostType=>{let Component2=props=>(0,import_react8.createElement)(hostType,props);return Component2.displayName=hostType,Component2},analog={transientsimulation:createNamespacedElement("analogtransientsimulation"),dcoperatingpointsimulation:createNamespacedElement("analogdcoperatingpointsimulation"),dcsweepsimulation:createNamespacedElement("analogdcsweepsimulation"),acsweepsimulation:createNamespacedElement("analogacsweepsimulation"),sweepparameter:createNamespacedElement("analogsweepparameter")},assembly={device:createNamespacedElement("assembly.device")},EnclosureFdmBoxElement=createNamespacedElement("enclosure.fdm.box"),enclosure={cutoutaperture:createNamespacedElement("enclosure.cutoutaperture"),fdm:{box:EnclosureFdmBoxElement,Box:EnclosureFdmBoxElement}},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_react9.default.useState(!0),[error2,setError]=import_react9.default.useState(null),[circuit,setCircuit]=import_react9.default.useState(),[circuitJson,setCircuitJson]=import_react9.default.useState();return import_react9.default.useEffect(()=>{setIsLoading(!0),setError(null),reactElements&&setTimeout(()=>{try{let circuit2=new RootCircuit;circuit2.add(reactElements),setCircuit(circuit2),setCircuitJson(circuit2.toJson())}catch(error22){setError(error22)}setIsLoading(!1)},1)},[reactElements]),{isLoading,error:error2,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 R3=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,i6)=>(0,import_jsx_runtime.jsx)("trace",{...trace},i6))]})};for(let port of pinLabelsFlatArray)R3[port]=`.${name} > .${port}`;return R3},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:(_3,pin)=>`.${refdes} > .${pin}`}),{get:(_3,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(p3=>prop1.startsWith(p3))?pinResult:new Proxy(new String(pinResult),{get:(_42,nestedProp)=>typeof nestedProp=="symbol"||nestedProp==="toString"?()=>pinResult:`.${prop1} > .${pinOrSubComponentName} > .${nestedProp}`})}})})}});extendCatalogue(components_exports);extendCatalogue({"assembly.device":AssemblyDevice,Bug:Chip,"enclosure.cutoutaperture":EnclosureCutoutAperture,"enclosure.fdm.box":EnclosureFdmBox,Fanout:Breakout,FanoutPoint:BreakoutPoint});var React3=__toESM(require_react(),1),ReactJsxRuntime=__toESM(require_jsx_runtime(),1);var dist_exports5={};__export(dist_exports5,{default:()=>mm_default2,mil2mm:()=>mil2mm,mm:()=>mm4,mmStr:()=>mmStr});var unitToMm2={in:25.4,inch:25.4,mil:.0254,mm:1,m:1e3,cm:10,ft:304.8,feet:304.8},mmNumberFormatter=new Intl.NumberFormat("en-US",{useGrouping:!1,notation:"standard",maximumFractionDigits:12}),mm4=n3=>{let unit=typeof n3=="number"?"mm":n3.replace(/^[^a-zA-Z]+/g,"").toLowerCase();unit||(unit="mm");let val=typeof n3=="number"?n3:Number.parseFloat(n3.split(unit)[0]);if(unit in unitToMm2)return val*unitToMm2[unit];throw new Error(`Unsupported unit: ${unit}`)},mmStr=n3=>`${mmNumberFormatter.format(mm4(n3))}mm`,mil2mm=mil=>typeof mil=="number"?mm4(`${mil}mil`):mil.match(/^\d+$/)?mm4(`${mil}mil`):mm4(mil),mm_default2=mm4;var __defProp5=Object.defineProperty,__export4=(target,all)=>{for(var name in all)__defProp5(target,name,{get:all[name],enumerable:!0})},dist_exports6={};__export4(dist_exports6,{all_layers:()=>all_layers2,any_circuit_element:()=>any_circuit_element2,any_soup_element:()=>any_soup_element2,any_source_component:()=>any_source_component2,asset:()=>asset2,base_circuit_json_error:()=>base_circuit_json_error2,battery_capacity:()=>battery_capacity2,brep_shape:()=>brep_shape2,cadModelDefaultDirectionMap:()=>cadModelDefaultDirectionMap2,cad_component:()=>cad_component2,cad_model_axis_directions:()=>cad_model_axis_directions2,cad_model_formats:()=>cad_model_formats2,capacitance:()=>capacitance2,circuit_json_footprint_load_error:()=>circuit_json_footprint_load_error2,current:()=>current2,distance:()=>distance7,duration_ms:()=>duration_ms2,experiment_type:()=>experiment_type2,external_footprint_load_error:()=>external_footprint_load_error2,frequency:()=>frequency2,getZodPrefixedIdWithDefault:()=>getZodPrefixedIdWithDefault2,inductance:()=>inductance2,kicadAt:()=>kicadAt3,kicadEffects:()=>kicadEffects3,kicadFont:()=>kicadFont3,kicadFootprintAttributes:()=>kicadFootprintAttributes3,kicadFootprintMetadata:()=>kicadFootprintMetadata3,kicadFootprintModel:()=>kicadFootprintModel3,kicadFootprintPad:()=>kicadFootprintPad3,kicadFootprintProperties:()=>kicadFootprintProperties3,kicadProperty:()=>kicadProperty3,kicadSymbolEffects:()=>kicadSymbolEffects3,kicadSymbolMetadata:()=>kicadSymbolMetadata3,kicadSymbolPinNames:()=>kicadSymbolPinNames3,kicadSymbolPinNumbers:()=>kicadSymbolPinNumbers3,kicadSymbolProperties:()=>kicadSymbolProperties3,kicadSymbolProperty:()=>kicadSymbolProperty3,layer_ref:()=>layer_ref2,layer_string:()=>layer_string2,length:()=>length3,manufacturing_drc_properties:()=>manufacturing_drc_properties2,ms:()=>ms4,ninePointAnchor:()=>ninePointAnchor3,parseAndConvertSiUnit:()=>parseAndConvertSiUnit2,pcbRenderLayer:()=>pcbRenderLayer2,pcb_autorouting_error:()=>pcb_autorouting_error2,pcb_board:()=>pcb_board2,pcb_breakout_point:()=>pcb_breakout_point2,pcb_component:()=>pcb_component2,pcb_component_invalid_layer_error:()=>pcb_component_invalid_layer_error2,pcb_component_not_on_board_edge_error:()=>pcb_component_not_on_board_edge_error2,pcb_component_outside_board_error:()=>pcb_component_outside_board_error2,pcb_connector_not_in_accessible_orientation_warning:()=>pcb_connector_not_in_accessible_orientation_warning2,pcb_copper_pour:()=>pcb_copper_pour2,pcb_copper_pour_brep:()=>pcb_copper_pour_brep2,pcb_copper_pour_polygon:()=>pcb_copper_pour_polygon2,pcb_copper_pour_rect:()=>pcb_copper_pour_rect2,pcb_copper_text:()=>pcb_copper_text2,pcb_courtyard_circle:()=>pcb_courtyard_circle2,pcb_courtyard_outline:()=>pcb_courtyard_outline2,pcb_courtyard_overlap_error:()=>pcb_courtyard_overlap_error2,pcb_courtyard_pill:()=>pcb_courtyard_pill2,pcb_courtyard_polygon:()=>pcb_courtyard_polygon2,pcb_courtyard_rect:()=>pcb_courtyard_rect2,pcb_cutout:()=>pcb_cutout2,pcb_cutout_circle:()=>pcb_cutout_circle2,pcb_cutout_path:()=>pcb_cutout_path2,pcb_cutout_polygon:()=>pcb_cutout_polygon2,pcb_cutout_rect:()=>pcb_cutout_rect2,pcb_fabrication_note_dimension:()=>pcb_fabrication_note_dimension2,pcb_fabrication_note_path:()=>pcb_fabrication_note_path2,pcb_fabrication_note_rect:()=>pcb_fabrication_note_rect2,pcb_fabrication_note_text:()=>pcb_fabrication_note_text2,pcb_footprint_overlap_error:()=>pcb_footprint_overlap_error2,pcb_ground_plane:()=>pcb_ground_plane2,pcb_ground_plane_region:()=>pcb_ground_plane_region2,pcb_group:()=>pcb_group2,pcb_hole:()=>pcb_hole2,pcb_hole_circle_or_square_shape:()=>pcb_hole_circle_or_square_shape2,pcb_hole_circle_shape:()=>pcb_hole_circle_shape2,pcb_hole_oval_shape:()=>pcb_hole_oval_shape2,pcb_hole_pill_shape:()=>pcb_hole_pill_shape2,pcb_hole_rect_shape:()=>pcb_hole_rect_shape2,pcb_hole_rotated_pill_shape:()=>pcb_hole_rotated_pill_shape2,pcb_keepout:()=>pcb_keepout2,pcb_manual_edit_conflict_warning:()=>pcb_manual_edit_conflict_warning2,pcb_missing_footprint_error:()=>pcb_missing_footprint_error2,pcb_net:()=>pcb_net2,pcb_note_dimension:()=>pcb_note_dimension2,pcb_note_line:()=>pcb_note_line2,pcb_note_path:()=>pcb_note_path2,pcb_note_rect:()=>pcb_note_rect2,pcb_note_text:()=>pcb_note_text2,pcb_pad_pad_clearance_error:()=>pcb_pad_pad_clearance_error2,pcb_pad_trace_clearance_error:()=>pcb_pad_trace_clearance_error2,pcb_panel:()=>pcb_panel2,pcb_panelization_placement_error:()=>pcb_panelization_placement_error2,pcb_placement_error:()=>pcb_placement_error2,pcb_plated_hole:()=>pcb_plated_hole2,pcb_port:()=>pcb_port2,pcb_port_not_connected_error:()=>pcb_port_not_connected_error2,pcb_port_not_matched_error:()=>pcb_port_not_matched_error2,pcb_route_hint:()=>pcb_route_hint2,pcb_route_hints:()=>pcb_route_hints2,pcb_silkscreen_circle:()=>pcb_silkscreen_circle2,pcb_silkscreen_graphic:()=>pcb_silkscreen_graphic2,pcb_silkscreen_graphic_brep:()=>pcb_silkscreen_graphic_brep2,pcb_silkscreen_line:()=>pcb_silkscreen_line2,pcb_silkscreen_oval:()=>pcb_silkscreen_oval2,pcb_silkscreen_path:()=>pcb_silkscreen_path2,pcb_silkscreen_pill:()=>pcb_silkscreen_pill2,pcb_silkscreen_rect:()=>pcb_silkscreen_rect2,pcb_silkscreen_text:()=>pcb_silkscreen_text2,pcb_smtpad:()=>pcb_smtpad2,pcb_smtpad_pill:()=>pcb_smtpad_pill2,pcb_solder_paste:()=>pcb_solder_paste2,pcb_text:()=>pcb_text2,pcb_thermal_spoke:()=>pcb_thermal_spoke2,pcb_trace:()=>pcb_trace2,pcb_trace_error:()=>pcb_trace_error2,pcb_trace_hint:()=>pcb_trace_hint2,pcb_trace_missing_error:()=>pcb_trace_missing_error2,pcb_trace_route_point:()=>pcb_trace_route_point2,pcb_trace_route_point_through_pad:()=>pcb_trace_route_point_through_pad2,pcb_trace_route_point_via:()=>pcb_trace_route_point_via2,pcb_trace_route_point_wire:()=>pcb_trace_route_point_wire2,pcb_trace_warning:()=>pcb_trace_warning2,pcb_via:()=>pcb_via2,pcb_via_clearance_error:()=>pcb_via_clearance_error2,pcb_via_trace_clearance_error:()=>pcb_via_trace_clearance_error2,point:()=>point5,point3:()=>point33,point_with_bulge:()=>point_with_bulge2,port_arrangement:()=>port_arrangement2,position:()=>position2,position3:()=>position32,resistance:()=>resistance2,ring:()=>ring2,rotation:()=>rotation4,route_hint_point:()=>route_hint_point2,schematic_arc:()=>schematic_arc2,schematic_box:()=>schematic_box2,schematic_circle:()=>schematic_circle2,schematic_component:()=>schematic_component2,schematic_component_port_arrangement_by_sides:()=>schematic_component_port_arrangement_by_sides2,schematic_component_port_arrangement_by_size:()=>schematic_component_port_arrangement_by_size2,schematic_debug_line:()=>schematic_debug_line2,schematic_debug_object:()=>schematic_debug_object2,schematic_debug_object_base:()=>schematic_debug_object_base2,schematic_debug_point:()=>schematic_debug_point2,schematic_debug_rect:()=>schematic_debug_rect2,schematic_error:()=>schematic_error2,schematic_group:()=>schematic_group2,schematic_layout_error:()=>schematic_layout_error2,schematic_line:()=>schematic_line2,schematic_manual_edit_conflict_warning:()=>schematic_manual_edit_conflict_warning2,schematic_net_label:()=>schematic_net_label2,schematic_path:()=>schematic_path2,schematic_pin_styles:()=>schematic_pin_styles2,schematic_port:()=>schematic_port2,schematic_rect:()=>schematic_rect2,schematic_sheet:()=>schematic_sheet2,schematic_symbol:()=>schematic_symbol2,schematic_table:()=>schematic_table2,schematic_table_cell:()=>schematic_table_cell2,schematic_text:()=>schematic_text2,schematic_trace:()=>schematic_trace2,schematic_voltage_probe:()=>schematic_voltage_probe2,simulation_ac_current_source:()=>simulation_ac_current_source2,simulation_ac_voltage_source:()=>simulation_ac_voltage_source2,simulation_current_probe:()=>simulation_current_probe2,simulation_current_source:()=>simulation_current_source2,simulation_dc_current_source:()=>simulation_dc_current_source2,simulation_dc_voltage_source:()=>simulation_dc_voltage_source2,simulation_experiment:()=>simulation_experiment2,simulation_op_amp:()=>simulation_op_amp2,simulation_oscilloscope_trace:()=>simulation_oscilloscope_trace2,simulation_spice_subcircuit:()=>simulation_spice_subcircuit2,simulation_switch:()=>simulation_switch2,simulation_transient_current_graph:()=>simulation_transient_current_graph2,simulation_transient_voltage_graph:()=>simulation_transient_voltage_graph2,simulation_unknown_experiment_error:()=>simulation_unknown_experiment_error2,simulation_voltage_probe:()=>simulation_voltage_probe2,simulation_voltage_source:()=>simulation_voltage_source2,size:()=>size2,source_ambiguous_port_reference:()=>source_ambiguous_port_reference2,source_board:()=>source_board2,source_component_base:()=>source_component_base2,source_component_internal_connection:()=>source_component_internal_connection2,source_component_misconfigured_error:()=>source_component_misconfigured_error2,source_component_pins_underspecified_warning:()=>source_component_pins_underspecified_warning2,source_failed_to_create_component_error:()=>source_failed_to_create_component_error2,source_group:()=>source_group2,source_i2c_misconfigured_error:()=>source_i2c_misconfigured_error2,source_interconnect:()=>source_interconnect2,source_invalid_component_property_error:()=>source_invalid_component_property_error2,source_manually_placed_via:()=>source_manually_placed_via2,source_missing_manufacturer_part_number_warning:()=>source_missing_manufacturer_part_number_warning2,source_missing_property_error:()=>source_missing_property_error2,source_net:()=>source_net2,source_no_ground_pin_defined_warning:()=>source_no_ground_pin_defined_warning2,source_no_power_pin_defined_warning:()=>source_no_power_pin_defined_warning2,source_part_not_found_warning:()=>source_part_not_found_warning2,source_pcb_ground_plane:()=>source_pcb_ground_plane2,source_pin_attributes:()=>source_pin_attributes2,source_pin_missing_trace_warning:()=>source_pin_missing_trace_warning2,source_pin_must_be_connected_error:()=>source_pin_must_be_connected_error2,source_port:()=>source_port2,source_project_metadata:()=>source_project_metadata2,source_property_ignored_warning:()=>source_property_ignored_warning2,source_refdes_convention_warning:()=>source_refdes_convention_warning2,source_simple_ammeter:()=>source_simple_ammeter2,source_simple_battery:()=>source_simple_battery2,source_simple_capacitor:()=>source_simple_capacitor2,source_simple_chip:()=>source_simple_chip2,source_simple_connector:()=>source_simple_connector2,source_simple_crystal:()=>source_simple_crystal2,source_simple_current_source:()=>source_simple_current_source2,source_simple_diode:()=>source_simple_diode2,source_simple_fiducial:()=>source_simple_fiducial2,source_simple_fuse:()=>source_simple_fuse2,source_simple_ground:()=>source_simple_ground2,source_simple_inductor:()=>source_simple_inductor2,source_simple_led:()=>source_simple_led2,source_simple_mosfet:()=>source_simple_mosfet2,source_simple_op_amp:()=>source_simple_op_amp2,source_simple_pin_header:()=>source_simple_pin_header2,source_simple_pinout:()=>source_simple_pinout2,source_simple_potentiometer:()=>source_simple_potentiometer2,source_simple_power_source:()=>source_simple_power_source2,source_simple_push_button:()=>source_simple_push_button2,source_simple_resistor:()=>source_simple_resistor2,source_simple_resonator:()=>source_simple_resonator2,source_simple_switch:()=>source_simple_switch2,source_simple_test_point:()=>source_simple_test_point2,source_simple_transistor:()=>source_simple_transistor2,source_simple_voltage_probe:()=>source_simple_voltage_probe2,source_simple_voltage_source:()=>source_simple_voltage_source2,source_trace:()=>source_trace2,source_trace_not_connected_error:()=>source_trace_not_connected_error2,source_unnamed_trace_warning:()=>source_unnamed_trace_warning2,spice_simulation_options:()=>spice_simulation_options2,supplier_footprint_mismatch_warning:()=>supplier_footprint_mismatch_warning2,supplier_name:()=>supplier_name2,time:()=>time2,timestamp:()=>timestamp2,unknown_error_finding_part:()=>unknown_error_finding_part2,visible_layer:()=>visible_layer2,voltage:()=>voltage2,wave_shape:()=>wave_shape2});var SI_PREFIX_VALUES2=new Map([["T",1e12],["G",1e9],["M",1e6],["K",1e3],["k",1e3],["",1],["m",.001],["\xB5",1e-6],["u",1e-6],["n",1e-9],["p",1e-12],["f",1e-15]]),SI_PREFIXES3=[...SI_PREFIX_VALUES2.keys()];function getSiPrefixMultiplier2(prefix){return SI_PREFIX_VALUES2.get(prefix)}var unitMappings2={Hz:{baseUnit:"Hz",variants:{MHz:1e6,kHz:1e3,Hz:1}},g:{baseUnit:"g",variants:{kg:1e3,g:1}},\u03A9:{baseUnit:"\u03A9",variants:{m\u03A9:.001,mohm:.001,mOhm:.001,milliohm:.001,\u03A9:1,ohm:1,Ohm:1,k\u03A9:1e3,K\u03A9:1e3,kohm:1e3,kOhm:1e3,KOhm:1e3,Kohm:1e3,M\u03A9:1e6,Mohm:1e6,MOhm:1e6,megohm:1e6,Megohm:1e6,G\u03A9:1e9,Gohm:1e9,GOhm:1e9,T\u03A9:1e12,Tohm:1e12,TOhm:1e12}},V:{baseUnit:"V",variants:{mV:.001,V:1,kV:1e3,KV:1e3,MV:1e6,GV:1e9,TV:1e12}},A:{baseUnit:"A",variants:{\u00B5A:1e-6,mA:.001,ma:.001,A:1,kA:1e3,MA:1e6}},F:{baseUnit:"F",variants:{pF:1e-12,nF:1e-9,\u00B5F:1e-6,uF:1e-6,mF:.001,F:1,kF:1e3,KF:1e3,MF:1e6}},H:{baseUnit:"H",variants:{pH:1e-12,nH:1e-9,\u00B5H:1e-6,uH:1e-6,mH:.001,H:1,kH:1e3,KH:1e3,MH:1e6}},ml:{baseUnit:"ml",variants:{ml:1,mL:1,l:1e3,L:1e3}},deg:{baseUnit:"deg",variants:{rad:180/Math.PI}},ms:{baseUnit:"ms",variants:{fs:1e-12,ps:1e-9,ns:1e-6,us:.001,\u00B5s:.001,ms:1,s:1e3}},mm:{baseUnit:"mm",variants:{nm:1e-6,\u00B5m:.001,um:.001,mm:1,cm:10,dm:100,m:1e3,km:1e6,in:25.4,ft:304.8,IN:25.4,FT:304.8,yd:914.4,mi:1609344,mil:.0254}}},unitMappingAndVariantSuffixes2=new Set;for(let[baseUnit,info]of Object.entries(unitMappings2)){unitMappingAndVariantSuffixes2.add(baseUnit);for(let variant of Object.keys(info.variants))unitMappingAndVariantSuffixes2.add(variant)}function getBaseTscircuitUnit2(unit){for(let info of Object.values(unitMappings2)){if(unit in info.variants)return{baseUnit:info.baseUnit,conversionFactor:info.variants[unit]};for(let[variant,conversionFactor]of Object.entries(info.variants)){if(!unit.endsWith(variant))continue;let prefix=unit.slice(0,-variant.length),prefixMultiplier=getSiPrefixMultiplier2(prefix);if(prefixMultiplier!=null)return{baseUnit:info.baseUnit,conversionFactor:prefixMultiplier*conversionFactor}}}return{baseUnit:unit,conversionFactor:1}}function parseAndConvertSiUnit2(v6,unitOfValue){if(v6==null)return{parsedUnit:null,unitOfValue:null,value:null};if(typeof v6=="string"&&v6.match(/^-?[\d.]+$/))return{value:Number.parseFloat(v6),parsedUnit:null,unitOfValue:null};if(typeof v6=="number")return{value:v6,parsedUnit:null,unitOfValue:null};if(typeof v6=="object"&&"x"in v6&&"y"in v6){let firstResult=parseAndConvertSiUnit2(v6.x,unitOfValue),xResult=parseAndConvertSiUnit2(v6.x,unitOfValue),yResult=parseAndConvertSiUnit2(v6.y,unitOfValue);return xResult.value===null||yResult.value===null?{parsedUnit:null,unitOfValue:null,value:null}:{parsedUnit:firstResult.parsedUnit,unitOfValue:firstResult.unitOfValue,value:{x:xResult.value,y:yResult.value}}}let unitReversed=v6.toString().split("").reverse().join("").match(/[^\d\s]+/)?.[0];if(!unitReversed)throw new Error(`Could not determine unit: "${v6}"`);let unit=unitReversed.split("").reverse().join(""),numberPart=v6.slice(0,-unit.length),bareSiPrefixMultiplier=getSiPrefixMultiplier2(unit);if(unitOfValue&&bareSiPrefixMultiplier!=null)return{parsedUnit:null,unitOfValue,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};if(bareSiPrefixMultiplier!=null&&!unitMappingAndVariantSuffixes2.has(unit))return{parsedUnit:null,unitOfValue:null,value:Number.parseFloat(numberPart)*bareSiPrefixMultiplier};let{baseUnit,conversionFactor}=getBaseTscircuitUnit2(unit);return{parsedUnit:unit,unitOfValue:baseUnit,value:conversionFactor*Number.parseFloat(numberPart)}}var SI_PREFIX_PATTERN2=SI_PREFIXES3.filter(prefix=>prefix!=="").sort((a6,b6)=>b6.length-a6.length).map(prefix=>prefix.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),SI_UNIT_PATTERN2=new RegExp(`^([+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?)(?:(${SI_PREFIX_PATTERN2}))?$`),SI_PREFIXES22=[{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"}],FALLBACK_PREFIX2=SI_PREFIXES22[SI_PREFIXES22.length-1],external_exports2={};__export4(external_exports2,{BRAND:()=>BRAND2,DIRTY:()=>DIRTY2,EMPTY_PATH:()=>EMPTY_PATH2,INVALID:()=>INVALID2,NEVER:()=>NEVER2,OK:()=>OK3,ParseStatus:()=>ParseStatus2,Schema:()=>ZodType2,ZodAny:()=>ZodAny2,ZodArray:()=>ZodArray2,ZodBigInt:()=>ZodBigInt2,ZodBoolean:()=>ZodBoolean2,ZodBranded:()=>ZodBranded2,ZodCatch:()=>ZodCatch2,ZodDate:()=>ZodDate2,ZodDefault:()=>ZodDefault2,ZodDiscriminatedUnion:()=>ZodDiscriminatedUnion2,ZodEffects:()=>ZodEffects2,ZodEnum:()=>ZodEnum2,ZodError:()=>ZodError2,ZodFirstPartyTypeKind:()=>ZodFirstPartyTypeKind2,ZodFunction:()=>ZodFunction2,ZodIntersection:()=>ZodIntersection2,ZodIssueCode:()=>ZodIssueCode2,ZodLazy:()=>ZodLazy2,ZodLiteral:()=>ZodLiteral2,ZodMap:()=>ZodMap2,ZodNaN:()=>ZodNaN2,ZodNativeEnum:()=>ZodNativeEnum2,ZodNever:()=>ZodNever2,ZodNull:()=>ZodNull2,ZodNullable:()=>ZodNullable2,ZodNumber:()=>ZodNumber2,ZodObject:()=>ZodObject2,ZodOptional:()=>ZodOptional2,ZodParsedType:()=>ZodParsedType2,ZodPipeline:()=>ZodPipeline2,ZodPromise:()=>ZodPromise2,ZodReadonly:()=>ZodReadonly2,ZodRecord:()=>ZodRecord2,ZodSchema:()=>ZodType2,ZodSet:()=>ZodSet2,ZodString:()=>ZodString2,ZodSymbol:()=>ZodSymbol2,ZodTransformer:()=>ZodEffects2,ZodTuple:()=>ZodTuple2,ZodType:()=>ZodType2,ZodUndefined:()=>ZodUndefined2,ZodUnion:()=>ZodUnion2,ZodUnknown:()=>ZodUnknown2,ZodVoid:()=>ZodVoid2,addIssueToContext:()=>addIssueToContext2,any:()=>anyType2,array:()=>arrayType2,bigint:()=>bigIntType2,boolean:()=>booleanType2,coerce:()=>coerce2,custom:()=>custom2,date:()=>dateType2,datetimeRegex:()=>datetimeRegex2,defaultErrorMap:()=>en_default2,discriminatedUnion:()=>discriminatedUnionType2,effect:()=>effectsType2,enum:()=>enumType2,function:()=>functionType2,getErrorMap:()=>getErrorMap2,getParsedType:()=>getParsedType2,instanceof:()=>instanceOfType2,intersection:()=>intersectionType2,isAborted:()=>isAborted2,isAsync:()=>isAsync2,isDirty:()=>isDirty2,isValid:()=>isValid2,late:()=>late2,lazy:()=>lazyType2,literal:()=>literalType2,makeIssue:()=>makeIssue2,map:()=>mapType2,nan:()=>nanType2,nativeEnum:()=>nativeEnumType2,never:()=>neverType2,null:()=>nullType2,nullable:()=>nullableType2,number:()=>numberType2,object:()=>objectType2,objectUtil:()=>objectUtil2,oboolean:()=>oboolean2,onumber:()=>onumber2,optional:()=>optionalType2,ostring:()=>ostring2,pipeline:()=>pipelineType2,preprocess:()=>preprocessType2,promise:()=>promiseType2,quotelessJson:()=>quotelessJson2,record:()=>recordType2,set:()=>setType2,setErrorMap:()=>setErrorMap2,strictObject:()=>strictObjectType2,string:()=>stringType2,symbol:()=>symbolType2,transformer:()=>effectsType2,tuple:()=>tupleType2,undefined:()=>undefinedType2,union:()=>unionType2,unknown:()=>unknownType2,util:()=>util2,void:()=>voidType2});var util2;(function(util22){util22.assertEqual=_3=>{};function assertIs(_arg){}util22.assertIs=assertIs;function assertNever(_x3){throw new Error}util22.assertNever=assertNever,util22.arrayToEnum=items=>{let obj={};for(let item of items)obj[item]=item;return obj},util22.getValidEnumValues=obj=>{let validKeys=util22.objectKeys(obj).filter(k7=>typeof obj[obj[k7]]!="number"),filtered={};for(let k7 of validKeys)filtered[k7]=obj[k7];return util22.objectValues(filtered)},util22.objectValues=obj=>util22.objectKeys(obj).map(function(e6){return obj[e6]}),util22.objectKeys=typeof Object.keys=="function"?obj=>Object.keys(obj):object=>{let keys=[];for(let key in object)Object.prototype.hasOwnProperty.call(object,key)&&keys.push(key);return keys},util22.find=(arr,checker)=>{for(let item of arr)if(checker(item))return item},util22.isInteger=typeof Number.isInteger=="function"?val=>Number.isInteger(val):val=>typeof val=="number"&&Number.isFinite(val)&&Math.floor(val)===val;function joinValues(array2,separator=" | "){return array2.map(val=>typeof val=="string"?`'${val}'`:val).join(separator)}util22.joinValues=joinValues,util22.jsonStringifyReplacer=(_3,value)=>typeof value=="bigint"?value.toString():value})(util2||(util2={}));var objectUtil2;(function(objectUtil22){objectUtil22.mergeShapes=(first,second)=>({...first,...second})})(objectUtil2||(objectUtil2={}));var ZodParsedType2=util2.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),getParsedType2=data=>{switch(typeof data){case"undefined":return ZodParsedType2.undefined;case"string":return ZodParsedType2.string;case"number":return Number.isNaN(data)?ZodParsedType2.nan:ZodParsedType2.number;case"boolean":return ZodParsedType2.boolean;case"function":return ZodParsedType2.function;case"bigint":return ZodParsedType2.bigint;case"symbol":return ZodParsedType2.symbol;case"object":return Array.isArray(data)?ZodParsedType2.array:data===null?ZodParsedType2.null:data.then&&typeof data.then=="function"&&data.catch&&typeof data.catch=="function"?ZodParsedType2.promise:typeof Map<"u"&&data instanceof Map?ZodParsedType2.map:typeof Set<"u"&&data instanceof Set?ZodParsedType2.set:typeof Date<"u"&&data instanceof Date?ZodParsedType2.date:ZodParsedType2.object;default:return ZodParsedType2.unknown}},ZodIssueCode2=util2.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),quotelessJson2=obj=>JSON.stringify(obj,null,2).replace(/"([^"]+)":/g,"$1:"),ZodError2=class _ZodError extends Error{get errors(){return this.issues}constructor(issues){super(),this.issues=[],this.addIssue=sub=>{this.issues=[...this.issues,sub]},this.addIssues=(subs=[])=>{this.issues=[...this.issues,...subs]};let actualProto=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,actualProto):this.__proto__=actualProto,this.name="ZodError",this.issues=issues}format(_mapper){let mapper=_mapper||function(issue){return issue.message},fieldErrors={_errors:[]},processError=error2=>{for(let issue of error2.issues)if(issue.code==="invalid_union")issue.unionErrors.map(processError);else if(issue.code==="invalid_return_type")processError(issue.returnTypeError);else if(issue.code==="invalid_arguments")processError(issue.argumentsError);else if(issue.path.length===0)fieldErrors._errors.push(mapper(issue));else{let curr=fieldErrors,i6=0;for(;i6<issue.path.length;){let el3=issue.path[i6];i6===issue.path.length-1?(curr[el3]=curr[el3]||{_errors:[]},curr[el3]._errors.push(mapper(issue))):curr[el3]=curr[el3]||{_errors:[]},curr=curr[el3],i6++}}};return processError(this),fieldErrors}static assert(value){if(!(value instanceof _ZodError))throw new Error(`Not a ZodError: ${value}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,util2.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(mapper=issue=>issue.message){let fieldErrors={},formErrors=[];for(let sub of this.issues)if(sub.path.length>0){let firstEl=sub.path[0];fieldErrors[firstEl]=fieldErrors[firstEl]||[],fieldErrors[firstEl].push(mapper(sub))}else formErrors.push(mapper(sub));return{formErrors,fieldErrors}}get formErrors(){return this.flatten()}};ZodError2.create=issues=>new ZodError2(issues);var errorMap2=(issue,_ctx)=>{let message;switch(issue.code){case ZodIssueCode2.invalid_type:issue.received===ZodParsedType2.undefined?message="Required":message=`Expected ${issue.expected}, received ${issue.received}`;break;case ZodIssueCode2.invalid_literal:message=`Invalid literal value, expected ${JSON.stringify(issue.expected,util2.jsonStringifyReplacer)}`;break;case ZodIssueCode2.unrecognized_keys:message=`Unrecognized key(s) in object: ${util2.joinValues(issue.keys,", ")}`;break;case ZodIssueCode2.invalid_union:message="Invalid input";break;case ZodIssueCode2.invalid_union_discriminator:message=`Invalid discriminator value. Expected ${util2.joinValues(issue.options)}`;break;case ZodIssueCode2.invalid_enum_value:message=`Invalid enum value. Expected ${util2.joinValues(issue.options)}, received '${issue.received}'`;break;case ZodIssueCode2.invalid_arguments:message="Invalid function arguments";break;case ZodIssueCode2.invalid_return_type:message="Invalid function return type";break;case ZodIssueCode2.invalid_date:message="Invalid date";break;case ZodIssueCode2.invalid_string:typeof issue.validation=="object"?"includes"in issue.validation?(message=`Invalid input: must include "${issue.validation.includes}"`,typeof issue.validation.position=="number"&&(message=`${message} at one or more positions greater than or equal to ${issue.validation.position}`)):"startsWith"in issue.validation?message=`Invalid input: must start with "${issue.validation.startsWith}"`:"endsWith"in issue.validation?message=`Invalid input: must end with "${issue.validation.endsWith}"`:util2.assertNever(issue.validation):issue.validation!=="regex"?message=`Invalid ${issue.validation}`:message="Invalid";break;case ZodIssueCode2.too_small:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at least":"more than"} ${issue.minimum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at least":"over"} ${issue.minimum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="bigint"?message=`Number must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${issue.minimum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly equal to ":issue.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(issue.minimum))}`:message="Invalid input";break;case ZodIssueCode2.too_big:issue.type==="array"?message=`Array must contain ${issue.exact?"exactly":issue.inclusive?"at most":"less than"} ${issue.maximum} element(s)`:issue.type==="string"?message=`String must contain ${issue.exact?"exactly":issue.inclusive?"at most":"under"} ${issue.maximum} character(s)`:issue.type==="number"?message=`Number must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="bigint"?message=`BigInt must be ${issue.exact?"exactly":issue.inclusive?"less than or equal to":"less than"} ${issue.maximum}`:issue.type==="date"?message=`Date must be ${issue.exact?"exactly":issue.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(issue.maximum))}`:message="Invalid input";break;case ZodIssueCode2.custom:message="Invalid input";break;case ZodIssueCode2.invalid_intersection_types:message="Intersection results could not be merged";break;case ZodIssueCode2.not_multiple_of:message=`Number must be a multiple of ${issue.multipleOf}`;break;case ZodIssueCode2.not_finite:message="Number must be finite";break;default:message=_ctx.defaultError,util2.assertNever(issue)}return{message}},en_default2=errorMap2,overrideErrorMap2=en_default2;function setErrorMap2(map){overrideErrorMap2=map}function getErrorMap2(){return overrideErrorMap2}var makeIssue2=params=>{let{data,path,errorMaps,issueData}=params,fullPath=[...path,...issueData.path||[]],fullIssue={...issueData,path:fullPath};if(issueData.message!==void 0)return{...issueData,path:fullPath,message:issueData.message};let errorMessage="",maps=errorMaps.filter(m6=>!!m6).slice().reverse();for(let map of maps)errorMessage=map(fullIssue,{data,defaultError:errorMessage}).message;return{...issueData,path:fullPath,message:errorMessage}},EMPTY_PATH2=[];function addIssueToContext2(ctx,issueData){let overrideMap=getErrorMap2(),issue=makeIssue2({issueData,data:ctx.data,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,overrideMap,overrideMap===en_default2?void 0:en_default2].filter(x6=>!!x6)});ctx.common.issues.push(issue)}var ParseStatus2=class _ParseStatus{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(status,results){let arrayValue=[];for(let s6 of results){if(s6.status==="aborted")return INVALID2;s6.status==="dirty"&&status.dirty(),arrayValue.push(s6.value)}return{status:status.value,value:arrayValue}}static async mergeObjectAsync(status,pairs22){let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value})}return _ParseStatus.mergeObjectSync(status,syncPairs)}static mergeObjectSync(status,pairs22){let finalObject={};for(let pair of pairs22){let{key,value}=pair;if(key.status==="aborted"||value.status==="aborted")return INVALID2;key.status==="dirty"&&status.dirty(),value.status==="dirty"&&status.dirty(),key.value!=="__proto__"&&(typeof value.value<"u"||pair.alwaysSet)&&(finalObject[key.value]=value.value)}return{status:status.value,value:finalObject}}},INVALID2=Object.freeze({status:"aborted"}),DIRTY2=value=>({status:"dirty",value}),OK3=value=>({status:"valid",value}),isAborted2=x6=>x6.status==="aborted",isDirty2=x6=>x6.status==="dirty",isValid2=x6=>x6.status==="valid",isAsync2=x6=>typeof Promise<"u"&&x6 instanceof Promise,errorUtil2;(function(errorUtil22){errorUtil22.errToObj=message=>typeof message=="string"?{message}:message||{},errorUtil22.toString=message=>typeof message=="string"?message:message?.message})(errorUtil2||(errorUtil2={}));var ParseInputLazyPath2=class{constructor(parent,value,path,key){this._cachedPath=[],this.parent=parent,this.data=value,this._path=path,this._key=key}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},handleResult2=(ctx,result)=>{if(isValid2(result))return{success:!0,data:result.value};if(!ctx.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;let error2=new ZodError2(ctx.common.issues);return this._error=error2,this._error}}};function processCreateParams2(params){if(!params)return{};let{errorMap:errorMap22,invalid_type_error,required_error,description}=params;if(errorMap22&&(invalid_type_error||required_error))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return errorMap22?{errorMap:errorMap22,description}:{errorMap:(iss,ctx)=>{let{message}=params;return iss.code==="invalid_enum_value"?{message:message??ctx.defaultError}:typeof ctx.data>"u"?{message:message??required_error??ctx.defaultError}:iss.code!=="invalid_type"?{message:ctx.defaultError}:{message:message??invalid_type_error??ctx.defaultError}},description}}var ZodType2=class{get description(){return this._def.description}_getType(input2){return getParsedType2(input2.data)}_getOrReturnCtx(input2,ctx){return ctx||{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}_processInputParams(input2){return{status:new ParseStatus2,ctx:{common:input2.parent.common,data:input2.data,parsedType:getParsedType2(input2.data),schemaErrorMap:this._def.errorMap,path:input2.path,parent:input2.parent}}}_parseSync(input2){let result=this._parse(input2);if(isAsync2(result))throw new Error("Synchronous parse encountered promise.");return result}_parseAsync(input2){let result=this._parse(input2);return Promise.resolve(result)}parse(data,params){let result=this.safeParse(data,params);if(result.success)return result.data;throw result.error}safeParse(data,params){let ctx={common:{issues:[],async:params?.async??!1,contextualErrorMap:params?.errorMap},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},result=this._parseSync({data,path:ctx.path,parent:ctx});return handleResult2(ctx,result)}"~validate"(data){let ctx={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)};if(!this["~standard"].async)try{let result=this._parseSync({data,path:[],parent:ctx});return isValid2(result)?{value:result.value}:{issues:ctx.common.issues}}catch(err2){err2?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),ctx.common={issues:[],async:!0}}return this._parseAsync({data,path:[],parent:ctx}).then(result=>isValid2(result)?{value:result.value}:{issues:ctx.common.issues})}async parseAsync(data,params){let result=await this.safeParseAsync(data,params);if(result.success)return result.data;throw result.error}async safeParseAsync(data,params){let ctx={common:{issues:[],contextualErrorMap:params?.errorMap,async:!0},path:params?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data,parsedType:getParsedType2(data)},maybeAsyncResult=this._parse({data,path:ctx.path,parent:ctx}),result=await(isAsync2(maybeAsyncResult)?maybeAsyncResult:Promise.resolve(maybeAsyncResult));return handleResult2(ctx,result)}refine(check,message){let getIssueProperties=val=>typeof message=="string"||typeof message>"u"?{message}:typeof message=="function"?message(val):message;return this._refinement((val,ctx)=>{let result=check(val),setError=()=>ctx.addIssue({code:ZodIssueCode2.custom,...getIssueProperties(val)});return typeof Promise<"u"&&result instanceof Promise?result.then(data=>data?!0:(setError(),!1)):result?!0:(setError(),!1)})}refinement(check,refinementData){return this._refinement((val,ctx)=>check(val)?!0:(ctx.addIssue(typeof refinementData=="function"?refinementData(val,ctx):refinementData),!1))}_refinement(refinement){return new ZodEffects2({schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"refinement",refinement}})}superRefine(refinement){return this._refinement(refinement)}constructor(def){this.spa=this.safeParseAsync,this._def=def,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:data=>this["~validate"](data)}}optional(){return ZodOptional2.create(this,this._def)}nullable(){return ZodNullable2.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return ZodArray2.create(this)}promise(){return ZodPromise2.create(this,this._def)}or(option){return ZodUnion2.create([this,option],this._def)}and(incoming){return ZodIntersection2.create(this,incoming,this._def)}transform(transform22){return new ZodEffects2({...processCreateParams2(this._def),schema:this,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect:{type:"transform",transform:transform22}})}default(def){let defaultValueFunc=typeof def=="function"?def:()=>def;return new ZodDefault2({...processCreateParams2(this._def),innerType:this,defaultValue:defaultValueFunc,typeName:ZodFirstPartyTypeKind2.ZodDefault})}brand(){return new ZodBranded2({typeName:ZodFirstPartyTypeKind2.ZodBranded,type:this,...processCreateParams2(this._def)})}catch(def){let catchValueFunc=typeof def=="function"?def:()=>def;return new ZodCatch2({...processCreateParams2(this._def),innerType:this,catchValue:catchValueFunc,typeName:ZodFirstPartyTypeKind2.ZodCatch})}describe(description){let This=this.constructor;return new This({...this._def,description})}pipe(target){return ZodPipeline2.create(this,target)}readonly(){return ZodReadonly2.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},cuidRegex2=/^c[^\s-]{8,}$/i,cuid2Regex2=/^[0-9a-z]+$/,ulidRegex2=/^[0-9A-HJKMNP-TV-Z]{26}$/i,uuidRegex2=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,nanoidRegex2=/^[a-z0-9_-]{21}$/i,jwtRegex2=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,durationRegex2=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,emailRegex2=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,_emojiRegex2="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",emojiRegex2,ipv4Regex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4CidrRegex2=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6Regex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,ipv6CidrRegex2=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64Regex2=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64urlRegex2=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,dateRegexSource2="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",dateRegex2=new RegExp(`^${dateRegexSource2}$`);function timeRegexSource2(args){let secondsRegexSource="[0-5]\\d";args.precision?secondsRegexSource=`${secondsRegexSource}\\.\\d{${args.precision}}`:args.precision==null&&(secondsRegexSource=`${secondsRegexSource}(\\.\\d+)?`);let secondsQuantifier=args.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${secondsRegexSource})${secondsQuantifier}`}function timeRegex2(args){return new RegExp(`^${timeRegexSource2(args)}$`)}function datetimeRegex2(args){let regex=`${dateRegexSource2}T${timeRegexSource2(args)}`,opts=[];return opts.push(args.local?"Z?":"Z"),args.offset&&opts.push("([+-]\\d{2}:?\\d{2})"),regex=`${regex}(${opts.join("|")})`,new RegExp(`^${regex}$`)}function isValidIP2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4Regex2.test(ip3)||(version2==="v6"||!version2)&&ipv6Regex2.test(ip3))}function isValidJWT2(jwt,alg){if(!jwtRegex2.test(jwt))return!1;try{let[header]=jwt.split(".");if(!header)return!1;let base64=header.replace(/-/g,"+").replace(/_/g,"/").padEnd(header.length+(4-header.length%4)%4,"="),decoded=JSON.parse(atob(base64));return!(typeof decoded!="object"||decoded===null||"typ"in decoded&&decoded?.typ!=="JWT"||!decoded.alg||alg&&decoded.alg!==alg)}catch{return!1}}function isValidCidr2(ip3,version2){return!!((version2==="v4"||!version2)&&ipv4CidrRegex2.test(ip3)||(version2==="v6"||!version2)&&ipv6CidrRegex2.test(ip3))}var ZodString2=class _ZodString extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=String(input2.data)),this._getType(input2)!==ZodParsedType2.string){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.string,received:ctx2.parsedType}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)if(check.kind==="min")input2.data.length<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="max")input2.data.length>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!1,message:check.message}),status.dirty());else if(check.kind==="length"){let tooBig=input2.data.length>check.value,tooSmall=input2.data.length<check.value;(tooBig||tooSmall)&&(ctx=this._getOrReturnCtx(input2,ctx),tooBig?addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}):tooSmall&&addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"string",inclusive:!0,exact:!0,message:check.message}),status.dirty())}else if(check.kind==="email")emailRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"email",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="emoji")emojiRegex2||(emojiRegex2=new RegExp(_emojiRegex2,"u")),emojiRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"emoji",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="uuid")uuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"uuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="nanoid")nanoidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"nanoid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid")cuidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="cuid2")cuid2Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cuid2",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="ulid")ulidRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ulid",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty());else if(check.kind==="url")try{new URL(input2.data)}catch{ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()}else check.kind==="regex"?(check.regex.lastIndex=0,check.regex.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"regex",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty())):check.kind==="trim"?input2.data=input2.data.trim():check.kind==="includes"?input2.data.includes(check.value,check.position)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{includes:check.value,position:check.position},message:check.message}),status.dirty()):check.kind==="toLowerCase"?input2.data=input2.data.toLowerCase():check.kind==="toUpperCase"?input2.data=input2.data.toUpperCase():check.kind==="startsWith"?input2.data.startsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{startsWith:check.value},message:check.message}),status.dirty()):check.kind==="endsWith"?input2.data.endsWith(check.value)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:{endsWith:check.value},message:check.message}),status.dirty()):check.kind==="datetime"?datetimeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"datetime",message:check.message}),status.dirty()):check.kind==="date"?dateRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"date",message:check.message}),status.dirty()):check.kind==="time"?timeRegex2(check).test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_string,validation:"time",message:check.message}),status.dirty()):check.kind==="duration"?durationRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"duration",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="ip"?isValidIP2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"ip",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="jwt"?isValidJWT2(input2.data,check.alg)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"jwt",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="cidr"?isValidCidr2(input2.data,check.version)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"cidr",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64"?base64Regex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):check.kind==="base64url"?base64urlRegex2.test(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{validation:"base64url",code:ZodIssueCode2.invalid_string,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_regex(regex,validation,message){return this.refinement(data=>regex.test(data),{validation,code:ZodIssueCode2.invalid_string,...errorUtil2.errToObj(message)})}_addCheck(check){return new _ZodString({...this._def,checks:[...this._def.checks,check]})}email(message){return this._addCheck({kind:"email",...errorUtil2.errToObj(message)})}url(message){return this._addCheck({kind:"url",...errorUtil2.errToObj(message)})}emoji(message){return this._addCheck({kind:"emoji",...errorUtil2.errToObj(message)})}uuid(message){return this._addCheck({kind:"uuid",...errorUtil2.errToObj(message)})}nanoid(message){return this._addCheck({kind:"nanoid",...errorUtil2.errToObj(message)})}cuid(message){return this._addCheck({kind:"cuid",...errorUtil2.errToObj(message)})}cuid2(message){return this._addCheck({kind:"cuid2",...errorUtil2.errToObj(message)})}ulid(message){return this._addCheck({kind:"ulid",...errorUtil2.errToObj(message)})}base64(message){return this._addCheck({kind:"base64",...errorUtil2.errToObj(message)})}base64url(message){return this._addCheck({kind:"base64url",...errorUtil2.errToObj(message)})}jwt(options){return this._addCheck({kind:"jwt",...errorUtil2.errToObj(options)})}ip(options){return this._addCheck({kind:"ip",...errorUtil2.errToObj(options)})}cidr(options){return this._addCheck({kind:"cidr",...errorUtil2.errToObj(options)})}datetime(options){return typeof options=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:options}):this._addCheck({kind:"datetime",precision:typeof options?.precision>"u"?null:options?.precision,offset:options?.offset??!1,local:options?.local??!1,...errorUtil2.errToObj(options?.message)})}date(message){return this._addCheck({kind:"date",message})}time(options){return typeof options=="string"?this._addCheck({kind:"time",precision:null,message:options}):this._addCheck({kind:"time",precision:typeof options?.precision>"u"?null:options?.precision,...errorUtil2.errToObj(options?.message)})}duration(message){return this._addCheck({kind:"duration",...errorUtil2.errToObj(message)})}regex(regex,message){return this._addCheck({kind:"regex",regex,...errorUtil2.errToObj(message)})}includes(value,options){return this._addCheck({kind:"includes",value,position:options?.position,...errorUtil2.errToObj(options?.message)})}startsWith(value,message){return this._addCheck({kind:"startsWith",value,...errorUtil2.errToObj(message)})}endsWith(value,message){return this._addCheck({kind:"endsWith",value,...errorUtil2.errToObj(message)})}min(minLength,message){return this._addCheck({kind:"min",value:minLength,...errorUtil2.errToObj(message)})}max(maxLength,message){return this._addCheck({kind:"max",value:maxLength,...errorUtil2.errToObj(message)})}length(len,message){return this._addCheck({kind:"length",value:len,...errorUtil2.errToObj(message)})}nonempty(message){return this.min(1,errorUtil2.errToObj(message))}trim(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new _ZodString({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(ch2=>ch2.kind==="datetime")}get isDate(){return!!this._def.checks.find(ch2=>ch2.kind==="date")}get isTime(){return!!this._def.checks.find(ch2=>ch2.kind==="time")}get isDuration(){return!!this._def.checks.find(ch2=>ch2.kind==="duration")}get isEmail(){return!!this._def.checks.find(ch2=>ch2.kind==="email")}get isURL(){return!!this._def.checks.find(ch2=>ch2.kind==="url")}get isEmoji(){return!!this._def.checks.find(ch2=>ch2.kind==="emoji")}get isUUID(){return!!this._def.checks.find(ch2=>ch2.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(ch2=>ch2.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(ch2=>ch2.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(ch2=>ch2.kind==="cuid2")}get isULID(){return!!this._def.checks.find(ch2=>ch2.kind==="ulid")}get isIP(){return!!this._def.checks.find(ch2=>ch2.kind==="ip")}get isCIDR(){return!!this._def.checks.find(ch2=>ch2.kind==="cidr")}get isBase64(){return!!this._def.checks.find(ch2=>ch2.kind==="base64")}get isBase64url(){return!!this._def.checks.find(ch2=>ch2.kind==="base64url")}get minLength(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxLength(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}};ZodString2.create=params=>new ZodString2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodString,coerce:params?.coerce??!1,...processCreateParams2(params)});function floatSafeRemainder2(val,step){let valDecCount=(val.toString().split(".")[1]||"").length,stepDecCount=(step.toString().split(".")[1]||"").length,decCount=valDecCount>stepDecCount?valDecCount:stepDecCount,valInt=Number.parseInt(val.toFixed(decCount).replace(".","")),stepInt=Number.parseInt(step.toFixed(decCount).replace(".",""));return valInt%stepInt/10**decCount}var ZodNumber2=class _ZodNumber extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(input2){if(this._def.coerce&&(input2.data=Number(input2.data)),this._getType(input2)!==ZodParsedType2.number){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.number,received:ctx2.parsedType}),INVALID2}let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="int"?util2.isInteger(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:"integer",received:"float",message:check.message}),status.dirty()):check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:check.value,type:"number",inclusive:check.inclusive,exact:!1,message:check.message}),status.dirty()):check.kind==="multipleOf"?floatSafeRemainder2(input2.data,check.value)!==0&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):check.kind==="finite"?Number.isFinite(input2.data)||(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_finite,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodNumber({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodNumber({...this._def,checks:[...this._def.checks,check]})}int(message){return this._addCheck({kind:"int",message:errorUtil2.toString(message)})}positive(message){return this._addCheck({kind:"min",value:0,inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:0,inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:0,inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:0,inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}finite(message){return this._addCheck({kind:"finite",message:errorUtil2.toString(message)})}safe(message){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:errorUtil2.toString(message)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxValue(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}get isInt(){return!!this._def.checks.find(ch2=>ch2.kind==="int"||ch2.kind==="multipleOf"&&util2.isInteger(ch2.value))}get isFinite(){let max2=null,min=null;for(let ch2 of this._def.checks){if(ch2.kind==="finite"||ch2.kind==="int"||ch2.kind==="multipleOf")return!0;ch2.kind==="min"?(min===null||ch2.value>min)&&(min=ch2.value):ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value)}return Number.isFinite(min)&&Number.isFinite(max2)}};ZodNumber2.create=params=>new ZodNumber2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodNumber,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodBigInt2=class _ZodBigInt extends ZodType2{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(input2){if(this._def.coerce)try{input2.data=BigInt(input2.data)}catch{return this._getInvalidInput(input2)}if(this._getType(input2)!==ZodParsedType2.bigint)return this._getInvalidInput(input2);let ctx,status=new ParseStatus2;for(let check of this._def.checks)check.kind==="min"?(check.inclusive?input2.data<check.value:input2.data<=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,type:"bigint",minimum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="max"?(check.inclusive?input2.data>check.value:input2.data>=check.value)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,type:"bigint",maximum:check.value,inclusive:check.inclusive,message:check.message}),status.dirty()):check.kind==="multipleOf"?input2.data%check.value!==BigInt(0)&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.not_multiple_of,multipleOf:check.value,message:check.message}),status.dirty()):util2.assertNever(check);return{status:status.value,value:input2.data}}_getInvalidInput(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.bigint,received:ctx.parsedType}),INVALID2}gte(value,message){return this.setLimit("min",value,!0,errorUtil2.toString(message))}gt(value,message){return this.setLimit("min",value,!1,errorUtil2.toString(message))}lte(value,message){return this.setLimit("max",value,!0,errorUtil2.toString(message))}lt(value,message){return this.setLimit("max",value,!1,errorUtil2.toString(message))}setLimit(kind,value,inclusive,message){return new _ZodBigInt({...this._def,checks:[...this._def.checks,{kind,value,inclusive,message:errorUtil2.toString(message)}]})}_addCheck(check){return new _ZodBigInt({...this._def,checks:[...this._def.checks,check]})}positive(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}negative(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:errorUtil2.toString(message)})}nonpositive(message){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}nonnegative(message){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:errorUtil2.toString(message)})}multipleOf(value,message){return this._addCheck({kind:"multipleOf",value,message:errorUtil2.toString(message)})}get minValue(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min}get maxValue(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2}};ZodBigInt2.create=params=>new ZodBigInt2({checks:[],typeName:ZodFirstPartyTypeKind2.ZodBigInt,coerce:params?.coerce??!1,...processCreateParams2(params)});var ZodBoolean2=class extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=!!input2.data),this._getType(input2)!==ZodParsedType2.boolean){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.boolean,received:ctx.parsedType}),INVALID2}return OK3(input2.data)}};ZodBoolean2.create=params=>new ZodBoolean2({typeName:ZodFirstPartyTypeKind2.ZodBoolean,coerce:params?.coerce||!1,...processCreateParams2(params)});var ZodDate2=class _ZodDate extends ZodType2{_parse(input2){if(this._def.coerce&&(input2.data=new Date(input2.data)),this._getType(input2)!==ZodParsedType2.date){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.date,received:ctx2.parsedType}),INVALID2}if(Number.isNaN(input2.data.getTime())){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_date}),INVALID2}let status=new ParseStatus2,ctx;for(let check of this._def.checks)check.kind==="min"?input2.data.getTime()<check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,message:check.message,inclusive:!0,exact:!1,minimum:check.value,type:"date"}),status.dirty()):check.kind==="max"?input2.data.getTime()>check.value&&(ctx=this._getOrReturnCtx(input2,ctx),addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,message:check.message,inclusive:!0,exact:!1,maximum:check.value,type:"date"}),status.dirty()):util2.assertNever(check);return{status:status.value,value:new Date(input2.data.getTime())}}_addCheck(check){return new _ZodDate({...this._def,checks:[...this._def.checks,check]})}min(minDate,message){return this._addCheck({kind:"min",value:minDate.getTime(),message:errorUtil2.toString(message)})}max(maxDate,message){return this._addCheck({kind:"max",value:maxDate.getTime(),message:errorUtil2.toString(message)})}get minDate(){let min=null;for(let ch2 of this._def.checks)ch2.kind==="min"&&(min===null||ch2.value>min)&&(min=ch2.value);return min!=null?new Date(min):null}get maxDate(){let max2=null;for(let ch2 of this._def.checks)ch2.kind==="max"&&(max2===null||ch2.value<max2)&&(max2=ch2.value);return max2!=null?new Date(max2):null}};ZodDate2.create=params=>new ZodDate2({checks:[],coerce:params?.coerce||!1,typeName:ZodFirstPartyTypeKind2.ZodDate,...processCreateParams2(params)});var ZodSymbol2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.symbol){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.symbol,received:ctx.parsedType}),INVALID2}return OK3(input2.data)}};ZodSymbol2.create=params=>new ZodSymbol2({typeName:ZodFirstPartyTypeKind2.ZodSymbol,...processCreateParams2(params)});var ZodUndefined2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.undefined,received:ctx.parsedType}),INVALID2}return OK3(input2.data)}};ZodUndefined2.create=params=>new ZodUndefined2({typeName:ZodFirstPartyTypeKind2.ZodUndefined,...processCreateParams2(params)});var ZodNull2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.null){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.null,received:ctx.parsedType}),INVALID2}return OK3(input2.data)}};ZodNull2.create=params=>new ZodNull2({typeName:ZodFirstPartyTypeKind2.ZodNull,...processCreateParams2(params)});var ZodAny2=class extends ZodType2{constructor(){super(...arguments),this._any=!0}_parse(input2){return OK3(input2.data)}};ZodAny2.create=params=>new ZodAny2({typeName:ZodFirstPartyTypeKind2.ZodAny,...processCreateParams2(params)});var ZodUnknown2=class extends ZodType2{constructor(){super(...arguments),this._unknown=!0}_parse(input2){return OK3(input2.data)}};ZodUnknown2.create=params=>new ZodUnknown2({typeName:ZodFirstPartyTypeKind2.ZodUnknown,...processCreateParams2(params)});var ZodNever2=class extends ZodType2{_parse(input2){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.never,received:ctx.parsedType}),INVALID2}};ZodNever2.create=params=>new ZodNever2({typeName:ZodFirstPartyTypeKind2.ZodNever,...processCreateParams2(params)});var ZodVoid2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.undefined){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.void,received:ctx.parsedType}),INVALID2}return OK3(input2.data)}};ZodVoid2.create=params=>new ZodVoid2({typeName:ZodFirstPartyTypeKind2.ZodVoid,...processCreateParams2(params)});var ZodArray2=class _ZodArray extends ZodType2{_parse(input2){let{ctx,status}=this._processInputParams(input2),def=this._def;if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(def.exactLength!==null){let tooBig=ctx.data.length>def.exactLength.value,tooSmall=ctx.data.length<def.exactLength.value;(tooBig||tooSmall)&&(addIssueToContext2(ctx,{code:tooBig?ZodIssueCode2.too_big:ZodIssueCode2.too_small,minimum:tooSmall?def.exactLength.value:void 0,maximum:tooBig?def.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:def.exactLength.message}),status.dirty())}if(def.minLength!==null&&ctx.data.length<def.minLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minLength.value,type:"array",inclusive:!0,exact:!1,message:def.minLength.message}),status.dirty()),def.maxLength!==null&&ctx.data.length>def.maxLength.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxLength.value,type:"array",inclusive:!0,exact:!1,message:def.maxLength.message}),status.dirty()),ctx.common.async)return Promise.all([...ctx.data].map((item,i6)=>def.type._parseAsync(new ParseInputLazyPath2(ctx,item,ctx.path,i6)))).then(result2=>ParseStatus2.mergeArray(status,result2));let result=[...ctx.data].map((item,i6)=>def.type._parseSync(new ParseInputLazyPath2(ctx,item,ctx.path,i6)));return ParseStatus2.mergeArray(status,result)}get element(){return this._def.type}min(minLength,message){return new _ZodArray({...this._def,minLength:{value:minLength,message:errorUtil2.toString(message)}})}max(maxLength,message){return new _ZodArray({...this._def,maxLength:{value:maxLength,message:errorUtil2.toString(message)}})}length(len,message){return new _ZodArray({...this._def,exactLength:{value:len,message:errorUtil2.toString(message)}})}nonempty(message){return this.min(1,message)}};ZodArray2.create=(schema,params)=>new ZodArray2({type:schema,minLength:null,maxLength:null,exactLength:null,typeName:ZodFirstPartyTypeKind2.ZodArray,...processCreateParams2(params)});function deepPartialify2(schema){if(schema instanceof ZodObject2){let newShape={};for(let key in schema.shape){let fieldSchema=schema.shape[key];newShape[key]=ZodOptional2.create(deepPartialify2(fieldSchema))}return new ZodObject2({...schema._def,shape:()=>newShape})}else return schema instanceof ZodArray2?new ZodArray2({...schema._def,type:deepPartialify2(schema.element)}):schema instanceof ZodOptional2?ZodOptional2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodNullable2?ZodNullable2.create(deepPartialify2(schema.unwrap())):schema instanceof ZodTuple2?ZodTuple2.create(schema.items.map(item=>deepPartialify2(item))):schema}var ZodObject2=class _ZodObject extends ZodType2{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;let shape=this._def.shape(),keys=util2.objectKeys(shape);return this._cached={shape,keys},this._cached}_parse(input2){if(this._getType(input2)!==ZodParsedType2.object){let ctx2=this._getOrReturnCtx(input2);return addIssueToContext2(ctx2,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx2.parsedType}),INVALID2}let{status,ctx}=this._processInputParams(input2),{shape,keys:shapeKeys}=this._getCached(),extraKeys=[];if(!(this._def.catchall instanceof ZodNever2&&this._def.unknownKeys==="strip"))for(let key in ctx.data)shapeKeys.includes(key)||extraKeys.push(key);let pairs22=[];for(let key of shapeKeys){let keyValidator=shape[key],value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:keyValidator._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}if(this._def.catchall instanceof ZodNever2){let unknownKeys=this._def.unknownKeys;if(unknownKeys==="passthrough")for(let key of extraKeys)pairs22.push({key:{status:"valid",value:key},value:{status:"valid",value:ctx.data[key]}});else if(unknownKeys==="strict")extraKeys.length>0&&(addIssueToContext2(ctx,{code:ZodIssueCode2.unrecognized_keys,keys:extraKeys}),status.dirty());else if(unknownKeys!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{let catchall=this._def.catchall;for(let key of extraKeys){let value=ctx.data[key];pairs22.push({key:{status:"valid",value:key},value:catchall._parse(new ParseInputLazyPath2(ctx,value,ctx.path,key)),alwaysSet:key in ctx.data})}}return ctx.common.async?Promise.resolve().then(async()=>{let syncPairs=[];for(let pair of pairs22){let key=await pair.key,value=await pair.value;syncPairs.push({key,value,alwaysSet:pair.alwaysSet})}return syncPairs}).then(syncPairs=>ParseStatus2.mergeObjectSync(status,syncPairs)):ParseStatus2.mergeObjectSync(status,pairs22)}get shape(){return this._def.shape()}strict(message){return errorUtil2.errToObj,new _ZodObject({...this._def,unknownKeys:"strict",...message!==void 0?{errorMap:(issue,ctx)=>{let defaultError=this._def.errorMap?.(issue,ctx).message??ctx.defaultError;return issue.code==="unrecognized_keys"?{message:errorUtil2.errToObj(message).message??defaultError}:{message:defaultError}}}:{}})}strip(){return new _ZodObject({...this._def,unknownKeys:"strip"})}passthrough(){return new _ZodObject({...this._def,unknownKeys:"passthrough"})}extend(augmentation){return new _ZodObject({...this._def,shape:()=>({...this._def.shape(),...augmentation})})}merge(merging){return new _ZodObject({unknownKeys:merging._def.unknownKeys,catchall:merging._def.catchall,shape:()=>({...this._def.shape(),...merging._def.shape()}),typeName:ZodFirstPartyTypeKind2.ZodObject})}setKey(key,schema){return this.augment({[key]:schema})}catchall(index){return new _ZodObject({...this._def,catchall:index})}pick(mask){let shape={};for(let key of util2.objectKeys(mask))mask[key]&&this.shape[key]&&(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}omit(mask){let shape={};for(let key of util2.objectKeys(this.shape))mask[key]||(shape[key]=this.shape[key]);return new _ZodObject({...this._def,shape:()=>shape})}deepPartial(){return deepPartialify2(this)}partial(mask){let newShape={};for(let key of util2.objectKeys(this.shape)){let fieldSchema=this.shape[key];mask&&!mask[key]?newShape[key]=fieldSchema:newShape[key]=fieldSchema.optional()}return new _ZodObject({...this._def,shape:()=>newShape})}required(mask){let newShape={};for(let key of util2.objectKeys(this.shape))if(mask&&!mask[key])newShape[key]=this.shape[key];else{let newField=this.shape[key];for(;newField instanceof ZodOptional2;)newField=newField._def.innerType;newShape[key]=newField}return new _ZodObject({...this._def,shape:()=>newShape})}keyof(){return createZodEnum2(util2.objectKeys(this.shape))}};ZodObject2.create=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.strictCreate=(shape,params)=>new ZodObject2({shape:()=>shape,unknownKeys:"strict",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});ZodObject2.lazycreate=(shape,params)=>new ZodObject2({shape,unknownKeys:"strip",catchall:ZodNever2.create(),typeName:ZodFirstPartyTypeKind2.ZodObject,...processCreateParams2(params)});var ZodUnion2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),options=this._def.options;function handleResults(results){for(let result of results)if(result.result.status==="valid")return result.result;for(let result of results)if(result.result.status==="dirty")return ctx.common.issues.push(...result.ctx.common.issues),result.result;let unionErrors=results.map(result=>new ZodError2(result.ctx.common.issues));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}if(ctx.common.async)return Promise.all(options.map(async option=>{let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null};return{result:await option._parseAsync({data:ctx.data,path:ctx.path,parent:childCtx}),ctx:childCtx}})).then(handleResults);{let dirty,issues=[];for(let option of options){let childCtx={...ctx,common:{...ctx.common,issues:[]},parent:null},result=option._parseSync({data:ctx.data,path:ctx.path,parent:childCtx});if(result.status==="valid")return result;result.status==="dirty"&&!dirty&&(dirty={result,ctx:childCtx}),childCtx.common.issues.length&&issues.push(childCtx.common.issues)}if(dirty)return ctx.common.issues.push(...dirty.ctx.common.issues),dirty.result;let unionErrors=issues.map(issues2=>new ZodError2(issues2));return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union,unionErrors}),INVALID2}}get options(){return this._def.options}};ZodUnion2.create=(types,params)=>new ZodUnion2({options:types,typeName:ZodFirstPartyTypeKind2.ZodUnion,...processCreateParams2(params)});var getDiscriminator2=type=>type instanceof ZodLazy2?getDiscriminator2(type.schema):type instanceof ZodEffects2?getDiscriminator2(type.innerType()):type instanceof ZodLiteral2?[type.value]:type instanceof ZodEnum2?type.options:type instanceof ZodNativeEnum2?util2.objectValues(type.enum):type instanceof ZodDefault2?getDiscriminator2(type._def.innerType):type instanceof ZodUndefined2?[void 0]:type instanceof ZodNull2?[null]:type instanceof ZodOptional2?[void 0,...getDiscriminator2(type.unwrap())]:type instanceof ZodNullable2?[null,...getDiscriminator2(type.unwrap())]:type instanceof ZodBranded2||type instanceof ZodReadonly2?getDiscriminator2(type.unwrap()):type instanceof ZodCatch2?getDiscriminator2(type._def.innerType):[],ZodDiscriminatedUnion2=class _ZodDiscriminatedUnion extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let discriminator=this.discriminator,discriminatorValue=ctx.data[discriminator],option=this.optionsMap.get(discriminatorValue);return option?ctx.common.async?option._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}):option._parseSync({data:ctx.data,path:ctx.path,parent:ctx}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[discriminator]}),INVALID2)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(discriminator,options,params){let optionsMap=new Map;for(let type of options){let discriminatorValues=getDiscriminator2(type.shape[discriminator]);if(!discriminatorValues.length)throw new Error(`A discriminator value for key \`${discriminator}\` could not be extracted from all schema options`);for(let value of discriminatorValues){if(optionsMap.has(value))throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);optionsMap.set(value,type)}}return new _ZodDiscriminatedUnion({typeName:ZodFirstPartyTypeKind2.ZodDiscriminatedUnion,discriminator,options,optionsMap,...processCreateParams2(params)})}};function mergeValues2(a6,b6){let aType=getParsedType2(a6),bType=getParsedType2(b6);if(a6===b6)return{valid:!0,data:a6};if(aType===ZodParsedType2.object&&bType===ZodParsedType2.object){let bKeys=util2.objectKeys(b6),sharedKeys=util2.objectKeys(a6).filter(key=>bKeys.indexOf(key)!==-1),newObj={...a6,...b6};for(let key of sharedKeys){let sharedValue=mergeValues2(a6[key],b6[key]);if(!sharedValue.valid)return{valid:!1};newObj[key]=sharedValue.data}return{valid:!0,data:newObj}}else if(aType===ZodParsedType2.array&&bType===ZodParsedType2.array){if(a6.length!==b6.length)return{valid:!1};let newArray=[];for(let index=0;index<a6.length;index++){let itemA=a6[index],itemB=b6[index],sharedValue=mergeValues2(itemA,itemB);if(!sharedValue.valid)return{valid:!1};newArray.push(sharedValue.data)}return{valid:!0,data:newArray}}else return aType===ZodParsedType2.date&&bType===ZodParsedType2.date&&+a6==+b6?{valid:!0,data:a6}:{valid:!1}}var ZodIntersection2=class extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2),handleParsed=(parsedLeft,parsedRight)=>{if(isAborted2(parsedLeft)||isAborted2(parsedRight))return INVALID2;let merged=mergeValues2(parsedLeft.value,parsedRight.value);return merged.valid?((isDirty2(parsedLeft)||isDirty2(parsedRight))&&status.dirty(),{status:status.value,value:merged.data}):(addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_intersection_types}),INVALID2)};return ctx.common.async?Promise.all([this._def.left._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseAsync({data:ctx.data,path:ctx.path,parent:ctx})]).then(([left,right])=>handleParsed(left,right)):handleParsed(this._def.left._parseSync({data:ctx.data,path:ctx.path,parent:ctx}),this._def.right._parseSync({data:ctx.data,path:ctx.path,parent:ctx}))}};ZodIntersection2.create=(left,right,params)=>new ZodIntersection2({left,right,typeName:ZodFirstPartyTypeKind2.ZodIntersection,...processCreateParams2(params)});var ZodTuple2=class _ZodTuple extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.array)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.array,received:ctx.parsedType}),INVALID2;if(ctx.data.length<this._def.items.length)return addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),INVALID2;!this._def.rest&&ctx.data.length>this._def.items.length&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),status.dirty());let items=[...ctx.data].map((item,itemIndex)=>{let schema=this._def.items[itemIndex]||this._def.rest;return schema?schema._parse(new ParseInputLazyPath2(ctx,item,ctx.path,itemIndex)):null}).filter(x6=>!!x6);return ctx.common.async?Promise.all(items).then(results=>ParseStatus2.mergeArray(status,results)):ParseStatus2.mergeArray(status,items)}get items(){return this._def.items}rest(rest){return new _ZodTuple({...this._def,rest})}};ZodTuple2.create=(schemas,params)=>{if(!Array.isArray(schemas))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new ZodTuple2({items:schemas,typeName:ZodFirstPartyTypeKind2.ZodTuple,rest:null,...processCreateParams2(params)})};var ZodRecord2=class _ZodRecord extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.object)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.object,received:ctx.parsedType}),INVALID2;let pairs22=[],keyType=this._def.keyType,valueType=this._def.valueType;for(let key in ctx.data)pairs22.push({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,key)),value:valueType._parse(new ParseInputLazyPath2(ctx,ctx.data[key],ctx.path,key)),alwaysSet:key in ctx.data});return ctx.common.async?ParseStatus2.mergeObjectAsync(status,pairs22):ParseStatus2.mergeObjectSync(status,pairs22)}get element(){return this._def.valueType}static create(first,second,third){return second instanceof ZodType2?new _ZodRecord({keyType:first,valueType:second,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(third)}):new _ZodRecord({keyType:ZodString2.create(),valueType:first,typeName:ZodFirstPartyTypeKind2.ZodRecord,...processCreateParams2(second)})}},ZodMap2=class extends ZodType2{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.map)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.map,received:ctx.parsedType}),INVALID2;let keyType=this._def.keyType,valueType=this._def.valueType,pairs22=[...ctx.data.entries()].map(([key,value],index)=>({key:keyType._parse(new ParseInputLazyPath2(ctx,key,ctx.path,[index,"key"])),value:valueType._parse(new ParseInputLazyPath2(ctx,value,ctx.path,[index,"value"]))}));if(ctx.common.async){let finalMap=new Map;return Promise.resolve().then(async()=>{for(let pair of pairs22){let key=await pair.key,value=await pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}})}else{let finalMap=new Map;for(let pair of pairs22){let key=pair.key,value=pair.value;if(key.status==="aborted"||value.status==="aborted")return INVALID2;(key.status==="dirty"||value.status==="dirty")&&status.dirty(),finalMap.set(key.value,value.value)}return{status:status.value,value:finalMap}}}};ZodMap2.create=(keyType,valueType,params)=>new ZodMap2({valueType,keyType,typeName:ZodFirstPartyTypeKind2.ZodMap,...processCreateParams2(params)});var ZodSet2=class _ZodSet extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.set)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.set,received:ctx.parsedType}),INVALID2;let def=this._def;def.minSize!==null&&ctx.data.size<def.minSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_small,minimum:def.minSize.value,type:"set",inclusive:!0,exact:!1,message:def.minSize.message}),status.dirty()),def.maxSize!==null&&ctx.data.size>def.maxSize.value&&(addIssueToContext2(ctx,{code:ZodIssueCode2.too_big,maximum:def.maxSize.value,type:"set",inclusive:!0,exact:!1,message:def.maxSize.message}),status.dirty());let valueType=this._def.valueType;function finalizeSet(elements2){let parsedSet=new Set;for(let element of elements2){if(element.status==="aborted")return INVALID2;element.status==="dirty"&&status.dirty(),parsedSet.add(element.value)}return{status:status.value,value:parsedSet}}let elements=[...ctx.data.values()].map((item,i6)=>valueType._parse(new ParseInputLazyPath2(ctx,item,ctx.path,i6)));return ctx.common.async?Promise.all(elements).then(elements2=>finalizeSet(elements2)):finalizeSet(elements)}min(minSize,message){return new _ZodSet({...this._def,minSize:{value:minSize,message:errorUtil2.toString(message)}})}max(maxSize,message){return new _ZodSet({...this._def,maxSize:{value:maxSize,message:errorUtil2.toString(message)}})}size(size22,message){return this.min(size22,message).max(size22,message)}nonempty(message){return this.min(1,message)}};ZodSet2.create=(valueType,params)=>new ZodSet2({valueType,minSize:null,maxSize:null,typeName:ZodFirstPartyTypeKind2.ZodSet,...processCreateParams2(params)});var ZodFunction2=class _ZodFunction extends ZodType2{constructor(){super(...arguments),this.validate=this.implement}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.function)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.function,received:ctx.parsedType}),INVALID2;function makeArgsIssue(args,error2){return makeIssue2({data:args,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x6=>!!x6),issueData:{code:ZodIssueCode2.invalid_arguments,argumentsError:error2}})}function makeReturnsIssue(returns,error2){return makeIssue2({data:returns,path:ctx.path,errorMaps:[ctx.common.contextualErrorMap,ctx.schemaErrorMap,getErrorMap2(),en_default2].filter(x6=>!!x6),issueData:{code:ZodIssueCode2.invalid_return_type,returnTypeError:error2}})}let params={errorMap:ctx.common.contextualErrorMap},fn3=ctx.data;if(this._def.returns instanceof ZodPromise2){let me3=this;return OK3(async function(...args){let error2=new ZodError2([]),parsedArgs=await me3._def.args.parseAsync(args,params).catch(e6=>{throw error2.addIssue(makeArgsIssue(args,e6)),error2}),result=await Reflect.apply(fn3,this,parsedArgs);return await me3._def.returns._def.type.parseAsync(result,params).catch(e6=>{throw error2.addIssue(makeReturnsIssue(result,e6)),error2})})}else{let me3=this;return OK3(function(...args){let parsedArgs=me3._def.args.safeParse(args,params);if(!parsedArgs.success)throw new ZodError2([makeArgsIssue(args,parsedArgs.error)]);let result=Reflect.apply(fn3,this,parsedArgs.data),parsedReturns=me3._def.returns.safeParse(result,params);if(!parsedReturns.success)throw new ZodError2([makeReturnsIssue(result,parsedReturns.error)]);return parsedReturns.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...items){return new _ZodFunction({...this._def,args:ZodTuple2.create(items).rest(ZodUnknown2.create())})}returns(returnType){return new _ZodFunction({...this._def,returns:returnType})}implement(func){return this.parse(func)}strictImplement(func){return this.parse(func)}static create(args,returns,params){return new _ZodFunction({args:args||ZodTuple2.create([]).rest(ZodUnknown2.create()),returns:returns||ZodUnknown2.create(),typeName:ZodFirstPartyTypeKind2.ZodFunction,...processCreateParams2(params)})}},ZodLazy2=class extends ZodType2{get schema(){return this._def.getter()}_parse(input2){let{ctx}=this._processInputParams(input2);return this._def.getter()._parse({data:ctx.data,path:ctx.path,parent:ctx})}};ZodLazy2.create=(getter,params)=>new ZodLazy2({getter,typeName:ZodFirstPartyTypeKind2.ZodLazy,...processCreateParams2(params)});var ZodLiteral2=class extends ZodType2{_parse(input2){if(input2.data!==this._def.value){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_literal,expected:this._def.value}),INVALID2}return{status:"valid",value:input2.data}}get value(){return this._def.value}};ZodLiteral2.create=(value,params)=>new ZodLiteral2({value,typeName:ZodFirstPartyTypeKind2.ZodLiteral,...processCreateParams2(params)});function createZodEnum2(values,params){return new ZodEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodEnum,...processCreateParams2(params)})}var ZodEnum2=class _ZodEnum extends ZodType2{_parse(input2){if(typeof input2.data!="string"){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(input2.data)){let ctx=this._getOrReturnCtx(input2),expectedValues=this._def.values;return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK3(input2.data)}get options(){return this._def.values}get enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Values(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}get Enum(){let enumValues={};for(let val of this._def.values)enumValues[val]=val;return enumValues}extract(values,newDef=this._def){return _ZodEnum.create(values,{...this._def,...newDef})}exclude(values,newDef=this._def){return _ZodEnum.create(this.options.filter(opt2=>!values.includes(opt2)),{...this._def,...newDef})}};ZodEnum2.create=createZodEnum2;var ZodNativeEnum2=class extends ZodType2{_parse(input2){let nativeEnumValues=util2.getValidEnumValues(this._def.values),ctx=this._getOrReturnCtx(input2);if(ctx.parsedType!==ZodParsedType2.string&&ctx.parsedType!==ZodParsedType2.number){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{expected:util2.joinValues(expectedValues),received:ctx.parsedType,code:ZodIssueCode2.invalid_type}),INVALID2}if(this._cache||(this._cache=new Set(util2.getValidEnumValues(this._def.values))),!this._cache.has(input2.data)){let expectedValues=util2.objectValues(nativeEnumValues);return addIssueToContext2(ctx,{received:ctx.data,code:ZodIssueCode2.invalid_enum_value,options:expectedValues}),INVALID2}return OK3(input2.data)}get enum(){return this._def.values}};ZodNativeEnum2.create=(values,params)=>new ZodNativeEnum2({values,typeName:ZodFirstPartyTypeKind2.ZodNativeEnum,...processCreateParams2(params)});var ZodPromise2=class extends ZodType2{unwrap(){return this._def.type}_parse(input2){let{ctx}=this._processInputParams(input2);if(ctx.parsedType!==ZodParsedType2.promise&&ctx.common.async===!1)return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.promise,received:ctx.parsedType}),INVALID2;let promisified=ctx.parsedType===ZodParsedType2.promise?ctx.data:Promise.resolve(ctx.data);return OK3(promisified.then(data=>this._def.type.parseAsync(data,{path:ctx.path,errorMap:ctx.common.contextualErrorMap})))}};ZodPromise2.create=(schema,params)=>new ZodPromise2({type:schema,typeName:ZodFirstPartyTypeKind2.ZodPromise,...processCreateParams2(params)});var ZodEffects2=class extends ZodType2{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===ZodFirstPartyTypeKind2.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(input2){let{status,ctx}=this._processInputParams(input2),effect=this._def.effect||null,checkCtx={addIssue:arg=>{addIssueToContext2(ctx,arg),arg.fatal?status.abort():status.dirty()},get path(){return ctx.path}};if(checkCtx.addIssue=checkCtx.addIssue.bind(checkCtx),effect.type==="preprocess"){let processed=effect.transform(ctx.data,checkCtx);if(ctx.common.async)return Promise.resolve(processed).then(async processed2=>{if(status.value==="aborted")return INVALID2;let result=await this._def.schema._parseAsync({data:processed2,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result});{if(status.value==="aborted")return INVALID2;let result=this._def.schema._parseSync({data:processed,path:ctx.path,parent:ctx});return result.status==="aborted"?INVALID2:result.status==="dirty"||status.value==="dirty"?DIRTY2(result.value):result}}if(effect.type==="refinement"){let executeRefinement=acc=>{let result=effect.refinement(acc,checkCtx);if(ctx.common.async)return Promise.resolve(result);if(result instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return acc};if(ctx.common.async===!1){let inner=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value),{status:status.value,value:inner.value})}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(inner=>inner.status==="aborted"?INVALID2:(inner.status==="dirty"&&status.dirty(),executeRefinement(inner.value).then(()=>({status:status.value,value:inner.value}))))}if(effect.type==="transform")if(ctx.common.async===!1){let base=this._def.schema._parseSync({data:ctx.data,path:ctx.path,parent:ctx});if(!isValid2(base))return INVALID2;let result=effect.transform(base.value,checkCtx);if(result instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:status.value,value:result}}else return this._def.schema._parseAsync({data:ctx.data,path:ctx.path,parent:ctx}).then(base=>isValid2(base)?Promise.resolve(effect.transform(base.value,checkCtx)).then(result=>({status:status.value,value:result})):INVALID2);util2.assertNever(effect)}};ZodEffects2.create=(schema,effect,params)=>new ZodEffects2({schema,typeName:ZodFirstPartyTypeKind2.ZodEffects,effect,...processCreateParams2(params)});ZodEffects2.createWithPreprocess=(preprocess,schema,params)=>new ZodEffects2({schema,effect:{type:"preprocess",transform:preprocess},typeName:ZodFirstPartyTypeKind2.ZodEffects,...processCreateParams2(params)});var ZodOptional2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.undefined?OK3(void 0):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodOptional2.create=(type,params)=>new ZodOptional2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodOptional,...processCreateParams2(params)});var ZodNullable2=class extends ZodType2{_parse(input2){return this._getType(input2)===ZodParsedType2.null?OK3(null):this._def.innerType._parse(input2)}unwrap(){return this._def.innerType}};ZodNullable2.create=(type,params)=>new ZodNullable2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodNullable,...processCreateParams2(params)});var ZodDefault2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return ctx.parsedType===ZodParsedType2.undefined&&(data=this._def.defaultValue()),this._def.innerType._parse({data,path:ctx.path,parent:ctx})}removeDefault(){return this._def.innerType}};ZodDefault2.create=(type,params)=>new ZodDefault2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodDefault,defaultValue:typeof params.default=="function"?params.default:()=>params.default,...processCreateParams2(params)});var ZodCatch2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),newCtx={...ctx,common:{...ctx.common,issues:[]}},result=this._def.innerType._parse({data:newCtx.data,path:newCtx.path,parent:{...newCtx}});return isAsync2(result)?result.then(result2=>({status:"valid",value:result2.status==="valid"?result2.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})})):{status:"valid",value:result.status==="valid"?result.value:this._def.catchValue({get error(){return new ZodError2(newCtx.common.issues)},input:newCtx.data})}}removeCatch(){return this._def.innerType}};ZodCatch2.create=(type,params)=>new ZodCatch2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodCatch,catchValue:typeof params.catch=="function"?params.catch:()=>params.catch,...processCreateParams2(params)});var ZodNaN2=class extends ZodType2{_parse(input2){if(this._getType(input2)!==ZodParsedType2.nan){let ctx=this._getOrReturnCtx(input2);return addIssueToContext2(ctx,{code:ZodIssueCode2.invalid_type,expected:ZodParsedType2.nan,received:ctx.parsedType}),INVALID2}return{status:"valid",value:input2.data}}};ZodNaN2.create=params=>new ZodNaN2({typeName:ZodFirstPartyTypeKind2.ZodNaN,...processCreateParams2(params)});var BRAND2=Symbol("zod_brand"),ZodBranded2=class extends ZodType2{_parse(input2){let{ctx}=this._processInputParams(input2),data=ctx.data;return this._def.type._parse({data,path:ctx.path,parent:ctx})}unwrap(){return this._def.type}},ZodPipeline2=class _ZodPipeline extends ZodType2{_parse(input2){let{status,ctx}=this._processInputParams(input2);if(ctx.common.async)return(async()=>{let inResult=await this._def.in._parseAsync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),DIRTY2(inResult.value)):this._def.out._parseAsync({data:inResult.value,path:ctx.path,parent:ctx})})();{let inResult=this._def.in._parseSync({data:ctx.data,path:ctx.path,parent:ctx});return inResult.status==="aborted"?INVALID2:inResult.status==="dirty"?(status.dirty(),{status:"dirty",value:inResult.value}):this._def.out._parseSync({data:inResult.value,path:ctx.path,parent:ctx})}}static create(a6,b6){return new _ZodPipeline({in:a6,out:b6,typeName:ZodFirstPartyTypeKind2.ZodPipeline})}},ZodReadonly2=class extends ZodType2{_parse(input2){let result=this._def.innerType._parse(input2),freeze=data=>(isValid2(data)&&(data.value=Object.freeze(data.value)),data);return isAsync2(result)?result.then(data=>freeze(data)):freeze(result)}unwrap(){return this._def.innerType}};ZodReadonly2.create=(type,params)=>new ZodReadonly2({innerType:type,typeName:ZodFirstPartyTypeKind2.ZodReadonly,...processCreateParams2(params)});function cleanParams2(params,data){let p3=typeof params=="function"?params(data):typeof params=="string"?{message:params}:params;return typeof p3=="string"?{message:p3}:p3}function custom2(check,_params={},fatal){return check?ZodAny2.create().superRefine((data,ctx)=>{let r6=check(data);if(r6 instanceof Promise)return r6.then(r22=>{if(!r22){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}});if(!r6){let params=cleanParams2(_params,data),_fatal=params.fatal??fatal??!0;ctx.addIssue({code:"custom",...params,fatal:_fatal})}}):ZodAny2.create()}var late2={object:ZodObject2.lazycreate},ZodFirstPartyTypeKind2;(function(ZodFirstPartyTypeKind22){ZodFirstPartyTypeKind22.ZodString="ZodString",ZodFirstPartyTypeKind22.ZodNumber="ZodNumber",ZodFirstPartyTypeKind22.ZodNaN="ZodNaN",ZodFirstPartyTypeKind22.ZodBigInt="ZodBigInt",ZodFirstPartyTypeKind22.ZodBoolean="ZodBoolean",ZodFirstPartyTypeKind22.ZodDate="ZodDate",ZodFirstPartyTypeKind22.ZodSymbol="ZodSymbol",ZodFirstPartyTypeKind22.ZodUndefined="ZodUndefined",ZodFirstPartyTypeKind22.ZodNull="ZodNull",ZodFirstPartyTypeKind22.ZodAny="ZodAny",ZodFirstPartyTypeKind22.ZodUnknown="ZodUnknown",ZodFirstPartyTypeKind22.ZodNever="ZodNever",ZodFirstPartyTypeKind22.ZodVoid="ZodVoid",ZodFirstPartyTypeKind22.ZodArray="ZodArray",ZodFirstPartyTypeKind22.ZodObject="ZodObject",ZodFirstPartyTypeKind22.ZodUnion="ZodUnion",ZodFirstPartyTypeKind22.ZodDiscriminatedUnion="ZodDiscriminatedUnion",ZodFirstPartyTypeKind22.ZodIntersection="ZodIntersection",ZodFirstPartyTypeKind22.ZodTuple="ZodTuple",ZodFirstPartyTypeKind22.ZodRecord="ZodRecord",ZodFirstPartyTypeKind22.ZodMap="ZodMap",ZodFirstPartyTypeKind22.ZodSet="ZodSet",ZodFirstPartyTypeKind22.ZodFunction="ZodFunction",ZodFirstPartyTypeKind22.ZodLazy="ZodLazy",ZodFirstPartyTypeKind22.ZodLiteral="ZodLiteral",ZodFirstPartyTypeKind22.ZodEnum="ZodEnum",ZodFirstPartyTypeKind22.ZodEffects="ZodEffects",ZodFirstPartyTypeKind22.ZodNativeEnum="ZodNativeEnum",ZodFirstPartyTypeKind22.ZodOptional="ZodOptional",ZodFirstPartyTypeKind22.ZodNullable="ZodNullable",ZodFirstPartyTypeKind22.ZodDefault="ZodDefault",ZodFirstPartyTypeKind22.ZodCatch="ZodCatch",ZodFirstPartyTypeKind22.ZodPromise="ZodPromise",ZodFirstPartyTypeKind22.ZodBranded="ZodBranded",ZodFirstPartyTypeKind22.ZodPipeline="ZodPipeline",ZodFirstPartyTypeKind22.ZodReadonly="ZodReadonly"})(ZodFirstPartyTypeKind2||(ZodFirstPartyTypeKind2={}));var instanceOfType2=(cls,params={message:`Input not instance of ${cls.name}`})=>custom2(data=>data instanceof cls,params),stringType2=ZodString2.create,numberType2=ZodNumber2.create,nanType2=ZodNaN2.create,bigIntType2=ZodBigInt2.create,booleanType2=ZodBoolean2.create,dateType2=ZodDate2.create,symbolType2=ZodSymbol2.create,undefinedType2=ZodUndefined2.create,nullType2=ZodNull2.create,anyType2=ZodAny2.create,unknownType2=ZodUnknown2.create,neverType2=ZodNever2.create,voidType2=ZodVoid2.create,arrayType2=ZodArray2.create,objectType2=ZodObject2.create,strictObjectType2=ZodObject2.strictCreate,unionType2=ZodUnion2.create,discriminatedUnionType2=ZodDiscriminatedUnion2.create,intersectionType2=ZodIntersection2.create,tupleType2=ZodTuple2.create,recordType2=ZodRecord2.create,mapType2=ZodMap2.create,setType2=ZodSet2.create,functionType2=ZodFunction2.create,lazyType2=ZodLazy2.create,literalType2=ZodLiteral2.create,enumType2=ZodEnum2.create,nativeEnumType2=ZodNativeEnum2.create,promiseType2=ZodPromise2.create,effectsType2=ZodEffects2.create,optionalType2=ZodOptional2.create,nullableType2=ZodNullable2.create,preprocessType2=ZodEffects2.createWithPreprocess,pipelineType2=ZodPipeline2.create,ostring2=()=>stringType2().optional(),onumber2=()=>numberType2().optional(),oboolean2=()=>booleanType2().optional(),coerce2={string:arg=>ZodString2.create({...arg,coerce:!0}),number:arg=>ZodNumber2.create({...arg,coerce:!0}),boolean:arg=>ZodBoolean2.create({...arg,coerce:!0}),bigint:arg=>ZodBigInt2.create({...arg,coerce:!0}),date:arg=>ZodDate2.create({...arg,coerce:!0})},NEVER2=INVALID2,resistance2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"\u03A9").value),capacitance2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"F").value).transform(value=>Number.parseFloat(value.toPrecision(12))),inductance2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"H").value),voltage2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"V").value),length3=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6).value),frequency2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"Hz").value),distance7=length3,current2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6,"A").value),duration_ms2=external_exports2.string().or(external_exports2.number()).transform(v6=>parseAndConvertSiUnit2(v6).value),time2=duration_ms2,ms4=duration_ms2,timestamp2=external_exports2.string().datetime(),rotation4=external_exports2.string().or(external_exports2.number()).transform(arg=>typeof arg=="number"?arg:arg.endsWith("deg")?Number.parseFloat(arg.split("deg")[0]):arg.endsWith("rad")?Number.parseFloat(arg.split("rad")[0])*180/Math.PI:Number.parseFloat(arg)),battery_capacity2=external_exports2.number().or(external_exports2.string().endsWith("mAh")).transform(v6=>{if(typeof v6=="string"){let valString=v6.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v6}).describe("Battery capacity in mAh"),expectTypesMatch3=shouldBe=>{};expectTypesMatch3("extra props b");expectTypesMatch3("missing props b");expectTypesMatch3(!0);expectTypesMatch3("mismatched prop types: a");var expectStringUnionsMatch2=shouldBe=>{};expectStringUnionsMatch2(!0);expectStringUnionsMatch2('T1 has extra: "c", T2 has extra: "d"');expectStringUnionsMatch2('T1 has extra: "c"');expectStringUnionsMatch2('T2 has extra: "c"');expectStringUnionsMatch2('T1 has extra: "d", T2 has extra: "c"');expectStringUnionsMatch2(!0);var point5=external_exports2.object({x:distance7,y:distance7}),position2=point5;expectTypesMatch3(!0);expectTypesMatch3(!0);var point33=external_exports2.object({x:distance7,y:distance7,z:distance7}),position32=point33;expectTypesMatch3(!0);var size2=external_exports2.object({width:external_exports2.number(),height:external_exports2.number()});expectTypesMatch3(!0);var randomId2=length4=>{let chars2="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";return Array.from({length:length4},()=>chars2[Math.floor(Math.random()*chars2.length)]).join("")},getZodPrefixedIdWithDefault2=prefix=>external_exports2.string().optional().default(()=>`${prefix}_${randomId2(10)}`),ninePointAnchor3=external_exports2.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]);expectTypesMatch3(!0);var pcbRenderLayer2=external_exports2.enum(["top_silkscreen","bottom_silkscreen","top_copper","bottom_copper","top_soldermask","bottom_soldermask","top_fabrication_note","bottom_fabrication_note","top_user_note","bottom_user_note","top_courtyard","bottom_courtyard","inner1_copper","inner2_copper","inner3_copper","inner4_copper","inner5_copper","inner6_copper","edge_cuts","drill"]);expectTypesMatch3(!0);var asset2=external_exports2.object({project_relative_path:external_exports2.string(),url:external_exports2.string(),mimetype:external_exports2.string()});expectTypesMatch3(!0);var kicadAt3=point5.extend({rotation:rotation4.optional()});expectTypesMatch3(!0);var kicadFont3=external_exports2.object({size:point5.optional(),thickness:distance7.optional()});expectTypesMatch3(!0);var kicadEffects3=external_exports2.object({font:kicadFont3.optional()});expectTypesMatch3(!0);var kicadProperty3=external_exports2.object({value:external_exports2.string(),at:kicadAt3.optional(),layer:external_exports2.string().optional(),uuid:external_exports2.string().optional(),hide:external_exports2.boolean().optional(),effects:kicadEffects3.optional()});expectTypesMatch3(!0);var kicadFootprintProperties3=external_exports2.object({Reference:kicadProperty3.optional(),Value:kicadProperty3.optional(),Datasheet:kicadProperty3.optional(),Description:kicadProperty3.optional()});expectTypesMatch3(!0);var kicadFootprintAttributes3=external_exports2.object({through_hole:external_exports2.boolean().optional(),smd:external_exports2.boolean().optional(),exclude_from_pos_files:external_exports2.boolean().optional(),exclude_from_bom:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadFootprintPad3=external_exports2.object({name:external_exports2.string(),type:external_exports2.string(),shape:external_exports2.string().optional(),at:kicadAt3.optional(),size:point5.optional(),drill:distance7.optional(),layers:external_exports2.array(external_exports2.string()).optional(),removeUnusedLayers:external_exports2.boolean().optional(),uuid:external_exports2.string().optional()});expectTypesMatch3(!0);var kicadFootprintModel3=external_exports2.object({path:external_exports2.string(),offset:point33.optional(),scale:point33.optional(),rotate:point33.optional()});expectTypesMatch3(!0);var kicadFootprintMetadata3=external_exports2.object({footprintName:external_exports2.string().optional(),version:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),generator:external_exports2.string().optional(),generatorVersion:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),layer:external_exports2.string().optional(),properties:kicadFootprintProperties3.optional(),attributes:kicadFootprintAttributes3.optional(),pads:external_exports2.array(kicadFootprintPad3).optional(),embeddedFonts:external_exports2.boolean().optional(),model:kicadFootprintModel3.optional()});expectTypesMatch3(!0);var kicadSymbolPinNumbers3=external_exports2.object({hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolPinNames3=external_exports2.object({offset:distance7.optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolEffects3=external_exports2.object({font:kicadFont3.optional(),justify:external_exports2.union([external_exports2.string(),external_exports2.array(external_exports2.string())]).optional(),hide:external_exports2.boolean().optional()});expectTypesMatch3(!0);var kicadSymbolProperty3=external_exports2.object({value:external_exports2.string(),id:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),at:kicadAt3.optional(),effects:kicadSymbolEffects3.optional()});expectTypesMatch3(!0);var kicadSymbolProperties3=external_exports2.object({Reference:kicadSymbolProperty3.optional(),Value:kicadSymbolProperty3.optional(),Footprint:kicadSymbolProperty3.optional(),Datasheet:kicadSymbolProperty3.optional(),Description:kicadSymbolProperty3.optional(),ki_keywords:kicadSymbolProperty3.optional(),ki_fp_filters:kicadSymbolProperty3.optional()});expectTypesMatch3(!0);var kicadSymbolMetadata3=external_exports2.object({symbolName:external_exports2.string().optional(),extends:external_exports2.string().optional(),pinNumbers:kicadSymbolPinNumbers3.optional(),pinNames:kicadSymbolPinNames3.optional(),excludeFromSim:external_exports2.boolean().optional(),inBom:external_exports2.boolean().optional(),onBoard:external_exports2.boolean().optional(),properties:kicadSymbolProperties3.optional(),embeddedFonts:external_exports2.boolean().optional()});expectTypesMatch3(!0);var base_circuit_json_error2=external_exports2.object({error_type:external_exports2.string(),message:external_exports2.string(),is_fatal:external_exports2.boolean().optional()});expectTypesMatch3(!0);var supplier_name2=external_exports2.enum(["jlcpcb","macrofab","pcbway","digikey","mouser","lcsc"]);expectTypesMatch3(!0);var source_component_base2=external_exports2.object({type:external_exports2.literal("source_component"),ftype:external_exports2.string().optional(),source_component_id:external_exports2.string(),name:external_exports2.string(),manufacturer_part_number:external_exports2.string().optional(),supplier_part_numbers:external_exports2.record(supplier_name2,external_exports2.array(external_exports2.string())).optional(),display_value:external_exports2.string().optional(),display_name:external_exports2.string().optional(),are_pins_interchangeable:external_exports2.boolean().optional(),internally_connected_source_port_ids:external_exports2.array(external_exports2.array(external_exports2.string())).optional(),source_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_capacitor2=source_component_base2.extend({ftype:external_exports2.literal("simple_capacitor"),capacitance:capacitance2,max_voltage_rating:voltage2.optional(),display_capacitance:external_exports2.string().optional(),max_decoupling_trace_length:distance7.optional()});expectTypesMatch3(!0);var source_simple_resistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_resistor"),resistance:resistance2,display_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_diode2=source_component_base2.extend({ftype:external_exports2.literal("simple_diode")});expectTypesMatch3(!0);var source_simple_fiducial2=source_component_base2.extend({ftype:external_exports2.literal("simple_fiducial")});expectTypesMatch3(!0);var source_simple_led2=source_simple_diode2.extend({ftype:external_exports2.literal("simple_led"),color:external_exports2.string().optional(),wavelength:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_ground2=source_component_base2.extend({ftype:external_exports2.literal("simple_ground")});expectTypesMatch3(!0);var source_simple_chip2=source_component_base2.extend({ftype:external_exports2.literal("simple_chip")});expectTypesMatch3(!0);var source_simple_power_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_power_source"),voltage:voltage2});expectTypesMatch3(!0);var source_simple_current_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_current_source"),current:current2,frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:external_exports2.enum(["sine","square","triangle","sawtooth","dc"]).optional().default("dc"),phase:external_exports2.number().optional(),duty_cycle:external_exports2.number().min(0).max(1).optional()});expectTypesMatch3(!0);var source_simple_fuse2=source_component_base2.extend({ftype:external_exports2.literal("simple_fuse"),current_rating_amps:external_exports2.number().describe("Nominal current in amps the fuse is rated for"),voltage_rating_volts:external_exports2.number().describe("Voltage rating in volts, e.g. \xB15V would be 5")});expectTypesMatch3(!0);var source_simple_ammeter2=source_component_base2.extend({ftype:external_exports2.literal("simple_ammeter")});expectTypesMatch3(!0);var source_pin_attributes2=external_exports2.object({must_be_connected:external_exports2.boolean().optional(),provides_power:external_exports2.boolean().optional(),requires_power:external_exports2.boolean().optional(),provides_ground:external_exports2.boolean().optional(),requires_ground:external_exports2.boolean().optional(),provides_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),requires_voltage:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),do_not_connect:external_exports2.boolean().optional(),include_in_board_pinout:external_exports2.boolean().optional(),can_use_internal_pullup:external_exports2.boolean().optional(),is_using_internal_pullup:external_exports2.boolean().optional(),needs_external_pullup:external_exports2.boolean().optional(),can_use_internal_pulldown:external_exports2.boolean().optional(),is_using_internal_pulldown:external_exports2.boolean().optional(),needs_external_pulldown:external_exports2.boolean().optional(),can_use_open_drain:external_exports2.boolean().optional(),is_using_open_drain:external_exports2.boolean().optional(),can_use_push_pull:external_exports2.boolean().optional(),is_using_push_pull:external_exports2.boolean().optional(),should_have_decoupling_capacitor:external_exports2.boolean().optional(),recommended_decoupling_capacitor_capacitance:external_exports2.union([external_exports2.string(),external_exports2.number()]).optional(),is_configured_for_i2c_sda:external_exports2.boolean().optional(),is_configured_for_i2c_scl:external_exports2.boolean().optional(),is_configured_for_spi_mosi:external_exports2.boolean().optional(),is_configured_for_spi_miso:external_exports2.boolean().optional(),is_configured_for_spi_sck:external_exports2.boolean().optional(),is_configured_for_spi_cs:external_exports2.boolean().optional(),is_configured_for_uart_tx:external_exports2.boolean().optional(),is_configured_for_uart_rx:external_exports2.boolean().optional(),supports_i2c_sda:external_exports2.boolean().optional(),supports_i2c_scl:external_exports2.boolean().optional(),supports_spi_mosi:external_exports2.boolean().optional(),supports_spi_miso:external_exports2.boolean().optional(),supports_spi_sck:external_exports2.boolean().optional(),supports_spi_cs:external_exports2.boolean().optional(),supports_uart_tx:external_exports2.boolean().optional(),supports_uart_rx:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_simple_battery2=source_component_base2.extend({ftype:external_exports2.literal("simple_battery"),capacity:battery_capacity2});expectTypesMatch3(!0);var source_simple_inductor2=source_component_base2.extend({ftype:external_exports2.literal("simple_inductor"),inductance:inductance2,display_inductance:external_exports2.string().optional(),max_current_rating:external_exports2.number().optional()});expectTypesMatch3(!0);var source_simple_push_button2=source_component_base2.extend({ftype:external_exports2.literal("simple_push_button")});expectTypesMatch3(!0);var source_simple_potentiometer2=source_component_base2.extend({ftype:external_exports2.literal("simple_potentiometer"),max_resistance:resistance2,display_max_resistance:external_exports2.string().optional()});expectTypesMatch3(!0);var source_simple_crystal2=source_component_base2.extend({ftype:external_exports2.literal("simple_crystal"),frequency:external_exports2.number().describe("Frequency in Hz"),load_capacitance:external_exports2.number().optional().describe("Load capacitance in pF"),pin_variant:external_exports2.enum(["two_pin","four_pin"]).optional()});expectTypesMatch3(!0);var source_simple_pin_header2=source_component_base2.extend({ftype:external_exports2.literal("simple_pin_header"),pin_count:external_exports2.number(),gender:external_exports2.enum(["male","female"]).optional().default("male")});expectTypesMatch3(!0);var source_simple_connector2=source_component_base2.extend({ftype:external_exports2.literal("simple_connector"),standard:external_exports2.enum(["usb_c","m2"]).optional()});expectTypesMatch3(!0);var source_simple_pinout2=source_component_base2.extend({ftype:external_exports2.literal("simple_pinout")});expectTypesMatch3(!0);var source_simple_resonator2=source_component_base2.extend({ftype:external_exports2.literal("simple_resonator"),load_capacitance:capacitance2,equivalent_series_resistance:resistance2.optional(),frequency:frequency2});expectTypesMatch3(!0);var source_simple_transistor2=source_component_base2.extend({ftype:external_exports2.literal("simple_transistor"),transistor_type:external_exports2.enum(["npn","pnp"])});expectTypesMatch3(!0);var source_simple_test_point2=source_component_base2.extend({ftype:external_exports2.literal("simple_test_point"),footprint_variant:external_exports2.enum(["pad","through_hole"]).optional(),pad_shape:external_exports2.enum(["rect","circle"]).optional(),pad_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),hole_diameter:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),width:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),height:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional()});expectTypesMatch3(!0);var source_simple_mosfet2=source_component_base2.extend({ftype:external_exports2.literal("simple_mosfet"),channel_type:external_exports2.enum(["n","p"]),mosfet_mode:external_exports2.enum(["enhancement","depletion"])});expectTypesMatch3(!0);var source_simple_op_amp2=source_component_base2.extend({ftype:external_exports2.literal("simple_op_amp")});expectTypesMatch3(!0);var source_simple_switch2=source_component_base2.extend({ftype:external_exports2.literal("simple_switch")});expectTypesMatch3(!0);var source_project_metadata2=external_exports2.object({type:external_exports2.literal("source_project_metadata"),name:external_exports2.string().optional(),software_used_string:external_exports2.string().optional(),project_url:external_exports2.string().optional(),created_at:timestamp2.optional()});expectTypesMatch3(!0);var source_missing_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_missing_property_error"),source_missing_property_error_id:getZodPrefixedIdWithDefault2("source_missing_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_missing_property_error").default("source_missing_property_error")}).describe("The source code is missing a property");expectTypesMatch3(!0);var source_failed_to_create_component_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_failed_to_create_component_error"),source_failed_to_create_component_error_id:getZodPrefixedIdWithDefault2("source_failed_to_create_component_error"),error_type:external_exports2.literal("source_failed_to_create_component_error").default("source_failed_to_create_component_error"),component_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),parent_source_component_id:external_exports2.string().optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),schematic_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional()}).describe("Error emitted when a component fails to be constructed");expectTypesMatch3(!0);var source_invalid_component_property_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_invalid_component_property_error"),source_invalid_component_property_error_id:getZodPrefixedIdWithDefault2("source_invalid_component_property_error"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),property_value:external_exports2.unknown().optional(),expected_format:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_invalid_component_property_error").default("source_invalid_component_property_error")}).describe("The source component property is invalid");expectTypesMatch3(!0);var source_trace_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_trace_not_connected_error"),source_trace_not_connected_error_id:getZodPrefixedIdWithDefault2("source_trace_not_connected_error"),error_type:external_exports2.literal("source_trace_not_connected_error").default("source_trace_not_connected_error"),subcircuit_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),connected_source_port_ids:external_exports2.array(external_exports2.string()).optional(),selectors_not_found:external_exports2.array(external_exports2.string()).optional()}).describe("Occurs when a source trace selector does not match any ports");expectTypesMatch3(!0);var source_property_ignored_warning2=external_exports2.object({type:external_exports2.literal("source_property_ignored_warning"),source_property_ignored_warning_id:getZodPrefixedIdWithDefault2("source_property_ignored_warning"),source_component_id:external_exports2.string(),property_name:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("source_property_ignored_warning").default("source_property_ignored_warning"),message:external_exports2.string()}).describe("The source property was ignored");expectTypesMatch3(!0);var source_pin_missing_trace_warning2=external_exports2.object({type:external_exports2.literal("source_pin_missing_trace_warning"),source_pin_missing_trace_warning_id:getZodPrefixedIdWithDefault2("source_pin_missing_trace_warning"),warning_type:external_exports2.literal("source_pin_missing_trace_warning").default("source_pin_missing_trace_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source component pin is missing a trace connection");expectTypesMatch3(!0);var source_missing_manufacturer_part_number_warning2=external_exports2.object({type:external_exports2.literal("source_missing_manufacturer_part_number_warning"),source_missing_manufacturer_part_number_warning_id:getZodPrefixedIdWithDefault2("source_missing_manufacturer_part_number_warning"),warning_type:external_exports2.literal("source_missing_manufacturer_part_number_warning").default("source_missing_manufacturer_part_number_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),standard:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a standard connector is missing manufacturer part number");expectTypesMatch3(!0);var source_refdes_convention_warning2=external_exports2.object({type:external_exports2.literal("source_refdes_convention_warning"),source_refdes_convention_warning_id:getZodPrefixedIdWithDefault2("source_refdes_convention_warning"),warning_type:external_exports2.literal("source_refdes_convention_warning").default("source_refdes_convention_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),refdes:external_exports2.string(),source_component_ftype:external_exports2.string(),expected_prefixes:external_exports2.array(external_exports2.string()),actual_prefix:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source component reference designator does not match the component type convention");expectTypesMatch3(!0);var source_simple_voltage_probe2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_probe")});expectTypesMatch3(!0);var source_interconnect2=source_component_base2.extend({ftype:external_exports2.literal("interconnect")});expectTypesMatch3(!0);var source_i2c_misconfigured_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_i2c_misconfigured_error"),source_i2c_misconfigured_error_id:getZodPrefixedIdWithDefault2("source_i2c_misconfigured_error"),error_type:external_exports2.literal("source_i2c_misconfigured_error").default("source_i2c_misconfigured_error"),source_port_ids:external_exports2.array(external_exports2.string())}).describe("Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net");expectTypesMatch3(!0);var source_component_misconfigured_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_component_misconfigured_error"),source_component_misconfigured_error_id:getZodPrefixedIdWithDefault2("source_component_misconfigured_error"),error_type:external_exports2.literal("source_component_misconfigured_error").default("source_component_misconfigured_error"),source_component_ids:external_exports2.array(external_exports2.string()),source_port_ids:external_exports2.array(external_exports2.string()).optional()}).describe("Error emitted when one or more source components have an invalid or conflicting configuration");expectTypesMatch3(!0);var source_simple_voltage_source2=source_component_base2.extend({ftype:external_exports2.literal("simple_voltage_source"),voltage:voltage2,frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:external_exports2.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation4.optional(),duty_cycle:external_exports2.number().optional().describe("Duty cycle as a fraction (0 to 1)"),pulse_delay:ms4.optional(),rise_time:ms4.optional(),fall_time:ms4.optional(),pulse_width:ms4.optional(),period:ms4.optional()});expectTypesMatch3(!0);var any_source_component2=external_exports2.union([source_simple_resistor2,source_simple_capacitor2,source_simple_diode2,source_simple_fiducial2,source_simple_led2,source_simple_ground2,source_simple_chip2,source_simple_power_source2,source_simple_current_source2,source_simple_ammeter2,source_simple_battery2,source_simple_inductor2,source_simple_push_button2,source_simple_potentiometer2,source_simple_crystal2,source_simple_pin_header2,source_simple_connector2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_fuse2,source_simple_voltage_probe2,source_interconnect2,source_simple_voltage_source2,source_project_metadata2,source_missing_property_error2,source_invalid_component_property_error2,source_failed_to_create_component_error2,source_trace_not_connected_error2,source_property_ignored_warning2,source_pin_missing_trace_warning2,source_missing_manufacturer_part_number_warning2,source_refdes_convention_warning2,source_i2c_misconfigured_error2,source_component_misconfigured_error2]);expectTypesMatch3(!0);var source_port2=external_exports2.object({type:external_exports2.literal("source_port"),pin_number:external_exports2.number().optional(),port_hints:external_exports2.array(external_exports2.string()).optional(),name:external_exports2.string(),source_port_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),source_group_id:external_exports2.string().optional(),most_frequently_referenced_by_name:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()}).merge(source_pin_attributes2);expectTypesMatch3(!0);var source_component_internal_connection2=external_exports2.object({type:external_exports2.literal("source_component_internal_connection"),source_component_internal_connection_id:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var source_trace2=external_exports2.object({type:external_exports2.literal("source_trace"),source_trace_id:external_exports2.string(),connected_source_port_ids:external_exports2.array(external_exports2.string()),connected_source_net_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),max_length:external_exports2.number().optional(),name:external_exports2.string().optional(),min_trace_thickness:external_exports2.number().optional(),display_name:external_exports2.string().optional()});expectTypesMatch3(!0);var source_group2=external_exports2.object({type:external_exports2.literal("source_group"),source_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),parent_subcircuit_id:external_exports2.string().optional(),parent_source_group_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),was_automatically_named:external_exports2.boolean().optional()});expectTypesMatch3(!0);var source_net2=external_exports2.object({type:external_exports2.literal("source_net"),source_net_id:external_exports2.string(),name:external_exports2.string(),member_source_group_ids:external_exports2.array(external_exports2.string()),is_power:external_exports2.boolean().optional(),is_ground:external_exports2.boolean().optional(),is_digital_signal:external_exports2.boolean().optional(),is_analog_signal:external_exports2.boolean().optional(),is_positive_voltage_source:external_exports2.boolean().optional(),trace_width:external_exports2.number().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var source_board2=external_exports2.object({type:external_exports2.literal("source_board"),source_board_id:external_exports2.string(),source_group_id:external_exports2.string(),title:external_exports2.string().optional()}).describe("Defines a board in the source domain");expectTypesMatch3(!0);var source_ambiguous_port_reference2=base_circuit_json_error2.extend({type:external_exports2.literal("source_ambiguous_port_reference"),source_ambiguous_port_reference_id:getZodPrefixedIdWithDefault2("source_ambiguous_port_reference"),error_type:external_exports2.literal("source_ambiguous_port_reference").default("source_ambiguous_port_reference"),source_port_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous");expectTypesMatch3(!0);var source_pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("source_pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane in the source domain");expectTypesMatch3(!0);var all_layers2=["top","bottom","inner1","inner2","inner3","inner4","inner5","inner6"],layer_string2=external_exports2.enum(all_layers2),layer_ref2=layer_string2.or(external_exports2.object({name:layer_string2})).transform(layer=>typeof layer=="string"?layer:layer.name);expectTypesMatch3(!0);var visible_layer2=external_exports2.enum(["top","bottom"]),source_manually_placed_via2=external_exports2.object({type:external_exports2.literal("source_manually_placed_via"),source_manually_placed_via_id:external_exports2.string(),source_group_id:external_exports2.string(),source_net_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional()}).describe("Defines a via that is manually placed in the source domain");expectTypesMatch3(!0);var source_unnamed_trace_warning2=external_exports2.object({type:external_exports2.literal("source_unnamed_trace_warning"),source_unnamed_trace_warning_id:getZodPrefixedIdWithDefault2("source_unnamed_trace_warning"),warning_type:external_exports2.literal("source_unnamed_trace_warning").default("source_unnamed_trace_warning"),message:external_exports2.string(),source_trace_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a source trace is missing a name");expectTypesMatch3(!0);var source_no_power_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_power_pin_defined_warning"),source_no_power_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_power_pin_defined_warning"),warning_type:external_exports2.literal("source_no_power_pin_defined_warning").default("source_no_power_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports with requires_power=true");expectTypesMatch3(!0);var source_no_ground_pin_defined_warning2=external_exports2.object({type:external_exports2.literal("source_no_ground_pin_defined_warning"),source_no_ground_pin_defined_warning_id:getZodPrefixedIdWithDefault2("source_no_ground_pin_defined_warning"),warning_type:external_exports2.literal("source_no_ground_pin_defined_warning").default("source_no_ground_pin_defined_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a chip has no source ports marked as ground pins");expectTypesMatch3(!0);var source_component_pins_underspecified_warning2=external_exports2.object({type:external_exports2.literal("source_component_pins_underspecified_warning"),source_component_pins_underspecified_warning_id:getZodPrefixedIdWithDefault2("source_component_pins_underspecified_warning"),warning_type:external_exports2.literal("source_component_pins_underspecified_warning").default("source_component_pins_underspecified_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),source_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when all ports on a source component are underspecified");expectTypesMatch3(!0);var source_pin_must_be_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("source_pin_must_be_connected_error"),source_pin_must_be_connected_error_id:getZodPrefixedIdWithDefault2("source_pin_must_be_connected_error"),error_type:external_exports2.literal("source_pin_must_be_connected_error").default("source_pin_must_be_connected_error"),source_component_id:external_exports2.string(),source_port_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a pin with mustBeConnected attribute is not connected to any trace");expectTypesMatch3(!0);var unknown_error_finding_part2=base_circuit_json_error2.extend({type:external_exports2.literal("unknown_error_finding_part"),unknown_error_finding_part_id:getZodPrefixedIdWithDefault2("unknown_error_finding_part"),error_type:external_exports2.literal("unknown_error_finding_part").default("unknown_error_finding_part"),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when an unexpected error occurs while finding a part");expectTypesMatch3(!0);var source_part_not_found_warning2=external_exports2.object({type:external_exports2.literal("source_part_not_found_warning"),source_part_not_found_warning_id:getZodPrefixedIdWithDefault2("source_part_not_found_warning"),warning_type:external_exports2.literal("source_part_not_found_warning").default("source_part_not_found_warning"),message:external_exports2.string(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),supplier_name:supplier_name2.optional(),manufacturer_part_number:external_exports2.string().optional(),supplier_part_number:external_exports2.string().optional(),part_name:external_exports2.string().optional()}).describe("Warning emitted when a requested part can not be found");expectTypesMatch3(!0);var schematic_box2=external_exports2.object({type:external_exports2.literal("schematic_box"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),width:distance7,height:distance7,is_dashed:external_exports2.boolean().default(!1),x:distance7,y:distance7,subcircuit_id:external_exports2.string().optional()}).describe("Draws a box on the schematic");expectTypesMatch3(!0);var schematic_path2=external_exports2.object({type:external_exports2.literal("schematic_path"),schematic_path_id:getZodPrefixedIdWithDefault2("schematic_path"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),fill_color:external_exports2.string().optional(),is_filled:external_exports2.boolean().optional(),is_dashed:external_exports2.boolean().default(!1),stroke_width:distance7.nullable().optional(),stroke_color:external_exports2.string().optional(),dash_length:distance7.optional(),dash_gap:distance7.optional(),points:external_exports2.array(point5),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_pin_styles2=external_exports2.record(external_exports2.object({left_margin:length3.optional(),right_margin:length3.optional(),top_margin:length3.optional(),bottom_margin:length3.optional()})),schematic_component_port_arrangement_by_size2=external_exports2.object({left_size:external_exports2.number(),right_size:external_exports2.number(),top_size:external_exports2.number().optional(),bottom_size:external_exports2.number().optional()});expectTypesMatch3(!0);var schematic_component_port_arrangement_by_sides2=external_exports2.object({left_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),right_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["top-to-bottom","bottom-to-top"]).optional()}).optional(),top_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional(),bottom_side:external_exports2.object({pins:external_exports2.array(external_exports2.number()),direction:external_exports2.enum(["left-to-right","right-to-left"]).optional()}).optional()});expectTypesMatch3(!0);var port_arrangement2=external_exports2.union([schematic_component_port_arrangement_by_size2,schematic_component_port_arrangement_by_sides2]),schematic_component2=external_exports2.object({type:external_exports2.literal("schematic_component"),size:size2,center:point5,source_component_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string(),schematic_sheet_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),pin_spacing:length3.optional(),pin_styles:schematic_pin_styles2.optional(),box_width:length3.optional(),symbol_name:external_exports2.string().optional(),port_arrangement:port_arrangement2.optional(),port_labels:external_exports2.record(external_exports2.string()).optional(),symbol_display_value:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),schematic_group_id:external_exports2.string().optional(),is_schematic_group:external_exports2.boolean().optional(),source_group_id:external_exports2.string().optional(),is_box_with_pins:external_exports2.boolean().optional().default(!0)});expectTypesMatch3(!0);var schematicSymbolMetadata2=external_exports2.object({kicad_symbol:kicadSymbolMetadata3.optional()}).catchall(external_exports2.unknown()),schematic_symbol2=external_exports2.object({type:external_exports2.literal("schematic_symbol"),schematic_symbol_id:external_exports2.string(),name:external_exports2.string().optional(),metadata:schematicSymbolMetadata2.optional()}).describe("Defines a named schematic symbol that can be referenced by components.");expectTypesMatch3(!0);var schematic_line2=external_exports2.object({type:external_exports2.literal("schematic_line"),schematic_line_id:getZodPrefixedIdWithDefault2("schematic_line"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),dash_length:distance7.optional(),dash_gap:distance7.optional(),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled line on the schematic");expectTypesMatch3(!0);var schematic_rect2=external_exports2.object({type:external_exports2.literal("schematic_rect"),schematic_rect_id:getZodPrefixedIdWithDefault2("schematic_rect"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,rotation:rotation4.default(0),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled rectangle on the schematic");expectTypesMatch3(!0);var schematic_circle2=external_exports2.object({type:external_exports2.literal("schematic_circle"),schematic_circle_id:getZodPrefixedIdWithDefault2("schematic_circle"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_filled:external_exports2.boolean().default(!1),fill_color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled circle on the schematic");expectTypesMatch3(!0);var schematic_arc2=external_exports2.object({type:external_exports2.literal("schematic_arc"),schematic_arc_id:getZodPrefixedIdWithDefault2("schematic_arc"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),center:point5,radius:distance7,start_angle_degrees:rotation4,end_angle_degrees:rotation4,direction:external_exports2.enum(["clockwise","counterclockwise"]).default("counterclockwise"),stroke_width:distance7.nullable().optional(),color:external_exports2.string().default("#000000"),is_dashed:external_exports2.boolean().default(!1),subcircuit_id:external_exports2.string().optional()}).describe("Draws a styled arc on the schematic");expectTypesMatch3(!0);var schematic_trace2=external_exports2.object({type:external_exports2.literal("schematic_trace"),schematic_trace_id:external_exports2.string(),schematic_sheet_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),junctions:external_exports2.array(external_exports2.object({x:external_exports2.number(),y:external_exports2.number()})),edges:external_exports2.array(external_exports2.object({from:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),to:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}),is_crossing:external_exports2.boolean().optional(),from_schematic_port_id:external_exports2.string().optional(),to_schematic_port_id:external_exports2.string().optional()})),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional()});expectTypesMatch3(!0);var fivePointAnchor3=external_exports2.enum(["center","left","right","top","bottom"]);expectTypesMatch3(!0);var schematic_text2=external_exports2.object({type:external_exports2.literal("schematic_text"),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),schematic_symbol_id:external_exports2.string().optional(),schematic_text_id:external_exports2.string(),text:external_exports2.string(),font_size:external_exports2.number().default(.18),position:external_exports2.object({x:distance7,y:distance7}),rotation:external_exports2.number().default(0),anchor:external_exports2.union([fivePointAnchor3.describe("legacy"),ninePointAnchor3]).default("center"),color:external_exports2.string().default("#000000"),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_port2=external_exports2.object({type:external_exports2.literal("schematic_port"),schematic_port_id:external_exports2.string(),source_port_id:external_exports2.string(),schematic_sheet_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),center:point5,facing_direction:external_exports2.enum(["up","down","left","right"]).optional(),distance_from_component_edge:external_exports2.number().optional(),side_of_component:external_exports2.enum(["top","bottom","left","right"]).optional(),true_ccw_index:external_exports2.number().optional(),pin_number:external_exports2.number().optional(),display_pin_label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),is_connected:external_exports2.boolean().optional(),has_input_arrow:external_exports2.boolean().optional(),has_output_arrow:external_exports2.boolean().optional(),is_drawn_with_inversion_circle:external_exports2.boolean().optional()}).describe("Defines a port on a schematic component");expectTypesMatch3(!0);var schematic_net_label2=external_exports2.object({type:external_exports2.literal("schematic_net_label"),schematic_net_label_id:getZodPrefixedIdWithDefault2("schematic_net_label"),schematic_sheet_id:external_exports2.string().optional(),schematic_trace_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_net_id:external_exports2.string(),center:point5,anchor_position:point5.optional(),anchor_side:external_exports2.enum(["top","bottom","left","right"]),text:external_exports2.string(),symbol_name:external_exports2.string().optional(),is_movable:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional()});expectTypesMatch3(!0);var schematic_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_error"),schematic_error_id:external_exports2.string(),error_type:external_exports2.literal("schematic_port_not_found").default("schematic_port_not_found"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a schematic error on the schematic");expectTypesMatch3(!0);var schematic_layout_error2=base_circuit_json_error2.extend({type:external_exports2.literal("schematic_layout_error"),schematic_layout_error_id:getZodPrefixedIdWithDefault2("schematic_layout_error"),error_type:external_exports2.literal("schematic_layout_error").default("schematic_layout_error"),source_group_id:external_exports2.string(),schematic_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when schematic layout fails for a group");expectTypesMatch3(!0);var schematic_debug_object_base2=external_exports2.object({type:external_exports2.literal("schematic_debug_object"),label:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}),schematic_debug_rect2=schematic_debug_object_base2.extend({shape:external_exports2.literal("rect"),center:point5,size:size2}),schematic_debug_line2=schematic_debug_object_base2.extend({shape:external_exports2.literal("line"),start:point5,end:point5}),schematic_debug_point2=schematic_debug_object_base2.extend({shape:external_exports2.literal("point"),center:point5}),schematic_debug_object2=external_exports2.discriminatedUnion("shape",[schematic_debug_rect2,schematic_debug_line2,schematic_debug_point2]);expectTypesMatch3(!0);var schematic_voltage_probe2=external_exports2.object({type:external_exports2.literal("schematic_voltage_probe"),schematic_voltage_probe_id:external_exports2.string(),schematic_sheet_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),position:point5,schematic_trace_id:external_exports2.string(),voltage:voltage2.optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional(),label_alignment:ninePointAnchor3.optional()}).describe("Defines a voltage probe measurement point on a schematic trace");expectTypesMatch3(!0);var schematic_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("schematic_manual_edit_conflict_warning"),schematic_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("schematic_manual_edit_conflict_warning"),warning_type:external_exports2.literal("schematic_manual_edit_conflict_warning").default("schematic_manual_edit_conflict_warning"),message:external_exports2.string(),schematic_component_id:external_exports2.string(),schematic_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit schX/schY coordinates");expectTypesMatch3(!0);var schematic_group2=external_exports2.object({type:external_exports2.literal("schematic_group"),schematic_group_id:getZodPrefixedIdWithDefault2("schematic_group"),schematic_sheet_id:external_exports2.string().optional(),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3,height:length3,center:point5,schematic_component_ids:external_exports2.array(external_exports2.string()),show_as_schematic_box:external_exports2.boolean().optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional()}).describe("Defines a group of components on the schematic");expectTypesMatch3(!0);var schematic_table2=external_exports2.object({type:external_exports2.literal("schematic_table"),schematic_table_id:getZodPrefixedIdWithDefault2("schematic_table"),schematic_sheet_id:external_exports2.string().optional(),anchor_position:point5,column_widths:external_exports2.array(distance7),row_heights:external_exports2.array(distance7),cell_padding:distance7.optional(),border_width:distance7.optional(),subcircuit_id:external_exports2.string().optional(),schematic_component_id:external_exports2.string().optional(),anchor:ninePointAnchor3.optional()}).describe("Defines a table on the schematic");expectTypesMatch3(!0);var schematic_table_cell2=external_exports2.object({type:external_exports2.literal("schematic_table_cell"),schematic_table_cell_id:getZodPrefixedIdWithDefault2("schematic_table_cell"),schematic_sheet_id:external_exports2.string().optional(),schematic_table_id:external_exports2.string(),start_row_index:external_exports2.number(),end_row_index:external_exports2.number(),start_column_index:external_exports2.number(),end_column_index:external_exports2.number(),text:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,horizontal_align:external_exports2.enum(["left","center","right"]).optional(),vertical_align:external_exports2.enum(["top","middle","bottom"]).optional(),font_size:distance7.optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a cell within a schematic_table");expectTypesMatch3(!0);var schematic_sheet2=external_exports2.object({type:external_exports2.literal("schematic_sheet"),schematic_sheet_id:getZodPrefixedIdWithDefault2("schematic_sheet"),name:external_exports2.string().optional(),sheet_index:external_exports2.number().optional(),subcircuit_id:external_exports2.string().optional(),outline_color:external_exports2.string().optional()}).describe("Defines a schematic sheet or page that components can be placed on");expectTypesMatch3(!0);var point_with_bulge2=external_exports2.object({x:distance7,y:distance7,bulge:external_exports2.number().optional()});expectTypesMatch3(!0);var ring2=external_exports2.object({vertices:external_exports2.array(point_with_bulge2)});expectTypesMatch3(!0);var brep_shape2=external_exports2.object({outer_ring:ring2,inner_rings:external_exports2.array(ring2).default([])});expectTypesMatch3(!0);var pcb_route_hint2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),via_to_layer:layer_ref2.optional()}),pcb_route_hints2=external_exports2.array(pcb_route_hint2);expectTypesMatch3(!0);expectTypesMatch3(!0);var route_hint_point2=external_exports2.object({x:distance7,y:distance7,via:external_exports2.boolean().optional(),to_layer:layer_ref2.optional(),trace_width:distance7.optional()});expectTypesMatch3(!0);var manufacturing_drc_properties2=external_exports2.object({min_trace_width:length3.optional(),min_board_edge_clearance:length3.optional(),min_via_hole_edge_to_via_hole_edge_clearance:length3.optional(),min_plated_hole_drill_edge_to_drill_edge_clearance:length3.optional(),min_trace_to_pad_edge_clearance:length3.optional(),min_pad_edge_to_pad_edge_clearance:length3.optional(),min_same_net_trace_edge_to_trace_edge_clearance:length3.optional(),min_different_net_trace_edge_to_trace_edge_clearance:length3.optional(),min_via_edge_to_pad_edge_clearance:length3.optional(),min_via_hole_diameter:length3.optional(),min_via_pad_diameter:length3.optional()}),pcb_component2=external_exports2.object({type:external_exports2.literal("pcb_component"),pcb_component_id:getZodPrefixedIdWithDefault2("pcb_component"),source_component_id:external_exports2.string(),center:point5,layer:layer_ref2,rotation:rotation4,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this part, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this part, usually corresponding with how the user specified it"),width:length3,height:length3,do_not_place:external_exports2.boolean().optional(),is_allowed_to_be_off_board:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","relative_to_another_component","none"]).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),cable_insertion_center:point5.optional(),insertion_direction:external_exports2.enum(["from_above","from_left","from_right","from_front","from_back"]).optional(),metadata:external_exports2.object({kicad_footprint:kicadFootprintMetadata3.optional()}).optional(),obstructs_within_bounds:external_exports2.boolean().default(!0).describe("Does this component take up all the space within its bounds on a layer. This is generally true except for when separated pin headers are being represented by a single component (in which case, chips can be placed between the pin headers) or for tall modules where chips fit underneath")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var pcb_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_shape2=pcb_hole_circle2.describe("Defines a circular hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rect2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rect_shape2=pcb_hole_rect2.describe("Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.");expectTypesMatch3(!0);var pcb_hole_circle_or_square2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","square"]),hole_diameter:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_circle_or_square_shape2=pcb_hole_circle_or_square2.describe("Defines a circular or square hole on the PCB");expectTypesMatch3(!0);var pcb_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("oval"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_oval_shape2=pcb_hole_oval2.describe("Defines an oval hole on the PCB");expectTypesMatch3(!0);var pcb_hole_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_pill_shape2=pcb_hole_pill2.describe("Defines a pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_hole"),pcb_hole_id:getZodPrefixedIdWithDefault2("pcb_hole"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),x:distance7,y:distance7,ccw_rotation:rotation4,is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_hole_rotated_pill_shape2=pcb_hole_rotated_pill2.describe("Defines a rotated pill-shaped hole on the PCB");expectTypesMatch3(!0);var pcb_hole2=pcb_hole_circle_or_square2.or(pcb_hole_oval2).or(pcb_hole_pill2).or(pcb_hole_rotated_pill2).or(pcb_hole_circle2).or(pcb_hole_rect2),pcb_plated_hole_circle2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_diameter:external_exports2.number(),hole_diameter:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_plated_hole_oval2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.enum(["oval","pill"]),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),outer_width:external_exports2.number(),outer_height:external_exports2.number(),hole_width:external_exports2.number(),hole_height:external_exports2.number(),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,ccw_rotation:rotation4,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_circular_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("circular_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("circle"),pad_shape:external_exports2.literal("rect"),hole_diameter:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),rect_ccw_rotation:rotation4.optional()}),pcb_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_rotated_pill_hole_with_rect_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("rotated_pill_hole_with_rect_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.literal("rotated_pill"),pad_shape:external_exports2.literal("rect"),hole_width:external_exports2.number(),hole_height:external_exports2.number(),hole_ccw_rotation:rotation4,rect_pad_width:external_exports2.number(),rect_pad_height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),rect_ccw_rotation:rotation4,hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional()}),pcb_hole_with_polygon_pad2=external_exports2.object({type:external_exports2.literal("pcb_plated_hole"),shape:external_exports2.literal("hole_with_polygon_pad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),hole_shape:external_exports2.enum(["circle","oval","pill","rotated_pill"]),hole_diameter:external_exports2.number().optional(),hole_width:external_exports2.number().optional(),hole_height:external_exports2.number().optional(),pad_outline:external_exports2.array(external_exports2.object({x:distance7,y:distance7})).min(3),hole_offset_x:distance7.default(0),hole_offset_y:distance7.default(0),is_covered_with_solder_mask:external_exports2.boolean().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),pcb_plated_hole_id:getZodPrefixedIdWithDefault2("pcb_plated_hole"),soldermask_margin:external_exports2.number().optional(),ccw_rotation:rotation4.optional()}),pcb_plated_hole2=external_exports2.union([pcb_plated_hole_circle2,pcb_plated_hole_oval2,pcb_circular_hole_with_rect_pad2,pcb_pill_hole_with_rect_pad2,pcb_rotated_pill_hole_with_rect_pad2,pcb_hole_with_polygon_pad2]);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_port2=external_exports2.object({type:external_exports2.literal("pcb_port"),pcb_port_id:getZodPrefixedIdWithDefault2("pcb_port"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_port_id:external_exports2.string(),pcb_component_id:external_exports2.string().optional(),x:distance7,y:distance7,layers:external_exports2.array(layer_ref2),is_board_pinout:external_exports2.boolean().optional()}).describe("Defines a port on the PCB");expectTypesMatch3(!0);var pcb_smtpad_circle2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("circle"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_rect"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),rect_border_radius:external_exports2.number().optional(),corner_radius:external_exports2.number().optional(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional(),soldermask_margin_left:external_exports2.number().optional(),soldermask_margin_top:external_exports2.number().optional(),soldermask_margin_right:external_exports2.number().optional(),soldermask_margin_bottom:external_exports2.number().optional()}),pcb_smtpad_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_rotated_pill2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("rotated_pill"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),ccw_rotation:rotation4,layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad_polygon2=external_exports2.object({type:external_exports2.literal("pcb_smtpad"),shape:external_exports2.literal("polygon"),pcb_smtpad_id:getZodPrefixedIdWithDefault2("pcb_smtpad"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),points:external_exports2.array(point5),layer:layer_ref2,port_hints:external_exports2.array(external_exports2.string()).optional(),pcb_component_id:external_exports2.string().optional(),pcb_port_id:external_exports2.string().optional(),is_covered_with_solder_mask:external_exports2.boolean().optional(),soldermask_margin:external_exports2.number().optional()}),pcb_smtpad2=external_exports2.discriminatedUnion("shape",[pcb_smtpad_circle2,pcb_smtpad_rect2,pcb_smtpad_rotated_rect2,pcb_smtpad_rotated_pill2,pcb_smtpad_pill2,pcb_smtpad_polygon2]).describe("Defines an SMT pad on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_solder_paste_circle2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("circle"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_pill2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("pill"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),radius:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_rotated_rect2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("rotated_rect"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),ccw_rotation:distance7,layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste_oval2=external_exports2.object({type:external_exports2.literal("pcb_solder_paste"),shape:external_exports2.literal("oval"),pcb_solder_paste_id:getZodPrefixedIdWithDefault2("pcb_solder_paste"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),x:distance7,y:distance7,width:external_exports2.number(),height:external_exports2.number(),layer:layer_ref2,pcb_component_id:external_exports2.string().optional(),pcb_smtpad_id:external_exports2.string().optional()}),pcb_solder_paste2=external_exports2.union([pcb_solder_paste_circle2,pcb_solder_paste_rect2,pcb_solder_paste_pill2,pcb_solder_paste_rotated_rect2,pcb_solder_paste_oval2]).describe("Defines solderpaste on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_text2=external_exports2.object({type:external_exports2.literal("pcb_text"),pcb_text_id:getZodPrefixedIdWithDefault2("pcb_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),text:external_exports2.string(),center:point5,layer:layer_ref2,width:length3,height:length3,lines:external_exports2.number(),align:external_exports2.enum(["bottom-left"])}).describe("Defines text on the PCB");expectTypesMatch3(!0);var pcb_trace_route_point_wire2=external_exports2.object({route_type:external_exports2.literal("wire"),x:distance7,y:distance7,width:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),start_pcb_port_id:external_exports2.string().optional(),end_pcb_port_id:external_exports2.string().optional(),layer:layer_ref2}),pcb_trace_route_point_via2=external_exports2.object({route_type:external_exports2.literal("via"),x:distance7,y:distance7,copper_pour_id:external_exports2.string().optional(),is_inside_copper_pour:external_exports2.boolean().optional(),hole_diameter:distance7.optional(),outer_diameter:distance7.optional(),from_layer:layer_ref2,to_layer:layer_ref2}),pcb_trace_route_point_through_pad2=external_exports2.object({route_type:external_exports2.literal("through_pad"),start:point5,end:point5,width:distance7,start_layer:layer_ref2,end_layer:layer_ref2,pcb_smtpad_id:external_exports2.string().optional(),pcb_plated_hole_id:external_exports2.string().optional()}),pcb_trace_route_point2=external_exports2.union([pcb_trace_route_point_wire2,pcb_trace_route_point_via2,pcb_trace_route_point_through_pad2]),pcb_trace2=external_exports2.object({type:external_exports2.literal("pcb_trace"),source_trace_id:external_exports2.string().optional(),pcb_component_id:external_exports2.string().optional(),pcb_trace_id:getZodPrefixedIdWithDefault2("pcb_trace"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),route_thickness_mode:external_exports2.enum(["constant","interpolated"]).default("constant").optional(),route_order_index:external_exports2.number().optional(),should_round_corners:external_exports2.boolean().optional(),trace_length:external_exports2.number().optional(),highlight_color:external_exports2.string().optional(),route:external_exports2.array(pcb_trace_route_point2)}).describe("Defines a trace on the PCB");expectTypesMatch3(!0);expectTypesMatch3(!0);var pcb_trace_warning2=external_exports2.object({type:external_exports2.literal("pcb_trace_warning"),pcb_trace_warning_id:getZodPrefixedIdWithDefault2("pcb_trace_warning"),warning_type:external_exports2.literal("pcb_trace_warning").default("pcb_trace_warning"),message:external_exports2.string(),center:point5.optional(),pcb_trace_id:external_exports2.string(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace warning on the PCB");expectTypesMatch3(!0);var pcb_trace_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_error"),pcb_trace_error_id:getZodPrefixedIdWithDefault2("pcb_trace_error"),error_type:external_exports2.literal("pcb_trace_error").default("pcb_trace_error"),center:point5.optional(),pcb_trace_id:external_exports2.string(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB");expectTypesMatch3(!0);var pcb_trace_missing_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_trace_missing_error"),pcb_trace_missing_error_id:getZodPrefixedIdWithDefault2("pcb_trace_missing_error"),error_type:external_exports2.literal("pcb_trace_missing_error").default("pcb_trace_missing_error"),center:point5.optional(),source_trace_id:external_exports2.string(),pcb_component_ids:external_exports2.array(external_exports2.string()),pcb_port_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a source trace has no corresponding PCB trace");expectTypesMatch3(!0);var pcb_port_not_matched_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_matched_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_port_not_matched_error").default("pcb_port_not_matched_error"),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines a trace error on the PCB where a port is not matched");expectTypesMatch3(!0);var pcb_port_not_connected_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_port_not_connected_error"),pcb_port_not_connected_error_id:getZodPrefixedIdWithDefault2("pcb_port_not_connected_error"),error_type:external_exports2.literal("pcb_port_not_connected_error").default("pcb_port_not_connected_error"),pcb_port_ids:external_exports2.array(external_exports2.string()),pcb_component_ids:external_exports2.array(external_exports2.string()),subcircuit_id:external_exports2.string().optional()}).describe("Defines an error when a pcb port is not connected to any trace");expectTypesMatch3(!0);var pcb_net2=external_exports2.object({type:external_exports2.literal("pcb_net"),pcb_net_id:getZodPrefixedIdWithDefault2("pcb_net"),source_net_id:external_exports2.string().optional(),highlight_color:external_exports2.string().optional()}).describe("Defines a net on the PCB");expectTypesMatch3(!0);var pcb_via2=external_exports2.object({type:external_exports2.literal("pcb_via"),pcb_via_id:getZodPrefixedIdWithDefault2("pcb_via"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),x:distance7,y:distance7,outer_diameter:distance7.default("0.6mm"),hole_diameter:distance7.default("0.25mm"),from_layer:layer_ref2.optional(),to_layer:layer_ref2.optional(),layers:external_exports2.array(layer_ref2),pcb_trace_id:external_exports2.string().optional(),net_is_assignable:external_exports2.boolean().optional(),net_assigned:external_exports2.boolean().optional(),is_tented:external_exports2.boolean().optional()}).describe("Defines a via on the PCB");expectTypesMatch3(!0);var pcb_board2=external_exports2.object({type:external_exports2.literal("pcb_board"),pcb_board_id:getZodPrefixedIdWithDefault2("pcb_board"),pcb_panel_id:external_exports2.string().optional(),carrier_pcb_board_id:external_exports2.string().optional(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),is_mounted_to_carrier_board:external_exports2.boolean().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this board, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this board, usually corresponding with how the user specified it"),thickness:length3.optional().default(1.4),num_layers:external_exports2.number().optional().default(4),outline:external_exports2.array(point5).optional(),shape:external_exports2.enum(["rect","polygon"]).optional(),material:external_exports2.enum(["fr4","fr1"]).default("fr4"),solder_mask_color:external_exports2.string().optional(),silkscreen_color:external_exports2.string().optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.optional(),position_mode:external_exports2.enum(["relative_to_panel_anchor","none"]).optional()}).merge(manufacturing_drc_properties2).describe("Defines the board outline of the PCB");expectTypesMatch3(!0);var pcb_panel2=external_exports2.object({type:external_exports2.literal("pcb_panel"),pcb_panel_id:getZodPrefixedIdWithDefault2("pcb_panel"),width:length3,height:length3,center:point5,thickness:length3.optional().default(1.4),covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}).describe("Defines a PCB panel that can contain multiple boards");expectTypesMatch3(!0);var pcb_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_placement_error"),pcb_placement_error_id:getZodPrefixedIdWithDefault2("pcb_placement_error"),error_type:external_exports2.literal("pcb_placement_error").default("pcb_placement_error"),subcircuit_id:external_exports2.string().optional()}).describe("Defines a placement error on the PCB");expectTypesMatch3(!0);var pcb_panelization_placement_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_panelization_placement_error"),pcb_panelization_placement_error_id:getZodPrefixedIdWithDefault2("pcb_panelization_placement_error"),error_type:external_exports2.literal("pcb_panelization_placement_error").default("pcb_panelization_placement_error"),pcb_panel_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a panelization placement error on the PCB");expectTypesMatch3(!0);var pcb_trace_hint2=external_exports2.object({type:external_exports2.literal("pcb_trace_hint"),pcb_trace_hint_id:getZodPrefixedIdWithDefault2("pcb_trace_hint"),pcb_port_id:external_exports2.string(),pcb_component_id:external_exports2.string(),route:external_exports2.array(route_hint_point2),subcircuit_id:external_exports2.string().optional()}).describe("A hint that can be used during generation of a PCB trace");expectTypesMatch3(!0);var pcb_silkscreen_line2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_line"),pcb_silkscreen_line_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_line"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),stroke_width:distance7.default("0.1mm"),x1:distance7,y1:distance7,x2:distance7,y2:distance7,layer:visible_layer2}).describe("Defines a silkscreen line on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_path2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_path"),pcb_silkscreen_path_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_path"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,route:external_exports2.array(point5),stroke_width:length3}).describe("Defines a silkscreen path on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_text2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_text"),pcb_silkscreen_text_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines silkscreen text on the PCB");expectTypesMatch3(!0);var pcb_copper_text2=external_exports2.object({type:external_exports2.literal("pcb_copper_text"),pcb_copper_text_id:getZodPrefixedIdWithDefault2("pcb_copper_text"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("0.2mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),is_knockout:external_exports2.boolean().default(!1).optional(),knockout_padding:external_exports2.object({left:length3,top:length3,bottom:length3,right:length3}).default({left:"0.2mm",top:"0.2mm",bottom:"0.2mm",right:"0.2mm"}).optional(),ccw_rotation:external_exports2.number().optional(),layer:layer_ref2,is_mirrored:external_exports2.boolean().default(!1).optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:ninePointAnchor3.default("center")}).describe("Defines copper text on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_rect2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_rect"),pcb_silkscreen_rect_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,stroke_width:length3.default("1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().default(!0).optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen rect on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_circle2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_circle"),pcb_silkscreen_circle_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,stroke_width:length3.default("1mm"),is_filled:external_exports2.boolean().optional()}).describe("Defines a silkscreen circle on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_oval2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_oval"),pcb_silkscreen_oval_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_oval"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius_x:distance7,radius_y:distance7,layer:visible_layer2,ccw_rotation:rotation4.optional()}).describe("Defines a silkscreen oval on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_graphic_base2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_graphic"),pcb_silkscreen_graphic_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_graphic"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,image_asset:asset2.optional()}),pcb_silkscreen_graphic_brep2=pcb_silkscreen_graphic_base2.extend({shape:external_exports2.literal("brep"),brep_shape:brep_shape2}).describe("Defines a BRep silkscreen graphic on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_graphic2=external_exports2.discriminatedUnion("shape",[pcb_silkscreen_graphic_brep2]).describe("Defines a silkscreen graphic on the PCB");expectTypesMatch3(!0);var pcb_silkscreen_pill2=external_exports2.object({type:external_exports2.literal("pcb_silkscreen_pill"),pcb_silkscreen_pill_id:getZodPrefixedIdWithDefault2("pcb_silkscreen_pill"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:layer_ref2,ccw_rotation:external_exports2.number().optional()}).describe("Defines a silkscreen pill on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_text2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_text"),pcb_fabrication_note_text_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_text"),subcircuit_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),pcb_component_id:external_exports2.string(),text:external_exports2.string(),ccw_rotation:external_exports2.number().optional(),layer:visible_layer2,anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),color:external_exports2.string().optional()}).describe("Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators");expectTypesMatch3(!0);var pcb_fabrication_note_path2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_path"),pcb_fabrication_note_path_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_path"),pcb_component_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,route:external_exports2.array(point5),stroke_width:length3,color:external_exports2.string().optional()}).describe("Defines a fabrication path on the PCB for fabricators or assemblers");expectTypesMatch3(!0);var pcb_fabrication_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_rect"),pcb_fabrication_note_rect_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a fabrication note rectangle on the PCB");expectTypesMatch3(!0);var pcb_fabrication_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_fabrication_note_dimension"),pcb_fabrication_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_fabrication_note_dimension"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset:length3.optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB fabrication notes");expectTypesMatch3(!0);var pcb_note_text2=external_exports2.object({type:external_exports2.literal("pcb_note_text"),pcb_note_text_id:getZodPrefixedIdWithDefault2("pcb_note_text"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:distance7.default("1mm"),text:external_exports2.string().optional(),anchor_position:point5.default({x:0,y:0}),anchor_alignment:external_exports2.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),layer:visible_layer2.default("top"),is_mirrored_from_top_view:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a documentation note in text on the PCB");expectTypesMatch3(!0);var pcb_note_rect2=external_exports2.object({type:external_exports2.literal("pcb_note_rect"),pcb_note_rect_id:getZodPrefixedIdWithDefault2("pcb_note_rect"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2.default("top"),stroke_width:length3.default("0.1mm"),corner_radius:length3.optional(),is_filled:external_exports2.boolean().optional(),has_stroke:external_exports2.boolean().optional(),is_stroke_dashed:external_exports2.boolean().optional(),color:external_exports2.string().optional()}).describe("Defines a rectangular documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_path2=external_exports2.object({type:external_exports2.literal("pcb_note_path"),pcb_note_path_id:getZodPrefixedIdWithDefault2("pcb_note_path"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),route:external_exports2.array(point5),layer:visible_layer2.default("top"),stroke_width:length3.default("0.1mm"),color:external_exports2.string().optional()}).describe("Defines a polyline documentation note on the PCB");expectTypesMatch3(!0);var pcb_note_line2=external_exports2.object({type:external_exports2.literal("pcb_note_line"),pcb_note_line_id:getZodPrefixedIdWithDefault2("pcb_note_line"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),text:external_exports2.string().optional(),x1:distance7,y1:distance7,x2:distance7,y2:distance7,layer:visible_layer2.default("top"),stroke_width:distance7.default("0.1mm"),color:external_exports2.string().optional(),is_dashed:external_exports2.boolean().optional()}).describe("Defines a straight documentation note line on the PCB");expectTypesMatch3(!0);var pcb_note_dimension2=external_exports2.object({type:external_exports2.literal("pcb_note_dimension"),pcb_note_dimension_id:getZodPrefixedIdWithDefault2("pcb_note_dimension"),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),name:external_exports2.string().optional(),from:point5,to:point5,text:external_exports2.string().optional(),text_ccw_rotation:external_exports2.number().optional(),offset_distance:length3.optional(),offset_direction:external_exports2.object({x:external_exports2.number(),y:external_exports2.number()}).optional(),font:external_exports2.literal("tscircuit2024").default("tscircuit2024"),font_size:length3.default("1mm"),layer:visible_layer2.default("top"),color:external_exports2.string().optional(),arrow_size:length3.default("1mm")}).describe("Defines a measurement annotation within PCB documentation notes");expectTypesMatch3(!0);var pcb_footprint_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_footprint_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_footprint_overlap_error").default("pcb_footprint_overlap_error"),pcb_smtpad_ids:external_exports2.array(external_exports2.string()).optional(),pcb_plated_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_hole_ids:external_exports2.array(external_exports2.string()).optional(),pcb_keepout_ids:external_exports2.array(external_exports2.string()).optional()}).describe("Error emitted when a pcb footprint overlaps with another element");expectTypesMatch3(!0);var pcb_courtyard_overlap_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_courtyard_overlap_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_courtyard_overlap_error").default("pcb_courtyard_overlap_error"),pcb_component_ids:external_exports2.tuple([external_exports2.string(),external_exports2.string()])}).describe("Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another");expectTypesMatch3(!0);var pcb_keepout2=external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("rect"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:distance7,height:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}).or(external_exports2.object({type:external_exports2.literal("pcb_keepout"),shape:external_exports2.literal("circle"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:distance7,pcb_keepout_id:external_exports2.string(),layers:external_exports2.array(external_exports2.string()),description:external_exports2.string().optional()}));expectTypesMatch3(!0);var pcb_cutout_base2=external_exports2.object({type:external_exports2.literal("pcb_cutout"),pcb_cutout_id:getZodPrefixedIdWithDefault2("pcb_cutout"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),pcb_panel_id:external_exports2.string().optional()}),pcb_cutout_rect2=pcb_cutout_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional(),corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout_circle2=pcb_cutout_base2.extend({shape:external_exports2.literal("circle"),center:point5,radius:length3});expectTypesMatch3(!0);var pcb_cutout_polygon2=pcb_cutout_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_cutout_path2=pcb_cutout_base2.extend({shape:external_exports2.literal("path"),route:external_exports2.array(point5),slot_width:length3,slot_length:length3.optional(),space_between_slots:length3.optional(),slot_corner_radius:length3.optional()});expectTypesMatch3(!0);var pcb_cutout2=external_exports2.discriminatedUnion("shape",[pcb_cutout_rect2,pcb_cutout_circle2,pcb_cutout_polygon2,pcb_cutout_path2]).describe("Defines a cutout on the PCB, removing board material.");expectTypesMatch3(!0);var pcb_missing_footprint_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_missing_footprint_error"),pcb_missing_footprint_error_id:getZodPrefixedIdWithDefault2("pcb_missing_footprint_error"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("pcb_missing_footprint_error").default("pcb_missing_footprint_error"),source_component_id:external_exports2.string()}).describe("Defines a missing footprint error on the PCB");expectTypesMatch3(!0);var external_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("external_footprint_load_error"),external_footprint_load_error_id:getZodPrefixedIdWithDefault2("external_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),error_type:external_exports2.literal("external_footprint_load_error").default("external_footprint_load_error")}).describe("Defines an error when an external footprint fails to load");expectTypesMatch3(!0);var circuit_json_footprint_load_error2=base_circuit_json_error2.extend({type:external_exports2.literal("circuit_json_footprint_load_error"),circuit_json_footprint_load_error_id:getZodPrefixedIdWithDefault2("circuit_json_footprint_load_error"),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),error_type:external_exports2.literal("circuit_json_footprint_load_error").default("circuit_json_footprint_load_error"),circuit_json:external_exports2.array(external_exports2.any()).optional()}).describe("Defines an error when a circuit JSON footprint fails to load");expectTypesMatch3(!0);var pcb_group2=external_exports2.object({type:external_exports2.literal("pcb_group"),pcb_group_id:getZodPrefixedIdWithDefault2("pcb_group"),source_group_id:external_exports2.string(),is_subcircuit:external_exports2.boolean().optional(),subcircuit_id:external_exports2.string().optional(),width:length3.optional(),height:length3.optional(),center:point5,display_offset_x:external_exports2.string().optional().describe("How to display the x offset for this group, usually corresponding with how the user specified it"),display_offset_y:external_exports2.string().optional().describe("How to display the y offset for this group, usually corresponding with how the user specified it"),outline:external_exports2.array(point5).optional(),anchor_position:point5.optional(),anchor_alignment:ninePointAnchor3.default("center"),position_mode:external_exports2.enum(["packed","relative_to_group_anchor","none"]).optional(),positioned_relative_to_pcb_group_id:external_exports2.string().optional(),positioned_relative_to_pcb_board_id:external_exports2.string().optional(),pcb_component_ids:external_exports2.array(external_exports2.string()),child_layout_mode:external_exports2.enum(["packed","none"]).optional(),name:external_exports2.string().optional(),description:external_exports2.string().optional(),layout_mode:external_exports2.string().optional(),autorouter_configuration:external_exports2.object({trace_clearance:length3}).optional(),autorouter_used_string:external_exports2.string().optional()}).describe("Defines a group of components on the PCB");expectTypesMatch3(!0);var pcb_autorouting_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_autorouting_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_autorouting_error"),error_type:external_exports2.literal("pcb_autorouting_error").default("pcb_autorouting_error"),subcircuit_id:external_exports2.string().optional()}).describe("The autorouting has failed to route a portion of the board");expectTypesMatch3(!0);var pcb_manual_edit_conflict_warning2=external_exports2.object({type:external_exports2.literal("pcb_manual_edit_conflict_warning"),pcb_manual_edit_conflict_warning_id:getZodPrefixedIdWithDefault2("pcb_manual_edit_conflict_warning"),warning_type:external_exports2.literal("pcb_manual_edit_conflict_warning").default("pcb_manual_edit_conflict_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string()}).describe("Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates");expectTypesMatch3(!0);var connectorOrientationDirection2=external_exports2.enum(["x-","x+","y+","y-"]),pcb_connector_not_in_accessible_orientation_warning2=external_exports2.object({type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning"),pcb_connector_not_in_accessible_orientation_warning_id:getZodPrefixedIdWithDefault2("pcb_connector_not_in_accessible_orientation_warning"),warning_type:external_exports2.literal("pcb_connector_not_in_accessible_orientation_warning").default("pcb_connector_not_in_accessible_orientation_warning"),message:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string().optional(),pcb_board_id:external_exports2.string().optional(),facing_direction:connectorOrientationDirection2,recommended_facing_direction:connectorOrientationDirection2,subcircuit_id:external_exports2.string().optional()}).describe("Warning emitted when a connector PCB component is facing inward toward the board and should be reoriented to an outward-facing direction");expectTypesMatch3(!0);var supplier_footprint_mismatch_warning2=external_exports2.object({type:external_exports2.literal("supplier_footprint_mismatch_warning"),supplier_footprint_mismatch_warning_id:getZodPrefixedIdWithDefault2("supplier_footprint_mismatch_warning"),warning_type:external_exports2.literal("supplier_footprint_mismatch_warning").default("supplier_footprint_mismatch_warning"),message:external_exports2.string(),source_component_id:external_exports2.string(),pcb_component_id:external_exports2.string().optional(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),supplier_name:supplier_name2.optional(),supplier_part_number:external_exports2.string().optional(),supplier_footprint_url:external_exports2.string().optional(),footprint_copper_intersection_over_union:external_exports2.number()}).describe("Warning emitted when a supplier part footprint does not match the expected footprint");expectTypesMatch3(!0);var pcb_breakout_point2=external_exports2.object({type:external_exports2.literal("pcb_breakout_point"),pcb_breakout_point_id:getZodPrefixedIdWithDefault2("pcb_breakout_point"),pcb_group_id:external_exports2.string(),subcircuit_id:external_exports2.string().optional(),source_trace_id:external_exports2.string().optional(),source_port_id:external_exports2.string().optional(),source_net_id:external_exports2.string().optional(),x:distance7,y:distance7}).describe("Defines a routing target within a pcb_group for a source_trace or source_net");expectTypesMatch3(!0);var pcb_ground_plane2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane"),pcb_ground_plane_id:getZodPrefixedIdWithDefault2("pcb_ground_plane"),source_pcb_ground_plane_id:external_exports2.string(),source_net_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Defines a ground plane on the PCB");expectTypesMatch3(!0);var pcb_ground_plane_region2=external_exports2.object({type:external_exports2.literal("pcb_ground_plane_region"),pcb_ground_plane_region_id:getZodPrefixedIdWithDefault2("pcb_ground_plane_region"),pcb_ground_plane_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,points:external_exports2.array(point5)}).describe("Defines a polygon region of a ground plane");expectTypesMatch3(!0);var pcb_thermal_spoke2=external_exports2.object({type:external_exports2.literal("pcb_thermal_spoke"),pcb_thermal_spoke_id:getZodPrefixedIdWithDefault2("pcb_thermal_spoke"),pcb_ground_plane_id:external_exports2.string(),shape:external_exports2.string(),spoke_count:external_exports2.number(),spoke_thickness:distance7,spoke_inner_diameter:distance7,spoke_outer_diameter:distance7,pcb_plated_hole_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Pattern for connecting a ground plane to a plated hole");expectTypesMatch3(!0);var pcb_copper_pour_base2=external_exports2.object({type:external_exports2.literal("pcb_copper_pour"),pcb_copper_pour_id:getZodPrefixedIdWithDefault2("pcb_copper_pour"),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:layer_ref2,source_net_id:external_exports2.string().optional(),covered_with_solder_mask:external_exports2.boolean().optional().default(!0)}),pcb_copper_pour_rect2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("rect"),center:point5,width:length3,height:length3,rotation:rotation4.optional()});expectTypesMatch3(!0);var pcb_copper_pour_brep2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("brep"),brep_shape:brep_shape2});expectTypesMatch3(!0);var pcb_copper_pour_polygon2=pcb_copper_pour_base2.extend({shape:external_exports2.literal("polygon"),points:external_exports2.array(point5)});expectTypesMatch3(!0);var pcb_copper_pour2=external_exports2.discriminatedUnion("shape",[pcb_copper_pour_rect2,pcb_copper_pour_brep2,pcb_copper_pour_polygon2]).describe("Defines a copper pour on the PCB.");expectTypesMatch3(!0);var pcb_component_outside_board_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_outside_board_error"),pcb_component_outside_board_error_id:getZodPrefixedIdWithDefault2("pcb_component_outside_board_error"),error_type:external_exports2.literal("pcb_component_outside_board_error").default("pcb_component_outside_board_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,component_bounds:external_exports2.object({min_x:external_exports2.number(),max_x:external_exports2.number(),min_y:external_exports2.number(),max_y:external_exports2.number()}),subcircuit_id:external_exports2.string().optional(),source_component_id:external_exports2.string().optional()}).describe("Error emitted when a PCB component is placed outside the board boundaries");expectTypesMatch3(!0);var pcb_component_not_on_board_edge_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_not_on_board_edge_error"),pcb_component_not_on_board_edge_error_id:getZodPrefixedIdWithDefault2("pcb_component_not_on_board_edge_error"),error_type:external_exports2.literal("pcb_component_not_on_board_edge_error").default("pcb_component_not_on_board_edge_error"),pcb_component_id:external_exports2.string(),pcb_board_id:external_exports2.string(),component_center:point5,pad_to_nearest_board_edge_distance:external_exports2.number(),source_component_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component that must be placed on the board edge is centered away from the edge");expectTypesMatch3(!0);var pcb_component_invalid_layer_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_component_invalid_layer_error"),pcb_component_invalid_layer_error_id:getZodPrefixedIdWithDefault2("pcb_component_invalid_layer_error"),error_type:external_exports2.literal("pcb_component_invalid_layer_error").default("pcb_component_invalid_layer_error"),pcb_component_id:external_exports2.string().optional(),source_component_id:external_exports2.string(),layer:layer_ref2,subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)");expectTypesMatch3(!0);var pcb_via_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_via_clearance_error"),pcb_error_id:getZodPrefixedIdWithDefault2("pcb_error"),error_type:external_exports2.literal("pcb_via_clearance_error").default("pcb_via_clearance_error"),pcb_via_ids:external_exports2.array(external_exports2.string()).min(2),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),pcb_center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when vias are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_via_trace_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_via_trace_clearance_error"),pcb_via_trace_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_via_trace_clearance_error"),error_type:external_exports2.literal("pcb_via_trace_clearance_error").default("pcb_via_trace_clearance_error"),pcb_via_id:external_exports2.string(),pcb_trace_id:external_exports2.string(),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a via and trace are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_pad_pad_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_pad_pad_clearance_error"),pcb_pad_pad_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_pad_pad_clearance_error"),error_type:external_exports2.literal("pcb_pad_pad_clearance_error").default("pcb_pad_pad_clearance_error"),pcb_pad_ids:external_exports2.array(external_exports2.string()).min(2),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when pads are closer than the allowed clearance");expectTypesMatch3(!0);var pcb_pad_trace_clearance_error2=base_circuit_json_error2.extend({type:external_exports2.literal("pcb_pad_trace_clearance_error"),pcb_pad_trace_clearance_error_id:getZodPrefixedIdWithDefault2("pcb_pad_trace_clearance_error"),error_type:external_exports2.literal("pcb_pad_trace_clearance_error").default("pcb_pad_trace_clearance_error"),pcb_pad_id:external_exports2.string(),pcb_trace_id:external_exports2.string(),minimum_clearance:distance7.optional(),actual_clearance:distance7.optional(),center:external_exports2.object({x:external_exports2.number().optional(),y:external_exports2.number().optional()}).optional(),subcircuit_id:external_exports2.string().optional()}).describe("Error emitted when a pad and trace are closer than allowed clearance");expectTypesMatch3(!0);var pcb_courtyard_rect2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_rect"),pcb_courtyard_rect_id:getZodPrefixedIdWithDefault2("pcb_courtyard_rect"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,layer:visible_layer2,ccw_rotation:rotation4.optional(),color:external_exports2.string().optional()}).describe("Defines a courtyard rectangle on the PCB");expectTypesMatch3(!0);var pcb_courtyard_outline2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_outline"),pcb_courtyard_outline_id:getZodPrefixedIdWithDefault2("pcb_courtyard_outline"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,outline:external_exports2.array(point5).min(2)}).describe("Defines a courtyard outline on the PCB");expectTypesMatch3(!0);var pcb_courtyard_polygon2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_polygon"),pcb_courtyard_polygon_id:getZodPrefixedIdWithDefault2("pcb_courtyard_polygon"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),layer:visible_layer2,points:external_exports2.array(point5).min(3),color:external_exports2.string().optional()}).describe("Defines a courtyard polygon on the PCB");expectTypesMatch3(!0);var pcb_courtyard_circle2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_circle"),pcb_courtyard_circle_id:getZodPrefixedIdWithDefault2("pcb_courtyard_circle"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,radius:length3,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard circle on the PCB");expectTypesMatch3(!0);var pcb_courtyard_pill2=external_exports2.object({type:external_exports2.literal("pcb_courtyard_pill"),pcb_courtyard_pill_id:getZodPrefixedIdWithDefault2("pcb_courtyard_pill"),pcb_component_id:external_exports2.string(),pcb_group_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),center:point5,width:length3,height:length3,radius:length3,layer:visible_layer2,color:external_exports2.string().optional()}).describe("Defines a courtyard pill on the PCB");expectTypesMatch3(!0);var cad_model_formats2=["obj","stl","3mf","gltf","glb","step","wrl"],cad_model_axis_directions2=["x+","x-","y+","y-","z+","z-"],cadModelDefaultDirectionMap2={obj:"z+",stl:"z+","3mf":"z+",gltf:"y+",glb:"y+",step:"z+",wrl:"y+"},cad_component2=external_exports2.object({type:external_exports2.literal("cad_component"),cad_component_id:external_exports2.string(),pcb_component_id:external_exports2.string(),source_component_id:external_exports2.string(),position:point33,rotation:point33.optional(),size:point33.optional(),layer:layer_ref2.optional(),subcircuit_id:external_exports2.string().optional(),footprinter_string:external_exports2.string().optional(),model_obj_url:external_exports2.string().optional(),model_stl_url:external_exports2.string().optional(),model_3mf_url:external_exports2.string().optional(),model_gltf_url:external_exports2.string().optional(),model_glb_url:external_exports2.string().optional(),model_step_url:external_exports2.string().optional(),model_wrl_url:external_exports2.string().optional(),model_asset:asset2.optional(),model_unit_to_mm_scale_factor:external_exports2.number().optional(),model_board_normal_direction:external_exports2.enum(cad_model_axis_directions2).optional().describe(`The direction in the model's coordinate space that is considered "up" or "coming out of the board surface"`),model_origin_position:point33.optional(),model_origin_alignment:external_exports2.enum(["unknown","center","center_of_component_on_board_surface","bottom_center_of_component"]).optional(),model_object_fit:external_exports2.enum(["contain_within_bounds","fill_bounds"]).optional().default("contain_within_bounds"),model_jscad:external_exports2.any().optional(),show_as_translucent_model:external_exports2.boolean().optional(),show_as_bounding_box:external_exports2.boolean().optional(),anchor_alignment:external_exports2.enum(["center","center_of_component_on_board_surface"]).optional().default("center")}).describe("Defines a component on the PCB");expectTypesMatch3(!0);var wave_shape2=external_exports2.enum(["sinewave","square","triangle","sawtooth"]),percentage4=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),voltage:voltage2}).describe("Defines a DC voltage source for simulation"),simulation_ac_voltage_source2=external_exports2.object({type:external_exports2.literal("simulation_voltage_source"),simulation_voltage_source_id:getZodPrefixedIdWithDefault2("simulation_voltage_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),voltage:voltage2.optional(),frequency:frequency2.optional(),peak_to_peak_voltage:voltage2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage4.optional(),pulse_delay:ms4.optional(),rise_time:ms4.optional(),fall_time:ms4.optional(),pulse_width:ms4.optional(),period:ms4.optional()}).describe("Defines an AC voltage source for simulation"),simulation_voltage_source2=external_exports2.union([simulation_dc_voltage_source2,simulation_ac_voltage_source2]).describe("Defines a voltage source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var percentage23=external_exports2.union([external_exports2.string(),external_exports2.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports2.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),simulation_dc_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!0).optional().default(!0),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),current:current2}).describe("Defines a DC current source for simulation"),simulation_ac_current_source2=external_exports2.object({type:external_exports2.literal("simulation_current_source"),simulation_current_source_id:getZodPrefixedIdWithDefault2("simulation_current_source"),is_dc_source:external_exports2.literal(!1),terminal1_source_port_id:external_exports2.string().optional(),terminal2_source_port_id:external_exports2.string().optional(),terminal1_source_net_id:external_exports2.string().optional(),terminal2_source_net_id:external_exports2.string().optional(),current:current2.optional(),frequency:frequency2.optional(),peak_to_peak_current:current2.optional(),wave_shape:wave_shape2.optional(),phase:rotation4.optional(),duty_cycle:percentage23.optional()}).describe("Defines an AC current source for simulation"),simulation_current_source2=external_exports2.union([simulation_dc_current_source2,simulation_ac_current_source2]).describe("Defines a current source for simulation");expectTypesMatch3(!0);expectTypesMatch3(!0);expectTypesMatch3(!0);var experiment_type2=external_exports2.union([external_exports2.literal("spice_dc_sweep"),external_exports2.literal("spice_dc_operating_point"),external_exports2.literal("spice_transient_analysis"),external_exports2.literal("spice_ac_analysis")]),spice_simulation_options2=external_exports2.object({method:external_exports2.enum(["trap","gear"]).optional(),reltol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),abstol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional(),vntol:external_exports2.union([external_exports2.number(),external_exports2.string()]).optional()}).describe("SPICE solver options for a simulation experiment"),simulation_experiment2=external_exports2.object({type:external_exports2.literal("simulation_experiment"),simulation_experiment_id:getZodPrefixedIdWithDefault2("simulation_experiment"),name:external_exports2.string(),experiment_type:experiment_type2,time_per_step:duration_ms2.optional(),start_time_ms:ms4.optional(),end_time_ms:ms4.optional(),spice_options:spice_simulation_options2.optional()}).describe("Defines a simulation experiment configuration");expectTypesMatch3(!0);var simulation_transient_voltage_graph2=external_exports2.object({type:external_exports2.literal("simulation_transient_voltage_graph"),simulation_transient_voltage_graph_id:getZodPrefixedIdWithDefault2("simulation_transient_voltage_graph"),simulation_experiment_id:external_exports2.string(),timestamps_ms:external_exports2.array(external_exports2.number()).optional(),voltage_levels:external_exports2.array(external_exports2.number()),source_component_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),time_per_step:duration_ms2,start_time_ms:ms4,end_time_ms:ms4,name:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Stores voltage measurements over time for a simulation");expectTypesMatch3(!0);var simulation_transient_current_graph2=external_exports2.object({type:external_exports2.literal("simulation_transient_current_graph"),simulation_transient_current_graph_id:getZodPrefixedIdWithDefault2("simulation_transient_current_graph"),simulation_experiment_id:external_exports2.string(),timestamps_ms:external_exports2.array(external_exports2.number()).optional(),current_levels:external_exports2.array(external_exports2.number()),source_component_id:external_exports2.string().optional(),subcircuit_connectivity_map_key:external_exports2.string().optional(),time_per_step:duration_ms2,start_time_ms:ms4,end_time_ms:ms4,name:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Stores current measurements over time for a simulation");expectTypesMatch3(!0);var simulation_switch2=external_exports2.object({type:external_exports2.literal("simulation_switch"),simulation_switch_id:getZodPrefixedIdWithDefault2("simulation_switch"),source_component_id:external_exports2.string().optional(),closes_at:ms4.optional(),opens_at:ms4.optional(),starts_closed:external_exports2.boolean().optional(),switching_frequency:frequency2.optional()}).describe("Defines a switch for simulation timing control");expectTypesMatch3(!0);var simulation_voltage_probe2=external_exports2.object({type:external_exports2.literal("simulation_voltage_probe"),simulation_voltage_probe_id:getZodPrefixedIdWithDefault2("simulation_voltage_probe"),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),signal_input_source_port_id:external_exports2.string().optional(),signal_input_source_net_id:external_exports2.string().optional(),reference_input_source_port_id:external_exports2.string().optional(),reference_input_source_net_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Defines a voltage probe for simulation. If a reference input is not provided, it measures against ground. If a reference input is provided, it measures the differential voltage between two points.").superRefine((data,ctx)=>{if(data.reference_input_source_port_id||data.reference_input_source_net_id){let has_ports=!!data.signal_input_source_port_id||!!data.reference_input_source_port_id,has_nets=!!data.signal_input_source_net_id||!!data.reference_input_source_net_id;has_ports&&has_nets?ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Cannot mix port and net connections in a differential probe."}):has_ports?(!data.signal_input_source_port_id||!data.reference_input_source_port_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential port probe requires both signal_input_source_port_id and reference_input_source_port_id."}):has_nets&&(!data.signal_input_source_net_id||!data.reference_input_source_net_id)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Differential net probe requires both signal_input_source_net_id and reference_input_source_net_id."})}else!!data.signal_input_source_port_id==!!data.signal_input_source_net_id&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id."})});expectTypesMatch3(!0);var simulation_current_probe2=external_exports2.object({type:external_exports2.literal("simulation_current_probe"),simulation_current_probe_id:getZodPrefixedIdWithDefault2("simulation_current_probe"),source_component_id:external_exports2.string().optional(),name:external_exports2.string().optional(),positive_source_port_id:external_exports2.string().optional(),negative_source_port_id:external_exports2.string().optional(),positive_source_net_id:external_exports2.string().optional(),negative_source_net_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional(),color:external_exports2.string().optional()}).describe("Defines a current probe for simulation. It measures current flowing from the positive endpoint to the negative endpoint.").superRefine((data,ctx)=>{let hasPositivePort=!!data.positive_source_port_id,hasNegativePort=!!data.negative_source_port_id,hasPositiveNet=!!data.positive_source_net_id,hasNegativeNet=!!data.negative_source_net_id,hasPorts=hasPositivePort||hasNegativePort,hasNets=hasPositiveNet||hasNegativeNet;if(hasPorts&&hasNets){ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Cannot mix port and net connections in a current probe."});return}if(hasPorts){(!hasPositivePort||!hasNegativePort)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current probe using source ports requires both positive_source_port_id and negative_source_port_id."});return}if(hasNets){(!hasPositiveNet||!hasNegativeNet)&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current probe using source nets requires both positive_source_net_id and negative_source_net_id."});return}ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"A current probe must have either positive/negative source port ids or positive/negative source net ids."})});expectTypesMatch3(!0);var simulation_unknown_experiment_error2=base_circuit_json_error2.extend({type:external_exports2.literal("simulation_unknown_experiment_error"),simulation_unknown_experiment_error_id:getZodPrefixedIdWithDefault2("simulation_unknown_experiment_error"),error_type:external_exports2.literal("simulation_unknown_experiment_error").default("simulation_unknown_experiment_error"),simulation_experiment_id:external_exports2.string().optional(),subcircuit_id:external_exports2.string().optional()}).describe("An unknown error occurred during the simulation experiment.");expectTypesMatch3(!0);var simulation_op_amp2=external_exports2.object({type:external_exports2.literal("simulation_op_amp"),simulation_op_amp_id:getZodPrefixedIdWithDefault2("simulation_op_amp"),source_component_id:external_exports2.string().optional(),inverting_input_source_port_id:external_exports2.string(),non_inverting_input_source_port_id:external_exports2.string(),output_source_port_id:external_exports2.string(),positive_supply_source_port_id:external_exports2.string(),negative_supply_source_port_id:external_exports2.string()}).describe("Defines a simple ideal operational amplifier for simulation");expectTypesMatch3(!0);var simulation_spice_subcircuit2=external_exports2.object({type:external_exports2.literal("simulation_spice_subcircuit"),simulation_spice_subcircuit_id:getZodPrefixedIdWithDefault2("simulation_spice_subcircuit"),source_component_id:external_exports2.string(),spice_pin_to_source_port_map:external_exports2.record(external_exports2.string(),external_exports2.string()),subcircuit_source:external_exports2.string()}).describe("Defines a custom SPICE subcircuit model for simulation");expectTypesMatch3(!0);var hasValue2=value=>value!==void 0,simulation_oscilloscope_trace2=external_exports2.object({type:external_exports2.literal("simulation_oscilloscope_trace"),simulation_oscilloscope_trace_id:getZodPrefixedIdWithDefault2("simulation_oscilloscope_trace"),simulation_transient_voltage_graph_id:external_exports2.string().optional(),simulation_transient_current_graph_id:external_exports2.string().optional(),simulation_voltage_probe_id:external_exports2.string().optional(),simulation_current_probe_id:external_exports2.string().optional(),display_name:external_exports2.string().optional(),color:external_exports2.string().optional(),display_center_value:external_exports2.number().optional(),display_center_offset_divs:external_exports2.number().optional(),volts_per_div:external_exports2.number().positive().optional(),amps_per_div:external_exports2.number().positive().optional()}).describe("Defines how a simulation measurement is rendered as an oscilloscope-style trace.").superRefine((data,ctx)=>{let voltageReferences=[data.simulation_transient_voltage_graph_id,data.simulation_voltage_probe_id].filter(hasValue2).length,currentReferences=[data.simulation_transient_current_graph_id,data.simulation_current_probe_id].filter(hasValue2).length;voltageReferences+currentReferences!==1&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"An oscilloscope trace must reference exactly one voltage graph, current graph, voltage probe, or current probe."}),voltageReferences>0&&data.amps_per_div!==void 0&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Voltage oscilloscope traces must use volts_per_div, not amps_per_div."}),currentReferences>0&&data.volts_per_div!==void 0&&ctx.addIssue({code:external_exports2.ZodIssueCode.custom,message:"Current oscilloscope traces must use amps_per_div, not volts_per_div."})});expectTypesMatch3(!0);var any_circuit_element2=external_exports2.union([source_trace2,source_port2,source_component_internal_connection2,any_source_component2,source_net2,source_group2,source_simple_chip2,source_simple_capacitor2,source_simple_diode2,source_simple_led2,source_simple_resistor2,source_simple_power_source2,source_simple_battery2,source_simple_inductor2,source_simple_pin_header2,source_simple_pinout2,source_simple_resonator2,source_simple_switch2,source_simple_transistor2,source_simple_test_point2,source_simple_mosfet2,source_simple_op_amp2,source_simple_potentiometer2,source_simple_push_button2,source_pcb_ground_plane2,source_manually_placed_via2,source_board2,source_project_metadata2,source_invalid_component_property_error2,source_trace_not_connected_error2,source_pin_missing_trace_warning2,source_unnamed_trace_warning2,source_missing_manufacturer_part_number_warning2,source_refdes_convention_warning2,source_no_power_pin_defined_warning2,source_no_ground_pin_defined_warning2,source_component_pins_underspecified_warning2,source_pin_must_be_connected_error2,unknown_error_finding_part2,source_part_not_found_warning2,source_i2c_misconfigured_error2,source_component_misconfigured_error2,source_ambiguous_port_reference2,pcb_component2,pcb_hole2,pcb_missing_footprint_error2,external_footprint_load_error2,circuit_json_footprint_load_error2,pcb_manual_edit_conflict_warning2,pcb_connector_not_in_accessible_orientation_warning2,supplier_footprint_mismatch_warning2,pcb_plated_hole2,pcb_keepout2,pcb_port2,pcb_net2,pcb_text2,pcb_trace2,pcb_trace_warning2,pcb_via2,pcb_smtpad2,pcb_solder_paste2,pcb_board2,pcb_panel2,pcb_group2,pcb_trace_hint2,pcb_silkscreen_line2,pcb_silkscreen_path2,pcb_silkscreen_text2,pcb_silkscreen_pill2,pcb_copper_text2,pcb_silkscreen_rect2,pcb_silkscreen_circle2,pcb_silkscreen_oval2,pcb_silkscreen_graphic2,pcb_trace_error2,pcb_trace_missing_error2,pcb_placement_error2,pcb_panelization_placement_error2,pcb_port_not_matched_error2,pcb_port_not_connected_error2,pcb_via_clearance_error2,pcb_via_trace_clearance_error2,pcb_pad_pad_clearance_error2,pcb_pad_trace_clearance_error2,pcb_fabrication_note_path2,pcb_fabrication_note_text2,pcb_fabrication_note_rect2,pcb_fabrication_note_dimension2,pcb_note_text2,pcb_note_rect2,pcb_note_path2,pcb_note_line2,pcb_note_dimension2,pcb_autorouting_error2,pcb_footprint_overlap_error2,pcb_courtyard_overlap_error2,pcb_breakout_point2,pcb_cutout2,pcb_ground_plane2,pcb_ground_plane_region2,pcb_thermal_spoke2,pcb_copper_pour2,pcb_component_outside_board_error2,pcb_component_not_on_board_edge_error2,pcb_component_invalid_layer_error2,pcb_courtyard_rect2,pcb_courtyard_outline2,pcb_courtyard_polygon2,pcb_courtyard_circle2,pcb_courtyard_pill2,schematic_box2,schematic_text2,schematic_line2,schematic_rect2,schematic_circle2,schematic_arc2,schematic_component2,schematic_symbol2,schematic_port2,schematic_trace2,schematic_path2,schematic_error2,schematic_layout_error2,schematic_net_label2,schematic_debug_object2,schematic_voltage_probe2,schematic_manual_edit_conflict_warning2,schematic_group2,schematic_sheet2,schematic_table2,schematic_table_cell2,cad_component2,simulation_voltage_source2,simulation_current_source2,simulation_experiment2,simulation_transient_voltage_graph2,simulation_transient_current_graph2,simulation_switch2,simulation_voltage_probe2,simulation_current_probe2,simulation_oscilloscope_trace2,simulation_unknown_experiment_error2,simulation_op_amp2,simulation_spice_subcircuit2]),any_soup_element2=any_circuit_element2;expectTypesMatch3(!0);expectStringUnionsMatch2(!0);function applyToPoint5(matrix2,point22){return Array.isArray(point22)?[matrix2.a*point22[0]+matrix2.c*point22[1]+matrix2.e,matrix2.b*point22[0]+matrix2.d*point22[1]+matrix2.f]:{x:matrix2.a*point22.x+matrix2.c*point22.y+matrix2.e,y:matrix2.b*point22.x+matrix2.d*point22.y+matrix2.f}}function isUndefined5(val){return typeof val>"u"}function translate6(tx3,ty3=0){return{a:1,c:0,e:tx3,b:0,d:1,f:ty3}}function transform5(...matrices){matrices=Array.isArray(matrices[0])?matrices[0]:matrices;let multiply=(m12,m22)=>({a:m12.a*m22.a+m12.c*m22.b,c:m12.a*m22.c+m12.c*m22.d,e:m12.a*m22.e+m12.c*m22.f+m12.e,b:m12.b*m22.a+m12.d*m22.b,d:m12.b*m22.c+m12.d*m22.d,f:m12.b*m22.e+m12.d*m22.f+m12.f});switch(matrices.length){case 0:throw new Error("no matrices provided");case 1:return matrices[0];case 2:return multiply(matrices[0],matrices[1]);default:{let[m12,m22,...rest]=matrices,m6=multiply(m12,m22);return transform5(m6,...rest)}}}function compose5(...matrices){return transform5(...matrices)}var{cos:cos5,sin:sin5,PI:PI6}=Math;function scale5(sx3,sy3=void 0,cx3=void 0,cy3=void 0){isUndefined5(sy3)&&(sy3=sx3);let scaleMatrix={a:sx3,c:0,e:0,b:0,d:sy3,f:0};return isUndefined5(cx3)||isUndefined5(cy3)?scaleMatrix:transform5([translate6(cx3,cy3),scaleMatrix,translate6(-cx3,-cy3)])}var{tan:tan5}=Math;function peg$subclass4(child,parent){function C4(){this.constructor=child}C4.prototype=parent.prototype,child.prototype=new C4}function peg$SyntaxError4(message,expected,found,location){var self2=Error.call(this,message);return Object.setPrototypeOf&&Object.setPrototypeOf(self2,peg$SyntaxError4.prototype),self2.expected=expected,self2.found=found,self2.location=location,self2.name="SyntaxError",self2}peg$subclass4(peg$SyntaxError4,Error);function peg$padEnd4(str,targetLength,padString){return padString=padString||" ",str.length>targetLength?str:(targetLength-=str.length,padString+=padString.repeat(targetLength),str+padString.slice(0,targetLength))}peg$SyntaxError4.prototype.format=function(sources){var str="Error: "+this.message;if(this.location){var src=null,k7;for(k7=0;k7<sources.length;k7++)if(sources[k7].source===this.location.source){src=sources[k7].text.split(/\r\n|\n|\r/g);break}var s6=this.location.start,offset_s=this.location.source&&typeof this.location.source.offset=="function"?this.location.source.offset(s6):s6,loc=this.location.source+":"+offset_s.line+":"+offset_s.column;if(src){var e6=this.location.end,filler=peg$padEnd4("",offset_s.line.toString().length," "),line2=src[s6.line-1],last=s6.line===e6.line?e6.column:line2.length+1,hatLen=last-s6.column||1;str+=`
|