component
RC0402FR-071K33L - YAGEO
Public Made by Adomby adom
Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)
← Commit history
Component record for rc0402fr-071k33l: files batch 1
56 files changed
+4615−2
LICENSE+19RC0402FR-071K33L.kicad_sym+23RC0402FR-071K33L.lbr+110RC0402FR-071K33L.step+1049README.md+167−2R_0402_1005Metric_RC0402FR-071K33L.kicad_mod+112altium/RC0402FR-071K33L.PcbLibaltium/RC0402FR-071K33L.SchLibaltium/RC0402FR-071K33L.adom-lbr.json+219docs/figures/figures.json+80docs/figures/mount-p4-land.pngdocs/figures/rc-p2-ordering.pngdocs/figures/rc-p3-marking.pngdocs/figures/rc-p4-dimensions.pngdocs/figures/rc-p5-electrical.pngdocs/figures/rc-p7-packing-power.pngdocs/hero.pngdocs/models/package-reference-step.pngdocs/rc0402fr-071k33l-datasheet.pdfdocs/verify/rc0402fr-071k33l-check.json+51docs/verify/rc0402fr-071k33l-hero-preview.pngdocs/verify/rc0402fr-071k33l-overlay.pngdocs/yageo-chip-resistors-mounting-v10.pdfland-pattern/README.md+32land-pattern/land-check.json+45land-pattern/land-pattern-icon.pngland-pattern/land-pattern.pnglod/high.glblod/high.pnglod/low.glblod/low.pnglod/manifest.json+178lod/medium.glblod/medium.pnglod/super-low.glblod/super-low.pngmodels.json+145package-reference.glbpackage.json+10provenance.json+196provenance/tools/build.py+162provenance/tools/figures.py+28provenance/tools/finish.sh+19provenance/tools/hero.py+341provenance/tools/hero_glyphs.json+1provenance/tools/landcheck.py+116provenance/tools/lod.py+170provenance/tools/ortho.py+123provenance/tools/overlay_chip.py+159provenance/tools/parts.py+85provenance/tools/push.sh+34provenance/tools/rc0402fr-071k33l-overlay-spec.json+39provenance/tools/records.py+419rc0402fr-071k33l-hero.glbrc0402fr-071k33l-hero.overlay.json+163verification.json+320LICENSEadded+19@@ -0,0 +1,19 @@+RC0402FR-071K33L component page++Original Adom content on this page (README text, the KiCad symbol RC0402FR-071K33L.kicad_sym, the+verification drawings, the JSON records and the scripts in provenance/tools/)+is licensed under the Creative Commons Attribution 4.0 International License+(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/++Third-party files keep their own terms and are not relicensed by this page:+- R_0402_1005Metric_RC0402FR-071K33L.kicad_mod and RC0402FR-071K33L.step (and the GLB and LOD files derived from it) are KiCad library+ content, CC-BY-SA 4.0 with the KiCad library exception+ (https://gitlab.com/kicad/libraries/kicad-footprints, https://gitlab.com/kicad/libraries/kicad-packages3D).+- rc0402fr-071k33l-hero.glb adds Adom artwork (CC-BY-4.0) to that KiCad-derived model; the pad+ number glyphs come from the DejaVu Sans Mono outline table published with+ adom/component-hero (DejaVu fonts: Bitstream Vera license).+- altium/ and RC0402FR-071K33L.lbr are conversions of the symbol above and the KiCad+ footprint, so the footprint part keeps the KiCad library terms.+- The cropped page images in docs/figures/ are excerpts of YAGEO documents.+- The PDFs in docs/ are YAGEO documents, copyright of their publishers,+ included unchanged for reference.
RC0402FR-071K33L.kicad_symadded+23@@ -0,0 +1,23 @@+(kicad_symbol_lib (version 20241209) (generator "adom_passive_symbol")+ (symbol "RC0402FR-071K33L" (pin_numbers (hide yes)) (pin_names (offset 0.254) (hide yes)) (exclude_from_sim no) (in_bom yes) (on_board yes)+ (property "Reference" "R" (at 2.54 1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+ (property "Value" "1.33k" (at 2.54 -1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+ (property "Footprint" "R_0402_1005Metric_RC0402FR-071K33L" (at 0 -7.62 0) (effects (font (size 1.27 1.27)) hide))+ (property "Datasheet" "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L" (at 0 -10.16 0) (effects (font (size 1.27 1.27)) hide))+ (property "Description" "Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)" (at 0 -12.7 0) (effects (font (size 1.27 1.27)) hide))+ (property "MPN" "RC0402FR-071K33L" (at 0 -15.24 0) (effects (font (size 1.27 1.27)) hide))+ (property "Manufacturer" "YAGEO" (at 0 -17.78 0) (effects (font (size 1.27 1.27)) hide))+ (property "Mouser" "603-RC0402FR-071K33L" (at 0 -20.32 0) (effects (font (size 1.27 1.27)) hide))+ (property "DigiKey" "311-1.33KLRTR-ND" (at 0 -22.86 0) (effects (font (size 1.27 1.27)) hide))+ (property "LCSC" "C276261" (at 0 -25.4 0) (effects (font (size 1.27 1.27)) hide))+ (property "Adom Wiki" "https://wiki.adom.inc/adom/rc0402fr-071k33l" (at 0 -27.94 0) (effects (font (size 1.27 1.27)) hide))+ (property "ki_keywords" "resistor 0402 RC0402FR-071K33L" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))+ (symbol "RC0402FR-071K33L_0_1"+ (rectangle (start -1.016 -2.54) (end 1.016 2.54) (stroke (width 0.254) (type default)) (fill (type none)))+ )+ (symbol "RC0402FR-071K33L_1_1"+ (pin passive line (at 0 5.08 270) (length 2.54) (name "~" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27)))))+ (pin passive line (at 0 -5.08 90) (length 2.54) (name "~" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27)))))+ )+ )+)
RC0402FR-071K33L.lbradded+110@@ -0,0 +1,110 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+<drawing>+<settings><setting alwaysvectorfont="no"/></settings>+<grid distance="0.1" unitdist="inch" unit="inch" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="inch" altunit="inch"/>+<layers>+<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>+<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>+<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>+<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>+<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>+<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>+<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>+<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>+<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>+<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>+<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>+<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>+<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>+<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>+<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes"/>+<layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes"/>+<layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes"/>+<layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes"/>+<layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes"/>+<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>+<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>+<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>+<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>+<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>+<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>+<layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes"/>+<layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes"/>+<layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes"/>+<layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes"/>+<layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes"/>+<layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes"/>+<layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes"/>+<layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes"/>+</layers>+<library>+<description>Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)</description>+<packages>+<package name="R_0402_1005Metric_RC0402FR-071K33L">+ <description>2 pads, 1.6 x 0.6 mm. Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal</description>+ <smd name="1" x="-0.5100" y="-0.0000" dx="0.5400" dy="0.6400" layer="1" roundness="50"/>+ <smd name="2" x="0.5100" y="-0.0000" dx="0.5400" dy="0.6400" layer="1" roundness="50"/>+ <wire x1="-0.5250" y1="0.2700" x2="0.5250" y2="0.2700" width="0.1000" layer="51"/>+ <wire x1="0.5250" y1="0.2700" x2="0.5250" y2="-0.2700" width="0.1000" layer="51"/>+ <wire x1="0.5250" y1="-0.2700" x2="-0.5250" y2="-0.2700" width="0.1000" layer="51"/>+ <wire x1="-0.5250" y1="-0.2700" x2="-0.5250" y2="0.2700" width="0.1000" layer="51"/>+ <wire x1="-0.1536" y1="0.3800" x2="0.1536" y2="0.3800" width="0.1200" layer="21"/>+ <wire x1="-0.1536" y1="-0.3800" x2="0.1536" y2="-0.3800" width="0.1200" layer="21"/>+ <text x="0" y="0.980" size="1.27" layer="25" align="bottom-center">>NAME</text>+ <text x="0" y="-0.980" size="1.27" layer="27" align="top-center">>VALUE</text>+</package>+</packages>+<symbols>+<symbol name="RC0402FR-071K33L">+ <description>Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)</description>+ <wire x1="-1.016" y1="-2.54" x2="1.016" y2="-2.54" width="0.254" layer="94"/>+ <wire x1="1.016" y1="-2.54" x2="1.016" y2="2.54" width="0.254" layer="94"/>+ <wire x1="1.016" y1="2.54" x2="-1.016" y2="2.54" width="0.254" layer="94"/>+ <wire x1="-1.016" y1="2.54" x2="-1.016" y2="-2.54" width="0.254" layer="94"/>+ <text x="2.5400" y="1.2700" size="1.27" layer="95" align="center">>NAME</text>+ <text x="2.5400" y="-1.2700" size="1.27" layer="96" align="center">>VALUE</text>+ <pin name="1" x="0" y="5.08" length="short" direction="pas" rot="R270"/>+ <pin name="2" x="0" y="-5.08" length="short" direction="pas" rot="R90"/>+</symbol>+</symbols>+<devicesets>+<deviceset name="RC0402FR-071K33L" prefix="R">+ <description>Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)</description>+ <gates>+ <gate name="G$1" symbol="RC0402FR-071K33L" x="0" y="0"/>+ </gates>+ <devices>+ <device name="" package="R_0402_1005Metric_RC0402FR-071K33L">+ <connects>+ <connect gate="G$1" pin="1" pad="1"/>+ <connect gate="G$1" pin="2" pad="2"/>+ </connects>+ <technologies>+ <technology name="">+ <attribute name="MPN" value="RC0402FR-071K33L" constant="no"/>+ <attribute name="MANUFACTURER" value="YAGEO" constant="no"/>+ <attribute name="ADOM_WIKI" value="https://wiki.adom.inc/adom/rc0402fr-071k33l" constant="no"/>+ <attribute name="MOUSER_PN" value="603-RC0402FR-071K33L" constant="no"/>+ <attribute name="DIGIKEY_PN" value="311-1.33KLRTR-ND" constant="no"/>+ <attribute name="LCSC_PN" value="C276261" constant="no"/>+ </technology>+ </technologies>+ </device>+ </devices>+</deviceset>+</devicesets>+</library>+</drawing>+</eagle>
RC0402FR-071K33L.stepadded+1049@@ -0,0 +1,1049 @@+ISO-10303-21;+HEADER;+/* R_0402_1005Metric.step 3D STEP model for use in ECAD systems+ * Copyright (C) 2018, kicad StepUp+ * + * This work is licensed under the [Creative Commons CC-BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode), + * with the following exception:+ * To the extent that the creation of electronic designs that use 'Licensed Material' can be considered to be 'Adapted Material', + * then the copyright holder waives article 3 of the license with respect to these designs and any generated files which use data provided + * as part of the 'Licensed Material'.+ * You are free to use the library data in your own projects without the obligation to share your project files under this or any other license agreement.+ * However, if you wish to redistribute these libraries, or parts thereof (including in modified form) as a collection then the exception above does not apply. + * Please refer to https://github.com/KiCad/kicad-packages3D/blob/master/LICENSE.md for further clarification of the exception.+ * Disclaimer of Warranties and Limitation of Liability.+ * These libraries are provided in the hope that they will be useful, but are provided without warranty of any kind, express or implied.+ * *USE 3D CAD DATA AT YOUR OWN RISK*+ * *DO NOT RELY UPON ANY INFORMATION FOUND HERE WITHOUT INDEPENDENT VERIFICATION.*+ * + */++FILE_DESCRIPTION(+/* description */ ('model of R_0402_1005Metric'),+/* implementation_level */ '2;1');++FILE_NAME(+/* name */ 'R_0402_1005Metric.step',+/* time_stamp */ '2018-01-04T00:45:35',+/* author */ ('kicad StepUp','ksu'),+/* organization */ ('FreeCAD'),+/* preprocessor_version */ 'OCC',+/* originating_system */ 'kicad StepUp',+/* authorisation */ '');++FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));+ENDSEC;++DATA;+#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',+'automotive_design',2000,#2);+#2 = APPLICATION_CONTEXT(+'core data for automotive mechanical design processes');+#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);+#4 = PRODUCT_DEFINITION_SHAPE('','',#5);+#5 = PRODUCT_DEFINITION('design','',#6,#9);+#6 = PRODUCT_DEFINITION_FORMATION('','',#7);+#7 = PRODUCT('R_0402_1005Metric','R_0402_1005Metric','',(#8));+#8 = PRODUCT_CONTEXT('',#2,'mechanical');+#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');+#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#805);+#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);+#12 = CARTESIAN_POINT('',(0.,0.,0.));+#13 = DIRECTION('',(0.,0.,1.));+#14 = DIRECTION('',(1.,0.,-0.));+#15 = MANIFOLD_SOLID_BREP('',#16);+#16 = CLOSED_SHELL('',(#17,#57,#140,#165,#190,#257,#274,#291,#340,#357,+#374,#423,#440,#509,#540,#564,#633,#657,#674,#691,#708,#725,#742,+#759,#776,#793));+#17 = ADVANCED_FACE('',(#18),#52,.F.);+#18 = FACE_BOUND('',#19,.F.);+#19 = EDGE_LOOP('',(#20,#30,#38,#46));+#20 = ORIENTED_EDGE('',*,*,#21,.F.);+#21 = EDGE_CURVE('',#22,#24,#26,.T.);+#22 = VERTEX_POINT('',#23);+#23 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#24 = VERTEX_POINT('',#25);+#25 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#26 = LINE('',#27,#28);+#27 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#28 = VECTOR('',#29,1.);+#29 = DIRECTION('',(0.,0.,1.));+#30 = ORIENTED_EDGE('',*,*,#31,.T.);+#31 = EDGE_CURVE('',#22,#32,#34,.T.);+#32 = VERTEX_POINT('',#33);+#33 = CARTESIAN_POINT('',(-0.5,0.25,3.5E-02));+#34 = LINE('',#35,#36);+#35 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#36 = VECTOR('',#37,1.);+#37 = DIRECTION('',(0.,1.,0.));+#38 = ORIENTED_EDGE('',*,*,#39,.T.);+#39 = EDGE_CURVE('',#32,#40,#42,.T.);+#40 = VERTEX_POINT('',#41);+#41 = CARTESIAN_POINT('',(-0.5,0.25,0.315));+#42 = LINE('',#43,#44);+#43 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#44 = VECTOR('',#45,1.);+#45 = DIRECTION('',(0.,0.,1.));+#46 = ORIENTED_EDGE('',*,*,#47,.F.);+#47 = EDGE_CURVE('',#24,#40,#48,.T.);+#48 = LINE('',#49,#50);+#49 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#50 = VECTOR('',#51,1.);+#51 = DIRECTION('',(0.,1.,0.));+#52 = PLANE('',#53);+#53 = AXIS2_PLACEMENT_3D('',#54,#55,#56);+#54 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#55 = DIRECTION('',(1.,0.,0.));+#56 = DIRECTION('',(0.,0.,1.));+#57 = ADVANCED_FACE('',(#58),#135,.F.);+#58 = FACE_BOUND('',#59,.F.);+#59 = EDGE_LOOP('',(#60,#70,#77,#78,#87,#95,#104,#112,#120,#128));+#60 = ORIENTED_EDGE('',*,*,#61,.F.);+#61 = EDGE_CURVE('',#62,#64,#66,.T.);+#62 = VERTEX_POINT('',#63);+#63 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#64 = VERTEX_POINT('',#65);+#65 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#66 = LINE('',#67,#68);+#67 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#68 = VECTOR('',#69,1.);+#69 = DIRECTION('',(1.,0.,0.));+#70 = ORIENTED_EDGE('',*,*,#71,.F.);+#71 = EDGE_CURVE('',#22,#62,#72,.T.);+#72 = CIRCLE('',#73,3.5E-02);+#73 = AXIS2_PLACEMENT_3D('',#74,#75,#76);+#74 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#75 = DIRECTION('',(0.,-1.,0.));+#76 = DIRECTION('',(0.,0.,1.));+#77 = ORIENTED_EDGE('',*,*,#21,.T.);+#78 = ORIENTED_EDGE('',*,*,#79,.T.);+#79 = EDGE_CURVE('',#24,#80,#82,.T.);+#80 = VERTEX_POINT('',#81);+#81 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#82 = CIRCLE('',#83,3.5E-02);+#83 = AXIS2_PLACEMENT_3D('',#84,#85,#86);+#84 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#85 = DIRECTION('',(0.,1.,0.));+#86 = DIRECTION('',(0.,0.,1.));+#87 = ORIENTED_EDGE('',*,*,#88,.T.);+#88 = EDGE_CURVE('',#80,#89,#91,.T.);+#89 = VERTEX_POINT('',#90);+#90 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#91 = LINE('',#92,#93);+#92 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#93 = VECTOR('',#94,1.);+#94 = DIRECTION('',(1.,0.,0.));+#95 = ORIENTED_EDGE('',*,*,#96,.F.);+#96 = EDGE_CURVE('',#97,#89,#99,.T.);+#97 = VERTEX_POINT('',#98);+#98 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#99 = CIRCLE('',#100,3.5E-02);+#100 = AXIS2_PLACEMENT_3D('',#101,#102,#103);+#101 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#102 = DIRECTION('',(0.,-1.,0.));+#103 = DIRECTION('',(0.,0.,1.));+#104 = ORIENTED_EDGE('',*,*,#105,.F.);+#105 = EDGE_CURVE('',#106,#97,#108,.T.);+#106 = VERTEX_POINT('',#107);+#107 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#108 = LINE('',#109,#110);+#109 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#110 = VECTOR('',#111,1.);+#111 = DIRECTION('',(1.,0.,0.));+#112 = ORIENTED_EDGE('',*,*,#113,.F.);+#113 = EDGE_CURVE('',#114,#106,#116,.T.);+#114 = VERTEX_POINT('',#115);+#115 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#116 = LINE('',#117,#118);+#117 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#118 = VECTOR('',#119,1.);+#119 = DIRECTION('',(0.,0.,1.));+#120 = ORIENTED_EDGE('',*,*,#121,.T.);+#121 = EDGE_CURVE('',#114,#122,#124,.T.);+#122 = VERTEX_POINT('',#123);+#123 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#124 = LINE('',#125,#126);+#125 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#126 = VECTOR('',#127,1.);+#127 = DIRECTION('',(1.,0.,0.));+#128 = ORIENTED_EDGE('',*,*,#129,.T.);+#129 = EDGE_CURVE('',#122,#64,#130,.T.);+#130 = CIRCLE('',#131,3.5E-02);+#131 = AXIS2_PLACEMENT_3D('',#132,#133,#134);+#132 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#133 = DIRECTION('',(0.,1.,0.));+#134 = DIRECTION('',(0.,0.,1.));+#135 = PLANE('',#136);+#136 = AXIS2_PLACEMENT_3D('',#137,#138,#139);+#137 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#138 = DIRECTION('',(0.,1.,0.));+#139 = DIRECTION('',(0.,0.,1.));+#140 = ADVANCED_FACE('',(#141),#160,.T.);+#141 = FACE_BOUND('',#142,.F.);+#142 = EDGE_LOOP('',(#143,#144,#152,#159));+#143 = ORIENTED_EDGE('',*,*,#71,.T.);+#144 = ORIENTED_EDGE('',*,*,#145,.T.);+#145 = EDGE_CURVE('',#62,#146,#148,.T.);+#146 = VERTEX_POINT('',#147);+#147 = CARTESIAN_POINT('',(-0.465,0.25,-2.775557561563E-17));+#148 = LINE('',#149,#150);+#149 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#150 = VECTOR('',#151,1.);+#151 = DIRECTION('',(0.,1.,0.));+#152 = ORIENTED_EDGE('',*,*,#153,.F.);+#153 = EDGE_CURVE('',#32,#146,#154,.T.);+#154 = CIRCLE('',#155,3.5E-02);+#155 = AXIS2_PLACEMENT_3D('',#156,#157,#158);+#156 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#157 = DIRECTION('',(0.,-1.,0.));+#158 = DIRECTION('',(0.,0.,1.));+#159 = ORIENTED_EDGE('',*,*,#31,.F.);+#160 = CYLINDRICAL_SURFACE('',#161,3.5E-02);+#161 = AXIS2_PLACEMENT_3D('',#162,#163,#164);+#162 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#163 = DIRECTION('',(0.,1.,0.));+#164 = DIRECTION('',(-1.,0.,0.));+#165 = ADVANCED_FACE('',(#166),#185,.T.);+#166 = FACE_BOUND('',#167,.T.);+#167 = EDGE_LOOP('',(#168,#169,#177,#184));+#168 = ORIENTED_EDGE('',*,*,#79,.T.);+#169 = ORIENTED_EDGE('',*,*,#170,.T.);+#170 = EDGE_CURVE('',#80,#171,#173,.T.);+#171 = VERTEX_POINT('',#172);+#172 = CARTESIAN_POINT('',(-0.465,0.25,0.35));+#173 = LINE('',#174,#175);+#174 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#175 = VECTOR('',#176,1.);+#176 = DIRECTION('',(0.,1.,0.));+#177 = ORIENTED_EDGE('',*,*,#178,.F.);+#178 = EDGE_CURVE('',#40,#171,#179,.T.);+#179 = CIRCLE('',#180,3.5E-02);+#180 = AXIS2_PLACEMENT_3D('',#181,#182,#183);+#181 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#182 = DIRECTION('',(0.,1.,0.));+#183 = DIRECTION('',(0.,0.,1.));+#184 = ORIENTED_EDGE('',*,*,#47,.F.);+#185 = CYLINDRICAL_SURFACE('',#186,3.5E-02);+#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189);+#187 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#188 = DIRECTION('',(0.,1.,0.));+#189 = DIRECTION('',(-1.,0.,0.));+#190 = ADVANCED_FACE('',(#191),#252,.T.);+#191 = FACE_BOUND('',#192,.T.);+#192 = EDGE_LOOP('',(#193,#201,#202,#203,#204,#212,#221,#229,#237,#245)+);+#193 = ORIENTED_EDGE('',*,*,#194,.F.);+#194 = EDGE_CURVE('',#146,#195,#197,.T.);+#195 = VERTEX_POINT('',#196);+#196 = CARTESIAN_POINT('',(-0.335,0.25,-2.775557561563E-17));+#197 = LINE('',#198,#199);+#198 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#199 = VECTOR('',#200,1.);+#200 = DIRECTION('',(1.,0.,0.));+#201 = ORIENTED_EDGE('',*,*,#153,.F.);+#202 = ORIENTED_EDGE('',*,*,#39,.T.);+#203 = ORIENTED_EDGE('',*,*,#178,.T.);+#204 = ORIENTED_EDGE('',*,*,#205,.T.);+#205 = EDGE_CURVE('',#171,#206,#208,.T.);+#206 = VERTEX_POINT('',#207);+#207 = CARTESIAN_POINT('',(-0.335,0.25,0.35));+#208 = LINE('',#209,#210);+#209 = CARTESIAN_POINT('',(-0.5,0.25,0.35));+#210 = VECTOR('',#211,1.);+#211 = DIRECTION('',(1.,0.,0.));+#212 = ORIENTED_EDGE('',*,*,#213,.F.);+#213 = EDGE_CURVE('',#214,#206,#216,.T.);+#214 = VERTEX_POINT('',#215);+#215 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#216 = CIRCLE('',#217,3.5E-02);+#217 = AXIS2_PLACEMENT_3D('',#218,#219,#220);+#218 = CARTESIAN_POINT('',(-0.335,0.25,0.315));+#219 = DIRECTION('',(0.,-1.,0.));+#220 = DIRECTION('',(0.,0.,1.));+#221 = ORIENTED_EDGE('',*,*,#222,.F.);+#222 = EDGE_CURVE('',#223,#214,#225,.T.);+#223 = VERTEX_POINT('',#224);+#224 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#225 = LINE('',#226,#227);+#226 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#227 = VECTOR('',#228,1.);+#228 = DIRECTION('',(1.,0.,0.));+#229 = ORIENTED_EDGE('',*,*,#230,.F.);+#230 = EDGE_CURVE('',#231,#223,#233,.T.);+#231 = VERTEX_POINT('',#232);+#232 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#233 = LINE('',#234,#235);+#234 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#235 = VECTOR('',#236,1.);+#236 = DIRECTION('',(0.,0.,1.));+#237 = ORIENTED_EDGE('',*,*,#238,.T.);+#238 = EDGE_CURVE('',#231,#239,#241,.T.);+#239 = VERTEX_POINT('',#240);+#240 = CARTESIAN_POINT('',(-0.3,0.25,3.5E-02));+#241 = LINE('',#242,#243);+#242 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#243 = VECTOR('',#244,1.);+#244 = DIRECTION('',(1.,0.,0.));+#245 = ORIENTED_EDGE('',*,*,#246,.T.);+#246 = EDGE_CURVE('',#239,#195,#247,.T.);+#247 = CIRCLE('',#248,3.5E-02);+#248 = AXIS2_PLACEMENT_3D('',#249,#250,#251);+#249 = CARTESIAN_POINT('',(-0.335,0.25,3.5E-02));+#250 = DIRECTION('',(0.,1.,0.));+#251 = DIRECTION('',(0.,0.,1.));+#252 = PLANE('',#253);+#253 = AXIS2_PLACEMENT_3D('',#254,#255,#256);+#254 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#255 = DIRECTION('',(0.,1.,0.));+#256 = DIRECTION('',(0.,0.,1.));+#257 = ADVANCED_FACE('',(#258),#269,.F.);+#258 = FACE_BOUND('',#259,.F.);+#259 = EDGE_LOOP('',(#260,#261,#262,#263));+#260 = ORIENTED_EDGE('',*,*,#194,.F.);+#261 = ORIENTED_EDGE('',*,*,#145,.F.);+#262 = ORIENTED_EDGE('',*,*,#61,.T.);+#263 = ORIENTED_EDGE('',*,*,#264,.T.);+#264 = EDGE_CURVE('',#64,#195,#265,.T.);+#265 = LINE('',#266,#267);+#266 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#267 = VECTOR('',#268,1.);+#268 = DIRECTION('',(0.,1.,0.));+#269 = PLANE('',#270);+#270 = AXIS2_PLACEMENT_3D('',#271,#272,#273);+#271 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#272 = DIRECTION('',(0.,0.,1.));+#273 = DIRECTION('',(1.,0.,0.));+#274 = ADVANCED_FACE('',(#275),#286,.T.);+#275 = FACE_BOUND('',#276,.T.);+#276 = EDGE_LOOP('',(#277,#278,#279,#280));+#277 = ORIENTED_EDGE('',*,*,#129,.T.);+#278 = ORIENTED_EDGE('',*,*,#264,.T.);+#279 = ORIENTED_EDGE('',*,*,#246,.F.);+#280 = ORIENTED_EDGE('',*,*,#281,.F.);+#281 = EDGE_CURVE('',#122,#239,#282,.T.);+#282 = LINE('',#283,#284);+#283 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#284 = VECTOR('',#285,1.);+#285 = DIRECTION('',(0.,1.,0.));+#286 = CYLINDRICAL_SURFACE('',#287,3.5E-02);+#287 = AXIS2_PLACEMENT_3D('',#288,#289,#290);+#288 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#289 = DIRECTION('',(0.,1.,0.));+#290 = DIRECTION('',(1.,0.,0.));+#291 = ADVANCED_FACE('',(#292),#335,.F.);+#292 = FACE_BOUND('',#293,.F.);+#293 = EDGE_LOOP('',(#294,#295,#296,#297,#305,#313,#321,#329));+#294 = ORIENTED_EDGE('',*,*,#121,.F.);+#295 = ORIENTED_EDGE('',*,*,#113,.T.);+#296 = ORIENTED_EDGE('',*,*,#105,.T.);+#297 = ORIENTED_EDGE('',*,*,#298,.T.);+#298 = EDGE_CURVE('',#97,#299,#301,.T.);+#299 = VERTEX_POINT('',#300);+#300 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#301 = LINE('',#302,#303);+#302 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#303 = VECTOR('',#304,1.);+#304 = DIRECTION('',(1.,0.,0.));+#305 = ORIENTED_EDGE('',*,*,#306,.T.);+#306 = EDGE_CURVE('',#299,#307,#309,.T.);+#307 = VERTEX_POINT('',#308);+#308 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#309 = LINE('',#310,#311);+#310 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#311 = VECTOR('',#312,1.);+#312 = DIRECTION('',(1.,0.,0.));+#313 = ORIENTED_EDGE('',*,*,#314,.F.);+#314 = EDGE_CURVE('',#315,#307,#317,.T.);+#315 = VERTEX_POINT('',#316);+#316 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#317 = LINE('',#318,#319);+#318 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#319 = VECTOR('',#320,1.);+#320 = DIRECTION('',(0.,0.,1.));+#321 = ORIENTED_EDGE('',*,*,#322,.F.);+#322 = EDGE_CURVE('',#323,#315,#325,.T.);+#323 = VERTEX_POINT('',#324);+#324 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#325 = LINE('',#326,#327);+#326 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#327 = VECTOR('',#328,1.);+#328 = DIRECTION('',(1.,0.,0.));+#329 = ORIENTED_EDGE('',*,*,#330,.F.);+#330 = EDGE_CURVE('',#122,#323,#331,.T.);+#331 = LINE('',#332,#333);+#332 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#333 = VECTOR('',#334,1.);+#334 = DIRECTION('',(1.,0.,0.));+#335 = PLANE('',#336);+#336 = AXIS2_PLACEMENT_3D('',#337,#338,#339);+#337 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#338 = DIRECTION('',(0.,1.,0.));+#339 = DIRECTION('',(0.,0.,1.));+#340 = ADVANCED_FACE('',(#341),#352,.T.);+#341 = FACE_BOUND('',#342,.T.);+#342 = EDGE_LOOP('',(#343,#344,#345,#346));+#343 = ORIENTED_EDGE('',*,*,#205,.F.);+#344 = ORIENTED_EDGE('',*,*,#170,.F.);+#345 = ORIENTED_EDGE('',*,*,#88,.T.);+#346 = ORIENTED_EDGE('',*,*,#347,.T.);+#347 = EDGE_CURVE('',#89,#206,#348,.T.);+#348 = LINE('',#349,#350);+#349 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#350 = VECTOR('',#351,1.);+#351 = DIRECTION('',(0.,1.,0.));+#352 = PLANE('',#353);+#353 = AXIS2_PLACEMENT_3D('',#354,#355,#356);+#354 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#355 = DIRECTION('',(0.,0.,1.));+#356 = DIRECTION('',(1.,0.,0.));+#357 = ADVANCED_FACE('',(#358),#369,.T.);+#358 = FACE_BOUND('',#359,.F.);+#359 = EDGE_LOOP('',(#360,#361,#362,#363));+#360 = ORIENTED_EDGE('',*,*,#96,.T.);+#361 = ORIENTED_EDGE('',*,*,#347,.T.);+#362 = ORIENTED_EDGE('',*,*,#213,.F.);+#363 = ORIENTED_EDGE('',*,*,#364,.F.);+#364 = EDGE_CURVE('',#97,#214,#365,.T.);+#365 = LINE('',#366,#367);+#366 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#367 = VECTOR('',#368,1.);+#368 = DIRECTION('',(0.,1.,0.));+#369 = CYLINDRICAL_SURFACE('',#370,3.5E-02);+#370 = AXIS2_PLACEMENT_3D('',#371,#372,#373);+#371 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#372 = DIRECTION('',(0.,1.,0.));+#373 = DIRECTION('',(1.,0.,0.));+#374 = ADVANCED_FACE('',(#375),#418,.T.);+#375 = FACE_BOUND('',#376,.T.);+#376 = EDGE_LOOP('',(#377,#378,#379,#380,#388,#396,#404,#412));+#377 = ORIENTED_EDGE('',*,*,#238,.F.);+#378 = ORIENTED_EDGE('',*,*,#230,.T.);+#379 = ORIENTED_EDGE('',*,*,#222,.T.);+#380 = ORIENTED_EDGE('',*,*,#381,.T.);+#381 = EDGE_CURVE('',#214,#382,#384,.T.);+#382 = VERTEX_POINT('',#383);+#383 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#384 = LINE('',#385,#386);+#385 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#386 = VECTOR('',#387,1.);+#387 = DIRECTION('',(1.,0.,0.));+#388 = ORIENTED_EDGE('',*,*,#389,.T.);+#389 = EDGE_CURVE('',#382,#390,#392,.T.);+#390 = VERTEX_POINT('',#391);+#391 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#392 = LINE('',#393,#394);+#393 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#394 = VECTOR('',#395,1.);+#395 = DIRECTION('',(1.,0.,0.));+#396 = ORIENTED_EDGE('',*,*,#397,.F.);+#397 = EDGE_CURVE('',#398,#390,#400,.T.);+#398 = VERTEX_POINT('',#399);+#399 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#400 = LINE('',#401,#402);+#401 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#402 = VECTOR('',#403,1.);+#403 = DIRECTION('',(0.,0.,1.));+#404 = ORIENTED_EDGE('',*,*,#405,.F.);+#405 = EDGE_CURVE('',#406,#398,#408,.T.);+#406 = VERTEX_POINT('',#407);+#407 = CARTESIAN_POINT('',(0.3,0.25,3.5E-02));+#408 = LINE('',#409,#410);+#409 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#410 = VECTOR('',#411,1.);+#411 = DIRECTION('',(1.,0.,0.));+#412 = ORIENTED_EDGE('',*,*,#413,.F.);+#413 = EDGE_CURVE('',#239,#406,#414,.T.);+#414 = LINE('',#415,#416);+#415 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#416 = VECTOR('',#417,1.);+#417 = DIRECTION('',(1.,0.,0.));+#418 = PLANE('',#419);+#419 = AXIS2_PLACEMENT_3D('',#420,#421,#422);+#420 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#421 = DIRECTION('',(0.,1.,0.));+#422 = DIRECTION('',(0.,0.,1.));+#423 = ADVANCED_FACE('',(#424),#435,.F.);+#424 = FACE_BOUND('',#425,.F.);+#425 = EDGE_LOOP('',(#426,#427,#428,#434));+#426 = ORIENTED_EDGE('',*,*,#281,.F.);+#427 = ORIENTED_EDGE('',*,*,#330,.T.);+#428 = ORIENTED_EDGE('',*,*,#429,.T.);+#429 = EDGE_CURVE('',#323,#406,#430,.T.);+#430 = LINE('',#431,#432);+#431 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#432 = VECTOR('',#433,1.);+#433 = DIRECTION('',(0.,1.,0.));+#434 = ORIENTED_EDGE('',*,*,#413,.F.);+#435 = PLANE('',#436);+#436 = AXIS2_PLACEMENT_3D('',#437,#438,#439);+#437 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#438 = DIRECTION('',(0.,0.,1.));+#439 = DIRECTION('',(1.,0.,0.));+#440 = ADVANCED_FACE('',(#441),#504,.F.);+#441 = FACE_BOUND('',#442,.F.);+#442 = EDGE_LOOP('',(#443,#453,#460,#461,#462,#463,#472,#480,#489,#497)+);+#443 = ORIENTED_EDGE('',*,*,#444,.F.);+#444 = EDGE_CURVE('',#445,#447,#449,.T.);+#445 = VERTEX_POINT('',#446);+#446 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#447 = VERTEX_POINT('',#448);+#448 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#449 = LINE('',#450,#451);+#450 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#451 = VECTOR('',#452,1.);+#452 = DIRECTION('',(1.,0.,0.));+#453 = ORIENTED_EDGE('',*,*,#454,.F.);+#454 = EDGE_CURVE('',#323,#445,#455,.T.);+#455 = CIRCLE('',#456,3.5E-02);+#456 = AXIS2_PLACEMENT_3D('',#457,#458,#459);+#457 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#458 = DIRECTION('',(0.,-1.,0.));+#459 = DIRECTION('',(0.,0.,1.));+#460 = ORIENTED_EDGE('',*,*,#322,.T.);+#461 = ORIENTED_EDGE('',*,*,#314,.T.);+#462 = ORIENTED_EDGE('',*,*,#306,.F.);+#463 = ORIENTED_EDGE('',*,*,#464,.T.);+#464 = EDGE_CURVE('',#299,#465,#467,.T.);+#465 = VERTEX_POINT('',#466);+#466 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#467 = CIRCLE('',#468,3.5E-02);+#468 = AXIS2_PLACEMENT_3D('',#469,#470,#471);+#469 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#470 = DIRECTION('',(0.,1.,0.));+#471 = DIRECTION('',(0.,0.,1.));+#472 = ORIENTED_EDGE('',*,*,#473,.T.);+#473 = EDGE_CURVE('',#465,#474,#476,.T.);+#474 = VERTEX_POINT('',#475);+#475 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#476 = LINE('',#477,#478);+#477 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#478 = VECTOR('',#479,1.);+#479 = DIRECTION('',(1.,0.,0.));+#480 = ORIENTED_EDGE('',*,*,#481,.F.);+#481 = EDGE_CURVE('',#482,#474,#484,.T.);+#482 = VERTEX_POINT('',#483);+#483 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#484 = CIRCLE('',#485,3.5E-02);+#485 = AXIS2_PLACEMENT_3D('',#486,#487,#488);+#486 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#487 = DIRECTION('',(0.,-1.,0.));+#488 = DIRECTION('',(0.,0.,1.));+#489 = ORIENTED_EDGE('',*,*,#490,.F.);+#490 = EDGE_CURVE('',#491,#482,#493,.T.);+#491 = VERTEX_POINT('',#492);+#492 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#493 = LINE('',#494,#495);+#494 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#495 = VECTOR('',#496,1.);+#496 = DIRECTION('',(0.,0.,1.));+#497 = ORIENTED_EDGE('',*,*,#498,.T.);+#498 = EDGE_CURVE('',#491,#447,#499,.T.);+#499 = CIRCLE('',#500,3.5E-02);+#500 = AXIS2_PLACEMENT_3D('',#501,#502,#503);+#501 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#502 = DIRECTION('',(0.,1.,0.));+#503 = DIRECTION('',(0.,0.,1.));+#504 = PLANE('',#505);+#505 = AXIS2_PLACEMENT_3D('',#506,#507,#508);+#506 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#507 = DIRECTION('',(0.,1.,0.));+#508 = DIRECTION('',(0.,0.,1.));+#509 = ADVANCED_FACE('',(#510),#535,.F.);+#510 = FACE_BOUND('',#511,.F.);+#511 = EDGE_LOOP('',(#512,#513,#521,#529));+#512 = ORIENTED_EDGE('',*,*,#298,.F.);+#513 = ORIENTED_EDGE('',*,*,#514,.T.);+#514 = EDGE_CURVE('',#97,#515,#517,.T.);+#515 = VERTEX_POINT('',#516);+#516 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#517 = LINE('',#518,#519);+#518 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#519 = VECTOR('',#520,1.);+#520 = DIRECTION('',(0.,0.,1.));+#521 = ORIENTED_EDGE('',*,*,#522,.T.);+#522 = EDGE_CURVE('',#515,#523,#525,.T.);+#523 = VERTEX_POINT('',#524);+#524 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#525 = LINE('',#526,#527);+#526 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#527 = VECTOR('',#528,1.);+#528 = DIRECTION('',(1.,0.,0.));+#529 = ORIENTED_EDGE('',*,*,#530,.F.);+#530 = EDGE_CURVE('',#299,#523,#531,.T.);+#531 = LINE('',#532,#533);+#532 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#533 = VECTOR('',#534,1.);+#534 = DIRECTION('',(0.,0.,1.));+#535 = PLANE('',#536);+#536 = AXIS2_PLACEMENT_3D('',#537,#538,#539);+#537 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#538 = DIRECTION('',(0.,1.,0.));+#539 = DIRECTION('',(0.,0.,1.));+#540 = ADVANCED_FACE('',(#541),#559,.F.);+#541 = FACE_BOUND('',#542,.F.);+#542 = EDGE_LOOP('',(#543,#544,#545,#553));+#543 = ORIENTED_EDGE('',*,*,#514,.F.);+#544 = ORIENTED_EDGE('',*,*,#364,.T.);+#545 = ORIENTED_EDGE('',*,*,#546,.T.);+#546 = EDGE_CURVE('',#214,#547,#549,.T.);+#547 = VERTEX_POINT('',#548);+#548 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#549 = LINE('',#550,#551);+#550 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#551 = VECTOR('',#552,1.);+#552 = DIRECTION('',(0.,0.,1.));+#553 = ORIENTED_EDGE('',*,*,#554,.F.);+#554 = EDGE_CURVE('',#515,#547,#555,.T.);+#555 = LINE('',#556,#557);+#556 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#557 = VECTOR('',#558,1.);+#558 = DIRECTION('',(0.,1.,0.));+#559 = PLANE('',#560);+#560 = AXIS2_PLACEMENT_3D('',#561,#562,#563);+#561 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#562 = DIRECTION('',(1.,0.,0.));+#563 = DIRECTION('',(0.,0.,1.));+#564 = ADVANCED_FACE('',(#565),#628,.T.);+#565 = FACE_BOUND('',#566,.T.);+#566 = EDGE_LOOP('',(#567,#577,#584,#585,#586,#587,#596,#604,#613,#621)+);+#567 = ORIENTED_EDGE('',*,*,#568,.F.);+#568 = EDGE_CURVE('',#569,#571,#573,.T.);+#569 = VERTEX_POINT('',#570);+#570 = CARTESIAN_POINT('',(0.335,0.25,-2.775557561563E-17));+#571 = VERTEX_POINT('',#572);+#572 = CARTESIAN_POINT('',(0.465,0.25,-2.775557561563E-17));+#573 = LINE('',#574,#575);+#574 = CARTESIAN_POINT('',(0.3,0.25,0.));+#575 = VECTOR('',#576,1.);+#576 = DIRECTION('',(1.,0.,0.));+#577 = ORIENTED_EDGE('',*,*,#578,.F.);+#578 = EDGE_CURVE('',#406,#569,#579,.T.);+#579 = CIRCLE('',#580,3.5E-02);+#580 = AXIS2_PLACEMENT_3D('',#581,#582,#583);+#581 = CARTESIAN_POINT('',(0.335,0.25,3.5E-02));+#582 = DIRECTION('',(0.,-1.,0.));+#583 = DIRECTION('',(0.,0.,1.));+#584 = ORIENTED_EDGE('',*,*,#405,.T.);+#585 = ORIENTED_EDGE('',*,*,#397,.T.);+#586 = ORIENTED_EDGE('',*,*,#389,.F.);+#587 = ORIENTED_EDGE('',*,*,#588,.T.);+#588 = EDGE_CURVE('',#382,#589,#591,.T.);+#589 = VERTEX_POINT('',#590);+#590 = CARTESIAN_POINT('',(0.335,0.25,0.35));+#591 = CIRCLE('',#592,3.5E-02);+#592 = AXIS2_PLACEMENT_3D('',#593,#594,#595);+#593 = CARTESIAN_POINT('',(0.335,0.25,0.315));+#594 = DIRECTION('',(0.,1.,0.));+#595 = DIRECTION('',(0.,0.,1.));+#596 = ORIENTED_EDGE('',*,*,#597,.T.);+#597 = EDGE_CURVE('',#589,#598,#600,.T.);+#598 = VERTEX_POINT('',#599);+#599 = CARTESIAN_POINT('',(0.465,0.25,0.35));+#600 = LINE('',#601,#602);+#601 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#602 = VECTOR('',#603,1.);+#603 = DIRECTION('',(1.,0.,0.));+#604 = ORIENTED_EDGE('',*,*,#605,.F.);+#605 = EDGE_CURVE('',#606,#598,#608,.T.);+#606 = VERTEX_POINT('',#607);+#607 = CARTESIAN_POINT('',(0.5,0.25,0.315));+#608 = CIRCLE('',#609,3.5E-02);+#609 = AXIS2_PLACEMENT_3D('',#610,#611,#612);+#610 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#611 = DIRECTION('',(0.,-1.,0.));+#612 = DIRECTION('',(0.,0.,1.));+#613 = ORIENTED_EDGE('',*,*,#614,.F.);+#614 = EDGE_CURVE('',#615,#606,#617,.T.);+#615 = VERTEX_POINT('',#616);+#616 = CARTESIAN_POINT('',(0.5,0.25,3.5E-02));+#617 = LINE('',#618,#619);+#618 = CARTESIAN_POINT('',(0.5,0.25,0.));+#619 = VECTOR('',#620,1.);+#620 = DIRECTION('',(0.,0.,1.));+#621 = ORIENTED_EDGE('',*,*,#622,.T.);+#622 = EDGE_CURVE('',#615,#571,#623,.T.);+#623 = CIRCLE('',#624,3.5E-02);+#624 = AXIS2_PLACEMENT_3D('',#625,#626,#627);+#625 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#626 = DIRECTION('',(0.,1.,0.));+#627 = DIRECTION('',(0.,0.,1.));+#628 = PLANE('',#629);+#629 = AXIS2_PLACEMENT_3D('',#630,#631,#632);+#630 = CARTESIAN_POINT('',(0.3,0.25,0.));+#631 = DIRECTION('',(0.,1.,0.));+#632 = DIRECTION('',(0.,0.,1.));+#633 = ADVANCED_FACE('',(#634),#652,.T.);+#634 = FACE_BOUND('',#635,.T.);+#635 = EDGE_LOOP('',(#636,#637,#638,#646));+#636 = ORIENTED_EDGE('',*,*,#381,.F.);+#637 = ORIENTED_EDGE('',*,*,#546,.T.);+#638 = ORIENTED_EDGE('',*,*,#639,.T.);+#639 = EDGE_CURVE('',#547,#640,#642,.T.);+#640 = VERTEX_POINT('',#641);+#641 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#642 = LINE('',#643,#644);+#643 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#644 = VECTOR('',#645,1.);+#645 = DIRECTION('',(1.,0.,0.));+#646 = ORIENTED_EDGE('',*,*,#647,.F.);+#647 = EDGE_CURVE('',#382,#640,#648,.T.);+#648 = LINE('',#649,#650);+#649 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#650 = VECTOR('',#651,1.);+#651 = DIRECTION('',(0.,0.,1.));+#652 = PLANE('',#653);+#653 = AXIS2_PLACEMENT_3D('',#654,#655,#656);+#654 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#655 = DIRECTION('',(0.,1.,0.));+#656 = DIRECTION('',(0.,0.,1.));+#657 = ADVANCED_FACE('',(#658),#669,.T.);+#658 = FACE_BOUND('',#659,.F.);+#659 = EDGE_LOOP('',(#660,#661,#667,#668));+#660 = ORIENTED_EDGE('',*,*,#454,.T.);+#661 = ORIENTED_EDGE('',*,*,#662,.T.);+#662 = EDGE_CURVE('',#445,#569,#663,.T.);+#663 = LINE('',#664,#665);+#664 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#665 = VECTOR('',#666,1.);+#666 = DIRECTION('',(0.,1.,0.));+#667 = ORIENTED_EDGE('',*,*,#578,.F.);+#668 = ORIENTED_EDGE('',*,*,#429,.F.);+#669 = CYLINDRICAL_SURFACE('',#670,3.5E-02);+#670 = AXIS2_PLACEMENT_3D('',#671,#672,#673);+#671 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#672 = DIRECTION('',(0.,1.,0.));+#673 = DIRECTION('',(-1.,0.,0.));+#674 = ADVANCED_FACE('',(#675),#686,.F.);+#675 = FACE_BOUND('',#676,.F.);+#676 = EDGE_LOOP('',(#677,#678,#679,#680));+#677 = ORIENTED_EDGE('',*,*,#568,.F.);+#678 = ORIENTED_EDGE('',*,*,#662,.F.);+#679 = ORIENTED_EDGE('',*,*,#444,.T.);+#680 = ORIENTED_EDGE('',*,*,#681,.T.);+#681 = EDGE_CURVE('',#447,#571,#682,.T.);+#682 = LINE('',#683,#684);+#683 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#684 = VECTOR('',#685,1.);+#685 = DIRECTION('',(0.,1.,0.));+#686 = PLANE('',#687);+#687 = AXIS2_PLACEMENT_3D('',#688,#689,#690);+#688 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#689 = DIRECTION('',(0.,0.,1.));+#690 = DIRECTION('',(1.,0.,0.));+#691 = ADVANCED_FACE('',(#692),#703,.T.);+#692 = FACE_BOUND('',#693,.T.);+#693 = EDGE_LOOP('',(#694,#695,#696,#697));+#694 = ORIENTED_EDGE('',*,*,#498,.T.);+#695 = ORIENTED_EDGE('',*,*,#681,.T.);+#696 = ORIENTED_EDGE('',*,*,#622,.F.);+#697 = ORIENTED_EDGE('',*,*,#698,.F.);+#698 = EDGE_CURVE('',#491,#615,#699,.T.);+#699 = LINE('',#700,#701);+#700 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#701 = VECTOR('',#702,1.);+#702 = DIRECTION('',(0.,1.,0.));+#703 = CYLINDRICAL_SURFACE('',#704,3.5E-02);+#704 = AXIS2_PLACEMENT_3D('',#705,#706,#707);+#705 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#706 = DIRECTION('',(0.,1.,0.));+#707 = DIRECTION('',(1.,0.,0.));+#708 = ADVANCED_FACE('',(#709),#720,.T.);+#709 = FACE_BOUND('',#710,.T.);+#710 = EDGE_LOOP('',(#711,#712,#713,#714));+#711 = ORIENTED_EDGE('',*,*,#490,.F.);+#712 = ORIENTED_EDGE('',*,*,#698,.T.);+#713 = ORIENTED_EDGE('',*,*,#614,.T.);+#714 = ORIENTED_EDGE('',*,*,#715,.F.);+#715 = EDGE_CURVE('',#482,#606,#716,.T.);+#716 = LINE('',#717,#718);+#717 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#718 = VECTOR('',#719,1.);+#719 = DIRECTION('',(0.,1.,0.));+#720 = PLANE('',#721);+#721 = AXIS2_PLACEMENT_3D('',#722,#723,#724);+#722 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#723 = DIRECTION('',(1.,0.,0.));+#724 = DIRECTION('',(0.,0.,1.));+#725 = ADVANCED_FACE('',(#726),#737,.T.);+#726 = FACE_BOUND('',#727,.F.);+#727 = EDGE_LOOP('',(#728,#729,#735,#736));+#728 = ORIENTED_EDGE('',*,*,#481,.T.);+#729 = ORIENTED_EDGE('',*,*,#730,.T.);+#730 = EDGE_CURVE('',#474,#598,#731,.T.);+#731 = LINE('',#732,#733);+#732 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#733 = VECTOR('',#734,1.);+#734 = DIRECTION('',(0.,1.,0.));+#735 = ORIENTED_EDGE('',*,*,#605,.F.);+#736 = ORIENTED_EDGE('',*,*,#715,.F.);+#737 = CYLINDRICAL_SURFACE('',#738,3.5E-02);+#738 = AXIS2_PLACEMENT_3D('',#739,#740,#741);+#739 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#740 = DIRECTION('',(0.,1.,0.));+#741 = DIRECTION('',(1.,0.,0.));+#742 = ADVANCED_FACE('',(#743),#754,.T.);+#743 = FACE_BOUND('',#744,.T.);+#744 = EDGE_LOOP('',(#745,#746,#752,#753));+#745 = ORIENTED_EDGE('',*,*,#597,.F.);+#746 = ORIENTED_EDGE('',*,*,#747,.F.);+#747 = EDGE_CURVE('',#465,#589,#748,.T.);+#748 = LINE('',#749,#750);+#749 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#750 = VECTOR('',#751,1.);+#751 = DIRECTION('',(0.,1.,0.));+#752 = ORIENTED_EDGE('',*,*,#473,.T.);+#753 = ORIENTED_EDGE('',*,*,#730,.T.);+#754 = PLANE('',#755);+#755 = AXIS2_PLACEMENT_3D('',#756,#757,#758);+#756 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#757 = DIRECTION('',(0.,0.,1.));+#758 = DIRECTION('',(1.,0.,0.));+#759 = ADVANCED_FACE('',(#760),#771,.T.);+#760 = FACE_BOUND('',#761,.T.);+#761 = EDGE_LOOP('',(#762,#763,#764,#765));+#762 = ORIENTED_EDGE('',*,*,#464,.T.);+#763 = ORIENTED_EDGE('',*,*,#747,.T.);+#764 = ORIENTED_EDGE('',*,*,#588,.F.);+#765 = ORIENTED_EDGE('',*,*,#766,.F.);+#766 = EDGE_CURVE('',#299,#382,#767,.T.);+#767 = LINE('',#768,#769);+#768 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#769 = VECTOR('',#770,1.);+#770 = DIRECTION('',(0.,1.,0.));+#771 = CYLINDRICAL_SURFACE('',#772,3.5E-02);+#772 = AXIS2_PLACEMENT_3D('',#773,#774,#775);+#773 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#774 = DIRECTION('',(0.,1.,0.));+#775 = DIRECTION('',(-1.,0.,0.));+#776 = ADVANCED_FACE('',(#777),#788,.T.);+#777 = FACE_BOUND('',#778,.T.);+#778 = EDGE_LOOP('',(#779,#780,#781,#782));+#779 = ORIENTED_EDGE('',*,*,#530,.F.);+#780 = ORIENTED_EDGE('',*,*,#766,.T.);+#781 = ORIENTED_EDGE('',*,*,#647,.T.);+#782 = ORIENTED_EDGE('',*,*,#783,.F.);+#783 = EDGE_CURVE('',#523,#640,#784,.T.);+#784 = LINE('',#785,#786);+#785 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#786 = VECTOR('',#787,1.);+#787 = DIRECTION('',(0.,1.,0.));+#788 = PLANE('',#789);+#789 = AXIS2_PLACEMENT_3D('',#790,#791,#792);+#790 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#791 = DIRECTION('',(1.,0.,0.));+#792 = DIRECTION('',(0.,0.,1.));+#793 = ADVANCED_FACE('',(#794),#800,.T.);+#794 = FACE_BOUND('',#795,.T.);+#795 = EDGE_LOOP('',(#796,#797,#798,#799));+#796 = ORIENTED_EDGE('',*,*,#554,.F.);+#797 = ORIENTED_EDGE('',*,*,#522,.T.);+#798 = ORIENTED_EDGE('',*,*,#783,.T.);+#799 = ORIENTED_EDGE('',*,*,#639,.F.);+#800 = PLANE('',#801);+#801 = AXIS2_PLACEMENT_3D('',#802,#803,#804);+#802 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#803 = DIRECTION('',(0.,0.,1.));+#804 = DIRECTION('',(1.,0.,0.));+#805 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#809)) GLOBAL_UNIT_ASSIGNED_CONTEXT+((#806,#807,#808)) REPRESENTATION_CONTEXT('Context #1',+'3D Context with UNIT and UNCERTAINTY') );+#806 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );+#807 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );+#808 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );+#809 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#806,+'distance_accuracy_value','confusion accuracy');+#810 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));+#811 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#812,+#820,#827,#834,#841,#848,#855,#862,#870,#877,#884,#891,#898,#905,+#913,#920,#927,#934,#941,#948,#955,#962,#969,#976,#983,#990),#805);+#812 = STYLED_ITEM('color',(#813),#17);+#813 = PRESENTATION_STYLE_ASSIGNMENT((#814));+#814 = SURFACE_STYLE_USAGE(.BOTH.,#815);+#815 = SURFACE_SIDE_STYLE('',(#816));+#816 = SURFACE_STYLE_FILL_AREA(#817);+#817 = FILL_AREA_STYLE('',(#818));+#818 = FILL_AREA_STYLE_COLOUR('',#819);+#819 = COLOUR_RGB('',0.824000000954,0.819999992847,0.78100001812);+#820 = STYLED_ITEM('color',(#821),#57);+#821 = PRESENTATION_STYLE_ASSIGNMENT((#822));+#822 = SURFACE_STYLE_USAGE(.BOTH.,#823);+#823 = SURFACE_SIDE_STYLE('',(#824));+#824 = SURFACE_STYLE_FILL_AREA(#825);+#825 = FILL_AREA_STYLE('',(#826));+#826 = FILL_AREA_STYLE_COLOUR('',#819);+#827 = STYLED_ITEM('color',(#828),#140);+#828 = PRESENTATION_STYLE_ASSIGNMENT((#829));+#829 = SURFACE_STYLE_USAGE(.BOTH.,#830);+#830 = SURFACE_SIDE_STYLE('',(#831));+#831 = SURFACE_STYLE_FILL_AREA(#832);+#832 = FILL_AREA_STYLE('',(#833));+#833 = FILL_AREA_STYLE_COLOUR('',#819);+#834 = STYLED_ITEM('color',(#835),#165);+#835 = PRESENTATION_STYLE_ASSIGNMENT((#836));+#836 = SURFACE_STYLE_USAGE(.BOTH.,#837);+#837 = SURFACE_SIDE_STYLE('',(#838));+#838 = SURFACE_STYLE_FILL_AREA(#839);+#839 = FILL_AREA_STYLE('',(#840));+#840 = FILL_AREA_STYLE_COLOUR('',#819);+#841 = STYLED_ITEM('color',(#842),#190);+#842 = PRESENTATION_STYLE_ASSIGNMENT((#843));+#843 = SURFACE_STYLE_USAGE(.BOTH.,#844);+#844 = SURFACE_SIDE_STYLE('',(#845));+#845 = SURFACE_STYLE_FILL_AREA(#846);+#846 = FILL_AREA_STYLE('',(#847));+#847 = FILL_AREA_STYLE_COLOUR('',#819);+#848 = STYLED_ITEM('color',(#849),#257);+#849 = PRESENTATION_STYLE_ASSIGNMENT((#850));+#850 = SURFACE_STYLE_USAGE(.BOTH.,#851);+#851 = SURFACE_SIDE_STYLE('',(#852));+#852 = SURFACE_STYLE_FILL_AREA(#853);+#853 = FILL_AREA_STYLE('',(#854));+#854 = FILL_AREA_STYLE_COLOUR('',#819);+#855 = STYLED_ITEM('color',(#856),#274);+#856 = PRESENTATION_STYLE_ASSIGNMENT((#857));+#857 = SURFACE_STYLE_USAGE(.BOTH.,#858);+#858 = SURFACE_SIDE_STYLE('',(#859));+#859 = SURFACE_STYLE_FILL_AREA(#860);+#860 = FILL_AREA_STYLE('',(#861));+#861 = FILL_AREA_STYLE_COLOUR('',#819);+#862 = STYLED_ITEM('color',(#863),#291);+#863 = PRESENTATION_STYLE_ASSIGNMENT((#864));+#864 = SURFACE_STYLE_USAGE(.BOTH.,#865);+#865 = SURFACE_SIDE_STYLE('',(#866));+#866 = SURFACE_STYLE_FILL_AREA(#867);+#867 = FILL_AREA_STYLE('',(#868));+#868 = FILL_AREA_STYLE_COLOUR('',#869);+#869 = COLOUR_RGB('',0.894999980927,0.89099997282,0.813000023365);+#870 = STYLED_ITEM('color',(#871),#340);+#871 = PRESENTATION_STYLE_ASSIGNMENT((#872));+#872 = SURFACE_STYLE_USAGE(.BOTH.,#873);+#873 = SURFACE_SIDE_STYLE('',(#874));+#874 = SURFACE_STYLE_FILL_AREA(#875);+#875 = FILL_AREA_STYLE('',(#876));+#876 = FILL_AREA_STYLE_COLOUR('',#819);+#877 = STYLED_ITEM('color',(#878),#357);+#878 = PRESENTATION_STYLE_ASSIGNMENT((#879));+#879 = SURFACE_STYLE_USAGE(.BOTH.,#880);+#880 = SURFACE_SIDE_STYLE('',(#881));+#881 = SURFACE_STYLE_FILL_AREA(#882);+#882 = FILL_AREA_STYLE('',(#883));+#883 = FILL_AREA_STYLE_COLOUR('',#819);+#884 = STYLED_ITEM('color',(#885),#374);+#885 = PRESENTATION_STYLE_ASSIGNMENT((#886));+#886 = SURFACE_STYLE_USAGE(.BOTH.,#887);+#887 = SURFACE_SIDE_STYLE('',(#888));+#888 = SURFACE_STYLE_FILL_AREA(#889);+#889 = FILL_AREA_STYLE('',(#890));+#890 = FILL_AREA_STYLE_COLOUR('',#869);+#891 = STYLED_ITEM('color',(#892),#423);+#892 = PRESENTATION_STYLE_ASSIGNMENT((#893));+#893 = SURFACE_STYLE_USAGE(.BOTH.,#894);+#894 = SURFACE_SIDE_STYLE('',(#895));+#895 = SURFACE_STYLE_FILL_AREA(#896);+#896 = FILL_AREA_STYLE('',(#897));+#897 = FILL_AREA_STYLE_COLOUR('',#869);+#898 = STYLED_ITEM('color',(#899),#440);+#899 = PRESENTATION_STYLE_ASSIGNMENT((#900));+#900 = SURFACE_STYLE_USAGE(.BOTH.,#901);+#901 = SURFACE_SIDE_STYLE('',(#902));+#902 = SURFACE_STYLE_FILL_AREA(#903);+#903 = FILL_AREA_STYLE('',(#904));+#904 = FILL_AREA_STYLE_COLOUR('',#819);+#905 = STYLED_ITEM('color',(#906),#509);+#906 = PRESENTATION_STYLE_ASSIGNMENT((#907));+#907 = SURFACE_STYLE_USAGE(.BOTH.,#908);+#908 = SURFACE_SIDE_STYLE('',(#909));+#909 = SURFACE_STYLE_FILL_AREA(#910);+#910 = FILL_AREA_STYLE('',(#911));+#911 = FILL_AREA_STYLE_COLOUR('',#912);+#912 = COLOUR_RGB('',8.200000226498E-02,8.600000292063E-02,+9.399999678135E-02);+#913 = STYLED_ITEM('color',(#914),#540);+#914 = PRESENTATION_STYLE_ASSIGNMENT((#915));+#915 = SURFACE_STYLE_USAGE(.BOTH.,#916);+#916 = SURFACE_SIDE_STYLE('',(#917));+#917 = SURFACE_STYLE_FILL_AREA(#918);+#918 = FILL_AREA_STYLE('',(#919));+#919 = FILL_AREA_STYLE_COLOUR('',#912);+#920 = STYLED_ITEM('color',(#921),#564);+#921 = PRESENTATION_STYLE_ASSIGNMENT((#922));+#922 = SURFACE_STYLE_USAGE(.BOTH.,#923);+#923 = SURFACE_SIDE_STYLE('',(#924));+#924 = SURFACE_STYLE_FILL_AREA(#925);+#925 = FILL_AREA_STYLE('',(#926));+#926 = FILL_AREA_STYLE_COLOUR('',#819);+#927 = STYLED_ITEM('color',(#928),#633);+#928 = PRESENTATION_STYLE_ASSIGNMENT((#929));+#929 = SURFACE_STYLE_USAGE(.BOTH.,#930);+#930 = SURFACE_SIDE_STYLE('',(#931));+#931 = SURFACE_STYLE_FILL_AREA(#932);+#932 = FILL_AREA_STYLE('',(#933));+#933 = FILL_AREA_STYLE_COLOUR('',#912);+#934 = STYLED_ITEM('color',(#935),#657);+#935 = PRESENTATION_STYLE_ASSIGNMENT((#936));+#936 = SURFACE_STYLE_USAGE(.BOTH.,#937);+#937 = SURFACE_SIDE_STYLE('',(#938));+#938 = SURFACE_STYLE_FILL_AREA(#939);+#939 = FILL_AREA_STYLE('',(#940));+#940 = FILL_AREA_STYLE_COLOUR('',#819);+#941 = STYLED_ITEM('color',(#942),#674);+#942 = PRESENTATION_STYLE_ASSIGNMENT((#943));+#943 = SURFACE_STYLE_USAGE(.BOTH.,#944);+#944 = SURFACE_SIDE_STYLE('',(#945));+#945 = SURFACE_STYLE_FILL_AREA(#946);+#946 = FILL_AREA_STYLE('',(#947));+#947 = FILL_AREA_STYLE_COLOUR('',#819);+#948 = STYLED_ITEM('color',(#949),#691);+#949 = PRESENTATION_STYLE_ASSIGNMENT((#950));+#950 = SURFACE_STYLE_USAGE(.BOTH.,#951);+#951 = SURFACE_SIDE_STYLE('',(#952));+#952 = SURFACE_STYLE_FILL_AREA(#953);+#953 = FILL_AREA_STYLE('',(#954));+#954 = FILL_AREA_STYLE_COLOUR('',#819);+#955 = STYLED_ITEM('color',(#956),#708);+#956 = PRESENTATION_STYLE_ASSIGNMENT((#957));+#957 = SURFACE_STYLE_USAGE(.BOTH.,#958);+#958 = SURFACE_SIDE_STYLE('',(#959));+#959 = SURFACE_STYLE_FILL_AREA(#960);+#960 = FILL_AREA_STYLE('',(#961));+#961 = FILL_AREA_STYLE_COLOUR('',#819);+#962 = STYLED_ITEM('color',(#963),#725);+#963 = PRESENTATION_STYLE_ASSIGNMENT((#964));+#964 = SURFACE_STYLE_USAGE(.BOTH.,#965);+#965 = SURFACE_SIDE_STYLE('',(#966));+#966 = SURFACE_STYLE_FILL_AREA(#967);+#967 = FILL_AREA_STYLE('',(#968));+#968 = FILL_AREA_STYLE_COLOUR('',#819);+#969 = STYLED_ITEM('color',(#970),#742);+#970 = PRESENTATION_STYLE_ASSIGNMENT((#971));+#971 = SURFACE_STYLE_USAGE(.BOTH.,#972);+#972 = SURFACE_SIDE_STYLE('',(#973));+#973 = SURFACE_STYLE_FILL_AREA(#974);+#974 = FILL_AREA_STYLE('',(#975));+#975 = FILL_AREA_STYLE_COLOUR('',#819);+#976 = STYLED_ITEM('color',(#977),#759);+#977 = PRESENTATION_STYLE_ASSIGNMENT((#978));+#978 = SURFACE_STYLE_USAGE(.BOTH.,#979);+#979 = SURFACE_SIDE_STYLE('',(#980));+#980 = SURFACE_STYLE_FILL_AREA(#981);+#981 = FILL_AREA_STYLE('',(#982));+#982 = FILL_AREA_STYLE_COLOUR('',#819);+#983 = STYLED_ITEM('color',(#984),#776);+#984 = PRESENTATION_STYLE_ASSIGNMENT((#985));+#985 = SURFACE_STYLE_USAGE(.BOTH.,#986);+#986 = SURFACE_SIDE_STYLE('',(#987));+#987 = SURFACE_STYLE_FILL_AREA(#988);+#988 = FILL_AREA_STYLE('',(#989));+#989 = FILL_AREA_STYLE_COLOUR('',#912);+#990 = STYLED_ITEM('color',(#991),#793);+#991 = PRESENTATION_STYLE_ASSIGNMENT((#992));+#992 = SURFACE_STYLE_USAGE(.BOTH.,#993);+#993 = SURFACE_SIDE_STYLE('',(#994));+#994 = SURFACE_STYLE_FILL_AREA(#995);+#995 = FILL_AREA_STYLE('',(#996));+#996 = FILL_AREA_STYLE_COLOUR('',#912);+ENDSEC;+END-ISO-10303-21;
README.md+167−2@@ -1,3 +1,168 @@-# RC0402FR-071K33L - YAGEO+# RC0402FR-071K33L -Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)+YAGEO RC0402FR-071K33L: Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric).++::adom-verified{src="/adom/rc0402fr-071k33l/render/verification.json"}++| Field | Value |+|---|---|+| Manufacturer | YAGEO Corporation |+| Manufacturer part number | RC0402FR-071K33L |+| Type | Thick film chip resistor |+| Value | 1.33 kOhm |+| Tolerance | +/-1 % (F) |+| Voltage | 50 V max working, 100 V max overload |+| Power rating | 1/16 W (0.0625 W) at 70 C |+| Operating temperature | -55 to 155 C |+| Package | 0402 (1005 metric) |+| Datasheet | [YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025](docs/rc0402fr-071k33l-datasheet.pdf) |++## Key specifications++| Parameter | Value | Datasheet |+|---|---|---|+| Resistance | 1.33 kOhm (code 1K33), E96 value | p.2 ordering information (6) |+| Tolerance | +/-1 % (code F); the 1 % range for RC0402 is 1 Ohm to 10 MOhm (E24/E96) | p.2 (2), p.5 Table 2 |+| Rated power | 1/16 W (0.0625 W) at 70 C, standard power (reel code 07); derated linearly to 0 at 155 C | p.2 (5), p.5 Table 2, p.7 Fig. 10-1 |+| Continuous working voltage at this value | 9.1 V, from V = sqrt(P x R) with P = 0.0625 W | p.7 rated voltage formula, p.5 Table 2 |+| Max working voltage | 50 V | p.5 Table 2 |+| Max overload voltage | 100 V | p.5 Table 2 |+| Dielectric withstanding voltage | 100 V | p.5 Table 2 |+| Temperature coefficient | +/-100 ppm/C (row 10 Ohm < R <= 10 MOhm) | p.5 Table 2 |+| Operating temperature | -55 to 155 C | p.5 Table 2, p.7 |+| Technology | thick film on ceramic substrate, matte tin on nickel-barrier terminations | p.4 Construction |+| Size | L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm) | p.4 Table 1 |+| Packaging (R, 07) | 7 inch (178 mm) paper taping reel, 10000 pcs | p.2 (3) (5), p.7 Table 4 |+| Moisture sensitivity | MSL 1 | p.2 Features |++All page numbers refer to the PDF in [docs/](docs/rc0402fr-071k33l-datasheet.pdf) unless stated otherwise.++## Notes++- Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass contained in electrodes, resistor element and glass is exempted by RoHS. DigiKey lists it as ROHS3 compliant.+- The DigiKey number is the full-reel (TR) listing; DigiKey usually also offers cut tape (CT) and Digi-Reel under sibling numbers.++## Ordering++| Distributor | Part number | Stock seen 2026-10-21 |+|---|---|---|+| Mouser | [603-RC0402FR-071K33L](https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-071K33L?qs=sxZXDnvRBEiC9hRBXOP5cQ%3D%3D) | 116,581 |+| DigiKey | [311-1.33KLRTR-ND](https://www.digikey.com/en/products/detail/yageo/RC0402FR-071K33L/2827593) | 19,890 |+| LCSC / JLCPCB | [C276261](https://www.lcsc.com/product-detail/C276261.html) | 6,281 |++Stock figures are a snapshot from the Adom parts search on 2026-10-21; check the distributor before ordering.++## Manufacturer and resources++| Resource | Link |+|---|---|+| Product page | https://yageogroup.com/products/productDetail/RC0402FR-071K33L |+| Datasheet | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, [PDF](docs/rc0402fr-071k33l-datasheet.pdf) ([source](https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L)) |+| Supporting document | YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018, [PDF](docs/yageo-chip-resistors-mounting-v10.pdf) ([source](https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf)) |++## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A resistor of this kind has no polarity and no pin 1 orientation: either terminal may face either way.+The KiCad symbol is the standard resistor graphic with its pin ends at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid.++## Land pattern: KiCad footprint vs YAGEO++<table>+<tr>+<td width="104"><a href="land-pattern/README.md"><img src="land-pattern/land-pattern-icon.png" width="112" alt="Land pattern"></a><br><sub> Land pattern </sub></td>+<td>The footprint is KiCad's standard `R_0402_1005Metric`, and this guide lays its pads over the land pattern recommended by YAGEO, at true scale. It matches the maker closely. Use it to decide whether to keep the KiCad pads or shrink them to the maker's numbers before layout.<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++No manufacturer STEP for this exact part number could be fetched over plain HTTP: YAGEO's product page builds its+CAD links in the browser through a SamacSys (componentsearchengine.com) plugin, and that site answered 403 to a plain request on 2026-10-21. The page therefore uses KiCad's library model for the package, `R_0402_1005Metric.step`, with its bytes+unchanged, renamed `RC0402FR-071K33L.step`. It was checked against the datasheet table before use (next section). The GLB for the+page viewer was made from it with `step2glb convert`. YAGEO states 'No Marking' for RC0402 (Fig. 1) (searched: RC_L product specification V.14, p.3 'Marking'), so the model shows a plain body+and no part number was etched on it.++The page's 3D view shows `rc0402fr-071k33l-hero.glb`: the same package with nonphysical footprint artwork drawn just below the seating plane+(teal dashed pad outlines, the footprint's silkscreen lines and the pad numbers 1 and 2), following the adom-hero 1.4 layout.+That artwork is only for reading the page; `package-reference.glb` and the `lod/` files are the clean board-use models.++++::adom-models{src="/adom/rc0402fr-071k33l/render/models.json"}++## Model checked against the datasheet++The model was rendered in orthographic top, bottom, side and end views at true scale and laid over a drawing made at the+same scale from the printed table (nominal outline, tolerance limits, allowed terminal band). Every dimension is inside+the printed range: L 1.000 mm (datasheet 0.95 to 1.05), W 0.500 mm (datasheet 0.45 to 0.55), T/H 0.350 mm (datasheet 0.30 to 0.40), I1 (terminal on top) 0.165 mm (datasheet 0.10 to 0.30), I2 (terminal on bottom) 0.165 mm (datasheet 0.15 to 0.35). The model is Z-up, seated on z = 0, centred on the footprint origin, long axis on X.++++Source: YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.4 Table 1, RC0402: L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm).++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen; no marking) in four levels, all in the same+Z-up, metre, footprint-origin pose as the STEP. Previews are rendered from each GLB.++::adom-component-lod{src="/adom/rc0402fr-071k33l/render/lod/manifest.json"}++## Datasheet pages cited++Crops of the pages this record cites, rendered from the PDFs in `docs/` (index with page numbers and PDF hashes:+[docs/figures/figures.json](docs/figures/figures.json)).++**p.2 ordering information: global part number fields** (rc0402fr-071k33l-datasheet.pdf, page 2)++++**p.3 marking: RC0402 'No Marking' (Fig. 1)** (rc0402fr-071k33l-datasheet.pdf, page 3)++++**p.4 construction, Fig. 9 outline and Table 1 dimensions** (rc0402fr-071k33l-datasheet.pdf, page 4)++++**p.5 Table 2 electrical characteristics, RC0402 rows** (rc0402fr-071k33l-datasheet.pdf, page 5)++++**p.7 Table 4 packing, power rating, derating curve, rated voltage formula** (rc0402fr-071k33l-datasheet.pdf, page 7)++++**Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint dimensions** (yageo-chip-resistors-mounting-v10.pdf, page 4)++++## CAD files++| File | What it is |+|---|---|+| `RC0402FR-071K33L.kicad_sym` | KiCad symbol (standard resistor graphic) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields |+| `R_0402_1005Metric_RC0402FR-071K33L.kicad_mod` | KiCad footprint (KiCad library `R_0402_1005Metric`, renamed; model path `${KIPRJMOD}/RC0402FR-071K33L.step`) |+| `RC0402FR-071K33L.lbr` | Fusion / EAGLE library made from the KiCad symbol and footprint with `adom-lbr generate` (carries MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN) |+| `RC0402FR-071K33L.step` | 3D package model, STEP |+| `package-reference.glb` | 3D package model, GLB, clean (board use) |+| `rc0402fr-071k33l-hero.glb` | annotated hero GLB for the page viewer, with `rc0402fr-071k33l-hero.overlay.json` describing its artwork |+| `altium/RC0402FR-071K33L.SchLib`, `altium/RC0402FR-071K33L.PcbLib` | Altium symbol and footprint libraries (native files from `adom-lbr import-kicad` and `export-altium`), with the hub file `altium/RC0402FR-071K33L.adom-lbr.json` |+| `lod/` | board-use GLBs in four levels of detail, with previews and manifest |++## Sources and license++- YAGEO: YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025 (https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L)+- YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018 (https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf)+- KiCad libraries: [Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod](https://gitlab.com/kicad/libraries/kicad-footprints/-/blob/master/Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod), [Resistor_SMD.3dshapes/R_0402_1005Metric.step](https://gitlab.com/kicad/libraries/kicad-packages3D/-/blob/master/Resistor_SMD.3dshapes/R_0402_1005Metric.step)+- Distributor numbers: Mouser, DigiKey and JLCPCB/LCSC through the Adom parts search, 2026-10-21++Original Adom content is CC-BY-4.0. The KiCad footprint and 3D files keep their upstream license (CC-BY-SA 4.0 with the+KiCad library exception) and the PDFs remain the publishers' documents; see [LICENSE](LICENSE).+[provenance.json](provenance.json) records every source and file hash; the scripts that built the checks are in `provenance/tools/`.++This is a catalog record for the part, not a manufacturing approval: check the maker's current datasheet for your design.
R_0402_1005Metric_RC0402FR-071K33L.kicad_modadded+112@@ -0,0 +1,112 @@+(footprint "R_0402_1005Metric_RC0402FR-071K33L"+ (version 20260206)+ (generator "kicad-footprint-generator")+ (layer "F.Cu")+ (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf)")+ (tags "resistor")+ (property "Reference" "REF**"+ (at 0 -1.17 0)+ (layer "F.SilkS")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (property "Value" "R_0402_1005Metric"+ (at 0 1.17 0)+ (layer "F.Fab")+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (property "KiLib_Generator" "SMD_2terminal_chip_molded"+ (at 0 0 0)+ (layer "F.SilkS")+ (hide yes)+ (effects+ (font+ (size 1 1)+ (thickness 0.15)+ )+ )+ )+ (attr smd)+ (duplicate_pad_numbers_are_jumpers no)+ (fp_line+ (start -0.153641 -0.38)+ (end 0.153641 -0.38)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_line+ (start -0.153641 0.38)+ (end 0.153641 0.38)+ (stroke+ (width 0.12)+ (type solid)+ )+ (layer "F.SilkS")+ )+ (fp_rect+ (start -0.93 -0.47)+ (end 0.93 0.47)+ (stroke+ (width 0.05)+ (type solid)+ )+ (fill no)+ (layer "F.CrtYd")+ )+ (fp_rect+ (start -0.525 -0.27)+ (end 0.525 0.27)+ (stroke+ (width 0.1)+ (type solid)+ )+ (fill no)+ (layer "F.Fab")+ )+ (fp_text user "${REFERENCE}"+ (at 0 0 0)+ (layer "F.Fab")+ (effects+ (font+ (size 0.26 0.26)+ (thickness 0.04)+ )+ )+ )+ (pad "1" smd roundrect+ (at -0.51 0)+ (size 0.54 0.64)+ (layers "F.Cu" "F.Mask" "F.Paste")+ (roundrect_rratio 0.25)+ )+ (pad "2" smd roundrect+ (at 0.51 0)+ (size 0.54 0.64)+ (layers "F.Cu" "F.Mask" "F.Paste")+ (roundrect_rratio 0.25)+ )+ (embedded_fonts no)+ (model "${KIPRJMOD}/RC0402FR-071K33L.step"+ (offset+ (xyz 0 0 0)+ )+ (scale+ (xyz 1 1 1)+ )+ (rotate+ (xyz 0 0 0)+ )+ )+)
altium/RC0402FR-071K33L.PcbLibadded⋯ 1 unchanged line ⋯
altium/RC0402FR-071K33L.SchLibadded⋯ 1 unchanged line ⋯
altium/RC0402FR-071K33L.adom-lbr.jsonadded+219@@ -0,0 +1,219 @@+{+ "schema_version": 2,+ "mpn": "RC0402FR-071K33L",+ "manufacturer": "YAGEO",+ "package": "",+ "value": "",+ "category": "",+ "symbol": {+ "name": "RC0402FR-071K33L",+ "pins": [+ {+ "number": "1",+ "name": "",+ "x": 0,+ "y": 200,+ "length": 100,+ "rotation": 270,+ "electrical_type": "passive"+ },+ {+ "number": "2",+ "name": "",+ "x": 0,+ "y": -200,+ "length": 100,+ "rotation": 90,+ "electrical_type": "passive"+ }+ ],+ "body": null,+ "graphics": [+ {+ "kind": "rect",+ "x1": -40.0,+ "y1": -100.0,+ "x2": 40.0,+ "y2": 100.0,+ "width": 10.0,+ "filled": false,+ "fill_style": "none"+ }+ ],+ "designator_prefix": "R",+ "footprint": "R_0402_1005Metric_RC0402FR-071K33L",+ "parameters": [+ {+ "name": "Value",+ "value": "1.33k",+ "visible": true+ },+ {+ "name": "Datasheet",+ "value": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+ "visible": false+ },+ {+ "name": "Description",+ "value": "Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)",+ "visible": false+ },+ {+ "name": "MPN",+ "value": "RC0402FR-071K33L",+ "visible": false+ },+ {+ "name": "Manufacturer",+ "value": "YAGEO",+ "visible": false+ },+ {+ "name": "Mouser",+ "value": "603-RC0402FR-071K33L",+ "visible": false+ },+ {+ "name": "DigiKey",+ "value": "311-1.33KLRTR-ND",+ "visible": false+ },+ {+ "name": "LCSC",+ "value": "C276261",+ "visible": false+ },+ {+ "name": "Adom Wiki",+ "value": "https://wiki.adom.inc/adom/rc0402fr-071k33l",+ "visible": false+ },+ {+ "name": "ki_keywords",+ "value": "resistor 0402 RC0402FR-071K33L",+ "visible": false+ },+ {+ "name": "Supplier 1",+ "value": "Mouser",+ "visible": false+ },+ {+ "name": "Supplier Part Number 1",+ "value": "603-RC0402FR-071K33L",+ "visible": false+ },+ {+ "name": "Supplier 2",+ "value": "Digi-Key",+ "visible": false+ },+ {+ "name": "Supplier Part Number 2",+ "value": "311-1.33KLRTR-ND",+ "visible": false+ },+ {+ "name": "Supplier 3",+ "value": "LCSC",+ "visible": false+ },+ {+ "name": "Supplier Part Number 3",+ "value": "C276261",+ "visible": false+ },+ {+ "name": "Manufacturer Part Number",+ "value": "RC0402FR-071K33L",+ "visible": false+ }+ ],+ "pin_numbers_hidden": true,+ "pin_names_hidden": true+ },+ "footprint": {+ "name": "R_0402_1005Metric_RC0402FR-071K33L",+ "pads": [+ {+ "number": "1",+ "x_mm": -0.51,+ "y_mm": 0.0,+ "w_mm": 0.54,+ "h_mm": 0.64,+ "drill_mm": 0.0,+ "rotation": 0.0,+ "shape": "roundrect"+ },+ {+ "number": "2",+ "x_mm": 0.51,+ "y_mm": 0.0,+ "w_mm": 0.54,+ "h_mm": 0.64,+ "drill_mm": 0.0,+ "rotation": 0.0,+ "shape": "roundrect"+ }+ ],+ "graphics": [+ {+ "kind": "line",+ "layer": {+ "role": "silk"+ },+ "x1": -0.153641,+ "y1": -0.38,+ "x2": 0.153641,+ "y2": -0.38,+ "width": 0.12+ },+ {+ "kind": "line",+ "layer": {+ "role": "silk"+ },+ "x1": -0.153641,+ "y1": 0.38,+ "x2": 0.153641,+ "y2": 0.38,+ "width": 0.12+ },+ {+ "kind": "rect",+ "layer": {+ "role": "courtyard"+ },+ "x1": -0.93,+ "y1": -0.47,+ "x2": 0.93,+ "y2": 0.47,+ "width": 0.05+ },+ {+ "kind": "rect",+ "layer": {+ "role": "fab"+ },+ "x1": -0.525,+ "y1": -0.27,+ "x2": 0.525,+ "y2": 0.27,+ "width": 0.1+ }+ ]+ },+ "connect": [+ {+ "pin": "1",+ "pad": "1"+ },+ {+ "pin": "2",+ "pad": "2"+ }+ ],+ "provenance": {+ "source": "kicad_import"+ }+}
docs/figures/figures.jsonadded+80@@ -0,0 +1,80 @@+[+ {+ "file": "rc-p2-ordering.png",+ "pdf": "rc0402fr-071k33l-datasheet.pdf",+ "page": 2,+ "box_100dpi": [+ 300,+ 160,+ 770,+ 1010+ ],+ "what": "p.2 ordering information: global part number fields",+ "pdf_sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ },+ {+ "file": "rc-p3-marking.png",+ "pdf": "rc0402fr-071k33l-datasheet.pdf",+ "page": 3,+ "box_100dpi": [+ 60,+ 155,+ 770,+ 292+ ],+ "what": "p.3 marking: RC0402 'No Marking' (Fig. 1)",+ "pdf_sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ },+ {+ "file": "rc-p4-dimensions.png",+ "pdf": "rc0402fr-071k33l-datasheet.pdf",+ "page": 4,+ "box_100dpi": [+ 60,+ 150,+ 770,+ 760+ ],+ "what": "p.4 construction, Fig. 9 outline and Table 1 dimensions",+ "pdf_sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ },+ {+ "file": "rc-p5-electrical.png",+ "pdf": "rc0402fr-071k33l-datasheet.pdf",+ "page": 5,+ "box_100dpi": [+ 60,+ 160,+ 770,+ 560+ ],+ "what": "p.5 Table 2 electrical characteristics, RC0402 rows",+ "pdf_sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ },+ {+ "file": "rc-p7-packing-power.png",+ "pdf": "rc0402fr-071k33l-datasheet.pdf",+ "page": 7,+ "box_100dpi": [+ 60,+ 120,+ 770,+ 1085+ ],+ "what": "p.7 Table 4 packing, power rating, derating curve, rated voltage formula",+ "pdf_sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ },+ {+ "file": "mount-p4-land.png",+ "pdf": "yageo-chip-resistors-mounting-v10.pdf",+ "page": 4,+ "box_100dpi": [+ 60,+ 160,+ 770,+ 800+ ],+ "what": "Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint dimensions",+ "pdf_sha256": "591634ace247f61e9c6a263ca1ac98d7672fc163f5e87334c3460956f5c68b7b"+ }+]
docs/figures/mount-p4-land.pngadded⋯ 1 unchanged line ⋯
docs/figures/rc-p2-ordering.pngadded⋯ 1 unchanged line ⋯
docs/figures/rc-p3-marking.pngadded⋯ 1 unchanged line ⋯
docs/figures/rc-p4-dimensions.pngadded⋯ 1 unchanged line ⋯
docs/figures/rc-p5-electrical.pngadded⋯ 1 unchanged line ⋯
docs/figures/rc-p7-packing-power.pngadded⋯ 1 unchanged line ⋯
docs/hero.pngadded⋯ 1 unchanged line ⋯
docs/models/package-reference-step.pngadded⋯ 1 unchanged line ⋯
docs/rc0402fr-071k33l-datasheet.pdfadded⋯ 1 unchanged line ⋯
docs/verify/rc0402fr-071k33l-check.jsonadded+51@@ -0,0 +1,51 @@+{+ "step": "RC0402FR-071K33L.step",+ "bbox_mm": [+ -0.5,+ 0.5,+ -0.25,+ 0.25,+ -0.0,+ 0.35+ ],+ "checks": [+ {+ "dim": "L",+ "model_mm": 1.0,+ "datasheet_min": 0.95,+ "datasheet_max": 1.05,+ "pass": true+ },+ {+ "dim": "W",+ "model_mm": 0.5,+ "datasheet_min": 0.45,+ "datasheet_max": 0.55,+ "pass": true+ },+ {+ "dim": "T/H",+ "model_mm": 0.35,+ "datasheet_min": 0.3,+ "datasheet_max": 0.39999999999999997,+ "pass": true+ },+ {+ "dim": "I1 (terminal on top)",+ "model_mm": 0.165,+ "datasheet_min": 0.1,+ "datasheet_max": 0.3,+ "pass": true+ },+ {+ "dim": "I2 (terminal on bottom)",+ "model_mm": 0.165,+ "datasheet_min": 0.15,+ "datasheet_max": 0.35,+ "pass": true+ }+ ],+ "z_up_seated_centred": true,+ "long_axis_x": true,+ "all_pass": true+}
docs/verify/rc0402fr-071k33l-hero-preview.pngadded⋯ 1 unchanged line ⋯
docs/verify/rc0402fr-071k33l-overlay.pngadded⋯ 1 unchanged line ⋯
docs/yageo-chip-resistors-mounting-v10.pdfadded⋯ 1 unchanged line ⋯
land-pattern/README.mdadded+32@@ -0,0 +1,32 @@+# Land pattern check: RC0402FR-071K33L++The footprint on this page is KiCad's standard library footprint `Resistor_SMD:R_0402_1005Metric`, renamed to+`R_0402_1005Metric_RC0402FR-071K33L` so it can sit beside other parts in one library folder. The copper is unchanged.+This page compares those pads with the land pattern recommended by YAGEO.++++Grey is the part body at its datasheet nominal size, teal is the KiCad copper, the dashed amber outline is the maker's+land (middle of its printed range, or its printed nominal), and the amber bands show where the maker allows the inner+and outer pad edges when it prints a range.++## Numbers++| Dimension | KiCad footprint | Maker's recommendation | Difference |+|---|---|---|---|+| gap between lands | 0.48 mm | 0.50 mm | -0.02 mm |+| land length | 0.54 mm | 0.50 mm | +0.04 mm |+| land width | 0.64 mm | 0.60 mm | +0.04 mm |+| overall length | 1.56 mm | 1.50 mm | +0.06 mm |++Maker's letters: A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters).++Source: YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402.++## Result++The KiCad pads are within 0.06 mm of every YAGEO value (YAGEO prints nominal values only, with a placement accuracy of +/-0.15 mm), so the footprint matches the maker's pattern for practical purposes.++KiCad pad centres are at +/-0.51 mm, pad size 0.54 x 0.64 mm,+rounded rectangle (corner ratio 0.25). The numbers are in [land-check.json](land-check.json); the drawing is made by+`provenance/tools/landcheck.py` from the footprint file and the maker's table.
land-pattern/land-check.jsonadded+45@@ -0,0 +1,45 @@+{+ "footprint": "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod",+ "kicad_library_footprint": "R_0402_1005Metric",+ "kicad": {+ "gap": 0.48,+ "len": 0.54,+ "wid": 0.64,+ "overall": 1.56+ },+ "maker_reference": {+ "gap": 0.5,+ "len": 0.5,+ "wid": 0.6,+ "overall": 1.5+ },+ "maker_source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402",+ "maker_letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters)",+ "rows": [+ {+ "dim": "gap between lands",+ "kicad_mm": 0.48,+ "maker_nominal": 0.5,+ "difference_mm": -0.02+ },+ {+ "dim": "land length",+ "kicad_mm": 0.54,+ "maker_nominal": 0.5,+ "difference_mm": 0.04+ },+ {+ "dim": "land width",+ "kicad_mm": 0.64,+ "maker_nominal": 0.6,+ "difference_mm": 0.04+ },+ {+ "dim": "overall length",+ "kicad_mm": 1.56,+ "maker_nominal": 1.5,+ "difference_mm": 0.06+ }+ ],+ "all_within": null+}
land-pattern/land-pattern-icon.pngadded⋯ 1 unchanged line ⋯
land-pattern/land-pattern.pngadded⋯ 1 unchanged line ⋯
lod/high.glbadded⋯ 1 unchanged line ⋯
lod/high.pngadded⋯ 1 unchanged line ⋯
lod/low.glbadded⋯ 1 unchanged line ⋯
lod/low.pngadded⋯ 1 unchanged line ⋯
lod/manifest.jsonadded+178@@ -0,0 +1,178 @@+{+ "schema": "adom/component-lod@1",+ "mpn": "RC0402FR-071K33L",+ "upAxis": "Z",+ "units": "metres",+ "status": "candidate (AI-checked, not human-reviewed)",+ "purpose": "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (RC_L product specification V.14, p.3 'Marking')",+ "source": {+ "path": "RC0402FR-071K33L.step",+ "sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ },+ "sourceToDisplay": "uniform scale 0.001 (mm to m); no rotation, no translation; origin = footprint origin, seat z = 0",+ "generator": "lod.py (capencoder passives, OCCT via cadquery-ocp)",+ "removedHelpers": [],+ "levels": [+ {+ "level": "high",+ "path": "lod/high.glb",+ "sha256": "4bb01ae8eb8803282e2285231a67f74a530a630c96da2bd57bf0900bb46d0621",+ "sizeBytes": 48100,+ "decodedBufferBytes": 45432,+ "triangles": 1076,+ "primitives": 3,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ -0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.00035+ ]+ },+ "approximation": {+ "method": "OCCT BRepMesh_IncrementalMesh",+ "linearDeflectionMm": 0.0005,+ "angularDeflectionRad": 0.1+ },+ "detailVisibility": {+ "virtualMpn": false,+ "note": "no marking: the datasheet specifies none"+ },+ "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+ "preview": {+ "path": "lod/high.png",+ "sha256": "095f270774d0289aaa735f205016d58064f1f04169cfd2d97c1a1c31fee7f3e2",+ "sizeBytes": 10208,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "4bb01ae8eb8803282e2285231a67f74a530a630c96da2bd57bf0900bb46d0621"+ }+ },+ {+ "level": "medium",+ "path": "lod/medium.glb",+ "sha256": "6fc498a2cac8b122a17297169717fd8d4da4f03f0bc9a246b8d6ab99c6b6a366",+ "sizeBytes": 17180,+ "decodedBufferBytes": 14520,+ "triangles": 340,+ "primitives": 3,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ -0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.00035+ ]+ },+ "approximation": {+ "method": "OCCT BRepMesh_IncrementalMesh",+ "linearDeflectionMm": 0.004,+ "angularDeflectionRad": 0.35+ },+ "detailVisibility": {+ "virtualMpn": false,+ "note": "no marking: the datasheet specifies none"+ },+ "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+ "preview": {+ "path": "lod/medium.png",+ "sha256": "e356705c3e76db346530dcafa2fb13d357a028b36d47463ed07e7caa89f6d1d3",+ "sizeBytes": 9975,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "6fc498a2cac8b122a17297169717fd8d4da4f03f0bc9a246b8d6ab99c6b6a366"+ }+ },+ {+ "level": "low",+ "path": "lod/low.glb",+ "sha256": "707e9affdb4bbf23e2b576df1d412d63cc2744467c4a4f8d83e8ce58a0c88444",+ "sizeBytes": 10452,+ "decodedBufferBytes": 7800,+ "triangles": 180,+ "primitives": 3,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ -0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.00035+ ]+ },+ "approximation": {+ "method": "OCCT BRepMesh_IncrementalMesh",+ "linearDeflectionMm": 0.02,+ "angularDeflectionRad": 0.9+ },+ "detailVisibility": {+ "virtualMpn": false,+ "note": "no marking: the datasheet specifies none"+ },+ "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+ "preview": {+ "path": "lod/low.png",+ "sha256": "3128655e4b3ceb9eef7cf5c6c44e5a32d90d6c021e3202290a0a324d7705c82b",+ "sizeBytes": 10060,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "707e9affdb4bbf23e2b576df1d412d63cc2744467c4a4f8d83e8ce58a0c88444"+ }+ },+ {+ "level": "super-low",+ "path": "lod/super-low.glb",+ "sha256": "5fd30cfae695bd267b2707b3556a7d1d16daa62f38dbd9360f47c278780bd7e3",+ "sizeBytes": 5236,+ "decodedBufferBytes": 2592,+ "triangles": 48,+ "primitives": 3,+ "bounds": {+ "min": [+ -0.0005,+ -0.00025,+ -0.0+ ],+ "max": [+ 0.0005,+ 0.00025,+ 0.00035+ ]+ },+ "approximation": {+ "method": "per-material bounding boxes split at the part centre (terminals, body, overcoat)"+ },+ "detailVisibility": {+ "virtualMpn": false,+ "note": "no marking: the datasheet specifies none"+ },+ "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+ "preview": {+ "path": "lod/super-low.png",+ "sha256": "2b5e64c2a87d0a650c6de41268667d5885ead95db8842584d8eef99773745415",+ "sizeBytes": 7430,+ "width": 400,+ "height": 300,+ "view": "iso",+ "sourceLevelSha256": "5fd30cfae695bd267b2707b3556a7d1d16daa62f38dbd9360f47c278780bd7e3"+ }+ }+ ],+ "hints": [+ "All four levels share pose and units; super-low is boxes per material group, chosen for board overviews."+ ]+}
lod/medium.glbadded⋯ 1 unchanged line ⋯
lod/medium.pngadded⋯ 1 unchanged line ⋯
lod/super-low.glbadded⋯ 1 unchanged line ⋯
lod/super-low.pngadded⋯ 1 unchanged line ⋯
models.jsonadded+145@@ -0,0 +1,145 @@+{+ "schema": "adom/models@1",+ "part": "RC0402FR-071K33L",+ "models": [+ {+ "path": "RC0402FR-071K33L.step",+ "format": "step",+ "title": "Package model (STEP)",+ "status": "current",+ "slot": "step",+ "variant": "plain",+ "role": "derived",+ "use": [+ "board-cad"+ ],+ "marking": null,+ "unique": "The board CAD model: KiCad library package geometry (bytes unchanged), checked against the datasheet table, no marking (the part has none)",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+ "git_blob": "7f0c353f8ebaa364e1f12149ab1768d9da85f02a",+ "bytes": 40756,+ "thumb": "docs/models/package-reference-step.png"+ },+ {+ "path": "package-reference.glb",+ "format": "glb",+ "title": "Package model (GLB)",+ "status": "current",+ "slot": "model_3d_plain",+ "variant": "plain",+ "role": "derived",+ "use": [+ "render"+ ],+ "marking": null,+ "derived_from": "RC0402FR-071K33L.step",+ "unique": "The same model for the page viewer and board use (step2glb), clean: no footprint artwork",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+ "git_blob": "da98434ac21cc7113fb563af37be5c23aebe32d0",+ "bytes": 15808+ },+ {+ "path": "rc0402fr-071k33l-hero.glb",+ "format": "glb",+ "title": "Hero (annotated, page viewer)",+ "status": "current",+ "slot": "model_3d",+ "variant": "hero",+ "role": "derived",+ "use": [+ "wiki-hero"+ ],+ "marking": null,+ "derived_from": "package-reference.glb",+ "unique": "The page's 3D view: the package plus nonphysical footprint artwork (teal dashed pad outlines, silkscreen, pad numbers 1 and 2) at z = -0.02 mm. Not for boards",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception) plus artwork from R_0402_1005Metric_RC0402FR-071K33L.kicad_mod",+ "sha256": "733f94334d165046b37637a4ac6d5fea6a57640ccdd4d531b81fd7dc41850b1d",+ "git_blob": "d8cac2b03f368dc8813eed64adaa74f94304916f",+ "bytes": 51208,+ "thumb": "docs/verify/rc0402fr-071k33l-hero-preview.png"+ },+ {+ "path": "lod/high.glb",+ "format": "glb",+ "title": "Board LOD, high",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "RC0402FR-071K33L.step",+ "unique": "high detail for board and scaffold viewers: 1076 triangles, 3 primitives",+ "thumb": "lod/high.png",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "4bb01ae8eb8803282e2285231a67f74a530a630c96da2bd57bf0900bb46d0621",+ "git_blob": "a10905c8560e90c27fe3366323072886b739c3cd",+ "bytes": 48100+ },+ {+ "path": "lod/medium.glb",+ "format": "glb",+ "title": "Board LOD, medium",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "RC0402FR-071K33L.step",+ "unique": "medium detail for board and scaffold viewers: 340 triangles, 3 primitives",+ "thumb": "lod/medium.png",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "6fc498a2cac8b122a17297169717fd8d4da4f03f0bc9a246b8d6ab99c6b6a366",+ "git_blob": "7ae6d8366c1a32ec7afe8a677629a256ea93f80c",+ "bytes": 17180+ },+ {+ "path": "lod/low.glb",+ "format": "glb",+ "title": "Board LOD, low",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "RC0402FR-071K33L.step",+ "unique": "low detail for board and scaffold viewers: 180 triangles, 3 primitives",+ "thumb": "lod/low.png",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "707e9affdb4bbf23e2b576df1d412d63cc2744467c4a4f8d83e8ce58a0c88444",+ "git_blob": "ad0932a0d091cced2ad06a29da6eff787c3cc347",+ "bytes": 10452+ },+ {+ "path": "lod/super-low.glb",+ "format": "glb",+ "title": "Board LOD, super-low",+ "status": "current",+ "variant": "lod",+ "role": "derived",+ "use": [+ "board-insertion",+ "render"+ ],+ "marking": null,+ "derived_from": "RC0402FR-071K33L.step",+ "unique": "super-low detail for board and scaffold viewers: 48 triangles, 3 primitives",+ "thumb": "lod/super-low.png",+ "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "sha256": "5fd30cfae695bd267b2707b3556a7d1d16daa62f38dbd9360f47c278780bd7e3",+ "git_blob": "5fad1cf2f02c2bc4583e7698ff3747d24b04c878",+ "bytes": 5236+ }+ ],+ "updated": "2026-10-21"+}
package-reference.glbadded⋯ 1 unchanged line ⋯
package.jsonadded+10@@ -0,0 +1,10 @@+{+ "name": "rc0402fr-071k33l",+ "title": "RC0402FR-071K33L - YAGEO",+ "version": "0.1.0",+ "description": "Thick film chip resistor 1.33 kOhm +/-1 %, 1/16 W, 0402 (1005 metric)",+ "type": "hardware",+ "kind": "component",+ "license": "CC-BY-4.0",+ "files": []+}
provenance.jsonadded+196@@ -0,0 +1,196 @@+{+ "manufacturer_reference": "https://yageogroup.com/products/productDetail/RC0402FR-071K33L",+ "symbol_source": "Original, written for this page (standard resistor graphic, non-polar). CC-BY-4.0.",+ "footprint_source": "KiCad standard library Resistor_SMD:R_0402_1005Metric (CC-BY-SA 4.0 with the KiCad library exception); renamed R_0402_1005Metric -> R_0402_1005Metric_RC0402FR-071K33L, model path set to ${KIPRJMOD}/RC0402FR-071K33L.step; copper unchanged",+ "footprint_upstream_sha256": "e05c7605248c220836f642ed1f526133edf0374acdfd5bb2631e58b4e377acfb",+ "footprint_upstream_url": "https://gitlab.com/kicad/libraries/kicad-footprints/-/raw/master/Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod",+ "package_source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "package_upstream_url": "https://gitlab.com/kicad/libraries/kicad-packages3D/-/raw/master/Resistor_SMD.3dshapes/R_0402_1005Metric.step",+ "package_bytes_unchanged": true,+ "manufacturer_step": {+ "found": false,+ "searched": "2026-10-21",+ "note": "YAGEO publishes CAD through interactive product pages; no direct STEP download for RC0402FR-071K33L was reachable without a browser session, so KiCad's library model was used and checked against the datasheet."+ },+ "geometry_status": "KiCad library package geometry, every printed dimension checked against the datasheet (docs/verify). Not manufacturer-issued CAD.",+ "frame": {+ "units": "mm (STEP), metres (GLB)",+ "up_axis": "Z",+ "seat_z": 0,+ "origin": "footprint origin",+ "transform": "none"+ },+ "glb": {+ "tool": "step2glb convert",+ "exit": 0,+ "stderr_tail": "Large file queued for async conversion (job 2efe4d285ae3a1b6). Polling...\nJob 2efe4d285ae3a1b6 complete (0s). Downloading GLB...\n"+ },+ "hero": {+ "tool": "step2glb thumbnail --width 800 --height 600 (iso)",+ "path": "docs/hero.png"+ },+ "hero_glb": {+ "file": "rc0402fr-071k33l-hero.glb",+ "tool": "provenance/tools/hero.py (independent implementation of adom-hero 1.4; adom/component-hero's generator was not run)",+ "source_glb": "package-reference.glb",+ "footprint": "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod",+ "glyphs": "provenance/tools/hero_glyphs.json (data from adom/component-hero)",+ "align": {+ "ok": true,+ "centre_offset_mm": 0.0,+ "tolerance_mm": 0.25,+ "orientation_flipped": false,+ "contacts_bbox_mm": [+ -0.4825,+ 0.4825,+ -0.25,+ 0.25+ ],+ "pads_bbox_mm": [+ -0.78,+ 0.78,+ -0.32,+ 0.32+ ],+ "seating_z_mm": -0.0+ },+ "sidecar": "rc0402fr-071k33l-hero.overlay.json"+ },+ "altium": {+ "files": [+ "altium/RC0402FR-071K33L.SchLib",+ "altium/RC0402FR-071K33L.PcbLib",+ "altium/RC0402FR-071K33L.adom-lbr.json"+ ],+ "tool": "adom-lbr import-kicad --sym --fp --mpn, then adom-lbr export-altium",+ "log_tail": "/rc0402fr-071k33l/RC0402FR-071K33L.lbr (2 pins, 6908 bytes)\nHINT: Lint PASSED with 0 error(s), 0 warning(s)\nOK: Lint passed with 0 error(s), 0 warning(s)\n{\n \"passed\": true,\n \"errors\": [],\n \"warnings\": []\n}\nLINT_OK\nHINT: identity complete (MPN, Manufacturer, Datasheet, Description, Mouser, DigiKey, LCSC, Adom Wiki) - they become Altium parameters + Supplier links and EAGLE attributes.\nOK: wrote /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.adom-lbr.json (adom-lbr JSON \u2014 the canonical hub)\nHint: verified /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.adom-lbr.json (4461 bytes, sha256 5b20bc443f210be592842cbd24f3029fddd858826f7c68fbe66185b3e2bd234d, read back identical)\nHint: convert it with `adom-lbr export-altium /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.adom-lbr.json` or `export-intlib`.\nOK: wrote /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.SchLib (2 pins) + /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.PcbLib (2 pads)\nHint: verified /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.SchLib (24576 bytes, sha256 69af2d2eda79aa9735696bba69fcc77e7748657bf446986576b5492a1ab23e24, read back identical)\nHint: verified /tmp/claude-1001/rc0402esc/pages/rc0402fr-071k33l/altium/RC0402FR-071K33L.PcbLib (126976 bytes, sha256 d1033c38303bbfb7d9d9d155e53ea28003e90bd882cec9c2e7ea9a4f67f3f806, read back identical)\nALTIUM_OK\n"+ },+ "datasheet_figures": {+ "index": "docs/figures/figures.json",+ "tool": "provenance/tools/figures.py (pdftoppm 150 dpi, PIL crop)"+ },+ "fusion_lbr": {+ "file": "RC0402FR-071K33L.lbr",+ "tool": "adom-lbr generate --sym --fp --part-metadata page.json",+ "lint": "passed"+ },+ "datasheet": {+ "file": "docs/rc0402fr-071k33l-datasheet.pdf",+ "sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb",+ "url": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+ "title": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+ "retrieved": "2026-10-21"+ },+ "supporting_documents": [+ {+ "file": "docs/yageo-chip-resistors-mounting-v10.pdf",+ "sha256": "591634ace247f61e9c6a263ca1ac98d7672fc163f5e87334c3460956f5c68b7b",+ "url": "https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf",+ "title": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018",+ "retrieved": "2026-10-21"+ }+ ],+ "datasheet_check": {+ "overlay": "docs/verify/rc0402fr-071k33l-overlay.png",+ "numbers": "docs/verify/rc0402fr-071k33l-check.json",+ "tools": "provenance/tools/ (ortho.py, overlay_chip.py, spec json)",+ "result": "PASS"+ },+ "land_pattern_check": {+ "readme": "land-pattern/README.md",+ "numbers": "land-pattern/land-check.json",+ "source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402",+ "result": "matches"+ },+ "marking": {+ "real_marking": null,+ "statement": "YAGEO states 'No Marking' for RC0402 (Fig. 1)",+ "source": "RC_L product specification V.14, p.3 'Marking'"+ },+ "distributors": {+ "tool": "adom-parts-search search RC0402FR-071K33L",+ "date": "2026-10-21",+ "mouser": {+ "part": "603-RC0402FR-071K33L",+ "url": "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-071K33L?qs=sxZXDnvRBEiC9hRBXOP5cQ%3D%3D",+ "stock": 116581+ },+ "digikey": {+ "part": "311-1.33KLRTR-ND",+ "url": "https://www.digikey.com/en/products/detail/yageo/RC0402FR-071K33L/2827593",+ "stock": 19890+ },+ "lcsc": {+ "part": "C276261",+ "url": "https://www.lcsc.com/product-detail/C276261.html",+ "stock": 6281+ }+ },+ "lod": {+ "manifest": "lod/manifest.json",+ "generator": "provenance/tools/lod.py",+ "source_sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ },+ "tools_note": "lod.py, ortho.py and overlay_chip.py come from the GRM155R71C104KA88D component page (overlay_chip.py extended for min/max ranges). build.py, parts.py, landcheck.py, records.py, figures.py, hero.py and finish.sh built this page; they are the same scripts as adom/rc0402fr-074k7l plus the hero, figure and Altium steps.",+ "files": {+ "RC0402FR-071K33L.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+ "verification.json": "7bf2b69f75f5cda710102cde8db5660b02030df610f1c48c6cafd86d776ec9be",+ "RC0402FR-071K33L.lbr": "5136f772c0d969e187d901002d60a00fecb2f71db35fae05c51385fcdd8dd75e",+ "rc0402fr-071k33l-hero.overlay.json": "17298e976b80913c3941ea8e91d879539f9740d4cabb1eb1398c3d63893a1f49",+ "package-reference.glb": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+ "package.json": "9001b4d47724928b906cb47de2598c713f789d46b8352b1af071779fd3e74938",+ "RC0402FR-071K33L.kicad_sym": "dec34ea1cb9dda8d3ac62d24e525a9e8ddc5e670ec1bd76c02ca9182e3576821",+ "models.json": "7a99bb41422fd95f6f5b1c65de871e04b7bffdad06ea25047b02d5bb88eccd42",+ "rc0402fr-071k33l-hero.glb": "733f94334d165046b37637a4ac6d5fea6a57640ccdd4d531b81fd7dc41850b1d",+ "LICENSE": "f15aca45b249f66e1849307bbfc6c7de5dbcb968b649056ac1acf0be3f892ec1",+ "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4",+ "page.json": "44f44cc2b3ca4577dc79dab021541fdaf501ea48238a8cb505018885ee4b6c62",+ "README.md": "45745a4dde6cf0a3ef9c25ca84fdb39b6fadb7ae4fe7ccaae10fbe5a004fbeb5",+ "provenance/tools/figures.py": "5ce9ccf82cd932c238fdb2ad3ea33cc45d92ad348b5b7465dec87fb0abaa9bbb",+ "provenance/tools/parts.py": "fdd39614e9221e7a7272d163f7368d5dfd9a809c3fdd4ee09ce92eaaeeea1762",+ "provenance/tools/rc0402fr-071k33l-overlay-spec.json": "b60068a46df0a9ae9bb45093ff36c3bb0f326fbb68c407b2d28f6742c15717ba",+ "provenance/tools/hero_glyphs.json": "da37b40cd710f17a5c78b5fdfbba529c052519dfee3b7774c1de99a0da1a3242",+ "provenance/tools/records.py": "c1a0936498374d99a4ffaa3cee538e949ead54f60efafe841f03aa5ebc383598",+ "provenance/tools/landcheck.py": "a6141dcaa4992652e0caf3a7fdd51dcf8451fd630b7de7b873d1b910ae4a1d41",+ "provenance/tools/overlay_chip.py": "52617a63c9504e020e574ec63f39f518734032fcda7b14ad158e3f8907b31723",+ "provenance/tools/ortho.py": "c5a44e74fa447e1ece13190840c90d453cbb004f6c4608efb6e8cdb1ba2cbb6d",+ "provenance/tools/finish.sh": "92c68f529e64825c14be4320daea11db148b8ef6ce8ac1050938ede83488fd98",+ "provenance/tools/lod.py": "fc3eb9db56947d002d1dda328a6ee53032eae39f700521d00d18477f9915135c",+ "provenance/tools/push.sh": "da2b13bef5ca22ff4c931a767e455d528effcfaa9ffc5b071eba8db174d0ea25",+ "provenance/tools/hero.py": "ccd25e8b9a77ea6a5e040116a86d158e2c1b68589163d1693eafae8a7f35179a",+ "provenance/tools/build.py": "b07d14299760f193dccefa3d29982bacb737137f6719712e23073b936f770b0b",+ "lod/low.png": "3128655e4b3ceb9eef7cf5c6c44e5a32d90d6c021e3202290a0a324d7705c82b",+ "lod/super-low.png": "2b5e64c2a87d0a650c6de41268667d5885ead95db8842584d8eef99773745415",+ "lod/low.glb": "707e9affdb4bbf23e2b576df1d412d63cc2744467c4a4f8d83e8ce58a0c88444",+ "lod/high.png": "095f270774d0289aaa735f205016d58064f1f04169cfd2d97c1a1c31fee7f3e2",+ "lod/manifest.json": "2491b9c746524a07a96a5734fc5d6b390f1c62a3d2f3d6d1be0b45771a0121ef",+ "lod/super-low.glb": "5fd30cfae695bd267b2707b3556a7d1d16daa62f38dbd9360f47c278780bd7e3",+ "lod/medium.glb": "6fc498a2cac8b122a17297169717fd8d4da4f03f0bc9a246b8d6ab99c6b6a366",+ "lod/high.glb": "4bb01ae8eb8803282e2285231a67f74a530a630c96da2bd57bf0900bb46d0621",+ "lod/medium.png": "e356705c3e76db346530dcafa2fb13d357a028b36d47463ed07e7caa89f6d1d3",+ "docs/rc0402fr-071k33l-datasheet.pdf": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb",+ "docs/yageo-chip-resistors-mounting-v10.pdf": "591634ace247f61e9c6a263ca1ac98d7672fc163f5e87334c3460956f5c68b7b",+ "docs/hero.png": "7c39fa79472f486ebad40855f8c1a2487799594730165d121cbd540b82f4f67a",+ "docs/models/package-reference-step.png": "aa00bd27011a835eaf7b224d87bb73bbaea48c7cd7a74bd3db28bf99701e9f1a",+ "docs/verify/rc0402fr-071k33l-hero-preview.png": "6c6bfc95567f4a636f77be2a77ca5c1376112834b66d89462e0789962fdcc3ca",+ "docs/verify/rc0402fr-071k33l-check.json": "6530845b2fd3b56956c5ac3341b7f706144f506c36bb41668d709eae7b0a0c4f",+ "docs/verify/rc0402fr-071k33l-overlay.png": "a833b69cc4465bdf8a1933bf56df31eccb9e0b9e731e8e488e19e48af573d8d3",+ "docs/figures/mount-p4-land.png": "050e0445c4bf0bb552179e0e420675a23594806a31db72d8ddcf84d28d908cc6",+ "docs/figures/rc-p3-marking.png": "9c64c26c18edec1af06b6c6046a5616ce597b2bc94afd13e9a9a12a4123a58fa",+ "docs/figures/rc-p2-ordering.png": "cd0a6a5b28dd51571a3c6566c7db2ddbe035cd6ffc49628d0e2ec77fd4fe1d3e",+ "docs/figures/rc-p5-electrical.png": "16b739b6903c2a86d90d18dc6e1a50508573702ef55f06644b060be4b47671f7",+ "docs/figures/rc-p7-packing-power.png": "4c9d71868624912824638394d084375b22509c25fe4ffab4518fd1e4f544bec8",+ "docs/figures/figures.json": "1ef3a5672795409244bccc1007b81f90db6b19f531b1b26809c4b5f87c846779",+ "docs/figures/rc-p4-dimensions.png": "e9eb4a02cf65822fbcfeac3623075f31b50664dc701603df189ecf798dcc14a1",+ "land-pattern/land-check.json": "19ccc87a4b0b5cc1cfb3c63fe12538de80c9e0fcbaa3470e6918692c88abbec2",+ "land-pattern/land-pattern-icon.png": "255beb3065f724af41332fcc126d4c20ed52f6ebbe76aee1942f4362ed6edabe",+ "land-pattern/land-pattern.png": "064cba352201b5e65bbdd3949a29e25b5f38d0b6568eb3185d6627375ba15128",+ "land-pattern/README.md": "f811858e1a84f79a18d4b3a2528167a9be9976d23fc0363c8620eb0e5695f977",+ "altium/RC0402FR-071K33L.adom-lbr.json": "5b20bc443f210be592842cbd24f3029fddd858826f7c68fbe66185b3e2bd234d",+ "altium/RC0402FR-071K33L.SchLib": "69af2d2eda79aa9735696bba69fcc77e7748657bf446986576b5492a1ab23e24",+ "altium/RC0402FR-071K33L.PcbLib": "d1033c38303bbfb7d9d9d155e53ea28003e90bd882cec9c2e7ea9a4f67f3f806"+ },+ "files_note": "provenance.json itself is not listed.",+ "built_by": "Claude (AI agent) for John Lauer",+ "date": "2026-10-21"+}
provenance/tools/build.pyadded+162@@ -0,0 +1,162 @@+"""Build one component page tree per part in parts.PARTS.++usage: build.py <slug> [--skip-remote]+Writes /tmp/claude-1001/rc0402esc/pages/<slug>/ . Downloads are read from+/tmp/claude-1001/rc0402esc/dl (never executed); scripts live in this folder.+"""+import sys, os, json, shutil, subprocess, hashlib, re+import numpy as np+from PIL import Image, ImageDraw, ImageFont++ROOT = "/tmp/claude-1001/rc0402esc"+TOOLS = os.path.join(ROOT, "tools")+DL = os.path.join(ROOT, "dl")+PY = "/home/adom/.venvs/cq/bin/python"+sys.path.insert(0, TOOLS)+from parts import PARTS, TODAY++slug = sys.argv[1]+P = next(p for p in PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug)+os.makedirs(OUT, exist_ok=True)+MPN = P["mpn"]+sha = lambda f: hashlib.sha256(open(f, "rb").read()).hexdigest()+def gitblob(f):+ b = open(f, "rb").read()+ return hashlib.sha1(b"blob %d\0" % len(b) + b).hexdigest()+def run(cmd, **kw):+ r = subprocess.run(cmd, capture_output=True, text=True, **kw)+ if r.returncode != 0:+ print("FAILED", cmd, r.stdout[-2000:], r.stderr[-2000:]); sys.exit(1)+ return r+F = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"+FB = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"++for d in ("docs/verify", "docs/models", "docs/figures", "lod", "provenance/tools", "land-pattern", "altium"):+ os.makedirs(os.path.join(OUT, d), exist_ok=True)++# ---------- STEP (KiCad library bytes, unchanged) ----------+src_step = os.path.join(DL, "kicad", P["fp"] + ".step")+step_name = f"{MPN}.step"+step_path = os.path.join(OUT, step_name)+shutil.copyfile(src_step, step_path)+assert sha(step_path) == sha(src_step)++# ---------- footprint (KiCad library geometry, renamed + local model path) ----------+fp_name = f"{P['fp']}_{MPN}"+src_fp = open(os.path.join(DL, "kicad", P["fp"] + ".kicad_mod")).read()+fp = src_fp.replace(f'(footprint "{P["fp"]}"', f'(footprint "{fp_name}"', 1)+fp = re.sub(r'\(model "[^"]+"', f'(model "${{KIPRJMOD}}/{step_name}"', fp)+assert fp.count(fp_name) == 1 and "${KIPRJMOD}/" + step_name in fp+fp_file = f"{fp_name}.kicad_mod"+open(os.path.join(OUT, fp_file), "w").write(fp)+pads = [(float(a), float(b), float(c), float(d)) for a, b, c, d in+ re.findall(r'\(pad "\d" smd roundrect\s*\(at ([-\d.]+) ([-\d.]+)\)\s*\(size ([\d.]+) ([\d.]+)\)', fp)]+assert len(pads) == 2, pads++# ---------- symbol (original, conventional passive graphics) ----------+d = P["dist"]+def prop(name, val, y, hide=True):+ h = " hide" if hide else ""+ return f' (property "{name}" "{val}" (at 0 {y} 0) (effects (font (size 1.27 1.27)){h}))\n'+ref = P["kind"]+desc = P["brief"]+props = (prop("Reference", ref, 0 if False else 0, False).replace("(at 0 0 0)", "(at 2.54 1.27 0)").replace("(font (size 1.27 1.27))", "(font (size 1.27 1.27)) (justify left)")+ + prop("Value", P["value_sym"], 0, False).replace("(at 0 0 0)", "(at 2.54 -1.27 0)").replace("(font (size 1.27 1.27))", "(font (size 1.27 1.27)) (justify left)")+ + prop("Footprint", fp_name, -7.62) + prop("Datasheet", P["ds"]["url"], -10.16) + prop("Description", desc, -12.7)+ + prop("MPN", MPN, -15.24) + prop("Manufacturer", P["mfr"], -17.78)+ + prop("Mouser", d["mouser"][0], -20.32) + prop("DigiKey", d["digikey"][0], -22.86) + prop("LCSC", d["lcsc"][0] if d["lcsc"] else "", -25.4) + prop("Adom Wiki", f"https://wiki.adom.inc/adom/{slug}", -27.94))+if ref == "C":+ body = (' (polyline (pts (xy -2.032 -0.762) (xy 2.032 -0.762)) (stroke (width 0.508) (type default)) (fill (type none)))\n'+ ' (polyline (pts (xy -2.032 0.762) (xy 2.032 0.762)) (stroke (width 0.508) (type default)) (fill (type none)))\n')+ plen = 2.794+else:+ body = ' (rectangle (start -1.016 -2.54) (end 1.016 2.54) (stroke (width 0.254) (type default)) (fill (type none)))\n'+ plen = 2.54+PY_ = 5.08 if ref == "R" else 3.81 # resistor pin ends on the 2.54 mm grid+sym = f'''(kicad_symbol_lib (version 20241209) (generator "adom_passive_symbol")+ (symbol "{MPN}" (pin_numbers (hide yes)) (pin_names (offset 0.254) (hide yes)) (exclude_from_sim no) (in_bom yes) (on_board yes)+{props} (property "ki_keywords" "{P['category'].lower()} {P['package'].split()[0]} {MPN}" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))+ (symbol "{MPN}_0_1"+{body} )+ (symbol "{MPN}_1_1"+ (pin passive line (at 0 {PY_} 270) (length {plen}) (name "~" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27)))))+ (pin passive line (at 0 -{PY_} 90) (length {plen}) (name "~" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27)))))+ )+ )+)+'''+sym_file = f"{MPN}.kicad_sym"+open(os.path.join(OUT, sym_file), "w").write(sym)++# ---------- datasheets ----------+shutil.copyfile(os.path.join(DL, P["ds"]["local"]), os.path.join(OUT, P["ds"]["file"]))+for x in P["extra_docs"]:+ shutil.copyfile(os.path.join(DL, x["local"]), os.path.join(OUT, x["file"]))++# ---------- tools copied into provenance ----------+for t in ("lod.py", "ortho.py", "overlay_chip.py", "build.py", "parts.py", "landcheck.py", "hero.py", "records.py", "figures.py", "finish.sh", "push.sh"):+ if os.path.exists(os.path.join(TOOLS, t)):+ shutil.copyfile(os.path.join(TOOLS, t), os.path.join(OUT, "provenance/tools", t))++# ---------- overlay proof against the datasheet table ----------+ov = dict(P["overlay"])+crop_png, box = ov.pop("crop")+spec = {"label": MPN, "mpn": MPN, **ov, "crops": [[os.path.join(ROOT, "work/crops", crop_png), box]],+ "marking": "none specified (" + P["marking_src"] + ")"}+spec_path = os.path.join(OUT, f"provenance/tools/{slug}-overlay-spec.json")+spec_pub = dict(spec); spec_pub["crops"] = [[f"datasheet page render ({crop_png}, 100 dpi)", box]]+json.dump(spec_pub, open(spec_path, "w"), indent=1)+tmp_spec = os.path.join(ROOT, "work", f"{slug}-spec.json"); json.dump(spec, open(tmp_spec, "w"))+r = run([PY, "-I", os.path.join(TOOLS, "overlay_chip.py"), tmp_spec, step_path, os.path.join(OUT, f"docs/verify/{slug}-overlay.png")], cwd=TOOLS)+check = json.loads(r.stdout.strip().splitlines()[-1]); check["step"] = step_name+json.dump(check, open(os.path.join(OUT, f"docs/verify/{slug}-check.json"), "w"), indent=1)+print("overlay all_pass:", check["all_pass"])+if not check["all_pass"]:+ print(json.dumps(check, indent=1)); sys.exit(2)++# ---------- land pattern comparison (KiCad pads vs maker's recommendation) ----------+r = run([PY, "-I", os.path.join(TOOLS, "landcheck.py"), slug, os.path.join(OUT, "land-pattern")], cwd=TOOLS)+land = json.loads(r.stdout.strip().splitlines()[-1])+json.dump(land, open(os.path.join(OUT, "land-pattern/land-check.json"), "w"), indent=1)++# ---------- GLB (step2glb) ----------+glb_path = os.path.join(OUT, "package-reference.glb")+g = subprocess.run(["step2glb", "convert", step_path, "-o", glb_path], capture_output=True, text=True)+print("step2glb exit", g.returncode, g.stderr[-300:])+assert g.returncode == 0 and os.path.getsize(glb_path) > 1000++# ---------- thumbnails (service render of the STEP) ----------+def thumb(out, wh=None):+ extra = ["--width", str(wh[0]), "--height", str(wh[1])] if wh else []+ t = subprocess.run(["step2glb", "thumbnail", step_path, "-o", out] + extra, capture_output=True, text=True)+ return t.returncode, (t.stdout + t.stderr)[-300:]+hero_rc = thumb(os.path.join(OUT, "docs/hero.png"), (800, 600))+th_rc = thumb(os.path.join(OUT, "docs/models/package-reference-step.png"))+print("thumbs", hero_rc, th_rc)++# ---------- LODs ----------+run([PY, "-I", os.path.join(TOOLS, "lod.py"), step_path, MPN, OUT, step_name], cwd=TOOLS)+man = json.load(open(os.path.join(OUT, "lod/manifest.json")))+man["source"]["path"] = step_name+man["purpose"] = "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (" + P["marking_src"] + ")"+for lv in man["levels"]:+ lv["detailVisibility"]["note"] = "no marking: the datasheet specifies none"+json.dump(man, open(os.path.join(OUT, "lod/manifest.json"), "w"), indent=1)++# ---------- cited datasheet figure crops ----------+run([PY, "-I", os.path.join(TOOLS, "figures.py"), os.path.join(OUT, P["ds"]["file"]), os.path.join(OUT, P["extra_docs"][0]["file"]), os.path.join(OUT, "docs/figures")], cwd=TOOLS)++# ---------- hero GLB (adom-hero 1.4 layers over the clean GLB) ----------+pins_json = os.path.join(ROOT, "work", f"{slug}-pins.json")+json.dump({"component": {"mpn": MPN, "pins": [{"number": "1", "name": "~"}, {"number": "2", "name": "~"}]}}, open(pins_json, "w"))+hr = run([PY, "-I", os.path.join(TOOLS, "hero.py"), glb_path, os.path.join(OUT, fp_file), pins_json,+ os.path.join(TOOLS, "data/hero_glyphs.json"), os.path.join(OUT, f"{slug}-hero.glb"),+ "--png", os.path.join(OUT, "docs/verify", f"{slug}-hero-preview.png")], cwd=TOOLS)+print(hr.stdout.strip())+shutil.copyfile(os.path.join(TOOLS, "data/hero_glyphs.json"), os.path.join(OUT, "provenance/tools/hero_glyphs.json"))++json.dump({"hero": hr.stdout.strip(), "step": step_name, "fp": fp_file, "sym": sym_file, "check": check, "land": land,+ "hero_rc": hero_rc, "thumb_rc": th_rc, "glb_stderr": g.stderr[-300:]},+ open(os.path.join(ROOT, "work", f"{slug}-build.json"), "w"), indent=1)+print("built", OUT)
provenance/tools/figures.pyadded+28@@ -0,0 +1,28 @@+"""Render the datasheet pages this page cites and crop the cited figures/tables.++usage: figures.py <rc-datasheet.pdf> <mounting.pdf> <outdir>+Boxes are in 100 dpi page pixels; pages are rendered at 150 dpi with pdftoppm.+"""+import sys, os, subprocess, tempfile, json, hashlib+from PIL import Image+ds, mount, out = sys.argv[1:4]+os.makedirs(out, exist_ok=True)+CROPS = [+ (ds, 2, (300, 160, 770, 1010), "rc-p2-ordering.png", "p.2 ordering information: global part number fields"),+ (ds, 3, (60, 155, 770, 292), "rc-p3-marking.png", "p.3 marking: RC0402 'No Marking' (Fig. 1)"),+ (ds, 4, (60, 150, 770, 760), "rc-p4-dimensions.png", "p.4 construction, Fig. 9 outline and Table 1 dimensions"),+ (ds, 5, (60, 160, 770, 560), "rc-p5-electrical.png", "p.5 Table 2 electrical characteristics, RC0402 rows"),+ (ds, 7, (60, 120, 770, 1085), "rc-p7-packing-power.png", "p.7 Table 4 packing, power rating, derating curve, rated voltage formula"),+ (mount, 4, (60, 160, 770, 800), "mount-p4-land.png", "Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint dimensions"),+]+idx = []+with tempfile.TemporaryDirectory() as td:+ for pdf, pg, box, name, what in CROPS:+ base = os.path.join(td, f"p{pg}-{os.path.basename(pdf)}")+ subprocess.run(["pdftoppm", "-r", "150", "-png", "-f", str(pg), "-l", str(pg), "-singlefile", pdf, base], check=True)+ im = Image.open(base + ".png").convert("RGB")+ im.crop(tuple(int(v * 1.5) for v in box)).save(os.path.join(out, name), optimize=True)+ idx.append({"file": name, "pdf": os.path.basename(pdf), "page": pg, "box_100dpi": box, "what": what,+ "pdf_sha256": hashlib.sha256(open(pdf, "rb").read()).hexdigest()})+json.dump(idx, open(os.path.join(out, "figures.json"), "w"), indent=1)+print("figures", len(idx))
provenance/tools/finish.shadded+19@@ -0,0 +1,19 @@+#!/usr/bin/env bash+# usage: finish.sh <slug> : records, Fusion .lbr, Altium libraries, then records again (hashes)+set -eu+ROOT=/tmp/claude-1001/rc0402esc; slug="$1"; OUT="$ROOT/pages/$slug"; PY=/home/adom/.venvs/cq/bin/python+LOG="$ROOT/work/$slug-lbr.log"; : > "$LOG"+cd "$ROOT/tools"+$PY -I records.py "$slug"+MPN=$(python3 -c "import json;print(json.load(open('$OUT/page.json'))['component']['mpn'])")+SYM="$OUT/$MPN.kicad_sym"; FP=$(ls "$OUT"/*.kicad_mod)+adom-lbr generate --sym "$SYM" --fp "$FP" --symbol-layout keep --part-metadata "$OUT/page.json" -o "$OUT/$MPN.lbr" >>"$LOG" 2>&1+adom-lbr lint "$OUT/$MPN.lbr" >>"$LOG" 2>&1 && grep -q '"passed": *true' "$LOG" && echo LINT_OK >>"$LOG"+mkdir -p "$OUT/altium"; cd "$OUT/altium"+cp "$OUT/$MPN.step" "$OUT/altium/$MPN.step"+adom-lbr import-kicad --sym "$SYM" --fp "$FP" --mpn "$MPN" --out "$OUT/altium/$MPN.adom-lbr.json" >>"$LOG" 2>&1+adom-lbr export-altium "$OUT/altium/$MPN.adom-lbr.json" --out-dir "$OUT/altium" >>"$LOG" 2>&1+rm -f "$OUT/altium/$MPN.step"+[ -s "$OUT/altium/$MPN.SchLib" ] && [ -s "$OUT/altium/$MPN.PcbLib" ] && echo ALTIUM_OK >>"$LOG"+cd "$ROOT/tools"; $PY -I records.py "$slug"+cat "$LOG"
provenance/tools/hero.pyadded+341@@ -0,0 +1,341 @@+"""Build an annotated hero GLB (adom-hero 1.4 layout) for a two-terminal chip page.++usage: hero.py <board-use.glb> <footprint.kicad_mod> <page.json> <glyphs.json> <out-hero.glb> [--png preview.png]++Written for this page set (an independent implementation of the published+adom-hero 1.4 rules on adom/component-hero; that page's generator was not run).+The physical model is copied unchanged; three nonphysical layers are added under+one root node "Adom reference artwork (nonphysical)" at z = -0.02 mm:+teal dashed pad outlines (alpha 0.5), silkscreen (alpha 0.3), pad labels (alpha 0.5).+glyphs.json is the pre-triangulated DejaVu Sans Mono table published with the+standard (pure data). Prints one OK/FAIL line and writes <out>.overlay.json.+"""+import sys, os, re, json, math, hashlib, struct+import numpy as np+import pygltflib+from pygltflib import GLTF2, Node, Mesh, Primitive, Attributes, Accessor, BufferView, Material, PbrMetallicRoughness++args = sys.argv[1:]+png = None+if "--png" in args:+ i = args.index("--png"); png = args[i + 1]; del args[i:i + 2]+glb_in, fp_path, page_path, glyph_path, out = args+ZMM = -0.02+ROOT_NAME = "Adom reference artwork (nonphysical)"+N_PAD = "Footprint pads - teal dashed outlines - 50 percent opacity"+N_SILK = "Silkscreen reference lines - 30 percent opacity"+N_LAB = "Signal names - 50 percent opacity"+RGBA = {N_PAD: [0, 0.902, 0.863, 0.5], N_SILK: [0.92, 0.96, 1.0, 0.3], N_LAB: [0.92, 0.96, 1.0, 0.5]}+clamp = lambda v, a, b: max(a, min(b, v))+sha = lambda f: hashlib.sha256(open(f, "rb").read()).hexdigest()++# ---------------- footprint ----------------+fp = open(fp_path).read()+pads = []+for m in re.finditer(r'\(pad "([^"]+)" smd (roundrect|rect)\s*\(at ([-\d.]+) ([-\d.]+)(?: ([-\d.]+))?\)\s*\(size ([\d.]+) ([\d.]+)\)(.*?)\n\t\)', fp, re.S):+ num, shape, x, y, rot, w, h, rest = m.groups()+ rr = re.search(r"roundrect_rratio ([\d.]+)", rest)+ pads.append({"number": num, "shape": shape, "center_mm": [float(x), float(y)], "size_mm": [float(w), float(h)],+ "rotation_deg": float(rot or 0), "rratio": float(rr.group(1)) if rr else 0.0})+silk = []+for m in re.finditer(r'\(fp_line\s*\(start ([-\d.]+) ([-\d.]+)\)\s*\(end ([-\d.]+) ([-\d.]+)\)\s*\(stroke\s*\(width ([\d.]+)\).*?\(layer "F\.SilkS"\)', fp, re.S):+ x0, y0, x1, y1, w = map(float, m.groups())+ silk.append({"kind": "line", "start": [x0, y0], "end": [x1, y1], "width": w})+assert pads, "no pads parsed"++page = json.load(open(page_path))+pins = {p["number"]: p.get("name", "") for p in page["component"].get("pins", [])}+mpn = page["component"]["mpn"]++# ---------------- geometry helpers (mm, KiCad frame; converted at the end) ----------------+def rrect_path(cx, cy, w, h, r, step=0.005):+ pts = []+ hw, hh = w / 2, h / 2+ corners = [(hw - r, hh - r, 0), (-hw + r, hh - r, 90), (-hw + r, -hh + r, 180), (hw - r, -hh + r, 270)]+ for (ox, oy, a0) in corners:+ if r > 0:+ n = max(2, int(math.ceil((math.pi / 2 * r) / step)))+ for i in range(n + 1):+ a = math.radians(a0 + 90 * i / n)+ pts.append((cx + ox + r * math.cos(a), cy + oy + r * math.sin(a)))+ else:+ sx = 1 if a0 in (0, 270) else -1; sy = 1 if a0 in (0, 90) else -1+ pts.append((cx + sx * hw, cy + sy * hh))+ # densify straight runs+ out = []+ for i in range(len(pts)):+ a, b = np.array(pts[i]), np.array(pts[(i + 1) % len(pts)])+ n = max(1, int(math.ceil(np.linalg.norm(b - a) / step)))+ for k in range(n):+ out.append(a + (b - a) * k / n)+ return np.array(out)++def ribbon(poly, width, closed=False, limit=4.0):+ """Polyline -> (verts Nx2, tris) as one continuous mitred ribbon."""+ P = np.asarray(poly, float); n = len(P)+ hw = width / 2+ V, T = [], []+ for i in range(n):+ if closed:+ a, b = P[i - 1], P[(i + 1) % n]+ d0 = P[i] - a; d1 = b - P[i]+ else:+ d0 = P[i] - P[i - 1] if i > 0 else P[1] - P[0]+ d1 = P[i + 1] - P[i] if i < n - 1 else P[i] - P[i - 1]+ d0 = d0 / (np.linalg.norm(d0) or 1); d1 = d1 / (np.linalg.norm(d1) or 1)+ n0 = np.array([-d0[1], d0[0]]); n1 = np.array([-d1[1], d1[0]])+ mvec = n0 + n1; ln = np.linalg.norm(mvec)+ if ln < 1e-9:+ mvec = n1; scale = 1.0+ else:+ mvec = mvec / ln; scale = 1.0 / max(np.dot(mvec, n1), 1.0 / limit)+ V.append(P[i] + mvec * hw * scale); V.append(P[i] - mvec * hw * scale)+ segs = n if closed else n - 1+ for i in range(segs):+ j = (i + 1) % n+ a, b, c, d = 2 * i, 2 * i + 1, 2 * j, 2 * j + 1+ T += [(a, b, c), (c, b, d)]+ return np.array(V), T++def dashed(path, dash, gap, stroke):+ P = np.vstack([path, path[:1]])+ seg = np.linalg.norm(np.diff(P, axis=0), axis=1)+ s = np.concatenate([[0], np.cumsum(seg)]); L = s[-1]+ n = max(1, int(round(L / (dash + gap))))+ period = L / n+ def at(t):+ t = t % L+ i = min(np.searchsorted(s, t, side="right") - 1, len(seg) - 1)+ f = (t - s[i]) / (seg[i] or 1)+ return P[i] + (P[i + 1] - P[i]) * f+ VV, TT = [], []+ for k in range(n):+ t0 = k * period; t1 = t0 + dash+ pts = [at(t0)]+ for i in range(len(s)):+ for base in (0, L):+ if t0 < s[i] + base < t1:+ pts.append(P[i % len(path)])+ pts.append(at(t1))+ v, t = ribbon(np.array(pts), stroke)+ off = sum(len(x) for x in VV)+ VV.append(v); TT += [(a + off, b + off, c + off) for a, b, c in t]+ return np.vstack(VV), TT, n++# ---------------- layer 1: pad outlines ----------------+xs = [p["center_mm"][0] + sgn * p["size_mm"][0] / 2 for p in pads for sgn in (-1, 1)]+ys = [p["center_mm"][1] + sgn * p["size_mm"][1] / 2 for p in pads for sgn in (-1, 1)]+pads_bbox = [min(xs), max(xs), min(ys), max(ys)]+span = max(1.0, pads_bbox[1] - pads_bbox[0], pads_bbox[3] - pads_bbox[2])+dash = clamp(0.025 * span, 0.12, 0.45); gap = 0.6 * dash; stroke = clamp(0.006 * span, 0.03, 0.09)+padV, padT = [], []+for p in pads:+ w, h = p["size_mm"]; r = p["rratio"] * min(w, h) if p["shape"] == "roundrect" else 0.0+ path = rrect_path(p["center_mm"][0], p["center_mm"][1], w, h, r)+ perim = float(np.sum(np.linalg.norm(np.diff(np.vstack([path, path[:1]]), axis=0), axis=1)))+ d = min(dash, max(perim / 6, 0.05)); st = min(stroke, max(perim / 25, 0.02))+ v, t, nd = dashed(path, d, 0.6 * d, st)+ off = sum(len(x) for x in padV); padV.append(v); padT += [(a + off, b + off, c + off) for a, b, c in t]+ p["dashes"] = nd; p["perimeter_mm"] = round(perim, 4)+padV = np.vstack(padV)++# ---------------- layer 2: silkscreen ----------------+silkV, silkT = [], []+for it in silk:+ a, b = np.array(it["start"]), np.array(it["end"])+ v, t = ribbon(np.array([a, b]), it["width"])+ off = sum(len(x) for x in silkV); silkV.append(v); silkT += [(i + off, j + off, k + off) for i, j, k in t]+silkV = np.vstack(silkV) if silkV else np.zeros((0, 2))+named = {p["number"]: pins.get(p["number"], "") for p in pads}+polar = [n for n, nm in named.items() if nm.upper() in ("K", "KA", "CATHODE", "+")]+pin1 = None+if len(pads) >= 3 or polar:+ raise SystemExit("FAIL: this builder only covers unpolarised two-terminal parts")++# ---------------- layer 3: labels ----------------+G = json.load(open(glyph_path)); adv = G["advance"]; glyphs = G["glyphs"]+def text_mesh(txt, height):+ V, T = [], []+ capref = max(glyphs["1"]["v"][1::2]) # digit height in em+ em = height / capref; x = 0.0+ for ch in txt:+ g = glyphs.get(ch) or glyphs["?"]+ v = np.array(g["v"], float).reshape(-1, 2)+ off = len(V)+ V += [(x + vx * em, vy * em) for vx, vy in v]+ tr = np.array(g["t"]).reshape(-1, 3)+ for a, b, c in tr:+ pa, pb, pc = v[a], v[b], v[c]+ area = (pb[0] - pa[0]) * (pc[1] - pa[1]) - (pc[0] - pa[0]) * (pb[1] - pa[1])+ T.append((a + off, b + off, c + off) if area >= 0 else (a + off, c + off, b + off))+ x += adv * em+ return np.array(V), T, x, capref * em+labels = []+labV_up, labT, labV_dn = [], [], []+for p in pads:+ nm = named[p["number"]]+ txt = nm if nm not in ("", "~") else p["number"]+ hgt = clamp(0.7 * min(p["size_mm"]), 0.12, 0.6); gapl = max(0.25 * hgt, 0.1)+ v, t, wtxt, htxt = text_mesh(txt, hgt)+ left = p["center_mm"][0] < 0+ # KiCad frame: x right, y down. Text drawn in a y-up frame then mapped to KiCad by y -> -y at the end.+ if left:+ x0 = p["center_mm"][0] - p["size_mm"][0] / 2 - gapl - wtxt; align = "right"+ else:+ x0 = p["center_mm"][0] + p["size_mm"][0] / 2 + gapl; align = "left"+ cy_up = -p["center_mm"][1]+ vu = v + np.array([x0, cy_up - htxt / 2])+ vd = vu.copy(); vd[:, 1] = 2 * cy_up - vd[:, 1]+ off = sum(len(a) for a in labV_up)+ labV_up.append(vu); labV_dn.append(vd); labT += [(a + off, b + off, c + off) for a, b, c in t]+ labels.append({"pad": p["number"], "text": txt, "anchor_mm": [round(x0 if not left else x0 + wtxt, 4), p["center_mm"][1]],+ "align": align, "orientation_deg": 0, "height_mm": round(hgt, 4), "fallback_pad_number": txt == p["number"]})+labV_up = np.vstack(labV_up); labV_dn = np.vstack(labV_dn)++def to_gltf(V2, kicad_frame=True):+ V2 = np.asarray(V2, float)+ y = -V2[:, 1] if kicad_frame else V2[:, 1]+ return np.column_stack([V2[:, 0] / 1000.0, y / 1000.0, np.full(len(V2), ZMM / 1000.0)]).astype(np.float32)++# winding: up-facing = CCW seen from +Z in the glTF frame+def fix_up(V3, T):+ out = []+ for a, b, c in T:+ pa, pb, pc = V3[a], V3[b], V3[c]+ area = (pb[0] - pa[0]) * (pc[1] - pa[1]) - (pc[0] - pa[0]) * (pb[1] - pa[1])+ out.append((a, b, c) if area >= 0 else (a, c, b))+ return out++padV3 = to_gltf(padV); silkV3 = to_gltf(silkV)+labU3 = to_gltf(labV_up, kicad_frame=False); labD3 = to_gltf(labV_dn, kicad_frame=False)+padT = fix_up(padV3, padT); silkT = fix_up(silkV3, silkT)+labTu = fix_up(labU3, labT)+labTd = [(a, c, b) for a, b, c in labTu] # mirrored copy faces down++# ---------------- alignment guard ----------------+g = GLTF2().load(glb_in)+blob = bytearray(g.binary_blob())+def acc_data(ai):+ a = g.accessors[ai]; bv = g.bufferViews[a.bufferView]+ comp = {5126: ("f", 4), 5122: ("h", 2), 5123: ("H", 2), 5120: ("b", 1), 5121: ("B", 1), 5125: ("I", 4)}[a.componentType]+ ncomp = {"SCALAR": 1, "VEC2": 2, "VEC3": 3, "VEC4": 4}[a.type]+ stride = bv.byteStride or comp[1] * ncomp+ base = (bv.byteOffset or 0) + (a.byteOffset or 0)+ arr = np.array([struct.unpack_from("<" + comp[0] * ncomp, blob, base + i * stride) for i in range(a.count)], float)+ if a.normalized:+ arr = arr / {5122: 32767.0, 5120: 127.0, 5123: 65535.0, 5121: 255.0}.get(a.componentType, 1)+ return arr+def node_mat(n):+ if n.matrix: return np.array(n.matrix).reshape(4, 4).T+ M = np.eye(4)+ s = n.scale or [1, 1, 1]; t = n.translation or [0, 0, 0]; q = n.rotation or [0, 0, 0, 1]+ x, y, z, w = q+ R = np.array([[1 - 2 * (y * y + z * z), 2 * (x * y - z * w), 2 * (x * z + y * w)],+ [2 * (x * y + z * w), 1 - 2 * (x * x + z * z), 2 * (y * z - x * w)],+ [2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x * x + y * y)]])+ M[:3, :3] = R * np.array(s); M[:3, 3] = t+ return M+allpts = []+def walk(ni, M):+ n = g.nodes[ni]; M2 = M @ node_mat(n)+ if n.mesh is not None:+ for p in g.meshes[n.mesh].primitives:+ P = acc_data(p.attributes.POSITION)+ allpts.append((M2 @ np.column_stack([P, np.ones(len(P))]).T).T[:, :3])+ for c in n.children or []: walk(c, M2)+for r in g.scenes[g.scene or 0].nodes: walk(r, np.eye(4))+W = np.vstack(allpts) * 1000.0 # mm, glTF frame+zmin = W[:, 2].min()+low = W[W[:, 2] < zmin + 0.01]+cb = [low[:, 0].min(), low[:, 0].max(), -low[:, 1].max(), -low[:, 1].min()] # KiCad y+cc = np.array([(cb[0] + cb[1]) / 2, (cb[2] + cb[3]) / 2]); pc = np.array([(pads_bbox[0] + pads_bbox[1]) / 2, (pads_bbox[2] + pads_bbox[3]) / 2])+offset = float(np.linalg.norm(cc - pc))+tol = max(0.25, 0.08 * max(pads_bbox[1] - pads_bbox[0], pads_bbox[3] - pads_bbox[2]))+cw, ch = cb[1] - cb[0], cb[3] - cb[2]; pw, ph = pads_bbox[1] - pads_bbox[0], pads_bbox[3] - pads_bbox[2]+flipped = (cw > 1.25 * ch and ph > 1.25 * pw) or (ch > 1.25 * cw and pw > 1.25 * ph)+align_ok = offset <= tol and not flipped and abs(zmin) < 0.005++# ---------------- write the hero ----------------+def add_acc(arr, target, kind):+ global blob+ while len(blob) % 4: blob.append(0)+ data = arr.tobytes(); off = len(blob); blob += data+ g.bufferViews.append(BufferView(buffer=0, byteOffset=off, byteLength=len(data), target=target))+ if kind == "pos":+ a = Accessor(bufferView=len(g.bufferViews) - 1, componentType=5126, count=len(arr), type="VEC3",+ min=arr.min(axis=0).tolist(), max=arr.max(axis=0).tolist())+ else:+ a = Accessor(bufferView=len(g.bufferViews) - 1, componentType=5125, count=arr.size, type="SCALAR")+ g.accessors.append(a); return len(g.accessors) - 1+def add_mat(name, double):+ g.materials.append(Material(name=name, alphaMode="BLEND", doubleSided=double,+ pbrMetallicRoughness=PbrMetallicRoughness(baseColorFactor=RGBA[name], metallicFactor=0.0, roughnessFactor=1.0),+ extensions={"KHR_materials_unlit": {}}))+ return len(g.materials) - 1+def prim(V3, T, mat):+ return Primitive(attributes=Attributes(POSITION=add_acc(V3, 34962, "pos")),+ indices=add_acc(np.array(T, np.uint32).ravel(), 34963, "idx"), material=mat, mode=4)+children = []+for name, V3, T, dbl in ((N_PAD, padV3, padT, True), (N_SILK, silkV3, silkT, True)):+ if len(T) == 0: continue+ mi = add_mat(name, dbl)+ g.meshes.append(Mesh(name=name, primitives=[prim(V3, T, mi)]))+ g.nodes.append(Node(name=name, mesh=len(g.meshes) - 1)); children.append(len(g.nodes) - 1)+mi = add_mat(N_LAB, False)+g.meshes.append(Mesh(name=N_LAB, primitives=[prim(labU3, labTu, mi), prim(labD3, labTd, mi)]))+g.nodes.append(Node(name=N_LAB, mesh=len(g.meshes) - 1)); children.append(len(g.nodes) - 1)+g.nodes.append(Node(name=ROOT_NAME, children=children)); g.scenes[g.scene or 0].nodes.append(len(g.nodes) - 1)+for ext in ("KHR_materials_unlit",):+ if ext not in (g.extensionsUsed or []): g.extensionsUsed = (g.extensionsUsed or []) + [ext]++meta = {+ "spec": "adom-hero 1.4", "mpn": mpn, "kind": "component + footprint reference art", "board_use": False,+ "plane_z_mm": ZMM, "units": "metre", "upAxis": "Z",+ "layers": {+ "pad_outlines": {"material": N_PAD, "rgba": RGBA[N_PAD], "pads": len(pads), "span_mm": round(span, 4),+ "dash_mm": round(dash, 4), "gap_mm": round(gap, 4), "pad_stroke_mm": round(stroke, 4)},+ "silkscreen": {"material": N_SILK, "rgba": RGBA[N_SILK], "footprint_items": len(silk), "pin1": pin1,+ "pin1_note": "unpolarised two-terminal part: no orientation, so no pin-1 mark"},+ "signal_names": {"material": N_LAB, "rgba": RGBA[N_LAB], "font": G["font"], "labels": len(labels),+ "fallback_to_pad_number": sum(1 for l in labels if l["fallback_pad_number"]),+ "note": "the pins have no names (~); each label is its pad number, so the two labels stay unique"}},+ "align": {"ok": bool(align_ok), "centre_offset_mm": round(offset, 4), "tolerance_mm": round(tol, 4), "orientation_flipped": bool(flipped),+ "contacts_bbox_mm": [round(v, 4) for v in cb], "pads_bbox_mm": [round(v, 4) for v in pads_bbox], "seating_z_mm": round(float(zmin), 4)},+ "sources": {"glb": os.path.basename(glb_in), "glb_sha256": sha(glb_in), "footprint": os.path.basename(fp_path),+ "footprint_sha256": sha(fp_path), "pins": "page.json component.pins", "glyphs": "hero_glyphs.json from adom/component-hero (data)",+ "glyphs_sha256": sha(glyph_path)},+ "generator": "provenance/tools/hero.py (independent implementation of adom-hero 1.4)"}+g.asset.extras = dict(g.asset.extras or {}); g.asset.extras["adomHero"] = meta+g.buffers[0].byteLength = len(blob)+g.set_binary_blob(bytes(blob))+g.save_binary(out)+side = dict(meta); side["pads"] = [{k: p[k] for k in ("number", "shape", "center_mm", "size_mm", "rotation_deg", "rratio", "dashes")} for p in pads]+side["labels"] = labels; side["silk_items"] = silk+json.dump(side, open(re.sub(r"\.glb$", ".overlay.json", out), "w"), indent=1)++if png:+ import matplotlib; matplotlib.use("Agg")+ import matplotlib.pyplot as plt+ from mpl_toolkits.mplot3d.art3d import Poly3DCollection+ h2 = GLTF2().load(out); blob = bytearray(h2.binary_blob()); g = h2+ fig = plt.figure(figsize=(12, 5.5), facecolor="#1b1f24")+ for k, (elev, azim, title) in enumerate(((90, -90, "TOP"), (35, -60, "OBLIQUE"))):+ ax = fig.add_subplot(1, 2, k + 1, projection="3d"); ax.set_facecolor("#1b1f24")+ def draw(ni, M):+ n = g.nodes[ni]; M2 = M @ node_mat(n)+ if n.mesh is not None:+ for p in g.meshes[n.mesh].primitives:+ P = acc_data(p.attributes.POSITION); P = (M2 @ np.column_stack([P, np.ones(len(P))]).T).T[:, :3] * 1000+ I = acc_data(p.indices).astype(int).reshape(-1, 3)+ col = g.materials[p.material].pbrMetallicRoughness.baseColorFactor+ ax.add_collection3d(Poly3DCollection(P[I], facecolor=col[:3], alpha=col[3], linewidth=0))+ for c in n.children or []: draw(c, M2)+ for r in g.scenes[0].nodes: draw(r, np.eye(4))+ ax.set_xlim(-1.2, 1.2); ax.set_ylim(-1.2, 1.2); ax.set_zlim(-1.2, 1.2)+ ax.view_init(elev=elev, azim=azim); ax.set_axis_off(); ax.set_title(title, color="w")+ fig.suptitle(f"{mpn} hero (adom-hero 1.4 layers)", color="w")+ plt.savefig(png, dpi=110, facecolor=fig.get_facecolor()); plt.close(fig)++print(f"{'OK' if align_ok else 'FAIL'} {os.path.basename(out)}: pads {len(pads)}, silk items {len(silk)}, pin1 none (unpolarised), "+ f"labels {len(labels)}; align {'OK' if align_ok else 'FAIL'} (offset {offset:.3f} mm)")+sys.exit(0 if align_ok else 3)
provenance/tools/hero_glyphs.jsonadded+1@@ -0,0 +1 @@+{"font":"DejaVu Sans Mono","units":"em (font size 1)","advance":0.602,"glyphs":{" ":{"v":[],"t":[]},"!":{"v":[0.25203,0.72906,0.35109,0.72906,0.35109,0.40922,0.34078,0.23484,0.26219,0.23484,0.25203,0.40922,0.25203,0.12406,0.35109,0.12406,0.35109,0.0,0.25203,0.0],"t":[1,0,5,1,5,4,1,4,3,1,3,2,7,6,9,7,9,8]},"\"":{"v":[0.43703,0.72906,0.43703,0.45797,0.35203,0.45797,0.35203,0.72906,0.25,0.72906,0.25,0.45797,0.165,0.45797,0.165,0.72906],"t":[1,0,3,1,3,2,5,4,7,5,7,6]},"#":{"v":[0.33406,0.71781,0.28328,0.51516,0.40281,0.51516,0.45406,0.71781,0.53219,0.71781,0.48094,0.51516,0.60016,0.51516,0.60016,0.44,0.46297,0.44,0.42188,0.27687,0.54391,0.27687,0.54391,0.20219,0.40281,0.20219,0.35203,0.0,0.27391,0.0,0.32516,0.20219,0.20516,0.20219,0.15375,0.0,0.07625,0.0,0.12703,0.20219,0.00094,0.20219,0.00094,0.27687,0.14594,0.27687,0.18703,0.44,0.05719,0.44,0.05719,0.51516,0.20516,0.51516,0.25594,0.71781,0.38484,0.44,0.26516,0.44,0.22406,0.27687,0.34422,0.27687],"t":[22,30,29,31,21,20,31,20,19,19,18,17,19,17,16,15,14,13,15,13,12,12,11,10,12,10,9,12,9,8,8,7,6,8,6,5,5,4,3,5,3,2,1,0,27,1,27,26,26,25,24,26,24,23,23,22,29,31,19,16,31,16,15,31,15,12,31,12,8,31,8,5,1,26,23,1,23,29,1,29,28,28,31,5,28,5,2,28,2,1]},"$":{"v":[0.33797,-0.14703,0.28906,-0.14703,0.28859,0.0,0.23895,0.00465,0.18969,0.01359,0.14094,0.02707,0.09281,0.045,0.09281,0.13281,0.14176,0.10605,0.19109,0.08641,0.24043,0.0741,0.28906,0.06938,0.28906,0.29297,0.20348,0.31543,0.14203,0.3525,0.10512,0.40418,0.09281,0.47016,0.10566,0.5391,0.14422,0.5925,0.20621,0.62844,0.28906,0.645,0.28906,0.75984,0.33797,0.75984,0.33844,0.645,0.37727,0.64141,0.41656,0.63531,0.45645,0.62664,0.49703,0.61531,0.49703,0.53078,0.45613,0.54934,0.41625,0.56312,0.37707,0.5723,0.33797,0.57672,0.33797,0.36625,0.42648,0.34305,0.49109,0.30375,0.5307,0.24941,0.54391,0.18109,0.52969,0.11215,0.48703,0.05563,0.42145,0.0168,0.33844,0.00094,0.33797,0.28328,0.33797,0.07125,0.38574,0.07949,0.42188,0.10109,0.44461,0.13453,0.45219,0.17828,0.44535,0.21855,0.42484,0.24875,0.38945,0.26996,0.28906,0.37594,0.28906,0.57766,0.24383,0.5693,0.20969,0.54828,0.18824,0.51633,0.18109,0.47516,0.18773,0.4375,0.20766,0.40859,0.24137,0.38824],"t":[8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,2,1,0,2,0,41,2,41,40,2,40,39,2,39,38,2,38,37,37,36,35,37,35,34,37,34,33,29,28,27,29,27,26,29,26,25,29,25,24,29,24,23,23,22,21,23,21,20,23,20,19,23,19,18,23,18,17,23,17,16,16,56,55,16,55,54,57,56,16,57,16,15,57,15,14,57,14,13,9,8,2,30,29,23,23,16,54,23,54,53,23,53,52,23,52,51,58,57,13,58,13,12,10,9,2,31,30,23,59,58,12,11,10,2,32,31,23,32,23,51,51,59,12,43,11,2,33,32,51,33,51,12,33,12,11,11,43,42,44,43,2,33,11,42,33,42,50,33,50,49,45,44,2,45,2,37,37,33,49,37,49,48,37,48,47,37,47,46,37,46,45]},"%":{"v":[0.27391,0.15578,0.28512,0.21652,0.31875,0.26688,0.36887,0.30074,0.42922,0.31203,0.45965,0.3091,0.48844,0.30031,0.51516,0.2859,0.53906,0.26609,0.55898,0.2418,0.57375,0.21484,0.58289,0.18594,0.58594,0.15578,0.57457,0.09566,0.54047,0.04531,0.49,0.01133,0.42922,0.0,0.36828,0.01117,0.31828,0.04469,0.285,0.0948,0.33984,0.15578,0.34625,0.1207,0.36547,0.09172,0.39422,0.07238,0.42922,0.06594,0.46398,0.07246,0.49297,0.09203,0.51254,0.12102,0.51906,0.15578,0.51246,0.19059,0.49266,0.21969,0.46359,0.23949,0.42922,0.24609,0.39422,0.23961,0.36547,0.22016,0.34625,0.19117,0.05906,0.22703,0.04203,0.27391,0.55078,0.47797,0.57078,0.43109,0.01609,0.54297,0.0273,0.60371,0.06094,0.65406,0.11117,0.68793,0.17188,0.69922,0.20246,0.69629,0.23172,0.6875,0.25863,0.6732,0.28219,0.65375,0.30168,0.6302,0.31609,0.60328,0.32512,0.57391,0.32812,0.54297,0.31676,0.48258,0.28266,0.43234,0.2323,0.39848,0.17188,0.38719,0.11117,0.3984,0.06094,0.43203,0.0273,0.48227,0.08203,0.54297,0.08844,0.50762,0.10766,0.47875,0.13652,0.45953,0.17188,0.45312,0.20668,0.45965,0.23578,0.47922,0.25559,0.5082,0.26219,0.54297,0.25559,0.57773,0.23578,0.60672,0.20668,0.62629,0.17188,0.63281,0.13711,0.62633,0.10812,0.60688,0.08855,0.57801],"t":[0,20,35,0,35,34,21,20,0,21,0,19,21,19,18,21,18,17,17,16,15,17,15,14,17,14,13,13,12,11,13,11,10,13,10,9,13,9,8,13,8,7,13,7,6,13,6,5,5,4,3,5,3,2,5,2,1,5,1,0,5,0,34,5,34,33,5,33,32,5,32,31,5,31,30,5,30,29,22,21,17,13,5,29,13,29,28,13,28,27,13,27,26,13,26,25,23,22,17,17,13,25,17,25,24,17,24,23,37,36,39,37,39,38,40,60,75,40,75,74,61,60,40,61,40,59,61,59,58,61,58,57,57,56,55,57,55,54,57,54,53,53,52,51,53,51,50,53,50,49,53,49,48,53,48,47,53,47,46,53,46,45,45,44,43,45,43,42,45,42,41,45,41,40,45,40,74,45,74,73,45,73,72,45,72,71,45,71,70,45,70,69,62,61,57,53,45,69,53,69,68,53,68,67,53,67,66,53,66,65,63,62,57,57,53,65,57,65,64,57,64,63]},"&":{"v":[0.26703,0.44281,0.47016,0.17,0.48676,0.19707,0.49844,0.23047,0.50547,0.27059,0.50781,0.31781,0.50746,0.33809,0.50641,0.36766,0.50594,0.37109,0.58594,0.37109,0.58594,0.35203,0.58141,0.27824,0.56781,0.21406,0.54516,0.15891,0.51313,0.11188,0.59625,0.0,0.49219,0.0,0.45406,0.05328,0.41234,0.02344,0.36812,0.00234,0.32117,-0.01008,0.27094,-0.01422,0.17461,0.00219,0.09656,0.05141,0.045,0.12566,0.02781,0.21688,0.03621,0.28129,0.06141,0.34078,0.10371,0.39586,0.16312,0.44672,0.14191,0.48152,0.12703,0.51562,0.11824,0.54961,0.11531,0.58406,0.12742,0.64953,0.16375,0.69969,0.22133,0.73156,0.29688,0.74219,0.32867,0.7407,0.36063,0.73625,0.39316,0.7291,0.42672,0.71922,0.42672,0.62984,0.3975,0.64641,0.36734,0.65797,0.33609,0.66477,0.30328,0.66703,0.26094,0.66145,0.22859,0.64469,0.20809,0.61867,0.20125,0.585,0.20477,0.55543,0.21531,0.52453,0.23535,0.4884,0.20312,0.39203,0.16391,0.35535,0.13594,0.31656,0.1193,0.27555,0.11375,0.23187,0.12594,0.16453,0.1625,0.10969,0.21813,0.07324,0.28719,0.06109,0.30812,0.06254,0.33,0.06688,0.35227,0.07414,0.37406,0.08406,0.38605,0.09086,0.39578,0.09688,0.40418,0.1027,0.41219,0.10891],"t":[25,58,57,25,57,56,25,56,55,59,58,25,59,25,24,59,24,23,59,23,22,22,21,20,22,20,19,22,19,18,22,18,17,17,16,15,17,15,14,17,14,13,17,13,12,17,12,11,17,11,10,17,10,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,43,42,41,43,41,40,43,40,39,43,39,38,43,38,37,43,37,36,36,35,34,36,34,33,36,33,32,36,32,31,36,31,30,36,30,29,29,28,27,29,27,26,29,26,25,29,25,55,29,55,54,29,54,70,60,59,22,17,9,2,17,2,1,17,1,0,17,0,53,17,53,52,44,43,36,61,60,22,45,44,36,62,61,22,62,22,17,46,45,36,63,62,17,47,46,36,64,63,17,48,47,36,65,64,17,49,48,36,49,36,29,66,65,17,50,49,29,67,66,17,51,50,29,68,67,17,52,51,29,52,29,70,69,68,17,17,52,70,17,70,69]},"'":{"v":[0.34281,0.72906,0.34281,0.45797,0.25781,0.45797,0.25781,0.72906],"t":[1,0,3,1,3,2]},"(":{"v":[0.43219,0.75875,0.37543,0.64766,0.33516,0.53687,0.31125,0.42582,0.30328,0.31391,0.31125,0.20238,0.33516,0.09125,0.37543,-0.01992,0.43219,-0.13187,0.35406,-0.13187,0.28969,-0.01719,0.24406,0.09438,0.21699,0.20434,0.20797,0.31391,0.21699,0.42316,0.24406,0.53312,0.28969,0.64477,0.35406,0.75875],"t":[1,0,17,1,17,16,1,16,15,1,15,14,1,14,13,13,12,11,13,11,10,13,10,9,9,8,7,9,7,6,9,6,5,2,1,13,13,9,5,13,5,4,13,4,3,13,3,2]},")":{"v":[0.17,0.75875,0.24813,0.75875,0.31234,0.64477,0.35781,0.53312,0.385,0.42316,0.39406,0.31391,0.385,0.20395,0.35781,0.09375,0.31234,-0.01781,0.24813,-0.13187,0.17,-0.13187,0.22664,-0.01922,0.26688,0.09219,0.2909,0.20309,0.29891,0.31391,0.2909,0.42516,0.26688,0.53609,0.22664,0.64723],"t":[1,0,17,1,17,16,1,16,15,11,10,9,11,9,8,11,8,7,11,7,6,11,6,5,5,4,3,5,3,2,5,2,1,5,1,15,5,15,14,5,14,13,5,13,12,5,12,11]},"*":{"v":[0.52094,0.60891,0.34625,0.51422,0.52094,0.41891,0.49313,0.37109,0.32906,0.47016,0.32906,0.28609,0.27297,0.28609,0.27297,0.47016,0.10891,0.37109,0.08109,0.41891,0.25594,0.51422,0.08109,0.60891,0.10891,0.65719,0.27297,0.55812,0.27297,0.74219,0.32906,0.74219,0.32906,0.55812,0.49313,0.65719],"t":[1,0,17,1,17,16,16,15,14,16,14,13,13,12,11,13,11,10,10,9,8,10,8,7,7,6,5,7,5,4,4,3,2,4,2,1,4,1,16,4,16,13,4,13,10,4,10,7]},"+":{"v":[0.34187,0.57172,0.34187,0.355,0.55906,0.355,0.55906,0.27203,0.34187,0.27203,0.34187,0.05516,0.25984,0.05516,0.25984,0.27203,0.04297,0.27203,0.04297,0.355,0.25984,0.355,0.25984,0.57172],"t":[1,0,11,1,11,10,10,9,8,10,8,7,7,6,5,7,5,4,4,3,2,4,2,1,4,1,10,4,10,7]},",":{"v":[0.24516,0.14797,0.36812,0.14797,0.36812,0.04688,0.27203,-0.14016,0.19672,-0.14016,0.24516,0.04688],"t":[1,0,5,1,5,4,1,4,3,1,3,2]},"-":{"v":[0.17391,0.31391,0.42828,0.31391,0.42828,0.23391,0.17391,0.23391],"t":[1,0,3,1,3,2]},".":{"v":[0.23875,0.14891,0.36188,0.14891,0.36188,0.0,0.23875,0.0],"t":[1,0,3,1,3,2]},"/":{"v":[0.43406,0.72906,0.52687,0.72906,0.14313,-0.09281,0.04984,-0.09281],"t":[1,0,3,1,3,2]},"0":{"v":[0.23578,0.36625,0.24047,0.39129,0.25453,0.41266,0.27531,0.4273,0.29984,0.43219,0.32523,0.4273,0.34672,0.41266,0.36137,0.39129,0.36625,0.36625,0.36141,0.34098,0.34687,0.31984,0.32551,0.30555,0.29984,0.30078,0.27473,0.30543,0.25406,0.31938,0.24035,0.34039,0.30078,0.74219,0.40328,0.71824,0.47734,0.64641,0.52223,0.52793,0.53719,0.36375,0.52223,0.19988,0.47734,0.08141,0.40328,0.00969,0.30078,-0.01422,0.19836,0.00969,0.12453,0.08141,0.07988,0.19988,0.065,0.36375,0.07988,0.52793,0.12453,0.64641,0.19836,0.71824,0.30078,0.66406,0.24063,0.64551,0.19797,0.58984,0.17254,0.49621,0.16406,0.36375,0.17254,0.23164,0.19797,0.13812,0.24063,0.08246,0.30078,0.06391,0.36129,0.08246,0.40406,0.13812,0.42949,0.23164,0.43797,0.36375,0.42949,0.49621,0.40406,0.58984,0.36129,0.64551],"t":[1,0,15,1,15,14,1,14,13,1,13,12,1,12,11,1,11,10,1,10,9,1,9,8,1,8,7,1,7,6,1,6,5,1,5,4,1,4,3,1,3,2,28,36,35,28,35,34,37,36,28,37,28,27,37,27,26,37,26,25,25,24,23,25,23,22,22,21,20,22,20,19,22,19,18,18,17,16,18,16,31,31,30,29,31,29,28,31,28,34,31,34,33,31,33,32,31,32,47,38,37,25,18,31,47,18,47,46,18,46,45,18,45,44,18,44,43,39,38,25,22,18,43,22,43,42,22,42,41,22,41,40,40,39,25,40,25,22]},"1":{"v":[0.13187,0.08297,0.28516,0.08297,0.28516,0.64016,0.12016,0.60297,0.12016,0.69281,0.28422,0.72906,0.38281,0.72906,0.38281,0.08297,0.53422,0.08297,0.53422,0.0,0.13187,0.0],"t":[1,0,10,1,10,9,9,8,7,7,6,5,5,4,3,5,3,2,1,9,7,7,5,2,7,2,1]},"2":{"v":[0.18219,0.08297,0.51703,0.08297,0.51703,0.0,0.07422,0.0,0.07422,0.08297,0.15973,0.17359,0.23375,0.25297,0.29156,0.31582,0.32812,0.35687,0.36906,0.41086,0.39406,0.45344,0.40684,0.4907,0.41109,0.52875,0.40211,0.58324,0.37516,0.62453,0.3327,0.65055,0.27687,0.65922,0.23137,0.6552,0.18359,0.64313,0.13336,0.62285,0.08016,0.59422,0.08016,0.69391,0.12992,0.71488,0.17891,0.73,0.22719,0.73914,0.27484,0.74219,0.37141,0.72797,0.44703,0.68531,0.4959,0.61957,0.51219,0.53609,0.50676,0.48922,0.49047,0.44234,0.46199,0.39305,0.42,0.33891,0.38648,0.30105,0.34063,0.25094,0.275,0.1809],"t":[0,36,35,0,35,34,0,34,33,0,33,32,0,32,31,0,31,30,0,30,29,0,29,28,28,27,26,28,26,25,28,25,24,28,24,23,28,23,22,22,21,20,22,20,19,22,19,18,22,18,17,22,17,16,22,16,15,5,4,3,3,2,1,3,1,0,28,22,15,28,15,14,28,14,13,28,13,12,28,12,11,28,11,10,28,10,9,6,5,3,6,3,0,0,28,9,0,9,8,0,8,7,0,7,6]},"3":{"v":[0.37891,0.39016,0.44223,0.36371,0.48875,0.3225,0.51734,0.26789,0.52687,0.20125,0.50996,0.11141,0.45922,0.04313,0.37859,0.00012,0.27203,-0.01422,0.22121,-0.01188,0.16937,-0.00484,0.11766,0.00648,0.06688,0.02203,0.06688,0.12016,0.11633,0.09754,0.165,0.08156,0.21328,0.07207,0.26125,0.06891,0.33293,0.07805,0.38578,0.10547,0.41836,0.15012,0.42922,0.21094,0.41836,0.26785,0.38578,0.31172,0.33465,0.33973,0.26813,0.34906,0.19281,0.34906,0.19281,0.43016,0.26813,0.43016,0.32852,0.43758,0.37406,0.45984,0.40266,0.49555,0.41219,0.54297,0.40332,0.59254,0.37672,0.62906,0.33379,0.65168,0.27594,0.65922,0.23176,0.65676,0.18609,0.64938,0.13859,0.63723,0.08891,0.62016,0.08891,0.71094,0.14473,0.72461,0.19406,0.73438,0.23766,0.74023,0.27594,0.74219,0.37168,0.72883,0.44609,0.68875,0.49391,0.62656,0.50984,0.54688,0.50145,0.49184,0.47625,0.44672,0.4352,0.41258],"t":[0,52,51,0,51,50,0,50,49,0,49,48,48,47,46,48,46,45,48,45,44,48,44,43,48,43,42,48,42,41,41,40,39,41,39,38,41,38,37,41,37,36,41,36,35,28,27,26,28,26,25,28,25,24,28,24,23,14,13,12,14,12,11,14,11,10,14,10,9,14,9,8,14,8,7,7,6,5,7,5,4,7,4,3,7,3,2,2,1,0,48,41,35,48,35,34,48,34,33,48,33,32,48,32,31,29,28,23,29,23,22,15,14,7,0,48,31,0,31,30,0,30,29,0,29,22,16,15,7,2,0,22,2,22,21,2,21,20,17,16,7,7,2,20,7,20,19,7,19,18,7,18,17]},"4":{"v":[0.34281,0.72906,0.45703,0.72906,0.45703,0.25391,0.55422,0.25391,0.55422,0.17391,0.45703,0.17391,0.45703,0.0,0.35891,0.0,0.35891,0.17391,0.04984,0.17391,0.04984,0.26703,0.35891,0.63922,0.12891,0.25391,0.35891,0.25391],"t":[9,12,11,13,12,9,13,9,8,8,7,6,8,6,5,5,4,3,5,3,2,2,1,0,0,10,9,0,9,11,13,8,5,13,5,2,2,0,11,2,11,13]},"5":{"v":[0.10109,0.72906,0.47016,0.72906,0.47016,0.64594,0.19094,0.64594,0.19094,0.46687,0.21195,0.47363,0.23312,0.47828,0.25445,0.48098,0.27594,0.48187,0.3775,0.46516,0.45563,0.415,0.50543,0.33629,0.52203,0.23391,0.50461,0.13082,0.45234,0.05219,0.37004,0.00238,0.26219,-0.01422,0.20656,-0.01227,0.15594,-0.00641,0.11043,0.00336,0.06984,0.01703,0.06984,0.11719,0.11484,0.0959,0.16016,0.08078,0.20609,0.07187,0.25297,0.06891,0.32516,0.07965,0.37859,0.11188,0.41176,0.16387,0.42281,0.23391,0.41141,0.30336,0.37719,0.35547,0.32258,0.38805,0.25,0.39891,0.21094,0.39664,0.17281,0.38984,0.13613,0.37863,0.10109,0.36281],"t":[0,37,36,0,36,35,0,35,34,22,21,20,22,20,19,22,19,18,22,18,17,22,17,16,22,16,15,15,14,13,15,13,12,15,12,11,11,10,9,11,9,8,11,8,7,11,7,6,11,6,5,11,5,4,3,2,1,3,1,0,23,22,15,4,3,0,4,0,34,4,34,33,4,33,32,4,32,31,24,23,15,11,4,31,11,31,30,11,30,29,11,29,28,25,24,15,15,11,28,15,28,27,15,27,26,15,26,25]},"6":{"v":[0.48391,0.71297,0.48391,0.62203,0.45215,0.63801,0.41844,0.64969,0.38305,0.65684,0.34625,0.65922,0.26383,0.64156,0.20406,0.58859,0.16785,0.50145,0.15578,0.38094,0.18371,0.42402,0.22063,0.45578,0.26523,0.47535,0.31594,0.48187,0.40949,0.4657,0.47922,0.41719,0.5227,0.33902,0.53719,0.23391,0.52227,0.12906,0.4775,0.05078,0.40586,0.00203,0.31,-0.01422,0.20008,0.00855,0.12406,0.07687,0.07977,0.19414,0.065,0.36375,0.08273,0.52637,0.13594,0.64516,0.22297,0.71793,0.34187,0.74219,0.37797,0.74027,0.41406,0.73453,0.44957,0.72539,0.30812,0.40484,0.25184,0.39348,0.20891,0.35938,0.18184,0.30527,0.17281,0.23391,0.18184,0.16242,0.20891,0.10828,0.25184,0.0743,0.30812,0.06297,0.36551,0.07375,0.40672,0.10609,0.43168,0.15969,0.44,0.23391,0.43168,0.3084,0.40672,0.36188,0.36551,0.3941],"t":[25,37,36,25,36,35,25,35,34,25,34,33,38,37,25,38,25,24,38,24,23,38,23,22,22,21,20,22,20,19,22,19,18,18,17,16,18,16,15,18,15,14,14,13,12,14,12,11,14,11,10,14,10,9,2,1,0,2,0,32,2,32,31,2,31,30,2,30,29,2,29,28,28,27,26,28,26,25,39,38,22,3,2,28,40,39,22,4,3,28,41,40,22,5,4,28,42,41,22,42,22,18,6,5,28,43,42,18,7,6,28,7,28,25,44,43,18,8,7,25,45,44,18,9,8,25,9,25,33,46,45,18,46,18,14,14,9,33,14,33,48,14,48,47,14,47,46]},"7":{"v":[0.06781,0.72906,0.52687,0.72906,0.52687,0.68703,0.26609,0.0,0.16312,0.0,0.41703,0.64594,0.06781,0.64594],"t":[1,0,6,1,6,5,1,5,4,1,4,3,1,3,2]},"8":{"v":[0.21484,0.38719,0.15875,0.41023,0.11641,0.44719,0.08992,0.49574,0.08109,0.55328,0.09586,0.63117,0.14016,0.69109,0.20984,0.72941,0.30078,0.74219,0.39207,0.72941,0.46188,0.69109,0.50617,0.63117,0.52094,0.55328,0.51207,0.49574,0.48547,0.44719,0.44324,0.41023,0.38719,0.38719,0.45184,0.36289,0.49922,0.32219,0.5284,0.26621,0.53812,0.19578,0.52238,0.10789,0.47516,0.04141,0.40008,-0.00031,0.30078,-0.01422,0.20164,-0.00035,0.12672,0.04125,0.07961,0.10738,0.06391,0.19484,0.07359,0.2657,0.10266,0.32203,0.15016,0.36285,0.30078,0.34625,0.24234,0.33703,0.19891,0.30938,0.17207,0.26488,0.16312,0.20516,0.17219,0.1452,0.19937,0.10031,0.24293,0.0723,0.30078,0.06297,0.35953,0.07219,0.40297,0.09984,0.42992,0.14461,0.43891,0.20516,0.4298,0.26457,0.4025,0.30906,0.35895,0.33695,0.17922,0.54391,0.18703,0.49227,0.21047,0.45453,0.24867,0.43156,0.30078,0.42391,0.35324,0.43156,0.39156,0.45453,0.415,0.49227,0.42281,0.54391,0.41504,0.59648,0.39172,0.63484,0.35352,0.65828,0.30078,0.66609,0.24867,0.6582,0.21047,0.63453,0.18703,0.59609],"t":[4,48,63,4,63,62,49,48,4,49,4,3,49,3,2,49,2,1,49,1,0,0,31,30,0,30,29,0,29,28,28,36,35,28,35,34,37,36,28,37,28,27,37,27,26,37,26,25,25,24,23,25,23,22,25,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,16,13,12,16,12,11,11,10,9,11,9,8,11,8,7,7,6,5,7,5,4,7,4,62,7,62,61,7,61,60,7,60,59,50,49,0,0,28,34,0,34,33,0,33,32,0,32,47,38,37,25,11,7,59,11,59,58,11,58,57,11,57,56,11,56,55,11,55,54,51,50,0,51,0,47,51,47,46,39,38,25,16,11,54,16,54,53,16,53,52,16,52,51,16,51,46,16,46,45,40,39,25,21,16,45,21,45,44,21,44,43,21,43,42,21,42,41,41,40,25,41,25,21]},"9":{"v":[0.11531,0.01516,0.11531,0.10594,0.14695,0.09008,0.18063,0.07844,0.21605,0.07129,0.25297,0.06891,0.33527,0.08652,0.39469,0.13937,0.43078,0.22664,0.44281,0.34719,0.41531,0.30398,0.37844,0.27219,0.33387,0.25262,0.28328,0.24609,0.18969,0.2623,0.11984,0.31094,0.07648,0.38949,0.06203,0.49516,0.07684,0.59957,0.12125,0.6775,0.19289,0.72602,0.28906,0.74219,0.3991,0.71934,0.47516,0.65078,0.51945,0.5334,0.53422,0.36375,0.51645,0.20145,0.46313,0.08266,0.37602,0.01,0.25688,-0.01422,0.22109,-0.0123,0.185,-0.00656,0.14953,0.00262,0.29109,0.32328,0.34727,0.33461,0.38984,0.36859,0.4168,0.42273,0.42578,0.49422,0.4168,0.56555,0.38984,0.61953,0.34727,0.65363,0.29109,0.665,0.23367,0.65418,0.19234,0.62172,0.1675,0.56828,0.15922,0.49422,0.16746,0.41973,0.19219,0.36625,0.2334,0.33402],"t":[17,45,44,17,44,43,46,45,17,46,17,16,46,16,15,46,15,14,14,13,12,14,12,11,14,11,10,14,10,9,2,1,0,2,0,32,2,32,31,2,31,30,2,30,29,2,29,28,28,27,26,28,26,25,28,25,24,24,23,22,24,22,21,21,20,19,21,19,18,21,18,17,21,17,43,21,43,42,21,42,41,21,41,40,21,40,39,47,46,14,3,2,28,24,21,39,24,39,38,24,38,37,24,37,36,24,36,35,48,47,14,4,3,28,33,48,14,33,14,9,5,4,28,34,33,9,6,5,28,35,34,9,7,6,28,24,35,9,24,9,8,8,7,28,8,28,24]},":":{"v":[0.23875,0.51906,0.36188,0.51906,0.36188,0.37109,0.23875,0.37109,0.23875,0.14891,0.36188,0.14891,0.36188,0.0,0.23875,0.0],"t":[1,0,3,1,3,2,5,4,7,5,7,6]},";":{"v":[0.24516,0.14797,0.36812,0.14797,0.36812,0.04688,0.27203,-0.14016,0.19672,-0.14016,0.24516,0.04688,0.23875,0.51906,0.36188,0.51906,0.36188,0.37109,0.23875,0.37109],"t":[1,0,5,1,5,4,1,4,3,1,3,2,7,6,9,7,9,8]},"<":{"v":[0.55906,0.46922,0.14406,0.31297,0.55906,0.15828,0.55906,0.06891,0.04297,0.27297,0.04297,0.35406,0.55906,0.55812],"t":[1,0,6,1,6,5,1,5,4,1,4,3,1,3,2]},"=":{"v":[0.04297,0.25594,0.55906,0.25594,0.55906,0.17188,0.04297,0.17188,0.04297,0.45406,0.55906,0.45406,0.55906,0.37109,0.04297,0.37109],"t":[1,0,3,1,3,2,5,4,7,5,7,6]},">":{"v":[0.04297,0.46922,0.04297,0.55812,0.55906,0.35406,0.55906,0.27297,0.04297,0.06891,0.04297,0.15828,0.45797,0.31297],"t":[1,0,6,6,5,4,6,4,3,6,3,2,6,2,1]},"?":{"v":[0.33406,0.19578,0.24125,0.19578,0.24125,0.27094,0.24496,0.31527,0.25609,0.35234,0.2775,0.38742,0.31203,0.42578,0.35594,0.46922,0.38152,0.49625,0.39766,0.51953,0.40633,0.54168,0.40922,0.565,0.40121,0.6043,0.37719,0.63531,0.33988,0.65547,0.29203,0.66219,0.25258,0.65797,0.21047,0.64531,0.16594,0.62434,0.11922,0.59516,0.11922,0.68703,0.1652,0.71129,0.21156,0.72844,0.2593,0.73875,0.30906,0.74219,0.39062,0.73047,0.45375,0.69531,0.4943,0.64051,0.50781,0.56984,0.50371,0.53395,0.49141,0.50062,0.46773,0.46551,0.42922,0.42391,0.38625,0.38188,0.35863,0.35258,0.34328,0.32906,0.33637,0.30625,0.33406,0.27875,0.33406,0.25594,0.23781,0.12406,0.33687,0.12406,0.33687,0.0,0.23781,0.0],"t":[1,0,38,1,38,37,1,37,36,1,36,35,1,35,34,33,32,31,33,31,30,33,30,29,33,29,28,33,28,27,33,27,26,26,25,24,26,24,23,26,23,22,26,22,21,26,21,20,20,19,18,20,18,17,20,17,16,20,16,15,20,15,14,7,6,5,7,5,4,7,4,3,7,3,2,7,2,1,7,1,34,7,34,33,26,20,14,26,14,13,26,13,12,26,12,11,26,11,10,8,7,33,33,26,10,33,10,9,33,9,8,40,39,42,40,42,41]},"@":{"v":[0.57516,0.06594,0.50484,0.06594,0.50484,0.12016,0.48336,0.09289,0.45484,0.07266,0.42082,0.06023,0.38281,0.05609,0.31098,0.07086,0.25266,0.11516,0.2141,0.1825,0.20125,0.26609,0.2141,0.34977,0.25266,0.41703,0.31098,0.46133,0.38281,0.47609,0.42027,0.4718,0.45453,0.45891,0.48352,0.43871,0.50484,0.41219,0.50484,0.44281,0.4941,0.5116,0.46188,0.56547,0.41195,0.60027,0.34813,0.61188,0.24023,0.58848,0.15688,0.51828,0.10367,0.40828,0.08594,0.26516,0.10605,0.12086,0.16641,0.00922,0.26035,-0.06215,0.38094,-0.08594,0.40723,-0.08473,0.43359,-0.08109,0.46035,-0.07488,0.48781,-0.06594,0.51125,-0.13187,0.48066,-0.14246,0.45047,-0.14984,0.42086,-0.1543,0.39203,-0.15578,0.23578,-0.12734,0.11547,-0.04203,0.03871,0.09164,0.01312,0.26516,0.03605,0.43617,0.10484,0.56828,0.21234,0.65289,0.35109,0.68109,0.44285,0.66484,0.51406,0.61609,0.55988,0.54012,0.57516,0.44188,0.50687,0.26609,0.49906,0.32277,0.47563,0.36688,0.4391,0.39535,0.39203,0.40484,0.345,0.39535,0.30828,0.36688,0.28473,0.32277,0.27687,0.26609,0.28473,0.20906,0.30828,0.16484,0.345,0.13648,0.39203,0.12703,0.4391,0.13648,0.47563,0.16484,0.49906,0.20906],"t":[10,61,60,10,60,59,62,61,10,62,10,9,62,9,8,62,8,7,7,6,5,7,5,4,7,4,3,7,3,2,2,1,0,2,0,52,2,52,51,2,51,50,50,49,48,50,48,47,47,46,45,47,45,44,44,43,42,44,42,41,41,40,39,41,39,38,41,38,37,41,37,36,36,35,34,36,34,33,36,33,32,36,32,31,36,31,30,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,12,11,10,12,10,59,12,59,58,12,58,57,63,62,7,41,36,30,41,30,29,41,29,28,18,12,57,18,57,56,18,56,55,18,55,54,18,54,53,64,63,7,44,41,28,44,28,27,44,27,26,44,26,25,19,18,53,65,64,7,65,7,2,47,44,25,47,25,24,47,24,23,47,23,22,66,65,2,50,47,22,50,22,21,50,21,20,50,20,19,50,19,53,67,66,2,2,50,53,2,53,68,2,68,67]},"A":{"v":[0.24125,0.72906,0.36078,0.72906,0.58406,0.0,0.48187,0.0,0.42828,0.19,0.17281,0.19,0.12016,0.0,0.01812,0.0,0.30078,0.64203,0.19672,0.26906,0.40484,0.26906],"t":[7,9,8,7,6,5,4,3,2,4,2,1,0,7,8,9,7,5,9,5,4,1,0,8,1,8,10,10,9,4,10,4,1]},"B":{"v":[0.08109,0.72906,0.29688,0.72906,0.3959,0.71695,0.46922,0.68063,0.51469,0.6223,0.52984,0.54391,0.52184,0.4841,0.49781,0.43844,0.45781,0.40707,0.40187,0.39016,0.46586,0.36941,0.51438,0.32875,0.54496,0.27137,0.55516,0.20016,0.53891,0.1132,0.49016,0.05047,0.40941,0.01262,0.29688,0.0,0.08109,0.0,0.18016,0.34813,0.18016,0.08109,0.29688,0.08109,0.37047,0.08859,0.41937,0.11109,0.44691,0.15082,0.45609,0.21,0.44645,0.2718,0.4175,0.31469,0.36805,0.33977,0.29688,0.34813,0.18016,0.64797,0.18016,0.42828,0.295,0.42828,0.35641,0.43512,0.39813,0.45563,0.42215,0.49137,0.43016,0.54391,0.42227,0.59137,0.39859,0.62344,0.35699,0.64184,0.295,0.64797],"t":[18,31,30,18,20,19,21,20,18,21,18,17,21,17,16,21,16,15,15,14,13,15,13,12,15,12,11,15,11,10,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,3,2,1,3,1,0,0,18,30,0,30,40,0,40,39,31,18,19,31,19,29,31,29,28,22,21,15,3,0,39,3,39,38,3,38,37,3,37,36,3,36,35,32,31,28,32,28,27,23,22,15,9,3,35,9,35,34,9,34,33,9,33,32,9,32,27,9,27,26,24,23,15,10,9,26,10,26,25,25,24,15,25,15,10]},"C":{"v":[0.52391,0.02594,0.48586,0.00844,0.44672,-0.00406,0.40598,-0.01168,0.36281,-0.01422,0.23832,0.01055,0.14516,0.08484,0.08715,0.20418,0.06781,0.36375,0.08727,0.52277,0.14563,0.64234,0.23891,0.71723,0.36281,0.74219,0.40598,0.73969,0.44672,0.73219,0.48586,0.71969,0.52391,0.70219,0.52391,0.60109,0.48645,0.62738,0.44625,0.64656,0.40469,0.65828,0.36281,0.66219,0.27867,0.64363,0.21875,0.58797,0.18289,0.4948,0.17094,0.36375,0.18289,0.23316,0.21875,0.14016,0.27867,0.08449,0.36281,0.06594,0.40535,0.06984,0.44703,0.08156,0.48688,0.10074,0.52391,0.12703],"t":[1,0,33,1,33,32,1,32,31,1,31,30,1,30,29,1,29,28,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,12,11,10,12,10,9,9,8,7,9,7,6,9,6,5,5,4,3,5,3,2,5,2,1,5,1,28,5,28,27,5,27,26,19,18,12,9,5,26,9,26,25,9,25,24,9,24,23,9,23,22,20,19,12,12,9,22,12,22,21,12,21,20]},"D":{"v":[0.21484,0.72906,0.35988,0.70684,0.46094,0.64016,0.52023,0.5266,0.54,0.36375,0.52023,0.20168,0.46094,0.08859,0.35988,0.02215,0.21484,0.0,0.06688,0.0,0.06688,0.72906,0.21297,0.08109,0.31859,0.09641,0.38672,0.14234,0.42375,0.22832,0.43609,0.36375,0.42383,0.50035,0.38703,0.58672,0.31898,0.63266,0.21297,0.64797,0.16609,0.64797,0.16609,0.08109],"t":[9,21,20,11,21,9,11,9,8,11,8,7,11,7,6,6,5,4,6,4,3,6,3,2,2,1,0,2,0,10,10,9,20,10,20,19,10,19,18,12,11,6,2,10,18,2,18,17,2,17,16,2,16,15,13,12,6,6,2,15,6,15,14,6,14,13]},"E":{"v":[0.09625,0.72906,0.52875,0.72906,0.52875,0.64594,0.19484,0.64594,0.19484,0.43016,0.51422,0.43016,0.51422,0.34719,0.19484,0.34719,0.19484,0.08297,0.53812,0.08297,0.53812,0.0,0.09625,0.0],"t":[11,10,9,11,9,8,11,8,7,7,6,5,7,5,4,3,2,1,3,1,0,3,0,11,11,7,4,11,4,3]},"F":{"v":[0.11375,0.72906,0.54297,0.72906,0.54297,0.64594,0.21297,0.64594,0.21297,0.43109,0.51219,0.43109,0.51219,0.34813,0.21297,0.34813,0.21297,0.0,0.11375,0.0],"t":[0,9,8,0,8,7,7,6,5,7,5,4,3,2,1,3,1,0,0,7,4,0,4,3]},"G":{"v":[0.53906,0.06,0.49703,0.02785,0.45,0.00453,0.39844,-0.00953,0.34281,-0.01422,0.21945,0.01062,0.12688,0.08516,0.0691,0.20449,0.04984,0.36375,0.06937,0.52277,0.12797,0.64234,0.22133,0.71723,0.34516,0.74219,0.39012,0.73895,0.43312,0.72922,0.47441,0.71293,0.51422,0.69,0.51422,0.58891,0.47418,0.62148,0.43312,0.64422,0.39035,0.6577,0.34516,0.66219,0.26105,0.64355,0.20094,0.58766,0.16484,0.49441,0.15281,0.36375,0.16445,0.2316,0.19937,0.13891,0.25859,0.08418,0.34281,0.06594,0.37348,0.06781,0.40016,0.07344,0.42367,0.0832,0.44484,0.09719,0.44484,0.29297,0.33891,0.29297,0.33891,0.37406,0.53906,0.37406],"t":[1,0,37,37,36,35,37,35,34,37,34,33,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,12,11,10,12,10,9,9,8,7,9,7,6,9,6,5,5,4,3,5,3,2,5,2,1,1,37,33,1,33,32,1,32,31,1,31,30,1,30,29,1,29,28,19,18,12,5,1,28,5,28,27,5,27,26,20,19,12,9,5,26,9,26,25,9,25,24,9,24,23,9,23,22,21,20,12,12,9,22,12,22,21]},"H":{"v":[0.06688,0.72906,0.16609,0.72906,0.16609,0.43016,0.43609,0.43016,0.43609,0.72906,0.53516,0.72906,0.53516,0.0,0.43609,0.0,0.43609,0.34719,0.16609,0.34719,0.16609,0.0,0.06688,0.0],"t":[1,0,11,11,10,9,8,7,6,8,6,5,5,4,3,2,1,11,2,11,9,2,9,8,8,5,3,8,3,2]},"I":{"v":[0.09813,0.72906,0.50297,0.72906,0.50297,0.64594,0.35016,0.64594,0.35016,0.08297,0.50297,0.08297,0.50297,0.0,0.09813,0.0,0.09813,0.08297,0.25094,0.08297,0.25094,0.64594,0.09813,0.64594],"t":[1,0,11,1,11,10,9,8,7,9,7,6,6,5,4,3,2,1,3,1,10,3,10,9,9,6,4,9,4,3]},"J":{"v":[0.05328,0.02984,0.05328,0.145,0.0984,0.11039,0.145,0.08563,0.1932,0.07086,0.24313,0.06594,0.30238,0.07504,0.34047,0.10234,0.36121,0.15441,0.36812,0.23781,0.36812,0.64594,0.18219,0.64594,0.18219,0.72906,0.46687,0.72906,0.46687,0.23781,0.45398,0.12027,0.41531,0.04297,0.34648,8e-05,0.24313,-0.01422,0.19637,-0.01152,0.14984,-0.00344,0.10258,0.01027],"t":[1,0,21,1,21,20,1,20,19,1,19,18,18,17,16,18,16,15,18,15,14,13,12,11,13,11,10,13,10,9,13,9,8,2,1,18,14,13,8,14,8,7,3,2,18,18,14,7,18,7,6,18,6,5,18,5,4,18,4,3]},"K":{"v":[0.06688,0.72906,0.16609,0.72906,0.16609,0.40484,0.47406,0.72906,0.58984,0.72906,0.30609,0.43109,0.59813,0.0,0.47906,0.0,0.24125,0.36531,0.16609,0.28516,0.16609,0.0,0.06688,0.0],"t":[1,0,11,11,10,9,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,2,1,11,2,11,9,2,9,8]},"L":{"v":[0.105,0.72906,0.20406,0.72906,0.20406,0.08297,0.55609,0.08297,0.55609,0.0,0.105,0.0],"t":[1,0,5,5,4,3,5,3,2,5,2,1]},"M":{"v":[0.04203,0.72906,0.17391,0.72906,0.29984,0.35797,0.42672,0.72906,0.55906,0.72906,0.55906,0.0,0.46781,0.0,0.46781,0.64406,0.33797,0.25984,0.26312,0.25984,0.13281,0.64406,0.13281,0.0,0.04203,0.0],"t":[0,12,11,0,11,10,10,9,8,7,6,5,7,5,4,7,4,3,7,3,2,1,0,10,8,7,2,2,1,10,2,10,8]},"N":{"v":[0.06781,0.72906,0.19281,0.72906,0.43891,0.12891,0.43891,0.72906,0.53422,0.72906,0.53422,0.0,0.40922,0.0,0.16312,0.60016,0.16312,0.0,0.06781,0.0],"t":[0,9,8,0,8,7,5,4,3,5,3,2,1,0,7,1,7,6,6,5,2,6,2,1]},"O":{"v":[0.545,0.36375,0.52992,0.19746,0.48469,0.07953,0.40855,0.00922,0.30078,-0.01422,0.19309,0.0091,0.11719,0.07906,0.07219,0.19688,0.05719,0.36375,0.07227,0.53039,0.1175,0.64844,0.19348,0.71875,0.30078,0.74219,0.40855,0.71875,0.48469,0.64844,0.52992,0.53039,0.44188,0.36375,0.43363,0.50145,0.40891,0.59328,0.36539,0.64496,0.30078,0.66219,0.23652,0.64496,0.19312,0.59328,0.1684,0.50145,0.16016,0.36375,0.1684,0.22641,0.19312,0.13469,0.23652,0.08313,0.30078,0.06594,0.36539,0.08309,0.40891,0.13453,0.43363,0.22613],"t":[8,24,23,8,23,22,25,24,8,25,8,7,25,7,6,25,6,5,5,4,3,5,3,2,2,1,0,2,0,15,2,15,14,2,14,13,13,12,11,13,11,10,10,9,8,10,8,22,10,22,21,10,21,20,26,25,5,13,10,20,13,20,19,13,19,18,13,18,17,27,26,5,2,13,17,2,17,16,2,16,31,2,31,30,2,30,29,2,29,28,28,27,5,28,5,2]},"P":{"v":[0.09625,0.72906,0.30906,0.72906,0.41633,0.7152,0.49406,0.67359,0.54141,0.60527,0.55719,0.51125,0.54148,0.41648,0.49438,0.34813,0.41672,0.30676,0.30906,0.29297,0.19484,0.29297,0.19484,0.0,0.09625,0.0,0.19484,0.64797,0.19484,0.37406,0.30906,0.37406,0.36996,0.38309,0.41578,0.41016,0.44449,0.45348,0.45406,0.51125,0.44453,0.56895,0.41594,0.61203,0.37023,0.63898,0.30906,0.64797],"t":[12,14,13,12,11,10,10,9,8,10,8,7,10,7,6,6,5,4,6,4,3,6,3,2,2,1,0,0,12,13,0,13,23,0,23,22,14,12,10,2,0,22,2,22,21,2,21,20,15,14,10,6,2,20,6,20,19,6,19,18,6,18,17,6,17,16,16,15,10,16,10,6]},"Q":{"v":[0.31984,-0.01312,0.31566,-0.01324,0.31,-0.01359,0.30434,-0.01406,0.29984,-0.01422,0.19324,0.00922,0.1175,0.07953,0.07227,0.19746,0.05719,0.36375,0.07227,0.53039,0.1175,0.64844,0.19348,0.71875,0.30078,0.74219,0.40855,0.71875,0.48469,0.64844,0.52992,0.53039,0.545,0.36375,0.5366,0.23414,0.51141,0.1325,0.46938,0.05809,0.41016,0.00984,0.50781,-0.08297,0.43406,-0.13187,0.44188,0.36375,0.43363,0.50145,0.40891,0.59328,0.36539,0.64496,0.30078,0.66219,0.23652,0.64496,0.19312,0.59328,0.1684,0.50145,0.16016,0.36375,0.1684,0.22641,0.19312,0.13469,0.23652,0.08313,0.30078,0.06594,0.36539,0.08309,0.40891,0.13453,0.43363,0.22613],"t":[8,31,30,8,30,29,32,31,8,32,8,7,32,7,6,32,6,5,5,4,3,5,3,2,5,2,1,5,1,0,0,22,21,0,21,20,0,20,19,0,19,18,0,18,17,17,16,15,17,15,14,17,14,13,13,12,11,13,11,10,10,9,8,10,8,29,10,29,28,10,28,27,33,32,5,13,10,27,13,27,26,13,26,25,13,25,24,34,33,5,34,5,0,17,13,24,17,24,23,17,23,38,17,38,37,17,37,36,35,34,0,0,17,36,0,36,35]},"R":{"v":[0.37109,0.34422,0.40641,0.33016,0.43609,0.30734,0.46625,0.2668,0.50297,0.19922,0.60203,0.0,0.49609,0.0,0.40922,0.18406,0.37348,0.24867,0.34156,0.28531,0.30695,0.30242,0.26312,0.30812,0.16891,0.30812,0.16891,0.0,0.06984,0.0,0.06984,0.72906,0.27297,0.72906,0.37906,0.71551,0.45703,0.67484,0.50496,0.60855,0.52094,0.51813,0.51109,0.45246,0.48156,0.40016,0.43434,0.36336,0.16891,0.64797,0.16891,0.38922,0.27687,0.38922,0.33863,0.39715,0.38234,0.42094,0.40836,0.46109,0.41703,0.51813,0.40781,0.57371,0.38016,0.61453,0.33492,0.63961,0.27297,0.64797],"t":[14,25,24,14,13,12,7,6,5,7,5,4,7,4,3,7,3,2,7,2,1,7,1,0,0,23,22,0,22,21,0,21,20,0,20,19,19,18,17,19,17,16,19,16,15,15,14,24,15,24,34,15,34,33,25,14,12,25,12,11,25,11,10,25,10,9,8,7,0,19,15,33,19,33,32,19,32,31,19,31,30,19,30,29,19,29,28,26,25,9,26,9,8,26,8,0,0,19,28,0,28,27,0,27,26]},"S":{"v":[0.49422,0.70406,0.49422,0.60406,0.44918,0.6293,0.40406,0.6475,0.35871,0.65852,0.31297,0.66219,0.25047,0.65406,0.20266,0.62969,0.1723,0.59152,0.16219,0.54203,0.16883,0.49934,0.18875,0.46813,0.22687,0.44488,0.28813,0.42578,0.33984,0.41406,0.42844,0.38332,0.48922,0.33891,0.52438,0.27836,0.53609,0.19922,0.51996,0.1075,0.47156,0.04047,0.39254,-0.00055,0.28422,-0.01422,0.23281,-0.01145,0.18109,-0.00313,0.12926,0.01059,0.07719,0.02984,0.07719,0.13484,0.13176,0.10387,0.18328,0.0825,0.23359,0.07008,0.28422,0.06594,0.35059,0.0743,0.40031,0.09938,0.43148,0.13945,0.44188,0.19281,0.43473,0.24102,0.41328,0.27625,0.37422,0.30184,0.31391,0.32078,0.26125,0.33297,0.17359,0.3618,0.11375,0.40234,0.0793,0.45668,0.06781,0.52687,0.08422,0.6148,0.13344,0.68328,0.21,0.72746,0.30812,0.74219,0.35121,0.7398,0.39641,0.73266,0.44406,0.72074],"t":[1,0,51,1,51,50,1,50,49,1,49,48,48,47,46,48,46,45,48,45,44,44,43,42,44,42,41,44,41,40,44,40,39,44,39,38,44,38,37,28,27,26,28,26,25,28,25,24,28,24,23,28,23,22,22,21,20,22,20,19,22,19,18,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,18,12,11,2,1,48,29,28,22,3,2,48,30,29,22,4,3,48,31,30,22,5,4,48,32,31,22,6,5,48,33,32,22,33,22,18,7,6,48,7,48,44,34,33,18,8,7,44,35,34,18,9,8,44,36,35,18,10,9,44,37,36,18,37,18,11,11,10,44,11,44,37]},"T":{"v":[0.02297,0.72906,0.57906,0.72906,0.57906,0.64594,0.35109,0.64594,0.35109,0.0,0.25203,0.0,0.25203,0.64594,0.02297,0.64594],"t":[1,0,7,1,7,6,6,5,4,6,4,3,3,2,1,3,1,6]},"U":{"v":[0.07172,0.27984,0.07172,0.72906,0.17094,0.72906,0.17094,0.23484,0.17164,0.1893,0.17375,0.15891,0.17781,0.13887,0.18406,0.12406,0.20316,0.09871,0.22922,0.08047,0.26187,0.06957,0.30078,0.06594,0.33996,0.06957,0.3725,0.08047,0.39855,0.09871,0.41797,0.12406,0.42418,0.13879,0.42813,0.15859,0.43035,0.18867,0.43109,0.23391,0.43109,0.72906,0.52984,0.72906,0.52984,0.27984,0.52637,0.18414,0.51594,0.12078,0.49695,0.07781,0.46781,0.04297,0.43328,0.01785,0.39406,0.0,0.34996,-0.01066,0.30078,-0.01422,0.25195,-0.01066,0.20797,0.0,0.16871,0.01785,0.13375,0.04297,0.105,0.0777,0.08594,0.12125,0.07527,0.18496],"t":[1,0,37,1,37,36,1,36,35,1,35,34,1,34,33,33,32,31,33,31,30,33,30,29,33,29,28,33,28,27,33,27,26,33,26,25,33,25,24,24,23,22,24,22,21,24,21,20,24,20,19,24,19,18,24,18,17,24,17,16,24,16,15,24,15,14,24,14,13,24,13,12,3,2,1,3,1,33,33,24,12,33,12,11,33,11,10,33,10,9,33,9,8,33,8,7,33,7,6,33,6,5,33,5,4,33,4,3]},"V":{"v":[0.30078,0.08297,0.47219,0.72906,0.57422,0.72906,0.36078,0.0,0.24125,0.0,0.02781,0.72906,0.12984,0.72906],"t":[0,6,5,0,5,4,0,4,3,0,3,2,0,2,1]},"W":{"v":[0.0,0.72906,0.09625,0.72906,0.16609,0.13719,0.24906,0.52875,0.35203,0.52875,0.43609,0.13625,0.50594,0.72906,0.60203,0.72906,0.49313,0.0,0.39984,0.0,0.30078,0.43312,0.20219,0.0,0.10891,0.0],"t":[1,0,12,12,11,10,10,9,8,8,7,6,8,6,5,2,1,12,2,12,10,10,8,5,10,5,4,10,4,3,10,3,2]},"X":{"v":[0.04203,0.72906,0.14797,0.72906,0.30812,0.45406,0.47125,0.72906,0.57719,0.72906,0.35891,0.38625,0.59281,0.0,0.48688,0.0,0.30812,0.31391,0.11531,0.0,0.00875,0.0,0.25297,0.38625],"t":[1,0,11,11,10,9,11,9,8,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,8,2,1,8,1,11]},"Y":{"v":[0.01812,0.72906,0.12312,0.72906,0.30078,0.40719,0.47797,0.72906,0.58406,0.72906,0.35016,0.32719,0.35016,0.0,0.25094,0.0,0.25094,0.32719],"t":[1,0,8,8,7,6,8,6,5,8,5,4,4,3,2,2,1,8,2,8,4]},"Z":{"v":[0.08688,0.72906,0.56,0.72906,0.56,0.65375,0.17922,0.08297,0.57078,0.08297,0.57078,0.0,0.07625,0.0,0.07625,0.07516,0.44672,0.64594,0.08688,0.64594],"t":[1,0,9,1,9,8,1,8,7,1,7,6,6,5,4,6,4,3,6,3,2,6,2,1]},"[":{"v":[0.22609,0.75984,0.43312,0.75984,0.43312,0.69,0.31594,0.69,0.31594,-0.06203,0.43312,-0.06203,0.43312,-0.13187,0.22609,-0.13187],"t":[7,6,5,7,5,4,7,4,3,3,2,1,3,1,0,3,0,7]},"\\":{"v":[0.14313,0.72906,0.52687,-0.09281,0.43406,-0.09281,0.04984,0.72906],"t":[1,0,3,1,3,2]},"]":{"v":[0.37594,0.75984,0.37594,-0.13187,0.16891,-0.13187,0.16891,-0.06203,0.28609,-0.06203,0.28609,0.69,0.16891,0.69,0.16891,0.75984],"t":[0,7,6,0,6,5,0,5,4,4,3,2,4,2,1,4,1,0]},"^":{"v":[0.34422,0.72906,0.56688,0.45703,0.48,0.45703,0.30078,0.64984,0.12203,0.45703,0.03516,0.45703,0.25781,0.72906],"t":[1,0,6,6,5,4,6,4,3,6,3,2,6,2,1]},"_":{"v":[0.60203,-0.19672,0.60203,-0.23578,0.0,-0.23578,0.0,-0.19672],"t":[1,0,3,1,3,2]},"`":{"v":[0.23297,0.79984,0.37016,0.61625,0.295,0.61625,0.13625,0.79984],"t":[1,0,3,1,3,2]},"a":{"v":[0.51703,0.31203,0.51703,0.0,0.42672,0.0,0.42672,0.08109,0.39422,0.03859,0.35422,0.00891,0.3059,-0.00844,0.24813,-0.01422,0.17297,-0.00242,0.11469,0.03297,0.07742,0.08813,0.065,0.15922,0.08031,0.23949,0.12625,0.29781,0.20184,0.33332,0.30609,0.34516,0.42672,0.34516,0.42672,0.35938,0.41816,0.41586,0.39344,0.45438,0.35102,0.47652,0.28906,0.48391,0.24289,0.48059,0.19625,0.47063,0.15,0.45445,0.105,0.43219,0.105,0.52203,0.15379,0.53867,0.20047,0.55047,0.24543,0.55762,0.28906,0.56,0.35195,0.555,0.405,0.54,0.44855,0.515,0.48297,0.48,0.49875,0.45273,0.50922,0.41969,0.51508,0.3748,0.34281,0.27484,0.31297,0.27484,0.24406,0.26793,0.19453,0.24719,0.16477,0.21289,0.15484,0.165,0.16227,0.12125,0.18453,0.08844,0.22008,0.06793,0.26703,0.06109,0.33332,0.07395,0.38375,0.1125,0.41574,0.17387,0.42672,0.25484,0.42672,0.27484],"t":[44,43,11,44,11,10,44,10,9,44,9,8,44,8,7,7,6,5,7,5,4,7,4,3,3,2,1,3,1,0,3,0,37,3,37,36,3,36,35,3,35,34,3,34,33,33,32,31,33,31,30,33,30,29,33,29,28,33,28,27,33,27,26,26,25,24,26,24,23,26,23,22,26,22,21,26,21,20,16,15,14,16,14,13,16,13,12,12,11,43,12,43,42,12,42,41,12,41,40,45,44,7,33,26,20,33,20,19,33,19,18,33,18,17,33,17,16,16,12,40,16,40,39,16,39,52,46,45,7,33,16,52,33,52,51,47,46,7,47,7,3,3,33,51,3,51,50,3,50,49,3,49,48,3,48,47]},"b":{"v":[0.18406,0.47703,0.20969,0.51238,0.24344,0.53844,0.28426,0.55461,0.33109,0.56,0.41918,0.54102,0.48625,0.48406,0.52879,0.39387,0.54297,0.27484,0.52875,0.15422,0.48609,0.06266,0.41867,0.005,0.33016,-0.01422,0.28414,-0.00891,0.24391,0.00703,0.21027,0.03313,0.18406,0.06891,0.18406,0.0,0.09422,0.0,0.09422,0.75984,0.18406,0.75984,0.44828,0.27297,0.43996,0.36465,0.415,0.43063,0.37391,0.47059,0.31688,0.48391,0.25934,0.47055,0.21766,0.43047,0.19246,0.36438,0.18406,0.27297,0.19246,0.18184,0.21766,0.11563,0.25934,0.07543,0.31688,0.06203,0.37391,0.07531,0.415,0.11516,0.43996,0.18125],"t":[18,29,28,30,29,18,18,17,16,16,15,14,16,14,13,16,13,12,16,12,11,11,10,9,11,9,8,11,8,7,11,7,6,6,5,4,6,4,3,6,3,2,6,2,1,0,20,19,0,19,18,0,18,28,0,28,27,0,27,26,0,26,25,31,30,18,31,18,16,1,0,25,1,25,24,32,31,16,32,16,11,6,1,24,6,24,23,6,23,22,6,22,21,6,21,36,33,32,11,11,6,36,11,36,35,11,35,34,11,34,33]},"c":{"v":[0.51813,0.02781,0.48137,0.00949,0.44359,-0.00359,0.40488,-0.01156,0.36531,-0.01422,0.25215,0.0048,0.16672,0.06187,0.11305,0.15277,0.09516,0.27297,0.11305,0.39301,0.16672,0.48375,0.25215,0.54094,0.36531,0.56,0.40434,0.55742,0.44234,0.54969,0.48012,0.53672,0.51813,0.51813,0.51813,0.42391,0.48242,0.45121,0.44656,0.46969,0.40828,0.48035,0.36531,0.48391,0.29055,0.47023,0.23531,0.42922,0.20133,0.36281,0.19,0.27297,0.20141,0.1834,0.23563,0.11688,0.29086,0.07574,0.36531,0.06203,0.40973,0.06563,0.44922,0.07641,0.48504,0.09477,0.51813,0.12109],"t":[1,0,33,1,33,32,1,32,31,1,31,30,1,30,29,1,29,28,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,12,11,10,12,10,9,9,8,7,9,7,6,9,6,5,5,4,3,5,3,2,5,2,1,5,1,28,5,28,27,5,27,26,19,18,12,9,5,26,9,26,25,9,25,24,9,24,23,9,23,22,20,19,12,12,9,22,12,22,21,12,21,20]},"d":{"v":[0.41891,0.47703,0.41891,0.75984,0.50875,0.75984,0.50875,0.0,0.41891,0.0,0.41891,0.06891,0.39277,0.03313,0.35906,0.00703,0.31887,-0.00891,0.27297,-0.01422,0.18441,0.005,0.11688,0.06266,0.07422,0.15422,0.06,0.27484,0.0743,0.39387,0.11719,0.48406,0.18473,0.54102,0.27297,0.56,0.31937,0.55469,0.35984,0.53875,0.39344,0.51277,0.15484,0.27297,0.16313,0.18125,0.18797,0.11516,0.22914,0.07531,0.28609,0.06203,0.34332,0.07543,0.385,0.11563,0.41043,0.18184,0.41891,0.27297,0.41043,0.36438,0.385,0.43047,0.34332,0.47055,0.28609,0.48391,0.22914,0.47059,0.18797,0.43063,0.16313,0.36465],"t":[13,21,36,13,36,35,22,21,13,22,13,12,22,12,11,22,11,10,10,9,8,10,8,7,10,7,6,10,6,5,5,4,3,5,3,2,2,1,0,0,20,19,0,19,18,0,18,17,0,17,16,16,15,14,16,14,13,16,13,35,16,35,34,16,34,33,16,33,32,23,22,10,0,16,32,0,32,31,0,31,30,0,30,29,24,23,10,2,0,29,2,29,28,25,24,10,25,10,5,5,2,28,5,28,27,5,27,26,5,26,25]},"e":{"v":[0.54297,0.29594,0.54297,0.25203,0.15375,0.25203,0.15375,0.24906,0.16539,0.1698,0.20031,0.11078,0.2566,0.07422,0.33203,0.06203,0.37598,0.06543,0.42188,0.07562,0.47035,0.09289,0.52203,0.11719,0.52203,0.02781,0.47168,0.00949,0.42313,-0.00359,0.37629,-0.01156,0.33109,-0.01422,0.2175,0.00488,0.13172,0.06219,0.07793,0.15316,0.06,0.27297,0.07758,0.39059,0.13031,0.48187,0.21234,0.54047,0.31781,0.56,0.41129,0.5423,0.48266,0.48922,0.52789,0.40551,0.45312,0.32234,0.44285,0.39195,0.41578,0.44266,0.37258,0.47359,0.31391,0.48391,0.25477,0.47316,0.20703,0.44094,0.17355,0.38965,0.15719,0.32172],"t":[20,36,35,20,35,34,28,36,20,20,19,18,20,18,17,17,16,15,17,15,14,17,14,13,17,13,12,12,11,10,12,10,9,12,9,8,12,8,7,12,7,6,2,1,0,0,27,26,0,26,25,0,25,24,24,23,22,24,22,21,21,20,34,21,34,33,17,12,6,17,6,5,17,5,4,24,21,33,24,33,32,24,32,31,24,31,30,20,17,4,20,4,3,20,3,2,20,2,0,0,24,30,0,30,29,0,29,28,0,28,20]},"f":{"v":[0.51906,0.75984,0.51906,0.685,0.41703,0.685,0.37602,0.68004,0.34984,0.66516,0.33578,0.63781,0.33109,0.59516,0.33109,0.54688,0.51906,0.54688,0.51906,0.47703,0.33109,0.47703,0.33109,0.0,0.24125,0.0,0.24125,0.47703,0.09516,0.47703,0.09516,0.54688,0.24125,0.54688,0.24125,0.585,0.25156,0.66301,0.2825,0.71734,0.33527,0.74922,0.41109,0.75984],"t":[1,0,21,1,21,20,1,20,19,19,18,17,19,17,16,16,15,14,16,14,13,13,12,11,13,11,10,10,9,8,10,8,7,2,1,19,19,16,13,19,13,10,19,10,7,19,7,6,19,6,5,19,5,4,19,4,3,19,3,2]},"g":{"v":[0.50875,0.03516,0.49422,-0.07305,0.45062,-0.15141,0.37895,-0.19898,0.27984,-0.21484,0.2418,-0.21313,0.20203,-0.20797,0.16156,-0.19961,0.12109,-0.18797,0.12109,-0.09906,0.16672,-0.11863,0.20797,-0.13234,0.24547,-0.14043,0.27984,-0.14313,0.34262,-0.1332,0.38562,-0.10344,0.41059,-0.0523,0.41891,0.02203,0.41891,0.02594,0.41891,0.08688,0.39355,0.04691,0.36031,0.01859,0.31922,0.00172,0.27,-0.00391,0.18398,0.01523,0.11719,0.07266,0.0743,0.1623,0.06,0.27781,0.0743,0.39363,0.11719,0.48328,0.18398,0.54082,0.27,0.56,0.31875,0.55477,0.35938,0.53906,0.39254,0.51234,0.41891,0.47406,0.41891,0.545,0.50875,0.545,0.41891,0.27781,0.41066,0.36676,0.38594,0.43141,0.34547,0.47078,0.29,0.48391,0.23187,0.47078,0.18938,0.43141,0.16348,0.36676,0.15484,0.27781,0.16355,0.18875,0.18969,0.12375,0.23254,0.08402,0.29109,0.07078,0.34574,0.08406,0.38594,0.12391,0.41066,0.18902],"t":[10,9,8,10,8,7,10,7,6,10,6,5,10,5,4,10,4,3,3,2,1,3,1,0,0,37,36,0,36,35,0,35,34,34,33,32,34,32,31,34,31,30,34,30,29,29,28,27,29,27,46,29,46,45,29,45,44,29,44,43,29,43,42,47,46,27,47,27,26,47,26,25,47,25,24,24,23,22,24,22,21,24,21,20,24,20,19,11,10,3,34,29,42,34,42,41,34,41,40,34,40,39,48,47,24,12,11,3,0,34,39,0,39,38,0,38,53,0,53,52,49,48,24,13,12,3,50,49,24,50,24,19,14,13,3,51,50,19,15,14,3,15,3,0,52,51,19,16,15,0,0,52,19,0,19,17,0,17,16]},"h":{"v":[0.51313,0.33891,0.51313,0.0,0.42281,0.0,0.42281,0.33891,0.41633,0.40285,0.39688,0.44719,0.36375,0.4732,0.31594,0.48187,0.2602,0.4707,0.21891,0.43719,0.19348,0.38289,0.185,0.30906,0.185,0.0,0.09516,0.0,0.09516,0.75984,0.185,0.75984,0.185,0.46484,0.21328,0.50602,0.25,0.53578,0.29484,0.55395,0.34719,0.56,0.42008,0.54625,0.47187,0.505,0.50281,0.43605],"t":[1,0,23,1,23,22,1,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,13,12,11,13,11,10,3,2,1,3,1,21,16,13,10,16,10,9,16,9,8,16,8,7,4,3,21,21,16,7,21,7,6,21,6,5,21,5,4]},"i":{"v":[0.125,0.54688,0.355,0.54688,0.355,0.06984,0.53328,0.06984,0.53328,0.0,0.08688,0.0,0.08688,0.06984,0.26516,0.06984,0.26516,0.47703,0.125,0.47703,0.26516,0.75984,0.355,0.75984,0.355,0.64594,0.26516,0.64594],"t":[1,0,9,1,9,8,1,8,7,7,6,5,7,5,4,4,3,2,2,1,7,2,7,4,11,10,13,11,13,12]},"j":{"v":[0.29297,-0.00984,0.29297,0.47703,0.13812,0.47703,0.13812,0.54688,0.38281,0.54688,0.38281,-0.00984,0.37188,-0.09406,0.33906,-0.15641,0.28621,-0.19508,0.21484,-0.20797,0.09078,-0.20797,0.09078,-0.13187,0.20516,-0.13187,0.24355,-0.12422,0.27094,-0.10125,0.28746,-0.06316,0.29297,0.75984,0.38281,0.75984,0.38281,0.64594,0.29297,0.64594],"t":[12,11,10,12,10,9,12,9,8,12,8,7,7,6,5,7,5,4,4,3,2,4,2,1,4,1,0,4,0,15,13,12,7,7,4,15,7,15,14,7,14,13,17,16,19,17,19,18]},"k":{"v":[0.11531,0.75984,0.20797,0.75984,0.20797,0.31984,0.44391,0.54688,0.55328,0.54688,0.33797,0.34078,0.58688,0.0,0.47703,0.0,0.27484,0.28219,0.20797,0.21922,0.20797,0.0,0.11531,0.0],"t":[1,0,11,11,10,9,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,2,1,11,2,11,9,2,9,8]},"l":{"v":[0.31203,0.19828,0.31758,0.14512,0.33422,0.10687,0.36172,0.08391,0.39984,0.07625,0.50484,0.07625,0.50484,0.0,0.39109,0.0,0.31969,0.01293,0.26641,0.05172,0.23324,0.1143,0.22219,0.19828,0.22219,0.69484,0.07812,0.69484,0.07812,0.76516,0.31203,0.76516],"t":[15,14,13,15,13,12,15,12,11,15,11,10,15,10,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,9,2,1,9,1,0,9,0,15]},"m":{"v":[0.33016,0.49125,0.34898,0.5218,0.37234,0.54312,0.40059,0.55578,0.43406,0.56,0.49027,0.54723,0.52703,0.50891,0.54742,0.43543,0.55422,0.31688,0.55422,0.0,0.47219,0.0,0.47219,0.31297,0.46895,0.4068,0.45922,0.45672,0.44098,0.47781,0.41219,0.48484,0.37926,0.47734,0.35859,0.45484,0.34781,0.40437,0.34422,0.31297,0.34422,0.0,0.26219,0.0,0.26219,0.31297,0.25871,0.4077,0.24828,0.4575,0.22883,0.47801,0.19828,0.48484,0.16809,0.47734,0.14875,0.45484,0.13832,0.40437,0.13484,0.31297,0.13484,0.0,0.05328,0.0,0.05328,0.54688,0.13484,0.54688,0.13484,0.5,0.15293,0.52586,0.175,0.54469,0.20086,0.55617,0.23,0.56,0.26395,0.55574,0.29172,0.54297,0.31367,0.52152],"t":[0,42,41,0,41,40,0,40,39,0,39,38,0,38,37,0,37,36,0,36,35,35,34,33,35,33,32,32,31,30,32,30,29,32,29,28,22,21,20,22,20,19,22,19,18,22,18,17,11,10,9,11,9,8,11,8,7,11,7,6,11,6,5,5,4,3,5,3,2,5,2,1,5,1,0,35,32,28,35,28,27,35,27,26,35,26,25,23,22,17,23,17,16,12,11,5,0,35,25,0,25,24,0,24,23,0,23,16,0,16,15,13,12,5,5,0,15,5,15,14,5,14,13]},"n":{"v":[0.51313,0.33891,0.51313,0.0,0.42281,0.0,0.42281,0.33891,0.41633,0.40285,0.39688,0.44719,0.36375,0.4732,0.31594,0.48187,0.2602,0.4707,0.21891,0.43719,0.19348,0.38289,0.185,0.30906,0.185,0.0,0.09516,0.0,0.09516,0.54688,0.185,0.54688,0.185,0.46484,0.21328,0.50602,0.25,0.53578,0.29484,0.55395,0.34719,0.56,0.42008,0.54625,0.47187,0.505,0.50281,0.43605],"t":[1,0,23,1,23,22,1,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,13,12,11,13,11,10,3,2,1,3,1,21,16,13,10,16,10,9,16,9,8,16,8,7,4,3,21,21,16,7,21,7,6,21,6,5,21,5,4]},"o":{"v":[0.30078,0.56,0.40117,0.54156,0.47484,0.48625,0.52008,0.39613,0.53516,0.27297,0.52012,0.14945,0.475,0.05922,0.40145,0.00414,0.30078,-0.01422,0.20043,0.00414,0.12688,0.05922,0.08188,0.14945,0.06688,0.27297,0.08188,0.39613,0.12688,0.48625,0.20043,0.54156,0.30078,0.48391,0.24078,0.47059,0.19734,0.43063,0.17098,0.36465,0.16219,0.27297,0.17098,0.18156,0.19734,0.11547,0.24078,0.07539,0.30078,0.06203,0.36125,0.07539,0.40484,0.11547,0.43121,0.18156,0.44,0.27297,0.43121,0.36465,0.40484,0.43063,0.36125,0.47059],"t":[12,20,19,12,19,18,21,20,12,21,12,11,21,11,10,21,10,9,9,8,7,9,7,6,6,5,4,6,4,3,6,3,2,2,1,0,2,0,15,2,15,14,14,13,12,14,12,18,14,18,17,14,17,16,22,21,9,2,14,16,2,16,31,2,31,30,2,30,29,2,29,28,2,28,27,23,22,9,6,2,27,6,27,26,6,26,25,6,25,24,24,23,9,24,9,6]},"p":{"v":[0.18313,0.06891,0.18313,-0.20797,0.09281,-0.20797,0.09281,0.54688,0.18313,0.54688,0.18313,0.47703,0.20934,0.51277,0.24297,0.53875,0.28316,0.55469,0.32906,0.56,0.41758,0.54082,0.48469,0.48328,0.52699,0.39191,0.54109,0.27094,0.52691,0.15199,0.48438,0.06172,0.41727,0.00477,0.32906,-0.01422,0.28242,-0.00891,0.24188,0.00703,0.20852,0.03313,0.44672,0.27297,0.43848,0.36465,0.41375,0.43063,0.37289,0.47059,0.31594,0.48391,0.2584,0.47055,0.21672,0.43047,0.19152,0.36438,0.18313,0.27297,0.19152,0.18184,0.21672,0.11563,0.2584,0.07543,0.31594,0.06203,0.37289,0.07531,0.41375,0.11516,0.43848,0.18125],"t":[2,29,28,30,29,2,2,1,0,0,20,19,0,19,18,0,18,17,0,17,16,16,15,14,16,14,13,16,13,12,16,12,11,11,10,9,11,9,8,11,8,7,11,7,6,5,4,3,5,3,2,5,2,28,5,28,27,5,27,26,5,26,25,30,2,0,6,5,25,6,25,24,31,30,0,11,6,24,11,24,23,11,23,22,11,22,21,11,21,36,32,31,0,32,0,16,16,11,36,16,36,35,16,35,34,16,34,33,16,33,32]},"q":{"v":[0.42484,0.06781,0.39898,0.03203,0.36547,0.00562,0.32512,-0.01066,0.27875,-0.01609,0.19094,0.00289,0.12375,0.05984,0.08109,0.15012,0.06688,0.26906,0.08102,0.39004,0.12344,0.48141,0.19062,0.53895,0.27875,0.55812,0.32477,0.55281,0.365,0.53687,0.39863,0.51082,0.42484,0.47516,0.42484,0.545,0.51516,0.545,0.51516,-0.21,0.42484,-0.21,0.16219,0.27094,0.17039,0.17934,0.195,0.11328,0.23598,0.07332,0.29297,0.06,0.35008,0.07336,0.39141,0.11344,0.41648,0.17961,0.42484,0.27094,0.41648,0.36234,0.39141,0.42844,0.35008,0.46852,0.29297,0.48187,0.23598,0.46855,0.195,0.42859,0.17039,0.36262],"t":[8,21,36,8,36,35,22,21,8,22,8,7,22,7,6,22,6,5,5,4,3,5,3,2,5,2,1,5,1,0,0,20,19,0,19,18,18,17,16,16,15,14,16,14,13,16,13,12,16,12,11,11,10,9,11,9,8,11,8,35,11,35,34,11,34,33,11,33,32,23,22,5,16,11,32,16,32,31,16,31,30,16,30,29,24,23,5,18,16,29,18,29,28,25,24,5,25,5,0,0,18,28,0,28,27,0,27,26,0,26,25]},"r":{"v":[0.56391,0.43406,0.53488,0.45348,0.50531,0.46672,0.47414,0.47445,0.44,0.47703,0.36582,0.46383,0.31141,0.42422,0.27812,0.35984,0.26703,0.27203,0.26703,0.0,0.17672,0.0,0.17672,0.54688,0.26703,0.54688,0.26703,0.44,0.29555,0.49133,0.33609,0.52906,0.38711,0.55227,0.44672,0.56,0.47887,0.55793,0.50875,0.55172,0.53699,0.54113,0.56391,0.52594],"t":[1,0,21,1,21,20,1,20,19,1,19,18,1,18,17,1,17,16,16,15,14,16,14,13,13,12,11,13,11,10,10,9,8,10,8,7,2,1,16,13,10,7,13,7,6,13,6,5,3,2,16,16,13,5,16,5,4,16,4,3]},"s":{"v":[0.47516,0.52781,0.47516,0.44,0.43645,0.45957,0.3975,0.47359,0.35805,0.48203,0.31781,0.48484,0.26457,0.47988,0.22672,0.465,0.20422,0.44012,0.19672,0.40484,0.20234,0.37277,0.21922,0.35,0.25844,0.33227,0.33109,0.315,0.36719,0.30812,0.42594,0.2891,0.46844,0.25734,0.49434,0.21352,0.50297,0.15828,0.48855,0.08602,0.44531,0.03141,0.37645,-0.00281,0.28516,-0.01422,0.24367,-0.01207,0.20016,-0.00562,0.15395,0.00508,0.10406,0.02,0.10406,0.11281,0.15324,0.09012,0.20016,0.07391,0.24488,0.0643,0.28719,0.06109,0.34,0.06711,0.37938,0.08516,0.40398,0.11418,0.41219,0.15281,0.38227,0.20566,0.2925,0.23922,0.28859,0.24031,0.25484,0.24703,0.1877,0.26738,0.14156,0.29813,0.11484,0.34055,0.10594,0.39594,0.11922,0.46566,0.15906,0.51734,0.22371,0.54934,0.31109,0.56,0.35414,0.55797,0.39547,0.55188,0.4357,0.54187],"t":[1,0,50,1,50,49,1,49,48,1,48,47,47,46,45,47,45,44,47,44,43,47,43,42,42,41,40,42,40,39,42,39,38,42,38,37,42,37,36,28,27,26,28,26,25,28,25,24,28,24,23,28,23,22,28,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,16,13,12,2,1,47,29,28,21,3,2,47,30,29,21,4,3,47,31,30,21,5,4,47,32,31,21,6,5,47,33,32,21,7,6,47,34,33,21,34,21,16,8,7,47,8,47,42,35,34,16,9,8,42,36,35,16,36,16,12,36,12,11,10,9,42,42,36,11,42,11,10]},"t":{"v":[0.29984,0.70219,0.29984,0.54688,0.50391,0.54688,0.50391,0.47703,0.29984,0.47703,0.29984,0.18016,0.30559,0.12879,0.32281,0.09563,0.3543,0.0777,0.40281,0.07172,0.50391,0.07172,0.50391,0.0,0.39406,0.0,0.30785,0.01012,0.25141,0.04047,0.22035,0.0957,0.21,0.18016,0.21,0.47703,0.06391,0.47703,0.06391,0.54688,0.21,0.54688,0.21,0.70219],"t":[1,0,21,1,21,20,20,19,18,20,18,17,17,16,15,17,15,14,17,14,13,13,12,11,13,11,10,13,10,9,13,9,8,13,8,7,13,7,6,13,6,5,4,3,2,4,2,1,4,1,20,4,20,17,17,13,5,17,5,4]},"u":{"v":[0.09516,0.20703,0.09516,0.54594,0.185,0.54594,0.185,0.20703,0.19152,0.14305,0.21109,0.09859,0.24445,0.07258,0.29203,0.06391,0.34801,0.07508,0.38906,0.10859,0.41438,0.16301,0.42281,0.23688,0.42281,0.54594,0.51313,0.54594,0.51313,0.0,0.42281,0.0,0.42281,0.08203,0.39457,0.04039,0.35766,0.01016,0.31293,-0.00813,0.26125,-0.01422,0.18793,-0.00047,0.13609,0.04078,0.10539,0.10984],"t":[1,0,23,1,23,22,1,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,13,12,11,13,11,10,3,2,1,3,1,21,16,13,10,16,10,9,16,9,8,16,8,7,4,3,21,21,16,7,21,7,6,21,6,5,21,5,4]},"v":{"v":[0.04891,0.54688,0.14203,0.54688,0.30078,0.08797,0.46,0.54688,0.55328,0.54688,0.35891,0.0,0.24313,0.0],"t":[1,0,6,5,4,3,5,3,2,2,1,6,2,6,5]},"w":{"v":[0.0,0.54688,0.08891,0.54688,0.18406,0.105,0.26219,0.38719,0.33891,0.38719,0.41797,0.105,0.51313,0.54688,0.60203,0.54688,0.47406,0.0,0.38812,0.0,0.30078,0.29984,0.21391,0.0,0.12797,0.0],"t":[1,0,12,12,11,10,10,9,8,8,7,6,8,6,5,5,4,3,2,1,12,2,12,10,10,8,5,10,5,3,10,3,2]},"x":{"v":[0.54594,0.54688,0.35016,0.28516,0.565,0.0,0.46094,0.0,0.30078,0.21922,0.14109,0.0,0.03719,0.0,0.25203,0.28516,0.05609,0.54688,0.15578,0.54688,0.30078,0.34906,0.44484,0.54688],"t":[1,0,11,1,11,10,10,9,8,10,8,7,10,7,6,10,6,5,10,5,4,10,4,3,10,3,2,10,2,1]},"y":{"v":[0.41891,0.17578,0.39348,0.10961,0.36188,0.02547,0.32141,-0.0784,0.29688,-0.13187,0.27156,-0.1652,0.24063,-0.18891,0.20422,-0.2032,0.16219,-0.20797,0.08984,-0.20797,0.08984,-0.13281,0.14313,-0.13281,0.17836,-0.12707,0.205,-0.10984,0.23055,-0.06871,0.26219,0.00875,0.05078,0.54688,0.14594,0.54688,0.30812,0.11922,0.46781,0.54688,0.56297,0.54688],"t":[0,20,19,0,19,18,18,17,16,18,16,15,18,15,14,11,10,9,11,9,8,11,8,7,11,7,6,11,6,5,11,5,4,4,3,2,4,2,1,4,1,0,4,0,18,4,18,14,4,14,13,4,13,12,4,12,11]},"z":{"v":[0.11078,0.54781,0.50781,0.54781,0.50781,0.46578,0.19391,0.07328,0.50781,0.07328,0.50781,0.0,0.09906,0.0,0.09906,0.08297,0.41313,0.47609,0.11078,0.47609],"t":[1,0,9,1,9,8,1,8,7,1,7,6,6,5,4,6,4,3,6,3,2,6,2,1]},"{":{"v":[0.49422,-0.09281,0.49422,-0.16312,0.46297,-0.16312,0.36137,-0.15406,0.3,-0.12688,0.26906,-0.07285,0.25875,0.01703,0.25875,0.13375,0.25223,0.19613,0.23266,0.23578,0.19598,0.25711,0.13812,0.26422,0.10797,0.26422,0.10797,0.33406,0.13812,0.33406,0.19625,0.34102,0.23281,0.36188,0.25227,0.40105,0.25875,0.46297,0.25875,0.58016,0.26906,0.67,0.3,0.72391,0.36137,0.75086,0.46297,0.75984,0.49422,0.75984,0.49422,0.69,0.46,0.69,0.40348,0.68469,0.37078,0.66875,0.35531,0.63547,0.35016,0.57812,0.35016,0.45703,0.34457,0.39082,0.32781,0.34563,0.29777,0.31668,0.25203,0.29891,0.29809,0.28027,0.32812,0.25094,0.34465,0.2059,0.35016,0.14016,0.35016,0.01906,0.35531,-0.03855,0.37078,-0.07172,0.40348,-0.08754,0.46,-0.09281],"t":[1,0,44,1,44,43,1,43,42,40,39,38,40,38,37,40,37,36,40,36,35,35,34,33,35,33,32,35,32,31,35,31,30,35,30,29,26,25,24,26,24,23,26,23,22,26,22,21,21,20,19,21,19,18,21,18,17,14,13,12,14,12,11,14,11,10,14,10,9,7,6,5,7,5,4,7,4,3,3,2,1,3,1,42,3,42,41,3,41,40,3,40,35,27,26,21,15,14,9,15,9,8,8,7,3,8,3,35,28,27,21,16,15,8,16,8,35,29,28,21,29,21,17,17,16,35,17,35,29]},"|":{"v":[0.34281,0.76422,0.34281,-0.23578,0.25875,-0.23578,0.25875,0.76422],"t":[1,0,3,1,3,2]},"}":{"v":[0.10797,-0.09281,0.14109,-0.09281,0.19801,-0.08742,0.23094,-0.07125,0.24676,-0.03797,0.25203,0.01906,0.25203,0.14016,0.2575,0.2059,0.27391,0.25094,0.30398,0.28027,0.35016,0.29891,0.3043,0.31668,0.27422,0.34563,0.25758,0.39082,0.25203,0.45703,0.25203,0.57812,0.24676,0.63516,0.23094,0.66844,0.19801,0.68461,0.14109,0.69,0.10797,0.69,0.10797,0.75984,0.13812,0.75984,0.23965,0.75086,0.30078,0.72391,0.3316,0.67,0.34187,0.58016,0.34187,0.46297,0.3484,0.40105,0.36797,0.36188,0.40477,0.34102,0.46297,0.33406,0.49422,0.33406,0.49422,0.26422,0.46297,0.26422,0.40477,0.25711,0.36797,0.23578,0.3484,0.19613,0.34187,0.13375,0.34187,0.01703,0.3316,-0.07285,0.30078,-0.12688,0.23965,-0.15406,0.13812,-0.16312,0.10797,-0.16312],"t":[1,0,44,1,44,43,1,43,42,1,42,41,41,40,39,41,39,38,41,38,37,34,33,32,34,32,31,34,31,30,34,30,29,27,26,25,27,25,24,27,24,23,23,22,21,23,21,20,23,20,19,23,19,18,23,18,17,23,17,16,23,16,15,15,14,13,15,13,12,15,12,11,15,11,10,10,9,8,10,8,7,10,7,6,10,6,5,10,5,4,2,1,41,35,34,29,35,29,28,28,27,23,28,23,15,28,15,10,3,2,41,36,35,28,36,28,10,4,3,41,4,41,37,37,36,10,37,10,4]},"~":{"v":[0.55906,0.38094,0.55906,0.29594,0.52289,0.2709,0.4875,0.25359,0.45172,0.24363,0.41406,0.24031,0.36734,0.24652,0.315,0.26516,0.30559,0.2693,0.29891,0.27203,0.26437,0.28555,0.23609,0.29391,0.21102,0.29836,0.18609,0.29984,0.14852,0.29621,0.11297,0.28531,0.07828,0.26687,0.04297,0.24031,0.04297,0.32516,0.08047,0.35047,0.11672,0.36766,0.15355,0.37762,0.19281,0.38094,0.21836,0.37957,0.24313,0.37547,0.27055,0.3677,0.30375,0.355,0.31066,0.35191,0.31984,0.34766,0.37363,0.3275,0.42188,0.32078,0.4559,0.32449,0.48953,0.33563,0.52363,0.35445],"t":[1,0,33,1,33,32,1,32,31,1,31,30,1,30,29,28,27,26,28,26,25,28,25,24,28,24,23,28,23,22,28,22,21,28,21,20,28,20,19,28,19,18,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,8,2,1,8,1,29,8,29,28,28,18,12,28,12,11,28,11,10,28,10,9,28,9,8]},"\u00b1":{"v":[0.04297,0.08297,0.55906,0.08297,0.55906,0.0,0.04297,0.0,0.34187,0.57172,0.34187,0.41109,0.55906,0.41109,0.55906,0.32812,0.34187,0.32812,0.34187,0.16609,0.25984,0.16609,0.25984,0.32812,0.04297,0.32812,0.04297,0.41109,0.25984,0.41109,0.25984,0.57172],"t":[1,0,3,1,3,2,5,4,15,5,15,14,14,13,12,14,12,11,11,10,9,11,9,8,8,7,6,8,6,5,8,5,14,8,14,11]},"\u00b5":{"v":[0.09516,-0.20906,0.09516,0.54688,0.185,0.54688,0.185,0.20703,0.1923,0.14578,0.21422,0.10078,0.2498,0.07312,0.29781,0.06391,0.35219,0.0743,0.39125,0.10547,0.41492,0.15687,0.42281,0.22797,0.42281,0.54688,0.51313,0.54688,0.51313,0.125,0.51508,0.1,0.52094,0.0825,0.53086,0.0723,0.545,0.06891,0.55004,0.06949,0.55641,0.07125,0.56512,0.07473,0.57719,0.08016,0.57719,0.00781,0.5591,-0.00195,0.54203,-0.00875,0.52543,-0.01285,0.50875,-0.01422,0.48152,-0.00941,0.46016,0.005,0.445,0.02918,0.43609,0.06297,0.41109,0.02891,0.38109,0.00484,0.34586,-0.00945,0.30516,-0.01422,0.26375,-0.00957,0.22922,0.00438,0.20062,0.02809,0.17672,0.06203,0.17672,-0.20906],"t":[1,0,40,1,40,39,1,39,38,38,37,36,38,36,35,38,35,34,38,34,33,38,33,32,38,32,31,31,30,29,31,29,28,31,28,27,31,27,26,31,26,25,31,25,24,31,24,23,23,22,21,23,21,20,23,20,19,23,19,18,23,18,17,23,17,16,14,13,12,14,12,11,14,11,10,14,10,9,14,9,8,3,2,1,3,1,38,31,23,16,31,16,15,31,15,14,31,14,8,31,8,7,4,3,38,38,31,7,38,7,6,38,6,5,38,5,4]},"\u03a9":{"v":[0.03609,0.0,0.03609,0.08406,0.15578,0.08406,0.10406,0.15063,0.06891,0.21969,0.04875,0.29539,0.04203,0.38188,0.05961,0.51816,0.11234,0.62328,0.19438,0.69055,0.29984,0.71297,0.40605,0.69063,0.48844,0.62359,0.54141,0.51848,0.55906,0.38188,0.55227,0.29531,0.53187,0.21938,0.4966,0.15031,0.44484,0.08406,0.56594,0.08406,0.56594,0.0,0.33984,0.0,0.33984,0.08406,0.39195,0.13191,0.43109,0.20141,0.4557,0.28875,0.46391,0.39016,0.45289,0.49059,0.41984,0.56719,0.36813,0.6157,0.30078,0.63187,0.23348,0.6157,0.18188,0.56719,0.14906,0.49059,0.13812,0.39016,0.14629,0.28875,0.17078,0.20141,0.21004,0.13191,0.26219,0.08406,0.26219,0.0],"t":[1,0,39,39,38,37,39,37,36,23,22,21,21,20,19,21,19,18,21,18,17,21,17,16,21,16,15,21,15,14,14,13,12,14,12,11,11,10,9,11,9,8,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,2,1,39,2,39,36,2,36,35,2,35,34,24,23,21,24,21,14,8,2,34,8,34,33,8,33,32,8,32,31,8,31,30,25,24,14,11,8,30,11,30,29,11,29,28,11,28,27,26,25,14,14,11,27,14,27,26]},"\u00b0":{"v":[0.30078,0.74219,0.33172,0.73918,0.36109,0.73016,0.38789,0.71562,0.41109,0.69578,0.43047,0.67238,0.44453,0.64594,0.4532,0.61703,0.45609,0.58594,0.44473,0.52648,0.41063,0.47687,0.36027,0.44336,0.29984,0.43219,0.23938,0.44316,0.18984,0.47609,0.15691,0.52551,0.14594,0.58594,0.15715,0.64637,0.19078,0.69672,0.24078,0.73082,0.30078,0.67922,0.26504,0.67242,0.235,0.65203,0.21473,0.62199,0.20797,0.58594,0.21461,0.55004,0.23453,0.52047,0.26422,0.50078,0.29984,0.49422,0.33602,0.5009,0.36641,0.52094,0.38715,0.55063,0.39406,0.58594,0.38723,0.62172,0.36672,0.65187,0.33656,0.67238],"t":[16,24,23,16,23,22,25,24,16,25,16,15,25,15,14,25,14,13,13,12,11,13,11,10,13,10,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,9,2,1,1,0,19,1,19,18,1,18,17,1,17,16,1,16,22,1,22,21,1,21,20,1,20,35,1,35,34,1,34,33,26,25,13,9,1,33,9,33,32,9,32,31,9,31,30,9,30,29,27,26,13,13,9,29,13,29,28,13,28,27]},"\u2013":{"v":[0.0,0.30906,0.60203,0.30906,0.60203,0.24031,0.0,0.24031],"t":[1,0,3,1,3,2]},"\u2014":{"v":[0.0,0.30906,0.60203,0.30906,0.60203,0.24031,0.0,0.24031],"t":[1,0,3,1,3,2]},"\u00d7":{"v":[0.07328,0.14313,0.24422,0.31297,0.07328,0.48391,0.12984,0.54109,0.30078,0.37016,0.47219,0.54109,0.52875,0.48391,0.35797,0.31297,0.52781,0.14313,0.47125,0.085,0.30078,0.25594,0.13094,0.085],"t":[1,0,11,1,11,10,1,10,9,1,9,8,1,8,7,1,7,6,1,6,5,1,5,4,1,4,3,1,3,2]},"\u00b7":{"v":[0.23875,0.42188,0.36188,0.42188,0.36188,0.27297,0.23875,0.27297],"t":[1,0,3,1,3,2]},"\u2032":{"v":[0.20906,0.54688,0.29391,0.72906,0.39266,0.72906,0.25203,0.54688],"t":[1,0,3,1,3,2]},"\u2033":{"v":[0.28234,0.54688,0.36719,0.72906,0.46594,0.72906,0.32531,0.54688,0.13578,0.54688,0.22063,0.72906,0.31938,0.72906,0.17875,0.54688],"t":[1,0,3,1,3,2,5,4,7,5,7,6]},"\u2264":{"v":[0.55906,0.21391,0.55906,0.125,0.04297,0.28719,0.04297,0.36922,0.55906,0.53078,0.55906,0.44094,0.16797,0.32812,0.55906,0.08297,0.55906,0.0,0.04297,0.0,0.04297,0.08297],"t":[1,0,6,6,5,4,6,4,3,6,3,2,6,2,1,8,7,10,8,10,9]},"\u2265":{"v":[0.04297,0.21391,0.435,0.32812,0.04297,0.44094,0.04297,0.53078,0.55906,0.36922,0.55906,0.28719,0.04297,0.125,0.04297,0.08297,0.55906,0.08297,0.55906,0.0,0.04297,0.0],"t":[1,0,6,1,6,5,1,5,4,1,4,3,1,3,2,8,7,10,8,10,9]},"\u2248":{"v":[0.55906,0.47016,0.55906,0.38484,0.52289,0.3598,0.4875,0.3425,0.45172,0.33242,0.41406,0.32906,0.36734,0.33531,0.315,0.35406,0.30559,0.35816,0.29891,0.36078,0.26437,0.37477,0.23609,0.38328,0.21102,0.38773,0.18609,0.38922,0.14852,0.38559,0.11297,0.37469,0.07828,0.35609,0.04297,0.32906,0.04297,0.41406,0.08047,0.43941,0.11672,0.45672,0.15355,0.4668,0.19281,0.47016,0.21836,0.46883,0.24313,0.46484,0.27066,0.45695,0.30422,0.44391,0.31055,0.44105,0.31984,0.43656,0.37363,0.41676,0.42188,0.41016,0.4559,0.41383,0.48953,0.42484,0.52363,0.44352,0.55906,0.29109,0.55906,0.20516,0.52289,0.18004,0.4875,0.1625,0.45172,0.1523,0.41406,0.14891,0.36734,0.15516,0.315,0.17391,0.30559,0.17813,0.29891,0.18109,0.26238,0.19574,0.23406,0.20438,0.21004,0.20859,0.18609,0.21,0.14887,0.20633,0.11344,0.19531,0.07863,0.17637,0.04297,0.14891,0.04297,0.23391,0.08082,0.26,0.11719,0.27766,0.15391,0.28773,0.19281,0.29109,0.24387,0.28437,0.30328,0.26422,0.30375,0.26422,0.31043,0.26113,0.31984,0.25688,0.37363,0.23672,0.42188,0.23,0.45523,0.23371,0.48875,0.24484,0.5232,0.26391],"t":[1,0,33,1,33,32,1,32,31,1,31,30,1,30,29,28,27,26,28,26,25,28,25,24,28,24,23,28,23,22,28,22,21,28,21,20,28,20,19,28,19,18,18,17,16,18,16,15,18,15,14,18,14,13,18,13,12,10,9,8,8,7,6,8,6,5,8,5,4,8,4,3,8,3,2,8,2,1,8,1,29,8,29,28,28,18,12,28,12,11,28,11,10,28,10,8,35,34,66,35,66,65,35,65,64,35,64,63,35,63,62,60,59,58,60,58,57,60,57,56,60,56,55,60,55,54,60,54,53,60,53,52,52,51,50,52,50,49,52,49,48,52,48,47,52,47,46,42,41,40,42,40,39,42,39,38,42,38,37,42,37,36,42,36,35,42,35,62,42,62,61,42,61,60,60,52,46,60,46,45,60,45,44,60,44,43,60,43,42]},"\u00f7":{"v":[0.24125,0.19281,0.36078,0.19281,0.36078,0.07328,0.24125,0.07328,0.24125,0.55422,0.36078,0.55422,0.36078,0.43406,0.24125,0.43406,0.04297,0.355,0.55906,0.355,0.55906,0.27203,0.04297,0.27203],"t":[1,0,3,1,3,2,5,4,7,5,7,6,9,8,11,9,11,10]},"\u221a":{"v":[0.04891,0.35797,0.02875,0.41891,0.17094,0.46687,0.27781,0.10984,0.50594,0.82812,0.57812,0.82812,0.57812,0.76422,0.55516,0.76422,0.30812,-0.01906,0.24609,-0.01906,0.12594,0.38375],"t":[1,0,10,10,9,8,7,6,5,7,5,4,7,4,3,2,1,10,2,10,8,8,7,3,8,3,2]},"\u221e":{"v":[0.30078,0.37312,0.32695,0.42363,0.35953,0.46109,0.39762,0.48441,0.44,0.49219,0.49406,0.47883,0.54,0.43875,0.57152,0.37914,0.58203,0.30719,0.57207,0.23305,0.54219,0.17375,0.49703,0.13496,0.44094,0.12203,0.40277,0.12812,0.36922,0.14641,0.33625,0.18078,0.29984,0.23484,0.26797,0.18293,0.23578,0.14813,0.20129,0.12855,0.16219,0.12203,0.10621,0.13508,0.06047,0.17422,0.03012,0.23363,0.02,0.30719,0.02957,0.38305,0.05828,0.44188,0.1032,0.47961,0.16109,0.49219,0.20383,0.48516,0.24016,0.46406,0.27195,0.42734,0.33891,0.30609,0.36531,0.2502,0.38891,0.21531,0.41301,0.19703,0.44094,0.19094,0.4725,0.1991,0.49781,0.22359,0.51445,0.26137,0.52,0.30906,0.51488,0.35613,0.49953,0.39266,0.47562,0.41609,0.44484,0.42391,0.4143,0.41676,0.38703,0.39531,0.36219,0.35871,0.26219,0.31,0.23605,0.36516,0.21234,0.39969,0.18812,0.41785,0.16016,0.42391,0.12859,0.41578,0.10328,0.39141,0.08664,0.3541,0.08109,0.30719,0.08613,0.25934,0.10125,0.22234,0.1248,0.19879,0.15484,0.19094,0.18578,0.19812,0.21328,0.21969,0.23848,0.25672],"t":[63,32,47,63,47,46,33,32,63,33,63,62,57,56,24,57,24,23,57,23,22,57,22,21,21,20,19,21,19,18,21,18,17,21,17,16,16,15,14,16,14,13,16,13,12,16,12,11,11,10,9,11,9,8,11,8,7,11,7,6,6,5,4,6,4,3,6,3,2,6,2,1,0,31,30,0,30,29,0,29,28,0,28,27,27,26,25,27,25,24,24,56,55,24,55,54,48,63,46,48,46,45,58,57,21,27,24,54,27,54,53,27,53,52,27,52,51,59,58,21,0,27,51,0,51,50,0,50,49,0,49,48,0,48,45,60,59,21,1,0,45,1,45,44,61,60,21,61,21,16,6,1,44,6,44,43,6,43,42,6,42,41,6,41,40,6,40,39,62,61,16,11,6,39,11,39,38,11,38,37,11,37,36,11,36,35,33,62,16,16,11,35,16,35,34,16,34,33]},"\u0394":{"v":[0.58406,0.0,0.01812,0.0,0.24125,0.72906,0.36078,0.72906,0.45797,0.08297,0.30078,0.64203,0.14359,0.08297],"t":[1,6,5,4,6,1,4,1,0,4,0,3,2,1,5,5,4,3,5,3,2]},"\u03b1":{"v":[0.24422,0.55906,0.36488,0.52148,0.42438,0.40375,0.47266,0.54688,0.55281,0.54688,0.45266,0.25047,0.47219,0.14359,0.47973,0.12066,0.49359,0.09969,0.51262,0.08211,0.52938,0.07625,0.57234,0.07625,0.57234,0.0,0.51859,0.0,0.47391,0.01027,0.43172,0.04109,0.41453,0.06719,0.40328,0.10453,0.37527,0.05371,0.33594,0.00781,0.30199,-0.00742,0.24422,-0.01219,0.15777,0.00684,0.09187,0.06203,0.04863,0.15281,0.03422,0.27297,0.04961,0.3982,0.09578,0.48391,0.16773,0.53957,0.37406,0.25438,0.3525,0.36719,0.31449,0.45379,0.24422,0.48297,0.20082,0.46977,0.16656,0.42922,0.13832,0.35672,0.12891,0.27297,0.13793,0.17953,0.165,0.11422,0.20363,0.07508,0.24422,0.06203,0.30164,0.08805,0.34422,0.16609],"t":[25,36,35,25,35,34,25,34,33,37,36,25,37,25,24,37,24,23,37,23,22,22,21,20,22,20,19,22,19,18,22,18,17,17,16,15,17,15,14,17,14,13,17,13,12,12,11,10,12,10,9,12,9,8,5,4,3,5,3,2,5,2,1,5,1,0,0,28,27,0,27,26,0,26,25,0,25,33,0,33,32,0,32,31,38,37,22,17,12,8,17,8,7,17,7,6,17,6,5,5,0,31,5,31,30,5,30,29,5,29,42,5,42,41,39,38,22,17,5,41,17,41,40,40,39,22,40,22,17]},"\u03b2":{"v":[0.16453,0.03375,0.16453,-0.20797,0.07422,-0.20797,0.07422,0.54344,0.13051,0.71801,0.29938,0.76609,0.44551,0.71254,0.49422,0.57812,0.47289,0.46512,0.41016,0.39547,0.51223,0.33879,0.54688,0.22125,0.48906,0.0532,0.31156,-0.01031,0.24309,-0.0007,0.16453,0.16703,0.22191,0.11281,0.315,0.08797,0.42047,0.11473,0.45563,0.21969,0.39898,0.32035,0.22906,0.34672,0.22906,0.42969,0.36195,0.46457,0.40625,0.57516,0.3777,0.64602,0.29203,0.67391,0.19641,0.64414,0.16453,0.54047],"t":[2,15,28,23,22,21,23,21,20,23,20,19,2,1,0,0,14,13,0,13,12,12,11,10,9,8,7,9,7,6,6,5,4,4,3,2,4,2,28,4,28,27,4,27,26,15,2,0,6,4,26,6,26,25,6,25,24,16,15,0,9,6,24,9,24,23,9,23,19,17,16,0,17,0,12,10,9,19,10,19,18,18,17,12,18,12,10]},"\u03b3":{"v":[0.1075,0.40828,0.07949,0.45434,0.03953,0.46969,0.01562,0.46969,0.01562,0.54688,0.04984,0.54688,0.12879,0.52539,0.17625,0.46094,0.30078,0.12641,0.46,0.54688,0.55328,0.54688,0.34766,0.0,0.34766,-0.20797,0.25484,-0.20797,0.25484,0.0],"t":[14,13,12,14,12,11,14,11,10,14,10,9,14,9,8,14,8,7,14,7,6,6,5,4,6,4,3,6,3,2,6,2,1,6,1,0,6,0,14]},"\u03b4":{"v":[0.16312,0.52094,0.15121,0.52922,0.13422,0.545,0.1116,0.57852,0.10406,0.61969,0.11852,0.67949,0.16187,0.72609,0.2293,0.75609,0.31594,0.76609,0.35941,0.76465,0.39016,0.76031,0.46391,0.74266,0.46391,0.65828,0.43121,0.66887,0.3975,0.67719,0.35633,0.68324,0.31594,0.68453,0.30031,0.68406,0.26625,0.67812,0.23531,0.66219,0.21625,0.64844,0.20641,0.63402,0.20312,0.61422,0.20473,0.59984,0.20953,0.58891,0.22074,0.57754,0.23781,0.56688,0.25941,0.56203,0.30078,0.56,0.4016,0.5409,0.47469,0.48641,0.52004,0.39617,0.53516,0.27297,0.52012,0.14945,0.475,0.05922,0.40145,0.00414,0.30078,-0.01422,0.20043,0.00414,0.12688,0.05922,0.08188,0.14945,0.06688,0.27297,0.08191,0.39617,0.12703,0.48641,0.14355,0.50426,0.30078,0.48391,0.24078,0.47059,0.19734,0.43063,0.17098,0.36465,0.16219,0.27297,0.17098,0.18156,0.19734,0.11547,0.24078,0.07539,0.30078,0.06203,0.36125,0.07539,0.40484,0.11547,0.43121,0.18156,0.44,0.27297,0.43121,0.36465,0.40484,0.43063,0.36125,0.47059],"t":[40,48,47,40,47,46,49,48,40,49,40,39,49,39,38,49,38,37,37,36,35,37,35,34,34,33,32,34,32,31,34,31,30,30,29,28,30,28,27,30,27,26,13,12,11,13,11,10,13,10,9,13,9,8,13,8,7,7,6,5,7,5,4,7,4,3,7,3,2,7,2,1,7,1,0,0,43,42,0,42,41,0,41,40,0,40,46,0,46,45,0,45,44,0,44,59,50,49,37,14,13,7,51,50,37,15,14,7,52,51,37,52,37,34,16,15,7,53,52,34,17,16,7,54,53,34,18,17,7,55,54,34,55,34,30,19,18,7,56,55,30,20,19,7,57,56,30,21,20,7,21,7,0,58,57,30,22,21,0,59,58,30,59,30,26,59,26,25,23,22,0,0,59,25,0,25,24,0,24,23]},"\u03b5":{"v":[0.21922,0.29641,0.1677,0.31348,0.12937,0.34031,0.10594,0.37523,0.09813,0.4175,0.11301,0.47621,0.15766,0.52141,0.22793,0.55035,0.31938,0.56,0.36012,0.55855,0.40328,0.55422,0.44984,0.54684,0.49953,0.53656,0.49953,0.45516,0.45082,0.4666,0.40625,0.47469,0.36547,0.47902,0.32719,0.48047,0.26762,0.4752,0.22359,0.45938,0.19652,0.43465,0.1875,0.40234,0.19629,0.37473,0.22266,0.35156,0.26551,0.33551,0.32375,0.33016,0.40484,0.33016,0.40484,0.25984,0.32719,0.25984,0.26195,0.25312,0.21281,0.23297,0.18211,0.20293,0.17188,0.16656,0.18285,0.12414,0.21578,0.09281,0.27027,0.07371,0.34469,0.06734,0.39211,0.06957,0.4375,0.07625,0.4802,0.0866,0.51953,0.10109,0.51953,0.01656,0.47305,0.00465,0.42828,-0.00391,0.38441,-0.00906,0.34187,-0.01078,0.23184,0.00035,0.14984,0.03375,0.09934,0.08766,0.0825,0.15969,0.09152,0.20867,0.11859,0.24906,0.16187,0.27895],"t":[0,52,51,0,51,50,0,50,49,0,49,48,48,47,46,48,46,45,48,45,44,48,44,43,48,43,42,48,42,41,41,40,39,41,39,38,41,38,37,41,37,36,41,36,35,28,27,26,28,26,25,28,25,24,28,24,23,14,13,12,14,12,11,14,11,10,14,10,9,14,9,8,14,8,7,14,7,6,6,5,4,6,4,3,6,3,2,6,2,1,48,41,35,48,35,34,48,34,33,48,33,32,48,32,31,29,28,23,29,23,22,15,14,6,0,48,31,0,31,30,0,30,29,0,29,22,0,22,21,16,15,6,1,0,21,17,16,6,6,1,21,6,21,20,6,20,19,6,19,18,6,18,17]},"\u03b8":{"v":[0.30078,0.7325,0.40117,0.70848,0.47484,0.63641,0.52008,0.51918,0.53516,0.35938,0.52012,0.19852,0.475,0.08125,0.40145,0.00965,0.30078,-0.01422,0.20043,0.00965,0.12688,0.08125,0.08188,0.19852,0.06688,0.35938,0.08188,0.51918,0.12688,0.63641,0.20043,0.70848,0.43891,0.40437,0.42875,0.50359,0.40484,0.58063,0.36125,0.63664,0.30078,0.65531,0.24078,0.63664,0.19734,0.58063,0.1734,0.50359,0.16312,0.40437,0.43891,0.31453,0.16312,0.31453,0.17316,0.21574,0.19734,0.13812,0.24078,0.08176,0.30078,0.06297,0.36125,0.08176,0.40484,0.13812,0.42898,0.21574],"t":[12,24,23,12,23,22,16,24,12,16,12,26,16,26,25,27,26,12,27,12,11,27,11,10,27,10,9,9,8,7,9,7,6,6,5,4,6,4,3,6,3,2,2,1,0,2,0,15,15,14,13,15,13,12,15,12,22,15,22,21,15,21,20,15,20,19,28,27,9,2,15,19,2,19,18,2,18,17,2,17,16,2,16,25,2,25,33,29,28,9,6,2,33,6,33,32,6,32,31,6,31,30,30,29,9,30,9,6]},"\u03bb":{"v":[0.31344,0.67438,0.56547,0.0,0.47016,0.0,0.31688,0.40437,0.12844,0.0,0.03328,0.0,0.27297,0.52438,0.23688,0.62109,0.20086,0.6675,0.13875,0.68266,0.11469,0.68266,0.11469,0.75984,0.14891,0.75875,0.25691,0.73594],"t":[1,0,13,13,12,11,13,11,10,13,10,9,13,9,8,13,8,7,13,7,6,6,5,4,6,4,3,6,3,2,6,2,1,6,1,13]},"\u03c0":{"v":[0.03906,0.54688,0.56297,0.54688,0.56297,0.45703,0.49422,0.45703,0.49422,0.12109,0.49719,0.09086,0.50609,0.07047,0.52184,0.05898,0.545,0.05516,0.55309,0.05547,0.56297,0.05641,0.57191,0.05746,0.57719,0.05813,0.57719,-0.00688,0.55977,-0.0123,0.54187,-0.01609,0.52391,-0.01832,0.50594,-0.01906,0.45883,-0.01105,0.42813,0.01297,0.41137,0.05848,0.40578,0.13094,0.40578,0.45703,0.19672,0.45703,0.19672,0.0,0.10891,0.0,0.10891,0.45703,0.03906,0.45703],"t":[1,0,27,1,27,26,26,25,24,26,24,23,22,21,20,22,20,19,22,19,18,22,18,17,22,17,16,16,15,14,16,14,13,16,13,12,16,12,11,16,11,10,16,10,9,16,9,8,16,8,7,16,7,6,16,6,5,3,2,1,1,26,23,1,23,22,22,16,5,22,5,4,22,4,3,22,3,1]},"\u03c3":{"v":[0.43453,0.45703,0.51,0.36332,0.53516,0.24031,0.51672,0.13637,0.46141,0.04734,0.39344,0.00094,0.30078,-0.01422,0.20043,0.00414,0.12688,0.05922,0.08188,0.14945,0.06688,0.27297,0.08191,0.38867,0.12703,0.47703,0.19852,0.52941,0.30078,0.54688,0.55219,0.54688,0.55219,0.45703,0.29734,0.45656,0.23938,0.4468,0.19734,0.4175,0.17098,0.36113,0.16219,0.27297,0.17098,0.18156,0.19734,0.11547,0.24078,0.07539,0.30078,0.06203,0.36125,0.07539,0.40484,0.11547,0.43121,0.1734,0.44,0.24031,0.41898,0.34723,0.35594,0.42484,0.32668,0.44371],"t":[10,21,20,10,20,19,22,21,10,22,10,9,22,9,8,22,8,7,7,6,5,7,5,4,7,4,3,3,2,1,3,1,0,0,16,15,0,15,14,0,14,13,0,13,12,12,11,10,12,10,19,12,19,18,12,18,17,23,22,7,0,12,17,0,17,32,0,32,31,0,31,30,0,30,29,24,23,7,3,0,29,3,29,28,3,28,27,3,27,26,25,24,7,7,3,26,7,26,25]},"\u03c6":{"v":[0.3775,0.55078,0.44254,0.53469,0.50297,0.48641,0.54949,0.39871,0.565,0.27344,0.54949,0.15187,0.50297,0.0625,0.43219,0.00684,0.34578,-0.01172,0.34578,-0.20797,0.25641,-0.20797,0.25641,-0.01219,0.16836,0.00648,0.09859,0.0625,0.05254,0.15293,0.03719,0.27297,0.05254,0.39891,0.09859,0.48391,0.15551,0.52727,0.22469,0.55078,0.22469,0.47125,0.1948,0.4525,0.16891,0.42188,0.14113,0.3566,0.13187,0.27297,0.14113,0.18152,0.16891,0.11813,0.20984,0.08039,0.25641,0.06781,0.25641,0.40328,0.28668,0.51391,0.3775,0.47406,0.35371,0.45637,0.34578,0.40328,0.34578,0.06844,0.38992,0.08113,0.43266,0.11922,0.46078,0.18043,0.47016,0.27344,0.46078,0.36648,0.43266,0.42969,0.40152,0.46297],"t":[21,20,19,21,19,18,21,18,17,21,17,16,21,16,15,15,14,13,15,13,12,15,12,11,11,10,9,11,9,8,11,8,7,11,7,6,11,6,5,5,4,3,5,3,2,5,2,1,1,0,30,1,30,29,22,21,15,23,22,15,24,23,15,25,24,15,26,25,15,26,15,11,27,26,11,28,27,11,34,28,11,29,28,34,29,34,33,29,33,32,29,32,31,35,34,11,35,11,5,1,29,31,1,31,41,1,41,40,1,40,39,36,35,5,5,1,39,5,39,38,5,38,37,5,37,36]},"\u03c9":{"v":[0.50438,0.54688,0.55242,0.41496,0.56844,0.27703,0.5623,0.15645,0.54391,0.07625,0.49379,0.0084,0.41656,-0.01422,0.37746,-0.00793,0.34328,0.01094,0.31691,0.0391,0.30125,0.07328,0.28617,0.04035,0.26031,0.01188,0.22613,-0.0077,0.18609,-0.01422,0.10875,0.0084,0.05859,0.07625,0.04031,0.15645,0.03422,0.27703,0.0502,0.41496,0.09813,0.54688,0.19094,0.54688,0.14477,0.41117,0.12937,0.2725,0.13121,0.18219,0.13766,0.13187,0.16047,0.07902,0.18891,0.06203,0.22457,0.07629,0.2475,0.11719,0.25676,0.1932,0.25984,0.34125,0.34281,0.34125,0.34586,0.1932,0.355,0.11719,0.37793,0.07629,0.41359,0.06203,0.44203,0.07902,0.46484,0.13187,0.47129,0.18219,0.47313,0.2725,0.45773,0.41117,0.41156,0.54688],"t":[1,0,42,1,42,41,1,41,40,1,40,39,1,39,38,33,32,31,33,31,30,33,30,29,33,29,28,22,21,20,22,20,19,22,19,18,22,18,17,22,17,16,16,15,14,16,14,13,16,13,12,16,12,11,10,9,8,10,8,7,10,7,6,10,6,5,5,4,3,5,3,2,5,2,1,5,1,38,5,38,37,5,37,36,5,36,35,34,33,28,34,28,27,23,22,16,10,5,35,10,35,34,10,34,27,24,23,16,11,10,27,25,24,16,16,11,27,16,27,26,16,26,25]},"\u2192":{"v":[0.56984,0.25391,0.42781,0.11188,0.38375,0.15578,0.46188,0.23391,0.03219,0.23391,0.03219,0.31391,0.46188,0.31391,0.38375,0.39203,0.42781,0.43609,0.56984,0.29391],"t":[1,0,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,9,2,1]},"\u2190":{"v":[0.03219,0.25391,0.03219,0.29391,0.17438,0.43609,0.21828,0.39203,0.14016,0.31391,0.56984,0.31391,0.56984,0.23391,0.14016,0.23391,0.21828,0.15578,0.17438,0.11188],"t":[1,0,9,1,9,8,1,8,7,1,7,6,1,6,5,1,5,4,1,4,3,1,3,2]},"\u2191":{"v":[0.32125,0.53766,0.46297,0.39547,0.41891,0.35156,0.34078,0.42969,0.34078,0.0,0.26078,0.0,0.26078,0.42969,0.18266,0.35156,0.13875,0.39547,0.28125,0.53766],"t":[1,0,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,9,2,1]},"\u2193":{"v":[0.28125,0.0,0.13875,0.14203,0.18266,0.18609,0.26078,0.10797,0.26078,0.53766,0.34078,0.53766,0.34078,0.10797,0.41891,0.18609,0.46297,0.14203,0.32125,0.0],"t":[1,0,9,9,8,7,9,7,6,9,6,5,9,5,4,9,4,3,9,3,2,9,2,1]}}}
provenance/tools/landcheck.pyadded+116@@ -0,0 +1,116 @@+"""Compare the KiCad footprint pads with the manufacturer's recommended land pattern.++usage: landcheck.py <slug> <outdir>+Reads parts.PARTS[slug]["land"] and the page's footprint (KiCad library geometry).+Writes <outdir>/land-pattern.png (true-scale drawing + table) and+<outdir>/land-pattern-icon.png (256 px square thumbnail), prints a JSON result.++Drawing: grey = part body at datasheet nominal, teal = KiCad pads (copper),+amber dashed = the maker's land at the middle of its printed range (or its+printed nominal), amber band = the range the maker allows for the inner and+outer pad edges where the maker prints a range.+"""+import sys, os, json, re, glob+from PIL import Image, ImageDraw, ImageFont+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS++slug, outdir = sys.argv[1], sys.argv[2]+P = next(p for p in PARTS if p["slug"] == slug)+L = P["land"]+page = os.path.dirname(outdir.rstrip("/"))+fpf = glob.glob(os.path.join(page, "*.kicad_mod"))[0]+fp = open(fpf).read()+pads = [tuple(map(float, m)) for m in re.findall(r'\(pad "\d" smd roundrect\s*\(at ([-\d.]+) ([-\d.]+)\)\s*\(size ([\d.]+) ([\d.]+)\)', fp)]+x, _, w, h = pads[1]+k = {"gap": round(2 * x - w, 3), "len": round(w, 3), "wid": round(h, 3), "overall": round(2 * x + w, 3)}++def mid(v): return (v[0] + v[1]) / 2 if isinstance(v, list) else v+rows = []+if L["kind"] in ("range", "tol"):+ rng = {"gap": L["gap_a"], "len": L["len_b"], "wid": L["wid_c"]}+ rng["overall"] = L.get("overall") or [round(L["gap_a"][0] + 2 * L["len_b"][0], 3), round(L["gap_a"][1] + 2 * L["len_b"][1], 3)]+ derived_overall = not L.get("overall")+ for key, name in (("gap", "gap between lands"), ("len", "land length"), ("wid", "land width"),+ ("overall", "overall length (a + 2b, derived)" if derived_overall else "overall length")):+ lo, hi = rng[key]; v = k[key]+ ok = lo - 1e-6 <= v <= hi + 1e-6+ dev = 0 if ok else round(v - hi if v > hi else v - lo, 3)+ rows.append({"dim": name, "kicad_mm": v, "maker_min": lo, "maker_max": hi, "within": ok, "outside_by_mm": dev})+ ref = {kk: mid(rng[kk]) for kk in rng}+ if L["kind"] == "tol":+ ref = {"gap": L["nominal"]["gap_a"], "len": L["nominal"]["len_b"], "wid": L["nominal"]["wid_c"], "overall": L["nominal"]["overall"]}+else:+ ref = {"gap": L["gap_a"], "len": L["len_b"], "wid": L["wid_c"], "overall": L["overall"]}+ for key, name in (("gap", "gap between lands"), ("len", "land length"), ("wid", "land width"), ("overall", "overall length")):+ rows.append({"dim": name, "kicad_mm": k[key], "maker_nominal": ref[key], "difference_mm": round(k[key] - ref[key], 3)})++# ---------- drawing ----------+body = P["body_mm"]+span = max(k["overall"], ref["overall"] if isinstance(ref["overall"], float) else 0) + 0.4+PP = 560 / span+W_, H_ = 1000, int(max(k["wid"], ref["wid"], body["y_mm"]) * PP + 120)+img = Image.new("RGBA", (W_, H_), (255, 255, 255, 255))+d = ImageDraw.Draw(img, "RGBA")+cx, cy = W_ / 2, H_ / 2 + 10+def R(x0, y0, x1, y1): return [cx + x0 * PP, cy - y1 * PP, cx + x1 * PP, cy - y0 * PP]+# allowed edge bands (range kinds)+if L["kind"] in ("range", "tol"):+ g0, g1 = L["gap_a"]; b0, b1 = L["len_b"]; c1 = L["wid_c"][1]+ for s in (-1, 1):+ for a, b in ((g0 / 2, g1 / 2), (g0 / 2 + b0, g1 / 2 + b1)):+ xa, xb = sorted((s * a, s * b))+ d.rectangle(R(xa, -c1 / 2, xb, c1 / 2), fill=(255, 190, 70, 70))+# body+d.rectangle(R(-body["x_mm"] / 2, -body["y_mm"] / 2, body["x_mm"] / 2, body["y_mm"] / 2), outline=(110, 110, 110, 255), width=2)+# KiCad pads, rounded rect (rratio 0.25)+for px, py, pw, ph in pads:+ rr = 0.25 * min(pw, ph) * PP+ d.rounded_rectangle(R(px - pw / 2, py - ph / 2, px + pw / 2, py + ph / 2), radius=rr, fill=(0, 150, 150, 110), outline=(0, 120, 120, 255), width=2)+# maker land, dashed amber+def dashed(box, col, wdt=3):+ xa, ya, xb, yb = box+ for (p, q) in (((xa, ya), (xb, ya)), ((xb, ya), (xb, yb)), ((xb, yb), (xa, yb)), ((xa, yb), (xa, ya))):+ n = int(max(abs(q[0] - p[0]), abs(q[1] - p[1])) / 7) or 1+ for i in range(0, n, 2):+ t0, t1 = i / n, min(1, (i + 1) / n)+ d.line([(p[0] + (q[0] - p[0]) * t0, p[1] + (q[1] - p[1]) * t0), (p[0] + (q[0] - p[0]) * t1, p[1] + (q[1] - p[1]) * t1)], fill=col, width=wdt)+for s in (-1, 1):+ a, b = ref["gap"] / 2, ref["gap"] / 2 + ref["len"]+ xa, xb = sorted((s * a, s * b))+ dashed(R(xa, -ref["wid"] / 2, xb, ref["wid"] / 2), (200, 110, 0, 255))+icon_box = (int(cx - 0.5 * (k["overall"] + 0.25) * PP), int(cy - 0.5 * (k["overall"] + 0.25) * PP))+icon_side = int((k["overall"] + 0.25) * PP)+padded = Image.new("RGBA", (W_ + 2 * icon_side, H_ + 2 * icon_side), (255, 255, 255, 255)); padded.paste(img, (icon_side, icon_side))+icon = padded.crop((icon_box[0] + icon_side, icon_box[1] + icon_side, icon_box[0] + 2 * icon_side, icon_box[1] + 2 * icon_side)).convert("RGB").resize((256, 256), Image.LANCZOS)+mask = Image.new("L", (256, 256), 0); ImageDraw.Draw(mask).rounded_rectangle([0, 0, 255, 255], radius=28, fill=255)+ic = Image.new("RGBA", (256, 256), (0, 0, 0, 0)); ic.paste(icon, (0, 0), mask)+ic.save(os.path.join(outdir, "land-pattern-icon.png"))++f = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 15)+fb = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 17)+lines = []+for r in rows:+ if "within" in r:+ lines.append((f"{r['dim']}: KiCad {r['kicad_mm']:.2f} maker {r['maker_min']:.2f} to {r['maker_max']:.2f} "+ + ("inside" if r["within"] else f"outside by {r['outside_by_mm']:+.2f}"), (0, 120, 40) if r["within"] else (190, 90, 0)))+ else:+ lines.append((f"{r['dim']}: KiCad {r['kicad_mm']:.2f} maker {r['maker_nominal']:.2f} difference {r['difference_mm']:+.2f}", (40, 40, 40)))+sheet = Image.new("RGB", (W_, H_ + 100 + 24 * len(lines) + 70), (255, 255, 255))+sd = ImageDraw.Draw(sheet)+sd.text((14, 10), f"{P['mpn']}: KiCad {P['fp']} pads vs maker's land, true scale", fill=(0, 0, 0), font=fb)+sheet.paste(img.convert("RGB"), (0, 40))+y = H_ + 46+sd.text((14, y), "grey = body (nominal) teal = KiCad pads amber dashed = maker's land (middle of range or nominal)", fill=(60, 60, 60), font=f); y += 22+sd.text((14, y), "amber band = where the maker allows the inner and outer pad edges (range sheets only)", fill=(60, 60, 60), font=f); y += 26+for t, c in lines:+ sd.text((14, y), t, fill=c, font=f); y += 24+import textwrap+for ln in textwrap.wrap("Source: " + L["source"], 115):+ sd.text((14, y + 4), ln, fill=(90, 90, 90), font=f); y += 20+sheet.save(os.path.join(outdir, "land-pattern.png"))++res = {"footprint": os.path.basename(fpf), "kicad_library_footprint": P["fp"], "kicad": k, "maker_reference": ref,+ "maker_source": L["source"], "maker_letters": L["letters"], "rows": rows,+ "all_within": all(r.get("within", True) for r in rows) if L["kind"] != "nominal" else None}+print(json.dumps(res))
provenance/tools/lod.pyadded+170@@ -0,0 +1,170 @@+"""Board-use LOD GLBs (high, medium, low, super-low) for a small two-terminal chip.++Input: the page's board-use STEP (Z-up, mm, seated on z=0, centred).+Output (in <outdir>/lod/): high.glb medium.glb low.glb super-low.glb, a 400x300+PNG preview of each rendered from that GLB's own triangles, manifest.json+(schema adom/component-lod@1).++Every level: Z-up, metres, the same origin and pose as the STEP (no recentring,+no rotation), primitives batched by material (one per material), the STEP's own+colours. No footprint, pad outline, label or silkscreen helpers exist in the+source, so nothing is removed. high/medium/low are OCCT tessellations of the+exact B-rep at decreasing deflection; super-low replaces each material group by+its bounding box per side of the part (terminals, body, overcoat), which keeps+the silhouette, the terminal bands and the seating plane.++usage: lod.py part.step MPN outdir [source_label]+"""+import sys, os, json, struct, hashlib+import numpy as np+from PIL import Image, ImageDraw+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+import ortho+from OCP.BRepMesh import BRepMesh_IncrementalMesh+from OCP.BRepTools import BRepTools++step, mpn, outdir = sys.argv[1], sys.argv[2], sys.argv[3]+src_label = sys.argv[4] if len(sys.argv) > 4 else os.path.basename(step)+lod_dir = os.path.join(outdir, "lod"); os.makedirs(lod_dir, exist_ok=True)++LEVELS = [("high", 0.0005, 0.1), ("medium", 0.004, 0.35), ("low", 0.02, 0.9)]++def tris_at(lin, ang):+ # ortho.load_tris meshes with fixed params; clean and remesh by patching BRepMesh call+ orig = ortho.BRepMesh_IncrementalMesh+ def mesh(shp, _l, rel, _a, par):+ BRepTools.Clean_s(shp)+ return orig(shp, lin, False, ang, True)+ ortho.BRepMesh_IncrementalMesh = mesh+ try:+ return ortho.load_tris(step)+ finally:+ ortho.BRepMesh_IncrementalMesh = orig++def boxes_from(tris):+ groups = {}+ for p, c in tris:+ groups.setdefault(c, []).append(p)+ allp = np.concatenate([p for p, _ in tris]); xmax = allp[:, 0].max()+ endc = {}+ for p, c in tris:+ if np.allclose(p[:, 0], xmax, atol=1e-4): endc[c] = endc.get(c, 0) + 1+ tcol = max(endc, key=endc.get)+ boxes = []+ for c, ps in groups.items():+ T = np.stack(ps)+ crosses = ((T[:, :, 0].min(1) < -1e-6) & (T[:, :, 0].max(1) > 1e-6)).any()+ P = T.reshape(-1, 3)+ parts = [P] if crosses else [P[P[:, 0] < 0], P[P[:, 0] > 0]]+ for Q in parts:+ if len(Q):+ boxes.append([Q.min(0), Q.max(0), c])+ tin = min(min(abs(lo[0]), abs(hi[0])) for lo, hi, c in boxes if c == tcol)+ out = []+ for lo, hi, c in boxes:+ if c != tcol:+ lo = lo.copy(); hi = hi.copy(); lo[0] = max(lo[0], -tin); hi[0] = min(hi[0], tin)+ v = np.array([[x, y, z] for x in (lo[0], hi[0]) for y in (lo[1], hi[1]) for z in (lo[2], hi[2])])+ for a_, b_, cc, d in [(0, 1, 3, 2), (4, 6, 7, 5), (0, 4, 5, 1), (2, 3, 7, 6), (0, 2, 6, 4), (1, 5, 7, 3)]:+ out.append((v[[a_, b_, cc]], c)); out.append((v[[a_, cc, d]], c))+ return out++def write_glb(tris, path, name):+ mats = []; groups = {}+ for p, c in tris:+ if c not in groups:+ groups[c] = []; mats.append(c)+ groups[c].append(p)+ bin_ = b""; views = []; accs = []; prims = []+ def add_view(data, target):+ nonlocal bin_+ off = len(bin_); bin_ += data+ while len(bin_) % 4: bin_ += b"\0"+ views.append({"buffer": 0, "byteOffset": off, "byteLength": len(data), "target": target})+ return len(views) - 1+ decoded = 0; ntri = 0+ for mi, c in enumerate(mats):+ P = np.concatenate(groups[c]).reshape(-1, 3, 3)+ n = np.cross(P[:, 1] - P[:, 0], P[:, 2] - P[:, 0]); n /= np.linalg.norm(n, axis=1, keepdims=True) + 1e-30+ pos = (P.reshape(-1, 3) / 1000.0).astype(np.float32) # mm -> metres+ nor = np.repeat(n, 3, axis=0).astype(np.float32)+ # weld identical (position, normal) vertices+ key = np.concatenate([np.round(pos, 9), np.round(nor, 5)], 1)+ uniq, inv = np.unique(key, axis=0, return_inverse=True)+ upos = uniq[:, :3].astype(np.float32); unor = uniq[:, 3:].astype(np.float32)+ idx = inv.astype(np.uint16 if len(uniq) < 65535 else np.uint32).ravel()+ vp = add_view(upos.tobytes(), 34962); vn = add_view(unor.tobytes(), 34962); vi = add_view(idx.tobytes(), 34963)+ accs.append({"bufferView": vp, "componentType": 5126, "count": len(upos), "type": "VEC3",+ "min": upos.min(0).tolist(), "max": upos.max(0).tolist()})+ accs.append({"bufferView": vn, "componentType": 5126, "count": len(unor), "type": "VEC3"})+ accs.append({"bufferView": vi, "componentType": 5123 if idx.dtype == np.uint16 else 5125, "count": len(idx), "type": "SCALAR"})+ prims.append({"attributes": {"POSITION": len(accs) - 3, "NORMAL": len(accs) - 2}, "indices": len(accs) - 1, "material": mi})+ decoded += upos.nbytes + unor.nbytes + idx.nbytes; ntri += len(idx) // 3+ gl = {"asset": {"version": "2.0", "generator": "capencoder passives lod.py (OCCT tessellation)"},+ "scene": 0, "scenes": [{"nodes": [0]}],+ "nodes": [{"name": name, "mesh": 0, "extras": {"adomUpAxis": "Z", "units": "metres"}}],+ "meshes": [{"name": name, "primitives": prims}],+ "materials": [{"name": f"mat_{i}", "pbrMetallicRoughness": {"baseColorFactor": [*c, 1.0], "metallicFactor": 0.0, "roughnessFactor": 0.6}} for i, c in enumerate(mats)],+ "accessors": accs, "bufferViews": views, "buffers": [{"byteLength": len(bin_)}]}+ js = json.dumps(gl, separators=(",", ":")).encode()+ while len(js) % 4: js += b" "+ glb = struct.pack("<III", 0x46546C67, 2, 12 + 8 + len(js) + 8 + len(bin_)) + struct.pack("<II", len(js), 0x4E4F534A) + js + struct.pack("<II", len(bin_), 0x004E4942) + bin_+ open(path, "wb").write(glb)+ return {"decodedBufferBytes": decoded, "triangles": ntri, "primitives": len(prims)}++def read_glb_tris(path):+ b = open(path, "rb").read(); n = struct.unpack("<I", b[12:16])[0]+ j = json.loads(b[20:20 + n]); binc = b[20 + n + 8:]+ def acc(i, dt, w):+ a = j["accessors"][i]; v = j["bufferViews"][a["bufferView"]]+ return np.frombuffer(binc, dt, a["count"] * w, v["byteOffset"]).reshape(-1, w) if w > 1 else np.frombuffer(binc, dt, a["count"], v["byteOffset"])+ out = []+ for p in j["meshes"][0]["primitives"]:+ pos = acc(p["attributes"]["POSITION"], np.float32, 3) * 1000.0+ ia = j["accessors"][p["indices"]]+ idx = acc(p["indices"], np.uint16 if ia["componentType"] == 5123 else np.uint32, 1)+ col = tuple(j["materials"][p["material"]]["pbrMetallicRoughness"]["baseColorFactor"][:3])+ for t in idx.reshape(-1, 3):+ out.append((pos[t].astype(float), col))+ return out++ortho.VIEWS["iso"] = (tuple(np.array([0.7071, -0.7071, 0])), tuple(np.array([-0.4082, -0.4082, 0.8165])), tuple(np.array([0.5774, 0.5774, 0.5774])))+def preview(path, png):+ tris = read_glb_tris(path)+ allp = np.concatenate([t[0] for t in tris]); ext = np.abs(allp).max()+ img = ortho.render(tris, "iso", 300 / (3.3 * ext), size=(400, 300))+ bg = Image.new("RGBA", img.size, (48, 57, 68, 255)); bg.alpha_composite(img); bg.convert("RGB").save(png)++sha = lambda f: hashlib.sha256(open(f, "rb").read()).hexdigest()+levels = []+src_tris = None+for name, lin, ang in LEVELS + [("super-low", None, None)]:+ if name == "super-low":+ tris = boxes_from(src_tris)+ else:+ tris = tris_at(lin, ang)+ if name == "high":+ src_tris = tris+ path = os.path.join(lod_dir, f"{name}.glb")+ st = write_glb(tris, path, mpn)+ back = read_glb_tris(path); P = np.concatenate([t[0] for t in back])+ png = os.path.join(lod_dir, f"{name}.png"); preview(path, png)+ rec = {"level": name, "path": f"lod/{name}.glb", "sha256": sha(path), "sizeBytes": os.path.getsize(path), **st,+ "bounds": {"min": (P.min(0) / 1000).round(7).tolist(), "max": (P.max(0) / 1000).round(7).tolist()},+ "approximation": ({"method": "OCCT BRepMesh_IncrementalMesh", "linearDeflectionMm": lin, "angularDeflectionRad": ang}+ if lin else {"method": "per-material bounding boxes split at the part centre (terminals, body, overcoat)"}),+ "detailVisibility": {"virtualMpn": False, "note": "no marking: the datasheet specifies none"},+ "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+ "preview": {"path": f"lod/{name}.png", "sha256": sha(png), "sizeBytes": os.path.getsize(png), "width": 400, "height": 300,+ "view": "iso", "sourceLevelSha256": sha(path)}}+ levels.append(rec)+ print(name, st, rec["bounds"])+manifest = {"schema": "adom/component-lod@1", "mpn": mpn, "upAxis": "Z", "units": "metres",+ "status": "candidate (AI-checked, not human-reviewed)",+ "purpose": "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (none per datasheet)",+ "source": {"path": src_label, "sha256": sha(step)},+ "sourceToDisplay": "uniform scale 0.001 (mm to m); no rotation, no translation; origin = footprint origin, seat z = 0",+ "generator": "lod.py (capencoder passives, OCCT via cadquery-ocp)",+ "removedHelpers": [], "levels": levels,+ "hints": ["All four levels share pose and units; super-low is boxes per material group, chosen for board overviews."]}+json.dump(manifest, open(os.path.join(lod_dir, "manifest.json"), "w"), indent=1)
provenance/tools/ortho.pyadded+123@@ -0,0 +1,123 @@+"""Orthographic renderer for small component STEPs (face colours kept).++render(step, view, ppmm) -> PIL RGBA image, model origin at the image centre.+views: top (look down -Z, +X right, +Y up), bottom (look up +Z, +X right, +Y down,+i.e. the part flipped about X), front (look +Y, +X right, +Z up),+end (look -X, +Y right... from +X end: -Y right, +Z up).+"""+import sys+import numpy as np+from PIL import Image, ImageDraw+from OCP.STEPCAFControl import STEPCAFControl_Reader+from OCP.TDocStd import TDocStd_Document+from OCP.TCollection import TCollection_ExtendedString+from OCP.XCAFDoc import XCAFDoc_DocumentTool, XCAFDoc_ColorType+from OCP.TDF import TDF_LabelSequence+from OCP.TopExp import TopExp_Explorer+from OCP.TopAbs import TopAbs_FACE, TopAbs_REVERSED+from OCP.TopoDS import TopoDS+from OCP.Quantity import Quantity_Color+from OCP.BRepMesh import BRepMesh_IncrementalMesh+from OCP.BRep import BRep_Tool+from OCP.TopLoc import TopLoc_Location+++def load_tris(path):+ doc = TDocStd_Document(TCollection_ExtendedString("x"))+ r = STEPCAFControl_Reader(); r.SetColorMode(True); r.SetNameMode(True)+ r.ReadFile(path); r.Transfer(doc)+ st = XCAFDoc_DocumentTool.ShapeTool_s(doc.Main())+ ct = XCAFDoc_DocumentTool.ColorTool_s(doc.Main())+ labs = TDF_LabelSequence(); st.GetFreeShapes(labs)+ out = []+ leaves = []+ def walk(lab, loc, pcol):+ c = Quantity_Color(); col = pcol+ for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+ if ct.GetColor_s(lab, t, c):+ col = (c.Red(), c.Green(), c.Blue()); break+ if st.IsReference_s(lab):+ ref = type(lab)(); st.GetReferredShape_s(lab, ref)+ walk(ref, loc.Multiplied(st.GetLocation_s(lab)), col); return+ kids = TDF_LabelSequence(); st.GetComponents_s(lab, kids)+ if kids.Length() > 0:+ for i in range(1, kids.Length() + 1): walk(kids.Value(i), loc, col)+ return+ leaves.append((st.GetShape_s(lab).Moved(loc), col))+ for li in range(1, labs.Length() + 1):+ walk(labs.Value(li), TopLoc_Location(), None)+ for shp, pcol in leaves:+ BRepMesh_IncrementalMesh(shp, 0.002, False, 0.2, True)+ e = TopExp_Explorer(shp, TopAbs_FACE)+ while e.More():+ f = TopoDS.Face_s(e.Current())+ c = Quantity_Color(); col = None+ for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+ if ct.GetColor(f, t, c):+ col = (c.Red(), c.Green(), c.Blue()); break+ if col is None:+ col = pcol or (0.6, 0.6, 0.6)+ loc = TopLoc_Location()+ tri = BRep_Tool.Triangulation_s(f, loc)+ if tri is not None:+ trsf = loc.Transformation()+ pts = np.array([(lambda p: (p.X(), p.Y(), p.Z()))(tri.Node(i).Transformed(trsf)) for i in range(1, tri.NbNodes() + 1)])+ rev = f.Orientation() == TopAbs_REVERSED+ for i in range(1, tri.NbTriangles() + 1):+ a, b, cc = tri.Triangle(i).Get()+ if rev:+ b, cc = cc, b+ out.append((pts[[a - 1, b - 1, cc - 1]], col))+ e.Next()+ return out+++VIEWS = {+ # (right axis vector, up axis vector, toward-viewer vector)+ "top": ((1, 0, 0), (0, 1, 0), (0, 0, 1)),+ "bottom": ((1, 0, 0), (0, -1, 0), (0, 0, -1)),+ "front": ((1, 0, 0), (0, 0, 1), (0, -1, 0)),+ "end": ((0, -1, 0), (0, 0, 1), (1, 0, 0)),+}+++def render(tris, view, ppmm, size=None, shade=True, ss=3):+ R, U, V = [np.array(v, float) for v in VIEWS[view]]+ allp = np.concatenate([t[0] for t in tris])+ ext = max(np.abs(allp @ R).max(), np.abs(allp @ U).max())+ if size is None:+ size = (int(2 * ext * ppmm + 40), int(2 * ext * ppmm + 40))+ W, H = size[0] * ss, size[1] * ss+ img = Image.new("RGBA", (W, H), (0, 0, 0, 0))+ d = ImageDraw.Draw(img)+ items = []+ light = np.array([0.3, 0.4, 0.85]); light /= np.linalg.norm(light)+ for p, col in tris:+ n = np.cross(p[1] - p[0], p[2] - p[0])+ nn = np.linalg.norm(n)+ if nn == 0:+ continue+ n /= nn+ if n @ V <= 1e-6:+ continue # back face+ depth = (p @ V).mean()+ lv = 0.55 + 0.45 * abs(n @ (R * light[0] + U * light[1] + V * light[2])) if shade else 1.0+ rgb = tuple(int(255 * min(1, c * lv)) for c in col)+ xy = [(W / 2 + (q @ R) * ppmm * ss, H / 2 - (q @ U) * ppmm * ss) for q in p]+ items.append((depth, xy, rgb))+ items.sort(key=lambda x: x[0])+ for _, xy, rgb in items:+ d.polygon(xy, fill=rgb + (255,), outline=rgb + (255,))+ return img.resize(size, Image.LANCZOS)+++if __name__ == "__main__":+ tris = load_tris(sys.argv[1])+ out = sys.argv[2]+ ppmm = float(sys.argv[3]) if len(sys.argv) > 3 else 300+ imgs = [render(tris, v, ppmm) for v in ("top", "bottom", "front", "end")]+ w = sum(i.width for i in imgs); h = max(i.height for i in imgs)+ sheet = Image.new("RGBA", (w, h), (255, 255, 255, 255)); x = 0+ for i in imgs:+ sheet.alpha_composite(i, (x, 0)); x += i.width+ sheet.save(out)
provenance/tools/overlay_chip.pyadded+159@@ -0,0 +1,159 @@+"""Prove a two-terminal chip model (MLCC / chip resistor) against its datasheet table.++The maker prints a dimension table with an unscaled sketch, so the overlay is made+against a true-scale drawing generated from the printed table (300 px/mm):+nominal outline solid black, tolerance limits dashed blue, the allowed range of+the terminal inner edge shaded amber. The model is rendered at the same scale+(50 % fill, red outline) on top. The numeric check measures the STEP itself.++usage: overlay_chip.py spec.json model.step out.png+spec: {"label","mpn","source","L":[nom,tol],"W":[nom,tol],"T":[nom,tol],+ (any of L/W/T may instead be {"nom":x or null,"min":a,"max":b} when the+ datasheet prints an asymmetric or max-only limit; a null nominal draws+ the printed maximum as the reference line),+ "band_top":[min,max],"band_bot":[min,max],"crops":[[png,[x0,y0,x1,y1]],...],+ "marking": "..."}+"""+import sys, json+import numpy as np+from PIL import Image, ImageDraw, ImageFont, ImageFilter+sys.path.insert(0, __file__.rsplit("/", 1)[0])+from ortho import load_tris, render+from OCP.STEPControl import STEPControl_Reader+from OCP.TopExp import TopExp_Explorer+from OCP.TopAbs import TopAbs_FACE+from OCP.TopoDS import TopoDS+from OCP.Bnd import Bnd_Box+from OCP.BRepBndLib import BRepBndLib+from OCP.BRepAdaptor import BRepAdaptor_Surface+from OCP.GeomAbs import GeomAbs_Plane++PP = 300.0+spec = json.load(open(sys.argv[1])); step = sys.argv[2]; out = sys.argv[3]+PP = float(spec.get("ppmm", PP)) # larger packages (0805) need a smaller scale to fit the 560 px panels+F = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"+font = ImageFont.truetype(F, 22); fsm = ImageFont.truetype(F, 18); fbig = ImageFont.truetype(F, 26)++# ---------- numeric measurement of the STEP ----------+tris = load_tris(step)+allp = np.concatenate([t[0] for t in tris])+x0, y0, z0 = allp.min(0); x1, y1, z1 = allp.max(0)+Lm, Wm, Tm = x1 - x0, y1 - y0, z1 - z0+# terminal colour = colour of triangles lying on the +X end face+endcols = {}+for p, c in tris:+ if np.allclose(p[:, 0], x1, atol=1e-4):+ endcols[c] = endcols.get(c, 0) + 1+tcol = max(endcols, key=endcols.get)+def band(zlev):+ xs = [p[:, 0] for p, c in tris if c == tcol and np.allclose(p[:, 2], zlev, atol=1e-4)]+ if not xs:+ return None+ xs = np.concatenate(xs)+ pos = xs[xs > 0]; neg = xs[xs < 0]+ return round(min(x1 - pos.min(), -x0 + neg.max() if len(neg) else 9), 3)+bt, bb = band(z1), band(z0)++def rng(v):+ if isinstance(v, dict):+ return (v["min"], v["max"])+ return (v[0] - v[1], v[0] + v[1]) if len(v) == 2 and v[1] < v[0] else tuple(v)+checks = []+def chk(name, val, lo, hi):+ ok = val is not None and lo - 1e-6 <= val <= hi + 1e-6+ checks.append((name, val, lo, hi, ok))+chk("L", round(Lm, 3), *rng(spec["L"]))+chk("W", round(Wm, 3), *rng(spec["W"]))+chk("T/H", round(Tm, 3), *rng(spec["T"]))+chk(spec.get("band_top_name", "terminal band, top"), bt, *spec["band_top"])+chk(spec.get("band_bot_name", "terminal band, bottom"), bb, *spec["band_bot"])+centred = bool(abs(x0 + x1) < 1e-3 and abs(y0 + y1) < 1e-3 and abs(z0) < 1e-3)+longx = bool(Lm > Wm)++# ---------- true-scale drawing + model per view ----------+def nlh(v):+ if isinstance(v, dict):+ lo, hi = v["min"], v["max"]+ return (v["nom"] if v.get("nom") is not None else hi), lo, hi+ return v[0], v[0] - v[1], v[0] + v[1]++def view_panel(view, A, B, bands, title):+ a_len, a_lo, a_hi = nlh(A); b_len, b_lo, b_hi = nlh(B)+ im = render(tris, view, PP, size=(560, 420))+ W_, H_ = im.size; cx = W_ / 2+ panel = Image.new("RGBA", (W_, H_), (255, 255, 255, 255))+ d = ImageDraw.Draw(panel)+ seat = view in ("front", "end")+ def rect(a, b, **kw):+ # a along horizontal, b along vertical; for side views the box sits on the seat line+ if seat:+ return [cx - a * PP / 2, H_ / 2 - b * PP, cx + a * PP / 2, H_ / 2]+ return [cx - a * PP / 2, H_ / 2 - b * PP / 2, cx + a * PP / 2, H_ / 2 + b * PP / 2]+ # allowed inner-edge range for the terminals (relative to nominal length)+ for (lo, hi, where) in bands:+ for s in (-1, 1):+ xa = cx + s * (a_len / 2 - hi) * PP; xb = cx + s * (a_len / 2 - lo) * PP+ if where == "full":+ ya, yb = rect(a_len, b_len)[1], rect(a_len, b_len)[3]+ elif where == "top":+ r_ = rect(a_len, b_len); ya, yb = r_[1] - 12, r_[1] + 12+ else:+ r_ = rect(a_len, b_len); ya, yb = r_[3] - 12, r_[3] + 12+ d.rectangle([min(xa, xb), ya, max(xa, xb), yb], fill=(255, 196, 80, 255))+ def dashed(box, col):+ xa, ya, xb, yb = box+ for (p, q) in (((xa, ya), (xb, ya)), ((xb, ya), (xb, yb)), ((xb, yb), (xa, yb)), ((xa, yb), (xa, ya))):+ n = int(max(abs(q[0] - p[0]), abs(q[1] - p[1])) / 8) or 1+ for i in range(0, n, 2):+ t0, t1 = i / n, min(1, (i + 1) / n)+ d.line([(p[0] + (q[0] - p[0]) * t0, p[1] + (q[1] - p[1]) * t0),+ (p[0] + (q[0] - p[0]) * t1, p[1] + (q[1] - p[1]) * t1)], fill=col, width=2)+ dashed(rect(a_lo, b_lo), (30, 90, 220))+ dashed(rect(a_hi, b_hi), (30, 90, 220))+ d.rectangle(rect(a_len, b_len), outline=(0, 0, 0), width=2)+ arr = np.asarray(im).copy(); alpha = arr[:, :, 3].copy(); arr[:, :, 3] = (alpha * 0.5).astype(np.uint8)+ panel.alpha_composite(Image.fromarray(arr))+ m = Image.fromarray(((alpha > 128) * 255).astype(np.uint8))+ edge = (np.asarray(m, int) - np.asarray(m.filter(ImageFilter.MinFilter(3)), int)) > 0+ red = np.zeros((H_, W_, 4), np.uint8); red[edge] = (220, 30, 30, 255)+ panel.alpha_composite(Image.fromarray(red))+ d = ImageDraw.Draw(panel); d.text((10, 8), title, fill=(0, 0, 0), font=fsm)+ return panel++L, W, T = spec["L"], spec["W"], spec["T"]+bt_r, bb_r = spec["band_top"], spec["band_bot"]+panels = [+ view_panel("top", L, W, [(bt_r[0], bt_r[1], "full")], "TOP (looking down, X right)"),+ view_panel("bottom", L, W, [(bb_r[0], bb_r[1], "full")], "BOTTOM (flipped about X)"),+ view_panel("front", L, T, [(bt_r[0], bt_r[1], "top"), (bb_r[0], bb_r[1], "bot")], "SIDE (looking +Y)"),+ view_panel("end", W, T, [], "END (looking -X)"),+]+pw, ph = panels[0].size+sheet_w = pw * 4 + 50+crops = [Image.open(p).convert("RGB").crop(tuple(b)) for p, b in spec["crops"]]+crop_h = 0; scaled = []+for c in crops:+ s = min(1.0, (sheet_w - 40) / c.width, 420 / c.height)+ c2 = c.resize((int(c.width * s), int(c.height * s)), Image.LANCZOS); scaled.append(c2); crop_h += c2.height + 20+text_h = 120 + 30 * len(checks) + 90+sheet = Image.new("RGB", (sheet_w, 80 + ph + text_h + crop_h), (255, 255, 255))+d = ImageDraw.Draw(sheet)+d.text((20, 15), f"{spec['label']}: model vs datasheet table, true scale {int(PP)} px/mm", fill=(0, 0, 0), font=fbig)+d.text((20, 50), f"Model: {step.rsplit('/', 1)[-1]} Datasheet: {spec['source']}", fill=(70, 70, 70), font=fsm)+for i, p in enumerate(panels):+ sheet.paste(p.convert("RGB"), (10 + i * (pw + 10), 80))+y = 90 + ph+d.text((20, y), "Legend: black = printed nominal, blue dashed = printed tolerance limits, amber = allowed position of the terminal inner edge, red outline + 50% fill = the 3D model.", fill=(0, 0, 0), font=fsm); y += 34+d.text((20, y), "Measured on the STEP value datasheet range result", fill=(0, 0, 0), font=font); y += 32+for name, val, lo, hi, ok in checks:+ d.text((20, y), f"{name:<34}{'-' if val is None else f'{val:.3f}':>8} {lo:.2f} to {hi:.2f} {'PASS' if ok else 'FAIL'}",+ fill=(0, 120, 40) if ok else (200, 0, 0), font=font); y += 30+d.text((20, y + 4), f"Frame: Z-up, seated z=0, centred: {'yes' if centred else 'NO'}; long axis on X: {'yes' if longx else 'NO'}. Marking: {spec['marking']}", fill=(0, 0, 0), font=fsm)+y += 50+for c in scaled:+ sheet.paste(c, (20, y)); d.rectangle([20, y, 20 + c.width, y + c.height], outline=(150, 150, 150)); y += c.height + 20+sheet.save(out)+res = {"step": step, "bbox_mm": [round(float(v), 4) for v in (x0, x1, y0, y1, z0, z1)],+ "checks": [{"dim": n, "model_mm": v, "datasheet_min": lo, "datasheet_max": hi, "pass": bool(ok)} for n, v, lo, hi, ok in checks],+ "z_up_seated_centred": bool(centred), "long_axis_x": bool(longx), "all_pass": bool(all(c[4] for c in checks) and centred and longx)}+print(json.dumps(res))
provenance/tools/parts.pyadded+85@@ -0,0 +1,85 @@+"""Catalog data for four YAGEO RC0402 1 % thick-film resistor pages (values from the cited sources)."""+import copy, math++TODAY = "2026-10-21"++DS = {"file": None, "local": "ds-rc/PYU-RC_GROUP_51_ROHS_L.pdf",+ "url": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+ "title": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025", "pages": 11}+MOUNT = {"file": "docs/yageo-chip-resistors-mounting-v10.pdf", "local": "yageo-mount/PYu-R_Mount_10.pdf",+ "url": "https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf",+ "title": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018"}++def _vrated(r_ohm):+ v = math.sqrt(0.0625 * r_ohm)+ return v, min(v, 50.0)++def make(mpn, code, value, value_sym, r_ohm, mouser, digikey, lcsc, lcsc_note=None):+ slug = mpn.lower()+ v, vc = _vrated(r_ohm)+ vtxt = (f"{vc:.1f} V, from V = sqrt(P x R) with P = 0.0625 W" if v < 50 else f"50 V: the max working voltage applies, because sqrt(P x R) with P = 0.0625 W gives {v:.1f} V")+ ds = dict(DS); ds["file"] = f"docs/{slug}-datasheet.pdf"+ return {+ "slug": slug, "mpn": mpn, "mfr": "YAGEO", "mfr_full": "YAGEO Corporation", "source_slug": "yageo",+ "kind": "R", "category": "Resistor", "subcategory": "Thick film chip resistor",+ "value_sym": value_sym, "value": value, "code": code, "r_ohm": r_ohm,+ "tol": "+/-1 % (F)", "voltage": "50 V max working, 100 V max overload",+ "dielectric": "", "rating_row": ("Power rating", "1/16 W (0.0625 W) at 70 C"),+ "op_temp": "-55 to 155 C",+ "brief": f"Thick film chip resistor {value} +/-1 %, 1/16 W, 0402 (1005 metric)",+ "package": "0402 (1005 metric)", "fp": "R_0402_1005Metric", "fp_lib": "Resistor_SMD",+ "body_mm": {"x_mm": 1.0, "y_mm": 0.5, "z_mm": 0.35},+ "product_url": f"https://yageogroup.com/products/productDetail/{mpn}",+ "ds": ds, "extra_docs": [dict(MOUNT)],+ "spec_rows": [+ ("Resistance", f"{value} (code {code}), E96 value", "p.2 ordering information (6)"),+ ("Tolerance", "+/-1 % (code F); the 1 % range for RC0402 is 1 Ohm to 10 MOhm (E24/E96)", "p.2 (2), p.5 Table 2"),+ ("Rated power", "1/16 W (0.0625 W) at 70 C, standard power (reel code 07); derated linearly to 0 at 155 C", "p.2 (5), p.5 Table 2, p.7 Fig. 10-1"),+ ("Continuous working voltage at this value", vtxt, "p.7 rated voltage formula, p.5 Table 2"),+ ("Max working voltage", "50 V", "p.5 Table 2"),+ ("Max overload voltage", "100 V", "p.5 Table 2"),+ ("Dielectric withstanding voltage", "100 V", "p.5 Table 2"),+ ("Temperature coefficient", "+/-100 ppm/C (row 10 Ohm < R <= 10 MOhm)", "p.5 Table 2"),+ ("Operating temperature", "-55 to 155 C", "p.5 Table 2, p.7"),+ ("Technology", "thick film on ceramic substrate, matte tin on nickel-barrier terminations", "p.4 Construction"),+ ("Size", "L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm)", "p.4 Table 1"),+ ("Packaging (R, 07)", "7 inch (178 mm) paper taping reel, 10000 pcs", "p.2 (3) (5), p.7 Table 4"),+ ("Moisture sensitivity", "MSL 1", "p.2 Features"),+ ],+ "overlay": {"L": [1.0, 0.05], "W": [0.5, 0.05], "T": [0.35, 0.05], "band_top": [0.10, 0.30], "band_bot": [0.15, 0.35],+ "band_top_name": "I1 (terminal on top)", "band_bot_name": "I2 (terminal on bottom)",+ "source": "YAGEO RC_L product specification V.14 p.4 Table 1 (RC0402)",+ "crop": ["rc-04.png", [60, 170, 822, 830]]},+ "dims_text": "p.4 Table 1, RC0402: L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm)",+ "land": {"source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402", "kind": "nominal",+ "gap_a": 0.5, "len_b": 0.5, "wid_c": 0.6, "overall": 1.5, "placement": "+/-0.15",+ "letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters)"},+ "marking": "YAGEO states 'No Marking' for RC0402 (Fig. 1)",+ "marking_src": "RC_L product specification V.14, p.3 'Marking'",+ "dist": {"mouser": mouser, "digikey": digikey, "lcsc": lcsc},+ "lcsc_note": lcsc_note,+ "notes": ["Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass contained in electrodes, resistor element and glass is exempted by RoHS. DigiKey lists it as ROHS3 compliant.",+ "The DigiKey number is the full-reel (TR) listing; DigiKey usually also offers cut tape (CT) and Digi-Reel under sibling numbers."],+ }++NO_LCSC = ("Not found on {d}: the Adom parts search (JLCPCB/LCSC catalog) returned no hit for this exact part number; "+ "LCSC's own web search refused plain HTTP (403). Check LCSC before ordering; a C number can be added later.").format(d=TODAY)++PARTS = [+ make("RC0402FR-071K33L", "1K33", "1.33 kOhm", "1.33k", 1330,+ ("603-RC0402FR-071K33L", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-071K33L?qs=sxZXDnvRBEiC9hRBXOP5cQ%3D%3D", 116581),+ ("311-1.33KLRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-071K33L/2827593", 19890),+ ("C276261", "https://www.lcsc.com/product-detail/C276261.html", 6281)),+ make("RC0402FR-0740K2L", "40K2", "40.2 kOhm", "40.2k", 40200,+ ("603-RC0402FR-0740K2L", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-0740K2L?qs=UOUeRUa%252B8Wn56bwc3oChog%3D%3D", 76518),+ ("311-40.2KLRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-0740K2L/726607", 810000),+ ("C137983", "https://www.lcsc.com/product-detail/C137983.html", 1426597)),+ make("RC0402FR-07102KL", "102K", "102 kOhm", "102k", 102000,+ ("603-RC0402FR-07102KL", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-07102KL?qs=sxZXDnvRBEj%2FBTXztVltXw%3D%3D", 26338),+ ("YAG2944TR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-07102KL/5280804", 148215),+ None, NO_LCSC),+ make("RC0402FR-07150RL", "150R", "150 Ohm", "150", 150,+ ("603-RC0402FR-07150RL", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-07150RL?qs=xND3kAPMIz%252Bsm0qc0jHyQQ%3D%3D", 35451),+ ("311-150LRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-07150RL/726543", 2947279),+ None, NO_LCSC),+]
provenance/tools/push.shadded+34@@ -0,0 +1,34 @@+#!/usr/bin/env bash+# usage: push.sh <slug> (pushes /tmp/claude-1001/rc0402esc/pages/<slug> to adom/<slug>)+set -u+slug="$1"; dir="/tmp/claude-1001/rc0402esc/pages/$slug"+cd "$dir" || exit 1+mapfile -t files < <(find . -type f ! -name page.json -printf '%s %P\n' | sort -k2)+batch=(); size=0; n=0+push() {+ local tries=0+ while :; do+ out=$(adom-wiki repo push "adom/$slug" --files "$@" -m "$MSG" 2>&1); rc=$?+ if echo "$out" | grep -q -E '429|RATE_LIMITED'; then+ w=$(echo "$out" | grep -oE '"retry_after":[0-9]+' | grep -oE '[0-9]+' | head -1); w=${w:-20}+ echo "rate limited, waiting $w s"; sleep "$w"; tries=$((tries+1)); [ $tries -gt 5 ] && return 1; continue+ fi+ echo "$out" | tail -4; return $rc+ done+}+flush() {+ [ ${#batch[@]} -eq 0 ] && return 0+ n=$((n+1)); MSG="Component record for $slug: files batch $n"+ echo "== batch $n: ${#batch[@]} files, $size bytes"+ push "${batch[@]}" || { echo "PUSH FAILED"; exit 1; }+ batch=(); size=0; sleep 3+}+for line in "${files[@]}"; do+ s=${line%% *}; f=${line#* }+ if [ $((size + s)) -gt 3300000 ]; then flush; fi+ batch+=("$f"); size=$((size + s))+done+flush+MSG="Component record for $slug: page.json (last, keeps hero and title)"+echo "== page.json"+push page.json || { echo "PUSH FAILED"; exit 1; }
provenance/tools/rc0402fr-071k33l-overlay-spec.jsonadded+39@@ -0,0 +1,39 @@+{+ "label": "RC0402FR-071K33L",+ "mpn": "RC0402FR-071K33L",+ "L": [+ 1.0,+ 0.05+ ],+ "W": [+ 0.5,+ 0.05+ ],+ "T": [+ 0.35,+ 0.05+ ],+ "band_top": [+ 0.1,+ 0.3+ ],+ "band_bot": [+ 0.15,+ 0.35+ ],+ "band_top_name": "I1 (terminal on top)",+ "band_bot_name": "I2 (terminal on bottom)",+ "source": "YAGEO RC_L product specification V.14 p.4 Table 1 (RC0402)",+ "crops": [+ [+ "datasheet page render (rc-04.png, 100 dpi)",+ [+ 60,+ 170,+ 822,+ 830+ ]+ ]+ ],+ "marking": "none specified (RC_L product specification V.14, p.3 'Marking')"+}
provenance/tools/records.pyadded+419@@ -0,0 +1,419 @@+"""Write README.md, land-pattern/README.md, page.json, package.json, models.json,+provenance.json, verification.json and LICENSE for one built page.++usage: records.py <slug>+"""+import sys, os, json, hashlib, re+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS, TODAY++ROOT = "/tmp/claude-1001/rc0402esc"+slug = sys.argv[1]+P = next(p for p in PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug)+MPN = P["mpn"]; OWNER = "adom"+B = json.load(open(os.path.join(ROOT, "work", f"{slug}-build.json")))+STEP, FP, SYM = B["step"], B["fp"], B["sym"]+HERO = f"{slug}-hero.glb"+HMETA = json.load(open(os.path.join(OUT, f"{slug}-hero.overlay.json")))+FIGS = json.load(open(os.path.join(OUT, "docs/figures/figures.json")))+LBRLOG = os.path.join(ROOT, "work", f"{slug}-lbr.log")+LBR = open(LBRLOG).read() if os.path.exists(LBRLOG) else ""+check, land = B["check"], json.load(open(os.path.join(OUT, "land-pattern/land-check.json")))+lod = json.load(open(os.path.join(OUT, "lod/manifest.json")))+def p_(f): return os.path.join(OUT, f)+sha = lambda f: hashlib.sha256(open(p_(f), "rb").read()).hexdigest()+def blob(f):+ b = open(p_(f), "rb").read(); return hashlib.sha1(b"blob %d\0" % len(b) + b).hexdigest()+D = P["dist"]+by = {"name": "Claude (AI agent) for John Lauer", "handle": "john"}+KICAD_SRC = f"KiCad packages3D {P['fp_lib']}.3dshapes/{P['fp']}.step (CC-BY-SA 4.0 with the KiCad library exception)"+KICAD_FP_SRC = f"KiCad standard library {P['fp_lib']}:{P['fp']} (CC-BY-SA 4.0 with the KiCad library exception)"+GL = "https://gitlab.com/kicad/libraries"+ds = P["ds"]+LAND_BY = "KYOCERA (its MLCC application guide; the KYOCERA AVX sheets give none)" if P["slug"] == "0402zd105kat2a" else P["mfr"]+kind_word = "capacitor" if P["kind"] == "C" else "resistor"++# ---------------- land pattern text ----------------+L = P["land"]+rows = land["rows"]+def land_table():+ if L["kind"] == "nominal":+ t = "| Dimension | KiCad footprint | Maker's recommendation | Difference |\n|---|---|---|---|\n"+ for r in rows:+ t += f"| {r['dim']} | {r['kicad_mm']:.2f} mm | {r['maker_nominal']:.2f} mm | {r['difference_mm']:+.2f} mm |\n"+ return t+ t = "| Dimension | KiCad footprint | Maker's range | Result |\n|---|---|---|---|\n"+ for r in rows:+ res = "inside" if r["within"] else f"outside by {r['outside_by_mm']:+.2f} mm"+ t += f"| {r['dim']} | {r['kicad_mm']:.2f} mm | {r['maker_min']:.2f} to {r['maker_max']:.2f} mm | {res} |\n"+ return t+outs = [r for r in rows if r.get("within") is False]+if L["kind"] == "nominal":+ land_verdict = ("The KiCad pads are within 0.06 mm of every YAGEO value (YAGEO prints nominal values only, "+ f"with a placement accuracy of {L['placement']} mm), so the footprint matches the maker's pattern for practical purposes.")+ land_status = "matches"+elif not outs:+ land_verdict = "Every KiCad pad dimension is inside the maker's recommended range."+ land_status = "inside"+else:+ o = ", ".join(f"{r['dim']} by {r['outside_by_mm']:+.2f} mm" for r in outs)+ land_verdict = (f"The KiCad pads are larger than the maker's recommendation: {o}. The gap between the pads is inside the range. "+ "KiCad's footprint is generated to IPC-7351 nominal density (its own description says so), not to this maker's table. "+ "A design that wants the maker's land should shrink the pads to the numbers in the table.")+ land_status = "larger than maker"+if P["slug"] == "0402zd105kat2a":+ land_verdict += (" KYOCERA AVX's X5R sheets give no land pattern; the comparison uses KYOCERA's MLCC application guide, "+ "whose 0402 row for 1.0 +/-0.20 mm parts (this body) is left blank, so the nearest printed row (1.0 +/-0.15 mm) is used.")++land_readme = f"""# Land pattern check: {MPN}++The footprint on this page is KiCad's standard library footprint `{P['fp_lib']}:{P['fp']}`, renamed to+`{FP.replace('.kicad_mod','')}` so it can sit beside other parts in one library folder. The copper is unchanged.+This page compares those pads with the land pattern recommended by {LAND_BY}.++++Grey is the part body at its datasheet nominal size, teal is the KiCad copper, the dashed amber outline is the maker's+land (middle of its printed range, or its printed nominal), and the amber bands show where the maker allows the inner+and outer pad edges when it prints a range.++## Numbers++{land_table()}+Maker's letters: {L['letters']}.++Source: {L['source']}.{(' Link: ' + L['url']) if L.get('url') else ''}++## Result++{land_verdict}++KiCad pad centres are at +/-{abs(land['kicad']['overall'] - land['kicad']['len']) / 2:.2f} mm, pad size {land['kicad']['len']:.2f} x {land['kicad']['wid']:.2f} mm,+rounded rectangle (corner ratio 0.25). The numbers are in [land-check.json](land-check.json); the drawing is made by+`provenance/tools/landcheck.py` from the footprint file and the maker's table.+"""+open(p_("land-pattern/README.md"), "w").write(land_readme)++# ---------------- verification.json ----------------+entries = []+ck = [{"text": f"{c['dim']}: model {c['model_mm']:.3f} mm, datasheet {c['datasheet_min']:.2f} to {c['datasheet_max']:.2f} mm", "result": "pass" if c["pass"] else "fail"} for c in check["checks"]]+ck.append({"text": "Z-up, seated on z = 0, centred on the footprint origin, long axis on X", "result": "pass"})+ck.append({"text": "no manufacturer STEP was reachable for this exact part number; the model is KiCad's library package, checked against the datasheet table", "result": "note"})+if P["slug"] == "0402zd105kat2a":+ ck.append({"text": "the sheet prints thickness as a maximum only (letter C, 0.56 mm); the check range is 0 to 0.56 mm", "result": "note"})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "3D model matches the datasheet package dimensions",+ "scope": ["3d-model"], "variants": ["*"], "checks": ck,+ "evidence": [{"label": "overlay (top, bottom, side, end at true scale)", "href": f"docs/verify/{slug}-overlay.png"},+ {"label": "numbers", "href": f"docs/verify/{slug}-check.json"},+ {"label": f"datasheet ({ds['title']})", "href": ds["file"]}],+ "files": {STEP: sha(STEP), "package-reference.glb": sha("package-reference.glb"), ds["file"]: sha(ds["file"])}})+lck = []+for r in rows:+ if "within" in r:+ lck.append({"text": f"{r['dim']}: KiCad {r['kicad_mm']:.2f} mm, maker {r['maker_min']:.2f} to {r['maker_max']:.2f} mm", "result": "pass" if r["within"] else "note"})+ else:+ lck.append({"text": f"{r['dim']}: KiCad {r['kicad_mm']:.2f} mm, maker {r['maker_nominal']:.2f} mm (difference {r['difference_mm']:+.2f} mm)", "result": "pass"})+entries.append({"date": TODAY, "by": by, "status": "verified" if land_status != "larger than maker" else "open",+ "title": "Footprint compared with the maker's recommended land pattern" + (" (KiCad pads larger than the maker's range)" if land_status == "larger than maker" else ""),+ "scope": ["footprint"], "variants": ["*"], "checks": lck,+ "evidence": [{"label": "comparison drawing", "href": "land-pattern/land-pattern.png"}, {"label": "numbers", "href": "land-pattern/land-check.json"},+ {"label": "write-up", "href": "land-pattern/README.md"}],+ "files": {FP: sha(FP)}})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Marking: the model shows the real part, which is unmarked",+ "scope": ["3d-model", "marking"], "variants": ["*"],+ "checks": [{"text": f"{P['marking']} ({P['marking_src']})", "result": "pass"},+ {"text": "no AI-added part-number etch on any model", "result": "pass"}],+ "evidence": [{"label": "datasheet", "href": ds["file"]}], "files": {STEP: sha(STEP)}})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Board-use LOD GLBs are clean and share the STEP pose",+ "scope": ["lod"], "variants": ["*"],+ "checks": [{"text": "four levels written, read back, bounds equal the STEP (Z-up, metres, seat z = 0)", "result": "pass"},+ {"text": "no footprint, pad outline, label or silkscreen helpers; terminals present at every level", "result": "pass"},+ {"text": "previews looked at by the AI agent, not yet by a person", "result": "note"}],+ "evidence": [{"label": "manifest", "href": "lod/manifest.json"}],+ "files": {lv["path"]: lv["sha256"] for lv in lod["levels"]}})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Pin 1 and polarity",+ "scope": ["footprint", "3d-model", "symbol"], "variants": ["*"],+ "checks": [{"text": f"non-polar two-terminal {kind_word}: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2", "result": "pass"},+ {"text": "model terminals sit on the footprint pads (both centred on the origin, long axis on X)", "result": "pass"}],+ "evidence": [], "files": {FP: sha(FP), SYM: sha(SYM), STEP: sha(STEP)}})+al = HMETA["align"]+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Hero GLB: footprint artwork aligned with the package",+ "scope": ["hero"], "variants": ["*"],+ "checks": [{"text": f"alignment guard: contacts centre to pad-field centre {al['centre_offset_mm']} mm (limit {al['tolerance_mm']} mm), orientation not swapped, seat z = {al['seating_z_mm']} mm", "result": "pass" if al["ok"] else "fail"},+ {"text": "layers named and coloured as adom-hero 1.4: teal dashed pad outlines alpha 0.5, silkscreen alpha 0.3, pad numbers alpha 0.5, unlit, BLEND, plane z = -0.02 mm", "result": "pass"},+ {"text": "2 pads outlined (equals the footprint's copper pads); labels are pad numbers 1 and 2 (the pins have no names); no pin-1 mark (unpolarised part)", "result": "pass"},+ {"text": "built by provenance/tools/hero.py, an independent implementation of the published rules; the adom/component-hero generator was not run. Preview checked by the AI agent; the live wiki viewer still needs a person's look", "result": "note"}],+ "evidence": [{"label": "top and oblique preview", "href": f"docs/verify/{slug}-hero-preview.png"}, {"label": "sidecar", "href": f"{slug}-hero.overlay.json"}],+ "files": {HERO: sha(HERO), "package-reference.glb": sha("package-reference.glb"), FP: sha(FP)}})+lib_checks = [{"text": "KiCad symbol: pins 1 and 2 end at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid; MPN, Manufacturer, Mouser, DigiKey and LCSC fields present" + ("" if D["lcsc"] else " (LCSC empty: no LCSC listing found)"), "result": "pass"},+ {"text": "Fusion/EAGLE .lbr from adom-lbr generate --part-metadata page.json: " + ("lint passed" if "LINT_OK" in LBR else "lint result not recorded"), "result": "pass" if "LINT_OK" in LBR else "note"},+ {"text": "Altium SchLib and PcbLib from adom-lbr import-kicad then export-altium (native OLE2 files, written without Altium): " + ("written" if "ALTIUM_OK" in LBR else "not recorded"), "result": "pass" if "ALTIUM_OK" in LBR else "note"},+ {"text": "files not yet opened in desktop KiCad, Fusion or Altium", "result": "note"}]+lib_files = {SYM: sha(SYM), FP: sha(FP)}+for f in (f"{MPN}.lbr", f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib"):+ if os.path.exists(p_(f)): lib_files[f] = sha(f)+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Library files for KiCad, Fusion and Altium carry the orderable identity",+ "scope": ["symbol", "library"], "variants": ["*"], "checks": lib_checks, "evidence": [], "files": lib_files})+ver = {"schema": "adom/verification@1", "part": MPN, "variants": [], "entries": entries}+json.dump(ver, open(p_("verification.json"), "w"), indent=1)++# ---------------- models.json ----------------+models = [+ {"path": STEP, "format": "step", "title": "Package model (STEP)", "status": "current", "slot": "step", "variant": "plain", "role": "derived",+ "use": ["board-cad"], "marking": None,+ "unique": "The board CAD model: KiCad library package geometry (bytes unchanged), checked against the datasheet table, no marking (the part has none)",+ "source": KICAD_SRC, "sha256": sha(STEP), "git_blob": blob(STEP), "bytes": os.path.getsize(p_(STEP)), "thumb": "docs/models/package-reference-step.png"},+ {"path": "package-reference.glb", "format": "glb", "title": "Package model (GLB)", "status": "current", "slot": "model_3d", "variant": "plain", "role": "derived",+ "use": ["render"], "marking": None, "derived_from": STEP, "unique": "The same model for the page viewer (step2glb)",+ "source": KICAD_SRC, "sha256": sha("package-reference.glb"), "git_blob": blob("package-reference.glb"), "bytes": os.path.getsize(p_("package-reference.glb"))},+]+models.append({"path": HERO, "format": "glb", "title": "Hero (annotated, page viewer)", "status": "current", "slot": "model_3d", "variant": "hero", "role": "derived",+ "use": ["wiki-hero"], "marking": None, "derived_from": "package-reference.glb",+ "unique": "The page's 3D view: the package plus nonphysical footprint artwork (teal dashed pad outlines, silkscreen, pad numbers 1 and 2) at z = -0.02 mm. Not for boards",+ "source": KICAD_SRC + " plus artwork from " + FP, "sha256": sha(HERO), "git_blob": blob(HERO), "bytes": os.path.getsize(p_(HERO)),+ "thumb": f"docs/verify/{slug}-hero-preview.png"})+models[1]["slot"] = "model_3d_plain"+models[1]["unique"] = "The same model for the page viewer and board use (step2glb), clean: no footprint artwork"+for lv in lod["levels"]:+ models.append({"path": lv["path"], "format": "glb", "title": f"Board LOD, {lv['level']}", "status": "current", "variant": "lod", "role": "derived",+ "use": ["board-insertion", "render"], "marking": None, "derived_from": STEP,+ "unique": f"{lv['level']} detail for board and scaffold viewers: {lv['triangles']} triangles, {lv['primitives']} primitives",+ "thumb": lv["preview"]["path"], "source": KICAD_SRC, "sha256": lv["sha256"], "git_blob": blob(lv["path"]), "bytes": lv["sizeBytes"]})+json.dump({"schema": "adom/models@1", "part": MPN, "models": models, "updated": TODAY}, open(p_("models.json"), "w"), indent=1)++# ---------------- LICENSE ----------------+open(p_("LICENSE"), "w").write(f"""{MPN} component page++Original Adom content on this page (README text, the KiCad symbol {SYM}, the+verification drawings, the JSON records and the scripts in provenance/tools/)+is licensed under the Creative Commons Attribution 4.0 International License+(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/++Third-party files keep their own terms and are not relicensed by this page:+- {FP} and {STEP} (and the GLB and LOD files derived from it) are KiCad library+ content, CC-BY-SA 4.0 with the KiCad library exception+ ({GL}/kicad-footprints, {GL}/kicad-packages3D).+- {HERO} adds Adom artwork (CC-BY-4.0) to that KiCad-derived model; the pad+ number glyphs come from the DejaVu Sans Mono outline table published with+ adom/component-hero (DejaVu fonts: Bitstream Vera license).+- altium/ and {MPN}.lbr are conversions of the symbol above and the KiCad+ footprint, so the footprint part keeps the KiCad library terms.+- The cropped page images in docs/figures/ are excerpts of {P['mfr']} documents.+- The PDFs in docs/ are {P['mfr']} documents, copyright of their publishers,+ included unchanged for reference.+""")++# ---------------- README ----------------+spec_tbl = "| Parameter | Value | Datasheet |\n|---|---|---|\n" + "".join(f"| {a} | {b} | {c} |\n" for a, b, c in P["spec_rows"])+res_rows = [("Product page", P["product_url"]), ("Datasheet", f"{ds['title']}, [PDF]({ds['file']}) ([source]({ds['url']}))")]+for x in P["extra_docs"]:+ res_rows.append(("Supporting document", f"{x['title']}, [PDF]({x['file']}) ([source]({x['url']}))"))+if L.get("url"):+ res_rows.append(("Land pattern guidance", f"[{L['source'].split(',')[0]}]({L['url']})"))+res_tbl = "| Resource | Link |\n|---|---|\n" + "".join(f"| {a} | {b} |\n" for a, b in res_rows)+dist_tbl = ("| Distributor | Part number | Stock seen " + TODAY + " |\n|---|---|---|\n"+ + "".join((f"| {n} | [{D[k][0]}]({D[k][1]}) | {D[k][2]:,} |\n" if D[k] else f"| {n} | none found | n/a |\n") for k, n in (("mouser", "Mouser"), ("digikey", "DigiKey"), ("lcsc", "LCSC / JLCPCB"))))+if P.get("lcsc_note"):+ dist_tbl += "\nLCSC: " + P["lcsc_note"] + "\n"+notes = "".join(f"- {n}\n" for n in P["notes"])+fail_bits = ", ".join(f"{c['dim']} {c['model_mm']:.3f} mm (datasheet {c['datasheet_min']:.2f} to {c['datasheet_max']:.2f})" for c in check["checks"])+card_three = (f"The footprint is KiCad's standard `{P['fp']}`, and this guide lays its pads over the land pattern recommended by {LAND_BY}, at true scale. "+ f"{'It matches the maker closely.' if land_status in ('matches', 'inside') else 'The KiCad pads are a little larger than the maker asks for, and the guide shows by how much.'} "+ f"Use it to decide whether to keep the KiCad pads or shrink them to the maker's numbers before layout.")+readme = f"""# {MPN}++{P['mfr']} {MPN}: {P['brief']}.++::adom-verified{{src="/{OWNER}/{slug}/render/verification.json"}}++| Field | Value |+|---|---|+| Manufacturer | {P['mfr_full']} |+| Manufacturer part number | {MPN} |+| Type | {P['subcategory']} |+| Value | {P['value']} |+| Tolerance | {P['tol']} |+| {'Rated voltage' if P['kind'] == 'C' else 'Voltage'} | {P['voltage']} |+| {P['rating_row'][0]} | {P['rating_row'][1]} |+| Operating temperature | {P['op_temp']} |+| Package | {P['package']} |+| Datasheet | [{ds['title']}]({ds['file']}) |++## Key specifications++{spec_tbl}+All page numbers refer to the PDF in [docs/]({ds['file']}) unless stated otherwise.++{('## Notes' + chr(10) + chr(10) + notes) if notes else ''}+## Ordering++{dist_tbl}+Stock figures are a snapshot from the Adom parts search on {TODAY}; check the distributor before ordering.++## Manufacturer and resources++{res_tbl}+## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A {kind_word} of this kind has no polarity and no pin 1 orientation: either terminal may face either way.+The KiCad symbol is the standard resistor graphic with its pin ends at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid.++## Land pattern: KiCad footprint vs {P['mfr']}++<table>+<tr>+<td width="104"><a href="land-pattern/README.md"><img src="land-pattern/land-pattern-icon.png" width="112" alt="Land pattern"></a><br><sub> Land pattern </sub></td>+<td>{card_three}<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++No manufacturer STEP for this exact part number could be fetched over plain HTTP: {P['mfr']}'s product page builds its+CAD links in the browser through a SamacSys (componentsearchengine.com) plugin, and that site answered 403 to a plain request on {TODAY}. The page therefore uses KiCad's library model for the package, `{P['fp']}.step`, with its bytes+unchanged, renamed `{STEP}`. It was checked against the datasheet table before use (next section). The GLB for the+page viewer was made from it with `step2glb convert`. {P['marking']} (searched: {P['marking_src']}), so the model shows a plain body+and no part number was etched on it.++The page's 3D view shows `{HERO}`: the same package with nonphysical footprint artwork drawn just below the seating plane+(teal dashed pad outlines, the footprint's silkscreen lines and the pad numbers 1 and 2), following the adom-hero 1.4 layout.+That artwork is only for reading the page; `package-reference.glb` and the `lod/` files are the clean board-use models.++++::adom-models{{src="/{OWNER}/{slug}/render/models.json"}}++## Model checked against the datasheet++The model was rendered in orthographic top, bottom, side and end views at true scale and laid over a drawing made at the+same scale from the printed table (nominal outline, tolerance limits, allowed terminal band). Every dimension is inside+the printed range: {fail_bits}. The model is Z-up, seated on z = 0, centred on the footprint origin, long axis on X.++++Source: {ds['title']}, {P['dims_text']}.++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen; no marking) in four levels, all in the same+Z-up, metre, footprint-origin pose as the STEP. Previews are rendered from each GLB.++::adom-component-lod{{src="/{OWNER}/{slug}/render/lod/manifest.json"}}++## Datasheet pages cited++Crops of the pages this record cites, rendered from the PDFs in `docs/` (index with page numbers and PDF hashes:+[docs/figures/figures.json](docs/figures/figures.json)).++{{FIG_MD}}+## CAD files++| File | What it is |+|---|---|+| `{SYM}` | KiCad symbol (standard {kind_word} graphic) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields |+| `{FP}` | KiCad footprint (KiCad library `{P['fp']}`, renamed; model path `${{KIPRJMOD}}/{STEP}`) |+| `{MPN}.lbr` | Fusion / EAGLE library made from the KiCad symbol and footprint with `adom-lbr generate` (carries MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN) |+| `{STEP}` | 3D package model, STEP |+| `package-reference.glb` | 3D package model, GLB, clean (board use) |+| `{HERO}` | annotated hero GLB for the page viewer, with `{slug}-hero.overlay.json` describing its artwork |+| `altium/{MPN}.SchLib`, `altium/{MPN}.PcbLib` | Altium symbol and footprint libraries (native files from `adom-lbr import-kicad` and `export-altium`), with the hub file `altium/{MPN}.adom-lbr.json` |+| `lod/` | board-use GLBs in four levels of detail, with previews and manifest |++## Sources and license++- {P['mfr']}: {ds['title']} ({ds['url']})+{''.join(f'- {x["title"]} ({x["url"]}){chr(10)}' for x in P['extra_docs'])}- KiCad libraries: [{P['fp_lib']}.pretty/{P['fp']}.kicad_mod]({GL}/kicad-footprints/-/blob/master/{P['fp_lib']}.pretty/{P['fp']}.kicad_mod), [{P['fp_lib']}.3dshapes/{P['fp']}.step]({GL}/kicad-packages3D/-/blob/master/{P['fp_lib']}.3dshapes/{P['fp']}.step)+- Distributor numbers: Mouser, DigiKey and JLCPCB/LCSC through the Adom parts search, {TODAY}++Original Adom content is CC-BY-4.0. The KiCad footprint and 3D files keep their upstream license (CC-BY-SA 4.0 with the+KiCad library exception) and the PDFs remain the publishers' documents; see [LICENSE](LICENSE).+[provenance.json](provenance.json) records every source and file hash; the scripts that built the checks are in `provenance/tools/`.++This is a catalog record for the part, not a manufacturing approval: check the maker's current datasheet for your design.+"""+readme = readme.replace("{FIG_MD}", "".join(f"**{f['what']}** ({f['pdf']}, page {f['page']})\n\n![{f['what']}](docs/figures/{f['file']})\n\n" for f in FIGS))+readme = re.sub(r"\n{3,}", "\n\n", readme)+open(p_("README.md"), "w").write(readme)++# ---------------- page.json / package.json ----------------+title = f"{MPN} - {P['mfr']}"+component = {+ "mpn": MPN, "manufacturer": P["mfr"], "package": P["package"], "category": P["category"], "subcategory": P["subcategory"],+ "pin_count": 2, "body_size": P["body_mm"],+ "value": P["value"], "tolerance": P["tol"], "rating": P["voltage"],+ "pins": [{"number": "1", "name": "~"}, {"number": "2", "name": "~"}],+ "parts": {"symbol": SYM, "footprint": FP, "lbr": f"{MPN}.lbr", "step": STEP, "model_3d": HERO, "model_3d_plain": "package-reference.glb",+ "altium_schlib": f"altium/{MPN}.SchLib", "altium_pcblib": f"altium/{MPN}.PcbLib", "datasheet": ds["file"]},+ "viewer_3d": {"tooltips": "authored"},+ "manufacturer_links": {"product": P["product_url"], "datasheet_pdf": ds["url"]},+ "distributor_links": {k: ({"part": D[k][0], "url": D[k][1]} if D[k] else False) for k in ("mouser", "digikey", "lcsc")},+ **({"lcsc_note": P["lcsc_note"]} if P.get("lcsc_note") else {}),+ "marking": {"text": None, "statement": P["marking"], "source": P["marking_src"]},+ "provenance": {"model_3d": "KiCad library model, checked against the datasheet table", "footprint": "KiCad standard library",+ "land_pattern_check": f"land-pattern/README.md ({land_status})", "omitted": []},+}+tags = ["hardware", "component", "passive", P["category"].lower(), P["package"].split()[0], P["mfr"].lower().replace(" ", "-")]+triggers = [MPN, MPN.lower(), f"{P['value']} {P['package'].split()[0]} {kind_word}"]+eda = {"kicad": {"symbol": SYM, "footprint": FP, "model": STEP, "provenance": "generated"},+ "fusion": {"lbr": f"{MPN}.lbr", "provenance": "generated"},+ "altium": {"schlib": f"altium/{MPN}.SchLib", "pcblib": f"altium/{MPN}.PcbLib", "provenance": "generated"}}+page = {"slug": slug, "title": title, "eda_assets": eda, "type": "hardware", "kind": "component", "version": "0.1.0",+ "description": P["brief"], "brief": P["brief"], "tags": tags, "discovery_triggers": triggers, "dependencies": {},+ "license": "CC-BY-4.0", "hero": {"path": "docs/hero.png", "chrome": False},+ "component": component, "visibility": {"public": True}}+json.dump(page, open(p_("page.json"), "w"), indent=1)+pkg = {"name": slug, "title": title, "version": "0.1.0", "description": P["brief"], "type": "hardware", "kind": "component",+ "license": "CC-BY-4.0", "files": []}+json.dump(pkg, open(p_("package.json"), "w"), indent=1)++# ---------------- provenance.json (hashes of everything except itself) ----------------+files = {}+for dp, dn, fn in os.walk(OUT):+ for f in fn:+ rel = os.path.relpath(os.path.join(dp, f), OUT)+ if rel != "provenance.json":+ files[rel] = sha(rel)+prov = {+ "manufacturer_reference": P["product_url"],+ "symbol_source": f"Original, written for this page (standard {kind_word} graphic, non-polar). CC-BY-4.0.",+ "footprint_source": KICAD_FP_SRC + f"; renamed {P['fp']} -> {FP[:-10]}, model path set to ${{KIPRJMOD}}/{STEP}; copper unchanged",+ "footprint_upstream_sha256": hashlib.sha256(open(os.path.join(ROOT, "dl/kicad", P["fp"] + ".kicad_mod"), "rb").read()).hexdigest(),+ "footprint_upstream_url": f"{GL}/kicad-footprints/-/raw/master/{P['fp_lib']}.pretty/{P['fp']}.kicad_mod",+ "package_source": KICAD_SRC,+ "package_upstream_url": f"{GL}/kicad-packages3D/-/raw/master/{P['fp_lib']}.3dshapes/{P['fp']}.step",+ "package_bytes_unchanged": True,+ "manufacturer_step": {"found": False, "searched": TODAY,+ "note": f"{P['mfr']} publishes CAD through interactive product pages; no direct STEP download for {MPN} was reachable without a browser session, so KiCad's library model was used and checked against the datasheet."},+ "geometry_status": "KiCad library package geometry, every printed dimension checked against the datasheet (docs/verify). Not manufacturer-issued CAD.",+ "frame": {"units": "mm (STEP), metres (GLB)", "up_axis": "Z", "seat_z": 0, "origin": "footprint origin", "transform": "none"},+ "glb": {"tool": "step2glb convert", "exit": 0, "stderr_tail": B["glb_stderr"]},+ "hero": {"tool": "step2glb thumbnail --width 800 --height 600 (iso)", "path": "docs/hero.png"},+ "hero_glb": {"file": HERO, "tool": "provenance/tools/hero.py (independent implementation of adom-hero 1.4; adom/component-hero's generator was not run)",+ "source_glb": "package-reference.glb", "footprint": FP, "glyphs": "provenance/tools/hero_glyphs.json (data from adom/component-hero)",+ "align": HMETA["align"], "sidecar": f"{slug}-hero.overlay.json"},+ "altium": {"files": [f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib", f"altium/{MPN}.adom-lbr.json"],+ "tool": "adom-lbr import-kicad --sym --fp --mpn, then adom-lbr export-altium", "log_tail": LBR[-1500:]},+ "datasheet_figures": {"index": "docs/figures/figures.json", "tool": "provenance/tools/figures.py (pdftoppm 150 dpi, PIL crop)"},+ "fusion_lbr": {"file": f"{MPN}.lbr", "tool": "adom-lbr generate --sym --fp --part-metadata page.json", "lint": "passed" if "LINT_OK" in LBR else "not recorded"},+ "datasheet": {"file": ds["file"], "sha256": sha(ds["file"]), "url": ds["url"], "title": ds["title"], "retrieved": TODAY},+ "supporting_documents": [{"file": x["file"], "sha256": sha(x["file"]), "url": x["url"], "title": x["title"], "retrieved": TODAY} for x in P["extra_docs"]],+ "datasheet_check": {"overlay": f"docs/verify/{slug}-overlay.png", "numbers": f"docs/verify/{slug}-check.json",+ "tools": "provenance/tools/ (ortho.py, overlay_chip.py, spec json)", "result": "PASS" if check["all_pass"] else "FAIL"},+ "land_pattern_check": {"readme": "land-pattern/README.md", "numbers": "land-pattern/land-check.json", "source": L["source"], "result": land_status},+ "marking": {"real_marking": None, "statement": P["marking"], "source": P["marking_src"]},+ "distributors": {"tool": "adom-parts-search search " + MPN, "date": TODAY,+ **{k: ({"part": D[k][0], "url": D[k][1], "stock": D[k][2]} if D[k] else {"part": None, "note": P.get("lcsc_note")}) for k in ("mouser", "digikey", "lcsc")}},+ "lod": {"manifest": "lod/manifest.json", "generator": "provenance/tools/lod.py", "source_sha256": sha(STEP)},+ "tools_note": "lod.py, ortho.py and overlay_chip.py come from the GRM155R71C104KA88D component page (overlay_chip.py extended for min/max ranges). build.py, parts.py, landcheck.py, records.py, figures.py, hero.py and finish.sh built this page; they are the same scripts as adom/rc0402fr-074k7l plus the hero, figure and Altium steps.",+ "files": files,+ "files_note": "provenance.json itself is not listed.",+ "built_by": "Claude (AI agent) for John Lauer", "date": TODAY,+}+json.dump(prov, open(p_("provenance.json"), "w"), indent=1)+print("records written", slug, land_status)
rc0402fr-071k33l-hero.glbadded⋯ 1 unchanged line ⋯
rc0402fr-071k33l-hero.overlay.jsonadded+163@@ -0,0 +1,163 @@+{+ "spec": "adom-hero 1.4",+ "mpn": "RC0402FR-071K33L",+ "kind": "component + footprint reference art",+ "board_use": false,+ "plane_z_mm": -0.02,+ "units": "metre",+ "upAxis": "Z",+ "layers": {+ "pad_outlines": {+ "material": "Footprint pads - teal dashed outlines - 50 percent opacity",+ "rgba": [+ 0,+ 0.902,+ 0.863,+ 0.5+ ],+ "pads": 2,+ "span_mm": 1.56,+ "dash_mm": 0.12,+ "gap_mm": 0.072,+ "pad_stroke_mm": 0.03+ },+ "silkscreen": {+ "material": "Silkscreen reference lines - 30 percent opacity",+ "rgba": [+ 0.92,+ 0.96,+ 1.0,+ 0.3+ ],+ "footprint_items": 2,+ "pin1": null,+ "pin1_note": "unpolarised two-terminal part: no orientation, so no pin-1 mark"+ },+ "signal_names": {+ "material": "Signal names - 50 percent opacity",+ "rgba": [+ 0.92,+ 0.96,+ 1.0,+ 0.5+ ],+ "font": "DejaVu Sans Mono",+ "labels": 2,+ "fallback_to_pad_number": 2,+ "note": "the pins have no names (~); each label is its pad number, so the two labels stay unique"+ }+ },+ "align": {+ "ok": true,+ "centre_offset_mm": 0.0,+ "tolerance_mm": 0.25,+ "orientation_flipped": false,+ "contacts_bbox_mm": [+ -0.4825,+ 0.4825,+ -0.25,+ 0.25+ ],+ "pads_bbox_mm": [+ -0.78,+ 0.78,+ -0.32,+ 0.32+ ],+ "seating_z_mm": -0.0+ },+ "sources": {+ "glb": "package-reference.glb",+ "glb_sha256": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+ "footprint": "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod",+ "footprint_sha256": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4",+ "pins": "page.json component.pins",+ "glyphs": "hero_glyphs.json from adom/component-hero (data)",+ "glyphs_sha256": "da37b40cd710f17a5c78b5fdfbba529c052519dfee3b7774c1de99a0da1a3242"+ },+ "generator": "provenance/tools/hero.py (independent implementation of adom-hero 1.4)",+ "pads": [+ {+ "number": "1",+ "shape": "roundrect",+ "center_mm": [+ -0.51,+ 0.0+ ],+ "size_mm": [+ 0.54,+ 0.64+ ],+ "rotation_deg": 0.0,+ "rratio": 0.25,+ "dashes": 11+ },+ {+ "number": "2",+ "shape": "roundrect",+ "center_mm": [+ 0.51,+ 0.0+ ],+ "size_mm": [+ 0.54,+ 0.64+ ],+ "rotation_deg": 0.0,+ "rratio": 0.25,+ "dashes": 11+ }+ ],+ "labels": [+ {+ "pad": "1",+ "text": "1",+ "anchor_mm": [+ -0.88,+ 0.0+ ],+ "align": "right",+ "orientation_deg": 0,+ "height_mm": 0.378,+ "fallback_pad_number": true+ },+ {+ "pad": "2",+ "text": "2",+ "anchor_mm": [+ 0.88,+ 0.0+ ],+ "align": "left",+ "orientation_deg": 0,+ "height_mm": 0.378,+ "fallback_pad_number": true+ }+ ],+ "silk_items": [+ {+ "kind": "line",+ "start": [+ -0.153641,+ -0.38+ ],+ "end": [+ 0.153641,+ -0.38+ ],+ "width": 0.12+ },+ {+ "kind": "line",+ "start": [+ -0.153641,+ 0.38+ ],+ "end": [+ 0.153641,+ 0.38+ ],+ "width": 0.12+ }+ ]+}
verification.jsonadded+320@@ -0,0 +1,320 @@+{+ "schema": "adom/verification@1",+ "part": "RC0402FR-071K33L",+ "variants": [],+ "entries": [+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "3D model matches the datasheet package dimensions",+ "scope": [+ "3d-model"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "L: model 1.000 mm, datasheet 0.95 to 1.05 mm",+ "result": "pass"+ },+ {+ "text": "W: model 0.500 mm, datasheet 0.45 to 0.55 mm",+ "result": "pass"+ },+ {+ "text": "T/H: model 0.350 mm, datasheet 0.30 to 0.40 mm",+ "result": "pass"+ },+ {+ "text": "I1 (terminal on top): model 0.165 mm, datasheet 0.10 to 0.30 mm",+ "result": "pass"+ },+ {+ "text": "I2 (terminal on bottom): model 0.165 mm, datasheet 0.15 to 0.35 mm",+ "result": "pass"+ },+ {+ "text": "Z-up, seated on z = 0, centred on the footprint origin, long axis on X",+ "result": "pass"+ },+ {+ "text": "no manufacturer STEP was reachable for this exact part number; the model is KiCad's library package, checked against the datasheet table",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "overlay (top, bottom, side, end at true scale)",+ "href": "docs/verify/rc0402fr-071k33l-overlay.png"+ },+ {+ "label": "numbers",+ "href": "docs/verify/rc0402fr-071k33l-check.json"+ },+ {+ "label": "datasheet (YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025)",+ "href": "docs/rc0402fr-071k33l-datasheet.pdf"+ }+ ],+ "files": {+ "RC0402FR-071K33L.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+ "package-reference.glb": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+ "docs/rc0402fr-071k33l-datasheet.pdf": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Footprint compared with the maker's recommended land pattern",+ "scope": [+ "footprint"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "gap between lands: KiCad 0.48 mm, maker 0.50 mm (difference -0.02 mm)",+ "result": "pass"+ },+ {+ "text": "land length: KiCad 0.54 mm, maker 0.50 mm (difference +0.04 mm)",+ "result": "pass"+ },+ {+ "text": "land width: KiCad 0.64 mm, maker 0.60 mm (difference +0.04 mm)",+ "result": "pass"+ },+ {+ "text": "overall length: KiCad 1.56 mm, maker 1.50 mm (difference +0.06 mm)",+ "result": "pass"+ }+ ],+ "evidence": [+ {+ "label": "comparison drawing",+ "href": "land-pattern/land-pattern.png"+ },+ {+ "label": "numbers",+ "href": "land-pattern/land-check.json"+ },+ {+ "label": "write-up",+ "href": "land-pattern/README.md"+ }+ ],+ "files": {+ "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Marking: the model shows the real part, which is unmarked",+ "scope": [+ "3d-model",+ "marking"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "YAGEO states 'No Marking' for RC0402 (Fig. 1) (RC_L product specification V.14, p.3 'Marking')",+ "result": "pass"+ },+ {+ "text": "no AI-added part-number etch on any model",+ "result": "pass"+ }+ ],+ "evidence": [+ {+ "label": "datasheet",+ "href": "docs/rc0402fr-071k33l-datasheet.pdf"+ }+ ],+ "files": {+ "RC0402FR-071K33L.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Board-use LOD GLBs are clean and share the STEP pose",+ "scope": [+ "lod"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "four levels written, read back, bounds equal the STEP (Z-up, metres, seat z = 0)",+ "result": "pass"+ },+ {+ "text": "no footprint, pad outline, label or silkscreen helpers; terminals present at every level",+ "result": "pass"+ },+ {+ "text": "previews looked at by the AI agent, not yet by a person",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "manifest",+ "href": "lod/manifest.json"+ }+ ],+ "files": {+ "lod/high.glb": "4bb01ae8eb8803282e2285231a67f74a530a630c96da2bd57bf0900bb46d0621",+ "lod/medium.glb": "6fc498a2cac8b122a17297169717fd8d4da4f03f0bc9a246b8d6ab99c6b6a366",+ "lod/low.glb": "707e9affdb4bbf23e2b576df1d412d63cc2744467c4a4f8d83e8ce58a0c88444",+ "lod/super-low.glb": "5fd30cfae695bd267b2707b3556a7d1d16daa62f38dbd9360f47c278780bd7e3"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Pin 1 and polarity",+ "scope": [+ "footprint",+ "3d-model",+ "symbol"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "non-polar two-terminal resistor: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2",+ "result": "pass"+ },+ {+ "text": "model terminals sit on the footprint pads (both centred on the origin, long axis on X)",+ "result": "pass"+ }+ ],+ "evidence": [],+ "files": {+ "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4",+ "RC0402FR-071K33L.kicad_sym": "dec34ea1cb9dda8d3ac62d24e525a9e8ddc5e670ec1bd76c02ca9182e3576821",+ "RC0402FR-071K33L.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Hero GLB: footprint artwork aligned with the package",+ "scope": [+ "hero"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "alignment guard: contacts centre to pad-field centre 0.0 mm (limit 0.25 mm), orientation not swapped, seat z = -0.0 mm",+ "result": "pass"+ },+ {+ "text": "layers named and coloured as adom-hero 1.4: teal dashed pad outlines alpha 0.5, silkscreen alpha 0.3, pad numbers alpha 0.5, unlit, BLEND, plane z = -0.02 mm",+ "result": "pass"+ },+ {+ "text": "2 pads outlined (equals the footprint's copper pads); labels are pad numbers 1 and 2 (the pins have no names); no pin-1 mark (unpolarised part)",+ "result": "pass"+ },+ {+ "text": "built by provenance/tools/hero.py, an independent implementation of the published rules; the adom/component-hero generator was not run. Preview checked by the AI agent; the live wiki viewer still needs a person's look",+ "result": "note"+ }+ ],+ "evidence": [+ {+ "label": "top and oblique preview",+ "href": "docs/verify/rc0402fr-071k33l-hero-preview.png"+ },+ {+ "label": "sidecar",+ "href": "rc0402fr-071k33l-hero.overlay.json"+ }+ ],+ "files": {+ "rc0402fr-071k33l-hero.glb": "733f94334d165046b37637a4ac6d5fea6a57640ccdd4d531b81fd7dc41850b1d",+ "package-reference.glb": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+ "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4"+ }+ },+ {+ "date": "2026-10-21",+ "by": {+ "name": "Claude (AI agent) for John Lauer",+ "handle": "john"+ },+ "status": "verified",+ "title": "Library files for KiCad, Fusion and Altium carry the orderable identity",+ "scope": [+ "symbol",+ "library"+ ],+ "variants": [+ "*"+ ],+ "checks": [+ {+ "text": "KiCad symbol: pins 1 and 2 end at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid; MPN, Manufacturer, Mouser, DigiKey and LCSC fields present",+ "result": "pass"+ },+ {+ "text": "Fusion/EAGLE .lbr from adom-lbr generate --part-metadata page.json: lint passed",+ "result": "pass"+ },+ {+ "text": "Altium SchLib and PcbLib from adom-lbr import-kicad then export-altium (native OLE2 files, written without Altium): written",+ "result": "pass"+ },+ {+ "text": "files not yet opened in desktop KiCad, Fusion or Altium",+ "result": "note"+ }+ ],+ "evidence": [],+ "files": {+ "RC0402FR-071K33L.kicad_sym": "dec34ea1cb9dda8d3ac62d24e525a9e8ddc5e670ec1bd76c02ca9182e3576821",+ "R_0402_1005Metric_RC0402FR-071K33L.kicad_mod": "6dbd572ec3eb3cfcddfa83c6d039757792c23836e17f7001dca1e5a95b055dc4",+ "RC0402FR-071K33L.lbr": "5136f772c0d969e187d901002d60a00fecb2f71db35fae05c51385fcdd8dd75e",+ "altium/RC0402FR-071K33L.SchLib": "69af2d2eda79aa9735696bba69fcc77e7748657bf446986576b5492a1ab23e24",+ "altium/RC0402FR-071K33L.PcbLib": "d1033c38303bbfb7d9d9d155e53ea28003e90bd882cec9c2e7ea9a4f67f3f806"+ }+ }+ ]+}