tscircuit 0.0.1090 → 0.0.1091
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/browser.min.js +2 -2
- package/dist/webworker.min.js +3 -3
- package/package.json +4 -4
package/dist/webworker.min.js
CHANGED
|
@@ -355,7 +355,7 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; }
|
|
|
355
355
|
:is(button, input, select, textarea, optgroup, option)[disabled],
|
|
356
356
|
optgroup[disabled] > option,
|
|
357
357
|
fieldset[disabled]:not(fieldset[disabled] legend:first-of-type *)
|
|
358
|
-
)`,enabled:":not(:disabled)",checked:":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)",required:":is(input, select, textarea)[required]",optional:":is(input, select, textarea):not([required])",selected:"option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)",checkbox:"[type=checkbox]",file:"[type=file]",password:"[type=password]",radio:"[type=radio]",reset:"[type=reset]",image:"[type=image]",submit:"[type=submit]",parent:":not(:empty)",header:":is(h1, h2, h3, h4, h5, h6)",button:":is(button, input[type=button])",input:":is(input, textarea, select, button)",text:"input:is(:not([type!='']), [type=text])"};var import_boolbase4=__toESM(require_boolbase(),1);var PLACEHOLDER_ELEMENT={};function ensureIsTag(next2,adapter){return next2===import_boolbase4.default.falseFunc?import_boolbase4.default.falseFunc:elem=>adapter.isTag(elem)&&next2(elem)}function getNextSiblings(elem,adapter){let siblings=adapter.getSiblings(elem);if(siblings.length<=1)return[];let elemIndex=siblings.indexOf(elem);return elemIndex<0||elemIndex===siblings.length-1?[]:siblings.slice(elemIndex+1).filter(adapter.isTag)}function copyOptions(options){return{xmlMode:!!options.xmlMode,lowerCaseAttributeNames:!!options.lowerCaseAttributeNames,lowerCaseTags:!!options.lowerCaseTags,quirksMode:!!options.quirksMode,cacheResults:!!options.cacheResults,pseudos:options.pseudos,adapter:options.adapter,equals:options.equals}}var is2=(next2,token,options,context,compileToken2)=>{let func=compileToken2(token,copyOptions(options),context);return func===import_boolbase4.default.trueFunc?next2:func===import_boolbase4.default.falseFunc?import_boolbase4.default.falseFunc:elem=>func(elem)&&next2(elem)},subselects={is:is2,matches:is2,where:is2,not(next2,token,options,context,compileToken2){let func=compileToken2(token,copyOptions(options),context);return func===import_boolbase4.default.falseFunc?next2:func===import_boolbase4.default.trueFunc?import_boolbase4.default.falseFunc:elem=>!func(elem)&&next2(elem)},has(next2,subselect,options,_context,compileToken2){let{adapter}=options,opts=copyOptions(options);opts.relativeSelector=!0;let context=subselect.some(s4=>s4.some(isTraversal2))?[PLACEHOLDER_ELEMENT]:void 0,compiled=compileToken2(subselect,opts,context);if(compiled===import_boolbase4.default.falseFunc)return import_boolbase4.default.falseFunc;let hasElement=ensureIsTag(compiled,adapter);if(context&&compiled!==import_boolbase4.default.trueFunc){let{shouldTestNextSiblings=!1}=compiled;return elem=>{if(!next2(elem))return!1;context[0]=elem;let childs=adapter.getChildren(elem),nextElements=shouldTestNextSiblings?[...childs,...getNextSiblings(elem,adapter)]:childs;return adapter.existsOne(hasElement,nextElements)}}return elem=>next2(elem)&&adapter.existsOne(hasElement,adapter.getChildren(elem))}};function compilePseudoSelector(next2,selector,options,context,compileToken2){var _a359;let{name,data}=selector;if(Array.isArray(data)){if(!(name in subselects))throw new Error(`Unknown pseudo-class :${name}(${data})`);return subselects[name](next2,data,options,context,compileToken2)}let userPseudo=(_a359=options.pseudos)===null||_a359===void 0?void 0:_a359[name],stringPseudo=typeof userPseudo=="string"?userPseudo:aliases[name];if(typeof stringPseudo=="string"){if(data!=null)throw new Error(`Pseudo ${name} doesn't have any arguments`);let alias=parse(stringPseudo);return subselects.is(next2,alias,options,context,compileToken2)}if(typeof userPseudo=="function")return verifyPseudoArgs(userPseudo,name,data,1),elem=>userPseudo(elem,data)&&next2(elem);if(name in filters)return filters[name](next2,data,options,context);if(name in pseudos){let pseudo=pseudos[name];return verifyPseudoArgs(pseudo,name,data,2),elem=>pseudo(elem,options,data)&&next2(elem)}throw new Error(`Unknown pseudo-class :${name}`)}function getElementParent(node,adapter){let parent=adapter.getParent(node);return parent&&adapter.isTag(parent)?parent:null}function compileGeneralSelector(next2,selector,options,context,compileToken2){let{adapter,equals}=options;switch(selector.type){case SelectorType.PseudoElement:throw new Error("Pseudo-elements are not supported by css-select");case SelectorType.ColumnCombinator:throw new Error("Column combinators are not yet supported by css-select");case SelectorType.Attribute:{if(selector.namespace!=null)throw new Error("Namespaced attributes are not yet supported by css-select");return(!options.xmlMode||options.lowerCaseAttributeNames)&&(selector.name=selector.name.toLowerCase()),attributeRules[selector.action](next2,selector,options)}case SelectorType.Pseudo:return compilePseudoSelector(next2,selector,options,context,compileToken2);case SelectorType.Tag:{if(selector.namespace!=null)throw new Error("Namespaced tag names are not yet supported by css-select");let{name}=selector;return(!options.xmlMode||options.lowerCaseTags)&&(name=name.toLowerCase()),function(elem){return adapter.getName(elem)===name&&next2(elem)}}case SelectorType.Descendant:{if(options.cacheResults===!1||typeof WeakSet>"u")return function(elem){let current2=elem;for(;current2=getElementParent(current2,adapter);)if(next2(current2))return!0;return!1};let isFalseCache=new WeakSet;return function(elem){let current2=elem;for(;current2=getElementParent(current2,adapter);)if(!isFalseCache.has(current2)){if(adapter.isTag(current2)&&next2(current2))return!0;isFalseCache.add(current2)}return!1}}case"_flexibleDescendant":return function(elem){let current2=elem;do if(next2(current2))return!0;while(current2=getElementParent(current2,adapter));return!1};case SelectorType.Parent:return function(elem){return adapter.getChildren(elem).some(elem2=>adapter.isTag(elem2)&&next2(elem2))};case SelectorType.Child:return function(elem){let parent=adapter.getParent(elem);return parent!=null&&adapter.isTag(parent)&&next2(parent)};case SelectorType.Sibling:return function(elem){let siblings=adapter.getSiblings(elem);for(let i3=0;i3<siblings.length;i3++){let currentSibling=siblings[i3];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)&&next2(currentSibling))return!0}return!1};case SelectorType.Adjacent:return adapter.prevElementSibling?function(elem){let previous=adapter.prevElementSibling(elem);return previous!=null&&next2(previous)}:function(elem){let siblings=adapter.getSiblings(elem),lastElement;for(let i3=0;i3<siblings.length;i3++){let currentSibling=siblings[i3];if(equals(elem,currentSibling))break;adapter.isTag(currentSibling)&&(lastElement=currentSibling)}return!!lastElement&&next2(lastElement)};case SelectorType.Universal:{if(selector.namespace!=null&&selector.namespace!=="*")throw new Error("Namespaced universal selectors are not yet supported by css-select");return next2}}}function compile2(selector,options,context){let next2=compileUnsafe(selector,options,context);return ensureIsTag(next2,options.adapter)}function compileUnsafe(selector,options,context){let token=typeof selector=="string"?parse(selector):selector;return compileToken(token,options,context)}function includesScopePseudo(t6){return t6.type===SelectorType.Pseudo&&(t6.name==="scope"||Array.isArray(t6.data)&&t6.data.some(data=>data.some(includesScopePseudo)))}var DESCENDANT_TOKEN={type:SelectorType.Descendant},FLEXIBLE_DESCENDANT_TOKEN={type:"_flexibleDescendant"},SCOPE_TOKEN={type:SelectorType.Pseudo,name:"scope",data:null};function absolutize(token,{adapter},context){let hasContext=!!context?.every(e4=>{let parent=adapter.isTag(e4)&&adapter.getParent(e4);return e4===PLACEHOLDER_ELEMENT||parent&&adapter.isTag(parent)});for(let t6 of token){if(!(t6.length>0&&isTraversal2(t6[0])&&t6[0].type!==SelectorType.Descendant))if(hasContext&&!t6.some(includesScopePseudo))t6.unshift(DESCENDANT_TOKEN);else continue;t6.unshift(SCOPE_TOKEN)}}function compileToken(token,options,context){var _a359;token.forEach(sortByProcedure),context=(_a359=options.context)!==null&&_a359!==void 0?_a359:context;let isArrayContext=Array.isArray(context),finalContext=context&&(Array.isArray(context)?context:[context]);if(options.relativeSelector!==!1)absolutize(token,options,finalContext);else if(token.some(t6=>t6.length>0&&isTraversal2(t6[0])))throw new Error("Relative selectors are not allowed when the `relativeSelector` option is disabled");let shouldTestNextSiblings=!1,query=token.map(rules=>{if(rules.length>=2){let[first,second]=rules;first.type!==SelectorType.Pseudo||first.name!=="scope"||(isArrayContext&&second.type===SelectorType.Descendant?rules[1]=FLEXIBLE_DESCENDANT_TOKEN:(second.type===SelectorType.Adjacent||second.type===SelectorType.Sibling)&&(shouldTestNextSiblings=!0))}return compileRules(rules,options,finalContext)}).reduce(reduceRules,import_boolbase5.default.falseFunc);return query.shouldTestNextSiblings=shouldTestNextSiblings,query}function compileRules(rules,options,context){var _a359;return rules.reduce((previous,rule)=>previous===import_boolbase5.default.falseFunc?import_boolbase5.default.falseFunc:compileGeneralSelector(previous,rule,options,context,compileToken),(_a359=options.rootFunc)!==null&&_a359!==void 0?_a359:import_boolbase5.default.trueFunc)}function reduceRules(a3,b3){return b3===import_boolbase5.default.falseFunc||a3===import_boolbase5.default.trueFunc?a3:a3===import_boolbase5.default.falseFunc||b3===import_boolbase5.default.trueFunc?b3:function(elem){return a3(elem)||b3(elem)}}var defaultEquals=(a3,b3)=>a3===b3,defaultOptions={adapter:esm_exports2,equals:defaultEquals};function convertOptionFormats(options){var _a359,_b2,_c2,_d2;let opts=options??defaultOptions;return(_a359=opts.adapter)!==null&&_a359!==void 0||(opts.adapter=esm_exports2),(_b2=opts.equals)!==null&&_b2!==void 0||(opts.equals=(_d2=(_c2=opts.adapter)===null||_c2===void 0?void 0:_c2.equals)!==null&&_d2!==void 0?_d2:defaultEquals),opts}function wrapCompile(func){return function(selector,options,context){let opts=convertOptionFormats(options);return func(selector,opts,context)}}var compile3=wrapCompile(compile2),_compileUnsafe=wrapCompile(compileUnsafe),_compileToken=wrapCompile(compileToken);function getSelectorFunc(searchFunc){return function(query,elements,options){let opts=convertOptionFormats(options);typeof query!="function"&&(query=compileUnsafe(query,opts,elements));let filteredElements=prepareContext(elements,opts.adapter,query.shouldTestNextSiblings);return searchFunc(query,filteredElements,opts)}}function prepareContext(elems,adapter,shouldTestNextSiblings=!1){return shouldTestNextSiblings&&(elems=appendNextSiblings(elems,adapter)),Array.isArray(elems)?adapter.removeSubsets(elems):adapter.getChildren(elems)}function appendNextSiblings(elem,adapter){let elems=Array.isArray(elem)?elem.slice(0):[elem],elemsLength=elems.length;for(let i3=0;i3<elemsLength;i3++){let nextSiblings=getNextSiblings(elems[i3],adapter);elems.push(...nextSiblings)}return elems}var selectAll=getSelectorFunc((query,elems,options)=>query===import_boolbase6.default.falseFunc||!elems||elems.length===0?[]:options.adapter.findAll(query,elems)),selectOne=getSelectorFunc((query,elems,options)=>query===import_boolbase6.default.falseFunc||!elems||elems.length===0?null:options.adapter.findOne(query,elems));init_zod();init_dist();init_zod();var import_debug=__toESM(require_browser(),1);init_dist();var import_debug2=__toESM(require_browser(),1),import_debug3=__toESM(require_browser(),1);init_dist();init_src();init_parsel();var su=(soup,options={})=>{let internalStore=soup._internal_store;if(!internalStore){internalStore={counts:{}},soup._internal_store=internalStore;for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}return new Proxy({},{get:(proxy_target,component_type)=>component_type==="toArray"?()=>soup:{get:id=>soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=soup.find(e4=>e4.type===join_type&&e4[join_key]===using[join_key]);return joiner?soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return soup.find(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return soup.filter(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},insert:elm=>{var _a359;(_a359=internalStore.counts)[component_type]??(_a359[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports[component_type]??any_soup_element).parse(newElm),soup.push(newElm),newElm},delete:id=>{let elm=soup.find(e4=>e4[`${component_type}_id`]===id);elm&&soup.splice(soup.indexOf(elm),1)},update:(id,newProps)=>{let elm=soup.find(e4=>e4[`${component_type}_id`]===id);if(elm)return Object.assign(elm,newProps),elm},select:selector=>{if(component_type==="source_component")return soup.find(e4=>e4.type==="source_component"&&e4.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e4=>e4.type==="source_component"&&e4.name===component_name);if(!source_component)return null;let source_port2=soup.find(e4=>e4.type==="source_port"&&e4.source_component_id===source_component.source_component_id&&(e4.name===port_selector||(e4.port_hints??[]).includes(port_selector)));if(!source_port2)return null;if(component_type==="source_port")return source_port2;if(component_type==="pcb_port")return soup.find(e4=>e4.type==="pcb_port"&&e4.source_port_id===source_port2.source_port_id);if(component_type==="schematic_port")return soup.find(e4=>e4.type==="schematic_port"&&e4.source_port_id===source_port2.source_port_id)}}}})};su.unparsed=su;var su_default=su;var import_performance_now=__toESM(require_performance_now(),1);init_dist4();function getBoundingBox2(box2){let halfWidth=box2.width/2,halfHeight=box2.height/2;return{minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight}}function computeManhattanDistanceBetweenBoxes(boxA,boxB){let a3=getBoundingBox2(boxA),b3=getBoundingBox2(boxB),dx2=Math.max(a3.minX-b3.maxX,b3.minX-a3.maxX,0),dy2=Math.max(a3.minY-b3.maxY,b3.minY-a3.maxY,0),pointA={x:0,y:0},pointB={x:0,y:0};return dx2===0&&dy2===0?{distance:0,pointA:boxA.center,pointB:boxB.center}:(pointA.x=clamp2(boxA.center.x,b3.minX,b3.maxX),pointA.y=clamp2(boxA.center.y,b3.minY,b3.maxY),pointB.x=clamp2(boxB.center.x,a3.minX,a3.maxX),pointB.y=clamp2(boxB.center.y,a3.minY,a3.maxY),{distance:Math.hypot(pointA.x-pointB.x,pointA.y-pointB.y),pointA,pointB})}function computeDistanceBetweenBoxes2(boxA,boxB){return computeManhattanDistanceBetweenBoxes(boxA,boxB)}function computeGapBetweenBoxes(boxA,boxB){let a3=getBoundingBox2(boxA),b3=getBoundingBox2(boxB),dx2=Math.max(a3.minX-b3.maxX,b3.minX-a3.maxX,0),dy2=Math.max(a3.minY-b3.maxY,b3.minY-a3.maxY,0);return Math.hypot(dx2,dy2)}function clamp2(value,min,max){return Math.max(min,Math.min(max,value))}function findNearestPointsBetweenBoxSets2(boxSetA,boxSetB){let minDistance=Number.POSITIVE_INFINITY,nearestPointA={x:0,y:0},nearestPointB={x:0,y:0};for(let boxA of boxSetA)for(let boxB of boxSetB){let{distance:distance8,pointA,pointB}=computeManhattanDistanceBetweenBoxes(boxA,boxB);distance8<minDistance&&(minDistance=distance8,nearestPointA=pointA,nearestPointB=pointB)}return{pointA:nearestPointA,pointB:nearestPointB,distance:minDistance}}init_dist4();init_dist4();var urlAlphabet="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var nanoid=(size2=21)=>{let id="",bytes=crypto.getRandomValues(new Uint8Array(size2|=0));for(;size2--;)id+=urlAlphabet[bytes[size2]&63];return id};init_dist4();var manDist=(a3,b3)=>Math.abs(a3.x-b3.x)+Math.abs(a3.y-b3.y),dirFromAToB=(a3,b3)=>{let dx2=b3.x-a3.x,dy2=b3.y-a3.y;return Math.abs(dx2)>Math.abs(dy2)?{dx:Math.sign(dx2),dy:0}:{dx:0,dy:Math.sign(dy2)}},distAlongDir=(A4,B4,dir)=>Math.abs(A4.x-B4.x)*Math.abs(dir.dx)+Math.abs(A4.y-B4.y)*Math.abs(dir.dy),nodeName=(node,GRID_STEP=.1)=>`${Math.round(node.x/GRID_STEP)},${Math.round(node.y/GRID_STEP)}`,isCloseTo=(a3,b3)=>Math.abs(a3-b3)<1e-4,getObstaclesFromRoute=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i3=0;i3<route.length-1;i3++){let[start,end]=[route[i3],route[i3+1]],prev=i3-1>=0?route[i3-1]:null,isHorz=isCloseTo(start.y,end.y),isVert=isCloseTo(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles},ObstacleList=class{constructor(obstacles){__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);this.obstacles=obstacles.map(obstacle=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2}))}getObstacleAt(x3,y3,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x3>=obstacle.center.x-halfWidth&&x3<=obstacle.center.x+halfWidth&&y3>=obstacle.center.y-halfHeight&&y3<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x3,y3,m3){return this.getObstacleAt(x3,y3,m3)!==null}getDirectionDistancesToNearestObstacle(x3,y3){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y3>=bottom&&y3<=top&&x3>left&&(result.left=Math.min(result.left,x3-right)),y3>=bottom&&y3<=top&&x3<right&&(result.right=Math.min(result.right,left-x3)),x3>=left&&x3<=right&&y3<top&&(result.top=Math.min(result.top,bottom-y3)),x3>=left&&x3<=right&&y3>bottom&&(result.bottom=Math.min(result.bottom,y3-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x3,y:y3}=point6,{dx:dx2,dy:dy2}=dir,minDistance=1/0,collisionObstacle=null;for(let obstacle of this.obstacles){let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3<obstacle.left&&(distance8=obstacle.left-x3):dx2===-1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3>obstacle.right&&(distance8=x3-obstacle.right):dx2===0&&dy2===1?x3>leftMargin&&x3<rightMargin&&y3<obstacle.bottom&&(distance8=obstacle.bottom-y3):dx2===0&&dy2===-1&&x3>leftMargin&&x3<rightMargin&&y3>obstacle.top&&(distance8=y3-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,wallDistance:minDistance,obstacle:collisionObstacle}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top<=region.maxY&&bottom>=region.minY&&obstacles.push(obstacle)}return obstacles}};function removePathLoops(path){if(path.length<4)return path;let result=[{...path[0]}],currentLayer=path[0].layer;for(let i3=1;i3<path.length;i3++){let currentSegment={start:path[i3-1],end:path[i3]},isVia=path[i3].route_type==="via"||path[i3-1].route_type==="via";if(path[i3].layer!==currentLayer||isVia){result.push({...path[i3]}),currentLayer=path[i3].layer;continue}let intersectionFound=!1,intersectionPoint=null,intersectionIndex=-1;for(let j3=0;j3<result.length-1;j3++){let previousSegment={start:result[j3],end:result[j3+1]};if(previousSegment.start.layer===currentSegment.start.layer&&previousSegment.start.layer===currentSegment.start.layer){let intersection=findIntersection(previousSegment,currentSegment);if(intersection){intersectionFound=!0,intersectionPoint={...intersection,layer:currentLayer},intersectionIndex=j3;break}}}intersectionFound&&intersectionPoint&&(result.splice(intersectionIndex+1),result.push(intersectionPoint));let lastPoint=result[result.length-1];(lastPoint.x!==path[i3].x||lastPoint.y!==path[i3].y)&&result.push(path[i3])}return result}function findIntersection(segment1,segment2){if(segment1.start.x===segment1.end.x&&segment2.start.x===segment2.end.x||segment1.start.y===segment1.end.y&&segment2.start.y===segment2.end.y)return null;let intersectionPoint;if(segment1.start.x===segment1.end.x){let x3=segment1.start.x,y3=segment2.start.y;intersectionPoint={...segment1.start,x:x3,y:y3}}else{let x3=segment2.start.x,y3=segment1.start.y;intersectionPoint={...segment1.start,x:x3,y:y3}}return isPointInSegment(intersectionPoint,segment1)&&isPointInSegment(intersectionPoint,segment2)?intersectionPoint:null}function isPointInSegment(point6,segment2){return point6.x>=Math.min(segment2.start.x,segment2.end.x)&&point6.x<=Math.max(segment2.start.x,segment2.end.x)&&point6.y>=Math.min(segment2.start.y,segment2.end.y)&&point6.y<=Math.max(segment2.start.y,segment2.end.y)}function addViasWhenLayerChanges(route){let newRoute=[route[0]];for(let i3=1;i3<route.length-1;i3++){let[prev,current2,next2]=[route[i3-1],route[i3],route[i3+1]];newRoute.push(current2),!(current2.route_type!=="wire"||prev.route_type!=="wire"||next2.route_type!=="wire")&&prev.layer===current2.layer&¤t2.layer!==next2.layer&&newRoute.push({route_type:"via",from_layer:current2.layer,to_layer:next2.layer,x:current2.x,y:current2.y})}return newRoute.push(route[route.length-1]),newRoute}var debug=(0,import_debug2.default)("autorouter:shortenPathWithShortcuts");function shortenPathWithShortcuts(route,checkIfObstacleBetweenPoints){if(route.length<=2)return route;let shortened=[route[0]];for(let i3=1;i3<route.length;i3++){let currentSegment={start:shortened[shortened.length-1],end:route[i3]},skipToIndex=-1,currentSegmentIsVertical=currentSegment.start.x===currentSegment.end.x,currentSegmentIsHorizontal=currentSegment.start.y===currentSegment.end.y;for(let j3=i3+1;j3<route.length;j3++){if(j3<=skipToIndex)continue;let futureSegment={start:route[j3],end:route[j3+1]};if(!futureSegment.end)continue;let futureSegmentIsVertical=futureSegment.start.x===futureSegment.end.x,futureSegmentIsHorizontal=futureSegment.start.y===futureSegment.end.y,bothVertical=currentSegmentIsVertical&&futureSegmentIsVertical,bothHorizontal=currentSegmentIsHorizontal&&futureSegmentIsHorizontal;if(bothHorizontal&&bothVertical||!(bothVertical||bothHorizontal))continue;let overlapping=!1,currentMinX=Math.min(currentSegment.start.x,currentSegment.end.x),currentMaxX=Math.max(currentSegment.start.x,currentSegment.end.x),futureMinX=Math.min(futureSegment.start.x,futureSegment.end.x),futureMaxX=Math.max(futureSegment.start.x,futureSegment.end.x),currentMinY=Math.min(currentSegment.start.y,currentSegment.end.y),currentMaxY=Math.max(currentSegment.start.y,currentSegment.end.y),futureMinY=Math.min(futureSegment.start.y,futureSegment.end.y),futureMaxY=Math.max(futureSegment.start.y,futureSegment.end.y);if(bothHorizontal?overlapping=currentMinX<=futureMaxX&¤tMaxX>=futureMinX:bothVertical&&(overlapping=currentMinY<=futureMaxY&¤tMaxY>=futureMinY),!overlapping)continue;let candidateShortcuts=[],pointBeforeShortcut=shortened[shortened.length-1],pointAfterShortcut=route[j3+2];if(!pointAfterShortcut)continue;bothHorizontal&&futureMinX<currentMaxX&&pointAfterShortcut.x===futureMinX&&candidateShortcuts.push({x:futureMinX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothHorizontal&&futureMaxX>currentMinX&&pointAfterShortcut.x===futureMaxX&&candidateShortcuts.push({x:futureMaxX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothVertical&&futureMinY<currentMaxY&&pointAfterShortcut.y===futureMinY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMinY,layer:currentSegment.start.layer}),bothVertical&&futureMaxY>currentMinY&&pointAfterShortcut.y===futureMaxY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMaxY,layer:currentSegment.start.layer});let shortcutPoint=null;for(let candidateShortcut of candidateShortcuts)if(!(checkIfObstacleBetweenPoints(pointBeforeShortcut,candidateShortcut)||checkIfObstacleBetweenPoints(pointAfterShortcut,candidateShortcut))){shortcutPoint=candidateShortcut;break}if(shortcutPoint){shortened.push(shortcutPoint),i3=j3+1,skipToIndex=j3+1;break}}skipToIndex===-1&&shortened.push(route[i3])}return shortened[shortened.length-1]!==route[route.length-1]&&shortened.push(route[route.length-1]),shortened}var debug2=(0,import_debug.default)("autorouting-dataset:astar"),GeneralizedAstarAutorouter=class{constructor(opts){__publicField(this,"openSet",[]);__publicField(this,"closedSet",new Set);__publicField(this,"debug",!1);__publicField(this,"debugSolutions");__publicField(this,"debugMessage",null);__publicField(this,"debugTraceCount",0);__publicField(this,"input");__publicField(this,"obstacles");__publicField(this,"allObstacles");__publicField(this,"startNode");__publicField(this,"goalPoint");__publicField(this,"GRID_STEP");__publicField(this,"OBSTACLE_MARGIN");__publicField(this,"MAX_ITERATIONS");__publicField(this,"isRemovePathLoopsEnabled");__publicField(this,"isShortenPathWithShortcutsEnabled");__publicField(this,"GREEDY_MULTIPLIER",1.1);__publicField(this,"iterations",-1);this.input=opts.input,this.allObstacles=opts.input.obstacles,this.startNode=opts.startNode,this.goalPoint=opts.goalPoint?{l:0,...opts.goalPoint}:void 0,this.GRID_STEP=opts.GRID_STEP??.1,this.OBSTACLE_MARGIN=opts.OBSTACLE_MARGIN??.15,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??100,this.debug=opts.debug??debug2.enabled,this.isRemovePathLoopsEnabled=opts.isRemovePathLoopsEnabled??!1,this.isShortenPathWithShortcutsEnabled=opts.isShortenPathWithShortcutsEnabled??!1,this.debug&&(debug2.enabled=!0),debug2.enabled&&(this.debugSolutions={},this.debugMessage="")}getNeighbors(node){return[]}isSameNode(a3,b3){return manDist(a3,b3)<this.GRID_STEP}computeG(current2,neighbor){return current2.g+manDist(current2,neighbor)}computeH(node){return manDist(node,this.goalPoint)}getNodeName(node){return nodeName(node,this.GRID_STEP)}solveOneStep(){this.iterations+=1;let{openSet,closedSet,GRID_STEP,goalPoint}=this;openSet.sort((a3,b3)=>a3.f-b3.f);let current2=openSet.shift();if(this.computeH(current2)<=GRID_STEP*2)return{solved:!0,current:current2,newNeighbors:[]};this.closedSet.add(this.getNodeName(current2));let newNeighbors=[];for(let neighbor of this.getNeighbors(current2)){if(closedSet.has(this.getNodeName(neighbor)))continue;let tentativeG=this.computeG(current2,neighbor),existingNeighbor=this.openSet.find(n3=>this.isSameNode(n3,neighbor));if(!existingNeighbor||tentativeG<existingNeighbor.g){let h3=this.computeH(neighbor),f2=tentativeG+h3*this.GREEDY_MULTIPLIER,neighborNode={...neighbor,g:tentativeG,h:h3,f:f2,obstacleHit:neighbor.obstacleHit??void 0,manDistFromParent:manDist(current2,neighbor),nodesInPath:current2.nodesInPath+1,parent:current2,enterMarginCost:neighbor.enterMarginCost,travelMarginCostFactor:neighbor.travelMarginCostFactor};openSet.push(neighborNode),newNeighbors.push(neighborNode)}}return debug2.enabled&&(openSet.sort((a3,b3)=>a3.f-b3.f),this.drawDebugSolution({current:current2,newNeighbors})),{solved:!1,current:current2,newNeighbors}}getStartNode(connection){return{x:connection.pointsToConnect[0].x,y:connection.pointsToConnect[0].y,manDistFromParent:0,f:0,g:0,h:0,nodesInPath:0,parent:null}}layerToIndex(layer){return 0}indexToLayer(index){return"top"}preprocessConnectionBeforeSolving(connection){return connection}solveConnection(connection){if(connection.pointsToConnect.length>2)throw new Error("GeneralizedAstarAutorouter doesn't currently support 2+ points in a connection");connection=this.preprocessConnectionBeforeSolving(connection);let{pointsToConnect}=connection;for(this.iterations=0,this.closedSet=new Set,this.startNode=this.getStartNode(connection),this.goalPoint={...pointsToConnect[pointsToConnect.length-1],l:this.layerToIndex(pointsToConnect[pointsToConnect.length-1].layer)},this.openSet=[this.startNode];this.iterations<this.MAX_ITERATIONS;){let{solved,current:current2}=this.solveOneStep();if(solved){let route=[],node=current2;for(;node;){let l3=node.l;route.unshift({x:node.x,y:node.y,layer:l3!==void 0?this.indexToLayer(l3):pointsToConnect[0].layer}),node=node.parent}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations
|
|
358
|
+
)`,enabled:":not(:disabled)",checked:":is(:is(input[type=radio], input[type=checkbox])[checked], option:selected)",required:":is(input, select, textarea)[required]",optional:":is(input, select, textarea):not([required])",selected:"option:is([selected], select:not([multiple]):not(:has(> option[selected])) > :first-of-type)",checkbox:"[type=checkbox]",file:"[type=file]",password:"[type=password]",radio:"[type=radio]",reset:"[type=reset]",image:"[type=image]",submit:"[type=submit]",parent:":not(:empty)",header:":is(h1, h2, h3, h4, h5, h6)",button:":is(button, input[type=button])",input:":is(input, textarea, select, button)",text:"input:is(:not([type!='']), [type=text])"};var import_boolbase4=__toESM(require_boolbase(),1);var PLACEHOLDER_ELEMENT={};function ensureIsTag(next2,adapter){return next2===import_boolbase4.default.falseFunc?import_boolbase4.default.falseFunc:elem=>adapter.isTag(elem)&&next2(elem)}function getNextSiblings(elem,adapter){let siblings=adapter.getSiblings(elem);if(siblings.length<=1)return[];let elemIndex=siblings.indexOf(elem);return elemIndex<0||elemIndex===siblings.length-1?[]:siblings.slice(elemIndex+1).filter(adapter.isTag)}function copyOptions(options){return{xmlMode:!!options.xmlMode,lowerCaseAttributeNames:!!options.lowerCaseAttributeNames,lowerCaseTags:!!options.lowerCaseTags,quirksMode:!!options.quirksMode,cacheResults:!!options.cacheResults,pseudos:options.pseudos,adapter:options.adapter,equals:options.equals}}var is2=(next2,token,options,context,compileToken2)=>{let func=compileToken2(token,copyOptions(options),context);return func===import_boolbase4.default.trueFunc?next2:func===import_boolbase4.default.falseFunc?import_boolbase4.default.falseFunc:elem=>func(elem)&&next2(elem)},subselects={is:is2,matches:is2,where:is2,not(next2,token,options,context,compileToken2){let func=compileToken2(token,copyOptions(options),context);return func===import_boolbase4.default.falseFunc?next2:func===import_boolbase4.default.trueFunc?import_boolbase4.default.falseFunc:elem=>!func(elem)&&next2(elem)},has(next2,subselect,options,_context,compileToken2){let{adapter}=options,opts=copyOptions(options);opts.relativeSelector=!0;let context=subselect.some(s4=>s4.some(isTraversal2))?[PLACEHOLDER_ELEMENT]:void 0,compiled=compileToken2(subselect,opts,context);if(compiled===import_boolbase4.default.falseFunc)return import_boolbase4.default.falseFunc;let hasElement=ensureIsTag(compiled,adapter);if(context&&compiled!==import_boolbase4.default.trueFunc){let{shouldTestNextSiblings=!1}=compiled;return elem=>{if(!next2(elem))return!1;context[0]=elem;let childs=adapter.getChildren(elem),nextElements=shouldTestNextSiblings?[...childs,...getNextSiblings(elem,adapter)]:childs;return adapter.existsOne(hasElement,nextElements)}}return elem=>next2(elem)&&adapter.existsOne(hasElement,adapter.getChildren(elem))}};function compilePseudoSelector(next2,selector,options,context,compileToken2){var _a359;let{name,data}=selector;if(Array.isArray(data)){if(!(name in subselects))throw new Error(`Unknown pseudo-class :${name}(${data})`);return subselects[name](next2,data,options,context,compileToken2)}let userPseudo=(_a359=options.pseudos)===null||_a359===void 0?void 0:_a359[name],stringPseudo=typeof userPseudo=="string"?userPseudo:aliases[name];if(typeof stringPseudo=="string"){if(data!=null)throw new Error(`Pseudo ${name} doesn't have any arguments`);let alias=parse(stringPseudo);return subselects.is(next2,alias,options,context,compileToken2)}if(typeof userPseudo=="function")return verifyPseudoArgs(userPseudo,name,data,1),elem=>userPseudo(elem,data)&&next2(elem);if(name in filters)return filters[name](next2,data,options,context);if(name in pseudos){let pseudo=pseudos[name];return verifyPseudoArgs(pseudo,name,data,2),elem=>pseudo(elem,options,data)&&next2(elem)}throw new Error(`Unknown pseudo-class :${name}`)}function getElementParent(node,adapter){let parent=adapter.getParent(node);return parent&&adapter.isTag(parent)?parent:null}function compileGeneralSelector(next2,selector,options,context,compileToken2){let{adapter,equals}=options;switch(selector.type){case SelectorType.PseudoElement:throw new Error("Pseudo-elements are not supported by css-select");case SelectorType.ColumnCombinator:throw new Error("Column combinators are not yet supported by css-select");case SelectorType.Attribute:{if(selector.namespace!=null)throw new Error("Namespaced attributes are not yet supported by css-select");return(!options.xmlMode||options.lowerCaseAttributeNames)&&(selector.name=selector.name.toLowerCase()),attributeRules[selector.action](next2,selector,options)}case SelectorType.Pseudo:return compilePseudoSelector(next2,selector,options,context,compileToken2);case SelectorType.Tag:{if(selector.namespace!=null)throw new Error("Namespaced tag names are not yet supported by css-select");let{name}=selector;return(!options.xmlMode||options.lowerCaseTags)&&(name=name.toLowerCase()),function(elem){return adapter.getName(elem)===name&&next2(elem)}}case SelectorType.Descendant:{if(options.cacheResults===!1||typeof WeakSet>"u")return function(elem){let current2=elem;for(;current2=getElementParent(current2,adapter);)if(next2(current2))return!0;return!1};let isFalseCache=new WeakSet;return function(elem){let current2=elem;for(;current2=getElementParent(current2,adapter);)if(!isFalseCache.has(current2)){if(adapter.isTag(current2)&&next2(current2))return!0;isFalseCache.add(current2)}return!1}}case"_flexibleDescendant":return function(elem){let current2=elem;do if(next2(current2))return!0;while(current2=getElementParent(current2,adapter));return!1};case SelectorType.Parent:return function(elem){return adapter.getChildren(elem).some(elem2=>adapter.isTag(elem2)&&next2(elem2))};case SelectorType.Child:return function(elem){let parent=adapter.getParent(elem);return parent!=null&&adapter.isTag(parent)&&next2(parent)};case SelectorType.Sibling:return function(elem){let siblings=adapter.getSiblings(elem);for(let i3=0;i3<siblings.length;i3++){let currentSibling=siblings[i3];if(equals(elem,currentSibling))break;if(adapter.isTag(currentSibling)&&next2(currentSibling))return!0}return!1};case SelectorType.Adjacent:return adapter.prevElementSibling?function(elem){let previous=adapter.prevElementSibling(elem);return previous!=null&&next2(previous)}:function(elem){let siblings=adapter.getSiblings(elem),lastElement;for(let i3=0;i3<siblings.length;i3++){let currentSibling=siblings[i3];if(equals(elem,currentSibling))break;adapter.isTag(currentSibling)&&(lastElement=currentSibling)}return!!lastElement&&next2(lastElement)};case SelectorType.Universal:{if(selector.namespace!=null&&selector.namespace!=="*")throw new Error("Namespaced universal selectors are not yet supported by css-select");return next2}}}function compile2(selector,options,context){let next2=compileUnsafe(selector,options,context);return ensureIsTag(next2,options.adapter)}function compileUnsafe(selector,options,context){let token=typeof selector=="string"?parse(selector):selector;return compileToken(token,options,context)}function includesScopePseudo(t6){return t6.type===SelectorType.Pseudo&&(t6.name==="scope"||Array.isArray(t6.data)&&t6.data.some(data=>data.some(includesScopePseudo)))}var DESCENDANT_TOKEN={type:SelectorType.Descendant},FLEXIBLE_DESCENDANT_TOKEN={type:"_flexibleDescendant"},SCOPE_TOKEN={type:SelectorType.Pseudo,name:"scope",data:null};function absolutize(token,{adapter},context){let hasContext=!!context?.every(e4=>{let parent=adapter.isTag(e4)&&adapter.getParent(e4);return e4===PLACEHOLDER_ELEMENT||parent&&adapter.isTag(parent)});for(let t6 of token){if(!(t6.length>0&&isTraversal2(t6[0])&&t6[0].type!==SelectorType.Descendant))if(hasContext&&!t6.some(includesScopePseudo))t6.unshift(DESCENDANT_TOKEN);else continue;t6.unshift(SCOPE_TOKEN)}}function compileToken(token,options,context){var _a359;token.forEach(sortByProcedure),context=(_a359=options.context)!==null&&_a359!==void 0?_a359:context;let isArrayContext=Array.isArray(context),finalContext=context&&(Array.isArray(context)?context:[context]);if(options.relativeSelector!==!1)absolutize(token,options,finalContext);else if(token.some(t6=>t6.length>0&&isTraversal2(t6[0])))throw new Error("Relative selectors are not allowed when the `relativeSelector` option is disabled");let shouldTestNextSiblings=!1,query=token.map(rules=>{if(rules.length>=2){let[first,second]=rules;first.type!==SelectorType.Pseudo||first.name!=="scope"||(isArrayContext&&second.type===SelectorType.Descendant?rules[1]=FLEXIBLE_DESCENDANT_TOKEN:(second.type===SelectorType.Adjacent||second.type===SelectorType.Sibling)&&(shouldTestNextSiblings=!0))}return compileRules(rules,options,finalContext)}).reduce(reduceRules,import_boolbase5.default.falseFunc);return query.shouldTestNextSiblings=shouldTestNextSiblings,query}function compileRules(rules,options,context){var _a359;return rules.reduce((previous,rule)=>previous===import_boolbase5.default.falseFunc?import_boolbase5.default.falseFunc:compileGeneralSelector(previous,rule,options,context,compileToken),(_a359=options.rootFunc)!==null&&_a359!==void 0?_a359:import_boolbase5.default.trueFunc)}function reduceRules(a3,b3){return b3===import_boolbase5.default.falseFunc||a3===import_boolbase5.default.trueFunc?a3:a3===import_boolbase5.default.falseFunc||b3===import_boolbase5.default.trueFunc?b3:function(elem){return a3(elem)||b3(elem)}}var defaultEquals=(a3,b3)=>a3===b3,defaultOptions={adapter:esm_exports2,equals:defaultEquals};function convertOptionFormats(options){var _a359,_b2,_c2,_d2;let opts=options??defaultOptions;return(_a359=opts.adapter)!==null&&_a359!==void 0||(opts.adapter=esm_exports2),(_b2=opts.equals)!==null&&_b2!==void 0||(opts.equals=(_d2=(_c2=opts.adapter)===null||_c2===void 0?void 0:_c2.equals)!==null&&_d2!==void 0?_d2:defaultEquals),opts}function wrapCompile(func){return function(selector,options,context){let opts=convertOptionFormats(options);return func(selector,opts,context)}}var compile3=wrapCompile(compile2),_compileUnsafe=wrapCompile(compileUnsafe),_compileToken=wrapCompile(compileToken);function getSelectorFunc(searchFunc){return function(query,elements,options){let opts=convertOptionFormats(options);typeof query!="function"&&(query=compileUnsafe(query,opts,elements));let filteredElements=prepareContext(elements,opts.adapter,query.shouldTestNextSiblings);return searchFunc(query,filteredElements,opts)}}function prepareContext(elems,adapter,shouldTestNextSiblings=!1){return shouldTestNextSiblings&&(elems=appendNextSiblings(elems,adapter)),Array.isArray(elems)?adapter.removeSubsets(elems):adapter.getChildren(elems)}function appendNextSiblings(elem,adapter){let elems=Array.isArray(elem)?elem.slice(0):[elem],elemsLength=elems.length;for(let i3=0;i3<elemsLength;i3++){let nextSiblings=getNextSiblings(elems[i3],adapter);elems.push(...nextSiblings)}return elems}var selectAll=getSelectorFunc((query,elems,options)=>query===import_boolbase6.default.falseFunc||!elems||elems.length===0?[]:options.adapter.findAll(query,elems)),selectOne=getSelectorFunc((query,elems,options)=>query===import_boolbase6.default.falseFunc||!elems||elems.length===0?null:options.adapter.findOne(query,elems));init_zod();init_dist();init_zod();var import_debug=__toESM(require_browser(),1);init_dist();var import_debug2=__toESM(require_browser(),1),import_debug3=__toESM(require_browser(),1);init_dist();init_src();init_parsel();var su=(soup,options={})=>{let internalStore=soup._internal_store;if(!internalStore){internalStore={counts:{}},soup._internal_store=internalStore;for(let elm of soup){let type=elm.type,idVal=elm[`${type}_id`];if(!idVal)continue;let idNum=Number.parseInt(idVal.split("_").pop());Number.isNaN(idNum)||(internalStore.counts[type]=Math.max(internalStore.counts[type]??0,idNum))}}return new Proxy({},{get:(proxy_target,component_type)=>component_type==="toArray"?()=>soup:{get:id=>soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id),getUsing:using=>{let keys=Object.keys(using);if(keys.length!==1)throw new Error("getUsing requires exactly one key, e.g. { pcb_component_id }");let join_key=keys[0],join_type=join_key.replace("_id",""),joiner=soup.find(e4=>e4.type===join_type&&e4[join_key]===using[join_key]);return joiner?soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===joiner[`${component_type}_id`]):null},getWhere:where=>{let keys=Object.keys(where);return soup.find(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},list:where=>{let keys=where?Object.keys(where):[];return soup.filter(e4=>e4.type===component_type&&keys.every(key=>e4[key]===where[key]))},insert:elm=>{var _a359;(_a359=internalStore.counts)[component_type]??(_a359[component_type]=-1),internalStore.counts[component_type]++;let index=internalStore.counts[component_type],newElm={type:component_type,[`${component_type}_id`]:`${component_type}_${index}`,...elm};return options.validateInserts&&(dist_exports[component_type]??any_soup_element).parse(newElm),soup.push(newElm),newElm},delete:id=>{let elm=soup.find(e4=>e4[`${component_type}_id`]===id);elm&&soup.splice(soup.indexOf(elm),1)},update:(id,newProps)=>{let elm=soup.find(e4=>e4.type===component_type&&e4[`${component_type}_id`]===id);if(elm)return Object.assign(elm,newProps),elm},select:selector=>{if(component_type==="source_component")return soup.find(e4=>e4.type==="source_component"&&e4.name===selector.replace(/\./g,""));if(component_type==="pcb_port"||component_type==="source_port"||component_type==="schematic_port"){let[component_name,port_selector]=selector.replace(/\./g,"").split(/[\s\>]+/),source_component=soup.find(e4=>e4.type==="source_component"&&e4.name===component_name);if(!source_component)return null;let source_port2=soup.find(e4=>e4.type==="source_port"&&e4.source_component_id===source_component.source_component_id&&(e4.name===port_selector||(e4.port_hints??[]).includes(port_selector)));if(!source_port2)return null;if(component_type==="source_port")return source_port2;if(component_type==="pcb_port")return soup.find(e4=>e4.type==="pcb_port"&&e4.source_port_id===source_port2.source_port_id);if(component_type==="schematic_port")return soup.find(e4=>e4.type==="schematic_port"&&e4.source_port_id===source_port2.source_port_id)}}}})};su.unparsed=su;var su_default=su;var import_performance_now=__toESM(require_performance_now(),1);init_dist4();function getBoundingBox2(box2){let halfWidth=box2.width/2,halfHeight=box2.height/2;return{minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight}}function computeManhattanDistanceBetweenBoxes(boxA,boxB){let a3=getBoundingBox2(boxA),b3=getBoundingBox2(boxB),dx2=Math.max(a3.minX-b3.maxX,b3.minX-a3.maxX,0),dy2=Math.max(a3.minY-b3.maxY,b3.minY-a3.maxY,0),pointA={x:0,y:0},pointB={x:0,y:0};return dx2===0&&dy2===0?{distance:0,pointA:boxA.center,pointB:boxB.center}:(pointA.x=clamp2(boxA.center.x,b3.minX,b3.maxX),pointA.y=clamp2(boxA.center.y,b3.minY,b3.maxY),pointB.x=clamp2(boxB.center.x,a3.minX,a3.maxX),pointB.y=clamp2(boxB.center.y,a3.minY,a3.maxY),{distance:Math.hypot(pointA.x-pointB.x,pointA.y-pointB.y),pointA,pointB})}function computeDistanceBetweenBoxes2(boxA,boxB){return computeManhattanDistanceBetweenBoxes(boxA,boxB)}function computeGapBetweenBoxes(boxA,boxB){let a3=getBoundingBox2(boxA),b3=getBoundingBox2(boxB),dx2=Math.max(a3.minX-b3.maxX,b3.minX-a3.maxX,0),dy2=Math.max(a3.minY-b3.maxY,b3.minY-a3.maxY,0);return Math.hypot(dx2,dy2)}function clamp2(value,min,max){return Math.max(min,Math.min(max,value))}function findNearestPointsBetweenBoxSets2(boxSetA,boxSetB){let minDistance=Number.POSITIVE_INFINITY,nearestPointA={x:0,y:0},nearestPointB={x:0,y:0};for(let boxA of boxSetA)for(let boxB of boxSetB){let{distance:distance8,pointA,pointB}=computeManhattanDistanceBetweenBoxes(boxA,boxB);distance8<minDistance&&(minDistance=distance8,nearestPointA=pointA,nearestPointB=pointB)}return{pointA:nearestPointA,pointB:nearestPointB,distance:minDistance}}init_dist4();init_dist4();var urlAlphabet="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var nanoid=(size2=21)=>{let id="",bytes=crypto.getRandomValues(new Uint8Array(size2|=0));for(;size2--;)id+=urlAlphabet[bytes[size2]&63];return id};init_dist4();var manDist=(a3,b3)=>Math.abs(a3.x-b3.x)+Math.abs(a3.y-b3.y),dirFromAToB=(a3,b3)=>{let dx2=b3.x-a3.x,dy2=b3.y-a3.y;return Math.abs(dx2)>Math.abs(dy2)?{dx:Math.sign(dx2),dy:0}:{dx:0,dy:Math.sign(dy2)}},distAlongDir=(A4,B4,dir)=>Math.abs(A4.x-B4.x)*Math.abs(dir.dx)+Math.abs(A4.y-B4.y)*Math.abs(dir.dy),nodeName=(node,GRID_STEP=.1)=>`${Math.round(node.x/GRID_STEP)},${Math.round(node.y/GRID_STEP)}`,isCloseTo=(a3,b3)=>Math.abs(a3-b3)<1e-4,getObstaclesFromRoute=(route,source_trace_id,{viaDiameter=.5}={})=>{let obstacles=[];for(let i3=0;i3<route.length-1;i3++){let[start,end]=[route[i3],route[i3+1]],prev=i3-1>=0?route[i3-1]:null,isHorz=isCloseTo(start.y,end.y),isVert=isCloseTo(start.x,end.x);if(!isHorz&&!isVert)throw new Error(`getObstaclesFromTrace currently only supports horizontal and vertical traces (not diagonals) Conflicting trace: ${source_trace_id}, start: (${start.x}, ${start.y}), end: (${end.x}, ${end.y})`);let obstacle={type:"rect",layers:[start.layer],center:{x:(start.x+end.x)/2,y:(start.y+end.y)/2},width:isHorz?Math.abs(start.x-end.x):.1,height:isVert?Math.abs(start.y-end.y):.1,connectedTo:[source_trace_id]};if(obstacles.push(obstacle),prev&&prev.layer===start.layer&&start.layer!==end.layer){let via={type:"rect",layers:[start.layer,end.layer],center:{x:start.x,y:start.y},connectedTo:[source_trace_id],width:viaDiameter,height:viaDiameter};obstacles.push(via)}}return obstacles},ObstacleList=class{constructor(obstacles){__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);this.obstacles=obstacles.map(obstacle=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2}))}getObstacleAt(x3,y3,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x3>=obstacle.center.x-halfWidth&&x3<=obstacle.center.x+halfWidth&&y3>=obstacle.center.y-halfHeight&&y3<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x3,y3,m3){return this.getObstacleAt(x3,y3,m3)!==null}getDirectionDistancesToNearestObstacle(x3,y3){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y3>=bottom&&y3<=top&&x3>left&&(result.left=Math.min(result.left,x3-right)),y3>=bottom&&y3<=top&&x3<right&&(result.right=Math.min(result.right,left-x3)),x3>=left&&x3<=right&&y3<top&&(result.top=Math.min(result.top,bottom-y3)),x3>=left&&x3<=right&&y3>bottom&&(result.bottom=Math.min(result.bottom,y3-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x3,y:y3}=point6,{dx:dx2,dy:dy2}=dir,minDistance=1/0,collisionObstacle=null;for(let obstacle of this.obstacles){let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3<obstacle.left&&(distance8=obstacle.left-x3):dx2===-1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3>obstacle.right&&(distance8=x3-obstacle.right):dx2===0&&dy2===1?x3>leftMargin&&x3<rightMargin&&y3<obstacle.bottom&&(distance8=obstacle.bottom-y3):dx2===0&&dy2===-1&&x3>leftMargin&&x3<rightMargin&&y3>obstacle.top&&(distance8=y3-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,wallDistance:minDistance,obstacle:collisionObstacle}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top<=region.maxY&&bottom>=region.minY&&obstacles.push(obstacle)}return obstacles}};function removePathLoops(path){if(path.length<4)return path;let result=[{...path[0]}],currentLayer=path[0].layer;for(let i3=1;i3<path.length;i3++){let currentSegment={start:path[i3-1],end:path[i3]},isVia=path[i3].route_type==="via"||path[i3-1].route_type==="via";if(path[i3].layer!==currentLayer||isVia){result.push({...path[i3]}),currentLayer=path[i3].layer;continue}let intersectionFound=!1,intersectionPoint=null,intersectionIndex=-1;for(let j3=0;j3<result.length-1;j3++){let previousSegment={start:result[j3],end:result[j3+1]};if(previousSegment.start.layer===currentSegment.start.layer&&previousSegment.start.layer===currentSegment.start.layer){let intersection=findIntersection(previousSegment,currentSegment);if(intersection){intersectionFound=!0,intersectionPoint={...intersection,layer:currentLayer},intersectionIndex=j3;break}}}intersectionFound&&intersectionPoint&&(result.splice(intersectionIndex+1),result.push(intersectionPoint));let lastPoint=result[result.length-1];(lastPoint.x!==path[i3].x||lastPoint.y!==path[i3].y)&&result.push(path[i3])}return result}function findIntersection(segment1,segment2){if(segment1.start.x===segment1.end.x&&segment2.start.x===segment2.end.x||segment1.start.y===segment1.end.y&&segment2.start.y===segment2.end.y)return null;let intersectionPoint;if(segment1.start.x===segment1.end.x){let x3=segment1.start.x,y3=segment2.start.y;intersectionPoint={...segment1.start,x:x3,y:y3}}else{let x3=segment2.start.x,y3=segment1.start.y;intersectionPoint={...segment1.start,x:x3,y:y3}}return isPointInSegment(intersectionPoint,segment1)&&isPointInSegment(intersectionPoint,segment2)?intersectionPoint:null}function isPointInSegment(point6,segment2){return point6.x>=Math.min(segment2.start.x,segment2.end.x)&&point6.x<=Math.max(segment2.start.x,segment2.end.x)&&point6.y>=Math.min(segment2.start.y,segment2.end.y)&&point6.y<=Math.max(segment2.start.y,segment2.end.y)}function addViasWhenLayerChanges(route){let newRoute=[route[0]];for(let i3=1;i3<route.length-1;i3++){let[prev,current2,next2]=[route[i3-1],route[i3],route[i3+1]];newRoute.push(current2),!(current2.route_type!=="wire"||prev.route_type!=="wire"||next2.route_type!=="wire")&&prev.layer===current2.layer&¤t2.layer!==next2.layer&&newRoute.push({route_type:"via",from_layer:current2.layer,to_layer:next2.layer,x:current2.x,y:current2.y})}return newRoute.push(route[route.length-1]),newRoute}var debug=(0,import_debug2.default)("autorouter:shortenPathWithShortcuts");function shortenPathWithShortcuts(route,checkIfObstacleBetweenPoints){if(route.length<=2)return route;let shortened=[route[0]];for(let i3=1;i3<route.length;i3++){let currentSegment={start:shortened[shortened.length-1],end:route[i3]},skipToIndex=-1,currentSegmentIsVertical=currentSegment.start.x===currentSegment.end.x,currentSegmentIsHorizontal=currentSegment.start.y===currentSegment.end.y;for(let j3=i3+1;j3<route.length;j3++){if(j3<=skipToIndex)continue;let futureSegment={start:route[j3],end:route[j3+1]};if(!futureSegment.end)continue;let futureSegmentIsVertical=futureSegment.start.x===futureSegment.end.x,futureSegmentIsHorizontal=futureSegment.start.y===futureSegment.end.y,bothVertical=currentSegmentIsVertical&&futureSegmentIsVertical,bothHorizontal=currentSegmentIsHorizontal&&futureSegmentIsHorizontal;if(bothHorizontal&&bothVertical||!(bothVertical||bothHorizontal))continue;let overlapping=!1,currentMinX=Math.min(currentSegment.start.x,currentSegment.end.x),currentMaxX=Math.max(currentSegment.start.x,currentSegment.end.x),futureMinX=Math.min(futureSegment.start.x,futureSegment.end.x),futureMaxX=Math.max(futureSegment.start.x,futureSegment.end.x),currentMinY=Math.min(currentSegment.start.y,currentSegment.end.y),currentMaxY=Math.max(currentSegment.start.y,currentSegment.end.y),futureMinY=Math.min(futureSegment.start.y,futureSegment.end.y),futureMaxY=Math.max(futureSegment.start.y,futureSegment.end.y);if(bothHorizontal?overlapping=currentMinX<=futureMaxX&¤tMaxX>=futureMinX:bothVertical&&(overlapping=currentMinY<=futureMaxY&¤tMaxY>=futureMinY),!overlapping)continue;let candidateShortcuts=[],pointBeforeShortcut=shortened[shortened.length-1],pointAfterShortcut=route[j3+2];if(!pointAfterShortcut)continue;bothHorizontal&&futureMinX<currentMaxX&&pointAfterShortcut.x===futureMinX&&candidateShortcuts.push({x:futureMinX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothHorizontal&&futureMaxX>currentMinX&&pointAfterShortcut.x===futureMaxX&&candidateShortcuts.push({x:futureMaxX,y:currentSegment.start.y,layer:currentSegment.start.layer}),bothVertical&&futureMinY<currentMaxY&&pointAfterShortcut.y===futureMinY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMinY,layer:currentSegment.start.layer}),bothVertical&&futureMaxY>currentMinY&&pointAfterShortcut.y===futureMaxY&&candidateShortcuts.push({x:currentSegment.start.x,y:futureMaxY,layer:currentSegment.start.layer});let shortcutPoint=null;for(let candidateShortcut of candidateShortcuts)if(!(checkIfObstacleBetweenPoints(pointBeforeShortcut,candidateShortcut)||checkIfObstacleBetweenPoints(pointAfterShortcut,candidateShortcut))){shortcutPoint=candidateShortcut;break}if(shortcutPoint){shortened.push(shortcutPoint),i3=j3+1,skipToIndex=j3+1;break}}skipToIndex===-1&&shortened.push(route[i3])}return shortened[shortened.length-1]!==route[route.length-1]&&shortened.push(route[route.length-1]),shortened}var debug2=(0,import_debug.default)("autorouting-dataset:astar"),GeneralizedAstarAutorouter=class{constructor(opts){__publicField(this,"openSet",[]);__publicField(this,"closedSet",new Set);__publicField(this,"debug",!1);__publicField(this,"debugSolutions");__publicField(this,"debugMessage",null);__publicField(this,"debugTraceCount",0);__publicField(this,"input");__publicField(this,"obstacles");__publicField(this,"allObstacles");__publicField(this,"startNode");__publicField(this,"goalPoint");__publicField(this,"GRID_STEP");__publicField(this,"OBSTACLE_MARGIN");__publicField(this,"MAX_ITERATIONS");__publicField(this,"isRemovePathLoopsEnabled");__publicField(this,"isShortenPathWithShortcutsEnabled");__publicField(this,"GREEDY_MULTIPLIER",1.1);__publicField(this,"iterations",-1);this.input=opts.input,this.allObstacles=opts.input.obstacles,this.startNode=opts.startNode,this.goalPoint=opts.goalPoint?{l:0,...opts.goalPoint}:void 0,this.GRID_STEP=opts.GRID_STEP??.1,this.OBSTACLE_MARGIN=opts.OBSTACLE_MARGIN??.15,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??100,this.debug=opts.debug??debug2.enabled,this.isRemovePathLoopsEnabled=opts.isRemovePathLoopsEnabled??!1,this.isShortenPathWithShortcutsEnabled=opts.isShortenPathWithShortcutsEnabled??!1,this.debug&&(debug2.enabled=!0),debug2.enabled&&(this.debugSolutions={},this.debugMessage="")}getNeighbors(node){return[]}isSameNode(a3,b3){return manDist(a3,b3)<this.GRID_STEP}computeG(current2,neighbor){return current2.g+manDist(current2,neighbor)}computeH(node){return manDist(node,this.goalPoint)}getNodeName(node){return nodeName(node,this.GRID_STEP)}solveOneStep(){this.iterations+=1;let{openSet,closedSet,GRID_STEP,goalPoint}=this;openSet.sort((a3,b3)=>a3.f-b3.f);let current2=openSet.shift();if(this.computeH(current2)<=GRID_STEP*2)return{solved:!0,current:current2,newNeighbors:[]};this.closedSet.add(this.getNodeName(current2));let newNeighbors=[];for(let neighbor of this.getNeighbors(current2)){if(closedSet.has(this.getNodeName(neighbor)))continue;let tentativeG=this.computeG(current2,neighbor),existingNeighbor=this.openSet.find(n3=>this.isSameNode(n3,neighbor));if(!existingNeighbor||tentativeG<existingNeighbor.g){let h3=this.computeH(neighbor),f2=tentativeG+h3*this.GREEDY_MULTIPLIER,neighborNode={...neighbor,g:tentativeG,h:h3,f:f2,obstacleHit:neighbor.obstacleHit??void 0,manDistFromParent:manDist(current2,neighbor),nodesInPath:current2.nodesInPath+1,parent:current2,enterMarginCost:neighbor.enterMarginCost,travelMarginCostFactor:neighbor.travelMarginCostFactor};openSet.push(neighborNode),newNeighbors.push(neighborNode)}}return debug2.enabled&&(openSet.sort((a3,b3)=>a3.f-b3.f),this.drawDebugSolution({current:current2,newNeighbors})),{solved:!1,current:current2,newNeighbors}}getStartNode(connection){return{x:connection.pointsToConnect[0].x,y:connection.pointsToConnect[0].y,manDistFromParent:0,f:0,g:0,h:0,nodesInPath:0,parent:null}}layerToIndex(layer){return 0}indexToLayer(index){return"top"}preprocessConnectionBeforeSolving(connection){return connection}solveConnection(connection){if(connection.pointsToConnect.length>2)throw new Error("GeneralizedAstarAutorouter doesn't currently support 2+ points in a connection");connection=this.preprocessConnectionBeforeSolving(connection);let{pointsToConnect}=connection;for(this.iterations=0,this.closedSet=new Set,this.startNode=this.getStartNode(connection),this.goalPoint={...pointsToConnect[pointsToConnect.length-1],l:this.layerToIndex(pointsToConnect[pointsToConnect.length-1].layer)},this.openSet=[this.startNode];this.iterations<this.MAX_ITERATIONS;){let{solved,current:current2}=this.solveOneStep();if(solved){let route=[],node=current2;for(;node;){let l3=node.l;route.unshift({x:node.x,y:node.y,layer:l3!==void 0?this.indexToLayer(l3):pointsToConnect[0].layer}),node=node.parent}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations
|
|
359
359
|
`),this.isRemovePathLoopsEnabled&&(route=removePathLoops(route)),this.isShortenPathWithShortcutsEnabled&&(route=shortenPathWithShortcuts(route,(A4,B4)=>{if(A4.x===B4.x&&A4.y===B4.y)return!1;let collision=this.obstacles.getOrthoDirectionCollisionInfo({x:A4.x,y:A4.y,l:this.layerToIndex(A4.layer)??0},{dx:Math.sign(B4.x-A4.x),dy:Math.sign(B4.y-A4.y),dl:0},{margin:.05}),dist3=Math.sqrt((A4.x-B4.x)**2+(A4.y-B4.y)**2);return collision.wallDistance<dist3})),{solved:!0,route,connectionName:connection.name}}if(this.openSet.length===0)break}return debug2.enabled&&(this.debugMessage+=`t${this.debugTraceCount}: ${this.iterations} iterations (failed)
|
|
360
360
|
`),{solved:!1,connectionName:connection.name}}createObstacleList({dominantLayer,connection,obstaclesFromTraces}){return new ObstacleList(this.allObstacles.filter(obstacle=>!obstacle.connectedTo.includes(connection.name)).filter(obstacle=>obstacle.layers.includes(dominantLayer)).concat(obstaclesFromTraces??[]))}postprocessConnectionSolveResult(connection,result){return result}solve(){let solutions=[],obstaclesFromTraces=[];this.debugTraceCount=0;for(let connection of this.input.connections){let dominantLayer=connection.pointsToConnect[0].layer??"top";this.debugTraceCount+=1,this.obstacles=this.createObstacleList({dominantLayer,connection,obstaclesFromTraces});let result=this.solveConnection(connection);result=this.postprocessConnectionSolveResult(connection,result),solutions.push(result),debug2.enabled&&this.drawDebugTraceObstacles(obstaclesFromTraces),result.solved&&obstaclesFromTraces.push(...getObstaclesFromRoute(result.route.map(p4=>({x:p4.x,y:p4.y,layer:p4.layer??dominantLayer})),connection.name))}return solutions}solveAndMapToTraces(){return this.solve().flatMap(solution=>solution.solved?[{type:"pcb_trace",pcb_trace_id:`pcb_trace_for_${solution.connectionName}`,route:addViasWhenLayerChanges(solution.route.map(point6=>({route_type:"wire",x:point6.x,y:point6.y,width:this.input.minTraceWidth,layer:point6.layer})))}]:[])}getDebugGroup(){let dgn=`t${this.debugTraceCount}_iter[${this.iterations-1}]`;return this.iterations<30||this.iterations<100&&this.iterations%10===0||this.iterations<1e3&&this.iterations%100===0||!this.debugSolutions?dgn:null}drawDebugTraceObstacles(obstacles){let{debugTraceCount,debugSolutions}=this;for(let key in debugSolutions)key.startsWith(`t${debugTraceCount}_`)&&debugSolutions[key].push(...obstacles.map((obstacle,i3)=>({type:"pcb_smtpad",pcb_component_id:"",layer:obstacle.layers[0],width:obstacle.width,shape:"rect",x:obstacle.center.x,y:obstacle.center.y,pcb_smtpad_id:`trace_obstacle_${i3}`,height:obstacle.height})))}drawDebugSolution({current:current2,newNeighbors}){let debugGroup=this.getDebugGroup();if(!debugGroup)return;let{openSet,debugTraceCount,debugSolutions}=this;debugSolutions[debugGroup]??(debugSolutions[debugGroup]=[]);let debugSolution=debugSolutions[debugGroup];debugSolution.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`debug_note_${current2.x}_${current2.y}`,font:"tscircuit2024",font_size:.25,text:"X"+(current2.l!==void 0?current2.l:""),pcb_component_id:"",layer:"top",anchor_position:{x:current2.x,y:current2.y},anchor_alignment:"center"});for(let i3=0;i3<openSet.length;i3++){let node=openSet[i3];debugSolution.push({type:"pcb_fabrication_note_path",pcb_component_id:"",pcb_fabrication_note_path_id:`note_path_${node.x}_${node.y}`,layer:"top",route:[[0,.05],[.05,0],[0,-.05],[-.05,0],[0,.05]].map(([dx2,dy2])=>({x:node.x+dx2,y:node.y+dy2})),stroke_width:.01}),debugSolution.push({type:"pcb_fabrication_note_text",pcb_fabrication_note_text_id:`debug_note_${node.x}_${node.y}`,font:"tscircuit2024",font_size:.03,text:i3.toString(),pcb_component_id:"",layer:"top",anchor_position:{x:node.x,y:node.y},anchor_alignment:"center"})}if(current2.parent){let path=[],p4=current2;for(;p4;)path.unshift(p4),p4=p4.parent;debugSolution.push({type:"pcb_fabrication_note_path",pcb_component_id:"",pcb_fabrication_note_path_id:`note_path_${current2.x}_${current2.y}`,layer:"top",route:path,stroke_width:.01})}}},debug3=(0,import_debug3.default)("autorouting-dataset:infinite-grid-ijump-astar:get-distance-to-overcome-obstacle");function getDistanceToOvercomeObstacle({node,travelDir,wallDir,obstacle,obstacles,obstaclesInRow=0,OBSTACLE_MARGIN=.15,SHOULD_DETECT_CONJOINED_OBSTACLES=!1,MAX_CONJOINED_OBSTACLES=20}){let distToOvercomeObstacle;if(travelDir.dx===0?travelDir.dy>0?distToOvercomeObstacle=obstacle.center.y+obstacle.height/2-node.y:distToOvercomeObstacle=node.y-(obstacle.center.y-obstacle.height/2):travelDir.dx>0?distToOvercomeObstacle=obstacle.center.x+obstacle.width/2-node.x:distToOvercomeObstacle=node.x-(obstacle.center.x-obstacle.width/2),distToOvercomeObstacle+=OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES&&obstaclesInRow<MAX_CONJOINED_OBSTACLES){let obstacleAtEnd=obstacles.getObstacleAt(node.x+travelDir.dx*distToOvercomeObstacle+wallDir.dx*(wallDir.wallDistance+.001),node.y+travelDir.dy*distToOvercomeObstacle+wallDir.dy*(wallDir.wallDistance+.001));if(obstacleAtEnd===obstacle)return distToOvercomeObstacle;if(obstacleAtEnd&&obstacleAtEnd.type==="rect"){let extendingAlongXAxis=travelDir.dy===0,o1OrthoDim=extendingAlongXAxis?obstacle.height:obstacle.width;if((extendingAlongXAxis?obstacleAtEnd.height:obstacleAtEnd.width)>o1OrthoDim)return debug3("next obstacle on path is bigger, not trying to overcome it"),distToOvercomeObstacle;let endObstacleDistToOvercome=getDistanceToOvercomeObstacle({node:{x:node.x+travelDir.dx*distToOvercomeObstacle,y:node.y+travelDir.dy*distToOvercomeObstacle},travelDir,wallDir,obstacle:obstacleAtEnd,obstacles,obstaclesInRow:obstaclesInRow+1,SHOULD_DETECT_CONJOINED_OBSTACLES,MAX_CONJOINED_OBSTACLES,OBSTACLE_MARGIN});distToOvercomeObstacle+=endObstacleDistToOvercome}}return distToOvercomeObstacle}var IJumpAutorouter=class extends GeneralizedAstarAutorouter{constructor(){super(...arguments);__publicField(this,"MAX_ITERATIONS",200)}getNeighbors(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,forwardDir;node.parent?forwardDir=dirFromAToB(node.parent,node):forwardDir=dirFromAToB(node,goalPoint);let travelDirs1=[{dx:0,dy:1},{dx:1,dy:0},{dx:0,dy:-1},{dx:-1,dy:0}].filter(dir=>dir.dx===forwardDir.dx*-1&&dir.dy===forwardDir.dy*-1?!1:!(dir.dx===forwardDir.dx&&dir.dy===forwardDir.dy&&node.parent?.obstacleHit)).map(dir=>obstacles.getOrthoDirectionCollisionInfo(node,dir,{margin:this.OBSTACLE_MARGIN})).filter(dir=>dir.wallDistance>=this.OBSTACLE_MARGIN),travelDirs2=[];for(let travelDir of travelDirs1){let overcomeDistance=null;node?.obstacleHit&&(overcomeDistance=getDistanceToOvercomeObstacle({node,travelDir,wallDir:{...forwardDir,wallDistance:this.OBSTACLE_MARGIN},obstacle:node.obstacleHit,obstacles,OBSTACLE_MARGIN:this.OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES:!0}));let goalDistAlongTravelDir=distAlongDir(node,goalPoint,travelDir),isGoalInTravelDir=(travelDir.dx===0||Math.sign(goalPoint.x-node.x)===travelDir.dx)&&(travelDir.dy===0||Math.sign(goalPoint.y-node.y)===travelDir.dy);goalDistAlongTravelDir<travelDir.wallDistance&&goalDistAlongTravelDir>0&&isGoalInTravelDir?travelDirs2.push({...travelDir,travelDistance:goalDistAlongTravelDir}):overcomeDistance!==null&&overcomeDistance<travelDir.wallDistance?travelDirs2.push({...travelDir,travelDistance:overcomeDistance}):travelDir.wallDistance!==1/0&&travelDirs2.push({...travelDir,travelDistance:travelDir.wallDistance-this.OBSTACLE_MARGIN})}return travelDirs2.filter(dir=>!obstacles.isObstacleAt(node.x+dir.dx*dir.travelDistance,node.y+dir.dy*dir.travelDistance)).map(dir=>({x:node.x+dir.dx*dir.travelDistance,y:node.y+dir.dy*dir.travelDistance,obstacleHit:dir.obstacle}))}};function generateApproximatingRects(rotatedRect,numRects=4){let{center:center2,width,height,rotation:rotation4}=rotatedRect,rects=[],angleRad=rotation4*Math.PI/180,cosAngle=Math.cos(angleRad),sinAngle=Math.sin(angleRad),normalizedRotation=(rotation4%360+360)%360;if(height<=width?normalizedRotation>=45&&normalizedRotation<135||normalizedRotation>=225&&normalizedRotation<315:normalizedRotation>=135&&normalizedRotation<225||normalizedRotation>=315||normalizedRotation<45){let sliceWidth=width/numRects;for(let i3=0;i3<numRects;i3++){let x3=(i3-numRects/2+.5)*sliceWidth,rotatedX=-x3*cosAngle,rotatedY=-x3*sinAngle,coverageWidth=sliceWidth*1.1,coverageHeight=Math.abs(height*cosAngle)+Math.abs(sliceWidth*sinAngle);rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}else{let sliceHeight=height/numRects;for(let i3=0;i3<numRects;i3++){let y3=(i3-numRects/2+.5)*sliceHeight,rotatedX=-y3*sinAngle,rotatedY=y3*cosAngle,coverageWidth=Math.abs(width*cosAngle)+Math.abs(sliceHeight*sinAngle),coverageHeight=sliceHeight*1.1;rects.push({center:{x:center2.x+rotatedX,y:center2.y+rotatedY},width:coverageWidth,height:coverageHeight})}}return rects}var EVERY_LAYER=["top","inner1","inner2","bottom"],getObstaclesFromCircuitJson=(soup,connMap)=>{let withNetId=idList=>connMap?idList.concat(idList.map(id=>connMap?.getNetConnectedToId(id)).filter(Boolean)):idList,obstacles=[];for(let element of soup)if(element.type==="pcb_smtpad"){if(element.shape==="circle")obstacles.push({type:"oval",layers:[element.layer],center:{x:element.x,y:element.y},width:element.radius*2,height:element.radius*2,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rect")obstacles.push({type:"rect",layers:[element.layer],center:{x:element.x,y:element.y},width:element.width,height:element.height,connectedTo:withNetId([element.pcb_smtpad_id])});else if(element.shape==="rotated_rect"){let rotatedRect={center:{x:element.x,y:element.y},width:element.width,height:element.height,rotation:element.ccw_rotation},approximatingRects=generateApproximatingRects(rotatedRect);for(let rect of approximatingRects)obstacles.push({type:"rect",layers:[element.layer],center:rect.center,width:rect.width,height:rect.height,connectedTo:withNetId([element.pcb_smtpad_id])})}}else if(element.type==="pcb_keepout")element.shape==="circle"?obstacles.push({type:"oval",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.radius*2,height:element.radius*2,connectedTo:[]}):element.shape==="rect"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.center.x,y:element.center.y},width:element.width,height:element.height,connectedTo:[]});else if(element.type==="pcb_hole")element.hole_shape==="oval"?obstacles.push({type:"oval",center:{x:element.x,y:element.y},width:element.hole_width,height:element.hole_height,connectedTo:[]}):element.hole_shape==="square"?obstacles.push({type:"rect",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]}):(element.hole_shape==="round"||element.hole_shape==="circle")&&obstacles.push({type:"rect",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.hole_diameter,height:element.hole_diameter,connectedTo:[]});else if(element.type==="pcb_plated_hole")element.shape==="circle"?obstacles.push({type:"oval",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.outer_diameter,height:element.outer_diameter,connectedTo:withNetId([element.pcb_plated_hole_id])}):(element.shape==="oval"||element.shape==="pill")&&obstacles.push({type:"oval",layers:EVERY_LAYER,center:{x:element.x,y:element.y},width:element.outer_width,height:element.outer_height,connectedTo:withNetId([element.pcb_plated_hole_id])});else if(element.type==="pcb_trace"){let traceObstacles=getObstaclesFromRoute(element.route.map(rp2=>({x:rp2.x,y:rp2.y,layer:"layer"in rp2?rp2.layer:rp2.from_layer})),element.source_trace_id);obstacles.push(...traceObstacles)}else element.type==="pcb_via"&&obstacles.push({type:"rect",layers:element.layers,center:{x:element.x,y:element.y},connectedTo:[],width:element.outer_diameter,height:element.outer_diameter});return obstacles};function getAlternativeGoalBoxes(params){let{pcbConnMap,goalElementId}=params;if(!goalElementId.startsWith("pcb_port_"))throw new Error(`Currently alternative goal boxes must have a goal id with prefix "pcb_port_" (got ${goalElementId})`);let goalTraces=pcbConnMap.getAllTracesConnectedToPort(goalElementId);return getObstaclesFromCircuitJson(goalTraces).map(obs=>({...obs,connectedTo:[goalElementId]}))}var getConnectionWithAlternativeGoalBoxes=params=>{let{connection,pcbConnMap}=params;if(connection.pointsToConnect.length!==2)throw new Error(`Connection must have exactly 2 points for alternative goal boxes (got ${connection.pointsToConnect.length})`);let[a3,b3]=connection.pointsToConnect;if(!a3.pcb_port_id||!b3.pcb_port_id)throw new Error(`Connection points must have pcb_port_id for alternative goal box calculation (got ${a3.pcb_port_id} and ${b3.pcb_port_id})`);let goalBoxesA=getAlternativeGoalBoxes({goalElementId:a3.pcb_port_id,pcbConnMap}).concat([{center:a3,width:.01,height:.01,connectedTo:[a3.pcb_port_id],layers:[a3.layer],type:"rect"}]),goalBoxesB=getAlternativeGoalBoxes({goalElementId:b3.pcb_port_id,pcbConnMap}).concat([{center:b3,width:.01,height:.01,connectedTo:[b3.pcb_port_id],layers:[b3.layer],type:"rect"}]);if(goalBoxesA.length<=1&&goalBoxesB.length<=1)return{...connection,startPoint:a3,endPoint:b3,goalBoxes:[]};let nearestPoints=findNearestPointsBetweenBoxSets2(goalBoxesA,goalBoxesB),startPoint,endPoint,goalBoxes;return goalBoxesA.length>=goalBoxesB.length?(startPoint={...b3,...nearestPoints.pointB},endPoint={...a3,...nearestPoints.pointA},goalBoxes=goalBoxesA):(startPoint={...a3,...nearestPoints.pointA},endPoint={...b3,...nearestPoints.pointB},goalBoxes=goalBoxesB),{startPoint,endPoint,goalBoxes,name:connection.name,pointsToConnect:[startPoint,endPoint]}},getSimpleRouteJson=(circuitJson,opts={})=>{let routeJson={minTraceWidth:.1};routeJson.layerCount=opts.layerCount??1,routeJson.obstacles=getObstaclesFromCircuitJson(circuitJson,opts.connMap),routeJson.connections=[];for(let element of circuitJson)if(element.type==="source_trace"){let connection={name:element.source_trace_id,pointsToConnect:element.connected_source_port_ids.map(portId=>{let pcb_port2=su_default(circuitJson).pcb_port.getWhere({source_port_id:portId});if(!pcb_port2)throw new Error(`Could not find pcb_port for source_port_id "${portId}"`);return{x:pcb_port2.x,y:pcb_port2.y,layer:pcb_port2.layers?.[0]??"top",pcb_port_id:pcb_port2.pcb_port_id}})};if(opts.optimizeWithGoalBoxes){let pcbConnMap=new PcbConnectivityMap(circuitJson);connection=getConnectionWithAlternativeGoalBoxes({connection,pcbConnMap})}routeJson.connections.push(connection),markObstaclesAsConnected(routeJson.obstacles,connection.pointsToConnect,connection.name)}let bounds={minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0};for(let obstacle of routeJson.obstacles)bounds.minX=Math.min(bounds.minX,obstacle.center.x-obstacle.width/2),bounds.maxX=Math.max(bounds.maxX,obstacle.center.x+obstacle.width/2),bounds.minY=Math.min(bounds.minY,obstacle.center.y-obstacle.height/2),bounds.maxY=Math.max(bounds.maxY,obstacle.center.y+obstacle.height/2);for(let connection of routeJson.connections)for(let point6 of connection.pointsToConnect)bounds.minX=Math.min(bounds.minX,point6.x),bounds.maxX=Math.max(bounds.maxX,point6.x),bounds.minY=Math.min(bounds.minY,point6.y),bounds.maxY=Math.max(bounds.maxY,point6.y);return routeJson.bounds=bounds,routeJson},markObstaclesAsConnected=(obstacles,pointsToConnect,connectionName)=>{for(let point6 of pointsToConnect)for(let obstacle of obstacles)isPointInsideObstacle(point6,obstacle)&&obstacle.connectedTo.push(connectionName)};function isPointInsideObstacle(point6,obstacle){let halfWidth=obstacle.width/2,halfHeight=obstacle.height/2;if(obstacle.type==="rect")return point6.x>=obstacle.center.x-halfWidth&&point6.x<=obstacle.center.x+halfWidth&&point6.y>=obstacle.center.y-halfHeight&&point6.y<=obstacle.center.y+halfHeight;if(obstacle.type==="oval"){let normalizedX=(point6.x-obstacle.center.x)/halfWidth,normalizedY=(point6.y-obstacle.center.y)/halfHeight;return normalizedX*normalizedX+normalizedY*normalizedY<=1}return!1}function dirFromAToB2(nodeA,nodeB){let dx2=nodeB.x>nodeA.x?1:nodeB.x<nodeA.x?-1:0,dy2=nodeB.y>nodeA.y?1:nodeB.y<nodeA.y?-1:0,dl2=nodeB.l>nodeA.l?1:nodeB.l<nodeA.l?-1:0;return{dx:dx2,dy:dy2,dl:dl2}}var LAYER_COUNT_INDEX_MAP={1:["top"],2:["top","bottom"],4:["top","inner1","inner2","bottom"]},getLayerNamesForLayerCount=layerCount=>LAYER_COUNT_INDEX_MAP[layerCount];function getLayerIndex(layerCount,layer){let index=LAYER_COUNT_INDEX_MAP[layerCount].indexOf(layer);if(index===-1)throw new Error(`Invalid layer for getLayerIndex (for layerCount === ${layerCount}): "${layer}"`);return index}function indexToLayer(layerCount,index){let layer=LAYER_COUNT_INDEX_MAP[layerCount][index];if(!layer)throw new Error(`Invalid index for indexToLayer (for layerCount === ${layerCount}): "${index}"`);return layer}var ObstacleList3d=class extends ObstacleList{constructor(layerCount,obstacles){super([]);__publicField(this,"obstacles");__publicField(this,"GRID_STEP",.1);__publicField(this,"layerCount");this.layerCount=layerCount;let availableLayers=getLayerNamesForLayerCount(layerCount);this.obstacles=obstacles.flatMap(obstacle=>obstacle.layers.filter(layer=>availableLayers.includes(layer)).map(layer=>({...obstacle,left:obstacle.center.x-obstacle.width/2,right:obstacle.center.x+obstacle.width/2,top:obstacle.center.y+obstacle.height/2,bottom:obstacle.center.y-obstacle.height/2,l:getLayerIndex(layerCount,layer)})))}getObstacleAt(x3,y3,l3,m3){m3??(m3=this.GRID_STEP);for(let obstacle of this.obstacles){if(obstacle.l!==l3)continue;let halfWidth=obstacle.width/2+m3,halfHeight=obstacle.height/2+m3;if(x3>=obstacle.center.x-halfWidth&&x3<=obstacle.center.x+halfWidth&&y3>=obstacle.center.y-halfHeight&&y3<=obstacle.center.y+halfHeight)return obstacle}return null}isObstacleAt(x3,y3,l3,m3){return this.getObstacleAt(x3,y3,l3,m3)!==null}getDirectionDistancesToNearestObstacle3d(x3,y3,l3){let{GRID_STEP}=this,result={left:1/0,top:1/0,bottom:1/0,right:1/0};for(let obstacle of this.obstacles)if(obstacle.l===l3&&obstacle.type==="rect"){let left=obstacle.center.x-obstacle.width/2-GRID_STEP,right=obstacle.center.x+obstacle.width/2+GRID_STEP,top=obstacle.center.y+obstacle.height/2+GRID_STEP,bottom=obstacle.center.y-obstacle.height/2-GRID_STEP;y3>=bottom&&y3<=top&&x3>left&&(result.left=Math.min(result.left,x3-right)),y3>=bottom&&y3<=top&&x3<right&&(result.right=Math.min(result.right,left-x3)),x3>=left&&x3<=right&&y3<top&&(result.top=Math.min(result.top,bottom-y3)),x3>=left&&x3<=right&&y3>bottom&&(result.bottom=Math.min(result.bottom,y3-top))}return result}getOrthoDirectionCollisionInfo(point6,dir,{margin=0}={}){let{x:x3,y:y3,l:l3}=point6,{dx:dx2,dy:dy2,dl:dl2}=dir,minDistance=1/0,collisionObstacle=null;if(dl2!==0){let newLayer=l3+dl2;return this.isObstacleAt(x3,y3,newLayer,margin)?(minDistance=1,collisionObstacle=this.getObstacleAt(x3,y3,newLayer,margin)):minDistance=1,{dx:dx2,dy:dy2,dl:dl2,wallDistance:minDistance,obstacle:collisionObstacle}}else{for(let obstacle of this.obstacles){if(obstacle.l!==l3)continue;let leftMargin=obstacle.left-margin,rightMargin=obstacle.right+margin,topMargin=obstacle.top+margin,bottomMargin=obstacle.bottom-margin,distance8=null;dx2===1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3<obstacle.left&&(distance8=obstacle.left-x3):dx2===-1&&dy2===0?y3>bottomMargin&&y3<topMargin&&x3>obstacle.right&&(distance8=x3-obstacle.right):dx2===0&&dy2===1?x3>leftMargin&&x3<rightMargin&&y3<obstacle.bottom&&(distance8=obstacle.bottom-y3):dx2===0&&dy2===-1&&x3>leftMargin&&x3<rightMargin&&y3>obstacle.top&&(distance8=y3-obstacle.top),distance8!==null&&distance8<minDistance&&(minDistance=distance8,collisionObstacle=obstacle)}return{dx:dx2,dy:dy2,dl:0,wallDistance:minDistance,obstacle:collisionObstacle}}}getObstaclesOverlappingRegion(region){let obstacles=[];for(let obstacle of this.obstacles){if(obstacle.l!==region.l)continue;let{left,right,top,bottom}=obstacle;left<=region.maxX&&right>=region.minX&&top>=region.minY&&bottom<=region.maxY&&obstacles.push(obstacle)}return obstacles}},MultilayerIjump=class extends GeneralizedAstarAutorouter{constructor(opts){super(opts);__publicField(this,"MAX_ITERATIONS",500);__publicField(this,"VIA_COST",4);__publicField(this,"VIA_DIAMETER",.5);__publicField(this,"allowLayerChange",!0);__publicField(this,"layerCount");__publicField(this,"obstacles");__publicField(this,"optimizeWithGoalBoxes");__publicField(this,"connMap");__publicField(this,"pcbConnMap");__publicField(this,"GOAL_RUSH_FACTOR",1.1);__publicField(this,"defaultGoalViaMargin",.5);__publicField(this,"marginsWithCosts");this.layerCount=opts.input.layerCount??2,this.MAX_ITERATIONS=opts.MAX_ITERATIONS??this.MAX_ITERATIONS,this.VIA_COST=opts.VIA_COST??this.VIA_COST,this.connMap=opts.connMap,this.pcbConnMap=opts.pcbConnMap??new PcbConnectivityMap,this.optimizeWithGoalBoxes=opts.optimizeWithGoalBoxes??!1,this.obstacles=null,this.marginsWithCosts=opts.marginsWithCosts??[{margin:1,enterCost:0,travelCostFactor:1},{margin:this.OBSTACLE_MARGIN,enterCost:10,travelCostFactor:2}]}get largestMargin(){return this.marginsWithCosts[0].margin}preprocessConnectionBeforeSolving(connection){return this.optimizeWithGoalBoxes?getConnectionWithAlternativeGoalBoxes({connection,pcbConnMap:this.pcbConnMap}):connection}postprocessConnectionSolveResult(connection,result){if(!result.solved)return result;if(this.optimizeWithGoalBoxes){let traceRoute=result.route.map(rp2=>({x:rp2.x,y:rp2.y,route_type:"wire",layer:rp2.layer,width:this.input.minTraceWidth}));traceRoute[0].start_pcb_port_id=connection.pointsToConnect[0].pcb_port_id,traceRoute[traceRoute.length-1].end_pcb_port_id=connection.pointsToConnect[1].pcb_port_id,this.pcbConnMap.addTrace({type:"pcb_trace",pcb_trace_id:`postprocess_trace_${nanoid(8)}`,route:traceRoute})}return result}createObstacleList({dominantLayer,connection,obstaclesFromTraces}){let bestConnectionId=this.connMap?this.connMap.getNetConnectedToId(connection.name):connection.name;if(!bestConnectionId)throw new Error(`The connection.name "${connection.name}" wasn't present in the full connectivity map`);return new ObstacleList3d(this.layerCount,this.allObstacles.filter(obstacle=>!obstacle.connectedTo.includes(bestConnectionId)).concat(obstaclesFromTraces??[]))}computeG(current2,neighbor){let cost=current2.g+manDist(current2,neighbor)*(current2.travelMarginCostFactor??1)+(neighbor.enterMarginCost??0);return(neighbor.l??current2.l!==-1??-1)&&(cost+=this.VIA_COST),cost}computeH(node){let dx2=Math.abs(node.x-this.goalPoint.x),dy2=Math.abs(node.y-this.goalPoint.y),dl2=Math.abs(node.l-this.goalPoint.l);return(dx2+dy2)**this.GOAL_RUSH_FACTOR+dl2*this.VIA_COST}getStartNode(connection){return{...super.getStartNode(connection),l:this.layerToIndex(connection.pointsToConnect[0].layer)}}layerToIndex(layer){return getLayerIndex(this.layerCount,layer)}indexToLayer(index){return indexToLayer(this.layerCount,index)}getNodeName(node){return`${nodeName(node,this.GRID_STEP)}-${node.l??0}`}hasSpaceForVia(layers,point6){return layers.every(l3=>this.obstacles.getObstaclesOverlappingRegion({minX:point6.x-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,minY:point6.y-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,maxX:point6.x+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,maxY:point6.y+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,l:l3}).length===0)}getNeighborsSurroundingGoal(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,neighbors=[],travelDirs=[{dx:1,dy:0,dl:0},{dx:-1,dy:0,dl:0},{dx:0,dy:1,dl:0},{dx:0,dy:-1,dl:0}],travelDistance=this.VIA_DIAMETER+this.OBSTACLE_MARGIN+this.defaultGoalViaMargin;for(let dir of travelDirs){let candidateNeighbor={x:node.x+dir.dx*travelDistance,y:node.y+dir.dy*travelDistance,l:node.l+dir.dl,obstacleHit:null};this.hasSpaceForVia([node.l,goalPoint.l],candidateNeighbor)&&neighbors.push(candidateNeighbor)}return neighbors}getNeighbors(node){let obstacles=this.obstacles,goalPoint=this.goalPoint,goalDistIgnoringLayer=manDist(node,goalPoint);if(goalDistIgnoringLayer<=this.OBSTACLE_MARGIN)return this.getNeighborsSurroundingGoal(node);let forwardDir;node.parent?forwardDir=dirFromAToB2(node.parent,node):forwardDir=dirFromAToB2(node,goalPoint);let travelDirs1=[{dx:0,dy:1,dl:0},{dx:1,dy:0,dl:0},{dx:0,dy:-1,dl:0},{dx:-1,dy:0,dl:0}],isFarEnoughFromGoalToChangeLayer=goalDistIgnoringLayer>this.VIA_DIAMETER+this.OBSTACLE_MARGIN,isFarEnoughFromStartToChangeLayer=manDist(node,this.startNode)>this.VIA_DIAMETER+this.OBSTACLE_MARGIN;this.allowLayerChange&&isFarEnoughFromGoalToChangeLayer&&isFarEnoughFromStartToChangeLayer&&(node.l<this.layerCount-1&&travelDirs1.push({dx:0,dy:0,dl:1}),node.l>0&&travelDirs1.push({dx:0,dy:0,dl:-1}));let travelDirs2=travelDirs1.filter(dir=>dir.dx===forwardDir.dx*-1&&dir.dy===forwardDir.dy*-1&&dir.dl===forwardDir.dl*-1?!1:!(dir.dx===forwardDir.dx&&dir.dy===forwardDir.dy&&dir.dl===forwardDir.dl&&node.parent?.obstacleHit)).map(dir=>obstacles.getOrthoDirectionCollisionInfo(node,dir,{margin:this.OBSTACLE_MARGIN})).filter(dir=>!(dir.wallDistance<this.OBSTACLE_MARGIN)),travelDirs3=[];for(let travelDir of travelDirs2){let isDownVia=travelDir.dx===0&&travelDir.dy===0&&travelDir.dl===1,isUpVia=travelDir.dx===0&&travelDir.dy===0&&travelDir.dl===-1;if((isDownVia||isUpVia)&&![node.l,node.l+travelDir.dl].every(l3=>obstacles.getObstaclesOverlappingRegion({minX:node.x-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,minY:node.y-this.VIA_DIAMETER/2-this.OBSTACLE_MARGIN,maxX:node.x+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,maxY:node.y+this.VIA_DIAMETER/2+this.OBSTACLE_MARGIN,l:l3}).length===0))continue;if(isDownVia){node.l<this.layerCount-1&&travelDirs3.push({...travelDir,travelDistance:0,enterMarginCost:0,travelMarginCostFactor:1});continue}if(isUpVia){node.l>0&&travelDirs3.push({...travelDir,travelDistance:0,enterMarginCost:0,travelMarginCostFactor:1});continue}let overcomeDistance=null;node?.obstacleHit&&(overcomeDistance=getDistanceToOvercomeObstacle({node,travelDir,wallDir:{...forwardDir,wallDistance:this.OBSTACLE_MARGIN},obstacle:node.obstacleHit,obstacles,OBSTACLE_MARGIN:this.OBSTACLE_MARGIN,SHOULD_DETECT_CONJOINED_OBSTACLES:!0}));let goalDistAlongTravelDir=distAlongDir(node,goalPoint,travelDir),isGoalInTravelDir=(travelDir.dx===0||Math.sign(goalPoint.x-node.x)===travelDir.dx)&&(travelDir.dy===0||Math.sign(goalPoint.y-node.y)===travelDir.dy);if(goalDistAlongTravelDir<travelDir.wallDistance&&goalDistAlongTravelDir>0&&isGoalInTravelDir){let isGoalOnSameLayer=node.l===goalPoint.l,stopShortDistance=0;!isGoalOnSameLayer&&Math.abs(goalDistAlongTravelDir-goalDistIgnoringLayer)<this.GRID_STEP&&(stopShortDistance=this.VIA_DIAMETER+this.OBSTACLE_MARGIN+this.defaultGoalViaMargin),travelDirs3.push({...travelDir,travelDistance:goalDistAlongTravelDir-stopShortDistance,enterMarginCost:0,travelMarginCostFactor:1})}else if(overcomeDistance!==null&&overcomeDistance<travelDir.wallDistance){for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)overcomeDistance-this.OBSTACLE_MARGIN+margin*2<travelDir.wallDistance&&travelDirs3.push({...travelDir,travelDistance:overcomeDistance-this.OBSTACLE_MARGIN+margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor});if(travelDir.wallDistance===1/0)travelDirs3.push({...travelDir,travelDistance:goalDistAlongTravelDir,enterMarginCost:0,travelMarginCostFactor:1});else if(travelDir.wallDistance>this.largestMargin)for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)travelDir.wallDistance>this.largestMargin+margin&&travelDirs3.push({...travelDir,travelDistance:travelDir.wallDistance-margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor})}else if(travelDir.wallDistance!==1/0)for(let{margin,enterCost,travelCostFactor}of this.marginsWithCosts)travelDir.wallDistance>margin&&travelDirs3.push({...travelDir,travelDistance:travelDir.wallDistance-margin,enterMarginCost:enterCost,travelMarginCostFactor:travelCostFactor})}return travelDirs3.map(dir=>({x:node.x+dir.dx*dir.travelDistance,y:node.y+dir.dy*dir.travelDistance,l:node.l+dir.dl,obstacleHit:dir.obstacle,travelMarginCostFactor:dir.travelMarginCostFactor,enterMarginCost:dir.enterMarginCost}))}};function autoroute2(soup){let input2=getSimpleRouteJson(soup),autorouter=new IJumpAutorouter({input:input2});return{solution:autorouter.solveAndMapToTraces(),debugSolutions:autorouter.debugSolutions,debugMessage:autorouter.debugMessage}}init_zod();init_zod();init_dist();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_dist();init_zod();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_dist();init_zod();init_zod();var expectTypesMatch2=shouldBe=>{};expectTypesMatch2("extra props b");expectTypesMatch2("missing props b");expectTypesMatch2(!0);expectTypesMatch2("property a has mismatched types");var direction=external_exports.enum(["up","down","left","right"]),directionAlongEdge=external_exports.enum(["top-to-bottom","left-to-right","bottom-to-top","right-to-left"]);expectTypesMatch2(!0);expectTypesMatch2(!0);var portHints=external_exports.array(external_exports.string().or(external_exports.number()));expectTypesMatch2(!0);var calcString=external_exports.string().regex(/^calc\(.*\)$/),distance3=distance,pcbCoordinate=calcString.or(distance),point32=external_exports.object({x:distance,y:distance,z:distance}),rotationPoint3=external_exports.object({x:external_exports.union([external_exports.number(),external_exports.string()]),y:external_exports.union([external_exports.number(),external_exports.string()]),z:external_exports.union([external_exports.number(),external_exports.string()])}),cadModelBase=external_exports.object({rotationOffset:external_exports.number().or(rotationPoint3).optional(),positionOffset:point32.optional(),size:point32.optional(),modelUnitToMmScale:distance3.optional(),zOffsetFromSurface:distance3.optional()});expectTypesMatch2(!0);var cadModelStl=cadModelBase.extend({stlUrl:external_exports.string()}),cadModelObj=cadModelBase.extend({objUrl:external_exports.string(),mtlUrl:external_exports.string().optional()}),cadModelGltf=cadModelBase.extend({gltfUrl:external_exports.string()}),cadModelGlb=cadModelBase.extend({glbUrl:external_exports.string()}),cadModelStep=cadModelBase.extend({stepUrl:external_exports.string()}),cadModelWrl=cadModelBase.extend({wrlUrl:external_exports.string()}),cadModelJscad=cadModelBase.extend({jscad:external_exports.record(external_exports.any())}),cadModelProp=external_exports.union([external_exports.null(),external_exports.string(),external_exports.custom(v4=>v4&&typeof v4=="object"&&"type"in v4&&"props"in v4),cadModelStl,cadModelObj,cadModelGltf,cadModelGlb,cadModelStep,cadModelWrl,cadModelJscad]);expectTypesMatch2(!0);var footprintProp=external_exports.custom(v4=>!0),pcbStyle=external_exports.object({silkscreenFontSize:distance.optional(),viaPadDiameter:distance.optional(),viaHoleDiameter:distance.optional(),silkscreenTextPosition:external_exports.union([external_exports.enum(["centered","outside","none"]),external_exports.object({offsetX:external_exports.number(),offsetY:external_exports.number()})]).optional(),silkscreenTextVisibility:external_exports.enum(["hidden","visible","inherit"]).optional()});expectTypesMatch2(!0);var schStyle=external_exports.object({defaultPassiveSize:external_exports.union([external_exports.enum(["xs","sm","md"]),distance]).optional(),defaultCapacitorOrientation:external_exports.enum(["vertical","none"]).optional()});expectTypesMatch2(!0);var symbolProp=external_exports.custom(v4=>!0),pcbLayoutProps=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance.optional(),pcbOffsetY:distance.optional(),pcbRotation:rotation.optional(),pcbPositionAnchor:external_exports.string().optional(),pcbPositionMode:external_exports.enum(["relative_to_group_anchor","auto","relative_to_board_anchor","relative_to_component_anchor"]).optional(),layer:layer_ref.optional(),pcbMarginTop:distance.optional(),pcbMarginRight:distance.optional(),pcbMarginBottom:distance.optional(),pcbMarginLeft:distance.optional(),pcbMarginX:distance.optional(),pcbMarginY:distance.optional(),pcbStyle:pcbStyle.optional(),pcbRelative:external_exports.boolean().optional(),relative:external_exports.boolean().optional()});expectTypesMatch2(!0);var commonLayoutProps=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance.optional(),pcbOffsetY:distance.optional(),pcbRotation:rotation.optional(),pcbPositionAnchor:external_exports.string().optional(),pcbPositionMode:external_exports.enum(["relative_to_group_anchor","auto","relative_to_board_anchor","relative_to_component_anchor"]).optional(),pcbMarginTop:distance.optional(),pcbMarginRight:distance.optional(),pcbMarginBottom:distance.optional(),pcbMarginLeft:distance.optional(),pcbMarginX:distance.optional(),pcbMarginY:distance.optional(),pcbStyle:pcbStyle.optional(),schMarginTop:distance.optional(),schMarginRight:distance.optional(),schMarginBottom:distance.optional(),schMarginLeft:distance.optional(),schMarginX:distance.optional(),schMarginY:distance.optional(),schX:distance.optional(),schY:distance.optional(),schRotation:rotation.optional(),layer:layer_ref.optional(),footprint:footprintProp.optional(),symbol:symbolProp.optional(),schStyle:schStyle.optional(),relative:external_exports.boolean().optional(),schRelative:external_exports.boolean().optional(),pcbRelative:external_exports.boolean().optional()});expectTypesMatch2(!0);var supplierProps=external_exports.object({supplierPartNumbers:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional()});expectTypesMatch2(!0);var pinAttributeMap=external_exports.object({providesPower:external_exports.boolean().optional(),requiresPower:external_exports.boolean().optional(),providesGround:external_exports.boolean().optional(),requiresGround:external_exports.boolean().optional(),providesVoltage:external_exports.union([external_exports.string(),external_exports.number()]).optional(),requiresVoltage:external_exports.union([external_exports.string(),external_exports.number()]).optional(),doNotConnect:external_exports.boolean().optional(),includeInBoardPinout:external_exports.boolean().optional(),highlightColor:external_exports.string().optional(),mustBeConnected:external_exports.boolean().optional()});expectTypesMatch2(!0);var commonComponentProps=commonLayoutProps.merge(supplierProps).extend({key:external_exports.any().optional(),name:external_exports.string(),cadModel:cadModelProp.optional(),children:external_exports.any().optional(),symbolName:external_exports.string().optional(),doNotPlace:external_exports.boolean().optional(),obstructsWithinBounds:external_exports.boolean().optional().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"),showAsTranslucentModel:external_exports.boolean().optional().describe("Whether to show this component's CAD model as translucent in the 3D viewer."),pinAttributes:external_exports.record(external_exports.string(),pinAttributeMap).optional()});expectTypesMatch2(!0);var lrPins=["pin1","left","pin2","right"],lrPolarPins=["pin1","left","anode","pos","pin2","right","cathode","neg"],distanceOrMultiplier=distance.or(external_exports.enum(["2x","3x","4x"]));var schematicOrientation=external_exports.enum(["vertical","horizontal","pos_top","pos_bottom","pos_left","pos_right","neg_top","neg_bottom","neg_left","neg_right"]).describe("horizontal means pins go 1->2 rightward and vertical means pins go 1->2 downward (generally, positive on top)");expectTypesMatch2(!0);var explicitPinSideDefinition=external_exports.object({pins:external_exports.array(external_exports.union([external_exports.number(),external_exports.string()])),direction:external_exports.union([external_exports.literal("top-to-bottom"),external_exports.literal("left-to-right"),external_exports.literal("bottom-to-top"),external_exports.literal("right-to-left")])}),schematicPortArrangement=external_exports.object({leftSize:external_exports.number().optional().describe("@deprecated, use leftPinCount"),topSize:external_exports.number().optional().describe("@deprecated, use topPinCount"),rightSize:external_exports.number().optional().describe("@deprecated, use rightPinCount"),bottomSize:external_exports.number().optional().describe("@deprecated, use bottomPinCount"),leftPinCount:external_exports.number().optional(),rightPinCount:external_exports.number().optional(),topPinCount:external_exports.number().optional(),bottomPinCount:external_exports.number().optional(),leftSide:explicitPinSideDefinition.optional(),rightSide:explicitPinSideDefinition.optional(),topSide:explicitPinSideDefinition.optional(),bottomSide:explicitPinSideDefinition.optional()}),schematicPinArrangement=schematicPortArrangement;expectTypesMatch2(!0);var schematicPinStyle=external_exports.record(external_exports.object({marginLeft:distance.optional(),marginRight:distance.optional(),marginTop:distance.optional(),marginBottom:distance.optional(),leftMargin:distance.optional(),rightMargin:distance.optional(),topMargin:distance.optional(),bottomMargin:distance.optional()}));expectTypesMatch2(!0);var schematicPinLabel=external_exports.string().regex(/^[A-Za-z0-9_]+$/),schematicSymbolSize=distance.or(external_exports.enum(["xs","sm","default","md"])).describe("distance between pin1 and pin2 of the schematic symbol"),ninePointAnchor2=external_exports.enum(["top_left","top_center","top_right","center_left","center","center_right","bottom_left","bottom_center","bottom_right"]),point2=external_exports.object({x:distance,y:distance}),base_manual_edit_event=external_exports.object({edit_event_id:external_exports.string(),in_progress:external_exports.boolean().optional(),created_at:external_exports.number()});expectTypesMatch2(!0);var edit_pcb_component_location_event=base_manual_edit_event.extend({pcb_edit_event_type:external_exports.literal("edit_component_location").describe("deprecated"),edit_event_type:external_exports.literal("edit_pcb_component_location"),pcb_component_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_trace_hint_event=base_manual_edit_event.extend({pcb_edit_event_type:external_exports.literal("edit_trace_hint").describe("deprecated"),edit_event_type:external_exports.literal("edit_pcb_trace_hint").optional(),pcb_port_id:external_exports.string(),pcb_trace_hint_id:external_exports.string().optional(),route:external_exports.array(external_exports.object({x:external_exports.number(),y:external_exports.number(),via:external_exports.boolean().optional()}))});expectTypesMatch2(!0);var edit_schematic_component_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_schematic_component_location"),schematic_component_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_pcb_group_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_pcb_group_location"),pcb_group_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var edit_schematic_group_location_event=base_manual_edit_event.extend({edit_event_type:external_exports.literal("edit_schematic_group_location"),schematic_group_id:external_exports.string(),original_center:external_exports.object({x:external_exports.number(),y:external_exports.number()}),new_center:external_exports.object({x:external_exports.number(),y:external_exports.number()})});expectTypesMatch2(!0);var manual_edit_event=external_exports.union([edit_pcb_component_location_event,edit_trace_hint_event,edit_schematic_component_location_event]);expectTypesMatch2(!0);var manual_pcb_placement=external_exports.object({selector:external_exports.string(),relative_to:external_exports.string().optional().default("group_center").describe("Can be a selector or 'group_center'"),center:point});expectTypesMatch2(!0);var manual_trace_hint=external_exports.object({pcb_port_selector:external_exports.string(),offsets:external_exports.array(route_hint_point)});expectTypesMatch2(!0);var manual_schematic_placement=external_exports.object({selector:external_exports.string(),relative_to:external_exports.string().optional().default("group_center").describe("Can be a selector or 'group_center'"),center:point});expectTypesMatch2(!0);var manual_edits_file=external_exports.object({pcb_placements:external_exports.array(manual_pcb_placement).optional(),manual_trace_hints:external_exports.array(manual_trace_hint).optional(),schematic_placements:external_exports.array(manual_schematic_placement).optional()});expectTypesMatch2(!0);var connectionTarget=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),createConnectionsProp=labels=>external_exports.record(external_exports.enum(labels),connectionTarget),layoutConfig=external_exports.object({layoutMode:external_exports.enum(["grid","flex","match-adapt","relative","none"]).optional(),position:external_exports.enum(["absolute","relative"]).optional(),grid:external_exports.boolean().optional(),gridCols:external_exports.number().or(external_exports.string()).optional(),gridRows:external_exports.number().or(external_exports.string()).optional(),gridTemplateRows:external_exports.string().optional(),gridTemplateColumns:external_exports.string().optional(),gridTemplate:external_exports.string().optional(),gridGap:external_exports.number().or(external_exports.string()).optional(),gridRowGap:external_exports.number().or(external_exports.string()).optional(),gridColumnGap:external_exports.number().or(external_exports.string()).optional(),flex:external_exports.boolean().or(external_exports.string()).optional(),flexDirection:external_exports.enum(["row","column"]).optional(),alignItems:external_exports.enum(["start","center","end","stretch"]).optional(),justifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),flexRow:external_exports.boolean().optional(),flexColumn:external_exports.boolean().optional(),gap:external_exports.number().or(external_exports.string()).optional(),pack:external_exports.boolean().optional().describe("Pack the contents of this group using a packing strategy"),packOrderStrategy:external_exports.enum(["largest_to_smallest","first_to_last","highest_to_lowest_pin_count"]).optional(),packPlacementStrategy:external_exports.enum(["shortest_connection_along_outline"]).optional(),padding:length.optional(),paddingLeft:length.optional(),paddingRight:length.optional(),paddingTop:length.optional(),paddingBottom:length.optional(),paddingX:length.optional(),paddingY:length.optional(),width:length.optional(),height:length.optional(),matchAdapt:external_exports.boolean().optional(),matchAdaptTemplate:external_exports.any().optional()});expectTypesMatch2(!0);var border=external_exports.object({strokeWidth:length.optional(),dashed:external_exports.boolean().optional(),solid:external_exports.boolean().optional()}),pcbAnchorAlignmentAutocomplete=external_exports.custom(value=>typeof value=="string"),autorouterConfig=external_exports.object({serverUrl:external_exports.string().optional(),inputFormat:external_exports.enum(["simplified","circuit-json"]).optional(),serverMode:external_exports.enum(["job","solve-endpoint"]).optional(),serverCacheEnabled:external_exports.boolean().optional(),cache:external_exports.custom(v4=>!0).optional(),traceClearance:length.optional(),groupMode:external_exports.enum(["sequential_trace","subcircuit","sequential-trace"]).optional(),algorithmFn:external_exports.custom(v4=>typeof v4=="function"||v4===void 0).optional(),preset:external_exports.enum(["sequential_trace","subcircuit","auto","auto_local","auto_cloud","freerouting","laser_prefab","sequential-trace","auto-local","auto-cloud"]).optional(),local:external_exports.boolean().optional()}),autorouterPreset=external_exports.union([external_exports.literal("sequential_trace"),external_exports.literal("subcircuit"),external_exports.literal("auto"),external_exports.literal("auto_local"),external_exports.literal("auto_cloud"),external_exports.literal("freerouting"),external_exports.literal("laser_prefab"),external_exports.literal("sequential-trace"),external_exports.literal("auto-local"),external_exports.literal("auto-cloud")]),autorouterString=external_exports.string(),autorouterProp=external_exports.union([autorouterConfig,autorouterPreset,autorouterString]),baseGroupProps=commonLayoutProps.extend({name:external_exports.string().optional(),children:external_exports.any().optional(),schTitle:external_exports.string().optional(),key:external_exports.any().optional(),showAsSchematicBox:external_exports.boolean().optional(),connections:external_exports.record(external_exports.string(),connectionTarget.optional()).optional(),schPinArrangement:schematicPinArrangement.optional(),schPinSpacing:length.optional(),schPinStyle:schematicPinStyle.optional(),...layoutConfig.shape,grid:layoutConfig.shape.grid.describe("@deprecated use pcbGrid"),flex:layoutConfig.shape.flex.describe("@deprecated use pcbFlex"),pcbGrid:external_exports.boolean().optional(),pcbGridCols:external_exports.number().or(external_exports.string()).optional(),pcbGridRows:external_exports.number().or(external_exports.string()).optional(),pcbGridTemplateRows:external_exports.string().optional(),pcbGridTemplateColumns:external_exports.string().optional(),pcbGridTemplate:external_exports.string().optional(),pcbGridGap:external_exports.number().or(external_exports.string()).optional(),pcbGridRowGap:external_exports.number().or(external_exports.string()).optional(),pcbGridColumnGap:external_exports.number().or(external_exports.string()).optional(),pcbFlex:external_exports.boolean().or(external_exports.string()).optional(),pcbFlexGap:external_exports.number().or(external_exports.string()).optional(),pcbFlexDirection:external_exports.enum(["row","column"]).optional(),pcbAlignItems:external_exports.enum(["start","center","end","stretch"]).optional(),pcbJustifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),pcbFlexRow:external_exports.boolean().optional(),pcbFlexColumn:external_exports.boolean().optional(),pcbGap:external_exports.number().or(external_exports.string()).optional(),pcbPack:external_exports.boolean().optional(),pcbPackGap:external_exports.number().or(external_exports.string()).optional(),schGrid:external_exports.boolean().optional(),schGridCols:external_exports.number().or(external_exports.string()).optional(),schGridRows:external_exports.number().or(external_exports.string()).optional(),schGridTemplateRows:external_exports.string().optional(),schGridTemplateColumns:external_exports.string().optional(),schGridTemplate:external_exports.string().optional(),schGridGap:external_exports.number().or(external_exports.string()).optional(),schGridRowGap:external_exports.number().or(external_exports.string()).optional(),schGridColumnGap:external_exports.number().or(external_exports.string()).optional(),schFlex:external_exports.boolean().or(external_exports.string()).optional(),schFlexGap:external_exports.number().or(external_exports.string()).optional(),schFlexDirection:external_exports.enum(["row","column"]).optional(),schAlignItems:external_exports.enum(["start","center","end","stretch"]).optional(),schJustifyContent:external_exports.enum(["start","center","end","stretch","space-between","space-around","space-evenly"]).optional(),schFlexRow:external_exports.boolean().optional(),schFlexColumn:external_exports.boolean().optional(),schGap:external_exports.number().or(external_exports.string()).optional(),schPack:external_exports.boolean().optional(),schMatchAdapt:external_exports.boolean().optional(),pcbWidth:length.optional(),pcbHeight:length.optional(),minTraceWidth:length.optional(),schWidth:length.optional(),schHeight:length.optional(),pcbLayout:layoutConfig.optional(),schLayout:layoutConfig.optional(),cellBorder:border.nullable().optional(),border:border.nullable().optional(),schPadding:length.optional(),schPaddingLeft:length.optional(),schPaddingRight:length.optional(),schPaddingTop:length.optional(),schPaddingBottom:length.optional(),pcbPadding:length.optional(),pcbPaddingLeft:length.optional(),pcbPaddingRight:length.optional(),pcbPaddingTop:length.optional(),pcbPaddingBottom:length.optional(),pcbAnchorAlignment:pcbAnchorAlignmentAutocomplete.optional()}),partsEngine=external_exports.custom(v4=>"findPart"in v4),subcircuitGroupProps=baseGroupProps.extend({manualEdits:manual_edits_file.optional(),schAutoLayoutEnabled:external_exports.boolean().optional(),schTraceAutoLabelEnabled:external_exports.boolean().optional(),schMaxTraceDistance:distance.optional(),routingDisabled:external_exports.boolean().optional(),bomDisabled:external_exports.boolean().optional(),defaultTraceWidth:length.optional(),minTraceWidth:length.optional(),partsEngine:partsEngine.optional(),pcbRouteCache:external_exports.custom(v4=>!0).optional(),autorouter:autorouterProp.optional(),square:external_exports.boolean().optional(),emptyArea:external_exports.string().optional(),filledArea:external_exports.string().optional(),width:distance.optional(),height:distance.optional(),outline:external_exports.array(point2).optional(),outlineOffsetX:distance.optional(),outlineOffsetY:distance.optional(),circuitJson:external_exports.array(external_exports.any()).optional()}),subcircuitGroupPropsWithBool=subcircuitGroupProps.extend({subcircuit:external_exports.literal(!0)}),groupProps=external_exports.discriminatedUnion("subcircuit",[baseGroupProps.extend({subcircuit:external_exports.literal(!1).optional()}),subcircuitGroupPropsWithBool]);expectTypesMatch2(!0);expectTypesMatch2(!0);expectTypesMatch2(!0);expectTypesMatch2(!0);var boardColor=external_exports.custom(value=>typeof value=="string"),boardProps=subcircuitGroupProps.omit({connections:!0}).extend({material:external_exports.enum(["fr4","fr1"]).default("fr4"),layers:external_exports.union([external_exports.literal(1),external_exports.literal(2),external_exports.literal(4),external_exports.literal(6),external_exports.literal(8)]).default(2),borderRadius:distance3.optional(),thickness:distance3.optional(),boardAnchorPosition:point2.optional(),anchorAlignment:ninePointAnchor2.optional(),boardAnchorAlignment:ninePointAnchor2.optional().describe("Prefer using anchorAlignment when possible"),title:external_exports.string().optional(),solderMaskColor:boardColor.optional(),topSolderMaskColor:boardColor.optional(),bottomSolderMaskColor:boardColor.optional(),silkscreenColor:boardColor.optional(),topSilkscreenColor:boardColor.optional(),bottomSilkscreenColor:boardColor.optional(),doubleSidedAssembly:external_exports.boolean().optional().default(!1),schematicDisabled:external_exports.boolean().optional()});expectTypesMatch2(!0);var panelProps=baseGroupProps.omit({width:!0,height:!0,layoutMode:!0,children:!0}).extend({width:distance3.optional(),height:distance3.optional(),children:external_exports.any().optional(),anchorAlignment:ninePointAnchor2.optional(),noSolderMask:external_exports.boolean().optional(),panelizationMethod:external_exports.enum(["tab-routing","none"]).optional(),boardGap:distance3.optional(),layoutMode:external_exports.enum(["grid","pack","none"]).optional(),row:external_exports.number().optional(),col:external_exports.number().optional(),cellWidth:distance3.optional(),cellHeight:distance3.optional(),tabWidth:distance3.optional(),tabLength:distance3.optional(),mouseBites:external_exports.boolean().optional(),edgePadding:distance3.optional(),edgePaddingLeft:distance3.optional(),edgePaddingRight:distance3.optional(),edgePaddingTop:distance3.optional(),edgePaddingBottom:distance3.optional()});expectTypesMatch2(!0);expectTypesMatch2(!0);var breakoutProps=subcircuitGroupProps.extend({padding:distance.optional(),paddingLeft:distance.optional(),paddingRight:distance.optional(),paddingTop:distance.optional(),paddingBottom:distance.optional()});expectTypesMatch2(!0);var connectionTarget2=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),connectionsProp=external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget2)),pinLabelsProp=external_exports.record(schematicPinLabel,schematicPinLabel.or(external_exports.array(schematicPinLabel).readonly()).or(external_exports.array(schematicPinLabel)));expectTypesMatch2(!0);var pinCompatibleVariant=external_exports.object({manufacturerPartNumber:external_exports.string().optional(),supplierPartNumber:external_exports.record(supplier_name,external_exports.array(external_exports.string())).optional()}),chipProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:pinLabelsProp.optional(),showPinAliases:external_exports.boolean().optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),externallyConnectedPins:external_exports.array(external_exports.array(external_exports.string())).optional(),schPinArrangement:schematicPortArrangement.optional(),schPortArrangement:schematicPortArrangement.optional(),pinCompatibleVariants:external_exports.array(pinCompatibleVariant).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),noSchematicRepresentation:external_exports.boolean().optional(),connections:connectionsProp.optional()});expectTypesMatch2(!0);var pinoutProps=chipProps;expectTypesMatch2(!0);var jumperProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),schDirection:external_exports.enum(["left","right"]).optional(),schPinArrangement:schematicPinArrangement.optional(),schPortArrangement:schematicPortArrangement.optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),pinCount:external_exports.union([external_exports.literal(2),external_exports.literal(3)]).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional()});expectTypesMatch2(!0);var solderjumperProps=jumperProps.extend({bridgedPins:external_exports.array(external_exports.array(external_exports.string())).optional(),bridged:external_exports.boolean().optional()});expectTypesMatch2(!0);var connectorProps=commonComponentProps.extend({manufacturerPartNumber:external_exports.string().optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional(),schDirection:external_exports.enum(["left","right"]).optional(),schPortArrangement:schematicPortArrangement.optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional(),standard:external_exports.enum(["usb_c","m2"]).optional()});expectTypesMatch2(!0);var interconnectProps=commonComponentProps.extend({standard:external_exports.enum(["TSC0001_36P_XALT_2025_11","0805","0603","1206"]).optional(),pinLabels:external_exports.record(external_exports.number().or(schematicPinLabel),schematicPinLabel.or(external_exports.array(schematicPinLabel))).optional(),internallyConnectedPins:external_exports.array(external_exports.array(external_exports.union([external_exports.string(),external_exports.number()]))).optional()});expectTypesMatch2(!0);var fuseProps=commonComponentProps.extend({currentRating:external_exports.union([external_exports.number(),external_exports.string()]),voltageRating:external_exports.union([external_exports.number(),external_exports.string()]).optional(),schShowRatings:external_exports.boolean().optional(),schOrientation:schematicOrientation.optional(),connections:external_exports.record(external_exports.string(),external_exports.union([external_exports.string(),external_exports.array(external_exports.string()).readonly(),external_exports.array(external_exports.string())])).optional()}),distanceHiddenUndefined=external_exports.custom().transform(a3=>{if(a3!==void 0)return distance.parse(a3)}),platedHoleProps=external_exports.discriminatedUnion("shape",[pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("circle"),holeDiameter:distance,outerDiameter:distance,padDiameter:distance.optional().describe("Diameter of the copper pad"),portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("oval"),outerWidth:distance,outerHeight:distance,holeWidth:distanceHiddenUndefined,holeHeight:distanceHiddenUndefined,innerWidth:distance.optional().describe("DEPRECATED use holeWidth"),innerHeight:distance.optional().describe("DEPRECATED use holeHeight"),portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("pill"),rectPad:external_exports.boolean().optional(),outerWidth:distance,outerHeight:distance,holeWidth:distanceHiddenUndefined,holeHeight:distanceHiddenUndefined,innerWidth:distance.optional().describe("DEPRECATED use holeWidth"),innerHeight:distance.optional().describe("DEPRECATED use holeHeight"),portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("circular_hole_with_rect_pad"),holeDiameter:distance,rectPadWidth:distance,rectPadHeight:distance,rectBorderRadius:distance.optional(),holeShape:external_exports.literal("circle").optional(),padShape:external_exports.literal("rect").optional(),portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("pill_hole_with_rect_pad"),holeShape:external_exports.literal("pill").optional(),padShape:external_exports.literal("rect").optional(),holeWidth:distance,holeHeight:distance,rectPadWidth:distance,rectPadHeight:distance,portHints:portHints.optional(),holeOffsetX:distance.optional(),holeOffsetY:distance.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),shape:external_exports.literal("hole_with_polygon_pad"),holeShape:external_exports.enum(["circle","oval","pill","rotated_pill"]),holeDiameter:distance.optional(),holeWidth:distance.optional(),holeHeight:distance.optional(),padOutline:external_exports.array(point2),holeOffsetX:distance,holeOffsetY:distance,portHints:portHints.optional(),solderMaskMargin:distance.optional(),coveredWithSolderMask:external_exports.boolean().optional()})]).refine(a3=>("innerWidth"in a3&&a3.innerWidth!==void 0&&(a3.holeWidth??(a3.holeWidth=a3.innerWidth)),"innerHeight"in a3&&a3.innerHeight!==void 0&&(a3.holeHeight??(a3.holeHeight=a3.innerHeight)),a3));expectTypesMatch2(!0);var resistorPinLabels=["pin1","pin2","pos","neg"],resistorProps=commonComponentProps.extend({resistance,pullupFor:external_exports.string().optional(),pullupTo:external_exports.string().optional(),pulldownFor:external_exports.string().optional(),pulldownTo:external_exports.string().optional(),schOrientation:schematicOrientation.optional(),schSize:schematicSymbolSize.optional(),connections:createConnectionsProp(resistorPinLabels).optional()}),resistorPins=lrPins;expectTypesMatch2(!0);var potentiometerProps=commonComponentProps.extend({maxResistance:resistance,pinVariant:external_exports.enum(["two_pin","three_pin"]).optional()});expectTypesMatch2(!0);var crystalPins=lrPins,crystalProps=commonComponentProps.extend({frequency,loadCapacitance:capacitance,manufacturerPartNumber:external_exports.string().optional(),mpn:external_exports.string().optional(),pinVariant:external_exports.enum(["two_pin","four_pin"]).optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(crystalPins).optional()});expectTypesMatch2(!0);var resonatorProps=commonComponentProps.extend({frequency,loadCapacitance:capacitance,pinVariant:external_exports.enum(["no_ground","ground_pin","two_ground_pins"]).optional()});expectTypesMatch2(!0);var stampboardProps=boardProps.extend({leftPinCount:external_exports.number().optional(),rightPinCount:external_exports.number().optional(),topPinCount:external_exports.number().optional(),bottomPinCount:external_exports.number().optional(),leftPins:external_exports.array(external_exports.string()).optional(),rightPins:external_exports.array(external_exports.string()).optional(),topPins:external_exports.array(external_exports.string()).optional(),bottomPins:external_exports.array(external_exports.string()).optional(),pinPitch:distance.optional(),innerHoles:external_exports.boolean().optional()});expectTypesMatch2(!0);var capacitorPinLabels=["pin1","pin2","pos","neg","anode","cathode"],capacitorProps=commonComponentProps.extend({capacitance,maxVoltageRating:voltage.optional(),schShowRatings:external_exports.boolean().optional().default(!1),polarized:external_exports.boolean().optional().default(!1),decouplingFor:external_exports.string().optional(),decouplingTo:external_exports.string().optional(),bypassFor:external_exports.string().optional(),bypassTo:external_exports.string().optional(),maxDecouplingTraceLength:external_exports.number().optional(),schOrientation:schematicOrientation.optional(),schSize:schematicSymbolSize.optional(),connections:createConnectionsProp(capacitorPinLabels).optional()}),capacitorPins=lrPolarPins;expectTypesMatch2(!0);var netProps=external_exports.object({name:external_exports.string(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),highlightColor:external_exports.string().optional(),isPowerNet:external_exports.boolean().optional(),isGroundNet:external_exports.boolean().optional()});expectTypesMatch2(!0);var fiducialProps=commonComponentProps.extend({soldermaskPullback:distance3.optional(),padDiameter:distance3.optional()});expectTypesMatch2(!0);var constrainedLayoutProps=external_exports.object({name:external_exports.string().optional(),pcbOnly:external_exports.boolean().optional(),schOnly:external_exports.boolean().optional()});expectTypesMatch2(!0);var pcbXDistConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),xDist:distance3,left:external_exports.string(),right:external_exports.string(),edgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbYDistConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),yDist:distance3,top:external_exports.string(),bottom:external_exports.string(),edgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbSameYConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),sameY:external_exports.literal(!0).optional(),for:external_exports.array(external_exports.string())});expectTypesMatch2(!0);var pcbSameXConstraintProps=external_exports.object({pcb:external_exports.literal(!0).optional(),sameX:external_exports.literal(!0).optional(),for:external_exports.array(external_exports.string())});expectTypesMatch2(!0);var constraintProps=external_exports.union([pcbXDistConstraintProps,pcbYDistConstraintProps,pcbSameYConstraintProps,pcbSameXConstraintProps]);expectTypesMatch2(!0);var rectCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance3,height:distance3});expectTypesMatch2(!0);var circleCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("circle"),radius:distance3});expectTypesMatch2(!0);var polygonCutoutProps=pcbLayoutProps.omit({layer:!0,pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("polygon"),points:external_exports.array(point2)});expectTypesMatch2(!0);var cutoutProps=external_exports.discriminatedUnion("shape",[rectCutoutProps,circleCutoutProps,polygonCutoutProps]),rectSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance3,height:distance3,rectBorderRadius:distance3.optional(),cornerRadius:distance3.optional(),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance3.optional()});expectTypesMatch2(!0);var rotatedRectSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("rotated_rect"),width:distance3,height:distance3,ccwRotation:external_exports.number(),cornerRadius:distance3.optional(),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance3.optional()});expectTypesMatch2(!0);var circleSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("circle"),radius:distance3,portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance3.optional()});expectTypesMatch2(!0);var pillSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("pill"),width:distance3,height:distance3,radius:distance3,portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance3.optional()});expectTypesMatch2(!0);var polygonSmtPadProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({name:external_exports.string().optional(),shape:external_exports.literal("polygon"),points:external_exports.array(point2),portHints:portHints.optional(),coveredWithSolderMask:external_exports.boolean().optional(),solderMaskMargin:distance3.optional()});expectTypesMatch2(!0);var smtPadProps=external_exports.discriminatedUnion("shape",[circleSmtPadProps,rectSmtPadProps,rotatedRectSmtPadProps,pillSmtPadProps,polygonSmtPadProps]);expectTypesMatch2(!0);var rectSolderPasteProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("rect"),width:distance3,height:distance3});expectTypesMatch2(!0);var circleSolderPasteProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("circle"),radius:distance3});expectTypesMatch2(!0);var solderPasteProps=external_exports.union([circleSolderPasteProps,rectSolderPasteProps]);expectTypesMatch2(!0);var circleHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("circle").optional(),diameter:distance3.optional(),radius:distance3.optional(),solderMaskMargin:distance3.optional(),coveredWithSolderMask:external_exports.boolean().optional()}).transform(d2=>({...d2,diameter:d2.diameter??2*d2.radius,radius:d2.radius??d2.diameter/2})),pillHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("pill"),width:distance3,height:distance3,solderMaskMargin:distance3.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),rectHoleProps=pcbLayoutProps.extend({name:external_exports.string().optional(),shape:external_exports.literal("rect"),width:distance3,height:distance3,solderMaskMargin:distance3.optional(),coveredWithSolderMask:external_exports.boolean().optional()}),holeProps=external_exports.union([circleHoleProps,pillHoleProps,rectHoleProps]);expectTypesMatch2(!0);var portRef=external_exports.union([external_exports.string(),external_exports.custom(v4=>!!v4.getPortSelector)]),pcbPath=external_exports.array(external_exports.union([point2,external_exports.string()])),baseTraceProps=external_exports.object({key:external_exports.string().optional(),thickness:distance.optional(),width:distance.optional().describe("Alias for trace thickness"),schematicRouteHints:external_exports.array(point2).optional(),pcbRouteHints:external_exports.array(route_hint_point).optional(),pcbPathRelativeTo:external_exports.string().optional(),pcbPath:pcbPath.optional(),pcbPaths:external_exports.array(pcbPath).optional(),pcbStraightLine:external_exports.boolean().optional().describe("Draw a straight pcb trace between the connected points"),schDisplayLabel:external_exports.string().optional(),schStroke:external_exports.string().optional(),highlightColor:external_exports.string().optional(),maxLength:distance.optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional()}),traceProps=external_exports.union([baseTraceProps.extend({path:external_exports.array(portRef)}),baseTraceProps.extend({from:portRef,to:portRef})]),footprintProps=external_exports.object({children:external_exports.any().optional(),originalLayer:layer_ref.default("top").optional(),circuitJson:external_exports.array(external_exports.any()).optional()});expectTypesMatch2(!0);var symbolProps=external_exports.object({originalFacingDirection:external_exports.enum(["up","down","left","right"]).default("right").optional()});expectTypesMatch2(!0);var capacity=external_exports.number().or(external_exports.string().endsWith("mAh")).transform(v4=>{if(typeof v4=="string"){let valString=v4.replace("mAh",""),num=Number.parseFloat(valString);if(Number.isNaN(num))throw new Error("Invalid capacity");return num}return v4}).describe("Battery capacity in mAh"),batteryProps=commonComponentProps.extend({capacity:capacity.optional(),voltage:voltage.optional(),standard:external_exports.enum(["AA","AAA","9V","CR2032","18650","C"]).optional(),schOrientation:schematicOrientation.optional()});expectTypesMatch2(!0);var pcbOrientation=external_exports.enum(["vertical","horizontal"]).describe("vertical means pins go 1->2 downward and horizontal means pins go 1->2 rightward");expectTypesMatch2(!0);var pinHeaderProps=commonComponentProps.extend({pinCount:external_exports.number(),pitch:distance.optional(),schFacingDirection:external_exports.enum(["up","down","left","right"]).optional(),gender:external_exports.enum(["male","female","unpopulated"]).optional().default("male"),showSilkscreenPinLabels:external_exports.boolean().optional(),pcbPinLabels:external_exports.record(external_exports.string(),external_exports.string()).optional(),doubleRow:external_exports.boolean().optional(),rightAngle:external_exports.boolean().optional(),pcbOrientation:pcbOrientation.optional(),holeDiameter:distance.optional(),platedDiameter:distance.optional(),pinLabels:external_exports.record(external_exports.string(),schematicPinLabel).or(external_exports.array(schematicPinLabel)).optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional(),facingDirection:external_exports.enum(["left","right"]).optional(),schPinArrangement:schematicPinArrangement.optional(),schPinStyle:schematicPinStyle.optional(),schPinSpacing:distance.optional(),schWidth:distance.optional(),schHeight:distance.optional()});expectTypesMatch2(!0);var netAliasProps=external_exports.object({net:external_exports.string().optional(),connection:external_exports.string().optional(),schX:distance3.optional(),schY:distance3.optional(),schRotation:rotation.optional(),anchorSide:external_exports.enum(["left","top","right","bottom"]).optional()});expectTypesMatch2(!0);var netLabelProps=external_exports.object({net:external_exports.string().optional(),connection:external_exports.string().optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),schX:distance3.optional(),schY:distance3.optional(),schRotation:rotation.optional(),anchorSide:external_exports.enum(["left","top","right","bottom"]).optional()});expectTypesMatch2(!0);var pushButtonProps=chipProps.extend({});expectTypesMatch2(!0);expectTypesMatch2(!0);var spiceEngine=external_exports.custom(value=>typeof value=="string"),analogSimulationProps=external_exports.object({simulationType:external_exports.literal("spice_transient_analysis").default("spice_transient_analysis"),duration:ms.optional(),timePerStep:ms.optional(),spiceEngine:spiceEngine.optional()});expectTypesMatch2(!0);var transistorPinsLabels=["pin1","pin2","pin3","emitter","collector","base","gate","source","drain"],transistorProps=commonComponentProps.extend({type:external_exports.enum(["npn","pnp","bjt","jfet","mosfet","igbt"]),connections:createConnectionsProp(transistorPinsLabels).optional()});expectTypesMatch2(!0);var mosfetProps=commonComponentProps.extend({channelType:external_exports.enum(["n","p"]),mosfetMode:external_exports.enum(["enhancement","depletion"])});expectTypesMatch2(!0);var inductorPins=lrPins,inductorProps=commonComponentProps.extend({inductance,maxCurrentRating:external_exports.union([external_exports.string(),external_exports.number()]).optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(inductorPins).optional()});expectTypesMatch2(!0);var diodeConnectionKeys=external_exports.enum(["anode","cathode","pin1","pin2","pos","neg"]),connectionTarget3=external_exports.string().or(external_exports.array(external_exports.string()).readonly()).or(external_exports.array(external_exports.string())),connectionsProp2=external_exports.record(diodeConnectionKeys,connectionTarget3),diodeVariant=external_exports.enum(["standard","schottky","zener","avalanche","photo","tvs"]),diodeProps=commonComponentProps.extend({connections:connectionsProp2.optional(),variant:diodeVariant.optional().default("standard"),standard:external_exports.boolean().optional(),schottky:external_exports.boolean().optional(),zener:external_exports.boolean().optional(),avalanche:external_exports.boolean().optional(),photo:external_exports.boolean().optional(),tvs:external_exports.boolean().optional(),schOrientation:schematicOrientation.optional()}).superRefine((data,ctx)=>{if([data.standard,data.schottky,data.zener,data.avalanche,data.photo,data.tvs].filter(Boolean).length>1)return ctx.addIssue({code:external_exports.ZodIssueCode.custom,message:"Exactly one diode variant must be enabled",path:[]}),external_exports.INVALID}).transform(data=>{let result={...data,standard:!1,schottky:!1,zener:!1,avalanche:!1,photo:!1,tvs:!1};if(data.standard)result.standard=!0;else if(data.schottky)result.schottky=!0;else if(data.zener)result.zener=!0;else if(data.photo)result.photo=!0;else if(data.tvs)result.tvs=!0;else switch(data.variant){case"standard":result.standard=!0;break;case"schottky":result.schottky=!0;break;case"zener":result.zener=!0;break;case"avalanche":result.avalanche=!0;break;case"photo":result.photo=!0;break;case"tvs":result.tvs=!0;break;default:result.standard=!0}return result}),diodePins=lrPolarPins;expectTypesMatch2(!0);var ledProps=commonComponentProps.extend({color:external_exports.string().optional(),wavelength:external_exports.string().optional(),schDisplayValue:external_exports.string().optional(),schOrientation:schematicOrientation.optional(),connections:createConnectionsProp(lrPolarPins).optional(),laser:external_exports.boolean().optional()}),ledPins=lrPolarPins,switchProps=commonComponentProps.extend({type:external_exports.enum(["spst","spdt","dpst","dpdt"]).optional(),isNormallyClosed:external_exports.boolean().optional().default(!1),spst:external_exports.boolean().optional(),spdt:external_exports.boolean().optional(),dpst:external_exports.boolean().optional(),dpdt:external_exports.boolean().optional(),simSwitchFrequency:frequency.optional(),simCloseAt:ms.optional(),simOpenAt:ms.optional(),simStartClosed:external_exports.boolean().optional(),simStartOpen:external_exports.boolean().optional(),connections:external_exports.custom().pipe(external_exports.record(external_exports.string(),connectionTarget)).optional()}).transform(props=>{let updatedProps={...props};switch(updatedProps.dpdt?updatedProps.type="dpdt":updatedProps.spst?updatedProps.type="spst":updatedProps.spdt?updatedProps.type="spdt":updatedProps.dpst&&(updatedProps.type="dpst"),updatedProps.type){case"spdt":updatedProps.spdt=!0;break;case"spst":updatedProps.spst=!0;break;case"dpst":updatedProps.dpst=!0;break;case"dpdt":updatedProps.dpdt=!0;break}return updatedProps});expectTypesMatch2(!0);var fabricationNoteTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var fabricationNoteRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional(),cornerRadius:distance.optional()}),fabricationNotePathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional(),color:external_exports.string().optional()}),dimensionTarget=external_exports.union([external_exports.string(),point2]),fabricationNoteDimensionProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({from:dimensionTarget,to:dimensionTarget,text:external_exports.string().optional(),offset:distance.optional(),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional(),arrowSize:distance.optional(),units:external_exports.enum(["in","mm"]).optional(),outerEdgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional(),innerEdgeToEdge:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var pcbTraceProps=external_exports.object({layer:external_exports.string().optional(),thickness:distance.optional(),route:external_exports.array(route_hint_point)}),viaProps=commonLayoutProps.extend({name:external_exports.string().optional(),fromLayer:layer_ref,toLayer:layer_ref,holeDiameter:distance.optional(),outerDiameter:distance.optional(),connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional(),netIsAssignable:external_exports.boolean().optional()});expectTypesMatch2(!0);var testpointConnectionsProp=external_exports.object({pin1:connectionTarget}).strict(),testpointProps=commonComponentProps.extend({connections:testpointConnectionsProp.optional(),footprintVariant:external_exports.enum(["pad","through_hole"]).optional(),padShape:external_exports.enum(["rect","circle"]).optional().default("circle"),padDiameter:distance.optional(),holeDiameter:distance.optional(),width:distance.optional(),height:distance.optional()}).refine(props=>props.footprintVariant!=="through_hole"||props.holeDiameter!==void 0,{message:"holeDiameter is required for through_hole testpoints"});expectTypesMatch2(!0);var breakoutPointProps=pcbLayoutProps.omit({pcbRotation:!0,layer:!0}).extend({connection:external_exports.string()});expectTypesMatch2(!0);var pcbKeepoutProps=external_exports.union([pcbLayoutProps.omit({pcbRotation:!0}).extend({shape:external_exports.literal("circle"),radius:distance}),pcbLayoutProps.extend({shape:external_exports.literal("rect"),width:distance,height:distance})]),courtyardRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional()}),courtyardOutlineProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({outline:external_exports.array(point2),strokeWidth:length.optional(),isClosed:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional()}),copperPourProps=external_exports.object({name:external_exports.string().optional(),layer:layer_ref,connectsTo:external_exports.string(),padMargin:distance3.optional(),traceMargin:distance3.optional(),clearance:distance3.optional(),boardEdgeMargin:distance3.optional(),cutoutMargin:distance3.optional(),coveredWithSolderMask:external_exports.boolean().optional().default(!0)});expectTypesMatch2(!0);var cadassemblyProps=external_exports.object({originalLayer:layer_ref.default("top").optional(),children:external_exports.any().optional()});expectTypesMatch2(!0);var pcbPosition=external_exports.object({pcbX:pcbCoordinate.optional(),pcbY:pcbCoordinate.optional(),pcbLeftEdgeX:pcbCoordinate.optional(),pcbRightEdgeX:pcbCoordinate.optional(),pcbTopEdgeY:pcbCoordinate.optional(),pcbBottomEdgeY:pcbCoordinate.optional(),pcbOffsetX:distance3.optional(),pcbOffsetY:distance3.optional(),pcbZ:distance3.optional()}),cadModelBaseWithUrl=cadModelBase.extend({modelUrl:external_exports.string(),stepUrl:external_exports.string().optional()}),cadModelObject=cadModelBaseWithUrl.merge(pcbPosition);expectTypesMatch2(!0);var cadmodelProps=external_exports.union([external_exports.null(),external_exports.string(),cadModelObject]),powerSourceProps=commonComponentProps.extend({voltage}),voltageSourcePinLabels=["pin1","pin2","pos","neg"],percentage3=external_exports.union([external_exports.string(),external_exports.number()]).transform(val=>typeof val=="string"?val.endsWith("%")?parseFloat(val.slice(0,-1))/100:parseFloat(val):val).pipe(external_exports.number().min(0,"Duty cycle must be non-negative").max(1,"Duty cycle cannot be greater than 100%")),voltageSourceProps=commonComponentProps.extend({voltage:voltage.optional(),frequency:frequency.optional(),peakToPeakVoltage:voltage.optional(),waveShape:external_exports.enum(["sinewave","square","triangle","sawtooth"]).optional(),phase:rotation.optional(),dutyCycle:percentage3.optional(),connections:createConnectionsProp(voltageSourcePinLabels).optional()});expectTypesMatch2(!0);var voltageProbeProps=commonComponentProps.omit({name:!0}).extend({name:external_exports.string().optional(),connectsTo:external_exports.string(),referenceTo:external_exports.string().optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var schematicArcProps=external_exports.object({center:point,radius:distance,startAngleDegrees:rotation,endAngleDegrees:rotation,direction:external_exports.enum(["clockwise","counterclockwise"]).default("counterclockwise"),strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)}),toolingrailProps=external_exports.object({children:external_exports.any().optional()});expectTypesMatch2(!0);var schematicBoxProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),width:distance.optional(),height:distance.optional(),overlay:external_exports.array(external_exports.string()).optional(),padding:distance.optional(),paddingLeft:distance.optional(),paddingRight:distance.optional(),paddingTop:distance.optional(),paddingBottom:distance.optional(),title:external_exports.string().optional(),titleAlignment:ninePointAnchor2.default("top_left"),titleColor:external_exports.string().optional(),titleFontSize:distance.optional(),titleInside:external_exports.boolean().default(!1),strokeStyle:external_exports.enum(["solid","dashed"]).default("solid")}).refine(elm=>elm.width!==void 0&&elm.height!==void 0||Array.isArray(elm.overlay)&&elm.overlay.length>0,{message:"Must provide either both `width` and `height`, or a non-empty `overlay` array."}).refine(elm=>!(elm.width!==void 0&&elm.height!==void 0&&Array.isArray(elm.overlay)&&elm.overlay.length>0),{message:"Cannot provide both `width`/`height` and `overlay` at the same time."}),schematicCircleProps=external_exports.object({center:point,radius:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)}),schematicRectProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),width:distance,height:distance,rotation:rotation.default(0),strokeWidth:distance.optional(),color:external_exports.string().optional(),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1),cornerRadius:distance.optional()}),schematicLineProps=external_exports.object({x1:distance,y1:distance,x2:distance,y2:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional().default(!1)}),fivePointAnchor2=external_exports.enum(["center","left","right","top","bottom"]),schematicTextProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),text:external_exports.string(),fontSize:external_exports.number().default(1),anchor:external_exports.union([fivePointAnchor2.describe("legacy"),ninePointAnchor2]).default("center"),color:external_exports.string().default("#000000"),schRotation:rotation.default(0)}),schematicPathProps=external_exports.object({points:external_exports.array(point),isFilled:external_exports.boolean().optional().default(!1),fillColor:external_exports.enum(["red","blue"]).optional()}),schematicTableProps=external_exports.object({schX:distance.optional(),schY:distance.optional(),children:external_exports.any().optional(),cellPadding:distance.optional(),borderWidth:distance.optional(),anchor:ninePointAnchor2.optional(),fontSize:distance.optional()});expectTypesMatch2(!0);var schematicRowProps=external_exports.object({children:external_exports.any().optional(),height:distance.optional()});expectTypesMatch2(!0);var schematicCellProps=external_exports.object({children:external_exports.string().optional(),horizontalAlign:external_exports.enum(["left","center","right"]).optional(),verticalAlign:external_exports.enum(["top","middle","bottom"]).optional(),fontSize:distance.optional(),rowSpan:external_exports.number().optional(),colSpan:external_exports.number().optional(),width:distance.optional(),text:external_exports.string().optional()});expectTypesMatch2(!0);var copperTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:ninePointAnchor2.default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),layers:external_exports.array(layer_ref).optional(),knockout:external_exports.boolean().optional(),mirrored:external_exports.boolean().optional()}),silkscreenTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:ninePointAnchor2.default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),isKnockout:external_exports.boolean().optional(),knockoutPadding:length.optional(),knockoutPaddingLeft:length.optional(),knockoutPaddingRight:length.optional(),knockoutPaddingTop:length.optional(),knockoutPaddingBottom:length.optional(),layers:external_exports.array(layer_ref).optional()}),silkscreenPathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional()}),silkscreenLineProps=pcbLayoutProps.omit({pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({strokeWidth:distance,x1:distance,y1:distance,x2:distance,y2:distance}),silkscreenRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({filled:external_exports.boolean().default(!0).optional(),stroke:external_exports.enum(["dashed","solid","none"]).optional(),strokeWidth:distance.optional(),width:distance,height:distance,cornerRadius:distance.optional()}),silkscreenCircleProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({isFilled:external_exports.boolean().optional(),isOutline:external_exports.boolean().optional(),strokeWidth:distance.optional(),radius:distance}),routeHintPointProps=external_exports.object({x:distance,y:distance,via:external_exports.boolean().optional(),toLayer:layer_ref.optional()}),traceHintProps=external_exports.object({for:external_exports.string().optional().describe("Selector for the port you're targeting, not required if you're inside a trace"),order:external_exports.number().optional(),offset:route_hint_point.or(routeHintPointProps).optional(),offsets:external_exports.array(route_hint_point).or(external_exports.array(routeHintPointProps)).optional(),traceWidth:external_exports.number().optional()}),portProps=commonLayoutProps.extend({name:external_exports.string(),pinNumber:external_exports.number().optional(),aliases:external_exports.array(external_exports.string()).optional(),direction,connectsTo:external_exports.string().or(external_exports.array(external_exports.string())).optional()}),pcbNoteTextProps=pcbLayoutProps.extend({text:external_exports.string(),anchorAlignment:external_exports.enum(["center","top_left","top_right","bottom_left","bottom_right"]).default("center"),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var pcbNoteRectProps=pcbLayoutProps.omit({pcbRotation:!0}).extend({width:distance,height:distance,strokeWidth:distance.optional(),isFilled:external_exports.boolean().optional(),hasStroke:external_exports.boolean().optional(),isStrokeDashed:external_exports.boolean().optional(),color:external_exports.string().optional(),cornerRadius:distance.optional()});expectTypesMatch2(!0);var pcbNotePathProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({route:external_exports.array(route_hint_point),strokeWidth:length.optional(),color:external_exports.string().optional()});expectTypesMatch2(!0);var pcbNoteLineProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({x1:distance,y1:distance,x2:distance,y2:distance,strokeWidth:distance.optional(),color:external_exports.string().optional(),isDashed:external_exports.boolean().optional()});expectTypesMatch2(!0);var dimensionTarget2=external_exports.union([external_exports.string(),point2]),pcbNoteDimensionProps=pcbLayoutProps.omit({pcbLeftEdgeX:!0,pcbRightEdgeX:!0,pcbTopEdgeY:!0,pcbBottomEdgeY:!0,pcbX:!0,pcbY:!0,pcbOffsetX:!0,pcbOffsetY:!0,pcbRotation:!0}).extend({from:dimensionTarget2,to:dimensionTarget2,text:external_exports.string().optional(),offset:distance.optional(),font:external_exports.enum(["tscircuit2024"]).optional(),fontSize:length.optional(),color:external_exports.string().optional(),arrowSize:distance.optional(),units:external_exports.enum(["in","mm"]).optional(),outerEdgeToEdge:external_exports.literal(!0).optional(),centerToCenter:external_exports.literal(!0).optional(),innerEdgeToEdge:external_exports.literal(!0).optional()});expectTypesMatch2(!0);var unvalidatedCircuitJson=external_exports.array(external_exports.any()).describe("Circuit JSON"),footprintLibraryResult=external_exports.object({footprintCircuitJson:external_exports.array(external_exports.any()),cadModel:cadModelProp.optional()}),pathToCircuitJsonFn=external_exports.function().args(external_exports.string()).returns(external_exports.promise(footprintLibraryResult)).or(external_exports.function().args(external_exports.string(),external_exports.object({resolvedPcbStyle:pcbStyle.optional()}).optional()).returns(external_exports.promise(footprintLibraryResult))).describe("A function that takes a path and returns Circuit JSON"),footprintFileParserEntry=external_exports.object({loadFromUrl:external_exports.function().args(external_exports.string()).returns(external_exports.promise(footprintLibraryResult)).describe("A function that takes a footprint file URL and returns Circuit JSON")}),spiceEngineSimulationResult=external_exports.object({engineVersionString:external_exports.string().optional(),simulationResultCircuitJson:unvalidatedCircuitJson}),spiceEngineZod=external_exports.object({simulate:external_exports.function().args(external_exports.string()).returns(external_exports.promise(spiceEngineSimulationResult)).describe("A function that takes a SPICE string and returns a simulation result")}),defaultSpiceEngine=external_exports.custom(value=>typeof value=="string"),autorouterInstance=external_exports.object({run:external_exports.function().args().returns(external_exports.promise(external_exports.unknown())).describe("Run the autorouter"),getOutputSimpleRouteJson:external_exports.function().args().returns(external_exports.promise(external_exports.any())).describe("Get the resulting SimpleRouteJson")}),autorouterDefinition=external_exports.object({createAutorouter:external_exports.function().args(external_exports.any(),external_exports.any().optional()).returns(external_exports.union([autorouterInstance,external_exports.promise(autorouterInstance)])).describe("Create an autorouter instance")}),platformConfig=external_exports.object({partsEngine:partsEngine.optional(),autorouter:autorouterProp.optional(),autorouterMap:external_exports.record(external_exports.string(),autorouterDefinition).optional(),registryApiUrl:external_exports.string().optional(),cloudAutorouterUrl:external_exports.string().optional(),projectName:external_exports.string().optional(),projectBaseUrl:external_exports.string().optional(),version:external_exports.string().optional(),url:external_exports.string().optional(),printBoardInformationToSilkscreen:external_exports.boolean().optional(),includeBoardFiles:external_exports.array(external_exports.string()).describe('The board files to automatically build with "tsci build", defaults to ["**/*.circuit.tsx"]. Can be an array of files or globs').optional(),snapshotsDir:external_exports.string().describe('The directory where snapshots are stored for "tsci snapshot", defaults to "tests/__snapshots__"').optional(),defaultSpiceEngine:defaultSpiceEngine.optional(),localCacheEngine:external_exports.any().optional(),pcbDisabled:external_exports.boolean().optional(),schematicDisabled:external_exports.boolean().optional(),partsEngineDisabled:external_exports.boolean().optional(),spiceEngineMap:external_exports.record(external_exports.string(),spiceEngineZod).optional(),footprintLibraryMap:external_exports.record(external_exports.string(),external_exports.union([pathToCircuitJsonFn,external_exports.record(external_exports.string(),external_exports.union([unvalidatedCircuitJson,pathToCircuitJsonFn]))])).optional(),footprintFileParserMap:external_exports.record(external_exports.string(),footprintFileParserEntry).optional(),resolveProjectStaticFileImportUrl:external_exports.function().args(external_exports.string()).returns(external_exports.promise(external_exports.string())).describe("A function that returns a string URL for static files for the project").optional()});expectTypesMatch2(!0);var platformConfigObject=platformConfig,projectConfig=platformConfigObject.pick({projectName:!0,projectBaseUrl:!0,version:!0,url:!0,printBoardInformationToSilkscreen:!0,includeBoardFiles:!0,snapshotsDir:!0,defaultSpiceEngine:!0});expectTypesMatch2(!0);init_dist();init_zod();init_dist();init_dist();init_dist();init_dist2();init_zod();var import_react2=__toESM(require_react(),1);init_dist2();init_zod();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 i3=this.index[key.id()];return i3===void 0?void 0:this.array[i3]}setDefault(key,factory){let i3=this.index[key.id()];if(i3===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[i3]}insert(key,value){let pair=new Pair(key,value),i3=this.index[key.id()];return i3===void 0?(this.index[key.id()]=this.array.length,this.array.push(pair)):this.array[i3]=pair,pair}erase(key){let i3=this.index[key.id()];if(i3===void 0)return;this.index[key.id()]=void 0;let pair=this.array[i3],last=this.array.pop();return pair!==last&&(this.array[i3]=last,this.index[last.first.id()]=i3),pair}copy(){let copy=new _IndexedMap;for(let i3=0;i3<this.array.length;i3++){let pair=this.array[i3].copy();copy.array[i3]=pair,copy.index[pair.first.id()]=i3}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 i3=0,n3=this._terms.size();i3<n3;i3++){let pair=this._terms.itemAt(i3);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 i3=0,n3=args.length;i3<n3;++i3){let item=args[i3];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 j3=0,k4=terms2.size();j3<k4;j3++){let termPair=terms2.itemAt(j3);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 j3=0,k4=terms2.size();j3<k4;j3++){let termPair=terms2.itemAt(j3);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(a3,b3,c3,w4=1){let result=0;return result+=Math.max(0,Math.min(1e3,a3*w4))*1e6,result+=Math.max(0,Math.min(1e3,b3*w4))*1e3,result+=Math.max(0,Math.min(1e3,c3*w4)),result}static clip(value){return Math.max(0,Math.min(_Strength.required,value))}};__publicField(_Strength,"required",_Strength.create(1e3,1e3,1e3)),__publicField(_Strength,"strong",_Strength.create(1,0,0)),__publicField(_Strength,"medium",_Strength.create(0,1,0)),__publicField(_Strength,"weak",_Strength.create(0,0,1));var Strength=_Strength;var Operator;(function(Operator2){Operator2[Operator2.Le=0]="Le",Operator2[Operator2.Ge=1]="Ge",Operator2[Operator2.Eq=2]="Eq"})(Operator||(Operator={}));var Constraint=class{constructor(expression,operator,rhs,strength=Strength.required){__publicField(this,"_expression");__publicField(this,"_operator");__publicField(this,"_strength");__publicField(this,"_id",CnId++);this._operator=operator,this._strength=Strength.clip(strength),rhs===void 0&&expression instanceof Expression?this._expression=expression:this._expression=expression.minus(rhs)}id(){return this._id}expression(){return this._expression}op(){return this._operator}strength(){return this._strength}toString(){return this._expression.toString()+" "+["<=",">=","="][this._operator]+" 0 ("+this._strength.toString()+")"}},CnId=0;var Solver=class{constructor(){__publicField(this,"maxIterations",1e3);__publicField(this,"_cnMap",createCnMap());__publicField(this,"_rowMap",createRowMap());__publicField(this,"_varMap",createVarMap());__publicField(this,"_editMap",createEditMap());__publicField(this,"_infeasibleRows",[]);__publicField(this,"_objective",new Row);__publicField(this,"_artificial",null);__publicField(this,"_idTick",0)}createConstraint(lhs,operator,rhs,strength=Strength.required){let cn3=new Constraint(lhs,operator,rhs,strength);return this.addConstraint(cn3),cn3}addConstraint(constraint){if(this._cnMap.find(constraint)!==void 0)throw new Error("duplicate constraint");let data=this._createRow(constraint),row=data.row,tag=data.tag,subject=this._chooseSubject(row,tag);if(subject.type()===SymbolType.Invalid&&row.allDummies())if(nearZero(row.constant()))subject=tag.marker;else throw new Error("unsatisfiable constraint");if(subject.type()===SymbolType.Invalid){if(!this._addWithArtificialVariable(row))throw new Error("unsatisfiable constraint")}else row.solveFor(subject),this._substitute(subject,row),this._rowMap.insert(subject,row);this._cnMap.insert(constraint,tag),this._optimize(this._objective)}removeConstraint(constraint){let cnPair=this._cnMap.erase(constraint);if(cnPair===void 0)throw new Error("unknown constraint");this._removeConstraintEffects(constraint,cnPair.second);let marker=cnPair.second.marker,rowPair=this._rowMap.erase(marker);if(rowPair===void 0){let leaving=this._getMarkerLeavingSymbol(marker);if(leaving.type()===SymbolType.Invalid)throw new Error("failed to find leaving row");rowPair=this._rowMap.erase(leaving),rowPair.second.solveForEx(leaving,marker),this._substitute(marker,rowPair.second)}this._optimize(this._objective)}hasConstraint(constraint){return this._cnMap.contains(constraint)}getConstraints(){return this._cnMap.array.map(({first})=>first)}addEditVariable(variable,strength){if(this._editMap.find(variable)!==void 0)throw new Error("duplicate edit variable");if(strength=Strength.clip(strength),strength===Strength.required)throw new Error("bad required strength");let expr=new Expression(variable),cn3=new Constraint(expr,Operator.Eq,void 0,strength);this.addConstraint(cn3);let info={tag:this._cnMap.find(cn3).second,constraint:cn3,constant:0};this._editMap.insert(variable,info)}removeEditVariable(variable){let editPair=this._editMap.erase(variable);if(editPair===void 0)throw new Error("unknown edit variable");this.removeConstraint(editPair.second.constraint)}hasEditVariable(variable){return this._editMap.contains(variable)}suggestValue(variable,value){let editPair=this._editMap.find(variable);if(editPair===void 0)throw new Error("unknown edit variable");let rows=this._rowMap,info=editPair.second,delta=value-info.constant;info.constant=value;let marker=info.tag.marker,rowPair=rows.find(marker);if(rowPair!==void 0){rowPair.second.add(-delta)<0&&this._infeasibleRows.push(marker),this._dualOptimize();return}let other=info.tag.other;if(rowPair=rows.find(other),rowPair!==void 0){rowPair.second.add(delta)<0&&this._infeasibleRows.push(other),this._dualOptimize();return}for(let i3=0,n3=rows.size();i3<n3;++i3){let rowPair2=rows.itemAt(i3),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 i3=0,n3=vars.size();i3<n3;++i3){let pair=vars.itemAt(i3),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 i3=0,n3=terms.size();i3<n3;++i3){let termPair=terms.itemAt(i3);if(!nearZero(termPair.second)){let symbol=this._getVarSymbol(termPair.first),basicPair=this._rowMap.find(symbol);basicPair!==void 0?row.insertRow(basicPair.second,termPair.second):row.insertSymbol(symbol,termPair.second)}}let objective=this._objective,strength=constraint.strength(),tag={marker:INVALID_SYMBOL,other:INVALID_SYMBOL};switch(constraint.op()){case Operator.Le:case Operator.Ge:{let coeff=constraint.op()===Operator.Le?1:-1,slack=this._makeSymbol(SymbolType.Slack);if(tag.marker=slack,row.insertSymbol(slack,coeff),strength<Strength.required){let error=this._makeSymbol(SymbolType.Error);tag.other=error,row.insertSymbol(error,-coeff),objective.insertSymbol(error,strength)}break}case Operator.Eq:{if(strength<Strength.required){let errplus=this._makeSymbol(SymbolType.Error),errminus=this._makeSymbol(SymbolType.Error);tag.marker=errplus,tag.other=errminus,row.insertSymbol(errplus,-1),row.insertSymbol(errminus,1),objective.insertSymbol(errplus,strength),objective.insertSymbol(errminus,strength)}else{let dummy=this._makeSymbol(SymbolType.Dummy);tag.marker=dummy,row.insertSymbol(dummy)}break}}return row.constant()<0&&row.reverseSign(),{row,tag}}_chooseSubject(row,tag){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);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 i3=0,n3=rows.size();i3<n3;++i3)rows.itemAt(i3).second.removeSymbol(art);return this._objective.removeSymbol(art),success}_substitute(symbol,row){let rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3);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 i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),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 i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),symbol=pair.first,c3=pair.second;if(c3>0&&symbol.type()!==SymbolType.Dummy){let r4=this._objective.coefficientFor(symbol)/c3;r4<ratio&&(ratio=r4,entering=symbol)}}return entering}_getLeavingSymbol(entering){let ratio=Number.MAX_VALUE,found=INVALID_SYMBOL,rows=this._rowMap;for(let i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),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 i3=0,n3=rows.size();i3<n3;++i3){let pair=rows.itemAt(i3),row=pair.second,c3=row.coefficientFor(marker);if(c3===0)continue;let symbol=pair.first;if(symbol.type()===SymbolType.External)third=symbol;else if(c3<0){let r4=-row.constant()/c3;r4<r12&&(r12=r4,first=symbol)}else{let r4=row.constant()/c3;r4<r22&&(r22=r4,second=symbol)}}return first!==invalid?first:second!==invalid?second:third}_removeConstraintEffects(cn3,tag){tag.marker.type()===SymbolType.Error&&this._removeMarkerEffects(tag.marker,cn3.strength()),tag.other.type()===SymbolType.Error&&this._removeMarkerEffects(tag.other,cn3.strength())}_removeMarkerEffects(marker,strength){let pair=this._rowMap.find(marker);pair!==void 0?this._objective.insertRow(pair.second,-strength):this._objective.insertSymbol(marker,-strength)}_anyPivotableSymbol(row){let cells=row.cells();for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3),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,id){__publicField(this,"_id");__publicField(this,"_type");this._id=id,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 i3=0,n3=cells.size();i3<n3;++i3)if(cells.itemAt(i3).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 i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);this.insertSymbol(pair.first,pair.second*coefficient)}}removeSymbol(symbol){this._cellMap.erase(symbol)}reverseSign(){this._constant=-this._constant;let cells=this._cellMap;for(let i3=0,n3=cells.size();i3<n3;++i3){let pair=cells.itemAt(i3);pair.second=-pair.second}}solveFor(symbol){let cells=this._cellMap,coeff=-1/cells.erase(symbol).second;this._constant*=coeff;for(let i3=0,n3=cells.size();i3<n3;++i3)cells.itemAt(i3).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_debug8=__toESM(require_browser(),1);init_zod();init_dist();init_dist();init_dist4();var dist_exports2={};__export(dist_exports2,{areBoundsCompletelyInsidePolygon:()=>areBoundsCompletelyInsidePolygon,areBoundsOverlappingPolygon:()=>areBoundsOverlappingPolygon,boundsAreaOverlap:()=>boundsAreaOverlap,boundsDistance:()=>boundsDistance,boundsIntersection:()=>boundsIntersection,clamp:()=>clamp2,computeDistanceBetweenBoxes:()=>computeDistanceBetweenBoxes2,computeGapBetweenBoxes:()=>computeGapBetweenBoxes,computeManhattanDistanceBetweenBoxes:()=>computeManhattanDistanceBetweenBoxes,distSq:()=>distSq,distance:()=>distance4,doBoundsOverlap:()=>doBoundsOverlap,doSegmentsIntersect:()=>doSegmentsIntersect2,doesLineIntersectLine:()=>doesLineIntersectLine2,doesSegmentIntersectRect:()=>doesSegmentIntersectRect,findNearestPointsBetweenBoxSets:()=>findNearestPointsBetweenBoxSets2,getBoundingBox:()=>getBoundingBox2,getBoundsFromPoints:()=>getBoundsFromPoints,getSegmentIntersection:()=>getSegmentIntersection,getUnitVectorFromDirection:()=>getUnitVectorFromDirection2,getUnitVectorFromPointAToB:()=>getUnitVectorFromPointAToB2,grid:()=>grid2,isPointInsidePolygon:()=>isPointInsidePolygon,isRectCompletelyInsidePolygon:()=>isRectCompletelyInsidePolygon,isRectOverlappingPolygon:()=>isRectOverlappingPolygon,midpoint:()=>midpoint,normalizeDegrees:()=>normalizeDegrees,onSegment:()=>onSegment2,orientation:()=>orientation2,pointToBoundsDistance:()=>pointToBoundsDistance,pointToBoxDistance:()=>pointToBoxDistance,pointToSegmentClosestPoint:()=>pointToSegmentClosestPoint,pointToSegmentDistance:()=>pointToSegmentDistance2,range:()=>range,segmentToBoundsMinDistance:()=>segmentToBoundsMinDistance,segmentToBoxMinDistance:()=>segmentToBoxMinDistance,segmentToCircleMinDistance:()=>segmentToCircleMinDistance,segmentToSegmentMinDistance:()=>segmentToSegmentMinDistance});function doesLineIntersectLine2([a12,a22],[b12,b22],{lineThickness=0}={}){return lineThickness===0?doSegmentsIntersect2(a12,a22,b12,b22):segmentsDistance2(a12,a22,b12,b22)<=lineThickness}function doSegmentsIntersect2(p12,q12,p22,q22){let o12=orientation2(p12,q12,p22),o22=orientation2(p12,q12,q22),o3=orientation2(p22,q22,p12),o4=orientation2(p22,q22,q12);return!!(o12!==o22&&o3!==o4||o12===0&&onSegment2(p12,p22,q12)||o22===0&&onSegment2(p12,q22,q12)||o3===0&&onSegment2(p22,p12,q22)||o4===0&&onSegment2(p22,q12,q22))}function orientation2(p4,q4,r4){let val=(q4.y-p4.y)*(r4.x-q4.x)-(q4.x-p4.x)*(r4.y-q4.y);return val===0?0:val>0?1:2}function onSegment2(p4,q4,r4){return q4.x<=Math.max(p4.x,r4.x)&&q4.x>=Math.min(p4.x,r4.x)&&q4.y<=Math.max(p4.y,r4.y)&&q4.y>=Math.min(p4.y,r4.y)}function segmentsDistance2(a12,a22,b12,b22){if(a12.x===a22.x&&a12.y===a22.y)return pointToSegmentDistance2(a12,b12,b22);if(b12.x===b22.x&&b12.y===b22.y)return pointToSegmentDistance2(b12,a12,a22);if(doSegmentsIntersect2(a12,a22,b12,b22))return 0;let distances=[pointToSegmentDistance2(a12,b12,b22),pointToSegmentDistance2(a22,b12,b22),pointToSegmentDistance2(b12,a12,a22),pointToSegmentDistance2(b22,a12,a22)];return Math.min(...distances)}function pointToSegmentDistance2(p4,v4,w4){let l22=(w4.x-v4.x)**2+(w4.y-v4.y)**2;if(l22===0)return distance4(p4,v4);let t6=((p4.x-v4.x)*(w4.x-v4.x)+(p4.y-v4.y)*(w4.y-v4.y))/l22;t6=Math.max(0,Math.min(1,t6));let projection={x:v4.x+t6*(w4.x-v4.x),y:v4.y+t6*(w4.y-v4.y)};return distance4(p4,projection)}function distance4(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return Math.sqrt(dx2*dx2+dy2*dy2)}function getSegmentIntersection(a3,b3,u4,v4){let dx1=b3.x-a3.x,dy1=b3.y-a3.y,dx2=v4.x-u4.x,dy2=v4.y-u4.y,dx3=a3.x-u4.x,dy3=a3.y-u4.y,denominator=dx1*dy2-dy1*dx2;if(Math.abs(denominator)<1e-10)return null;let t6=(dy3*dx2-dx3*dy2)/denominator,s4=(dx1*dy3-dy1*dx3)/denominator,epsilon=1e-9;if(t6>=-epsilon&&t6<=1+epsilon&&s4>=-epsilon&&s4<=1+epsilon){let intersectionX=a3.x+t6*dx1,intersectionY=a3.y+t6*dy1;return{x:intersectionX,y:intersectionY}}return null}function doesSegmentIntersectRect(a3,b3,rect){let pointInside=p4=>p4.x>=rect.minX&&p4.x<=rect.maxX&&p4.y>=rect.minY&&p4.y<=rect.maxY;if(pointInside(a3)||pointInside(b3))return!0;let topLeft={x:rect.minX,y:rect.minY},topRight={x:rect.maxX,y:rect.minY},bottomLeft={x:rect.minX,y:rect.maxY},bottomRight={x:rect.maxX,y:rect.maxY};return doSegmentsIntersect2(a3,b3,topLeft,topRight)||doSegmentsIntersect2(a3,b3,topRight,bottomRight)||doSegmentsIntersect2(a3,b3,bottomRight,bottomLeft)||doSegmentsIntersect2(a3,b3,bottomLeft,topLeft)}function segmentToSegmentMinDistance(a3,b3,u4,v4){if(a3.x===b3.x&&a3.y===b3.y)return pointToSegmentDistance2(a3,u4,v4);if(u4.x===v4.x&&u4.y===v4.y)return pointToSegmentDistance2(u4,a3,b3);if(doSegmentsIntersect2(a3,b3,u4,v4))return 0;let distances=[pointToSegmentDistance2(a3,u4,v4),pointToSegmentDistance2(b3,u4,v4),pointToSegmentDistance2(u4,a3,b3),pointToSegmentDistance2(v4,a3,b3)];return Math.min(...distances)}function segmentToBoundsMinDistance(a3,b3,bounds){let topLeft={x:bounds.minX,y:bounds.minY},topRight={x:bounds.maxX,y:bounds.minY},bottomLeft={x:bounds.minX,y:bounds.maxY},bottomRight={x:bounds.maxX,y:bounds.maxY};if(doSegmentsIntersect2(a3,b3,topLeft,topRight)||doSegmentsIntersect2(a3,b3,topRight,bottomRight)||doSegmentsIntersect2(a3,b3,bottomRight,bottomLeft)||doSegmentsIntersect2(a3,b3,bottomLeft,topLeft)||a3.x>=bounds.minX&&a3.x<=bounds.maxX&&a3.y>=bounds.minY&&a3.y<=bounds.maxY&&b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;let distances=[pointToSegmentDistance2(topLeft,a3,b3),pointToSegmentDistance2(topRight,a3,b3),pointToSegmentDistance2(bottomLeft,a3,b3),pointToSegmentDistance2(bottomRight,a3,b3)];if(a3.x>=bounds.minX&&a3.x<=bounds.maxX&&a3.y>=bounds.minY&&a3.y<=bounds.maxY||b3.x>=bounds.minX&&b3.x<=bounds.maxX&&b3.y>=bounds.minY&&b3.y<=bounds.maxY)return 0;if(a3.x<bounds.minX||a3.x>bounds.maxX||a3.y<bounds.minY||a3.y>bounds.maxY){let closestX=clamp2(a3.x,bounds.minX,bounds.maxX),closestY=clamp2(a3.y,bounds.minY,bounds.maxY);distances.push(distance4(a3,{x:closestX,y:closestY}))}if(b3.x<bounds.minX||b3.x>bounds.maxX||b3.y<bounds.minY||b3.y>bounds.maxY){let closestX=clamp2(b3.x,bounds.minX,bounds.maxX),closestY=clamp2(b3.y,bounds.minY,bounds.maxY);distances.push(distance4(b3,{x:closestX,y:closestY}))}return Math.min(...distances)}function segmentToBoxMinDistance(a3,b3,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,bounds={minX:box2.center.x-halfWidth,maxX:box2.center.x+halfWidth,minY:box2.center.y-halfHeight,maxY:box2.center.y+halfHeight};return segmentToBoundsMinDistance(a3,b3,bounds)}function segmentToCircleMinDistance(a3,b3,circle2){let circleCenter={x:circle2.x,y:circle2.y};if(a3.x===b3.x&&a3.y===b3.y)return Math.max(0,distance4(a3,circleCenter)-circle2.radius);let ab2={x:b3.x-a3.x,y:b3.y-a3.y},ac2={x:circleCenter.x-a3.x,y:circleCenter.y-a3.y},abLengthSq=ab2.x*ab2.x+ab2.y*ab2.y,t6=Math.max(0,Math.min(1,(ab2.x*ac2.x+ab2.y*ac2.y)/abLengthSq)),closestPoint={x:a3.x+t6*ab2.x,y:a3.y+t6*ab2.y},distToCenter=distance4(closestPoint,circleCenter);return Math.max(0,distToCenter-circle2.radius)}function pointToSegmentClosestPoint(p4,a3,b3){let dx_ab=b3.x-a3.x,dy_ab=b3.y-a3.y,l22=dx_ab*dx_ab+dy_ab*dy_ab;if(l22===0)return{x:a3.x,y:a3.y};let t6=((p4.x-a3.x)*dx_ab+(p4.y-a3.y)*dy_ab)/l22;return t6=Math.max(0,Math.min(1,t6)),{x:a3.x+t6*dx_ab,y:a3.y+t6*dy_ab}}function normalizeDegrees(angle){return(angle%360+360)%360}function pointToBoxDistance(p4,box2){let halfWidth=box2.width/2,halfHeight=box2.height/2,minX=box2.center.x-halfWidth,maxX=box2.center.x+halfWidth,minY=box2.center.y-halfHeight,maxY=box2.center.y+halfHeight;if(p4.x>=minX&&p4.x<=maxX&&p4.y>=minY&&p4.y<=maxY)return 0;let closestX=clamp2(p4.x,minX,maxX),closestY=clamp2(p4.y,minY,maxY);return distance4(p4,{x:closestX,y:closestY})}function pointToBoundsDistance(p4,bounds){if(p4.x>=bounds.minX&&p4.x<=bounds.maxX&&p4.y>=bounds.minY&&p4.y<=bounds.maxY)return 0;let closestX=clamp2(p4.x,bounds.minX,bounds.maxX),closestY=clamp2(p4.y,bounds.minY,bounds.maxY);return distance4(p4,{x:closestX,y:closestY})}function midpoint(p12,p22){return{x:(p12.x+p22.x)/2,y:(p12.y+p22.y)/2}}function distSq(p12,p22){let dx2=p12.x-p22.x,dy2=p12.y-p22.y;return dx2*dx2+dy2*dy2}var universalRectToBounds=rect=>{if("minX"in rect)return rect;let halfWidth=rect.width/2,halfHeight=rect.height/2;return{minX:rect.center.x-halfWidth,minY:rect.center.y-halfHeight,maxX:rect.center.x+halfWidth,maxY:rect.center.y+halfHeight}},getBoundsCorners=bounds=>[{x:bounds.minX,y:bounds.minY},{x:bounds.maxX,y:bounds.minY},{x:bounds.maxX,y:bounds.maxY},{x:bounds.minX,y:bounds.maxY}],getPolygonEdges=polygon2=>{let edges=[];for(let i3=0;i3<polygon2.length;i3++){let start=polygon2[i3],end=polygon2[(i3+1)%polygon2.length];edges.push([start,end])}return edges},isPointOnSegment=(point6,start,end)=>{let cross3=(point6.y-start.y)*(end.x-start.x)-(point6.x-start.x)*(end.y-start.y);if(Math.abs(cross3)>1e-9)return!1;let dot=(point6.x-start.x)*(end.x-start.x)+(point6.y-start.y)*(end.y-start.y);if(dot<0)return!1;let squaredLength=(end.x-start.x)**2+(end.y-start.y)**2;return!(dot>squaredLength)},isPointInsideBounds=(point6,bounds)=>point6.x>=bounds.minX&&point6.x<=bounds.maxX&&point6.y>=bounds.minY&&point6.y<=bounds.maxY,isPointInsidePolygon=(point6,polygon2)=>{if(polygon2.length<3)return!1;let edges=getPolygonEdges(polygon2);for(let[start,end]of edges)if(isPointOnSegment(point6,start,end))return!0;let inside2=!1;for(let i3=0,j3=polygon2.length-1;i3<polygon2.length;j3=i3++){let xi3=polygon2[i3].x,yi3=polygon2[i3].y,xj=polygon2[j3].x,yj=polygon2[j3].y;yi3>point6.y!=yj>point6.y&&point6.x<(xj-xi3)*(point6.y-yi3)/(yj-yi3)+xi3&&(inside2=!inside2)}return inside2},doesPolygonIntersectBounds=(bounds,polygon2)=>{let boundsCorners=getBoundsCorners(bounds),boundsEdges=[[boundsCorners[0],boundsCorners[1]],[boundsCorners[1],boundsCorners[2]],[boundsCorners[2],boundsCorners[3]],[boundsCorners[3],boundsCorners[0]]],polygonEdges=getPolygonEdges(polygon2);for(let[start,end]of polygonEdges)for(let[rectStart,rectEnd]of boundsEdges)if(doSegmentsIntersect2(start,end,rectStart,rectEnd))return!0;return!1},areBoundsOverlappingPolygon=(bounds,polygon2)=>polygon2.length<3?!1:polygon2.some(point6=>isPointInsideBounds(point6,bounds))||getBoundsCorners(bounds).some(corner=>isPointInsidePolygon(corner,polygon2))?!0:doesPolygonIntersectBounds(bounds,polygon2),areBoundsCompletelyInsidePolygon=(bounds,polygon2)=>polygon2.length<3||!getBoundsCorners(bounds).every(corner=>isPointInsidePolygon(corner,polygon2))?!1:!doesPolygonIntersectBounds(bounds,polygon2),isRectOverlappingPolygon=(rect,polygon2)=>areBoundsOverlappingPolygon(universalRectToBounds(rect),polygon2),isRectCompletelyInsidePolygon=(rect,polygon2)=>areBoundsCompletelyInsidePolygon(universalRectToBounds(rect),polygon2);function range(start,end,step=1){if(step===0)throw new Error("step cannot be 0");let _start,_end;end===void 0?(_start=0,_end=start):(_start=start,_end=end);let result=[];if(step>0)for(let i3=_start;i3<_end;i3+=step)result.push(i3);else for(let i3=_start;i3>_end;i3+=step)result.push(i3);return result}var boundsAreaOverlap=(bounds1,bounds2)=>{let overlapX=Math.max(0,Math.min(bounds1.maxX,bounds2.maxX)-Math.max(bounds1.minX,bounds2.minX)),overlapY=Math.max(0,Math.min(bounds1.maxY,bounds2.maxY)-Math.max(bounds1.minY,bounds2.minY));return overlapX*overlapY};var boundsDistance=(bounds1,bounds2)=>{let dx2=bounds1.maxX<bounds2.minX?bounds2.minX-bounds1.maxX:bounds2.maxX<bounds1.minX?bounds1.minX-bounds2.maxX:0,dy2=bounds1.maxY<bounds2.minY?bounds2.minY-bounds1.maxY:bounds2.maxY<bounds1.minY?bounds1.minY-bounds2.maxY:0;return Math.sqrt(dx2*dx2+dy2*dy2)};var boundsIntersection=(bounds1,bounds2)=>{let minX=Math.max(bounds1.minX,bounds2.minX),minY=Math.max(bounds1.minY,bounds2.minY),maxX=Math.min(bounds1.maxX,bounds2.maxX),maxY=Math.min(bounds1.maxY,bounds2.maxY);return minX>maxX||minY>maxY?null:{minX,minY,maxX,maxY}};var doBoundsOverlap=(bounds1,bounds2)=>!(bounds1.maxX<bounds2.minX||bounds2.maxX<bounds1.minX||bounds1.maxY<bounds2.minY||bounds2.maxY<bounds1.minY);var getBoundsFromPoints=points=>{if(points.length===0)return null;let minX=points[0].x,minY=points[0].y,maxX=points[0].x,maxY=points[0].y;for(let i3=1;i3<points.length;i3++){let point6=points[i3];point6.x<minX&&(minX=point6.x),point6.y<minY&&(minY=point6.y),point6.x>maxX&&(maxX=point6.x),point6.y>maxY&&(maxY=point6.y)}return{minX,minY,maxX,maxY}};var getUnitVectorFromPointAToB2=(a3,b3)=>{let delta={x:b3.x-a3.x,y:b3.y-a3.y},magnitude=Math.sqrt(delta.x**2+delta.y**2);return{x:delta.x/magnitude,y:delta.y/magnitude}},getUnitVectorFromDirection2=direction2=>{switch(direction2){case"up":return{x:0,y:1};case"down":return{x:0,y:-1};case"left":return{x:-1,y:0};case"right":return{x:1,y:0}}};function grid2({rows,cols,xSpacing,ySpacing,width,height,offsetX=0,offsetY=0,yDirection="cartesian",centered=!0}){let effectiveXSpacing=xSpacing??1,effectiveYSpacing=ySpacing??1,totalWidth=width??cols*effectiveXSpacing,totalHeight=height??rows*effectiveYSpacing,centeringOffsetX=centered?-totalWidth/2:0,centeringOffsetY=centered?-totalHeight/2:0,cellWidth=width?width/cols:effectiveXSpacing,cellHeight=height?height/rows:effectiveYSpacing,cells=[];for(let row=0;row<rows;row++)for(let col=0;col<cols;col++){let index=row*cols+col,centerX=offsetX+centeringOffsetX+col*cellWidth+cellWidth/2,rawCenterY=offsetY+row*cellHeight+cellHeight/2,centerY=yDirection==="cartesian"?offsetY+centeringOffsetY+(rows-1-row)*cellHeight+cellHeight/2:offsetY+centeringOffsetY+row*cellHeight+cellHeight/2;cells.push({index,center:{x:centerX,y:centerY},topLeft:{x:centerX-cellWidth/2,y:centerY+cellHeight/2},bottomRight:{x:centerX+cellWidth/2,y:centerY-cellHeight/2},row,col})}return cells}init_dist();init_dist5();var package_default={name:"@tscircuit/capacity-autorouter",main:"./dist/index.js",version:"0.0.178",type:"module",files:["dist"],scripts:{start:"cosmos",build:"tsup ./lib/index.ts --minify terser --external @tscircuit/core --external circuit-to-svg --format esm --dts --sourcemap",bench:"bun test tests/spatial-index-bench.test.ts",format:"biome format --write .","format:check":"biome format .","vercel-build":"cosmos-export","repomix:lib":"repomix --ignore 'testing/**,**/TwoRouteHighDensitySolver/**,**/RouteStitchingSolver/**,solvers/CapacitySegmentPointOptimizer/CapacitySegmentPointOptimizer.ts' lib","bug-report":"bun run scripts/download-bug-report.ts","bug-report-with-test":"bun run scripts/create-bug-report-test.ts"},devDependencies:{"@biomejs/biome":"^1.9.4","@radix-ui/react-icons":"^1.3.2","@radix-ui/react-menubar":"^1.1.14","@react-hook/resize-observer":"^2.0.2","@resvg/resvg-js":"^2.6.2","@tscircuit/checks":"^0.0.75","@tscircuit/circuit-json-util":"^0.0.46","@tscircuit/core":"^0.0.337","@tscircuit/math-utils":"^0.0.27","@tscircuit/rectdiff":"^0.0.7","@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","circuit-json-to-connectivity-map":"^0.0.19","circuit-to-svg":"^0.0.220",clsx:"^2.1.1",flatbush:"^4.4.0","graphics-debug":"^0.0.70","looks-same":"9",rbush:"^4.0.1",react:"18","react-cosmos":"^6.2.3","react-cosmos-plugin-vite":"^6.2.0","react-dom":"18","react-konva":"18",recharts:"^2.15.1","tailwind-merge":"^3.2.0",terser:"^5.43.1",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"},dependencies:{"bun-match-svg":"^0.0.14","fast-json-stable-stringify":"^2.1.0","object-hash":"^3.0.0"}};init_dist();init_dist4();init_dist6();var import_react3=__toESM(require_react(),1);init_dist();var import_debug9=__toESM(require_browser(),1);var dist_exports3={};__export(dist_exports3,{AssignableViaAutoroutingPipelineSolver:()=>wi2,AutoroutingPipelineSolver:()=>pi2,CapacityMeshSolver:()=>fi2,InMemoryCache:()=>J3,LocalStorageCache:()=>tt2,calculateOptimalCapacityDepth:()=>Ce2,convertSrjToGraphicsObject:()=>$e2,getGlobalInMemoryCache:()=>st2,getGlobalLocalStorageCache:()=>et2,getTunedTotalCapacity1:()=>Pe2,setupGlobalCaches:()=>nt2});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=(...t6)=>{let e4={points:[],lines:[],circles:[],rects:[]};return t6.forEach((t7,s4)=>{t7&&(t7.lines&&(e4.lines=[...e4.lines||[],...t7.lines.map(t8=>({...t8,step:s4}))]),t7.points&&(e4.points=[...e4.points||[],...t7.points.map(t8=>({...t8,step:s4}))]),t7.circles&&(e4.circles=[...e4.circles||[],...t7.circles.map(t8=>({...t8,step:s4}))]),t7.rects&&(e4.rects=[...e4.rects||[],...t7.rects.map(t8=>({...t8,step:s4}))]))}),e4},e3=class{constructor(){__publicField(this,"MAX_ITERATIONS",1e3);__publicField(this,"solved",!1);__publicField(this,"failed",!1);__publicField(this,"iterations",0);__publicField(this,"progress",0);__publicField(this,"error",null);__publicField(this,"activeSubSolver");__publicField(this,"failedSubSolvers");__publicField(this,"timeToSolve");__publicField(this,"stats",{});__publicField(this,"cacheHit");__publicField(this,"cacheKey");__publicField(this,"cacheToSolveSpaceTransform")}step(){if(!this.solved&&!this.failed){this.iterations++;try{this._step()}catch(t6){throw this.error=`${this.constructor.name} error: ${t6}`,console.error(this.error),this.failed=!0,t6}!this.solved&&this.iterations>this.MAX_ITERATIONS&&this.tryFinalAcceptance(),!this.solved&&this.iterations>this.MAX_ITERATIONS&&(this.error=`${this.constructor.name} ran out of iterations (MAX_ITERATIONS=${this.MAX_ITERATIONS})`,console.error(this.error),this.failed=!0),"computeProgress"in this&&(this.progress=this.computeProgress())}}_step(){}getConstructorParams(){throw new Error("getConstructorParams not implemented")}solve(){let t6=Date.now();for(;!this.solved&&!this.failed;)this.step();let e4=Date.now();this.timeToSolve=e4-t6}visualize(){return{lines:[],points:[],rects:[],circles:[]}}tryFinalAcceptance(){}preview(){return{lines:[],points:[],rects:[],circles:[]}}};function s3(t6){let e4=new Map;for(let s4 of t6)for(let t7 of s4.nodeIds)e4.set(t7,[...e4.get(t7)??[],s4]);return e4}function n(){return n=Object.assign?Object.assign.bind():function(t6){for(var e4=1;e4<arguments.length;e4++){var s4=arguments[e4];for(var n3 in s4)({}).hasOwnProperty.call(s4,n3)&&(t6[n3]=s4[n3])}return t6},n.apply(null,arguments)}function i(t6,e4){return(i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t7,e5){return t7.__proto__=e5,t7})(t6,e4)}function o(t6){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t7){return t7.__proto__||Object.getPrototypeOf(t7)})(t6)}function a(){try{var t6=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(a=function(){return!!t6})()}function r2(t6){var e4=typeof Map=="function"?new Map:void 0;return r2=function(t7){if(t7===null||!(function(t8){try{return Function.toString.call(t8).indexOf("[native code]")!==-1}catch{return typeof t8=="function"}})(t7))return t7;if(typeof t7!="function")throw new TypeError("Super expression must either be null or a function");if(e4!==void 0){if(e4.has(t7))return e4.get(t7);e4.set(t7,s4)}function s4(){return(function(t8,e5,s5){if(a())return Reflect.construct.apply(null,arguments);var n3=[null];n3.push.apply(n3,e5);var o3=new(t8.bind.apply(t8,n3));return s5&&i(o3,s5.prototype),o3})(t7,arguments,o(this).constructor)}return s4.prototype=Object.create(t7.prototype,{constructor:{value:s4,enumerable:!1,writable:!0,configurable:!0}}),i(s4,t7)},r2(t6)}var h={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 }).
|
|
361
361
|
|
|
@@ -606,7 +606,7 @@ ${spiceString}`)}catch(error){debug10(`Failed to convert circuit JSON to SPICE:
|
|
|
606
606
|
${Object.keys(fsMapOrAllFilePaths).join(", ")}`);return resolvedFilePath};var stripComments=code=>{let out="",i3=0,inSingle=!1,inDouble=!1,inTemplate=!1;for(;i3<code.length;){let ch2=code[i3],next2=code[i3+1];if(!inDouble&&!inTemplate&&ch2==="'"&&code[i3-1]!=="\\"){inSingle=!inSingle,out+=ch2,i3++;continue}if(!inSingle&&!inTemplate&&ch2==='"'&&code[i3-1]!=="\\"){inDouble=!inDouble,out+=ch2,i3++;continue}if(!inSingle&&!inDouble&&ch2==="`"&&code[i3-1]!=="\\"){inTemplate=!inTemplate,out+=ch2,i3++;continue}if(!inSingle&&!inDouble&&!inTemplate){if(ch2==="/"&&next2==="/"){for(out+=" ",i3+=2;i3<code.length&&code[i3]!==`
|
|
607
607
|
`;)out+=" ",i3++;continue}if(ch2==="/"&&next2==="*"){for(out+=" ",i3+=2;i3<code.length;){if(code[i3]===`
|
|
608
608
|
`?out+=`
|
|
609
|
-
`:out+=" ",code[i3]==="*"&&code[i3+1]==="/"){out+=" ",i3+=2;break}i3++}continue}}out+=ch2,i3++}return out};var getImportsFromCode=code=>{let strippedCode=stripComments(code),importRegex=/(?:^|;)\s*import\s*(?:(?:[\w]+\s*,\s*)?(?:\*\s+as\s+[\w]+|\{[^}]+\}|[\w]+)\s*from\s*)?['"]([^'"]+)['"]/gm,imports=[],match2;for(;(match2=importRegex.exec(strippedCode))!==null;){let fullMatch=match2[0];/\bimport\s+type\b/.test(fullMatch)||imports.push(match2[1])}let reExportRegex=/^\s*export\s+(?:type\s+)?(?:\*\s+as\s+[\w$]+|\*|\{[^}]+\})\s+from\s*['"](.+?)['"]/gm,reExportMatch;for(;(reExportMatch=reExportRegex.exec(strippedCode))!==null;){let fullMatch=reExportMatch[0];/^\s*export\s+type\b/.test(fullMatch)||imports.push(reExportMatch[1])}let requireRegex=/\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g,requireMatch=requireRegex.exec(strippedCode);for(;requireMatch!==null;)imports.push(requireMatch[1]),requireMatch=requireRegex.exec(strippedCode);return imports};function createContext(modulePath,fsMap,basePath){return{fsMap,extensions:[".js",".jsx",".ts",".tsx",".json"],basePath,modulePath}}function findPackageJson(nodeModulesPath,ctx){let packageJsonPath=`${nodeModulesPath}/package.json`;if(!ctx.fsMap[packageJsonPath])return null;try{return JSON.parse(ctx.fsMap[packageJsonPath])}catch{return null}}function tryResolveWithExtensions(path,ctx){if(ctx.fsMap[path])return path;for(let ext of ctx.extensions){let pathWithExt=path.replace(/\.js$|\.jsx$/,"")+ext;if(ctx.fsMap[pathWithExt])return pathWithExt}return null}function resolveExportPath(nodeModulesPath,exportPath,ctx){let fullExportPath=`${nodeModulesPath}/${exportPath.replace(/^\.\//,"")}`;return tryResolveWithExtensions(fullExportPath,ctx)}function resolveConditionalExport(exportValue){if(typeof exportValue=="string")return exportValue;let conditions=["import","default","require","node","browser"];for(let condition of conditions)if(exportValue[condition]){let conditionValue=exportValue[condition];if(typeof conditionValue=="string")return conditionValue;let resolved=resolveConditionalExport(conditionValue);if(resolved)return resolved}return null}function resolvePackageExports(nodeModulesPath,packageJson,remainingPath,ctx){if(!packageJson.exports)return null;let defaultExport=packageJson.exports["."];if(remainingPath===""&&defaultExport){let exportPath=resolveConditionalExport(defaultExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}let subpathExport=remainingPath?packageJson.exports[`./${remainingPath}`]:null;if(subpathExport){let exportPath=resolveConditionalExport(subpathExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}let importExport=packageJson.exports.import;if(remainingPath===""&&importExport!==void 0){let exportPath=resolveConditionalExport(importExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}return null}function resolvePackageEntryPoint(nodeModulesPath,packageJson,ctx){let entryPoint=packageJson.module||packageJson.main||"index.js",fullPath=`${nodeModulesPath}/${entryPoint}`;return tryResolveWithExtensions(fullPath,ctx)}function resolveRemainingPath(nodeModulesPath,remainingPath,ctx){if(!remainingPath){for(let ext of ctx.extensions){let indexPath=`${nodeModulesPath}/index${ext}`;if(ctx.fsMap[indexPath])return indexPath}return null}let fullPath=`${nodeModulesPath}/${remainingPath}`,directMatch=tryResolveWithExtensions(fullPath,ctx);if(directMatch)return directMatch;for(let ext of ctx.extensions){let indexPath=`${fullPath}/index${ext}`;if(ctx.fsMap[indexPath])return indexPath}return null}function resolveNodeModuleInPath(searchPath,ctx){let moduleParts=ctx.modulePath.split("/"),scope=moduleParts[0].startsWith("@")?moduleParts.slice(0,2).join("/"):moduleParts[0],remainingPath=moduleParts.slice(scope.includes("/")?2:1).join("/"),nodeModulesPath=`${searchPath==="."?"":`${searchPath}/`}node_modules/${scope}`,packageJson=findPackageJson(nodeModulesPath,ctx);if(packageJson){let exportsResolution=resolvePackageExports(nodeModulesPath,packageJson,remainingPath,ctx);if(exportsResolution)return exportsResolution;let entryPointResolution=resolvePackageEntryPoint(nodeModulesPath,packageJson,ctx);if(entryPointResolution)return entryPointResolution}let remainingPathResolution=resolveRemainingPath(nodeModulesPath,remainingPath,ctx);if(remainingPathResolution)return remainingPathResolution;let parentPath=dirname(searchPath);return parentPath&&parentPath!==searchPath?resolveNodeModuleInPath(parentPath,ctx):null}function resolveNodeModule(modulePath,fsMap,basePath){let ctx=createContext(modulePath,fsMap,basePath);return resolveNodeModuleInPath(ctx.basePath,ctx)}function evalCompiledJs(compiledCode,preSuppliedImports,cwd){globalThis.__tscircuit_require=name=>{let resolvedFilePath=resolveFilePath(name,preSuppliedImports,cwd);!resolvedFilePath&&!name.startsWith(".")&&!name.startsWith("/")&&(resolvedFilePath=resolveNodeModule(name,preSuppliedImports,cwd||""));let hasResolvedFilePath=resolvedFilePath&&preSuppliedImports[resolvedFilePath];if(!preSuppliedImports[name]&&!hasResolvedFilePath)throw new Error(`Import "${name}" not found ${cwd?`in "${cwd}"`:""}`);let mod=preSuppliedImports[name]||preSuppliedImports[resolvedFilePath];return new Proxy(mod,{get(target,prop){if(!(prop in target)){if(prop==="default")return target.default!==void 0?target.default:target.__esModule?void 0:typeof target=="function"||typeof target=="object"?target:void 0;if(prop==="__esModule")return!0;throw new Error(`Component "${String(prop)}" is not exported by "${name}"`)}return target[prop]}})};let functionBody=`
|
|
609
|
+
`:out+=" ",code[i3]==="*"&&code[i3+1]==="/"){out+=" ",i3+=2;break}i3++}continue}}out+=ch2,i3++}return out};var getImportsFromCode=code=>{let strippedCode=stripComments(code),importRegex=/(?:^|;)\s*import\s*(?:(?:[\w]+\s*,\s*)?(?:\*\s+as\s+[\w]+|\{[^}]+\}|[\w]+)\s*from\s*)?['"]([^'"]+)['"]/gm,imports=[],match2;for(;(match2=importRegex.exec(strippedCode))!==null;){let fullMatch=match2[0];/\bimport\s+type\b/.test(fullMatch)||imports.push(match2[1])}let reExportRegex=/^\s*export\s+(?:type\s+)?(?:\*\s+as\s+[\w$]+|\*|\{[^}]+\})\s+from\s*['"](.+?)['"]/gm,reExportMatch;for(;(reExportMatch=reExportRegex.exec(strippedCode))!==null;){let fullMatch=reExportMatch[0];/^\s*export\s+type\b/.test(fullMatch)||imports.push(reExportMatch[1])}let requireRegex=/\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g,requireMatch=requireRegex.exec(strippedCode);for(;requireMatch!==null;)imports.push(requireMatch[1]),requireMatch=requireRegex.exec(strippedCode);return imports};function createContext(modulePath,fsMap,basePath){return{fsMap,extensions:[".js",".jsx",".ts",".tsx",".json"],basePath,modulePath}}function findPackageJson(nodeModulesPath,ctx){let packageJsonPath=`${nodeModulesPath}/package.json`;if(!ctx.fsMap[packageJsonPath])return null;try{return JSON.parse(ctx.fsMap[packageJsonPath])}catch{return null}}function tryResolveWithExtensions(path,ctx){if(ctx.fsMap[path])return path;for(let ext of ctx.extensions){let pathWithExt=path.replace(/\.js$|\.jsx$/,"")+ext;if(ctx.fsMap[pathWithExt])return pathWithExt}return null}function resolveExportPath(nodeModulesPath,exportPath,ctx){let fullExportPath=`${nodeModulesPath}/${exportPath.replace(/^\.\//,"")}`;return tryResolveWithExtensions(fullExportPath,ctx)}function resolveConditionalExport(exportValue){if(typeof exportValue=="string")return exportValue;let conditions=["import","default","require","node","browser"];for(let condition of conditions)if(exportValue[condition]){let conditionValue=exportValue[condition];if(typeof conditionValue=="string")return conditionValue;let resolved=resolveConditionalExport(conditionValue);if(resolved)return resolved}return null}function resolvePackageExports(nodeModulesPath,packageJson,remainingPath,ctx){if(!packageJson.exports)return null;let defaultExport=packageJson.exports["."];if(remainingPath===""&&defaultExport){let exportPath=resolveConditionalExport(defaultExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}let subpathExport=remainingPath?packageJson.exports[`./${remainingPath}`]:null;if(subpathExport){let exportPath=resolveConditionalExport(subpathExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}let importExport=packageJson.exports.import;if(remainingPath===""&&importExport!==void 0){let exportPath=resolveConditionalExport(importExport);if(exportPath){let resolved=resolveExportPath(nodeModulesPath,exportPath,ctx);if(resolved)return resolved}}return null}function resolvePackageEntryPoint(nodeModulesPath,packageJson,ctx){let entryPoint=packageJson.module||packageJson.main||"index.js",fullPath=`${nodeModulesPath}/${entryPoint}`;return tryResolveWithExtensions(fullPath,ctx)}function resolveRemainingPath(nodeModulesPath,remainingPath,ctx){if(!remainingPath){for(let ext of ctx.extensions){let indexPath=`${nodeModulesPath}/index${ext}`;if(ctx.fsMap[indexPath])return indexPath}return null}let fullPath=`${nodeModulesPath}/${remainingPath}`,directMatch=tryResolveWithExtensions(fullPath,ctx);if(directMatch)return directMatch;for(let ext of ctx.extensions){let indexPath=`${fullPath}/index${ext}`;if(ctx.fsMap[indexPath])return indexPath}return null}function resolveNodeModuleInPath(searchPath,ctx){let moduleParts=ctx.modulePath.split("/"),scope=moduleParts[0].startsWith("@")?moduleParts.slice(0,2).join("/"):moduleParts[0],remainingPath=moduleParts.slice(scope.includes("/")?2:1).join("/"),nodeModulesPath=`${searchPath==="."?"":`${searchPath}/`}node_modules/${scope}`,packageJson=findPackageJson(nodeModulesPath,ctx);if(packageJson){let exportsResolution=resolvePackageExports(nodeModulesPath,packageJson,remainingPath,ctx);if(exportsResolution)return exportsResolution;let entryPointResolution=resolvePackageEntryPoint(nodeModulesPath,packageJson,ctx);if(entryPointResolution)return entryPointResolution}let remainingPathResolution=resolveRemainingPath(nodeModulesPath,remainingPath,ctx);if(remainingPathResolution)return remainingPathResolution;let parentPath=dirname(searchPath);return parentPath&&parentPath!==searchPath?resolveNodeModuleInPath(parentPath,ctx):null}function resolveNodeModule(modulePath,fsMap,basePath){let ctx=createContext(modulePath,fsMap,basePath);return resolveNodeModuleInPath(ctx.basePath,ctx)}function evalCompiledJs(compiledCode,preSuppliedImports,cwd){globalThis.__tscircuit_require=name=>{let resolvedFilePath=resolveFilePath(name,preSuppliedImports,cwd);!resolvedFilePath&&!name.startsWith(".")&&!name.startsWith("/")&&(resolvedFilePath=resolveNodeModule(name,preSuppliedImports,cwd||""));let hasResolvedFilePath=resolvedFilePath&&preSuppliedImports[resolvedFilePath];if(!preSuppliedImports[name]&&!hasResolvedFilePath)throw new Error(`Import "${name}" not found ${cwd?`in "${cwd}"`:""}`);let mod=preSuppliedImports[name]||preSuppliedImports[resolvedFilePath];if(mod.default&&typeof mod.default=="function"){let callableWrapper=(...args)=>mod.default(...args);return Object.assign(callableWrapper,mod),callableWrapper.__esModule=!0,callableWrapper}return new Proxy(mod,{get(target,prop){if(!(prop in target)){if(prop==="default")return target.default!==void 0?target.default:target.__esModule?void 0:typeof target=="function"||typeof target=="object"?target:void 0;if(prop==="__esModule")return!0;throw new Error(`Component "${String(prop)}" is not exported by "${name}"`)}return target[prop]}})};let functionBody=`
|
|
610
610
|
var exports = {};
|
|
611
611
|
var require = globalThis.__tscircuit_require;
|
|
612
612
|
var module = { exports };
|
|
@@ -805,7 +805,7 @@ ${namesToRegister.map(({variableName,uniqueLocalName})=>` reactHotLoader.regist
|
|
|
805
805
|
`)}},__publicField(_a344,"token","layer"),__publicField(_a344,"parentToken","stackup"),_a344);SxClass.register(StackupLayer);var _a345,Stackup=(_a345=class extends SxClass{constructor(opts={}){super();__publicField(this,"token","stackup");__publicField(this,"_layers",[]);__publicField(this,"_sxCopperFinish");__publicField(this,"_sxDielectricConstraints");__publicField(this,"_sxEdgeConnector");__publicField(this,"_sxCastellatedPads");__publicField(this,"_sxEdgePlating");this.layers=opts.layers??[],this._sxCopperFinish=opts.copperFinish,this._sxDielectricConstraints=opts.dielectricConstraints,this._sxEdgeConnector=opts.edgeConnector,this._sxCastellatedPads=opts.castellatedPads,this._sxEdgePlating=opts.edgePlating}static fromSexprPrimitives(primitiveSexprs){let{propertyMap,arrayPropertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);return new _a345({layers:arrayPropertyMap.layer??[],copperFinish:propertyMap.copper_finish,dielectricConstraints:propertyMap.dielectric_constraints,edgeConnector:propertyMap.edge_connector,castellatedPads:propertyMap.castellated_pads,edgePlating:propertyMap.edge_plating})}get layers(){return[...this._layers]}set layers(layers){this._layers=layers.map(layer=>{if(!(layer instanceof StackupLayer))throw new Error("Stackup layers must be StackupLayer instances");return layer})}get copperFinish(){return this._sxCopperFinish?.value}set copperFinish(value){this._sxCopperFinish=value?new StackupCopperFinish(value):void 0}get dielectricConstraints(){return this._sxDielectricConstraints?.value}set dielectricConstraints(value){this._sxDielectricConstraints=value?new StackupDielectricConstraints(value):void 0}get edgeConnector(){return this._sxEdgeConnector?.value}set edgeConnector(value){this._sxEdgeConnector=value?new StackupEdgeConnector(value):void 0}get castellatedPads(){return this._sxCastellatedPads?.value}set castellatedPads(value){this._sxCastellatedPads=value?new StackupCastellatedPads(value):void 0}get edgePlating(){return this._sxEdgePlating?.value}set edgePlating(value){this._sxEdgePlating=value?new StackupEdgePlating(value):void 0}getChildren(){let children=[...this._layers],optionalChildren=[this._sxCopperFinish,this._sxDielectricConstraints,this._sxEdgeConnector,this._sxCastellatedPads,this._sxEdgePlating];for(let child of optionalChildren)child&&children.push(child);return children}},__publicField(_a345,"token","stackup"),__publicField(_a345,"parentToken","setup"),_a345);SxClass.register(Stackup);var TOKEN_TO_KEY2={stackup:"stackup",pcbplotparams:"pcbPlotParams",pad_to_mask_clearance:"padToMaskClearance",solder_mask_min_width:"solderMaskMinWidth",pad_to_paste_clearance:"padToPasteClearance",pad_to_paste_clearance_ratio:"padToPasteClearanceRatio",last_trace_width:"lastTraceWidth",trace_clearance:"traceClearance",zone_clearance:"zoneClearance",zone_45_only:"zone45Only",trace_min:"traceMin",segment_width:"segmentWidth",edge_width:"edgeWidth",via_size:"viaSize",via_drill:"viaDrill",via_min_size:"viaMinSize",via_min_drill:"viaMinDrill",uvias_allowed:"uviasAllowed",uvia_size:"uviaSize",uvia_drill:"uviaDrill",uvia_min_size:"uviaMinSize",uvia_min_drill:"uviaMinDrill",pcb_text_width:"pcbTextWidth",pcb_text_size:"pcbTextSize",mod_edge_width:"modEdgeWidth",mod_text_size:"modTextSize",mod_text_width:"modTextWidth",pad_size:"padSize",pad_drill:"padDrill",allow_soldermask_bridges_in_footprints:"allowSoldermaskBridgesInFootprints",tenting:"tenting",aux_axis_origin:"auxAxisOrigin",grid_origin:"gridOrigin",visible_elements:"visibleElements",pad_to_paste_clearance_values:"padToPasteClearanceValues",trace_width:"traceWidth"},SETUP_CHILD_ORDER=["stackup","padToMaskClearance","solderMaskMinWidth","padToPasteClearance","padToPasteClearanceRatio","lastTraceWidth","traceClearance","zoneClearance","zone45Only","traceMin","segmentWidth","edgeWidth","viaSize","viaDrill","viaMinSize","viaMinDrill","uviaSize","uviaDrill","uviasAllowed","uviaMinSize","uviaMinDrill","pcbTextWidth","pcbTextSize","modEdgeWidth","modTextSize","modTextWidth","padSize","padDrill","allowSoldermaskBridgesInFootprints","tenting","auxAxisOrigin","gridOrigin","visibleElements","padToPasteClearanceValues","traceWidth","pcbPlotParams"],_a346,Setup=(_a346=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","setup");__publicField(this,"_properties",{})}static fromSexprPrimitives(primitiveSexprs){let setup=new _a346,{propertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);for(let[token,instance]of Object.entries(propertyMap)){let key=TOKEN_TO_KEY2[token];if(!key)throw new Error(`Unsupported setup property token: ${token}`);setup._properties[key]=instance}return setup}getChildren(){let children=[];for(let key of SETUP_CHILD_ORDER){let child=this._properties[key];child&&children.push(child)}return children}setProperty(key,instance){if(instance){this._properties[key]=instance;return}delete this._properties[key]}setNumberProperty(key,value,ClassRef){if(value===void 0){delete this._properties[key];return}this._properties[key]=new ClassRef(value)}getPropertyInstance(key,ClassRef){let value=this._properties[key];return value instanceof ClassRef?value:void 0}get stackup(){return this.getPropertyInstance("stackup",Stackup)}set stackup(value){if(value!==void 0&&!(value instanceof Stackup))throw new Error("stackup must be a Stackup instance");this.setProperty("stackup",value)}get pcbPlotParams(){return this.getPropertyInstance("pcbPlotParams",PcbPlotParams)}set pcbPlotParams(value){if(value!==void 0&&!(value instanceof PcbPlotParams))throw new Error("pcbPlotParams must be a PcbPlotParams instance");this.setProperty("pcbPlotParams",value)}get padToMaskClearance(){return this.getPropertyInstance("padToMaskClearance",SetupPadToMaskClearance)?.value}set padToMaskClearance(value){this.setNumberProperty("padToMaskClearance",value,SetupPadToMaskClearance)}get solderMaskMinWidth(){return this.getPropertyInstance("solderMaskMinWidth",SetupSolderMaskMinWidth)?.value}set solderMaskMinWidth(value){this.setNumberProperty("solderMaskMinWidth",value,SetupSolderMaskMinWidth)}get padToPasteClearance(){return this.getPropertyInstance("padToPasteClearance",SetupPadToPasteClearance)?.value}set padToPasteClearance(value){this.setNumberProperty("padToPasteClearance",value,SetupPadToPasteClearance)}get padToPasteClearanceRatio(){return this.getPropertyInstance("padToPasteClearanceRatio",SetupPadToPasteClearanceRatio)?.value}set padToPasteClearanceRatio(value){this.setNumberProperty("padToPasteClearanceRatio",value,SetupPadToPasteClearanceRatio)}get lastTraceWidth(){return this.getPropertyInstance("lastTraceWidth",SetupLastTraceWidth)?.value}set lastTraceWidth(value){this.setNumberProperty("lastTraceWidth",value,SetupLastTraceWidth)}get traceClearance(){return this.getPropertyInstance("traceClearance",SetupTraceClearance)?.value}set traceClearance(value){this.setNumberProperty("traceClearance",value,SetupTraceClearance)}get zoneClearance(){return this.getPropertyInstance("zoneClearance",SetupZoneClearance)?.value}set zoneClearance(value){this.setNumberProperty("zoneClearance",value,SetupZoneClearance)}get zone45Only(){return this.getPropertyInstance("zone45Only",SetupZone45Only)?.value}set zone45Only(value){this.setProperty("zone45Only",value===void 0?void 0:new SetupZone45Only(value))}get traceMin(){return this.getPropertyInstance("traceMin",SetupTraceMin)?.value}set traceMin(value){this.setNumberProperty("traceMin",value,SetupTraceMin)}get segmentWidth(){return this.getPropertyInstance("segmentWidth",SetupSegmentWidth)?.value}set segmentWidth(value){this.setNumberProperty("segmentWidth",value,SetupSegmentWidth)}get edgeWidth(){return this.getPropertyInstance("edgeWidth",SetupEdgeWidth)?.value}set edgeWidth(value){this.setNumberProperty("edgeWidth",value,SetupEdgeWidth)}get viaSize(){return this.getPropertyInstance("viaSize",SetupViaSize)?.value}set viaSize(value){this.setNumberProperty("viaSize",value,SetupViaSize)}get viaDrill(){return this.getPropertyInstance("viaDrill",SetupViaDrill)?.value}set viaDrill(value){this.setNumberProperty("viaDrill",value,SetupViaDrill)}get viaMinSize(){return this.getPropertyInstance("viaMinSize",SetupViaMinSize)?.value}set viaMinSize(value){this.setNumberProperty("viaMinSize",value,SetupViaMinSize)}get viaMinDrill(){return this.getPropertyInstance("viaMinDrill",SetupViaMinDrill)?.value}set viaMinDrill(value){this.setNumberProperty("viaMinDrill",value,SetupViaMinDrill)}get uviasAllowed(){return this.getPropertyInstance("uviasAllowed",SetupUviasAllowed)?.value}set uviasAllowed(value){this.setProperty("uviasAllowed",value===void 0?void 0:new SetupUviasAllowed(value))}get uviaSize(){return this.getPropertyInstance("uviaSize",SetupUviaSize)?.value}set uviaSize(value){this.setNumberProperty("uviaSize",value,SetupUviaSize)}get uviaDrill(){return this.getPropertyInstance("uviaDrill",SetupUviaDrill)?.value}set uviaDrill(value){this.setNumberProperty("uviaDrill",value,SetupUviaDrill)}get uviaMinSize(){return this.getPropertyInstance("uviaMinSize",SetupUviaMinSize)?.value}set uviaMinSize(value){this.setNumberProperty("uviaMinSize",value,SetupUviaMinSize)}get uviaMinDrill(){return this.getPropertyInstance("uviaMinDrill",SetupUviaMinDrill)?.value}set uviaMinDrill(value){this.setNumberProperty("uviaMinDrill",value,SetupUviaMinDrill)}get pcbTextWidth(){return this.getPropertyInstance("pcbTextWidth",SetupPcbTextWidth)?.value}set pcbTextWidth(value){this.setNumberProperty("pcbTextWidth",value,SetupPcbTextWidth)}get pcbTextSize(){return this.getPropertyInstance("pcbTextSize",SetupPcbTextSize)?.values}set pcbTextSize(values){if(values===void 0){delete this._properties.pcbTextSize;return}this.setProperty("pcbTextSize",new SetupPcbTextSize(values))}get modEdgeWidth(){return this.getPropertyInstance("modEdgeWidth",SetupModEdgeWidth)?.value}set modEdgeWidth(value){this.setNumberProperty("modEdgeWidth",value,SetupModEdgeWidth)}get modTextSize(){return this.getPropertyInstance("modTextSize",SetupModTextSize)?.values}set modTextSize(values){if(values===void 0){delete this._properties.modTextSize;return}this.setProperty("modTextSize",new SetupModTextSize(values))}get modTextWidth(){return this.getPropertyInstance("modTextWidth",SetupModTextWidth)?.value}set modTextWidth(value){this.setNumberProperty("modTextWidth",value,SetupModTextWidth)}get padSize(){return this.getPropertyInstance("padSize",SetupPadSize)?.values}set padSize(values){if(values===void 0){delete this._properties.padSize;return}this.setProperty("padSize",new SetupPadSize(values))}get padDrill(){return this.getPropertyInstance("padDrill",SetupPadDrill)?.value}set padDrill(value){this.setNumberProperty("padDrill",value,SetupPadDrill)}get allowSoldermaskBridgesInFootprints(){return this.getPropertyInstance("allowSoldermaskBridgesInFootprints",SetupAllowSoldermaskBridgesInFootprints)?.value}set allowSoldermaskBridgesInFootprints(value){this.setProperty("allowSoldermaskBridgesInFootprints",value===void 0?void 0:new SetupAllowSoldermaskBridgesInFootprints(value))}get tenting(){return this.getPropertyInstance("tenting",SetupTenting)?.sides}set tenting(sides){if(sides===void 0){delete this._properties.tenting;return}this.setProperty("tenting",new SetupTenting(sides))}get auxAxisOrigin(){let origin=this.getPropertyInstance("auxAxisOrigin",SetupAuxAxisOrigin);if(origin)return{x:origin.x,y:origin.y}}set auxAxisOrigin(origin){if(!origin){delete this._properties.auxAxisOrigin;return}this.setProperty("auxAxisOrigin",new SetupAuxAxisOrigin(origin.x,origin.y))}get gridOrigin(){let origin=this.getPropertyInstance("gridOrigin",SetupGridOrigin);if(origin)return{x:origin.x,y:origin.y}}set gridOrigin(origin){if(!origin){delete this._properties.gridOrigin;return}this.setProperty("gridOrigin",new SetupGridOrigin(origin.x,origin.y))}get visibleElements(){return this.getPropertyInstance("visibleElements",SetupVisibleElements)?.value}set visibleElements(value){this.setProperty("visibleElements",value===void 0?void 0:new SetupVisibleElements(value))}get padToPasteClearanceValues(){return this.getPropertyInstance("padToPasteClearanceValues",SetupPadToPasteClearanceValues)?.values}set padToPasteClearanceValues(values){if(values===void 0){delete this._properties.padToPasteClearanceValues;return}this.setProperty("padToPasteClearanceValues",new SetupPadToPasteClearanceValues(values))}get traceWidth(){return this.getPropertyInstance("traceWidth",SetupTraceWidth)?.values}set traceWidth(values){if(values===void 0){delete this._properties.traceWidth;return}this.setProperty("traceWidth",new SetupTraceWidth(values))}},__publicField(_a346,"token","setup"),_a346);SxClass.register(Setup);var _a347,PcbGeneralThickness=(_a347=class extends SxPrimitiveNumber{constructor(){super(...arguments);__publicField(this,"token","thickness")}},__publicField(_a347,"token","thickness"),__publicField(_a347,"parentToken","general"),_a347);SxClass.register(PcbGeneralThickness);var _a348,PcbGeneralLegacyTeardrops=(_a348=class extends SxClass{constructor(enabled){super();__publicField(this,"token","legacy_teardrops");__publicField(this,"_enabled");this._enabled=enabled}static fromSexprPrimitives(primitiveSexprs){let value=toStringValue(primitiveSexprs[0]);if(value===void 0)throw new Error("legacy_teardrops expects a string value");let enabled=/^(yes|true)$/iu.test(value);return new _a348(enabled)}get enabled(){return this._enabled}set enabled(value){this._enabled=value}getChildren(){return[]}getString(){return`(legacy_teardrops ${this._enabled?"yes":"no"})`}},__publicField(_a348,"token","legacy_teardrops"),__publicField(_a348,"parentToken","general"),_a348);SxClass.register(PcbGeneralLegacyTeardrops);var SINGLE_TOKENS3=new Set(["thickness","legacy_teardrops"]),_a349,PcbGeneral=(_a349=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","general");__publicField(this,"_sxThickness");__publicField(this,"_sxLegacyTeardrops")}static fromSexprPrimitives(primitiveSexprs){let general=new _a349,{propertyMap,arrayPropertyMap}=SxClass.parsePrimitivesToClassProperties(primitiveSexprs,this.token);for(let token of Object.keys(propertyMap))if(!SINGLE_TOKENS3.has(token))throw new Error(`general encountered unsupported child token "${token}"`);for(let[token,entries]of Object.entries(arrayPropertyMap)){if(!SINGLE_TOKENS3.has(token))throw new Error(`general encountered unsupported child token "${token}"`);if(entries.length>1)throw new Error(`general encountered repeated child token "${token}"`)}return general._sxThickness=arrayPropertyMap.thickness?.[0]??propertyMap.thickness,general._sxLegacyTeardrops=arrayPropertyMap.legacy_teardrops?.[0]??propertyMap.legacy_teardrops,general}get thickness(){return this._sxThickness?.value}set thickness(value){this._sxThickness=value===void 0?void 0:new PcbGeneralThickness(value)}get legacyTeardrops(){return this._sxLegacyTeardrops?.enabled}set legacyTeardrops(value){if(value===void 0){this._sxLegacyTeardrops=void 0;return}this._sxLegacyTeardrops=new PcbGeneralLegacyTeardrops(value)}getChildren(){let children=[];return this._sxThickness&&children.push(this._sxThickness),this._sxLegacyTeardrops&&children.push(this._sxLegacyTeardrops),children}},__publicField(_a349,"token","general"),__publicField(_a349,"parentToken","kicad_pcb"),_a349);SxClass.register(PcbGeneral);var _a350,PcbLayerDefinition=(_a350=class extends SxClass{constructor(options){super();__publicField(this,"token","__pcb_layer_definition__");__publicField(this,"_index");__publicField(this,"_name");__publicField(this,"_type");__publicField(this,"_userName");this._index=options.index,this._name=options.name,this._type=options.type,this._userName=options.userName}static fromPrimitive(primitive){if(!Array.isArray(primitive)||primitive.length<3)throw new Error(`layers entry must be an array with at least index, name, and type: ${JSON.stringify(primitive)}`);let[rawIndex,rawName,rawType,rawUser]=primitive,index=toNumberValue(rawIndex),name=toStringValue(rawName),type=toStringValue(rawType),userName=rawUser===void 0?void 0:toStringValue(rawUser);if(index===void 0||name===void 0||type===void 0)throw new Error(`layers entry is missing required values: ${JSON.stringify(primitive)}`);return new _a350({index,name,type,userName})}get index(){return this._index}set index(value){this._index=value}get name(){return this._name}set name(value){this._name=value}get type(){return this._type}set type(value){this._type=value}get userName(){return this._userName}set userName(value){this._userName=value}getChildren(){return[]}getString(){if(this._index===void 0||this._name===void 0||this._type===void 0)return"()";let tokens=[String(this._index),quoteSExprString(this._name),this._type];return this._userName!==void 0&&tokens.push(quoteSExprString(this._userName)),`(${tokens.join(" ")})`}},__publicField(_a350,"token","__pcb_layer_definition__"),__publicField(_a350,"parentToken","layers"),_a350);SxClass.register(PcbLayerDefinition);var _a351,PcbLayers=(_a351=class extends SxClass{constructor(){super(...arguments);__publicField(this,"token","layers");__publicField(this,"_definitions",[])}static fromSexprPrimitives(primitiveSexprs){let layers=new _a351;return layers._definitions=primitiveSexprs.map(primitive=>PcbLayerDefinition.fromPrimitive(primitive)),layers}get definitions(){return[...this._definitions]}set definitions(value){this._definitions=[...value]}getChildren(){return[...this._definitions]}},__publicField(_a351,"token","layers"),__publicField(_a351,"parentToken","kicad_pcb"),_a351);SxClass.register(PcbLayers);var _a352,PcbNet=(_a352=class extends SxClass{constructor(id,name){super();__publicField(this,"token","net");__publicField(this,"_id");__publicField(this,"_name");this._id=id,this._name=name}static fromSexprPrimitives(primitiveSexprs){let id=toNumberValue(primitiveSexprs[0]),name=toStringValue(primitiveSexprs[1]);if(id===void 0||name===void 0)throw new Error("net requires numeric id and string name");return new _a352(id,name)}get id(){return this._id}set id(value){this._id=value}get name(){return this._name}set name(value){this._name=value}getChildren(){return[]}getString(){return`(net ${this._id} ${quoteSExprString(this._name)})`}},__publicField(_a352,"token","net"),__publicField(_a352,"parentToken","kicad_pcb"),_a352);SxClass.register(PcbNet);var _a353,PcbVersion=(_a353=class extends SxPrimitiveNumber{constructor(){super(...arguments);__publicField(this,"token","version")}},__publicField(_a353,"token","version"),__publicField(_a353,"parentToken","kicad_pcb"),_a353);SxClass.register(PcbVersion);var isSymbol=value=>/^[A-Za-z0-9._-]+$/.test(value),_a354,PcbGenerator=(_a354=class extends SxPrimitiveString{constructor(){super(...arguments);__publicField(this,"token","generator")}getString(){return`(generator ${isSymbol(this.value)?this.value:quoteSExprString(this.value)})`}},__publicField(_a354,"token","generator"),__publicField(_a354,"parentToken","kicad_pcb"),_a354);SxClass.register(PcbGenerator);var isSymbol2=value=>/^[A-Za-z0-9._-]+$/.test(value),_a355,PcbGeneratorVersion=(_a355=class extends SxPrimitiveString{constructor(){super(...arguments);__publicField(this,"token","generator_version")}getString(){return`(generator_version ${isSymbol2(this.value)?this.value:quoteSExprString(this.value)})`}},__publicField(_a355,"token","generator_version"),__publicField(_a355,"parentToken","kicad_pcb"),_a355);SxClass.register(PcbGeneratorVersion);var _a356,ViaNet=(_a356=class extends SxClass{constructor(id,name){super();__publicField(this,"token","net");__publicField(this,"_id");__publicField(this,"_name");this._id=id,this._name=name}static fromSexprPrimitives(primitiveSexprs){let id=toNumberValue(primitiveSexprs[0]);if(id===void 0)throw new Error("via net requires a numeric id");let name=primitiveSexprs.length>1?toStringValue(primitiveSexprs[1]):void 0;return new _a356(id,name)}get id(){return this._id}set id(value){this._id=value}get name(){return this._name}set name(value){this._name=value}getChildren(){return[]}getString(){return this._name!==void 0?`(net ${this._id} ${quoteSExprString(this._name)})`:`(net ${this._id})`}},__publicField(_a356,"token","net"),__publicField(_a356,"parentToken","via"),_a356);SxClass.register(ViaNet);var BARE_FLAGS=new Set(["locked","free","remove_unused_layers","keep_end_layers"]),_a357,Via2=(_a357=class extends SxClass{constructor(params={}){super();__publicField(this,"token","via");__publicField(this,"_type");__publicField(this,"_locked",!1);__publicField(this,"_free",!1);__publicField(this,"_removeUnusedLayers",!1);__publicField(this,"_keepEndLayers",!1);__publicField(this,"_sxAt");__publicField(this,"_size");__publicField(this,"_drill");__publicField(this,"_sxLayers");__publicField(this,"_sxNet");__publicField(this,"_sxUuid");__publicField(this,"_sxTstamp");__publicField(this,"_sxTeardrops");params.type!==void 0&&(this.type=params.type),params.locked!==void 0&&(this.locked=params.locked),params.free!==void 0&&(this.free=params.free),params.removeUnusedLayers!==void 0&&(this.removeUnusedLayers=params.removeUnusedLayers),params.keepEndLayers!==void 0&&(this.keepEndLayers=params.keepEndLayers),params.at!==void 0&&(this.at=params.at),params.size!==void 0&&(this.size=params.size),params.drill!==void 0&&(this.drill=params.drill),params.layers!==void 0&&(this.layers=params.layers),params.net!==void 0&&(this.net=params.net),params.uuid!==void 0&&(this.uuid=params.uuid),params.tstamp!==void 0&&(this.tstamp=params.tstamp),params.teardrops!==void 0&&(this.teardrops=params.teardrops)}static fromSexprPrimitives(primitiveSexprs){let via=new _a357;for(let primitive of primitiveSexprs){if(typeof primitive=="string"){via.consumeBareToken(primitive);continue}if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`via encountered unsupported primitive child: ${JSON.stringify(primitive)}`);let[token,...rest]=primitive;if(typeof token!="string")throw new Error(`via encountered child with non-string token: ${JSON.stringify(primitive)}`);via.consumeNode(token,rest)}return via}consumeBareToken(token){if(token==="blind"||token==="micro"){this._type=token;return}if(!BARE_FLAGS.has(token))throw new Error(`via encountered unsupported flag "${token}"`);switch(token){case"locked":this._locked=!0;break;case"free":this._free=!0;break;case"remove_unused_layers":this._removeUnusedLayers=!0;break;case"keep_end_layers":this._keepEndLayers=!0;break}}consumeNode(token,args){switch(token){case"type":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via type expects a string value");this._type=value;return}case"locked":this._locked=this.parseYesNo(args);return;case"free":this._free=this.parseYesNo(args);return;case"remove_unused_layers":this._removeUnusedLayers=this.parseYesNo(args);return;case"keep_end_layers":this._keepEndLayers=this.parseYesNo(args);return;case"at":{let parsed=SxClass.parsePrimitiveSexpr(["at",...args],{parentToken:this.token});if(!(parsed instanceof At3))throw new Error("via failed to parse at child");this._sxAt=parsed;return}case"size":{let value=toNumberValue(args[0]);if(value===void 0)throw new Error("via size expects a numeric value");this._size=value;return}case"drill":{let value=toNumberValue(args[0]);if(value===void 0)throw new Error("via drill expects a numeric value");this._drill=value;return}case"layers":{this._sxLayers=Layers.fromSexprPrimitives(args);return}case"net":{this._sxNet=ViaNet.fromSexprPrimitives(args);return}case"teardrops":{this._sxTeardrops=PadTeardrops.fromSexprPrimitives(args);return}case"uuid":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via uuid expects a string value");this._sxUuid=new Uuid(value);return}case"tstamp":{let value=toStringValue(args[0]);if(value===void 0)throw new Error("via tstamp expects a string value");this._sxTstamp=new Tstamp(value);return}default:throw new Error(`via encountered unsupported child token "${token}"`)}}parseYesNo(args){if(args.length===0)return!0;let value=toStringValue(args[0]);if(value===void 0)throw new Error("Expected string when parsing via boolean child");return/^(yes|true)$/iu.test(value)}get type(){return this._type}set type(value){this._type=value}get locked(){return this._locked}set locked(value){this._locked=value}get free(){return this._free}set free(value){this._free=value}get removeUnusedLayers(){return this._removeUnusedLayers}set removeUnusedLayers(value){this._removeUnusedLayers=value}get keepEndLayers(){return this._keepEndLayers}set keepEndLayers(value){this._keepEndLayers=value}get at(){return this._sxAt}set at(value){this._sxAt=value!==void 0?At3.from(value):void 0}get size(){return this._size}set size(value){this._size=value}get drill(){return this._drill}set drill(value){this._drill=value}get layers(){return this._sxLayers}set layers(value){if(value===void 0){this._sxLayers=void 0;return}this._sxLayers=value instanceof Layers?value:new Layers(value)}get net(){return this._sxNet}set net(value){this._sxNet=value}get uuid(){return this._sxUuid}set uuid(value){if(value===void 0){this._sxUuid=void 0;return}this._sxUuid=value instanceof Uuid?value:new Uuid(value)}get teardrops(){return this._sxTeardrops}set teardrops(value){this._sxTeardrops=value}get tstamp(){return this._sxTstamp}set tstamp(value){if(value===void 0){this._sxTstamp=void 0;return}this._sxTstamp=value instanceof Tstamp?value:new Tstamp(value)}getChildren(){let children=[];return this._sxAt&&children.push(this._sxAt),this._sxLayers&&children.push(this._sxLayers),this._sxNet&&children.push(this._sxNet),this._sxUuid&&children.push(this._sxUuid),this._sxTstamp&&children.push(this._sxTstamp),this._sxTeardrops&&children.push(this._sxTeardrops),children}getString(){let lines=["(via"];return this._type!==void 0&&lines.push(` (type ${this._type})`),this._locked&&lines.push(" (locked)"),this._free&&lines.push(" (free)"),this._removeUnusedLayers&&lines.push(" (remove_unused_layers)"),this._keepEndLayers&&lines.push(" (keep_end_layers)"),this._sxAt&&lines.push(this._sxAt.getStringIndented()),this._size!==void 0&&lines.push(` (size ${this._size})`),this._drill!==void 0&&lines.push(` (drill ${this._drill})`),this._sxLayers&&lines.push(this._sxLayers.getStringIndented()),this._sxNet&&lines.push(this._sxNet.getStringIndented()),this._sxUuid&&lines.push(this._sxUuid.getStringIndented()),this._sxTstamp&&lines.push(this._sxTstamp.getStringIndented()),this._sxTeardrops&&lines.push(this._sxTeardrops.getStringIndented()),lines.push(")"),lines.join(`
|
|
806
806
|
`)}},__publicField(_a357,"token","via"),_a357);SxClass.register(Via2);var _a358,KicadPcb=(_a358=class extends SxClass{constructor(params={}){super();__publicField(this,"token","kicad_pcb");__publicField(this,"_sxVersion");__publicField(this,"_sxGenerator");__publicField(this,"_sxGeneratorVersion");__publicField(this,"_sxGeneral");__publicField(this,"_sxPaper");__publicField(this,"_sxTitleBlock");__publicField(this,"_sxLayers");__publicField(this,"_sxSetup");__publicField(this,"_properties",[]);__publicField(this,"_nets",[]);__publicField(this,"_footprints",[]);__publicField(this,"_images",[]);__publicField(this,"_segments",[]);__publicField(this,"_grLines",[]);__publicField(this,"_grTexts",[]);__publicField(this,"_grPolys",[]);__publicField(this,"_grRects",[]);__publicField(this,"_vias",[]);__publicField(this,"_zones",[]);__publicField(this,"_otherChildren",[]);params.version!==void 0&&(this.version=params.version),params.generator!==void 0&&(this.generator=params.generator),params.generatorVersion!==void 0&&(this.generatorVersion=params.generatorVersion),params.general!==void 0&&(this.general=params.general),params.paper!==void 0&&(this.paper=params.paper),params.titleBlock!==void 0&&(this.titleBlock=params.titleBlock),params.layers!==void 0&&(this.layers=params.layers),params.setup!==void 0&&(this.setup=params.setup),params.properties!==void 0&&(this.properties=params.properties),params.nets!==void 0&&(this.nets=params.nets),params.footprints!==void 0&&(this.footprints=params.footprints),params.images!==void 0&&(this.images=params.images),params.segments!==void 0&&(this.segments=params.segments),params.graphicLines!==void 0&&(this.graphicLines=params.graphicLines),params.graphicTexts!==void 0&&(this.graphicTexts=params.graphicTexts),params.graphicPolys!==void 0&&(this.graphicPolys=params.graphicPolys),params.graphicRects!==void 0&&(this.graphicRects=params.graphicRects),params.vias!==void 0&&(this.vias=params.vias),params.zones!==void 0&&(this.zones=params.zones),params.otherChildren!==void 0&&(this.otherChildren=params.otherChildren)}static fromSexprPrimitives(primitiveSexprs){let pcb=new _a358;for(let primitive of primitiveSexprs){if(!Array.isArray(primitive)||primitive.length===0)throw new Error(`kicad_pcb encountered unsupported primitive child: ${JSON.stringify(primitive)}`);let parsed=SxClass.parsePrimitiveSexpr(primitive,{parentToken:this.token});if(!(parsed instanceof SxClass))throw new Error(`kicad_pcb expected SxClass child, received ${JSON.stringify(primitive)}`);pcb.consumeChild(parsed)}return pcb}consumeChild(child){if(child instanceof PcbVersion){this._sxVersion=child;return}if(child instanceof PcbGenerator){this._sxGenerator=child;return}if(child instanceof PcbGeneratorVersion){this._sxGeneratorVersion=child;return}if(child instanceof PcbGeneral){this._sxGeneral=child;return}if(child instanceof Paper){this._sxPaper=child;return}if(child instanceof TitleBlock){this._sxTitleBlock=child;return}if(child instanceof PcbLayers){this._sxLayers=child;return}if(child instanceof Setup){this._sxSetup=child;return}if(child instanceof Property){this._properties.push(child);return}if(child instanceof PcbNet){this._nets.push(child);return}if(child instanceof Footprint2){this._footprints.push(child);return}if(child instanceof Image){this._images.push(child);return}if(child instanceof Segment3){this._segments.push(child);return}if(child instanceof GrLine){this._grLines.push(child);return}if(child instanceof GrText){this._grTexts.push(child);return}if(child instanceof GrPoly){this._grPolys.push(child);return}if(child instanceof GrRect){this._grRects.push(child);return}if(child instanceof Via2){this._vias.push(child);return}if(child instanceof Zone){this._zones.push(child);return}this._otherChildren.push(child)}get version(){return this._sxVersion?.value}set version(value){this._sxVersion=value===void 0?void 0:new PcbVersion(value)}get generator(){return this._sxGenerator?.value}set generator(value){this._sxGenerator=value===void 0?void 0:new PcbGenerator(value)}get generatorVersion(){return this._sxGeneratorVersion?.value}set generatorVersion(value){this._sxGeneratorVersion=value===void 0?void 0:new PcbGeneratorVersion(value)}get general(){return this._sxGeneral}set general(value){this._sxGeneral=value}get paper(){return this._sxPaper}set paper(value){this._sxPaper=value}get titleBlock(){return this._sxTitleBlock}set titleBlock(value){this._sxTitleBlock=value}get layers(){return this._sxLayers}set layers(value){this._sxLayers=value}get setup(){return this._sxSetup}set setup(value){this._sxSetup=value}get properties(){return[...this._properties]}set properties(value){this._properties=[...value]}get nets(){return[...this._nets]}set nets(value){this._nets=[...value]}get footprints(){return[...this._footprints]}set footprints(value){this._footprints=[...value]}get images(){return[...this._images]}set images(value){this._images=[...value]}get segments(){return[...this._segments]}set segments(value){this._segments=[...value]}get graphicLines(){return[...this._grLines]}set graphicLines(value){this._grLines=[...value]}get graphicTexts(){return[...this._grTexts]}set graphicTexts(value){this._grTexts=[...value]}get graphicPolys(){return[...this._grPolys]}set graphicPolys(value){this._grPolys=[...value]}get graphicRects(){return[...this._grRects]}set graphicRects(value){this._grRects=[...value]}get vias(){return[...this._vias]}set vias(value){this._vias=[...value]}get zones(){return[...this._zones]}set zones(value){this._zones=[...value]}get otherChildren(){return[...this._otherChildren]}set otherChildren(value){this._otherChildren=[...value]}getChildren(){let children=[];return this._sxVersion&&children.push(this._sxVersion),this._sxGenerator&&children.push(this._sxGenerator),this._sxGeneratorVersion&&children.push(this._sxGeneratorVersion),this._sxGeneral&&children.push(this._sxGeneral),this._sxPaper&&children.push(this._sxPaper),this._sxTitleBlock&&children.push(this._sxTitleBlock),this._sxLayers&&children.push(this._sxLayers),this._sxSetup&&children.push(this._sxSetup),children.push(...this._properties),children.push(...this._nets),children.push(...this._footprints),children.push(...this._images),children.push(...this._segments),children.push(...this._grLines),children.push(...this._grTexts),children.push(...this._grPolys),children.push(...this._grRects),children.push(...this._vias),children.push(...this._zones),children.push(...this._otherChildren),children}},__publicField(_a358,"token","kicad_pcb"),_a358);SxClass.register(KicadPcb);var parseKicadSexpr=sexpr=>SxClass.parse(sexpr),parseKicadSch=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadSch))throw new Error(`Expected KicadSch root, got ${root?.constructor.name??"undefined"}`);return root},parseKicadPcb=sexpr=>{let[root]=parseKicadSexpr(sexpr);if(!(root instanceof KicadPcb))throw new Error(`Expected KicadPcb root, got ${root?.constructor.name??"undefined"}`);return root};init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();init_src();var ConverterStage=class{constructor(ctx){__publicField(this,"MAX_ITERATIONS",100);__publicField(this,"iterationCount",0);__publicField(this,"finished",!1);this.ctx=ctx}runUntilFinished(){for(this.iterationCount=0;!this.finished&&this.iterationCount<this.MAX_ITERATIONS;)this.step()||(this.finished=!0),this.iterationCount++;this.iterationCount>=this.MAX_ITERATIONS&&(this.ctx.warnings=this.ctx.warnings||[],this.ctx.warnings.push(`Stage ${this.constructor.name} exceeded maximum iterations (${this.MAX_ITERATIONS})`),this.finished=!0)}},InitializeSchematicContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch)return this.finished=!0,!1;let KICAD_CENTER_X=105,KICAD_CENTER_Y=148.5,kicadCenterX=KICAD_CENTER_X,kicadCenterY=KICAD_CENTER_Y,cjCenterX=0,cjCenterY=0;return this.ctx.k2cMatSch=compose2(translate2(cjCenterX,cjCenterY),scale2(1/15,-1/15),translate2(-kicadCenterX,-kicadCenterY)),this.ctx.symbolUuidToComponentId=new Map,this.ctx.warnings=this.ctx.warnings||[],this.ctx.stats=this.ctx.stats||{},this.finished=!0,!1}};function rotationToDirection(rotation4){let normalized=(rotation4%360+360)%360;return normalized>=315||normalized<45?"up":normalized>=45&&normalized<135?"right":normalized>=135&&normalized<225?"down":"left"}function inferSymbolName({libId,reference,rotation:rotation4}){let lower=libId.toLowerCase(),direction2=rotationToDirection(rotation4);if(lower.includes(":r_")||lower.includes(":r")&&reference.startsWith("R"))return`boxresistor_${direction2}`;if(lower.includes(":c_")||lower.includes(":c")&&reference.startsWith("C"))return lower.includes("polarized")||lower.includes("_pol")?`capacitor_${direction2}`:`capacitor_${direction2}`;if(lower.includes(":l_")||lower.includes(":l")&&reference.startsWith("L"))return`inductor_${direction2}`;if(lower.includes(":d_")||lower.includes("diode")||reference.startsWith("D"))return lower.includes("led")?`led_${direction2}`:lower.includes("schottky")?`schottky_diode_${direction2}`:lower.includes("zener")?`zener_diode_${direction2}`:`diode_${direction2}`;if(lower.includes(":q_")||reference.startsWith("Q"))return lower.includes("npn")?`npn_bipolar_transistor_${direction2}`:lower.includes("pnp")?`pnp_bipolar_transistor_${direction2}`:lower.includes("_n_")||lower.includes("nmos")?`n_channel_mosfet_transistor_${direction2}`:lower.includes("_p_")||lower.includes("pmos")?`p_channel_mosfet_transistor_${direction2}`:`npn_bipolar_transistor_${direction2}`;lower.includes("gnd")||lower.includes("ground")||lower.includes("vcc")||lower.includes("vdd")||lower.includes("power")}var CollectLibrarySymbolsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedSymbols",new Set)}step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let symbols=this.ctx.kicadSch.symbols||[];for(let symbol of symbols){let uuid=symbol.uuid;!uuid||this.processedSymbols.has(uuid)||(this.processSymbol(symbol),this.processedSymbols.add(uuid))}return this.finished=!0,!1}processSymbol(symbol){if(!this.ctx.k2cMatSch)return;let reference=this.getProperty(symbol,"Reference")||"U?",value=this.getProperty(symbol,"Value")||"",libId=symbol.libraryId||"",at3=symbol.at,kicadPos={x:at3?.x??0,y:at3?.y??0},cjPos=applyToPoint2(this.ctx.k2cMatSch,kicadPos),rotation4=at3?.angle??0,ftype=this.inferFtype(libId,reference),sourceComponentId=`${libId}_source`;this.ctx.db.source_component.list().find(sc2=>sc2.source_component_id===sourceComponentId)||this.ctx.db.source_component.insert({name:libId||reference,ftype,manufacturer_part_number:value||void 0});let uuid=symbol.uuid;if(!uuid)return;let symbolName=inferSymbolName({libId,reference,rotation:rotation4}),componentId=this.ctx.db.schematic_component.insert({source_component_id:sourceComponentId,center:{x:cjPos.x,y:cjPos.y},size:this.estimateSize(symbol),...symbolName?{symbol_name:symbolName}:{}}).schematic_component_id;this.ctx.symbolUuidToComponentId?.set(uuid,componentId),this.createPorts(symbol,componentId),this.ctx.stats&&(this.ctx.stats.components=(this.ctx.stats.components||0)+1)}getProperty(symbol,propName){return(symbol.properties||[]).find(p4=>p4.key===propName)?.value}inferFtype(libId,reference){let lower=libId.toLowerCase();return lower.includes(":r_")||reference.startsWith("R")?"simple_resistor":lower.includes(":c_")||reference.startsWith("C")?"simple_capacitor":lower.includes(":l_")||reference.startsWith("L")?"simple_inductor":lower.includes(":d_")||reference.startsWith("D")?"simple_diode":lower.includes(":led")||reference.startsWith("LED")?"simple_led":lower.includes(":q_")||reference.startsWith("Q")?"simple_transistor":"simple_chip"}estimateSize(symbol){return{width:1,height:1}}createPorts(symbol,componentId){let libId=symbol.libraryId,libSymbol=this.ctx.kicadSch?.libSymbols?.symbols?.find(ls3=>ls3.libraryId===libId);if(!libSymbol)return;let allPins=[];if(libSymbol.pins&&Array.isArray(libSymbol.pins)&&libSymbol.pins.length>0?allPins.push(...libSymbol.pins):libSymbol.pins&&!Array.isArray(libSymbol.pins)&&allPins.push(libSymbol.pins),libSymbol.subSymbols&&Array.isArray(libSymbol.subSymbols))for(let subSymbol of libSymbol.subSymbols)subSymbol.pins&&Array.isArray(subSymbol.pins)&&subSymbol.pins.length>0?allPins.push(...subSymbol.pins):subSymbol.pins&&!Array.isArray(subSymbol.pins)&&allPins.push(subSymbol.pins);if(allPins.length===0)return;let componentRotation=symbol.at?.angle??0;for(let pin of allPins){let pinAt=pin._sxAt;if(!pinAt)continue;let rotRad=componentRotation*Math.PI/180,cosR=Math.cos(rotRad),sinR=Math.sin(rotRad),rotatedPinPos={x:pinAt.x*cosR-pinAt.y*sinR,y:pinAt.x*sinR+pinAt.y*cosR},scaleFactor=Math.abs(this.ctx.k2cMatSch?.a||1/15),relativePos={x:rotatedPinPos.x*scaleFactor,y:-rotatedPinPos.y*scaleFactor};this.ctx.db.schematic_port.insert({schematic_component_id:componentId,center:relativePos,facing_direction:this.inferPinDirection(pin,componentRotation),pin_number:pin._sxNumber?.value??pin.pinNumber??void 0})}}inferPinDirection(pin,componentRotation){let totalAngle=(pin.at?.angle??0)+componentRotation;return rotationToDirection(totalAngle)}},CollectSchematicTracesStage=class extends ConverterStage{step(){if(!this.ctx.kicadSch||!this.ctx.k2cMatSch)return this.finished=!0,!1;let wires=this.ctx.kicadSch.wires||[],wireArray=Array.isArray(wires)?wires:[wires];for(let wire of wireArray)this.processWire(wire);let junctions=this.ctx.kicadSch.junctions||[],junctionArray=Array.isArray(junctions)?junctions:[junctions];for(let junction of junctionArray)this.processJunction(junction);return this.finished=!0,!1}processWire(wire){if(!this.ctx.k2cMatSch||!wire.pts)return;let pts=Array.isArray(wire.pts.xy)?wire.pts.xy:[wire.pts.xy];if(pts.length<2)return;let edges=[];for(let i3=0;i3<pts.length-1;i3++){let from=applyToPoint2(this.ctx.k2cMatSch,{x:pts[i3].x,y:pts[i3].y}),to2=applyToPoint2(this.ctx.k2cMatSch,{x:pts[i3+1].x,y:pts[i3+1].y});edges.push({from,to:to2})}this.ctx.db.schematic_trace.insert({edges}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}processJunction(junction){if(!this.ctx.k2cMatSch||!junction.at)return;let pos=applyToPoint2(this.ctx.k2cMatSch,{x:junction.at.x,y:junction.at.y});this.ctx.db.schematic_trace.insert({edges:[],junctions:[pos]})}},InitializePcbContextStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb)return this.finished=!0,!1;let center2=this.calculateBoardCenter();return this.ctx.k2cMatPcb=compose2(scale2(1,-1),translate2(-center2.x,-center2.y)),this.ctx.netNumToName=new Map,this.ctx.footprintUuidToComponentId=new Map,this.finished=!0,!1}calculateBoardCenter(){if(!this.ctx.kicadPcb)return{x:0,y:0};let lines=this.ctx.kicadPcb.graphicLines||[],edgeCutLines=(Array.isArray(lines)?lines:[lines]).filter(line2=>{let layer=line2.layer;return(typeof layer=="string"?[layer]:layer?.names||[]).join(" ").includes("Edge.Cuts")});if(edgeCutLines.length===0)return{x:0,y:0};let xs3=[],ys3=[];for(let line2 of edgeCutLines)line2.start&&(xs3.push(line2.start.x),ys3.push(line2.start.y)),line2.end&&(xs3.push(line2.end.x),ys3.push(line2.end.y));if(xs3.length===0||ys3.length===0)return{x:0,y:0};let minX=Math.min(...xs3),maxX=Math.max(...xs3),minY=Math.min(...ys3),maxY=Math.max(...ys3);return{x:(minX+maxX)/2,y:(minY+maxY)/2}}},CollectNetsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let nets=this.ctx.kicadPcb.nets||[],netArray=Array.isArray(nets)?nets:[nets];for(let net of netArray){let netNum=net._id??net.number??net.ordinal??0,netName=net._name??net.name??`Net-${netNum}`;this.ctx.netNumToName.set(netNum,netName)}return this.ctx.netNumToName.has(0)||this.ctx.netNumToName.set(0,""),this.finished=!0,!1}};function getComponentLayer(footprint){return(footprint.layer?.names||[]).some(name=>name.includes("B.Cu")||name.includes("Back"))?"bottom":"top"}function determineLayerFromLayers(layers){let layerArray=Array.isArray(layers)?layers:layers?._layers||[];return layerArray.includes("B.Cu")||layerArray.includes("Back")?"bottom":"top"}function mapTextLayer(kicadLayer){let layerStr=typeof kicadLayer=="string"?kicadLayer:kicadLayer?.names?.join(" ")||"";return layerStr.includes("B.")||layerStr.includes("Back")?"bottom":"top"}function getTextValue(footprint,type){let texts=footprint.fpTexts||[];return(Array.isArray(texts)?texts:[texts]).find(t6=>t6.type===type)?.text}function getPropertyValue(footprint,propertyName){let properties=footprint.properties||[];return(Array.isArray(properties)?properties:[properties]).find(p4=>p4.key===propertyName)?.value}function substituteKicadVariables(text,footprint){let result=text,reference=getPropertyValue(footprint,"Reference")||getTextValue(footprint,"reference")||"?",value=getPropertyValue(footprint,"Value")||getTextValue(footprint,"value")||"";return result=result.replace(/\$\{REFERENCE\}/g,reference),result=result.replace(/\$\{VALUE\}/g,value),result}function createPcbPort({ctx,componentId,padInfo}){if(!padInfo.layers||padInfo.layers.length===0)return!1;let sourcePortId=`${componentId}_port_${padInfo.padNumber}`;return ctx.db.pcb_port.insert({pcb_component_id:componentId,source_port_id:sourcePortId,x:padInfo.position.x,y:padInfo.position.y,layers:padInfo.layers}),!0}function processPads(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray)processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation})}function processPad({ctx,pad:pad2,componentId,kicadComponentPos,componentRotation}){if(!ctx.k2cMatPcb)return;let padAt=pad2.at||{x:0,y:0,angle:0},padType=pad2.padType||pad2.type||"thru_hole",padShape=pad2.shape||"circle",padRotation=padAt.angle||0,rotationRad=-componentRotation*Math.PI/180,rotatedPadX=padAt.x*Math.cos(rotationRad)-padAt.y*Math.sin(rotationRad),rotatedPadY=padAt.x*Math.sin(rotationRad)+padAt.y*Math.cos(rotationRad),padKicadPos={x:kicadComponentPos.x+rotatedPadX,y:kicadComponentPos.y+rotatedPadY},globalPos=applyToPoint2(ctx.k2cMatPcb,padKicadPos),sizeX=1,sizeY=1;pad2.size&&(Array.isArray(pad2.size)?(sizeX=pad2.size[0]||1,sizeY=pad2.size[1]||1):typeof pad2.size=="object"&&(sizeX=pad2.size._width||pad2.size.x||1,sizeY=pad2.size._height||pad2.size.y||1));let size2={x:sizeX,y:sizeY},drill=pad2.drill,totalRotation=-componentRotation-padRotation,padNumber=pad2.number?.toString();if(padNumber){let padPortInfo={padNumber,padType,layers:padType==="smd"?[determineLayerFromLayers(pad2.layers||[])]:[],position:globalPos};createPcbPort({ctx,componentId,padInfo:padPortInfo})}padType==="smd"?createSmdPad({ctx,pad:pad2,componentId,pos:globalPos,size:size2,shape:padShape}):padType==="np_thru_hole"?createNpthHole(ctx,pad2,componentId,globalPos,drill):createPlatedHole(ctx,pad2,componentId,globalPos,size2,drill,padShape,totalRotation)}function createSmdPad({ctx,pad:pad2,componentId,pos,size:size2,shape}){let layers=pad2.layers||[],layer=determineLayerFromLayers(layers);if(shape==="custom"){let primitives=pad2._sxPrimitives?._graphics||pad2.primitives||[],primitivesArray=Array.isArray(primitives)?primitives:[primitives];for(let primitive of primitivesArray)if(primitive.token==="gr_poly"||primitive.gr_poly||primitive.type==="gr_poly"){let grPoly=primitive.gr_poly||primitive,contours=grPoly._contours||grPoly.contours||[],contoursArray=Array.isArray(contours)?contours:[contours],points=[];for(let contour of contoursArray){let pts=contour.points||contour.pts||[],ptsArray=Array.isArray(pts)?pts:[pts];for(let pt3 of ptsArray)pt3.x!==void 0&&pt3.y!==void 0&&points.push({x:pt3.x,y:-pt3.y})}if(points.length>0){let smtpad22={type:"pcb_smtpad",shape:"polygon",pcb_component_id:componentId,layer,port_hints:[pad2.number?.toString()],points:points.map(pt3=>({x:pos.x+pt3.x,y:pos.y+pt3.y}))};ctx.db.pcb_smtpad.insert(smtpad22),ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1);return}}}let smtpad2={type:"pcb_smtpad",pcb_component_id:componentId,x:pos.x,y:pos.y,width:size2.x,height:size2.y,layer,port_hints:[pad2.number?.toString()]};if(shape==="circle")smtpad2.shape="circle",smtpad2.radius=Math.max(size2.x,size2.y)/2;else if(shape==="rect"||shape==="roundrect"){smtpad2.shape="rect";let roundrectRatio=pad2._sxRoundrectRatio?.value??pad2.roundrect_rratio;if(shape==="roundrect"&&roundrectRatio!==void 0){let cornerRadius=Math.min(size2.x,size2.y)*roundrectRatio/2;smtpad2.corner_radius=cornerRadius}}else smtpad2.shape="rect";ctx.db.pcb_smtpad.insert(smtpad2),ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function createPlatedHole(ctx,pad2,componentId,pos,size2,drill,shape,rotation4=0){let holeDiameter=typeof drill=="object"?drill?.diameter||drill?.x||.8:drill||.8,holeShape="circle",drillIsOval=typeof drill=="object"&&drill.x!==void 0&&drill.y!==void 0&&drill.x!==drill.y,normalizedRotation=rotation4%360;normalizedRotation<0&&(normalizedRotation+=360);let shouldSwapDimensions=normalizedRotation>=45&&normalizedRotation<135||normalizedRotation>=225&&normalizedRotation<315,outerWidth=size2.x,outerHeight=size2.y;shouldSwapDimensions&&shape==="oval"&&(outerWidth=size2.y,outerHeight=size2.x);let platedHole={pcb_component_id:componentId,x:pos.x,y:pos.y,port_hints:[pad2.number?.toString()]};shape==="circle"?(platedHole.shape="circle",platedHole.hole_diameter=holeDiameter,platedHole.outer_diameter=Math.max(outerWidth,outerHeight),platedHole.layers=["top","bottom"]):shape==="oval"?(platedHole.shape="pill",platedHole.hole_width=holeDiameter,platedHole.hole_height=holeDiameter,platedHole.outer_width=outerWidth,platedHole.outer_height=outerHeight,platedHole.layers=["top","bottom"]):(shape==="rect"||shape==="square")&&(platedHole.shape="pill_hole_with_rect_pad",platedHole.hole_shape="circle",platedHole.pad_shape="rect",platedHole.hole_width=holeDiameter,platedHole.hole_height=holeDiameter,platedHole.rect_pad_width=outerWidth,platedHole.rect_pad_height=outerHeight,platedHole.layers=["top","bottom"]),ctx.db.pcb_plated_hole.insert(platedHole),ctx.stats&&(ctx.stats.pads=(ctx.stats.pads||0)+1)}function createNpthHole(ctx,pad2,componentId,pos,drill){let holeDiameter=drill?.diameter||drill||1;ctx.db.pcb_hole.insert({x:pos.x,y:pos.y,hole_diameter:holeDiameter,hole_shape:"circle"})}function processFootprintText(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation);let texts=footprint.fpTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let layerStr=typeof text.layer=="string"?text.layer:text.layer?.names?.join(" ")||"";if(!(layerStr.includes("SilkS")||layerStr.includes("Silk")))continue;let textElement={text:text.text,at:text._sxPosition||text.at,layer:text.layer,effects:text._sxEffects||text.effects,_sxEffects:text._sxEffects};createSilkscreenText(ctx,textElement,componentId,kicadComponentPos,componentRotation,footprint)}}function processFootprintProperties(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let properties=footprint.properties||[],propertyArray=Array.isArray(properties)?properties:[properties];for(let property of propertyArray){if(!property.layer)continue;let layerStr=typeof property.layer=="string"?property.layer:property.layer?.names?.join(" ")||"";if(!(layerStr.includes("SilkS")||layerStr.includes("Silk")))continue;let textElement={text:property.value,at:property._sxAt,layer:property.layer,effects:property._sxEffects||property.effects,_sxEffects:property._sxEffects};createSilkscreenText(ctx,textElement,componentId,kicadComponentPos,componentRotation,footprint)}}function createSilkscreenText(ctx,text,componentId,kicadComponentPos,componentRotation,footprint){if(!ctx.k2cMatPcb)return;let at3=text.at,textLocalX=at3?.x??0,textLocalY=at3?.y??0,rotationRad=-componentRotation*Math.PI/180,rotatedTextX=textLocalX*Math.cos(rotationRad)-textLocalY*Math.sin(rotationRad),rotatedTextY=textLocalX*Math.sin(rotationRad)+textLocalY*Math.cos(rotationRad),textKicadPos={x:kicadComponentPos.x+rotatedTextX,y:kicadComponentPos.y+rotatedTextY},pos=applyToPoint2(ctx.k2cMatPcb,textKicadPos),layer=mapTextLayer(text.layer),processedText=substituteKicadVariables(text.text||"",footprint),kicadFontSize=text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1;ctx.db.pcb_silkscreen_text.insert({pcb_component_id:componentId,font:"tscircuit2024",font_size:kicadFontSize*1.5,text:processedText,anchor_position:pos,layer})}function rotatePoint4(x3,y3,rotationDeg){let rotationRad=rotationDeg*Math.PI/180;return{x:x3*Math.cos(rotationRad)-y3*Math.sin(rotationRad),y:x3*Math.sin(rotationRad)+y3*Math.cos(rotationRad)}}function processFootprintGraphics(ctx,footprint,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let lines=footprint.fpLines||[],lineArray=Array.isArray(lines)?lines:lines?[lines]:[];for(let line2 of lineArray)createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation);let circles=footprint.fpCircles||[],circleArray=Array.isArray(circles)?circles:circles?[circles]:[];for(let circle2 of circleArray)createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation);let arcs=footprint.fpArcs||[],arcArray=Array.isArray(arcs)?arcs:arcs?[arcs]:[];for(let arc2 of arcArray)createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation)}function createFootprintLine(ctx,line2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let start=line2.start||{x:0,y:0},end=line2.end||{x:0,y:0},rotatedStart=rotatePoint4(start.x,start.y,-componentRotation),rotatedEnd=rotatePoint4(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},startPos=applyToPoint2(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint2(ctx.k2cMatPcb,endKicadPos),layer=mapTextLayer(line2.layer),strokeWidth=line2.stroke?.width||line2.width||.12;ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route:[startPos,endPos],stroke_width:strokeWidth})}function createFootprintCircle(ctx,circle2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let center2=circle2.center||{x:0,y:0},end=circle2.end||{x:0,y:0},radius=Math.sqrt((end.x-center2.x)**2+(end.y-center2.y)**2),rotatedCenter=rotatePoint4(center2.x,center2.y,-componentRotation),centerKicadPos={x:kicadComponentPos.x+rotatedCenter.x,y:kicadComponentPos.y+rotatedCenter.y},centerPos=applyToPoint2(ctx.k2cMatPcb,centerKicadPos),layer=mapTextLayer(circle2.layer),strokeWidth=circle2.stroke?.width||circle2.width||.12,numPoints=16,circleRoute=[];for(let i3=0;i3<=numPoints;i3++){let angle=i3/numPoints*2*Math.PI,x3=centerPos.x+radius*Math.cos(angle),y3=centerPos.y+radius*Math.sin(angle);circleRoute.push({x:x3,y:y3})}ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route:circleRoute,stroke_width:strokeWidth})}function calculateArcCenter(p12,p22,p32){let ax2=p12.x-p22.x,ay2=p12.y-p22.y,bx2=p22.x-p32.x,by2=p22.y-p32.y,denom=2*(ax2*by2-ay2*bx2);if(Math.abs(denom)<1e-10)return null;let d12=p12.x*p12.x+p12.y*p12.y-p22.x*p22.x-p22.y*p22.y,d2=p22.x*p22.x+p22.y*p22.y-p32.x*p32.x-p32.y*p32.y,cx2=(d12*by2-d2*ay2)/denom,cy2=(ax2*d2-bx2*d12)/denom,radius=Math.sqrt((p12.x-cx2)**2+(p12.y-cy2)**2);return{center:{x:cx2,y:cy2},radius}}function createFootprintArc(ctx,arc2,componentId,kicadComponentPos,componentRotation){if(!ctx.k2cMatPcb)return;let start=arc2.start||{x:0,y:0},mid=arc2.mid||{x:0,y:0},end=arc2.end||{x:0,y:0},rotatedStart=rotatePoint4(start.x,start.y,-componentRotation),rotatedMid=rotatePoint4(mid.x,mid.y,-componentRotation),rotatedEnd=rotatePoint4(end.x,end.y,-componentRotation),startKicadPos={x:kicadComponentPos.x+rotatedStart.x,y:kicadComponentPos.y+rotatedStart.y},midKicadPos={x:kicadComponentPos.x+rotatedMid.x,y:kicadComponentPos.y+rotatedMid.y},endKicadPos={x:kicadComponentPos.x+rotatedEnd.x,y:kicadComponentPos.y+rotatedEnd.y},layer=mapTextLayer(arc2.layer),strokeWidth=arc2.stroke?.width||arc2.width||.12,arcInfo=calculateArcCenter(startKicadPos,midKicadPos,endKicadPos);if(!arcInfo){let startPos=applyToPoint2(ctx.k2cMatPcb,startKicadPos),endPos=applyToPoint2(ctx.k2cMatPcb,endKicadPos);ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route:[startPos,endPos],stroke_width:strokeWidth});return}let{center:center2,radius}=arcInfo,startAngle=Math.atan2(startKicadPos.y-center2.y,startKicadPos.x-center2.x),midAngle=Math.atan2(midKicadPos.y-center2.y,midKicadPos.x-center2.x),sweepAngle=Math.atan2(endKicadPos.y-center2.y,endKicadPos.x-center2.x)-startAngle,midSweep=midAngle-startAngle;for(;sweepAngle>Math.PI;)sweepAngle-=2*Math.PI;for(;sweepAngle<-Math.PI;)sweepAngle+=2*Math.PI;for(;midSweep>Math.PI;)midSweep-=2*Math.PI;for(;midSweep<-Math.PI;)midSweep+=2*Math.PI;let isCCW=sweepAngle>0;isCCW&&midSweep>0&&midSweep<sweepAngle||!isCCW&&midSweep<0&&midSweep>sweepAngle||(sweepAngle=sweepAngle>0?sweepAngle-2*Math.PI:sweepAngle+2*Math.PI);let arcLength=Math.abs(radius*sweepAngle),numSegments=Math.max(2,Math.ceil(arcLength/.1)),arcRoute=[];for(let i3=0;i3<=numSegments;i3++){let t6=i3/numSegments,angle=startAngle+sweepAngle*t6,kicadPoint={x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)},cjPoint=applyToPoint2(ctx.k2cMatPcb,kicadPoint);arcRoute.push(cjPoint)}ctx.db.pcb_silkscreen_path.insert({pcb_component_id:componentId,layer,route:arcRoute,stroke_width:strokeWidth})}function processFootprint(ctx,footprint){if(!ctx.k2cMatPcb)return;let position2=footprint.position,kicadPos={x:position2?.x??0,y:position2?.y??0},cjPos=applyToPoint2(ctx.k2cMatPcb,kicadPos),rotation4=position2?.angle??0,uuid=footprint.uuid?.value||footprint.tstamp?.value;if(!uuid)return;let componentId=ctx.db.pcb_component.insert({center:{x:cjPos.x,y:cjPos.y},layer:getComponentLayer(footprint),rotation:-rotation4,width:0,height:0}).pcb_component_id;ctx.footprintUuidToComponentId?.set(uuid,componentId),processPads(ctx,footprint,componentId,kicadPos,rotation4),processFootprintText(ctx,footprint,componentId,kicadPos,rotation4),processFootprintGraphics(ctx,footprint,componentId,kicadPos,rotation4),ctx.stats&&(ctx.stats.components=(ctx.stats.components||0)+1)}var CollectFootprintsStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedFootprints",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray){let uuid=footprint.uuid?.value||footprint.tstamp?.value;uuid&&(this.processedFootprints.has(uuid)||(processFootprint(this.ctx,footprint),this.processedFootprints.add(uuid)))}return this.finished=!0,!1}},CollectTracesStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let segments=this.ctx.kicadPcb.segments||[],segmentArray=Array.isArray(segments)?segments:[segments];for(let segment2 of segmentArray)this.createTraceFromSegment(segment2);return this.finished=!0,!1}createTraceFromSegment(segment2){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return;let start=segment2.start||{x:0,y:0},end=segment2.end||{x:0,y:0},width=segment2.width||.2,layerStr=(segment2.layer?.names||[]).join(" "),mappedLayer=this.mapLayer(layerStr),netNum=segment2.net||0,netName=this.ctx.netNumToName.get(netNum)||"",startPos=applyToPoint2(this.ctx.k2cMatPcb,{x:start.x,y:start.y}),endPos=applyToPoint2(this.ctx.k2cMatPcb,{x:end.x,y:end.y}),route=[{route_type:"wire",x:startPos.x,y:startPos.y,width,layer:mappedLayer},{route_type:"wire",x:endPos.x,y:endPos.y,width,layer:mappedLayer}];this.ctx.db.pcb_trace.insert({route,pcb_port_id:void 0}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}mapLayer(kicadLayer){return kicadLayer?.includes("B.Cu")||kicadLayer?.includes("Back")?"bottom":"top"}},CollectViasStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let vias=this.ctx.kicadPcb.vias||[],viaArray=Array.isArray(vias)?vias:[vias];for(let via of viaArray)this.processVia(via);return this.finished=!0,!1}processVia(via){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return;let at3=via.at||{x:0,y:0},pos=applyToPoint2(this.ctx.k2cMatPcb,{x:at3.x,y:at3.y}),size2=via.size||.8,drill=via.drill||.4,netNum=via.net||0,netName=this.ctx.netNumToName.get(netNum)||"",fromLayer="top",toLayer="bottom";if(via.layers){let layersArray=Array.isArray(via.layers)?via.layers:via.layers._layers||[];layersArray.length>0&&(fromLayer=this.mapLayer(layersArray[0]),layersArray.length>1&&(toLayer=this.mapLayer(layersArray[layersArray.length-1])))}this.ctx.db.pcb_via.insert({x:pos.x,y:pos.y,outer_diameter:size2,hole_diameter:drill,layers:[fromLayer,toLayer]}),this.ctx.stats&&(this.ctx.stats.vias=(this.ctx.stats.vias||0)+1)}mapLayer(kicadLayer){return kicadLayer?.includes("B.Cu")||kicadLayer?.includes("Back")||kicadLayer?.includes("B_Cu")?"bottom":"top"}},CollectZonesStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let zones=this.ctx.kicadPcb.zones||[],zoneArray=Array.isArray(zones)?zones:[zones];for(let zone of zoneArray)this.isZoneFilled(zone)&&this.createCopperPourFromZone(zone);return this.finished=!0,!1}isZoneFilled(zone){if(!zone._rawChildren||!Array.isArray(zone._rawChildren))return!1;let fillEntry=zone._rawChildren.find(child=>Array.isArray(child)&&child[0]==="fill");return fillEntry&&fillEntry[1]==="yes"?!0:zone._rawChildren.some(child=>Array.isArray(child)&&child[0]==="filled_polygon")}createCopperPourFromZone(zone){if(!this.ctx.k2cMatPcb||!this.ctx.netNumToName||!zone._rawChildren||!Array.isArray(zone._rawChildren))return;let zoneData=this.parseZoneData(zone._rawChildren),filledPolygons=this.extractFilledPolygons(zone._rawChildren);if(filledPolygons.length===0){let mainPolygon=this.extractMainPolygon(zone._rawChildren);mainPolygon.length>0&&filledPolygons.push(mainPolygon)}if(filledPolygons.length===0){this.ctx.warnings&&this.ctx.warnings.push(`Zone on layer ${zoneData.layer||"unknown"} has no valid polygon points`);return}let layer=this.mapLayer(zoneData.layer),netNum=zoneData.net||0,netName=this.ctx.netNumToName.get(netNum)||zoneData.netName||"";for(let polygonPoints of filledPolygons){let transformedPoints=polygonPoints.map(point6=>applyToPoint2(this.ctx.k2cMatPcb,{x:point6.x,y:point6.y}));this.ctx.db.pcb_copper_pour.insert({layer,net_name:netName,points:transformedPoints,shape:"polygon"}),this.ctx.stats&&(this.ctx.stats.copper_pours=(this.ctx.stats.copper_pours||0)+1)}}parseZoneData(children){let data={};for(let child of children)if(Array.isArray(child))switch(child[0]){case"net":data.net=child[1];break;case"net_name":data.netName=child[1];break;case"layer":data.layer=child[1];break}return data}extractMainPolygon(children){let polygonEntry=children.find(child=>Array.isArray(child)&&child[0]==="polygon");return polygonEntry?this.extractPointsFromPolygonEntry(polygonEntry):[]}extractFilledPolygons(children){let filledPolygonEntries=children.filter(child=>Array.isArray(child)&&child[0]==="filled_polygon"),polygons=[];for(let entry of filledPolygonEntries){let points=this.extractPointsFromPolygonEntry(entry);points.length>0&&polygons.push(points)}return polygons}extractPointsFromPolygonEntry(polygonEntry){let points=[],ptsEntry=polygonEntry.find(child=>Array.isArray(child)&&child[0]==="pts");if(!ptsEntry)return[];for(let i3=1;i3<ptsEntry.length;i3++){let item=ptsEntry[i3];if(Array.isArray(item)&&item[0]==="xy"&&item.length>=3){let x3=item[1],y3=item[2];typeof x3=="number"&&typeof y3=="number"&&points.push({x:x3,y:y3})}}return points}mapLayer(kicadLayer){let layerStr=typeof kicadLayer=="string"?kicadLayer:kicadLayer?.names?.join(" ")||kicadLayer?.name||"";return layerStr.includes("B.Cu")||layerStr.includes("Back")||layerStr.includes("Bottom")?"bottom":"top"}},CollectGraphicsStage=class extends ConverterStage{step(){if(!this.ctx.kicadPcb||!this.ctx.k2cMatPcb)return this.finished=!0,!1;let lines=this.ctx.kicadPcb.graphicLines||[],lineArray=Array.isArray(lines)?lines:[lines],edgeCutLines=[],silkLines=[];for(let line2 of lineArray){let layer=line2.layer,layerStr=(typeof layer=="string"?[layer]:layer?.names||[]).join(" ");layerStr.includes("Edge.Cuts")?edgeCutLines.push(line2):layerStr.includes("SilkS")&&silkLines.push(line2)}edgeCutLines.length>0&&this.createBoardOutline(edgeCutLines);for(let line2 of silkLines)this.createSilkscreenPath(line2);let grRects=this.ctx.kicadPcb.graphicRects||[];for(let rect of grRects)this.processRectangle(rect);let grPolys=this.ctx.kicadPcb.graphicPolys||[],polyArray=Array.isArray(grPolys)?grPolys:[grPolys];for(let poly of polyArray)this.processPolygon(poly);let texts=this.ctx.kicadPcb.graphicTexts||[],textArray=Array.isArray(texts)?texts:[texts];for(let text of textArray){let layer=text.layer;(typeof layer=="string"?[layer]:layer?.names||[]).some(name=>name.includes("SilkS")||name.includes(".Cu")||name.includes("Fab"))&&this.createSilkscreenText(text)}return this.finished=!0,!1}createBoardOutline(lines){if(!this.ctx.k2cMatPcb)return;let segments=lines.map(line2=>({start:line2.start??{x:0,y:0},end:line2.end??{x:0,y:0}})),orderedSegments=[],remainingSegments=[...segments];if(remainingSegments.length>0)for(orderedSegments.push(remainingSegments.shift());remainingSegments.length>0;){let lastEnd=orderedSegments[orderedSegments.length-1].end,foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.start,lastEnd));if(foundIndex===-1&&(foundIndex=remainingSegments.findIndex(seg=>this.pointsEqualKicad(seg.end,lastEnd)),foundIndex!==-1)){let seg=remainingSegments[foundIndex];orderedSegments.push({start:seg.end,end:seg.start}),remainingSegments.splice(foundIndex,1);continue}foundIndex!==-1?orderedSegments.push(remainingSegments.splice(foundIndex,1)[0]):orderedSegments.push(remainingSegments.shift())}let points=[];for(let segment2 of orderedSegments){let startPos=applyToPoint2(this.ctx.k2cMatPcb,{x:segment2.start.x,y:segment2.start.y}),lastPoint=points[points.length-1];(!lastPoint||!this.pointsEqual(lastPoint,startPos))&&points.push(startPos)}if(orderedSegments.length>0){let lastSegment=orderedSegments[orderedSegments.length-1],endPos=applyToPoint2(this.ctx.k2cMatPcb,{x:lastSegment.end.x,y:lastSegment.end.y}),firstPoint=points[0];firstPoint&&!this.pointsEqual(firstPoint,endPos)&&points.push(endPos)}let existingBoard=this.ctx.db.pcb_board.list()[0];existingBoard?(existingBoard.outline=points,existingBoard.width=this.calculateWidth(points),existingBoard.height=this.calculateHeight(points)):this.ctx.db.pcb_board.insert({outline:points,width:this.calculateWidth(points),height:this.calculateHeight(points)})}createSilkscreenPath(line2){if(!this.ctx.k2cMatPcb)return;let start=line2.start||{x:0,y:0},end=line2.end||{x:0,y:0},startPos=applyToPoint2(this.ctx.k2cMatPcb,{x:start.x,y:start.y}),endPos=applyToPoint2(this.ctx.k2cMatPcb,{x:end.x,y:end.y}),layer=this.mapLayer(line2.layer),strokeWidth=line2.width||.15;this.ctx.db.pcb_silkscreen_path.insert({pcb_component_id:"",layer,route:[startPos,endPos],stroke_width:strokeWidth})}processRectangle(rect){if(!this.ctx.k2cMatPcb)return;let start={x:rect._sxStart?._x??0,y:rect._sxStart?._y??0},end={x:rect._sxEnd?._x??0,y:rect._sxEnd?._y??0},layerStr=(rect._sxLayer?._names||[]).join(" "),isFilled=rect._sxFill&&(rect._sxFill.isFilled===!0||String(rect._sxFill).includes("fill yes")),isCopperLayer=layerStr.includes(".Cu");if(!isFilled||!isCopperLayer)return;let centerKicad={x:(start.x+end.x)/2,y:(start.y+end.y)/2},widthKicad=Math.abs(end.x-start.x),heightKicad=Math.abs(end.y-start.y),centerCJ=applyToPoint2(this.ctx.k2cMatPcb,centerKicad),layer=this.mapLayer(rect._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",x:centerCJ.x,y:centerCJ.y,width:widthKicad,height:heightKicad,layer,shape:"rect",port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1)}createSilkscreenText(text){if(!this.ctx.k2cMatPcb)return;let at3=text.at||text._sxPosition,pos=applyToPoint2(this.ctx.k2cMatPcb,{x:at3?.x??0,y:at3?.y??0}),layer=this.mapLayer(text.layer),fontSize=(text._sxEffects?._sxFont?._sxSize?._height||text.effects?.font?.size?.y||1)*1.5;this.ctx.db.pcb_silkscreen_text.insert({pcb_component_id:"",text:text.text||text._text||"",anchor_position:pos,layer,font_size:fontSize,font:"tscircuit2024"})}mapLayer(kicadLayer){let layerStr=typeof kicadLayer=="string"?kicadLayer:kicadLayer?.names?.join(" ")||"";return layerStr.includes("B.")||layerStr.includes("Back")?"bottom":"top"}pointsEqual(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}pointsEqualKicad(p12,p22){return Math.abs(p12.x-p22.x)<.001&&Math.abs(p12.y-p22.y)<.001}calculateWidth(points){if(points.length===0)return 0;let xs3=points.map(p4=>p4.x);return Math.max(...xs3)-Math.min(...xs3)}calculateHeight(points){if(points.length===0)return 0;let ys3=points.map(p4=>p4.y);return Math.max(...ys3)-Math.min(...ys3)}processPolygon(poly){if(!this.ctx.k2cMatPcb)return;let layerStr=(poly._sxLayer?._names||[]).join(" "),isFilled=poly._sxFill?.filled===!0,isCopperLayer=layerStr.includes(".Cu");if(!isFilled||!isCopperLayer)return;let ptsData=poly._sxPts?.points||[],points=[];for(let pt3 of ptsData)if(pt3.token==="xy")points.push({x:pt3.x,y:pt3.y});else if(pt3.token==="arc"){let arcPoints=this.convertArcToPoints({x:pt3._sxStart?._x,y:pt3._sxStart?._y},{x:pt3._sxMid?._x,y:pt3._sxMid?._y},{x:pt3._sxEnd?._x,y:pt3._sxEnd?._y});points.push(...arcPoints)}if(points.length<3)return;let transformedPoints=points.map(pt3=>applyToPoint2(this.ctx.k2cMatPcb,pt3)),layer=this.mapLayer(poly._sxLayer);this.ctx.db.pcb_smtpad.insert({pcb_component_id:"",shape:"polygon",points:transformedPoints,layer,port_hints:[]}),this.ctx.stats&&(this.ctx.stats.pads=(this.ctx.stats.pads||0)+1)}convertArcToPoints(start,mid,end,numSegments=8){let points=[],{center:center2,radius}=this.calculateArcCenter(start,mid,end);if(!center2||radius===0)return[start,end];let startAngle=Math.atan2(start.y-center2.y,start.x-center2.x),endAngle=Math.atan2(end.y-center2.y,end.x-center2.x),midAngle=Math.atan2(mid.y-center2.y,mid.x-center2.x),angleRange=endAngle-startAngle,midFromStart=midAngle-startAngle,endFromStart=endAngle-startAngle,normalizeMid=(midFromStart+Math.PI)%(2*Math.PI)-Math.PI,normalizeEnd=(endFromStart+Math.PI)%(2*Math.PI)-Math.PI;(normalizeEnd>0&&(normalizeMid<0||normalizeMid>normalizeEnd)||normalizeEnd<0&&(normalizeMid>0||normalizeMid<normalizeEnd))&&(angleRange=angleRange-Math.sign(angleRange)*2*Math.PI);for(let i3=1;i3<numSegments;i3++){let t6=i3/numSegments,angle=startAngle+angleRange*t6;points.push({x:center2.x+radius*Math.cos(angle),y:center2.y+radius*Math.sin(angle)})}return points.push(end),points}calculateArcCenter(p12,p22,p32){let ax2=p12.x,ay2=p12.y,bx2=p22.x,by2=p22.y,cx2=p32.x,cy2=p32.y,d2=2*(ax2*(by2-cy2)+bx2*(cy2-ay2)+cx2*(ay2-by2));if(Math.abs(d2)<1e-10)return{center:null,radius:0};let ux2=((ax2*ax2+ay2*ay2)*(by2-cy2)+(bx2*bx2+by2*by2)*(cy2-ay2)+(cx2*cx2+cy2*cy2)*(ay2-by2))/d2,uy2=((ax2*ax2+ay2*ay2)*(cx2-bx2)+(bx2*bx2+by2*by2)*(ax2-cx2)+(cx2*cx2+cy2*cy2)*(bx2-ax2))/d2,radius=Math.sqrt((ax2-ux2)**2+(ay2-uy2)**2);return{center:{x:ux2,y:uy2},radius}}},CollectSourceTracesStage=class extends ConverterStage{constructor(){super(...arguments);__publicField(this,"processedNets",new Set)}step(){if(!this.ctx.kicadPcb||!this.ctx.netNumToName)return this.finished=!0,!1;let netToPads=new Map,footprints=this.ctx.kicadPcb.footprints||[],footprintArray=Array.isArray(footprints)?footprints:[footprints];for(let footprint of footprintArray)this.processFootprintPads(footprint,netToPads);for(let[netNum,pads]of netToPads.entries())pads.length<2||this.processedNets.has(netNum)||(this.createSourceTrace(netNum,pads),this.processedNets.add(netNum));return this.finished=!0,!1}processFootprintPads(footprint,netToPads){let footprintUuid=footprint.uuid?.value||footprint.tstamp?.value;if(!footprintUuid)return;let componentId=this.ctx.footprintUuidToComponentId?.get(footprintUuid);if(!componentId)return;let pads=footprint.fpPads||[],padArray=Array.isArray(pads)?pads:[pads];for(let pad2 of padArray){let padNumber=pad2.number?.toString();if(!padNumber)continue;let netNum=this.getPadNet(pad2);if(netNum==null||netNum===0)continue;let sourcePortId=this.getOrCreateSourcePort(componentId,padNumber,footprint);netToPads.has(netNum)||netToPads.set(netNum,[]),netToPads.get(netNum).push({componentId,padNumber,sourcePortId})}}getPadNet(pad2){let net=pad2._sxNet||pad2.net;return net?typeof net=="number"?net:typeof net=="object"?net._id??net.number??net.ordinal??null:null:null}getOrCreateSourcePort(componentId,padNumber,footprint){let sourcePortId=`${componentId}_port_${padNumber}`;if(!this.ctx.db.source_port.list().find(sp2=>sp2.source_port_id===sourcePortId)){let reference=this.getFootprintReference(footprint);this.ctx.db.source_port.insert({source_port_id:sourcePortId,source_component_id:componentId,name:`${reference||"U"}.${padNumber}`,pin_number:parseInt(padNumber,10)||void 0})}return sourcePortId}getFootprintReference(footprint){let properties=footprint.properties||[],propertyArray=Array.isArray(properties)?properties:[properties];for(let property of propertyArray)if(property.key==="Reference"||property.name==="Reference")return property.value;let textItems=footprint.fpTexts||[],textArray=Array.isArray(textItems)?textItems:[textItems];for(let text of textArray)if(text.type==="reference")return text.text}createSourceTrace(netNum,pads){let netName=this.ctx.netNumToName?.get(netNum)||`Net-${netNum}`;this.ctx.db.source_trace.insert({connected_source_port_ids:pads.map(p4=>p4.sourcePortId),connected_source_net_ids:[],display_name:netName}),this.ctx.stats&&(this.ctx.stats.traces=(this.ctx.stats.traces||0)+1)}},KicadToCircuitJsonConverter=class{constructor(){__publicField(this,"fsMap",{});__publicField(this,"ctx");__publicField(this,"currentStageIndex",0);__publicField(this,"pipeline")}get currentStage(){return this.pipeline?.[this.currentStageIndex]}addFile(filePath,content){this.fsMap[filePath]=content}_findFileWithExtension(extension){let filesWithExtension=Object.keys(this.fsMap).filter(key=>key.endsWith(extension));if(filesWithExtension.length>1)throw new Error(`Expected 0 or 1 file with extension ${extension}, got ${filesWithExtension.length}. Files: ${filesWithExtension.join(", ")}`);return filesWithExtension[0]??null}initializePipeline(){let pcbFile=this._findFileWithExtension(".kicad_pcb"),schFile=this._findFileWithExtension(".kicad_sch");this.ctx={db:cju_default([]),kicadPcb:pcbFile?parseKicadPcb(this.fsMap[pcbFile]):void 0,kicadSch:schFile?parseKicadSch(this.fsMap[schFile]):void 0,warnings:[],stats:{}},this.pipeline=[],this.ctx.kicadSch&&this.pipeline.push(new InitializeSchematicContextStage(this.ctx),new CollectLibrarySymbolsStage(this.ctx),new CollectSchematicTracesStage(this.ctx)),this.ctx.kicadPcb&&this.pipeline.push(new InitializePcbContextStage(this.ctx),new CollectNetsStage(this.ctx),new CollectFootprintsStage(this.ctx),new CollectTracesStage(this.ctx),new CollectViasStage(this.ctx),new CollectZonesStage(this.ctx),new CollectGraphicsStage(this.ctx),new CollectSourceTracesStage(this.ctx))}step(){return this.pipeline||this.initializePipeline(),this.currentStage?((!this.currentStage.step()||this.currentStage.finished)&&this.currentStageIndex++,this.currentStageIndex<(this.pipeline?.length||0)):!1}runUntilFinished(){this.pipeline||this.initializePipeline();for(let stage of this.pipeline||[])stage.runUntilFinished()}getOutput(){this.ctx||(this.initializePipeline(),this.runUntilFinished());let elements=[],tableNames=["source_component","source_port","source_trace","schematic_component","schematic_port","schematic_trace","schematic_net_label","pcb_component","pcb_port","pcb_smtpad","pcb_plated_hole","pcb_hole","pcb_trace","pcb_via","pcb_copper_pour","pcb_board","pcb_silkscreen_text","pcb_silkscreen_path"];for(let tableName of tableNames){let table=this.ctx.db[tableName];if(table&&typeof table.list=="function"){let items=table.list();items&&Array.isArray(items)&&elements.push(...items)}}return elements}getOutputString(){return JSON.stringify(this.getOutput(),null,2)}getWarnings(){return this.ctx?.warnings||[]}getStats(){return this.ctx?.stats||{}}};var debug13=(0,import_debug22.default)("tsci:eval:import-local-file"),importLocalFile=async(importName,ctx,depth=0)=>{debug13("importLocalFile called with:",{importName});let{fsMap,preSuppliedImports,importStack,currentlyImporting}=ctx,fsPath=resolveFilePathOrThrow(importName,fsMap,void 0,{tsConfig:ctx.tsConfig});if(debug13("fsPath:",fsPath),currentlyImporting.has(fsPath)){let cycleStartIndex=importStack.indexOf(fsPath),cyclePath=cycleStartIndex>=0?importStack.slice(cycleStartIndex).concat(fsPath):[...importStack,fsPath];throw new Error(`Circular dependency detected while importing "${fsPath}". The following import chain forms a cycle:
|
|
807
807
|
|
|
808
|
-
${cyclePath.join(" -> ")}`)}if(!ctx.fsMap[fsPath])throw debug13("fsPath not found in fsMap:",fsPath),new Error(`File "${fsPath}" not found`);let fileContent=fsMap[fsPath];debug13("fileContent:",fileContent?.slice(0,100)),currentlyImporting.add(fsPath),importStack.push(fsPath);try{if(fsPath.endsWith(".json")){let jsonData=JSON.parse(fileContent);preSuppliedImports[fsPath]={__esModule:!0,default:jsonData}}else if(fsPath.endsWith(".kicad_pcb")){let converter=new KicadToCircuitJsonConverter;converter.addFile(fsPath,fileContent),converter.runUntilFinished();let circuitJson=converter.getOutput();preSuppliedImports[fsPath]={__esModule:!0,circuitJson}}else if(isStaticAssetPath2(fsPath)){let staticUrl;if(fileContent==="__STATIC_ASSET__")staticUrl=`${ctx.circuit.platform?.projectBaseUrl??""}/${fsPath.startsWith("./")?fsPath.slice(2):fsPath}`;else if(fileContent.startsWith("blob:"))staticUrl=`${fileContent}#ext=${fsPath.split(".").pop()}`;else{let blob=new Blob([fileContent],{type:fsPath.endsWith(".kicad_mod")?"text/plain":"application/octet-stream"});staticUrl=URL.createObjectURL(blob)}preSuppliedImports[fsPath]={__esModule:!0,default:staticUrl}}else if(fsPath.endsWith(".tsx")||fsPath.endsWith(".ts")){let importNames=getImportsFromCode(fileContent);for(let importName2 of importNames)preSuppliedImports[importName2]||await importEvalPath(importName2,ctx,depth+1,{cwd:dirname(fsPath)});try{let transformedCode=transformWithSucrase(fileContent,fsPath);debug13("evalCompiledJs called with:",{code:transformedCode.slice(0,100),dirname:dirname(fsPath)});let importRunResult=evalCompiledJs(transformedCode,preSuppliedImports,dirname(fsPath));debug13("importRunResult:",{fsPath,importRunResult}),preSuppliedImports[fsPath]=importRunResult.exports}catch(error){throw new Error(`Eval compiled js error for "${importName}": ${error.message}`)}}else if(fsPath.endsWith(".js")||fsPath.endsWith(".mjs")){let importNames=getImportsFromCode(fileContent);for(let importName2 of importNames)preSuppliedImports[importName2]||await importEvalPath(importName2,ctx,depth+1,{cwd:dirname(fsPath)});preSuppliedImports[fsPath]=evalCompiledJs(transformWithSucrase(fileContent,fsPath),preSuppliedImports,dirname(fsPath)).exports}else throw new Error(`Unsupported file extension "${fsPath.split(".").pop()}" for "${fsPath}"`)}finally{importStack.pop(),currentlyImporting.delete(fsPath)}};async function importSnippet(importName,ctx,depth=0){let{preSuppliedImports}=ctx,fullSnippetName=importName.replace("@tsci/","").replace(".","/"),fetchOptions={};ctx.tscircuitSessionToken&&(fetchOptions.headers={Authorization:`Bearer ${ctx.tscircuitSessionToken}`});let{cjs,error}=await globalThis.fetch(`${ctx.cjsRegistryUrl}/${fullSnippetName}`,fetchOptions).then(async res2=>({cjs:await res2.text(),error:null})).catch(e4=>({error:e4,cjs:null}));if(error){console.error("Error fetching import",importName,error);return}let importNames=getImportsFromCode(cjs);for(let subImportName of importNames)preSuppliedImports[subImportName]
|
|
808
|
+
${cyclePath.join(" -> ")}`)}if(!ctx.fsMap[fsPath])throw debug13("fsPath not found in fsMap:",fsPath),new Error(`File "${fsPath}" not found`);let fileContent=fsMap[fsPath];debug13("fileContent:",fileContent?.slice(0,100)),currentlyImporting.add(fsPath),importStack.push(fsPath);try{if(fsPath.endsWith(".json")){let jsonData=JSON.parse(fileContent);preSuppliedImports[fsPath]={__esModule:!0,default:jsonData}}else if(fsPath.endsWith(".kicad_pcb")){let converter=new KicadToCircuitJsonConverter;converter.addFile(fsPath,fileContent),converter.runUntilFinished();let circuitJson=converter.getOutput();preSuppliedImports[fsPath]={__esModule:!0,circuitJson}}else if(isStaticAssetPath2(fsPath)){let staticUrl;if(fileContent==="__STATIC_ASSET__")staticUrl=`${ctx.circuit.platform?.projectBaseUrl??""}/${fsPath.startsWith("./")?fsPath.slice(2):fsPath}`;else if(fileContent.startsWith("blob:"))staticUrl=`${fileContent}#ext=${fsPath.split(".").pop()}`;else{let blob=new Blob([fileContent],{type:fsPath.endsWith(".kicad_mod")?"text/plain":"application/octet-stream"});staticUrl=URL.createObjectURL(blob)}preSuppliedImports[fsPath]={__esModule:!0,default:staticUrl}}else if(fsPath.endsWith(".tsx")||fsPath.endsWith(".ts")){let importNames=getImportsFromCode(fileContent);for(let importName2 of importNames)preSuppliedImports[importName2]||await importEvalPath(importName2,ctx,depth+1,{cwd:dirname(fsPath)});try{let transformedCode=transformWithSucrase(fileContent,fsPath);debug13("evalCompiledJs called with:",{code:transformedCode.slice(0,100),dirname:dirname(fsPath)});let importRunResult=evalCompiledJs(transformedCode,preSuppliedImports,dirname(fsPath));debug13("importRunResult:",{fsPath,importRunResult}),preSuppliedImports[fsPath]=importRunResult.exports}catch(error){throw new Error(`Eval compiled js error for "${importName}": ${error.message}`)}}else if(fsPath.endsWith(".js")||fsPath.endsWith(".mjs")){let importNames=getImportsFromCode(fileContent);for(let importName2 of importNames)preSuppliedImports[importName2]||await importEvalPath(importName2,ctx,depth+1,{cwd:dirname(fsPath)});preSuppliedImports[fsPath]=evalCompiledJs(transformWithSucrase(fileContent,fsPath),preSuppliedImports,dirname(fsPath)).exports}else throw new Error(`Unsupported file extension "${fsPath.split(".").pop()}" for "${fsPath}"`)}finally{importStack.pop(),currentlyImporting.delete(fsPath)}};async function importSnippet(importName,ctx,depth=0){let{preSuppliedImports}=ctx,fullSnippetName=importName.replace("@tsci/","").replace(".","/"),fetchOptions={};ctx.tscircuitSessionToken&&(fetchOptions.headers={Authorization:`Bearer ${ctx.tscircuitSessionToken}`});let{cjs,error}=await globalThis.fetch(`${ctx.cjsRegistryUrl}/${fullSnippetName}`,fetchOptions).then(async res2=>({cjs:await res2.text(),error:null})).catch(e4=>({error:e4,cjs:null}));if(error){console.error("Error fetching import",importName,error);return}let importNames=getImportsFromCode(cjs);for(let subImportName of importNames)if(!preSuppliedImports[subImportName])if(subImportName.startsWith("./")&&isStaticAssetPath2(subImportName)){let assetPath=subImportName.slice(2),assetUrl=`${ctx.cjsRegistryUrl}/${importName}/${assetPath}`;preSuppliedImports[subImportName]={__esModule:!0,default:assetUrl}}else await importEvalPath(subImportName,ctx,depth+1);try{preSuppliedImports[importName]=evalCompiledJs(cjs,preSuppliedImports).exports}catch(e4){console.error("Error importing snippet",e4)}}var import_debug23=__toESM(require_browser(),1);function extractBasePackageName(importName){let basePackageName=importName;if(importName.startsWith("@")){let parts=importName.split("/");basePackageName=parts.length>=2?`${parts[0]}/${parts[1]}`:importName}else basePackageName=importName.split("/")[0];return basePackageName}function isPackageDeclaredInPackageJson(packageName,fsMap){let packageJsonContent=fsMap["package.json"];if(!packageJsonContent)return!0;try{let packageJson=JSON.parse(packageJsonContent),dependencies=packageJson.dependencies||{},devDependencies=packageJson.devDependencies||{},peerDependencies=packageJson.peerDependencies||{},basePackageName=extractBasePackageName(packageName);return basePackageName in dependencies||basePackageName in devDependencies||basePackageName in peerDependencies}catch{return!0}}function getNodeModuleDirectory(packageName,fsMap){let nodeModulePath=`node_modules/${extractBasePackageName(packageName)}`;return Object.keys(fsMap).some(path=>path.startsWith(nodeModulePath+"/")||path===nodeModulePath)?nodeModulePath:null}function getPackageJsonEntrypoint(packageName,fsMap){let packageJsonPath=`node_modules/${extractBasePackageName(packageName)}/package.json`,packageJsonContent=fsMap[packageJsonPath];if(!packageJsonContent)return null;try{let packageJson=JSON.parse(packageJsonContent);return packageJson.main||packageJson.module||null}catch{return null}}function isTypeScriptEntrypoint(entrypoint){return entrypoint?entrypoint.endsWith(".ts")||entrypoint.endsWith(".tsx"):!1}function isDistDirEmpty(packageName,fsMap){let distPath=`node_modules/${extractBasePackageName(packageName)}/dist`;return!Object.keys(fsMap).some(path=>path.startsWith(distPath+"/"))}var debug14=(0,import_debug23.default)("tsci:eval:import-node-module"),importNodeModule=async(importName,ctx,depth=0)=>{let{preSuppliedImports,fsMap}=ctx;if(preSuppliedImports[importName])return;let hasPackageJson=!!fsMap["package.json"];if(hasPackageJson&&!isPackageDeclaredInPackageJson(importName,fsMap))throw new Error(`Node module imported but not in package.json "${importName}"
|
|
809
809
|
|
|
810
810
|
${ctx.logger.stringifyLogs()}`);let resolvedNodeModulePath=resolveNodeModule(importName,ctx.fsMap,"");if(hasPackageJson&&resolvedNodeModulePath){if(!getNodeModuleDirectory(importName,fsMap))throw new Error(`Node module "${importName}" has no files in the node_modules directory
|
|
811
811
|
|