{"version":3,"sources":["../node_modules/commander/lib/error.js","../node_modules/commander/lib/argument.js","../node_modules/commander/lib/help.js","../node_modules/commander/lib/option.js","../node_modules/commander/lib/suggestSimilar.js","../node_modules/commander/lib/command.js","../node_modules/commander/index.js","../node_modules/commander/esm.mjs","../lib/websafe/get-model-cdn-url.ts","../lib/websafe/fetch-easyeda-json.ts","../cli/main.ts","../package.json","../node_modules/format-si-unit/get-si-prefix-multiplier.ts","../node_modules/format-si-unit/parse-and-convert-si-unit.ts","../node_modules/format-si-unit/parse-si-unit.ts","../node_modules/format-si-unit/index.ts","../node_modules/circuit-json/src/units/index.ts","../node_modules/circuit-json/src/common/point.ts","../node_modules/circuit-json/src/utils/expect-types-match.ts","../node_modules/circuit-json/src/common/point3.ts","../node_modules/circuit-json/src/common/size.ts","../node_modules/circuit-json/src/common/getZodPrefixedIdWithDefault.ts","../node_modules/circuit-json/src/common/NinePointAnchor.ts","../node_modules/circuit-json/src/common/PcbRenderLayer.ts","../node_modules/circuit-json/src/common/asset.ts","../node_modules/circuit-json/src/common/kicadFootprintMetadata.ts","../node_modules/circuit-json/src/common/kicadSymbolMetadata.ts","../node_modules/circuit-json/src/base_circuit_json_error.ts","../node_modules/circuit-json/src/source/source_simple_capacitor.ts","../node_modules/circuit-json/src/pcb/properties/supplier_name.ts","../node_modules/circuit-json/src/source/base/source_component_base.ts","../node_modules/circuit-json/src/source/source_simple_resistor.ts","../node_modules/circuit-json/src/source/source_simple_diode.ts","../node_modules/circuit-json/src/source/source_simple_fiducial.ts","../node_modules/circuit-json/src/source/source_simple_led.ts","../node_modules/circuit-json/src/source/source_simple_ground.ts","../node_modules/circuit-json/src/source/source_simple_chip.ts","../node_modules/circuit-json/src/source/source_simple_power_source.ts","../node_modules/circuit-json/src/source/source_simple_current_source.ts","../node_modules/circuit-json/src/source/source_simple_fuse.ts","../node_modules/circuit-json/src/source/source_simple_ammeter.ts","../node_modules/circuit-json/src/source/properties/source_pin_attributes.ts","../node_modules/circuit-json/src/source/any_source_component.ts","../node_modules/circuit-json/src/source/source_simple_battery.ts","../node_modules/circuit-json/src/source/source_simple_inductor.ts","../node_modules/circuit-json/src/source/source_simple_push_button.ts","../node_modules/circuit-json/src/source/source_simple_potentiometer.ts","../node_modules/circuit-json/src/source/source_simple_crystal.ts","../node_modules/circuit-json/src/source/source_simple_pin_header.ts","../node_modules/circuit-json/src/source/source_simple_connector.ts","../node_modules/circuit-json/src/source/source_simple_pinout.ts","../node_modules/circuit-json/src/source/source_simple_resonator.ts","../node_modules/circuit-json/src/source/source_simple_transistor.ts","../node_modules/circuit-json/src/source/source_simple_test_point.ts","../node_modules/circuit-json/src/source/source_simple_mosfet.ts","../node_modules/circuit-json/src/source/source_simple_op_amp.ts","../node_modules/circuit-json/src/source/source_simple_switch.ts","../node_modules/circuit-json/src/source/source_project_metadata.ts","../node_modules/circuit-json/src/source/source_missing_property_error.ts","../node_modules/circuit-json/src/source/source_failed_to_create_component_error.ts","../node_modules/circuit-json/src/source/source_invalid_component_property_error.ts","../node_modules/circuit-json/src/source/source_trace_not_connected_error.ts","../node_modules/circuit-json/src/source/source_property_ignored_warning.ts","../node_modules/circuit-json/src/source/source_pin_missing_trace_warning.ts","../node_modules/circuit-json/src/source/source_missing_manufacturer_part_number_warning.ts","../node_modules/circuit-json/src/source/source_refdes_convention_warning.ts","../node_modules/circuit-json/src/source/source_simple_voltage_probe.ts","../node_modules/circuit-json/src/source/source_interconnect.ts","../node_modules/circuit-json/src/source/source_i2c_misconfigured_error.ts","../node_modules/circuit-json/src/source/source_component_misconfigured_error.ts","../node_modules/circuit-json/src/source/source_simple_voltage_source.ts","../node_modules/circuit-json/src/source/source_port.ts","../node_modules/circuit-json/src/source/source_component_internal_connection.ts","../node_modules/circuit-json/src/source/source_trace.ts","../node_modules/circuit-json/src/source/source_group.ts","../node_modules/circuit-json/src/source/source_net.ts","../node_modules/circuit-json/src/source/source_board.ts","../node_modules/circuit-json/src/source/source_ambiguous_port_reference.ts","../node_modules/circuit-json/src/source/source_pcb_ground_plane.ts","../node_modules/circuit-json/src/source/source_manually_placed_via.ts","../node_modules/circuit-json/src/pcb/properties/layer_ref.ts","../node_modules/circuit-json/src/source/source_unnamed_trace_warning.ts","../node_modules/circuit-json/src/source/source_no_power_pin_defined_warning.ts","../node_modules/circuit-json/src/source/source_no_ground_pin_defined_warning.ts","../node_modules/circuit-json/src/source/source_component_pins_underspecified_warning.ts","../node_modules/circuit-json/src/source/source_pin_must_be_connected_error.ts","../node_modules/circuit-json/src/source/unknown_error_finding_part.ts","../node_modules/circuit-json/src/source/source_part_not_found_warning.ts","../node_modules/circuit-json/src/schematic/schematic_box.ts","../node_modules/circuit-json/src/schematic/schematic_path.ts","../node_modules/circuit-json/src/schematic/schematic_component.ts","../node_modules/circuit-json/src/schematic/schematic_symbol.ts","../node_modules/circuit-json/src/schematic/schematic_line.ts","../node_modules/circuit-json/src/schematic/schematic_rect.ts","../node_modules/circuit-json/src/schematic/schematic_circle.ts","../node_modules/circuit-json/src/schematic/schematic_arc.ts","../node_modules/circuit-json/src/schematic/schematic_trace.ts","../node_modules/circuit-json/src/schematic/schematic_text.ts","../node_modules/circuit-json/src/common/FivePointAnchor.ts","../node_modules/circuit-json/src/schematic/schematic_port.ts","../node_modules/circuit-json/src/schematic/schematic_net_label.ts","../node_modules/circuit-json/src/schematic/schematic_error.ts","../node_modules/circuit-json/src/schematic/schematic_layout_error.ts","../node_modules/circuit-json/src/schematic/schematic_debug_object.ts","../node_modules/circuit-json/src/schematic/schematic_voltage_probe.ts","../node_modules/circuit-json/src/schematic/schematic_manual_edit_conflict_warning.ts","../node_modules/circuit-json/src/schematic/schematic_group.ts","../node_modules/circuit-json/src/schematic/schematic_table.ts","../node_modules/circuit-json/src/schematic/schematic_table_cell.ts","../node_modules/circuit-json/src/schematic/schematic_sheet.ts","../node_modules/circuit-json/src/pcb/properties/brep.ts","../node_modules/circuit-json/src/pcb/properties/pcb_route_hints.ts","../node_modules/circuit-json/src/pcb/properties/route_hint_point.ts","../node_modules/circuit-json/src/pcb/properties/manufacturing_drc_properties.ts","../node_modules/circuit-json/src/pcb/pcb_component.ts","../node_modules/circuit-json/src/pcb/pcb_hole.ts","../node_modules/circuit-json/src/pcb/pcb_plated_hole.ts","../node_modules/circuit-json/src/pcb/pcb_port.ts","../node_modules/circuit-json/src/pcb/pcb_smtpad.ts","../node_modules/circuit-json/src/pcb/pcb_solder_paste.ts","../node_modules/circuit-json/src/pcb/pcb_text.ts","../node_modules/circuit-json/src/pcb/pcb_trace.ts","../node_modules/circuit-json/src/pcb/pcb_trace_warning.ts","../node_modules/circuit-json/src/pcb/pcb_trace_error.ts","../node_modules/circuit-json/src/pcb/pcb_trace_missing_error.ts","../node_modules/circuit-json/src/pcb/pcb_port_not_matched_error.ts","../node_modules/circuit-json/src/pcb/pcb_port_not_connected_error.ts","../node_modules/circuit-json/src/pcb/pcb_net.ts","../node_modules/circuit-json/src/pcb/pcb_via.ts","../node_modules/circuit-json/src/pcb/pcb_board.ts","../node_modules/circuit-json/src/pcb/pcb_panel.ts","../node_modules/circuit-json/src/pcb/pcb_placement_error.ts","../node_modules/circuit-json/src/pcb/pcb_panelization_placement_error.ts","../node_modules/circuit-json/src/pcb/pcb_trace_hint.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_line.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_path.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_text.ts","../node_modules/circuit-json/src/pcb/pcb_copper_text.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_rect.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_circle.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_oval.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_graphic.ts","../node_modules/circuit-json/src/pcb/pcb_silkscreen_pill.ts","../node_modules/circuit-json/src/pcb/pcb_fabrication_note_text.ts","../node_modules/circuit-json/src/pcb/pcb_fabrication_note_path.ts","../node_modules/circuit-json/src/pcb/pcb_fabrication_note_rect.ts","../node_modules/circuit-json/src/pcb/pcb_fabrication_note_dimension.ts","../node_modules/circuit-json/src/pcb/pcb_note_text.ts","../node_modules/circuit-json/src/pcb/pcb_note_rect.ts","../node_modules/circuit-json/src/pcb/pcb_note_path.ts","../node_modules/circuit-json/src/pcb/pcb_note_line.ts","../node_modules/circuit-json/src/pcb/pcb_note_dimension.ts","../node_modules/circuit-json/src/pcb/pcb_footprint_overlap_error.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_overlap_error.ts","../node_modules/circuit-json/src/pcb/pcb_keepout.ts","../node_modules/circuit-json/src/pcb/pcb_cutout.ts","../node_modules/circuit-json/src/pcb/pcb_missing_footprint_error.ts","../node_modules/circuit-json/src/pcb/external_footprint_load_error.ts","../node_modules/circuit-json/src/pcb/circuit_json_footprint_load_error.ts","../node_modules/circuit-json/src/pcb/pcb_group.ts","../node_modules/circuit-json/src/pcb/pcb_autorouting_error.ts","../node_modules/circuit-json/src/pcb/pcb_manual_edit_conflict_warning.ts","../node_modules/circuit-json/src/pcb/pcb_connector_not_in_accessible_orientation_warning.ts","../node_modules/circuit-json/src/pcb/supplier_footprint_mismatch_warning.ts","../node_modules/circuit-json/src/pcb/pcb_breakout_point.ts","../node_modules/circuit-json/src/pcb/pcb_ground_plane.ts","../node_modules/circuit-json/src/pcb/pcb_ground_plane_region.ts","../node_modules/circuit-json/src/pcb/pcb_thermal_spoke.ts","../node_modules/circuit-json/src/pcb/pcb_copper_pour.ts","../node_modules/circuit-json/src/pcb/pcb_component_outside_board_error.ts","../node_modules/circuit-json/src/pcb/pcb_component_not_on_board_edge_error.ts","../node_modules/circuit-json/src/pcb/pcb_component_invalid_layer_error.ts","../node_modules/circuit-json/src/pcb/pcb_via_clearance_error.ts","../node_modules/circuit-json/src/pcb/pcb_via_trace_clearance_error.ts","../node_modules/circuit-json/src/pcb/pcb_pad_pad_clearance_error.ts","../node_modules/circuit-json/src/pcb/pcb_pad_trace_clearance_error.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_rect.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_outline.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_polygon.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_circle.ts","../node_modules/circuit-json/src/pcb/pcb_courtyard_pill.ts","../node_modules/circuit-json/src/cad/cad_component.ts","../node_modules/circuit-json/src/cad/cad_model_conventions.ts","../node_modules/circuit-json/src/simulation/simulation_voltage_source.ts","../node_modules/circuit-json/src/simulation/simulation_current_source.ts","../node_modules/circuit-json/src/simulation/simulation_experiment.ts","../node_modules/circuit-json/src/simulation/simulation_transient_voltage_graph.ts","../node_modules/circuit-json/src/simulation/simulation_transient_current_graph.ts","../node_modules/circuit-json/src/simulation/simulation_switch.ts","../node_modules/circuit-json/src/simulation/simulation_voltage_probe.ts","../node_modules/circuit-json/src/simulation/simulation_current_probe.ts","../node_modules/circuit-json/src/simulation/simulation_unknown_experiment_error.ts","../node_modules/circuit-json/src/simulation/simulation_op_amp.ts","../node_modules/circuit-json/src/simulation/simulation_spice_subcircuit.ts","../node_modules/circuit-json/src/simulation/simulation_oscilloscope_trace.ts","../node_modules/circuit-json/src/any_circuit_element.ts","../node_modules/transformation-matrix/src/applyToPoint.js","../node_modules/transformation-matrix/src/utils.js","../node_modules/transformation-matrix/src/translate.js","../node_modules/transformation-matrix/src/transform.js","../node_modules/transformation-matrix/src/rotate.js","../node_modules/transformation-matrix/src/scale.js","../node_modules/transformation-matrix/src/skew.js","../node_modules/transformation-matrix/src/fromTransformAttribute.autogenerated.js","../node_modules/transformation-matrix/src/decompose.js","../node_modules/@tscircuit/circuit-json-util/lib/cju.ts","../node_modules/@tscircuit/circuit-json-util/lib/subtree.ts","../node_modules/@tscircuit/circuit-json-util/lib/cju-indexed.ts","../node_modules/@tscircuit/circuit-json-util/lib/transform-soup-elements.ts","../node_modules/@tscircuit/circuit-json-util/lib/direction-to-vec.ts","../node_modules/@tscircuit/circuit-json-util/lib/apply-selector.ts","../node_modules/@tscircuit/circuit-json-util/lib/convert-abbreviation-to-soup-element-type.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-element-id.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-element-by-id.ts","../node_modules/@tscircuit/circuit-json-util/lib/readable-name-functions/get-readable-name-for-pcb-trace.ts","../node_modules/@tscircuit/circuit-json-util/lib/readable-name-functions/get-readable-name-for-pcb-port.ts","../node_modules/@tscircuit/circuit-json-util/lib/readable-name-functions/get-readable-name-for-pcb-smtpad.ts","../node_modules/@tscircuit/circuit-json-util/lib/readable-name-functions/get-readable-name-for-element.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-bounds-of-pcb-elements.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-board-bounds.ts","../node_modules/@tscircuit/circuit-json-util/lib/utils/string-hash.ts","../node_modules/@tscircuit/circuit-json-util/lib/utils/get-layout-debug-object.ts","../node_modules/@tscircuit/circuit-json-util/lib/utils/is-truthy.ts","../node_modules/@tscircuit/circuit-json-util/lib/find-bounds-and-center.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-primary-id.ts","../node_modules/@tscircuit/circuit-json-util/lib/reposition-pcb-component.ts","../node_modules/@tscircuit/circuit-json-util/lib/reposition-pcb-group.ts","../node_modules/@tscircuit/circuit-json-util/lib/reposition-schematic-component.ts","../node_modules/@tscircuit/circuit-json-util/lib/reposition-schematic-group.ts","../node_modules/@tscircuit/circuit-json-util/lib/getCircuitJsonTree.ts","../node_modules/@tscircuit/circuit-json-util/lib/getStringFromCircuitJsonTree.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-minimum-flex-container.ts","../node_modules/@tscircuit/circuit-json-util/lib/get-element-render-layers.ts","../node_modules/@tscircuit/circuit-json-util/lib/shape-distances/geometry.ts","../node_modules/@tscircuit/circuit-json-util/lib/shape-distances/decompose-copper-into-shapes.ts","../node_modules/@tscircuit/circuit-json-util/lib/shape-distances/distance-between-shapes.ts","../node_modules/@tscircuit/circuit-json-util/lib/compute-gap-between-copper.ts","../node_modules/@tscircuit/circuit-json-util/lib/shape-distances/decompose-clearance-into-shapes.ts","../node_modules/@tscircuit/circuit-json-util/lib/compute-clearance-between-elements.ts","../node_modules/@tscircuit/circuit-json-util/lib/categorize-error-or-warning.ts","../node_modules/@tscircuit/mm/index.ts","../lib/math/arc-utils.ts","../lib/utils/easyeda-unit-to-mm.ts","../node_modules/@tscircuit/math-utils/src/get-bounds-center.ts","../node_modules/@tscircuit/math-utils/src/get-bounds-from-points.ts","../lib/websafe/get-easyeda-cad-placement-helpers.ts","../lib/utils/normalize-pin-labels.ts","../lib/utils/normalize-symbol-name.ts","../lib/constants.ts","../lib/convert-easyeda-json-to-tscircuit-soup-json.ts","../lib/schemas/easy-eda-json-schema.ts","../lib/schemas/package-detail-shape-schema.ts","../lib/schemas/single-letter-shape-schema.ts","../lib/utils/normalize-manufacturer-part-number.ts","../lib/websafe/get-easyeda-cad-model-placement.ts","../lib/websafe/generate-footprint-tsx.ts","../lib/websafe/convert-to-typescript-component/generate-typescript-component.ts","../lib/websafe/convert-to-typescript-component/category-value-contains-diode.ts","../lib/websafe/convert-to-typescript-component/is-diode-category-component.ts","../lib/websafe/convert-to-typescript-component/category-value-contains-led.ts","../lib/websafe/convert-to-typescript-component/is-led-category-component.ts","../lib/websafe/convert-to-typescript-component/category-value-contains-pushbutton.ts","../lib/websafe/convert-to-typescript-component/is-pushbutton-category-component.ts","../lib/websafe/convert-to-typescript-component/category-value-contains-switch.ts","../lib/websafe/convert-to-typescript-component/is-switch-category-component.ts","../lib/websafe/convert-to-typescript-component/generate-symbol-tsx.ts","../lib/websafe/convert-to-typescript-component/index.tsx","../lib/convert-easyeda-json-to-various-formats.ts"],"sourcesContent":["/**\n * CommanderError class\n */\nclass CommanderError extends Error {\n  /**\n   * Constructs the CommanderError class\n   * @param {number} exitCode suggested exit code which could be used with process.exit\n   * @param {string} code an id string representing the error\n   * @param {string} message human-readable description of the error\n   */\n  constructor(exitCode, code, message) {\n    super(message);\n    // properly capture stack trace in Node.js\n    Error.captureStackTrace(this, this.constructor);\n    this.name = this.constructor.name;\n    this.code = code;\n    this.exitCode = exitCode;\n    this.nestedError = undefined;\n  }\n}\n\n/**\n * InvalidArgumentError class\n */\nclass InvalidArgumentError extends CommanderError {\n  /**\n   * Constructs the InvalidArgumentError class\n   * @param {string} [message] explanation of why argument is invalid\n   */\n  constructor(message) {\n    super(1, 'commander.invalidArgument', message);\n    // properly capture stack trace in Node.js\n    Error.captureStackTrace(this, this.constructor);\n    this.name = this.constructor.name;\n  }\n}\n\nexports.CommanderError = CommanderError;\nexports.InvalidArgumentError = InvalidArgumentError;\n","const { InvalidArgumentError } = require('./error.js');\n\nclass Argument {\n  /**\n   * Initialize a new command argument with the given name and description.\n   * The default is that the argument is required, and you can explicitly\n   * indicate this with <> around the name. Put [] around the name for an optional argument.\n   *\n   * @param {string} name\n   * @param {string} [description]\n   */\n\n  constructor(name, description) {\n    this.description = description || '';\n    this.variadic = false;\n    this.parseArg = undefined;\n    this.defaultValue = undefined;\n    this.defaultValueDescription = undefined;\n    this.argChoices = undefined;\n\n    switch (name[0]) {\n      case '<': // e.g. <required>\n        this.required = true;\n        this._name = name.slice(1, -1);\n        break;\n      case '[': // e.g. [optional]\n        this.required = false;\n        this._name = name.slice(1, -1);\n        break;\n      default:\n        this.required = true;\n        this._name = name;\n        break;\n    }\n\n    if (this._name.length > 3 && this._name.slice(-3) === '...') {\n      this.variadic = true;\n      this._name = this._name.slice(0, -3);\n    }\n  }\n\n  /**\n   * Return argument name.\n   *\n   * @return {string}\n   */\n\n  name() {\n    return this._name;\n  }\n\n  /**\n   * @package\n   */\n\n  _concatValue(value, previous) {\n    if (previous === this.defaultValue || !Array.isArray(previous)) {\n      return [value];\n    }\n\n    return previous.concat(value);\n  }\n\n  /**\n   * Set the default value, and optionally supply the description to be displayed in the help.\n   *\n   * @param {*} value\n   * @param {string} [description]\n   * @return {Argument}\n   */\n\n  default(value, description) {\n    this.defaultValue = value;\n    this.defaultValueDescription = description;\n    return this;\n  }\n\n  /**\n   * Set the custom handler for processing CLI command arguments into argument values.\n   *\n   * @param {Function} [fn]\n   * @return {Argument}\n   */\n\n  argParser(fn) {\n    this.parseArg = fn;\n    return this;\n  }\n\n  /**\n   * Only allow argument value to be one of choices.\n   *\n   * @param {string[]} values\n   * @return {Argument}\n   */\n\n  choices(values) {\n    this.argChoices = values.slice();\n    this.parseArg = (arg, previous) => {\n      if (!this.argChoices.includes(arg)) {\n        throw new InvalidArgumentError(\n          `Allowed choices are ${this.argChoices.join(', ')}.`,\n        );\n      }\n      if (this.variadic) {\n        return this._concatValue(arg, previous);\n      }\n      return arg;\n    };\n    return this;\n  }\n\n  /**\n   * Make argument required.\n   *\n   * @returns {Argument}\n   */\n  argRequired() {\n    this.required = true;\n    return this;\n  }\n\n  /**\n   * Make argument optional.\n   *\n   * @returns {Argument}\n   */\n  argOptional() {\n    this.required = false;\n    return this;\n  }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nfunction humanReadableArgName(arg) {\n  const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n  return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n\nexports.Argument = Argument;\nexports.humanReadableArgName = humanReadableArgName;\n","const { humanReadableArgName } = require('./argument.js');\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nclass Help {\n  constructor() {\n    this.helpWidth = undefined;\n    this.minWidthToWrap = 40;\n    this.sortSubcommands = false;\n    this.sortOptions = false;\n    this.showGlobalOptions = false;\n  }\n\n  /**\n   * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n   * and just before calling `formatHelp()`.\n   *\n   * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n   *\n   * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n   */\n  prepareContext(contextOptions) {\n    this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n  }\n\n  /**\n   * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n   *\n   * @param {Command} cmd\n   * @returns {Command[]}\n   */\n\n  visibleCommands(cmd) {\n    const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n    const helpCommand = cmd._getHelpCommand();\n    if (helpCommand && !helpCommand._hidden) {\n      visibleCommands.push(helpCommand);\n    }\n    if (this.sortSubcommands) {\n      visibleCommands.sort((a, b) => {\n        // @ts-ignore: because overloaded return type\n        return a.name().localeCompare(b.name());\n      });\n    }\n    return visibleCommands;\n  }\n\n  /**\n   * Compare options for sort.\n   *\n   * @param {Option} a\n   * @param {Option} b\n   * @returns {number}\n   */\n  compareOptions(a, b) {\n    const getSortKey = (option) => {\n      // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n      return option.short\n        ? option.short.replace(/^-/, '')\n        : option.long.replace(/^--/, '');\n    };\n    return getSortKey(a).localeCompare(getSortKey(b));\n  }\n\n  /**\n   * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n   *\n   * @param {Command} cmd\n   * @returns {Option[]}\n   */\n\n  visibleOptions(cmd) {\n    const visibleOptions = cmd.options.filter((option) => !option.hidden);\n    // Built-in help option.\n    const helpOption = cmd._getHelpOption();\n    if (helpOption && !helpOption.hidden) {\n      // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n      const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n      const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n      if (!removeShort && !removeLong) {\n        visibleOptions.push(helpOption); // no changes needed\n      } else if (helpOption.long && !removeLong) {\n        visibleOptions.push(\n          cmd.createOption(helpOption.long, helpOption.description),\n        );\n      } else if (helpOption.short && !removeShort) {\n        visibleOptions.push(\n          cmd.createOption(helpOption.short, helpOption.description),\n        );\n      }\n    }\n    if (this.sortOptions) {\n      visibleOptions.sort(this.compareOptions);\n    }\n    return visibleOptions;\n  }\n\n  /**\n   * Get an array of the visible global options. (Not including help.)\n   *\n   * @param {Command} cmd\n   * @returns {Option[]}\n   */\n\n  visibleGlobalOptions(cmd) {\n    if (!this.showGlobalOptions) return [];\n\n    const globalOptions = [];\n    for (\n      let ancestorCmd = cmd.parent;\n      ancestorCmd;\n      ancestorCmd = ancestorCmd.parent\n    ) {\n      const visibleOptions = ancestorCmd.options.filter(\n        (option) => !option.hidden,\n      );\n      globalOptions.push(...visibleOptions);\n    }\n    if (this.sortOptions) {\n      globalOptions.sort(this.compareOptions);\n    }\n    return globalOptions;\n  }\n\n  /**\n   * Get an array of the arguments if any have a description.\n   *\n   * @param {Command} cmd\n   * @returns {Argument[]}\n   */\n\n  visibleArguments(cmd) {\n    // Side effect! Apply the legacy descriptions before the arguments are displayed.\n    if (cmd._argsDescription) {\n      cmd.registeredArguments.forEach((argument) => {\n        argument.description =\n          argument.description || cmd._argsDescription[argument.name()] || '';\n      });\n    }\n\n    // If there are any arguments with a description then return all the arguments.\n    if (cmd.registeredArguments.find((argument) => argument.description)) {\n      return cmd.registeredArguments;\n    }\n    return [];\n  }\n\n  /**\n   * Get the command term to show in the list of subcommands.\n   *\n   * @param {Command} cmd\n   * @returns {string}\n   */\n\n  subcommandTerm(cmd) {\n    // Legacy. Ignores custom usage string, and nested commands.\n    const args = cmd.registeredArguments\n      .map((arg) => humanReadableArgName(arg))\n      .join(' ');\n    return (\n      cmd._name +\n      (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n      (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n      (args ? ' ' + args : '')\n    );\n  }\n\n  /**\n   * Get the option term to show in the list of options.\n   *\n   * @param {Option} option\n   * @returns {string}\n   */\n\n  optionTerm(option) {\n    return option.flags;\n  }\n\n  /**\n   * Get the argument term to show in the list of arguments.\n   *\n   * @param {Argument} argument\n   * @returns {string}\n   */\n\n  argumentTerm(argument) {\n    return argument.name();\n  }\n\n  /**\n   * Get the longest command term length.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {number}\n   */\n\n  longestSubcommandTermLength(cmd, helper) {\n    return helper.visibleCommands(cmd).reduce((max, command) => {\n      return Math.max(\n        max,\n        this.displayWidth(\n          helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n        ),\n      );\n    }, 0);\n  }\n\n  /**\n   * Get the longest option term length.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {number}\n   */\n\n  longestOptionTermLength(cmd, helper) {\n    return helper.visibleOptions(cmd).reduce((max, option) => {\n      return Math.max(\n        max,\n        this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n      );\n    }, 0);\n  }\n\n  /**\n   * Get the longest global option term length.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {number}\n   */\n\n  longestGlobalOptionTermLength(cmd, helper) {\n    return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n      return Math.max(\n        max,\n        this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n      );\n    }, 0);\n  }\n\n  /**\n   * Get the longest argument term length.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {number}\n   */\n\n  longestArgumentTermLength(cmd, helper) {\n    return helper.visibleArguments(cmd).reduce((max, argument) => {\n      return Math.max(\n        max,\n        this.displayWidth(\n          helper.styleArgumentTerm(helper.argumentTerm(argument)),\n        ),\n      );\n    }, 0);\n  }\n\n  /**\n   * Get the command usage to be displayed at the top of the built-in help.\n   *\n   * @param {Command} cmd\n   * @returns {string}\n   */\n\n  commandUsage(cmd) {\n    // Usage\n    let cmdName = cmd._name;\n    if (cmd._aliases[0]) {\n      cmdName = cmdName + '|' + cmd._aliases[0];\n    }\n    let ancestorCmdNames = '';\n    for (\n      let ancestorCmd = cmd.parent;\n      ancestorCmd;\n      ancestorCmd = ancestorCmd.parent\n    ) {\n      ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n    }\n    return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n  }\n\n  /**\n   * Get the description for the command.\n   *\n   * @param {Command} cmd\n   * @returns {string}\n   */\n\n  commandDescription(cmd) {\n    // @ts-ignore: because overloaded return type\n    return cmd.description();\n  }\n\n  /**\n   * Get the subcommand summary to show in the list of subcommands.\n   * (Fallback to description for backwards compatibility.)\n   *\n   * @param {Command} cmd\n   * @returns {string}\n   */\n\n  subcommandDescription(cmd) {\n    // @ts-ignore: because overloaded return type\n    return cmd.summary() || cmd.description();\n  }\n\n  /**\n   * Get the option description to show in the list of options.\n   *\n   * @param {Option} option\n   * @return {string}\n   */\n\n  optionDescription(option) {\n    const extraInfo = [];\n\n    if (option.argChoices) {\n      extraInfo.push(\n        // use stringify to match the display of the default value\n        `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n      );\n    }\n    if (option.defaultValue !== undefined) {\n      // default for boolean and negated more for programmer than end user,\n      // but show true/false for boolean option as may be for hand-rolled env or config processing.\n      const showDefault =\n        option.required ||\n        option.optional ||\n        (option.isBoolean() && typeof option.defaultValue === 'boolean');\n      if (showDefault) {\n        extraInfo.push(\n          `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n        );\n      }\n    }\n    // preset for boolean and negated are more for programmer than end user\n    if (option.presetArg !== undefined && option.optional) {\n      extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n    }\n    if (option.envVar !== undefined) {\n      extraInfo.push(`env: ${option.envVar}`);\n    }\n    if (extraInfo.length > 0) {\n      return `${option.description} (${extraInfo.join(', ')})`;\n    }\n\n    return option.description;\n  }\n\n  /**\n   * Get the argument description to show in the list of arguments.\n   *\n   * @param {Argument} argument\n   * @return {string}\n   */\n\n  argumentDescription(argument) {\n    const extraInfo = [];\n    if (argument.argChoices) {\n      extraInfo.push(\n        // use stringify to match the display of the default value\n        `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n      );\n    }\n    if (argument.defaultValue !== undefined) {\n      extraInfo.push(\n        `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n      );\n    }\n    if (extraInfo.length > 0) {\n      const extraDescription = `(${extraInfo.join(', ')})`;\n      if (argument.description) {\n        return `${argument.description} ${extraDescription}`;\n      }\n      return extraDescription;\n    }\n    return argument.description;\n  }\n\n  /**\n   * Generate the built-in help text.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {string}\n   */\n\n  formatHelp(cmd, helper) {\n    const termWidth = helper.padWidth(cmd, helper);\n    const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n    function callFormatItem(term, description) {\n      return helper.formatItem(term, termWidth, description, helper);\n    }\n\n    // Usage\n    let output = [\n      `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n      '',\n    ];\n\n    // Description\n    const commandDescription = helper.commandDescription(cmd);\n    if (commandDescription.length > 0) {\n      output = output.concat([\n        helper.boxWrap(\n          helper.styleCommandDescription(commandDescription),\n          helpWidth,\n        ),\n        '',\n      ]);\n    }\n\n    // Arguments\n    const argumentList = helper.visibleArguments(cmd).map((argument) => {\n      return callFormatItem(\n        helper.styleArgumentTerm(helper.argumentTerm(argument)),\n        helper.styleArgumentDescription(helper.argumentDescription(argument)),\n      );\n    });\n    if (argumentList.length > 0) {\n      output = output.concat([\n        helper.styleTitle('Arguments:'),\n        ...argumentList,\n        '',\n      ]);\n    }\n\n    // Options\n    const optionList = helper.visibleOptions(cmd).map((option) => {\n      return callFormatItem(\n        helper.styleOptionTerm(helper.optionTerm(option)),\n        helper.styleOptionDescription(helper.optionDescription(option)),\n      );\n    });\n    if (optionList.length > 0) {\n      output = output.concat([\n        helper.styleTitle('Options:'),\n        ...optionList,\n        '',\n      ]);\n    }\n\n    if (helper.showGlobalOptions) {\n      const globalOptionList = helper\n        .visibleGlobalOptions(cmd)\n        .map((option) => {\n          return callFormatItem(\n            helper.styleOptionTerm(helper.optionTerm(option)),\n            helper.styleOptionDescription(helper.optionDescription(option)),\n          );\n        });\n      if (globalOptionList.length > 0) {\n        output = output.concat([\n          helper.styleTitle('Global Options:'),\n          ...globalOptionList,\n          '',\n        ]);\n      }\n    }\n\n    // Commands\n    const commandList = helper.visibleCommands(cmd).map((cmd) => {\n      return callFormatItem(\n        helper.styleSubcommandTerm(helper.subcommandTerm(cmd)),\n        helper.styleSubcommandDescription(helper.subcommandDescription(cmd)),\n      );\n    });\n    if (commandList.length > 0) {\n      output = output.concat([\n        helper.styleTitle('Commands:'),\n        ...commandList,\n        '',\n      ]);\n    }\n\n    return output.join('\\n');\n  }\n\n  /**\n   * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n   *\n   * @param {string} str\n   * @returns {number}\n   */\n  displayWidth(str) {\n    return stripColor(str).length;\n  }\n\n  /**\n   * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  styleTitle(str) {\n    return str;\n  }\n\n  styleUsage(str) {\n    // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n    //    command subcommand [options] [command] <foo> [bar]\n    return str\n      .split(' ')\n      .map((word) => {\n        if (word === '[options]') return this.styleOptionText(word);\n        if (word === '[command]') return this.styleSubcommandText(word);\n        if (word[0] === '[' || word[0] === '<')\n          return this.styleArgumentText(word);\n        return this.styleCommandText(word); // Restrict to initial words?\n      })\n      .join(' ');\n  }\n  styleCommandDescription(str) {\n    return this.styleDescriptionText(str);\n  }\n  styleOptionDescription(str) {\n    return this.styleDescriptionText(str);\n  }\n  styleSubcommandDescription(str) {\n    return this.styleDescriptionText(str);\n  }\n  styleArgumentDescription(str) {\n    return this.styleDescriptionText(str);\n  }\n  styleDescriptionText(str) {\n    return str;\n  }\n  styleOptionTerm(str) {\n    return this.styleOptionText(str);\n  }\n  styleSubcommandTerm(str) {\n    // This is very like usage with lots of parts! Assume default string which is formed like:\n    //    subcommand [options] <foo> [bar]\n    return str\n      .split(' ')\n      .map((word) => {\n        if (word === '[options]') return this.styleOptionText(word);\n        if (word[0] === '[' || word[0] === '<')\n          return this.styleArgumentText(word);\n        return this.styleSubcommandText(word); // Restrict to initial words?\n      })\n      .join(' ');\n  }\n  styleArgumentTerm(str) {\n    return this.styleArgumentText(str);\n  }\n  styleOptionText(str) {\n    return str;\n  }\n  styleArgumentText(str) {\n    return str;\n  }\n  styleSubcommandText(str) {\n    return str;\n  }\n  styleCommandText(str) {\n    return str;\n  }\n\n  /**\n   * Calculate the pad width from the maximum term length.\n   *\n   * @param {Command} cmd\n   * @param {Help} helper\n   * @returns {number}\n   */\n\n  padWidth(cmd, helper) {\n    return Math.max(\n      helper.longestOptionTermLength(cmd, helper),\n      helper.longestGlobalOptionTermLength(cmd, helper),\n      helper.longestSubcommandTermLength(cmd, helper),\n      helper.longestArgumentTermLength(cmd, helper),\n    );\n  }\n\n  /**\n   * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n   *\n   * @param {string} str\n   * @returns {boolean}\n   */\n  preformatted(str) {\n    return /\\n[^\\S\\r\\n]/.test(str);\n  }\n\n  /**\n   * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n   *\n   * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n   *   TTT  DDD DDDD\n   *        DD DDD\n   *\n   * @param {string} term\n   * @param {number} termWidth\n   * @param {string} description\n   * @param {Help} helper\n   * @returns {string}\n   */\n  formatItem(term, termWidth, description, helper) {\n    const itemIndent = 2;\n    const itemIndentStr = ' '.repeat(itemIndent);\n    if (!description) return itemIndentStr + term;\n\n    // Pad the term out to a consistent width, so descriptions are aligned.\n    const paddedTerm = term.padEnd(\n      termWidth + term.length - helper.displayWidth(term),\n    );\n\n    // Format the description.\n    const spacerWidth = 2; // between term and description\n    const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n    const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n    let formattedDescription;\n    if (\n      remainingWidth < this.minWidthToWrap ||\n      helper.preformatted(description)\n    ) {\n      formattedDescription = description;\n    } else {\n      const wrappedDescription = helper.boxWrap(description, remainingWidth);\n      formattedDescription = wrappedDescription.replace(\n        /\\n/g,\n        '\\n' + ' '.repeat(termWidth + spacerWidth),\n      );\n    }\n\n    // Construct and overall indent.\n    return (\n      itemIndentStr +\n      paddedTerm +\n      ' '.repeat(spacerWidth) +\n      formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n    );\n  }\n\n  /**\n   * Wrap a string at whitespace, preserving existing line breaks.\n   * Wrapping is skipped if the width is less than `minWidthToWrap`.\n   *\n   * @param {string} str\n   * @param {number} width\n   * @returns {string}\n   */\n  boxWrap(str, width) {\n    if (width < this.minWidthToWrap) return str;\n\n    const rawLines = str.split(/\\r\\n|\\n/);\n    // split up text by whitespace\n    const chunkPattern = /[\\s]*[^\\s]+/g;\n    const wrappedLines = [];\n    rawLines.forEach((line) => {\n      const chunks = line.match(chunkPattern);\n      if (chunks === null) {\n        wrappedLines.push('');\n        return;\n      }\n\n      let sumChunks = [chunks.shift()];\n      let sumWidth = this.displayWidth(sumChunks[0]);\n      chunks.forEach((chunk) => {\n        const visibleWidth = this.displayWidth(chunk);\n        // Accumulate chunks while they fit into width.\n        if (sumWidth + visibleWidth <= width) {\n          sumChunks.push(chunk);\n          sumWidth += visibleWidth;\n          return;\n        }\n        wrappedLines.push(sumChunks.join(''));\n\n        const nextChunk = chunk.trimStart(); // trim space at line break\n        sumChunks = [nextChunk];\n        sumWidth = this.displayWidth(nextChunk);\n      });\n      wrappedLines.push(sumChunks.join(''));\n    });\n\n    return wrappedLines.join('\\n');\n  }\n}\n\n/**\n * Strip style ANSI escape sequences from the string. In particular, SGR (Select Graphic Rendition) codes.\n *\n * @param {string} str\n * @returns {string}\n * @package\n */\n\nfunction stripColor(str) {\n  // eslint-disable-next-line no-control-regex\n  const sgrPattern = /\\x1b\\[\\d*(;\\d*)*m/g;\n  return str.replace(sgrPattern, '');\n}\n\nexports.Help = Help;\nexports.stripColor = stripColor;\n","const { InvalidArgumentError } = require('./error.js');\n\nclass Option {\n  /**\n   * Initialize a new `Option` with the given `flags` and `description`.\n   *\n   * @param {string} flags\n   * @param {string} [description]\n   */\n\n  constructor(flags, description) {\n    this.flags = flags;\n    this.description = description || '';\n\n    this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n    this.optional = flags.includes('['); // A value is optional when the option is specified.\n    // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n    this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n    this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n    const optionFlags = splitOptionFlags(flags);\n    this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n    this.long = optionFlags.longFlag;\n    this.negate = false;\n    if (this.long) {\n      this.negate = this.long.startsWith('--no-');\n    }\n    this.defaultValue = undefined;\n    this.defaultValueDescription = undefined;\n    this.presetArg = undefined;\n    this.envVar = undefined;\n    this.parseArg = undefined;\n    this.hidden = false;\n    this.argChoices = undefined;\n    this.conflictsWith = [];\n    this.implied = undefined;\n  }\n\n  /**\n   * Set the default value, and optionally supply the description to be displayed in the help.\n   *\n   * @param {*} value\n   * @param {string} [description]\n   * @return {Option}\n   */\n\n  default(value, description) {\n    this.defaultValue = value;\n    this.defaultValueDescription = description;\n    return this;\n  }\n\n  /**\n   * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n   * The custom processing (parseArg) is called.\n   *\n   * @example\n   * new Option('--color').default('GREYSCALE').preset('RGB');\n   * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n   *\n   * @param {*} arg\n   * @return {Option}\n   */\n\n  preset(arg) {\n    this.presetArg = arg;\n    return this;\n  }\n\n  /**\n   * Add option name(s) that conflict with this option.\n   * An error will be displayed if conflicting options are found during parsing.\n   *\n   * @example\n   * new Option('--rgb').conflicts('cmyk');\n   * new Option('--js').conflicts(['ts', 'jsx']);\n   *\n   * @param {(string | string[])} names\n   * @return {Option}\n   */\n\n  conflicts(names) {\n    this.conflictsWith = this.conflictsWith.concat(names);\n    return this;\n  }\n\n  /**\n   * Specify implied option values for when this option is set and the implied options are not.\n   *\n   * The custom processing (parseArg) is not called on the implied values.\n   *\n   * @example\n   * program\n   *   .addOption(new Option('--log', 'write logging information to file'))\n   *   .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n   *\n   * @param {object} impliedOptionValues\n   * @return {Option}\n   */\n  implies(impliedOptionValues) {\n    let newImplied = impliedOptionValues;\n    if (typeof impliedOptionValues === 'string') {\n      // string is not documented, but easy mistake and we can do what user probably intended.\n      newImplied = { [impliedOptionValues]: true };\n    }\n    this.implied = Object.assign(this.implied || {}, newImplied);\n    return this;\n  }\n\n  /**\n   * Set environment variable to check for option value.\n   *\n   * An environment variable is only used if when processed the current option value is\n   * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n   *\n   * @param {string} name\n   * @return {Option}\n   */\n\n  env(name) {\n    this.envVar = name;\n    return this;\n  }\n\n  /**\n   * Set the custom handler for processing CLI option arguments into option values.\n   *\n   * @param {Function} [fn]\n   * @return {Option}\n   */\n\n  argParser(fn) {\n    this.parseArg = fn;\n    return this;\n  }\n\n  /**\n   * Whether the option is mandatory and must have a value after parsing.\n   *\n   * @param {boolean} [mandatory=true]\n   * @return {Option}\n   */\n\n  makeOptionMandatory(mandatory = true) {\n    this.mandatory = !!mandatory;\n    return this;\n  }\n\n  /**\n   * Hide option in help.\n   *\n   * @param {boolean} [hide=true]\n   * @return {Option}\n   */\n\n  hideHelp(hide = true) {\n    this.hidden = !!hide;\n    return this;\n  }\n\n  /**\n   * @package\n   */\n\n  _concatValue(value, previous) {\n    if (previous === this.defaultValue || !Array.isArray(previous)) {\n      return [value];\n    }\n\n    return previous.concat(value);\n  }\n\n  /**\n   * Only allow option value to be one of choices.\n   *\n   * @param {string[]} values\n   * @return {Option}\n   */\n\n  choices(values) {\n    this.argChoices = values.slice();\n    this.parseArg = (arg, previous) => {\n      if (!this.argChoices.includes(arg)) {\n        throw new InvalidArgumentError(\n          `Allowed choices are ${this.argChoices.join(', ')}.`,\n        );\n      }\n      if (this.variadic) {\n        return this._concatValue(arg, previous);\n      }\n      return arg;\n    };\n    return this;\n  }\n\n  /**\n   * Return option name.\n   *\n   * @return {string}\n   */\n\n  name() {\n    if (this.long) {\n      return this.long.replace(/^--/, '');\n    }\n    return this.short.replace(/^-/, '');\n  }\n\n  /**\n   * Return option name, in a camelcase format that can be used\n   * as an object attribute key.\n   *\n   * @return {string}\n   */\n\n  attributeName() {\n    if (this.negate) {\n      return camelcase(this.name().replace(/^no-/, ''));\n    }\n    return camelcase(this.name());\n  }\n\n  /**\n   * Check if `arg` matches the short or long flag.\n   *\n   * @param {string} arg\n   * @return {boolean}\n   * @package\n   */\n\n  is(arg) {\n    return this.short === arg || this.long === arg;\n  }\n\n  /**\n   * Return whether a boolean option.\n   *\n   * Options are one of boolean, negated, required argument, or optional argument.\n   *\n   * @return {boolean}\n   * @package\n   */\n\n  isBoolean() {\n    return !this.required && !this.optional && !this.negate;\n  }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nclass DualOptions {\n  /**\n   * @param {Option[]} options\n   */\n  constructor(options) {\n    this.positiveOptions = new Map();\n    this.negativeOptions = new Map();\n    this.dualOptions = new Set();\n    options.forEach((option) => {\n      if (option.negate) {\n        this.negativeOptions.set(option.attributeName(), option);\n      } else {\n        this.positiveOptions.set(option.attributeName(), option);\n      }\n    });\n    this.negativeOptions.forEach((value, key) => {\n      if (this.positiveOptions.has(key)) {\n        this.dualOptions.add(key);\n      }\n    });\n  }\n\n  /**\n   * Did the value come from the option, and not from possible matching dual option?\n   *\n   * @param {*} value\n   * @param {Option} option\n   * @returns {boolean}\n   */\n  valueFromOption(value, option) {\n    const optionKey = option.attributeName();\n    if (!this.dualOptions.has(optionKey)) return true;\n\n    // Use the value to deduce if (probably) came from the option.\n    const preset = this.negativeOptions.get(optionKey).presetArg;\n    const negativeValue = preset !== undefined ? preset : false;\n    return option.negate === (negativeValue === value);\n  }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n  return str.split('-').reduce((str, word) => {\n    return str + word[0].toUpperCase() + word.slice(1);\n  });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n  let shortFlag;\n  let longFlag;\n  // short flag, single dash and single character\n  const shortFlagExp = /^-[^-]$/;\n  // long flag, double dash and at least one character\n  const longFlagExp = /^--[^-]/;\n\n  const flagParts = flags.split(/[ |,]+/).concat('guard');\n  // Normal is short and/or long.\n  if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n  if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n  // Long then short. Rarely used but fine.\n  if (!shortFlag && shortFlagExp.test(flagParts[0]))\n    shortFlag = flagParts.shift();\n  // Allow two long flags, like '--ws, --workspace'\n  // This is the supported way to have a shortish option flag.\n  if (!shortFlag && longFlagExp.test(flagParts[0])) {\n    shortFlag = longFlag;\n    longFlag = flagParts.shift();\n  }\n\n  // Check for unprocessed flag. Fail noisily rather than silently ignore.\n  if (flagParts[0].startsWith('-')) {\n    const unsupportedFlag = flagParts[0];\n    const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n    if (/^-[^-][^-]/.test(unsupportedFlag))\n      throw new Error(\n        `${baseError}\n- a short flag is a single dash and a single character\n  - either use a single dash and a single character (for a short flag)\n  - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n      );\n    if (shortFlagExp.test(unsupportedFlag))\n      throw new Error(`${baseError}\n- too many short flags`);\n    if (longFlagExp.test(unsupportedFlag))\n      throw new Error(`${baseError}\n- too many long flags`);\n\n    throw new Error(`${baseError}\n- unrecognised flag format`);\n  }\n  if (shortFlag === undefined && longFlag === undefined)\n    throw new Error(\n      `option creation failed due to no flags found in '${flags}'.`,\n    );\n\n  return { shortFlag, longFlag };\n}\n\nexports.Option = Option;\nexports.DualOptions = DualOptions;\n","const maxDistance = 3;\n\nfunction editDistance(a, b) {\n  // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance\n  // Calculating optimal string alignment distance, no substring is edited more than once.\n  // (Simple implementation.)\n\n  // Quick early exit, return worst case.\n  if (Math.abs(a.length - b.length) > maxDistance)\n    return Math.max(a.length, b.length);\n\n  // distance between prefix substrings of a and b\n  const d = [];\n\n  // pure deletions turn a into empty string\n  for (let i = 0; i <= a.length; i++) {\n    d[i] = [i];\n  }\n  // pure insertions turn empty string into b\n  for (let j = 0; j <= b.length; j++) {\n    d[0][j] = j;\n  }\n\n  // fill matrix\n  for (let j = 1; j <= b.length; j++) {\n    for (let i = 1; i <= a.length; i++) {\n      let cost = 1;\n      if (a[i - 1] === b[j - 1]) {\n        cost = 0;\n      } else {\n        cost = 1;\n      }\n      d[i][j] = Math.min(\n        d[i - 1][j] + 1, // deletion\n        d[i][j - 1] + 1, // insertion\n        d[i - 1][j - 1] + cost, // substitution\n      );\n      // transposition\n      if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n        d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n      }\n    }\n  }\n\n  return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nfunction suggestSimilar(word, candidates) {\n  if (!candidates || candidates.length === 0) return '';\n  // remove possible duplicates\n  candidates = Array.from(new Set(candidates));\n\n  const searchingOptions = word.startsWith('--');\n  if (searchingOptions) {\n    word = word.slice(2);\n    candidates = candidates.map((candidate) => candidate.slice(2));\n  }\n\n  let similar = [];\n  let bestDistance = maxDistance;\n  const minSimilarity = 0.4;\n  candidates.forEach((candidate) => {\n    if (candidate.length <= 1) return; // no one character guesses\n\n    const distance = editDistance(word, candidate);\n    const length = Math.max(word.length, candidate.length);\n    const similarity = (length - distance) / length;\n    if (similarity > minSimilarity) {\n      if (distance < bestDistance) {\n        // better edit distance, throw away previous worse matches\n        bestDistance = distance;\n        similar = [candidate];\n      } else if (distance === bestDistance) {\n        similar.push(candidate);\n      }\n    }\n  });\n\n  similar.sort((a, b) => a.localeCompare(b));\n  if (searchingOptions) {\n    similar = similar.map((candidate) => `--${candidate}`);\n  }\n\n  if (similar.length > 1) {\n    return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n  }\n  if (similar.length === 1) {\n    return `\\n(Did you mean ${similar[0]}?)`;\n  }\n  return '';\n}\n\nexports.suggestSimilar = suggestSimilar;\n","const EventEmitter = require('node:events').EventEmitter;\nconst childProcess = require('node:child_process');\nconst path = require('node:path');\nconst fs = require('node:fs');\nconst process = require('node:process');\n\nconst { Argument, humanReadableArgName } = require('./argument.js');\nconst { CommanderError } = require('./error.js');\nconst { Help, stripColor } = require('./help.js');\nconst { Option, DualOptions } = require('./option.js');\nconst { suggestSimilar } = require('./suggestSimilar');\n\nclass Command extends EventEmitter {\n  /**\n   * Initialize a new `Command`.\n   *\n   * @param {string} [name]\n   */\n\n  constructor(name) {\n    super();\n    /** @type {Command[]} */\n    this.commands = [];\n    /** @type {Option[]} */\n    this.options = [];\n    this.parent = null;\n    this._allowUnknownOption = false;\n    this._allowExcessArguments = false;\n    /** @type {Argument[]} */\n    this.registeredArguments = [];\n    this._args = this.registeredArguments; // deprecated old name\n    /** @type {string[]} */\n    this.args = []; // cli args with options removed\n    this.rawArgs = [];\n    this.processedArgs = []; // like .args but after custom processing and collecting variadic\n    this._scriptPath = null;\n    this._name = name || '';\n    this._optionValues = {};\n    this._optionValueSources = {}; // default, env, cli etc\n    this._storeOptionsAsProperties = false;\n    this._actionHandler = null;\n    this._executableHandler = false;\n    this._executableFile = null; // custom name for executable\n    this._executableDir = null; // custom search directory for subcommands\n    this._defaultCommandName = null;\n    this._exitCallback = null;\n    this._aliases = [];\n    this._combineFlagAndOptionalValue = true;\n    this._description = '';\n    this._summary = '';\n    this._argsDescription = undefined; // legacy\n    this._enablePositionalOptions = false;\n    this._passThroughOptions = false;\n    this._lifeCycleHooks = {}; // a hash of arrays\n    /** @type {(boolean | string)} */\n    this._showHelpAfterError = false;\n    this._showSuggestionAfterError = true;\n    this._savedState = null; // used in save/restoreStateBeforeParse\n\n    // see configureOutput() for docs\n    this._outputConfiguration = {\n      writeOut: (str) => process.stdout.write(str),\n      writeErr: (str) => process.stderr.write(str),\n      outputError: (str, write) => write(str),\n      getOutHelpWidth: () =>\n        process.stdout.isTTY ? process.stdout.columns : undefined,\n      getErrHelpWidth: () =>\n        process.stderr.isTTY ? process.stderr.columns : undefined,\n      getOutHasColors: () =>\n        useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n      getErrHasColors: () =>\n        useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n      stripColor: (str) => stripColor(str),\n    };\n\n    this._hidden = false;\n    /** @type {(Option | null | undefined)} */\n    this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n    this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n    /** @type {Command} */\n    this._helpCommand = undefined; // lazy initialised, inherited\n    this._helpConfiguration = {};\n  }\n\n  /**\n   * Copy settings that are useful to have in common across root command and subcommands.\n   *\n   * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n   *\n   * @param {Command} sourceCommand\n   * @return {Command} `this` command for chaining\n   */\n  copyInheritedSettings(sourceCommand) {\n    this._outputConfiguration = sourceCommand._outputConfiguration;\n    this._helpOption = sourceCommand._helpOption;\n    this._helpCommand = sourceCommand._helpCommand;\n    this._helpConfiguration = sourceCommand._helpConfiguration;\n    this._exitCallback = sourceCommand._exitCallback;\n    this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n    this._combineFlagAndOptionalValue =\n      sourceCommand._combineFlagAndOptionalValue;\n    this._allowExcessArguments = sourceCommand._allowExcessArguments;\n    this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n    this._showHelpAfterError = sourceCommand._showHelpAfterError;\n    this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n    return this;\n  }\n\n  /**\n   * @returns {Command[]}\n   * @private\n   */\n\n  _getCommandAndAncestors() {\n    const result = [];\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    for (let command = this; command; command = command.parent) {\n      result.push(command);\n    }\n    return result;\n  }\n\n  /**\n   * Define a command.\n   *\n   * There are two styles of command: pay attention to where to put the description.\n   *\n   * @example\n   * // Command implemented using action handler (description is supplied separately to `.command`)\n   * program\n   *   .command('clone <source> [destination]')\n   *   .description('clone a repository into a newly created directory')\n   *   .action((source, destination) => {\n   *     console.log('clone command called');\n   *   });\n   *\n   * // Command implemented using separate executable file (description is second parameter to `.command`)\n   * program\n   *   .command('start <service>', 'start named service')\n   *   .command('stop [service]', 'stop named service, or all if no name supplied');\n   *\n   * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n   * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n   * @param {object} [execOpts] - configuration options (for executable)\n   * @return {Command} returns new command for action handler, or `this` for executable command\n   */\n\n  command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n    let desc = actionOptsOrExecDesc;\n    let opts = execOpts;\n    if (typeof desc === 'object' && desc !== null) {\n      opts = desc;\n      desc = null;\n    }\n    opts = opts || {};\n    const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n    const cmd = this.createCommand(name);\n    if (desc) {\n      cmd.description(desc);\n      cmd._executableHandler = true;\n    }\n    if (opts.isDefault) this._defaultCommandName = cmd._name;\n    cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n    cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n    if (args) cmd.arguments(args);\n    this._registerCommand(cmd);\n    cmd.parent = this;\n    cmd.copyInheritedSettings(this);\n\n    if (desc) return this;\n    return cmd;\n  }\n\n  /**\n   * Factory routine to create a new unattached command.\n   *\n   * See .command() for creating an attached subcommand, which uses this routine to\n   * create the command. You can override createCommand to customise subcommands.\n   *\n   * @param {string} [name]\n   * @return {Command} new command\n   */\n\n  createCommand(name) {\n    return new Command(name);\n  }\n\n  /**\n   * You can customise the help with a subclass of Help by overriding createHelp,\n   * or by overriding Help properties using configureHelp().\n   *\n   * @return {Help}\n   */\n\n  createHelp() {\n    return Object.assign(new Help(), this.configureHelp());\n  }\n\n  /**\n   * You can customise the help by overriding Help properties using configureHelp(),\n   * or with a subclass of Help by overriding createHelp().\n   *\n   * @param {object} [configuration] - configuration options\n   * @return {(Command | object)} `this` command for chaining, or stored configuration\n   */\n\n  configureHelp(configuration) {\n    if (configuration === undefined) return this._helpConfiguration;\n\n    this._helpConfiguration = configuration;\n    return this;\n  }\n\n  /**\n   * The default output goes to stdout and stderr. You can customise this for special\n   * applications. You can also customise the display of errors by overriding outputError.\n   *\n   * The configuration properties are all functions:\n   *\n   *     // change how output being written, defaults to stdout and stderr\n   *     writeOut(str)\n   *     writeErr(str)\n   *     // change how output being written for errors, defaults to writeErr\n   *     outputError(str, write) // used for displaying errors and not used for displaying help\n   *     // specify width for wrapping help\n   *     getOutHelpWidth()\n   *     getErrHelpWidth()\n   *     // color support, currently only used with Help\n   *     getOutHasColors()\n   *     getErrHasColors()\n   *     stripColor() // used to remove ANSI escape codes if output does not have colors\n   *\n   * @param {object} [configuration] - configuration options\n   * @return {(Command | object)} `this` command for chaining, or stored configuration\n   */\n\n  configureOutput(configuration) {\n    if (configuration === undefined) return this._outputConfiguration;\n\n    Object.assign(this._outputConfiguration, configuration);\n    return this;\n  }\n\n  /**\n   * Display the help or a custom message after an error occurs.\n   *\n   * @param {(boolean|string)} [displayHelp]\n   * @return {Command} `this` command for chaining\n   */\n  showHelpAfterError(displayHelp = true) {\n    if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n    this._showHelpAfterError = displayHelp;\n    return this;\n  }\n\n  /**\n   * Display suggestion of similar commands for unknown commands, or options for unknown options.\n   *\n   * @param {boolean} [displaySuggestion]\n   * @return {Command} `this` command for chaining\n   */\n  showSuggestionAfterError(displaySuggestion = true) {\n    this._showSuggestionAfterError = !!displaySuggestion;\n    return this;\n  }\n\n  /**\n   * Add a prepared subcommand.\n   *\n   * See .command() for creating an attached subcommand which inherits settings from its parent.\n   *\n   * @param {Command} cmd - new subcommand\n   * @param {object} [opts] - configuration options\n   * @return {Command} `this` command for chaining\n   */\n\n  addCommand(cmd, opts) {\n    if (!cmd._name) {\n      throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n    }\n\n    opts = opts || {};\n    if (opts.isDefault) this._defaultCommandName = cmd._name;\n    if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n    this._registerCommand(cmd);\n    cmd.parent = this;\n    cmd._checkForBrokenPassThrough();\n\n    return this;\n  }\n\n  /**\n   * Factory routine to create a new unattached argument.\n   *\n   * See .argument() for creating an attached argument, which uses this routine to\n   * create the argument. You can override createArgument to return a custom argument.\n   *\n   * @param {string} name\n   * @param {string} [description]\n   * @return {Argument} new argument\n   */\n\n  createArgument(name, description) {\n    return new Argument(name, description);\n  }\n\n  /**\n   * Define argument syntax for command.\n   *\n   * The default is that the argument is required, and you can explicitly\n   * indicate this with <> around the name. Put [] around the name for an optional argument.\n   *\n   * @example\n   * program.argument('<input-file>');\n   * program.argument('[output-file]');\n   *\n   * @param {string} name\n   * @param {string} [description]\n   * @param {(Function|*)} [fn] - custom argument processing function\n   * @param {*} [defaultValue]\n   * @return {Command} `this` command for chaining\n   */\n  argument(name, description, fn, defaultValue) {\n    const argument = this.createArgument(name, description);\n    if (typeof fn === 'function') {\n      argument.default(defaultValue).argParser(fn);\n    } else {\n      argument.default(fn);\n    }\n    this.addArgument(argument);\n    return this;\n  }\n\n  /**\n   * Define argument syntax for command, adding multiple at once (without descriptions).\n   *\n   * See also .argument().\n   *\n   * @example\n   * program.arguments('<cmd> [env]');\n   *\n   * @param {string} names\n   * @return {Command} `this` command for chaining\n   */\n\n  arguments(names) {\n    names\n      .trim()\n      .split(/ +/)\n      .forEach((detail) => {\n        this.argument(detail);\n      });\n    return this;\n  }\n\n  /**\n   * Define argument syntax for command, adding a prepared argument.\n   *\n   * @param {Argument} argument\n   * @return {Command} `this` command for chaining\n   */\n  addArgument(argument) {\n    const previousArgument = this.registeredArguments.slice(-1)[0];\n    if (previousArgument && previousArgument.variadic) {\n      throw new Error(\n        `only the last argument can be variadic '${previousArgument.name()}'`,\n      );\n    }\n    if (\n      argument.required &&\n      argument.defaultValue !== undefined &&\n      argument.parseArg === undefined\n    ) {\n      throw new Error(\n        `a default value for a required argument is never used: '${argument.name()}'`,\n      );\n    }\n    this.registeredArguments.push(argument);\n    return this;\n  }\n\n  /**\n   * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n   *\n   * @example\n   *    program.helpCommand('help [cmd]');\n   *    program.helpCommand('help [cmd]', 'show help');\n   *    program.helpCommand(false); // suppress default help command\n   *    program.helpCommand(true); // add help command even if no subcommands\n   *\n   * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n   * @param {string} [description] - custom description\n   * @return {Command} `this` command for chaining\n   */\n\n  helpCommand(enableOrNameAndArgs, description) {\n    if (typeof enableOrNameAndArgs === 'boolean') {\n      this._addImplicitHelpCommand = enableOrNameAndArgs;\n      return this;\n    }\n\n    enableOrNameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n    const [, helpName, helpArgs] = enableOrNameAndArgs.match(/([^ ]+) *(.*)/);\n    const helpDescription = description ?? 'display help for command';\n\n    const helpCommand = this.createCommand(helpName);\n    helpCommand.helpOption(false);\n    if (helpArgs) helpCommand.arguments(helpArgs);\n    if (helpDescription) helpCommand.description(helpDescription);\n\n    this._addImplicitHelpCommand = true;\n    this._helpCommand = helpCommand;\n\n    return this;\n  }\n\n  /**\n   * Add prepared custom help command.\n   *\n   * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n   * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n   * @return {Command} `this` command for chaining\n   */\n  addHelpCommand(helpCommand, deprecatedDescription) {\n    // If not passed an object, call through to helpCommand for backwards compatibility,\n    // as addHelpCommand was originally used like helpCommand is now.\n    if (typeof helpCommand !== 'object') {\n      this.helpCommand(helpCommand, deprecatedDescription);\n      return this;\n    }\n\n    this._addImplicitHelpCommand = true;\n    this._helpCommand = helpCommand;\n    return this;\n  }\n\n  /**\n   * Lazy create help command.\n   *\n   * @return {(Command|null)}\n   * @package\n   */\n  _getHelpCommand() {\n    const hasImplicitHelpCommand =\n      this._addImplicitHelpCommand ??\n      (this.commands.length &&\n        !this._actionHandler &&\n        !this._findCommand('help'));\n\n    if (hasImplicitHelpCommand) {\n      if (this._helpCommand === undefined) {\n        this.helpCommand(undefined, undefined); // use default name and description\n      }\n      return this._helpCommand;\n    }\n    return null;\n  }\n\n  /**\n   * Add hook for life cycle event.\n   *\n   * @param {string} event\n   * @param {Function} listener\n   * @return {Command} `this` command for chaining\n   */\n\n  hook(event, listener) {\n    const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n    if (!allowedValues.includes(event)) {\n      throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n    }\n    if (this._lifeCycleHooks[event]) {\n      this._lifeCycleHooks[event].push(listener);\n    } else {\n      this._lifeCycleHooks[event] = [listener];\n    }\n    return this;\n  }\n\n  /**\n   * Register callback to use as replacement for calling process.exit.\n   *\n   * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n   * @return {Command} `this` command for chaining\n   */\n\n  exitOverride(fn) {\n    if (fn) {\n      this._exitCallback = fn;\n    } else {\n      this._exitCallback = (err) => {\n        if (err.code !== 'commander.executeSubCommandAsync') {\n          throw err;\n        } else {\n          // Async callback from spawn events, not useful to throw.\n        }\n      };\n    }\n    return this;\n  }\n\n  /**\n   * Call process.exit, and _exitCallback if defined.\n   *\n   * @param {number} exitCode exit code for using with process.exit\n   * @param {string} code an id string representing the error\n   * @param {string} message human-readable description of the error\n   * @return never\n   * @private\n   */\n\n  _exit(exitCode, code, message) {\n    if (this._exitCallback) {\n      this._exitCallback(new CommanderError(exitCode, code, message));\n      // Expecting this line is not reached.\n    }\n    process.exit(exitCode);\n  }\n\n  /**\n   * Register callback `fn` for the command.\n   *\n   * @example\n   * program\n   *   .command('serve')\n   *   .description('start service')\n   *   .action(function() {\n   *      // do work here\n   *   });\n   *\n   * @param {Function} fn\n   * @return {Command} `this` command for chaining\n   */\n\n  action(fn) {\n    const listener = (args) => {\n      // The .action callback takes an extra parameter which is the command or options.\n      const expectedArgsCount = this.registeredArguments.length;\n      const actionArgs = args.slice(0, expectedArgsCount);\n      if (this._storeOptionsAsProperties) {\n        actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n      } else {\n        actionArgs[expectedArgsCount] = this.opts();\n      }\n      actionArgs.push(this);\n\n      return fn.apply(this, actionArgs);\n    };\n    this._actionHandler = listener;\n    return this;\n  }\n\n  /**\n   * Factory routine to create a new unattached option.\n   *\n   * See .option() for creating an attached option, which uses this routine to\n   * create the option. You can override createOption to return a custom option.\n   *\n   * @param {string} flags\n   * @param {string} [description]\n   * @return {Option} new option\n   */\n\n  createOption(flags, description) {\n    return new Option(flags, description);\n  }\n\n  /**\n   * Wrap parseArgs to catch 'commander.invalidArgument'.\n   *\n   * @param {(Option | Argument)} target\n   * @param {string} value\n   * @param {*} previous\n   * @param {string} invalidArgumentMessage\n   * @private\n   */\n\n  _callParseArg(target, value, previous, invalidArgumentMessage) {\n    try {\n      return target.parseArg(value, previous);\n    } catch (err) {\n      if (err.code === 'commander.invalidArgument') {\n        const message = `${invalidArgumentMessage} ${err.message}`;\n        this.error(message, { exitCode: err.exitCode, code: err.code });\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Check for option flag conflicts.\n   * Register option if no conflicts found, or throw on conflict.\n   *\n   * @param {Option} option\n   * @private\n   */\n\n  _registerOption(option) {\n    const matchingOption =\n      (option.short && this._findOption(option.short)) ||\n      (option.long && this._findOption(option.long));\n    if (matchingOption) {\n      const matchingFlag =\n        option.long && this._findOption(option.long)\n          ? option.long\n          : option.short;\n      throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n-  already used by option '${matchingOption.flags}'`);\n    }\n\n    this.options.push(option);\n  }\n\n  /**\n   * Check for command name and alias conflicts with existing commands.\n   * Register command if no conflicts found, or throw on conflict.\n   *\n   * @param {Command} command\n   * @private\n   */\n\n  _registerCommand(command) {\n    const knownBy = (cmd) => {\n      return [cmd.name()].concat(cmd.aliases());\n    };\n\n    const alreadyUsed = knownBy(command).find((name) =>\n      this._findCommand(name),\n    );\n    if (alreadyUsed) {\n      const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n      const newCmd = knownBy(command).join('|');\n      throw new Error(\n        `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n      );\n    }\n\n    this.commands.push(command);\n  }\n\n  /**\n   * Add an option.\n   *\n   * @param {Option} option\n   * @return {Command} `this` command for chaining\n   */\n  addOption(option) {\n    this._registerOption(option);\n\n    const oname = option.name();\n    const name = option.attributeName();\n\n    // store default value\n    if (option.negate) {\n      // --no-foo is special and defaults foo to true, unless a --foo option is already defined\n      const positiveLongFlag = option.long.replace(/^--no-/, '--');\n      if (!this._findOption(positiveLongFlag)) {\n        this.setOptionValueWithSource(\n          name,\n          option.defaultValue === undefined ? true : option.defaultValue,\n          'default',\n        );\n      }\n    } else if (option.defaultValue !== undefined) {\n      this.setOptionValueWithSource(name, option.defaultValue, 'default');\n    }\n\n    // handler for cli and env supplied values\n    const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n      // val is null for optional option used without an optional-argument.\n      // val is undefined for boolean and negated option.\n      if (val == null && option.presetArg !== undefined) {\n        val = option.presetArg;\n      }\n\n      // custom processing\n      const oldValue = this.getOptionValue(name);\n      if (val !== null && option.parseArg) {\n        val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n      } else if (val !== null && option.variadic) {\n        val = option._concatValue(val, oldValue);\n      }\n\n      // Fill-in appropriate missing values. Long winded but easy to follow.\n      if (val == null) {\n        if (option.negate) {\n          val = false;\n        } else if (option.isBoolean() || option.optional) {\n          val = true;\n        } else {\n          val = ''; // not normal, parseArg might have failed or be a mock function for testing\n        }\n      }\n      this.setOptionValueWithSource(name, val, valueSource);\n    };\n\n    this.on('option:' + oname, (val) => {\n      const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n      handleOptionValue(val, invalidValueMessage, 'cli');\n    });\n\n    if (option.envVar) {\n      this.on('optionEnv:' + oname, (val) => {\n        const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n        handleOptionValue(val, invalidValueMessage, 'env');\n      });\n    }\n\n    return this;\n  }\n\n  /**\n   * Internal implementation shared by .option() and .requiredOption()\n   *\n   * @return {Command} `this` command for chaining\n   * @private\n   */\n  _optionEx(config, flags, description, fn, defaultValue) {\n    if (typeof flags === 'object' && flags instanceof Option) {\n      throw new Error(\n        'To add an Option object use addOption() instead of option() or requiredOption()',\n      );\n    }\n    const option = this.createOption(flags, description);\n    option.makeOptionMandatory(!!config.mandatory);\n    if (typeof fn === 'function') {\n      option.default(defaultValue).argParser(fn);\n    } else if (fn instanceof RegExp) {\n      // deprecated\n      const regex = fn;\n      fn = (val, def) => {\n        const m = regex.exec(val);\n        return m ? m[0] : def;\n      };\n      option.default(defaultValue).argParser(fn);\n    } else {\n      option.default(fn);\n    }\n\n    return this.addOption(option);\n  }\n\n  /**\n   * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n   *\n   * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n   * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n   *\n   * See the README for more details, and see also addOption() and requiredOption().\n   *\n   * @example\n   * program\n   *     .option('-p, --pepper', 'add pepper')\n   *     .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n   *     .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n   *     .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n   *\n   * @param {string} flags\n   * @param {string} [description]\n   * @param {(Function|*)} [parseArg] - custom option processing function or default value\n   * @param {*} [defaultValue]\n   * @return {Command} `this` command for chaining\n   */\n\n  option(flags, description, parseArg, defaultValue) {\n    return this._optionEx({}, flags, description, parseArg, defaultValue);\n  }\n\n  /**\n   * Add a required option which must have a value after parsing. This usually means\n   * the option must be specified on the command line. (Otherwise the same as .option().)\n   *\n   * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n   *\n   * @param {string} flags\n   * @param {string} [description]\n   * @param {(Function|*)} [parseArg] - custom option processing function or default value\n   * @param {*} [defaultValue]\n   * @return {Command} `this` command for chaining\n   */\n\n  requiredOption(flags, description, parseArg, defaultValue) {\n    return this._optionEx(\n      { mandatory: true },\n      flags,\n      description,\n      parseArg,\n      defaultValue,\n    );\n  }\n\n  /**\n   * Alter parsing of short flags with optional values.\n   *\n   * @example\n   * // for `.option('-f,--flag [value]'):\n   * program.combineFlagAndOptionalValue(true);  // `-f80` is treated like `--flag=80`, this is the default behaviour\n   * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n   *\n   * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n   * @return {Command} `this` command for chaining\n   */\n  combineFlagAndOptionalValue(combine = true) {\n    this._combineFlagAndOptionalValue = !!combine;\n    return this;\n  }\n\n  /**\n   * Allow unknown options on the command line.\n   *\n   * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n   * @return {Command} `this` command for chaining\n   */\n  allowUnknownOption(allowUnknown = true) {\n    this._allowUnknownOption = !!allowUnknown;\n    return this;\n  }\n\n  /**\n   * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n   *\n   * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n   * @return {Command} `this` command for chaining\n   */\n  allowExcessArguments(allowExcess = true) {\n    this._allowExcessArguments = !!allowExcess;\n    return this;\n  }\n\n  /**\n   * Enable positional options. Positional means global options are specified before subcommands which lets\n   * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n   * The default behaviour is non-positional and global options may appear anywhere on the command line.\n   *\n   * @param {boolean} [positional]\n   * @return {Command} `this` command for chaining\n   */\n  enablePositionalOptions(positional = true) {\n    this._enablePositionalOptions = !!positional;\n    return this;\n  }\n\n  /**\n   * Pass through options that come after command-arguments rather than treat them as command-options,\n   * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n   * positional options to have been enabled on the program (parent commands).\n   * The default behaviour is non-positional and options may appear before or after command-arguments.\n   *\n   * @param {boolean} [passThrough] for unknown options.\n   * @return {Command} `this` command for chaining\n   */\n  passThroughOptions(passThrough = true) {\n    this._passThroughOptions = !!passThrough;\n    this._checkForBrokenPassThrough();\n    return this;\n  }\n\n  /**\n   * @private\n   */\n\n  _checkForBrokenPassThrough() {\n    if (\n      this.parent &&\n      this._passThroughOptions &&\n      !this.parent._enablePositionalOptions\n    ) {\n      throw new Error(\n        `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n      );\n    }\n  }\n\n  /**\n   * Whether to store option values as properties on command object,\n   * or store separately (specify false). In both cases the option values can be accessed using .opts().\n   *\n   * @param {boolean} [storeAsProperties=true]\n   * @return {Command} `this` command for chaining\n   */\n\n  storeOptionsAsProperties(storeAsProperties = true) {\n    if (this.options.length) {\n      throw new Error('call .storeOptionsAsProperties() before adding options');\n    }\n    if (Object.keys(this._optionValues).length) {\n      throw new Error(\n        'call .storeOptionsAsProperties() before setting option values',\n      );\n    }\n    this._storeOptionsAsProperties = !!storeAsProperties;\n    return this;\n  }\n\n  /**\n   * Retrieve option value.\n   *\n   * @param {string} key\n   * @return {object} value\n   */\n\n  getOptionValue(key) {\n    if (this._storeOptionsAsProperties) {\n      return this[key];\n    }\n    return this._optionValues[key];\n  }\n\n  /**\n   * Store option value.\n   *\n   * @param {string} key\n   * @param {object} value\n   * @return {Command} `this` command for chaining\n   */\n\n  setOptionValue(key, value) {\n    return this.setOptionValueWithSource(key, value, undefined);\n  }\n\n  /**\n   * Store option value and where the value came from.\n   *\n   * @param {string} key\n   * @param {object} value\n   * @param {string} source - expected values are default/config/env/cli/implied\n   * @return {Command} `this` command for chaining\n   */\n\n  setOptionValueWithSource(key, value, source) {\n    if (this._storeOptionsAsProperties) {\n      this[key] = value;\n    } else {\n      this._optionValues[key] = value;\n    }\n    this._optionValueSources[key] = source;\n    return this;\n  }\n\n  /**\n   * Get source of option value.\n   * Expected values are default | config | env | cli | implied\n   *\n   * @param {string} key\n   * @return {string}\n   */\n\n  getOptionValueSource(key) {\n    return this._optionValueSources[key];\n  }\n\n  /**\n   * Get source of option value. See also .optsWithGlobals().\n   * Expected values are default | config | env | cli | implied\n   *\n   * @param {string} key\n   * @return {string}\n   */\n\n  getOptionValueSourceWithGlobals(key) {\n    // global overwrites local, like optsWithGlobals\n    let source;\n    this._getCommandAndAncestors().forEach((cmd) => {\n      if (cmd.getOptionValueSource(key) !== undefined) {\n        source = cmd.getOptionValueSource(key);\n      }\n    });\n    return source;\n  }\n\n  /**\n   * Get user arguments from implied or explicit arguments.\n   * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n   *\n   * @private\n   */\n\n  _prepareUserArgs(argv, parseOptions) {\n    if (argv !== undefined && !Array.isArray(argv)) {\n      throw new Error('first parameter to parse must be array or undefined');\n    }\n    parseOptions = parseOptions || {};\n\n    // auto-detect argument conventions if nothing supplied\n    if (argv === undefined && parseOptions.from === undefined) {\n      if (process.versions?.electron) {\n        parseOptions.from = 'electron';\n      }\n      // check node specific options for scenarios where user CLI args follow executable without scriptname\n      const execArgv = process.execArgv ?? [];\n      if (\n        execArgv.includes('-e') ||\n        execArgv.includes('--eval') ||\n        execArgv.includes('-p') ||\n        execArgv.includes('--print')\n      ) {\n        parseOptions.from = 'eval'; // internal usage, not documented\n      }\n    }\n\n    // default to using process.argv\n    if (argv === undefined) {\n      argv = process.argv;\n    }\n    this.rawArgs = argv.slice();\n\n    // extract the user args and scriptPath\n    let userArgs;\n    switch (parseOptions.from) {\n      case undefined:\n      case 'node':\n        this._scriptPath = argv[1];\n        userArgs = argv.slice(2);\n        break;\n      case 'electron':\n        // @ts-ignore: because defaultApp is an unknown property\n        if (process.defaultApp) {\n          this._scriptPath = argv[1];\n          userArgs = argv.slice(2);\n        } else {\n          userArgs = argv.slice(1);\n        }\n        break;\n      case 'user':\n        userArgs = argv.slice(0);\n        break;\n      case 'eval':\n        userArgs = argv.slice(1);\n        break;\n      default:\n        throw new Error(\n          `unexpected parse option { from: '${parseOptions.from}' }`,\n        );\n    }\n\n    // Find default name for program from arguments.\n    if (!this._name && this._scriptPath)\n      this.nameFromFilename(this._scriptPath);\n    this._name = this._name || 'program';\n\n    return userArgs;\n  }\n\n  /**\n   * Parse `argv`, setting options and invoking commands when defined.\n   *\n   * Use parseAsync instead of parse if any of your action handlers are async.\n   *\n   * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n   *\n   * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n   * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n   * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n   * - `'user'`: just user arguments\n   *\n   * @example\n   * program.parse(); // parse process.argv and auto-detect electron and special node flags\n   * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n   * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n   *\n   * @param {string[]} [argv] - optional, defaults to process.argv\n   * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n   * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n   * @return {Command} `this` command for chaining\n   */\n\n  parse(argv, parseOptions) {\n    this._prepareForParse();\n    const userArgs = this._prepareUserArgs(argv, parseOptions);\n    this._parseCommand([], userArgs);\n\n    return this;\n  }\n\n  /**\n   * Parse `argv`, setting options and invoking commands when defined.\n   *\n   * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n   *\n   * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n   * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n   * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n   * - `'user'`: just user arguments\n   *\n   * @example\n   * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n   * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n   * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n   *\n   * @param {string[]} [argv]\n   * @param {object} [parseOptions]\n   * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n   * @return {Promise}\n   */\n\n  async parseAsync(argv, parseOptions) {\n    this._prepareForParse();\n    const userArgs = this._prepareUserArgs(argv, parseOptions);\n    await this._parseCommand([], userArgs);\n\n    return this;\n  }\n\n  _prepareForParse() {\n    if (this._savedState === null) {\n      this.saveStateBeforeParse();\n    } else {\n      this.restoreStateBeforeParse();\n    }\n  }\n\n  /**\n   * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n   * Not usually called directly, but available for subclasses to save their custom state.\n   *\n   * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n   */\n  saveStateBeforeParse() {\n    this._savedState = {\n      // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n      _name: this._name,\n      // option values before parse have default values (including false for negated options)\n      // shallow clones\n      _optionValues: { ...this._optionValues },\n      _optionValueSources: { ...this._optionValueSources },\n    };\n  }\n\n  /**\n   * Restore state before parse for calls after the first.\n   * Not usually called directly, but available for subclasses to save their custom state.\n   *\n   * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n   */\n  restoreStateBeforeParse() {\n    if (this._storeOptionsAsProperties)\n      throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n    // clear state from _prepareUserArgs\n    this._name = this._savedState._name;\n    this._scriptPath = null;\n    this.rawArgs = [];\n    // clear state from setOptionValueWithSource\n    this._optionValues = { ...this._savedState._optionValues };\n    this._optionValueSources = { ...this._savedState._optionValueSources };\n    // clear state from _parseCommand\n    this.args = [];\n    // clear state from _processArguments\n    this.processedArgs = [];\n  }\n\n  /**\n   * Throw if expected executable is missing. Add lots of help for author.\n   *\n   * @param {string} executableFile\n   * @param {string} executableDir\n   * @param {string} subcommandName\n   */\n  _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n    if (fs.existsSync(executableFile)) return;\n\n    const executableDirMessage = executableDir\n      ? `searched for local subcommand relative to directory '${executableDir}'`\n      : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n    const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n    throw new Error(executableMissing);\n  }\n\n  /**\n   * Execute a sub-command executable.\n   *\n   * @private\n   */\n\n  _executeSubCommand(subcommand, args) {\n    args = args.slice();\n    let launchWithNode = false; // Use node for source targets so do not need to get permissions correct, and on Windows.\n    const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n    function findFile(baseDir, baseName) {\n      // Look for specified file\n      const localBin = path.resolve(baseDir, baseName);\n      if (fs.existsSync(localBin)) return localBin;\n\n      // Stop looking if candidate already has an expected extension.\n      if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n      // Try all the extensions.\n      const foundExt = sourceExt.find((ext) =>\n        fs.existsSync(`${localBin}${ext}`),\n      );\n      if (foundExt) return `${localBin}${foundExt}`;\n\n      return undefined;\n    }\n\n    // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n    this._checkForMissingMandatoryOptions();\n    this._checkForConflictingOptions();\n\n    // executableFile and executableDir might be full path, or just a name\n    let executableFile =\n      subcommand._executableFile || `${this._name}-${subcommand._name}`;\n    let executableDir = this._executableDir || '';\n    if (this._scriptPath) {\n      let resolvedScriptPath; // resolve possible symlink for installed npm binary\n      try {\n        resolvedScriptPath = fs.realpathSync(this._scriptPath);\n      } catch {\n        resolvedScriptPath = this._scriptPath;\n      }\n      executableDir = path.resolve(\n        path.dirname(resolvedScriptPath),\n        executableDir,\n      );\n    }\n\n    // Look for a local file in preference to a command in PATH.\n    if (executableDir) {\n      let localFile = findFile(executableDir, executableFile);\n\n      // Legacy search using prefix of script name instead of command name\n      if (!localFile && !subcommand._executableFile && this._scriptPath) {\n        const legacyName = path.basename(\n          this._scriptPath,\n          path.extname(this._scriptPath),\n        );\n        if (legacyName !== this._name) {\n          localFile = findFile(\n            executableDir,\n            `${legacyName}-${subcommand._name}`,\n          );\n        }\n      }\n      executableFile = localFile || executableFile;\n    }\n\n    launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n    let proc;\n    if (process.platform !== 'win32') {\n      if (launchWithNode) {\n        args.unshift(executableFile);\n        // add executable arguments to spawn\n        args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n        proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n      } else {\n        proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n      }\n    } else {\n      this._checkForMissingExecutable(\n        executableFile,\n        executableDir,\n        subcommand._name,\n      );\n      args.unshift(executableFile);\n      // add executable arguments to spawn\n      args = incrementNodeInspectorPort(process.execArgv).concat(args);\n      proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n    }\n\n    if (!proc.killed) {\n      // testing mainly to avoid leak warnings during unit tests with mocked spawn\n      const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n      signals.forEach((signal) => {\n        process.on(signal, () => {\n          if (proc.killed === false && proc.exitCode === null) {\n            // @ts-ignore because signals not typed to known strings\n            proc.kill(signal);\n          }\n        });\n      });\n    }\n\n    // By default terminate process when spawned process terminates.\n    const exitCallback = this._exitCallback;\n    proc.on('close', (code) => {\n      code = code ?? 1; // code is null if spawned process terminated due to a signal\n      if (!exitCallback) {\n        process.exit(code);\n      } else {\n        exitCallback(\n          new CommanderError(\n            code,\n            'commander.executeSubCommandAsync',\n            '(close)',\n          ),\n        );\n      }\n    });\n    proc.on('error', (err) => {\n      // @ts-ignore: because err.code is an unknown property\n      if (err.code === 'ENOENT') {\n        this._checkForMissingExecutable(\n          executableFile,\n          executableDir,\n          subcommand._name,\n        );\n        // @ts-ignore: because err.code is an unknown property\n      } else if (err.code === 'EACCES') {\n        throw new Error(`'${executableFile}' not executable`);\n      }\n      if (!exitCallback) {\n        process.exit(1);\n      } else {\n        const wrappedError = new CommanderError(\n          1,\n          'commander.executeSubCommandAsync',\n          '(error)',\n        );\n        wrappedError.nestedError = err;\n        exitCallback(wrappedError);\n      }\n    });\n\n    // Store the reference to the child process\n    this.runningCommand = proc;\n  }\n\n  /**\n   * @private\n   */\n\n  _dispatchSubcommand(commandName, operands, unknown) {\n    const subCommand = this._findCommand(commandName);\n    if (!subCommand) this.help({ error: true });\n\n    subCommand._prepareForParse();\n    let promiseChain;\n    promiseChain = this._chainOrCallSubCommandHook(\n      promiseChain,\n      subCommand,\n      'preSubcommand',\n    );\n    promiseChain = this._chainOrCall(promiseChain, () => {\n      if (subCommand._executableHandler) {\n        this._executeSubCommand(subCommand, operands.concat(unknown));\n      } else {\n        return subCommand._parseCommand(operands, unknown);\n      }\n    });\n    return promiseChain;\n  }\n\n  /**\n   * Invoke help directly if possible, or dispatch if necessary.\n   * e.g. help foo\n   *\n   * @private\n   */\n\n  _dispatchHelpCommand(subcommandName) {\n    if (!subcommandName) {\n      this.help();\n    }\n    const subCommand = this._findCommand(subcommandName);\n    if (subCommand && !subCommand._executableHandler) {\n      subCommand.help();\n    }\n\n    // Fallback to parsing the help flag to invoke the help.\n    return this._dispatchSubcommand(\n      subcommandName,\n      [],\n      [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n    );\n  }\n\n  /**\n   * Check this.args against expected this.registeredArguments.\n   *\n   * @private\n   */\n\n  _checkNumberOfArguments() {\n    // too few\n    this.registeredArguments.forEach((arg, i) => {\n      if (arg.required && this.args[i] == null) {\n        this.missingArgument(arg.name());\n      }\n    });\n    // too many\n    if (\n      this.registeredArguments.length > 0 &&\n      this.registeredArguments[this.registeredArguments.length - 1].variadic\n    ) {\n      return;\n    }\n    if (this.args.length > this.registeredArguments.length) {\n      this._excessArguments(this.args);\n    }\n  }\n\n  /**\n   * Process this.args using this.registeredArguments and save as this.processedArgs!\n   *\n   * @private\n   */\n\n  _processArguments() {\n    const myParseArg = (argument, value, previous) => {\n      // Extra processing for nice error message on parsing failure.\n      let parsedValue = value;\n      if (value !== null && argument.parseArg) {\n        const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n        parsedValue = this._callParseArg(\n          argument,\n          value,\n          previous,\n          invalidValueMessage,\n        );\n      }\n      return parsedValue;\n    };\n\n    this._checkNumberOfArguments();\n\n    const processedArgs = [];\n    this.registeredArguments.forEach((declaredArg, index) => {\n      let value = declaredArg.defaultValue;\n      if (declaredArg.variadic) {\n        // Collect together remaining arguments for passing together as an array.\n        if (index < this.args.length) {\n          value = this.args.slice(index);\n          if (declaredArg.parseArg) {\n            value = value.reduce((processed, v) => {\n              return myParseArg(declaredArg, v, processed);\n            }, declaredArg.defaultValue);\n          }\n        } else if (value === undefined) {\n          value = [];\n        }\n      } else if (index < this.args.length) {\n        value = this.args[index];\n        if (declaredArg.parseArg) {\n          value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n        }\n      }\n      processedArgs[index] = value;\n    });\n    this.processedArgs = processedArgs;\n  }\n\n  /**\n   * Once we have a promise we chain, but call synchronously until then.\n   *\n   * @param {(Promise|undefined)} promise\n   * @param {Function} fn\n   * @return {(Promise|undefined)}\n   * @private\n   */\n\n  _chainOrCall(promise, fn) {\n    // thenable\n    if (promise && promise.then && typeof promise.then === 'function') {\n      // already have a promise, chain callback\n      return promise.then(() => fn());\n    }\n    // callback might return a promise\n    return fn();\n  }\n\n  /**\n   *\n   * @param {(Promise|undefined)} promise\n   * @param {string} event\n   * @return {(Promise|undefined)}\n   * @private\n   */\n\n  _chainOrCallHooks(promise, event) {\n    let result = promise;\n    const hooks = [];\n    this._getCommandAndAncestors()\n      .reverse()\n      .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n      .forEach((hookedCommand) => {\n        hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n          hooks.push({ hookedCommand, callback });\n        });\n      });\n    if (event === 'postAction') {\n      hooks.reverse();\n    }\n\n    hooks.forEach((hookDetail) => {\n      result = this._chainOrCall(result, () => {\n        return hookDetail.callback(hookDetail.hookedCommand, this);\n      });\n    });\n    return result;\n  }\n\n  /**\n   *\n   * @param {(Promise|undefined)} promise\n   * @param {Command} subCommand\n   * @param {string} event\n   * @return {(Promise|undefined)}\n   * @private\n   */\n\n  _chainOrCallSubCommandHook(promise, subCommand, event) {\n    let result = promise;\n    if (this._lifeCycleHooks[event] !== undefined) {\n      this._lifeCycleHooks[event].forEach((hook) => {\n        result = this._chainOrCall(result, () => {\n          return hook(this, subCommand);\n        });\n      });\n    }\n    return result;\n  }\n\n  /**\n   * Process arguments in context of this command.\n   * Returns action result, in case it is a promise.\n   *\n   * @private\n   */\n\n  _parseCommand(operands, unknown) {\n    const parsed = this.parseOptions(unknown);\n    this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n    this._parseOptionsImplied();\n    operands = operands.concat(parsed.operands);\n    unknown = parsed.unknown;\n    this.args = operands.concat(unknown);\n\n    if (operands && this._findCommand(operands[0])) {\n      return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n    }\n    if (\n      this._getHelpCommand() &&\n      operands[0] === this._getHelpCommand().name()\n    ) {\n      return this._dispatchHelpCommand(operands[1]);\n    }\n    if (this._defaultCommandName) {\n      this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n      return this._dispatchSubcommand(\n        this._defaultCommandName,\n        operands,\n        unknown,\n      );\n    }\n    if (\n      this.commands.length &&\n      this.args.length === 0 &&\n      !this._actionHandler &&\n      !this._defaultCommandName\n    ) {\n      // probably missing subcommand and no handler, user needs help (and exit)\n      this.help({ error: true });\n    }\n\n    this._outputHelpIfRequested(parsed.unknown);\n    this._checkForMissingMandatoryOptions();\n    this._checkForConflictingOptions();\n\n    // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n    const checkForUnknownOptions = () => {\n      if (parsed.unknown.length > 0) {\n        this.unknownOption(parsed.unknown[0]);\n      }\n    };\n\n    const commandEvent = `command:${this.name()}`;\n    if (this._actionHandler) {\n      checkForUnknownOptions();\n      this._processArguments();\n\n      let promiseChain;\n      promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n      promiseChain = this._chainOrCall(promiseChain, () =>\n        this._actionHandler(this.processedArgs),\n      );\n      if (this.parent) {\n        promiseChain = this._chainOrCall(promiseChain, () => {\n          this.parent.emit(commandEvent, operands, unknown); // legacy\n        });\n      }\n      promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n      return promiseChain;\n    }\n    if (this.parent && this.parent.listenerCount(commandEvent)) {\n      checkForUnknownOptions();\n      this._processArguments();\n      this.parent.emit(commandEvent, operands, unknown); // legacy\n    } else if (operands.length) {\n      if (this._findCommand('*')) {\n        // legacy default command\n        return this._dispatchSubcommand('*', operands, unknown);\n      }\n      if (this.listenerCount('command:*')) {\n        // skip option check, emit event for possible misspelling suggestion\n        this.emit('command:*', operands, unknown);\n      } else if (this.commands.length) {\n        this.unknownCommand();\n      } else {\n        checkForUnknownOptions();\n        this._processArguments();\n      }\n    } else if (this.commands.length) {\n      checkForUnknownOptions();\n      // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n      this.help({ error: true });\n    } else {\n      checkForUnknownOptions();\n      this._processArguments();\n      // fall through for caller to handle after calling .parse()\n    }\n  }\n\n  /**\n   * Find matching command.\n   *\n   * @private\n   * @return {Command | undefined}\n   */\n  _findCommand(name) {\n    if (!name) return undefined;\n    return this.commands.find(\n      (cmd) => cmd._name === name || cmd._aliases.includes(name),\n    );\n  }\n\n  /**\n   * Return an option matching `arg` if any.\n   *\n   * @param {string} arg\n   * @return {Option}\n   * @package\n   */\n\n  _findOption(arg) {\n    return this.options.find((option) => option.is(arg));\n  }\n\n  /**\n   * Display an error message if a mandatory option does not have a value.\n   * Called after checking for help flags in leaf subcommand.\n   *\n   * @private\n   */\n\n  _checkForMissingMandatoryOptions() {\n    // Walk up hierarchy so can call in subcommand after checking for displaying help.\n    this._getCommandAndAncestors().forEach((cmd) => {\n      cmd.options.forEach((anOption) => {\n        if (\n          anOption.mandatory &&\n          cmd.getOptionValue(anOption.attributeName()) === undefined\n        ) {\n          cmd.missingMandatoryOptionValue(anOption);\n        }\n      });\n    });\n  }\n\n  /**\n   * Display an error message if conflicting options are used together in this.\n   *\n   * @private\n   */\n  _checkForConflictingLocalOptions() {\n    const definedNonDefaultOptions = this.options.filter((option) => {\n      const optionKey = option.attributeName();\n      if (this.getOptionValue(optionKey) === undefined) {\n        return false;\n      }\n      return this.getOptionValueSource(optionKey) !== 'default';\n    });\n\n    const optionsWithConflicting = definedNonDefaultOptions.filter(\n      (option) => option.conflictsWith.length > 0,\n    );\n\n    optionsWithConflicting.forEach((option) => {\n      const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n        option.conflictsWith.includes(defined.attributeName()),\n      );\n      if (conflictingAndDefined) {\n        this._conflictingOption(option, conflictingAndDefined);\n      }\n    });\n  }\n\n  /**\n   * Display an error message if conflicting options are used together.\n   * Called after checking for help flags in leaf subcommand.\n   *\n   * @private\n   */\n  _checkForConflictingOptions() {\n    // Walk up hierarchy so can call in subcommand after checking for displaying help.\n    this._getCommandAndAncestors().forEach((cmd) => {\n      cmd._checkForConflictingLocalOptions();\n    });\n  }\n\n  /**\n   * Parse options from `argv` removing known options,\n   * and return argv split into operands and unknown arguments.\n   *\n   * Side effects: modifies command by storing options. Does not reset state if called again.\n   *\n   * Examples:\n   *\n   *     argv => operands, unknown\n   *     --known kkk op => [op], []\n   *     op --known kkk => [op], []\n   *     sub --unknown uuu op => [sub], [--unknown uuu op]\n   *     sub -- --unknown uuu op => [sub --unknown uuu op], []\n   *\n   * @param {string[]} argv\n   * @return {{operands: string[], unknown: string[]}}\n   */\n\n  parseOptions(argv) {\n    const operands = []; // operands, not options or values\n    const unknown = []; // first unknown option and remaining unknown args\n    let dest = operands;\n    const args = argv.slice();\n\n    function maybeOption(arg) {\n      return arg.length > 1 && arg[0] === '-';\n    }\n\n    // parse options\n    let activeVariadicOption = null;\n    while (args.length) {\n      const arg = args.shift();\n\n      // literal\n      if (arg === '--') {\n        if (dest === unknown) dest.push(arg);\n        dest.push(...args);\n        break;\n      }\n\n      if (activeVariadicOption && !maybeOption(arg)) {\n        this.emit(`option:${activeVariadicOption.name()}`, arg);\n        continue;\n      }\n      activeVariadicOption = null;\n\n      if (maybeOption(arg)) {\n        const option = this._findOption(arg);\n        // recognised option, call listener to assign value with possible custom processing\n        if (option) {\n          if (option.required) {\n            const value = args.shift();\n            if (value === undefined) this.optionMissingArgument(option);\n            this.emit(`option:${option.name()}`, value);\n          } else if (option.optional) {\n            let value = null;\n            // historical behaviour is optional value is following arg unless an option\n            if (args.length > 0 && !maybeOption(args[0])) {\n              value = args.shift();\n            }\n            this.emit(`option:${option.name()}`, value);\n          } else {\n            // boolean flag\n            this.emit(`option:${option.name()}`);\n          }\n          activeVariadicOption = option.variadic ? option : null;\n          continue;\n        }\n      }\n\n      // Look for combo options following single dash, eat first one if known.\n      if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n        const option = this._findOption(`-${arg[1]}`);\n        if (option) {\n          if (\n            option.required ||\n            (option.optional && this._combineFlagAndOptionalValue)\n          ) {\n            // option with value following in same argument\n            this.emit(`option:${option.name()}`, arg.slice(2));\n          } else {\n            // boolean option, emit and put back remainder of arg for further processing\n            this.emit(`option:${option.name()}`);\n            args.unshift(`-${arg.slice(2)}`);\n          }\n          continue;\n        }\n      }\n\n      // Look for known long flag with value, like --foo=bar\n      if (/^--[^=]+=/.test(arg)) {\n        const index = arg.indexOf('=');\n        const option = this._findOption(arg.slice(0, index));\n        if (option && (option.required || option.optional)) {\n          this.emit(`option:${option.name()}`, arg.slice(index + 1));\n          continue;\n        }\n      }\n\n      // Not a recognised option by this command.\n      // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n      // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n      if (maybeOption(arg)) {\n        dest = unknown;\n      }\n\n      // If using positionalOptions, stop processing our options at subcommand.\n      if (\n        (this._enablePositionalOptions || this._passThroughOptions) &&\n        operands.length === 0 &&\n        unknown.length === 0\n      ) {\n        if (this._findCommand(arg)) {\n          operands.push(arg);\n          if (args.length > 0) unknown.push(...args);\n          break;\n        } else if (\n          this._getHelpCommand() &&\n          arg === this._getHelpCommand().name()\n        ) {\n          operands.push(arg);\n          if (args.length > 0) operands.push(...args);\n          break;\n        } else if (this._defaultCommandName) {\n          unknown.push(arg);\n          if (args.length > 0) unknown.push(...args);\n          break;\n        }\n      }\n\n      // If using passThroughOptions, stop processing options at first command-argument.\n      if (this._passThroughOptions) {\n        dest.push(arg);\n        if (args.length > 0) dest.push(...args);\n        break;\n      }\n\n      // add arg\n      dest.push(arg);\n    }\n\n    return { operands, unknown };\n  }\n\n  /**\n   * Return an object containing local option values as key-value pairs.\n   *\n   * @return {object}\n   */\n  opts() {\n    if (this._storeOptionsAsProperties) {\n      // Preserve original behaviour so backwards compatible when still using properties\n      const result = {};\n      const len = this.options.length;\n\n      for (let i = 0; i < len; i++) {\n        const key = this.options[i].attributeName();\n        result[key] =\n          key === this._versionOptionName ? this._version : this[key];\n      }\n      return result;\n    }\n\n    return this._optionValues;\n  }\n\n  /**\n   * Return an object containing merged local and global option values as key-value pairs.\n   *\n   * @return {object}\n   */\n  optsWithGlobals() {\n    // globals overwrite locals\n    return this._getCommandAndAncestors().reduce(\n      (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n      {},\n    );\n  }\n\n  /**\n   * Display error message and exit (or call exitOverride).\n   *\n   * @param {string} message\n   * @param {object} [errorOptions]\n   * @param {string} [errorOptions.code] - an id string representing the error\n   * @param {number} [errorOptions.exitCode] - used with process.exit\n   */\n  error(message, errorOptions) {\n    // output handling\n    this._outputConfiguration.outputError(\n      `${message}\\n`,\n      this._outputConfiguration.writeErr,\n    );\n    if (typeof this._showHelpAfterError === 'string') {\n      this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n    } else if (this._showHelpAfterError) {\n      this._outputConfiguration.writeErr('\\n');\n      this.outputHelp({ error: true });\n    }\n\n    // exit handling\n    const config = errorOptions || {};\n    const exitCode = config.exitCode || 1;\n    const code = config.code || 'commander.error';\n    this._exit(exitCode, code, message);\n  }\n\n  /**\n   * Apply any option related environment variables, if option does\n   * not have a value from cli or client code.\n   *\n   * @private\n   */\n  _parseOptionsEnv() {\n    this.options.forEach((option) => {\n      if (option.envVar && option.envVar in process.env) {\n        const optionKey = option.attributeName();\n        // Priority check. Do not overwrite cli or options from unknown source (client-code).\n        if (\n          this.getOptionValue(optionKey) === undefined ||\n          ['default', 'config', 'env'].includes(\n            this.getOptionValueSource(optionKey),\n          )\n        ) {\n          if (option.required || option.optional) {\n            // option can take a value\n            // keep very simple, optional always takes value\n            this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n          } else {\n            // boolean\n            // keep very simple, only care that envVar defined and not the value\n            this.emit(`optionEnv:${option.name()}`);\n          }\n        }\n      }\n    });\n  }\n\n  /**\n   * Apply any implied option values, if option is undefined or default value.\n   *\n   * @private\n   */\n  _parseOptionsImplied() {\n    const dualHelper = new DualOptions(this.options);\n    const hasCustomOptionValue = (optionKey) => {\n      return (\n        this.getOptionValue(optionKey) !== undefined &&\n        !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n      );\n    };\n    this.options\n      .filter(\n        (option) =>\n          option.implied !== undefined &&\n          hasCustomOptionValue(option.attributeName()) &&\n          dualHelper.valueFromOption(\n            this.getOptionValue(option.attributeName()),\n            option,\n          ),\n      )\n      .forEach((option) => {\n        Object.keys(option.implied)\n          .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n          .forEach((impliedKey) => {\n            this.setOptionValueWithSource(\n              impliedKey,\n              option.implied[impliedKey],\n              'implied',\n            );\n          });\n      });\n  }\n\n  /**\n   * Argument `name` is missing.\n   *\n   * @param {string} name\n   * @private\n   */\n\n  missingArgument(name) {\n    const message = `error: missing required argument '${name}'`;\n    this.error(message, { code: 'commander.missingArgument' });\n  }\n\n  /**\n   * `Option` is missing an argument.\n   *\n   * @param {Option} option\n   * @private\n   */\n\n  optionMissingArgument(option) {\n    const message = `error: option '${option.flags}' argument missing`;\n    this.error(message, { code: 'commander.optionMissingArgument' });\n  }\n\n  /**\n   * `Option` does not have a value, and is a mandatory option.\n   *\n   * @param {Option} option\n   * @private\n   */\n\n  missingMandatoryOptionValue(option) {\n    const message = `error: required option '${option.flags}' not specified`;\n    this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n  }\n\n  /**\n   * `Option` conflicts with another option.\n   *\n   * @param {Option} option\n   * @param {Option} conflictingOption\n   * @private\n   */\n  _conflictingOption(option, conflictingOption) {\n    // The calling code does not know whether a negated option is the source of the\n    // value, so do some work to take an educated guess.\n    const findBestOptionFromValue = (option) => {\n      const optionKey = option.attributeName();\n      const optionValue = this.getOptionValue(optionKey);\n      const negativeOption = this.options.find(\n        (target) => target.negate && optionKey === target.attributeName(),\n      );\n      const positiveOption = this.options.find(\n        (target) => !target.negate && optionKey === target.attributeName(),\n      );\n      if (\n        negativeOption &&\n        ((negativeOption.presetArg === undefined && optionValue === false) ||\n          (negativeOption.presetArg !== undefined &&\n            optionValue === negativeOption.presetArg))\n      ) {\n        return negativeOption;\n      }\n      return positiveOption || option;\n    };\n\n    const getErrorMessage = (option) => {\n      const bestOption = findBestOptionFromValue(option);\n      const optionKey = bestOption.attributeName();\n      const source = this.getOptionValueSource(optionKey);\n      if (source === 'env') {\n        return `environment variable '${bestOption.envVar}'`;\n      }\n      return `option '${bestOption.flags}'`;\n    };\n\n    const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n    this.error(message, { code: 'commander.conflictingOption' });\n  }\n\n  /**\n   * Unknown option `flag`.\n   *\n   * @param {string} flag\n   * @private\n   */\n\n  unknownOption(flag) {\n    if (this._allowUnknownOption) return;\n    let suggestion = '';\n\n    if (flag.startsWith('--') && this._showSuggestionAfterError) {\n      // Looping to pick up the global options too\n      let candidateFlags = [];\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      let command = this;\n      do {\n        const moreFlags = command\n          .createHelp()\n          .visibleOptions(command)\n          .filter((option) => option.long)\n          .map((option) => option.long);\n        candidateFlags = candidateFlags.concat(moreFlags);\n        command = command.parent;\n      } while (command && !command._enablePositionalOptions);\n      suggestion = suggestSimilar(flag, candidateFlags);\n    }\n\n    const message = `error: unknown option '${flag}'${suggestion}`;\n    this.error(message, { code: 'commander.unknownOption' });\n  }\n\n  /**\n   * Excess arguments, more than expected.\n   *\n   * @param {string[]} receivedArgs\n   * @private\n   */\n\n  _excessArguments(receivedArgs) {\n    if (this._allowExcessArguments) return;\n\n    const expected = this.registeredArguments.length;\n    const s = expected === 1 ? '' : 's';\n    const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n    const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;\n    this.error(message, { code: 'commander.excessArguments' });\n  }\n\n  /**\n   * Unknown command.\n   *\n   * @private\n   */\n\n  unknownCommand() {\n    const unknownName = this.args[0];\n    let suggestion = '';\n\n    if (this._showSuggestionAfterError) {\n      const candidateNames = [];\n      this.createHelp()\n        .visibleCommands(this)\n        .forEach((command) => {\n          candidateNames.push(command.name());\n          // just visible alias\n          if (command.alias()) candidateNames.push(command.alias());\n        });\n      suggestion = suggestSimilar(unknownName, candidateNames);\n    }\n\n    const message = `error: unknown command '${unknownName}'${suggestion}`;\n    this.error(message, { code: 'commander.unknownCommand' });\n  }\n\n  /**\n   * Get or set the program version.\n   *\n   * This method auto-registers the \"-V, --version\" option which will print the version number.\n   *\n   * You can optionally supply the flags and description to override the defaults.\n   *\n   * @param {string} [str]\n   * @param {string} [flags]\n   * @param {string} [description]\n   * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n   */\n\n  version(str, flags, description) {\n    if (str === undefined) return this._version;\n    this._version = str;\n    flags = flags || '-V, --version';\n    description = description || 'output the version number';\n    const versionOption = this.createOption(flags, description);\n    this._versionOptionName = versionOption.attributeName();\n    this._registerOption(versionOption);\n\n    this.on('option:' + versionOption.name(), () => {\n      this._outputConfiguration.writeOut(`${str}\\n`);\n      this._exit(0, 'commander.version', str);\n    });\n    return this;\n  }\n\n  /**\n   * Set the description.\n   *\n   * @param {string} [str]\n   * @param {object} [argsDescription]\n   * @return {(string|Command)}\n   */\n  description(str, argsDescription) {\n    if (str === undefined && argsDescription === undefined)\n      return this._description;\n    this._description = str;\n    if (argsDescription) {\n      this._argsDescription = argsDescription;\n    }\n    return this;\n  }\n\n  /**\n   * Set the summary. Used when listed as subcommand of parent.\n   *\n   * @param {string} [str]\n   * @return {(string|Command)}\n   */\n  summary(str) {\n    if (str === undefined) return this._summary;\n    this._summary = str;\n    return this;\n  }\n\n  /**\n   * Set an alias for the command.\n   *\n   * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n   *\n   * @param {string} [alias]\n   * @return {(string|Command)}\n   */\n\n  alias(alias) {\n    if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n    /** @type {Command} */\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    let command = this;\n    if (\n      this.commands.length !== 0 &&\n      this.commands[this.commands.length - 1]._executableHandler\n    ) {\n      // assume adding alias for last added executable subcommand, rather than this\n      command = this.commands[this.commands.length - 1];\n    }\n\n    if (alias === command._name)\n      throw new Error(\"Command alias can't be the same as its name\");\n    const matchingCommand = this.parent?._findCommand(alias);\n    if (matchingCommand) {\n      // c.f. _registerCommand\n      const existingCmd = [matchingCommand.name()]\n        .concat(matchingCommand.aliases())\n        .join('|');\n      throw new Error(\n        `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n      );\n    }\n\n    command._aliases.push(alias);\n    return this;\n  }\n\n  /**\n   * Set aliases for the command.\n   *\n   * Only the first alias is shown in the auto-generated help.\n   *\n   * @param {string[]} [aliases]\n   * @return {(string[]|Command)}\n   */\n\n  aliases(aliases) {\n    // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n    if (aliases === undefined) return this._aliases;\n\n    aliases.forEach((alias) => this.alias(alias));\n    return this;\n  }\n\n  /**\n   * Set / get the command usage `str`.\n   *\n   * @param {string} [str]\n   * @return {(string|Command)}\n   */\n\n  usage(str) {\n    if (str === undefined) {\n      if (this._usage) return this._usage;\n\n      const args = this.registeredArguments.map((arg) => {\n        return humanReadableArgName(arg);\n      });\n      return []\n        .concat(\n          this.options.length || this._helpOption !== null ? '[options]' : [],\n          this.commands.length ? '[command]' : [],\n          this.registeredArguments.length ? args : [],\n        )\n        .join(' ');\n    }\n\n    this._usage = str;\n    return this;\n  }\n\n  /**\n   * Get or set the name of the command.\n   *\n   * @param {string} [str]\n   * @return {(string|Command)}\n   */\n\n  name(str) {\n    if (str === undefined) return this._name;\n    this._name = str;\n    return this;\n  }\n\n  /**\n   * Set the name of the command from script filename, such as process.argv[1],\n   * or require.main.filename, or __filename.\n   *\n   * (Used internally and public although not documented in README.)\n   *\n   * @example\n   * program.nameFromFilename(require.main.filename);\n   *\n   * @param {string} filename\n   * @return {Command}\n   */\n\n  nameFromFilename(filename) {\n    this._name = path.basename(filename, path.extname(filename));\n\n    return this;\n  }\n\n  /**\n   * Get or set the directory for searching for executable subcommands of this command.\n   *\n   * @example\n   * program.executableDir(__dirname);\n   * // or\n   * program.executableDir('subcommands');\n   *\n   * @param {string} [path]\n   * @return {(string|null|Command)}\n   */\n\n  executableDir(path) {\n    if (path === undefined) return this._executableDir;\n    this._executableDir = path;\n    return this;\n  }\n\n  /**\n   * Return program help documentation.\n   *\n   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n   * @return {string}\n   */\n\n  helpInformation(contextOptions) {\n    const helper = this.createHelp();\n    const context = this._getOutputContext(contextOptions);\n    helper.prepareContext({\n      error: context.error,\n      helpWidth: context.helpWidth,\n      outputHasColors: context.hasColors,\n    });\n    const text = helper.formatHelp(this, helper);\n    if (context.hasColors) return text;\n    return this._outputConfiguration.stripColor(text);\n  }\n\n  /**\n   * @typedef HelpContext\n   * @type {object}\n   * @property {boolean} error\n   * @property {number} helpWidth\n   * @property {boolean} hasColors\n   * @property {function} write - includes stripColor if needed\n   *\n   * @returns {HelpContext}\n   * @private\n   */\n\n  _getOutputContext(contextOptions) {\n    contextOptions = contextOptions || {};\n    const error = !!contextOptions.error;\n    let baseWrite;\n    let hasColors;\n    let helpWidth;\n    if (error) {\n      baseWrite = (str) => this._outputConfiguration.writeErr(str);\n      hasColors = this._outputConfiguration.getErrHasColors();\n      helpWidth = this._outputConfiguration.getErrHelpWidth();\n    } else {\n      baseWrite = (str) => this._outputConfiguration.writeOut(str);\n      hasColors = this._outputConfiguration.getOutHasColors();\n      helpWidth = this._outputConfiguration.getOutHelpWidth();\n    }\n    const write = (str) => {\n      if (!hasColors) str = this._outputConfiguration.stripColor(str);\n      return baseWrite(str);\n    };\n    return { error, write, hasColors, helpWidth };\n  }\n\n  /**\n   * Output help information for this command.\n   *\n   * Outputs built-in help, and custom text added using `.addHelpText()`.\n   *\n   * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n   */\n\n  outputHelp(contextOptions) {\n    let deprecatedCallback;\n    if (typeof contextOptions === 'function') {\n      deprecatedCallback = contextOptions;\n      contextOptions = undefined;\n    }\n\n    const outputContext = this._getOutputContext(contextOptions);\n    /** @type {HelpTextEventContext} */\n    const eventContext = {\n      error: outputContext.error,\n      write: outputContext.write,\n      command: this,\n    };\n\n    this._getCommandAndAncestors()\n      .reverse()\n      .forEach((command) => command.emit('beforeAllHelp', eventContext));\n    this.emit('beforeHelp', eventContext);\n\n    let helpInformation = this.helpInformation({ error: outputContext.error });\n    if (deprecatedCallback) {\n      helpInformation = deprecatedCallback(helpInformation);\n      if (\n        typeof helpInformation !== 'string' &&\n        !Buffer.isBuffer(helpInformation)\n      ) {\n        throw new Error('outputHelp callback must return a string or a Buffer');\n      }\n    }\n    outputContext.write(helpInformation);\n\n    if (this._getHelpOption()?.long) {\n      this.emit(this._getHelpOption().long); // deprecated\n    }\n    this.emit('afterHelp', eventContext);\n    this._getCommandAndAncestors().forEach((command) =>\n      command.emit('afterAllHelp', eventContext),\n    );\n  }\n\n  /**\n   * You can pass in flags and a description to customise the built-in help option.\n   * Pass in false to disable the built-in help option.\n   *\n   * @example\n   * program.helpOption('-?, --help' 'show help'); // customise\n   * program.helpOption(false); // disable\n   *\n   * @param {(string | boolean)} flags\n   * @param {string} [description]\n   * @return {Command} `this` command for chaining\n   */\n\n  helpOption(flags, description) {\n    // Support disabling built-in help option.\n    if (typeof flags === 'boolean') {\n      // true is not an expected value. Do something sensible but no unit-test.\n      // istanbul ignore if\n      if (flags) {\n        this._helpOption = this._helpOption ?? undefined; // preserve existing option\n      } else {\n        this._helpOption = null; // disable\n      }\n      return this;\n    }\n\n    // Customise flags and description.\n    flags = flags ?? '-h, --help';\n    description = description ?? 'display help for command';\n    this._helpOption = this.createOption(flags, description);\n\n    return this;\n  }\n\n  /**\n   * Lazy create help option.\n   * Returns null if has been disabled with .helpOption(false).\n   *\n   * @returns {(Option | null)} the help option\n   * @package\n   */\n  _getHelpOption() {\n    // Lazy create help option on demand.\n    if (this._helpOption === undefined) {\n      this.helpOption(undefined, undefined);\n    }\n    return this._helpOption;\n  }\n\n  /**\n   * Supply your own option to use for the built-in help option.\n   * This is an alternative to using helpOption() to customise the flags and description etc.\n   *\n   * @param {Option} option\n   * @return {Command} `this` command for chaining\n   */\n  addHelpOption(option) {\n    this._helpOption = option;\n    return this;\n  }\n\n  /**\n   * Output help information and exit.\n   *\n   * Outputs built-in help, and custom text added using `.addHelpText()`.\n   *\n   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n   */\n\n  help(contextOptions) {\n    this.outputHelp(contextOptions);\n    let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n    if (\n      exitCode === 0 &&\n      contextOptions &&\n      typeof contextOptions !== 'function' &&\n      contextOptions.error\n    ) {\n      exitCode = 1;\n    }\n    // message: do not have all displayed text available so only passing placeholder.\n    this._exit(exitCode, 'commander.help', '(outputHelp)');\n  }\n\n  /**\n   * // Do a little typing to coordinate emit and listener for the help text events.\n   * @typedef HelpTextEventContext\n   * @type {object}\n   * @property {boolean} error\n   * @property {Command} command\n   * @property {function} write\n   */\n\n  /**\n   * Add additional text to be displayed with the built-in help.\n   *\n   * Position is 'before' or 'after' to affect just this command,\n   * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n   *\n   * @param {string} position - before or after built-in help\n   * @param {(string | Function)} text - string to add, or a function returning a string\n   * @return {Command} `this` command for chaining\n   */\n\n  addHelpText(position, text) {\n    const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n    if (!allowedValues.includes(position)) {\n      throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n    }\n\n    const helpEvent = `${position}Help`;\n    this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n      let helpStr;\n      if (typeof text === 'function') {\n        helpStr = text({ error: context.error, command: context.command });\n      } else {\n        helpStr = text;\n      }\n      // Ignore falsy value when nothing to output.\n      if (helpStr) {\n        context.write(`${helpStr}\\n`);\n      }\n    });\n    return this;\n  }\n\n  /**\n   * Output help information if help flags specified\n   *\n   * @param {Array} args - array of options to search for help flags\n   * @private\n   */\n\n  _outputHelpIfRequested(args) {\n    const helpOption = this._getHelpOption();\n    const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n    if (helpRequested) {\n      this.outputHelp();\n      // (Do not have all displayed text available so only passing placeholder.)\n      this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n    }\n  }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n  // Testing for these options:\n  //  --inspect[=[host:]port]\n  //  --inspect-brk[=[host:]port]\n  //  --inspect-port=[host:]port\n  return args.map((arg) => {\n    if (!arg.startsWith('--inspect')) {\n      return arg;\n    }\n    let debugOption;\n    let debugHost = '127.0.0.1';\n    let debugPort = '9229';\n    let match;\n    if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n      // e.g. --inspect\n      debugOption = match[1];\n    } else if (\n      (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n    ) {\n      debugOption = match[1];\n      if (/^\\d+$/.test(match[3])) {\n        // e.g. --inspect=1234\n        debugPort = match[3];\n      } else {\n        // e.g. --inspect=localhost\n        debugHost = match[3];\n      }\n    } else if (\n      (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n    ) {\n      // e.g. --inspect=localhost:1234\n      debugOption = match[1];\n      debugHost = match[3];\n      debugPort = match[4];\n    }\n\n    if (debugOption && debugPort !== '0') {\n      return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n    }\n    return arg;\n  });\n}\n\n/**\n * @returns {boolean | undefined}\n * @package\n */\nfunction useColor() {\n  // Test for common conventions.\n  // NB: the observed behaviour is in combination with how author adds color! For example:\n  //   - we do not test NODE_DISABLE_COLORS, but util:styletext does\n  //   - we do test NO_COLOR, but Chalk does not\n  //\n  // References:\n  // https://no-color.org\n  // https://bixense.com/clicolors/\n  // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n  // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n  // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n  if (\n    process.env.NO_COLOR ||\n    process.env.FORCE_COLOR === '0' ||\n    process.env.FORCE_COLOR === 'false'\n  )\n    return false;\n  if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n    return true;\n  return undefined;\n}\n\nexports.Command = Command;\nexports.useColor = useColor; // exporting for tests\n","const { Argument } = require('./lib/argument.js');\nconst { Command } = require('./lib/command.js');\nconst { CommanderError, InvalidArgumentError } = require('./lib/error.js');\nconst { Help } = require('./lib/help.js');\nconst { Option } = require('./lib/option.js');\n\nexports.program = new Command();\n\nexports.createCommand = (name) => new Command(name);\nexports.createOption = (flags, description) => new Option(flags, description);\nexports.createArgument = (name, description) => new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexports.Command = Command;\nexports.Option = Option;\nexports.Argument = Argument;\nexports.Help = Help;\n\nexports.CommanderError = CommanderError;\nexports.InvalidArgumentError = InvalidArgumentError;\nexports.InvalidOptionArgumentError = InvalidArgumentError; // Deprecated\n","import commander from './index.js';\n\n// wrapper to provide named exports for ESM.\nexport const {\n  program,\n  createCommand,\n  createArgument,\n  createOption,\n  CommanderError,\n  InvalidArgumentError,\n  InvalidOptionArgumentError, // deprecated old name\n  Command,\n  Argument,\n  Option,\n  Help,\n} = commander;\n","type Params = {\n  easyedaPartNumber: string\n  easyedaModelUuid: string\n}\n\nexport const getModelObjCdnUrl = ({\n  easyedaModelUuid,\n  easyedaPartNumber,\n}: Params): string => {\n  return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.obj?uuid=${easyedaModelUuid}`\n}\n\nexport const getModelStepCdnUrl = ({\n  easyedaModelUuid,\n  easyedaPartNumber,\n}: Params): string => {\n  return `https://modelcdn.tscircuit.com/easyeda_models/assets/${easyedaPartNumber}.step?uuid=${easyedaModelUuid}`\n}\n\nexport const getModelCdnUrl = getModelObjCdnUrl\n","import type { RawEasyEdaJson } from \"../schemas/easy-eda-json-schema\"\nimport { getModelCdnUrl } from \"./get-model-cdn-url\"\n\ntype ModelBounds = {\n  min: { x: number; y: number; z: number }\n  max: { x: number; y: number; z: number }\n}\n\nconst getModelUuidFromRawPackageDetail = (result: RawEasyEdaJson) => {\n  const shapes = result.packageDetail?.dataStr?.shape\n  if (!Array.isArray(shapes)) return null\n\n  for (const shape of shapes) {\n    if (typeof shape !== \"string\" || !shape.startsWith(\"SVGNODE~\")) continue\n\n    const svgNodeJson = shape.slice(\"SVGNODE~\".length)\n    try {\n      const svgNode = JSON.parse(svgNodeJson)\n      const modelUuid = svgNode?.attrs?.uuid\n      if (typeof modelUuid === \"string\" && modelUuid.length > 0) {\n        return modelUuid\n      }\n    } catch {}\n  }\n\n  return null\n}\n\nconst parseObjBounds = (objText: string): ModelBounds | null => {\n  let minX = Number.POSITIVE_INFINITY\n  let minY = Number.POSITIVE_INFINITY\n  let minZ = Number.POSITIVE_INFINITY\n  let maxX = Number.NEGATIVE_INFINITY\n  let maxY = Number.NEGATIVE_INFINITY\n  let maxZ = Number.NEGATIVE_INFINITY\n  let vertexCount = 0\n\n  for (const line of objText.split(/\\r?\\n/)) {\n    const trimmed = line.trim()\n    if (!trimmed.startsWith(\"v \")) continue\n\n    const [, xStr, yStr, zStr] = trimmed.split(/\\s+/, 4)\n    const x = Number(xStr)\n    const y = Number(yStr)\n    const z = Number(zStr)\n\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n      continue\n    }\n\n    vertexCount += 1\n    minX = Math.min(minX, x)\n    minY = Math.min(minY, y)\n    minZ = Math.min(minZ, z)\n    maxX = Math.max(maxX, x)\n    maxY = Math.max(maxY, y)\n    maxZ = Math.max(maxZ, z)\n  }\n\n  if (vertexCount === 0) return null\n\n  return {\n    min: { x: minX, y: minY, z: minZ },\n    max: { x: maxX, y: maxY, z: maxZ },\n  }\n}\n\nexport async function fetchEasyEDAComponent(\n  jlcpcbPartNumber: string,\n  {\n    fetch = globalThis.fetch,\n    includeModelMetadata = true,\n  }: {\n    fetch?: typeof globalThis.fetch\n    includeModelMetadata?: boolean\n  } = {},\n): Promise<RawEasyEdaJson> {\n  const searchUrl = \"https://easyeda.com/api/components/search\"\n  const componentUrl = (uuid: string) =>\n    `https://easyeda.com/api/components/${uuid}?version=6.4.7&uuid=${uuid}&datastrid=`\n\n  const searchHeaders = {\n    authority: \"easyeda.com\",\n    pragma: \"no-cache\",\n    \"cache-control\": \"no-cache\",\n    accept: \"application/json, text/javascript, */*; q=0.01\",\n    \"x-requested-with\": \"XMLHttpRequest\",\n    \"user-agent\":\n      \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36\",\n    \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n    origin: \"https://easyeda.com\",\n    \"sec-fetch-site\": \"same-origin\",\n    \"sec-fetch-mode\": \"cors\",\n    \"sec-fetch-dest\": \"empty\",\n    referer: \"https://easyeda.com/editor\",\n    \"accept-language\": \"cs,en;q=0.9,sk;q=0.8,en-GB;q=0.7\",\n    cookie: \"<PUT your cookies here>\",\n  }\n\n  const searchData = `type=3&doctype%5B%5D=2&uid=0819f05c4eef4c71ace90d822a990e87&returnListStyle=classifyarr&wd=${jlcpcbPartNumber}&version=6.4.7`\n\n  // Perform the search request\n  const searchResponse = await fetch(searchUrl, {\n    method: \"POST\",\n    headers: searchHeaders,\n    body: searchData,\n  })\n\n  if (!searchResponse.ok) {\n    throw new Error(\"Failed to search for the component\")\n  }\n\n  const searchResult = await searchResponse.json()\n  if (!searchResult.success || !searchResult.result.lists.lcsc.length) {\n    throw new Error(\"Component not found\")\n  }\n\n  const bestMatchComponent =\n    searchResult.result.lists.lcsc.find(\n      (component: any) =>\n        component.dataStr.head.c_para[\"Supplier Part\"] === jlcpcbPartNumber,\n    ) ?? searchResult.result.lists.lcsc[0]\n\n  const componentUUID = bestMatchComponent.uuid\n\n  // Perform the component fetch request\n  const componentResponse = await fetch(componentUrl(componentUUID), {\n    method: \"GET\",\n    headers: {\n      ...searchHeaders,\n      referer: `https://easyeda.com/editor?uuid=${componentUUID}`,\n    },\n  })\n\n  if (!componentResponse.ok) {\n    throw new Error(\"Failed to fetch the component details\")\n  }\n\n  const componentResult = await componentResponse.json()\n  const result = componentResult.result as RawEasyEdaJson\n\n  if (includeModelMetadata) {\n    const modelUuid = getModelUuidFromRawPackageDetail(result)\n    const partNumber = result.lcsc?.number\n\n    if (modelUuid && partNumber) {\n      try {\n        const objUrl = getModelCdnUrl({\n          easyedaModelUuid: modelUuid,\n          easyedaPartNumber: partNumber,\n        })\n        const objResponse = await fetch(objUrl)\n        if (objResponse.ok) {\n          const objText = await objResponse.text()\n          const bounds = parseObjBounds(objText)\n          if (bounds) {\n            ;(\n              result as RawEasyEdaJson & {\n                _objMetadata?: { bounds: ModelBounds }\n              }\n            )._objMetadata = { bounds }\n          }\n        }\n      } catch (error) {\n        console.error(\n          `Error fetching model metadata for ${jlcpcbPartNumber}:`,\n          error,\n        )\n      }\n    }\n  }\n\n  return result\n}\n\n// Usage example\n// fetchEasyEDAComponent(\"C558438\")\n//   .then((component) => console.log(component))\n//   .catch((error) => console.error(error))\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\"\nimport { fetchEasyEDAComponent } from \"../lib/websafe/fetch-easyeda-json\"\nimport fs from \"fs/promises\"\nimport packageJson from \"../package.json\"\nimport { convertEasyEdaJsonToVariousFormats } from \"lib/convert-easyeda-json-to-various-formats\"\n\nconst program = new Command()\n\nprogram\n  .name(\"easyeda\")\n  .description(\"Convert EasyEDA JSON PCB footprints into various formats\")\n  .version(packageJson.version)\n\nprogram\n  .command(\"convert\")\n  .description(\"Convert EasyEDA JSON to various formats\")\n  .option(\"-i, --input <jlcpcbPartNumber>\", \"JLCPCB part number\")\n  .option(\"-o, --output <filename>\", \"Output filename\")\n  .option(\n    \"--output-format <format>\",\n    \"Output format (can be inferred from filename)\",\n  )\n  .action(async (options) => {\n    await convertEasyEdaJsonToVariousFormats({\n      jlcpcbPartNumberOrFilepath: options.input,\n      outputFilename: options.output,\n      outputFormat: options.outputFormat,\n    })\n  })\n\nprogram\n  .command(\"download\")\n  .description(\"Download JSON for footprint\")\n  .requiredOption(\"-i, --input <jlcpcbPartNumber>\", \"JLCPCB part number\")\n  .option(\"-o, --output <filename>\", \"Output filename\")\n  .action(async (options) => {\n    if (!options.output) {\n      options.output = `${options.input}.raweasy.json`\n    }\n    try {\n      const easyEdaJsonRes = await fetchEasyEDAComponent(options.input)\n      await fs.writeFile(\n        options.output,\n        JSON.stringify(easyEdaJsonRes, null, 2),\n      )\n      console.log(`Downloaded JSON footprint: ${options.output}`)\n    } catch (error: any) {\n      console.error(\"Error:\", error.message)\n    }\n  })\n\nprogram.parse(process.argv)\n// perfectCli(program, process.argv)\n","{\n  \"name\": \"easyeda\",\n  \"type\": \"module\",\n  \"version\": \"0.0.274\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/tscircuit/easyeda-converter\"\n  },\n  \"main\": \"./dist/index.js\",\n  \"devDependencies\": {\n    \"@biomejs/biome\": \"^1.9.4\",\n    \"@tscircuit/alphabet\": \"^0.0.22\",\n    \"@tscircuit/circuit-json-util\": \"^0.0.96\",\n    \"@tscircuit/math-utils\": \"^0.0.36\",\n    \"@tscircuit/mm\": \"^0.0.9\",\n    \"@tscircuit/props\": \"^0.0.567\",\n    \"@types/bun\": \"latest\",\n    \"bun-match-svg\": \"^0.0.13\",\n    \"circuit-json-to-gltf\": \"^0.0.106\",\n    \"circuit-to-svg\": \"^0.0.392\",\n    \"looks-same\": \"^9.0.1\",\n    \"poppygl\": \"^0.0.24\",\n    \"transformation-matrix\": \"^2.16.1\",\n    \"tscircuit\": \"^0.0.2002\",\n    \"tsup\": \"^8.5.0\"\n  },\n  \"peerDependencies\": {\n    \"typescript\": \"^5.5.2\",\n    \"zod\": \"3\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"default\": \"./dist/index.js\"\n    },\n    \"./browser\": {\n      \"types\": \"./dist/browser/index.d.ts\",\n      \"default\": \"./dist/browser/index.js\"\n    }\n  },\n  \"bin\": {\n    \"easyeda-converter\": \"./dist/main.cjs\",\n    \"easyeda\": \"./dist/main.cjs\"\n  },\n  \"scripts\": {\n    \"test\": \"bun test\",\n    \"cli\": \"bun cli/main.ts\",\n    \"build\": \"tsup\",\n    \"aider\": \"aider\",\n    \"format:check\": \"biome format .\",\n    \"format\": \"biome format . --write\",\n    \"add-test-for-part\": \"bun run scripts/add-test-for-part.ts\"\n  },\n  \"types\": \"./dist/index.d.ts\"\n}\n","const SI_PREFIX_VALUES = new Map<string, number>([\n  [\"T\", 1e12],\n  [\"G\", 1e9],\n  [\"M\", 1e6],\n  [\"K\", 1e3],\n  [\"k\", 1e3],\n  [\"\", 1],\n  [\"m\", 1e-3],\n  [\"µ\", 1e-6],\n  [\"u\", 1e-6],\n  [\"n\", 1e-9],\n  [\"p\", 1e-12],\n  [\"f\", 1e-15],\n])\n\nexport const SI_PREFIXES = [...SI_PREFIX_VALUES.keys()]\n\nexport function getSiPrefixMultiplier(prefix: string): number | undefined {\n  return SI_PREFIX_VALUES.get(prefix)\n}\n","import { getSiPrefixMultiplier } from \"./get-si-prefix-multiplier\"\n\nexport type BaseTscircuitUnit =\n  | \"ms\"\n  | \"mm\"\n  | \"g\"\n  | \"deg\"\n  | \"Hz\"\n  | \"ml\"\n  | \"V\"\n  | \"A\"\n  | \"Ω\"\n  | \"F\"\n  | \"H\"\n\ntype UnitInfo = {\n  baseUnit: BaseTscircuitUnit\n  conversionFactor: number\n}\n\nconst unitMappings: Record<\n  string,\n  { baseUnit: BaseTscircuitUnit; variants: Record<string, number> }\n> = {\n  Hz: {\n    baseUnit: \"Hz\",\n    variants: {\n      MHz: 1e6,\n      kHz: 1e3,\n      Hz: 1,\n    },\n  },\n  g: {\n    baseUnit: \"g\",\n    variants: {\n      kg: 1e3,\n      g: 1,\n    },\n  },\n  Ω: {\n    baseUnit: \"Ω\",\n    variants: {\n      mΩ: 1e-3,\n      mohm: 1e-3,\n      mOhm: 1e-3,\n      milliohm: 1e-3,\n      Ω: 1,\n      ohm: 1,\n      Ohm: 1,\n      kΩ: 1e3,\n      KΩ: 1e3,\n      kohm: 1e3,\n      kOhm: 1e3,\n      KOhm: 1e3,\n      Kohm: 1e3,\n      MΩ: 1e6,\n      Mohm: 1e6,\n      MOhm: 1e6,\n      megohm: 1e6,\n      Megohm: 1e6,\n      GΩ: 1e9,\n      Gohm: 1e9,\n      GOhm: 1e9,\n      TΩ: 1e12,\n      Tohm: 1e12,\n      TOhm: 1e12,\n    },\n  },\n  V: {\n    baseUnit: \"V\",\n    variants: {\n      mV: 1e-3,\n      V: 1,\n      kV: 1e3,\n      KV: 1e3,\n      MV: 1e6,\n      GV: 1e9,\n      TV: 1e12,\n    },\n  },\n  A: {\n    baseUnit: \"A\",\n    variants: {\n      µA: 1e-6,\n      mA: 1e-3,\n      ma: 1e-3,\n      A: 1,\n      kA: 1e3,\n      MA: 1e6,\n    },\n  },\n  F: {\n    baseUnit: \"F\",\n    variants: {\n      pF: 1e-12,\n      nF: 1e-9,\n      µF: 1e-6,\n      uF: 1e-6,\n      mF: 1e-3,\n      F: 1,\n      kF: 1e3,\n      KF: 1e3,\n      MF: 1e6,\n    },\n  },\n  H: {\n    baseUnit: \"H\",\n    variants: {\n      pH: 1e-12,\n      nH: 1e-9,\n      µH: 1e-6,\n      uH: 1e-6,\n      mH: 1e-3,\n      H: 1,\n      kH: 1e3,\n      KH: 1e3,\n      MH: 1e6,\n    },\n  },\n  ml: {\n    baseUnit: \"ml\",\n    variants: {\n      ml: 1,\n      mL: 1,\n      l: 1e3,\n      L: 1e3,\n    },\n  },\n  deg: {\n    baseUnit: \"deg\",\n    variants: {\n      rad: 180 / Math.PI,\n    },\n  },\n  ms: {\n    baseUnit: \"ms\",\n    variants: {\n      fs: 1e-12,\n      ps: 1e-9,\n      ns: 1e-6,\n      us: 1e-3,\n      µs: 1e-3,\n      ms: 1,\n      s: 1000,\n    },\n  },\n  mm: {\n    baseUnit: \"mm\",\n    variants: {\n      nm: 1e-6,\n      µm: 1e-3,\n      um: 1e-3,\n      mm: 1,\n      cm: 10,\n      dm: 100,\n      m: 1000,\n      km: 1e6,\n      in: 25.4,\n      ft: 304.8,\n      IN: 25.4,\n      FT: 304.8,\n      yd: 914.4,\n      mi: 1.609344e6,\n      mil: 0.0254,\n    },\n  },\n}\n\nconst unitMappingAndVariantSuffixes = new Set<string>()\nfor (const [baseUnit, info] of Object.entries(unitMappings)) {\n  unitMappingAndVariantSuffixes.add(baseUnit)\n  for (const variant of Object.keys(info.variants)) {\n    unitMappingAndVariantSuffixes.add(variant)\n  }\n}\n\nfunction getBaseTscircuitUnit(unit: string): UnitInfo {\n  for (const info of Object.values(unitMappings)) {\n    if (unit in info.variants) {\n      return {\n        baseUnit: info.baseUnit,\n        conversionFactor: info.variants[unit]!,\n      }\n    }\n\n    for (const [variant, conversionFactor] of Object.entries(info.variants)) {\n      if (!unit.endsWith(variant)) continue\n\n      const prefix = unit.slice(0, -variant.length)\n      const prefixMultiplier = getSiPrefixMultiplier(prefix)\n\n      if (prefixMultiplier == null) continue\n\n      return {\n        baseUnit: info.baseUnit,\n        conversionFactor: prefixMultiplier * conversionFactor,\n      }\n    }\n  }\n  return {\n    baseUnit: unit as BaseTscircuitUnit,\n    conversionFactor: 1,\n  }\n}\n\nexport function parseAndConvertSiUnit(\n  v: {\n    x: string | number\n    y: string | number\n  },\n  unitOfValue?: BaseTscircuitUnit,\n): {\n  parsedUnit: string | null\n  unitOfValue: BaseTscircuitUnit | null\n  value: { x: number; y: number } | null\n}\nexport function parseAndConvertSiUnit(\n  v: string | number | undefined | null,\n  unitOfValue?: BaseTscircuitUnit,\n): {\n  parsedUnit: string | null\n  unitOfValue: BaseTscircuitUnit | null\n  value: number | null\n}\nexport function parseAndConvertSiUnit(\n  v:\n    | string\n    | number\n    | undefined\n    | null\n    | { x: string | number; y: string | number },\n  unitOfValue?: BaseTscircuitUnit,\n): {\n  parsedUnit: string | null\n  unitOfValue: BaseTscircuitUnit | null\n  value: null | number | { x: number; y: number }\n} {\n  if (v === undefined || v === null)\n    return { parsedUnit: null, unitOfValue: null, value: null }\n  if (typeof v === \"string\" && v.match(/^-?[\\d.]+$/))\n    return {\n      value: Number.parseFloat(v),\n      parsedUnit: null,\n      unitOfValue: null,\n    }\n  if (typeof v === \"number\")\n    return { value: v, parsedUnit: null, unitOfValue: null }\n  if (typeof v === \"object\" && \"x\" in v && \"y\" in v) {\n    const firstResult = parseAndConvertSiUnit(v.x, unitOfValue)\n    const xResult = parseAndConvertSiUnit(v.x, unitOfValue)\n    const yResult = parseAndConvertSiUnit(v.y, unitOfValue)\n    if (xResult.value === null || yResult.value === null) {\n      return { parsedUnit: null, unitOfValue: null, value: null }\n    }\n    return {\n      parsedUnit: firstResult.parsedUnit,\n      unitOfValue: firstResult.unitOfValue,\n      value: {\n        x: xResult.value,\n        y: yResult.value,\n      },\n    }\n  }\n  const reversedInputString = v.toString().split(\"\").reverse().join(\"\")\n  const unitReversed = reversedInputString.match(/[^\\d\\s]+/)?.[0]\n  if (!unitReversed) {\n    throw new Error(`Could not determine unit: \"${v}\"`)\n  }\n  const unit = unitReversed.split(\"\").reverse().join(\"\")\n\n  const numberPart = v.slice(0, -unit.length)\n  const bareSiPrefixMultiplier = getSiPrefixMultiplier(unit)\n  if (unitOfValue && bareSiPrefixMultiplier != null) {\n    return {\n      parsedUnit: null,\n      unitOfValue,\n      value: Number.parseFloat(numberPart) * bareSiPrefixMultiplier,\n    }\n  }\n\n  if (\n    bareSiPrefixMultiplier != null &&\n    !unitMappingAndVariantSuffixes.has(unit)\n  ) {\n    return {\n      parsedUnit: null,\n      unitOfValue: null,\n      value: Number.parseFloat(numberPart) * bareSiPrefixMultiplier,\n    }\n  }\n\n  const { baseUnit, conversionFactor } = getBaseTscircuitUnit(unit)\n\n  return {\n    parsedUnit: unit,\n    unitOfValue: baseUnit,\n    value: conversionFactor * Number.parseFloat(numberPart),\n  }\n}\n","import { getSiPrefixMultiplier, SI_PREFIXES } from \"./get-si-prefix-multiplier\"\n\nconst SI_PREFIX_PATTERN = SI_PREFIXES\n  .filter((prefix) => prefix !== \"\")\n  .sort((a, b) => b.length - a.length)\n  .map((prefix) => prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n  .join(\"|\")\n\nconst SI_UNIT_PATTERN = new RegExp(\n  `^([+-]?(?:\\\\d+(?:\\\\.\\\\d*)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)(?:(${SI_PREFIX_PATTERN}))?$`,\n)\n\nexport function parseSiUnit(value?: string | null): number | undefined {\n  if (value == null) return undefined\n\n  const trimmed = value.trim()\n  if (trimmed === \"\") return undefined\n\n  const match = trimmed.match(SI_UNIT_PATTERN)\n  if (!match) return Number.NaN\n\n  const numericValue = Number(match[1])\n  const prefixValue = getSiPrefixMultiplier(match[2] ?? \"\")\n\n  if (prefixValue == null) return Number.NaN\n\n  return numericValue * prefixValue\n}\n","const SI_PREFIXES = [\n  { value: 1e12, symbol: \"T\" },\n  { value: 1e9, symbol: \"G\" },\n  { value: 1e6, symbol: \"M\" },\n  { value: 1e3, symbol: \"k\" },\n  { value: 1, symbol: \"\" },\n  { value: 1e-3, symbol: \"m\" },\n  { value: 1e-6, symbol: \"µ\" },\n  { value: 1e-9, symbol: \"n\" },\n  { value: 1e-12, symbol: \"p\" },\n]\n\nconst FALLBACK_PREFIX = SI_PREFIXES[SI_PREFIXES.length - 1]!\n\nexport function formatSiUnit(value?: number | null): string {\n  if (value == null) return \"\"\n  if (value === 0) return \"0\"\n\n  const absValue = Math.abs(value)\n\n  const prefix =\n    SI_PREFIXES.find((p) => {\n      const scaled = absValue / p.value\n      return scaled >= 1 && scaled < 1000\n    }) ?? FALLBACK_PREFIX\n\n  const scaled = value / prefix.value\n\n  let formatted = scaled.toPrecision(3)\n\n  // Only remove trailing zeros if there's a non-zero digit after the decimal\n  if (formatted.includes(\".\") && !/\\.0+$/.test(formatted)) {\n    formatted = formatted.replace(/0+$/, \"\")\n  }\n\n  // Remove any pure \".0\" or \".00\" suffixes\n  formatted = formatted.replace(/\\.0+$/, \"\")\n\n  return `${formatted}${prefix.symbol}`\n}\n\nexport { getSiPrefixMultiplier } from \"./get-si-prefix-multiplier\"\nexport { parseAndConvertSiUnit } from \"./parse-and-convert-si-unit\"\nexport type { BaseTscircuitUnit } from \"./parse-and-convert-si-unit\"\nexport { parseSiUnit } from \"./parse-si-unit\"\n","import { parseAndConvertSiUnit } from \"format-si-unit\"\nimport { z } from \"zod\"\nexport {\n  parseAndConvertSiUnit,\n  type BaseTscircuitUnit,\n} from \"format-si-unit\"\n\n// // Currently, removing uncommon SI Prefixes for type simplicity.\n// export type SIPrefix =\n//   // | \"y\"\n//   // | \"yocto\"\n//   // | \"z\"\n//   // | \"zepto\"\n//   // | \"atto\"\n//   // | \"a\"\n//   | \"femto\"\n//   | \"f\"\n//   | \"u\"\n//   | \"micro\"\n//   // | \"d\"\n//   // | \"deci\"\n//   | \"c\"\n//   | \"centi\"\n//   | \"m\"\n//   | \"milli\"\n//   | \"k\"\n//   | \"kilo\"\n//   | \"M\"\n//   | \"mega\"\n// // | \"G\"\n// // | \"T\"\n// // | \"P\"\n// // | \"E\"\n// // | \"Z\"\n// // | \"Y\"\n\n// export type UnitAbbreviations = {\n//   farad: \"F\"\n//   ohm: \"Ω\"\n//   henry: \"H\"\n//   meter: \"m\"\n//   volt: \"V\"\n//   inch: \"in\"\n//   foot: \"ft\"\n// }\n\n// export type Unit = keyof UnitAbbreviations\n// export type NumberWithUnit<T extends Unit> =\n//   | `${number}${T | UnitAbbreviations[T]}`\n//   | `${number} ${T | UnitAbbreviations[T]}`\n//   | `${number}${SIPrefix}${T | UnitAbbreviations[T]}`\n//   | `${number} ${SIPrefix}${T | UnitAbbreviations[T]}`\n// export type NumberWithAnyUnit =\n//   | `${number}${UnitOrAbbreviation}`\n//   | `${number} ${UnitOrAbbreviation}`\n//   | `${number}${SIPrefix}${UnitOrAbbreviation}`\n//   | `${number} ${SIPrefix}${UnitOrAbbreviation}`\n\n// TODO lots of validation to make sure the unit is valid etc.\nexport const resistance = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"Ω\").value!)\n\nexport const capacitance = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"F\").value!)\n  .transform((value) => {\n    return Number.parseFloat(value.toPrecision(12)) // Round to 12 significant digits\n  })\n\nexport const inductance = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"H\").value!)\n\nexport const voltage = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"V\").value!)\n\nexport const length = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v).value!)\n\nexport const frequency = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"Hz\").value!)\n\n/**\n * Length in meters\n */\nexport type Length = number\nexport type Distance = number\n\nexport const distance = length\n\nexport const current = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v, \"A\").value!)\n\nexport const duration_ms = z\n  .string()\n  .or(z.number())\n  .transform((v) => parseAndConvertSiUnit(v).value!)\n\nexport const time = duration_ms\n\nexport const ms = duration_ms\n\nexport const timestamp = z.string().datetime()\n\n/**\n * Rotation is always converted to degrees\n */\nexport const rotation = z\n  .string()\n  .or(z.number())\n  .transform((arg): number => {\n    if (typeof arg === \"number\") return arg\n    if (arg.endsWith(\"deg\")) {\n      return Number.parseFloat(arg.split(\"deg\")[0]!)\n    }\n    if (arg.endsWith(\"rad\")) {\n      return (Number.parseFloat(arg.split(\"rad\")[0]!) * 180) / Math.PI\n    }\n    return Number.parseFloat(arg)\n  })\n\nexport const battery_capacity = z\n  .number()\n  .or(z.string().endsWith(\"mAh\"))\n  .transform((v) => {\n    if (typeof v === \"string\") {\n      const valString = v.replace(\"mAh\", \"\")\n      const num = Number.parseFloat(valString)\n      if (Number.isNaN(num)) {\n        throw new Error(\"Invalid capacity\")\n      }\n      return num\n    }\n    return v\n  })\n  .describe(\"Battery capacity in mAh\")\n\nexport type InputRotation = number | string\nexport type Rotation = number\n","import { z } from \"zod\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const point = z.object({\n  x: distance,\n  y: distance,\n})\n\nexport const position = point\n\nexport type InputPoint = z.input<typeof point>\nexport type InputPosition = z.input<typeof position>\ntype InferredPoint = z.infer<typeof point>\ntype InferredPosition = z.infer<typeof position>\n\nexport interface Point {\n  x: number\n  y: number\n}\n\nexport interface Position {\n  x: number\n  y: number\n}\n\nexpectTypesMatch<Point, InferredPoint>(true)\nexpectTypesMatch<Position, InferredPosition>(true)\n","import type { TypeEqual } from \"ts-expect\"\n\ntype IsNever<T> = [T] extends [never] ? true : false\n\ntype GetMismatchedProps<T1, T2> = {\n  [K in keyof T1 & keyof T2]: T1[K] extends T2[K]\n    ? T2[K] extends T1[K]\n      ? never\n      : K\n    : K\n}[keyof T1 & keyof T2]\n\nexport const expectTypesMatch = <\n  const T1,\n  const T2,\n  T3 = Exclude<keyof T1, keyof T2>,\n  T4 = Exclude<keyof T2, keyof T1>,\n  T5 = GetMismatchedProps<T1, T2>,\n>(\n  shouldBe: IsNever<T3> extends true\n    ? IsNever<T4> extends true\n      ? IsNever<T5> extends true\n        ? TypeEqual<T1, T2>\n        : `mismatched prop types: ${T5 extends string ? T5 : \"\"}`\n      : `extra props ${T4 extends string ? T4 : \"\"}`\n    : `missing props ${T3 extends string ? T3 : \"\"}`,\n): void => {}\n\n// ------ TESTS -------\n\nexpectTypesMatch<\n  {\n    a: number\n  },\n  {\n    a: number\n    b: number\n  }\n>(\"extra props b\")\n\nexpectTypesMatch<\n  {\n    a: number\n    b: number\n  },\n  {\n    a: number\n  }\n>(\"missing props b\")\n\nexpectTypesMatch<\n  {\n    a: number\n  },\n  {\n    a: number\n  }\n>(true)\n\nexpectTypesMatch<\n  {\n    a: number\n  },\n  {\n    a: string\n  }\n>(\"mismatched prop types: a\")\n\n// ------ String Union Matching -------\n\nexport type ExpectStringUnionsMatch<\n  T1 extends string,\n  T2 extends string,\n  Diff1 = Exclude<T1, T2>,\n  Diff2 = Exclude<T2, T1>,\n> = IsNever<Diff1> extends true\n  ? IsNever<Diff2> extends true\n    ? true // Unions are identical\n    : `T2 has extra: \"${Diff2 extends string ? Diff2 : \"\"}\"` // T2 has elements not in T1\n  : IsNever<Diff2> extends true\n    ? `T1 has extra: \"${Diff1 extends string ? Diff1 : \"\"}\"` // T1 has elements not in T2\n    : `T1 has extra: \"${Diff1 extends string\n        ? Diff1\n        : \"\"}\", T2 has extra: \"${Diff2 extends string ? Diff2 : \"\"}\"` // Both have differences\n\nexport const expectStringUnionsMatch = <\n  const T1 extends string,\n  const T2 extends string,\n  ShouldBeTrue = ExpectStringUnionsMatch<T1, T2>,\n>(\n  shouldBe: ShouldBeTrue,\n): void => {}\n\n// ------ TESTS -------\n\ntype TestUnion1 = \"a\" | \"b\" | \"c\"\ntype TestUnion2 = \"a\" | \"b\" | \"c\"\ntype TestUnion3 = \"a\" | \"b\" | \"d\"\ntype TestUnion4 = \"a\" | \"b\"\n\nexpectStringUnionsMatch<TestUnion1, TestUnion2>(true)\nexpectStringUnionsMatch<TestUnion1, TestUnion3>(\n  'T1 has extra: \"c\", T2 has extra: \"d\"',\n)\nexpectStringUnionsMatch<TestUnion1, TestUnion4>('T1 has extra: \"c\"')\nexpectStringUnionsMatch<TestUnion4, TestUnion1>('T2 has extra: \"c\"')\nexpectStringUnionsMatch<TestUnion3, TestUnion1>(\n  'T1 has extra: \"d\", T2 has extra: \"c\"',\n)\n\n// Example of using @ts-expect-error for expected failures\n// @ts-expect-error Type '\"T2 has extra: \\\"d\\\"\"' is not assignable to type 'true'.\nexpectStringUnionsMatch<TestUnion1, TestUnion3>(true)\n","import { z } from \"zod\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const point3 = z.object({\n  x: distance,\n  y: distance,\n  z: distance,\n})\n\nexport const position3 = point3\n\ntype InferredPoint3 = z.infer<typeof point3>\n\nexport interface Point3 {\n  x: number\n  y: number\n  z: number\n}\n\nexpectTypesMatch<Point3, InferredPoint3>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const size = z.object({\n  width: z.number(),\n  height: z.number(),\n})\n\nexport type SizeInput = z.input<typeof size>\ntype InferredSize = z.infer<typeof size>\n\nexport interface Size {\n  width: number\n  height: number\n}\n\nexpectTypesMatch<Size, InferredSize>(true)\n","import { z } from \"zod\"\n\n// Generates a random string ID of specified length using alphanumeric characters\nconst randomId = (length: number): string => {\n  const chars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n  return Array.from(\n    { length },\n    () => chars[Math.floor(Math.random() * chars.length)],\n  ).join(\"\")\n}\n/**\n * Use this for primary keys for any circuit element\n */\nexport const getZodPrefixedIdWithDefault = (prefix: string) => {\n  return z\n    .string()\n    .optional()\n    .default(() => `${prefix}_${randomId(10)}`)\n}\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport type NinePointAnchor =\n  | \"top_left\"\n  | \"top_center\"\n  | \"top_right\"\n  | \"center_left\"\n  | \"center\"\n  | \"center_right\"\n  | \"bottom_left\"\n  | \"bottom_center\"\n  | \"bottom_right\"\n\nexport const ninePointAnchor = z.enum([\n  \"top_left\",\n  \"top_center\",\n  \"top_right\",\n  \"center_left\",\n  \"center\",\n  \"center_right\",\n  \"bottom_left\",\n  \"bottom_center\",\n  \"bottom_right\",\n])\n\ntype InferredNinePointAnchor = z.infer<typeof ninePointAnchor>\n\nexpectTypesMatch<NinePointAnchor, InferredNinePointAnchor>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport type PcbRenderLayer =\n  | \"top_silkscreen\"\n  | \"bottom_silkscreen\"\n  | \"top_copper\"\n  | \"bottom_copper\"\n  | \"top_soldermask\"\n  | \"bottom_soldermask\"\n  | \"top_fabrication_note\"\n  | \"bottom_fabrication_note\"\n  | \"top_user_note\"\n  | \"bottom_user_note\"\n  | \"top_courtyard\"\n  | \"bottom_courtyard\"\n  | \"inner1_copper\"\n  | \"inner2_copper\"\n  | \"inner3_copper\"\n  | \"inner4_copper\"\n  | \"inner5_copper\"\n  | \"inner6_copper\"\n  | \"edge_cuts\"\n  | \"drill\"\n\nexport const pcbRenderLayer = z.enum([\n  \"top_silkscreen\",\n  \"bottom_silkscreen\",\n  \"top_copper\",\n  \"bottom_copper\",\n  \"top_soldermask\",\n  \"bottom_soldermask\",\n  \"top_fabrication_note\",\n  \"bottom_fabrication_note\",\n  \"top_user_note\",\n  \"bottom_user_note\",\n  \"top_courtyard\",\n  \"bottom_courtyard\",\n  \"inner1_copper\",\n  \"inner2_copper\",\n  \"inner3_copper\",\n  \"inner4_copper\",\n  \"inner5_copper\",\n  \"inner6_copper\",\n  \"edge_cuts\",\n  \"drill\",\n])\n\ntype InferredPcbRenderLayer = z.infer<typeof pcbRenderLayer>\n\nexpectTypesMatch<PcbRenderLayer, InferredPcbRenderLayer>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const asset = z.object({\n  project_relative_path: z.string(),\n  url: z.string(),\n  mimetype: z.string(),\n})\n\nexport type AssetInput = z.input<typeof asset>\nexport type Asset = z.infer<typeof asset>\n\nexpectTypesMatch<Asset, AssetInput>(true)\n","import { z } from \"zod\"\nimport { point } from \"./point\"\nimport { point3 } from \"./point3\"\nimport { distance, rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface KicadAt {\n  x: number\n  y: number\n  rotation?: number\n}\n\nexport const kicadAt = point.extend({\n  rotation: rotation.optional(),\n})\n\ntype InferredKicadAt = z.infer<typeof kicadAt>\nexpectTypesMatch<KicadAt, InferredKicadAt>(true)\n\nexport interface KicadFont {\n  size?: { x: number; y: number }\n  thickness?: number\n}\n\nexport const kicadFont = z.object({\n  size: point.optional(),\n  thickness: distance.optional(),\n})\n\ntype InferredKicadFont = z.infer<typeof kicadFont>\nexpectTypesMatch<KicadFont, InferredKicadFont>(true)\n\nexport interface KicadEffects {\n  font?: KicadFont\n}\n\nexport const kicadEffects = z.object({\n  font: kicadFont.optional(),\n})\n\ntype InferredKicadEffects = z.infer<typeof kicadEffects>\nexpectTypesMatch<KicadEffects, InferredKicadEffects>(true)\n\nexport interface KicadProperty {\n  value: string\n  at?: KicadAt\n  layer?: string\n  uuid?: string\n  hide?: boolean\n  effects?: KicadEffects\n}\n\nexport const kicadProperty = z.object({\n  value: z.string(),\n  at: kicadAt.optional(),\n  layer: z.string().optional(),\n  uuid: z.string().optional(),\n  hide: z.boolean().optional(),\n  effects: kicadEffects.optional(),\n})\n\ntype InferredKicadProperty = z.infer<typeof kicadProperty>\nexpectTypesMatch<KicadProperty, InferredKicadProperty>(true)\n\nexport interface KicadFootprintProperties {\n  Reference?: KicadProperty\n  Value?: KicadProperty\n  Datasheet?: KicadProperty\n  Description?: KicadProperty\n}\n\nexport const kicadFootprintProperties = z.object({\n  Reference: kicadProperty.optional(),\n  Value: kicadProperty.optional(),\n  Datasheet: kicadProperty.optional(),\n  Description: kicadProperty.optional(),\n})\n\ntype InferredKicadFootprintProperties = z.infer<typeof kicadFootprintProperties>\nexpectTypesMatch<KicadFootprintProperties, InferredKicadFootprintProperties>(\n  true,\n)\n\nexport interface KicadFootprintAttributes {\n  through_hole?: boolean\n  smd?: boolean\n  exclude_from_pos_files?: boolean\n  exclude_from_bom?: boolean\n}\n\nexport const kicadFootprintAttributes = z.object({\n  through_hole: z.boolean().optional(),\n  smd: z.boolean().optional(),\n  exclude_from_pos_files: z.boolean().optional(),\n  exclude_from_bom: z.boolean().optional(),\n})\n\ntype InferredKicadFootprintAttributes = z.infer<typeof kicadFootprintAttributes>\nexpectTypesMatch<KicadFootprintAttributes, InferredKicadFootprintAttributes>(\n  true,\n)\n\nexport interface KicadFootprintPad {\n  name: string\n  type: string\n  shape?: string\n  at?: KicadAt\n  size?: { x: number; y: number }\n  drill?: number\n  layers?: string[]\n  removeUnusedLayers?: boolean\n  uuid?: string\n}\n\nexport const kicadFootprintPad = z.object({\n  name: z.string(),\n  type: z.string(),\n  shape: z.string().optional(),\n  at: kicadAt.optional(),\n  size: point.optional(),\n  drill: distance.optional(),\n  layers: z.array(z.string()).optional(),\n  removeUnusedLayers: z.boolean().optional(),\n  uuid: z.string().optional(),\n})\n\ntype InferredKicadFootprintPad = z.infer<typeof kicadFootprintPad>\nexpectTypesMatch<KicadFootprintPad, InferredKicadFootprintPad>(true)\n\nexport interface KicadFootprintModel {\n  path: string\n  offset?: { x: number; y: number; z: number }\n  scale?: { x: number; y: number; z: number }\n  rotate?: { x: number; y: number; z: number }\n}\n\nexport const kicadFootprintModel = z.object({\n  path: z.string(),\n  offset: point3.optional(),\n  scale: point3.optional(),\n  rotate: point3.optional(),\n})\n\ntype InferredKicadFootprintModel = z.infer<typeof kicadFootprintModel>\nexpectTypesMatch<KicadFootprintModel, InferredKicadFootprintModel>(true)\n\nexport interface KicadFootprintMetadata {\n  footprintName?: string\n  version?: number | string\n  generator?: string\n  generatorVersion?: number | string\n  layer?: string\n  properties?: KicadFootprintProperties\n  attributes?: KicadFootprintAttributes\n  pads?: KicadFootprintPad[]\n  embeddedFonts?: boolean\n  model?: KicadFootprintModel\n}\n\nexport const kicadFootprintMetadata = z.object({\n  footprintName: z.string().optional(),\n  version: z.union([z.number(), z.string()]).optional(),\n  generator: z.string().optional(),\n  generatorVersion: z.union([z.number(), z.string()]).optional(),\n  layer: z.string().optional(),\n  properties: kicadFootprintProperties.optional(),\n  attributes: kicadFootprintAttributes.optional(),\n  pads: z.array(kicadFootprintPad).optional(),\n  embeddedFonts: z.boolean().optional(),\n  model: kicadFootprintModel.optional(),\n})\n\ntype InferredKicadFootprintMetadata = z.infer<typeof kicadFootprintMetadata>\nexpectTypesMatch<KicadFootprintMetadata, InferredKicadFootprintMetadata>(true)\n","import { z } from \"zod\"\nimport { distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  kicadAt,\n  kicadFont,\n  type KicadAt,\n  type KicadFont,\n} from \"./kicadFootprintMetadata\"\n\nexport interface KicadSymbolPinNumbers {\n  hide?: boolean\n}\n\nexport const kicadSymbolPinNumbers = z.object({\n  hide: z.boolean().optional(),\n})\n\ntype InferredKicadSymbolPinNumbers = z.infer<typeof kicadSymbolPinNumbers>\nexpectTypesMatch<KicadSymbolPinNumbers, InferredKicadSymbolPinNumbers>(true)\n\nexport interface KicadSymbolPinNames {\n  offset?: number\n  hide?: boolean\n}\n\nexport const kicadSymbolPinNames = z.object({\n  offset: distance.optional(),\n  hide: z.boolean().optional(),\n})\n\ntype InferredKicadSymbolPinNames = z.infer<typeof kicadSymbolPinNames>\nexpectTypesMatch<KicadSymbolPinNames, InferredKicadSymbolPinNames>(true)\n\nexport interface KicadSymbolEffects {\n  font?: KicadFont\n  justify?: string | string[]\n  hide?: boolean\n}\n\nexport const kicadSymbolEffects = z.object({\n  font: kicadFont.optional(),\n  justify: z.union([z.string(), z.array(z.string())]).optional(),\n  hide: z.boolean().optional(),\n})\n\ntype InferredKicadSymbolEffects = z.infer<typeof kicadSymbolEffects>\nexpectTypesMatch<KicadSymbolEffects, InferredKicadSymbolEffects>(true)\n\nexport interface KicadSymbolProperty {\n  value: string\n  id?: number | string\n  at?: KicadAt\n  effects?: KicadSymbolEffects\n}\n\nexport const kicadSymbolProperty = z.object({\n  value: z.string(),\n  id: z.union([z.number(), z.string()]).optional(),\n  at: kicadAt.optional(),\n  effects: kicadSymbolEffects.optional(),\n})\n\ntype InferredKicadSymbolProperty = z.infer<typeof kicadSymbolProperty>\nexpectTypesMatch<KicadSymbolProperty, InferredKicadSymbolProperty>(true)\n\nexport interface KicadSymbolProperties {\n  Reference?: KicadSymbolProperty\n  Value?: KicadSymbolProperty\n  Footprint?: KicadSymbolProperty\n  Datasheet?: KicadSymbolProperty\n  Description?: KicadSymbolProperty\n  ki_keywords?: KicadSymbolProperty\n  ki_fp_filters?: KicadSymbolProperty\n}\n\nexport const kicadSymbolProperties = z.object({\n  Reference: kicadSymbolProperty.optional(),\n  Value: kicadSymbolProperty.optional(),\n  Footprint: kicadSymbolProperty.optional(),\n  Datasheet: kicadSymbolProperty.optional(),\n  Description: kicadSymbolProperty.optional(),\n  ki_keywords: kicadSymbolProperty.optional(),\n  ki_fp_filters: kicadSymbolProperty.optional(),\n})\n\ntype InferredKicadSymbolProperties = z.infer<typeof kicadSymbolProperties>\nexpectTypesMatch<KicadSymbolProperties, InferredKicadSymbolProperties>(true)\n\nexport interface KicadSymbolMetadata {\n  symbolName?: string\n  extends?: string\n  pinNumbers?: KicadSymbolPinNumbers\n  pinNames?: KicadSymbolPinNames\n  excludeFromSim?: boolean\n  inBom?: boolean\n  onBoard?: boolean\n  properties?: KicadSymbolProperties\n  embeddedFonts?: boolean\n}\n\nexport const kicadSymbolMetadata = z.object({\n  symbolName: z.string().optional(),\n  extends: z.string().optional(),\n  pinNumbers: kicadSymbolPinNumbers.optional(),\n  pinNames: kicadSymbolPinNames.optional(),\n  excludeFromSim: z.boolean().optional(),\n  inBom: z.boolean().optional(),\n  onBoard: z.boolean().optional(),\n  properties: kicadSymbolProperties.optional(),\n  embeddedFonts: z.boolean().optional(),\n})\n\ntype InferredKicadSymbolMetadata = z.infer<typeof kicadSymbolMetadata>\nexpectTypesMatch<KicadSymbolMetadata, InferredKicadSymbolMetadata>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const base_circuit_json_error = z.object({\n  error_type: z.string(),\n  message: z.string(),\n  is_fatal: z.boolean().optional(),\n})\n\nexport type BaseCircuitJsonErrorInput = z.input<typeof base_circuit_json_error>\ntype InferredBaseCircuitJsonError = z.infer<typeof base_circuit_json_error>\n\nexport interface BaseCircuitJsonError {\n  error_type: string\n  message: string\n  is_fatal?: boolean\n}\n\nexpectTypesMatch<BaseCircuitJsonError, InferredBaseCircuitJsonError>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { capacitance, distance, voltage } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_capacitor = source_component_base.extend({\n  ftype: z.literal(\"simple_capacitor\"),\n  capacitance,\n  max_voltage_rating: voltage.optional(),\n  display_capacitance: z.string().optional(),\n  max_decoupling_trace_length: distance.optional(),\n})\n\nexport type SourceSimpleCapacitorInput = z.input<typeof source_simple_capacitor>\ntype InferredSourceSimpleCapacitor = z.infer<typeof source_simple_capacitor>\n\n/**\n * Defines a simple capacitor component\n */\nexport interface SourceSimpleCapacitor extends SourceComponentBase {\n  ftype: \"simple_capacitor\"\n  capacitance: number\n  max_voltage_rating?: number\n  display_capacitance?: string\n  max_decoupling_trace_length?: number\n}\n\nexpectTypesMatch<SourceSimpleCapacitor, InferredSourceSimpleCapacitor>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const supplier_name = z.enum([\n  \"jlcpcb\",\n  \"macrofab\",\n  \"pcbway\",\n  \"digikey\",\n  \"mouser\",\n  \"lcsc\",\n])\n\ntype InferredSupplierName = z.infer<typeof supplier_name>\n\nexport type SupplierName =\n  | \"jlcpcb\"\n  | \"macrofab\"\n  | \"pcbway\"\n  | \"digikey\"\n  | \"mouser\"\n  | \"lcsc\"\n\nexpectTypesMatch<SupplierName, InferredSupplierName>(true)\n","import {\n  supplier_name,\n  type SupplierName,\n} from \"src/pcb/properties/supplier_name\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nexport interface SourceComponentBase {\n  type: \"source_component\"\n  ftype?: string\n  source_component_id: string\n  name: string\n  manufacturer_part_number?: string\n  supplier_part_numbers?: Partial<Record<SupplierName, string[]>>\n  display_value?: string\n  display_name?: string\n  are_pins_interchangeable?: boolean\n  internally_connected_source_port_ids?: string[][]\n  source_group_id?: string\n  subcircuit_id?: string\n}\n\nexport const source_component_base = z.object({\n  type: z.literal(\"source_component\"),\n  ftype: z.string().optional(),\n  source_component_id: z.string(),\n  name: z.string(),\n  manufacturer_part_number: z.string().optional(),\n  supplier_part_numbers: z\n    .record(supplier_name, z.array(z.string()))\n    .optional(),\n  display_value: z.string().optional(),\n  display_name: z.string().optional(),\n  are_pins_interchangeable: z.boolean().optional(),\n  internally_connected_source_port_ids: z.array(z.array(z.string())).optional(),\n  source_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n})\n\ntype InferredSourceComponentBase = z.infer<typeof source_component_base>\n\nexpectTypesMatch<SourceComponentBase, InferredSourceComponentBase>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { resistance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_resistor = source_component_base.extend({\n  ftype: z.literal(\"simple_resistor\"),\n  resistance,\n  display_resistance: z.string().optional(),\n})\n\nexport type SourceSimpleResistorInput = z.input<typeof source_simple_resistor>\ntype InferredSourceSimpleResistor = z.infer<typeof source_simple_resistor>\n\n/**\n * Defines a simple resistor component\n */\nexport interface SourceSimpleResistor extends SourceComponentBase {\n  ftype: \"simple_resistor\"\n  resistance: number\n  display_resistance?: string\n}\n\nexpectTypesMatch<SourceSimpleResistor, InferredSourceSimpleResistor>(true)\n","import {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_diode = source_component_base.extend({\n  ftype: z.literal(\"simple_diode\"),\n})\n\nexport type SourceSimpleDiodeInput = z.input<typeof source_simple_diode>\ntype InferredSourceSimpleDiode = z.infer<typeof source_simple_diode>\n\n/**\n * Defines a simple diode component\n */\nexport interface SourceSimpleDiode extends SourceComponentBase {\n  ftype: \"simple_diode\"\n}\n\nexpectTypesMatch<SourceSimpleDiode, InferredSourceSimpleDiode>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_fiducial = source_component_base.extend({\n  ftype: z.literal(\"simple_fiducial\"),\n})\n\nexport type SourceSimpleFiducialInput = z.input<typeof source_simple_fiducial>\ntype InferredSourceSimpleFiducial = z.infer<typeof source_simple_fiducial>\n\n/**\n * Defines a simple fiducial component\n */\nexport interface SourceSimpleFiducial extends SourceComponentBase {\n  ftype: \"simple_fiducial\"\n}\n\nexpectTypesMatch<SourceSimpleFiducial, InferredSourceSimpleFiducial>(true)\n","import {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  source_simple_diode,\n  type SourceSimpleDiode,\n} from \"./source_simple_diode\"\n\nexport const source_simple_led = source_simple_diode.extend({\n  ftype: z.literal(\"simple_led\"),\n  color: z.string().optional(),\n  wavelength: z.string().optional(),\n})\n\nexport type SourceSimpleLedInput = z.input<typeof source_simple_led>\ntype InferredSourceSimpleLed = z.infer<typeof source_simple_led>\n\n/**\n * Defines a simple led component\n */\nexport interface SourceSimpleLed extends Omit<SourceSimpleDiode, \"ftype\"> {\n  ftype: \"simple_led\"\n  color?: string\n  wavelength?: string\n}\n\nexpectTypesMatch<SourceSimpleLed, InferredSourceSimpleLed>(true)\n","import {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_ground = source_component_base.extend({\n  ftype: z.literal(\"simple_ground\"),\n})\n\nexport type SourceSimpleGroundInput = z.input<typeof source_simple_ground>\ntype InferredSourceSimpleGround = z.infer<typeof source_simple_ground>\n\n/**\n * Defines a simple ground component\n */\nexport interface SourceSimpleGround extends SourceComponentBase {\n  ftype: \"simple_ground\"\n}\n\nexpectTypesMatch<SourceSimpleGround, InferredSourceSimpleGround>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_chip = source_component_base.extend({\n  ftype: z.literal(\"simple_chip\"),\n})\n\nexport type SourceSimpleChipInput = z.input<typeof source_simple_chip>\ntype InferredSourceSimpleChip = z.infer<typeof source_simple_chip>\n\n/**\n * Defines a simple integrated circuit component\n */\nexport interface SourceSimpleChip extends SourceComponentBase {\n  ftype: \"simple_chip\"\n}\n\nexpectTypesMatch<SourceSimpleChip, InferredSourceSimpleChip>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { voltage } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_power_source = source_component_base.extend({\n  ftype: z.literal(\"simple_power_source\"),\n  voltage,\n})\n\nexport type SourceSimplePowerSourceInput = z.input<\n  typeof source_simple_power_source\n>\ntype InferredSourceSimplePowerSource = z.infer<\n  typeof source_simple_power_source\n>\n\n/**\n * Defines a simple power source component\n */\nexport interface SourceSimplePowerSource extends SourceComponentBase {\n  ftype: \"simple_power_source\"\n  voltage: number\n}\n\nexpectTypesMatch<SourceSimplePowerSource, InferredSourceSimplePowerSource>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { current, frequency } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_current_source = source_component_base.extend({\n  ftype: z.literal(\"simple_current_source\"),\n  current,\n  frequency: frequency.optional(),\n  peak_to_peak_current: current.optional(),\n  wave_shape: z\n    .enum([\"sine\", \"square\", \"triangle\", \"sawtooth\", \"dc\"])\n    .optional()\n    .default(\"dc\"),\n  phase: z.number().optional(),\n  duty_cycle: z.number().min(0).max(1).optional(),\n})\n\nexport type SourceSimpleCurrentSourceInput = z.input<\n  typeof source_simple_current_source\n>\ntype InferredSourceSimpleCurrentSource = z.infer<\n  typeof source_simple_current_source\n>\n\n/**\n * Defines a simple current source component\n */\nexport interface SourceSimpleCurrentSource extends SourceComponentBase {\n  ftype: \"simple_current_source\"\n  current: number\n  frequency?: number\n  peak_to_peak_current?: number\n  wave_shape: \"sine\" | \"square\" | \"triangle\" | \"sawtooth\" | \"dc\"\n  phase?: number\n  duty_cycle?: number\n}\n\nexpectTypesMatch<SourceSimpleCurrentSource, InferredSourceSimpleCurrentSource>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"./base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_fuse = source_component_base.extend({\n  ftype: z.literal(\"simple_fuse\"),\n\n  current_rating_amps: z\n    .number()\n    .describe(\"Nominal current in amps the fuse is rated for\"),\n\n  voltage_rating_volts: z\n    .number()\n    .describe(\"Voltage rating in volts, e.g. ±5V would be 5\"),\n})\n\nexport interface SourceSimpleFuse extends SourceComponentBase {\n  ftype: \"simple_fuse\"\n  current_rating_amps: number\n  voltage_rating_volts: number\n}\n\nexport type SourceSimpleFuseInput = z.input<typeof source_simple_fuse>\ntype InferredSourceSimpleFuse = z.infer<typeof source_simple_fuse>\n\nexpectTypesMatch<SourceSimpleFuse, InferredSourceSimpleFuse>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_ammeter = source_component_base.extend({\n  ftype: z.literal(\"simple_ammeter\"),\n})\n\nexport type SourceSimpleAmmeterInput = z.input<typeof source_simple_ammeter>\ntype InferredSourceSimpleAmmeter = z.infer<typeof source_simple_ammeter>\n\n/**\n * Defines a simple ammeter component for simulation and measurement\n */\nexport interface SourceSimpleAmmeter extends SourceComponentBase {\n  ftype: \"simple_ammeter\"\n}\n\nexpectTypesMatch<SourceSimpleAmmeter, InferredSourceSimpleAmmeter>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_pin_attributes = z.object({\n  must_be_connected: z.boolean().optional(),\n  provides_power: z.boolean().optional(),\n  requires_power: z.boolean().optional(),\n  provides_ground: z.boolean().optional(),\n  requires_ground: z.boolean().optional(),\n  provides_voltage: z.union([z.string(), z.number()]).optional(),\n  requires_voltage: z.union([z.string(), z.number()]).optional(),\n  do_not_connect: z.boolean().optional(),\n  include_in_board_pinout: z.boolean().optional(),\n  can_use_internal_pullup: z.boolean().optional(),\n  is_using_internal_pullup: z.boolean().optional(),\n  needs_external_pullup: z.boolean().optional(),\n  can_use_internal_pulldown: z.boolean().optional(),\n  is_using_internal_pulldown: z.boolean().optional(),\n  needs_external_pulldown: z.boolean().optional(),\n  can_use_open_drain: z.boolean().optional(),\n  is_using_open_drain: z.boolean().optional(),\n  can_use_push_pull: z.boolean().optional(),\n  is_using_push_pull: z.boolean().optional(),\n  should_have_decoupling_capacitor: z.boolean().optional(),\n  recommended_decoupling_capacitor_capacitance: z\n    .union([z.string(), z.number()])\n    .optional(),\n  is_configured_for_i2c_sda: z.boolean().optional(),\n  is_configured_for_i2c_scl: z.boolean().optional(),\n  is_configured_for_spi_mosi: z.boolean().optional(),\n  is_configured_for_spi_miso: z.boolean().optional(),\n  is_configured_for_spi_sck: z.boolean().optional(),\n  is_configured_for_spi_cs: z.boolean().optional(),\n  is_configured_for_uart_tx: z.boolean().optional(),\n  is_configured_for_uart_rx: z.boolean().optional(),\n  supports_i2c_sda: z.boolean().optional(),\n  supports_i2c_scl: z.boolean().optional(),\n  supports_spi_mosi: z.boolean().optional(),\n  supports_spi_miso: z.boolean().optional(),\n  supports_spi_sck: z.boolean().optional(),\n  supports_spi_cs: z.boolean().optional(),\n  supports_uart_tx: z.boolean().optional(),\n  supports_uart_rx: z.boolean().optional(),\n})\n\ntype InferredSourcePinAttributes = z.infer<typeof source_pin_attributes>\n\nexport interface SourcePinAttributes {\n  must_be_connected?: boolean\n  provides_power?: boolean\n  requires_power?: boolean\n  provides_ground?: boolean\n  requires_ground?: boolean\n  provides_voltage?: string | number\n  requires_voltage?: string | number\n  do_not_connect?: boolean\n  include_in_board_pinout?: boolean\n  can_use_internal_pullup?: boolean\n  is_using_internal_pullup?: boolean\n  needs_external_pullup?: boolean\n  can_use_internal_pulldown?: boolean\n  is_using_internal_pulldown?: boolean\n  needs_external_pulldown?: boolean\n  can_use_open_drain?: boolean\n  is_using_open_drain?: boolean\n  can_use_push_pull?: boolean\n  is_using_push_pull?: boolean\n  should_have_decoupling_capacitor?: boolean\n  recommended_decoupling_capacitor_capacitance?: string | number\n  is_configured_for_i2c_sda?: boolean\n  is_configured_for_i2c_scl?: boolean\n  is_configured_for_spi_mosi?: boolean\n  is_configured_for_spi_miso?: boolean\n  is_configured_for_spi_sck?: boolean\n  is_configured_for_spi_cs?: boolean\n  is_configured_for_uart_tx?: boolean\n  is_configured_for_uart_rx?: boolean\n  supports_i2c_sda?: boolean\n  supports_i2c_scl?: boolean\n  supports_spi_mosi?: boolean\n  supports_spi_miso?: boolean\n  supports_spi_sck?: boolean\n  supports_spi_cs?: boolean\n  supports_uart_tx?: boolean\n  supports_uart_rx?: boolean\n}\n\nexpectTypesMatch<SourcePinAttributes, InferredSourcePinAttributes>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  source_simple_resistor,\n  type SourceSimpleResistor,\n} from \"./source_simple_resistor\"\nimport {\n  source_simple_capacitor,\n  type SourceSimpleCapacitor,\n} from \"./source_simple_capacitor\"\nimport { source_simple_fuse, type SourceSimpleFuse } from \"./source_simple_fuse\"\nimport {\n  source_simple_diode,\n  type SourceSimpleDiode,\n} from \"./source_simple_diode\"\nimport {\n  source_simple_fiducial,\n  type SourceSimpleFiducial,\n} from \"./source_simple_fiducial\"\nimport { source_simple_led, type SourceSimpleLed } from \"./source_simple_led\"\nimport {\n  source_simple_ground,\n  type SourceSimpleGround,\n} from \"./source_simple_ground\"\nimport { source_simple_chip, type SourceSimpleChip } from \"./source_simple_chip\"\nimport {\n  source_simple_power_source,\n  type SourceSimplePowerSource,\n} from \"./source_simple_power_source\"\nimport {\n  source_simple_current_source,\n  type SourceSimpleCurrentSource,\n} from \"./source_simple_current_source\"\nimport {\n  source_simple_ammeter,\n  type SourceSimpleAmmeter,\n} from \"./source_simple_ammeter\"\nimport {\n  source_simple_battery,\n  type SourceSimpleBattery,\n} from \"./source_simple_battery\"\nimport {\n  source_simple_inductor,\n  type SourceSimpleInductor,\n} from \"./source_simple_inductor\"\nimport {\n  source_simple_push_button,\n  type SourceSimplePushButton,\n} from \"./source_simple_push_button\"\nimport {\n  source_simple_potentiometer,\n  type SourceSimplePotentiometer,\n} from \"./source_simple_potentiometer\"\nimport {\n  source_simple_crystal,\n  type SourceSimpleCrystal,\n} from \"./source_simple_crystal\"\nimport {\n  source_simple_pin_header,\n  type SourceSimplePinHeader,\n} from \"./source_simple_pin_header\"\nimport {\n  source_simple_connector,\n  type SourceSimpleConnector,\n} from \"./source_simple_connector\"\nimport {\n  source_simple_pinout,\n  type SourceSimplePinout,\n} from \"./source_simple_pinout\"\nimport {\n  source_simple_resonator,\n  type SourceSimpleResonator,\n} from \"./source_simple_resonator\"\nimport {\n  source_simple_transistor,\n  type SourceSimpleTransistor,\n} from \"./source_simple_transistor\"\nimport {\n  source_simple_test_point,\n  type SourceSimpleTestPoint,\n} from \"./source_simple_test_point\"\nimport {\n  source_simple_mosfet,\n  type SourceSimpleMosfet,\n} from \"./source_simple_mosfet\"\nimport {\n  source_simple_op_amp,\n  type SourceSimpleOpAmp,\n} from \"./source_simple_op_amp\"\nimport {\n  source_simple_switch,\n  type SourceSimpleSwitch,\n} from \"./source_simple_switch\"\nimport {\n  source_project_metadata,\n  type SourceProjectMetadata,\n} from \"./source_project_metadata\"\nimport {\n  source_missing_property_error,\n  type SourceMissingPropertyError,\n} from \"./source_missing_property_error\"\nimport {\n  source_failed_to_create_component_error,\n  type SourceFailedToCreateComponentError,\n} from \"./source_failed_to_create_component_error\"\nimport {\n  source_invalid_component_property_error,\n  type SourceInvalidComponentPropertyError,\n} from \"./source_invalid_component_property_error\"\nimport {\n  source_trace_not_connected_error,\n  type SourceTraceNotConnectedError,\n} from \"./source_trace_not_connected_error\"\nimport {\n  source_property_ignored_warning,\n  type SourcePropertyIgnoredWarning,\n} from \"./source_property_ignored_warning\"\nimport {\n  source_pin_missing_trace_warning,\n  type SourcePinMissingTraceWarning,\n} from \"./source_pin_missing_trace_warning\"\nimport {\n  source_missing_manufacturer_part_number_warning,\n  type SourceMissingManufacturerPartNumberWarning,\n} from \"./source_missing_manufacturer_part_number_warning\"\nimport {\n  source_refdes_convention_warning,\n  type SourceRefdesConventionWarning,\n} from \"./source_refdes_convention_warning\"\nimport {\n  source_simple_voltage_probe,\n  type SourceSimpleVoltageProbe,\n} from \"./source_simple_voltage_probe\"\nimport {\n  source_interconnect,\n  type SourceInterconnect,\n} from \"./source_interconnect\"\nimport {\n  source_i2c_misconfigured_error,\n  type SourceI2cMisconfiguredError,\n} from \"./source_i2c_misconfigured_error\"\nimport {\n  source_component_misconfigured_error,\n  type SourceComponentMisconfiguredError,\n} from \"./source_component_misconfigured_error\"\nimport {\n  source_simple_voltage_source,\n  type SourceSimpleVoltageSource,\n} from \"./source_simple_voltage_source\"\n\nexport const any_source_component = z.union([\n  source_simple_resistor,\n  source_simple_capacitor,\n  source_simple_diode,\n  source_simple_fiducial,\n  source_simple_led,\n  source_simple_ground,\n  source_simple_chip,\n  source_simple_power_source,\n  source_simple_current_source,\n  source_simple_ammeter,\n  source_simple_battery,\n  source_simple_inductor,\n  source_simple_push_button,\n  source_simple_potentiometer,\n  source_simple_crystal,\n  source_simple_pin_header,\n  source_simple_connector,\n  source_simple_pinout,\n  source_simple_resonator,\n  source_simple_switch,\n  source_simple_transistor,\n  source_simple_test_point,\n  source_simple_mosfet,\n  source_simple_op_amp,\n  source_simple_fuse,\n  source_simple_voltage_probe,\n  source_interconnect,\n  source_simple_voltage_source,\n  source_project_metadata,\n  source_missing_property_error,\n  source_invalid_component_property_error,\n  source_failed_to_create_component_error,\n  source_trace_not_connected_error,\n  source_property_ignored_warning,\n  source_pin_missing_trace_warning,\n  source_missing_manufacturer_part_number_warning,\n  source_refdes_convention_warning,\n  source_i2c_misconfigured_error,\n  source_component_misconfigured_error,\n])\n\n/**\n * Deprecated: use `AnySourceElement` instead\n */\nexport type AnySourceComponent = z.infer<typeof any_source_component>\n\nexport type AnySourceElement =\n  | SourceSimpleResistor\n  | SourceSimpleCapacitor\n  | SourceSimpleDiode\n  | SourceSimpleFiducial\n  | SourceSimpleLed\n  | SourceSimpleGround\n  | SourceSimpleChip\n  | SourceSimplePowerSource\n  | SourceSimpleCurrentSource\n  | SourceSimpleAmmeter\n  | SourceSimpleBattery\n  | SourceSimpleInductor\n  | SourceSimplePushButton\n  | SourceSimplePotentiometer\n  | SourceSimpleCrystal\n  | SourceSimplePinHeader\n  | SourceSimpleConnector\n  | SourceSimplePinout\n  | SourceSimpleResonator\n  | SourceSimpleSwitch\n  | SourceSimpleTransistor\n  | SourceSimpleTestPoint\n  | SourceSimpleMosfet\n  | SourceSimpleFuse\n  | SourceSimpleOpAmp\n  | SourceSimpleVoltageProbe\n  | SourceSimpleVoltageSource\n  | SourceInterconnect\n  | SourceProjectMetadata\n  | SourceMissingPropertyError\n  | SourceInvalidComponentPropertyError\n  | SourceFailedToCreateComponentError\n  | SourceTraceNotConnectedError\n  | SourcePropertyIgnoredWarning\n  | SourcePinMissingTraceWarning\n  | SourceMissingManufacturerPartNumberWarning\n  | SourceRefdesConventionWarning\n  | SourceI2cMisconfiguredError\n  | SourceComponentMisconfiguredError\n\nexpectTypesMatch<AnySourceElement, AnySourceComponent>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { battery_capacity } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_battery = source_component_base.extend({\n  ftype: z.literal(\"simple_battery\"),\n  capacity: battery_capacity,\n})\n\nexport type SourceSimpleBatteryInput = z.input<typeof source_simple_battery>\ntype InferredSourceSimpleBattery = z.infer<typeof source_simple_battery>\n\n/**\n * Defines a simple battery component\n */\nexport interface SourceSimpleBattery extends SourceComponentBase {\n  ftype: \"simple_battery\"\n  capacity: number\n}\n\nexpectTypesMatch<SourceSimpleBattery, InferredSourceSimpleBattery>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { inductance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_inductor = source_component_base.extend({\n  ftype: z.literal(\"simple_inductor\"),\n  inductance,\n  display_inductance: z.string().optional(),\n  max_current_rating: z.number().optional(),\n})\n\nexport type SourceSimpleInductorInput = z.input<typeof source_simple_inductor>\ntype InferredSourceSimpleInductor = z.infer<typeof source_simple_inductor>\n\n/**\n * Defines a simple inductor component\n */\nexport interface SourceSimpleInductor extends SourceComponentBase {\n  ftype: \"simple_inductor\"\n  inductance: number\n  display_inductance?: string\n  max_current_rating?: number\n}\n\nexpectTypesMatch<SourceSimpleInductor, InferredSourceSimpleInductor>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_push_button = source_component_base.extend({\n  ftype: z.literal(\"simple_push_button\"),\n})\n\nexport type SourceSimplePushButtonInput = z.input<\n  typeof source_simple_push_button\n>\ntype InferredSourceSimplePushButton = z.infer<typeof source_simple_push_button>\n\n/**\n * Defines a simple push button component\n */\nexport interface SourceSimplePushButton extends SourceComponentBase {\n  ftype: \"simple_push_button\"\n}\n\nexpectTypesMatch<SourceSimplePushButton, InferredSourceSimplePushButton>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { resistance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_potentiometer = source_component_base.extend({\n  ftype: z.literal(\"simple_potentiometer\"),\n  max_resistance: resistance,\n  display_max_resistance: z.string().optional(),\n})\n\nexport type SourceSimplePotentiometerInput = z.input<\n  typeof source_simple_potentiometer\n>\ntype InferredSourceSimplePotentiometer = z.infer<\n  typeof source_simple_potentiometer\n>\n\nexport interface SourceSimplePotentiometer extends SourceComponentBase {\n  ftype: \"simple_potentiometer\"\n  max_resistance: number\n  display_max_resistance?: string\n}\n\nexpectTypesMatch<SourceSimplePotentiometer, InferredSourceSimplePotentiometer>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_crystal = source_component_base.extend({\n  ftype: z.literal(\"simple_crystal\"),\n  frequency: z.number().describe(\"Frequency in Hz\"),\n  load_capacitance: z.number().optional().describe(\"Load capacitance in pF\"),\n  pin_variant: z.enum([\"two_pin\", \"four_pin\"]).optional(),\n})\n\nexport type SourceSimpleCrystalInput = z.input<typeof source_simple_crystal>\ntype InferredSourceSimpleCrystal = z.infer<typeof source_simple_crystal>\n\n/**\n * Defines a simple crystal oscillator component\n */\nexport interface SourceSimpleCrystal extends SourceComponentBase {\n  ftype: \"simple_crystal\"\n  frequency: number\n  load_capacitance?: number\n  pin_variant?: \"two_pin\" | \"four_pin\"\n}\n\nexpectTypesMatch<SourceSimpleCrystal, InferredSourceSimpleCrystal>(true)\n","import {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_pin_header = source_component_base.extend({\n  ftype: z.literal(\"simple_pin_header\"),\n  pin_count: z.number(),\n  gender: z.enum([\"male\", \"female\"]).optional().default(\"male\"),\n})\n\nexport type SourceSimplePinHeaderInput = z.input<\n  typeof source_simple_pin_header\n>\ntype InferredSourceSimplePinHeader = z.infer<typeof source_simple_pin_header>\n\nexport interface SourceSimplePinHeader extends SourceComponentBase {\n  ftype: \"simple_pin_header\"\n  pin_count: number\n  gender: \"male\" | \"female\"\n}\n\nexpectTypesMatch<SourceSimplePinHeader, InferredSourceSimplePinHeader>(true)\n","import {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_connector = source_component_base.extend({\n  ftype: z.literal(\"simple_connector\"),\n  standard: z.enum([\"usb_c\", \"m2\"]).optional(),\n})\n\nexport type SourceSimpleConnectorInput = z.input<typeof source_simple_connector>\ntype InferredSourceSimpleConnector = z.infer<typeof source_simple_connector>\n\n/**\n * Defines a simple connector component\n */\nexport interface SourceSimpleConnector extends SourceComponentBase {\n  ftype: \"simple_connector\"\n  standard?: \"usb_c\" | \"m2\"\n}\n\nexpectTypesMatch<SourceSimpleConnector, InferredSourceSimpleConnector>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_pinout = source_component_base.extend({\n  ftype: z.literal(\"simple_pinout\"),\n})\n\nexport type SourceSimplePinoutInput = z.input<typeof source_simple_pinout>\ntype InferredSourceSimplePinout = z.infer<typeof source_simple_pinout>\n\n/**\n * Defines a simple pinout component\n */\nexport interface SourceSimplePinout extends SourceComponentBase {\n  ftype: \"simple_pinout\"\n}\n\nexpectTypesMatch<SourceSimplePinout, InferredSourceSimplePinout>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { capacitance, resistance, frequency } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_resonator = source_component_base.extend({\n  ftype: z.literal(\"simple_resonator\"),\n  load_capacitance: capacitance,\n  equivalent_series_resistance: resistance.optional(),\n  frequency: frequency,\n})\n\nexport type SourceSimpleResonatorInput = z.input<typeof source_simple_resonator>\ntype InferredSourceSimpleResonator = z.infer<typeof source_simple_resonator>\n\n/**\n * Defines a simple resonator component\n */\nexport interface SourceSimpleResonator extends SourceComponentBase {\n  ftype: \"simple_resonator\"\n  load_capacitance: number\n  equivalent_series_resistance?: number\n  frequency: number\n}\n\nexpectTypesMatch<SourceSimpleResonator, InferredSourceSimpleResonator>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_transistor = source_component_base.extend({\n  ftype: z.literal(\"simple_transistor\"),\n  transistor_type: z.enum([\"npn\", \"pnp\"]),\n})\n\nexport type SourceSimpleTransistorInput = z.input<\n  typeof source_simple_transistor\n>\ntype InferredSourceSimpleTransistor = z.infer<typeof source_simple_transistor>\n\n/**\n * Defines a simple transistor component\n * This is a three-pin semiconductor device (emitter, base, collector)\n * Pin configuration is handled by the schematic port system\n */\n\nexport interface SourceSimpleTransistor extends SourceComponentBase {\n  ftype: \"simple_transistor\"\n  transistor_type: \"npn\" | \"pnp\"\n}\n\nexpectTypesMatch<SourceSimpleTransistor, InferredSourceSimpleTransistor>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_test_point = source_component_base.extend({\n  ftype: z.literal(\"simple_test_point\"),\n  footprint_variant: z.enum([\"pad\", \"through_hole\"]).optional(),\n  pad_shape: z.enum([\"rect\", \"circle\"]).optional(),\n  pad_diameter: z.union([z.number(), z.string()]).optional(),\n  hole_diameter: z.union([z.number(), z.string()]).optional(),\n  width: z.union([z.number(), z.string()]).optional(),\n  height: z.union([z.number(), z.string()]).optional(),\n})\n\nexport type SourceSimpleTestPointInput = z.input<\n  typeof source_simple_test_point\n>\ntype InferredSourceSimpleTestPoint = z.infer<typeof source_simple_test_point>\n\n/**\n * Defines a simple test point component\n * Can be surface-mount or through-hole.\n * Pad shape and dimensions configurable for different use cases.\n */\nexport interface SourceSimpleTestPoint extends SourceComponentBase {\n  ftype: \"simple_test_point\"\n  footprint_variant?: \"pad\" | \"through_hole\"\n  pad_shape?: \"rect\" | \"circle\"\n  pad_diameter?: number | string\n  hole_diameter?: number | string\n  width?: number | string\n  height?: number | string\n}\n\nexpectTypesMatch<SourceSimpleTestPoint, InferredSourceSimpleTestPoint>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_mosfet = source_component_base.extend({\n  ftype: z.literal(\"simple_mosfet\"),\n  channel_type: z.enum([\"n\", \"p\"]),\n  mosfet_mode: z.enum([\"enhancement\", \"depletion\"]),\n})\n\nexport type SourceSimpleMosfetInput = z.input<typeof source_simple_mosfet>\ntype InferredSourceSimpleMosfet = z.infer<typeof source_simple_mosfet>\n\n/**\n * Defines a simple mosfet component\n * This is a three-pin semiconductor device (source, gate, drain)\n * Pin configuration is handled by the schematic port system\n */\n\nexport interface SourceSimpleMosfet extends SourceComponentBase {\n  ftype: \"simple_mosfet\"\n  channel_type: \"n\" | \"p\"\n  mosfet_mode: \"enhancement\" | \"depletion\"\n}\n\nexpectTypesMatch<SourceSimpleMosfet, InferredSourceSimpleMosfet>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_op_amp = source_component_base.extend({\n  ftype: z.literal(\"simple_op_amp\"),\n})\n\nexport type SourceSimpleOpAmpInput = z.input<typeof source_simple_op_amp>\ntype InferredSourceSimpleOpAmp = z.infer<typeof source_simple_op_amp>\n\n/**\n * Defines a simple op-amp component\n */\nexport interface SourceSimpleOpAmp extends SourceComponentBase {\n  ftype: \"simple_op_amp\"\n}\n\nexpectTypesMatch<SourceSimpleOpAmp, InferredSourceSimpleOpAmp>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_switch = source_component_base.extend({\n  ftype: z.literal(\"simple_switch\"),\n})\nexport type SourceSimpleSwitchInput = z.input<typeof source_simple_switch>\ntype InferredSourceSimpleSwitch = z.infer<typeof source_simple_switch>\n\n/**\n * Defines a simple switch component\n */\nexport interface SourceSimpleSwitch extends SourceComponentBase {\n  ftype: \"simple_switch\"\n}\n\nexpectTypesMatch<SourceSimpleSwitch, InferredSourceSimpleSwitch>(true)\n","import { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\nimport { timestamp } from \"src/units\"\n\nexport interface SourceProjectMetadata {\n  type: \"source_project_metadata\"\n  name?: string\n  software_used_string?: string\n  project_url?: string\n  created_at?: string // ISO8601 timestamp\n}\n\nexport const source_project_metadata = z.object({\n  type: z.literal(\"source_project_metadata\"),\n  name: z.string().optional(),\n  software_used_string: z.string().optional(),\n  project_url: z.string().optional(),\n  created_at: timestamp.optional(),\n})\n\nexport type InferredProjectMetadata = z.infer<typeof source_project_metadata>\nexpectTypesMatch<SourceProjectMetadata, InferredProjectMetadata>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_missing_property_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_missing_property_error\"),\n    source_missing_property_error_id: getZodPrefixedIdWithDefault(\n      \"source_missing_property_error\",\n    ),\n    source_component_id: z.string(),\n    property_name: z.string(),\n    subcircuit_id: z.string().optional(),\n    error_type: z\n      .literal(\"source_missing_property_error\")\n      .default(\"source_missing_property_error\"),\n  })\n  .describe(\"The source code is missing a property\")\n\nexport type SourceMissingPropertyErrorInput = z.input<\n  typeof source_missing_property_error\n>\ntype InferredSourceMissingPropertyError = z.infer<\n  typeof source_missing_property_error\n>\n\n/**\n * The source code is missing a property\n */\nexport interface SourceMissingPropertyError extends BaseCircuitJsonError {\n  type: \"source_missing_property_error\"\n  source_missing_property_error_id: string\n  source_component_id: string\n  property_name: string\n  subcircuit_id?: string\n  error_type: \"source_missing_property_error\"\n}\n\nexpectTypesMatch<\n  SourceMissingPropertyError,\n  InferredSourceMissingPropertyError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_failed_to_create_component_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_failed_to_create_component_error\"),\n    source_failed_to_create_component_error_id: getZodPrefixedIdWithDefault(\n      \"source_failed_to_create_component_error\",\n    ),\n    error_type: z\n      .literal(\"source_failed_to_create_component_error\")\n      .default(\"source_failed_to_create_component_error\"),\n    component_name: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    parent_source_component_id: z.string().optional(),\n    pcb_center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n    schematic_center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n  })\n  .describe(\"Error emitted when a component fails to be constructed\")\n\nexport type SourceFailedToCreateComponentErrorInput = z.input<\n  typeof source_failed_to_create_component_error\n>\ntype InferredSourceFailedToCreateComponentError = z.infer<\n  typeof source_failed_to_create_component_error\n>\n\n/**\n * Error emitted when a component fails to be constructed.\n * Contains details about the failure and prevents the component from being rendered.\n */\nexport interface SourceFailedToCreateComponentError\n  extends BaseCircuitJsonError {\n  type: \"source_failed_to_create_component_error\"\n  source_failed_to_create_component_error_id: string\n  error_type: \"source_failed_to_create_component_error\"\n  component_name?: string\n  subcircuit_id?: string\n  parent_source_component_id?: string\n  pcb_center?: {\n    x?: number\n    y?: number\n  }\n  schematic_center?: {\n    x?: number\n    y?: number\n  }\n}\n\nexpectTypesMatch<\n  SourceFailedToCreateComponentError,\n  InferredSourceFailedToCreateComponentError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_invalid_component_property_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_invalid_component_property_error\"),\n    source_invalid_component_property_error_id: getZodPrefixedIdWithDefault(\n      \"source_invalid_component_property_error\",\n    ),\n    source_component_id: z.string(),\n    property_name: z.string(),\n    property_value: z.unknown().optional(),\n    expected_format: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    error_type: z\n      .literal(\"source_invalid_component_property_error\")\n      .default(\"source_invalid_component_property_error\"),\n  })\n  .describe(\"The source component property is invalid\")\n\nexport type SourceInvalidComponentPropertyErrorInput = z.input<\n  typeof source_invalid_component_property_error\n>\ntype InferredSourceInvalidComponentPropertyError = z.infer<\n  typeof source_invalid_component_property_error\n>\n\n/**\n * The source component property is invalid\n */\nexport interface SourceInvalidComponentPropertyError\n  extends BaseCircuitJsonError {\n  type: \"source_invalid_component_property_error\"\n  source_invalid_component_property_error_id: string\n  source_component_id: string\n  property_name: string\n  property_value?: unknown\n  expected_format?: string\n  subcircuit_id?: string\n  error_type: \"source_invalid_component_property_error\"\n}\n\nexpectTypesMatch<\n  SourceInvalidComponentPropertyError,\n  InferredSourceInvalidComponentPropertyError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_trace_not_connected_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_trace_not_connected_error\"),\n    source_trace_not_connected_error_id: getZodPrefixedIdWithDefault(\n      \"source_trace_not_connected_error\",\n    ),\n    error_type: z\n      .literal(\"source_trace_not_connected_error\")\n      .default(\"source_trace_not_connected_error\"),\n    subcircuit_id: z.string().optional(),\n    source_group_id: z.string().optional(),\n    source_trace_id: z.string().optional(),\n    connected_source_port_ids: z.array(z.string()).optional(),\n    selectors_not_found: z.array(z.string()).optional(),\n  })\n  .describe(\"Occurs when a source trace selector does not match any ports\")\n\nexport type SourceTraceNotConnectedErrorInput = z.input<\n  typeof source_trace_not_connected_error\n>\ntype InferredSourceTraceNotConnectedError = z.infer<\n  typeof source_trace_not_connected_error\n>\n\n/**\n * Occurs when a source trace selector does not match any ports\n */\nexport interface SourceTraceNotConnectedError extends BaseCircuitJsonError {\n  type: \"source_trace_not_connected_error\"\n  source_trace_not_connected_error_id: string\n  error_type: \"source_trace_not_connected_error\"\n  subcircuit_id?: string\n  source_group_id?: string\n  source_trace_id?: string\n  connected_source_port_ids?: string[]\n  selectors_not_found?: string[]\n}\n\nexpectTypesMatch<\n  SourceTraceNotConnectedError,\n  InferredSourceTraceNotConnectedError\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_property_ignored_warning = z\n  .object({\n    type: z.literal(\"source_property_ignored_warning\"),\n    source_property_ignored_warning_id: getZodPrefixedIdWithDefault(\n      \"source_property_ignored_warning\",\n    ),\n    source_component_id: z.string(),\n    property_name: z.string(),\n    subcircuit_id: z.string().optional(),\n    error_type: z\n      .literal(\"source_property_ignored_warning\")\n      .default(\"source_property_ignored_warning\"),\n    message: z.string(),\n  })\n  .describe(\"The source property was ignored\")\n\nexport type SourcePropertyIgnoredWarningInput = z.input<\n  typeof source_property_ignored_warning\n>\ntype InferredSourcePropertyIgnoredWarning = z.infer<\n  typeof source_property_ignored_warning\n>\n\n/**\n * The source property was ignored\n */\nexport interface SourcePropertyIgnoredWarning {\n  type: \"source_property_ignored_warning\"\n  source_property_ignored_warning_id: string\n  source_component_id: string\n  property_name: string\n  subcircuit_id?: string\n  error_type: \"source_property_ignored_warning\"\n  message: string\n}\n\nexpectTypesMatch<\n  SourcePropertyIgnoredWarning,\n  InferredSourcePropertyIgnoredWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_pin_missing_trace_warning = z\n  .object({\n    type: z.literal(\"source_pin_missing_trace_warning\"),\n    source_pin_missing_trace_warning_id: getZodPrefixedIdWithDefault(\n      \"source_pin_missing_trace_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_pin_missing_trace_warning\")\n      .default(\"source_pin_missing_trace_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    source_port_id: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a source component pin is missing a trace connection\",\n  )\n\nexport type SourcePinMissingTraceWarningInput = z.input<\n  typeof source_pin_missing_trace_warning\n>\ntype InferredSourcePinMissingTraceWarning = z.infer<\n  typeof source_pin_missing_trace_warning\n>\n\n/**\n * Warning emitted when a source component pin is missing a trace connection\n */\nexport interface SourcePinMissingTraceWarning {\n  type: \"source_pin_missing_trace_warning\"\n  source_pin_missing_trace_warning_id: string\n  warning_type: \"source_pin_missing_trace_warning\"\n  message: string\n  source_component_id: string\n  source_port_id: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourcePinMissingTraceWarning,\n  InferredSourcePinMissingTraceWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_missing_manufacturer_part_number_warning = z\n  .object({\n    type: z.literal(\"source_missing_manufacturer_part_number_warning\"),\n    source_missing_manufacturer_part_number_warning_id:\n      getZodPrefixedIdWithDefault(\n        \"source_missing_manufacturer_part_number_warning\",\n      ),\n    warning_type: z\n      .literal(\"source_missing_manufacturer_part_number_warning\")\n      .default(\"source_missing_manufacturer_part_number_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    standard: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a standard connector is missing manufacturer part number\",\n  )\n\nexport type SourceMissingManufacturerPartNumberWarningInput = z.input<\n  typeof source_missing_manufacturer_part_number_warning\n>\ntype InferredSourceMissingManufacturerPartNumberWarning = z.infer<\n  typeof source_missing_manufacturer_part_number_warning\n>\n\n/**\n * Warning emitted when a standard connector is missing manufacturer part number\n */\nexport interface SourceMissingManufacturerPartNumberWarning {\n  type: \"source_missing_manufacturer_part_number_warning\"\n  source_missing_manufacturer_part_number_warning_id: string\n  warning_type: \"source_missing_manufacturer_part_number_warning\"\n  message: string\n  source_component_id: string\n  standard: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourceMissingManufacturerPartNumberWarning,\n  InferredSourceMissingManufacturerPartNumberWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common/getZodPrefixedIdWithDefault\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_refdes_convention_warning = z\n  .object({\n    type: z.literal(\"source_refdes_convention_warning\"),\n    source_refdes_convention_warning_id: getZodPrefixedIdWithDefault(\n      \"source_refdes_convention_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_refdes_convention_warning\")\n      .default(\"source_refdes_convention_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    refdes: z.string(),\n    source_component_ftype: z.string(),\n    expected_prefixes: z.array(z.string()),\n    actual_prefix: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a source component reference designator does not match the component type convention\",\n  )\n\nexport type SourceRefdesConventionWarningInput = z.input<\n  typeof source_refdes_convention_warning\n>\ntype InferredSourceRefdesConventionWarning = z.infer<\n  typeof source_refdes_convention_warning\n>\n\n/**\n * Warning emitted when a source component reference designator does not match the component type convention\n */\nexport interface SourceRefdesConventionWarning {\n  type: \"source_refdes_convention_warning\"\n  source_refdes_convention_warning_id: string\n  warning_type: \"source_refdes_convention_warning\"\n  message: string\n  source_component_id: string\n  refdes: string\n  source_component_ftype: string\n  expected_prefixes: string[]\n  actual_prefix?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourceRefdesConventionWarning,\n  InferredSourceRefdesConventionWarning\n>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_voltage_probe = source_component_base.extend({\n  ftype: z.literal(\"simple_voltage_probe\"),\n})\n\nexport type SourceSimpleVoltageProbeInput = z.input<\n  typeof source_simple_voltage_probe\n>\ntype InferredSourceSimpleVoltageProbe = z.infer<\n  typeof source_simple_voltage_probe\n>\n\n/**\n * Defines a simple voltage probe component for simulation and measurement\n */\nexport interface SourceSimpleVoltageProbe extends SourceComponentBase {\n  ftype: \"simple_voltage_probe\"\n}\n\nexpectTypesMatch<SourceSimpleVoltageProbe, InferredSourceSimpleVoltageProbe>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_interconnect = source_component_base.extend({\n  ftype: z.literal(\"interconnect\"),\n})\n\nexport type SourceInterconnectInput = z.input<typeof source_interconnect>\ntype InferredSourceInterconnect = z.infer<typeof source_interconnect>\n\n/**\n * Defines a generic interconnect component\n */\nexport interface SourceInterconnect extends SourceComponentBase {\n  ftype: \"interconnect\"\n}\n\nexpectTypesMatch<SourceInterconnect, InferredSourceInterconnect>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_i2c_misconfigured_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_i2c_misconfigured_error\"),\n    source_i2c_misconfigured_error_id: getZodPrefixedIdWithDefault(\n      \"source_i2c_misconfigured_error\",\n    ),\n    error_type: z\n      .literal(\"source_i2c_misconfigured_error\")\n      .default(\"source_i2c_misconfigured_error\"),\n    source_port_ids: z.array(z.string()),\n  })\n  .describe(\n    \"Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net\",\n  )\n\nexport type SourceI2cMisconfiguredErrorInput = z.input<\n  typeof source_i2c_misconfigured_error\n>\ntype InferredSourceI2cMisconfiguredError = z.infer<\n  typeof source_i2c_misconfigured_error\n>\n\n/**\n * Error emitted when incompatible I2C pins (e.g. SDA and SCL) are connected to the same net\n */\nexport interface SourceI2cMisconfiguredError extends BaseCircuitJsonError {\n  type: \"source_i2c_misconfigured_error\"\n  source_i2c_misconfigured_error_id: string\n  error_type: \"source_i2c_misconfigured_error\"\n  source_port_ids: string[]\n}\n\nexpectTypesMatch<\n  SourceI2cMisconfiguredError,\n  InferredSourceI2cMisconfiguredError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_component_misconfigured_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_component_misconfigured_error\"),\n    source_component_misconfigured_error_id: getZodPrefixedIdWithDefault(\n      \"source_component_misconfigured_error\",\n    ),\n    error_type: z\n      .literal(\"source_component_misconfigured_error\")\n      .default(\"source_component_misconfigured_error\"),\n    source_component_ids: z.array(z.string()),\n    source_port_ids: z.array(z.string()).optional(),\n  })\n  .describe(\n    \"Error emitted when one or more source components have an invalid or conflicting configuration\",\n  )\n\nexport type SourceComponentMisconfiguredErrorInput = z.input<\n  typeof source_component_misconfigured_error\n>\ntype InferredSourceComponentMisconfiguredError = z.infer<\n  typeof source_component_misconfigured_error\n>\n\n/**\n * Error emitted when one or more source components have an invalid or conflicting configuration\n */\nexport interface SourceComponentMisconfiguredError\n  extends BaseCircuitJsonError {\n  type: \"source_component_misconfigured_error\"\n  source_component_misconfigured_error_id: string\n  error_type: \"source_component_misconfigured_error\"\n  source_component_ids: string[]\n  source_port_ids?: string[]\n}\n\nexpectTypesMatch<\n  SourceComponentMisconfiguredError,\n  InferredSourceComponentMisconfiguredError\n>(true)\n","import { z } from \"zod\"\nimport {\n  source_component_base,\n  type SourceComponentBase,\n} from \"src/source/base/source_component_base\"\nimport { voltage, frequency, ms, rotation } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_simple_voltage_source = source_component_base.extend({\n  ftype: z.literal(\"simple_voltage_source\"),\n  voltage,\n  frequency: frequency.optional(),\n  peak_to_peak_voltage: voltage.optional(),\n  wave_shape: z.enum([\"sinewave\", \"square\", \"triangle\", \"sawtooth\"]).optional(),\n  phase: rotation.optional(),\n  duty_cycle: z\n    .number()\n    .optional()\n    .describe(\"Duty cycle as a fraction (0 to 1)\"),\n  pulse_delay: ms.optional(),\n  rise_time: ms.optional(),\n  fall_time: ms.optional(),\n  pulse_width: ms.optional(),\n  period: ms.optional(),\n})\n\nexport type SourceSimpleVoltageSourceInput = z.input<\n  typeof source_simple_voltage_source\n>\ntype InferredSourceSimpleVoltageSource = z.infer<\n  typeof source_simple_voltage_source\n>\n\n/**\n * Defines a simple voltage source component\n */\nexport interface SourceSimpleVoltageSource extends SourceComponentBase {\n  ftype: \"simple_voltage_source\"\n  voltage: number\n  frequency?: number\n  peak_to_peak_voltage?: number\n  wave_shape?: \"sinewave\" | \"square\" | \"triangle\" | \"sawtooth\"\n  phase?: number\n  duty_cycle?: number\n  pulse_delay?: number // ms\n  rise_time?: number // ms\n  fall_time?: number // ms\n  pulse_width?: number // ms\n  period?: number // ms\n}\n\nexpectTypesMatch<SourceSimpleVoltageSource, InferredSourceSimpleVoltageSource>(\n  true,\n)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  source_pin_attributes,\n  type SourcePinAttributes,\n} from \"./properties/source_pin_attributes\"\n\nexport const source_port = z\n  .object({\n    type: z.literal(\"source_port\"),\n    pin_number: z.number().optional(),\n    port_hints: z.array(z.string()).optional(),\n    name: z.string(),\n    source_port_id: z.string(),\n    source_component_id: z.string().optional(),\n    source_group_id: z.string().optional(),\n    most_frequently_referenced_by_name: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    subcircuit_connectivity_map_key: z.string().optional(),\n  })\n  .merge(source_pin_attributes)\n\nexport type SourcePortInput = z.input<typeof source_port>\ntype InferredSourcePort = z.infer<typeof source_port>\n\n/**\n * Defines a source port that can be connected to other components\n */\nexport interface SourcePort extends SourcePinAttributes {\n  type: \"source_port\"\n  pin_number?: number\n  port_hints?: string[]\n  name: string\n  source_port_id: string\n  source_component_id?: string\n  source_group_id?: string\n  most_frequently_referenced_by_name?: string\n  subcircuit_id?: string\n  subcircuit_connectivity_map_key?: string\n}\n\nexpectTypesMatch<SourcePort, InferredSourcePort>(true)\n","import { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nexport interface SourceComponentInternalConnection {\n  type: \"source_component_internal_connection\"\n  source_component_internal_connection_id: string\n  source_component_id: string\n  source_port_ids: string[]\n  subcircuit_id?: string\n}\n\nexport const source_component_internal_connection = z.object({\n  type: z.literal(\"source_component_internal_connection\"),\n  source_component_internal_connection_id: z.string(),\n  source_component_id: z.string(),\n  source_port_ids: z.array(z.string()),\n  subcircuit_id: z.string().optional(),\n})\n\ntype InferredSourceComponentInternalConnection = z.infer<\n  typeof source_component_internal_connection\n>\n\nexpectTypesMatch<\n  SourceComponentInternalConnection,\n  InferredSourceComponentInternalConnection\n>(true)\n","import { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nexport interface SourceTrace {\n  type: \"source_trace\"\n  source_trace_id: string\n  connected_source_port_ids: string[]\n  connected_source_net_ids: string[]\n  subcircuit_id?: string\n  subcircuit_connectivity_map_key?: string\n  max_length?: number\n  name?: string\n  display_name?: string\n  min_trace_thickness?: number\n}\n\nexport const source_trace = z.object({\n  type: z.literal(\"source_trace\"),\n  source_trace_id: z.string(),\n  connected_source_port_ids: z.array(z.string()),\n  connected_source_net_ids: z.array(z.string()),\n  subcircuit_id: z.string().optional(),\n  subcircuit_connectivity_map_key: z.string().optional(),\n  max_length: z.number().optional(),\n  name: z.string().optional(),\n  min_trace_thickness: z.number().optional(),\n  display_name: z.string().optional(),\n})\n\ntype InferredSourceTrace = z.infer<typeof source_trace>\n\nexpectTypesMatch<SourceTrace, InferredSourceTrace>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_group = z.object({\n  type: z.literal(\"source_group\"),\n  source_group_id: z.string(),\n  subcircuit_id: z.string().optional(),\n  parent_subcircuit_id: z.string().optional(),\n  parent_source_group_id: z.string().optional(),\n  is_subcircuit: z.boolean().optional(),\n  show_as_schematic_box: z.boolean().optional(),\n  name: z.string().optional(),\n  was_automatically_named: z.boolean().optional(),\n})\n\nexport type SourceGroupInput = z.input<typeof source_group>\ntype InferredSourceGroup = z.infer<typeof source_group>\n\nexport interface SourceGroup {\n  type: \"source_group\"\n  source_group_id: string\n  subcircuit_id?: string\n  parent_subcircuit_id?: string\n  parent_source_group_id?: string\n  is_subcircuit?: boolean\n  show_as_schematic_box?: boolean\n  name?: string\n  was_automatically_named?: boolean\n}\n\nexpectTypesMatch<SourceGroup, InferredSourceGroup>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_net = z.object({\n  type: z.literal(\"source_net\"),\n  source_net_id: z.string(),\n  name: z.string(),\n  member_source_group_ids: z.array(z.string()),\n  is_power: z.boolean().optional(),\n  is_ground: z.boolean().optional(),\n  is_digital_signal: z.boolean().optional(),\n  is_analog_signal: z.boolean().optional(),\n  is_positive_voltage_source: z.boolean().optional(),\n  trace_width: z.number().optional(),\n  subcircuit_id: z.string().optional(),\n  subcircuit_connectivity_map_key: z.string().optional(),\n})\n\nexport type SourceNetInput = z.input<typeof source_net>\ntype InferredSourceNet = z.infer<typeof source_net>\n\nexport interface SourceNet {\n  type: \"source_net\"\n  source_net_id: string\n  name: string\n  member_source_group_ids: string[]\n  is_power?: boolean\n  is_ground?: boolean\n  is_digital_signal?: boolean\n  is_analog_signal?: boolean\n  is_positive_voltage_source?: boolean\n  trace_width?: number\n  subcircuit_id?: string\n  subcircuit_connectivity_map_key?: string\n}\n\nexpectTypesMatch<SourceNet, InferredSourceNet>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_board = z\n  .object({\n    type: z.literal(\"source_board\"),\n    source_board_id: z.string(),\n    source_group_id: z.string(),\n    title: z.string().optional(),\n  })\n  .describe(\"Defines a board in the source domain\")\n\nexport type SourceBoardInput = z.input<typeof source_board>\ntype InferredSourceBoard = z.infer<typeof source_board>\n\n/**\n * Defines a board in the source domain\n */\nexport interface SourceBoard {\n  type: \"source_board\"\n  source_board_id: string\n  source_group_id: string\n  title?: string\n}\n\nexpectTypesMatch<SourceBoard, InferredSourceBoard>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_ambiguous_port_reference = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_ambiguous_port_reference\"),\n    source_ambiguous_port_reference_id: getZodPrefixedIdWithDefault(\n      \"source_ambiguous_port_reference\",\n    ),\n    error_type: z\n      .literal(\"source_ambiguous_port_reference\")\n      .default(\"source_ambiguous_port_reference\"),\n    source_port_id: z.string().optional(),\n    source_component_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a port hint matches multiple non-overlapping pads, making the port reference ambiguous\",\n  )\n\nexport type SourceAmbiguousPortReferenceInput = z.input<\n  typeof source_ambiguous_port_reference\n>\ntype InferredSourceAmbiguousPortReference = z.infer<\n  typeof source_ambiguous_port_reference\n>\n\n/**\n * Error emitted when a port hint matches multiple non-overlapping pads,\n * making the port reference ambiguous (e.g. multiple pads all named \"SH\").\n */\nexport interface SourceAmbiguousPortReference extends BaseCircuitJsonError {\n  type: \"source_ambiguous_port_reference\"\n  source_ambiguous_port_reference_id: string\n  error_type: \"source_ambiguous_port_reference\"\n  source_port_id?: string\n  source_component_id?: string\n}\n\nexpectTypesMatch<\n  SourceAmbiguousPortReference,\n  InferredSourceAmbiguousPortReference\n>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_pcb_ground_plane = z\n  .object({\n    type: z.literal(\"source_pcb_ground_plane\"),\n    source_pcb_ground_plane_id: z.string(),\n    source_group_id: z.string(),\n    source_net_id: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a ground plane in the source domain\")\n\nexport type SourcePcbGroundPlaneInput = z.input<typeof source_pcb_ground_plane>\ntype InferredSourcePcbGroundPlane = z.infer<typeof source_pcb_ground_plane>\n\n/**\n * Defines a ground plane in the source domain\n */\nexport interface SourcePcbGroundPlane {\n  type: \"source_pcb_ground_plane\"\n  source_pcb_ground_plane_id: string\n  source_group_id: string\n  source_net_id: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<SourcePcbGroundPlane, InferredSourcePcbGroundPlane>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_manually_placed_via = z\n  .object({\n    type: z.literal(\"source_manually_placed_via\"),\n    source_manually_placed_via_id: z.string(),\n    source_group_id: z.string(),\n    source_net_id: z.string(),\n    subcircuit_id: z.string().optional(),\n    source_trace_id: z.string().optional(),\n  })\n  .describe(\"Defines a via that is manually placed in the source domain\")\n\nexport type SourceManuallyPlacedViaInput = z.input<\n  typeof source_manually_placed_via\n>\ntype InferredSourceManuallyPlacedVia = z.infer<\n  typeof source_manually_placed_via\n>\n\n/**\n * Defines a via that is manually placed in the source domain\n */\nexport interface SourceManuallyPlacedVia {\n  type: \"source_manually_placed_via\"\n  source_manually_placed_via_id: string\n  source_group_id: string\n  source_net_id: string\n  subcircuit_id?: string\n  source_trace_id?: string\n}\n\nexpectTypesMatch<SourceManuallyPlacedVia, InferredSourceManuallyPlacedVia>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const all_layers = [\n  \"top\",\n  \"bottom\",\n  \"inner1\",\n  \"inner2\",\n  \"inner3\",\n  \"inner4\",\n  \"inner5\",\n  \"inner6\",\n] as const\n\nexport const layer_string = z.enum(all_layers)\n\nexport const layer_ref = layer_string\n  .or(\n    z.object({\n      name: layer_string,\n    }),\n  )\n  .transform((layer) => {\n    if (typeof layer === \"string\") {\n      return layer\n    }\n    return layer.name\n  })\n\nexport type LayerRefInput = z.input<typeof layer_ref>\ntype InferredLayerRef = z.output<typeof layer_ref>\nexport type LayerRef = (typeof all_layers)[number]\n\nexpectTypesMatch<LayerRef, InferredLayerRef>(true)\n\nexport const visible_layer = z.enum([\"top\", \"bottom\"])\nexport type VisibleLayerRef = z.infer<typeof visible_layer>\nexport type VisibleLayer = z.infer<typeof visible_layer>\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_unnamed_trace_warning = z\n  .object({\n    type: z.literal(\"source_unnamed_trace_warning\"),\n    source_unnamed_trace_warning_id: getZodPrefixedIdWithDefault(\n      \"source_unnamed_trace_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_unnamed_trace_warning\")\n      .default(\"source_unnamed_trace_warning\"),\n    message: z.string(),\n    source_trace_id: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Warning emitted when a source trace is missing a name\")\n\nexport type SourceUnnamedTraceWarningInput = z.input<\n  typeof source_unnamed_trace_warning\n>\ntype InferredSourceUnnamedTraceWarning = z.infer<\n  typeof source_unnamed_trace_warning\n>\n\n/**\n * Warning emitted when a source trace is missing a name\n */\nexport interface SourceUnnamedTraceWarning {\n  type: \"source_unnamed_trace_warning\"\n  source_unnamed_trace_warning_id: string\n  warning_type: \"source_unnamed_trace_warning\"\n  message: string\n  source_trace_id: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<SourceUnnamedTraceWarning, InferredSourceUnnamedTraceWarning>(\n  true,\n)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_no_power_pin_defined_warning = z\n  .object({\n    type: z.literal(\"source_no_power_pin_defined_warning\"),\n    source_no_power_pin_defined_warning_id: getZodPrefixedIdWithDefault(\n      \"source_no_power_pin_defined_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_no_power_pin_defined_warning\")\n      .default(\"source_no_power_pin_defined_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    source_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a chip has no source ports with requires_power=true\",\n  )\n\nexport type SourceNoPowerPinDefinedWarningInput = z.input<\n  typeof source_no_power_pin_defined_warning\n>\ntype InferredSourceNoPowerPinDefinedWarning = z.infer<\n  typeof source_no_power_pin_defined_warning\n>\n\n/**\n * Warning emitted when a chip has no source ports with requires_power=true\n */\nexport interface SourceNoPowerPinDefinedWarning {\n  type: \"source_no_power_pin_defined_warning\"\n  source_no_power_pin_defined_warning_id: string\n  warning_type: \"source_no_power_pin_defined_warning\"\n  message: string\n  source_component_id: string\n  source_port_ids: string[]\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourceNoPowerPinDefinedWarning,\n  InferredSourceNoPowerPinDefinedWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_no_ground_pin_defined_warning = z\n  .object({\n    type: z.literal(\"source_no_ground_pin_defined_warning\"),\n    source_no_ground_pin_defined_warning_id: getZodPrefixedIdWithDefault(\n      \"source_no_ground_pin_defined_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_no_ground_pin_defined_warning\")\n      .default(\"source_no_ground_pin_defined_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    source_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a chip has no source ports marked as ground pins\",\n  )\n\nexport type SourceNoGroundPinDefinedWarningInput = z.input<\n  typeof source_no_ground_pin_defined_warning\n>\ntype InferredSourceNoGroundPinDefinedWarning = z.infer<\n  typeof source_no_ground_pin_defined_warning\n>\n\n/**\n * Warning emitted when a chip has no source ports marked as ground pins\n */\nexport interface SourceNoGroundPinDefinedWarning {\n  type: \"source_no_ground_pin_defined_warning\"\n  source_no_ground_pin_defined_warning_id: string\n  warning_type: \"source_no_ground_pin_defined_warning\"\n  message: string\n  source_component_id: string\n  source_port_ids: string[]\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourceNoGroundPinDefinedWarning,\n  InferredSourceNoGroundPinDefinedWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_component_pins_underspecified_warning = z\n  .object({\n    type: z.literal(\"source_component_pins_underspecified_warning\"),\n    source_component_pins_underspecified_warning_id:\n      getZodPrefixedIdWithDefault(\n        \"source_component_pins_underspecified_warning\",\n      ),\n    warning_type: z\n      .literal(\"source_component_pins_underspecified_warning\")\n      .default(\"source_component_pins_underspecified_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    source_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when all ports on a source component are underspecified\",\n  )\n\nexport type SourceComponentPinsUnderspecifiedWarningInput = z.input<\n  typeof source_component_pins_underspecified_warning\n>\ntype InferredSourceComponentPinsUnderspecifiedWarning = z.infer<\n  typeof source_component_pins_underspecified_warning\n>\n\n/**\n * Warning emitted when all ports on a source component are underspecified\n */\nexport interface SourceComponentPinsUnderspecifiedWarning {\n  type: \"source_component_pins_underspecified_warning\"\n  source_component_pins_underspecified_warning_id: string\n  warning_type: \"source_component_pins_underspecified_warning\"\n  message: string\n  source_component_id: string\n  source_port_ids: string[]\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourceComponentPinsUnderspecifiedWarning,\n  InferredSourceComponentPinsUnderspecifiedWarning\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_pin_must_be_connected_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"source_pin_must_be_connected_error\"),\n    source_pin_must_be_connected_error_id: getZodPrefixedIdWithDefault(\n      \"source_pin_must_be_connected_error\",\n    ),\n    error_type: z\n      .literal(\"source_pin_must_be_connected_error\")\n      .default(\"source_pin_must_be_connected_error\"),\n    source_component_id: z.string(),\n    source_port_id: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a pin with mustBeConnected attribute is not connected to any trace\",\n  )\n\nexport type SourcePinMustBeConnectedErrorInput = z.input<\n  typeof source_pin_must_be_connected_error\n>\ntype InferredSourcePinMustBeConnectedError = z.infer<\n  typeof source_pin_must_be_connected_error\n>\n\n/**\n * Error emitted when a pin with mustBeConnected attribute is not connected to any trace\n */\nexport interface SourcePinMustBeConnectedError extends BaseCircuitJsonError {\n  type: \"source_pin_must_be_connected_error\"\n  source_pin_must_be_connected_error_id: string\n  error_type: \"source_pin_must_be_connected_error\"\n  source_component_id: string\n  source_port_id: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SourcePinMustBeConnectedError,\n  InferredSourcePinMustBeConnectedError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const unknown_error_finding_part = base_circuit_json_error\n  .extend({\n    type: z.literal(\"unknown_error_finding_part\"),\n    unknown_error_finding_part_id: getZodPrefixedIdWithDefault(\n      \"unknown_error_finding_part\",\n    ),\n    error_type: z\n      .literal(\"unknown_error_finding_part\")\n      .default(\"unknown_error_finding_part\"),\n    source_component_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when an unexpected error occurs while finding a part\",\n  )\n\nexport type UnknownErrorFindingPartInput = z.input<\n  typeof unknown_error_finding_part\n>\ntype InferredUnknownErrorFindingPart = z.infer<\n  typeof unknown_error_finding_part\n>\n\n/**\n * Error emitted when an unexpected error occurs while finding a part.\n * This includes cases where the API returns HTML instead of JSON,\n * network failures, or other unexpected responses.\n */\nexport interface UnknownErrorFindingPart extends BaseCircuitJsonError {\n  type: \"unknown_error_finding_part\"\n  unknown_error_finding_part_id: string\n  error_type: \"unknown_error_finding_part\"\n  source_component_id?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<UnknownErrorFindingPart, InferredUnknownErrorFindingPart>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  supplier_name,\n  type SupplierName,\n} from \"src/pcb/properties/supplier_name\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const source_part_not_found_warning = z\n  .object({\n    type: z.literal(\"source_part_not_found_warning\"),\n    source_part_not_found_warning_id: getZodPrefixedIdWithDefault(\n      \"source_part_not_found_warning\",\n    ),\n    warning_type: z\n      .literal(\"source_part_not_found_warning\")\n      .default(\"source_part_not_found_warning\"),\n    message: z.string(),\n    source_component_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    supplier_name: supplier_name.optional(),\n    manufacturer_part_number: z.string().optional(),\n    supplier_part_number: z.string().optional(),\n    part_name: z.string().optional(),\n  })\n  .describe(\"Warning emitted when a requested part can not be found\")\n\nexport type SourcePartNotFoundWarningInput = z.input<\n  typeof source_part_not_found_warning\n>\ntype InferredSourcePartNotFoundWarning = z.infer<\n  typeof source_part_not_found_warning\n>\n\n/**\n * Warning emitted when a requested part can not be found\n */\nexport interface SourcePartNotFoundWarning {\n  type: \"source_part_not_found_warning\"\n  source_part_not_found_warning_id: string\n  warning_type: \"source_part_not_found_warning\"\n  message: string\n  source_component_id?: string\n  subcircuit_id?: string\n  supplier_name?: SupplierName\n  manufacturer_part_number?: string\n  supplier_part_number?: string\n  part_name?: string\n}\n\nexpectTypesMatch<SourcePartNotFoundWarning, InferredSourcePartNotFoundWarning>(\n  true,\n)\n","import { z } from \"zod\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SchematicBox {\n  type: \"schematic_box\"\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  width: number\n  height: number\n  is_dashed: boolean\n  x: number\n  y: number\n  subcircuit_id?: string\n}\n\nexport const schematic_box = z\n  .object({\n    type: z.literal(\"schematic_box\"),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    schematic_symbol_id: z.string().optional(),\n    width: distance,\n    height: distance,\n    is_dashed: z.boolean().default(false),\n    x: distance,\n    y: distance,\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Draws a box on the schematic\")\n\nexport type SchematicBoxInput = z.input<typeof schematic_box>\ntype InferredSchematicBox = z.infer<typeof schematic_box>\n\nexpectTypesMatch<SchematicBox, InferredSchematicBox>(true)\n","import { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\nimport { type Point, point } from \"../common/point\"\nimport { distance } from \"../units\"\n\nexport interface SchematicPath {\n  type: \"schematic_path\"\n  schematic_path_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  fill_color?: string\n  is_filled?: boolean\n  is_dashed: boolean\n  stroke_width?: number | null\n  stroke_color?: string\n  dash_length?: number\n  dash_gap?: number\n  points: Point[]\n  subcircuit_id?: string\n}\n\nexport const schematic_path = z.object({\n  type: z.literal(\"schematic_path\"),\n  schematic_path_id: getZodPrefixedIdWithDefault(\"schematic_path\"),\n  schematic_sheet_id: z.string().optional(),\n  schematic_component_id: z.string().optional(),\n  schematic_symbol_id: z.string().optional(),\n  fill_color: z.string().optional(),\n  is_filled: z.boolean().optional(),\n  is_dashed: z.boolean().default(false),\n  stroke_width: distance.nullable().optional(),\n  stroke_color: z.string().optional(),\n  dash_length: distance.optional(),\n  dash_gap: distance.optional(),\n  points: z.array(point),\n  subcircuit_id: z.string().optional(),\n})\n\nexport type SchematicPathInput = z.input<typeof schematic_path>\ntype InferredSchematicPath = z.infer<typeof schematic_path>\n\nexpectTypesMatch<SchematicPath, InferredSchematicPath>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { size, type Size } from \"../common/size\"\nimport { length } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_pin_styles = z.record(\n  z.object({\n    left_margin: length.optional(),\n    right_margin: length.optional(),\n    top_margin: length.optional(),\n    bottom_margin: length.optional(),\n  }),\n)\n\nexport interface SchematicPortArrangementBySize {\n  left_size: number\n  right_size: number\n  top_size?: number\n  bottom_size?: number\n}\n\nexport interface SchematicPortArrangementBySides {\n  left_side?: { pins: number[]; direction?: \"top-to-bottom\" | \"bottom-to-top\" }\n  right_side?: { pins: number[]; direction?: \"top-to-bottom\" | \"bottom-to-top\" }\n  top_side?: { pins: number[]; direction?: \"left-to-right\" | \"right-to-left\" }\n  bottom_side?: {\n    pins: number[]\n    direction?: \"left-to-right\" | \"right-to-left\"\n  }\n}\n\nexport type SchematicPortArrangement =\n  | SchematicPortArrangementBySize\n  | SchematicPortArrangementBySides\n\nexport interface SchematicComponent {\n  type: \"schematic_component\"\n  size: Size\n  center: Point\n  source_component_id?: string\n  schematic_component_id: string\n  schematic_sheet_id?: string\n  schematic_symbol_id?: string\n  pin_spacing?: number\n  pin_styles?: Record<\n    string,\n    {\n      left_margin?: number\n      right_margin?: number\n      top_margin?: number\n      bottom_margin?: number\n    }\n  >\n  box_width?: number\n  symbol_name?: string\n  port_arrangement?: SchematicPortArrangement\n  port_labels?: Record<string, string>\n  symbol_display_value?: string\n  subcircuit_id?: string\n  schematic_group_id?: string\n  is_schematic_group?: boolean\n  source_group_id?: string\n  is_box_with_pins: boolean\n}\n\nexport const schematic_component_port_arrangement_by_size = z.object({\n  left_size: z.number(),\n  right_size: z.number(),\n  top_size: z.number().optional(),\n  bottom_size: z.number().optional(),\n})\n\nexpectTypesMatch<\n  SchematicPortArrangementBySize,\n  z.infer<typeof schematic_component_port_arrangement_by_size>\n>(true)\n\nexport const schematic_component_port_arrangement_by_sides = z.object({\n  left_side: z\n    .object({\n      pins: z.array(z.number()),\n      // @ts-ignore\n      direction: z.enum([\"top-to-bottom\", \"bottom-to-top\"]).optional(),\n    })\n    .optional(),\n  right_side: z\n    .object({\n      pins: z.array(z.number()),\n      // @ts-ignore\n      direction: z.enum([\"top-to-bottom\", \"bottom-to-top\"]).optional(),\n    })\n    .optional(),\n  top_side: z\n    .object({\n      pins: z.array(z.number()),\n      // @ts-ignore\n      direction: z.enum([\"left-to-right\", \"right-to-left\"]).optional(),\n    })\n    .optional(),\n  bottom_side: z\n    .object({\n      pins: z.array(z.number()),\n      // @ts-ignore\n      direction: z.enum([\"left-to-right\", \"right-to-left\"]).optional(),\n    })\n    .optional(),\n})\n\nexpectTypesMatch<\n  SchematicPortArrangementBySides,\n  z.infer<typeof schematic_component_port_arrangement_by_sides>\n>(true)\n\nexport const port_arrangement = z.union([\n  schematic_component_port_arrangement_by_size,\n  schematic_component_port_arrangement_by_sides,\n])\n\nexport const schematic_component = z.object({\n  type: z.literal(\"schematic_component\"),\n  size,\n  center: point,\n  source_component_id: z.string().optional(),\n  schematic_component_id: z.string(),\n  schematic_sheet_id: z.string().optional(),\n  schematic_symbol_id: z.string().optional(),\n  pin_spacing: length.optional(),\n  pin_styles: schematic_pin_styles.optional(),\n  box_width: length.optional(),\n  symbol_name: z.string().optional(),\n  port_arrangement: port_arrangement.optional(),\n  port_labels: z.record(z.string()).optional(),\n  symbol_display_value: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  schematic_group_id: z.string().optional(),\n  is_schematic_group: z.boolean().optional(),\n  source_group_id: z.string().optional(),\n  is_box_with_pins: z.boolean().optional().default(true),\n})\n\nexport type SchematicComponentInput = z.input<typeof schematic_component>\ntype InferredSchematicComponent = z.infer<typeof schematic_component>\n\nexpectTypesMatch<SchematicComponent, InferredSchematicComponent>(true)\n","import { kicadSymbolMetadata } from \"src/common/kicadSymbolMetadata\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nconst schematicSymbolMetadata = z\n  .object({\n    kicad_symbol: kicadSymbolMetadata.optional(),\n  })\n  .catchall(z.unknown())\n\nexport type SchematicSymbolMetadata = z.infer<typeof schematicSymbolMetadata>\n\nexport interface SchematicSymbol {\n  type: \"schematic_symbol\"\n  schematic_symbol_id: string\n  name?: string\n  metadata?: SchematicSymbolMetadata\n}\n\nexport const schematic_symbol = z\n  .object({\n    type: z.literal(\"schematic_symbol\"),\n    schematic_symbol_id: z.string(),\n    name: z.string().optional(),\n    metadata: schematicSymbolMetadata.optional(),\n  })\n  .describe(\n    \"Defines a named schematic symbol that can be referenced by components.\",\n  )\n\nexport type SchematicSymbolInput = z.input<typeof schematic_symbol>\ntype InferredSchematicSymbol = z.infer<typeof schematic_symbol>\n\nexpectTypesMatch<SchematicSymbol, InferredSchematicSymbol>(true)\n","import { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\nimport { distance } from \"../units\"\n\n/** Draws a styled line on the schematic */\nexport interface SchematicLine {\n  type: \"schematic_line\"\n  schematic_line_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  x1: number\n  y1: number\n  x2: number\n  y2: number\n  stroke_width?: number | null\n  color: string\n  is_dashed: boolean\n  dash_length?: number\n  dash_gap?: number\n  subcircuit_id?: string\n}\n\nexport const schematic_line = z\n  .object({\n    type: z.literal(\"schematic_line\"),\n    schematic_line_id: getZodPrefixedIdWithDefault(\"schematic_line\"),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    schematic_symbol_id: z.string().optional(),\n    x1: distance,\n    y1: distance,\n    x2: distance,\n    y2: distance,\n    stroke_width: distance.nullable().optional(),\n    color: z.string().default(\"#000000\"),\n    is_dashed: z.boolean().default(false),\n    dash_length: distance.optional(),\n    dash_gap: distance.optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Draws a styled line on the schematic\")\n\nexport type SchematicLineInput = z.input<typeof schematic_line>\ntype InferredSchematicLine = z.infer<typeof schematic_line>\n\nexpectTypesMatch<SchematicLine, InferredSchematicLine>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { distance, rotation } from \"../units\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n/** Draws a styled rectangle on the schematic */\nexport interface SchematicRect {\n  type: \"schematic_rect\"\n  schematic_rect_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  center: Point\n  width: number\n  height: number\n  rotation: number\n  stroke_width?: number | null\n  color: string\n  is_filled: boolean\n  fill_color?: string\n  is_dashed: boolean\n  subcircuit_id?: string\n}\n\nexport const schematic_rect = z\n  .object({\n    type: z.literal(\"schematic_rect\"),\n    schematic_rect_id: getZodPrefixedIdWithDefault(\"schematic_rect\"),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    schematic_symbol_id: z.string().optional(),\n    center: point,\n    width: distance,\n    height: distance,\n    rotation: rotation.default(0),\n    stroke_width: distance.nullable().optional(),\n    color: z.string().default(\"#000000\"),\n    is_filled: z.boolean().default(false),\n    fill_color: z.string().optional(),\n    is_dashed: z.boolean().default(false),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Draws a styled rectangle on the schematic\")\n\nexport type SchematicRectInput = z.input<typeof schematic_rect>\ntype InferredSchematicRect = z.infer<typeof schematic_rect>\n\nexpectTypesMatch<SchematicRect, InferredSchematicRect>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { distance } from \"../units\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n/** Draws a styled circle on the schematic */\nexport interface SchematicCircle {\n  type: \"schematic_circle\"\n  schematic_circle_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  center: Point\n  radius: number\n  stroke_width?: number | null\n  color: string\n  is_filled: boolean\n  fill_color?: string\n  is_dashed: boolean\n  subcircuit_id?: string\n}\n\nexport const schematic_circle = z\n  .object({\n    type: z.literal(\"schematic_circle\"),\n    schematic_circle_id: getZodPrefixedIdWithDefault(\"schematic_circle\"),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    schematic_symbol_id: z.string().optional(),\n    center: point,\n    radius: distance,\n    stroke_width: distance.nullable().optional(),\n    color: z.string().default(\"#000000\"),\n    is_filled: z.boolean().default(false),\n    fill_color: z.string().optional(),\n    is_dashed: z.boolean().default(false),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Draws a styled circle on the schematic\")\n\nexport type SchematicCircleInput = z.input<typeof schematic_circle>\ntype InferredSchematicCircle = z.infer<typeof schematic_circle>\n\nexpectTypesMatch<SchematicCircle, InferredSchematicCircle>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { distance, rotation } from \"../units\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n/** Draws a styled arc on the schematic */\nexport interface SchematicArc {\n  type: \"schematic_arc\"\n  schematic_arc_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  center: Point\n  radius: number\n  start_angle_degrees: number\n  end_angle_degrees: number\n  direction: \"clockwise\" | \"counterclockwise\"\n  stroke_width?: number | null\n  color: string\n  is_dashed: boolean\n  subcircuit_id?: string\n}\n\nexport const schematic_arc = z\n  .object({\n    type: z.literal(\"schematic_arc\"),\n    schematic_arc_id: getZodPrefixedIdWithDefault(\"schematic_arc\"),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    schematic_symbol_id: z.string().optional(),\n    center: point,\n    radius: distance,\n    start_angle_degrees: rotation,\n    end_angle_degrees: rotation,\n    direction: z\n      .enum([\"clockwise\", \"counterclockwise\"])\n      .default(\"counterclockwise\"),\n    stroke_width: distance.nullable().optional(),\n    color: z.string().default(\"#000000\"),\n    is_dashed: z.boolean().default(false),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Draws a styled arc on the schematic\")\n\nexport type SchematicArcInput = z.input<typeof schematic_arc>\ntype InferredSchematicArc = z.infer<typeof schematic_arc>\n\nexpectTypesMatch<SchematicArc, InferredSchematicArc>(true)\n","import { z } from \"zod\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SchematicTraceEdge {\n  from: {\n    x: number\n    y: number\n  }\n  to: {\n    x: number\n    y: number\n  }\n  is_crossing?: boolean\n  from_schematic_port_id?: string\n  to_schematic_port_id?: string\n}\n\nexport interface SchematicTrace {\n  type: \"schematic_trace\"\n  schematic_trace_id: string\n  schematic_sheet_id?: string\n  source_trace_id?: string\n  junctions: {\n    x: number\n    y: number\n  }[]\n  edges: SchematicTraceEdge[]\n  subcircuit_id?: string\n  /** Optional for now, but will be required in a future release */\n  subcircuit_connectivity_map_key?: string\n}\n\nexport const schematic_trace = z.object({\n  type: z.literal(\"schematic_trace\"),\n  schematic_trace_id: z.string(),\n  schematic_sheet_id: z.string().optional(),\n  source_trace_id: z.string().optional(),\n  junctions: z.array(\n    z.object({\n      x: z.number(),\n      y: z.number(),\n    }),\n  ),\n  edges: z.array(\n    z.object({\n      from: z.object({\n        x: z.number(),\n        y: z.number(),\n      }),\n      to: z.object({\n        x: z.number(),\n        y: z.number(),\n      }),\n      is_crossing: z.boolean().optional(),\n      from_schematic_port_id: z.string().optional(),\n      to_schematic_port_id: z.string().optional(),\n    }),\n  ),\n  subcircuit_id: z.string().optional(),\n  // TODO: make required in a future release\n  subcircuit_connectivity_map_key: z.string().optional(),\n})\n\nexport type SchematicTraceInput = z.input<typeof schematic_trace>\ntype InferredSchematicTrace = z.infer<typeof schematic_trace>\n\nexpectTypesMatch<SchematicTraceInput, InferredSchematicTrace>(true)\n","import { z } from \"zod\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { ninePointAnchor } from \"src/common/NinePointAnchor\"\nimport type { NinePointAnchor } from \"src/common/NinePointAnchor\"\nimport type { FivePointAnchor } from \"src/common/FivePointAnchor\"\nimport { fivePointAnchor } from \"src/common/FivePointAnchor\"\n\nexport interface SchematicText {\n  type: \"schematic_text\"\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  schematic_symbol_id?: string\n  schematic_text_id: string\n  text: string\n  font_size: number\n  position: {\n    x: number\n    y: number\n  }\n  rotation: number\n  anchor: NinePointAnchor | FivePointAnchor\n  color: string\n  subcircuit_id?: string\n}\n\nexport const schematic_text = z.object({\n  type: z.literal(\"schematic_text\"),\n  schematic_sheet_id: z.string().optional(),\n  schematic_component_id: z.string().optional(),\n  schematic_symbol_id: z.string().optional(),\n  schematic_text_id: z.string(),\n  text: z.string(),\n  font_size: z.number().default(0.18),\n  position: z.object({\n    x: distance,\n    y: distance,\n  }),\n  rotation: z.number().default(0),\n  anchor: z\n    .union([fivePointAnchor.describe(\"legacy\"), ninePointAnchor])\n    .default(\"center\"),\n  color: z.string().default(\"#000000\"),\n  subcircuit_id: z.string().optional(),\n})\n\nexport type SchematicTextInput = z.input<typeof schematic_text>\ntype InferredSchematicText = z.infer<typeof schematic_text>\n\nexpectTypesMatch<SchematicText, InferredSchematicText>(true)\n","import { z } from \"zod\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport type FivePointAnchor = \"center\" | \"left\" | \"right\" | \"top\" | \"bottom\"\n\nexport const fivePointAnchor = z.enum([\n  \"center\",\n  \"left\",\n  \"right\",\n  \"top\",\n  \"bottom\",\n])\n\ntype InferredFivePointAnchor = z.infer<typeof fivePointAnchor>\n\nexpectTypesMatch<FivePointAnchor, InferredFivePointAnchor>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SchematicPort {\n  type: \"schematic_port\"\n  schematic_port_id: string\n  source_port_id: string\n  schematic_sheet_id?: string\n  schematic_component_id?: string\n  center: Point\n  facing_direction?: \"up\" | \"down\" | \"left\" | \"right\"\n  distance_from_component_edge?: number\n  side_of_component?: \"top\" | \"bottom\" | \"left\" | \"right\"\n  true_ccw_index?: number\n  pin_number?: number\n  display_pin_label?: string\n  subcircuit_id?: string\n  is_connected?: boolean\n  has_input_arrow?: boolean\n  has_output_arrow?: boolean\n  is_drawn_with_inversion_circle?: boolean\n}\n\nexport const schematic_port = z\n  .object({\n    type: z.literal(\"schematic_port\"),\n    schematic_port_id: z.string(),\n    source_port_id: z.string(),\n    schematic_sheet_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    center: point,\n    facing_direction: z.enum([\"up\", \"down\", \"left\", \"right\"]).optional(),\n    distance_from_component_edge: z.number().optional(),\n    side_of_component: z.enum([\"top\", \"bottom\", \"left\", \"right\"]).optional(),\n    true_ccw_index: z.number().optional(),\n    pin_number: z.number().optional(),\n    display_pin_label: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    is_connected: z.boolean().optional(),\n    has_input_arrow: z.boolean().optional(),\n    has_output_arrow: z.boolean().optional(),\n    is_drawn_with_inversion_circle: z.boolean().optional(),\n  })\n  .describe(\"Defines a port on a schematic component\")\n\nexport type SchematicPortInput = z.input<typeof schematic_port>\ntype InferredSchematicPort = z.infer<typeof schematic_port>\n\nexpectTypesMatch<SchematicPort, InferredSchematicPort>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\n\nexport interface SchematicNetLabel {\n  type: \"schematic_net_label\"\n  schematic_net_label_id: string\n  schematic_sheet_id?: string\n  schematic_trace_id?: string\n  source_trace_id?: string\n  source_net_id: string\n  center: Point\n  anchor_position?: Point | undefined\n  anchor_side: \"top\" | \"bottom\" | \"left\" | \"right\"\n  text: string\n  symbol_name?: string | undefined\n  /**\n   * When true the net label can be repositioned. When false the label's\n   * position is fixed by the element it is attached to.\n   */\n  is_movable?: boolean\n  subcircuit_id?: string\n}\n\nexport const schematic_net_label = z.object({\n  type: z.literal(\"schematic_net_label\"),\n  schematic_net_label_id: getZodPrefixedIdWithDefault(\"schematic_net_label\"),\n  schematic_sheet_id: z.string().optional(),\n  schematic_trace_id: z.string().optional(),\n  source_trace_id: z.string().optional(),\n  source_net_id: z.string(),\n  center: point,\n  anchor_position: point.optional(),\n  anchor_side: z.enum([\"top\", \"bottom\", \"left\", \"right\"]),\n  text: z.string(),\n  symbol_name: z.string().optional(),\n  is_movable: z.boolean().optional(),\n  subcircuit_id: z.string().optional(),\n})\n\nexport type SchematicNetLabelInput = z.input<typeof schematic_net_label>\nexport type InferredSchematicNetLabel = z.infer<typeof schematic_net_label>\n\nexpectTypesMatch<SchematicNetLabel, InferredSchematicNetLabel>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SchematicError extends BaseCircuitJsonError {\n  type: \"schematic_error\"\n  schematic_error_id: string\n  error_type: \"schematic_port_not_found\"\n  subcircuit_id?: string\n}\n\nexport const schematic_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"schematic_error\"),\n    schematic_error_id: z.string(),\n    // eventually each error type should be broken out into a dir of files\n    error_type: z\n      .literal(\"schematic_port_not_found\")\n      .default(\"schematic_port_not_found\"),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a schematic error on the schematic\")\n\nexport type SchematicErrorInput = z.input<typeof schematic_error>\ntype InferredSchematicError = z.infer<typeof schematic_error>\n\nexpectTypesMatch<SchematicError, InferredSchematicError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_layout_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"schematic_layout_error\"),\n    schematic_layout_error_id: getZodPrefixedIdWithDefault(\n      \"schematic_layout_error\",\n    ),\n    error_type: z\n      .literal(\"schematic_layout_error\")\n      .default(\"schematic_layout_error\"),\n    source_group_id: z.string(),\n    schematic_group_id: z.string(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Error emitted when schematic layout fails for a group\")\n\nexport type SchematicLayoutErrorInput = z.input<typeof schematic_layout_error>\ntype InferredSchematicLayoutError = z.infer<typeof schematic_layout_error>\n\nexport interface SchematicLayoutError extends BaseCircuitJsonError {\n  type: \"schematic_layout_error\"\n  schematic_layout_error_id: string\n  error_type: \"schematic_layout_error\"\n  source_group_id: string\n  schematic_group_id: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<SchematicLayoutError, InferredSchematicLayoutError>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { size, type Size } from \"../common/size\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_debug_object_base = z.object({\n  type: z.literal(\"schematic_debug_object\"),\n  label: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n})\n\nexport const schematic_debug_rect = schematic_debug_object_base.extend({\n  shape: z.literal(\"rect\"),\n  center: point,\n  size: size,\n})\n\nexport const schematic_debug_line = schematic_debug_object_base.extend({\n  shape: z.literal(\"line\"),\n  start: point,\n  end: point,\n})\n\nexport const schematic_debug_point = schematic_debug_object_base.extend({\n  shape: z.literal(\"point\"),\n  center: point,\n})\n\nexport const schematic_debug_object = z.discriminatedUnion(\"shape\", [\n  schematic_debug_rect,\n  schematic_debug_line,\n  schematic_debug_point,\n])\ntype InferredSchematicDebugObject = z.infer<typeof schematic_debug_object>\n\nexport interface SchematicDebugRect {\n  type: \"schematic_debug_object\"\n  label?: string\n  shape: \"rect\"\n  center: Point\n  size: Size\n  subcircuit_id?: string\n}\n\nexport interface SchematicDebugLine {\n  type: \"schematic_debug_object\"\n  label?: string\n  shape: \"line\"\n  start: Point\n  end: Point\n  subcircuit_id?: string\n}\n\nexport interface SchematicDebugPoint {\n  type: \"schematic_debug_object\"\n  label?: string\n  shape: \"point\"\n  center: Point\n  subcircuit_id?: string\n}\n\nexport type SchematicDebugObject =\n  | SchematicDebugRect\n  | SchematicDebugLine\n  | SchematicDebugPoint\n\nexpectTypesMatch<SchematicDebugObject, InferredSchematicDebugObject>(true)\nexport type SchematicDebugObjectInput = z.input<typeof schematic_debug_object>\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common/point\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { voltage } from \"src/units\"\nimport {\n  ninePointAnchor,\n  type NinePointAnchor,\n} from \"src/common/NinePointAnchor\"\n\nexport interface SchematicVoltageProbe {\n  type: \"schematic_voltage_probe\"\n  schematic_voltage_probe_id: string\n  schematic_sheet_id?: string\n  source_component_id?: string\n  name?: string\n  position: Point\n  schematic_trace_id: string\n  voltage?: number\n  subcircuit_id?: string\n  color?: string\n  label_alignment?: NinePointAnchor\n}\n\nexport const schematic_voltage_probe = z\n  .object({\n    type: z.literal(\"schematic_voltage_probe\"),\n    schematic_voltage_probe_id: z.string(),\n    schematic_sheet_id: z.string().optional(),\n    source_component_id: z.string().optional(),\n    name: z.string().optional(),\n    position: point,\n    schematic_trace_id: z.string(),\n    voltage: voltage.optional(),\n    subcircuit_id: z.string().optional(),\n    color: z.string().optional(),\n    label_alignment: ninePointAnchor.optional(),\n  })\n  .describe(\"Defines a voltage probe measurement point on a schematic trace\")\n\nexport type SchematicVoltageProbeInput = z.input<typeof schematic_voltage_probe>\ntype InferredSchematicVoltageProbe = z.infer<typeof schematic_voltage_probe>\n\nexpectTypesMatch<SchematicVoltageProbe, InferredSchematicVoltageProbe>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"../common\"\nimport { expectTypesMatch } from \"../utils/expect-types-match\"\n\nexport const schematic_manual_edit_conflict_warning = z\n  .object({\n    type: z.literal(\"schematic_manual_edit_conflict_warning\"),\n    schematic_manual_edit_conflict_warning_id: getZodPrefixedIdWithDefault(\n      \"schematic_manual_edit_conflict_warning\",\n    ),\n    warning_type: z\n      .literal(\"schematic_manual_edit_conflict_warning\")\n      .default(\"schematic_manual_edit_conflict_warning\"),\n    message: z.string(),\n    schematic_component_id: z.string(),\n    schematic_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    source_component_id: z.string(),\n  })\n  .describe(\n    \"Warning emitted when a component has both manual placement and explicit schX/schY coordinates\",\n  )\n\nexport type SchematicManualEditConflictWarningInput = z.input<\n  typeof schematic_manual_edit_conflict_warning\n>\ntype InferredSchematicManualEditConflictWarning = z.infer<\n  typeof schematic_manual_edit_conflict_warning\n>\n\n/**\n * Warning emitted when a component has both manual placement (via manualEdits) and explicit schX/schY coordinates\n */\nexport interface SchematicManualEditConflictWarning {\n  type: \"schematic_manual_edit_conflict_warning\"\n  schematic_manual_edit_conflict_warning_id: string\n  warning_type: \"schematic_manual_edit_conflict_warning\"\n  message: string\n  schematic_component_id: string\n  schematic_group_id?: string\n  subcircuit_id?: string\n  source_component_id: string\n}\n\nexpectTypesMatch<\n  SchematicManualEditConflictWarning,\n  InferredSchematicManualEditConflictWarning\n>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_group = z\n  .object({\n    type: z.literal(\"schematic_group\"),\n    schematic_group_id: getZodPrefixedIdWithDefault(\"schematic_group\"),\n    schematic_sheet_id: z.string().optional(),\n    source_group_id: z.string(),\n    is_subcircuit: z.boolean().optional(),\n    subcircuit_id: z.string().optional(),\n    width: length,\n    height: length,\n    center: point,\n    schematic_component_ids: z.array(z.string()),\n    show_as_schematic_box: z.boolean().optional(),\n    name: z.string().optional(),\n    description: z.string().optional(),\n  })\n  .describe(\"Defines a group of components on the schematic\")\n\nexport type SchematicGroupInput = z.input<typeof schematic_group>\ntype InferredSchematicGroup = z.infer<typeof schematic_group>\n\n/**\n * Defines a group of components on the schematic\n */\nexport interface SchematicGroup {\n  type: \"schematic_group\"\n  schematic_group_id: string\n  schematic_sheet_id?: string\n  source_group_id: string\n  is_subcircuit?: boolean\n  subcircuit_id?: string\n  width: Length\n  height: Length\n  center: Point\n  schematic_component_ids: string[]\n  show_as_schematic_box?: boolean\n  name?: string\n  description?: string\n}\n\nexpectTypesMatch<SchematicGroup, InferredSchematicGroup>(true)\n","import { z } from \"zod\"\nimport {\n  getZodPrefixedIdWithDefault,\n  ninePointAnchor,\n  point,\n  type NinePointAnchor,\n  type Point,\n} from \"src/common\"\nimport { distance, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_table = z\n  .object({\n    type: z.literal(\"schematic_table\"),\n    schematic_table_id: getZodPrefixedIdWithDefault(\"schematic_table\"),\n    schematic_sheet_id: z.string().optional(),\n    anchor_position: point,\n    column_widths: z.array(distance),\n    row_heights: z.array(distance),\n    cell_padding: distance.optional(),\n    border_width: distance.optional(),\n    subcircuit_id: z.string().optional(),\n    schematic_component_id: z.string().optional(),\n    anchor: ninePointAnchor.optional(),\n  })\n  .describe(\"Defines a table on the schematic\")\n\nexport type SchematicTableInput = z.input<typeof schematic_table>\ntype InferredSchematicTable = z.infer<typeof schematic_table>\n\n/**\n * Defines a table on the schematic, useful for displaying data in a structured format.\n */\nexport interface SchematicTable {\n  type: \"schematic_table\"\n  schematic_table_id: string\n  schematic_sheet_id?: string\n  anchor_position: Point\n  column_widths: Length[]\n  row_heights: Length[]\n  cell_padding?: Length\n  border_width?: Length\n  subcircuit_id?: string\n  schematic_component_id?: string\n  anchor?: NinePointAnchor\n}\n\nexpectTypesMatch<SchematicTable, InferredSchematicTable>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { distance, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_table_cell = z\n  .object({\n    type: z.literal(\"schematic_table_cell\"),\n    schematic_table_cell_id: getZodPrefixedIdWithDefault(\n      \"schematic_table_cell\",\n    ),\n    schematic_sheet_id: z.string().optional(),\n    schematic_table_id: z.string(),\n    start_row_index: z.number(),\n    end_row_index: z.number(),\n    start_column_index: z.number(),\n    end_column_index: z.number(),\n    text: z.string().optional(),\n    center: point,\n    width: distance,\n    height: distance,\n    horizontal_align: z.enum([\"left\", \"center\", \"right\"]).optional(),\n    vertical_align: z.enum([\"top\", \"middle\", \"bottom\"]).optional(),\n    font_size: distance.optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a cell within a schematic_table\")\n\nexport type SchematicTableCellInput = z.input<typeof schematic_table_cell>\ntype InferredSchematicTableCell = z.infer<typeof schematic_table_cell>\n\n/**\n * Defines a cell within a schematic_table\n */\nexport interface SchematicTableCell {\n  type: \"schematic_table_cell\"\n  schematic_table_cell_id: string\n  schematic_sheet_id?: string\n  schematic_table_id: string\n  start_row_index: number\n  end_row_index: number\n  start_column_index: number\n  end_column_index: number\n  text?: string\n  center: Point\n  width: Length\n  height: Length\n  horizontal_align?: \"left\" | \"center\" | \"right\"\n  vertical_align?: \"top\" | \"middle\" | \"bottom\"\n  font_size?: Length\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<SchematicTableCell, InferredSchematicTableCell>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const schematic_sheet = z\n  .object({\n    type: z.literal(\"schematic_sheet\"),\n    schematic_sheet_id: getZodPrefixedIdWithDefault(\"schematic_sheet\"),\n    name: z.string().optional(),\n    sheet_index: z.number().optional(),\n    subcircuit_id: z.string().optional(),\n    outline_color: z.string().optional(),\n  })\n  .describe(\n    \"Defines a schematic sheet or page that components can be placed on\",\n  )\n\nexport type SchematicSheetInput = z.input<typeof schematic_sheet>\ntype InferredSchematicSheet = z.infer<typeof schematic_sheet>\n\n/**\n * Defines a schematic sheet or page that components can be placed on.\n */\nexport interface SchematicSheet {\n  type: \"schematic_sheet\"\n  schematic_sheet_id: string\n  name?: string\n  sheet_index?: number\n  subcircuit_id?: string\n  outline_color?: string\n}\n\nexpectTypesMatch<SchematicSheet, InferredSchematicSheet>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const point_with_bulge = z.object({\n  x: distance,\n  y: distance,\n  bulge: z.number().optional(),\n})\n\nexport interface PointWithBulge {\n  x: Distance\n  y: Distance\n  bulge?: number\n}\ntype InferredPointWithBulge = z.infer<typeof point_with_bulge>\nexpectTypesMatch<PointWithBulge, InferredPointWithBulge>(true)\n\nexport const ring = z.object({\n  vertices: z.array(point_with_bulge),\n})\n\nexport interface Ring {\n  vertices: PointWithBulge[]\n}\ntype InferredRing = z.infer<typeof ring>\nexpectTypesMatch<Ring, InferredRing>(true)\n\nexport const brep_shape = z.object({\n  outer_ring: ring,\n  inner_rings: z.array(ring).default([]),\n})\n\n/**\n * B-rep shape defined by an outer ring and inner rings (holes).\n */\nexport interface BRepShape {\n  /**\n   * The outer boundary of the shape. Vertices must be in clockwise order.\n   */\n  outer_ring: Ring\n  /**\n   * Inner boundaries (holes). Vertices must be in counter-clockwise order.\n   */\n  inner_rings: Ring[]\n}\ntype InferredBRepShape = z.infer<typeof brep_shape>\nexpectTypesMatch<BRepShape, InferredBRepShape>(true)\n","import { z } from \"zod\"\nimport { distance } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"./layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n// x: string | number\n// y: string | number\n// via?: boolean\n// via_to_layer?: string\nexport const pcb_route_hint = z.object({\n  x: distance,\n  y: distance,\n  via: z.boolean().optional(),\n  via_to_layer: layer_ref.optional(),\n})\nexport const pcb_route_hints = z.array(pcb_route_hint)\n\nexport type PcbRouteHintInput = z.input<typeof pcb_route_hint>\nexport type PcbRouteHintsInput = z.input<typeof pcb_route_hints>\ntype InferredPcbRouteHint = z.output<typeof pcb_route_hint>\ntype InferredPcbRouteHints = z.output<typeof pcb_route_hints>\n\nexport interface PcbRouteHint {\n  x: number\n  y: number\n  via?: boolean\n  via_to_layer?: LayerRef\n}\n\nexport type PcbRouteHints = PcbRouteHint[]\n\nexpectTypesMatch<PcbRouteHint, InferredPcbRouteHint>(true)\nexpectTypesMatch<PcbRouteHints, InferredPcbRouteHints>(true)\n","import { z } from \"zod\"\nimport { distance } from \"../../units\"\nimport { layer_ref, type LayerRef } from \"./layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const route_hint_point = z.object({\n  x: distance,\n  y: distance,\n  via: z.boolean().optional(),\n  to_layer: layer_ref.optional(),\n  trace_width: distance.optional(),\n})\n\nexport type RouteHintPointInput = z.input<typeof route_hint_point>\ntype InferredRouteHintPoint = z.infer<typeof route_hint_point>\n\nexport interface RouteHintPoint {\n  x: number\n  y: number\n  via?: boolean\n  to_layer?: LayerRef\n  trace_width?: number\n}\n\nexpectTypesMatch<RouteHintPoint, InferredRouteHintPoint>(true)\n","import { z } from \"zod\"\nimport { length, type Length } from \"src/units\"\n\nexport const manufacturing_drc_properties = z.object({\n  min_trace_width: length.optional(),\n  min_board_edge_clearance: length.optional(),\n  min_via_hole_edge_to_via_hole_edge_clearance: length.optional(),\n  min_plated_hole_drill_edge_to_drill_edge_clearance: length.optional(),\n  min_trace_to_pad_edge_clearance: length.optional(),\n  min_pad_edge_to_pad_edge_clearance: length.optional(),\n  min_same_net_trace_edge_to_trace_edge_clearance: length.optional(),\n  min_different_net_trace_edge_to_trace_edge_clearance: length.optional(),\n  min_via_edge_to_pad_edge_clearance: length.optional(),\n  min_via_hole_diameter: length.optional(),\n  min_via_pad_diameter: length.optional(),\n})\n\nexport interface ManufacturingDrcProperties {\n  min_trace_width?: Length\n  min_board_edge_clearance?: Length\n  min_via_hole_edge_to_via_hole_edge_clearance?: Length\n  min_plated_hole_drill_edge_to_drill_edge_clearance?: Length\n  min_trace_to_pad_edge_clearance?: Length\n  min_pad_edge_to_pad_edge_clearance?: Length\n  min_same_net_trace_edge_to_trace_edge_clearance?: Length\n  min_different_net_trace_edge_to_trace_edge_clearance?: Length\n  min_via_edge_to_pad_edge_clearance?: Length\n  min_via_hole_diameter?: Length\n  min_via_pad_diameter?: Length\n}\n","import { type Point, getZodPrefixedIdWithDefault, point } from \"src/common\"\nimport {\n  type KicadFootprintMetadata,\n  kicadFootprintMetadata,\n} from \"src/common/kicadFootprintMetadata\"\nimport {\n  type NinePointAnchor,\n  ninePointAnchor,\n} from \"src/common/NinePointAnchor\"\nimport { type LayerRef, layer_ref } from \"src/pcb/properties/layer_ref\"\nimport { type Length, type Rotation, length, rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nexport interface PcbComponentMetadata {\n  kicad_footprint?: KicadFootprintMetadata\n}\n\nexport const pcb_component = z\n  .object({\n    type: z.literal(\"pcb_component\"),\n    pcb_component_id: getZodPrefixedIdWithDefault(\"pcb_component\"),\n    source_component_id: z.string(),\n    center: point,\n    layer: layer_ref,\n    rotation: rotation,\n    display_offset_x: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the x offset for this part, usually corresponding with how the user specified it\",\n      ),\n    display_offset_y: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the y offset for this part, usually corresponding with how the user specified it\",\n      ),\n    width: length,\n    height: length,\n    do_not_place: z.boolean().optional(),\n    is_allowed_to_be_off_board: z.boolean().optional(),\n    subcircuit_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    position_mode: z\n      .enum([\n        \"packed\",\n        \"relative_to_group_anchor\",\n        \"relative_to_another_component\",\n        \"none\",\n      ])\n      .optional(),\n    anchor_position: point.optional(),\n    anchor_alignment: ninePointAnchor.optional(),\n    positioned_relative_to_pcb_group_id: z.string().optional(),\n    positioned_relative_to_pcb_board_id: z.string().optional(),\n    cable_insertion_center: point.optional(),\n    insertion_direction: z\n      .enum([\n        \"from_above\",\n        \"from_left\",\n        \"from_right\",\n        \"from_front\",\n        \"from_back\",\n      ])\n      .optional(),\n    metadata: z\n      .object({\n        kicad_footprint: kicadFootprintMetadata.optional(),\n      })\n      .optional(),\n    obstructs_within_bounds: z\n      .boolean()\n      .default(true)\n      .describe(\n        \"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\",\n      ),\n  })\n  .describe(\"Defines a component on the PCB\")\n\nexport type PcbComponentInput = z.input<typeof pcb_component>\ntype InferredPcbComponent = z.infer<typeof pcb_component>\n\n/**\n * Defines a component on the PCB\n */\nexport interface PcbComponent {\n  type: \"pcb_component\"\n  pcb_component_id: string\n  source_component_id: string\n  subcircuit_id?: string\n  center: Point\n  layer: LayerRef\n  rotation: Rotation\n  display_offset_x?: string\n  display_offset_y?: string\n  width: Length\n  height: Length\n  do_not_place?: boolean\n  is_allowed_to_be_off_board?: boolean\n  pcb_group_id?: string\n  position_mode?:\n    | \"packed\"\n    | \"relative_to_group_anchor\"\n    | \"relative_to_another_component\"\n    | \"none\"\n  anchor_position?: Point\n  anchor_alignment?: NinePointAnchor\n  positioned_relative_to_pcb_group_id?: string\n  positioned_relative_to_pcb_board_id?: string\n  cable_insertion_center?: Point\n  insertion_direction?:\n    | \"from_above\"\n    | \"from_left\"\n    | \"from_right\"\n    | \"from_front\"\n    | \"from_back\"\n  metadata?: PcbComponentMetadata\n  obstructs_within_bounds: boolean\n}\n\n/**\n * @deprecated use PcbComponent\n */\nexport type PCBComponent = PcbComponent\n\nexpectTypesMatch<PcbComponent, InferredPcbComponent>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance, rotation, type Rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst pcb_hole_circle = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.literal(\"circle\"),\n  hole_diameter: z.number(),\n  x: distance,\n  y: distance,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_circle_shape = pcb_hole_circle.describe(\n  \"Defines a circular hole on the PCB\",\n)\n\nexport type PcbHoleCircleInput = z.input<typeof pcb_hole_circle>\ntype InferredPcbHoleCircle = z.infer<typeof pcb_hole_circle>\n\n/**\n * Defines a circular hole on the PCB\n */\nexport interface PcbHoleCircle {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"circle\"\n  hole_diameter: number\n  x: Distance\n  y: Distance\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexpectTypesMatch<PcbHoleCircle, InferredPcbHoleCircle>(true)\n\nconst pcb_hole_rect = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.literal(\"rect\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  x: distance,\n  y: distance,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_rect_shape = pcb_hole_rect.describe(\n  \"Defines a rectangular (square-capable) hole on the PCB. Use equal width/height for square.\",\n)\n\nexport type PcbHoleRectInput = z.input<typeof pcb_hole_rect>\ntype InferredPcbHoleRect = z.infer<typeof pcb_hole_rect>\n\n/**\n * Defines a rectangular (or square) hole on the PCB\n */\nexport interface PcbHoleRect {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"rect\"\n  hole_width: number\n  hole_height: number\n  x: Distance\n  y: Distance\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\nexpectTypesMatch<PcbHoleRect, InferredPcbHoleRect>(true)\n\nconst pcb_hole_circle_or_square = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.enum([\"circle\", \"square\"]),\n  hole_diameter: z.number(),\n  x: distance,\n  y: distance,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_circle_or_square_shape =\n  pcb_hole_circle_or_square.describe(\n    \"Defines a circular or square hole on the PCB\",\n  )\n\nexport type PcbHoleCircleOrSquareInput = z.input<\n  typeof pcb_hole_circle_or_square\n>\ntype InferredPcbHoleCircleOrSquare = z.infer<typeof pcb_hole_circle_or_square>\n\n/**\n * Defines a circular or square hole on the PCB\n */\n\n/**\n * @deprecated Use `PcbHoleCircle` for circular holes or `PcbHoleRect` for square holes.\n */\nexport interface PcbHoleCircleOrSquare {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"circle\" | \"square\"\n  hole_diameter: number\n  x: Distance\n  y: Distance\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexpectTypesMatch<PcbHoleCircleOrSquare, InferredPcbHoleCircleOrSquare>(true)\n\nconst pcb_hole_oval = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.literal(\"oval\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  x: distance,\n  y: distance,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_oval_shape = pcb_hole_oval.describe(\n  \"Defines an oval hole on the PCB\",\n)\n\nexport type PcbHoleOvalInput = z.input<typeof pcb_hole_oval>\ntype InferredPcbHoleOval = z.infer<typeof pcb_hole_oval>\n\n/**\n * Defines an oval hole on the PCB\n */\nexport interface PcbHoleOval {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"oval\"\n  hole_width: number\n  hole_height: number\n  x: Distance\n  y: Distance\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexpectTypesMatch<PcbHoleOval, InferredPcbHoleOval>(true)\n\nconst pcb_hole_pill = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.literal(\"pill\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  x: distance,\n  y: distance,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_pill_shape = pcb_hole_pill.describe(\n  \"Defines a pill-shaped hole on the PCB\",\n)\n\nexport type PcbHolePillInput = z.input<typeof pcb_hole_pill>\ntype InferredPcbHolePill = z.infer<typeof pcb_hole_pill>\n\n/**\n * Defines a pill-shaped hole on the PCB\n */\nexport interface PcbHolePill {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"pill\"\n  hole_width: number\n  hole_height: number\n  x: Distance\n  y: Distance\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexpectTypesMatch<PcbHolePill, InferredPcbHolePill>(true)\n\nconst pcb_hole_rotated_pill = z.object({\n  type: z.literal(\"pcb_hole\"),\n  pcb_hole_id: getZodPrefixedIdWithDefault(\"pcb_hole\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_component_id: z.string().optional(),\n  hole_shape: z.literal(\"rotated_pill\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  x: distance,\n  y: distance,\n  ccw_rotation: rotation,\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_hole_rotated_pill_shape = pcb_hole_rotated_pill.describe(\n  \"Defines a rotated pill-shaped hole on the PCB\",\n)\n\nexport type PcbHoleRotatedPillInput = z.input<typeof pcb_hole_rotated_pill>\ntype InferredPcbHoleRotatedPill = z.infer<typeof pcb_hole_rotated_pill>\n\n/**\n * Defines a rotated pill-shaped hole on the PCB\n */\nexport interface PcbHoleRotatedPill {\n  type: \"pcb_hole\"\n  pcb_hole_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_component_id?: string\n  hole_shape: \"rotated_pill\"\n  hole_width: number\n  hole_height: number\n  x: Distance\n  y: Distance\n  ccw_rotation: Rotation\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexpectTypesMatch<PcbHoleRotatedPill, InferredPcbHoleRotatedPill>(true)\n\nexport const pcb_hole = pcb_hole_circle_or_square\n  .or(pcb_hole_oval)\n  .or(pcb_hole_pill)\n  .or(pcb_hole_rotated_pill)\n  .or(pcb_hole_circle)\n  .or(pcb_hole_rect)\n\n/**\n * @deprecated Use PcbHoleCircleOrSquare, PcbHoleCircle, PcbHoleRect, PcbHoleOval, PcbHolePill, or PcbHoleRotatedPill\n */\nexport type PCBHoleInput = z.input<typeof pcb_hole>\n/**\n * @deprecated Use PcbHoleCircleOrSquare, PcbHoleCircle, PcbHoleRect, PcbHoleOval, PcbHolePill, or PcbHoleRotatedPill\n */\nexport type PCBHole = z.infer<typeof pcb_hole>\n\nexport type PcbHole =\n  | PcbHoleCircleOrSquare\n  | PcbHoleOval\n  | PcbHolePill\n  | PcbHoleRotatedPill\n  | PcbHoleCircle\n  | PcbHoleRect\n","import { z } from \"zod\"\nimport { distance, type Distance, rotation, type Rotation } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst pcb_plated_hole_circle = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.literal(\"circle\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  outer_diameter: z.number(),\n  hole_diameter: z.number(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n})\n\n/**\n * Defines a circular plated hole on the PCB\n */\nexport interface PcbPlatedHoleCircle {\n  type: \"pcb_plated_hole\"\n  shape: \"circle\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  outer_diameter: number\n  hole_diameter: number\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n}\n\nconst pcb_plated_hole_oval = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.enum([\"oval\", \"pill\"]),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  outer_width: z.number(),\n  outer_height: z.number(),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  ccw_rotation: rotation,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n})\n\n/**\n * Defines an oval or pill-shaped plated hole on the PCB\n */\nexport interface PcbPlatedHoleOval {\n  type: \"pcb_plated_hole\"\n  shape: \"oval\" | \"pill\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  outer_width: number\n  outer_height: number\n  hole_width: number\n  hole_height: number\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  ccw_rotation: Rotation\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n}\n\nconst pcb_circular_hole_with_rect_pad = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.literal(\"circular_hole_with_rect_pad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  hole_shape: z.literal(\"circle\"),\n  pad_shape: z.literal(\"rect\"),\n  hole_diameter: z.number(),\n  rect_pad_width: z.number(),\n  rect_pad_height: z.number(),\n  rect_border_radius: z.number().optional(),\n  hole_offset_x: distance.default(0),\n  hole_offset_y: distance.default(0),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n  rect_ccw_rotation: rotation.optional(),\n})\nconst pcb_pill_hole_with_rect_pad = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.literal(\"pill_hole_with_rect_pad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  hole_shape: z.literal(\"pill\"),\n  pad_shape: z.literal(\"rect\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  rect_pad_width: z.number(),\n  rect_pad_height: z.number(),\n  rect_border_radius: z.number().optional(),\n  hole_offset_x: distance.default(0),\n  hole_offset_y: distance.default(0),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n})\nconst pcb_rotated_pill_hole_with_rect_pad = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.literal(\"rotated_pill_hole_with_rect_pad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  hole_shape: z.literal(\"rotated_pill\"),\n  pad_shape: z.literal(\"rect\"),\n  hole_width: z.number(),\n  hole_height: z.number(),\n  hole_ccw_rotation: rotation,\n  rect_pad_width: z.number(),\n  rect_pad_height: z.number(),\n  rect_border_radius: z.number().optional(),\n  rect_ccw_rotation: rotation,\n  hole_offset_x: distance.default(0),\n  hole_offset_y: distance.default(0),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n})\nexport interface PcbHolePillWithRectPad {\n  type: \"pcb_plated_hole\"\n  shape: \"pill_hole_with_rect_pad\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  hole_shape: \"pill\"\n  pad_shape: \"rect\"\n  hole_width: number\n  hole_height: number\n  rect_pad_width: number\n  rect_pad_height: number\n  rect_border_radius?: number\n  hole_offset_x: Distance\n  hole_offset_y: Distance\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n}\n\nexport interface PcbHoleRotatedPillWithRectPad {\n  type: \"pcb_plated_hole\"\n  shape: \"rotated_pill_hole_with_rect_pad\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  hole_shape: \"rotated_pill\"\n  pad_shape: \"rect\"\n  hole_width: number\n  hole_height: number\n  hole_ccw_rotation: Rotation\n  rect_pad_width: number\n  rect_pad_height: number\n  rect_border_radius?: number\n  rect_ccw_rotation: Rotation\n  hole_offset_x: Distance\n  hole_offset_y: Distance\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n}\n\nexport interface PcbHoleCircularWithRectPad {\n  type: \"pcb_plated_hole\"\n  shape: \"circular_hole_with_rect_pad\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  hole_shape: \"circle\"\n  pad_shape: \"rect\"\n  hole_diameter: number\n  rect_pad_width: number\n  rect_pad_height: number\n  rect_border_radius?: number\n  hole_offset_x: Distance\n  hole_offset_y: Distance\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n  rect_ccw_rotation?: Rotation\n}\nconst pcb_hole_with_polygon_pad = z.object({\n  type: z.literal(\"pcb_plated_hole\"),\n  shape: z.literal(\"hole_with_polygon_pad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  hole_shape: z.enum([\"circle\", \"oval\", \"pill\", \"rotated_pill\"]),\n  hole_diameter: z.number().optional(),\n  hole_width: z.number().optional(),\n  hole_height: z.number().optional(),\n\n  pad_outline: z\n    .array(\n      z.object({\n        x: distance,\n        y: distance,\n      }),\n    )\n    .min(3),\n\n  hole_offset_x: distance.default(0),\n  hole_offset_y: distance.default(0),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  x: distance,\n  y: distance,\n  layers: z.array(layer_ref),\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  pcb_plated_hole_id: getZodPrefixedIdWithDefault(\"pcb_plated_hole\"),\n  soldermask_margin: z.number().optional(),\n  ccw_rotation: rotation.optional(),\n})\n\n/**\n * Defines a plated hole with a polygonal pad on the PCB\n */\n\nexport interface PcbHoleWithPolygonPad {\n  type: \"pcb_plated_hole\"\n  shape: \"hole_with_polygon_pad\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  hole_shape: \"circle\" | \"oval\" | \"pill\" | \"rotated_pill\"\n  hole_diameter?: number\n  hole_width?: number\n  hole_height?: number\n  pad_outline: { x: Distance; y: Distance }[]\n  hole_offset_x: Distance\n  hole_offset_y: Distance\n  is_covered_with_solder_mask?: boolean\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  pcb_plated_hole_id: string\n  soldermask_margin?: number\n  ccw_rotation?: Rotation\n}\n\nexport const pcb_plated_hole = z.union([\n  pcb_plated_hole_circle,\n  pcb_plated_hole_oval,\n  pcb_circular_hole_with_rect_pad,\n  pcb_pill_hole_with_rect_pad,\n  pcb_rotated_pill_hole_with_rect_pad,\n  pcb_hole_with_polygon_pad,\n])\nexport type PcbPlatedHole =\n  | PcbPlatedHoleCircle\n  | PcbPlatedHoleOval\n  | PcbHoleCircularWithRectPad\n  | PcbHolePillWithRectPad\n  | PcbHoleRotatedPillWithRectPad\n  | PcbHoleWithPolygonPad\n\nexpectTypesMatch<PcbPlatedHoleCircle, z.infer<typeof pcb_plated_hole_circle>>(\n  true,\n)\nexpectTypesMatch<PcbPlatedHoleOval, z.infer<typeof pcb_plated_hole_oval>>(true)\nexpectTypesMatch<\n  PcbHoleCircularWithRectPad,\n  z.infer<typeof pcb_circular_hole_with_rect_pad>\n>(true)\nexpectTypesMatch<\n  PcbHolePillWithRectPad,\n  z.infer<typeof pcb_pill_hole_with_rect_pad>\n>(true)\nexpectTypesMatch<\n  PcbHoleRotatedPillWithRectPad,\n  z.infer<typeof pcb_rotated_pill_hole_with_rect_pad>\n>(true)\nexpectTypesMatch<\n  PcbHoleWithPolygonPad,\n  z.infer<typeof pcb_hole_with_polygon_pad>\n>(true)\n/**\n * @deprecated use PcbPlatedHole\n */\nexport type PCBPlatedHole = PcbPlatedHole\n\n/**\n * @deprecated use PcbPlatedHoleInput\n */\nexport type PCBPlatedHoleInput = z.input<typeof pcb_plated_hole>\nexport type PcbPlatedHoleInput = z.input<typeof pcb_plated_hole>\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_port = z\n  .object({\n    type: z.literal(\"pcb_port\"),\n    pcb_port_id: getZodPrefixedIdWithDefault(\"pcb_port\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    source_port_id: z.string(),\n    pcb_component_id: z.string().optional(),\n    x: distance,\n    y: distance,\n    layers: z.array(layer_ref),\n    is_board_pinout: z.boolean().optional(),\n  })\n  .describe(\"Defines a port on the PCB\")\n\nexport type PcbPortInput = z.input<typeof pcb_port>\ntype InferredPcbPort = z.infer<typeof pcb_port>\n\n/**\n * Defines a port on the PCB\n */\nexport interface PcbPort {\n  type: \"pcb_port\"\n  pcb_port_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  source_port_id: string\n  pcb_component_id?: string\n  x: Distance\n  y: Distance\n  layers: LayerRef[]\n  is_board_pinout?: boolean\n}\n\n/**\n * @deprecated use PcbPort\n */\nexport type PCBPort = PcbPort\n\n/**\n * @deprecated use PcbPortInput\n */\nexport type PCBPortInput = PcbPortInput\n\nexpectTypesMatch<PcbPort, InferredPcbPort>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance, rotation, type Rotation } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst pcb_smtpad_circle = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"circle\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  radius: z.number(),\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nconst pcb_smtpad_rect = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"rect\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  rect_border_radius: z.number().optional(),\n  corner_radius: z.number().optional(),\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n  soldermask_margin_left: z.number().optional(),\n  soldermask_margin_top: z.number().optional(),\n  soldermask_margin_right: z.number().optional(),\n  soldermask_margin_bottom: z.number().optional(),\n})\n\nconst pcb_smtpad_rotated_rect = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"rotated_rect\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  rect_border_radius: z.number().optional(),\n  corner_radius: z.number().optional(),\n  ccw_rotation: rotation,\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n  soldermask_margin_left: z.number().optional(),\n  soldermask_margin_top: z.number().optional(),\n  soldermask_margin_right: z.number().optional(),\n  soldermask_margin_bottom: z.number().optional(),\n})\n\nexport const pcb_smtpad_pill = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"pill\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  radius: z.number(),\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\nconst pcb_smtpad_rotated_pill = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"rotated_pill\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  radius: z.number(),\n  ccw_rotation: rotation,\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nconst pcb_smtpad_polygon = z.object({\n  type: z.literal(\"pcb_smtpad\"),\n  shape: z.literal(\"polygon\"),\n  pcb_smtpad_id: getZodPrefixedIdWithDefault(\"pcb_smtpad\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  points: z.array(point),\n  layer: layer_ref,\n  port_hints: z.array(z.string()).optional(),\n  pcb_component_id: z.string().optional(),\n  pcb_port_id: z.string().optional(),\n  is_covered_with_solder_mask: z.boolean().optional(),\n  soldermask_margin: z.number().optional(),\n})\n\nexport const pcb_smtpad = z\n  .discriminatedUnion(\"shape\", [\n    pcb_smtpad_circle,\n    pcb_smtpad_rect,\n    pcb_smtpad_rotated_rect,\n    pcb_smtpad_rotated_pill,\n    pcb_smtpad_pill,\n    pcb_smtpad_polygon,\n  ])\n  .describe(\"Defines an SMT pad on the PCB\")\n\nexport type PCBSMTPadInput = z.input<typeof pcb_smtpad>\ntype PCBSMTPadCircle = z.infer<typeof pcb_smtpad_circle>\ntype PCBSMTPadRect = z.infer<typeof pcb_smtpad_rect>\ntype PCBSMTPadRotatedRect = z.infer<typeof pcb_smtpad_rotated_rect>\ntype PCBSMTPadRotatedPill = z.infer<typeof pcb_smtpad_rotated_pill>\ntype PCBSMTPadPill = z.infer<typeof pcb_smtpad_pill>\ntype PCBSMTPadPolygon = z.infer<typeof pcb_smtpad_polygon>\n\n/**\n * Defines a circular SMT pad on the PCB\n */\nexport interface PcbSmtPadCircle {\n  type: \"pcb_smtpad\"\n  shape: \"circle\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  radius: number\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\n/**\n * Defines a rectangular SMT pad on the PCB\n */\nexport interface PcbSmtPadRect {\n  type: \"pcb_smtpad\"\n  shape: \"rect\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  rect_border_radius?: number\n  corner_radius?: number\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n  soldermask_margin_left?: number\n  soldermask_margin_top?: number\n  soldermask_margin_right?: number\n  soldermask_margin_bottom?: number\n}\n\n/**\n * Defines a rotated rectangular SMT pad on the PCB\n */\nexport interface PcbSmtPadRotatedRect {\n  type: \"pcb_smtpad\"\n  shape: \"rotated_rect\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  rect_border_radius?: number\n  corner_radius?: number\n  ccw_rotation: Rotation\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n  soldermask_margin_left?: number\n  soldermask_margin_top?: number\n  soldermask_margin_right?: number\n  soldermask_margin_bottom?: number\n}\n/**\n * Defines a pill-shaped SMT pad on the PCB (rounded rectangle).\n */\nexport interface PcbSmtPadPill {\n  type: \"pcb_smtpad\"\n  shape: \"pill\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  radius: number\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\n/**\n * Defines a rotated pill-shaped SMT pad on the PCB\n */\nexport interface PcbSmtPadRotatedPill {\n  type: \"pcb_smtpad\"\n  shape: \"rotated_pill\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  radius: number\n  ccw_rotation: Rotation\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\n/**\n * Defines a polygonal SMT pad on the PCB\n */\nexport interface PcbSmtPadPolygon {\n  type: \"pcb_smtpad\"\n  shape: \"polygon\"\n  pcb_smtpad_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  points: Point[]\n  layer: LayerRef\n  port_hints?: string[]\n  pcb_component_id?: string\n  pcb_port_id?: string\n  is_covered_with_solder_mask?: boolean\n  soldermask_margin?: number\n}\n\nexport type PcbSmtPad =\n  | PcbSmtPadCircle\n  | PcbSmtPadRect\n  | PcbSmtPadRotatedRect\n  | PcbSmtPadRotatedPill\n  | PcbSmtPadPill\n  | PcbSmtPadPolygon\n\n/**\n * @deprecated use PcbSmtPad\n */\nexport type PCBSMTPad = PcbSmtPad\n\nexpectTypesMatch<PcbSmtPadCircle, PCBSMTPadCircle>(true)\nexpectTypesMatch<PcbSmtPadRect, PCBSMTPadRect>(true)\nexpectTypesMatch<PcbSmtPadRotatedRect, PCBSMTPadRotatedRect>(true)\nexpectTypesMatch<PcbSmtPadRotatedPill, PCBSMTPadRotatedPill>(true)\nexpectTypesMatch<PcbSmtPadPill, PCBSMTPadPill>(true)\nexpectTypesMatch<PcbSmtPadPolygon, PCBSMTPadPolygon>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst pcb_solder_paste_circle = z.object({\n  type: z.literal(\"pcb_solder_paste\"),\n  shape: z.literal(\"circle\"),\n  pcb_solder_paste_id: getZodPrefixedIdWithDefault(\"pcb_solder_paste\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  radius: z.number(),\n  layer: layer_ref,\n  pcb_component_id: z.string().optional(),\n  pcb_smtpad_id: z.string().optional(),\n})\n\nconst pcb_solder_paste_rect = z.object({\n  type: z.literal(\"pcb_solder_paste\"),\n  shape: z.literal(\"rect\"),\n  pcb_solder_paste_id: getZodPrefixedIdWithDefault(\"pcb_solder_paste\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  layer: layer_ref,\n  pcb_component_id: z.string().optional(),\n  pcb_smtpad_id: z.string().optional(),\n})\nconst pcb_solder_paste_pill = z.object({\n  type: z.literal(\"pcb_solder_paste\"),\n  shape: z.literal(\"pill\"),\n  pcb_solder_paste_id: getZodPrefixedIdWithDefault(\"pcb_solder_paste\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  radius: z.number(),\n  layer: layer_ref,\n  pcb_component_id: z.string().optional(),\n  pcb_smtpad_id: z.string().optional(),\n})\nconst pcb_solder_paste_rotated_rect = z.object({\n  type: z.literal(\"pcb_solder_paste\"),\n  shape: z.literal(\"rotated_rect\"),\n  pcb_solder_paste_id: getZodPrefixedIdWithDefault(\"pcb_solder_paste\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  ccw_rotation: distance,\n  layer: layer_ref,\n  pcb_component_id: z.string().optional(),\n  pcb_smtpad_id: z.string().optional(),\n})\n\nconst pcb_solder_paste_oval = z.object({\n  type: z.literal(\"pcb_solder_paste\"),\n  shape: z.literal(\"oval\"),\n  pcb_solder_paste_id: getZodPrefixedIdWithDefault(\"pcb_solder_paste\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  x: distance,\n  y: distance,\n  width: z.number(),\n  height: z.number(),\n  layer: layer_ref,\n  pcb_component_id: z.string().optional(),\n  pcb_smtpad_id: z.string().optional(),\n})\n\nexport const pcb_solder_paste = z\n  .union([\n    pcb_solder_paste_circle,\n    pcb_solder_paste_rect,\n    pcb_solder_paste_pill,\n    pcb_solder_paste_rotated_rect,\n    pcb_solder_paste_oval,\n  ])\n  .describe(\"Defines solderpaste on the PCB\")\n\nexport type PCBSolderPasteInput = z.input<typeof pcb_solder_paste>\ntype InferredPcbSolderPasteCircle = z.infer<typeof pcb_solder_paste_circle>\ntype InferredPcbSolderPasteRect = z.infer<typeof pcb_solder_paste_rect>\ntype InferredPcbSolderPastePill = z.infer<typeof pcb_solder_paste_pill>\ntype InferredPcbSolderPasteRotatedRect = z.infer<\n  typeof pcb_solder_paste_rotated_rect\n>\ntype InferredPcbSolderPasteOval = z.infer<typeof pcb_solder_paste_oval>\n\n/**\n * Defines solderpaste on the PCB\n */\nexport interface PcbSolderPasteCircle {\n  type: \"pcb_solder_paste\"\n  shape: \"circle\"\n  pcb_solder_paste_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  radius: number\n  layer: LayerRef\n  pcb_component_id?: string\n  pcb_smtpad_id?: string\n}\n\n/**\n * Defines solderpaste on the PCB\n */\nexport interface PcbSolderPasteRect {\n  type: \"pcb_solder_paste\"\n  shape: \"rect\"\n  pcb_solder_paste_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  layer: LayerRef\n  pcb_component_id?: string\n  pcb_smtpad_id?: string\n}\n/**\n * Defines solderpaste on the PCB\n */\nexport interface PcbSolderPastePill {\n  type: \"pcb_solder_paste\"\n  shape: \"pill\"\n  pcb_solder_paste_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  radius: number\n  layer: LayerRef\n  pcb_component_id?: string\n  pcb_smtpad_id?: string\n}\n/**\n * Defines solderpaste on the PCB\n */\nexport interface PcbSolderPasteRotatedRect {\n  type: \"pcb_solder_paste\"\n  shape: \"rotated_rect\"\n  pcb_solder_paste_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  ccw_rotation: Distance\n  layer: LayerRef\n  pcb_component_id?: string\n  pcb_smtpad_id?: string\n}\n/**\n * Defines solderpaste on the PCB\n */\nexport interface PcbSolderPasteOval {\n  type: \"pcb_solder_paste\"\n  shape: \"oval\"\n  pcb_solder_paste_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  x: Distance\n  y: Distance\n  width: number\n  height: number\n  layer: LayerRef\n  pcb_component_id?: string\n  pcb_smtpad_id?: string\n}\n\nexport type PcbSolderPaste =\n  | PcbSolderPasteCircle\n  | PcbSolderPasteRect\n  | PcbSolderPastePill\n  | PcbSolderPasteRotatedRect\n  | PcbSolderPasteOval\n\nexpectTypesMatch<PcbSolderPasteCircle, InferredPcbSolderPasteCircle>(true)\nexpectTypesMatch<PcbSolderPasteRect, InferredPcbSolderPasteRect>(true)\nexpectTypesMatch<PcbSolderPastePill, InferredPcbSolderPastePill>(true)\nexpectTypesMatch<PcbSolderPasteRotatedRect, InferredPcbSolderPasteRotatedRect>(\n  true,\n)\nexpectTypesMatch<PcbSolderPasteOval, InferredPcbSolderPasteOval>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_text = z\n  .object({\n    type: z.literal(\"pcb_text\"),\n    pcb_text_id: getZodPrefixedIdWithDefault(\"pcb_text\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    text: z.string(),\n    center: point,\n    layer: layer_ref,\n    width: length,\n    height: length,\n    lines: z.number(),\n    // @ts-ignore\n    align: z.enum([\"bottom-left\"]),\n  })\n  .describe(\"Defines text on the PCB\")\n\nexport type PcbTextInput = z.input<typeof pcb_text>\ntype InferredPcbText = z.infer<typeof pcb_text>\n\n/**\n * Defines text on the PCB\n */\nexport interface PcbText {\n  type: \"pcb_text\"\n  pcb_text_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  text: string\n  center: Point\n  layer: LayerRef\n  width: Length\n  height: Length\n  lines: number\n  // @ts-ignore\n  align: \"bottom-left\"\n}\n\n/**\n * @deprecated use PcbText\n */\nexport type PCBText = PcbText\n\nexpectTypesMatch<PcbText, InferredPcbText>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_trace_route_point_wire = z.object({\n  route_type: z.literal(\"wire\"),\n  x: distance,\n  y: distance,\n  width: distance,\n  copper_pour_id: z.string().optional(),\n  is_inside_copper_pour: z.boolean().optional(),\n  start_pcb_port_id: z.string().optional(),\n  end_pcb_port_id: z.string().optional(),\n  layer: layer_ref,\n})\n\nexport const pcb_trace_route_point_via = z.object({\n  route_type: z.literal(\"via\"),\n  x: distance,\n  y: distance,\n  copper_pour_id: z.string().optional(),\n  is_inside_copper_pour: z.boolean().optional(),\n  hole_diameter: distance.optional(),\n  outer_diameter: distance.optional(),\n  from_layer: layer_ref,\n  to_layer: layer_ref,\n})\n\nexport const pcb_trace_route_point_through_pad = z.object({\n  route_type: z.literal(\"through_pad\"),\n  start: point,\n  end: point,\n  width: distance,\n  start_layer: layer_ref,\n  end_layer: layer_ref,\n  pcb_smtpad_id: z.string().optional(),\n  pcb_plated_hole_id: z.string().optional(),\n})\n\nexport const pcb_trace_route_point = z.union([\n  pcb_trace_route_point_wire,\n  pcb_trace_route_point_via,\n  pcb_trace_route_point_through_pad,\n])\ntype InferredPcbTraceRoutePoint = z.infer<typeof pcb_trace_route_point>\n\nexport const pcb_trace = z\n  .object({\n    type: z.literal(\"pcb_trace\"),\n    source_trace_id: z.string().optional(),\n    pcb_component_id: z.string().optional(),\n    pcb_trace_id: getZodPrefixedIdWithDefault(\"pcb_trace\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    route_thickness_mode: z\n      .enum([\"constant\", \"interpolated\"])\n      .default(\"constant\")\n      .optional(),\n    route_order_index: z.number().optional(),\n    should_round_corners: z.boolean().optional(),\n    trace_length: z.number().optional(),\n    highlight_color: z.string().optional(),\n    route: z.array(pcb_trace_route_point),\n  })\n  .describe(\"Defines a trace on the PCB\")\n\nexport type PcbTraceInput = z.input<typeof pcb_trace>\ntype InferredPcbTrace = z.infer<typeof pcb_trace>\n\nexport interface PcbTraceRoutePointWire {\n  route_type: \"wire\"\n  x: Distance\n  y: Distance\n  width: Distance\n  copper_pour_id?: string\n  is_inside_copper_pour?: boolean\n  start_pcb_port_id?: string\n  end_pcb_port_id?: string\n  layer: LayerRef\n}\n\nexport interface PcbTraceRoutePointVia {\n  route_type: \"via\"\n  x: Distance\n  y: Distance\n  copper_pour_id?: string\n  is_inside_copper_pour?: boolean\n  hole_diameter?: Distance\n  outer_diameter?: Distance\n  from_layer: LayerRef\n  to_layer: LayerRef\n}\n\nexport interface PcbTraceRoutePointThroughPad {\n  route_type: \"through_pad\"\n  start: Point\n  end: Point\n  width: Distance\n  start_layer: LayerRef\n  end_layer: LayerRef\n  pcb_smtpad_id?: string\n  pcb_plated_hole_id?: string\n}\n\nexport type PcbTraceRoutePoint =\n  | PcbTraceRoutePointWire\n  | PcbTraceRoutePointVia\n  | PcbTraceRoutePointThroughPad\n\n/**\n * Defines a trace on the PCB\n */\nexport interface PcbTrace {\n  type: \"pcb_trace\"\n  source_trace_id?: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_trace_id: string\n  /**\n   * The order that this trace was routed in. This can be used to debug the\n   * autorouter and to understand the trace path better\n   *\n   * The route_order_index should be relative to a subcircuit\n   */\n  route_order_index?: number\n  route_thickness_mode?: \"constant\" | \"interpolated\"\n  should_round_corners?: boolean\n  trace_length?: number\n  highlight_color?: string\n  route: Array<PcbTraceRoutePoint>\n}\n\n/**\n * @deprecated use PcbTrace\n */\nexport type PCBTrace = PcbTrace\n\n/**\n * @deprecated use PcbTraceInput\n */\nexport type PCBTraceInput = PcbTraceInput\n\nexpectTypesMatch<PcbTraceRoutePoint, InferredPcbTraceRoutePoint>(true)\nexpectTypesMatch<PcbTrace, InferredPcbTrace>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_trace_warning = z\n  .object({\n    type: z.literal(\"pcb_trace_warning\"),\n    pcb_trace_warning_id: getZodPrefixedIdWithDefault(\"pcb_trace_warning\"),\n    warning_type: z.literal(\"pcb_trace_warning\").default(\"pcb_trace_warning\"),\n    message: z.string(),\n    center: point.optional(),\n    pcb_trace_id: z.string(),\n    source_trace_id: z.string(),\n    pcb_component_ids: z.array(z.string()),\n    pcb_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a trace warning on the PCB\")\n\nexport type PcbTraceWarningInput = z.input<typeof pcb_trace_warning>\ntype InferredPcbTraceWarning = z.infer<typeof pcb_trace_warning>\n\n/**\n * Defines a trace warning on the PCB\n */\nexport interface PcbTraceWarning {\n  type: \"pcb_trace_warning\"\n  pcb_trace_warning_id: string\n  warning_type: \"pcb_trace_warning\"\n  message: string\n  center?: Point\n  pcb_trace_id: string\n  source_trace_id: string\n  pcb_component_ids: string[]\n  pcb_port_ids: string[]\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbTraceWarning, InferredPcbTraceWarning>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_trace_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_trace_error\"),\n    pcb_trace_error_id: getZodPrefixedIdWithDefault(\"pcb_trace_error\"),\n    error_type: z.literal(\"pcb_trace_error\").default(\"pcb_trace_error\"),\n    center: point.optional(),\n    pcb_trace_id: z.string(),\n    source_trace_id: z.string(),\n    pcb_component_ids: z.array(z.string()),\n    pcb_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a trace error on the PCB\")\n\nexport type PcbTraceErrorInput = z.input<typeof pcb_trace_error>\ntype InferredPcbTraceError = z.infer<typeof pcb_trace_error>\n\n/**\n * Defines a trace error on the PCB\n */\nexport interface PcbTraceError extends BaseCircuitJsonError {\n  type: \"pcb_trace_error\"\n  pcb_trace_error_id: string\n  error_type: \"pcb_trace_error\"\n  center?: Point\n  pcb_trace_id: string\n  source_trace_id: string\n  pcb_component_ids: string[]\n  pcb_port_ids: string[]\n  subcircuit_id?: string\n}\n\n/**\n * @deprecated use PcbTraceError\n */\nexport type PCBTraceError = PcbTraceError\n\nexpectTypesMatch<PcbTraceError, InferredPcbTraceError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_trace_missing_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_trace_missing_error\"),\n    pcb_trace_missing_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_trace_missing_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_trace_missing_error\")\n      .default(\"pcb_trace_missing_error\"),\n    center: point.optional(),\n    source_trace_id: z.string(),\n    pcb_component_ids: z.array(z.string()),\n    pcb_port_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Defines an error when a source trace has no corresponding PCB trace\",\n  )\n\nexport type PcbTraceMissingErrorInput = z.input<typeof pcb_trace_missing_error>\ntype InferredPcbTraceMissingError = z.infer<typeof pcb_trace_missing_error>\n\n/**\n * Defines an error when a source trace has no corresponding PCB trace\n */\nexport interface PcbTraceMissingError extends BaseCircuitJsonError {\n  type: \"pcb_trace_missing_error\"\n  pcb_trace_missing_error_id: string\n  error_type: \"pcb_trace_missing_error\"\n  center?: Point\n  source_trace_id: string\n  pcb_component_ids: string[]\n  pcb_port_ids: string[]\n  subcircuit_id?: string\n}\n\n/**\n * @deprecated use PcbTraceMissingError\n */\nexport type PCBTraceMissingError = PcbTraceMissingError\n\nexpectTypesMatch<PcbTraceMissingError, InferredPcbTraceMissingError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_port_not_matched_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_port_not_matched_error\"),\n    pcb_error_id: getZodPrefixedIdWithDefault(\"pcb_error\"),\n    error_type: z\n      .literal(\"pcb_port_not_matched_error\")\n      .default(\"pcb_port_not_matched_error\"),\n    pcb_component_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a trace error on the PCB where a port is not matched\")\n\nexport type PcbPortNotMatchedErrorInput = z.input<\n  typeof pcb_port_not_matched_error\n>\ntype InferredPcbPortNotMatchedError = z.infer<typeof pcb_port_not_matched_error>\n\n/**\n * Defines a trace error on the PCB where a port is not matched\n */\nexport interface PcbPortNotMatchedError extends BaseCircuitJsonError {\n  type: \"pcb_port_not_matched_error\"\n  pcb_error_id: string\n  error_type: \"pcb_port_not_matched_error\"\n  pcb_component_ids: string[]\n  subcircuit_id?: string\n}\n\n/**\n * @deprecated use PcbPortNotMatchedError\n */\nexport type PCBPortNotMatchedError = PcbPortNotMatchedError\n\nexpectTypesMatch<PcbPortNotMatchedError, InferredPcbPortNotMatchedError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_port_not_connected_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_port_not_connected_error\"),\n    pcb_port_not_connected_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_port_not_connected_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_port_not_connected_error\")\n      .default(\"pcb_port_not_connected_error\"),\n    pcb_port_ids: z.array(z.string()),\n    pcb_component_ids: z.array(z.string()),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines an error when a pcb port is not connected to any trace\")\n\nexport type PcbPortNotConnectedErrorInput = z.input<\n  typeof pcb_port_not_connected_error\n>\ntype InferredPcbPortNotConnectedError = z.infer<\n  typeof pcb_port_not_connected_error\n>\n\n/**\n * Defines an error when a pcb port is not connected to any trace\n */\nexport interface PcbPortNotConnectedError extends BaseCircuitJsonError {\n  type: \"pcb_port_not_connected_error\"\n  pcb_port_not_connected_error_id: string\n  error_type: \"pcb_port_not_connected_error\"\n  pcb_port_ids: string[]\n  pcb_component_ids: string[]\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbPortNotConnectedError, InferredPcbPortNotConnectedError>(\n  true,\n)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_net = z\n  .object({\n    type: z.literal(\"pcb_net\"),\n    pcb_net_id: getZodPrefixedIdWithDefault(\"pcb_net\"),\n    source_net_id: z.string().optional(),\n    highlight_color: z.string().optional(),\n  })\n  .describe(\"Defines a net on the PCB\")\n\nexport type PcbNetInput = z.input<typeof pcb_net>\ntype InferredPcbNet = z.infer<typeof pcb_net>\n\n/**\n * Defines a net on the PCB\n */\nexport interface PcbNet {\n  type: \"pcb_net\"\n  pcb_net_id: string\n  source_net_id?: string\n  highlight_color?: string\n}\n\nexpectTypesMatch<PcbNet, InferredPcbNet>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_via = z\n  .object({\n    type: z.literal(\"pcb_via\"),\n    pcb_via_id: getZodPrefixedIdWithDefault(\"pcb_via\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    subcircuit_connectivity_map_key: z.string().optional(),\n    x: distance,\n    y: distance,\n    outer_diameter: distance.default(\"0.6mm\"),\n    hole_diameter: distance.default(\"0.25mm\"),\n    /** @deprecated */\n    from_layer: layer_ref.optional(),\n    /** @deprecated */\n    to_layer: layer_ref.optional(),\n    layers: z.array(layer_ref),\n    pcb_trace_id: z.string().optional(),\n    net_is_assignable: z.boolean().optional(),\n    net_assigned: z.boolean().optional(),\n    is_tented: z.boolean().optional(),\n  })\n  .describe(\"Defines a via on the PCB\")\n\nexport type PcbViaInput = z.input<typeof pcb_via>\ntype InferredPcbVia = z.infer<typeof pcb_via>\n\n/**\n * Defines a via on the PCB\n */\nexport interface PcbVia {\n  type: \"pcb_via\"\n  pcb_via_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  subcircuit_connectivity_map_key?: string\n  x: Distance\n  y: Distance\n  outer_diameter: Distance\n  hole_diameter: Distance\n  /** @deprecated */\n  from_layer?: LayerRef\n  /** @deprecated */\n  to_layer?: LayerRef\n  layers: LayerRef[]\n  pcb_trace_id?: string\n  net_is_assignable?: boolean\n  net_assigned?: boolean\n  is_tented?: boolean\n}\n\n/**\n * @deprecated use PcbVia\n */\nexport type PCBVia = PcbVia\n\nexpectTypesMatch<PcbVia, InferredPcbVia>(true)\n","import { z } from \"zod\"\nimport {\n  point,\n  type Point,\n  getZodPrefixedIdWithDefault,\n  ninePointAnchor,\n  type NinePointAnchor,\n} from \"src/common\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  manufacturing_drc_properties,\n  type ManufacturingDrcProperties,\n} from \"src/pcb/properties/manufacturing_drc_properties\"\n\nexport const pcb_board = z\n  .object({\n    type: z.literal(\"pcb_board\"),\n    pcb_board_id: getZodPrefixedIdWithDefault(\"pcb_board\"),\n    pcb_panel_id: z.string().optional(),\n    carrier_pcb_board_id: z.string().optional(),\n    is_subcircuit: z.boolean().optional(),\n    subcircuit_id: z.string().optional(),\n    is_mounted_to_carrier_board: z.boolean().optional(),\n    width: length.optional(),\n    height: length.optional(),\n    center: point,\n    display_offset_x: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the x offset for this board, usually corresponding with how the user specified it\",\n      ),\n    display_offset_y: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the y offset for this board, usually corresponding with how the user specified it\",\n      ),\n    thickness: length.optional().default(1.4),\n    num_layers: z.number().optional().default(4),\n    outline: z.array(point).optional(),\n    shape: z.enum([\"rect\", \"polygon\"]).optional(),\n    material: z.enum([\"fr4\", \"fr1\"]).default(\"fr4\"),\n    solder_mask_color: z.string().optional(),\n    silkscreen_color: z.string().optional(),\n    anchor_position: point.optional(),\n    anchor_alignment: ninePointAnchor.optional(),\n    position_mode: z.enum([\"relative_to_panel_anchor\", \"none\"]).optional(),\n  })\n  .merge(manufacturing_drc_properties)\n  .describe(\"Defines the board outline of the PCB\")\n\n/**\n * Defines the board outline of the PCB\n */\nexport interface PcbBoard extends ManufacturingDrcProperties {\n  type: \"pcb_board\"\n  pcb_board_id: string\n  pcb_panel_id?: string\n  carrier_pcb_board_id?: string\n  is_subcircuit?: boolean\n  subcircuit_id?: string\n  is_mounted_to_carrier_board?: boolean\n  width?: Length\n  height?: Length\n  display_offset_x?: string\n  display_offset_y?: string\n  thickness: Length\n  num_layers: number\n  center: Point\n  outline?: Point[]\n  shape?: \"rect\" | \"polygon\"\n  material: \"fr4\" | \"fr1\"\n  solder_mask_color?: string\n  silkscreen_color?: string\n  anchor_position?: Point\n  anchor_alignment?: NinePointAnchor\n  position_mode?: \"relative_to_panel_anchor\" | \"none\"\n}\n\nexport type PcbBoardInput = z.input<typeof pcb_board>\ntype InferredPcbBoard = z.infer<typeof pcb_board>\n\n/**\n * @deprecated use PcbBoard\n */\nexport type PCBBoard = PcbBoard\n\nexpectTypesMatch<PcbBoard, InferredPcbBoard>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_panel = z\n  .object({\n    type: z.literal(\"pcb_panel\"),\n    pcb_panel_id: getZodPrefixedIdWithDefault(\"pcb_panel\"),\n    width: length,\n    height: length,\n    center: point,\n    thickness: length.optional().default(1.4),\n    covered_with_solder_mask: z.boolean().optional().default(true),\n  })\n  .describe(\"Defines a PCB panel that can contain multiple boards\")\n\n/**\n * Defines a PCB panel that can contain multiple boards\n */\nexport interface PcbPanel {\n  type: \"pcb_panel\"\n  pcb_panel_id: string\n  width: Length\n  height: Length\n  center: Point\n  thickness: Length\n  covered_with_solder_mask: boolean\n}\n\nexport type PcbPanelInput = z.input<typeof pcb_panel>\ntype InferredPcbPanel = z.infer<typeof pcb_panel>\n\n/**\n * @deprecated use PcbPanel\n */\nexport type PCBPanel = PcbPanel\n\nexpectTypesMatch<PcbPanel, InferredPcbPanel>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_placement_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_placement_error\"),\n    pcb_placement_error_id: getZodPrefixedIdWithDefault(\"pcb_placement_error\"),\n    error_type: z.literal(\"pcb_placement_error\").default(\"pcb_placement_error\"),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a placement error on the PCB\")\n\nexport type PcbPlacementErrorInput = z.input<typeof pcb_placement_error>\ntype InferredPcbPlacementError = z.infer<typeof pcb_placement_error>\n\n/**\n * Defines a placement error on the PCB\n */\nexport interface PcbPlacementError extends BaseCircuitJsonError {\n  type: \"pcb_placement_error\"\n  pcb_placement_error_id: string\n  error_type: \"pcb_placement_error\"\n  subcircuit_id?: string\n}\n\n/**\n * @deprecated use PcbPlacementError\n */\nexport type PCBPlacementError = PcbPlacementError\n\nexpectTypesMatch<PcbPlacementError, InferredPcbPlacementError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_panelization_placement_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_panelization_placement_error\"),\n    pcb_panelization_placement_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_panelization_placement_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_panelization_placement_error\")\n      .default(\"pcb_panelization_placement_error\"),\n    pcb_panel_id: z.string().optional(),\n    pcb_board_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a panelization placement error on the PCB\")\n\nexport type PcbPanelizationPlacementErrorInput = z.input<\n  typeof pcb_panelization_placement_error\n>\ntype InferredPcbPanelizationPlacementError = z.infer<\n  typeof pcb_panelization_placement_error\n>\n\n/**\n * Defines a panelization placement error on the PCB\n */\nexport interface PcbPanelizationPlacementError extends BaseCircuitJsonError {\n  type: \"pcb_panelization_placement_error\"\n  pcb_panelization_placement_error_id: string\n  error_type: \"pcb_panelization_placement_error\"\n  pcb_panel_id?: string\n  pcb_board_id?: string\n  subcircuit_id?: string\n}\n\n/**\n * @deprecated use PcbPanelizationPlacementError\n */\nexport type PCBPanelizationPlacementError = PcbPanelizationPlacementError\n\nexpectTypesMatch<\n  PcbPanelizationPlacementError,\n  InferredPcbPanelizationPlacementError\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { route_hint_point, type RouteHintPoint } from \"src/pcb\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n/**\n * A hint that can be used during generation of a PCB trace.\n */\nexport interface PcbTraceHint {\n  type: \"pcb_trace_hint\"\n  pcb_trace_hint_id: string\n  pcb_port_id: string\n  pcb_component_id: string\n  route: RouteHintPoint[]\n  subcircuit_id?: string\n}\n\nexport const pcb_trace_hint = z\n  .object({\n    type: z.literal(\"pcb_trace_hint\"),\n    pcb_trace_hint_id: getZodPrefixedIdWithDefault(\"pcb_trace_hint\"),\n    pcb_port_id: z.string(),\n    pcb_component_id: z.string(),\n    route: z.array(route_hint_point),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"A hint that can be used during generation of a PCB trace\")\n\nexport type PcbTraceHintInput = z.input<typeof pcb_trace_hint>\ntype InferredPcbTraceHint = z.infer<typeof pcb_trace_hint>\n\n/**\n * @deprecated use PcbTraceHint\n */\nexport type PCBTraceHint = PcbTraceHint\n\nexpectTypesMatch<PcbTraceHint, InferredPcbTraceHint>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport {\n  layer_ref,\n  type LayerRef,\n  type VisibleLayer,\n  visible_layer,\n} from \"src/pcb/properties/layer_ref\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_line = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_line\"),\n    pcb_silkscreen_line_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_line\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    stroke_width: distance.default(\"0.1mm\"),\n    x1: distance,\n    y1: distance,\n    x2: distance,\n    y2: distance,\n    layer: visible_layer,\n  })\n  .describe(\"Defines a silkscreen line on the PCB\")\n\nexport type PcbSilkscreenLineInput = z.input<typeof pcb_silkscreen_line>\ntype InferredPcbSilkscreenLine = z.infer<typeof pcb_silkscreen_line>\n\n/**\n * Defines a silkscreen line on the PCB\n */\nexport interface PcbSilkscreenLine {\n  type: \"pcb_silkscreen_line\"\n  pcb_silkscreen_line_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  stroke_width: Distance\n  x1: Distance\n  y1: Distance\n  x2: Distance\n  y2: Distance\n  layer: VisibleLayer\n}\n\n/**\n * @deprecated use PcbSilkscreenLine\n */\nexport type PCBSilkscreenLine = PcbSilkscreenLine\n\nexpectTypesMatch<PcbSilkscreenLine, InferredPcbSilkscreenLine>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  visible_layer,\n  type VisibleLayerRef,\n} from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_path = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_path\"),\n    pcb_silkscreen_path_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_path\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    layer: visible_layer,\n    route: z.array(point),\n    stroke_width: length,\n  })\n  .describe(\"Defines a silkscreen path on the PCB\")\n\nexport type PcbSilkscreenPathInput = z.input<typeof pcb_silkscreen_path>\ntype InferredPcbSilkscreenPath = z.infer<typeof pcb_silkscreen_path>\n\n/**\n * Defines a silkscreen path on the PCB\n */\nexport interface PcbSilkscreenPath {\n  type: \"pcb_silkscreen_path\"\n  pcb_silkscreen_path_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: VisibleLayerRef\n  route: Point[]\n  stroke_width: Length\n}\n\n/**\n * @deprecated use PcbSilkscreenPath\n */\nexport type PcbSilkscreenPathDeprecated = PcbSilkscreenPath\n\nexpectTypesMatch<PcbSilkscreenPath, InferredPcbSilkscreenPath>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { distance, length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  ninePointAnchor,\n  type NinePointAnchor,\n} from \"src/common/NinePointAnchor\"\n\nexport const pcb_silkscreen_text = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_text\"),\n    pcb_silkscreen_text_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_text\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: distance.default(\"0.2mm\"),\n    pcb_component_id: z.string(),\n    text: z.string(),\n    is_knockout: z.boolean().default(false).optional(),\n    knockout_padding: z\n      .object({\n        left: length,\n        top: length,\n        bottom: length,\n        right: length,\n      })\n      .default({\n        left: \"0.2mm\",\n        top: \"0.2mm\",\n        bottom: \"0.2mm\",\n        right: \"0.2mm\",\n      })\n      .optional(),\n    ccw_rotation: z.number().optional(),\n    layer: layer_ref,\n    is_mirrored: z.boolean().default(false).optional(),\n    anchor_position: point.default({ x: 0, y: 0 }),\n    anchor_alignment: ninePointAnchor.default(\"center\"),\n  })\n  .describe(\"Defines silkscreen text on the PCB\")\n\nexport type PcbSilkscreenTextInput = z.input<typeof pcb_silkscreen_text>\ntype InferredPcbSilkscreenText = z.infer<typeof pcb_silkscreen_text>\n\n/**\n * Defines silkscreen text on the PCB\n */\nexport interface PcbSilkscreenText {\n  type: \"pcb_silkscreen_text\"\n  pcb_silkscreen_text_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  font: \"tscircuit2024\"\n  font_size: Length\n  pcb_component_id: string\n  text: string\n  is_knockout?: boolean\n  knockout_padding?: {\n    left: Length\n    top: Length\n    bottom: Length\n    right: Length\n  }\n  ccw_rotation?: number\n  layer: LayerRef\n  is_mirrored?: boolean\n  anchor_position: Point\n  anchor_alignment: NinePointAnchor\n}\n\n/**\n * @deprecated use PcbSilkscreenText\n */\nexport type PCBSilkscreenText = PcbSilkscreenText\n\nexpectTypesMatch<PcbSilkscreenText, InferredPcbSilkscreenText>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { distance, length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  ninePointAnchor,\n  type NinePointAnchor,\n} from \"src/common/NinePointAnchor\"\n\nexport const pcb_copper_text = z\n  .object({\n    type: z.literal(\"pcb_copper_text\"),\n    pcb_copper_text_id: getZodPrefixedIdWithDefault(\"pcb_copper_text\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: distance.default(\"0.2mm\"),\n    pcb_component_id: z.string(),\n    text: z.string(),\n    is_knockout: z.boolean().default(false).optional(),\n    knockout_padding: z\n      .object({\n        left: length,\n        top: length,\n        bottom: length,\n        right: length,\n      })\n      .default({\n        left: \"0.2mm\",\n        top: \"0.2mm\",\n        bottom: \"0.2mm\",\n        right: \"0.2mm\",\n      })\n      .optional(),\n    ccw_rotation: z.number().optional(),\n    layer: layer_ref,\n    is_mirrored: z.boolean().default(false).optional(),\n    anchor_position: point.default({ x: 0, y: 0 }),\n    anchor_alignment: ninePointAnchor.default(\"center\"),\n  })\n  .describe(\"Defines copper text on the PCB\")\n\nexport type PcbCopperTextInput = z.input<typeof pcb_copper_text>\ntype InferredPcbCopperText = z.infer<typeof pcb_copper_text>\n\n/**\n * Defines copper text on the PCB\n */\nexport interface PcbCopperText {\n  type: \"pcb_copper_text\"\n  pcb_copper_text_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  font: \"tscircuit2024\"\n  font_size: Length\n  pcb_component_id: string\n  text: string\n  is_knockout?: boolean\n  knockout_padding?: {\n    left: Length\n    top: Length\n    bottom: Length\n    right: Length\n  }\n  ccw_rotation?: number\n  layer: LayerRef\n  is_mirrored?: boolean\n  anchor_position: Point\n  anchor_alignment: NinePointAnchor\n}\n\n/**\n * @deprecated use PcbCopperText\n */\nexport type PCBCopperText = PcbCopperText\n\nexpectTypesMatch<PcbCopperText, InferredPcbCopperText>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_rect = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_rect\"),\n    pcb_silkscreen_rect_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_rect\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    layer: layer_ref,\n    stroke_width: length.default(\"1mm\"),\n    corner_radius: length.optional(),\n    is_filled: z.boolean().default(true).optional(),\n    has_stroke: z.boolean().optional(),\n    is_stroke_dashed: z.boolean().optional(),\n    ccw_rotation: z.number().optional(),\n  })\n  .describe(\"Defines a silkscreen rect on the PCB\")\n\nexport type PcbSilkscreenRectInput = z.input<typeof pcb_silkscreen_rect>\ntype InferredPcbSilkscreenRect = z.infer<typeof pcb_silkscreen_rect>\n\n/**\n * Defines a silkscreen rect on the PCB\n */\nexport interface PcbSilkscreenRect {\n  type: \"pcb_silkscreen_rect\"\n  pcb_silkscreen_rect_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: Length\n  height: Length\n  layer: LayerRef\n  stroke_width: Length\n  corner_radius?: Length\n  is_filled?: boolean\n  has_stroke?: boolean\n  is_stroke_dashed?: boolean\n  ccw_rotation?: number\n}\n\n/**\n * @deprecated use PcbSilkscreenRect\n */\nexport type PcbSilkscreenRectOld = PcbSilkscreenRect\n\nexpectTypesMatch<PcbSilkscreenRect, InferredPcbSilkscreenRect>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  layer_ref,\n  visible_layer,\n  type LayerRef,\n  type VisibleLayer,\n} from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_circle = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_circle\"),\n    pcb_silkscreen_circle_id: getZodPrefixedIdWithDefault(\n      \"pcb_silkscreen_circle\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    radius: length,\n    layer: visible_layer,\n    stroke_width: length.default(\"1mm\"),\n    is_filled: z.boolean().optional(),\n  })\n  .describe(\"Defines a silkscreen circle on the PCB\")\n\nexport type PcbSilkscreenCircleInput = z.input<typeof pcb_silkscreen_circle>\ntype InferredPcbSilkscreenCircle = z.infer<typeof pcb_silkscreen_circle>\n\n/**\n * Defines a silkscreen circle on the PCB\n */\nexport interface PcbSilkscreenCircle {\n  type: \"pcb_silkscreen_circle\"\n  pcb_silkscreen_circle_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  radius: Length\n  layer: VisibleLayer\n  stroke_width: Length\n  is_filled?: boolean\n}\n\nexpectTypesMatch<PcbSilkscreenCircle, InferredPcbSilkscreenCircle>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  layer_ref,\n  type LayerRef,\n  visible_layer,\n  type VisibleLayer,\n} from \"src/pcb/properties/layer_ref\"\nimport { distance, rotation, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_oval = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_oval\"),\n    pcb_silkscreen_oval_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_oval\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    radius_x: distance,\n    radius_y: distance,\n    layer: visible_layer,\n    ccw_rotation: rotation.optional(),\n  })\n  .describe(\"Defines a silkscreen oval on the PCB\")\n\nexport type PcbSilkscreenOvalInput = z.input<typeof pcb_silkscreen_oval>\ntype InferredPcbSilkscreenOval = z.infer<typeof pcb_silkscreen_oval>\n\n/**\n * Defines a silkscreen oval on the PCB\n */\nexport interface PcbSilkscreenOval {\n  type: \"pcb_silkscreen_oval\"\n  pcb_silkscreen_oval_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  radius_x: Distance\n  radius_y: Distance\n  layer: VisibleLayer\n  ccw_rotation?: number\n}\n\n/**\n * @deprecated use PcbSilkscreenOval\n */\nexport type PcbSilkscreenOvalDeprecated = PcbSilkscreenOval\n\nexpectTypesMatch<PcbSilkscreenOval, InferredPcbSilkscreenOval>(true)\n","import { z } from \"zod\"\nimport { asset, type Asset, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { brep_shape, type BRepShape } from \"./properties/brep\"\n\nconst pcb_silkscreen_graphic_base = z.object({\n  type: z.literal(\"pcb_silkscreen_graphic\"),\n  pcb_silkscreen_graphic_id: getZodPrefixedIdWithDefault(\n    \"pcb_silkscreen_graphic\",\n  ),\n  pcb_component_id: z.string(),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  layer: visible_layer,\n  image_asset: asset.optional(),\n})\n\nexport const pcb_silkscreen_graphic_brep = pcb_silkscreen_graphic_base\n  .extend({\n    shape: z.literal(\"brep\"),\n    brep_shape: brep_shape,\n  })\n  .describe(\"Defines a BRep silkscreen graphic on the PCB\")\n\nexport type PcbSilkscreenGraphicBRepInput = z.input<\n  typeof pcb_silkscreen_graphic_brep\n>\ntype InferredPcbSilkscreenGraphicBRep = z.infer<\n  typeof pcb_silkscreen_graphic_brep\n>\n\n/**\n * Defines a BRep silkscreen graphic on the PCB\n */\nexport interface PcbSilkscreenGraphicBRep {\n  type: \"pcb_silkscreen_graphic\"\n  pcb_silkscreen_graphic_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: VisibleLayer\n  image_asset?: Asset\n  shape: \"brep\"\n  brep_shape: BRepShape\n}\nexpectTypesMatch<PcbSilkscreenGraphicBRep, InferredPcbSilkscreenGraphicBRep>(\n  true,\n)\n\nexport const pcb_silkscreen_graphic = z\n  .discriminatedUnion(\"shape\", [pcb_silkscreen_graphic_brep])\n  .describe(\"Defines a silkscreen graphic on the PCB\")\n\nexport type PcbSilkscreenGraphicInput = z.input<typeof pcb_silkscreen_graphic>\nexport type PcbSilkscreenGraphic = PcbSilkscreenGraphicBRep\n\ntype InferredPcbSilkscreenGraphic = z.infer<typeof pcb_silkscreen_graphic>\nexpectTypesMatch<PcbSilkscreenGraphic, InferredPcbSilkscreenGraphic>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_silkscreen_pill = z\n  .object({\n    type: z.literal(\"pcb_silkscreen_pill\"),\n    pcb_silkscreen_pill_id: getZodPrefixedIdWithDefault(\"pcb_silkscreen_pill\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    layer: layer_ref,\n    ccw_rotation: z.number().optional(),\n  })\n  .describe(\"Defines a silkscreen pill on the PCB\")\n\nexport type PcbSilkscreenPillInput = z.input<typeof pcb_silkscreen_pill>\ntype InferredPcbSilkscreenPill = z.infer<typeof pcb_silkscreen_pill>\n\n/**\n * Defines a silkscreen pill on the PCB\n */\nexport interface PcbSilkscreenPill {\n  type: \"pcb_silkscreen_pill\"\n  pcb_silkscreen_pill_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: Length\n  height: Length\n  layer: LayerRef\n  ccw_rotation?: number\n}\n\n/**\n * @deprecated use PcbSilkscreenPill\n */\nexport type PcbSilkscreenPillDeprecated = PcbSilkscreenPill\n\nexpectTypesMatch<PcbSilkscreenPill, InferredPcbSilkscreenPill>(true)\n","import { z } from \"zod\"\nimport { point, type Point } from \"src/common\"\nimport { distance, type Length } from \"src/units\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { getZodPrefixedIdWithDefault } from \"src/common/getZodPrefixedIdWithDefault\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_fabrication_note_text = z\n  .object({\n    type: z.literal(\"pcb_fabrication_note_text\"),\n    pcb_fabrication_note_text_id: getZodPrefixedIdWithDefault(\n      \"pcb_fabrication_note_text\",\n    ),\n    subcircuit_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: distance.default(\"1mm\"),\n    pcb_component_id: z.string(),\n    text: z.string(),\n    ccw_rotation: z.number().optional(),\n    layer: visible_layer,\n    anchor_position: point.default({ x: 0, y: 0 }),\n    anchor_alignment: z\n      .enum([\"center\", \"top_left\", \"top_right\", \"bottom_left\", \"bottom_right\"])\n      .default(\"center\"),\n    color: z.string().optional(),\n  })\n  .describe(\n    \"Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators\",\n  )\n\nexport type PcbFabricationNoteTextInput = z.input<\n  typeof pcb_fabrication_note_text\n>\ntype InferredPcbFabricationNoteText = z.infer<typeof pcb_fabrication_note_text>\n\n/**\n * Defines a fabrication note in text on the PCB, useful for leaving notes for assemblers or fabricators\n */\nexport interface PcbFabricationNoteText {\n  type: \"pcb_fabrication_note_text\"\n  pcb_fabrication_note_text_id: string\n  subcircuit_id?: string\n  pcb_group_id?: string\n  font: \"tscircuit2024\"\n  font_size: Length\n  pcb_component_id: string\n  text: string\n  ccw_rotation?: number\n  layer: VisibleLayer\n  anchor_position: Point\n  anchor_alignment:\n    | \"center\"\n    | \"top_left\"\n    | \"top_right\"\n    | \"bottom_left\"\n    | \"bottom_right\"\n  color?: string\n}\n\n/**\n * @deprecated use PcbFabricationNoteText\n */\nexport type PCBFabricationNoteText = PcbFabricationNoteText\n\nexpectTypesMatch<PcbFabricationNoteText, InferredPcbFabricationNoteText>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  layer_ref,\n  visible_layer,\n  type LayerRef,\n} from \"src/pcb/properties/layer_ref\"\nimport { point, type Point } from \"src/common\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_fabrication_note_path = z\n  .object({\n    type: z.literal(\"pcb_fabrication_note_path\"),\n    pcb_fabrication_note_path_id: getZodPrefixedIdWithDefault(\n      \"pcb_fabrication_note_path\",\n    ),\n    pcb_component_id: z.string(),\n    subcircuit_id: z.string().optional(),\n    layer: layer_ref,\n    route: z.array(point),\n    stroke_width: length,\n    color: z.string().optional(),\n  })\n  .describe(\n    \"Defines a fabrication path on the PCB for fabricators or assemblers\",\n  )\n\nexport type PcbFabricationNotePathInput = z.input<\n  typeof pcb_fabrication_note_path\n>\ntype InferredPcbFabricationNotePath = z.infer<typeof pcb_fabrication_note_path>\n\n/**\n * Defines a fabrication path on the PCB for fabricators or assemblers\n */\nexport interface PcbFabricationNotePath {\n  type: \"pcb_fabrication_note_path\"\n  pcb_fabrication_note_path_id: string\n  pcb_component_id: string\n  subcircuit_id?: string\n  layer: LayerRef\n  route: Point[]\n  stroke_width: Length\n  color?: string\n}\n\n/**\n * @deprecated use PcbFabricationNotePath\n */\nexport type PCBFabricationNotePath = PcbFabricationNotePath\n\nexpectTypesMatch<PcbFabricationNotePath, InferredPcbFabricationNotePath>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_fabrication_note_rect = z\n  .object({\n    type: z.literal(\"pcb_fabrication_note_rect\"),\n    pcb_fabrication_note_rect_id: getZodPrefixedIdWithDefault(\n      \"pcb_fabrication_note_rect\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    layer: visible_layer,\n    stroke_width: length.default(\"0.1mm\"),\n    corner_radius: length.optional(),\n    is_filled: z.boolean().optional(),\n    has_stroke: z.boolean().optional(),\n    is_stroke_dashed: z.boolean().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a fabrication note rectangle on the PCB\")\n\nexport type PcbFabricationNoteRectInput = z.input<\n  typeof pcb_fabrication_note_rect\n>\ntype InferredPcbFabricationNoteRect = z.infer<typeof pcb_fabrication_note_rect>\n\n/**\n * Defines a fabrication note rectangle on the PCB\n */\nexport interface PcbFabricationNoteRect {\n  type: \"pcb_fabrication_note_rect\"\n  pcb_fabrication_note_rect_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: Length\n  height: Length\n  layer: VisibleLayer\n  stroke_width: Length\n  corner_radius?: Length\n  is_filled?: boolean\n  has_stroke?: boolean\n  is_stroke_dashed?: boolean\n  color?: string\n}\n\n/**\n * @deprecated use PcbFabricationNoteRect\n */\nexport type PCBFabricationNoteRect = PcbFabricationNoteRect\n\nexpectTypesMatch<PcbFabricationNoteRect, InferredPcbFabricationNoteRect>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_fabrication_note_dimension = z\n  .object({\n    type: z.literal(\"pcb_fabrication_note_dimension\"),\n    pcb_fabrication_note_dimension_id: getZodPrefixedIdWithDefault(\n      \"pcb_fabrication_note_dimension\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    layer: visible_layer,\n    from: point,\n    to: point,\n    text: z.string().optional(),\n    text_ccw_rotation: z.number().optional(),\n    offset: length.optional(),\n    offset_distance: length.optional(),\n    offset_direction: z\n      .object({\n        x: z.number(),\n        y: z.number(),\n      })\n      .optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: length.default(\"1mm\"),\n    color: z.string().optional(),\n    arrow_size: length.default(\"1mm\"),\n  })\n  .describe(\"Defines a measurement annotation within PCB fabrication notes\")\n\nexport type PcbFabricationNoteDimensionInput = z.input<\n  typeof pcb_fabrication_note_dimension\n>\ntype InferredPcbFabricationNoteDimension = z.infer<\n  typeof pcb_fabrication_note_dimension\n>\n\n/**\n * Defines a measurement annotation within PCB fabrication notes\n */\nexport interface PcbFabricationNoteDimension {\n  type: \"pcb_fabrication_note_dimension\"\n  pcb_fabrication_note_dimension_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: VisibleLayer\n  from: Point\n  to: Point\n  text?: string\n  text_ccw_rotation?: number\n  offset?: Length\n  offset_distance?: Length\n  offset_direction?: {\n    x: number\n    y: number\n  }\n  font: \"tscircuit2024\"\n  font_size: Length\n  color?: string\n  arrow_size: Length\n}\n\n/**\n * @deprecated use PcbFabricationNoteDimension\n */\nexport type PCBFabricationNoteDimension = PcbFabricationNoteDimension\n\nexpectTypesMatch<\n  PcbFabricationNoteDimension,\n  InferredPcbFabricationNoteDimension\n>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { distance, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_note_text = z\n  .object({\n    type: z.literal(\"pcb_note_text\"),\n    pcb_note_text_id: getZodPrefixedIdWithDefault(\"pcb_note_text\"),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    name: z.string().optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: distance.default(\"1mm\"),\n    text: z.string().optional(),\n    anchor_position: point.default({ x: 0, y: 0 }),\n    anchor_alignment: z\n      .enum([\"center\", \"top_left\", \"top_right\", \"bottom_left\", \"bottom_right\"])\n      .default(\"center\"),\n    layer: visible_layer.default(\"top\"),\n    is_mirrored_from_top_view: z.boolean().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a documentation note in text on the PCB\")\n\nexport type PcbNoteTextInput = z.input<typeof pcb_note_text>\ntype InferredPcbNoteText = z.infer<typeof pcb_note_text>\n\n/**\n * Defines a documentation note in text on the PCB\n */\nexport interface PcbNoteText {\n  type: \"pcb_note_text\"\n  pcb_note_text_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  name?: string\n  font: \"tscircuit2024\"\n  font_size: Length\n  text?: string\n  anchor_position: Point\n  anchor_alignment:\n    | \"center\"\n    | \"top_left\"\n    | \"top_right\"\n    | \"bottom_left\"\n    | \"bottom_right\"\n  layer: VisibleLayer\n  is_mirrored_from_top_view?: boolean\n  color?: string\n}\n\nexpectTypesMatch<PcbNoteText, InferredPcbNoteText>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_note_rect = z\n  .object({\n    type: z.literal(\"pcb_note_rect\"),\n    pcb_note_rect_id: getZodPrefixedIdWithDefault(\"pcb_note_rect\"),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    name: z.string().optional(),\n    text: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    layer: visible_layer.default(\"top\"),\n    stroke_width: length.default(\"0.1mm\"),\n    corner_radius: length.optional(),\n    is_filled: z.boolean().optional(),\n    has_stroke: z.boolean().optional(),\n    is_stroke_dashed: z.boolean().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a rectangular documentation note on the PCB\")\n\nexport type PcbNoteRectInput = z.input<typeof pcb_note_rect>\ntype InferredPcbNoteRect = z.infer<typeof pcb_note_rect>\n\n/**\n * Defines a rectangular documentation note on the PCB\n */\nexport interface PcbNoteRect {\n  type: \"pcb_note_rect\"\n  pcb_note_rect_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  name?: string\n  text?: string\n  center: Point\n  width: Length\n  height: Length\n  layer: VisibleLayer\n  stroke_width: Length\n  corner_radius?: Length\n  is_filled?: boolean\n  has_stroke?: boolean\n  is_stroke_dashed?: boolean\n  color?: string\n}\n\nexpectTypesMatch<PcbNoteRect, InferredPcbNoteRect>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_note_path = z\n  .object({\n    type: z.literal(\"pcb_note_path\"),\n    pcb_note_path_id: getZodPrefixedIdWithDefault(\"pcb_note_path\"),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    name: z.string().optional(),\n    text: z.string().optional(),\n    route: z.array(point),\n    layer: visible_layer.default(\"top\"),\n    stroke_width: length.default(\"0.1mm\"),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a polyline documentation note on the PCB\")\n\nexport type PcbNotePathInput = z.input<typeof pcb_note_path>\ntype InferredPcbNotePath = z.infer<typeof pcb_note_path>\n\n/**\n * Defines a polyline documentation note on the PCB\n */\nexport interface PcbNotePath {\n  type: \"pcb_note_path\"\n  pcb_note_path_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  name?: string\n  text?: string\n  route: Point[]\n  layer: VisibleLayer\n  stroke_width: Length\n  color?: string\n}\n\nexpectTypesMatch<PcbNotePath, InferredPcbNotePath>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_note_line = z\n  .object({\n    type: z.literal(\"pcb_note_line\"),\n    pcb_note_line_id: getZodPrefixedIdWithDefault(\"pcb_note_line\"),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    name: z.string().optional(),\n    text: z.string().optional(),\n    x1: distance,\n    y1: distance,\n    x2: distance,\n    y2: distance,\n    layer: visible_layer.default(\"top\"),\n    stroke_width: distance.default(\"0.1mm\"),\n    color: z.string().optional(),\n    is_dashed: z.boolean().optional(),\n  })\n  .describe(\"Defines a straight documentation note line on the PCB\")\n\nexport type PcbNoteLineInput = z.input<typeof pcb_note_line>\ntype InferredPcbNoteLine = z.infer<typeof pcb_note_line>\n\n/**\n * Defines a straight documentation note line on the PCB\n */\nexport interface PcbNoteLine {\n  type: \"pcb_note_line\"\n  pcb_note_line_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  name?: string\n  text?: string\n  x1: Distance\n  y1: Distance\n  x2: Distance\n  y2: Distance\n  layer: VisibleLayer\n  stroke_width: Distance\n  color?: string\n  is_dashed?: boolean\n}\n\nexpectTypesMatch<PcbNoteLine, InferredPcbNoteLine>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_note_dimension = z\n  .object({\n    type: z.literal(\"pcb_note_dimension\"),\n    pcb_note_dimension_id: getZodPrefixedIdWithDefault(\"pcb_note_dimension\"),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    name: z.string().optional(),\n    from: point,\n    to: point,\n    text: z.string().optional(),\n    text_ccw_rotation: z.number().optional(),\n    offset_distance: length.optional(),\n    offset_direction: z\n      .object({\n        x: z.number(),\n        y: z.number(),\n      })\n      .optional(),\n    font: z.literal(\"tscircuit2024\").default(\"tscircuit2024\"),\n    font_size: length.default(\"1mm\"),\n    layer: visible_layer.default(\"top\"),\n    color: z.string().optional(),\n    arrow_size: length.default(\"1mm\"),\n  })\n  .describe(\"Defines a measurement annotation within PCB documentation notes\")\n\nexport type PcbNoteDimensionInput = z.input<typeof pcb_note_dimension>\ntype InferredPcbNoteDimension = z.infer<typeof pcb_note_dimension>\n\n/**\n * Defines a measurement annotation within PCB documentation notes\n */\nexport interface PcbNoteDimension {\n  type: \"pcb_note_dimension\"\n  pcb_note_dimension_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  name?: string\n  from: Point\n  to: Point\n  text?: string\n  text_ccw_rotation?: number\n  offset_distance?: Length\n  offset_direction?: {\n    x: number\n    y: number\n  }\n  font: \"tscircuit2024\"\n  font_size: Length\n  layer: VisibleLayer\n  color?: string\n  arrow_size: Length\n}\n\nexpectTypesMatch<PcbNoteDimension, InferredPcbNoteDimension>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_footprint_overlap_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_footprint_overlap_error\"),\n    pcb_error_id: getZodPrefixedIdWithDefault(\"pcb_error\"),\n    error_type: z\n      .literal(\"pcb_footprint_overlap_error\")\n      .default(\"pcb_footprint_overlap_error\"),\n    pcb_smtpad_ids: z.array(z.string()).optional(),\n    pcb_plated_hole_ids: z.array(z.string()).optional(),\n    pcb_hole_ids: z.array(z.string()).optional(),\n    pcb_keepout_ids: z.array(z.string()).optional(),\n  })\n  .describe(\"Error emitted when a pcb footprint overlaps with another element\")\n\nexport type PcbFootprintOverlapErrorInput = z.input<\n  typeof pcb_footprint_overlap_error\n>\ntype InferredPcbFootprintOverlapError = z.infer<\n  typeof pcb_footprint_overlap_error\n>\n\n/** Error emitted when a pcb footprint overlaps with another element */\nexport interface PcbFootprintOverlapError extends BaseCircuitJsonError {\n  type: \"pcb_footprint_overlap_error\"\n  pcb_error_id: string\n  error_type: \"pcb_footprint_overlap_error\"\n  pcb_smtpad_ids?: string[]\n  pcb_plated_hole_ids?: string[]\n  pcb_hole_ids?: string[]\n  pcb_keepout_ids?: string[]\n}\n\nexpectTypesMatch<PcbFootprintOverlapError, InferredPcbFootprintOverlapError>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_overlap_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_courtyard_overlap_error\"),\n    pcb_error_id: getZodPrefixedIdWithDefault(\"pcb_error\"),\n    error_type: z\n      .literal(\"pcb_courtyard_overlap_error\")\n      .default(\"pcb_courtyard_overlap_error\"),\n    pcb_component_ids: z.tuple([z.string(), z.string()]),\n  })\n  .describe(\n    \"Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another\",\n  )\n\nexport type PcbCourtyardOverlapErrorInput = z.input<\n  typeof pcb_courtyard_overlap_error\n>\ntype InferredPcbCourtyardOverlapError = z.infer<\n  typeof pcb_courtyard_overlap_error\n>\n\n/** Error emitted when the courtyard (CrtYd) of one PCB component overlaps with the courtyard of another */\nexport interface PcbCourtyardOverlapError extends BaseCircuitJsonError {\n  type: \"pcb_courtyard_overlap_error\"\n  pcb_error_id: string\n  error_type: \"pcb_courtyard_overlap_error\"\n  pcb_component_ids: [string, string]\n}\n\nexpectTypesMatch<PcbCourtyardOverlapError, InferredPcbCourtyardOverlapError>(\n  true,\n)\n","import { z } from \"zod\"\nimport { point, type Point } from \"../common\"\nimport { distance } from \"../units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_keepout = z\n  .object({\n    type: z.literal(\"pcb_keepout\"),\n    shape: z.literal(\"rect\"),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: distance,\n    height: distance,\n    pcb_keepout_id: z.string(),\n    layers: z.array(z.string()), // Specify layers where the keepout applies\n    description: z.string().optional(), // Optional description of the keepout\n  })\n  .or(\n    z.object({\n      type: z.literal(\"pcb_keepout\"),\n      shape: z.literal(\"circle\"),\n      pcb_group_id: z.string().optional(),\n      subcircuit_id: z.string().optional(),\n      center: point,\n      radius: distance,\n      pcb_keepout_id: z.string(),\n      layers: z.array(z.string()), // Specify layers where the keepout applies\n      description: z.string().optional(), // Optional description of the keepout\n    }),\n  )\n\nexport type PCBKeepoutInput = z.input<typeof pcb_keepout>\ntype InferredPCBKeepout = z.infer<typeof pcb_keepout>\n\nexport interface PCBKeepoutRect {\n  type: \"pcb_keepout\"\n  shape: \"rect\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: number\n  height: number\n  pcb_keepout_id: string\n  layers: string[]\n  description?: string\n}\n\nexport interface PCBKeepoutCircle {\n  type: \"pcb_keepout\"\n  shape: \"circle\"\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  radius: number\n  pcb_keepout_id: string\n  layers: string[]\n  description?: string\n}\n\nexport type PCBKeepout = PCBKeepoutRect | PCBKeepoutCircle\n\nexpectTypesMatch<PCBKeepout, InferredPCBKeepout>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { length, type Length, rotation, type Rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\n// Common properties base for all cutout shapes (internal)\nconst pcb_cutout_base = z.object({\n  type: z.literal(\"pcb_cutout\"),\n  pcb_cutout_id: getZodPrefixedIdWithDefault(\"pcb_cutout\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  pcb_board_id: z.string().optional(),\n  pcb_panel_id: z.string().optional(),\n})\n\n// Rectangular Cutout\nexport const pcb_cutout_rect = pcb_cutout_base.extend({\n  shape: z.literal(\"rect\"),\n  center: point,\n  width: length,\n  height: length,\n  rotation: rotation.optional(),\n  corner_radius: length.optional(),\n})\nexport type PcbCutoutRectInput = z.input<typeof pcb_cutout_rect>\ntype InferredPcbCutoutRect = z.infer<typeof pcb_cutout_rect>\n/**\n * Defines a rectangular cutout on the PCB.\n */\nexport interface PcbCutoutRect {\n  type: \"pcb_cutout\"\n  pcb_cutout_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_board_id?: string\n  pcb_panel_id?: string\n  shape: \"rect\"\n  center: Point\n  width: Length\n  height: Length\n  rotation?: Rotation\n  corner_radius?: Length\n}\nexpectTypesMatch<PcbCutoutRect, InferredPcbCutoutRect>(true)\n\n// Circular Cutout\nexport const pcb_cutout_circle = pcb_cutout_base.extend({\n  shape: z.literal(\"circle\"),\n  center: point,\n  radius: length,\n})\nexport type PcbCutoutCircleInput = z.input<typeof pcb_cutout_circle>\ntype InferredPcbCutoutCircle = z.infer<typeof pcb_cutout_circle>\n/**\n * Defines a circular cutout on the PCB.\n */\nexport interface PcbCutoutCircle {\n  type: \"pcb_cutout\"\n  pcb_cutout_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_board_id?: string\n  pcb_panel_id?: string\n  shape: \"circle\"\n  center: Point\n  radius: Length\n}\nexpectTypesMatch<PcbCutoutCircle, InferredPcbCutoutCircle>(true)\n\n// Polygon Cutout\nexport const pcb_cutout_polygon = pcb_cutout_base.extend({\n  shape: z.literal(\"polygon\"),\n  points: z.array(point),\n})\nexport type PcbCutoutPolygonInput = z.input<typeof pcb_cutout_polygon>\ntype InferredPcbCutoutPolygon = z.infer<typeof pcb_cutout_polygon>\n/**\n * Defines a polygonal cutout on the PCB, specified by a list of points.\n * The polygon should be closed (the last point implicitly connects to the first).\n */\nexport interface PcbCutoutPolygon {\n  type: \"pcb_cutout\"\n  pcb_cutout_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_board_id?: string\n  pcb_panel_id?: string\n  shape: \"polygon\"\n  points: Point[]\n}\nexpectTypesMatch<PcbCutoutPolygon, InferredPcbCutoutPolygon>(true)\n\n// Path Cutout (for slots along a path)\nexport const pcb_cutout_path = pcb_cutout_base.extend({\n  shape: z.literal(\"path\"),\n  route: z.array(point),\n  slot_width: length,\n  slot_length: length.optional(),\n  space_between_slots: length.optional(),\n  slot_corner_radius: length.optional(),\n})\nexport type PcbCutoutPathInput = z.input<typeof pcb_cutout_path>\ntype InferredPcbCutoutPath = z.infer<typeof pcb_cutout_path>\n/**\n * Defines a path-based cutout on the PCB, creating slots along the specified path.\n * When slot_length and space_between_slots are specified, creates a dashed pattern of slots.\n * When they are omitted, creates a continuous slot along the entire path.\n * The slot_corner_radius controls the rounding of slot corners (0 = square, slot_width/2 = circle).\n */\nexport interface PcbCutoutPath {\n  type: \"pcb_cutout\"\n  pcb_cutout_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  pcb_board_id?: string\n  pcb_panel_id?: string\n  shape: \"path\"\n  route: Point[]\n  slot_width: Length\n  slot_length?: Length\n  space_between_slots?: Length\n  slot_corner_radius?: Length\n}\nexpectTypesMatch<PcbCutoutPath, InferredPcbCutoutPath>(true)\n\n// Union of all cutout shapes\nexport const pcb_cutout = z\n  .discriminatedUnion(\"shape\", [\n    pcb_cutout_rect,\n    pcb_cutout_circle,\n    pcb_cutout_polygon,\n    pcb_cutout_path,\n  ])\n  .describe(\"Defines a cutout on the PCB, removing board material.\")\n\nexport type PcbCutoutInput = z.input<typeof pcb_cutout>\nexport type PcbCutout =\n  | PcbCutoutRect\n  | PcbCutoutCircle\n  | PcbCutoutPolygon\n  | PcbCutoutPath\n\ntype InferredPcbCutout = z.infer<typeof pcb_cutout>\nexpectTypesMatch<PcbCutout, InferredPcbCutout>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_missing_footprint_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_missing_footprint_error\"),\n    pcb_missing_footprint_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_missing_footprint_error\",\n    ),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    error_type: z\n      .literal(\"pcb_missing_footprint_error\")\n      .default(\"pcb_missing_footprint_error\"),\n    source_component_id: z.string(),\n  })\n  .describe(\"Defines a missing footprint error on the PCB\")\n\nexport type PcbMissingFootprintErrorInput = z.input<\n  typeof pcb_missing_footprint_error\n>\ntype InferredPcbMissingFootprintError = z.infer<\n  typeof pcb_missing_footprint_error\n>\n\n/**\n * Defines a placement error on the PCB\n */\nexport interface PcbMissingFootprintError extends BaseCircuitJsonError {\n  type: \"pcb_missing_footprint_error\"\n  pcb_missing_footprint_error_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  error_type: \"pcb_missing_footprint_error\"\n  source_component_id: string\n}\n\n/**\n * @deprecated use PcbMissingFootprintError\n */\nexport type PCBMissingFootprintError = PcbMissingFootprintError\n\nexpectTypesMatch<PcbMissingFootprintError, InferredPcbMissingFootprintError>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const external_footprint_load_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"external_footprint_load_error\"),\n    external_footprint_load_error_id: getZodPrefixedIdWithDefault(\n      \"external_footprint_load_error\",\n    ),\n    pcb_component_id: z.string(),\n    source_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    footprinter_string: z.string().optional(),\n    error_type: z\n      .literal(\"external_footprint_load_error\")\n      .default(\"external_footprint_load_error\"),\n  })\n  .describe(\"Defines an error when an external footprint fails to load\")\n\nexport type ExternalFootprintLoadErrorInput = z.input<\n  typeof external_footprint_load_error\n>\ntype InferredExternalFootprintLoadError = z.infer<\n  typeof external_footprint_load_error\n>\n\nexport interface ExternalFootprintLoadError extends BaseCircuitJsonError {\n  type: \"external_footprint_load_error\"\n  external_footprint_load_error_id: string\n  pcb_component_id: string\n  source_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  footprinter_string?: string\n  error_type: \"external_footprint_load_error\"\n}\n\nexpectTypesMatch<\n  ExternalFootprintLoadError,\n  InferredExternalFootprintLoadError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const circuit_json_footprint_load_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"circuit_json_footprint_load_error\"),\n    circuit_json_footprint_load_error_id: getZodPrefixedIdWithDefault(\n      \"circuit_json_footprint_load_error\",\n    ),\n    pcb_component_id: z.string(),\n    source_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    error_type: z\n      .literal(\"circuit_json_footprint_load_error\")\n      .default(\"circuit_json_footprint_load_error\"),\n    circuit_json: z.array(z.any()).optional(),\n  })\n  .describe(\"Defines an error when a circuit JSON footprint fails to load\")\n\nexport type CircuitJsonFootprintLoadErrorInput = z.input<\n  typeof circuit_json_footprint_load_error\n>\ntype InferredCircuitJsonFootprintLoadError = z.infer<\n  typeof circuit_json_footprint_load_error\n>\n\nexport interface CircuitJsonFootprintLoadError extends BaseCircuitJsonError {\n  type: \"circuit_json_footprint_load_error\"\n  circuit_json_footprint_load_error_id: string\n  pcb_component_id: string\n  source_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  error_type: \"circuit_json_footprint_load_error\"\n  circuit_json?: any[]\n}\n\nexpectTypesMatch<\n  CircuitJsonFootprintLoadError,\n  InferredCircuitJsonFootprintLoadError\n>(true)\n","import { z } from \"zod\"\nimport {\n  point,\n  type Point,\n  getZodPrefixedIdWithDefault,\n  ninePointAnchor,\n  type NinePointAnchor,\n} from \"src/common\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_group = z\n  .object({\n    type: z.literal(\"pcb_group\"),\n    pcb_group_id: getZodPrefixedIdWithDefault(\"pcb_group\"),\n    source_group_id: z.string(),\n    is_subcircuit: z.boolean().optional(),\n    subcircuit_id: z.string().optional(),\n    width: length.optional(),\n    height: length.optional(),\n    center: point,\n    display_offset_x: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the x offset for this group, usually corresponding with how the user specified it\",\n      ),\n    display_offset_y: z\n      .string()\n      .optional()\n      .describe(\n        \"How to display the y offset for this group, usually corresponding with how the user specified it\",\n      ),\n    outline: z.array(point).optional(),\n    anchor_position: point.optional(),\n    anchor_alignment: ninePointAnchor.default(\"center\"),\n    position_mode: z\n      .enum([\"packed\", \"relative_to_group_anchor\", \"none\"])\n      .optional(),\n    positioned_relative_to_pcb_group_id: z.string().optional(),\n    positioned_relative_to_pcb_board_id: z.string().optional(),\n    pcb_component_ids: z.array(z.string()),\n    child_layout_mode: z.enum([\"packed\", \"none\"]).optional(),\n    name: z.string().optional(),\n    description: z.string().optional(),\n    layout_mode: z.string().optional(),\n    autorouter_configuration: z\n      .object({\n        trace_clearance: length,\n      })\n      .optional(),\n    autorouter_used_string: z.string().optional(),\n  })\n  .describe(\"Defines a group of components on the PCB\")\n\nexport type PcbGroupInput = z.input<typeof pcb_group>\ntype InferredPcbGroup = z.infer<typeof pcb_group>\n\n/**\n * Defines a group of components on the PCB\n */\nexport interface PcbGroup {\n  type: \"pcb_group\"\n  pcb_group_id: string\n  source_group_id: string\n  is_subcircuit?: boolean\n  subcircuit_id?: string\n  width?: Length\n  height?: Length\n  center: Point\n  display_offset_x?: string\n  display_offset_y?: string\n  outline?: Point[]\n  anchor_position?: Point\n  anchor_alignment: NinePointAnchor\n  position_mode?: \"packed\" | \"relative_to_group_anchor\" | \"none\"\n  positioned_relative_to_pcb_group_id?: string\n  positioned_relative_to_pcb_board_id?: string\n  pcb_component_ids: string[]\n  child_layout_mode?: \"packed\" | \"none\"\n  name?: string\n  description?: string\n  layout_mode?: string\n  autorouter_configuration?: {\n    trace_clearance: Length\n  }\n  autorouter_used_string?: string\n}\n\nexpectTypesMatch<PcbGroup, InferredPcbGroup>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_autorouting_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_autorouting_error\"),\n    pcb_error_id: getZodPrefixedIdWithDefault(\"pcb_autorouting_error\"),\n    error_type: z\n      .literal(\"pcb_autorouting_error\")\n      .default(\"pcb_autorouting_error\"),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"The autorouting has failed to route a portion of the board\")\n\nexport type PcbAutoroutingErrorInput = z.input<typeof pcb_autorouting_error>\ntype PcbInferredAutoroutingError = z.infer<typeof pcb_autorouting_error>\n\nexport interface PcbAutoroutingErrorInterface extends BaseCircuitJsonError {\n  type: \"pcb_autorouting_error\"\n  pcb_error_id: string\n  error_type: \"pcb_autorouting_error\"\n  subcircuit_id?: string\n}\n\nexport type PcbAutoroutingError = PcbAutoroutingErrorInterface\n\nexpectTypesMatch<PcbAutoroutingError, PcbInferredAutoroutingError>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"../common\"\nimport { expectTypesMatch } from \"../utils/expect-types-match\"\n\nexport const pcb_manual_edit_conflict_warning = z\n  .object({\n    type: z.literal(\"pcb_manual_edit_conflict_warning\"),\n    pcb_manual_edit_conflict_warning_id: getZodPrefixedIdWithDefault(\n      \"pcb_manual_edit_conflict_warning\",\n    ),\n    warning_type: z\n      .literal(\"pcb_manual_edit_conflict_warning\")\n      .default(\"pcb_manual_edit_conflict_warning\"),\n    message: z.string(),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    source_component_id: z.string(),\n  })\n  .describe(\n    \"Warning emitted when a component has both manual placement and explicit pcbX/pcbY coordinates\",\n  )\n\nexport type PcbManualEditConflictWarningInput = z.input<\n  typeof pcb_manual_edit_conflict_warning\n>\ntype InferredPcbManualEditConflictWarning = z.infer<\n  typeof pcb_manual_edit_conflict_warning\n>\n\n/**\n * Warning emitted when a component has both manual placement (via manualEdits) and explicit pcbX/pcbY coordinates\n */\nexport interface PcbManualEditConflictWarning {\n  type: \"pcb_manual_edit_conflict_warning\"\n  pcb_manual_edit_conflict_warning_id: string\n  warning_type: \"pcb_manual_edit_conflict_warning\"\n  message: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  source_component_id: string\n}\n\nexpectTypesMatch<\n  PcbManualEditConflictWarning,\n  InferredPcbManualEditConflictWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst connectorOrientationDirection = z.enum([\"x-\", \"x+\", \"y+\", \"y-\"])\n\ntype ConnectorOrientationDirection = z.infer<\n  typeof connectorOrientationDirection\n>\n\nexport const pcb_connector_not_in_accessible_orientation_warning = z\n  .object({\n    type: z.literal(\"pcb_connector_not_in_accessible_orientation_warning\"),\n    pcb_connector_not_in_accessible_orientation_warning_id:\n      getZodPrefixedIdWithDefault(\n        \"pcb_connector_not_in_accessible_orientation_warning\",\n      ),\n    warning_type: z\n      .literal(\"pcb_connector_not_in_accessible_orientation_warning\")\n      .default(\"pcb_connector_not_in_accessible_orientation_warning\"),\n    message: z.string(),\n    pcb_component_id: z.string(),\n    source_component_id: z.string().optional(),\n    pcb_board_id: z.string().optional(),\n    facing_direction: connectorOrientationDirection,\n    recommended_facing_direction: connectorOrientationDirection,\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Warning emitted when a connector PCB component is facing inward toward the board and should be reoriented to an outward-facing direction\",\n  )\n\nexport type PcbConnectorNotInAccessibleOrientationWarningInput = z.input<\n  typeof pcb_connector_not_in_accessible_orientation_warning\n>\ntype InferredPcbConnectorNotInAccessibleOrientationWarning = z.infer<\n  typeof pcb_connector_not_in_accessible_orientation_warning\n>\n\n/** Warning emitted when a connector PCB component is facing inward toward the board and should be reoriented */\nexport interface PcbConnectorNotInAccessibleOrientationWarning {\n  type: \"pcb_connector_not_in_accessible_orientation_warning\"\n  pcb_connector_not_in_accessible_orientation_warning_id: string\n  warning_type: \"pcb_connector_not_in_accessible_orientation_warning\"\n  message: string\n  pcb_component_id: string\n  source_component_id?: string\n  pcb_board_id?: string\n  facing_direction: ConnectorOrientationDirection\n  recommended_facing_direction: ConnectorOrientationDirection\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  PcbConnectorNotInAccessibleOrientationWarning,\n  InferredPcbConnectorNotInAccessibleOrientationWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport {\n  supplier_name,\n  type SupplierName,\n} from \"src/pcb/properties/supplier_name\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const supplier_footprint_mismatch_warning = z\n  .object({\n    type: z.literal(\"supplier_footprint_mismatch_warning\"),\n    supplier_footprint_mismatch_warning_id: getZodPrefixedIdWithDefault(\n      \"supplier_footprint_mismatch_warning\",\n    ),\n    warning_type: z\n      .literal(\"supplier_footprint_mismatch_warning\")\n      .default(\"supplier_footprint_mismatch_warning\"),\n    message: z.string(),\n    source_component_id: z.string(),\n    pcb_component_id: z.string().optional(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    supplier_name: supplier_name.optional(),\n    supplier_part_number: z.string().optional(),\n    supplier_footprint_url: z.string().optional(),\n    footprint_copper_intersection_over_union: z.number(),\n  })\n  .describe(\n    \"Warning emitted when a supplier part footprint does not match the expected footprint\",\n  )\n\nexport type SupplierFootprintMismatchWarningInput = z.input<\n  typeof supplier_footprint_mismatch_warning\n>\ntype InferredSupplierFootprintMismatchWarning = z.infer<\n  typeof supplier_footprint_mismatch_warning\n>\n\n/**\n * Warning emitted when a supplier part footprint does not match the expected footprint\n */\nexport interface SupplierFootprintMismatchWarning {\n  type: \"supplier_footprint_mismatch_warning\"\n  supplier_footprint_mismatch_warning_id: string\n  warning_type: \"supplier_footprint_mismatch_warning\"\n  message: string\n  source_component_id: string\n  pcb_component_id?: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  supplier_name?: SupplierName\n  supplier_part_number?: string\n  supplier_footprint_url?: string\n  footprint_copper_intersection_over_union: number\n}\n\nexpectTypesMatch<\n  SupplierFootprintMismatchWarning,\n  InferredSupplierFootprintMismatchWarning\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_breakout_point = z\n  .object({\n    type: z.literal(\"pcb_breakout_point\"),\n    pcb_breakout_point_id: getZodPrefixedIdWithDefault(\"pcb_breakout_point\"),\n    pcb_group_id: z.string(),\n    subcircuit_id: z.string().optional(),\n    source_trace_id: z.string().optional(),\n    source_port_id: z.string().optional(),\n    source_net_id: z.string().optional(),\n    x: distance,\n    y: distance,\n  })\n  .describe(\n    \"Defines a routing target within a pcb_group for a source_trace or source_net\",\n  )\n\nexport type PcbBreakoutPointInput = z.input<typeof pcb_breakout_point>\ntype InferredPcbBreakoutPoint = z.infer<typeof pcb_breakout_point>\n\n/**\n * Defines a routing target within a pcb_group for a source_trace or source_net\n */\nexport interface PcbBreakoutPoint {\n  type: \"pcb_breakout_point\"\n  pcb_breakout_point_id: string\n  pcb_group_id: string\n  subcircuit_id?: string\n  source_trace_id?: string\n  source_port_id?: string\n  source_net_id?: string\n  x: Distance\n  y: Distance\n}\n\nexpectTypesMatch<PcbBreakoutPoint, InferredPcbBreakoutPoint>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_ground_plane = z\n  .object({\n    type: z.literal(\"pcb_ground_plane\"),\n    pcb_ground_plane_id: getZodPrefixedIdWithDefault(\"pcb_ground_plane\"),\n    source_pcb_ground_plane_id: z.string(),\n    source_net_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Defines a ground plane on the PCB\")\n\nexport type PcbGroundPlaneInput = z.input<typeof pcb_ground_plane>\ntype InferredPcbGroundPlane = z.infer<typeof pcb_ground_plane>\n\n/**\n * Defines a ground plane on the PCB\n */\nexport interface PcbGroundPlane {\n  type: \"pcb_ground_plane\"\n  pcb_ground_plane_id: string\n  source_pcb_ground_plane_id: string\n  source_net_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbGroundPlane, InferredPcbGroundPlane>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_ground_plane_region = z\n  .object({\n    type: z.literal(\"pcb_ground_plane_region\"),\n    pcb_ground_plane_region_id: getZodPrefixedIdWithDefault(\n      \"pcb_ground_plane_region\",\n    ),\n    pcb_ground_plane_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    layer: layer_ref,\n    points: z.array(point),\n  })\n  .describe(\"Defines a polygon region of a ground plane\")\n\nexport type PcbGroundPlaneRegionInput = z.input<typeof pcb_ground_plane_region>\ntype InferredPcbGroundPlaneRegion = z.infer<typeof pcb_ground_plane_region>\n\n/**\n * Defines a polygon region of a ground plane\n */\nexport interface PcbGroundPlaneRegion {\n  type: \"pcb_ground_plane_region\"\n  pcb_ground_plane_region_id: string\n  pcb_ground_plane_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: LayerRef\n  points: Point[]\n}\n\nexpectTypesMatch<PcbGroundPlaneRegion, InferredPcbGroundPlaneRegion>(true)\n","import { z } from \"zod\"\nimport { distance, type Distance } from \"src/units\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_thermal_spoke = z\n  .object({\n    type: z.literal(\"pcb_thermal_spoke\"),\n    pcb_thermal_spoke_id: getZodPrefixedIdWithDefault(\"pcb_thermal_spoke\"),\n    pcb_ground_plane_id: z.string(),\n    shape: z.string(),\n    spoke_count: z.number(),\n    spoke_thickness: distance,\n    spoke_inner_diameter: distance,\n    spoke_outer_diameter: distance,\n    pcb_plated_hole_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Pattern for connecting a ground plane to a plated hole\")\n\nexport type PcbThermalSpokeInput = z.input<typeof pcb_thermal_spoke>\ntype InferredPcbThermalSpoke = z.infer<typeof pcb_thermal_spoke>\n\n/**\n * Pattern for connecting a ground plane to a plated hole\n */\nexport interface PcbThermalSpoke {\n  type: \"pcb_thermal_spoke\"\n  pcb_thermal_spoke_id: string\n  pcb_ground_plane_id: string\n  shape: string\n  spoke_count: number\n  spoke_thickness: Distance\n  spoke_inner_diameter: Distance\n  spoke_outer_diameter: Distance\n  pcb_plated_hole_id?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbThermalSpoke, InferredPcbThermalSpoke>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { length, type Length, rotation, type Rotation } from \"src/units\"\nimport { layer_ref, type LayerRef } from \"./properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { brep_shape, type BRepShape } from \"./properties/brep\"\n\n// Common properties base for all pour shapes (internal)\nconst pcb_copper_pour_base = z.object({\n  type: z.literal(\"pcb_copper_pour\"),\n  pcb_copper_pour_id: getZodPrefixedIdWithDefault(\"pcb_copper_pour\"),\n  pcb_group_id: z.string().optional(),\n  subcircuit_id: z.string().optional(),\n  layer: layer_ref,\n  source_net_id: z.string().optional(),\n  covered_with_solder_mask: z.boolean().optional().default(true),\n})\n\n// Rectangular Pour\nexport const pcb_copper_pour_rect = pcb_copper_pour_base.extend({\n  shape: z.literal(\"rect\"),\n  center: point,\n  width: length,\n  height: length,\n  rotation: rotation.optional(),\n})\nexport type PcbCopperPourRectInput = z.input<typeof pcb_copper_pour_rect>\ntype InferredPcbCopperPourRect = z.infer<typeof pcb_copper_pour_rect>\n/**\n * Defines a rectangular copper pour on the PCB.\n */\nexport interface PcbCopperPourRect {\n  type: \"pcb_copper_pour\"\n  pcb_copper_pour_id: string\n  covered_with_solder_mask: boolean\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: LayerRef\n  source_net_id?: string\n  shape: \"rect\"\n  center: Point\n  width: Length\n  height: Length\n  rotation?: Rotation\n}\nexpectTypesMatch<PcbCopperPourRect, InferredPcbCopperPourRect>(true)\n\n// BRep Pour\nexport const pcb_copper_pour_brep = pcb_copper_pour_base.extend({\n  shape: z.literal(\"brep\"),\n  brep_shape: brep_shape,\n})\nexport type PcbCopperPourBRepInput = z.input<typeof pcb_copper_pour_brep>\ntype InferredPcbCopperPourBRep = z.infer<typeof pcb_copper_pour_brep>\n/**\n * Defines a BRep copper pour on the PCB.\n */\nexport interface PcbCopperPourBRep {\n  type: \"pcb_copper_pour\"\n  pcb_copper_pour_id: string\n  covered_with_solder_mask: boolean\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: LayerRef\n  source_net_id?: string\n  shape: \"brep\"\n  brep_shape: BRepShape\n}\nexpectTypesMatch<PcbCopperPourBRep, InferredPcbCopperPourBRep>(true)\n\n// Polygon Pour\nexport const pcb_copper_pour_polygon = pcb_copper_pour_base.extend({\n  shape: z.literal(\"polygon\"),\n  points: z.array(point),\n})\nexport type PcbCopperPourPolygonInput = z.input<typeof pcb_copper_pour_polygon>\ntype InferredPcbCopperPourPolygon = z.infer<typeof pcb_copper_pour_polygon>\n/**\n * Defines a polygonal copper pour on the PCB, specified by a list of points.\n * The polygon should be closed (the last point implicitly connects to the first).\n */\nexport interface PcbCopperPourPolygon {\n  type: \"pcb_copper_pour\"\n  pcb_copper_pour_id: string\n  covered_with_solder_mask: boolean\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: LayerRef\n  source_net_id?: string\n  shape: \"polygon\"\n  points: Point[]\n}\nexpectTypesMatch<PcbCopperPourPolygon, InferredPcbCopperPourPolygon>(true)\n\n// Union of all pour shapes\nexport const pcb_copper_pour = z\n  .discriminatedUnion(\"shape\", [\n    pcb_copper_pour_rect,\n    pcb_copper_pour_brep,\n    pcb_copper_pour_polygon,\n  ])\n  .describe(\"Defines a copper pour on the PCB.\")\n\nexport type PcbCopperPourInput = z.input<typeof pcb_copper_pour>\nexport type PcbCopperPour =\n  | PcbCopperPourRect\n  | PcbCopperPourBRep\n  | PcbCopperPourPolygon\n\ntype InferredPcbCopperPour = z.infer<typeof pcb_copper_pour>\nexpectTypesMatch<PcbCopperPour, InferredPcbCopperPour>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { point, type Point } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_component_outside_board_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_component_outside_board_error\"),\n    pcb_component_outside_board_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_component_outside_board_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_component_outside_board_error\")\n      .default(\"pcb_component_outside_board_error\"),\n    pcb_component_id: z.string(),\n    pcb_board_id: z.string(),\n    component_center: point,\n    component_bounds: z.object({\n      min_x: z.number(),\n      max_x: z.number(),\n      min_y: z.number(),\n      max_y: z.number(),\n    }),\n    subcircuit_id: z.string().optional(),\n    source_component_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a PCB component is placed outside the board boundaries\",\n  )\n\nexport type PcbComponentOutsideBoardErrorInput = z.input<\n  typeof pcb_component_outside_board_error\n>\ntype InferredPcbComponentOutsideBoardError = z.infer<\n  typeof pcb_component_outside_board_error\n>\n\n/** Error emitted when a PCB component is placed outside the board boundaries */\nexport interface PcbComponentOutsideBoardError extends BaseCircuitJsonError {\n  type: \"pcb_component_outside_board_error\"\n  pcb_component_outside_board_error_id: string\n  error_type: \"pcb_component_outside_board_error\"\n  pcb_component_id: string\n  pcb_board_id: string\n  component_center: Point\n  component_bounds: {\n    min_x: number\n    max_x: number\n    min_y: number\n    max_y: number\n  }\n  subcircuit_id?: string\n  source_component_id?: string\n}\n\nexpectTypesMatch<\n  PcbComponentOutsideBoardError,\n  InferredPcbComponentOutsideBoardError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_component_not_on_board_edge_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_component_not_on_board_edge_error\"),\n    pcb_component_not_on_board_edge_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_component_not_on_board_edge_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_component_not_on_board_edge_error\")\n      .default(\"pcb_component_not_on_board_edge_error\"),\n    pcb_component_id: z.string(),\n    pcb_board_id: z.string(),\n    component_center: point,\n    pad_to_nearest_board_edge_distance: z.number(),\n    source_component_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a component that must be placed on the board edge is centered away from the edge\",\n  )\n\nexport type PcbComponentNotOnBoardEdgeErrorInput = z.input<\n  typeof pcb_component_not_on_board_edge_error\n>\ntype InferredPcbComponentNotOnBoardEdgeError = z.infer<\n  typeof pcb_component_not_on_board_edge_error\n>\n\n/** Error emitted when a component that must be placed on the board edge is centered away from the edge */\nexport interface PcbComponentNotOnBoardEdgeError extends BaseCircuitJsonError {\n  type: \"pcb_component_not_on_board_edge_error\"\n  pcb_component_not_on_board_edge_error_id: string\n  error_type: \"pcb_component_not_on_board_edge_error\"\n  pcb_component_id: string\n  pcb_board_id: string\n  component_center: Point\n  pad_to_nearest_board_edge_distance: number\n  source_component_id?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  PcbComponentNotOnBoardEdgeError,\n  InferredPcbComponentNotOnBoardEdgeError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { layer_ref, type LayerRef } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_component_invalid_layer_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_component_invalid_layer_error\"),\n    pcb_component_invalid_layer_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_component_invalid_layer_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_component_invalid_layer_error\")\n      .default(\"pcb_component_invalid_layer_error\"),\n    pcb_component_id: z.string().optional(),\n    source_component_id: z.string(),\n    layer: layer_ref,\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers)\",\n  )\n\nexport type PcbComponentInvalidLayerErrorInput = z.input<\n  typeof pcb_component_invalid_layer_error\n>\ntype InferredPcbComponentInvalidLayerError = z.infer<\n  typeof pcb_component_invalid_layer_error\n>\n\n/** Error emitted when a component is placed on an invalid layer (components can only be on 'top' or 'bottom' layers) */\nexport interface PcbComponentInvalidLayerError extends BaseCircuitJsonError {\n  type: \"pcb_component_invalid_layer_error\"\n  pcb_component_invalid_layer_error_id: string\n  error_type: \"pcb_component_invalid_layer_error\"\n  pcb_component_id?: string\n  source_component_id: string\n  layer: LayerRef\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  PcbComponentInvalidLayerError,\n  InferredPcbComponentInvalidLayerError\n>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_via_clearance_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_via_clearance_error\"),\n    pcb_error_id: getZodPrefixedIdWithDefault(\"pcb_error\"),\n    error_type: z\n      .literal(\"pcb_via_clearance_error\")\n      .default(\"pcb_via_clearance_error\"),\n    pcb_via_ids: z.array(z.string()).min(2),\n    minimum_clearance: distance.optional(),\n    actual_clearance: distance.optional(),\n    pcb_center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Error emitted when vias are closer than the allowed clearance\")\n\nexport type PcbViaClearanceErrorInput = z.input<typeof pcb_via_clearance_error>\ntype InferredPcbViaClearanceError = z.infer<typeof pcb_via_clearance_error>\n\n/** Error emitted when vias are closer than the allowed clearance */\nexport interface PcbViaClearanceError extends BaseCircuitJsonError {\n  type: \"pcb_via_clearance_error\"\n  pcb_error_id: string\n  error_type: \"pcb_via_clearance_error\"\n  pcb_via_ids: string[]\n  minimum_clearance?: Distance\n  actual_clearance?: Distance\n  pcb_center?: {\n    x?: number\n    y?: number\n  }\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbViaClearanceError, InferredPcbViaClearanceError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_via_trace_clearance_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_via_trace_clearance_error\"),\n    pcb_via_trace_clearance_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_via_trace_clearance_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_via_trace_clearance_error\")\n      .default(\"pcb_via_trace_clearance_error\"),\n    pcb_via_id: z.string(),\n    pcb_trace_id: z.string(),\n    minimum_clearance: distance.optional(),\n    actual_clearance: distance.optional(),\n    center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a via and trace are closer than the allowed clearance\",\n  )\n\nexport type PcbViaTraceClearanceErrorInput = z.input<\n  typeof pcb_via_trace_clearance_error\n>\ntype InferredPcbViaTraceClearanceError = z.infer<\n  typeof pcb_via_trace_clearance_error\n>\n\n/** Error emitted when a via and trace are closer than the allowed clearance */\nexport interface PcbViaTraceClearanceError extends BaseCircuitJsonError {\n  type: \"pcb_via_trace_clearance_error\"\n  pcb_via_trace_clearance_error_id: string\n  error_type: \"pcb_via_trace_clearance_error\"\n  pcb_via_id: string\n  pcb_trace_id: string\n  minimum_clearance?: Distance\n  actual_clearance?: Distance\n  center?: {\n    x?: number\n    y?: number\n  }\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbViaTraceClearanceError, InferredPcbViaTraceClearanceError>(\n  true,\n)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_pad_pad_clearance_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_pad_pad_clearance_error\"),\n    pcb_pad_pad_clearance_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_pad_pad_clearance_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_pad_pad_clearance_error\")\n      .default(\"pcb_pad_pad_clearance_error\"),\n    pcb_pad_ids: z.array(z.string()).min(2),\n    minimum_clearance: distance.optional(),\n    actual_clearance: distance.optional(),\n    center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"Error emitted when pads are closer than the allowed clearance\")\n\nexport type PcbPadPadClearanceErrorInput = z.input<\n  typeof pcb_pad_pad_clearance_error\n>\ntype InferredPcbPadPadClearanceError = z.infer<\n  typeof pcb_pad_pad_clearance_error\n>\n\n/** Error emitted when pads are closer than the allowed clearance */\nexport interface PcbPadPadClearanceError extends BaseCircuitJsonError {\n  type: \"pcb_pad_pad_clearance_error\"\n  pcb_pad_pad_clearance_error_id: string\n  error_type: \"pcb_pad_pad_clearance_error\"\n  pcb_pad_ids: string[]\n  minimum_clearance?: Distance\n  actual_clearance?: Distance\n  center?: {\n    x?: number\n    y?: number\n  }\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbPadPadClearanceError, InferredPcbPadPadClearanceError>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { distance, type Distance } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_pad_trace_clearance_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"pcb_pad_trace_clearance_error\"),\n    pcb_pad_trace_clearance_error_id: getZodPrefixedIdWithDefault(\n      \"pcb_pad_trace_clearance_error\",\n    ),\n    error_type: z\n      .literal(\"pcb_pad_trace_clearance_error\")\n      .default(\"pcb_pad_trace_clearance_error\"),\n    pcb_pad_id: z.string(),\n    pcb_trace_id: z.string(),\n    minimum_clearance: distance.optional(),\n    actual_clearance: distance.optional(),\n    center: z\n      .object({\n        x: z.number().optional(),\n        y: z.number().optional(),\n      })\n      .optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\n    \"Error emitted when a pad and trace are closer than allowed clearance\",\n  )\n\nexport type PcbPadTraceClearanceErrorInput = z.input<\n  typeof pcb_pad_trace_clearance_error\n>\ntype InferredPcbPadTraceClearanceError = z.infer<\n  typeof pcb_pad_trace_clearance_error\n>\n\n/** Error emitted when a pad and trace are closer than allowed clearance */\nexport interface PcbPadTraceClearanceError extends BaseCircuitJsonError {\n  type: \"pcb_pad_trace_clearance_error\"\n  pcb_pad_trace_clearance_error_id: string\n  error_type: \"pcb_pad_trace_clearance_error\"\n  pcb_pad_id: string\n  pcb_trace_id: string\n  minimum_clearance?: Distance\n  actual_clearance?: Distance\n  center?: {\n    x?: number\n    y?: number\n  }\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<PcbPadTraceClearanceError, InferredPcbPadTraceClearanceError>(\n  true,\n)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length, rotation, type Rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_rect = z\n  .object({\n    type: z.literal(\"pcb_courtyard_rect\"),\n    pcb_courtyard_rect_id: getZodPrefixedIdWithDefault(\"pcb_courtyard_rect\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    layer: visible_layer,\n    ccw_rotation: rotation.optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a courtyard rectangle on the PCB\")\n\nexport type PcbCourtyardRectInput = z.input<typeof pcb_courtyard_rect>\ntype InferredPcbCourtyardRect = z.infer<typeof pcb_courtyard_rect>\n\n/**\n * Defines a courtyard rectangle on the PCB\n */\nexport interface PcbCourtyardRect {\n  type: \"pcb_courtyard_rect\"\n  pcb_courtyard_rect_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: Length\n  height: Length\n  layer: VisibleLayer\n  ccw_rotation?: Rotation\n  color?: string\n}\n\n/**\n * @deprecated use PcbCourtyardRect\n */\nexport type PCBCourtyardRect = PcbCourtyardRect\n\nexpectTypesMatch<PcbCourtyardRect, InferredPcbCourtyardRect>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_outline = z\n  .object({\n    type: z.literal(\"pcb_courtyard_outline\"),\n    pcb_courtyard_outline_id: getZodPrefixedIdWithDefault(\n      \"pcb_courtyard_outline\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    layer: visible_layer,\n    outline: z.array(point).min(2),\n  })\n  .describe(\"Defines a courtyard outline on the PCB\")\n\nexport type PcbCourtyardOutlineInput = z.input<typeof pcb_courtyard_outline>\ntype InferredPcbCourtyardOutline = z.infer<typeof pcb_courtyard_outline>\n\n/**\n * Defines a courtyard outline on the PCB\n */\nexport interface PcbCourtyardOutline {\n  type: \"pcb_courtyard_outline\"\n  pcb_courtyard_outline_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: VisibleLayer\n  outline: Point[]\n}\n\n/**\n * @deprecated use PcbCourtyardOutline\n */\nexport type PCBCourtyardOutline = PcbCourtyardOutline\n\nexpectTypesMatch<PcbCourtyardOutline, InferredPcbCourtyardOutline>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_polygon = z\n  .object({\n    type: z.literal(\"pcb_courtyard_polygon\"),\n    pcb_courtyard_polygon_id: getZodPrefixedIdWithDefault(\n      \"pcb_courtyard_polygon\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    layer: visible_layer,\n    points: z.array(point).min(3),\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a courtyard polygon on the PCB\")\n\nexport type PcbCourtyardPolygonInput = z.input<typeof pcb_courtyard_polygon>\ntype InferredPcbCourtyardPolygon = z.infer<typeof pcb_courtyard_polygon>\n\n/**\n * Defines a courtyard polygon on the PCB\n */\nexport interface PcbCourtyardPolygon {\n  type: \"pcb_courtyard_polygon\"\n  pcb_courtyard_polygon_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  layer: VisibleLayer\n  points: Point[]\n  color?: string\n}\n\n/**\n * @deprecated use PcbCourtyardPolygon\n */\nexport type PCBCourtyardPolygon = PcbCourtyardPolygon\n\nexpectTypesMatch<PcbCourtyardPolygon, InferredPcbCourtyardPolygon>(true)\n","import { z } from \"zod\"\nimport { point, type Point, getZodPrefixedIdWithDefault } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_circle = z\n  .object({\n    type: z.literal(\"pcb_courtyard_circle\"),\n    pcb_courtyard_circle_id: getZodPrefixedIdWithDefault(\n      \"pcb_courtyard_circle\",\n    ),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    radius: length,\n    layer: visible_layer,\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a courtyard circle on the PCB\")\n\nexport type PcbCourtyardCircleInput = z.input<typeof pcb_courtyard_circle>\ntype InferredPcbCourtyardCircle = z.infer<typeof pcb_courtyard_circle>\n\n/**\n * Defines a courtyard circle on the PCB\n */\nexport interface PcbCourtyardCircle {\n  type: \"pcb_courtyard_circle\"\n  pcb_courtyard_circle_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  radius: Length\n  layer: VisibleLayer\n  color?: string\n}\n\nexpectTypesMatch<PcbCourtyardCircle, InferredPcbCourtyardCircle>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault, point, type Point } from \"src/common\"\nimport { visible_layer, type VisibleLayer } from \"src/pcb/properties/layer_ref\"\nimport { length, type Length } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const pcb_courtyard_pill = z\n  .object({\n    type: z.literal(\"pcb_courtyard_pill\"),\n    pcb_courtyard_pill_id: getZodPrefixedIdWithDefault(\"pcb_courtyard_pill\"),\n    pcb_component_id: z.string(),\n    pcb_group_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    center: point,\n    width: length,\n    height: length,\n    radius: length,\n    layer: visible_layer,\n    color: z.string().optional(),\n  })\n  .describe(\"Defines a courtyard pill on the PCB\")\n\nexport type PcbCourtyardPillInput = z.input<typeof pcb_courtyard_pill>\ntype InferredPcbCourtyardPill = z.infer<typeof pcb_courtyard_pill>\n\n/**\n * Defines a courtyard pill on the PCB\n */\nexport interface PcbCourtyardPill {\n  type: \"pcb_courtyard_pill\"\n  pcb_courtyard_pill_id: string\n  pcb_component_id: string\n  pcb_group_id?: string\n  subcircuit_id?: string\n  center: Point\n  width: Length\n  height: Length\n  radius: Length\n  layer: VisibleLayer\n  color?: string\n}\n\nexpectTypesMatch<PcbCourtyardPill, InferredPcbCourtyardPill>(true)\n","import { z } from \"zod\"\nimport { point3, asset, type Point3, type Asset } from \"../common\"\nimport { rotation, length, type Rotation, type Length } from \"../units\"\nimport { layer_ref, type LayerRef } from \"src/pcb\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  cad_model_axis_directions,\n  type CadModelAxisDirection,\n} from \"./cad_model_conventions\"\n\nexport const cad_component = z\n  .object({\n    type: z.literal(\"cad_component\"),\n    cad_component_id: z.string(),\n    pcb_component_id: z.string(),\n    source_component_id: z.string(),\n    position: point3,\n    rotation: point3.optional(),\n    size: point3.optional(),\n    layer: layer_ref.optional(),\n    subcircuit_id: z.string().optional(),\n\n    // These are all ways to generate/load the 3d model\n    footprinter_string: z.string().optional(),\n    model_obj_url: z.string().optional(),\n    model_stl_url: z.string().optional(),\n    model_3mf_url: z.string().optional(),\n    model_gltf_url: z.string().optional(),\n    model_glb_url: z.string().optional(),\n    model_step_url: z.string().optional(),\n    model_wrl_url: z.string().optional(),\n    model_asset: asset.optional(),\n    model_unit_to_mm_scale_factor: z.number().optional(),\n    model_board_normal_direction: z\n      .enum(cad_model_axis_directions)\n      .optional()\n      .describe(\n        'The direction in the model\\'s coordinate space that is considered \"up\" or \"coming out of the board surface\"',\n      ),\n    model_origin_position: point3.optional(),\n    model_origin_alignment: z\n      .enum([\n        \"unknown\",\n        \"center\",\n        \"center_of_component_on_board_surface\",\n        \"bottom_center_of_component\",\n      ] as const)\n      .optional(),\n    model_object_fit: z\n      .enum([\"contain_within_bounds\", \"fill_bounds\"] as const)\n      .optional()\n      .default(\"contain_within_bounds\"),\n    model_jscad: z.any().optional(),\n    show_as_translucent_model: z.boolean().optional(),\n    show_as_bounding_box: z.boolean().optional(),\n    anchor_alignment: z\n      .enum([\"center\", \"center_of_component_on_board_surface\"] as const)\n      .optional()\n      .default(\"center\"),\n  })\n  .describe(\"Defines a component on the PCB\")\n\nexport type CadComponentInput = z.input<typeof cad_component>\ntype InferredCadComponent = z.infer<typeof cad_component>\n\nexport type CadComponentAnchorAlignment = NonNullable<\n  InferredCadComponent[\"anchor_alignment\"]\n>\n\nexport interface CadComponent {\n  type: \"cad_component\"\n  cad_component_id: string\n  pcb_component_id: string\n  source_component_id: string\n  position: Point3\n  rotation?: Point3\n  size?: Point3\n  layer?: LayerRef\n  subcircuit_id?: string\n  footprinter_string?: string\n  model_obj_url?: string\n  model_stl_url?: string\n  model_3mf_url?: string\n  model_gltf_url?: string\n  model_glb_url?: string\n  model_step_url?: string\n  model_wrl_url?: string\n  model_asset?: Asset\n  model_unit_to_mm_scale_factor?: number\n  model_board_normal_direction?: CadModelAxisDirection\n  model_origin_position?: Point3\n  model_origin_alignment?:\n    | \"unknown\"\n    | \"center\"\n    | \"center_of_component_on_board_surface\"\n    | \"bottom_center_of_component\"\n  model_object_fit: \"contain_within_bounds\" | \"fill_bounds\"\n  model_jscad?: any\n  show_as_translucent_model?: boolean\n  show_as_bounding_box?: boolean\n  anchor_alignment: CadComponentAnchorAlignment\n}\n\nexpectTypesMatch<CadComponent, InferredCadComponent>(true)\n","export const cad_model_formats = [\n  \"obj\",\n  \"stl\",\n  \"3mf\",\n  \"gltf\",\n  \"glb\",\n  \"step\",\n  \"wrl\",\n] as const\n\nexport const cad_model_axis_directions = [\n  \"x+\",\n  \"x-\",\n  \"y+\",\n  \"y-\",\n  \"z+\",\n  \"z-\",\n] as const\n\nexport type CadModelFormat = (typeof cad_model_formats)[number]\nexport type CadModelAxisDirection = (typeof cad_model_axis_directions)[number]\n\nexport const cadModelDefaultDirectionMap = {\n  obj: \"z+\",\n  stl: \"z+\",\n  \"3mf\": \"z+\",\n  gltf: \"y+\",\n  glb: \"y+\",\n  step: \"z+\",\n  wrl: \"y+\",\n} as const\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { frequency, ms, rotation, voltage } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const wave_shape = z.enum([\"sinewave\", \"square\", \"triangle\", \"sawtooth\"])\nexport type WaveShape = z.infer<typeof wave_shape>\n\nconst percentage = z\n  .union([z.string(), z.number()])\n  .transform((val) => {\n    if (typeof val === \"string\") {\n      if (val.endsWith(\"%\")) {\n        return parseFloat(val.slice(0, -1)) / 100\n      }\n      return parseFloat(val)\n    }\n    return val\n  })\n  .pipe(\n    z\n      .number()\n      .min(0, \"Duty cycle must be non-negative\")\n      .max(1, \"Duty cycle cannot be greater than 100%\"),\n  )\n\nexport const simulation_dc_voltage_source = z\n  .object({\n    type: z.literal(\"simulation_voltage_source\"),\n    simulation_voltage_source_id: getZodPrefixedIdWithDefault(\n      \"simulation_voltage_source\",\n    ),\n    is_dc_source: z.literal(true).optional().default(true),\n    positive_source_port_id: z.string().optional(),\n    negative_source_port_id: z.string().optional(),\n    positive_source_net_id: z.string().optional(),\n    negative_source_net_id: z.string().optional(),\n    voltage: voltage,\n  })\n  .describe(\"Defines a DC voltage source for simulation\")\n\nexport const simulation_ac_voltage_source = z\n  .object({\n    type: z.literal(\"simulation_voltage_source\"),\n    simulation_voltage_source_id: getZodPrefixedIdWithDefault(\n      \"simulation_voltage_source\",\n    ),\n    is_dc_source: z.literal(false),\n    terminal1_source_port_id: z.string().optional(),\n    terminal2_source_port_id: z.string().optional(),\n    terminal1_source_net_id: z.string().optional(),\n    terminal2_source_net_id: z.string().optional(),\n    voltage: voltage.optional(),\n    frequency: frequency.optional(),\n    peak_to_peak_voltage: voltage.optional(),\n    wave_shape: wave_shape.optional(),\n    phase: rotation.optional(),\n    duty_cycle: percentage.optional(),\n    pulse_delay: ms.optional(),\n    rise_time: ms.optional(),\n    fall_time: ms.optional(),\n    pulse_width: ms.optional(),\n    period: ms.optional(),\n  })\n  .describe(\"Defines an AC voltage source for simulation\")\n\nexport type SimulationAcVoltageSourceInput = z.input<\n  typeof simulation_ac_voltage_source\n>\n\nexport const simulation_voltage_source = z\n  .union([simulation_dc_voltage_source, simulation_ac_voltage_source])\n  .describe(\"Defines a voltage source for simulation\")\n\nexport type SimulationVoltageSourceInput = z.input<\n  typeof simulation_voltage_source\n>\ntype InferredSimulationVoltageSource = z.infer<typeof simulation_voltage_source>\n\n/**\n * Defines a DC voltage source for simulation purposes. It applies a voltage\n * difference between two source ports.\n */\nexport interface SimulationDcVoltageSource {\n  type: \"simulation_voltage_source\"\n  simulation_voltage_source_id: string\n  is_dc_source: true\n  positive_source_port_id?: string\n  positive_source_net_id?: string\n  negative_source_port_id?: string\n  negative_source_net_id?: string\n  voltage: number\n}\n\n/**\n * Defines an AC voltage source for simulation purposes.\n */\nexport interface SimulationAcVoltageSource {\n  type: \"simulation_voltage_source\"\n  simulation_voltage_source_id: string\n  is_dc_source: false\n  terminal1_source_port_id?: string\n  terminal2_source_port_id?: string\n  terminal1_source_net_id?: string\n  terminal2_source_net_id?: string\n  voltage?: number\n  frequency?: number\n  peak_to_peak_voltage?: number\n  wave_shape?: WaveShape\n  phase?: number\n  duty_cycle?: number\n  pulse_delay?: number // ms\n  rise_time?: number // ms\n  fall_time?: number // ms\n  pulse_width?: number // ms\n  period?: number // ms\n}\n\nexport type SimulationVoltageSource =\n  | SimulationDcVoltageSource\n  | SimulationAcVoltageSource\n\nexpectTypesMatch<\n  SimulationDcVoltageSource,\n  z.infer<typeof simulation_dc_voltage_source>\n>(true)\nexpectTypesMatch<\n  SimulationAcVoltageSource,\n  z.infer<typeof simulation_ac_voltage_source>\n>(true)\nexpectTypesMatch<SimulationVoltageSource, InferredSimulationVoltageSource>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { current, frequency, rotation } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport {\n  wave_shape,\n  type WaveShape,\n} from \"src/simulation/simulation_voltage_source\"\n\nconst percentage = z\n  .union([z.string(), z.number()])\n  .transform((val) => {\n    if (typeof val === \"string\") {\n      if (val.endsWith(\"%\")) {\n        return parseFloat(val.slice(0, -1)) / 100\n      }\n      return parseFloat(val)\n    }\n    return val\n  })\n  .pipe(\n    z\n      .number()\n      .min(0, \"Duty cycle must be non-negative\")\n      .max(1, \"Duty cycle cannot be greater than 100%\"),\n  )\n\nexport const simulation_dc_current_source = z\n  .object({\n    type: z.literal(\"simulation_current_source\"),\n    simulation_current_source_id: getZodPrefixedIdWithDefault(\n      \"simulation_current_source\",\n    ),\n    is_dc_source: z.literal(true).optional().default(true),\n    positive_source_port_id: z.string().optional(),\n    negative_source_port_id: z.string().optional(),\n    positive_source_net_id: z.string().optional(),\n    negative_source_net_id: z.string().optional(),\n    current: current,\n  })\n  .describe(\"Defines a DC current source for simulation\")\n\nexport const simulation_ac_current_source = z\n  .object({\n    type: z.literal(\"simulation_current_source\"),\n    simulation_current_source_id: getZodPrefixedIdWithDefault(\n      \"simulation_current_source\",\n    ),\n    is_dc_source: z.literal(false),\n    terminal1_source_port_id: z.string().optional(),\n    terminal2_source_port_id: z.string().optional(),\n    terminal1_source_net_id: z.string().optional(),\n    terminal2_source_net_id: z.string().optional(),\n    current: current.optional(),\n    frequency: frequency.optional(),\n    peak_to_peak_current: current.optional(),\n    wave_shape: wave_shape.optional(),\n    phase: rotation.optional(),\n    duty_cycle: percentage.optional(),\n  })\n  .describe(\"Defines an AC current source for simulation\")\n\nexport type SimulationAcCurrentSourceInput = z.input<\n  typeof simulation_ac_current_source\n>\n\nexport const simulation_current_source = z\n  .union([simulation_dc_current_source, simulation_ac_current_source])\n  .describe(\"Defines a current source for simulation\")\n\nexport type SimulationCurrentSourceInput = z.input<\n  typeof simulation_current_source\n>\ntype InferredSimulationCurrentSource = z.infer<typeof simulation_current_source>\n\n/**\n * Defines a DC current source for simulation purposes. It forces a current\n * between two source ports.\n */\nexport interface SimulationDcCurrentSource {\n  type: \"simulation_current_source\"\n  simulation_current_source_id: string\n  is_dc_source: true\n  positive_source_port_id?: string\n  positive_source_net_id?: string\n  negative_source_port_id?: string\n  negative_source_net_id?: string\n  current: number\n}\n\n/**\n * Defines an AC current source for simulation purposes.\n */\nexport interface SimulationAcCurrentSource {\n  type: \"simulation_current_source\"\n  simulation_current_source_id: string\n  is_dc_source: false\n  terminal1_source_port_id?: string\n  terminal2_source_port_id?: string\n  terminal1_source_net_id?: string\n  terminal2_source_net_id?: string\n  current?: number\n  frequency?: number\n  peak_to_peak_current?: number\n  wave_shape?: WaveShape\n  phase?: number\n  duty_cycle?: number\n}\n\nexport type SimulationCurrentSource =\n  | SimulationDcCurrentSource\n  | SimulationAcCurrentSource\n\nexpectTypesMatch<\n  SimulationDcCurrentSource,\n  z.infer<typeof simulation_dc_current_source>\n>(true)\nexpectTypesMatch<\n  SimulationAcCurrentSource,\n  z.infer<typeof simulation_ac_current_source>\n>(true)\nexpectTypesMatch<SimulationCurrentSource, InferredSimulationCurrentSource>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { duration_ms, ms } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const experiment_type = z.union([\n  z.literal(\"spice_dc_sweep\"),\n  z.literal(\"spice_dc_operating_point\"),\n  z.literal(\"spice_transient_analysis\"),\n  z.literal(\"spice_ac_analysis\"),\n])\n\nexport type ExperimentType = z.infer<typeof experiment_type>\n\nexport const spice_simulation_options = z\n  .object({\n    method: z.enum([\"trap\", \"gear\"]).optional(),\n    reltol: z.union([z.number(), z.string()]).optional(),\n    abstol: z.union([z.number(), z.string()]).optional(),\n    vntol: z.union([z.number(), z.string()]).optional(),\n  })\n  .describe(\"SPICE solver options for a simulation experiment\")\n\nexport interface SpiceSimulationOptions {\n  method?: \"trap\" | \"gear\"\n  reltol?: number | string\n  abstol?: number | string\n  vntol?: number | string\n}\n\nexport interface SimulationExperiment {\n  type: \"simulation_experiment\"\n  simulation_experiment_id: string\n  name: string\n  experiment_type: ExperimentType\n  time_per_step?: number // ms\n  start_time_ms?: number // ms\n  end_time_ms?: number // ms\n  spice_options?: SpiceSimulationOptions\n}\n\nexport const simulation_experiment = z\n  .object({\n    type: z.literal(\"simulation_experiment\"),\n    simulation_experiment_id: getZodPrefixedIdWithDefault(\n      \"simulation_experiment\",\n    ),\n    name: z.string(),\n    experiment_type,\n    time_per_step: duration_ms.optional(),\n    start_time_ms: ms.optional(),\n    end_time_ms: ms.optional(),\n    spice_options: spice_simulation_options.optional(),\n  })\n  .describe(\"Defines a simulation experiment configuration\")\n\nexport type SimulationExperimentInput = z.input<typeof simulation_experiment>\ntype InferredSimulationExperiment = z.infer<typeof simulation_experiment>\n\nexpectTypesMatch<SimulationExperiment, InferredSimulationExperiment>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { duration_ms, ms } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SimulationTransientVoltageGraph {\n  type: \"simulation_transient_voltage_graph\"\n  simulation_transient_voltage_graph_id: string\n  simulation_experiment_id: string\n  timestamps_ms?: number[]\n  voltage_levels: number[]\n  source_component_id?: string\n  subcircuit_connectivity_map_key?: string\n  time_per_step: number\n  start_time_ms: number\n  end_time_ms: number\n  name?: string\n  color?: string\n}\n\nexport const simulation_transient_voltage_graph = z\n  .object({\n    type: z.literal(\"simulation_transient_voltage_graph\"),\n    simulation_transient_voltage_graph_id: getZodPrefixedIdWithDefault(\n      \"simulation_transient_voltage_graph\",\n    ),\n    simulation_experiment_id: z.string(),\n    timestamps_ms: z.array(z.number()).optional(),\n    voltage_levels: z.array(z.number()),\n    source_component_id: z.string().optional(),\n    subcircuit_connectivity_map_key: z.string().optional(),\n    time_per_step: duration_ms,\n    start_time_ms: ms,\n    end_time_ms: ms,\n    name: z.string().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Stores voltage measurements over time for a simulation\")\n\nexport type SimulationTransientVoltageGraphInput = z.input<\n  typeof simulation_transient_voltage_graph\n>\ntype InferredSimulationTransientVoltageGraph = z.infer<\n  typeof simulation_transient_voltage_graph\n>\n\nexpectTypesMatch<\n  SimulationTransientVoltageGraph,\n  InferredSimulationTransientVoltageGraph\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { duration_ms, ms } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport interface SimulationTransientCurrentGraph {\n  type: \"simulation_transient_current_graph\"\n  simulation_transient_current_graph_id: string\n  simulation_experiment_id: string\n  timestamps_ms?: number[]\n  current_levels: number[]\n  source_component_id?: string\n  subcircuit_connectivity_map_key?: string\n  time_per_step: number\n  start_time_ms: number\n  end_time_ms: number\n  name?: string\n  color?: string\n}\n\nexport const simulation_transient_current_graph = z\n  .object({\n    type: z.literal(\"simulation_transient_current_graph\"),\n    simulation_transient_current_graph_id: getZodPrefixedIdWithDefault(\n      \"simulation_transient_current_graph\",\n    ),\n    simulation_experiment_id: z.string(),\n    timestamps_ms: z.array(z.number()).optional(),\n    current_levels: z.array(z.number()),\n    source_component_id: z.string().optional(),\n    subcircuit_connectivity_map_key: z.string().optional(),\n    time_per_step: duration_ms,\n    start_time_ms: ms,\n    end_time_ms: ms,\n    name: z.string().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\"Stores current measurements over time for a simulation\")\n\nexport type SimulationTransientCurrentGraphInput = z.input<\n  typeof simulation_transient_current_graph\n>\ntype InferredSimulationTransientCurrentGraph = z.infer<\n  typeof simulation_transient_current_graph\n>\n\nexpectTypesMatch<\n  SimulationTransientCurrentGraph,\n  InferredSimulationTransientCurrentGraph\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { frequency, ms } from \"src/units\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const simulation_switch = z\n  .object({\n    type: z.literal(\"simulation_switch\"),\n    simulation_switch_id: getZodPrefixedIdWithDefault(\"simulation_switch\"),\n    source_component_id: z.string().optional(),\n    closes_at: ms.optional(),\n    opens_at: ms.optional(),\n    starts_closed: z.boolean().optional(),\n    switching_frequency: frequency.optional(),\n  })\n  .describe(\"Defines a switch for simulation timing control\")\n\nexport type SimulationSwitchInput = z.input<typeof simulation_switch>\n\ntype InferredSimulationSwitch = z.infer<typeof simulation_switch>\n\nexport interface SimulationSwitch {\n  type: \"simulation_switch\"\n  simulation_switch_id: string\n  source_component_id?: string\n  closes_at?: number\n  opens_at?: number\n  starts_closed?: boolean\n  switching_frequency?: number\n}\n\nexpectTypesMatch<SimulationSwitch, InferredSimulationSwitch>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const simulation_voltage_probe = z\n  .object({\n    type: z.literal(\"simulation_voltage_probe\"),\n    simulation_voltage_probe_id: getZodPrefixedIdWithDefault(\n      \"simulation_voltage_probe\",\n    ),\n    source_component_id: z.string().optional(),\n    name: z.string().optional(),\n    signal_input_source_port_id: z.string().optional(),\n    signal_input_source_net_id: z.string().optional(),\n    reference_input_source_port_id: z.string().optional(),\n    reference_input_source_net_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\n    \"Defines a voltage probe for simulation. If a reference input is not provided, it measures against ground. If a reference input is provided, it measures the differential voltage between two points.\",\n  )\n  .superRefine((data, ctx) => {\n    const is_differential =\n      data.reference_input_source_port_id || data.reference_input_source_net_id\n\n    if (is_differential) {\n      const has_ports =\n        !!data.signal_input_source_port_id ||\n        !!data.reference_input_source_port_id\n      const has_nets =\n        !!data.signal_input_source_net_id ||\n        !!data.reference_input_source_net_id\n\n      if (has_ports && has_nets) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message:\n            \"Cannot mix port and net connections in a differential probe.\",\n        })\n      } else if (has_ports) {\n        if (\n          !data.signal_input_source_port_id ||\n          !data.reference_input_source_port_id\n        ) {\n          ctx.addIssue({\n            code: z.ZodIssueCode.custom,\n            message:\n              \"Differential port probe requires both signal_input_source_port_id and reference_input_source_port_id.\",\n          })\n        }\n      } else if (has_nets) {\n        if (\n          !data.signal_input_source_net_id ||\n          !data.reference_input_source_net_id\n        ) {\n          ctx.addIssue({\n            code: z.ZodIssueCode.custom,\n            message:\n              \"Differential net probe requires both signal_input_source_net_id and reference_input_source_net_id.\",\n          })\n        }\n      }\n    } else {\n      // Single-ended probe\n      if (\n        !!data.signal_input_source_port_id === !!data.signal_input_source_net_id\n      ) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message:\n            \"A voltage probe must have exactly one of signal_input_source_port_id or signal_input_source_net_id.\",\n        })\n      }\n    }\n  })\n\nexport type SimulationVoltageProbeInput = z.input<\n  typeof simulation_voltage_probe\n>\ntype InferredSimulationVoltageProbe = z.infer<typeof simulation_voltage_probe>\n\n/**\n * Defines a voltage probe for simulation. If a reference input is not provided,\n * it measures against ground. If a reference input is provided, it measures\n * the differential voltage between two points.\n */\nexport interface SimulationVoltageProbe {\n  type: \"simulation_voltage_probe\"\n  simulation_voltage_probe_id: string\n  source_component_id?: string\n  name?: string\n  signal_input_source_port_id?: string\n  signal_input_source_net_id?: string\n  reference_input_source_port_id?: string\n  reference_input_source_net_id?: string\n  subcircuit_id?: string\n  color?: string\n}\n\nexpectTypesMatch<SimulationVoltageProbe, InferredSimulationVoltageProbe>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const simulation_current_probe = z\n  .object({\n    type: z.literal(\"simulation_current_probe\"),\n    simulation_current_probe_id: getZodPrefixedIdWithDefault(\n      \"simulation_current_probe\",\n    ),\n    source_component_id: z.string().optional(),\n    name: z.string().optional(),\n    positive_source_port_id: z.string().optional(),\n    negative_source_port_id: z.string().optional(),\n    positive_source_net_id: z.string().optional(),\n    negative_source_net_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n    color: z.string().optional(),\n  })\n  .describe(\n    \"Defines a current probe for simulation. It measures current flowing from the positive endpoint to the negative endpoint.\",\n  )\n  .superRefine((data, ctx) => {\n    const hasPositivePort = !!data.positive_source_port_id\n    const hasNegativePort = !!data.negative_source_port_id\n    const hasPositiveNet = !!data.positive_source_net_id\n    const hasNegativeNet = !!data.negative_source_net_id\n    const hasPorts = hasPositivePort || hasNegativePort\n    const hasNets = hasPositiveNet || hasNegativeNet\n\n    if (hasPorts && hasNets) {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message: \"Cannot mix port and net connections in a current probe.\",\n      })\n      return\n    }\n\n    if (hasPorts) {\n      if (!hasPositivePort || !hasNegativePort) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message:\n            \"Current probe using source ports requires both positive_source_port_id and negative_source_port_id.\",\n        })\n      }\n      return\n    }\n\n    if (hasNets) {\n      if (!hasPositiveNet || !hasNegativeNet) {\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message:\n            \"Current probe using source nets requires both positive_source_net_id and negative_source_net_id.\",\n        })\n      }\n      return\n    }\n\n    ctx.addIssue({\n      code: z.ZodIssueCode.custom,\n      message:\n        \"A current probe must have either positive/negative source port ids or positive/negative source net ids.\",\n    })\n  })\n\nexport type SimulationCurrentProbeInput = z.input<\n  typeof simulation_current_probe\n>\ntype InferredSimulationCurrentProbe = z.infer<typeof simulation_current_probe>\n\n/**\n * Defines a current probe for simulation. It measures current flowing from the\n * positive endpoint to the negative endpoint.\n */\nexport interface SimulationCurrentProbe {\n  type: \"simulation_current_probe\"\n  simulation_current_probe_id: string\n  source_component_id?: string\n  name?: string\n  positive_source_port_id?: string\n  negative_source_port_id?: string\n  positive_source_net_id?: string\n  negative_source_net_id?: string\n  subcircuit_id?: string\n  color?: string\n}\n\nexpectTypesMatch<SimulationCurrentProbe, InferredSimulationCurrentProbe>(true)\n","import { z } from \"zod\"\nimport {\n  base_circuit_json_error,\n  type BaseCircuitJsonError,\n} from \"src/base_circuit_json_error\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const simulation_unknown_experiment_error = base_circuit_json_error\n  .extend({\n    type: z.literal(\"simulation_unknown_experiment_error\"),\n    simulation_unknown_experiment_error_id: getZodPrefixedIdWithDefault(\n      \"simulation_unknown_experiment_error\",\n    ),\n    error_type: z\n      .literal(\"simulation_unknown_experiment_error\")\n      .default(\"simulation_unknown_experiment_error\"),\n    simulation_experiment_id: z.string().optional(),\n    subcircuit_id: z.string().optional(),\n  })\n  .describe(\"An unknown error occurred during the simulation experiment.\")\n\nexport type SimulationUnknownExperimentErrorInput = z.input<\n  typeof simulation_unknown_experiment_error\n>\ntype InferredSimulationUnknownExperimentError = z.infer<\n  typeof simulation_unknown_experiment_error\n>\n\n/**\n * An unknown error occurred during the simulation experiment.\n */\nexport interface SimulationUnknownExperimentError extends BaseCircuitJsonError {\n  type: \"simulation_unknown_experiment_error\"\n  simulation_unknown_experiment_error_id: string\n  error_type: \"simulation_unknown_experiment_error\"\n  simulation_experiment_id?: string\n  subcircuit_id?: string\n}\n\nexpectTypesMatch<\n  SimulationUnknownExperimentError,\n  InferredSimulationUnknownExperimentError\n>(true)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nexport const simulation_op_amp = z\n  .object({\n    type: z.literal(\"simulation_op_amp\"),\n    simulation_op_amp_id: getZodPrefixedIdWithDefault(\"simulation_op_amp\"),\n    source_component_id: z.string().optional(),\n    inverting_input_source_port_id: z.string(),\n    non_inverting_input_source_port_id: z.string(),\n    output_source_port_id: z.string(),\n    positive_supply_source_port_id: z.string(),\n    negative_supply_source_port_id: z.string(),\n  })\n  .describe(\"Defines a simple ideal operational amplifier for simulation\")\n\nexport type SimulationOpAmpInput = z.input<typeof simulation_op_amp>\ntype InferredSimulationOpAmp = z.infer<typeof simulation_op_amp>\n\n/**\n * Defines a simple ideal operational amplifier for simulation.\n */\nexport interface SimulationOpAmp {\n  type: \"simulation_op_amp\"\n  simulation_op_amp_id: string\n  source_component_id?: string\n  inverting_input_source_port_id: string\n  non_inverting_input_source_port_id: string\n  output_source_port_id: string\n  positive_supply_source_port_id: string\n  negative_supply_source_port_id: string\n}\n\nexpectTypesMatch<SimulationOpAmp, InferredSimulationOpAmp>(true)\n","import { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\nimport { z } from \"zod\"\n\nexport const simulation_spice_subcircuit = z\n  .object({\n    type: z.literal(\"simulation_spice_subcircuit\"),\n    simulation_spice_subcircuit_id: getZodPrefixedIdWithDefault(\n      \"simulation_spice_subcircuit\",\n    ),\n    source_component_id: z.string(),\n    spice_pin_to_source_port_map: z.record(z.string(), z.string()),\n    subcircuit_source: z.string(),\n  })\n  .describe(\"Defines a custom SPICE subcircuit model for simulation\")\n\nexport type SimulationSpiceSubcircuitInput = z.input<\n  typeof simulation_spice_subcircuit\n>\ntype InferredSimulationSpiceSubcircuit = z.infer<\n  typeof simulation_spice_subcircuit\n>\n\n/**\n * Defines a custom SPICE subcircuit model for simulation.\n */\nexport interface SimulationSpiceSubcircuit {\n  type: \"simulation_spice_subcircuit\"\n  simulation_spice_subcircuit_id: string\n  /**\n   * Source component this SPICE subcircuit models.\n   */\n  source_component_id: string\n  /**\n   * Maps SPICE subcircuit pin names to source port ids.\n   */\n  spice_pin_to_source_port_map: Record<string, string>\n  /**\n   * Full SPICE subcircuit source text.\n   */\n  subcircuit_source: string\n}\n\nexpectTypesMatch<SimulationSpiceSubcircuit, InferredSimulationSpiceSubcircuit>(\n  true,\n)\n","import { z } from \"zod\"\nimport { getZodPrefixedIdWithDefault } from \"src/common\"\nimport { expectTypesMatch } from \"src/utils/expect-types-match\"\n\nconst hasValue = (value: unknown) => value !== undefined\n\nexport const simulation_oscilloscope_trace = z\n  .object({\n    type: z.literal(\"simulation_oscilloscope_trace\"),\n    simulation_oscilloscope_trace_id: getZodPrefixedIdWithDefault(\n      \"simulation_oscilloscope_trace\",\n    ),\n    simulation_transient_voltage_graph_id: z.string().optional(),\n    simulation_transient_current_graph_id: z.string().optional(),\n    simulation_voltage_probe_id: z.string().optional(),\n    simulation_current_probe_id: z.string().optional(),\n    display_name: z.string().optional(),\n    color: z.string().optional(),\n    display_center_value: z.number().optional(),\n    display_center_offset_divs: z.number().optional(),\n    volts_per_div: z.number().positive().optional(),\n    amps_per_div: z.number().positive().optional(),\n  })\n  .describe(\n    \"Defines how a simulation measurement is rendered as an oscilloscope-style trace.\",\n  )\n  .superRefine((data, ctx) => {\n    const voltageReferences = [\n      data.simulation_transient_voltage_graph_id,\n      data.simulation_voltage_probe_id,\n    ].filter(hasValue).length\n    const currentReferences = [\n      data.simulation_transient_current_graph_id,\n      data.simulation_current_probe_id,\n    ].filter(hasValue).length\n\n    if (voltageReferences + currentReferences !== 1) {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message:\n          \"An oscilloscope trace must reference exactly one voltage graph, current graph, voltage probe, or current probe.\",\n      })\n    }\n\n    if (voltageReferences > 0 && data.amps_per_div !== undefined) {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message:\n          \"Voltage oscilloscope traces must use volts_per_div, not amps_per_div.\",\n      })\n    }\n\n    if (currentReferences > 0 && data.volts_per_div !== undefined) {\n      ctx.addIssue({\n        code: z.ZodIssueCode.custom,\n        message:\n          \"Current oscilloscope traces must use amps_per_div, not volts_per_div.\",\n      })\n    }\n  })\n\nexport type SimulationOscilloscopeTraceInput = z.input<\n  typeof simulation_oscilloscope_trace\n>\ntype InferredSimulationOscilloscopeTrace = z.infer<\n  typeof simulation_oscilloscope_trace\n>\n\n/**\n * Defines how a simulation measurement is rendered as an oscilloscope-style\n * trace. Display fields live here because they describe the relationship\n * between measurement data and a graph, not the probe itself.\n *\n * Scope display fields map measured values into display divisions using\n * display_div = display_center_offset_divs + (raw_value - display_center_value) / units_per_div.\n * Use volts_per_div for voltage traces and amps_per_div for current traces.\n */\nexport interface SimulationOscilloscopeTrace {\n  type: \"simulation_oscilloscope_trace\"\n  simulation_oscilloscope_trace_id: string\n  simulation_transient_voltage_graph_id?: string\n  simulation_transient_current_graph_id?: string\n  simulation_voltage_probe_id?: string\n  simulation_current_probe_id?: string\n  display_name?: string\n  color?: string\n  display_center_value?: number\n  display_center_offset_divs?: number\n  volts_per_div?: number\n  amps_per_div?: number\n}\n\nexpectTypesMatch<\n  SimulationOscilloscopeTrace,\n  InferredSimulationOscilloscopeTrace\n>(true)\n","import { z } from \"zod\"\nimport * as cad from \"./cad\"\nimport * as pcb from \"./pcb\"\nimport * as sch from \"./schematic\"\nimport * as sim from \"./simulation\"\nimport * as src from \"./source\"\nimport {\n  expectStringUnionsMatch,\n  expectTypesMatch,\n} from \"./utils/expect-types-match\"\n\nexport const any_circuit_element = z.union([\n  // TODO source_config\n  // TODO pcb_config\n  // TODO schematic_config\n  // TODO schematic_group\n  src.source_trace,\n  src.source_port,\n  src.source_component_internal_connection,\n  src.any_source_component,\n  src.source_net,\n  src.source_group,\n  src.source_simple_chip,\n  src.source_simple_capacitor,\n  src.source_simple_diode,\n  src.source_simple_led,\n  src.source_simple_resistor,\n  src.source_simple_power_source,\n  src.source_simple_battery,\n  src.source_simple_inductor,\n  src.source_simple_pin_header,\n  src.source_simple_pinout,\n  src.source_simple_resonator,\n  src.source_simple_switch,\n  src.source_simple_transistor,\n  src.source_simple_test_point,\n  src.source_simple_mosfet,\n  src.source_simple_op_amp,\n  src.source_simple_potentiometer,\n  src.source_simple_push_button,\n  src.source_pcb_ground_plane,\n  src.source_manually_placed_via,\n  src.source_board,\n  src.source_project_metadata,\n  src.source_invalid_component_property_error,\n  src.source_trace_not_connected_error,\n  src.source_pin_missing_trace_warning,\n  src.source_unnamed_trace_warning,\n  src.source_missing_manufacturer_part_number_warning,\n  src.source_refdes_convention_warning,\n  src.source_no_power_pin_defined_warning,\n  src.source_no_ground_pin_defined_warning,\n  src.source_component_pins_underspecified_warning,\n  src.source_pin_must_be_connected_error,\n  src.unknown_error_finding_part,\n  src.source_part_not_found_warning,\n  src.source_i2c_misconfigured_error,\n  src.source_component_misconfigured_error,\n  src.source_ambiguous_port_reference,\n  pcb.pcb_component,\n  pcb.pcb_hole,\n  pcb.pcb_missing_footprint_error,\n  pcb.external_footprint_load_error,\n  pcb.circuit_json_footprint_load_error,\n  pcb.pcb_manual_edit_conflict_warning,\n  pcb.pcb_connector_not_in_accessible_orientation_warning,\n  pcb.supplier_footprint_mismatch_warning,\n  pcb.pcb_plated_hole,\n  pcb.pcb_keepout,\n  pcb.pcb_port,\n  pcb.pcb_net,\n  pcb.pcb_text,\n  pcb.pcb_trace,\n  pcb.pcb_trace_warning,\n  pcb.pcb_via,\n  pcb.pcb_smtpad,\n  pcb.pcb_solder_paste,\n  pcb.pcb_board,\n  pcb.pcb_panel,\n  pcb.pcb_group,\n  pcb.pcb_trace_hint,\n  pcb.pcb_silkscreen_line,\n  pcb.pcb_silkscreen_path,\n  pcb.pcb_silkscreen_text,\n  pcb.pcb_silkscreen_pill,\n  pcb.pcb_copper_text,\n  pcb.pcb_silkscreen_rect,\n  pcb.pcb_silkscreen_circle,\n  pcb.pcb_silkscreen_oval,\n  pcb.pcb_silkscreen_graphic,\n  pcb.pcb_trace_error,\n  pcb.pcb_trace_missing_error,\n  pcb.pcb_placement_error,\n  pcb.pcb_panelization_placement_error,\n  pcb.pcb_port_not_matched_error,\n  pcb.pcb_port_not_connected_error,\n  pcb.pcb_via_clearance_error,\n  pcb.pcb_via_trace_clearance_error,\n  pcb.pcb_pad_pad_clearance_error,\n  pcb.pcb_pad_trace_clearance_error,\n  pcb.pcb_fabrication_note_path,\n  pcb.pcb_fabrication_note_text,\n  pcb.pcb_fabrication_note_rect,\n  pcb.pcb_fabrication_note_dimension,\n  pcb.pcb_note_text,\n  pcb.pcb_note_rect,\n  pcb.pcb_note_path,\n  pcb.pcb_note_line,\n  pcb.pcb_note_dimension,\n  pcb.pcb_autorouting_error,\n  pcb.pcb_footprint_overlap_error,\n  pcb.pcb_courtyard_overlap_error,\n  pcb.pcb_breakout_point,\n  pcb.pcb_cutout,\n  pcb.pcb_ground_plane,\n  pcb.pcb_ground_plane_region,\n  pcb.pcb_thermal_spoke,\n  pcb.pcb_copper_pour,\n  pcb.pcb_component_outside_board_error,\n  pcb.pcb_component_not_on_board_edge_error,\n  pcb.pcb_component_invalid_layer_error,\n  pcb.pcb_courtyard_rect,\n  pcb.pcb_courtyard_outline,\n  pcb.pcb_courtyard_polygon,\n  pcb.pcb_courtyard_circle,\n  pcb.pcb_courtyard_pill,\n  sch.schematic_box,\n  sch.schematic_text,\n  sch.schematic_line,\n  sch.schematic_rect,\n  sch.schematic_circle,\n  sch.schematic_arc,\n  sch.schematic_component,\n  sch.schematic_symbol,\n  sch.schematic_port,\n  sch.schematic_trace,\n  sch.schematic_path,\n  sch.schematic_error,\n  sch.schematic_layout_error,\n  sch.schematic_net_label,\n  sch.schematic_debug_object,\n  sch.schematic_voltage_probe,\n  sch.schematic_manual_edit_conflict_warning,\n  sch.schematic_group,\n  sch.schematic_sheet,\n  sch.schematic_table,\n  sch.schematic_table_cell,\n  cad.cad_component,\n  sim.simulation_voltage_source,\n  sim.simulation_current_source,\n  sim.simulation_experiment,\n  sim.simulation_transient_voltage_graph,\n  sim.simulation_transient_current_graph,\n  sim.simulation_switch,\n  sim.simulation_voltage_probe,\n  sim.simulation_current_probe,\n  sim.simulation_oscilloscope_trace,\n  sim.simulation_unknown_experiment_error,\n  sim.simulation_op_amp,\n  sim.simulation_spice_subcircuit,\n])\n\n/**\n * @deprecated use any_circuit_element instead\n */\nexport const any_soup_element = any_circuit_element\n\nexport type AnyCircuitElement = z.infer<typeof any_circuit_element>\nexport type AnyCircuitElementInput = z.input<typeof any_circuit_element>\n/**\n * @deprecated use AnyCircuitElement instead\n */\nexport type AnySoupElement = AnyCircuitElement\n\n/**\n * @deprecated use AnyCircuitElementInput instead\n */\nexport type AnySoupElementInput = AnyCircuitElementInput\n\n/**\n * Type representing a complete Circuit JSON document, which is an array of circuit elements.\n * This is the primary type used when working with circuit-json files or API responses.\n */\nexport type CircuitJson = AnyCircuitElement[]\n\n// ------------------- SAFETY CHECKS -------------------\n\n// SAFETY CHECK: Every element has a type\nexpectTypesMatch<\n  AnyCircuitElement extends { type: string } ? AnyCircuitElement : never,\n  AnyCircuitElement\n>(true)\n\n// SAFETY CHECK: Every element has an id with the key name `${type}_id`\ntype FindMissingId<T extends AnyCircuitElement> = T extends {\n  type: infer U extends string\n}\n  ? T extends { [K in `${U}_id`]: infer V }\n    ? V extends string\n      ? never\n      : `${U} DOES NOT HAVE AN ${U}_id PROPERTY`\n    : `${U} DOES NOT HAVE AN ${U}_id PROPERTY`\n  : never\n\nexpectStringUnionsMatch<\n  FindMissingId<AnyCircuitElement>,\n  // EXCEPTIONS TO THE RULE\n  // THIS IS FOR LEGACY REASONS, DO NOT ADD MORE EXCEPTIONS\n  | \"source_project_metadata DOES NOT HAVE AN source_project_metadata_id PROPERTY\"\n  | \"pcb_port_not_matched_error DOES NOT HAVE AN pcb_port_not_matched_error_id PROPERTY\"\n  | \"pcb_autorouting_error DOES NOT HAVE AN pcb_autorouting_error_id PROPERTY\"\n  | \"pcb_footprint_overlap_error DOES NOT HAVE AN pcb_footprint_overlap_error_id PROPERTY\"\n  | \"pcb_courtyard_overlap_error DOES NOT HAVE AN pcb_courtyard_overlap_error_id PROPERTY\"\n  | \"pcb_via_clearance_error DOES NOT HAVE AN pcb_via_clearance_error_id PROPERTY\"\n  | \"schematic_debug_object DOES NOT HAVE AN schematic_debug_object_id PROPERTY\"\n  | \"schematic_box DOES NOT HAVE AN schematic_box_id PROPERTY\"\n>(true)\n","/**\n * Calculate a point transformed with an affine matrix\n * @param matrix {Matrix} Affine Matrix\n * @param  point {Point} Point\n * @returns {Point} Point\n */\nexport function applyToPoint (matrix, point) {\n  return Array.isArray(point)\n    ? [\n        matrix.a * point[0] + matrix.c * point[1] + matrix.e,\n        matrix.b * point[0] + matrix.d * point[1] + matrix.f\n      ]\n    : {\n        x: matrix.a * point.x + matrix.c * point.y + matrix.e,\n        y: matrix.b * point.x + matrix.d * point.y + matrix.f\n      }\n}\n\n/**\n * Calculate an array of points transformed with an affine matrix\n * @param matrix {Matrix} Affine Matrix\n * @param points {Point[]} Array of point\n * @returns {Point[]} Array of point\n */\nexport function applyToPoints (matrix, points) {\n  return points.map(point => applyToPoint(matrix, point))\n}\n","export function isUndefined (val) {\n  return typeof val === 'undefined'\n}\n\nexport function isNumeric (n) {\n  return typeof n === 'number' &&\n    !Number.isNaN(n) &&\n    Number.isFinite(n)\n}\n\nexport function isObject (obj) {\n  return typeof obj === 'object' &&\n    obj !== null &&\n    !Array.isArray(obj)\n}\n\nexport function matchesShape (obj, keys) {\n  return keys.every(key => key in obj)\n}\n","/**\n * Calculate a translate matrix\n * @param tx {number} Translation on axis x\n * @param [ty = 0] {number} Translation on axis y\n * @returns {Matrix} Affine Matrix\n */\nexport function translate (tx, ty = 0) {\n  return {\n    a: 1,\n    c: 0,\n    e: tx,\n    b: 0,\n    d: 1,\n    f: ty\n  }\n}\n","/**\n * Merge multiple matrices into one\n * @param matrices {...Matrix | Matrix[]} Matrices listed as separate parameters or in an array\n * @returns {Matrix} Affine Matrix\n */\nexport function transform (...matrices) {\n  matrices = Array.isArray(matrices[0]) ? matrices[0] : matrices\n\n  const multiply = (m1, m2) => {\n    return {\n      a: m1.a * m2.a + m1.c * m2.b,\n      c: m1.a * m2.c + m1.c * m2.d,\n      e: m1.a * m2.e + m1.c * m2.f + m1.e,\n      b: m1.b * m2.a + m1.d * m2.b,\n      d: m1.b * m2.c + m1.d * m2.d,\n      f: m1.b * m2.e + m1.d * m2.f + m1.f\n    }\n  }\n\n  switch (matrices.length) {\n    case 0:\n      throw new Error('no matrices provided')\n\n    case 1:\n      return matrices[0]\n\n    case 2:\n      return multiply(matrices[0], matrices[1])\n\n    default: {\n      const [m1, m2, ...rest] = matrices\n      const m = multiply(m1, m2)\n      return transform(m, ...rest)\n    }\n  }\n}\n\n/**\n * Merge multiple matrices into one\n * @param matrices {...Matrix | Matrix[]} Matrices listed as separate parameters or in an array\n * @returns {Matrix} Affine Matrix\n */\nexport function compose (...matrices) {\n  return transform(...matrices)\n}\n","import { isUndefined } from './utils'\nimport { translate } from './translate'\nimport { transform } from './transform'\n\nconst { cos, sin, PI } = Math\n/**\n * Calculate a rotation matrix\n * @param angle {number} Angle in radians\n * @param [cx] {number} If (cx,cy) are supplied the rotate is about this point\n * @param [cy] {number} If (cx,cy) are supplied the rotate is about this point\n * @returns {Matrix} Affine Matrix\n */\nexport function rotate (angle, cx, cy) {\n  const cosAngle = cos(angle)\n  const sinAngle = sin(angle)\n  const rotationMatrix = {\n    a: cosAngle,\n    c: -sinAngle,\n    e: 0,\n    b: sinAngle,\n    d: cosAngle,\n    f: 0\n  }\n  if (isUndefined(cx) || isUndefined(cy)) {\n    return rotationMatrix\n  }\n\n  return transform([\n    translate(cx, cy),\n    rotationMatrix,\n    translate(-cx, -cy)\n  ])\n}\n\n/**\n * Calculate a rotation matrix with a DEG angle\n * @param angle {number} Angle in degree\n * @param [cx] {number} If (cx,cy) are supplied the rotate is about this point\n * @param [cy] {number} If (cx,cy) are supplied the rotate is about this point\n * @returns {Matrix} Affine Matrix\n */\nexport function rotateDEG (angle, cx = undefined, cy = undefined) {\n  return rotate(angle * PI / 180, cx, cy)\n}\n","import { isUndefined } from './utils'\nimport { translate } from './translate'\nimport { transform } from './transform'\n\n/**\n * Calculate a scaling matrix\n * @param sx {number} Scaling on axis x\n * @param [sy = sx] {number} Scaling on axis y (default sx)\n * @param [cx] {number} If (cx,cy) are supplied the scaling is about this point\n * @param [cy] {number} If (cx,cy) are supplied the scaling is about this point\n * @returns {Matrix} Affine Matrix\n */\nexport function scale (sx, sy = undefined, cx = undefined, cy = undefined) {\n  if (isUndefined(sy)) sy = sx\n\n  const scaleMatrix = {\n    a: sx,\n    c: 0,\n    e: 0,\n    b: 0,\n    d: sy,\n    f: 0\n  }\n\n  if (isUndefined(cx) || isUndefined(cy)) {\n    return scaleMatrix\n  }\n\n  return transform([\n    translate(cx, cy),\n    scaleMatrix,\n    translate(-cx, -cy)\n  ])\n}\n","// https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/skew\nconst { tan } = Math\n\n/**\n * Calculate a skew matrix\n * @param ax {number} Skew on axis x\n * @param ay {number} Skew on axis y\n * @returns {Matrix} Affine Matrix\n */\nexport function skew (ax, ay) {\n  return {\n    a: 1,\n    c: tan(ax),\n    e: 0,\n    b: tan(ay),\n    d: 1,\n    f: 0\n  }\n}\n\n/**\n * Calculate a skew matrix using DEG angles\n * @param ax {number} Skew on axis x\n * @param ay {number} Skew on axis y\n * @returns {Matrix} Affine Matrix\n */\nexport function skewDEG (ax, ay) {\n  return skew(ax * Math.PI / 180, ay * Math.PI / 180)\n}\n","// Generated by Peggy 3.0.2.\n//\n// https://peggyjs.org/\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { transformList: peg$parsetransformList };\n  var peg$startRuleFunction = peg$parsetransformList;\n\n  var peg$c0 = \"matrix\";\n  var peg$c1 = \"(\";\n  var peg$c2 = \")\";\n  var peg$c3 = \"translate\";\n  var peg$c4 = \"scale\";\n  var peg$c5 = \"rotate\";\n  var peg$c6 = \"skewX\";\n  var peg$c7 = \"skewY\";\n  var peg$c8 = \",\";\n  var peg$c9 = \".\";\n\n  var peg$r0 = /^[eE]/;\n  var peg$r1 = /^[+\\-]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[ \\t\\r\\n]/;\n\n  var peg$e0 = peg$literalExpectation(\"matrix\", false);\n  var peg$e1 = peg$literalExpectation(\"(\", false);\n  var peg$e2 = peg$literalExpectation(\")\", false);\n  var peg$e3 = peg$literalExpectation(\"translate\", false);\n  var peg$e4 = peg$literalExpectation(\"scale\", false);\n  var peg$e5 = peg$literalExpectation(\"rotate\", false);\n  var peg$e6 = peg$literalExpectation(\"skewX\", false);\n  var peg$e7 = peg$literalExpectation(\"skewY\", false);\n  var peg$e8 = peg$literalExpectation(\",\", false);\n  var peg$e9 = peg$otherExpectation(\"fractionalConstant\");\n  var peg$e10 = peg$literalExpectation(\".\", false);\n  var peg$e11 = peg$classExpectation([\"e\", \"E\"], false, false);\n  var peg$e12 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e13 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e14 = peg$classExpectation([\" \", \"\\t\", \"\\r\", \"\\n\"], false, false);\n\n  var peg$f0 = function(ts) { return ts; };\n  var peg$f1 = function(t, ts) { return t.concat(ts) };\n  var peg$f2 = function(a, b, c, d, e, f) {\n      return [{type: 'matrix', a: a, b: b, c: c, d: d, e: e, f: f}];\n    };\n  var peg$f3 = function(tx, ty) {\n      var t = {type: 'translate', tx: tx};\n      if (ty) t.ty = ty;\n      return [t];\n    };\n  var peg$f4 = function(sx, sy) {\n      var s = {type:'scale', sx: sx};\n      if (sy) s.sy = sy;\n      return [s];\n    };\n  var peg$f5 = function(angle, c) {\n      var r = {type:'rotate', angle: angle};\n      if (c) {\n        r.cx = c[0];\n        r.cy = c[1];\n      }\n      return [r];\n    };\n  var peg$f6 = function(angle) {\n      return [{type: 'skewX', angle: angle}];\n    };\n  var peg$f7 = function(angle) {\n      return [{type: 'skewY', angle: angle}];\n    };\n  var peg$f8 = function(f) { return parseFloat(f.join(\"\")); };\n  var peg$f9 = function(i) { return parseInt(i.join(\"\")); };\n  var peg$f10 = function(n) { return n; };\n  var peg$f11 = function(n1, n2) { return [n1, n2]; };\n  var peg$f12 = function(ds) { return ds.join(\"\"); };\n  var peg$f13 = function(f, e) { return [f, e || null].join(\"\")};\n  var peg$f14 = function(d, e) { return [d, e].join(\"\")};\n  var peg$f15 = function(d1, d2) { return [d1 ? d1.join(\"\") : null, \".\", d2.join(\"\")].join(\"\"); };\n  var peg$f16 = function(d) { return d.join(\"\"); };\n  var peg$f17 = function(s, d) { return ['e', s, d.join(\"\")].join(\"\") };\n  var peg$currPos = 0;\n  var peg$savedPos = 0;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = 0;\n  var peg$maxFailExpected = [];\n  var peg$silentFails = 0;\n\n  var peg$result;\n\n  if (\"startRule\" in options) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      p = pos - 1;\n      while (!peg$posDetailsCache[p]) {\n        p--;\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parsetransformList() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parsewsp();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parsewsp();\n    }\n    s2 = peg$parsetransforms();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = [];\n    s4 = peg$parsewsp();\n    while (s4 !== peg$FAILED) {\n      s3.push(s4);\n      s4 = peg$parsewsp();\n    }\n    peg$savedPos = s0;\n    s0 = peg$f0(s2);\n\n    return s0;\n  }\n\n  function peg$parsetransforms() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parsetransform();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsecommaWsp();\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsecommaWsp();\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parsetransforms();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f1(s1, s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parsetransform();\n    }\n\n    return s0;\n  }\n\n  function peg$parsetransform() {\n    var s0;\n\n    s0 = peg$parsematrix();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parsetranslate();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsescale();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parserotate();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseskewX();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseskewY();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsematrix() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsecommaWsp();\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parsenumber();\n            if (s7 !== peg$FAILED) {\n              s8 = peg$parsecommaWsp();\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsenumber();\n                if (s9 !== peg$FAILED) {\n                  s10 = peg$parsecommaWsp();\n                  if (s10 !== peg$FAILED) {\n                    s11 = peg$parsenumber();\n                    if (s11 !== peg$FAILED) {\n                      s12 = peg$parsecommaWsp();\n                      if (s12 !== peg$FAILED) {\n                        s13 = peg$parsenumber();\n                        if (s13 !== peg$FAILED) {\n                          s14 = peg$parsecommaWsp();\n                          if (s14 !== peg$FAILED) {\n                            s15 = peg$parsenumber();\n                            if (s15 !== peg$FAILED) {\n                              s16 = [];\n                              s17 = peg$parsewsp();\n                              while (s17 !== peg$FAILED) {\n                                s16.push(s17);\n                                s17 = peg$parsewsp();\n                              }\n                              if (input.charCodeAt(peg$currPos) === 41) {\n                                s17 = peg$c2;\n                                peg$currPos++;\n                              } else {\n                                s17 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                              }\n                              if (s17 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s0 = peg$f2(s5, s7, s9, s11, s13, s15);\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsetranslate() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 9) === peg$c3) {\n      s1 = peg$c3;\n      peg$currPos += 9;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsecommaWspNumber();\n          if (s6 === peg$FAILED) {\n            s6 = null;\n          }\n          s7 = [];\n          s8 = peg$parsewsp();\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$parsewsp();\n          }\n          if (input.charCodeAt(peg$currPos) === 41) {\n            s8 = peg$c2;\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s5, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsescale() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c4) {\n      s1 = peg$c4;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsecommaWspNumber();\n          if (s6 === peg$FAILED) {\n            s6 = null;\n          }\n          s7 = [];\n          s8 = peg$parsewsp();\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$parsewsp();\n          }\n          if (input.charCodeAt(peg$currPos) === 41) {\n            s8 = peg$c2;\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s5, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parserotate() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c5) {\n      s1 = peg$c5;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsecommaWspTwoNumbers();\n          if (s6 === peg$FAILED) {\n            s6 = null;\n          }\n          s7 = [];\n          s8 = peg$parsewsp();\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$parsewsp();\n          }\n          if (input.charCodeAt(peg$currPos) === 41) {\n            s8 = peg$c2;\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s5, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseskewX() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = peg$parsewsp();\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$parsewsp();\n          }\n          if (input.charCodeAt(peg$currPos) === 41) {\n            s7 = peg$c2;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseskewY() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c7) {\n      s1 = peg$c7;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parsewsp();\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$parsewsp();\n      }\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parsewsp();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsewsp();\n        }\n        s5 = peg$parsenumber();\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = peg$parsewsp();\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$parsewsp();\n          }\n          if (input.charCodeAt(peg$currPos) === 41) {\n            s7 = peg$c2;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f7(s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsenumber() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parsesign();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parsefloatingPointConstant();\n    if (s3 !== peg$FAILED) {\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f8(s1);\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parsesign();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parseintegerConstant();\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f9(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parsecommaWspNumber() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parsecommaWsp();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parsenumber();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsecommaWspTwoNumbers() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parsecommaWsp();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parsenumber();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parsecommaWsp();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parsenumber();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f11(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsecommaWsp() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parsewsp();\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parsewsp();\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parsecomma();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = [];\n      s4 = peg$parsewsp();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parsewsp();\n      }\n      s1 = [s1, s2, s3];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parsecomma();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parsewsp();\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parsewsp();\n        }\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsecomma() {\n    var s0;\n\n    if (input.charCodeAt(peg$currPos) === 44) {\n      s0 = peg$c8;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseintegerConstant() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parsedigitSequence();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f12(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsefloatingPointConstant() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parsefractionalConstant();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseexponent();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f13(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parsedigitSequence();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseexponent();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f14(s1, s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsefractionalConstant() {\n    var s0, s1, s2, s3;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parsedigitSequence();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 46) {\n      s2 = peg$c9;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parsedigitSequence();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f15(s1, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parsedigitSequence();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 46) {\n          s2 = peg$c9;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f16(s1);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseexponent() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (peg$r0.test(input.charAt(peg$currPos))) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parsesign();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parsedigitSequence();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f17(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsesign() {\n    var s0;\n\n    if (peg$r1.test(input.charAt(peg$currPos))) {\n      s0 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n\n    return s0;\n  }\n\n  function peg$parsedigitSequence() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = peg$parsedigit();\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = peg$parsedigit();\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsedigit() {\n    var s0;\n\n    if (peg$r2.test(input.charAt(peg$currPos))) {\n      s0 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n\n    return s0;\n  }\n\n  function peg$parsewsp() {\n    var s0;\n\n    if (peg$r3.test(input.charAt(peg$currPos))) {\n      s0 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nexport {\n  peg$SyntaxError as SyntaxError,\n\n  peg$parse as parse\n};\n","import { scale } from './scale'\nimport { compose } from './transform'\n/**\n * Decompose a matrix into translation, scaling and rotation components, optionally\n * take horizontal and vertical flip in to consideration.\n * Note this function decomposes a matrix in rotation -> scaling -> translation order. I.e. for\n * certain translation T {tx, ty}, rotation R and scaling S { sx, sy }, it's only true for:\n *  decomposeTSR(compose(T, S, R)) === { translate: T, rotation: R, scale: S }\n * composing in a different order may yield a different decomposition result.\n * @param matrix {Matrix} Affine Matrix\n * @param  flipX {boolean} Whether the matrix contains vertical flip, i.e. mirrors on x-axis\n * @param  flipY {boolean} Whether the matrix contains horizontal flip, i.e. mirrors on y-axis\n * @returns {Transform} A transform object consisted by its translation, scaling\n * and rotation components.\n */\nexport function decomposeTSR (matrix, flipX = false, flipY = false) {\n  // Remove flip from the matrix first - flip could be incorrectly interpreted as\n  // rotations (e.g. flipX + flipY = rotate by 180 degrees).\n  // Note flipX is a vertical flip, and flipY is a horizontal flip.\n  if (flipX) {\n    if (flipY) {\n      matrix = compose(matrix, scale(-1, -1))\n    } else {\n      matrix = compose(matrix, scale(1, -1))\n    }\n  } else if (flipY) {\n    matrix = compose(matrix, scale(-1, 1))\n  }\n\n  const a = matrix.a; const b = matrix.b\n  const c = matrix.c; const d = matrix.d\n  let scaleX, scaleY, rotation\n\n  if (a !== 0 || c !== 0) {\n    const hypotAc = Math.hypot(a, c)\n    scaleX = hypotAc\n    scaleY = (a * d - b * c) / hypotAc\n    const acos = Math.acos(a / hypotAc)\n    rotation = c > 0 ? -acos : acos\n  } else if (b !== 0 || d !== 0) {\n    const hypotBd = Math.hypot(b, d)\n    scaleX = (a * d - b * c) / hypotBd\n    scaleY = hypotBd\n    const acos = Math.acos(b / hypotBd)\n    rotation = Math.PI / 2 + (d > 0 ? -acos : acos)\n  } else {\n    scaleX = 0\n    scaleY = 0\n    rotation = 0\n  }\n\n  // put the flip factors back\n  if (flipY) {\n    scaleX = -scaleX\n  }\n\n  if (flipX) {\n    scaleY = -scaleY\n  }\n\n  return {\n    translate: { tx: matrix.e, ty: matrix.f },\n    scale: { sx: scaleX, sy: scaleY },\n    rotation: { angle: rotation }\n  }\n}\n","import type {\n  AnyCircuitElement,\n  AnyCircuitElementInput,\n  SourceComponentBase,\n  SourcePort,\n} from \"circuit-json\"\nimport * as Soup from \"circuit-json\"\nimport type { SubtreeOptions } from \"./subtree\"\nimport { buildSubtree } from \"./subtree\"\n\nexport type CircuitJsonOps<\n  K extends AnyCircuitElement[\"type\"],\n  T extends AnyCircuitElement | AnyCircuitElementInput,\n> = {\n  get: (id: string) => Extract<T, { type: K }> | null\n  select: (selector: string) => Extract<T, { type: K }> | null\n  getWhere: (where: any) => Extract<T, { type: K }> | null\n  getUsing: (using: {\n    [key: `${string}_id`]: string\n  }) => Extract<T, { type: K }> | null\n  insert: (\n    elm: Omit<Extract<T, { type: K }>, \"type\" | `${K}_id`>,\n  ) => Extract<T, { type: K }>\n  update: (\n    id: string,\n    newProps: Partial<Extract<T, { type: K }>>,\n  ) => Extract<T, { type: K }>\n  delete: (id: string) => void\n  list: (where?: any) => Extract<T, { type: K }>[]\n}\n\nexport type CircuitJsonUtilObjects = {\n  [K in AnyCircuitElement[\"type\"]]: CircuitJsonOps<K, AnyCircuitElement>\n} & {\n  insert: (elm: AnyCircuitElementInput) => AnyCircuitElement\n  insertAll: (elms: AnyCircuitElementInput[]) => AnyCircuitElement[]\n  subtree: (where?: any) => CircuitJsonUtilObjects\n  toArray: () => AnyCircuitElement[]\n  editCount: number\n}\nexport type CircuitJsonInputUtilObjects = {\n  [K in AnyCircuitElementInput[\"type\"]]: CircuitJsonOps<\n    K,\n    AnyCircuitElementInput\n  >\n}\n\nexport type CircuitJsonUtilOptions = {\n  validateInserts?: boolean\n}\n\nexport type GetCircuitJsonUtilFn = ((\n  soup: AnyCircuitElement[],\n  options?: CircuitJsonUtilOptions,\n) => CircuitJsonUtilObjects) & {\n  unparsed: (soup: AnyCircuitElementInput[]) => CircuitJsonInputUtilObjects\n}\n\ninterface InternalStore {\n  counts: Record<string, number>\n  editCount: number\n}\n\nexport const cju: GetCircuitJsonUtilFn = ((\n  circuitJsonInput: any[],\n  options: CircuitJsonUtilOptions = {},\n) => {\n  const circuitJson = circuitJsonInput as AnyCircuitElement[]\n  let internalStore: InternalStore = (circuitJson as any)._internal_store\n  if (!internalStore) {\n    internalStore = {\n      counts: {},\n      editCount: 0,\n    } as InternalStore\n    ;(circuitJson as any)._internal_store = internalStore\n\n    // Initialize counts\n    for (const elm of circuitJson) {\n      const type = elm.type\n      const idVal = (elm as any)[`${type}_id`]\n      if (!idVal) continue\n      const idNum = Number.parseInt(idVal.split(\"_\").pop())\n      if (!Number.isNaN(idNum)) {\n        internalStore.counts[type] = Math.max(\n          internalStore.counts[type] ?? 0,\n          idNum,\n        )\n      }\n    }\n  }\n  const su = new Proxy(\n    {},\n    {\n      get: (proxy_target: any, prop: string) => {\n        if (prop === \"toArray\") {\n          return () => {\n            ;(circuitJson as any).editCount = internalStore.editCount\n            return circuitJson\n          }\n        }\n        if (prop === \"editCount\") {\n          return internalStore.editCount\n        }\n\n        if (prop === \"subtree\") {\n          return (opts: SubtreeOptions) =>\n            cju(buildSubtree(circuitJson, opts), options)\n        }\n\n        if (prop === \"insert\") {\n          return (elm: AnyCircuitElementInput) => {\n            const component_type = elm.type\n            if (!component_type) {\n              throw new Error(\"insert requires an element with a type\")\n            }\n\n            internalStore.counts[component_type] ??= -1\n            internalStore.counts[component_type]++\n            const index = internalStore.counts[component_type]\n\n            const newElm = {\n              ...elm,\n              type: component_type,\n              [`${component_type}_id`]: `${component_type}_${index}`,\n            } as AnyCircuitElement\n\n            if (options.validateInserts) {\n              const parser =\n                (Soup as any)[component_type] ?? Soup.any_soup_element\n              parser.parse(newElm)\n            }\n\n            circuitJson.push(newElm)\n            internalStore.editCount++\n            return newElm\n          }\n        }\n\n        if (prop === \"insertAll\") {\n          return (elms: AnyCircuitElementInput[]) => {\n            return elms.map((elm) => su.insert(elm))\n          }\n        }\n\n        const component_type = prop\n\n        return {\n          get: (id: string) =>\n            circuitJson.find(\n              (e: any) =>\n                e.type === component_type && e[`${component_type}_id`] === id,\n            ),\n          getUsing: (using: any) => {\n            const keys = Object.keys(using)\n            if (keys.length !== 1) {\n              throw new Error(\n                \"getUsing requires exactly one key, e.g. { pcb_component_id }\",\n              )\n            }\n            const join_key = keys[0] as string\n            const join_type = join_key.replace(\"_id\", \"\")\n            const joiner: any = circuitJson.find(\n              (e: any) =>\n                e.type === join_type && e[join_key] === using[join_key],\n            )\n            if (!joiner) return null\n            return circuitJson.find(\n              (e: any) =>\n                e.type === component_type &&\n                e[`${component_type}_id`] === joiner[`${component_type}_id`],\n            )\n          },\n          getWhere: (where: any) => {\n            const keys = Object.keys(where)\n            return circuitJson.find(\n              (e: any) =>\n                e.type === component_type &&\n                keys.every((key) => e[key] === where[key]),\n            )\n          },\n          list: (where?: any) => {\n            const keys = !where ? [] : Object.keys(where)\n            return circuitJson.filter(\n              (e: any) =>\n                e.type === component_type &&\n                keys.every((key) => e[key] === where[key]),\n            )\n          },\n          insert: (elm: any) => {\n            internalStore.counts[component_type] ??= -1\n            internalStore.counts[component_type]++\n            const index = internalStore.counts[component_type]\n            const newElm = {\n              type: component_type,\n              [`${component_type}_id`]: `${component_type}_${index}`,\n              ...elm,\n            }\n\n            if (options.validateInserts) {\n              const parser =\n                (Soup as any)[component_type] ?? Soup.any_soup_element\n              parser.parse(newElm)\n            }\n\n            circuitJson.push(newElm)\n            internalStore.editCount++\n            return newElm\n          },\n          delete: (id: string) => {\n            const elm = circuitJson.find(\n              (e) => (e as any)[`${component_type}_id`] === id,\n            )\n            if (!elm) return\n            circuitJson.splice(circuitJson.indexOf(elm), 1)\n            internalStore.editCount++\n          },\n          update: (id: string, newProps: any) => {\n            const elm = circuitJson.find(\n              (e) =>\n                e.type === component_type &&\n                (e as any)[`${component_type}_id`] === id,\n            )\n            if (!elm) return null\n            Object.assign(elm, newProps)\n            internalStore.editCount++\n            return elm\n          },\n          select: (selector: string) => {\n            // TODO when applySelector is isolated we can use it, until then we\n            // do a poor man's selector implementation for two common cases\n            if (component_type === \"source_component\") {\n              return circuitJson.find(\n                (e) =>\n                  e.type === \"source_component\" &&\n                  e.name === selector.replace(/\\./g, \"\"),\n              )\n            } else if (\n              component_type === \"pcb_port\" ||\n              component_type === \"source_port\" ||\n              component_type === \"schematic_port\"\n            ) {\n              const [component_name, port_selector] = selector\n                .replace(/\\./g, \"\")\n                .split(/[\\s\\>]+/)\n              const source_component = circuitJson.find(\n                (e) =>\n                  e.type === \"source_component\" && e.name === component_name,\n              ) as SourceComponentBase\n              if (!source_component) return null\n              const source_port = circuitJson.find(\n                (e) =>\n                  e.type === \"source_port\" &&\n                  e.source_component_id ===\n                    source_component.source_component_id &&\n                  (e.name === port_selector ||\n                    (e.port_hints ?? []).includes(port_selector!)),\n              ) as SourcePort\n              if (!source_port) return null\n              if (component_type === \"source_port\") return source_port\n\n              if (component_type === \"pcb_port\") {\n                return circuitJson.find(\n                  (e) =>\n                    e.type === \"pcb_port\" &&\n                    e.source_port_id === source_port.source_port_id,\n                )\n              } else if (component_type === \"schematic_port\") {\n                return circuitJson.find(\n                  (e) =>\n                    e.type === \"schematic_port\" &&\n                    e.source_port_id === source_port.source_port_id,\n                )\n              }\n            }\n          },\n        }\n      },\n    },\n  )\n\n  return su\n}) as any\ncju.unparsed = cju as any\n\nexport const su = cju\n\nexport default cju\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport type SubtreeOptions = {\n  subcircuit_id?: string\n  subcircuit_ids?: string[]\n  source_group_id?: string\n  source_board_id?: string\n}\n\nfunction connect(\n  map: Map<AnyCircuitElement, Set<AnyCircuitElement>>,\n  a: AnyCircuitElement | undefined,\n  b: AnyCircuitElement | undefined,\n) {\n  if (!a || !b) return\n  let setA = map.get(a)\n  if (!setA) {\n    setA = new Set()\n    map.set(a, setA)\n  }\n  setA.add(b)\n  let setB = map.get(b)\n  if (!setB) {\n    setB = new Set()\n    map.set(b, setB)\n  }\n  setB.add(a)\n}\n\nexport function buildSubtree(\n  soup: AnyCircuitElement[],\n  opts: SubtreeOptions,\n): AnyCircuitElement[] {\n  if (!opts.subcircuit_id && !opts.source_group_id) return [...soup]\n\n  // For subcircuit_id, also include nested subcircuits\n  let effectiveOpts = opts\n  if (opts.subcircuit_id) {\n    // Find all subcircuit_ids that are children of the target subcircuit\n    const subcircuitIds = new Set<string>([opts.subcircuit_id])\n\n    // Build group hierarchy\n    const groupChildren = new Map<string, string[]>()\n    const groupSubcircuit = new Map<string, string>()\n\n    for (const elm of soup) {\n      if (elm.type === \"source_group\") {\n        const groupId = elm.source_group_id\n        const subcircuitId = elm.subcircuit_id\n        if (subcircuitId) {\n          groupSubcircuit.set(groupId, subcircuitId)\n        }\n        const parentId = elm.parent_source_group_id\n        if (parentId) {\n          if (!groupChildren.has(parentId)) {\n            groupChildren.set(parentId, [])\n          }\n          groupChildren.get(parentId)!.push(groupId)\n        }\n      }\n    }\n\n    // Find the root group for the target subcircuit\n    let rootGroupId: string | undefined\n    for (const [groupId, subcircuitId] of groupSubcircuit) {\n      if (subcircuitId === opts.subcircuit_id) {\n        rootGroupId = groupId\n        break\n      }\n    }\n\n    if (rootGroupId) {\n      // Recursively collect all child subcircuit_ids\n      const collectChildSubcircuits = (groupId: string) => {\n        const children = groupChildren.get(groupId) || []\n        for (const childId of children) {\n          const childSubcircuit = groupSubcircuit.get(childId)\n          if (childSubcircuit) {\n            subcircuitIds.add(childSubcircuit)\n          }\n          collectChildSubcircuits(childId)\n        }\n      }\n      collectChildSubcircuits(rootGroupId)\n\n      // Update opts to include all these subcircuits\n      effectiveOpts = { ...opts, subcircuit_ids: Array.from(subcircuitIds) }\n    }\n  }\n\n  const idMap = new Map<string, AnyCircuitElement>()\n  for (const elm of soup) {\n    const idKey = `${elm.type}_id` as keyof typeof elm\n    const idVal = elm[idKey]\n    if (typeof idVal === \"string\") {\n      idMap.set(idVal, elm)\n    }\n  }\n\n  const adj = new Map<AnyCircuitElement, Set<AnyCircuitElement>>()\n  for (const elm of soup) {\n    const entries = Object.entries(elm)\n    for (const [key, val] of entries) {\n      if (key === \"parent_source_group_id\") continue // Skip parent relationships to avoid traversing up\n      if (key.endsWith(\"_id\") && typeof val === \"string\") {\n        const other = idMap.get(val)\n        connect(adj, elm, other)\n      } else if (key.endsWith(\"_ids\") && Array.isArray(val)) {\n        for (const v of val) {\n          if (typeof v === \"string\") {\n            const other = idMap.get(v)\n            connect(adj, elm, other)\n          }\n        }\n      }\n    }\n  }\n\n  const queue: AnyCircuitElement[] = []\n  const included = new Set<AnyCircuitElement>()\n\n  for (const elm of soup) {\n    let shouldInclude = false\n    if (\n      effectiveOpts.subcircuit_id &&\n      \"subcircuit_id\" in elm &&\n      elm.subcircuit_id === effectiveOpts.subcircuit_id\n    ) {\n      shouldInclude = true\n    } else if (\n      effectiveOpts.subcircuit_ids &&\n      \"subcircuit_id\" in elm &&\n      elm.subcircuit_id &&\n      effectiveOpts.subcircuit_ids.includes(elm.subcircuit_id)\n    ) {\n      shouldInclude = true\n    } else if (\n      effectiveOpts.source_group_id &&\n      \"source_group_id\" in elm &&\n      elm.source_group_id === effectiveOpts.source_group_id\n    ) {\n      shouldInclude = true\n    } else if (\n      effectiveOpts.source_group_id &&\n      \"member_source_group_ids\" in elm &&\n      Array.isArray(elm.member_source_group_ids) &&\n      elm.member_source_group_ids.includes(effectiveOpts.source_group_id)\n    ) {\n      shouldInclude = true\n    }\n\n    if (shouldInclude) {\n      queue.push(elm)\n      included.add(elm)\n    }\n  }\n\n  while (queue.length > 0) {\n    const elm = queue.shift()!\n    const neighbors = adj.get(elm)\n    if (!neighbors) continue\n    for (const n of neighbors) {\n      if (!included.has(n)) {\n        included.add(n)\n        queue.push(n)\n      }\n    }\n  }\n\n  return soup.filter((e) => included.has(e))\n}\n","import type {\n  AnyCircuitElement,\n  AnyCircuitElementInput,\n  SourceComponentBase,\n  SourcePort,\n} from \"circuit-json\"\nimport * as Soup from \"circuit-json\"\nimport type {\n  CircuitJsonOps,\n  CircuitJsonUtilObjects as CircuitJsonUtilObjects,\n  CircuitJsonInputUtilObjects as CircuitJsonInputUtilObjects,\n} from \"./cju\"\n\nexport type IndexedCircuitJsonUtilOptions = {\n  validateInserts?: boolean\n  indexConfig?: {\n    // Enable specific indexes for faster lookups\n    byId?: boolean\n    byType?: boolean\n    byRelation?: boolean\n    bySubcircuit?: boolean\n    byCustomField?: string[]\n  }\n}\n\nexport type GetIndexedCircuitJsonUtilFn = ((\n  soup: AnyCircuitElement[],\n  options?: IndexedCircuitJsonUtilOptions,\n) => CircuitJsonUtilObjects) & {\n  unparsed: (soup: AnyCircuitElementInput[]) => CircuitJsonInputUtilObjects\n}\n\ninterface InternalStore {\n  counts: Record<string, number>\n  editCount: number\n  // Indexes for faster lookups\n  indexes: {\n    byId?: Map<string, AnyCircuitElement>\n    byType?: Map<string, AnyCircuitElement[]>\n    // Maps relation fields (like component_id) to elements\n    byRelation?: Map<string, Map<string, AnyCircuitElement[]>>\n    // Maps subcircuit_id to elements\n    bySubcircuit?: Map<string, AnyCircuitElement[]>\n    // Custom field indexes\n    byCustomField?: Map<string, Map<string, AnyCircuitElement[]>>\n  }\n}\n\n// Creates a unique key for the ID index\nfunction createIdKey(element: AnyCircuitElement): string {\n  const type = element.type\n  return `${type}:${(element as any)[`${type}_id`]}`\n}\n\nexport const cjuIndexed: GetIndexedCircuitJsonUtilFn = ((\n  soup: AnyCircuitElement[],\n  options: IndexedCircuitJsonUtilOptions = {},\n) => {\n  let internalStore: InternalStore = (soup as any)._internal_store_indexed\n\n  if (!internalStore) {\n    internalStore = {\n      counts: {},\n      editCount: 0,\n      indexes: {},\n    } as InternalStore\n\n    // Initialize counts\n    for (const elm of soup) {\n      const type = elm.type\n      const idVal = (elm as any)[`${type}_id`]\n      if (!idVal) continue\n      const idNum = Number.parseInt(idVal.split(\"_\").pop() || \"\")\n      if (!Number.isNaN(idNum)) {\n        internalStore.counts[type] = Math.max(\n          internalStore.counts[type] ?? 0,\n          idNum,\n        )\n      }\n    }\n\n    // Build indexes\n    const indexConfig = options.indexConfig || {}\n    const indexes = internalStore.indexes\n\n    // Reset indexes before rebuilding\n    if (indexConfig.byId) {\n      indexes.byId = new Map()\n    }\n\n    if (indexConfig.byType) {\n      indexes.byType = new Map()\n    }\n\n    if (indexConfig.byRelation) {\n      indexes.byRelation = new Map()\n    }\n\n    if (indexConfig.bySubcircuit) {\n      indexes.bySubcircuit = new Map()\n    }\n\n    if (indexConfig.byCustomField && indexConfig.byCustomField.length > 0) {\n      indexes.byCustomField = new Map()\n      for (const field of indexConfig.byCustomField) {\n        indexes.byCustomField.set(field, new Map())\n      }\n    }\n\n    // Build indexes\n    for (const element of soup) {\n      // Index by ID\n      if (indexConfig.byId) {\n        const idKey = createIdKey(element)\n        indexes.byId!.set(idKey, element)\n      }\n\n      // Index by type\n      if (indexConfig.byType) {\n        const elementsOfType = indexes.byType!.get(element.type) || []\n        elementsOfType.push(element)\n        indexes.byType!.set(element.type, elementsOfType)\n      }\n\n      // Index by relation fields (fields ending with _id)\n      if (indexConfig.byRelation) {\n        const elementEntries = Object.entries(element)\n        for (const [key, value] of elementEntries) {\n          if (\n            key.endsWith(\"_id\") &&\n            key !== `${element.type}_id` &&\n            typeof value === \"string\"\n          ) {\n            const relationTypeMap = indexes.byRelation!.get(key) || new Map()\n            const relatedElements = relationTypeMap.get(value as string) || []\n            relatedElements.push(element)\n            relationTypeMap.set(value as string, relatedElements)\n            indexes.byRelation!.set(key, relationTypeMap)\n          }\n        }\n      }\n\n      // Index by subcircuit_id\n      if (indexConfig.bySubcircuit && \"subcircuit_id\" in element) {\n        const subcircuitId = (element as any).subcircuit_id\n        if (subcircuitId && typeof subcircuitId === \"string\") {\n          const subcircuitElements =\n            indexes.bySubcircuit!.get(subcircuitId) || []\n          subcircuitElements.push(element)\n          indexes.bySubcircuit!.set(subcircuitId, subcircuitElements)\n        }\n      }\n\n      // Index by custom fields\n      if (indexConfig.byCustomField && indexes.byCustomField) {\n        for (const field of indexConfig.byCustomField) {\n          if (field in element) {\n            const fieldValue = (element as any)[field]\n            if (\n              fieldValue !== undefined &&\n              (typeof fieldValue === \"string\" || typeof fieldValue === \"number\")\n            ) {\n              const fieldValueStr = String(fieldValue)\n              const fieldMap = indexes.byCustomField.get(field)!\n              const elementsWithFieldValue = fieldMap.get(fieldValueStr) || []\n              elementsWithFieldValue.push(element)\n              fieldMap.set(fieldValueStr, elementsWithFieldValue)\n            }\n          }\n        }\n      }\n    }\n    // Store internal state\n    ;(soup as any)._internal_store_indexed = internalStore\n  }\n\n  const suIndexed = new Proxy(\n    {},\n    {\n      get: (proxy_target: any, prop: string) => {\n        if (prop === \"toArray\") {\n          return () => {\n            ;(soup as any).editCount = internalStore.editCount\n            return soup\n          }\n        }\n        if (prop === \"editCount\") {\n          return internalStore.editCount\n        }\n\n        const component_type = prop\n\n        return {\n          get: (id: string) => {\n            const indexConfig = options.indexConfig || {}\n\n            // Use ID index if available\n            if (indexConfig.byId && internalStore.indexes.byId) {\n              return (\n                (internalStore.indexes.byId.get(\n                  `${component_type}:${id}`,\n                ) as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >) || null\n              )\n            }\n\n            // Use type index if available\n            if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n              return (\n                (elementsOfType.find(\n                  (e: any) => e[`${component_type}_id`] === id,\n                ) as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >) || null\n              )\n            }\n\n            // Fallback to regular search\n            return (\n              (soup.find(\n                (e: any) =>\n                  e.type === component_type && e[`${component_type}_id`] === id,\n              ) as Extract<\n                AnyCircuitElement,\n                { type: typeof component_type }\n              >) || null\n            )\n          },\n\n          getUsing: (using: any) => {\n            const indexConfig = options.indexConfig || {}\n            const keys = Object.keys(using)\n\n            if (keys.length !== 1) {\n              throw new Error(\n                \"getUsing requires exactly one key, e.g. { pcb_component_id }\",\n              )\n            }\n\n            const join_key = keys[0] as string\n            const join_type = join_key.replace(\"_id\", \"\")\n\n            // Use relation index if available\n            if (indexConfig.byRelation && internalStore.indexes.byRelation) {\n              const relationMap = internalStore.indexes.byRelation.get(join_key)\n              if (relationMap) {\n                const relatedElements = relationMap.get(using[join_key]) || []\n                const joiner = relatedElements.find((e) => e.type === join_type)\n\n                if (!joiner) return null\n\n                // Now find the element of component_type with matching ID\n                const joinerId =\n                  joiner[`${component_type}_id` as keyof typeof joiner]\n\n                if (indexConfig.byId && internalStore.indexes.byId) {\n                  return (\n                    (internalStore.indexes.byId.get(\n                      `${component_type}:${joinerId}`,\n                    ) as Extract<\n                      AnyCircuitElement,\n                      { type: typeof component_type }\n                    >) || null\n                  )\n                }\n\n                if (indexConfig.byType && internalStore.indexes.byType) {\n                  const elementsOfType =\n                    internalStore.indexes.byType.get(component_type) || []\n                  return (\n                    (elementsOfType.find(\n                      (e: any) => e[`${component_type}_id`] === joinerId,\n                    ) as Extract<\n                      AnyCircuitElement,\n                      { type: typeof component_type }\n                    >) || null\n                  )\n                }\n\n                return (\n                  (soup.find(\n                    (e: any) =>\n                      e.type === component_type &&\n                      e[`${component_type}_id`] === joinerId,\n                  ) as Extract<\n                    AnyCircuitElement,\n                    { type: typeof component_type }\n                  >) || null\n                )\n              }\n            }\n\n            // Fallback to regular approach\n            const joiner: any = soup.find(\n              (e: any) =>\n                e.type === join_type && e[join_key] === using[join_key],\n            )\n\n            if (!joiner) return null\n\n            return (\n              (soup.find(\n                (e: any) =>\n                  e.type === component_type &&\n                  e[`${component_type}_id`] === joiner[`${component_type}_id`],\n              ) as Extract<\n                AnyCircuitElement,\n                { type: typeof component_type }\n              >) || null\n            )\n          },\n\n          getWhere: (where: any) => {\n            const indexConfig = options.indexConfig || {}\n            const keys = Object.keys(where)\n\n            // If we're looking by a single property and it's indexed as a custom field\n            if (\n              keys.length === 1 &&\n              indexConfig.byCustomField &&\n              internalStore.indexes.byCustomField\n            ) {\n              const field = keys[0]\n              const fieldMap = internalStore.indexes.byCustomField.get(field!)\n\n              if (fieldMap) {\n                const fieldValue = String(where[field!])\n                const elementsWithFieldValue = fieldMap.get(fieldValue) || []\n\n                return (\n                  (elementsWithFieldValue.find(\n                    (e: any) => e.type === component_type,\n                  ) as Extract<\n                    AnyCircuitElement,\n                    { type: typeof component_type }\n                  >) || null\n                )\n              }\n            }\n\n            // If we're looking by subcircuit_id and it's indexed\n            if (\n              \"subcircuit_id\" in where &&\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit\n            ) {\n              const subcircuitId = where.subcircuit_id\n              const subcircuitElements =\n                internalStore.indexes.bySubcircuit.get(subcircuitId) || []\n\n              return (\n                (subcircuitElements.find(\n                  (e: any) =>\n                    e.type === component_type &&\n                    keys.every((key) => e[key] === where[key]),\n                ) as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >) || null\n              )\n            }\n\n            // Use type index if available to reduce search space\n            if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n\n              return (\n                (elementsOfType.find((e: any) =>\n                  keys.every((key) => e[key] === where[key]),\n                ) as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >) || null\n              )\n            }\n\n            // Fallback to regular approach\n            return (\n              (soup.find(\n                (e: any) =>\n                  e.type === component_type &&\n                  keys.every((key) => e[key] === where[key]),\n              ) as Extract<\n                AnyCircuitElement,\n                { type: typeof component_type }\n              >) || null\n            )\n          },\n\n          list: (where?: any) => {\n            const indexConfig = options.indexConfig || {}\n            const keys = !where ? [] : Object.keys(where)\n\n            // If no filters, just return all elements of this type using the type index\n            if (\n              keys.length === 0 &&\n              indexConfig.byType &&\n              internalStore.indexes.byType\n            ) {\n              return (internalStore.indexes.byType.get(component_type) ||\n                []) as Extract<\n                AnyCircuitElement,\n                { type: typeof component_type }\n              >[]\n            }\n\n            // If filtering by subcircuit_id and it's the only filter\n            if (\n              keys.length === 1 &&\n              keys[0] === \"subcircuit_id\" &&\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit\n            ) {\n              const subcircuitId = where.subcircuit_id\n              const subcircuitElements =\n                internalStore.indexes.bySubcircuit.get(subcircuitId) || []\n\n              return subcircuitElements.filter(\n                (e: any) => e.type === component_type,\n              ) as Extract<AnyCircuitElement, { type: typeof component_type }>[]\n            }\n\n            // Start with all elements of this type to reduce search space\n            let elementsToFilter: AnyCircuitElement[]\n\n            if (indexConfig.byType && internalStore.indexes.byType) {\n              elementsToFilter =\n                internalStore.indexes.byType.get(component_type) || []\n            } else {\n              elementsToFilter = soup.filter((e) => e.type === component_type)\n            }\n\n            // Apply remaining filters\n            if (keys.length > 0) {\n              return elementsToFilter.filter((e: any) =>\n                keys.every((key) => e[key] === where[key]),\n              ) as Extract<AnyCircuitElement, { type: typeof component_type }>[]\n            }\n\n            return elementsToFilter as Extract<\n              AnyCircuitElement,\n              { type: typeof component_type }\n            >[]\n          },\n\n          insert: (elm: any) => {\n            internalStore.counts[component_type] ??= -1\n            internalStore.counts[component_type]++\n            const index = internalStore.counts[component_type]\n            const newElm = {\n              type: component_type,\n              [`${component_type}_id`]: `${component_type}_${index}`,\n              ...elm,\n            }\n\n            if (options.validateInserts) {\n              const parser =\n                (Soup as any)[component_type] ?? Soup.any_soup_element\n              parser.parse(newElm)\n            }\n\n            soup.push(newElm)\n            internalStore.editCount++\n\n            // Update indexes with the new element\n            const indexConfig = options.indexConfig || {}\n\n            // Update ID index\n            if (indexConfig.byId && internalStore.indexes.byId) {\n              const idKey = createIdKey(newElm)\n              internalStore.indexes.byId.set(idKey, newElm)\n            }\n\n            // Update type index\n            if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n              elementsOfType.push(newElm)\n              internalStore.indexes.byType.set(component_type, elementsOfType)\n            }\n\n            // Update relation index\n            if (indexConfig.byRelation && internalStore.indexes.byRelation) {\n              const elementEntries = Object.entries(newElm)\n              for (const [key, value] of elementEntries) {\n                if (\n                  key.endsWith(\"_id\") &&\n                  key !== `${newElm.type}_id` &&\n                  typeof value === \"string\"\n                ) {\n                  const relationTypeMap =\n                    internalStore.indexes.byRelation.get(key) || new Map()\n                  const relatedElements =\n                    relationTypeMap.get(value as string) || []\n                  relatedElements.push(newElm)\n                  relationTypeMap.set(value as string, relatedElements)\n                  internalStore.indexes.byRelation.set(key, relationTypeMap)\n                }\n              }\n            }\n\n            // Update subcircuit index\n            if (\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit &&\n              \"subcircuit_id\" in newElm\n            ) {\n              const subcircuitId = (newElm as any).subcircuit_id\n              if (subcircuitId && typeof subcircuitId === \"string\") {\n                const subcircuitElements =\n                  internalStore.indexes.bySubcircuit.get(subcircuitId) || []\n                subcircuitElements.push(newElm)\n                internalStore.indexes.bySubcircuit.set(\n                  subcircuitId,\n                  subcircuitElements,\n                )\n              }\n            }\n\n            // Update custom field indexes\n            if (\n              indexConfig.byCustomField &&\n              internalStore.indexes.byCustomField\n            ) {\n              for (const field of indexConfig.byCustomField) {\n                if (field in newElm) {\n                  const fieldValue = (newElm as any)[field]\n                  if (\n                    fieldValue !== undefined &&\n                    (typeof fieldValue === \"string\" ||\n                      typeof fieldValue === \"number\")\n                  ) {\n                    const fieldValueStr = String(fieldValue)\n                    const fieldMap =\n                      internalStore.indexes.byCustomField.get(field)!\n                    const elementsWithFieldValue =\n                      fieldMap.get(fieldValueStr) || []\n                    elementsWithFieldValue.push(newElm)\n                    fieldMap.set(fieldValueStr, elementsWithFieldValue)\n                  }\n                }\n              }\n            }\n\n            return newElm\n          },\n\n          delete: (id: string) => {\n            const indexConfig = options.indexConfig || {}\n            let elm: AnyCircuitElement | undefined\n\n            // Find the element to delete\n            if (indexConfig.byId && internalStore.indexes.byId) {\n              elm = internalStore.indexes.byId.get(`${component_type}:${id}`)\n            } else if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n              elm = elementsOfType.find(\n                (e: any) => e[`${component_type}_id`] === id,\n              )\n            } else {\n              elm = soup.find((e) => (e as any)[`${component_type}_id`] === id)\n            }\n\n            if (!elm) return\n\n            // Remove from array\n            const elmIndex = soup.indexOf(elm)\n            if (elmIndex >= 0) {\n              soup.splice(elmIndex, 1)\n              internalStore.editCount++\n            }\n\n            // Remove from indexes\n            if (indexConfig.byId && internalStore.indexes.byId) {\n              const idKey = createIdKey(elm)\n              internalStore.indexes.byId.delete(idKey)\n            }\n\n            if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n              const filteredElements = elementsOfType.filter(\n                (e: any) => e[`${component_type}_id`] !== id,\n              )\n              internalStore.indexes.byType.set(component_type, filteredElements)\n            }\n\n            if (indexConfig.byRelation && internalStore.indexes.byRelation) {\n              // This is more complex - we need to find and remove from all relation maps\n              // where this element appears\n              for (const [\n                relationKey,\n                relationMap,\n              ] of internalStore.indexes.byRelation.entries()) {\n                for (const [relationValue, elements] of relationMap.entries()) {\n                  const updatedElements = elements.filter((e) => e !== elm)\n\n                  if (updatedElements.length === 0) {\n                    relationMap.delete(relationValue)\n                  } else {\n                    relationMap.set(relationValue, updatedElements)\n                  }\n                }\n              }\n            }\n\n            if (\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit &&\n              \"subcircuit_id\" in elm\n            ) {\n              const subcircuitId = (elm as any).subcircuit_id\n              if (subcircuitId) {\n                const subcircuitElements =\n                  internalStore.indexes.bySubcircuit.get(subcircuitId) || []\n                const updatedElements = subcircuitElements.filter(\n                  (e) => e !== elm,\n                )\n\n                if (updatedElements.length === 0) {\n                  internalStore.indexes.bySubcircuit.delete(subcircuitId)\n                } else {\n                  internalStore.indexes.bySubcircuit.set(\n                    subcircuitId,\n                    updatedElements,\n                  )\n                }\n              }\n            }\n\n            if (\n              indexConfig.byCustomField &&\n              internalStore.indexes.byCustomField\n            ) {\n              for (const fieldMap of internalStore.indexes.byCustomField.values()) {\n                for (const [fieldValue, elements] of fieldMap.entries()) {\n                  const updatedElements = elements.filter((e) => e !== elm)\n\n                  if (updatedElements.length === 0) {\n                    fieldMap.delete(fieldValue)\n                  } else {\n                    fieldMap.set(fieldValue, updatedElements)\n                  }\n                }\n              }\n            }\n          },\n\n          update: (id: string, newProps: any) => {\n            const indexConfig = options.indexConfig || {}\n            let elm: AnyCircuitElement | undefined | null\n\n            // Find the element to update\n            if (indexConfig.byId && internalStore.indexes.byId) {\n              elm = internalStore.indexes.byId.get(`${component_type}:${id}`)\n            } else if (indexConfig.byType && internalStore.indexes.byType) {\n              const elementsOfType =\n                internalStore.indexes.byType.get(component_type) || []\n              elm = elementsOfType.find(\n                (e: any) => e[`${component_type}_id`] === id,\n              )\n            } else {\n              elm = soup.find(\n                (e) =>\n                  e.type === component_type &&\n                  (e as any)[`${component_type}_id`] === id,\n              )\n            }\n\n            if (!elm) return null\n\n            // Need to remove from indexes before updating\n            if (indexConfig.byRelation && internalStore.indexes.byRelation) {\n              // Remove from relation indexes\n              const elementEntries = Object.entries(elm)\n              for (const [key, value] of elementEntries) {\n                if (\n                  key.endsWith(\"_id\") &&\n                  key !== `${elm.type}_id` &&\n                  typeof value === \"string\"\n                ) {\n                  if (key in newProps && newProps[key] !== value) {\n                    const relationTypeMap =\n                      internalStore.indexes.byRelation.get(key)\n                    if (relationTypeMap) {\n                      const relatedElements =\n                        relationTypeMap.get(value as string) || []\n                      const updatedElements = relatedElements.filter(\n                        (e) => e !== elm,\n                      )\n\n                      if (updatedElements.length === 0) {\n                        relationTypeMap.delete(value as string)\n                      } else {\n                        relationTypeMap.set(value as string, updatedElements)\n                      }\n                    }\n                  }\n                }\n              }\n            }\n\n            if (\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit &&\n              \"subcircuit_id\" in elm &&\n              \"subcircuit_id\" in newProps\n            ) {\n              const oldSubcircuitId = (elm as any).subcircuit_id\n              const newSubcircuitId = newProps.subcircuit_id\n\n              if (oldSubcircuitId !== newSubcircuitId) {\n                // Remove from old subcircuit index\n                const subcircuitElements =\n                  internalStore.indexes.bySubcircuit.get(oldSubcircuitId) || []\n                const updatedElements = subcircuitElements.filter(\n                  (e) => e !== elm,\n                )\n\n                if (updatedElements.length === 0) {\n                  internalStore.indexes.bySubcircuit.delete(oldSubcircuitId)\n                } else {\n                  internalStore.indexes.bySubcircuit.set(\n                    oldSubcircuitId,\n                    updatedElements,\n                  )\n                }\n              }\n            }\n\n            if (\n              indexConfig.byCustomField &&\n              internalStore.indexes.byCustomField\n            ) {\n              for (const field of indexConfig.byCustomField) {\n                if (\n                  field in elm &&\n                  field in newProps &&\n                  (elm as any)[field] !== newProps[field]\n                ) {\n                  const fieldMap =\n                    internalStore.indexes.byCustomField.get(field)\n                  if (fieldMap) {\n                    const oldValue = String((elm as any)[field])\n                    const elements = fieldMap.get(oldValue) || []\n                    const updatedElements = elements.filter((e) => e !== elm)\n\n                    if (updatedElements.length === 0) {\n                      fieldMap.delete(oldValue)\n                    } else {\n                      fieldMap.set(oldValue, updatedElements)\n                    }\n                  }\n                }\n              }\n            }\n\n            // Update the element\n            Object.assign(elm, newProps)\n            internalStore.editCount++\n\n            // Add to indexes with updated values\n            if (indexConfig.byRelation && internalStore.indexes.byRelation) {\n              const elementEntries = Object.entries(elm)\n              for (const [key, value] of elementEntries) {\n                if (\n                  key.endsWith(\"_id\") &&\n                  key !== `${elm.type}_id` &&\n                  typeof value === \"string\"\n                ) {\n                  if (key in newProps) {\n                    const relationTypeMap: any =\n                      internalStore.indexes.byRelation.get(key) || new Map()\n                    const relatedElements: any =\n                      relationTypeMap.get(value as string) || []\n\n                    if (!relatedElements.includes(elm)) {\n                      relatedElements.push(elm)\n                      relationTypeMap.set(value as string, relatedElements)\n                      internalStore.indexes.byRelation.set(key, relationTypeMap)\n                    }\n                  }\n                }\n              }\n            }\n\n            if (\n              indexConfig.bySubcircuit &&\n              internalStore.indexes.bySubcircuit &&\n              \"subcircuit_id\" in elm &&\n              \"subcircuit_id\" in newProps\n            ) {\n              const subcircuitId = (elm as any).subcircuit_id\n              if (subcircuitId && typeof subcircuitId === \"string\") {\n                const subcircuitElements =\n                  internalStore.indexes.bySubcircuit.get(subcircuitId) || []\n\n                if (!subcircuitElements.includes(elm)) {\n                  subcircuitElements.push(elm)\n                  internalStore.indexes.bySubcircuit.set(\n                    subcircuitId,\n                    subcircuitElements,\n                  )\n                }\n              }\n            }\n\n            if (\n              indexConfig.byCustomField &&\n              internalStore.indexes.byCustomField\n            ) {\n              for (const field of indexConfig.byCustomField) {\n                if (field in elm && field in newProps) {\n                  const fieldValue: any = (elm as any)[field]\n                  if (\n                    fieldValue !== undefined &&\n                    (typeof fieldValue === \"string\" ||\n                      typeof fieldValue === \"number\")\n                  ) {\n                    const fieldValueStr = String(fieldValue)\n                    const fieldMap =\n                      internalStore.indexes.byCustomField.get(field)!\n                    const elementsWithFieldValue =\n                      fieldMap.get(fieldValueStr) || []\n\n                    if (!elementsWithFieldValue.includes(elm)) {\n                      elementsWithFieldValue.push(elm)\n                      fieldMap.set(fieldValueStr, elementsWithFieldValue)\n                    }\n                  }\n                }\n              }\n            }\n\n            return elm as Extract<\n              AnyCircuitElement,\n              { type: typeof component_type }\n            >\n          },\n\n          select: (selector: string) => {\n            // Selection by selector is specialized enough that we don't use indexes here\n            // TODO when applySelector is isolated we can use it, until then we\n            // do a poor man's selector implementation for two common cases\n            if (component_type === \"source_component\") {\n              return (\n                (soup.find(\n                  (e) =>\n                    e.type === \"source_component\" &&\n                    e.name === selector.replace(/\\./g, \"\"),\n                ) as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >) || null\n              )\n            } else if (\n              component_type === \"pcb_port\" ||\n              component_type === \"source_port\" ||\n              component_type === \"schematic_port\"\n            ) {\n              const [component_name, port_selector] = selector\n                .replace(/\\./g, \"\")\n                .split(/[\\s\\>]+/)\n              const source_component = soup.find(\n                (e) =>\n                  e.type === \"source_component\" && e.name === component_name,\n              ) as SourceComponentBase\n              if (!source_component) return null\n              const source_port = soup.find(\n                (e) =>\n                  e.type === \"source_port\" &&\n                  e.source_component_id ===\n                    source_component.source_component_id &&\n                  (e.name === port_selector ||\n                    (e.port_hints ?? []).includes(port_selector!)),\n              ) as SourcePort\n              if (!source_port) return null\n              if (component_type === \"source_port\")\n                return source_port as Extract<\n                  AnyCircuitElement,\n                  { type: typeof component_type }\n                >\n\n              if (component_type === \"pcb_port\") {\n                return (\n                  (soup.find(\n                    (e) =>\n                      e.type === \"pcb_port\" &&\n                      e.source_port_id === source_port.source_port_id,\n                  ) as Extract<\n                    AnyCircuitElement,\n                    { type: typeof component_type }\n                  >) || null\n                )\n              } else if (component_type === \"schematic_port\") {\n                return (\n                  (soup.find(\n                    (e) =>\n                      e.type === \"schematic_port\" &&\n                      e.source_port_id === source_port.source_port_id,\n                  ) as Extract<\n                    AnyCircuitElement,\n                    { type: typeof component_type }\n                  >) || null\n                )\n              }\n            }\n\n            return null\n          },\n        }\n      },\n    },\n  )\n\n  return suIndexed\n}) as any\n\ncjuIndexed.unparsed = cjuIndexed as any\n\nexport default cjuIndexed\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { type Matrix, applyToPoint, decomposeTSR } from \"transformation-matrix\"\nimport {\n  directionToVec,\n  rotateDirection,\n  vecToDirection,\n} from \"./direction-to-vec\"\n\ntype PcbInsertionDirection =\n  | \"from_above\"\n  | \"from_left\"\n  | \"from_right\"\n  | \"from_front\"\n  | \"from_back\"\n\nconst getQuarterTurns = (angleRadians: number) =>\n  Math.round(angleRadians / (Math.PI / 2))\n\nconst insertionDirectionToVec = (\n  direction: Exclude<PcbInsertionDirection, \"from_above\">,\n) => {\n  switch (direction) {\n    case \"from_left\":\n      return { x: -1, y: 0 }\n    case \"from_right\":\n      return { x: 1, y: 0 }\n    case \"from_front\":\n      return { x: 0, y: 1 }\n    case \"from_back\":\n      return { x: 0, y: -1 }\n  }\n}\n\nconst vecToInsertionDirection = ({\n  x,\n  y,\n}: {\n  x: number\n  y: number\n}): Exclude<PcbInsertionDirection, \"from_above\"> => {\n  if (x > 0) return \"from_right\"\n  if (x < 0) return \"from_left\"\n  if (y > 0) return \"from_front\"\n  return \"from_back\"\n}\n\nexport const transformInsertionDirection = (\n  direction: PcbInsertionDirection | undefined,\n  opts: { rotationDegrees: number; isFlipped: boolean },\n) => {\n  if (!direction || direction === \"from_above\") return direction\n\n  let { x, y } = insertionDirectionToVec(direction)\n  let quarterTurns = Math.round(opts.rotationDegrees / 90)\n\n  while (quarterTurns > 0) {\n    ;[x, y] = [-y, x]\n    quarterTurns--\n  }\n\n  while (quarterTurns < 0) {\n    ;[x, y] = [y, -x]\n    quarterTurns++\n  }\n\n  if (opts.isFlipped) {\n    y = -y\n  }\n\n  return vecToInsertionDirection({ x, y })\n}\n\nexport const transformSchematicElement = (\n  elm: AnyCircuitElement,\n  matrix: Matrix,\n) => {\n  if (elm.type === \"schematic_component\") {\n    // TODO handle rotation\n    elm.center = applyToPoint(matrix, elm.center)\n  } else if (elm.type === \"schematic_port\") {\n    elm.center = applyToPoint(matrix, elm.center)\n\n    if (elm.facing_direction) {\n      elm.facing_direction = rotateDirection(\n        elm.facing_direction,\n        -(Math.atan2(matrix.b, matrix.a) / Math.PI) * 2,\n      )\n    }\n  } else if (elm.type === \"schematic_text\") {\n    elm.position = applyToPoint(matrix, elm.position)\n    // } else if (elm.type === \"schematic_group\") {\n    //   elm.center = applyToPoint(matrix, elm.center)\n  } else if (elm.type === \"schematic_trace\") {\n    const anyElm = elm as any\n    anyElm.route = (anyElm.route ?? []).map((rp: any) => {\n      const tp = applyToPoint(matrix, rp) as { x: number; y: number }\n      rp.x = tp.x\n      rp.y = tp.y\n      return rp\n    })\n    if (Array.isArray(anyElm.junctions)) {\n      anyElm.junctions = anyElm.junctions.map((j: any) => {\n        const tp = applyToPoint(matrix, j) as { x: number; y: number }\n        j.x = tp.x\n        j.y = tp.y\n        return j\n      })\n    }\n    if (Array.isArray(anyElm.edges)) {\n      anyElm.edges = anyElm.edges.map((e: any) => {\n        e.from = applyToPoint(matrix, e.from)\n        e.to = applyToPoint(matrix, e.to)\n        return e\n      })\n    }\n  } else if (elm.type === \"schematic_box\") {\n    const { x, y } = applyToPoint(matrix, { x: elm.x, y: elm.y })\n    elm.x = x\n    elm.y = y\n  } else if (elm.type === \"schematic_line\") {\n    const { x: x1, y: y1 } = applyToPoint(matrix, { x: elm.x1, y: elm.y1 })\n    const { x: x2, y: y2 } = applyToPoint(matrix, { x: elm.x2, y: elm.y2 })\n    elm.x1 = x1\n    elm.y1 = y1\n    elm.x2 = x2\n    elm.y2 = y2\n  }\n  return elm\n}\n\nexport const transformSchematicElements = (\n  elms: AnyCircuitElement[],\n  matrix: Matrix,\n) => {\n  return elms.map((elm) => transformSchematicElement(elm, matrix))\n}\n\nexport const transformPCBElement = (elm: AnyCircuitElement, matrix: Matrix) => {\n  const tsr = decomposeTSR(matrix)\n  const flipPadWidthHeight =\n    Math.abs(getQuarterTurns(tsr.rotation.angle)) % 2 === 1\n  const rotationDegrees = (tsr.rotation.angle / Math.PI) * 180\n  const isFlipped = tsr.scale.sy < 0\n  if (\n    elm.type === \"pcb_plated_hole\" ||\n    elm.type === \"pcb_hole\" ||\n    elm.type === \"pcb_via\" ||\n    elm.type === \"pcb_smtpad\" ||\n    elm.type === \"pcb_port\"\n  ) {\n    const { x, y } = applyToPoint(matrix, {\n      x: Number((elm as any).x),\n      y: Number((elm as any).y),\n    })\n    ;(elm as any).x = x\n    ;(elm as any).y = y\n\n    // Handle polygon-shaped SMT pads with points array\n    if (\n      elm.type === \"pcb_smtpad\" &&\n      elm.shape === \"polygon\" &&\n      Array.isArray(elm.points)\n    ) {\n      elm.points = elm.points.map((point: any) => {\n        const tp = applyToPoint(matrix, { x: point.x, y: point.y })\n        return {\n          x: tp.x,\n          y: tp.y,\n        }\n      })\n    }\n  } else if (elm.type === \"pcb_keepout\" || elm.type === \"pcb_board\") {\n    // TODO adjust size/rotation\n    elm.center = applyToPoint(matrix, elm.center)\n  } else if (\n    elm.type === \"pcb_silkscreen_text\" ||\n    elm.type === \"pcb_fabrication_note_text\" ||\n    elm.type === \"pcb_note_text\"\n  ) {\n    elm.anchor_position = applyToPoint(matrix, elm.anchor_position)\n  } else if (elm.type === \"pcb_courtyard_rect\") {\n    elm.center = applyToPoint(matrix, elm.center)\n    elm.ccw_rotation = ((elm.ccw_rotation ?? 0) + rotationDegrees) % 360\n  } else if (\n    elm.type === \"pcb_silkscreen_circle\" ||\n    elm.type === \"pcb_silkscreen_rect\" ||\n    elm.type === \"pcb_note_rect\" ||\n    elm.type === \"pcb_courtyard_circle\"\n  ) {\n    elm.center = applyToPoint(matrix, elm.center)\n  } else if (elm.type === \"pcb_component\") {\n    elm.center = applyToPoint(matrix, elm.center)\n    elm.rotation = elm.rotation + rotationDegrees\n    elm.rotation = elm.rotation % 360\n    if (elm.cable_insertion_center) {\n      elm.cable_insertion_center = applyToPoint(\n        matrix,\n        elm.cable_insertion_center,\n      )\n    }\n    elm.insertion_direction = transformInsertionDirection(\n      elm.insertion_direction,\n      {\n        rotationDegrees,\n        isFlipped,\n      },\n    )\n    if (flipPadWidthHeight) {\n      ;[elm.width, elm.height] = [elm.height, elm.width]\n    }\n  } else if (elm.type === \"pcb_courtyard_outline\") {\n    elm.outline = elm.outline.map((p) => {\n      const tp = applyToPoint(matrix, p) as { x: number; y: number }\n      p.x = tp.x\n      p.y = tp.y\n      return p\n    })\n  } else if (elm.type === \"pcb_courtyard_polygon\") {\n    elm.points = elm.points.map((p) => {\n      const tp = applyToPoint(matrix, p) as { x: number; y: number }\n      p.x = tp.x\n      p.y = tp.y\n      return p\n    })\n  } else if (\n    elm.type === \"pcb_silkscreen_path\" ||\n    elm.type === \"pcb_trace\" ||\n    elm.type === \"pcb_fabrication_note_path\" ||\n    elm.type === \"pcb_note_path\"\n  ) {\n    elm.route = elm.route.map((rp) => {\n      const tp = applyToPoint(matrix, rp) as { x: number; y: number }\n      rp.x = tp.x\n      rp.y = tp.y\n      return rp\n    })\n  } else if (\n    elm.type === \"pcb_silkscreen_line\" ||\n    elm.type === \"pcb_note_line\"\n  ) {\n    const p1 = { x: elm.x1, y: elm.y1 }\n    const p2 = { x: elm.x2, y: elm.y2 }\n    const p1t = applyToPoint(matrix, p1)\n    const p2t = applyToPoint(matrix, p2)\n    elm.x1 = p1t.x\n    elm.y1 = p1t.y\n    elm.x2 = p2t.x\n    elm.y2 = p2t.y\n  } else if (elm.type === \"cad_component\") {\n    const newPos = applyToPoint(matrix, {\n      x: elm.position.x,\n      y: elm.position.y,\n    })\n    elm.position.x = newPos.x\n    elm.position.y = newPos.y\n  }\n  return elm\n}\n\nexport const transformPCBElements = (\n  elms: AnyCircuitElement[],\n  matrix: Matrix,\n) => {\n  const tsr = decomposeTSR(matrix)\n  const quarterTurns = getQuarterTurns(tsr.rotation.angle)\n  const flipPadWidthHeight = Math.abs(quarterTurns) % 2 === 1\n  let transformedElms = elms.map((elm) => transformPCBElement(elm, matrix))\n  if (flipPadWidthHeight) {\n    transformedElms = transformedElms.map((elm) => {\n      if (elm.type === \"pcb_smtpad\" && elm.shape === \"rect\") {\n        ;[elm.width, elm.height] = [elm.height, elm.width]\n      }\n      return elm\n    })\n  }\n  return transformedElms\n}\n","export const directionToVec = (direction: \"up\" | \"down\" | \"left\" | \"right\") => {\n  if (direction === \"up\") return { x: 0, y: 1 }\n  else if (direction === \"down\") return { x: 0, y: -1 }\n  else if (direction === \"left\") return { x: -1, y: 0 }\n  else if (direction === \"right\") return { x: 1, y: 0 }\n  else throw new Error(\"Invalid direction\")\n}\n\nexport const vecToDirection = ({ x, y }: { x: number; y: number }) => {\n  if (x > y) y = 0\n  if (y > x) x = 0\n  if (x > 0 && y === 0) return \"right\"\n  else if (x < 0 && y === 0) return \"left\"\n  else if (x === 0 && y > 0) return \"up\"\n  else if (x === 0 && y < 0) return \"down\"\n  else throw new Error(`Invalid vector for direction conversion (${x}, ${y})`)\n}\n\nexport const rotateClockwise = (\n  direction: \"up\" | \"down\" | \"left\" | \"right\",\n) => {\n  if (direction === \"up\") return \"right\"\n  else if (direction === \"right\") return \"down\"\n  else if (direction === \"down\") return \"left\"\n  else if (direction === \"left\") return \"up\"\n  throw new Error(`Invalid direction: ${direction}`)\n}\n\nexport const rotateCounterClockwise = (\n  direction: \"up\" | \"down\" | \"left\" | \"right\",\n) => {\n  if (direction === \"up\") return \"left\"\n  else if (direction === \"left\") return \"down\"\n  else if (direction === \"down\") return \"right\"\n  else if (direction === \"right\") return \"up\"\n  throw new Error(`Invalid direction: ${direction}`)\n}\n\nexport const rotateDirection = (\n  direction: \"up\" | \"down\" | \"left\" | \"right\",\n  num90DegreeClockwiseTurns: number,\n) => {\n  while (num90DegreeClockwiseTurns > 0) {\n    direction = rotateClockwise(direction)\n    num90DegreeClockwiseTurns--\n  }\n  while (num90DegreeClockwiseTurns < 0) {\n    direction = rotateCounterClockwise(direction)\n    num90DegreeClockwiseTurns++\n  }\n  return direction\n}\n\nexport const oppositeDirection = (\n  direction: \"up\" | \"down\" | \"left\" | \"right\",\n) => {\n  if (direction === \"up\") return \"down\"\n  else if (direction === \"down\") return \"up\"\n  else if (direction === \"left\") return \"right\"\n  else if (direction === \"right\") return \"left\"\n  throw new Error(`Invalid direction: ${direction}`)\n}\n\nexport const oppositeSide = (\n  sideOrDir: \"up\" | \"down\" | \"top\" | \"bottom\" | \"left\" | \"right\",\n) => {\n  if (sideOrDir === \"top\" || sideOrDir === \"up\") return \"bottom\"\n  else if (sideOrDir === \"bottom\" || sideOrDir === \"down\") return \"top\"\n  else if (sideOrDir === \"left\") return \"right\"\n  else if (sideOrDir === \"right\") return \"left\"\n  throw new Error(`Invalid sideOrDir: ${sideOrDir}`)\n}\n","import * as parsel from \"parsel-js\"\nimport { convertAbbrToType } from \"./convert-abbreviation-to-soup-element-type\"\nimport type { AnyCircuitElement } from \"circuit-json\"\n\nconst filterByType = (\n  elements: AnyCircuitElement[],\n  type: string,\n): AnyCircuitElement[] => {\n  type = convertAbbrToType(type)\n  return elements.filter(\n    (elm) => (\"ftype\" in elm && elm.ftype === type) || elm.type === type,\n  )\n}\n\n/**\n * Filter elements to match the selector, e.g. to access the left port of a\n * resistor you can do \".R1 > port.left\"\n */\nexport const applySelector = (\n  elements: AnyCircuitElement[],\n  selectorRaw: string,\n): AnyCircuitElement[] => {\n  const selectorAST = parsel.parse(selectorRaw)\n  return applySelectorAST(elements, selectorAST!)\n}\n\nconst doesElmMatchClassName = (elm: AnyCircuitElement, className: string) =>\n  (\"name\" in elm && elm.name === className) ||\n  (\"port_hints\" in elm && elm.port_hints?.includes(className))\n\nexport const applySelectorAST = (\n  elements: AnyCircuitElement[],\n  selectorAST: parsel.AST,\n): AnyCircuitElement[] => {\n  switch (selectorAST.type) {\n    case \"complex\": {\n      switch (selectorAST.combinator) {\n        case \" \": // TODO technically should do a deep search\n        case \">\": {\n          const { left, right } = selectorAST\n          if (left.type === \"class\" || left.type === \"type\") {\n            // TODO should also check if content matches any element tags\n            let matchElms: AnyCircuitElement[]\n            if (left.type === \"class\") {\n              matchElms = elements.filter((elm) =>\n                doesElmMatchClassName(elm, left.name),\n              )\n            } else if (left.type === \"type\") {\n              matchElms = filterByType(elements, left.name)\n            } else {\n              matchElms = []\n            }\n\n            const childrenOfMatchingElms = matchElms.flatMap((matchElm) =>\n              elements.filter(\n                (elm: any) =>\n                  elm[`${matchElm.type}_id`] ===\n                    (matchElm as any)[`${matchElm.type}_id`] &&\n                  elm !== matchElm,\n              ),\n            )\n            return applySelectorAST(childrenOfMatchingElms, right)\n          } else {\n            throw new Error(`unsupported selector type \"${left.type}\" `)\n          }\n        }\n        default: {\n          throw new Error(\n            `Couldn't apply selector AST for complex combinator \"${selectorAST.combinator}\"`,\n          )\n        }\n      }\n      return []\n    }\n    case \"compound\": {\n      const conditionsToMatch = selectorAST.list.map((part) => {\n        switch (part.type) {\n          case \"class\": {\n            return (elm: any) => doesElmMatchClassName(elm, part.name)\n          }\n          case \"type\": {\n            const name = convertAbbrToType(part.name)\n            return (elm: any) => elm.type === name\n          }\n        }\n      })\n\n      return elements.filter((elm) =>\n        conditionsToMatch.every((condFn) => condFn?.(elm)),\n      )\n    }\n    case \"type\": {\n      return filterByType(elements, selectorAST.name) as AnyCircuitElement[]\n    }\n    case \"class\": {\n      return elements.filter((elm) =>\n        doesElmMatchClassName(elm, selectorAST.name),\n      )\n    }\n    default: {\n      throw new Error(\n        `Couldn't apply selector AST for type: \"${\n          selectorAST.type\n        }\" ${JSON.stringify(selectorAST, null, \" \")}`,\n      )\n    }\n  }\n}\n","export const convertAbbrToType = (abbr: string): string => {\n  switch (abbr) {\n    case \"port\":\n      return \"source_port\"\n    case \"net\":\n      return \"source_net\"\n    case \"power\":\n      return \"simple_power_source\"\n    case \"silkscreenpath\":\n      return \"pcb_silkscreen_path\"\n  }\n  return abbr\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const getElementId = (elm: AnyCircuitElement): string => {\n  const type = elm.type\n  const id = (elm as any)[`${type}_id`]\n  return id\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { getElementId } from \"./get-element-id\"\n\nexport const getElementById = (\n  soup: AnyCircuitElement[],\n  id: string,\n): AnyCircuitElement | null => {\n  return soup.find((elm) => getElementId(elm) === id) ?? null\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { cju } from \"../cju\"\n\nexport function getReadableNameForPcbTrace(\n  soup: AnyCircuitElement[],\n  pcb_trace_id: string,\n) {\n  // Find the pcb_trace object\n  const pcbTrace = cju(soup).pcb_trace.get(pcb_trace_id)\n\n  if (!pcbTrace) {\n    return `trace[${pcb_trace_id}]`\n  }\n\n  // Get the connected ports\n  const connectedPcbPortIds: string[] = pcbTrace.route\n    .flatMap((point: any) => [point.start_pcb_port_id, point.end_pcb_port_id])\n    .filter(Boolean)\n\n  if (connectedPcbPortIds.length === 0) {\n    return `trace[${pcb_trace_id}]`\n  }\n\n  // Function to get component name and port hint\n  function getComponentAndPortInfo(pcb_port_id: string) {\n    const pcbPort = cju(soup).pcb_port.get(pcb_port_id)\n    if (!pcbPort) return null\n\n    const pcbComponent = pcbPort.pcb_component_id\n      ? cju(soup).pcb_component.get(pcbPort.pcb_component_id)\n      : undefined\n    if (!pcbComponent) return null\n    const sourceComponent = cju(soup).source_component.get(\n      pcbComponent.source_component_id,\n    )\n    if (!sourceComponent) return null\n\n    const sourcePort = cju(soup).source_port.get(pcbPort.source_port_id)\n    const portHint = sourcePort?.port_hints ? sourcePort.port_hints[1] : \"\"\n\n    return {\n      componentName: sourceComponent.name,\n      portHint: portHint,\n    }\n  }\n\n  // Generate the readable selector\n  const selectorParts = connectedPcbPortIds.map((portId) => {\n    const info = getComponentAndPortInfo(portId)\n    if (info) {\n      return `.${info.componentName} > port.${info.portHint}`\n    }\n    return `port[${portId}]`\n  })\n\n  return `trace[${selectorParts.join(\", \")}]`\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { cju } from \"../cju\"\n\nexport const getReadableNameForPcbPort = (\n  soup: AnyCircuitElement[],\n  pcb_port_id: string,\n): string => {\n  const pcbPort = cju(soup).pcb_port.get(pcb_port_id)\n  if (!pcbPort) {\n    return `pcb_port[#${pcb_port_id}]`\n  }\n\n  // Get the component information\n  const pcbComponent = pcbPort.pcb_component_id\n    ? cju(soup).pcb_component.get(pcbPort.pcb_component_id)\n    : undefined\n\n  if (!pcbComponent) {\n    return `pcb_port[#${pcb_port_id}]`\n  }\n\n  // Get the source component information\n  const sourceComponent = cju(soup).source_component.get(\n    pcbComponent.source_component_id,\n  )\n\n  if (!sourceComponent) {\n    return `pcb_port[#${pcb_port_id}]`\n  }\n\n  // Get the source port information\n  const sourcePort = cju(soup).source_port.get(pcbPort.source_port_id)\n\n  if (!sourcePort) {\n    return `pcb_port[#${pcb_port_id}]`\n  }\n\n  // Determine the pad number or hint\n  let padIdentifier: string\n  if (sourcePort?.port_hints && sourcePort.port_hints.length > 0) {\n    padIdentifier = sourcePort.port_hints[0]!\n  } else if (sourcePort.port_hints && sourcePort.port_hints.length > 0) {\n    padIdentifier = sourcePort.port_hints[0]!\n  } else {\n    padIdentifier = pcb_port_id\n  }\n\n  return `pcb_port[.${sourceComponent.name} > .${padIdentifier}]`\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { cju } from \"../cju\"\nimport { getReadableNameForPcbPort } from \"./get-readable-name-for-pcb-port\"\n\nexport function getReadableNameForPcbSmtpad(\n  soup: AnyCircuitElement[],\n  pcb_smtpad_id: string,\n): string {\n  // Find the pcb_smtpad object\n  const pcbSmtpad = cju(soup).pcb_smtpad.get(pcb_smtpad_id)\n\n  if (!pcbSmtpad || !pcbSmtpad.pcb_port_id) {\n    return `smtpad[${pcb_smtpad_id}]`\n  }\n\n  return getReadableNameForPcbPort(soup, pcbSmtpad.pcb_port_id)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { getReadableNameForPcbTrace } from \"./get-readable-name-for-pcb-trace\"\nimport { getReadableNameForPcbSmtpad } from \"./get-readable-name-for-pcb-smtpad\"\nimport { getReadableNameForPcbPort } from \"./get-readable-name-for-pcb-port\"\nimport { getElementById } from \"lib/get-element-by-id\"\nimport { getElementId } from \"lib/get-element-id\"\n\nexport const getReadableNameForElement = (\n  soup: AnyCircuitElement[],\n  elm: AnyCircuitElement | string,\n): string => {\n  if (typeof elm === \"string\") {\n    const elmObj = getElementById(soup, elm)\n    if (!elmObj) `unknown (could not find element with id ${elm})`\n    return getReadableNameForElement(soup, elmObj as any)\n  }\n  switch (elm.type) {\n    case \"pcb_port\":\n      return getReadableNameForPcbPort(soup, elm.pcb_port_id)\n    case \"pcb_smtpad\":\n      return getReadableNameForPcbSmtpad(soup, elm.pcb_smtpad_id)\n    case \"pcb_trace\":\n      return getReadableNameForPcbTrace(soup, elm.pcb_trace_id)\n    case \"source_component\":\n      return `source_component[${elm.name}]`\n    default:\n      return `${elm.type}[#${getElementId(elm)}]`\n  }\n}\n\nexport {\n  getReadableNameForPcbPort,\n  getReadableNameForPcbSmtpad,\n  getReadableNameForPcbTrace,\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nconst mergeBounds = (\n  currentBounds: {\n    minX: number\n    minY: number\n    maxX: number\n    maxY: number\n  },\n  nextBounds: {\n    minX: number\n    minY: number\n    maxX: number\n    maxY: number\n  },\n) => ({\n  minX: Math.min(currentBounds.minX, nextBounds.minX),\n  minY: Math.min(currentBounds.minY, nextBounds.minY),\n  maxX: Math.max(currentBounds.maxX, nextBounds.maxX),\n  maxY: Math.max(currentBounds.maxY, nextBounds.maxY),\n})\n\nconst getCircleBounds = (x: number, y: number, diameter: number) => {\n  const radius = diameter / 2\n  return {\n    minX: x - radius,\n    minY: y - radius,\n    maxX: x + radius,\n    maxY: y + radius,\n  }\n}\n\nconst getRotatedRectBounds = (\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  rotationDegrees: number,\n) => {\n  const halfWidth = width / 2\n  const halfHeight = height / 2\n  const theta = (rotationDegrees * Math.PI) / 180\n  const cosTheta = Math.cos(theta)\n  const sinTheta = Math.sin(theta)\n\n  const corners = [\n    { x: -halfWidth, y: -halfHeight },\n    { x: halfWidth, y: -halfHeight },\n    { x: halfWidth, y: halfHeight },\n    { x: -halfWidth, y: halfHeight },\n  ].map((corner) => ({\n    x: x + corner.x * cosTheta - corner.y * sinTheta,\n    y: y + corner.x * sinTheta + corner.y * cosTheta,\n  }))\n\n  return {\n    minX: Math.min(...corners.map((corner) => corner.x)),\n    minY: Math.min(...corners.map((corner) => corner.y)),\n    maxX: Math.max(...corners.map((corner) => corner.x)),\n    maxY: Math.max(...corners.map((corner) => corner.y)),\n  }\n}\n\nexport const getBoundsOfPcbElements = (\n  elements: AnyCircuitElement[],\n): { minX: number; minY: number; maxX: number; maxY: number } => {\n  let minX = Number.POSITIVE_INFINITY\n  let minY = Number.POSITIVE_INFINITY\n  let maxX = Number.NEGATIVE_INFINITY\n  let maxY = Number.NEGATIVE_INFINITY\n\n  for (const elm of elements) {\n    if (!elm.type.startsWith(\"pcb_\")) continue\n\n    // Handle polygon-shaped SMT pads with points array\n    if (\n      elm.type === \"pcb_smtpad\" &&\n      elm.shape === \"polygon\" &&\n      Array.isArray(elm.points)\n    ) {\n      for (const point of elm.points) {\n        minX = Math.min(minX, point.x)\n        minY = Math.min(minY, point.y)\n        maxX = Math.max(maxX, point.x)\n        maxY = Math.max(maxY, point.y)\n      }\n      continue\n    }\n\n    if (elm.type === \"pcb_hole\" && elm.hole_shape === \"circle\") {\n      const holeBounds = getCircleBounds(elm.x, elm.y, elm.hole_diameter)\n      minX = Math.min(minX, holeBounds.minX)\n      minY = Math.min(minY, holeBounds.minY)\n      maxX = Math.max(maxX, holeBounds.maxX)\n      maxY = Math.max(maxY, holeBounds.maxY)\n      continue\n    }\n\n    if (elm.type === \"pcb_plated_hole\") {\n      let platedHoleBounds:\n        | {\n            minX: number\n            minY: number\n            maxX: number\n            maxY: number\n          }\n        | undefined\n\n      if (\"outer_diameter\" in elm && typeof elm.outer_diameter === \"number\") {\n        platedHoleBounds = getCircleBounds(elm.x, elm.y, elm.outer_diameter)\n      } else if (\n        \"hole_diameter\" in elm &&\n        typeof elm.hole_diameter === \"number\"\n      ) {\n        platedHoleBounds = getCircleBounds(elm.x, elm.y, elm.hole_diameter)\n      }\n\n      if (\n        \"rect_pad_width\" in elm &&\n        typeof elm.rect_pad_width === \"number\" &&\n        \"rect_pad_height\" in elm &&\n        typeof elm.rect_pad_height === \"number\"\n      ) {\n        const rectBounds = getRotatedRectBounds(\n          elm.x,\n          elm.y,\n          elm.rect_pad_width,\n          elm.rect_pad_height,\n          \"rect_ccw_rotation\" in elm ? (elm.rect_ccw_rotation ?? 0) : 0,\n        )\n        platedHoleBounds = platedHoleBounds\n          ? mergeBounds(platedHoleBounds, rectBounds)\n          : rectBounds\n      }\n\n      if (\"hole_diameter\" in elm && typeof elm.hole_diameter === \"number\") {\n        const drillBounds = getCircleBounds(\n          elm.x +\n            (\"hole_offset_x\" in elm ? ((elm.hole_offset_x as number) ?? 0) : 0),\n          elm.y +\n            (\"hole_offset_y\" in elm ? ((elm.hole_offset_y as number) ?? 0) : 0),\n          elm.hole_diameter,\n        )\n        platedHoleBounds = platedHoleBounds\n          ? mergeBounds(platedHoleBounds, drillBounds)\n          : drillBounds\n      }\n\n      if (platedHoleBounds) {\n        minX = Math.min(minX, platedHoleBounds.minX)\n        minY = Math.min(minY, platedHoleBounds.minY)\n        maxX = Math.max(maxX, platedHoleBounds.maxX)\n        maxY = Math.max(maxY, platedHoleBounds.maxY)\n        continue\n      }\n    }\n\n    let centerX: number | undefined\n    let centerY: number | undefined\n\n    let width: number | undefined\n    let height: number | undefined\n\n    if (\"x\" in elm && \"y\" in elm) {\n      centerX = Number((elm as any).x)\n      centerY = Number((elm as any).y)\n    }\n\n    if (\"outer_diameter\" in elm) {\n      width = Number((elm as any).outer_diameter)\n      height = Number((elm as any).outer_diameter)\n    }\n\n    if (\"width\" in elm) {\n      width = Number((elm as any).width)\n    }\n\n    if (\"height\" in elm) {\n      height = Number((elm as any).height)\n    }\n\n    if (\"center\" in elm) {\n      // @ts-ignore\n      centerX = elm.center.x\n      // @ts-ignore\n      centerY = elm.center.y\n    }\n\n    if (centerX !== undefined && centerY !== undefined) {\n      minX = Math.min(minX, centerX)\n      minY = Math.min(minY, centerY)\n      maxX = Math.max(maxX, centerX)\n      maxY = Math.max(maxY, centerY)\n\n      if (width !== undefined && height !== undefined) {\n        minX = Math.min(minX, centerX - width / 2)\n        minY = Math.min(minY, centerY - height / 2)\n        maxX = Math.max(maxX, centerX + width / 2)\n        maxY = Math.max(maxY, centerY + height / 2)\n      }\n\n      if (\"radius\" in elm) {\n        minX = Math.min(minX, centerX - elm.radius)\n        minY = Math.min(minY, centerY - elm.radius)\n        maxX = Math.max(maxX, centerX + elm.radius)\n        maxY = Math.max(maxY, centerY + elm.radius)\n      }\n    } else if (elm.type === \"pcb_trace\") {\n      for (const point of elm.route) {\n        // TODO add trace thickness support\n        minX = Math.min(minX, point.x)\n        minY = Math.min(minY, point.y)\n        maxX = Math.max(maxX, point.x)\n        maxY = Math.max(maxY, point.y)\n      }\n    } else if (elm.type === \"pcb_courtyard_outline\") {\n      for (const point of elm.outline) {\n        minX = Math.min(minX, point.x)\n        minY = Math.min(minY, point.y)\n        maxX = Math.max(maxX, point.x)\n        maxY = Math.max(maxY, point.y)\n      }\n    } else if (elm.type === \"pcb_courtyard_polygon\") {\n      for (const point of elm.points) {\n        minX = Math.min(minX, point.x)\n        minY = Math.min(minY, point.y)\n        maxX = Math.max(maxX, point.x)\n        maxY = Math.max(maxY, point.y)\n      }\n    }\n  }\n\n  return { minX, minY, maxX, maxY }\n}\n","import type { PcbBoard } from \"circuit-json\"\n\nexport interface BoardBounds {\n  minX: number\n  minY: number\n  maxX: number\n  maxY: number\n  width: number\n  height: number\n  center: {\n    x: number\n    y: number\n  }\n}\n\nexport const getBoardBounds = (board: PcbBoard): BoardBounds => {\n  if (board.width && board.height && board.center) {\n    const halfWidth = board.width / 2\n    const halfHeight = board.height / 2\n\n    return {\n      minX: board.center.x - halfWidth,\n      minY: board.center.y - halfHeight,\n      maxX: board.center.x + halfWidth,\n      maxY: board.center.y + halfHeight,\n      width: board.width,\n      height: board.height,\n      center: {\n        x: board.center.x,\n        y: board.center.y,\n      },\n    }\n  }\n\n  if (!board.outline || board.outline.length === 0) {\n    throw new Error(\n      \"Unable to compute board bounds. pcb_board must include width/height/center or a non-empty outline.\",\n    )\n  }\n\n  let minX = Number.POSITIVE_INFINITY\n  let minY = Number.POSITIVE_INFINITY\n  let maxX = Number.NEGATIVE_INFINITY\n  let maxY = Number.NEGATIVE_INFINITY\n\n  for (const point of board.outline) {\n    minX = Math.min(minX, point.x)\n    minY = Math.min(minY, point.y)\n    maxX = Math.max(maxX, point.x)\n    maxY = Math.max(maxY, point.y)\n  }\n\n  const width = maxX - minX\n  const height = maxY - minY\n\n  return {\n    minX,\n    minY,\n    maxX,\n    maxY,\n    width,\n    height,\n    center: {\n      x: minX + width / 2,\n      y: minY + height / 2,\n    },\n  }\n}\n","export function stringHash(str: string) {\n  let hash = 0\n  if (str.length == 0) return hash\n  for (var i = 0; i < str.length; i++) {\n    var char = str.charCodeAt(i)\n    hash = (hash << 5) - hash + char\n    hash = hash & hash // Convert to 32bit integer\n  }\n  return Math.abs(hash)\n}\n","import { stringHash } from \"./string-hash\"\n\nexport type LayoutDebugObject = {\n  x: number\n  y: number\n  width: number\n  height: number\n  bg_color: string\n  title: string\n  content: Object\n  secondary?: boolean\n}\n\n/**\n * Vendored from \"nice-color-palettes\" package\n */\nconst nice_color_palettes = [\n  [\"#69d2e7\", \"#a7dbd8\", \"#e0e4cc\", \"#f38630\", \"#fa6900\"],\n  [\"#fe4365\", \"#fc9d9a\", \"#f9cdad\", \"#c8c8a9\", \"#83af9b\"],\n  [\"#ecd078\", \"#d95b43\", \"#c02942\", \"#542437\", \"#53777a\"],\n  [\"#556270\", \"#4ecdc4\", \"#c7f464\", \"#ff6b6b\", \"#c44d58\"],\n  [\"#774f38\", \"#e08e79\", \"#f1d4af\", \"#ece5ce\", \"#c5e0dc\"],\n  [\"#e8ddcb\", \"#cdb380\", \"#036564\", \"#033649\", \"#031634\"],\n  [\"#490a3d\", \"#bd1550\", \"#e97f02\", \"#f8ca00\", \"#8a9b0f\"],\n  [\"#594f4f\", \"#547980\", \"#45ada8\", \"#9de0ad\", \"#e5fcc2\"],\n  [\"#00a0b0\", \"#6a4a3c\", \"#cc333f\", \"#eb6841\", \"#edc951\"],\n  [\"#e94e77\", \"#d68189\", \"#c6a49a\", \"#c6e5d9\", \"#f4ead5\"],\n  [\"#3fb8af\", \"#7fc7af\", \"#dad8a7\", \"#ff9e9d\", \"#ff3d7f\"],\n  [\"#d9ceb2\", \"#948c75\", \"#d5ded9\", \"#7a6a53\", \"#99b2b7\"],\n  [\"#ffffff\", \"#cbe86b\", \"#f2e9e1\", \"#1c140d\", \"#cbe86b\"],\n  [\"#efffcd\", \"#dce9be\", \"#555152\", \"#2e2633\", \"#99173c\"],\n  [\"#343838\", \"#005f6b\", \"#008c9e\", \"#00b4cc\", \"#00dffc\"],\n  [\"#413e4a\", \"#73626e\", \"#b38184\", \"#f0b49e\", \"#f7e4be\"],\n  [\"#ff4e50\", \"#fc913a\", \"#f9d423\", \"#ede574\", \"#e1f5c4\"],\n  [\"#99b898\", \"#fecea8\", \"#ff847c\", \"#e84a5f\", \"#2a363b\"],\n  [\"#655643\", \"#80bca3\", \"#f6f7bd\", \"#e6ac27\", \"#bf4d28\"],\n  [\"#00a8c6\", \"#40c0cb\", \"#f9f2e7\", \"#aee239\", \"#8fbe00\"],\n  [\"#351330\", \"#424254\", \"#64908a\", \"#e8caa4\", \"#cc2a41\"],\n  [\"#554236\", \"#f77825\", \"#d3ce3d\", \"#f1efa5\", \"#60b99a\"],\n  [\"#5d4157\", \"#838689\", \"#a8caba\", \"#cad7b2\", \"#ebe3aa\"],\n  [\"#8c2318\", \"#5e8c6a\", \"#88a65e\", \"#bfb35a\", \"#f2c45a\"],\n  [\"#fad089\", \"#ff9c5b\", \"#f5634a\", \"#ed303c\", \"#3b8183\"],\n  [\"#ff4242\", \"#f4fad2\", \"#d4ee5e\", \"#e1edb9\", \"#f0f2eb\"],\n  [\"#f8b195\", \"#f67280\", \"#c06c84\", \"#6c5b7b\", \"#355c7d\"],\n  [\"#d1e751\", \"#ffffff\", \"#000000\", \"#4dbce9\", \"#26ade4\"],\n  [\"#1b676b\", \"#519548\", \"#88c425\", \"#bef202\", \"#eafde6\"],\n  [\"#5e412f\", \"#fcebb6\", \"#78c0a8\", \"#f07818\", \"#f0a830\"],\n  [\"#bcbdac\", \"#cfbe27\", \"#f27435\", \"#f02475\", \"#3b2d38\"],\n  [\"#452632\", \"#91204d\", \"#e4844a\", \"#e8bf56\", \"#e2f7ce\"],\n  [\"#eee6ab\", \"#c5bc8e\", \"#696758\", \"#45484b\", \"#36393b\"],\n  [\"#f0d8a8\", \"#3d1c00\", \"#86b8b1\", \"#f2d694\", \"#fa2a00\"],\n  [\"#2a044a\", \"#0b2e59\", \"#0d6759\", \"#7ab317\", \"#a0c55f\"],\n  [\"#f04155\", \"#ff823a\", \"#f2f26f\", \"#fff7bd\", \"#95cfb7\"],\n  [\"#b9d7d9\", \"#668284\", \"#2a2829\", \"#493736\", \"#7b3b3b\"],\n  [\"#bbbb88\", \"#ccc68d\", \"#eedd99\", \"#eec290\", \"#eeaa88\"],\n  [\"#b3cc57\", \"#ecf081\", \"#ffbe40\", \"#ef746f\", \"#ab3e5b\"],\n  [\"#a3a948\", \"#edb92e\", \"#f85931\", \"#ce1836\", \"#009989\"],\n  [\"#300030\", \"#480048\", \"#601848\", \"#c04848\", \"#f07241\"],\n  [\"#67917a\", \"#170409\", \"#b8af03\", \"#ccbf82\", \"#e33258\"],\n  [\"#aab3ab\", \"#c4cbb7\", \"#ebefc9\", \"#eee0b7\", \"#e8caaf\"],\n  [\"#e8d5b7\", \"#0e2430\", \"#fc3a51\", \"#f5b349\", \"#e8d5b9\"],\n  [\"#ab526b\", \"#bca297\", \"#c5ceae\", \"#f0e2a4\", \"#f4ebc3\"],\n  [\"#607848\", \"#789048\", \"#c0d860\", \"#f0f0d8\", \"#604848\"],\n  [\"#b6d8c0\", \"#c8d9bf\", \"#dadabd\", \"#ecdbbc\", \"#fedcba\"],\n  [\"#a8e6ce\", \"#dcedc2\", \"#ffd3b5\", \"#ffaaa6\", \"#ff8c94\"],\n  [\"#3e4147\", \"#fffedf\", \"#dfba69\", \"#5a2e2e\", \"#2a2c31\"],\n  [\"#fc354c\", \"#29221f\", \"#13747d\", \"#0abfbc\", \"#fcf7c5\"],\n  [\"#cc0c39\", \"#e6781e\", \"#c8cf02\", \"#f8fcc1\", \"#1693a7\"],\n  [\"#1c2130\", \"#028f76\", \"#b3e099\", \"#ffeaad\", \"#d14334\"],\n  [\"#a7c5bd\", \"#e5ddcb\", \"#eb7b59\", \"#cf4647\", \"#524656\"],\n  [\"#dad6ca\", \"#1bb0ce\", \"#4f8699\", \"#6a5e72\", \"#563444\"],\n  [\"#5c323e\", \"#a82743\", \"#e15e32\", \"#c0d23e\", \"#e5f04c\"],\n  [\"#edebe6\", \"#d6e1c7\", \"#94c7b6\", \"#403b33\", \"#d3643b\"],\n  [\"#fdf1cc\", \"#c6d6b8\", \"#987f69\", \"#e3ad40\", \"#fcd036\"],\n  [\"#230f2b\", \"#f21d41\", \"#ebebbc\", \"#bce3c5\", \"#82b3ae\"],\n  [\"#b9d3b0\", \"#81bda4\", \"#b28774\", \"#f88f79\", \"#f6aa93\"],\n  [\"#3a111c\", \"#574951\", \"#83988e\", \"#bcdea5\", \"#e6f9bc\"],\n  [\"#5e3929\", \"#cd8c52\", \"#b7d1a3\", \"#dee8be\", \"#fcf7d3\"],\n  [\"#1c0113\", \"#6b0103\", \"#a30006\", \"#c21a01\", \"#f03c02\"],\n  [\"#000000\", \"#9f111b\", \"#b11623\", \"#292c37\", \"#cccccc\"],\n  [\"#382f32\", \"#ffeaf2\", \"#fcd9e5\", \"#fbc5d8\", \"#f1396d\"],\n  [\"#e3dfba\", \"#c8d6bf\", \"#93ccc6\", \"#6cbdb5\", \"#1a1f1e\"],\n  [\"#f6f6f6\", \"#e8e8e8\", \"#333333\", \"#990100\", \"#b90504\"],\n  [\"#1b325f\", \"#9cc4e4\", \"#e9f2f9\", \"#3a89c9\", \"#f26c4f\"],\n  [\"#a1dbb2\", \"#fee5ad\", \"#faca66\", \"#f7a541\", \"#f45d4c\"],\n  [\"#c1b398\", \"#605951\", \"#fbeec2\", \"#61a6ab\", \"#accec0\"],\n  [\"#5e9fa3\", \"#dcd1b4\", \"#fab87f\", \"#f87e7b\", \"#b05574\"],\n  [\"#951f2b\", \"#f5f4d7\", \"#e0dfb1\", \"#a5a36c\", \"#535233\"],\n  [\"#8dccad\", \"#988864\", \"#fea6a2\", \"#f9d6ac\", \"#ffe9af\"],\n  [\"#2d2d29\", \"#215a6d\", \"#3ca2a2\", \"#92c7a3\", \"#dfece6\"],\n  [\"#413d3d\", \"#040004\", \"#c8ff00\", \"#fa023c\", \"#4b000f\"],\n  [\"#eff3cd\", \"#b2d5ba\", \"#61ada0\", \"#248f8d\", \"#605063\"],\n  [\"#ffefd3\", \"#fffee4\", \"#d0ecea\", \"#9fd6d2\", \"#8b7a5e\"],\n  [\"#cfffdd\", \"#b4dec1\", \"#5c5863\", \"#a85163\", \"#ff1f4c\"],\n  [\"#9dc9ac\", \"#fffec7\", \"#f56218\", \"#ff9d2e\", \"#919167\"],\n  [\"#4e395d\", \"#827085\", \"#8ebe94\", \"#ccfc8e\", \"#dc5b3e\"],\n  [\"#a8a7a7\", \"#cc527a\", \"#e8175d\", \"#474747\", \"#363636\"],\n  [\"#f8edd1\", \"#d88a8a\", \"#474843\", \"#9d9d93\", \"#c5cfc6\"],\n  [\"#046d8b\", \"#309292\", \"#2fb8ac\", \"#93a42a\", \"#ecbe13\"],\n  [\"#f38a8a\", \"#55443d\", \"#a0cab5\", \"#cde9ca\", \"#f1edd0\"],\n  [\"#a70267\", \"#f10c49\", \"#fb6b41\", \"#f6d86b\", \"#339194\"],\n  [\"#ff003c\", \"#ff8a00\", \"#fabe28\", \"#88c100\", \"#00c176\"],\n  [\"#ffedbf\", \"#f7803c\", \"#f54828\", \"#2e0d23\", \"#f8e4c1\"],\n  [\"#4e4d4a\", \"#353432\", \"#94ba65\", \"#2790b0\", \"#2b4e72\"],\n  [\"#0ca5b0\", \"#4e3f30\", \"#fefeeb\", \"#f8f4e4\", \"#a5b3aa\"],\n  [\"#4d3b3b\", \"#de6262\", \"#ffb88c\", \"#ffd0b3\", \"#f5e0d3\"],\n  [\"#fffbb7\", \"#a6f6af\", \"#66b6ab\", \"#5b7c8d\", \"#4f2958\"],\n  [\"#edf6ee\", \"#d1c089\", \"#b3204d\", \"#412e28\", \"#151101\"],\n  [\"#9d7e79\", \"#ccac95\", \"#9a947c\", \"#748b83\", \"#5b756c\"],\n  [\"#fcfef5\", \"#e9ffe1\", \"#cdcfb7\", \"#d6e6c3\", \"#fafbe3\"],\n  [\"#9cddc8\", \"#bfd8ad\", \"#ddd9ab\", \"#f7af63\", \"#633d2e\"],\n  [\"#30261c\", \"#403831\", \"#36544f\", \"#1f5f61\", \"#0b8185\"],\n  [\"#aaff00\", \"#ffaa00\", \"#ff00aa\", \"#aa00ff\", \"#00aaff\"],\n  [\"#d1313d\", \"#e5625c\", \"#f9bf76\", \"#8eb2c5\", \"#615375\"],\n  [\"#ffe181\", \"#eee9e5\", \"#fad3b2\", \"#ffba7f\", \"#ff9c97\"],\n  [\"#73c8a9\", \"#dee1b6\", \"#e1b866\", \"#bd5532\", \"#373b44\"],\n  [\"#805841\", \"#dcf7f3\", \"#fffcdd\", \"#ffd8d8\", \"#f5a2a2\"],\n]\n\nexport const getDebugLayoutObject = (lo: any): LayoutDebugObject | null => {\n  let {\n    x,\n    y,\n    width,\n    height,\n  }: { x: number; y: number; width?: number; height?: number } = {\n    ...lo,\n    ...(lo as any).size,\n    ...(lo as any).center,\n    ...(lo as any).position,\n  }\n\n  if (\n    lo.x1 !== undefined &&\n    lo.x2 !== undefined &&\n    lo.y1 !== undefined &&\n    lo.y2 !== undefined\n  ) {\n    x = (lo.x1 + lo.x2) / 2\n    y = (lo.y1 + lo.y2) / 2\n    width = Math.abs(lo.x1 - lo.x2)\n    height = Math.abs(lo.y1 - lo.y2)\n  }\n\n  if (lo.points && Array.isArray(lo.points) && lo.points.length > 0) {\n    const xCoords = lo.points.map((point: { x: number }) => point.x)\n    const yCoords = lo.points.map((point: { y: number }) => point.y)\n\n    const minX = Math.min(...xCoords)\n    const maxX = Math.max(...xCoords)\n    const minY = Math.min(...yCoords)\n    const maxY = Math.max(...yCoords)\n\n    x = (minX + maxX) / 2\n    y = (minY + maxY) / 2\n    width = maxX - minX\n    height = maxY - minY\n  }\n\n  const title = lo.text || lo.name || lo.source?.text || lo.source?.name || \"?\"\n  const content = lo\n\n  if (x === undefined || y === undefined) return null\n\n  if (width === undefined) {\n    if (\"outer_diameter\" in lo) {\n      width = lo.outer_diameter\n      height = lo.outer_diameter\n    } else if (\"rect_pad_width\" in lo && \"rect_pad_height\" in lo) {\n      width = lo.rect_pad_width as number\n      height = lo.rect_pad_height as number\n      if (\"hole_diameter\" in lo) {\n        width = Math.max(width, lo.hole_diameter as number)\n        height = Math.max(height, lo.hole_diameter as number)\n      }\n    } else if (\"hole_diameter\" in lo) {\n      width = lo.hole_diameter\n      height = lo.hole_diameter\n    }\n  }\n\n  if (width === undefined || height === undefined) {\n    width = 0.1\n    height = 0.1\n  }\n\n  return {\n    x,\n    y,\n    width,\n    height,\n    title,\n    content,\n    bg_color:\n      nice_color_palettes[\n        stringHash((lo as any).type || title) % nice_color_palettes.length\n      ]?.[4] ?? \"#f00\",\n  }\n}\n","export const isTruthy = <T>(value: T): value is NonNullable<T> => Boolean(value)\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { getDebugLayoutObject } from \"./utils/get-layout-debug-object\"\nimport { isTruthy } from \"./utils/is-truthy\"\n\nexport const findBoundsAndCenter = (\n  elements: AnyCircuitElement[],\n): { center: { x: number; y: number }; width: number; height: number } => {\n  const debugObjects = elements\n    .filter(\n      (elm) => elm.type.startsWith(\"pcb_\") || elm.type.startsWith(\"schematic_\"),\n    )\n    .concat(\n      elements\n        .filter(\n          (elm) => elm.type === \"pcb_trace\" || elm.type === \"schematic_trace\",\n        )\n        // @ts-ignore\n        .flatMap((elm: any) => elm.route),\n    )\n    .map((elm) => getDebugLayoutObject(elm))\n    .filter(isTruthy)\n\n  if (debugObjects.length === 0)\n    return { center: { x: 0, y: 0 }, width: 0, height: 0 }\n\n  let minX = debugObjects[0]!.x - debugObjects[0]!.width / 2\n  let maxX = debugObjects[0]!.x + debugObjects[0]!.width / 2\n  let minY = debugObjects[0]!.y - debugObjects[0]!.height / 2\n  let maxY = debugObjects[0]!.y + debugObjects[0]!.height / 2\n\n  for (const obj of debugObjects.slice(1)) {\n    minX = Math.min(minX, obj.x - obj.width / 2)\n    maxX = Math.max(maxX, obj.x + obj.width / 2)\n    minY = Math.min(minY, obj.y - obj.height / 2)\n    maxY = Math.max(maxY, obj.y + obj.height / 2)\n  }\n\n  const width = maxX - minX\n  const height = maxY - minY\n  const center = { x: minX + width / 2, y: minY + height / 2 }\n\n  return { center, width, height }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\n\nexport const getPrimaryId = (element: AnyCircuitElement): string => {\n  // @ts-ignore\n  return element[`${element.type}_id`]\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { transformPCBElements } from \"./transform-soup-elements\"\nimport { translate } from \"transformation-matrix\"\n\nexport const repositionPcbComponentTo = (\n  circuitJson: AnyCircuitElement[],\n  pcb_component_id: string,\n  newCenter: { x: number; y: number },\n) => {\n  const pcbComponent = circuitJson.find(\n    (e) =>\n      e.type === \"pcb_component\" &&\n      (e as any).pcb_component_id === pcb_component_id,\n  )\n  if (!pcbComponent) return\n\n  const currentCenter =\n    \"center\" in pcbComponent\n      ? (pcbComponent as any).center\n      : { x: (pcbComponent as any).x, y: (pcbComponent as any).y }\n\n  const dx = newCenter.x - currentCenter.x\n  const dy = newCenter.y - currentCenter.y\n\n  const portIds = circuitJson\n    .filter(\n      (e) =>\n        e.type === \"pcb_port\" &&\n        (e as any).pcb_component_id === pcb_component_id,\n    )\n    .map((e) => (e as any).pcb_port_id)\n\n  const elementsToMove = circuitJson.filter((elm) => {\n    if (elm === pcbComponent) return true\n    const anyElm: any = elm\n    if (anyElm.pcb_component_id === pcb_component_id) return true\n    if (\n      Array.isArray(anyElm.pcb_component_ids) &&\n      anyElm.pcb_component_ids.includes(pcb_component_id)\n    )\n      return true\n    if (anyElm.pcb_port_id && portIds.includes(anyElm.pcb_port_id)) return true\n    if (\n      Array.isArray(anyElm.pcb_port_ids) &&\n      anyElm.pcb_port_ids.some((id: string) => portIds.includes(id))\n    )\n      return true\n    if (anyElm.start_pcb_port_id && portIds.includes(anyElm.start_pcb_port_id))\n      return true\n    if (anyElm.end_pcb_port_id && portIds.includes(anyElm.end_pcb_port_id))\n      return true\n    if (\n      Array.isArray(anyElm.route) &&\n      anyElm.route.some(\n        (pt: any) =>\n          (pt.start_pcb_port_id && portIds.includes(pt.start_pcb_port_id)) ||\n          (pt.end_pcb_port_id && portIds.includes(pt.end_pcb_port_id)),\n      )\n    )\n      return true\n    return false\n  })\n\n  const matrix = translate(dx, dy)\n  transformPCBElements(elementsToMove, matrix)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { buildSubtree } from \"./subtree\"\nimport { findBoundsAndCenter } from \"./find-bounds-and-center\"\nimport { transformPCBElements } from \"./transform-soup-elements\"\nimport { translate } from \"transformation-matrix\"\n\nconst findAllDescendantGroupIds = (\n  circuitJson: AnyCircuitElement[],\n  parentGroupId: string,\n): string[] => {\n  const childGroupIds: string[] = []\n  const directChildren = circuitJson\n    .filter(\n      (elm) =>\n        elm.type === \"source_group\" &&\n        (elm as any).parent_source_group_id === parentGroupId,\n    )\n    .map((elm) => (elm as any).source_group_id)\n\n  childGroupIds.push(...directChildren)\n\n  // Recursively find descendants of child groups\n  for (const childId of directChildren) {\n    childGroupIds.push(...findAllDescendantGroupIds(circuitJson, childId))\n  }\n\n  return childGroupIds\n}\n\nexport const repositionPcbGroupTo = (\n  circuitJson: AnyCircuitElement[],\n  source_group_id: string,\n  newCenter: { x: number; y: number },\n) => {\n  // Find all descendant group IDs\n  const allGroupIds = [\n    source_group_id,\n    ...findAllDescendantGroupIds(circuitJson, source_group_id),\n  ]\n\n  // Get all elements for each group (including the main group and its descendants)\n  const allGroupElements = new Set<AnyCircuitElement>()\n\n  for (const groupId of allGroupIds) {\n    const groupElements = buildSubtree(circuitJson, {\n      source_group_id: groupId,\n    })\n    groupElements.forEach((elm) => allGroupElements.add(elm))\n  }\n\n  // Get all port IDs from elements in the group\n  const portIds = Array.from(allGroupElements)\n    .filter((e) => e.type === \"pcb_port\")\n    .map((e) => (e as any).pcb_port_id)\n\n  // Find additional traces that connect to these ports (buildSubtree might miss these)\n  const additionalTraces = circuitJson.filter((elm) => {\n    if (elm.type !== \"pcb_trace\") return false\n    if (allGroupElements.has(elm)) return false // already included\n\n    const anyElm: any = elm\n\n    // Check direct port connections\n    if (anyElm.start_pcb_port_id && portIds.includes(anyElm.start_pcb_port_id))\n      return true\n    if (anyElm.end_pcb_port_id && portIds.includes(anyElm.end_pcb_port_id))\n      return true\n\n    // Check route point connections\n    if (\n      Array.isArray(anyElm.route) &&\n      anyElm.route.some(\n        (pt: any) =>\n          (pt.start_pcb_port_id && portIds.includes(pt.start_pcb_port_id)) ||\n          (pt.end_pcb_port_id && portIds.includes(pt.end_pcb_port_id)),\n      )\n    )\n      return true\n\n    return false\n  })\n\n  // Add additional traces to the elements to move\n  additionalTraces.forEach((trace) => allGroupElements.add(trace))\n\n  // Filter to only PCB elements that can be repositioned\n  const pcbElements = Array.from(allGroupElements).filter((elm) =>\n    elm.type.startsWith(\"pcb_\"),\n  )\n\n  if (pcbElements.length === 0) return\n\n  // Calculate current bounds and center of the group\n  const { center: currentCenter } = findBoundsAndCenter(pcbElements)\n\n  // Calculate translation needed\n  const dx = newCenter.x - currentCenter.x\n  const dy = newCenter.y - currentCenter.y\n\n  // Create translation matrix\n  const matrix = translate(dx, dy)\n\n  // Apply transformation to all PCB elements in the group\n  transformPCBElements(pcbElements, matrix)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { transformSchematicElements } from \"./transform-soup-elements\"\nimport { translate } from \"transformation-matrix\"\n\nexport const repositionSchematicComponentTo = (\n  circuitJson: AnyCircuitElement[],\n  schematic_component_id: string,\n  newCenter: { x: number; y: number },\n) => {\n  const schematicComponent = circuitJson.find(\n    (e) =>\n      e.type === \"schematic_component\" &&\n      (e as any).schematic_component_id === schematic_component_id,\n  )\n  if (!schematicComponent) return\n\n  const currentCenter =\n    \"center\" in schematicComponent\n      ? (schematicComponent as any).center\n      : { x: (schematicComponent as any).x, y: (schematicComponent as any).y }\n\n  const dx = newCenter.x - currentCenter.x\n  const dy = newCenter.y - currentCenter.y\n\n  const portIds = circuitJson\n    .filter(\n      (e) =>\n        e.type === \"schematic_port\" &&\n        (e as any).schematic_component_id === schematic_component_id,\n    )\n    .map((e) => (e as any).schematic_port_id)\n\n  const elementsToMove = circuitJson.filter((elm) => {\n    if (elm === schematicComponent) return true\n    const anyElm: any = elm\n    if (anyElm.schematic_component_id === schematic_component_id) return true\n    if (\n      Array.isArray(anyElm.schematic_component_ids) &&\n      anyElm.schematic_component_ids.includes(schematic_component_id)\n    )\n      return true\n    if (anyElm.schematic_port_id && portIds.includes(anyElm.schematic_port_id))\n      return true\n    if (\n      Array.isArray(anyElm.schematic_port_ids) &&\n      anyElm.schematic_port_ids.some((id: string) => portIds.includes(id))\n    )\n      return true\n    if (\n      anyElm.start_schematic_port_id &&\n      portIds.includes(anyElm.start_schematic_port_id)\n    )\n      return true\n    if (\n      anyElm.end_schematic_port_id &&\n      portIds.includes(anyElm.end_schematic_port_id)\n    )\n      return true\n    if (\n      Array.isArray(anyElm.route) &&\n      anyElm.route.some(\n        (pt: any) =>\n          (pt.start_schematic_port_id &&\n            portIds.includes(pt.start_schematic_port_id)) ||\n          (pt.end_schematic_port_id &&\n            portIds.includes(pt.end_schematic_port_id)),\n      )\n    )\n      return true\n    return false\n  })\n\n  const matrix = translate(dx, dy)\n  transformSchematicElements(elementsToMove, matrix)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { buildSubtree } from \"./subtree\"\nimport { findBoundsAndCenter } from \"./find-bounds-and-center\"\nimport { transformSchematicElements } from \"./transform-soup-elements\"\nimport { translate } from \"transformation-matrix\"\n\nconst findAllDescendantGroupIds = (\n  circuitJson: AnyCircuitElement[],\n  parentGroupId: string,\n): string[] => {\n  const childGroupIds: string[] = []\n  const directChildren = circuitJson\n    .filter(\n      (elm) =>\n        elm.type === \"source_group\" &&\n        (elm as any).parent_source_group_id === parentGroupId,\n    )\n    .map((elm) => (elm as any).source_group_id)\n\n  childGroupIds.push(...directChildren)\n\n  for (const childId of directChildren) {\n    childGroupIds.push(...findAllDescendantGroupIds(circuitJson, childId))\n  }\n\n  return childGroupIds\n}\n\nexport const repositionSchematicGroupTo = (\n  circuitJson: AnyCircuitElement[],\n  source_group_id: string,\n  newCenter: { x: number; y: number },\n) => {\n  const allGroupIds = [\n    source_group_id,\n    ...findAllDescendantGroupIds(circuitJson, source_group_id),\n  ]\n\n  const allGroupElements = new Set<AnyCircuitElement>()\n\n  for (const groupId of allGroupIds) {\n    const groupElements = buildSubtree(circuitJson, {\n      source_group_id: groupId,\n    })\n    groupElements.forEach((elm) => allGroupElements.add(elm))\n  }\n\n  const portIds = Array.from(allGroupElements)\n    .filter((e) => e.type === \"schematic_port\")\n    .map((e) => (e as any).schematic_port_id)\n\n  const additionalTraces = circuitJson.filter((elm) => {\n    if (elm.type !== \"schematic_trace\") return false\n    if (allGroupElements.has(elm)) return false\n\n    const anyElm: any = elm\n\n    if (\n      anyElm.start_schematic_port_id &&\n      portIds.includes(anyElm.start_schematic_port_id)\n    )\n      return true\n    if (\n      anyElm.end_schematic_port_id &&\n      portIds.includes(anyElm.end_schematic_port_id)\n    )\n      return true\n    if (\n      Array.isArray(anyElm.route) &&\n      anyElm.route.some(\n        (pt: any) =>\n          (pt.start_schematic_port_id &&\n            portIds.includes(pt.start_schematic_port_id)) ||\n          (pt.end_schematic_port_id &&\n            portIds.includes(pt.end_schematic_port_id)),\n      )\n    )\n      return true\n\n    return false\n  })\n\n  additionalTraces.forEach((trace) => allGroupElements.add(trace))\n\n  const schematicElements = Array.from(allGroupElements).filter((elm) =>\n    elm.type.startsWith(\"schematic_\"),\n  )\n  if (schematicElements.length === 0) return\n\n  const { center: currentCenter } = findBoundsAndCenter(schematicElements)\n\n  const dx = newCenter.x - currentCenter.x\n  const dy = newCenter.y - currentCenter.y\n\n  const matrix = translate(dx, dy)\n\n  transformSchematicElements(schematicElements, matrix)\n}\n","import type {\n  AnyCircuitElement,\n  SourceComponentBase,\n  SourceGroup,\n} from \"circuit-json\"\n\n/**\n * A tree of circuit elements. This is often used for layout because you want\n * to consider only the top-level elements of a group for layout (child groups\n * move together)\n */\nexport interface CircuitJsonTreeNode {\n  nodeType: \"group\" | \"component\"\n  sourceGroup?: SourceGroup\n  sourceComponent?: SourceComponentBase\n  childNodes: Array<CircuitJsonTreeNode>\n  otherChildElements: Array<AnyCircuitElement>\n}\n\nexport const getCircuitJsonTree = (\n  circuitJson: AnyCircuitElement[],\n  opts?: {\n    source_group_id?: string\n  },\n): CircuitJsonTreeNode => {\n  type ChildGroupId = string\n  type ParentGroupId = string\n  type GroupId = string\n  const groupChildMap: Map<ParentGroupId, ChildGroupId[]> = new Map()\n\n  // Get all source group IDs present in the circuit JSON\n  const existingGroupIds = new Set<string>()\n  for (const elm of circuitJson) {\n    if (elm.type === \"source_group\") {\n      existingGroupIds.add(elm.source_group_id)\n    }\n  }\n\n  // Find orphaned groups (groups whose parent is not in the circuit JSON)\n  const orphanedGroups: string[] = []\n\n  for (const elm of circuitJson) {\n    if (elm.type === \"source_group\" && elm.parent_source_group_id) {\n      const parentId = elm.parent_source_group_id\n      const childId = elm.source_group_id\n\n      // If parent doesn't exist in circuit JSON, this is an orphaned group\n      if (!existingGroupIds.has(parentId)) {\n        orphanedGroups.push(childId)\n        // Treat orphaned groups as root-level groups\n        if (!groupChildMap.has(childId)) {\n          groupChildMap.set(childId, [])\n        }\n      } else {\n        // Normal parent-child relationship\n        const children = groupChildMap.get(parentId) ?? []\n        children.push(childId)\n        groupChildMap.set(parentId, children)\n        if (!groupChildMap.has(childId)) {\n          groupChildMap.set(childId, [])\n        }\n      }\n    }\n  }\n\n  // Ensure that every source_group, including root-level groups that have no parent,\n  // is present in the groupChildMap. This guarantees that even standalone boards\n  // (with no nested groups) are processed and appear at the top of the tree.\n  for (const elm of circuitJson) {\n    if (\n      elm.type === \"source_group\" &&\n      !groupChildMap.has(elm.source_group_id)\n    ) {\n      groupChildMap.set(elm.source_group_id, [])\n    }\n  }\n\n  const groupNodes = new Map<GroupId, CircuitJsonTreeNode>()\n\n  const getNextGroupId = () => {\n    for (const [parentId, children] of groupChildMap) {\n      if (groupNodes.has(parentId)) continue\n      if (children.every((childId) => groupNodes.has(childId))) {\n        return parentId\n      }\n    }\n    return null\n  }\n\n  // Compute any node we have the dependencies for until we've computed all of\n  // them\n  let lastGroupId: GroupId | null = null\n  while (true) {\n    const nextGroupId = getNextGroupId()\n    if (!nextGroupId) break\n\n    const sourceGroup = circuitJson.find(\n      (elm) =>\n        elm.type === \"source_group\" && elm.source_group_id === nextGroupId,\n    ) as SourceGroup\n\n    // Create the tree node for this group\n    const node: CircuitJsonTreeNode = {\n      nodeType: \"group\",\n      sourceGroup,\n      otherChildElements: [],\n      childNodes: [\n        ...(groupChildMap\n          .get(nextGroupId)\n          ?.map((childId) => groupNodes.get(childId)!) ?? []),\n        ...circuitJson\n          .filter(\n            (elm) =>\n              elm.type === \"source_component\" &&\n              elm.source_group_id === nextGroupId,\n          )\n          .map((elm) => {\n            return {\n              nodeType: \"component\",\n              sourceComponent: elm,\n              childNodes: [],\n              otherChildElements: [\n                ...circuitJson.filter(\n                  (e) =>\n                    e.type === \"pcb_component\" &&\n                    e.source_component_id ===\n                      (elm as SourceComponentBase).source_component_id,\n                ),\n              ], // TODO populate\n            } as CircuitJsonTreeNode\n          }),\n      ],\n    }\n\n    groupNodes.set(nextGroupId, node)\n    lastGroupId = nextGroupId\n  }\n\n  if (!lastGroupId) {\n    console.warn(\"No groups were processed, returning tree without sourceGroup\")\n    return {\n      nodeType: \"group\",\n      childNodes: [], // TODO populate\n      otherChildElements: circuitJson,\n    }\n  }\n\n  // Determine which group to return as root\n  let rootGroupId: string | null = null\n  if (opts && opts.source_group_id !== undefined) {\n    // Use explicitly specified group\n    rootGroupId = opts.source_group_id\n  } else if (orphanedGroups.length > 0) {\n    // Use the first orphaned group as root (most likely scenario when filtering circuit JSON)\n    rootGroupId = orphanedGroups[0]!\n  } else {\n    // Fall back to the last processed group (typically the top-level parent)\n    rootGroupId = lastGroupId as string | null\n  }\n\n  if (!rootGroupId) {\n    console.warn(\n      \"No valid root group found, returning tree without sourceGroup\",\n    )\n    return {\n      nodeType: \"group\",\n      childNodes: [],\n      otherChildElements: circuitJson,\n    }\n  }\n\n  return groupNodes.get(rootGroupId)!\n}\n","import type { CircuitJsonTreeNode } from \"./getCircuitJsonTree\"\n\nexport const getStringFromCircuitJsonTree = (\n  circuitJsonTree: CircuitJsonTreeNode,\n  indent = 0,\n): string => {\n  if (circuitJsonTree.nodeType === \"component\") {\n    return `${\" \".repeat(indent)}${circuitJsonTree.sourceComponent?.name ?? circuitJsonTree.sourceComponent?.source_component_id}`\n  }\n  const lines = []\n\n  lines.push(\n    `${\" \".repeat(indent)}${circuitJsonTree.sourceGroup?.name ?? circuitJsonTree.sourceGroup?.source_group_id}`,\n  )\n  for (const child of circuitJsonTree.childNodes) {\n    lines.push(getStringFromCircuitJsonTree(child, indent + 2))\n  }\n  return lines.join(\"\\n\")\n}\n","export type Size = { width: number; height: number }\n\nimport type { FlexBoxOptions } from \"@tscircuit/miniflex\"\n/**\n * Compute the smallest possible dimensions (width & height) for a flex container\n * so that **all** children fit without overflowing _before_ any flex grow / shrink\n * is applied. This is a very lightweight approximation – it only considers the\n * children's explicit `width`/`height` (or `flexBasis`) plus the configured gaps\n * and the main-axis stacking rules derived from the flex direction.\n *\n * This function purposely does **not** try to implement the full flexbox sizing\n * algorithm – we only need a quick estimate so that `RootFlexBox` can be\n * instantiated even when the user did not provide explicit dimensions for the\n * container (e.g. when laying out PCB components directly on the board level\n * instead of inside a sub-circuit).\n */\nexport function getMinimumFlexContainer(\n  children: Array<{ width: number; height: number }>,\n  options: FlexBoxOptions = {},\n): Size {\n  if (children.length === 0) return { width: 0, height: 0 }\n\n  const direction = options.direction ?? \"row\"\n  const columnGap = options.columnGap ?? 0\n  const rowGap = options.rowGap ?? 0\n\n  // Flexbox main-axis / cross-axis mapping --------------------------------\n  const isRowDirection = direction === \"row\" || direction === \"row-reverse\"\n\n  if (isRowDirection) {\n    // Main-axis horizontally stacks children\n    const totalChildWidth = children.reduce((sum, c) => sum + c.width, 0)\n    const width = totalChildWidth + columnGap * Math.max(0, children.length - 1)\n\n    const height = children.reduce((max, c) => Math.max(max, c.height), 0)\n    return { width, height }\n  } else {\n    // Column direction – stack vertically\n    const totalChildHeight = children.reduce((sum, c) => sum + c.height, 0)\n    const height = totalChildHeight + rowGap * Math.max(0, children.length - 1)\n\n    const width = children.reduce((max, c) => Math.max(max, c.width), 0)\n    return { width, height }\n  }\n}\n","import type { AnyCircuitElement, PcbRenderLayer } from \"circuit-json\"\n\nexport function getElementRenderLayers(\n  element: AnyCircuitElement,\n): PcbRenderLayer[] {\n  // Copper elements (pads, traces, copper pour, copper text)\n  if (element.type === \"pcb_smtpad\") {\n    const layer = element.layer\n    return [`${layer}_copper` as PcbRenderLayer]\n  }\n\n  if (element.type === \"pcb_trace\") {\n    // Traces can span multiple layers, return all layers from route\n    if (!element.route || !Array.isArray(element.route)) return []\n    const layers = new Set<PcbRenderLayer>()\n    for (const point of element.route) {\n      if (\"layer\" in point && point.layer) {\n        layers.add(`${point.layer}_copper` as PcbRenderLayer)\n      }\n    }\n    return Array.from(layers)\n  }\n\n  if (element.type === \"pcb_copper_pour\") {\n    const layer = element.layer\n    return [`${layer}_copper` as PcbRenderLayer]\n  }\n\n  if (element.type === \"pcb_copper_text\") {\n    const layer = element.layer\n    return [`${layer}_copper` as PcbRenderLayer]\n  }\n\n  // Silkscreen elements\n  if (\n    element.type === \"pcb_silkscreen_text\" ||\n    element.type === \"pcb_silkscreen_rect\" ||\n    element.type === \"pcb_silkscreen_circle\" ||\n    element.type === \"pcb_silkscreen_line\" ||\n    element.type === \"pcb_silkscreen_path\"\n  ) {\n    const layer = element.layer\n    return [`${layer}_silkscreen` as PcbRenderLayer]\n  }\n\n  // Fabrication note elements\n  if (\n    element.type === \"pcb_fabrication_note_text\" ||\n    element.type === \"pcb_fabrication_note_rect\" ||\n    element.type === \"pcb_fabrication_note_path\"\n  ) {\n    const layer = element.layer\n    return [`${layer}_fabrication_note` as PcbRenderLayer]\n  }\n\n  // Courtyard elements\n\n  if (\n    element.type === \"pcb_courtyard_circle\" ||\n    element.type === \"pcb_courtyard_polygon\" ||\n    element.type === \"pcb_courtyard_rect\" ||\n    element.type === \"pcb_courtyard_outline\"\n  ) {\n    const layer = element.layer\n    return [`${layer}_courtyard` as PcbRenderLayer]\n  }\n\n  // PCB note elements (user annotations)\n  if (\n    element.type === \"pcb_note_rect\" ||\n    element.type === \"pcb_note_path\" ||\n    element.type === \"pcb_note_text\" ||\n    element.type === \"pcb_note_line\" ||\n    element.type === \"pcb_note_dimension\"\n  ) {\n    const layer = element.layer\n    return [`${layer}_user_note` as PcbRenderLayer]\n  }\n\n  // Elements without layer filtering (always drawn)\n  // These include: pcb_board, pcb_hole, pcb_plated_hole, pcb_via, pcb_cutout\n  return []\n}\n","import type { Point, Polygon, Rect } from \"./types\"\n\nexport const EPSILON = 1e-9\n\nexport const toRadians = (degrees: number) => (degrees * Math.PI) / 180\n\nexport const clamp = (value: number, min: number, max: number) =>\n  Math.max(min, Math.min(max, value))\n\nexport const distanceBetweenPoints = (a: Point, b: Point) =>\n  Math.hypot(a.x - b.x, a.y - b.y)\n\nexport const distanceBetweenPointAndSegment = (\n  point: Point,\n  a: Point,\n  b: Point,\n) => {\n  const abX = b.x - a.x\n  const abY = b.y - a.y\n  const lengthSquared = abX * abX + abY * abY\n\n  if (lengthSquared <= EPSILON) return distanceBetweenPoints(point, a)\n\n  const t = clamp(\n    ((point.x - a.x) * abX + (point.y - a.y) * abY) / lengthSquared,\n    0,\n    1,\n  )\n\n  return Math.hypot(point.x - (a.x + t * abX), point.y - (a.y + t * abY))\n}\n\nexport const cross = (a: Point, b: Point, c: Point) =>\n  (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)\n\nexport const isPointOnSegment = (point: Point, a: Point, b: Point) => {\n  if (Math.abs(cross(a, b, point)) > EPSILON) return false\n\n  return (\n    point.x >= Math.min(a.x, b.x) - EPSILON &&\n    point.x <= Math.max(a.x, b.x) + EPSILON &&\n    point.y >= Math.min(a.y, b.y) - EPSILON &&\n    point.y <= Math.max(a.y, b.y) + EPSILON\n  )\n}\n\nexport const segmentsIntersect = (\n  a1: Point,\n  a2: Point,\n  b1: Point,\n  b2: Point,\n) => {\n  const c1 = cross(a1, a2, b1)\n  const c2 = cross(a1, a2, b2)\n  const c3 = cross(b1, b2, a1)\n  const c4 = cross(b1, b2, a2)\n\n  if (\n    ((c1 > EPSILON && c2 < -EPSILON) || (c1 < -EPSILON && c2 > EPSILON)) &&\n    ((c3 > EPSILON && c4 < -EPSILON) || (c3 < -EPSILON && c4 > EPSILON))\n  ) {\n    return true\n  }\n\n  return (\n    isPointOnSegment(b1, a1, a2) ||\n    isPointOnSegment(b2, a1, a2) ||\n    isPointOnSegment(a1, b1, b2) ||\n    isPointOnSegment(a2, b1, b2)\n  )\n}\n\nexport const getPolygonEdges = (polygon: Polygon): Array<[Point, Point]> => {\n  const edges: Array<[Point, Point]> = []\n\n  if (polygon.points.length < 2) return edges\n\n  for (let i = 0; i < polygon.points.length; i += 1) {\n    const a = polygon.points[i]\n    const b = polygon.points[(i + 1) % polygon.points.length]\n\n    if (!a || !b) continue\n\n    edges.push([a, b])\n  }\n\n  return edges\n}\n\nexport const isPointInPolygon = (point: Point, polygon: Polygon) => {\n  for (const [a, b] of getPolygonEdges(polygon)) {\n    if (isPointOnSegment(point, a, b)) return true\n  }\n\n  let inside = false\n  for (\n    let i = 0, j = polygon.points.length - 1;\n    i < polygon.points.length;\n    j = i++\n  ) {\n    const pi = polygon.points[i]\n    const pj = polygon.points[j]\n\n    if (!pi || !pj) continue\n\n    const intersects =\n      pi.y > point.y !== pj.y > point.y &&\n      point.x < ((pj.x - pi.x) * (point.y - pi.y)) / (pj.y - pi.y) + pi.x\n\n    if (intersects) inside = !inside\n  }\n\n  return inside\n}\n\nexport const rotatePoint = (point: Point, angleRadians: number) => ({\n  x: point.x * Math.cos(angleRadians) - point.y * Math.sin(angleRadians),\n  y: point.x * Math.sin(angleRadians) + point.y * Math.cos(angleRadians),\n})\n\nexport const rectToPolygon = (rect: Rect): Polygon => {\n  const halfWidth = rect.width / 2\n  const halfHeight = rect.height / 2\n  const angle = toRadians(rect.rotationDegrees)\n\n  return {\n    kind: \"polygon\",\n    points: [\n      { x: -halfWidth, y: -halfHeight },\n      { x: halfWidth, y: -halfHeight },\n      { x: halfWidth, y: halfHeight },\n      { x: -halfWidth, y: halfHeight },\n    ].map((localPoint) => {\n      const rotated = rotatePoint(localPoint, angle)\n      return { x: rect.centerX + rotated.x, y: rect.centerY + rotated.y }\n    }),\n  }\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { EPSILON } from \"./geometry\"\nimport type { CopperShape, Point, Rect } from \"./types\"\n\nconst isFiniteNumber = (value: unknown): value is number =>\n  typeof value === \"number\" && Number.isFinite(value)\n\nconst createWireSegmentRect = (\n  start: Point,\n  end: Point,\n  width: number,\n): Rect => ({\n  kind: \"rect\",\n  centerX: (start.x + end.x) / 2,\n  centerY: (start.y + end.y) / 2,\n  width: Math.hypot(end.x - start.x, end.y - start.y),\n  height: width,\n  rotationDegrees:\n    (Math.atan2(end.y - start.y, end.x - start.x) * 180) / Math.PI,\n})\n\nexport const decomposeCopperIntoShapes = (\n  element: AnyCircuitElement,\n): CopperShape[] => {\n  const elm: any = element\n  const shapes: CopperShape[] = []\n\n  if (elm.type === \"pcb_smtpad\") {\n    if (elm.shape === \"circle\" && isFiniteNumber(elm.radius)) {\n      shapes.push({ kind: \"circle\", x: elm.x, y: elm.y, radius: elm.radius })\n    }\n\n    if (\n      elm.shape === \"rect\" &&\n      isFiniteNumber(elm.width) &&\n      isFiniteNumber(elm.height)\n    ) {\n      shapes.push({\n        kind: \"rect\",\n        centerX: elm.x,\n        centerY: elm.y,\n        width: elm.width,\n        height: elm.height,\n        rotationDegrees: isFiniteNumber(elm.ccw_rotation)\n          ? elm.ccw_rotation\n          : 0,\n      })\n    }\n\n    if (elm.shape === \"polygon\" && Array.isArray(elm.points)) {\n      const points = elm.points.filter(\n        (point: any): point is Point =>\n          isFiniteNumber(point?.x) && isFiniteNumber(point?.y),\n      )\n\n      if (points.length >= 3) {\n        shapes.push({ kind: \"polygon\", points })\n      }\n    }\n\n    return shapes\n  }\n\n  if (elm.type === \"pcb_trace\" && Array.isArray(elm.route)) {\n    for (let i = 0; i < elm.route.length - 1; i += 1) {\n      const start = elm.route[i]\n      const end = elm.route[i + 1]\n\n      if (\n        !start ||\n        !end ||\n        start.route_type !== \"wire\" ||\n        end.route_type !== \"wire\" ||\n        !isFiniteNumber(start.x) ||\n        !isFiniteNumber(start.y) ||\n        !isFiniteNumber(end.x) ||\n        !isFiniteNumber(end.y)\n      ) {\n        continue\n      }\n\n      const width = isFiniteNumber(start.width) ? Math.max(0, start.width) : 0\n      const radius = width / 2\n\n      shapes.push({ kind: \"circle\", x: start.x, y: start.y, radius })\n      shapes.push({ kind: \"circle\", x: end.x, y: end.y, radius })\n\n      if (Math.hypot(end.x - start.x, end.y - start.y) > EPSILON) {\n        shapes.push(createWireSegmentRect(start, end, width))\n      }\n    }\n\n    return shapes\n  }\n\n  if (elm.type === \"pcb_via\" && isFiniteNumber(elm.outer_diameter)) {\n    shapes.push({\n      kind: \"circle\",\n      x: elm.x,\n      y: elm.y,\n      radius: elm.outer_diameter / 2,\n    })\n\n    return shapes\n  }\n\n  if (elm.type === \"pcb_plated_hole\") {\n    if (isFiniteNumber(elm.outer_diameter)) {\n      shapes.push({\n        kind: \"circle\",\n        x: elm.x,\n        y: elm.y,\n        radius: elm.outer_diameter / 2,\n      })\n    }\n\n    if (\n      isFiniteNumber(elm.rect_pad_width) &&\n      isFiniteNumber(elm.rect_pad_height)\n    ) {\n      shapes.push({\n        kind: \"rect\",\n        centerX: elm.x,\n        centerY: elm.y,\n        width: elm.rect_pad_width,\n        height: elm.rect_pad_height,\n        rotationDegrees: isFiniteNumber(elm.rect_ccw_rotation)\n          ? elm.rect_ccw_rotation\n          : 0,\n      })\n    }\n\n    if (isFiniteNumber(elm.outer_width) && isFiniteNumber(elm.outer_height)) {\n      shapes.push({\n        kind: \"rect\",\n        centerX: elm.x,\n        centerY: elm.y,\n        width: elm.outer_width,\n        height: elm.outer_height,\n        rotationDegrees: 0,\n      })\n    }\n\n    return shapes\n  }\n\n  return shapes\n}\n","import {\n  distanceBetweenPointAndSegment,\n  getPolygonEdges,\n  isPointInPolygon,\n  rectToPolygon,\n  segmentsIntersect,\n} from \"./geometry\"\nimport type { Circle, CopperShape, Polygon, Rect } from \"./types\"\n\nexport const distanceBetweenCircleAndCircle = (a: Circle, b: Circle) =>\n  Math.max(0, Math.hypot(a.x - b.x, a.y - b.y) - a.radius - b.radius)\n\nexport const distanceBetweenPolygonAndPolygon = (a: Polygon, b: Polygon) => {\n  if (a.points.length < 3 || b.points.length < 3) {\n    return Number.POSITIVE_INFINITY\n  }\n\n  for (const [a1, a2] of getPolygonEdges(a)) {\n    for (const [b1, b2] of getPolygonEdges(b)) {\n      if (segmentsIntersect(a1, a2, b1, b2)) {\n        return 0\n      }\n    }\n  }\n\n  const aPoint = a.points[0]\n  const bPoint = b.points[0]\n  if (\n    (aPoint && isPointInPolygon(aPoint, b)) ||\n    (bPoint && isPointInPolygon(bPoint, a))\n  ) {\n    return 0\n  }\n\n  let minDistance = Number.POSITIVE_INFINITY\n\n  for (const [a1, a2] of getPolygonEdges(a)) {\n    for (const [b1, b2] of getPolygonEdges(b)) {\n      minDistance = Math.min(\n        minDistance,\n        distanceBetweenPointAndSegment(a1, b1, b2),\n        distanceBetweenPointAndSegment(a2, b1, b2),\n        distanceBetweenPointAndSegment(b1, a1, a2),\n        distanceBetweenPointAndSegment(b2, a1, a2),\n      )\n    }\n  }\n\n  return minDistance\n}\n\nexport const distanceBetweenCircleAndPolygon = (\n  circle: Circle,\n  polygon: Polygon,\n) => {\n  if (polygon.points.length < 3) {\n    return Number.POSITIVE_INFINITY\n  }\n\n  if (isPointInPolygon({ x: circle.x, y: circle.y }, polygon)) {\n    return 0\n  }\n\n  let minDistanceToEdge = Number.POSITIVE_INFINITY\n\n  for (const [start, end] of getPolygonEdges(polygon)) {\n    minDistanceToEdge = Math.min(\n      minDistanceToEdge,\n      distanceBetweenPointAndSegment({ x: circle.x, y: circle.y }, start, end),\n    )\n  }\n\n  return Math.max(0, minDistanceToEdge - circle.radius)\n}\n\nexport const distanceBetweenShapes = (\n  a: CopperShape,\n  b: CopperShape,\n): number => {\n  if (a.kind === \"circle\" && b.kind === \"circle\") {\n    return distanceBetweenCircleAndCircle(a, b)\n  }\n\n  if (a.kind === \"rect\" && b.kind === \"rect\") {\n    return distanceBetweenPolygonAndPolygon(rectToPolygon(a), rectToPolygon(b))\n  }\n\n  if (a.kind === \"circle\" && b.kind === \"rect\") {\n    return distanceBetweenCircleAndPolygon(a, rectToPolygon(b))\n  }\n\n  if (a.kind === \"rect\" && b.kind === \"circle\") {\n    return distanceBetweenCircleAndPolygon(b, rectToPolygon(a))\n  }\n\n  if (a.kind === \"circle\" && b.kind === \"polygon\") {\n    return distanceBetweenCircleAndPolygon(a, b)\n  }\n\n  if (a.kind === \"polygon\" && b.kind === \"circle\") {\n    return distanceBetweenCircleAndPolygon(b, a)\n  }\n\n  if (a.kind === \"rect\" && b.kind === \"polygon\") {\n    return distanceBetweenPolygonAndPolygon(rectToPolygon(a), b)\n  }\n\n  if (a.kind === \"polygon\" && b.kind === \"rect\") {\n    return distanceBetweenPolygonAndPolygon(a, rectToPolygon(b))\n  }\n\n  if (a.kind === \"polygon\" && b.kind === \"polygon\") {\n    return distanceBetweenPolygonAndPolygon(a, b)\n  }\n\n  return Number.POSITIVE_INFINITY\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { decomposeCopperIntoShapes } from \"./shape-distances/decompose-copper-into-shapes\"\nimport { distanceBetweenShapes } from \"./shape-distances/distance-between-shapes\"\n\nexport const computeGapBetweenCopper = (\n  elm1: AnyCircuitElement,\n  elm2: AnyCircuitElement,\n): number => {\n  const shapes1 = decomposeCopperIntoShapes(elm1)\n  const shapes2 = decomposeCopperIntoShapes(elm2)\n\n  if (shapes1.length === 0 || shapes2.length === 0) {\n    return Number.POSITIVE_INFINITY\n  }\n\n  let minimumGap = Number.POSITIVE_INFINITY\n\n  for (const shape1 of shapes1) {\n    for (const shape2 of shapes2) {\n      minimumGap = Math.min(minimumGap, distanceBetweenShapes(shape1, shape2))\n    }\n  }\n\n  return minimumGap\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { decomposeCopperIntoShapes } from \"./decompose-copper-into-shapes\"\nimport type { CopperShape, Point } from \"./types\"\n\nconst isFiniteNumber = (value: unknown): value is number =>\n  typeof value === \"number\" && Number.isFinite(value)\n\nconst getCenter = (elm: any): { x: number; y: number } | null => {\n  if (isFiniteNumber(elm?.x) && isFiniteNumber(elm?.y)) {\n    return { x: elm.x, y: elm.y }\n  }\n\n  if (isFiniteNumber(elm?.center?.x) && isFiniteNumber(elm?.center?.y)) {\n    return { x: elm.center.x, y: elm.center.y }\n  }\n\n  return null\n}\n\nconst addCenterBasedShapes = (elm: any, shapes: CopperShape[]) => {\n  const center = getCenter(elm)\n  if (!center) return\n\n  if (elm.shape === \"circle\") {\n    if (isFiniteNumber(elm.radius)) {\n      shapes.push({\n        kind: \"circle\",\n        x: center.x,\n        y: center.y,\n        radius: elm.radius,\n      })\n      return\n    }\n\n    if (isFiniteNumber(elm.diameter)) {\n      shapes.push({\n        kind: \"circle\",\n        x: center.x,\n        y: center.y,\n        radius: elm.diameter / 2,\n      })\n      return\n    }\n  }\n\n  if (\n    elm.shape === \"rect\" &&\n    isFiniteNumber(elm.width) &&\n    isFiniteNumber(elm.height)\n  ) {\n    shapes.push({\n      kind: \"rect\",\n      centerX: center.x,\n      centerY: center.y,\n      width: elm.width,\n      height: elm.height,\n      rotationDegrees: isFiniteNumber(elm.ccw_rotation) ? elm.ccw_rotation : 0,\n    })\n    return\n  }\n\n  if (elm.shape === \"polygon\" && Array.isArray(elm.points)) {\n    const points = elm.points.filter(\n      (point: any): point is Point =>\n        isFiniteNumber(point?.x) && isFiniteNumber(point?.y),\n    )\n\n    if (points.length >= 3) {\n      shapes.push({ kind: \"polygon\", points })\n    }\n  }\n}\n\nexport const decomposeClearanceIntoShapes = (\n  element: AnyCircuitElement,\n): CopperShape[] => {\n  const elm: any = element\n  const shapes: CopperShape[] = [...decomposeCopperIntoShapes(element)]\n\n  if (elm.type === \"pcb_hole\" && elm.hole_shape === \"circle\") {\n    if (\n      isFiniteNumber(elm.hole_diameter) &&\n      isFiniteNumber(elm.x) &&\n      isFiniteNumber(elm.y)\n    ) {\n      shapes.push({\n        kind: \"circle\",\n        x: elm.x,\n        y: elm.y,\n        radius: elm.hole_diameter / 2,\n      })\n    }\n    return shapes\n  }\n\n  if (elm.type === \"pcb_plated_hole\") {\n    if (\n      isFiniteNumber(elm.hole_diameter) &&\n      isFiniteNumber(elm.x) &&\n      isFiniteNumber(elm.y)\n    ) {\n      const holeOffsetX = isFiniteNumber(elm.hole_offset_x)\n        ? elm.hole_offset_x\n        : 0\n      const holeOffsetY = isFiniteNumber(elm.hole_offset_y)\n        ? elm.hole_offset_y\n        : 0\n      shapes.push({\n        kind: \"circle\",\n        x: elm.x + holeOffsetX,\n        y: elm.y + holeOffsetY,\n        radius: elm.hole_diameter / 2,\n      })\n    }\n    return shapes\n  }\n\n  if (\n    elm.type === \"pcb_keepout\" ||\n    elm.type === \"pcb_cutout\" ||\n    elm.type === \"pcb_board\"\n  ) {\n    addCenterBasedShapes(elm, shapes)\n    return shapes\n  }\n\n  return shapes\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport { decomposeClearanceIntoShapes } from \"./shape-distances/decompose-clearance-into-shapes\"\nimport { distanceBetweenShapes } from \"./shape-distances/distance-between-shapes\"\n\nexport const computeClearanceBetweenElements = (\n  elm1: AnyCircuitElement,\n  elm2: AnyCircuitElement,\n): number => {\n  const shapes1 = decomposeClearanceIntoShapes(elm1)\n  const shapes2 = decomposeClearanceIntoShapes(elm2)\n\n  if (shapes1.length === 0 || shapes2.length === 0) {\n    return Number.POSITIVE_INFINITY\n  }\n\n  let minimumGap = Number.POSITIVE_INFINITY\n\n  for (const shape1 of shapes1) {\n    for (const shape2 of shapes2) {\n      minimumGap = Math.min(minimumGap, distanceBetweenShapes(shape1, shape2))\n    }\n  }\n\n  return minimumGap\n}\n","export type DrcCategory =\n  | \"netlist\"\n  | \"pin_specification\"\n  | \"placement\"\n  | \"routing\"\n  | \"unknown\"\n\ntype DrcLike = {\n  type?: string\n  error_type?: string\n  warning_type?: string\n}\n\nconst NETLIST_TYPES = new Set([\"source_pin_must_be_connected_error\"])\n\nconst PIN_SPECIFICATION_TYPES = new Set([\n  \"source_component_pins_underspecified_warning\",\n  \"source_no_power_pin_defined_warning\",\n  \"source_no_ground_pin_defined_warning\",\n])\n\nconst PLACEMENT_TYPES = new Set([\n  \"pcb_placement_error\",\n  \"pcb_component_outside_board_error\",\n  \"pcb_courtyard_overlap_error\",\n  \"pcb_footprint_overlap_error\",\n  \"pcb_connector_not_in_accessible_orientation_warning\",\n])\n\nconst ROUTING_TYPES = new Set([\n  \"pcb_port_not_connected_error\",\n  \"pcb_trace_missing_error\",\n  \"pcb_trace_error\",\n  \"pcb_via_clearance_error\",\n])\n\nexport const categorizeErrorOrWarning = (\n  value: string | DrcLike,\n): DrcCategory => {\n  const drcType =\n    typeof value === \"string\"\n      ? value\n      : (value.error_type ?? value.warning_type ?? value.type)\n\n  if (!drcType) return \"unknown\"\n\n  if (NETLIST_TYPES.has(drcType)) return \"netlist\"\n  if (PIN_SPECIFICATION_TYPES.has(drcType)) return \"pin_specification\"\n  if (PLACEMENT_TYPES.has(drcType)) return \"placement\"\n  if (ROUTING_TYPES.has(drcType)) return \"routing\"\n\n  return \"unknown\"\n}\n","const unitToMm: { [key: string]: number } = {\n  in: 25.4,\n  inch: 25.4,\n  mil: 0.0254,\n  mm: 1,\n  m: 1000,\n  cm: 10,\n  ft: 304.8,\n  feet: 304.8,\n}\n\nconst mmNumberFormatter = new Intl.NumberFormat(\"en-US\", {\n  useGrouping: false,\n  notation: \"standard\",\n  maximumFractionDigits: 12,\n})\n\nexport const mm = (n: number | string): number => {\n  let unit =\n    typeof n === \"number\" ? \"mm\" : n.replace(/^[^a-zA-Z]+/g, \"\").toLowerCase()\n  if (!unit) unit = \"mm\"\n  const val = typeof n === \"number\" ? n : Number.parseFloat(n.split(unit)[0])\n\n  if (unit in unitToMm) {\n    return val * unitToMm[unit]\n  }\n  throw new Error(`Unsupported unit: ${unit}`)\n}\n\nexport const mmStr = (n: number | string): string => {\n  return `${mmNumberFormatter.format(mm(n))}mm`\n}\n\nexport const mil2mm = (mil: number | string) => {\n  if (typeof mil === \"number\") return mm(`${mil}mil`)\n  if (mil.match(/^\\d+$/)) return mm(`${mil}mil`)\n  return mm(mil)\n}\n\nexport default mm\n","export interface Point {\n  x: number\n  y: number\n}\n\nexport function calculateCenter(start: Point, mid: Point, end: Point): Point {\n  const mid1 = { x: (start.x + mid.x) / 2, y: (start.y + mid.y) / 2 }\n  const mid2 = { x: (mid.x + end.x) / 2, y: (mid.y + end.y) / 2 }\n\n  const slope1 = -(start.x - mid.x) / (start.y - mid.y)\n  const slope2 = -(mid.x - end.x) / (mid.y - end.y)\n\n  const centerX =\n    (mid1.y - mid2.y + slope2 * mid2.x - slope1 * mid1.x) / (slope2 - slope1)\n  const centerY = mid1.y + slope1 * (centerX - mid1.x)\n\n  return { x: centerX, y: centerY }\n}\n\nfunction calculateRadius(center: Point, point: Point): number {\n  return Math.sqrt((center.x - point.x) ** 2 + (center.y - point.y) ** 2)\n}\n\nfunction calculateAngle(center: Point, point: Point): number {\n  return Math.atan2(point.y - center.y, point.x - center.x)\n}\n\nexport const getArcLength = (start: Point, mid: Point, end: Point) => {\n  const center = calculateCenter(start, mid, end)\n  const radius = calculateRadius(center, start)\n\n  const angleStart = calculateAngle(center, start)\n  const angleEnd = calculateAngle(center, end)\n\n  let angleDelta = angleEnd - angleStart\n  if (angleDelta < 0) {\n    angleDelta += 2 * Math.PI\n  }\n\n  return radius * angleDelta\n}\n\nexport function generateArcPathWithMid(\n  start: Point,\n  mid: Point,\n  end: Point,\n  numPoints: number,\n): Point[] {\n  const center = calculateCenter(start, mid, end)\n  const radius = calculateRadius(center, start)\n\n  const angleStart = calculateAngle(center, start)\n  const angleEnd = calculateAngle(center, end)\n\n  let angleDelta = angleEnd - angleStart\n  if (angleDelta < 0) {\n    angleDelta += 2 * Math.PI\n  }\n\n  const path: Point[] = []\n\n  for (let i = 0; i <= numPoints; i++) {\n    const angle = angleStart + (i / numPoints) * angleDelta\n    const x = center.x + radius * Math.cos(angle)\n    const y = center.y + radius * Math.sin(angle)\n    // Check for NaN or Infinity values\n    if (!isNaN(x) && isFinite(x) && !isNaN(y) && isFinite(y)) {\n      path.push({ x, y })\n    }\n  }\n\n  // If the path is empty, add the start and end points\n  if (path.length === 0) {\n    path.push(start, end)\n  }\n\n  return path\n}\n\n/**\nThis syntax describes an SVG path command for drawing an arc. Let's break down each part:\n\n1. \"M 3923.0512 2968.5197\": \n   - M: Move to\n   - 3923.0512: X-coordinate\n   - 2968.5197: Y-coordinate\n\n2. \"A 2.5 2.5 0 0 0 3923.0512 2963.5197\":\n   - A: Arc command\n   - 2.5: X-radius of the ellipse\n   - 2.5: Y-radius of the ellipse\n   - 0: X-axis rotation (in degrees)\n   - 0: Large arc flag (0 for small arc, 1 for large arc)\n   - 0: Sweep flag (0 for counterclockwise, 1 for clockwise)\n   - 3923.0512: End X-coordinate\n   - 2963.5197: End Y-coordinate\n\nThis command draws an arc starting at (3923.0512, 2968.5197) and ending at (3923.0512, 2963.5197), using a circular path with a radius of 2.5 units.\n */\nexport function generateArcFromSweep(\n  startX: number,\n  startY: number,\n  endX: number,\n  endY: number,\n  radius: number,\n  largeArcFlag: boolean,\n  sweepFlag: boolean,\n): Point[] {\n  const start: Point = { x: startX, y: startY }\n  const end: Point = { x: endX, y: endY }\n\n  // Calculate the midpoint between start and end\n  const midX = (startX + endX) / 2\n  const midY = (startY + endY) / 2\n\n  // Calculate the distance between start and end\n  const dx = endX - startX\n  const dy = endY - startY\n  const distance = Math.sqrt(dx * dx + dy * dy)\n\n  // If the distance is zero or the radius is too small, return a straight line\n  if (distance === 0 || radius < distance / 2) {\n    return [start, end]\n  }\n\n  // Calculate the center of the arc\n  const h = Math.sqrt(radius * radius - (distance * distance) / 4)\n  const angle = Math.atan2(dy, dx)\n  const centerX = midX + h * Math.sin(angle) * (sweepFlag ? -1 : 1)\n  const centerY = midY - h * Math.cos(angle) * (sweepFlag ? -1 : 1)\n\n  // Calculate start and end angles\n  const startAngle = Math.atan2(startY - centerY, startX - centerX)\n  let endAngle = Math.atan2(endY - centerY, endX - centerX)\n\n  // Adjust end angle based on sweep and large arc flags\n  if (sweepFlag && endAngle > startAngle) {\n    endAngle -= 2 * Math.PI\n  } else if (!sweepFlag && endAngle < startAngle) {\n    endAngle += 2 * Math.PI\n  }\n\n  if (\n    (!largeArcFlag && Math.abs(endAngle - startAngle) > Math.PI) ||\n    (largeArcFlag && Math.abs(endAngle - startAngle) < Math.PI)\n  ) {\n    if (endAngle > startAngle) {\n      endAngle -= 2 * Math.PI\n    } else {\n      endAngle += 2 * Math.PI\n    }\n  }\n\n  // Generate points along the arc\n  const numPoints = Math.max(\n    2,\n    Math.ceil(Math.abs(endAngle - startAngle) * radius),\n  )\n  const path: Point[] = []\n\n  for (let i = 0; i <= numPoints; i++) {\n    const t = i / numPoints\n    const angle = startAngle + t * (endAngle - startAngle)\n    const x = centerX + radius * Math.cos(angle)\n    const y = centerY + radius * Math.sin(angle)\n    path.push({ x, y })\n  }\n\n  return path\n}\n","/**\n * EasyEDA takes 10 mil as a basic factor, when a stroke width is 1, we can take it as 1*10mil = 10mil, is 2, we can take it as 2*10mil = 20mil,\n * Ref: https://docs.easyeda.com/en/DocumentFormat/3-EasyEDA-PCB-File-Format/#unit\n *\n * 1 mil = 0.001 inch\n * 1 inch = 25.4 mm\n * 1 mil = 25.4/1000 = 0.0254 mm\n */\nexport const mil10ToMm = (value: number): number => value * 10 * 0.0254\n","import type { Bounds, Point } from \"./common\"\n\n/**\n * Calculates the center point of a bounds rectangle.\n * @param bounds Bounds object containing minX, minY, maxX, maxY\n * @returns Center point of the bounds\n */\nexport const getBoundsCenter = (bounds: Bounds): Point => ({\n  x: (bounds.minX + bounds.maxX) / 2,\n  y: (bounds.minY + bounds.maxY) / 2,\n})\n","import type { Bounds, Point } from \"./common\"\n\n/**\n * Calculates the bounding rectangle from an array of points\n * @param points Array of points to calculate bounds from\n * @returns Bounds object containing minX, minY, maxX, maxY, or null if array is empty\n */\nexport const getBoundsFromPoints = (points: Point[]): Bounds | null => {\n  if (points.length === 0) {\n    return null\n  }\n\n  let minX = points[0].x\n  let minY = points[0].y\n  let maxX = points[0].x\n  let maxY = points[0].y\n\n  for (let i = 1; i < points.length; i++) {\n    const point = points[i]\n    if (point.x < minX) minX = point.x\n    if (point.y < minY) minY = point.y\n    if (point.x > maxX) maxX = point.x\n    if (point.y > maxY) maxY = point.y\n  }\n\n  return { minX, minY, maxX, maxY }\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport { mil10ToMm } from \"lib/utils/easyeda-unit-to-mm\"\nimport {\n  getBoundsCenter,\n  getBoundsFromPoints,\n  type Bounds,\n  type Point,\n} from \"@tscircuit/math-utils\"\n\ntype ModelBounds = NonNullable<BetterEasyEdaJson[\"_objMetadata\"]>[\"bounds\"]\n\ntype RotationDeg = 0 | 90 | 180 | 270\n\ntype SvgChildNodeWithAttrs = {\n  attrs?: {\n    points?: string | number\n  }\n}\n\nconst getCadSvgNode = (easyEdaJson: BetterEasyEdaJson) => {\n  const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(\n    (shape) => shape.type === \"SVGNODE\" && shape.svgData.attrs?.uuid,\n  )\n\n  return svgNode?.type === \"SVGNODE\" ? svgNode : null\n}\n\nconst isSvgChildNodeWithAttrs = (\n  childNode: unknown,\n): childNode is SvgChildNodeWithAttrs =>\n  typeof childNode === \"object\" && childNode !== null\n\nconst getXyBoundsFromModelBounds = (bounds: ModelBounds): Bounds => ({\n  minX: bounds.min.x,\n  minY: bounds.min.y,\n  maxX: bounds.max.x,\n  maxY: bounds.max.y,\n})\n\nconst rotateScenePoint = (point: Point, rotationDeg: RotationDeg): Point => {\n  switch (rotationDeg) {\n    case 0:\n      return point\n    case 90:\n      return { x: point.y, y: -point.x }\n    case 180:\n      return { x: -point.x, y: -point.y }\n    case 270:\n      return { x: -point.y, y: point.x }\n  }\n}\n\nconst getEasyEdaModelOriginOnBoardMm = ({\n  svgNode,\n  footprintCenterMm,\n}: {\n  svgNode: NonNullable<ReturnType<typeof getCadSvgNode>>\n  footprintCenterMm: Point\n}) => {\n  const points: Point[] = []\n\n  for (const childNode of svgNode.svgData.childNodes ?? []) {\n    if (!isSvgChildNodeWithAttrs(childNode)) continue\n\n    const rawPoints = childNode.attrs?.points\n    if (!rawPoints) continue\n\n    const values = String(rawPoints).trim().split(/\\s+/).map(Number)\n    for (let i = 0; i + 1 < values.length; i += 2) {\n      const x = values[i]\n      const y = values[i + 1]\n      if (Number.isFinite(x) && Number.isFinite(y)) {\n        points.push({ x: mil10ToMm(x), y: mil10ToMm(y) })\n      }\n    }\n  }\n\n  let modelOriginMm: Point | null = null\n\n  if (points.length > 0) {\n    const bounds = getBoundsFromPoints(points)\n    modelOriginMm = bounds ? getBoundsCenter(bounds) : null\n  } else {\n    const [originX, originY] = String(svgNode.svgData.attrs?.c_origin ?? \"0,0\")\n      .split(\",\")\n      .map((value) => Number(value.trim()))\n    if (Number.isFinite(originX) && Number.isFinite(originY)) {\n      modelOriginMm = { x: mil10ToMm(originX), y: mil10ToMm(originY) }\n    }\n  }\n\n  if (!modelOriginMm) return null\n\n  return {\n    x: modelOriginMm.x - footprintCenterMm.x,\n    y: footprintCenterMm.y - modelOriginMm.y,\n  }\n}\n\nconst snapZero = (value: number) => (Math.abs(value) < 1e-6 ? 0 : value)\n\nconst normalizePoint = (point: Point): Point => ({\n  x: snapZero(point.x),\n  y: snapZero(point.y),\n})\n\nexport const getCadModelOffsetMm = (easyEdaJson: BetterEasyEdaJson) => {\n  const svgNode = getCadSvgNode(easyEdaJson)\n  return getCadModelOffsetMmFromBounds(\n    easyEdaJson,\n    easyEdaJson._objMetadata?.bounds,\n  )\n}\n\nexport const getCadModelOffsetMmFromBounds = (\n  easyEdaJson: BetterEasyEdaJson,\n  bounds?: ModelBounds,\n  {\n    footprintBoundsCenterMm,\n  }: {\n    footprintBoundsCenterMm?: Point\n  } = {},\n) => {\n  const svgNode = getCadSvgNode(easyEdaJson)\n  if (!svgNode || !bounds) return null\n\n  const [, , rotationZRaw] = String(\n    svgNode.svgData.attrs?.c_rotation ?? \"0,0,0\",\n  )\n    .split(\",\")\n    .map((value) => Number(value.trim()))\n  const rotationDeg = (((rotationZRaw % 360) + 360) % 360) as RotationDeg\n  if (![0, 90, 180, 270].includes(rotationDeg)) return null\n\n  const modelCenter = getBoundsCenter(getXyBoundsFromModelBounds(bounds))\n  const footprintCenter = easyEdaJson.packageDetail.dataStr.head\n  const footprintCenterMm = footprintBoundsCenterMm ?? {\n    x: mil10ToMm(footprintCenter.x),\n    y: mil10ToMm(footprintCenter.y),\n  }\n  const targetOriginOnBoardMm = getEasyEdaModelOriginOnBoardMm({\n    svgNode,\n    footprintCenterMm,\n  })\n  if (!targetOriginOnBoardMm) return null\n\n  const targetOriginInModelFrame = rotateScenePoint(\n    targetOriginOnBoardMm,\n    rotationDeg,\n  )\n\n  return normalizePoint({\n    x: modelCenter.x - targetOriginInModelFrame.x,\n    y: modelCenter.y - targetOriginInModelFrame.y,\n  })\n}\n\nexport const getCadSvgNodeZOffsetMm = (easyEdaJson: BetterEasyEdaJson) => {\n  const svgNode = getCadSvgNode(easyEdaJson)\n  if (!svgNode) return null\n\n  const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0)\n  if (!Number.isFinite(svgNodeZ)) return null\n\n  return mil10ToMm(svgNodeZ)\n}\n\nexport const getCadSvgNodeModelUuid = (easyEdaJson: BetterEasyEdaJson) =>\n  getCadSvgNode(easyEdaJson)?.svgData.attrs?.uuid ?? null\n","export const normalizePinLabels = (inputPinLabels: string[][]): string[][] => {\n  const uniqueInputPinLabels = inputPinLabels.map((labels) => [\n    ...new Set(labels),\n  ])\n  const result = uniqueInputPinLabels.map(() => [] as string[])\n  const desiredNumbers = uniqueInputPinLabels.map(() => null as number | null)\n\n  for (let i = 0; i < uniqueInputPinLabels.length; i++) {\n    for (const label of uniqueInputPinLabels[i]) {\n      if (/^\\d+$/.test(label)) {\n        desiredNumbers[i] = Number.parseInt(label)\n        break\n      }\n    }\n  }\n\n  let highestPinNumber = 0\n  const acceptedDesiredNumbers = new Set<number>()\n\n  for (let i = 0; i < desiredNumbers.length; i++) {\n    const desiredNumber = desiredNumbers[i]\n    if (desiredNumber === null || desiredNumber < 1) continue\n\n    if (!acceptedDesiredNumbers.has(desiredNumber)) {\n      acceptedDesiredNumbers.add(desiredNumber)\n      result[i].push(`pin${desiredNumber}`)\n      highestPinNumber = Math.max(highestPinNumber, desiredNumber)\n      continue\n    }\n\n    let existingAltCount = 0\n    for (const label of result[i]) {\n      if (label.startsWith(`pin${desiredNumber}_alt`)) {\n        existingAltCount += 1\n      }\n    }\n    result[i].push(`pin${desiredNumber}_alt${existingAltCount + 1}`)\n  }\n\n  for (let i = 0; i < result.length; i++) {\n    const firstLabel = result[i][0]\n    if (firstLabel?.includes(\"_alt\")) {\n      highestPinNumber += 1\n      result[i].unshift(`pin${highestPinNumber}`)\n    }\n  }\n\n  for (let i = 0; i < result.length; i++) {\n    if (result[i].length === 0) {\n      highestPinNumber += 1\n      result[i].push(`pin${highestPinNumber}`)\n    }\n  }\n\n  const totalLabelCounts: Record<string, number> = {}\n  for (const inputLabels of uniqueInputPinLabels) {\n    for (const label of inputLabels) {\n      if (/^\\d+$/.test(label)) continue\n      totalLabelCounts[label] = (totalLabelCounts[label] ?? 0) + 1\n    }\n  }\n\n  const incrementalLabelCounts: Record<string, number> = {}\n  for (let i = 0; i < uniqueInputPinLabels.length; i++) {\n    for (const label of uniqueInputPinLabels[i]) {\n      if (/^\\d+$/.test(label)) continue\n\n      if (totalLabelCounts[label] === 1) {\n        result[i].push(label)\n      } else {\n        incrementalLabelCounts[label] = (incrementalLabelCounts[label] ?? 0) + 1\n        result[i].push(`${label}${incrementalLabelCounts[label]}`)\n      }\n    }\n  }\n\n  return result\n}\n","/**\n * Normalizes symbol names that could break the converter\n * Converts \"+\" to \"_POS\" and \"-\" to \"_NEG\"\n */\nexport const normalizeSymbolName = (name: string): string => {\n  const trimmedName = name.trim()\n  if (trimmedName === \"+\") return \"_POS\"\n  if (trimmedName === \"-\") return \"_NEG\"\n  return trimmedName\n}\n","export const DEFAULT_PCB_THICKNESS_MM = 1.6\n","import {\n  findBoundsAndCenter,\n  transformPCBElements,\n} from \"@tscircuit/circuit-json-util\"\nimport { mm, mil2mm } from \"@tscircuit/mm\"\nimport type {\n  AnyCircuitElement,\n  PcbComponentInput,\n  PcbSmtPad,\n  PcbViaInput,\n} from \"circuit-json\"\nimport {\n  any_source_component,\n  pcb_courtyard_outline,\n  pcb_hole,\n  pcb_plated_hole,\n  pcb_silkscreen_path,\n  pcb_smtpad,\n  pcb_via,\n} from \"circuit-json\"\nimport * as Soup from \"circuit-json\"\nimport { applyToPoint, compose, scale, translate } from \"transformation-matrix\"\nimport type { z } from \"zod\"\nimport { generateArcFromSweep, generateArcPathWithMid } from \"./math/arc-utils\"\nimport type { BetterEasyEdaJson } from \"./schemas/easy-eda-json-schema\"\nimport type {\n  ArcSchema,\n  CircleSchema,\n  HoleSchema,\n  PadSchema,\n  SVGNodeSchema,\n  SolidRegionSchema,\n  TrackSchema,\n  ViaSchema,\n} from \"./schemas/package-detail-shape-schema\"\nimport { mil10ToMm } from \"./utils/easyeda-unit-to-mm\"\nimport { getCadModelOffsetMmFromBounds } from \"./websafe/get-easyeda-cad-placement-helpers\"\nimport { normalizePinLabels } from \"./utils/normalize-pin-labels\"\nimport { normalizeSymbolName } from \"./utils/normalize-symbol-name\"\nimport { DEFAULT_PCB_THICKNESS_MM } from \"./constants\"\n\nconst EASYEDA_STEP_MODEL_URL =\n  \"https://modules.easyeda.com/qAxj6KHrDKw4blvCG8QJPs7Y\"\nconst EASYEDA_OBJ_MODEL_URL = \"https://modules.easyeda.com/3dmodel\"\nconst TSCIRCUIT_MODEL_CDN_URL = \"https://modelcdn.tscircuit.com/easyeda_models\"\n\n/**\n * Some components, like paths and \"HOLE\", seem to use mil*10 as\n * their unlabeled unit\n */\nconst milx10 = (mil10: number | string) => {\n  if (typeof mil10 === \"number\") return mil2mm(mil10) * 10\n  if (mil10.match(/^\\d+$/)) return mil2mm(mil10) * 10\n  // If it has a unit, return the specified unit ignoring the multiplier\n  return mil2mm(mil10)\n}\n\nconst parseCadOffsetsFromSvgNode = (\n  svgNode?: z.infer<typeof SVGNodeSchema>,\n) => {\n  const attrs = svgNode?.svgData?.attrs ?? {}\n  const [cx, cy] = String(attrs.c_origin ?? \"0,0\")\n    .split(\",\")\n    .map((s) => Number(s.trim()))\n\n  // z: bare numbers are mils; strings with units go through mm()\n  const zStr = attrs.z ?? 0\n  const z_mm =\n    typeof zStr === \"string\" && /[a-z]/i.test(zStr)\n      ? mm(zStr) // already has units\n      : mm(`${Number(zStr) || 0}mil`) // bare number => mils\n\n  return {\n    position: {\n      x: mil10ToMm(Number.isNaN(cx) ? 0 : cx),\n      y: mil10ToMm(Number.isNaN(cy) ? 0 : cy),\n      z: z_mm,\n    },\n    rotation: (() => {\n      const [rx, ry, rz] = (attrs.c_rotation ?? \"0,0,0\").split(\",\").map(Number)\n      return { x: rx || 0, y: ry || 0, z: rz || 0 }\n    })(),\n  }\n}\n\n/** Try mil and mil×10; clamp to a plausible component thickness */\nconst readModelHeightMm = (raw: unknown) => {\n  const fallback = 3.5 // typical SMT component height (USB-C, QFN, etc.)\n  if (raw == null) return fallback\n  const n = Number(raw)\n  if (!Number.isFinite(n)) return fallback\n\n  const mmFromMil10 = mil10ToMm(n) // many EasyEDA unlabeled values\n  const mmFromMil = mm(`${n}mil`) // sometimes plain mil\n\n  // Use the larger of the two guesses, but clamp to a plausible thickness\n  const upper = 12 // max reasonable package thickness (mm) - increased for connectors\n  const lower = 0.1\n  let chosen = Math.max(mmFromMil10, mmFromMil)\n  if (chosen > upper || chosen < lower) chosen = fallback\n\n  return chosen\n}\n\nconst handleSilkscreenPath = (\n  track: z.infer<typeof TrackSchema>,\n  index: number,\n) => {\n  return pcb_silkscreen_path.parse({\n    type: \"pcb_silkscreen_path\",\n    pcb_silkscreen_path_id: `pcb_silkscreen_path_${index + 1}`,\n    pcb_component_id: \"pcb_component_1\",\n    layer: \"top\", // Assuming all silkscreen is on top layer\n    route: track.points.map((point) => ({\n      x: milx10(point.x),\n      y: milx10(point.y),\n    })),\n    stroke_width: mil10ToMm(track.width),\n  })\n}\n\nconst isCourtyardLayer = (layer?: number) =>\n  layer === 13 || layer === 14 || layer === 15\n\nconst isSilkscreenLayer = (layer?: number) => layer === 3 || layer === 4\n\nconst getSideFromLayer = (layer?: number): \"top\" | \"bottom\" => {\n  if (layer === 4 || layer === 14) return \"bottom\"\n  return \"top\"\n}\n\nconst handleSilkscreenArc = (arc: z.infer<typeof ArcSchema>, index: number) => {\n  const arcPath = generateArcFromSweep(\n    arc.start.x,\n    arc.start.y,\n    arc.end.x,\n    arc.end.y,\n    arc.radiusX,\n    arc.largeArc,\n    arc.sweepDirection === \"CW\",\n  )\n\n  return pcb_silkscreen_path.parse({\n    type: \"pcb_silkscreen_path\",\n    pcb_silkscreen_path_id: `pcb_silkscreen_arc_${index + 1}`,\n    pcb_component_id: \"pcb_component_1\",\n    layer: \"top\", // Assuming all silkscreen is on top layer\n    route: arcPath.map((p) => ({\n      x: milx10(p.x),\n      y: milx10(p.y),\n    })),\n    stroke_width: mil10ToMm(arc.width),\n  } as Soup.PcbSilkscreenPathInput)\n}\n\nconst SILKSCREEN_CIRCLE_SEGMENTS = 24\n\nconst handleSilkscreenCircle = (\n  circle: z.infer<typeof CircleSchema>,\n  index: number,\n) => {\n  const route = Array.from(\n    { length: SILKSCREEN_CIRCLE_SEGMENTS + 1 },\n    (_, segmentIndex) => {\n      const angle = (Math.PI * 2 * segmentIndex) / SILKSCREEN_CIRCLE_SEGMENTS\n      return {\n        x: milx10(circle.center.x + Math.cos(angle) * circle.radius),\n        y: milx10(circle.center.y + Math.sin(angle) * circle.radius),\n      }\n    },\n  )\n\n  return pcb_silkscreen_path.parse({\n    type: \"pcb_silkscreen_path\",\n    pcb_silkscreen_path_id: `pcb_silkscreen_circle_${index + 1}`,\n    pcb_component_id: \"pcb_component_1\",\n    layer: getSideFromLayer(circle.layer),\n    route,\n    stroke_width: mil10ToMm(circle.width),\n  } as Soup.PcbSilkscreenPathInput)\n}\n\nconst handleHole = (hole: z.infer<typeof HoleSchema>, index: number) => {\n  return pcb_hole.parse({\n    type: \"pcb_hole\",\n    x: milx10(hole.center.x),\n    y: milx10(hole.center.y),\n    hole_diameter: milx10(hole.radius) * 2,\n    hole_shape: \"circle\",\n    pcb_hole_id: `pcb_hole_${index + 1}`,\n  } as Soup.PcbHole)\n}\n\nconst handleHoleCutout = (hole: z.infer<typeof HoleSchema>, index: number) => {\n  return Soup.pcb_cutout.parse({\n    type: \"pcb_cutout\",\n    pcb_cutout_id: `pcb_cutout_from_hole_${index + 1}`,\n    shape: \"circle\",\n    center: { x: milx10(hole.center.x), y: milx10(hole.center.y) },\n    radius: milx10(hole.radius),\n  } as Soup.PcbCutoutCircleInput)\n}\n\nconst handleVia = (via: z.infer<typeof ViaSchema>, index: number) => {\n  const holeDiameter = via.holeRadius * 2\n\n  return pcb_via.parse({\n    type: \"pcb_via\",\n    pcb_via_id: `pcb_via_${index + 1}`,\n    x: milx10(via.center.x),\n    y: milx10(via.center.y),\n    outer_diameter: milx10(via.outerDiameter),\n    hole_diameter: milx10(holeDiameter),\n    layers: [\"top\", \"bottom\"],\n  } as PcbViaInput)\n}\n\nconst handleCutout = (\n  solidRegion: z.infer<typeof SolidRegionSchema>,\n  index: number,\n) => {\n  return Soup.pcb_cutout.parse({\n    type: \"pcb_cutout\",\n    pcb_cutout_id: `pcb_cutout_${index + 1}`,\n    shape: \"polygon\",\n    points: solidRegion.points.map((p) => ({\n      x: milx10(p.x),\n      y: milx10(p.y),\n    })),\n  } as Soup.PcbCutoutPolygonInput)\n}\n\nconst LEAD_SHAPE_LAYER = 100\n\nconst isPcbSolidRegionCutout = (shape: z.infer<typeof SolidRegionSchema>) => {\n  // LeadShapeLayer cutouts describe package lead artwork, not board drills.\n  return shape.fillStyle === \"cutout\" && shape.layermask !== LEAD_SHAPE_LAYER\n}\n\ninterface Options {\n  useModelCdn?: boolean\n  shouldRecenter?: boolean\n  cadPositionXMm?: number\n  cadPositionYMm?: number\n  cadPositionZMm?: number\n  cadModelBounds?: {\n    min: { x: number; y: number; z: number }\n    max: { x: number; y: number; z: number }\n  }\n  showDesignator?: boolean\n}\n\nconst getCadPositionZMmFromMetadata = (easyEdaJson: BetterEasyEdaJson) => {\n  const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(\n    (shape) => shape.type === \"SVGNODE\" && shape.svgData.attrs?.uuid,\n  )\n  if (!svgNode || svgNode.type !== \"SVGNODE\") return undefined\n\n  const svgNodeZ = Number(svgNode.svgData.attrs?.z ?? 0)\n  if (!Number.isFinite(svgNodeZ)) return undefined\n\n  const bounds = easyEdaJson._objMetadata?.bounds\n  if (!bounds) return undefined\n\n  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z\n  return minZ - mil10ToMm(svgNodeZ)\n}\n\nexport const convertEasyEdaJsonToCircuitJson = (\n  easyEdaJson: BetterEasyEdaJson,\n  {\n    useModelCdn,\n    shouldRecenter = true,\n    cadPositionXMm,\n    cadPositionYMm,\n    cadPositionZMm,\n    cadModelBounds,\n    showDesignator = false,\n  }: Options = {},\n): AnyCircuitElement[] => {\n  const resolvedCadPositionZMm =\n    cadPositionZMm ?? getCadPositionZMmFromMetadata(easyEdaJson)\n  const circuitElements: AnyCircuitElement[] = []\n\n  // Add source component\n  const source_component = any_source_component.parse({\n    type: \"source_component\",\n    source_component_id: \"source_component_1\",\n    name: \"U1\",\n    ftype: \"simple_chip\",\n  })\n\n  const pcb_component = Soup.pcb_component.parse({\n    type: \"pcb_component\",\n    pcb_component_id: \"pcb_component_1\",\n    source_component_id: \"source_component_1\",\n    name: \"U1\",\n    ftype: \"simple_chip\",\n    width: 0, // we update this at the end\n    height: 0, // we update this at the end\n    rotation: 0,\n    center: { x: 0, y: 0 },\n    layer: \"top\",\n  } as PcbComponentInput)\n\n  circuitElements.push(source_component, pcb_component)\n\n  const pads = easyEdaJson.packageDetail.dataStr.shape.filter(\n    (shape): shape is z.infer<typeof PadSchema> => shape.type === \"PAD\",\n  )\n  const pins = easyEdaJson.dataStr.shape.filter((shape) => shape.type === \"PIN\")\n\n  // Prepare pin labels for normalization\n  const pinLabelSets = pads.map((pad) => {\n    const labels = []\n    if (pad.number) labels.push(pad.number.toString())\n\n    const pin = pins.find((p) => p.pinNumber === pad.number)\n    if (pin) labels.push(normalizeSymbolName(pin.label))\n\n    return labels\n  })\n\n  const normalizedPinLabels = normalizePinLabels(pinLabelSets)\n\n  // Add source ports and pcb_smtpads\n  pads.forEach((pad, index) => {\n    const portHints = normalizedPinLabels[index]\n    const pinNumber = Number.parseInt(\n      portHints.find((hint) => hint.match(/pin\\d+/))!.replace(\"pin\", \"\"),\n    )\n\n    // Add source port\n    circuitElements.push({\n      type: \"source_port\",\n      source_port_id: `source_port_${index + 1}`,\n      source_component_id: \"source_component_1\",\n      name: `pin${pinNumber}`,\n      pin_number: pinNumber,\n      port_hints: portHints.filter((hint) => hint !== `pin${pinNumber}`),\n    })\n\n    if (pad.holeRadius !== undefined && mil2mm(pad.holeRadius) !== 0) {\n      // Add pcb_plated_hole\n      const platedHoleId =\n        pad.shape === \"RECT\" && pad.rotation !== undefined\n          ? `pcb_plated_hole_${index + 1}_rot${pad.rotation}`\n          : `pcb_plated_hole_${index + 1}`\n\n      const commonPlatedHoleProps = {\n        type: \"pcb_plated_hole\",\n        pcb_plated_hole_id: platedHoleId,\n        x: mil2mm(pad.center.x),\n        y: mil2mm(pad.center.y),\n        layers: [\"top\"],\n        port_hints: [`pin${pinNumber}`],\n        pcb_component_id: \"pcb_component_1\",\n        pcb_port_id: `pcb_port_${index + 1}`,\n      }\n      let additionalPlatedHoleProps: any\n\n      if (pad.shape === \"OVAL\") {\n        // EasyEDA OVAL plated pads map cleanly to pill-shaped plated holes.\n        // We preserve the pad rotation so slots like C2961147 stay aligned.\n        // To compute the drill dimensions:\n        // 1. Find the smallest outer dimensions\n        // 2. Use the holeRadius to determine the distanceFromOuterPlatingToHole\n        // 3. Calculate the largest \"inner dimension\" (which is either the\n        //    holeWidth or holeHeight) by subtracting the distanceFromOuterPlatingToHole * 2\n        //    from the largest outer dimensions\n\n        const largestOuterDimensionName: \"width\" | \"height\" =\n          mil2mm(pad.width) > mil2mm(pad.height) ? \"width\" : \"height\"\n\n        const smallestOuterDimension = Math.min(\n          mil2mm(pad.width),\n          mil2mm(pad.height),\n        )\n        const largestOuterDimension = Math.max(\n          mil2mm(pad.width),\n          mil2mm(pad.height),\n        )\n\n        const distanceFromOuterPlatingToHole =\n          smallestOuterDimension / 2 - mil2mm(pad.holeRadius)\n\n        const largestInnerDimension =\n          largestOuterDimension - distanceFromOuterPlatingToHole * 2\n        const smallestInnerDimension = mil2mm(pad.holeRadius) * 2\n\n        const innerWidth =\n          largestOuterDimensionName === \"width\"\n            ? largestInnerDimension\n            : smallestInnerDimension\n        const innerHeight =\n          largestOuterDimensionName === \"height\"\n            ? largestInnerDimension\n            : smallestInnerDimension\n\n        additionalPlatedHoleProps = {\n          shape: \"pill\",\n          hole_width: innerWidth,\n          hole_height: innerHeight,\n          outer_width: mil2mm(pad.width),\n          outer_height: mil2mm(pad.height),\n          ccw_rotation: pad.rotation || 0,\n        }\n      } else if (pad.shape === \"RECT\") {\n        const padWidth = mil2mm(pad.width)\n        const padHeight = mil2mm(pad.height)\n        const holeRadius = mil2mm(pad.holeRadius)\n        const holeDiameter = holeRadius * 2 // Use normal diameter\n\n        // Check if the pad is significantly rectangular (not square)\n        const aspectRatio =\n          Math.max(padWidth, padHeight) / Math.min(padWidth, padHeight)\n        const isSignificantlyRectangular = aspectRatio > 1.5 // Only use pill holes for aspect ratios > 1.5\n\n        if (isSignificantlyRectangular) {\n          // Simple approach: create slim pill holes with consistent proportions\n          // Width = original hole diameter, Height = 2.6x width for good pill shape\n          const baseWidth = holeDiameter\n          const pillHeight = baseWidth * 2.6 // 2.6:1 aspect ratio for elegant pills\n\n          const holeWidth = padWidth > padHeight ? pillHeight : baseWidth\n          const holeHeight = padHeight > padWidth ? pillHeight : baseWidth\n\n          additionalPlatedHoleProps = {\n            shape: \"rotated_pill_hole_with_rect_pad\",\n            hole_shape: \"rotated_pill\",\n            pad_shape: \"rect\",\n            hole_width: holeWidth,\n            hole_height: holeHeight,\n            hole_ccw_rotation: pad.rotation || 0,\n            rect_ccw_rotation: pad.rotation || 0,\n            rect_pad_width: padWidth,\n            rect_pad_height: padHeight,\n          }\n        } else {\n          // For square or nearly square pads, use circular holes\n          additionalPlatedHoleProps = {\n            shape: \"circle\",\n            hole_diameter: holeDiameter,\n            outer_diameter: Math.max(padWidth, padHeight),\n            radius: holeDiameter / 2,\n          }\n        }\n      } else {\n        additionalPlatedHoleProps = {\n          shape: \"circle\",\n          hole_diameter: mil2mm(pad.holeRadius) * 2,\n          outer_diameter: mil2mm(pad.width),\n          radius: mil2mm(pad.holeRadius),\n        }\n      }\n\n      circuitElements.push(\n        pcb_plated_hole.parse({\n          ...commonPlatedHoleProps,\n          ...additionalPlatedHoleProps,\n        }),\n      )\n    } else {\n      // Add pcb_smtpad\n      let soupShape: PcbSmtPad[\"shape\"] | undefined\n      if (pad.shape === \"RECT\") {\n        soupShape = \"rect\"\n      } else if (pad.shape === \"ELLIPSE\") {\n        // This is just a bug\n        soupShape = \"rect\"\n      } else if (pad.shape === \"OVAL\") {\n        soupShape = \"pill\"\n      } else if (pad.shape === \"POLYGON\") {\n        soupShape = \"polygon\"\n      }\n      if (!soupShape) {\n        throw new Error(`unknown pad.shape: \"${pad.shape}\"`)\n      }\n\n      const rectSize = { width: mil2mm(pad.width), height: mil2mm(pad.height) }\n      if (pad.rotation === 90 || pad.rotation === 270) {\n        // Swap width and height\n        rectSize.width = mil2mm(pad.height)\n        rectSize.height = mil2mm(pad.width)\n      }\n      const parsedPcbSmtpad = pcb_smtpad.parse({\n        type: \"pcb_smtpad\",\n        pcb_smtpad_id: `pcb_smtpad_${index + 1}`,\n        shape: soupShape,\n        ...(soupShape !== \"polygon\" && {\n          x: mil2mm(pad.center.x),\n          y: mil2mm(pad.center.y),\n        }),\n        ...(soupShape === \"rect\"\n          ? rectSize\n          : soupShape === \"pill\"\n            ? {\n                ...rectSize,\n                radius: Math.min(rectSize.width, rectSize.height) / 2,\n              }\n            : soupShape === \"polygon\" && pad.points\n              ? {\n                  points: pad.points.map((p) => ({\n                    x: milx10(p.x),\n                    y: milx10(p.y),\n                  })),\n                }\n              : {\n                  radius: Math.min(mil2mm(pad.width), mil2mm(pad.height)) / 2,\n                }),\n        layer: \"top\",\n        port_hints: [`pin${pinNumber}`],\n        pcb_component_id: \"pcb_component_1\",\n        pcb_port_id: `pcb_port_${index + 1}`,\n      } as PcbSmtPad)\n      circuitElements.push(parsedPcbSmtpad)\n    }\n  })\n\n  // Add holes\n  easyEdaJson.packageDetail.dataStr.shape\n    .filter(\n      (shape): shape is z.infer<typeof HoleSchema> => shape.type === \"HOLE\",\n    )\n    .forEach((h, index) => {\n      circuitElements.push(handleHole(h, index))\n      circuitElements.push(handleHoleCutout(h, index))\n    })\n\n  // Add vias\n  easyEdaJson.packageDetail.dataStr.shape\n    .filter((shape): shape is z.infer<typeof ViaSchema> => shape.type === \"VIA\")\n    .forEach((v, index) => {\n      circuitElements.push(handleVia(v, index))\n    })\n\n  // Add pcb cutouts from solid regions marked as cutout\n  easyEdaJson.packageDetail.dataStr.shape\n    .filter(\n      (shape): shape is z.infer<typeof SolidRegionSchema> =>\n        shape.type === \"SOLIDREGION\" && isPcbSolidRegionCutout(shape),\n    )\n    .forEach((sr, index) => {\n      circuitElements.push(handleCutout(sr, index))\n    })\n\n  // Add silkscreen paths, arcs and text\n  let hasFoundDesignator = false\n  easyEdaJson.packageDetail.dataStr.shape.forEach((shape, index) => {\n    if (shape.type === \"TRACK\") {\n      if (!isCourtyardLayer(shape.layer)) {\n        circuitElements.push(handleSilkscreenPath(shape, index))\n      }\n    } else if (shape.type === \"CIRCLE\") {\n      if (isSilkscreenLayer(shape.layer)) {\n        circuitElements.push(handleSilkscreenCircle(shape, index))\n      }\n    } else if (shape.type === \"ARC\") {\n      if (!isCourtyardLayer(shape.layer)) {\n        circuitElements.push(handleSilkscreenArc(shape, index))\n      }\n    } else if (shape.type === \"TEXT\") {\n      if (isCourtyardLayer(shape.layer)) return\n\n      let text = shape.text\n      const designatorPrefix = easyEdaJson.dataStr.head.c_para.pre || \"U\"\n      const normalizedPrefix = designatorPrefix.replace(/\\?/g, \"\")\n      const trimmedText = text.trim()\n      const isDesignator =\n        trimmedText === designatorPrefix ||\n        trimmedText === `${normalizedPrefix}?` ||\n        trimmedText === normalizedPrefix\n\n      if (isDesignator) {\n        if (!showDesignator) return\n        text = \"{NAME}\"\n        hasFoundDesignator = true\n      }\n\n      circuitElements.push(\n        Soup.pcb_silkscreen_text.parse({\n          type: \"pcb_silkscreen_text\",\n          pcb_silkscreen_text_id: `pcb_silkscreen_text_${index + 1}`,\n          pcb_component_id: \"pcb_component_1\",\n          text,\n          anchor_position: {\n            x: mil2mm(shape.x),\n            y: mil2mm(shape.y),\n          },\n          anchor_alignment: (\n            {\n              L: \"bottom_left\",\n              C: \"center\",\n              R: \"bottom_right\",\n            } as const\n          )[shape.textAnchor ?? \"L\"],\n          font_size: shape.size_mm || 1.0,\n          layer: \"top\",\n        } as Soup.PcbSilkscreenTextInput),\n      )\n    }\n  })\n\n  // Add a fallback designator if none was found in the shapes\n  if (!hasFoundDesignator && showDesignator) {\n    const bbox = easyEdaJson.packageDetail.dataStr.BBox\n    circuitElements.push(\n      Soup.pcb_silkscreen_text.parse({\n        type: \"pcb_silkscreen_text\",\n        pcb_silkscreen_text_id: \"pcb_silkscreen_text_designator_fallback\",\n        pcb_component_id: \"pcb_component_1\",\n        text: \"{NAME}\",\n        anchor_position: {\n          x: milx10(bbox.x + bbox.width / 2),\n          y: milx10(bbox.y) - 1.0, // 1mm above top edge\n        },\n        anchor_alignment: \"center\",\n        font_size: 1.0,\n        layer: \"top\",\n      } as Soup.PcbSilkscreenTextInput),\n    )\n  }\n\n  // Only add designator if found in EasyEDA\n\n  // Calculate pcb_component bounds from all PCB elements\n  const pcbElements = circuitElements.filter(\n    (e) =>\n      e.type === \"pcb_smtpad\" ||\n      e.type === \"pcb_plated_hole\" ||\n      e.type === \"pcb_hole\" ||\n      e.type === \"pcb_via\" ||\n      e.type === \"pcb_courtyard_outline\" ||\n      e.type === \"pcb_silkscreen_path\" ||\n      e.type === \"pcb_silkscreen_text\",\n  )\n\n  if (pcbElements.length > 0) {\n    const bounds = findBoundsAndCenter(pcbElements)\n    pcb_component.width = bounds.width\n    pcb_component.height = bounds.height\n  }\n\n  // Add 3d component\n  const svgNode = easyEdaJson.packageDetail.dataStr.shape.find(\n    (a): a is z.infer<typeof SVGNodeSchema> =>\n      Boolean(a.type === \"SVGNODE\" && a.svgData.attrs?.uuid),\n  )\n  const modelUuid = svgNode?.svgData?.attrs?.uuid\n\n  const objFileUrl = modelUuid\n    ? useModelCdn\n      ? `${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.obj?uuid=${modelUuid}`\n      : `${EASYEDA_OBJ_MODEL_URL}/${modelUuid}`\n    : undefined\n\n  const stepFileUrl = modelUuid\n    ? useModelCdn\n      ? `${TSCIRCUIT_MODEL_CDN_URL}/assets/${easyEdaJson.lcsc.number}.step?uuid=${modelUuid}`\n      : `${EASYEDA_STEP_MODEL_URL}/${modelUuid}`\n    : undefined\n\n  if (objFileUrl !== undefined || stepFileUrl !== undefined) {\n    const { position, rotation } = parseCadOffsetsFromSvgNode(svgNode)\n\n    circuitElements.push(\n      Soup.cad_component.parse({\n        type: \"cad_component\",\n        cad_component_id: \"cad_component_1\",\n        source_component_id: \"source_component_1\",\n        pcb_component_id: \"pcb_component_1\",\n        anchor_alignment: \"center_of_component_on_board_surface\",\n        model_origin_alignment: \"center_of_component_on_board_surface\",\n        model_origin_position: {\n          x: cadPositionXMm ?? 0,\n          y: cadPositionYMm ?? 0,\n          z: resolvedCadPositionZMm ?? position.z,\n        },\n        position: { x: 0, y: 0, z: 0 },\n        rotation,\n        model_obj_url: objFileUrl,\n        model_step_url: stepFileUrl,\n      } as Soup.CadComponentInput),\n    )\n  }\n\n  // Generate courtyard outline from packageDetail.dataStr.BBox when no explicit\n  // courtyard TRACK (layers 13/14/15) exists. The BBox is EasyEDA's own bounding\n  // box for the footprint in canvas coordinates (milx10 units). It is added before\n  // recentering so it gets transformed automatically with all other elements.\n  const hasExplicitCourtyard = circuitElements.some(\n    (e) => e.type === \"pcb_courtyard_outline\",\n  )\n  if (!hasExplicitCourtyard) {\n    const bbox = easyEdaJson.packageDetail.dataStr.BBox\n    if (bbox) {\n      const strokeWidth = 0.05\n      const margin = 0.25\n      const x1 = milx10(bbox.x) - margin\n      const y1 = milx10(bbox.y) - margin\n      const x2 = milx10(bbox.x + bbox.width) + margin\n      const y2 = milx10(bbox.y + bbox.height) + margin\n      circuitElements.push(\n        pcb_courtyard_outline.parse({\n          type: \"pcb_courtyard_outline\",\n          pcb_courtyard_outline_id: `pcb_courtyard_outline_${easyEdaJson.lcsc.number}_1`,\n          pcb_component_id: \"pcb_component_1\",\n          layer: \"top\",\n          outline: [\n            { x: x1, y: y1 },\n            { x: x2, y: y1 },\n            { x: x2, y: y2 },\n            { x: x1, y: y2 },\n            { x: x1, y: y1 },\n          ],\n          stroke_width: strokeWidth,\n        }),\n      )\n    }\n  }\n\n  if (shouldRecenter) {\n    // exclude pcb_component (its center is wrong; we'll set it to 0,0)\n    const elementsForBounds = circuitElements.filter(\n      (e) => e.type !== \"pcb_component\" && e.type !== \"cad_component\",\n    )\n\n    const bounds = findBoundsAndCenter(elementsForBounds)\n\n    if (Number.isFinite(bounds.center.x) && Number.isFinite(bounds.center.y)) {\n      const matrix = compose(\n        translate(-bounds.center.x, bounds.center.y),\n        scale(1, -1),\n      )\n\n      // Transform all PCB elems except polygon SMT pads (no x,y) and the cad\n      const elementsForTransform = circuitElements.filter(\n        (e) =>\n          !(e.type === \"pcb_smtpad\" && e.shape === \"polygon\") &&\n          e.type !== \"cad_component\",\n      )\n      transformPCBElements(elementsForTransform, matrix)\n\n      // Manually transform polygons/cutouts\n      for (const e of circuitElements) {\n        if (e.type === \"pcb_cutout\") {\n          if (e.shape === \"polygon\") {\n            e.points = e.points.map((p) => applyToPoint(matrix, p))\n          } else if (e.shape === \"circle\" || e.shape === \"rect\") {\n            e.center = applyToPoint(matrix, e.center)\n          } else if (\"route\" in e) {\n            const cutoutPath = e as unknown as {\n              route: { x: number; y: number }[]\n            }\n            cutoutPath.route = cutoutPath.route.map((p) =>\n              applyToPoint(matrix, p),\n            )\n          }\n        } else if (e.type === \"pcb_smtpad\" && e.shape === \"polygon\") {\n          e.points = e.points.map((p) => applyToPoint(matrix, p))\n        }\n      }\n\n      const cad = circuitElements.find(\n        (e): e is Soup.CadComponent => e.type === \"cad_component\",\n      )\n\n      if (cad) {\n        if (!cad.rotation) cad.rotation = { x: 0, y: 0, z: 0 }\n        if (!cad.model_origin_position) {\n          cad.model_origin_position = { x: 0, y: 0, z: 0 }\n        }\n\n        const resolvedCadModelBounds =\n          cadModelBounds ?? easyEdaJson._objMetadata?.bounds\n        const recenteredCadOffset =\n          resolvedCadModelBounds &&\n          getCadModelOffsetMmFromBounds(easyEdaJson, resolvedCadModelBounds, {\n            footprintBoundsCenterMm: bounds.center,\n          })\n\n        if (recenteredCadOffset) {\n          cad.model_origin_position.x = recenteredCadOffset.x\n          cad.model_origin_position.y = recenteredCadOffset.y\n        }\n\n        const side = (pcb_component.layer ?? \"top\") as \"top\" | \"bottom\"\n        const t = DEFAULT_PCB_THICKNESS_MM / 2\n        const attrs = svgNode?.svgData?.attrs ?? {}\n        const modelHeight = readModelHeightMm(attrs.c_height)\n\n        // Ensure we have a size; Z holds the model's thickness in local space\n        if (!cad.size) {\n          cad.size = {\n            x: pcb_component.width,\n            y: pcb_component.height,\n            z: modelHeight,\n          }\n        }\n\n        // --- Axis convention: EasyEDA models are typically Y-up ---\n        // Rotate to Z-up so thickness becomes vertical in our scene.\n        const ROTATE_X_FOR_YUP = 90\n        const originalZRotation = (cad.rotation.z ?? 0) % 360\n\n        // Improved rotation handling with tolerance for floating-point precision\n        // Handle different component orientations based on EasyEDA Z rotation\n        if (\n          Math.abs(originalZRotation - 0) < 1 ||\n          Math.abs(originalZRotation - 360) < 1\n        ) {\n          // For ~0° Z rotation, don't apply X rotation - keep model as-is (Y-up)\n          cad.rotation.x = ((cad.rotation.x ?? 0) + 0 + 360) % 360 // no X rotation\n        } else if (Math.abs(originalZRotation - 180) < 1) {\n          // For ~180° Z rotation, don't apply standard X rotation - let it lie flat\n          cad.rotation.x = ((cad.rotation.x ?? 0) + 0 + 360) % 360 // no X rotation\n        } else if (Math.abs(originalZRotation - 90) < 1) {\n          // For ~90° Z rotation, keep it flat (no X rotation)\n          cad.rotation.x = ((cad.rotation.x ?? 0) + 0 + 360) % 360\n        } else if (Math.abs(originalZRotation - 270) < 1) {\n          // Keep EasyEDA's raw 270° orientation; adding corrective X/Y rotations\n          // makes parts like C9900017879 stand on their side.\n          cad.rotation.x = ((cad.rotation.x ?? 0) + 0 + 360) % 360\n          cad.rotation.y = ((cad.rotation.y ?? 0) + 0 + 360) % 360\n        } else {\n          // Fallback for unusual angles: apply standard Y-up to Z-up conversion\n          // and log for potential future refinement\n          console.warn(\n            `[3D] Unusual rotation angle: ${originalZRotation}° for component ${easyEdaJson.lcsc.number}`,\n          )\n          cad.rotation.x =\n            ((cad.rotation.x ?? 0) + ROTATE_X_FOR_YUP + 360) % 360\n        }\n\n        // Bottom-side parts: flip across the board plane\n        if (side !== \"top\") {\n          cad.rotation.x = ((cad.rotation.x ?? 0) + 180) % 360\n        }\n\n        // For 180° rotated components (Y-up models), the z-offset indicates pin extension below body\n        const USE_Z_OFFSET_FOR_180 = Math.abs(originalZRotation - 180) < 1\n        const zOffRaw = cad.model_origin_position.z ?? cad.position.z ?? 0\n        const zOff = USE_Z_OFFSET_FOR_180 ? -zOffRaw : 0\n\n        // ---- Determine the vertical extent based on model orientation ----\n        const rx = ((cad.rotation.x % 360) + 360) % 360\n\n        // EasyEDA models are Y-up. Components with 0° or 180° Z-rotation don't get X-rotation applied,\n        // so they remain Y-up. For Y-up models, the vertical extent is along the Y axis.\n        let thicknessAlongWorldZ: number\n        const is180RotatedYUp =\n          (Math.abs(originalZRotation - 180) < 1 ||\n            Math.abs(originalZRotation - 0) < 1 ||\n            Math.abs(originalZRotation - 360) < 1) &&\n          Math.abs(rx) < 1\n\n        if (is180RotatedYUp) {\n          // 180° Z-rotation, no X-rotation applied → model is still Y-up\n          // For Y-up models, the vertical extent is along Y axis (size.y)\n          thicknessAlongWorldZ = cad.size.y\n        } else if (rx % 180 === 90) {\n          // X-rotation of 90/270 → use local Y\n          thicknessAlongWorldZ = cad.size.y\n        } else {\n          // Standard case → model rotated to Z-up, use Z\n          thicknessAlongWorldZ = cad.size.z\n        }\n\n        if (Number.isFinite(resolvedCadPositionZMm)) {\n          cad.model_origin_position.z =\n            side === \"top\" ? resolvedCadPositionZMm! : -resolvedCadPositionZMm!\n        } else {\n          let centerZ: number\n          if (is180RotatedYUp) {\n            // For Y-up models, subtract half the thickness to lower the component to the board\n            centerZ =\n              side === \"top\"\n                ? t - thicknessAlongWorldZ / 2\n                : -t + thicknessAlongWorldZ / 2\n          } else {\n            // For other orientations, use standard positioning with z-offset\n            centerZ =\n              side === \"top\"\n                ? t + zOff + thicknessAlongWorldZ / 2\n                : -t - zOff - thicknessAlongWorldZ / 2\n          }\n\n          cad.model_origin_position.z = centerZ\n        }\n      }\n    }\n\n    // finalize pcb center after recentering\n    pcb_component.center = { x: 0, y: 0 }\n  }\n\n  return circuitElements\n}\n","import { z } from \"zod\"\nimport {\n  PackageDetailShapeSchema,\n  ShapeItemSchema,\n} from \"./package-detail-shape-schema\"\nimport { SingleLetterShapeSchema } from \"./single-letter-shape-schema\"\n\nexport const maybeNumber = z\n  .any()\n  .transform((k) => (k === \"nan\" || Number.isNaN(k) ? null : k))\n  .pipe(z.number().nullable().optional())\n\nexport const SzlcscSchema = z.object({\n  id: z.number(),\n  number: z.string(),\n  step: z.number().optional(),\n  min: z.number().optional(),\n  price: z.number().optional(),\n  stock: z.number().optional(),\n  url: z.string().url().optional(),\n  image: z.string().optional().optional(),\n})\n\nexport const LcscSchema = z.object({\n  id: z.number(),\n  number: z.string(),\n  step: z.number().optional(),\n  min: z.number().optional(),\n  price: z.number().optional(),\n  stock: z.number().optional(),\n  url: z.string().url().optional(),\n})\n\nexport const OwnerSchema = z.object({\n  uuid: z.string(),\n  username: z.string(),\n  nickname: z.string(),\n  avatar: z.string(),\n})\n\nexport const HeadSchema = z.object({\n  docType: z.preprocess((val) => (val == null ? val : String(val)), z.string()),\n  editorVersion: z.string(),\n  c_para: z.record(z.string(), z.string().nullable()),\n  x: z.number(),\n  y: z.number(),\n  puuid: z.string().optional(),\n  uuid: z.string(),\n  utime: z.preprocess((val) => {\n    if (val === \"\") return 0\n    if (typeof val === \"string\") return Number(val)\n    return val\n  }, z.number()),\n  importFlag: z.number().optional(),\n  c_spiceCmd: z.any().optional(),\n  hasIdFlag: z.boolean(),\n})\n\nexport const BBoxSchema = z.object({\n  x: z.number(),\n  y: z.number(),\n  width: z.number(),\n  height: z.number(),\n})\n\nexport const LayerItemSchema = z.object({\n  name: z.string(),\n  color: z.string(),\n  visible: z.boolean(),\n  active: z.boolean(),\n  config: z.boolean(),\n  transparency: z.boolean(),\n})\n\nexport const ObjectItemSchema = z.object({\n  name: z.string(),\n  visible: z.boolean(),\n  locked: z.boolean(),\n})\n\nexport const DataStrSchema = z.object({\n  head: HeadSchema,\n  canvas: z.string(),\n  shape: z.array(SingleLetterShapeSchema),\n  BBox: BBoxSchema,\n  colors: z.union([z.array(z.string()), z.record(z.string())]),\n})\n\nexport const PackageDetailDataStrSchema = z.object({\n  head: HeadSchema,\n  canvas: z.string(),\n  shape: z\n    .array(z.string())\n    .transform((shapes) =>\n      shapes.map((shape) => {\n        const [type, ...data] = shape.split(\"~\")\n        return ShapeItemSchema.parse({ type, data: data.join(\"~\") })\n      }),\n    )\n    .pipe(z.array(PackageDetailShapeSchema)),\n  layers: z.array(z.string()).transform((layers) =>\n    layers.map((layer) => {\n      const [name, color, visible, active, config, transparency] =\n        layer.split(\"~\")\n      return LayerItemSchema.parse({\n        name,\n        color,\n        visible: visible === \"true\",\n        active: active === \"true\",\n        config: config === \"true\",\n        transparency: transparency === \"true\",\n      })\n    }),\n  ),\n  objects: z.array(z.string()).transform((objects) =>\n    objects.map((obj) => {\n      const [name, visible, locked] = obj.split(\"~\")\n      return ObjectItemSchema.parse({\n        name,\n        visible: visible === \"true\",\n        locked: locked === \"true\",\n      })\n    }),\n  ),\n  BBox: BBoxSchema,\n  netColors: z.array(z.unknown()).optional(),\n})\n\nexport const PackageDetailSchema = z.object({\n  uuid: z.string(),\n  title: z.string(),\n  docType: z.number(),\n  updateTime: z.number(),\n  owner: OwnerSchema,\n  datastrid: z.string(),\n  writable: z.boolean(),\n  dataStr: PackageDetailDataStrSchema,\n})\n\nexport const ModelBoundsSchema = z.object({\n  min: z.object({\n    x: z.number(),\n    y: z.number(),\n    z: z.number(),\n  }),\n  max: z.object({\n    x: z.number(),\n    y: z.number(),\n    z: z.number(),\n  }),\n})\n\nexport const EasyEdaJsonSchema = z.object({\n  uuid: z.string(),\n  title: z.string(),\n  description: z.string(),\n  docType: z.number(),\n  type: z.number(),\n  szlcsc: SzlcscSchema,\n  lcsc: LcscSchema,\n  owner: OwnerSchema,\n  tags: z.array(z.string()),\n  category: z.string().optional(),\n  updateTime: z.number(),\n  updated_at: z.string(),\n  dataStr: DataStrSchema,\n  verify: z.boolean(),\n  SMT: z.boolean().optional(),\n  datastrid: z.string(),\n  jlcOnSale: z.number().optional(),\n  writable: z.boolean(),\n  isFavorite: z.boolean(),\n  packageDetail: PackageDetailSchema,\n  _objMetadata: z\n    .object({\n      bounds: ModelBoundsSchema,\n    })\n    .optional(),\n})\n\nexport type RawEasyEdaJson = z.input<typeof EasyEdaJsonSchema>\nexport type BetterEasyEdaJson = z.infer<typeof EasyEdaJsonSchema>\n","import { z } from \"zod\"\n\n// Helper function to safely convert values to numbers with a default\nconst safeNumber = (defaultValue = 0) =>\n  z\n    .union([z.number(), z.string()])\n    .transform((val) => {\n      const num = Number(val)\n      return isNaN(num) ? defaultValue : num\n    })\n    .default(defaultValue)\n\nconst tenthmil = z\n  .union([z.number(), z.string()])\n  .optional()\n  .transform((n) =>\n    typeof n === \"string\" && n.endsWith(\"mil\")\n      ? n\n      : `${Number.parseFloat(n as string) * 10}mil`,\n  )\n  .pipe(z.string())\n\nexport const PointSchema = z\n  .any()\n  .transform((p) => {\n    if (Array.isArray(p)) {\n      const [x, y] = p\n      return { x, y }\n    }\n    if (typeof p === \"object\") {\n      return p\n    }\n    throw new Error(`Invalid point: ${p}`)\n  })\n  .pipe(\n    z.object({\n      x: z.number(),\n      y: z.number(),\n    }),\n  )\n\nexport const BaseShapeSchema = z.object({\n  type: z.string(),\n  id: z.string().optional(),\n  layer: z.coerce.number().optional(),\n})\n\nexport const TrackSchema = BaseShapeSchema.extend({\n  type: z.literal(\"TRACK\"),\n  width: z.coerce.number(),\n  points: z.array(PointSchema),\n})\n\nexport const PadSchema = BaseShapeSchema.extend({\n  type: z.literal(\"PAD\"),\n  shape: z.enum([\"RECT\", \"ELLIPSE\", \"OVAL\", \"POLYGON\"]),\n  center: z.object({\n    x: tenthmil,\n    y: tenthmil,\n  }),\n  width: tenthmil,\n  height: tenthmil,\n  layermask: z.number(),\n  net: z.union([z.string(), z.number()]).optional(),\n  number: z.union([z.string(), z.number()]),\n  holeRadius: tenthmil,\n  points: z.array(PointSchema).optional(),\n  rotation: safeNumber(0), // Will default to 0 if NaN or missing\n  plated: z.boolean(),\n})\n\n// TODO this should be in \"arc sweep\" format with the following fields:\n// start, end, radius, largeArc, sweepDirection\nexport const ArcSchema = BaseShapeSchema.extend({\n  type: z.literal(\"ARC\"),\n  width: z.number(),\n  start: PointSchema,\n  end: PointSchema,\n  radiusX: z.number(),\n  radiusY: z.number(),\n  largeArc: z.boolean(),\n  sweepDirection: z.enum([\"CW\", \"CCW\"]),\n})\n\nexport const CircleSchema = BaseShapeSchema.extend({\n  type: z.literal(\"CIRCLE\"),\n  center: PointSchema,\n  radius: z.number(),\n  width: z.number(),\n})\n\nexport const SolidRegionSchema = BaseShapeSchema.extend({\n  type: z.literal(\"SOLIDREGION\"),\n  layermask: z.number(),\n  points: z.array(PointSchema),\n  fillStyle: z.string(),\n})\n\nexport const SVGNodeSchema = BaseShapeSchema.extend({\n  type: z.literal(\"SVGNODE\"),\n  svgData: z.object({\n    gId: z.string(),\n    nodeName: z.string(),\n    nodeType: z.number(),\n    layerid: z.string(),\n    attrs: z.record(z.string(), z.string()),\n    childNodes: z.array(z.unknown()),\n  }),\n})\n\n// e.g. \"HOLE~3999.449~3004.213~1.378~gge152~0\"\nexport const HoleSchema = BaseShapeSchema.extend({\n  type: z.literal(\"HOLE\"),\n  center: PointSchema,\n  radius: z.number(),\n})\n\nexport const ViaSchema = BaseShapeSchema.extend({\n  type: z.literal(\"VIA\"),\n  center: PointSchema,\n  outerDiameter: z.number(),\n  holeRadius: z.number(),\n})\n\nexport const RectSchema = BaseShapeSchema.extend({\n  type: z.literal(\"RECT\"),\n  x: tenthmil,\n  y: tenthmil,\n  width: tenthmil,\n  height: tenthmil,\n  lineWidth: z.number(),\n  fillStyle: z.string(),\n  rotation: z.number().optional(),\n})\n\nexport const TextSchema = BaseShapeSchema.extend({\n  type: z.literal(\"TEXT\"),\n  text: z.string(),\n  x: tenthmil,\n  y: tenthmil,\n  size_mm: z.number(),\n  rotation: z.number().optional(),\n  layer: z.number().optional(),\n  textAnchor: z\n    .enum([\"L\", \"C\", \"R\", \"\"])\n    .optional()\n    .transform((val) => (val === \"\" ? undefined : val)),\n  font: z.string().optional(),\n})\n\nexport const PackageDetailShapeSchema = z.discriminatedUnion(\"type\", [\n  TrackSchema,\n  PadSchema,\n  ArcSchema,\n  CircleSchema,\n  SolidRegionSchema,\n  SVGNodeSchema,\n  HoleSchema,\n  ViaSchema,\n  RectSchema,\n  TextSchema,\n])\n\nconst pairs = <T>(arr: T[]): [T, T][] => {\n  const pairs: [T, T][] = []\n  for (let i = 0; i < arr.length; i += 2) {\n    pairs.push([arr[i], arr[i + 1]])\n  }\n  return pairs\n}\n\nconst parsePoints = (pointsStr: string): number[][] =>\n  pairs(\n    pointsStr\n      .trim()\n      .split(\" \")\n      .map((n) => Number(n)),\n  )\n\nexport const ShapeItemSchema = z\n  .object({\n    type: z.string(),\n    data: z.string(),\n  })\n  .transform((shape) => {\n    switch (shape.type) {\n      case \"TRACK\": {\n        const [width, layer, _, pointsStr, id, _n] = shape.data.split(\"~\")\n        const points = parsePoints(pointsStr)\n        return TrackSchema.parse({ type: \"TRACK\", width, layer, points, id })\n      }\n      case \"PAD\": {\n        const [padShape, ...params] = shape.data.split(\"~\")\n        const [\n          centerX,\n          centerY,\n          width,\n          height,\n          layermask,\n          net,\n          number,\n          holeRadius,\n          ...rest\n        ] = params.map((p) => (Number.isNaN(Number(p)) ? p : Number(p)))\n        const center = { x: centerX, y: centerY }\n        let points: number[][] | undefined\n\n        if (padShape === \"RECT\" || padShape === \"POLYGON\") {\n          points = parsePoints(rest[0] as any)\n        }\n\n        // Extract rotation for all pad types from position 11 (rest[1])\n        const r = Number(rest[1])\n        const rotation = Number.isNaN(r) ? undefined : r\n\n        const padInputParams = {\n          type: \"PAD\",\n          shape: padShape,\n          center,\n          width,\n          height,\n          layermask,\n          net,\n          number,\n          holeRadius,\n          points,\n          rotation,\n          plated: rest.includes(\"Y\"),\n        }\n        const pad = PadSchema.parse(padInputParams)\n        return pad\n      }\n      case \"ARC\": {\n        const [width, layer, , arcData] = shape.data.split(\"~\")\n        // A rx ry x-axis-rotation large-arc-flag sweep-flag x  y\n        // A rx ry x-axis-rotation large-arc-flag sweep-flag dx dy\n        const match = arcData.match(\n          /M\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*A\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)\\s*([\\d.-]+)(?:\\s*,\\s*|\\s+)([\\d.-]+)/,\n        )\n\n        if (!match) {\n          throw new Error(`Invalid arc data: ${arcData}`)\n        }\n\n        const [\n          ,\n          startX,\n          startY,\n          radiusX,\n          radiusY,\n          xAxisRotation,\n          largeArcFlag,\n          sweepFlag,\n          endX,\n          endY,\n        ] = match\n        const start: [number, number] = [Number(startX), Number(startY)]\n        const end: [number, number] = [Number(endX), Number(endY)]\n        return ArcSchema.parse({\n          type: \"ARC\",\n          width: Number(width),\n          layer: Number(layer),\n          start,\n          end,\n          radiusX: Number(radiusX),\n          radiusY: Number(radiusY),\n          largeArc: largeArcFlag === \"1\",\n          // sweepFlag=1 means clockwise (CW), sweepFlag=0 means counter-clockwise (CCW)\n          sweepDirection: sweepFlag === \"1\" ? \"CW\" : \"CCW\",\n        })\n      }\n      case \"CIRCLE\": {\n        const [centerX, centerY, radius, width, layer, id] =\n          shape.data.split(\"~\")\n        const center: [number, number] = [Number(centerX), Number(centerY)]\n        return CircleSchema.parse({\n          type: \"CIRCLE\",\n          center,\n          radius: Number(radius),\n          width: Number(width),\n          layer: Number(layer),\n          id,\n        })\n      }\n      case \"HOLE\": {\n        const [centerX, centerY, radius, id] = shape.data.split(\"~\")\n        const center: [number, number] = [Number(centerX), Number(centerY)]\n        return HoleSchema.parse({\n          type: \"HOLE\",\n          center,\n          radius: Number(radius),\n          id,\n        })\n      }\n      case \"VIA\": {\n        const [x, y, outerDiameter, , holeRadius, id] = shape.data.split(\"~\")\n        const center: [number, number] = [Number(x), Number(y)]\n        return ViaSchema.parse({\n          type: \"VIA\",\n          center,\n          outerDiameter: Number(outerDiameter),\n          holeRadius: Number(holeRadius),\n          id,\n        })\n      }\n      case \"SOLIDREGION\": {\n        const [layermask, , pathData, fillStyle, id] = shape.data.split(\"~\")\n        const points =\n          pathData.match(/[ML] ?(-?[\\d.]+)[ ,](-?[\\d.]+)/g)?.map((point) => {\n            const [, x, y] =\n              point.match(/[ML]? ?(-?[\\d.]+)[ ,](-?[\\d.]+)/) || []\n            return [Number(x), Number(y)]\n          }) || []\n        return SolidRegionSchema.parse({\n          type: \"SOLIDREGION\",\n          layermask: Number(layermask),\n          points,\n          fillStyle,\n          id,\n        })\n      }\n      case \"SVGNODE\": {\n        const svgData = JSON.parse(shape.data)\n        return SVGNodeSchema.parse({ type: \"SVGNODE\", svgData })\n      }\n      case \"RECT\": {\n        const [x, y, width, height, lineWidth, id, rotation, layer, fillStyle] =\n          shape.data.split(\"~\")\n        const r = rotation ? Number(rotation) : undefined\n        return RectSchema.parse({\n          type: \"RECT\",\n          x,\n          y,\n          width,\n          height,\n          lineWidth: Number(lineWidth),\n          id,\n          rotation: Number.isNaN(r as number) ? undefined : r,\n          layer: layer ? Number(layer) : undefined,\n          fillStyle: fillStyle || undefined,\n        })\n      }\n      case \"TEXT\": {\n        const [textAnchor, x, y, size, layer, id, rotation, , font, text] =\n          shape.data.split(\"~\")\n        const r = rotation ? Number(rotation) : undefined\n        return TextSchema.parse({\n          type: \"TEXT\",\n          text,\n          x,\n          y,\n          size_mm: Number(size) * 2.54, // empirically this seems to match, C5248081 is a good test case\n          layer: layer ? Number(layer) : undefined,\n          id,\n          rotation: Number.isNaN(r as number) ? undefined : r,\n          textAnchor: textAnchor as \"L\" | \"C\" | \"R\" | undefined,\n          font: font || undefined,\n        })\n      }\n\n      default:\n        throw new Error(`Unknown shape type: ${shape.type}`)\n    }\n  })\n  .pipe(PackageDetailShapeSchema)\n\nexport const ShapesArraySchema = z.array(ShapeItemSchema)\n","import { z } from \"zod\"\nimport { mil10ToMm } from \"lib/utils/easyeda-unit-to-mm\"\n\n/**\n I'll break down the elements in the `dataStr.head.shape` array and explain what they represent. This array contains instructions for drawing the schematic symbol of the component.\n1. `\"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\"`\n   This represents a rectangle:\n   - Starting position: (365, 275)\n   - Width: 70\n   - Height: 50\n   - Color: #880000 (dark red)\n   - Line width: 1\n   - Other parameters are for internal use\n2. `\"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\"`\n   This draws an ellipse:\n   - Center: (370, 280)\n   - Radius X: 1.5\n   - Radius Y: 1.5\n   - Color: #880000 (dark red)\n   - Line width: 1\n3-10. `\"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\"`\n   These represent pins of the component. Each pin has:\n   - Pin number\n   - Position\n   - Orientation\n   - Label (e.g., GND, TRIG, OUT)\n   - Color\n   - Drawing instructions for the pin shape\n4. `\"A~M x1 y1 A radius radius 0 1 0 x2 y2\"`\n   This represents an arc:\n   - Start point: (x1, y1)\n   - End point: (x2, y2)\n   - Radius\n   - Direction (CW or CCW)\n   - Color\n   - Line width\n   - ID\nTo parse this data:\n1. Split the string by `~` to get individual parameters.\n2. For rectangles (R), use parameters 2-7 for position, size, and color.\n3. For ellipses (E), use parameters 2-5 for position and size, and 6 for color.\n4. For pins (P), split further by `^^` to get different sections:\n   - First section: general pin properties\n   - Second section: pin position\n   - Third section: line drawing instruction\n   - Fourth and Fifth sections: label position and text\n   - Sixth section: additional drawing instruction for pin shape\n5. For arcs (A), split by `~M ` to get the path data.\n   - Format: A~M x1 y1 A radius radius 0 1 0 x2 y2\n   - Parse the start and end points, radius, direction, color, line width, and ID.\nThis data structure allows for a compact representation of the schematic symbol, which can be rendered by CAD software to display the component in circuit diagrams.\n */\n// Examples\n// \"R~365~275~2~2~70~50~#880000~1~0~none~gge1~0~\",\n// \"E~370~280~1.5~1.5~#880000~1~0~#880000~gge2~0\",\n// \"P~show~0~1~355~285~180~gge5~0^^355~285^^M355,285h10~#000000^^1~368.7~289~0~GND~start~~~#000000^^1~364.5~284~0~1~end~~~#000000^^0~362~285^^0~M 365 288 L 368 285 L 365 282\",\n// \"P~show~0~2~355~295~180~gge6~0^^355~295^^M355,295h10~#880000^^1~368.7~299~0~TRIG~start~~~#0000FF^^1~364.5~294~0~2~end~~~#0000FF^^0~362~295^^0~M 365 298 L 368 295 L 365 292\",\n// \"P~show~0~3~355~305~180~gge7~0^^355~305^^M355,305h10~#880000^^1~368.7~309~0~OUT~start~~~#0000FF^^1~364.5~304~0~3~end~~~#0000FF^^0~362~305^^0~M 365 308 L 368 305 L 365 302\",\n// \"P~show~0~4~355~315~180~gge8~0^^355~315^^M355,315h10~#880000^^1~368.7~319~0~RESET~start~~~#0000FF^^1~364.5~314~0~4~end~~~#0000FF^^0~362~315^^0~M 365 318 L 368 315 L 365 312\",\n// \"P~show~0~5~445~315~0~gge9~0^^445~315^^M445,315h-10~#880000^^1~431.3~319~0~CONT~end~~~#0000FF^^1~435.5~314~0~5~start~~~#0000FF^^0~438~315^^0~M 435 312 L 432 315 L 435 318\",\n// \"P~show~0~6~445~305~0~gge10~0^^445~305^^M445,305h-10~#880000^^1~431.3~309~0~THRES~end~~~#0000FF^^1~435.5~304~0~6~start~~~#0000FF^^0~438~305^^0~M 435 302 L 432 305 L 435 308\",\n// \"P~show~0~7~445~295~0~gge11~0^^445~295^^M445,295h-10~#880000^^1~431.3~299~0~DISCH~end~~~#0000FF^^1~435.5~294~0~7~start~~~#0000FF^^0~438~295^^0~M 435 292 L 432 295 L 435 298\",\n// \"P~show~0~8~445~285~0~gge12~0^^445~285^^M445,285h-10~#FF0000^^1~431.3~289~0~VCC~end~~~#FF0000^^1~435.5~284~0~8~start~~~#FF0000^^0~438~285^^0~M 435 282 L 432 285 L 435 288\",\n// \"A~M x1 y1 A radius radius 0 1 0 x2 y2\"\n\nconst PointSchema = z.object({\n  x: z.number(),\n  y: z.number(),\n})\n\nconst RectangleShapeOutputSchema = z.object({\n  type: z.literal(\"RECTANGLE\"),\n  position: PointSchema,\n  width: z.number(),\n  height: z.number(),\n  color: z.string(),\n  lineWidth: z.number(),\n  fillColor: z.string().optional(),\n  id: z.string(),\n})\n\nconst parseRectangle = (\n  str: string,\n): z.infer<typeof RectangleShapeOutputSchema> => {\n  const [, x, y, , , width, height, color, lineWidth, , fillColor, id] =\n    str.split(\"~\")\n  return {\n    type: \"RECTANGLE\",\n    position: { x: Number(x), y: Number(y) },\n    width: Number(width),\n    height: Number(height),\n    color,\n    lineWidth: Number(lineWidth),\n    fillColor,\n    id,\n  }\n}\n\nexport const RectangleShapeSchema = z\n  .string()\n  .startsWith(\"R~\")\n  .transform(parseRectangle)\n  .pipe(RectangleShapeOutputSchema)\n\nconst EllipseShapeOutputSchema = z.object({\n  type: z.literal(\"ELLIPSE\"),\n  center: PointSchema,\n  radiusX: z.number(),\n  radiusY: z.number(),\n  color: z.string(),\n  lineWidth: z.number(),\n  fillColor: z.string().optional(),\n  id: z.string(),\n})\n\nconst parseEllipse = (\n  str: string,\n): z.infer<typeof EllipseShapeOutputSchema> => {\n  const [, x, y, radiusX, radiusY, color, lineWidth, , fillColor, id] =\n    str.split(\"~\")\n  return {\n    type: \"ELLIPSE\",\n    center: { x: Number(x), y: Number(y) },\n    radiusX: Number(radiusX),\n    radiusY: Number(radiusY),\n    color,\n    lineWidth: Number(lineWidth),\n    fillColor,\n    id,\n  }\n}\n\nexport const EllipseShapeSchema = z\n  .string()\n  .startsWith(\"E~\")\n  .transform(parseEllipse)\n  .pipe(EllipseShapeOutputSchema)\n\nconst ArcShapeOutputSchema = z.object({\n  type: z.literal(\"ARC\"),\n  pathData: z.string(),\n  start: PointSchema,\n  end: PointSchema,\n  radius: z.number(),\n  sweepFlag: z.boolean(),\n  color: z.string(),\n  lineWidth: z.number(),\n  id: z.string(),\n})\n\nconst parseArc = (str: string): z.infer<typeof ArcShapeOutputSchema> => {\n  // Format: A~M x1 y1 A radius radius 0 1 0 x2 y2~#880000~1~0~none~gge49~0\n  const [, pathData, ...fields] = str.split(\"~\")\n  const colorIndex = fields.findIndex((field) => /^#[0-9a-f]{6}$/i.test(field))\n  const color = fields[colorIndex] || \"#880000\"\n  const lineWidth = fields[colorIndex + 1]\n  const id = fields.find((field) => /^(?:gge|rep)/.test(field)) || \"gge1\"\n  const numbers =\n    pathData.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g)?.map(Number) ??\n    []\n\n  // Handle potential NaN values by defaulting to 0\n  const [x1 = 0, y1 = 0, radius = 0, , , , sweepFlag = 0, x2 = 0, y2 = 0] =\n    numbers\n\n  // Handle empty or invalid line width\n  const parsedLineWidth = Number(lineWidth)\n  const finalLineWidth = Number.isNaN(parsedLineWidth) ? 1 : parsedLineWidth\n\n  return {\n    type: \"ARC\",\n    pathData,\n    start: { x: x1, y: y1 },\n    end: { x: x2, y: y2 },\n    radius,\n    sweepFlag: sweepFlag === 1,\n    color,\n    lineWidth: finalLineWidth,\n    id,\n  }\n}\n\nexport const ArcShapeSchema = z\n  .string()\n  .startsWith(\"A~\")\n  .transform(parseArc)\n  .pipe(ArcShapeOutputSchema)\n\nconst PinShapeOutputSchema = z.object({\n  type: z.literal(\"PIN\"),\n  visibility: z.enum([\"show\", \"hide\", \"none\"]),\n  pinNumber: z.union([z.string(), z.number()]),\n  x: z.number(),\n  y: z.number(),\n  rotation: z.number(),\n  id: z.string(),\n  label: z.string(),\n  labelColor: z.string(),\n  path: z.string(),\n  arrow: z.string(),\n})\n\nconst parsePin = (pinString: string): z.infer<typeof PinShapeOutputSchema> => {\n  const parts = pinString.split(\"~\")\n  const [, visibility, , pinNumber, x, y, rotation, id] = parts\n\n  const nameMatch = pinString.match(/~([\\w+#-]+)~(start|end)~/)\n  let label = nameMatch ? nameMatch[1] : \"\"\n  if (label.endsWith(\"+\")) label = label.slice(0, -1) + \"_POS\"\n  if (label.endsWith(\"-\")) label = label.slice(0, -1) + \"_NEG\"\n  if (label.endsWith(\"#\")) label = label.slice(0, -1)\n  if (/^\\+\\d+(?:\\.\\d+)?V$/i.test(label)) label = `V${label.slice(1, -1)}`\n\n  const colorMatch = pinString.match(/#[0-9A-F]{6}/)\n  const labelColor = colorMatch ? colorMatch[0] : \"\"\n\n  const path = pinString.split(\"^^\")[2]?.split(\"~\")[0] ?? \"\"\n\n  const arrowMatch = pinString.match(/\\^\\^0~(.+)$/)\n  const arrow = arrowMatch ? arrowMatch[1] : \"\"\n\n  const r = Number.parseFloat(rotation)\n  return {\n    type: \"PIN\",\n    visibility: visibility as \"show\" | \"hide\" | \"none\",\n    id,\n    pinNumber: Number.isNaN(Number(pinNumber)) ? pinNumber : Number(pinNumber),\n    x: Number.parseFloat(x),\n    y: Number.parseFloat(y),\n    rotation: Number.isNaN(r) ? 0 : r,\n    label,\n    labelColor,\n    path,\n    arrow,\n  }\n}\n\nexport const PinShapeSchema = z\n  .string()\n  .startsWith(\"P~\")\n  .transform(parsePin)\n  .pipe(PinShapeOutputSchema)\n\nconst PolylineShapeOutputSchema = z.object({\n  type: z.literal(\"POLYLINE\"),\n  points: z.array(PointSchema),\n  color: z.string(),\n  lineWidth: z.number(),\n  id: z.string(),\n})\n\nconst parsePoints = (pointsStr: string): Array<{ x: number; y: number }> => {\n  return pointsStr\n    .split(\" \")\n    .reduce<Array<{ x: number; y: number }>>((acc, value, index) => {\n      if (index % 2 === 0) {\n        acc.push({ x: Number(value), y: 0 })\n      } else {\n        acc[acc.length - 1].y = Number(value)\n      }\n      return acc\n    }, [])\n}\n\nconst parsePolyline = (\n  str: string,\n): z.infer<typeof PolylineShapeOutputSchema> => {\n  const [, ...rest] = str.split(\"~\")\n  const [pointsStr, color, lineWidth, , , id] = rest\n\n  return {\n    type: \"POLYLINE\",\n    points: parsePoints(pointsStr),\n    color,\n    lineWidth: Number(lineWidth),\n    id,\n  }\n}\n\nexport const PolylineShapeSchema = z\n  .string()\n  .startsWith(\"PL~\")\n  .transform(parsePolyline)\n  .pipe(PolylineShapeOutputSchema)\n\nconst PolygonShapeOutputSchema = z.object({\n  type: z.literal(\"POLYGON\"),\n  points: z.array(PointSchema),\n  fillColor: z.string(),\n  lineWidth: z.number(),\n  lineColor: z.string(),\n  id: z.string(),\n})\n\nconst parsePolygon = (\n  str: string,\n): z.infer<typeof PolygonShapeOutputSchema> => {\n  const [, ...rest] = str.split(\"~\")\n  const [pointsStr, lineColor, lineWidth, , fillColor, id] = rest\n\n  return {\n    type: \"POLYGON\",\n    points: parsePoints(pointsStr),\n    fillColor,\n    lineWidth: Number(lineWidth),\n    lineColor,\n    id,\n  }\n}\n\nexport const PolygonShapeSchema = z\n  .string()\n  .startsWith(\"PG~\")\n  .transform(parsePolygon)\n  .pipe(PolygonShapeOutputSchema)\n\nconst PathShapeOutputSchema = z.object({\n  type: z.literal(\"PATH\"),\n  pathData: z.string(),\n  fillColor: z.string(),\n  strokeWidth: z.number(),\n  strokeColor: z.string(),\n  id: z.string(),\n})\n\nconst parsePath = (str: string): z.infer<typeof PathShapeOutputSchema> => {\n  const [, pathData, strokeColor, strokeWidth, , fillColor, id] = str.split(\"~\")\n  return {\n    type: \"PATH\",\n    pathData,\n    fillColor,\n    strokeWidth: mil10ToMm(Number(strokeWidth)),\n    strokeColor,\n    id,\n  }\n}\n\nexport const PathShapeSchema = z\n  .string()\n  .startsWith(\"PT~\")\n  .transform(parsePath)\n  .pipe(PathShapeOutputSchema)\n\n/**\n * EasyEDA sometimes serializes absent optional text fields as the literal string\n * \"undefined\" instead of omitting them or leaving them empty.\n */\nconst optionalEasyEdaTextField = <T extends z.ZodTypeAny>(fieldSchema: T) =>\n  z.preprocess((textField) => {\n    if (textField == null || textField === \"\" || textField === \"undefined\") {\n      return undefined\n    }\n\n    return textField\n  }, fieldSchema)\n\nconst TextShapeOutputSchema = z.object({\n  type: z.literal(\"TEXT\"),\n  alignment: z.enum([\"L\", \"C\", \"R\"]),\n  x: z.number(),\n  y: z.number(),\n  rotation: z.number(),\n  fontColor: z.string(),\n  backgroundColor: optionalEasyEdaTextField(z.string().optional()),\n  fontSize: z.string(),\n  fontWeight: optionalEasyEdaTextField(z.string().optional().default(\"normal\")),\n  fontStyle: optionalEasyEdaTextField(\n    z.enum([\"normal\", \"italic\"]).optional().default(\"normal\"),\n  ),\n  fontDecoration: optionalEasyEdaTextField(z.string().optional().default(\"\")),\n  content: z.string(),\n  textType: z.string(),\n  visibility: z.enum([\"0\", \"1\"]),\n  mirror: z.string(),\n  id: z.string(),\n})\n\nconst parseText = (str: string): z.input<typeof TextShapeOutputSchema> => {\n  const [\n    ,\n    alignment,\n    x,\n    y,\n    rotation,\n    fontColor,\n    backgroundColor,\n    fontSize,\n    fontWeight,\n    fontStyle,\n    fontDecoration,\n    textType,\n    content,\n    visibility,\n    mirror,\n    id,\n  ] = str.split(\"~\")\n\n  return {\n    type: \"TEXT\",\n    alignment: alignment as \"L\" | \"C\" | \"R\",\n    x: Number(x),\n    y: Number(y),\n    rotation: Number(rotation),\n    fontColor,\n    backgroundColor,\n    fontSize,\n    fontWeight,\n    fontStyle,\n    fontDecoration,\n    content,\n    textType,\n    visibility: visibility as \"0\" | \"1\",\n    mirror,\n    id,\n  }\n}\n\nexport const TextShapeSchema = z\n  .string()\n  .startsWith(\"T~\")\n  .transform(parseText)\n  .pipe(TextShapeOutputSchema)\n\nexport const SingleLetterShapeSchema = z\n  .string()\n  .transform((x) => {\n    // We do some discrimination here for better errors\n    if (x.startsWith(\"R~\")) return RectangleShapeSchema.parse(x)\n    if (x.startsWith(\"E~\")) return EllipseShapeSchema.parse(x)\n    if (x.startsWith(\"P~\")) return PinShapeSchema.parse(x)\n    if (x.startsWith(\"PL~\")) return PolylineShapeSchema.parse(x)\n    if (x.startsWith(\"PG~\")) return PolygonShapeSchema.parse(x)\n    if (x.startsWith(\"PT~\")) return PathShapeSchema.parse(x)\n    if (x.startsWith(\"T~\")) return TextShapeSchema.parse(x)\n    if (x.startsWith(\"A~\")) return ArcShapeSchema.parse(x)\n    throw new Error(`Invalid shape type: ${x}`)\n  })\n  .pipe(\n    z.union([\n      RectangleShapeOutputSchema,\n      EllipseShapeOutputSchema,\n      PinShapeOutputSchema,\n      PolylineShapeOutputSchema,\n      PolygonShapeOutputSchema,\n      PathShapeOutputSchema,\n      TextShapeOutputSchema,\n      ArcShapeOutputSchema,\n    ]),\n  )\n\nexport type SingleLetterShape = z.infer<typeof SingleLetterShapeSchema>\n","export function normalizeManufacturerPartNumber(partNumber: string): string {\n  // Step 1: Replace dashes and invalid symbols with underscores\n  let normalized = partNumber\n    .replace(/[-]/g, \"_\")\n    .replace(/[^a-zA-Z0-9_$]/g, \"_\")\n\n  // Step 2: If the string starts with a number, prepend 'A_'\n  if (/^\\d/.test(normalized)) {\n    normalized = \"A_\" + normalized\n  }\n\n  return normalized\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport {\n  getCadModelOffsetMm,\n  getCadModelOffsetMmFromBounds,\n  getCadSvgNodeModelUuid,\n  getCadSvgNodeZOffsetMm,\n} from \"./get-easyeda-cad-placement-helpers\"\nimport { getModelObjCdnUrl, getModelStepCdnUrl } from \"./get-model-cdn-url\"\n\ntype ModelBounds = {\n  min: { x: number; y: number; z: number }\n  max: { x: number; y: number; z: number }\n}\n\nexport type EasyEdaCadModelPlacement = {\n  modelObjUrl: string\n  positionXMm: number\n  positionYMm: number\n  modelStepUrl?: string\n  positionZMm: number\n  bounds: ModelBounds\n}\n\nconst placementCache = new Map<\n  string,\n  Promise<EasyEdaCadModelPlacement | null>\n>()\n\nconst parseObjBounds = (objText: string): ModelBounds | null => {\n  let minX = Number.POSITIVE_INFINITY\n  let minY = Number.POSITIVE_INFINITY\n  let minZ = Number.POSITIVE_INFINITY\n  let maxX = Number.NEGATIVE_INFINITY\n  let maxY = Number.NEGATIVE_INFINITY\n  let maxZ = Number.NEGATIVE_INFINITY\n  let vertexCount = 0\n\n  for (const line of objText.split(/\\r?\\n/)) {\n    const trimmed = line.trim()\n    if (!trimmed.startsWith(\"v \")) continue\n\n    const [, xStr, yStr, zStr] = trimmed.split(/\\s+/, 4)\n    const x = Number(xStr)\n    const y = Number(yStr)\n    const z = Number(zStr)\n\n    if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n      continue\n    }\n\n    vertexCount += 1\n    minX = Math.min(minX, x)\n    minY = Math.min(minY, y)\n    minZ = Math.min(minZ, z)\n    maxX = Math.max(maxX, x)\n    maxY = Math.max(maxY, y)\n    maxZ = Math.max(maxZ, z)\n  }\n\n  if (vertexCount === 0) return null\n\n  return {\n    min: { x: minX, y: minY, z: minZ },\n    max: { x: maxX, y: maxY, z: maxZ },\n  }\n}\n\nconst getPositionZMmFromBounds = (\n  bounds: ModelBounds,\n  svgNodeZOffsetMm: number,\n) => {\n  const minZ = Math.abs(bounds.min.z) < 1e-6 ? 0 : bounds.min.z\n  return minZ - svgNodeZOffsetMm\n}\n\nexport const getEasyEdaCadModelPlacement = async (\n  easyEdaJson: BetterEasyEdaJson,\n  { fetch = globalThis.fetch }: { fetch?: typeof globalThis.fetch } = {},\n): Promise<EasyEdaCadModelPlacement | null> => {\n  const modelUuid = getCadSvgNodeModelUuid(easyEdaJson)\n  const partNumber = easyEdaJson.lcsc.number\n  const svgNodeZOffsetMm = getCadSvgNodeZOffsetMm(easyEdaJson)\n\n  if (!modelUuid || !partNumber || svgNodeZOffsetMm == null || !fetch) {\n    return null\n  }\n\n  const modelObjUrl = getModelObjCdnUrl({\n    easyedaModelUuid: modelUuid,\n    easyedaPartNumber: partNumber,\n  })\n  const modelStepUrl = getModelStepCdnUrl({\n    easyedaModelUuid: modelUuid,\n    easyedaPartNumber: partNumber,\n  })\n\n  const metadataBounds = easyEdaJson._objMetadata?.bounds\n  if (metadataBounds) {\n    const derivedOffsetMm = getCadModelOffsetMm(easyEdaJson)\n    if (!derivedOffsetMm) return null\n\n    return {\n      modelObjUrl,\n      positionXMm: derivedOffsetMm.x,\n      positionYMm: derivedOffsetMm.y,\n      modelStepUrl,\n      bounds: metadataBounds,\n      positionZMm: getPositionZMmFromBounds(metadataBounds, svgNodeZOffsetMm),\n    }\n  }\n\n  const cacheKey = `${modelObjUrl}::${svgNodeZOffsetMm}`\n  const cachedPlacement = placementCache.get(cacheKey)\n  if (cachedPlacement) return cachedPlacement\n\n  const placementPromise = (async () => {\n    try {\n      const response = await fetch(modelObjUrl)\n      if (!response.ok) return null\n\n      const objText = await response.text()\n      const bounds = parseObjBounds(objText)\n      if (!bounds) return null\n\n      const derivedOffsetMm = getCadModelOffsetMmFromBounds(easyEdaJson, bounds)\n      if (!derivedOffsetMm) return null\n\n      return {\n        modelObjUrl,\n        positionXMm: derivedOffsetMm.x,\n        positionYMm: derivedOffsetMm.y,\n        modelStepUrl,\n        bounds,\n        // Align the EasyEDA SVG-node Z against the model's minimum Z.\n        positionZMm: getPositionZMmFromBounds(bounds, svgNodeZOffsetMm),\n      }\n    } catch (error) {\n      console.error(\n        `Error resolving EasyEDA CAD placement for ${partNumber}:`,\n        error,\n      )\n      return null\n    }\n  })()\n\n  placementCache.set(cacheKey, placementPromise)\n  return placementPromise\n}\n","import { mmStr } from \"@tscircuit/mm\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { su } from \"@tscircuit/circuit-json-util\"\n\ninterface GenerateFootprintTsxOptions {\n  portHintsMap?: Record<string, string[]>\n}\n\nconst mapPortHints = (\n  portHints: string[] | undefined,\n  portHintsMap: Record<string, string[]> | undefined,\n): string[] | undefined => {\n  if (!portHintsMap || !portHints) return portHints\n\n  return portHints.flatMap((hint) => portHintsMap[hint] ?? [hint])\n}\n\nexport const generateFootprintTsx = (\n  circuitJson: AnyCircuitElement[],\n  options: GenerateFootprintTsxOptions = {},\n): string => {\n  const holes = su(circuitJson).pcb_hole.list()\n  const platedHoles = su(circuitJson).pcb_plated_hole.list()\n  const smtPads = su(circuitJson).pcb_smtpad.list()\n  const vias = su(circuitJson).pcb_via.list()\n  const silkscreenPaths = su(circuitJson).pcb_silkscreen_path.list()\n  const silkscreenTexts = su(circuitJson).pcb_silkscreen_text.list()\n  const courtyardOutlines = su(circuitJson).pcb_courtyard_outline.list()\n\n  const elementStrings: string[] = []\n\n  for (const hole of holes) {\n    if (hole.hole_shape === \"circle\") {\n      elementStrings.push(\n        `<hole pcbX=\"${mmStr(hole.x)}\" pcbY=\"${mmStr(hole.y)}\" diameter=\"${mmStr(hole.hole_diameter)}\" />`,\n      )\n    } else if (hole.hole_shape === \"oval\") {\n      console.warn(\"Unhandled oval hole in conversion (needs implementation)\")\n    }\n  }\n\n  for (const platedHole of platedHoles) {\n    if (platedHole.shape === \"pill\" || platedHole.shape === \"oval\") {\n      const cccwRotationDegree = platedHole.ccw_rotation || 0\n      const rotation = cccwRotationDegree\n        ? ` pcbRotation=\"${cccwRotationDegree}deg\"`\n        : \"\"\n\n      elementStrings.push(\n        `<platedhole  portHints={${JSON.stringify(mapPortHints(platedHole.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" holeWidth=\"${mmStr(platedHole.hole_width)}\" holeHeight=\"${mmStr(platedHole.hole_height)}\" outerWidth=\"${mmStr(platedHole.outer_width)}\" outerHeight=\"${mmStr(platedHole.outer_height)}\"${rotation} shape=\"${platedHole.shape}\" />`,\n      )\n    } else if (platedHole.shape === \"pill_hole_with_rect_pad\") {\n      elementStrings.push(\n        `<platedhole  portHints={${JSON.stringify(mapPortHints(platedHole.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" holeWidth=\"${mmStr(platedHole.hole_width)}\" holeHeight=\"${mmStr(platedHole.hole_height)}\" outerWidth=\"${mmStr(platedHole.rect_pad_width)}\" outerHeight=\"${mmStr(platedHole.rect_pad_height)}\" shape=\"pill\" />`,\n      )\n    } else if (platedHole.shape === \"circle\") {\n      elementStrings.push(\n        `<platedhole  portHints={${JSON.stringify(mapPortHints(platedHole.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" outerDiameter=\"${mmStr(platedHole.outer_diameter)}\" holeDiameter=\"${mmStr(platedHole.hole_diameter)}\" shape=\"circle\" />`,\n      )\n    } else if (platedHole.shape === \"rotated_pill_hole_with_rect_pad\") {\n      const rotation = platedHole.hole_ccw_rotation || 0\n\n      elementStrings.push(\n        `<platedhole  portHints={${JSON.stringify(mapPortHints(platedHole.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(platedHole.x)}\" pcbY=\"${mmStr(platedHole.y)}\" holeWidth=\"${mmStr(platedHole.hole_width)}\" holeHeight=\"${mmStr(platedHole.hole_height)}\" outerWidth=\"${mmStr(platedHole.rect_pad_width)}\" outerHeight=\"${mmStr(platedHole.rect_pad_height)}\" rectPad={true} pcbRotation=\"${rotation}deg\" shape=\"pill\" />`,\n      )\n    }\n  }\n\n  for (const smtPad of smtPads) {\n    if (smtPad.shape === \"circle\") {\n      elementStrings.push(\n        `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" radius=\"${mmStr(smtPad.radius)}\" shape=\"circle\" />`,\n      )\n    } else if (smtPad.shape === \"rect\") {\n      const cornerRadius =\n        smtPad.corner_radius ?? smtPad.rect_border_radius ?? undefined\n      const cornerRadiusAttr =\n        cornerRadius !== undefined\n          ? ` cornerRadius=\"${mmStr(cornerRadius)}\"`\n          : \"\"\n      elementStrings.push(\n        `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" width=\"${mmStr(smtPad.width)}\" height=\"${mmStr(smtPad.height)}\"${cornerRadiusAttr} shape=\"rect\" />`,\n      )\n    } else if (smtPad.shape === \"pill\") {\n      elementStrings.push(\n        `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} pcbX=\"${mmStr(smtPad.x)}\" pcbY=\"${mmStr(smtPad.y)}\" width=\"${mmStr(smtPad.width)}\" height=\"${mmStr(smtPad.height)}\" radius=\"${mmStr(smtPad.radius)}\" shape=\"pill\" />`,\n      )\n    } else if (smtPad.shape === \"polygon\") {\n      const pointsStr = smtPad.points\n        .map((p) => `{x: \"${mmStr(p.x)}\", y: \"${mmStr(p.y)}\"}`)\n        .join(\", \")\n      elementStrings.push(\n        `<smtpad portHints={${JSON.stringify(mapPortHints(smtPad.port_hints, options.portHintsMap))}} points={[${pointsStr}]} shape=\"polygon\" />`,\n      )\n    }\n  }\n\n  for (const via of vias) {\n    elementStrings.push(\n      `<via pcbX=\"${mmStr(via.x)}\" pcbY=\"${mmStr(via.y)}\" outerDiameter=\"${mmStr(via.outer_diameter)}\" holeDiameter=\"${mmStr(via.hole_diameter)}\" layers={${JSON.stringify(via.layers)}} />`,\n    )\n  }\n\n  for (const silkscreenPath of silkscreenPaths) {\n    elementStrings.push(\n      `<silkscreenpath route={${JSON.stringify(silkscreenPath.route)}} />`,\n    )\n  }\n\n  for (const silkscreenText of silkscreenTexts) {\n    // Preserve the \"{NAME}\" placeholder so the runtime/editor can resolve it\n    const isRefDes = silkscreenText.text === \"{NAME}\"\n    const textValue = isRefDes\n      ? JSON.stringify(\"{NAME}\")\n      : JSON.stringify(silkscreenText.text)\n\n    elementStrings.push(\n      `<silkscreentext text=${textValue} pcbX=\"${mmStr(silkscreenText.anchor_position.x)}\" pcbY=\"${mmStr(silkscreenText.anchor_position.y)}\" anchorAlignment=\"${silkscreenText.anchor_alignment}\" ${silkscreenText.font_size ? `fontSize=\"${mmStr(silkscreenText.font_size)}\"` : \"\"} />`,\n    )\n  }\n\n  for (const courtyardOutline of courtyardOutlines) {\n    elementStrings.push(\n      `<courtyardoutline outline={${JSON.stringify(courtyardOutline.outline)}} />`,\n    )\n  }\n\n  return `\n      <footprint>\n        ${elementStrings.join(\"\\n\")}\n      </footprint>\n  `.trim()\n}\n","import type { ChipProps, SupplierPartNumbers } from \"@tscircuit/props\"\nimport type { AnyCircuitElement } from \"circuit-json\"\nimport { generateFootprintTsx } from \"../generate-footprint-tsx\"\n\nexport type GeneratedComponentType =\n  | \"chip\"\n  | \"diode\"\n  | \"led\"\n  | \"pushbutton\"\n  | \"switch\"\n\ninterface Params {\n  pinLabels: ChipProps[\"pinLabels\"]\n  componentName: string\n  objUrl?: string\n  stepUrl?: string\n  circuitJson: AnyCircuitElement[]\n  supplierPartNumbers: SupplierPartNumbers\n  manufacturerPartNumber: string\n  componentType?: GeneratedComponentType\n  symbolTsx?: string\n}\n\nconst getPinLabelValues = (labels: string | readonly string[]): string[] => {\n  if (typeof labels === \"string\") return [labels]\n  return [...labels]\n}\n\nconst stripEasyEdaPolarityHintDecoration = (label: string): string =>\n  label.toLowerCase().replace(/[^a-z0-9+-]/g, \"\")\n\nconst getPinKeySortValue = (pinKey: string): number => {\n  const match = /^pin(\\d+)$/i.exec(pinKey)\n  return match ? Number(match[1]) : Number.MAX_SAFE_INTEGER\n}\n\nconst getPolarizedPinMetadata = (\n  pinLabels: ChipProps[\"pinLabels\"],\n):\n  | {\n      portHintsMap: Record<string, string[]>\n      pinLabels: Record<string, string[]>\n    }\n  | undefined => {\n  const labelsByPin = Object.entries(pinLabels ?? {}).map(([pin, labels]) => ({\n    pin,\n    labels: getPinLabelValues(labels).map(stripEasyEdaPolarityHintDecoration),\n  }))\n\n  const anodePin = labelsByPin.find(({ labels }) =>\n    labels.some((label) => [\"a\", \"anode\", \"pos\", \"+\"].includes(label)),\n  )?.pin\n  const cathodePin = labelsByPin.find(({ labels }) =>\n    labels.some((label) => [\"c\", \"k\", \"cathode\", \"neg\", \"-\"].includes(label)),\n  )?.pin\n\n  if (!anodePin || !cathodePin) return undefined\n\n  const polarizedPinEntries = (\n    [\n      [anodePin, [\"anode\", \"pos\"]],\n      [cathodePin, [\"cathode\", \"neg\"]],\n    ] satisfies Array<[string, string[]]>\n  ).sort(\n    ([pinA], [pinB]) => getPinKeySortValue(pinA) - getPinKeySortValue(pinB),\n  )\n\n  return {\n    portHintsMap: Object.fromEntries(\n      polarizedPinEntries.map(([pin, labels]) => [pin, [pin, ...labels]]),\n    ),\n    pinLabels: Object.fromEntries(polarizedPinEntries),\n  }\n}\n\nexport const generateTypescriptComponent = ({\n  pinLabels,\n  componentName,\n  objUrl,\n  stepUrl,\n  circuitJson,\n  supplierPartNumbers,\n  manufacturerPartNumber,\n  componentType = \"chip\",\n  symbolTsx,\n}: Params) => {\n  // Ensure pinLabels is defined\n  const safePinLabels = pinLabels ?? {}\n  const polarizedPinMetadata = getPolarizedPinMetadata(safePinLabels)\n  const polarizedPortHintsMap = polarizedPinMetadata?.portHintsMap\n  const polarizedPinLabels = polarizedPinMetadata?.pinLabels\n  const cadComponent = circuitJson.find((item) => item.type === \"cad_component\")\n  const footprintTsx = generateFootprintTsx(\n    circuitJson,\n    componentType === \"diode\" || componentType === \"led\"\n      ? { portHintsMap: polarizedPortHintsMap }\n      : undefined,\n  )\n\n  // Simplify pin labels to include only the second element\n  const simplifiedPinLabels = Object.fromEntries(\n    Object.entries(safePinLabels).map(([pin, labels]) => {\n      // Ensure labels is an array and has a second element\n      if (Array.isArray(labels) && labels.length > 1) {\n        return [pin, [labels[1]]]\n      }\n      return [pin, labels] // Fallback to original if not an array or missing second element\n    }),\n  )\n\n  const pinLabelsString = Object.entries(simplifiedPinLabels)\n    .map(([pin, labels]) => `  ${pin}: ${JSON.stringify(labels)}`)\n    .join(\",\\n\")\n  const polarizedPinLabelsString = Object.entries(polarizedPinLabels ?? {})\n    .map(([pin, labels]) => `  ${pin}: ${JSON.stringify(labels)}`)\n    .join(\",\\n\")\n  const polarizedPinLabelsBlock = polarizedPinLabels\n    ? `const pinLabels = {\n${polarizedPinLabelsString}\n} as const\n\n`\n    : \"\"\n  const polarizedPinLabelsProp = polarizedPinLabels\n    ? `      pinLabels={pinLabels}\n`\n    : \"\"\n  const symbolProp = symbolTsx\n    ? `      symbol={\n${symbolTsx\n  .split(\"\\n\")\n  .map((line) => `        ${line}`)\n  .join(\"\\n\")}\n      }\n`\n    : \"\"\n\n  const cadModelLines = [\n    objUrl ? `objUrl: \"${objUrl}\",` : \"\",\n    stepUrl ? `stepUrl: \"${stepUrl}\",` : \"\",\n    `pcbRotationOffset: ${cadComponent?.rotation?.z ?? 0},`,\n    `modelOriginPosition: { x: ${cadComponent?.model_origin_position?.x ?? 0}, y: ${cadComponent?.model_origin_position?.y ?? 0}, z: ${cadComponent?.model_origin_position?.z ?? 0} },`,\n  ]\n    .filter(Boolean)\n    .map((line) => `        ${line}`)\n    .join(\"\\n\")\n\n  if (componentType === \"diode\") {\n    return `\nimport type { DiodeProps } from \"@tscircuit/props\"\n\n${polarizedPinLabelsBlock}\\\nexport const ${componentName} = (props: DiodeProps) => {\n  const { name = \"D1\", ...restProps } = props\n\n  return (\n    <diode\n      name={name}\n${polarizedPinLabelsProp}\\\n${symbolProp}\\\n      supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \"  \")}}\n      manufacturerPartNumber=\"${manufacturerPartNumber}\"\n      footprint={${footprintTsx}}\n      ${\n        objUrl || stepUrl\n          ? `cadModel={{\n${cadModelLines}\n      }}`\n          : \"\"\n      }\n      {...restProps}\n    />\n  )\n}\n`.trim()\n  }\n\n  if (componentType === \"led\") {\n    return `\nimport type { LedProps } from \"@tscircuit/props\"\n\n${polarizedPinLabelsBlock}\\\nexport const ${componentName} = (props: LedProps) => {\n  const { name = \"LED1\", ...restProps } = props\n\n  return (\n    <led\n      name={name}\n${polarizedPinLabelsProp}\\\n${symbolProp}\\\n      supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \"  \")}}\n      manufacturerPartNumber=\"${manufacturerPartNumber}\"\n      footprint={${footprintTsx}}\n      ${\n        objUrl || stepUrl\n          ? `cadModel={{\n${cadModelLines}\n      }}`\n          : \"\"\n      }\n      {...restProps}\n    />\n  )\n}\n`.trim()\n  }\n\n  if (componentType === \"pushbutton\") {\n    return `\nimport type { PushButtonProps } from \"@tscircuit/props\"\n\nconst pinLabels = {\n${pinLabelsString}\n} as const\n\nexport const ${componentName} = (props: PushButtonProps<typeof pinLabels>) => {\n  const { name = \"SW1\", ...restProps } = props\n\n  return (\n    <pushbutton\n      name={name}\n      pinLabels={pinLabels}\n${symbolProp}\\\n      supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \"  \")}}\n      manufacturerPartNumber=\"${manufacturerPartNumber}\"\n      footprint={${footprintTsx}}\n      ${\n        objUrl || stepUrl\n          ? `cadModel={{\n${cadModelLines}\n      }}`\n          : \"\"\n      }\n      {...restProps}\n    />\n  )\n}\n`.trim()\n  }\n\n  if (componentType === \"switch\") {\n    return `\nimport type { SwitchProps } from \"@tscircuit/props\"\n\nconst pinLabels = {\n${pinLabelsString}\n} as const\n\nexport const ${componentName} = (props: SwitchProps) => {\n  const { name = \"SW1\", ...restProps } = props\n\n  return (\n    <switch\n      name={name}\n      pinLabels={pinLabels}\n${symbolProp}\\\n      supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \"  \")}}\n      manufacturerPartNumber=\"${manufacturerPartNumber}\"\n      footprint={${footprintTsx}}\n      ${\n        objUrl || stepUrl\n          ? `cadModel={{\n${cadModelLines}\n      }}`\n          : \"\"\n      }\n      {...restProps}\n    />\n  )\n}\n`.trim()\n  }\n\n  return `\nimport type { ChipProps } from \"@tscircuit/props\"\n\nconst pinLabels = {\n${pinLabelsString}\n} as const\n\nexport const ${componentName} = (props: ChipProps<typeof pinLabels>) => {\n  return (\n    <chip\n      pinLabels={pinLabels}\n${symbolProp}\\\n      supplierPartNumbers={${JSON.stringify(supplierPartNumbers, null, \"  \")}}\n      manufacturerPartNumber=\"${manufacturerPartNumber}\"\n      footprint={${footprintTsx}}\n      ${\n        objUrl || stepUrl\n          ? `cadModel={{\n${cadModelLines}\n      }}`\n          : \"\"\n      }\n      {...props}\n    />\n  )\n}\n`.trim()\n}\n","export const categoryValueContainsDiode = (value: unknown): boolean => {\n  if (typeof value === \"string\") {\n    return /(^|[^a-z])diodes?([^a-z]|$)/i.test(value)\n  }\n\n  if (Array.isArray(value)) {\n    return value.some(categoryValueContainsDiode)\n  }\n\n  if (value && typeof value === \"object\") {\n    return Object.values(value).some(categoryValueContainsDiode)\n  }\n\n  return false\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport { categoryValueContainsDiode } from \"./category-value-contains-diode\"\n\nexport const isDiodeCategoryComponent = (\n  betterEasy: BetterEasyEdaJson,\n): boolean => {\n  const cPara = betterEasy.dataStr.head.c_para\n  return [\n    betterEasy.tags,\n    cPara.category,\n    cPara.Category,\n    cPara[\"LCSC Category\"],\n    cPara[\"JLCPCB Category\"],\n    betterEasy.category,\n  ].some(categoryValueContainsDiode)\n}\n","export const categoryValueContainsLed = (value: unknown): boolean => {\n  if (typeof value === \"string\") {\n    return (\n      /(^|[^a-z])leds?([^a-z]|$)/i.test(value) ||\n      /light[-\\s]?emitting\\s+diodes?/i.test(value)\n    )\n  }\n\n  if (Array.isArray(value)) {\n    return value.some(categoryValueContainsLed)\n  }\n\n  if (value && typeof value === \"object\") {\n    return Object.values(value).some(categoryValueContainsLed)\n  }\n\n  return false\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport { categoryValueContainsLed } from \"./category-value-contains-led\"\n\nexport const isLedCategoryComponent = (\n  betterEasy: BetterEasyEdaJson,\n): boolean => {\n  const cPara = betterEasy.dataStr.head.c_para\n  return [\n    betterEasy.tags,\n    cPara.category,\n    cPara.Category,\n    cPara[\"LCSC Category\"],\n    cPara[\"JLCPCB Category\"],\n    betterEasy.category,\n  ].some(categoryValueContainsLed)\n}\n","export const categoryValueContainsPushbutton = (value: unknown): boolean => {\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase()\n\n    if (\n      /analog\\s+switch/.test(normalized) ||\n      /multiplex/.test(normalized) ||\n      /switching\\s+diodes?/.test(normalized) ||\n      /\\bics?\\b/.test(normalized)\n    ) {\n      return false\n    }\n\n    return (\n      /push\\s*buttons?/.test(normalized) ||\n      /pushbuttons?/.test(normalized) ||\n      /tact(?:ile)?\\s+switch(?:es)?/.test(normalized) ||\n      /keyboard\\s+(?:switch(?:es)?|shaft)/.test(normalized) ||\n      /mechanical\\s+keyboard\\s+shaft/.test(normalized)\n    )\n  }\n\n  if (Array.isArray(value)) {\n    return value.some(categoryValueContainsPushbutton)\n  }\n\n  if (value && typeof value === \"object\") {\n    return Object.values(value).some(categoryValueContainsPushbutton)\n  }\n\n  return false\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport { categoryValueContainsPushbutton } from \"./category-value-contains-pushbutton\"\n\nexport const isPushbuttonCategoryComponent = (\n  betterEasy: BetterEasyEdaJson,\n): boolean => {\n  const cPara = betterEasy.dataStr.head.c_para\n  return [\n    betterEasy.tags,\n    cPara.category,\n    cPara.Category,\n    cPara[\"LCSC Category\"],\n    cPara[\"JLCPCB Category\"],\n    betterEasy.category,\n  ].some(categoryValueContainsPushbutton)\n}\n","export const categoryValueContainsSwitch = (value: unknown): boolean => {\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase()\n\n    if (\n      /analog\\s+switch/.test(normalized) ||\n      /multiplex/.test(normalized) ||\n      /switching\\s+diodes?/.test(normalized) ||\n      /\\bics?\\b/.test(normalized)\n    ) {\n      return false\n    }\n\n    return (\n      /(?:slide|toggle|dip|key|micro|limit)\\s+switch(?:es)?/.test(normalized) ||\n      /(^|[^a-z])switch(?:es)?([^a-z]|$)/.test(normalized)\n    )\n  }\n\n  if (Array.isArray(value)) {\n    return value.some(categoryValueContainsSwitch)\n  }\n\n  if (value && typeof value === \"object\") {\n    return Object.values(value).some(categoryValueContainsSwitch)\n  }\n\n  return false\n}\n","import type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport { categoryValueContainsSwitch } from \"./category-value-contains-switch\"\n\nexport const isSwitchCategoryComponent = (\n  betterEasy: BetterEasyEdaJson,\n): boolean => {\n  const cPara = betterEasy.dataStr.head.c_para\n  return [\n    betterEasy.tags,\n    cPara.category,\n    cPara.Category,\n    cPara[\"LCSC Category\"],\n    cPara[\"JLCPCB Category\"],\n    betterEasy.category,\n  ].some(categoryValueContainsSwitch)\n}\n","import type { AnyCircuitElement } from \"circuit-json\"\nimport type { BetterEasyEdaJson } from \"lib/schemas/easy-eda-json-schema\"\nimport type { SingleLetterShape } from \"lib/schemas/single-letter-shape-schema\"\nimport { mil10ToMm } from \"lib/utils/easyeda-unit-to-mm\"\nimport { normalizeSymbolName } from \"lib/utils/normalize-symbol-name\"\n\nconst round = (value: number): number => Number(value.toFixed(6))\nconst toMillimeters = (value: number): number => round(mil10ToMm(value))\n\nconst getPointTransformer =\n  (origin: { x: number; y: number }) => (point: { x: number; y: number }) => ({\n    x: toMillimeters(point.x - origin.x),\n    y: toMillimeters(origin.y - point.y),\n  })\n\nconst formatNumber = (value: number): string => String(round(value))\n\nconst SVG_PATH_COMMAND_PARAMETER_COUNTS: Record<string, number> = {\n  A: 7,\n  C: 6,\n  H: 1,\n  L: 2,\n  M: 2,\n  Q: 4,\n  S: 4,\n  T: 2,\n  V: 1,\n  Z: 0,\n}\n\n/**\n * Convert an EasyEDA SVG path from its global, Y-down 10 mil coordinate space\n * into the local, Y-up millimeter coordinate space used by <symbol />.\n */\nconst transformSvgPath = (\n  pathData: string,\n  origin: { x: number; y: number },\n): string => {\n  const tokens =\n    pathData.match(\n      /[AaCcHhLlMmQqSsTtVvZz]|[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g,\n    ) ?? []\n  const output: string[] = []\n  let command = \"\"\n  let tokenIndex = 0\n  let currentX = 0\n  let currentY = 0\n  let subpathStartX = 0\n  let subpathStartY = 0\n\n  const transformPoint = getPointTransformer(origin)\n  const getOriginalPoint = (x: number, y: number, isRelative: boolean) => ({\n    x: isRelative ? currentX + x : x,\n    y: isRelative ? currentY + y : y,\n  })\n\n  while (tokenIndex < tokens.length) {\n    if (/^[A-Za-z]$/.test(tokens[tokenIndex])) {\n      command = tokens[tokenIndex]\n      tokenIndex += 1\n    }\n\n    if (!command) break\n\n    const upperCommand = command.toUpperCase()\n    const parameterCount = SVG_PATH_COMMAND_PARAMETER_COUNTS[upperCommand]\n    if (parameterCount === undefined) break\n\n    if (upperCommand === \"Z\") {\n      output.push(\"Z\")\n      currentX = subpathStartX\n      currentY = subpathStartY\n      command = \"\"\n      continue\n    }\n\n    if (tokenIndex + parameterCount > tokens.length) break\n    if (/^[A-Za-z]$/.test(tokens[tokenIndex])) continue\n\n    const values = tokens\n      .slice(tokenIndex, tokenIndex + parameterCount)\n      .map(Number)\n    tokenIndex += parameterCount\n    const isRelative = command === command.toLowerCase()\n\n    if (upperCommand === \"H\" || upperCommand === \"V\") {\n      const point = getOriginalPoint(\n        upperCommand === \"H\" ? values[0] : isRelative ? 0 : currentX,\n        upperCommand === \"V\" ? values[0] : isRelative ? 0 : currentY,\n        isRelative,\n      )\n      const transformed = transformPoint(point)\n      output.push(\n        `L ${formatNumber(transformed.x)} ${formatNumber(transformed.y)}`,\n      )\n      currentX = point.x\n      currentY = point.y\n      continue\n    }\n\n    if ([\"M\", \"L\", \"T\"].includes(upperCommand)) {\n      const point = getOriginalPoint(values[0], values[1], isRelative)\n      const transformed = transformPoint(point)\n      output.push(\n        `${upperCommand} ${formatNumber(transformed.x)} ${formatNumber(transformed.y)}`,\n      )\n      currentX = point.x\n      currentY = point.y\n      if (upperCommand === \"M\") {\n        subpathStartX = point.x\n        subpathStartY = point.y\n        command = isRelative ? \"l\" : \"L\"\n      }\n      continue\n    }\n\n    if ([\"C\", \"S\", \"Q\"].includes(upperCommand)) {\n      const transformedValues: number[] = []\n      for (let valueIndex = 0; valueIndex < values.length; valueIndex += 2) {\n        const point = getOriginalPoint(\n          values[valueIndex],\n          values[valueIndex + 1],\n          isRelative,\n        )\n        const transformed = transformPoint(point)\n        transformedValues.push(transformed.x, transformed.y)\n      }\n      output.push(\n        `${upperCommand} ${transformedValues.map(formatNumber).join(\" \")}`,\n      )\n      currentX = isRelative\n        ? currentX + values[values.length - 2]\n        : values[values.length - 2]\n      currentY = isRelative\n        ? currentY + values[values.length - 1]\n        : values[values.length - 1]\n      continue\n    }\n\n    if (upperCommand === \"A\") {\n      const endpoint = getOriginalPoint(values[5], values[6], isRelative)\n      const transformedEndpoint = transformPoint(endpoint)\n      output.push(\n        [\n          \"A\",\n          formatNumber(toMillimeters(Math.abs(values[0]))),\n          formatNumber(toMillimeters(Math.abs(values[1]))),\n          formatNumber(-values[2]),\n          String(values[3]),\n          String(values[4] === 0 ? 1 : 0),\n          formatNumber(transformedEndpoint.x),\n          formatNumber(transformedEndpoint.y),\n        ].join(\" \"),\n      )\n      currentX = endpoint.x\n      currentY = endpoint.y\n    }\n  }\n\n  return output.join(\" \")\n}\n\nconst getPinDirection = (\n  rotation: number,\n): \"up\" | \"down\" | \"left\" | \"right\" => {\n  const normalizedRotation = ((rotation % 360) + 360) % 360\n  if (normalizedRotation === 90) return \"up\"\n  if (normalizedRotation === 180) return \"left\"\n  if (normalizedRotation === 270) return \"down\"\n  return \"right\"\n}\n\nconst getPinStemLength = (path: string): number | undefined => {\n  const segment = path.match(/[hHvV]\\s*(-?(?:\\d*\\.\\d+|\\d+\\.?))/)\n  if (!segment) return undefined\n  return toMillimeters(Math.abs(Number(segment[1])))\n}\n\nconst getTextFontSizeMm = (fontSize: string): number => {\n  const numericFontSize = Number.parseFloat(fontSize)\n  if (!Number.isFinite(numericFontSize)) return 1\n  if (fontSize.toLowerCase().endsWith(\"pt\")) {\n    return round((numericFontSize * 25.4) / 72)\n  }\n  return toMillimeters(numericFontSize)\n}\n\nconst getTextAnchor = (\n  alignment: \"L\" | \"C\" | \"R\",\n): \"left\" | \"center\" | \"right\" => {\n  if (alignment === \"L\") return \"left\"\n  if (alignment === \"R\") return \"right\"\n  return \"center\"\n}\n\ninterface PortMetadata {\n  name: string\n  pinNumber?: number\n  aliases: string[]\n}\n\nconst getPortMetadataByShapeId = (\n  easyEdaJson: BetterEasyEdaJson,\n  circuitJson: AnyCircuitElement[],\n): Map<string, PortMetadata> => {\n  const pins = easyEdaJson.dataStr.shape.filter(\n    (shape): shape is Extract<SingleLetterShape, { type: \"PIN\" }> =>\n      shape.type === \"PIN\",\n  )\n  const pads = easyEdaJson.packageDetail.dataStr.shape.filter(\n    (shape) => shape.type === \"PAD\",\n  )\n  const sourcePorts = circuitJson.filter(\n    (element) => element.type === \"source_port\",\n  )\n  const sourcePortNamesByPadNumber = new Map<string, string[]>()\n\n  pads.forEach((pad, padIndex) => {\n    const sourcePort = sourcePorts.find(\n      (port) => port.source_port_id === `source_port_${padIndex + 1}`,\n    )\n    if (!sourcePort) return\n    const padNumber = String(pad.number)\n    sourcePortNamesByPadNumber.set(padNumber, [\n      ...(sourcePortNamesByPadNumber.get(padNumber) ?? []),\n      sourcePort.name,\n    ])\n  })\n\n  const usedPortNamesByPadNumber = new Map<string, number>()\n  const usedPortNames = new Set<string>()\n  const metadataByShapeId = new Map<string, PortMetadata>()\n\n  pins.forEach((pin, pinIndex) => {\n    const pinNumberKey = String(pin.pinNumber)\n    const matchingPortNames = sourcePortNamesByPadNumber.get(pinNumberKey) ?? []\n    const matchingPortIndex = usedPortNamesByPadNumber.get(pinNumberKey) ?? 0\n    let portName: string | undefined = matchingPortNames[matchingPortIndex]\n    usedPortNamesByPadNumber.set(pinNumberKey, matchingPortIndex + 1)\n\n    if (!portName && pin.label) {\n      const normalizedLabel = normalizeSymbolName(pin.label)\n      portName = sourcePorts.find(\n        (port) =>\n          !usedPortNames.has(port.name) &&\n          port.port_hints?.includes(normalizedLabel),\n      )?.name\n    }\n\n    const numericPinNumber = Number(pin.pinNumber)\n    if (!portName && Number.isInteger(numericPinNumber)) {\n      const numericPortName = `pin${numericPinNumber}`\n      if (sourcePorts.some((port) => port.name === numericPortName)) {\n        portName = numericPortName\n      }\n    }\n\n    portName ??= sourcePorts[pinIndex]?.name ?? `pin${pinIndex + 1}`\n    usedPortNames.add(portName)\n    const sourcePort = sourcePorts.find((port) => port.name === portName)\n\n    metadataByShapeId.set(pin.id, {\n      name: portName,\n      pinNumber: sourcePort?.pin_number,\n      aliases: [\n        ...(sourcePort?.port_hints ?? []),\n        ...(pin.label ? [normalizeSymbolName(pin.label)] : []),\n      ].filter(\n        (alias, index, aliases) =>\n          alias !== portName && aliases.indexOf(alias) === index,\n      ),\n    })\n  })\n\n  return metadataByShapeId\n}\n\nconst generateShapeTsx = ({\n  shape,\n  origin,\n  portMetadata,\n}: {\n  shape: SingleLetterShape\n  origin: { x: number; y: number }\n  portMetadata?: PortMetadata\n}): string | undefined => {\n  const transformPoint = getPointTransformer(origin)\n\n  if (shape.type === \"RECTANGLE\") {\n    const center = transformPoint({\n      x: shape.position.x + shape.width / 2,\n      y: shape.position.y + shape.height / 2,\n    })\n    return `<schematicrect schX={${center.x}} schY={${center.y}} width={${toMillimeters(shape.width)}} height={${toMillimeters(shape.height)}} strokeWidth={${toMillimeters(shape.lineWidth)}} color=${JSON.stringify(shape.color)}${shape.fillColor && shape.fillColor !== \"none\" ? ` isFilled fillColor=${JSON.stringify(shape.fillColor)}` : \"\"} />`\n  }\n\n  if (shape.type === \"ELLIPSE\") {\n    const center = transformPoint(shape.center)\n    return `<schematiccircle center={{ x: ${center.x}, y: ${center.y} }} radius={${toMillimeters(Math.max(shape.radiusX, shape.radiusY))}} strokeWidth={${toMillimeters(shape.lineWidth)}} color=${JSON.stringify(shape.color)}${shape.fillColor && shape.fillColor !== \"none\" ? ` isFilled fillColor=${JSON.stringify(shape.fillColor)}` : \"\"} />`\n  }\n\n  if (shape.type === \"POLYLINE\" || shape.type === \"POLYGON\") {\n    const isPolygon = shape.type === \"POLYGON\"\n    const points = shape.points.map(transformPoint)\n    if (isPolygon && points.length > 0) points.push(points[0])\n    return `<schematicpath points={${JSON.stringify(points)}} strokeWidth={${toMillimeters(shape.lineWidth)}} strokeColor=${JSON.stringify(isPolygon ? shape.lineColor : shape.color)}${isPolygon && shape.fillColor !== \"none\" ? ` isFilled fillColor=${JSON.stringify(shape.fillColor)}` : \"\"} />`\n  }\n\n  if (shape.type === \"PATH\") {\n    const transformedPath = transformSvgPath(shape.pathData, origin)\n    if (!transformedPath) return undefined\n    return `<schematicpath svgPath=${JSON.stringify(transformedPath)} strokeWidth={${shape.strokeWidth}} strokeColor=${JSON.stringify(shape.strokeColor)}${shape.fillColor !== \"none\" ? ` isFilled fillColor=${JSON.stringify(shape.fillColor)}` : \"\"} />`\n  }\n\n  if (shape.type === \"ARC\") {\n    const transformedPath = transformSvgPath(shape.pathData, origin)\n    if (!transformedPath) return undefined\n    return `<schematicpath svgPath=${JSON.stringify(transformedPath)} strokeWidth={${toMillimeters(shape.lineWidth)}} strokeColor=${JSON.stringify(shape.color)} />`\n  }\n\n  if (shape.type === \"TEXT\") {\n    if (shape.visibility !== \"1\") return undefined\n    const position = transformPoint({ x: shape.x, y: shape.y })\n    return `<schematictext schX={${position.x}} schY={${position.y}} text=${JSON.stringify(shape.content)} fontSize={${getTextFontSizeMm(shape.fontSize)}} anchor=${JSON.stringify(getTextAnchor(shape.alignment))} color=${JSON.stringify(shape.fontColor)} schRotation={${round(-shape.rotation)}} />`\n  }\n\n  if (shape.type === \"PIN\" && portMetadata) {\n    const position = transformPoint({ x: shape.x, y: shape.y })\n    const pinNumberProp =\n      portMetadata.pinNumber === undefined\n        ? \"\"\n        : ` pinNumber={${portMetadata.pinNumber}}`\n    const aliasesProp =\n      portMetadata.aliases.length === 0\n        ? \"\"\n        : ` aliases={${JSON.stringify(portMetadata.aliases)}}`\n    const stemLength = getPinStemLength(shape.path)\n    const stemLengthProp =\n      stemLength === undefined ? \"\" : ` schStemLength={${stemLength}}`\n    return `<port name=${JSON.stringify(portMetadata.name)}${pinNumberProp}${aliasesProp} direction=${JSON.stringify(getPinDirection(shape.rotation))} schX={${position.x}} schY={${position.y}}${stemLengthProp} />`\n  }\n\n  return undefined\n}\n\nexport const generateSymbolTsx = (\n  easyEdaJson: BetterEasyEdaJson,\n  circuitJson: AnyCircuitElement[],\n): string | undefined => {\n  const shapes = easyEdaJson.dataStr.shape\n  if (shapes.length === 0) return undefined\n\n  const headOrigin = {\n    x: easyEdaJson.dataStr.head.x,\n    y: easyEdaJson.dataStr.head.y,\n  }\n  const bounds = easyEdaJson.dataStr.BBox\n  const isHeadOriginInsideBounds =\n    headOrigin.x >= bounds.x &&\n    headOrigin.x <= bounds.x + bounds.width &&\n    headOrigin.y >= bounds.y &&\n    headOrigin.y <= bounds.y + bounds.height\n  const origin = isHeadOriginInsideBounds\n    ? headOrigin\n    : {\n        x: bounds.x + bounds.width / 2,\n        y: bounds.y + bounds.height / 2,\n      }\n  const portMetadataByShapeId = getPortMetadataByShapeId(\n    easyEdaJson,\n    circuitJson,\n  )\n  const shapeTsx = shapes\n    .map((shape) =>\n      generateShapeTsx({\n        shape,\n        origin,\n        portMetadata:\n          shape.type === \"PIN\"\n            ? portMetadataByShapeId.get(shape.id)\n            : undefined,\n      }),\n    )\n    .filter((tsx): tsx is string => Boolean(tsx))\n\n  if (shapeTsx.length === 0) return undefined\n\n  return `<symbol>\n${shapeTsx.map((tsx) => `  ${tsx}`).join(\"\\n\")}\n</symbol>`\n}\n\n/**\n * EasyEDA commonly represents chips as a rectangle with ports, plus optional\n * text and pin-one dots. tscircuit already generates that box representation\n * from a chip's pin labels, so it does not need a custom symbol prop.\n */\nexport const hasNonBoxSchematicSymbol = (\n  easyEdaJson: BetterEasyEdaJson,\n): boolean => {\n  const drawableShapes = easyEdaJson.dataStr.shape.filter(\n    (shape) => shape.type !== \"PIN\" && shape.type !== \"TEXT\",\n  )\n  if (drawableShapes.length === 0) return false\n\n  const rectangles = drawableShapes.filter(\n    (shape) => shape.type === \"RECTANGLE\",\n  )\n  const onlyBoxPrimitives = drawableShapes.every(\n    (shape) =>\n      shape.type === \"RECTANGLE\" ||\n      (shape.type === \"ELLIPSE\" && shape.radiusX <= 2 && shape.radiusY <= 2),\n  )\n\n  return rectangles.length !== 1 || !onlyBoxPrimitives\n}\n","import { su } from \"@tscircuit/circuit-json-util\"\nimport { convertEasyEdaJsonToCircuitJson } from \"lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport {\n  type BetterEasyEdaJson,\n  EasyEdaJsonSchema,\n} from \"lib/schemas/easy-eda-json-schema\"\nimport { normalizeManufacturerPartNumber } from \"lib/utils/normalize-manufacturer-part-number\"\nimport { getEasyEdaCadModelPlacement } from \"../get-easyeda-cad-model-placement\"\nimport { generateTypescriptComponent } from \"./generate-typescript-component\"\nimport type { GeneratedComponentType } from \"./generate-typescript-component\"\nimport { isDiodeCategoryComponent } from \"./is-diode-category-component\"\nimport { isLedCategoryComponent } from \"./is-led-category-component\"\nimport { isPushbuttonCategoryComponent } from \"./is-pushbutton-category-component\"\nimport { isSwitchCategoryComponent } from \"./is-switch-category-component\"\nimport {\n  generateSymbolTsx,\n  hasNonBoxSchematicSymbol,\n} from \"./generate-symbol-tsx\"\n\nconst getGeneratedComponentType = (\n  betterEasy: BetterEasyEdaJson,\n): GeneratedComponentType => {\n  if (isLedCategoryComponent(betterEasy)) return \"led\"\n  if (isDiodeCategoryComponent(betterEasy)) return \"diode\"\n  if (isPushbuttonCategoryComponent(betterEasy)) return \"pushbutton\"\n  if (isSwitchCategoryComponent(betterEasy)) return \"switch\"\n  return \"chip\"\n}\n\nexport const convertRawEasyToTsx = async ({ rawEasy }: { rawEasy: any }) => {\n  const betterEasy = EasyEdaJsonSchema.parse(rawEasy)\n  const result = await convertBetterEasyToTsx({\n    betterEasy,\n  })\n  return result\n}\n\nexport const convertBetterEasyToTsx = async ({\n  betterEasy,\n}: {\n  betterEasy: BetterEasyEdaJson\n}): Promise<string> => {\n  const cadPlacement = await getEasyEdaCadModelPlacement(betterEasy)\n  const circuitJson = convertEasyEdaJsonToCircuitJson(betterEasy, {\n    useModelCdn: true,\n    shouldRecenter: true,\n    cadPositionXMm: cadPlacement?.positionXMm,\n    cadPositionYMm: cadPlacement?.positionYMm,\n    cadPositionZMm: cadPlacement?.positionZMm,\n    cadModelBounds: cadPlacement?.bounds,\n    showDesignator: true,\n  })\n  const [cadComponent] = su(circuitJson).cad_component.list()\n  if (cadComponent) {\n    cadComponent.position.x = 0\n    cadComponent.position.y = 0\n  }\n  const rawPn = betterEasy.dataStr.head.c_para[\"Manufacturer Part\"]\n  const pn = rawPn ? normalizeManufacturerPartNumber(rawPn) : \"unknown\"\n  const sourcePorts = su(circuitJson).source_port.list()\n\n  const pinLabels: Record<string, string[]> = {}\n  const sortedPorts = sourcePorts.sort((a, b) => {\n    const aNum = Number.parseInt(a.name.replace(\"pin\", \"\"))\n    const bNum = Number.parseInt(b.name.replace(\"pin\", \"\"))\n    return aNum - bNum\n  })\n  for (const sourcePort of sortedPorts) {\n    pinLabels[sourcePort.name] = [\n      sourcePort.name,\n      ...(sourcePort.port_hints ?? []),\n    ]\n  }\n\n  let modelObjUrl: string | undefined\n  let modelStepUrl: string | undefined\n  if (cadPlacement?.modelObjUrl) {\n    modelObjUrl = cadPlacement.modelObjUrl\n    modelStepUrl = cadPlacement.modelStepUrl\n  } else if (cadComponent?.model_obj_url) {\n    const isValidUrl = await checkModelObjUrlValidity(\n      cadComponent.model_obj_url,\n    )\n    if (isValidUrl) {\n      modelObjUrl = cadComponent.model_obj_url\n      modelStepUrl = cadComponent.model_step_url\n    }\n  }\n\n  const supplierPartNumbers: Record<string, string[]> = {\n    jlcpcb: [betterEasy.lcsc.number],\n  }\n  const componentType = getGeneratedComponentType(betterEasy)\n  const symbolTsx =\n    componentType === \"chip\" && hasNonBoxSchematicSymbol(betterEasy)\n      ? generateSymbolTsx(betterEasy, circuitJson)\n      : undefined\n\n  return generateTypescriptComponent({\n    componentName: pn,\n    manufacturerPartNumber: pn,\n    pinLabels,\n\n    objUrl: modelObjUrl,\n    stepUrl: modelStepUrl,\n    circuitJson,\n    supplierPartNumbers,\n    componentType,\n    symbolTsx,\n  })\n}\n\nconst checkModelObjUrlValidity = async (url: string): Promise<boolean> => {\n  try {\n    const response = await fetch(url, { method: \"HEAD\" })\n    return response.status === 200\n  } catch (error) {\n    console.error(`Error checking model object URL ${url}:`, error)\n    return false\n  }\n}\n","import { fetchEasyEDAComponent } from \"lib/websafe/fetch-easyeda-json\"\nimport { convertEasyEdaJsonToCircuitJson } from \"lib/convert-easyeda-json-to-tscircuit-soup-json\"\nimport { EasyEdaJsonSchema } from \"lib/schemas/easy-eda-json-schema\"\nimport { convertRawEasyToTsx } from \"lib/websafe/convert-to-typescript-component\"\nimport { normalizeManufacturerPartNumber } from \"lib/utils/normalize-manufacturer-part-number\"\n\nexport const convertEasyEdaJsonToVariousFormats = async ({\n  jlcpcbPartNumberOrFilepath,\n  outputFilename,\n  outputFormat,\n}: {\n  jlcpcbPartNumberOrFilepath: string\n  outputFilename: string\n  outputFormat: string\n}) => {\n  const fs = await import(\"fs/promises\")\n  const path = await import(\"path\")\n\n  let rawEasyEdaJson\n  if (\n    jlcpcbPartNumberOrFilepath.includes(\".\") ||\n    jlcpcbPartNumberOrFilepath.includes(\"/\")\n  ) {\n    rawEasyEdaJson = JSON.parse(\n      await fs.readFile(jlcpcbPartNumberOrFilepath, \"utf-8\"),\n    )\n  } else {\n    rawEasyEdaJson = await fetchEasyEDAComponent(jlcpcbPartNumberOrFilepath)\n  }\n\n  const tsxExtension = \"tsx\"\n  if (outputFormat === \"ts\") outputFormat = tsxExtension\n\n  if (!outputFilename && outputFormat) {\n    let filename = path.basename(jlcpcbPartNumberOrFilepath).split(\".\")[0]\n\n    if (outputFormat === tsxExtension) {\n      const {\n        dataStr: {\n          head: {\n            c_para: { \"Manufacturer Part\": manufacturerPartNumber },\n          },\n        },\n      } = rawEasyEdaJson\n\n      filename = normalizeManufacturerPartNumber(manufacturerPartNumber)\n    }\n\n    outputFilename = `${filename}.${outputFormat}`\n  }\n\n  if (!outputFilename) {\n    console.log(\"specify --output file (-o) or --output-format\")\n    process.exit(1)\n  }\n\n  if (outputFilename.endsWith(\".raweasy.json\")) {\n    await fs.writeFile(outputFilename, JSON.stringify(rawEasyEdaJson, null, 2))\n    console.log(`Saved raw EasyEDA JSON: ${outputFilename}`)\n    return\n  }\n\n  try {\n    const betterEasy = EasyEdaJsonSchema.parse(rawEasyEdaJson)\n    const tscircuitSoup = convertEasyEdaJsonToCircuitJson(betterEasy)\n\n    if (\n      outputFilename.endsWith(\".soup.json\") ||\n      outputFilename.endsWith(\".circuit.json\")\n    ) {\n      await fs.writeFile(outputFilename, JSON.stringify(tscircuitSoup, null, 2))\n      console.log(\n        `[${jlcpcbPartNumberOrFilepath}]  Converted to circuit json: ${outputFilename}`,\n      )\n    } else if (outputFilename.endsWith(\".kicad_mod\")) {\n      // TODO: Implement conversion to KiCad footprint\n      console.log(\"Conversion to KiCad footprint not yet implemented\")\n    } else if (outputFilename.endsWith(\".bettereasy.json\")) {\n      await fs.writeFile(outputFilename, JSON.stringify(betterEasy, null, 2))\n      console.log(\n        `[${jlcpcbPartNumberOrFilepath}]  Saved better EasyEDA JSON: ${outputFilename}`,\n      )\n    } else if (\n      outputFilename.endsWith(\".tsx\") ||\n      outputFilename.endsWith(\".ts\")\n    ) {\n      const tsComp = await convertRawEasyToTsx(rawEasyEdaJson)\n      await fs.writeFile(outputFilename, tsComp)\n      console.log(\n        `[${jlcpcbPartNumberOrFilepath}] Saved TypeScript component: ${outputFilename}`,\n      )\n    } else {\n      console.error(\"Unsupported output format\")\n    }\n  } catch (error: any) {\n    console.error(\"Error:\", error.message)\n    throw error\n  }\n}\n"],"mappings":"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AAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACClB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACDlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACElB,IAAAA,eAAkB;ACFlB,IAAAA,eAAkB;ACElB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACFlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACAlB,IAAAA,eAAkB;ACYlB,IAAAA,eAAkB;ACZlB,IAAAA,eAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB;ACAlB,IAAAA,gBAAkB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sBAAsBA,cAAAA,EAAE,MAAM;EAKrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACN,CAAC;AAKM,IAAM,mBAAmB;AAuBhC,iBAGE,IAAI;AAaN,wBAYE,IAAI;;;AClNC,SAAS,aAAc,QAAQG,QAAO;AAC3C,SAAO,MAAM,QAAQA,MAAK,IACtB;AAAA,IACE,OAAO,IAAIA,OAAM,CAAC,IAAI,OAAO,IAAIA,OAAM,CAAC,IAAI,OAAO;AAAA,IACnD,OAAO,IAAIA,OAAM,CAAC,IAAI,OAAO,IAAIA,OAAM,CAAC,IAAI,OAAO;AAAA,EACrD,IACA;AAAA,IACE,GAAG,OAAO,IAAIA,OAAM,IAAI,OAAO,IAAIA,OAAM,IAAI,OAAO;AAAA,IACpD,GAAG,OAAO,IAAIA,OAAM,IAAI,OAAO,IAAIA,OAAM,IAAI,OAAO;AAAA,EACtD;AACN;;;AChBO,SAAS,YAAa,KAAK;AAChC,SAAO,OAAO,Q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WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;EACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS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","names":["exports","CommanderError","InvalidArgumentError","exports","InvalidArgumentError","Argument","exports","Help","cmd","exports","InvalidArgumentError","Option","str","exports","distance","length","exports","fs","process","Argument","CommanderError","Help","Option","Command","m","option","path","position","exports","Argument","Command","CommanderError","InvalidArgumentError","Help","Option","commander","z","fetch","SI_PREFIXES","import_zod","z","length","percentage","point","m","expected","found","rotation","su","component_type","source_port","joiner","Soup","source_port","point","point","distance","angle","point","point","point","pcb_component","position","rotation","import_zod","import_zod","pairs","rotation","point","size","import_zod","PointSchema","rotation","parsePoints","parseObjBounds","z","fetch","rotation","point","rotation","position","fs","program","fs"]}