mirror of
https://github.com/robotdoly/DOLY-DIY.git
synced 2024-12-24 23:32:04 +01:00
4614 lines
330 KiB
HTML
4614 lines
330 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Interactive BOM for KiCAD</title>
|
|
<style type="text/css">
|
|
:root {
|
|
--pcb-edge-color: black;
|
|
--pad-color: #878787;
|
|
--pad-hole-color: #CCCCCC;
|
|
--pad-color-highlight: #D04040;
|
|
--pin1-outline-color: #ffb629;
|
|
--pin1-outline-color-highlight: #b4ff03;
|
|
--silkscreen-edge-color: #aa4;
|
|
--silkscreen-polygon-color: #4aa;
|
|
--silkscreen-text-color: #4aa;
|
|
--fabrication-edge-color: #907651;
|
|
--fabrication-polygon-color: #907651;
|
|
--fabrication-text-color: #a27c24;
|
|
--track-color: #def5f1;
|
|
--track-color-highlight: #D04040;
|
|
--zone-color: #def5f1;
|
|
--zone-color-highlight: #d0404080;
|
|
}
|
|
|
|
html, body {
|
|
margin: 0px;
|
|
height: 100%;
|
|
font-family: Verdana, sans-serif;
|
|
}
|
|
|
|
.dark.topmostdiv {
|
|
--pcb-edge-color: #eee;
|
|
--pad-color: #808080;
|
|
--pin1-outline-color: #ffa800;
|
|
--pin1-outline-color-highlight: #ccff00;
|
|
--track-color: #42524f;
|
|
--zone-color: #42524f;
|
|
background-color: #252c30;
|
|
color: #eee;
|
|
}
|
|
|
|
button {
|
|
background-color: #eee;
|
|
border: 1px solid #888;
|
|
color: black;
|
|
height: 44px;
|
|
width: 44px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 14px;
|
|
font-weight: bolder;
|
|
}
|
|
|
|
.dark button {
|
|
/* This will be inverted */
|
|
background-color: #c3b7b5;
|
|
}
|
|
|
|
button.depressed {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark button.depressed {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
button:focus {
|
|
outline: 0;
|
|
}
|
|
|
|
button#tb-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#lr-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
|
|
}
|
|
|
|
button#bom-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-grouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-ungrouped-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#bom-netlist-btn {
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
|
|
}
|
|
|
|
button#copy {
|
|
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
|
|
background-position: 6px 6px;
|
|
background-repeat: no-repeat;
|
|
background-size: 26px 26px;
|
|
border-radius: 6px;
|
|
height: 40px;
|
|
width: 40px;
|
|
margin: 10px 5px;
|
|
}
|
|
|
|
button#copy:active {
|
|
box-shadow: inset 0px 0px 5px #6c6c6c;
|
|
}
|
|
|
|
textarea.clipboard-temp {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 2em;
|
|
height: 2em;
|
|
padding: 0;
|
|
border: None;
|
|
outline: None;
|
|
box-shadow: None;
|
|
background: transparent;
|
|
}
|
|
|
|
.left-most-button {
|
|
border-right: 0;
|
|
border-top-left-radius: 6px;
|
|
border-bottom-left-radius: 6px;
|
|
}
|
|
|
|
.middle-button {
|
|
border-right: 0;
|
|
}
|
|
|
|
.right-most-button {
|
|
border-top-right-radius: 6px;
|
|
border-bottom-right-radius: 6px;
|
|
}
|
|
|
|
.button-container {
|
|
font-size: 0;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.dark .button-container {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.button-container button {
|
|
background-size: 32px 32px;
|
|
background-position: 5px 5px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
@media print {
|
|
.hideonprint {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
canvas {
|
|
cursor: crosshair;
|
|
}
|
|
|
|
canvas:active {
|
|
cursor: grabbing;
|
|
}
|
|
|
|
.fileinfo {
|
|
width: 100%;
|
|
max-width: 1000px;
|
|
border: none;
|
|
padding: 5px;
|
|
}
|
|
|
|
.fileinfo .title {
|
|
font-size: 20pt;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.fileinfo td {
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
max-width: 1px;
|
|
width: 50%;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.bom {
|
|
border-collapse: collapse;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 10pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
.bom th, .bom td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
.dark .bom th, .dark .bom td {
|
|
border: 1px solid #777;
|
|
}
|
|
|
|
.bom th {
|
|
background-color: #CCCCCC;
|
|
background-clip: padding-box;
|
|
}
|
|
|
|
.dark .bom th {
|
|
background-color: #3b4749;
|
|
}
|
|
|
|
.bom tr.highlighted:nth-child(n) {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.dark .bom tr.highlighted:nth-child(n) {
|
|
background-color: #226022;
|
|
}
|
|
|
|
.bom tr:nth-child(even) {
|
|
background-color: #f2f2f2;
|
|
}
|
|
|
|
.dark .bom tr:nth-child(even) {
|
|
background-color: #313b40;
|
|
}
|
|
|
|
.bom tr.checked {
|
|
color: #aaa;
|
|
}
|
|
|
|
.dark .bom tr.checked {
|
|
color: #666;
|
|
}
|
|
|
|
.bom tr {
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.bom .numCol {
|
|
width: 25px;
|
|
}
|
|
|
|
.bom .Description {
|
|
width: 10%;
|
|
}
|
|
|
|
.bom .Part {
|
|
width: 10%;
|
|
}
|
|
|
|
.bom .Value {
|
|
width: 15%;
|
|
}
|
|
|
|
.bom .Quantity {
|
|
width: 65px;
|
|
}
|
|
|
|
.bom th .sortmark {
|
|
position: absolute;
|
|
right: 1px;
|
|
top: 1px;
|
|
margin-top: -5px;
|
|
border-width: 5px;
|
|
border-style: solid;
|
|
border-color: transparent transparent #221 transparent;
|
|
transform-origin: 50% 85%;
|
|
transition: opacity 0.2s, transform 0.4s;
|
|
}
|
|
|
|
.dark .bom th .sortmark {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.bom th .sortmark.none {
|
|
opacity: 0;
|
|
}
|
|
|
|
.bom th .sortmark.desc {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.bom th:hover .sortmark.none {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.bom .bom-checkbox {
|
|
width: 30px;
|
|
position: relative;
|
|
user-select: none;
|
|
-moz-user-select: none;
|
|
}
|
|
|
|
.bom .bom-checkbox:before {
|
|
content: "";
|
|
position: absolute;
|
|
border-width: 15px;
|
|
border-style: solid;
|
|
border-color: #51829f transparent transparent transparent;
|
|
visibility: hidden;
|
|
top: -15px;
|
|
}
|
|
|
|
.bom .bom-checkbox:after {
|
|
content: "Double click to set/unset all";
|
|
position: absolute;
|
|
color: white;
|
|
top: -35px;
|
|
left: -26px;
|
|
background: #51829f;
|
|
padding: 5px 15px;
|
|
border-radius: 8px;
|
|
white-space: nowrap;
|
|
visibility: hidden;
|
|
}
|
|
|
|
.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
|
|
visibility: visible;
|
|
transition: visibility 0.2s linear 1s;
|
|
}
|
|
|
|
.split {
|
|
-webkit-box-sizing: border-box;
|
|
-moz-box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
background-color: inherit;
|
|
}
|
|
|
|
.split.split-horizontal, .gutter.gutter-horizontal {
|
|
height: 100%;
|
|
float: left;
|
|
}
|
|
|
|
.gutter {
|
|
background-color: #ddd;
|
|
background-repeat: no-repeat;
|
|
background-position: 50%;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
.dark .gutter {
|
|
background-color: #777;
|
|
}
|
|
|
|
.gutter.gutter-horizontal {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
|
|
cursor: ew-resize;
|
|
width: 5px;
|
|
}
|
|
|
|
.gutter.gutter-vertical {
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
|
|
cursor: ns-resize;
|
|
height: 5px;
|
|
}
|
|
|
|
.searchbox {
|
|
float: left;
|
|
height: 40px;
|
|
margin: 10px 5px;
|
|
padding: 12px 32px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 18px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 6px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
|
|
background-position: 10px 10px;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .searchbox {
|
|
background-color: #111;
|
|
color: #eee;
|
|
}
|
|
|
|
.searchbox::placeholder {
|
|
color: #ccc;
|
|
}
|
|
|
|
.dark .searchbox::placeholder {
|
|
color: #666;
|
|
}
|
|
|
|
.filter {
|
|
width: calc(60% - 64px);
|
|
}
|
|
|
|
.reflookup {
|
|
width: calc(40% - 10px);
|
|
}
|
|
|
|
input[type=text]:focus {
|
|
background-color: white;
|
|
border: 1px solid #333;
|
|
}
|
|
|
|
.dark input[type=text]:focus {
|
|
background-color: #333;
|
|
border: 1px solid #ccc;
|
|
}
|
|
|
|
mark.highlight {
|
|
background-color: #5050ff;
|
|
color: #fff;
|
|
padding: 2px;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.dark mark.highlight {
|
|
background-color: #76a6da;
|
|
color: #111;
|
|
}
|
|
|
|
.menubtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.statsbtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.iobtn {
|
|
background-color: white;
|
|
border: none;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
|
|
background-position: center;
|
|
background-repeat: no-repeat;
|
|
}
|
|
|
|
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
|
|
filter: invert(1);
|
|
}
|
|
|
|
.flexbox {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
}
|
|
|
|
.savebtn {
|
|
background-color: #d6d6d6;
|
|
width: auto;
|
|
height: 30px;
|
|
flex-grow: 1;
|
|
margin: 5px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.savebtn:active {
|
|
background-color: #0a0;
|
|
color: white;
|
|
}
|
|
|
|
.dark .savebtn:active {
|
|
/* This will be inverted */
|
|
background-color: #b3b;
|
|
}
|
|
|
|
.stats {
|
|
border-collapse: collapse;
|
|
font-size: 12pt;
|
|
table-layout: fixed;
|
|
width: 100%;
|
|
min-width: 450px;
|
|
}
|
|
|
|
.dark .stats td {
|
|
border: 1px solid #bbb;
|
|
}
|
|
|
|
.stats td {
|
|
border: 1px solid black;
|
|
padding: 5px;
|
|
word-wrap: break-word;
|
|
text-align: center;
|
|
position: relative;
|
|
}
|
|
|
|
#checkbox-stats div {
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
#checkbox-stats .bar {
|
|
background-color: rgba(28, 251, 0, 0.6);
|
|
}
|
|
|
|
.menu {
|
|
position: relative;
|
|
display: inline-block;
|
|
margin: 10px 10px 10px 0px;
|
|
}
|
|
|
|
.menu-content {
|
|
display: none;
|
|
position: absolute;
|
|
background-color: white;
|
|
right: 0;
|
|
min-width: 300px;
|
|
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
|
z-index: 100;
|
|
padding: 8px;
|
|
}
|
|
|
|
.dark .menu-content {
|
|
background-color: #111;
|
|
}
|
|
|
|
.menu:hover .menu-content {
|
|
display: block;
|
|
}
|
|
|
|
.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
|
|
background-color: #eee;
|
|
}
|
|
|
|
.menu-label {
|
|
display: inline-block;
|
|
padding: 8px;
|
|
border: 1px solid #ccc;
|
|
border-top: 0;
|
|
width: calc(100% - 18px);
|
|
}
|
|
|
|
.menu-label-top {
|
|
border-top: 1px solid #ccc;
|
|
}
|
|
|
|
.menu-textbox {
|
|
float: left;
|
|
height: 24px;
|
|
margin: 10px 5px;
|
|
padding: 5px 5px;
|
|
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
|
|
font-size: 14px;
|
|
box-sizing: border-box;
|
|
border: 1px solid #888;
|
|
border-radius: 4px;
|
|
outline: none;
|
|
background-color: #eee;
|
|
transition: background-color 0.2s, border 0.2s;
|
|
width: calc(100% - 10px);
|
|
}
|
|
|
|
.menu-textbox.invalid, .dark .menu-textbox.invalid {
|
|
color: red;
|
|
}
|
|
|
|
.dark .menu-textbox {
|
|
background-color: #222;
|
|
color: #eee;
|
|
}
|
|
|
|
.radio-container {
|
|
margin: 4px;
|
|
}
|
|
|
|
.topmostdiv {
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
}
|
|
|
|
#top {
|
|
height: 78px;
|
|
border-bottom: 2px solid black;
|
|
}
|
|
|
|
.dark #top {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#dbg {
|
|
display: block;
|
|
}
|
|
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: #aaa;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: #666;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: #555;
|
|
}
|
|
|
|
.slider {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
margin: 3px 0;
|
|
padding: 0;
|
|
outline: none;
|
|
opacity: 0.7;
|
|
-webkit-transition: .2s;
|
|
transition: opacity .2s;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
.slider:focus {
|
|
outline: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-runnable-track {
|
|
-webkit-appearance: none;
|
|
width: 100%;
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
border: none;
|
|
}
|
|
|
|
.slider::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin-top: -4px;
|
|
}
|
|
|
|
.dark .slider::-webkit-slider-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-moz-range-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.slider::-moz-range-track {
|
|
height: 8px;
|
|
background: #d3d3d3;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.dark .slider::-moz-range-thumb {
|
|
background: #3d3;
|
|
}
|
|
|
|
.slider::-ms-track {
|
|
width: 100%;
|
|
height: 8px;
|
|
border-width: 3px 0;
|
|
background: transparent;
|
|
border-color: transparent;
|
|
color: transparent;
|
|
transition: opacity .2s;
|
|
}
|
|
|
|
.slider::-ms-fill-lower {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-fill-upper {
|
|
background: #d3d3d3;
|
|
border: none;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.slider::-ms-thumb {
|
|
width: 15px;
|
|
height: 15px;
|
|
border-radius: 50%;
|
|
background: #0a0;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
.shameless-plug {
|
|
font-size: 0.8em;
|
|
text-align: center;
|
|
display: block;
|
|
}
|
|
|
|
a {
|
|
color: #0278a4;
|
|
}
|
|
|
|
.dark a {
|
|
color: #00b9fd;
|
|
}
|
|
|
|
#frontcanvas, #backcanvas {
|
|
touch-action: none;
|
|
}
|
|
|
|
|
|
</style>
|
|
<script type="text/javascript" >
|
|
///////////////////////////////////////////////
|
|
/*
|
|
Split.js - v1.3.5
|
|
MIT License
|
|
https://github.com/nathancahill/Split.js
|
|
*/
|
|
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
|
|
// This work is free. You can redistribute it and/or modify it
|
|
// under the terms of the WTFPL, Version 2
|
|
// For more information see LICENSE.txt or http://www.wtfpl.net/
|
|
//
|
|
// For more information, the home page:
|
|
// http://pieroxy.net/blog/pages/lz-string/testing.html
|
|
//
|
|
// LZ-based compression algorithm, version 1.4.4
|
|
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/*!
|
|
* PEP v0.4.3 | https://github.com/jquery/PEP
|
|
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
|
|
*/
|
|
! function (a, b) {
|
|
"object" == typeof exports && "undefined" != typeof module ? module.exports = b() : "function" == typeof define && define.amd ? define(b) : a.PointerEventsPolyfill = b()
|
|
}(this, function () {
|
|
"use strict";
|
|
|
|
function a(a, b) {
|
|
b = b || Object.create(null);
|
|
var c = document.createEvent("Event");
|
|
c.initEvent(a, b.bubbles || !1, b.cancelable || !1);
|
|
for (var d, e = 2; e < m.length; e++) d = m[e], c[d] = b[d] || n[e];
|
|
c.buttons = b.buttons || 0;
|
|
var f = 0;
|
|
return f = b.pressure && c.buttons ? b.pressure : c.buttons ? .5 : 0, c.x = c.clientX, c.y = c.clientY, c.pointerId = b.pointerId || 0, c.width = b.width || 0, c.height = b.height || 0, c.pressure = f, c.tiltX = b.tiltX || 0, c.tiltY = b.tiltY || 0, c.twist = b.twist || 0, c.tangentialPressure = b.tangentialPressure || 0, c.pointerType = b.pointerType || "", c.hwTimestamp = b.hwTimestamp || 0, c.isPrimary = b.isPrimary || !1, c
|
|
}
|
|
|
|
function b() {
|
|
this.array = [], this.size = 0
|
|
}
|
|
|
|
function c(a, b, c, d) {
|
|
this.addCallback = a.bind(d), this.removeCallback = b.bind(d), this.changedCallback = c.bind(d), A && (this.observer = new A(this.mutationWatcher.bind(this)))
|
|
}
|
|
|
|
function d(a) {
|
|
return "body /shadow-deep/ " + e(a)
|
|
}
|
|
|
|
function e(a) {
|
|
return '[touch-action="' + a + '"]'
|
|
}
|
|
|
|
function f(a) {
|
|
return "{ -ms-touch-action: " + a + "; touch-action: " + a + "; }"
|
|
}
|
|
|
|
function g() {
|
|
if (F) {
|
|
D.forEach(function (a) {
|
|
String(a) === a ? (E += e(a) + f(a) + "\n", G && (E += d(a) + f(a) + "\n")) : (E += a.selectors.map(e) + f(a.rule) + "\n", G && (E += a.selectors.map(d) + f(a.rule) + "\n"))
|
|
});
|
|
var a = document.createElement("style");
|
|
a.textContent = E, document.head.appendChild(a)
|
|
}
|
|
}
|
|
|
|
function h() {
|
|
if (!window.PointerEvent) {
|
|
if (window.PointerEvent = a, window.navigator.msPointerEnabled) {
|
|
var b = window.navigator.msMaxTouchPoints;
|
|
Object.defineProperty(window.navigator, "maxTouchPoints", {
|
|
value: b,
|
|
enumerable: !0
|
|
}), u.registerSource("ms", _)
|
|
} else Object.defineProperty(window.navigator, "maxTouchPoints", {
|
|
value: 0,
|
|
enumerable: !0
|
|
}), u.registerSource("mouse", N), void 0 !== window.ontouchstart && u.registerSource("touch", V);
|
|
u.register(document)
|
|
}
|
|
}
|
|
|
|
function i(a) {
|
|
if (!u.pointermap.has(a)) {
|
|
var b = new Error("InvalidPointerId");
|
|
throw b.name = "InvalidPointerId", b
|
|
}
|
|
}
|
|
|
|
function j(a) {
|
|
for (var b = a.parentNode; b && b !== a.ownerDocument;) b = b.parentNode;
|
|
if (!b) {
|
|
var c = new Error("InvalidStateError");
|
|
throw c.name = "InvalidStateError", c
|
|
}
|
|
}
|
|
|
|
function k(a) {
|
|
var b = u.pointermap.get(a);
|
|
return 0 !== b.buttons
|
|
}
|
|
|
|
function l() {
|
|
window.Element && !Element.prototype.setPointerCapture && Object.defineProperties(Element.prototype, {
|
|
setPointerCapture: {
|
|
value: W
|
|
},
|
|
releasePointerCapture: {
|
|
value: X
|
|
},
|
|
hasPointerCapture: {
|
|
value: Y
|
|
}
|
|
})
|
|
}
|
|
var m = ["bubbles", "cancelable", "view", "detail", "screenX", "screenY", "clientX", "clientY", "ctrlKey", "altKey", "shiftKey", "metaKey", "button", "relatedTarget", "pageX", "pageY"],
|
|
n = [!1, !1, null, null, 0, 0, 0, 0, !1, !1, !1, !1, 0, null, 0, 0],
|
|
o = window.Map && window.Map.prototype.forEach,
|
|
p = o ? Map : b;
|
|
b.prototype = {
|
|
set: function (a, b) {
|
|
return void 0 === b ? this["delete"](a) : (this.has(a) || this.size++, void(this.array[a] = b))
|
|
},
|
|
has: function (a) {
|
|
return void 0 !== this.array[a]
|
|
},
|
|
"delete": function (a) {
|
|
this.has(a) && (delete this.array[a], this.size--)
|
|
},
|
|
get: function (a) {
|
|
return this.array[a]
|
|
},
|
|
clear: function () {
|
|
this.array.length = 0, this.size = 0
|
|
},
|
|
forEach: function (a, b) {
|
|
return this.array.forEach(function (c, d) {
|
|
a.call(b, c, d, this)
|
|
}, this)
|
|
}
|
|
};
|
|
var q = ["bubbles", "cancelable", "view", "detail", "screenX", "screenY", "clientX", "clientY", "ctrlKey", "altKey", "shiftKey", "metaKey", "button", "relatedTarget", "buttons", "pointerId", "width", "height", "pressure", "tiltX", "tiltY", "pointerType", "hwTimestamp", "isPrimary", "type", "target", "currentTarget", "which", "pageX", "pageY", "timeStamp"],
|
|
r = [!1, !1, null, null, 0, 0, 0, 0, !1, !1, !1, !1, 0, null, 0, 0, 0, 0, 0, 0, 0, "", 0, !1, "", null, null, 0, 0, 0, 0],
|
|
s = {
|
|
pointerover: 1,
|
|
pointerout: 1,
|
|
pointerenter: 1,
|
|
pointerleave: 1
|
|
},
|
|
t = "undefined" != typeof SVGElementInstance,
|
|
u = {
|
|
pointermap: new p,
|
|
eventMap: Object.create(null),
|
|
captureInfo: Object.create(null),
|
|
eventSources: Object.create(null),
|
|
eventSourceList: [],
|
|
registerSource: function (a, b) {
|
|
var c = b,
|
|
d = c.events;
|
|
d && (d.forEach(function (a) {
|
|
c[a] && (this.eventMap[a] = c[a].bind(c))
|
|
}, this), this.eventSources[a] = c, this.eventSourceList.push(c))
|
|
},
|
|
register: function (a) {
|
|
for (var b, c = this.eventSourceList.length, d = 0; d < c && (b = this.eventSourceList[d]); d++)
|
|
b.register.call(b, a)
|
|
},
|
|
unregister: function (a) {
|
|
for (var b, c = this.eventSourceList.length, d = 0; d < c && (b = this.eventSourceList[d]); d++)
|
|
b.unregister.call(b, a)
|
|
},
|
|
contains: function (a, b) {
|
|
try {
|
|
return a.contains(b)
|
|
} catch (c) {
|
|
return !1
|
|
}
|
|
},
|
|
down: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointerdown", a)
|
|
},
|
|
move: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointermove", a)
|
|
},
|
|
up: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointerup", a)
|
|
},
|
|
enter: function (a) {
|
|
a.bubbles = !1, this.fireEvent("pointerenter", a)
|
|
},
|
|
leave: function (a) {
|
|
a.bubbles = !1, this.fireEvent("pointerleave", a)
|
|
},
|
|
over: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointerover", a)
|
|
},
|
|
out: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointerout", a)
|
|
},
|
|
cancel: function (a) {
|
|
a.bubbles = !0, this.fireEvent("pointercancel", a)
|
|
},
|
|
leaveOut: function (a) {
|
|
this.out(a), this.propagate(a, this.leave, !1)
|
|
},
|
|
enterOver: function (a) {
|
|
this.over(a), this.propagate(a, this.enter, !0)
|
|
},
|
|
eventHandler: function (a) {
|
|
if (!a._handledByPE) {
|
|
var b = a.type,
|
|
c = this.eventMap && this.eventMap[b];
|
|
c && c(a), a._handledByPE = !0
|
|
}
|
|
},
|
|
listen: function (a, b) {
|
|
b.forEach(function (b) {
|
|
this.addEvent(a, b)
|
|
}, this)
|
|
},
|
|
unlisten: function (a, b) {
|
|
b.forEach(function (b) {
|
|
this.removeEvent(a, b)
|
|
}, this)
|
|
},
|
|
addEvent: function (a, b) {
|
|
a.addEventListener(b, this.boundHandler)
|
|
},
|
|
removeEvent: function (a, b) {
|
|
a.removeEventListener(b, this.boundHandler)
|
|
},
|
|
makeEvent: function (b, c) {
|
|
this.captureInfo[c.pointerId] && (c.relatedTarget = null);
|
|
var d = new a(b, c);
|
|
return c.preventDefault && (d.preventDefault = c.preventDefault), d._target = d._target || c.target, d
|
|
},
|
|
fireEvent: function (a, b) {
|
|
var c = this.makeEvent(a, b);
|
|
return this.dispatchEvent(c)
|
|
},
|
|
cloneEvent: function (a) {
|
|
for (var b, c = Object.create(null), d = 0; d < q.length; d++) b = q[d], c[b] = a[b] || r[d], !t || "target" !== b && "relatedTarget" !== b || c[b] instanceof SVGElementInstance && (c[b] = c[b].correspondingUseElement);
|
|
return a.preventDefault && (c.preventDefault = function () {
|
|
a.preventDefault()
|
|
}), c
|
|
},
|
|
getTarget: function (a) {
|
|
var b = this.captureInfo[a.pointerId];
|
|
return b ? a._target !== b && a.type in s ? void 0 : b : a._target
|
|
},
|
|
propagate: function (a, b, c) {
|
|
for (var d = a.target, e = []; d !== document && !d.contains(a.relatedTarget);)
|
|
if (e.push(d), d = d.parentNode, !d) return;
|
|
c && e.reverse(), e.forEach(function (c) {
|
|
a.target = c, b.call(this, a)
|
|
}, this)
|
|
},
|
|
setCapture: function (b, c, d) {
|
|
this.captureInfo[b] && this.releaseCapture(b, d), this.captureInfo[b] = c, this.implicitRelease = this.releaseCapture.bind(this, b, d), document.addEventListener("pointerup", this.implicitRelease), document.addEventListener("pointercancel", this.implicitRelease);
|
|
var e = new a("gotpointercapture");
|
|
e.pointerId = b, e._target = c, d || this.asyncDispatchEvent(e)
|
|
},
|
|
releaseCapture: function (b, c) {
|
|
var d = this.captureInfo[b];
|
|
if (d) {
|
|
this.captureInfo[b] = void 0, document.removeEventListener("pointerup", this.implicitRelease), document.removeEventListener("pointercancel", this.implicitRelease);
|
|
var e = new a("lostpointercapture");
|
|
e.pointerId = b, e._target = d, c || this.asyncDispatchEvent(e)
|
|
}
|
|
},
|
|
dispatchEvent: /*scope.external.dispatchEvent || */ function (a) {
|
|
var b = this.getTarget(a);
|
|
if (b) return b.dispatchEvent(a)
|
|
},
|
|
asyncDispatchEvent: function (a) {
|
|
requestAnimationFrame(this.dispatchEvent.bind(this, a))
|
|
}
|
|
};
|
|
u.boundHandler = u.eventHandler.bind(u);
|
|
var v = {
|
|
shadow: function (a) {
|
|
if (a) return a.shadowRoot || a.webkitShadowRoot
|
|
},
|
|
canTarget: function (a) {
|
|
return a && Boolean(a.elementFromPoint)
|
|
},
|
|
targetingShadow: function (a) {
|
|
var b = this.shadow(a);
|
|
if (this.canTarget(b)) return b
|
|
},
|
|
olderShadow: function (a) {
|
|
var b = a.olderShadowRoot;
|
|
if (!b) {
|
|
var c = a.querySelector("shadow");
|
|
c && (b = c.olderShadowRoot)
|
|
}
|
|
return b
|
|
},
|
|
allShadows: function (a) {
|
|
for (var b = [], c = this.shadow(a); c;) b.push(c), c = this.olderShadow(c);
|
|
return b
|
|
},
|
|
searchRoot: function (a, b, c) {
|
|
if (a) {
|
|
var d, e, f = a.elementFromPoint(b, c);
|
|
for (e = this.targetingShadow(f); e;) {
|
|
if (d = e.elementFromPoint(b, c)) {
|
|
var g = this.targetingShadow(d);
|
|
return this.searchRoot(g, b, c) || d
|
|
}
|
|
e = this.olderShadow(e)
|
|
}
|
|
return f
|
|
}
|
|
},
|
|
owner: function (a) {
|
|
for (var b = a; b.parentNode;) b = b.parentNode;
|
|
return b.nodeType !== Node.DOCUMENT_NODE && b.nodeType !== Node.DOCUMENT_FRAGMENT_NODE && (b = document), b
|
|
},
|
|
findTarget: function (a) {
|
|
var b = a.clientX,
|
|
c = a.clientY,
|
|
d = this.owner(a.target);
|
|
return d.elementFromPoint(b, c) || (d = document), this.searchRoot(d, b, c)
|
|
}
|
|
},
|
|
w = Array.prototype.forEach.call.bind(Array.prototype.forEach),
|
|
x = Array.prototype.map.call.bind(Array.prototype.map),
|
|
y = Array.prototype.slice.call.bind(Array.prototype.slice),
|
|
z = Array.prototype.filter.call.bind(Array.prototype.filter),
|
|
A = window.MutationObserver || window.WebKitMutationObserver,
|
|
B = "[touch-action]",
|
|
C = {
|
|
subtree: !0,
|
|
childList: !0,
|
|
attributes: !0,
|
|
attributeOldValue: !0,
|
|
attributeFilter: ["touch-action"]
|
|
};
|
|
c.prototype = {
|
|
watchSubtree: function (a) {
|
|
//
|
|
this.observer && v.canTarget(a) && this.observer.observe(a, C)
|
|
},
|
|
enableOnSubtree: function (a) {
|
|
this.watchSubtree(a), a === document && "complete" !== document.readyState ? this.installOnLoad() : this.installNewSubtree(a)
|
|
},
|
|
installNewSubtree: function (a) {
|
|
w(this.findElements(a), this.addElement, this)
|
|
},
|
|
findElements: function (a) {
|
|
return a.querySelectorAll ? a.querySelectorAll(B) : []
|
|
},
|
|
removeElement: function (a) {
|
|
this.removeCallback(a)
|
|
},
|
|
addElement: function (a) {
|
|
this.addCallback(a)
|
|
},
|
|
elementChanged: function (a, b) {
|
|
this.changedCallback(a, b)
|
|
},
|
|
concatLists: function (a, b) {
|
|
return a.concat(y(b))
|
|
},
|
|
installOnLoad: function () {
|
|
document.addEventListener("readystatechange", function () {
|
|
"complete" === document.readyState && this.installNewSubtree(document)
|
|
}.bind(this))
|
|
},
|
|
isElement: function (a) {
|
|
return a.nodeType === Node.ELEMENT_NODE
|
|
},
|
|
flattenMutationTree: function (a) {
|
|
var b = x(a, this.findElements, this);
|
|
return b.push(z(a, this.isElement)), b.reduce(this.concatLists, [])
|
|
},
|
|
mutationWatcher: function (a) {
|
|
a.forEach(this.mutationHandler, this)
|
|
},
|
|
mutationHandler: function (a) {
|
|
if ("childList" === a.type) {
|
|
var b = this.flattenMutationTree(a.addedNodes);
|
|
b.forEach(this.addElement, this);
|
|
var c = this.flattenMutationTree(a.removedNodes);
|
|
c.forEach(this.removeElement, this)
|
|
} else "attributes" === a.type && this.elementChanged(a.target, a.oldValue)
|
|
}
|
|
};
|
|
var D = ["none", "auto", "pan-x", "pan-y", {
|
|
rule: "pan-x pan-y",
|
|
selectors: ["pan-x pan-y", "pan-y pan-x"]
|
|
}],
|
|
E = "",
|
|
F = window.PointerEvent || window.MSPointerEvent,
|
|
G = !window.ShadowDOMPolyfill && document.head.createShadowRoot,
|
|
H = u.pointermap,
|
|
I = 25,
|
|
J = [1, 4, 2, 8, 16],
|
|
K = !1;
|
|
try {
|
|
K = 1 === new MouseEvent("test", {
|
|
buttons: 1
|
|
}).buttons
|
|
} catch (L) {}
|
|
var M, N = {
|
|
POINTER_ID: 1,
|
|
POINTER_TYPE: "mouse",
|
|
events: ["mousedown", "mousemove", "mouseup", "mouseover", "mouseout"],
|
|
register: function (a) {
|
|
u.listen(a, this.events)
|
|
},
|
|
unregister: function (a) {
|
|
u.unlisten(a, this.events)
|
|
},
|
|
lastTouches: [],
|
|
isEventSimulatedFromTouch: function (a) {
|
|
for (var b, c = this.lastTouches, d = a.clientX, e = a.clientY, f = 0, g = c.length; f < g && (b = c[f]); f++) {
|
|
var h = Math.abs(d - b.x),
|
|
i = Math.abs(e - b.y);
|
|
if (h <= I && i <= I) return !0
|
|
}
|
|
},
|
|
prepareEvent: function (a) {
|
|
var b = u.cloneEvent(a),
|
|
c = b.preventDefault;
|
|
return b.preventDefault = function () {
|
|
a.preventDefault(), c()
|
|
}, b.pointerId = this.POINTER_ID, b.isPrimary = !0, b.pointerType = this.POINTER_TYPE, b
|
|
},
|
|
prepareButtonsForMove: function (a, b) {
|
|
var c = H.get(this.POINTER_ID);
|
|
0 !== b.which && c ? a.buttons = c.buttons : a.buttons = 0, b.buttons = a.buttons
|
|
},
|
|
mousedown: function (a) {
|
|
if (!this.isEventSimulatedFromTouch(a)) {
|
|
var b = H.get(this.POINTER_ID),
|
|
c = this.prepareEvent(a);
|
|
K || (c.buttons = J[c.button], b && (c.buttons |= b.buttons), a.buttons = c.buttons), H.set(this.POINTER_ID, a), b && 0 !== b.buttons ? u.move(c) : u.down(c)
|
|
}
|
|
},
|
|
mousemove: function (a) {
|
|
if (!this.isEventSimulatedFromTouch(a)) {
|
|
var b = this.prepareEvent(a);
|
|
K || this.prepareButtonsForMove(b, a), b.button = -1, H.set(this.POINTER_ID, a), u.move(b)
|
|
}
|
|
},
|
|
mouseup: function (a) {
|
|
if (!this.isEventSimulatedFromTouch(a)) {
|
|
var b = H.get(this.POINTER_ID),
|
|
c = this.prepareEvent(a);
|
|
if (!K) {
|
|
var d = J[c.button];
|
|
c.buttons = b ? b.buttons & ~d : 0, a.buttons = c.buttons
|
|
}
|
|
H.set(this.POINTER_ID, a),
|
|
c.buttons &= ~J[c.button], 0 === c.buttons ? u.up(c) : u.move(c)
|
|
}
|
|
},
|
|
mouseover: function (a) {
|
|
if (!this.isEventSimulatedFromTouch(a)) {
|
|
var b = this.prepareEvent(a);
|
|
K || this.prepareButtonsForMove(b, a), b.button = -1, H.set(this.POINTER_ID, a), u.enterOver(b)
|
|
}
|
|
},
|
|
mouseout: function (a) {
|
|
if (!this.isEventSimulatedFromTouch(a)) {
|
|
var b = this.prepareEvent(a);
|
|
K || this.prepareButtonsForMove(b, a), b.button = -1, u.leaveOut(b)
|
|
}
|
|
},
|
|
cancel: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.cancel(b), this.deactivateMouse()
|
|
},
|
|
deactivateMouse: function () {
|
|
H["delete"](this.POINTER_ID)
|
|
}
|
|
},
|
|
O = u.captureInfo,
|
|
P = v.findTarget.bind(v),
|
|
Q = v.allShadows.bind(v),
|
|
R = u.pointermap,
|
|
S = 2500,
|
|
T = 200,
|
|
U = "touch-action",
|
|
V = {
|
|
events: ["touchstart", "touchmove", "touchend", "touchcancel"],
|
|
register: function (a) {
|
|
M.enableOnSubtree(a)
|
|
},
|
|
unregister: function () {},
|
|
elementAdded: function (a) {
|
|
var b = a.getAttribute(U),
|
|
c = this.touchActionToScrollType(b);
|
|
c && (a._scrollType = c, u.listen(a, this.events),
|
|
Q(a).forEach(function (a) {
|
|
a._scrollType = c, u.listen(a, this.events)
|
|
}, this))
|
|
},
|
|
elementRemoved: function (a) {
|
|
a._scrollType = void 0, u.unlisten(a, this.events),
|
|
Q(a).forEach(function (a) {
|
|
a._scrollType = void 0, u.unlisten(a, this.events)
|
|
}, this)
|
|
},
|
|
elementChanged: function (a, b) {
|
|
var c = a.getAttribute(U),
|
|
d = this.touchActionToScrollType(c),
|
|
e = this.touchActionToScrollType(b);
|
|
d && e ? (a._scrollType = d, Q(a).forEach(function (a) {
|
|
a._scrollType = d
|
|
}, this)) : e ? this.elementRemoved(a) : d && this.elementAdded(a)
|
|
},
|
|
scrollTypes: {
|
|
EMITTER: "none",
|
|
XSCROLLER: "pan-x",
|
|
YSCROLLER: "pan-y",
|
|
SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
|
|
},
|
|
touchActionToScrollType: function (a) {
|
|
var b = a,
|
|
c = this.scrollTypes;
|
|
return "none" === b ? "none" : b === c.XSCROLLER ? "X" : b === c.YSCROLLER ? "Y" : c.SCROLLER.exec(b) ? "XY" : void 0
|
|
},
|
|
POINTER_TYPE: "touch",
|
|
firstTouch: null,
|
|
isPrimaryTouch: function (a) {
|
|
return this.firstTouch === a.identifier
|
|
},
|
|
setPrimaryTouch: function (a) {
|
|
(0 === R.size || 1 === R.size && R.has(1)) && (this.firstTouch = a.identifier, this.firstXY = {
|
|
X: a.clientX,
|
|
Y: a.clientY
|
|
}, this.scrolling = !1, this.cancelResetClickCount())
|
|
},
|
|
removePrimaryPointer: function (a) {
|
|
a.isPrimary && (this.firstTouch = null, this.firstXY = null, this.resetClickCount())
|
|
},
|
|
clickCount: 0,
|
|
resetId: null,
|
|
resetClickCount: function () {
|
|
var a = function () {
|
|
this.clickCount = 0, this.resetId = null
|
|
}.bind(this);
|
|
this.resetId = setTimeout(a, T)
|
|
},
|
|
cancelResetClickCount: function () {
|
|
this.resetId && clearTimeout(this.resetId)
|
|
},
|
|
typeToButtons: function (a) {
|
|
var b = 0;
|
|
return "touchstart" !== a && "touchmove" !== a || (b = 1), b
|
|
},
|
|
touchToPointer: function (a) {
|
|
var b = this.currentTouchEvent,
|
|
c = u.cloneEvent(a),
|
|
d = c.pointerId = a.identifier + 2;
|
|
c.target = O[d] || P(c), c.bubbles = !0, c.cancelable = !0, c.detail = this.clickCount, c.button = 0, c.buttons = this.typeToButtons(b.type), c.width = 2 * (a.radiusX || a.webkitRadiusX || 0), c.height = 2 * (a.radiusY || a.webkitRadiusY || 0), c.pressure = a.force || a.webkitForce || .5, c.isPrimary = this.isPrimaryTouch(a), c.pointerType = this.POINTER_TYPE,
|
|
c.altKey = b.altKey, c.ctrlKey = b.ctrlKey, c.metaKey = b.metaKey, c.shiftKey = b.shiftKey;
|
|
var e = this;
|
|
return c.preventDefault = function () {
|
|
e.scrolling = !1, e.firstXY = null, b.preventDefault()
|
|
}, c
|
|
},
|
|
processTouches: function (a, b) {
|
|
var c = a.changedTouches;
|
|
this.currentTouchEvent = a;
|
|
for (var d, e = 0; e < c.length; e++) d = c[e], b.call(this, this.touchToPointer(d))
|
|
},
|
|
shouldScroll: function (a) {
|
|
if (this.firstXY) {
|
|
var b, c = a.currentTarget._scrollType;
|
|
if ("none" === c)
|
|
b = !1;
|
|
else if ("XY" === c)
|
|
b = !0;
|
|
else {
|
|
var d = a.changedTouches[0],
|
|
e = c,
|
|
f = "Y" === c ? "X" : "Y",
|
|
g = Math.abs(d["client" + e] - this.firstXY[e]),
|
|
h = Math.abs(d["client" + f] - this.firstXY[f]);
|
|
b = g >= h
|
|
}
|
|
return this.firstXY = null, b
|
|
}
|
|
},
|
|
findTouch: function (a, b) {
|
|
for (var c, d = 0, e = a.length; d < e && (c = a[d]); d++)
|
|
if (c.identifier === b) return !0
|
|
},
|
|
vacuumTouches: function (a) {
|
|
var b = a.touches;
|
|
if (R.size >= b.length) {
|
|
var c = [];
|
|
R.forEach(function (a, d) {
|
|
if (1 !== d && !this.findTouch(b, d - 2)) {
|
|
var e = a.out;
|
|
c.push(e)
|
|
}
|
|
}, this), c.forEach(this.cancelOut, this)
|
|
}
|
|
},
|
|
touchstart: function (a) {
|
|
this.vacuumTouches(a), this.setPrimaryTouch(a.changedTouches[0]), this.dedupSynthMouse(a), this.scrolling || (this.clickCount++, this.processTouches(a, this.overDown))
|
|
},
|
|
overDown: function (a) {
|
|
R.set(a.pointerId, {
|
|
target: a.target,
|
|
out: a,
|
|
outTarget: a.target
|
|
}), u.enterOver(a), u.down(a)
|
|
},
|
|
touchmove: function (a) {
|
|
this.scrolling || (this.shouldScroll(a) ? (this.scrolling = !0, this.touchcancel(a)) : (a.preventDefault(), this.processTouches(a, this.moveOverOut)))
|
|
},
|
|
moveOverOut: function (a) {
|
|
var b = a,
|
|
c = R.get(b.pointerId);
|
|
if (c) {
|
|
var d = c.out,
|
|
e = c.outTarget;
|
|
u.move(b), d && e !== b.target && (d.relatedTarget = b.target, b.relatedTarget = e,
|
|
d.target = e, b.target ? (u.leaveOut(d), u.enterOver(b)) : (
|
|
b.target = e, b.relatedTarget = null, this.cancelOut(b))), c.out = b, c.outTarget = b.target
|
|
}
|
|
},
|
|
touchend: function (a) {
|
|
this.dedupSynthMouse(a), this.processTouches(a, this.upOut)
|
|
},
|
|
upOut: function (a) {
|
|
this.scrolling || (u.up(a), u.leaveOut(a)), this.cleanUpPointer(a)
|
|
},
|
|
touchcancel: function (a) {
|
|
this.processTouches(a, this.cancelOut)
|
|
},
|
|
cancelOut: function (a) {
|
|
u.cancel(a), u.leaveOut(a), this.cleanUpPointer(a)
|
|
},
|
|
cleanUpPointer: function (a) {
|
|
R["delete"](a.pointerId), this.removePrimaryPointer(a)
|
|
},
|
|
dedupSynthMouse: function (a) {
|
|
var b = N.lastTouches,
|
|
c = a.changedTouches[0];
|
|
if (this.isPrimaryTouch(c)) {
|
|
var d = {
|
|
x: c.clientX,
|
|
y: c.clientY
|
|
};
|
|
b.push(d);
|
|
var e = function (a, b) {
|
|
var c = a.indexOf(b);
|
|
c > -1 && a.splice(c, 1)
|
|
}.bind(null, b, d);
|
|
setTimeout(e, S)
|
|
}
|
|
}
|
|
};
|
|
M = new c(V.elementAdded, V.elementRemoved, V.elementChanged, V);
|
|
var W, X, Y, Z = u.pointermap,
|
|
$ = window.MSPointerEvent && "number" == typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,
|
|
_ = {
|
|
events: ["MSPointerDown", "MSPointerMove", "MSPointerUp", "MSPointerOut", "MSPointerOver", "MSPointerCancel", "MSGotPointerCapture", "MSLostPointerCapture"],
|
|
register: function (a) {
|
|
u.listen(a, this.events)
|
|
},
|
|
unregister: function (a) {
|
|
u.unlisten(a, this.events)
|
|
},
|
|
POINTER_TYPES: ["", "unavailable", "touch", "pen", "mouse"],
|
|
prepareEvent: function (a) {
|
|
var b = a;
|
|
return $ && (b = u.cloneEvent(a), b.pointerType = this.POINTER_TYPES[a.pointerType]), b
|
|
},
|
|
cleanup: function (a) {
|
|
Z["delete"](a)
|
|
},
|
|
MSPointerDown: function (a) {
|
|
Z.set(a.pointerId, a);
|
|
var b = this.prepareEvent(a);
|
|
u.down(b)
|
|
},
|
|
MSPointerMove: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.move(b)
|
|
},
|
|
MSPointerUp: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.up(b), this.cleanup(a.pointerId)
|
|
},
|
|
MSPointerOut: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.leaveOut(b)
|
|
},
|
|
MSPointerOver: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.enterOver(b)
|
|
},
|
|
MSPointerCancel: function (a) {
|
|
var b = this.prepareEvent(a);
|
|
u.cancel(b), this.cleanup(a.pointerId)
|
|
},
|
|
MSLostPointerCapture: function (a) {
|
|
var b = u.makeEvent("lostpointercapture", a);
|
|
u.dispatchEvent(b)
|
|
},
|
|
MSGotPointerCapture: function (a) {
|
|
var b = u.makeEvent("gotpointercapture", a);
|
|
u.dispatchEvent(b)
|
|
}
|
|
},
|
|
aa = window.navigator;
|
|
aa.msPointerEnabled ? (W = function (a) {
|
|
i(a), j(this), k(a) && (u.setCapture(a, this, !0), this.msSetPointerCapture(a))
|
|
}, X = function (a) {
|
|
i(a), u.releaseCapture(a, !0), this.msReleasePointerCapture(a)
|
|
}) : (W = function (a) {
|
|
i(a), j(this), k(a) && u.setCapture(a, this)
|
|
}, X = function (a) {
|
|
i(a), u.releaseCapture(a)
|
|
}), Y = function (a) {
|
|
return !!u.captureInfo[a]
|
|
}, g(), h(), l();
|
|
var ba = {
|
|
dispatcher: u,
|
|
Installer: c,
|
|
PointerEvent: a,
|
|
PointerMap: p,
|
|
targetFinding: v
|
|
};
|
|
return ba
|
|
});
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var config = {"show_fabrication":false,"redraw_on_drag":true,"highlight_pin1":false,"extra_fields":["BOM_Manufacturer","BOM_Manufacturer Part","BOM_Supplier","BOM_Supplier Part"],"dark_mode":false,"bom_view":"left-right","board_rotation":0,"checkboxes":"Sourced,Placed","show_silkscreen":true,"show_pads":true,"layer_view":"FB"};
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = {"ibom_version":"v2.3-50-g53ae\n","edges_bbox":{"minx":3883.5,"miny":3320.1,"maxx":4158.1,"maxy":3381.2999999999997},"edges":[{"type":"polyline","net":"S$3016","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3893.6223,3329.815 4146.3777,3329.815 4146.3777,3369.185 3893.6223,3369.185"},{"type":"polyline","net":"S$3020","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3893.6223,3369.185 3893.6223,3329.815"},{"type":"arc","width":1,"svgpath":"M4012.52,3349.5 A7.48,7.48 0 1 1 4027.48,3349.5","net":""},{"type":"arc","width":1,"svgpath":"M4027.48,3349.5 A7.48,7.48 0 1 1 4012.52,3349.5","net":""}],"drawings":{"silkscreen":{"F":[{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3906.2212,3342.413 3925.1192,3342.413 3925.1192,3356.586 3906.2212,3356.586 3906.2212,3342.413"},{"type":"circle","_svgpath":"M 3904.646, 3356.587 m -0.394, 0 a 0.394,0.394 0 1,0 0.788,0 a 0.394,0.394 0 1,0 -0.788,0","start":[3904.646,3356.587],"radius":0.394,"width":"0.7874","net":""},{"type":"text","svgpath":"M 3914.1892 3328.96 L 3915.8292 3333.26 M 3917.4692 3328.96 L 3915.8292 3333.26 M 3918.8192 3328.96 L 3918.8192 3333.26 M 3918.8192 3333.26 L 3921.2692 3333.26 M 3925.0792 3329.58 L 3924.8692 3329.17 L 3924.2592 3328.96 L 3923.8492 3328.96 L 3923.2292 3329.17 L 3922.8292 3329.78 L 3922.6192 3330.8 L 3922.6192 3331.83 L 3922.8292 3332.64 L 3923.2292 3333.05 L 3923.8492 3333.26 L 3924.0492 3333.26 L 3924.6692 3333.05 L 3925.0792 3332.64 L 3925.2792 3332.03 L 3925.2792 3331.83 L 3925.0792 3331.21 L 3924.6692 3330.8 L 3924.0492 3330.6 L 3923.8492 3330.6 L 3923.2292 3330.8 L 3922.8292 3331.21 L 3922.6192 3331.83 M 3926.6292 3329.78 L 3927.0392 3329.58 L 3927.6492 3328.96 L 3927.6492 3333.26 M 3930.0292 3328.96 L 3929.4092 3329.17 L 3929.2092 3329.58 L 3929.2092 3329.99 L 3929.4092 3330.39 L 3929.8192 3330.6 L 3930.6392 3330.8 L 3931.2492 3331.01 L 3931.6592 3331.42 L 3931.8692 3331.83 L 3931.8692 3332.44 L 3931.6592 3332.85 L 3931.4592 3333.05 L 3930.8392 3333.26 L 3930.0292 3333.26 L 3929.4092 3333.05 L 3929.2092 3332.85 L 3928.9992 3332.44 L 3928.9992 3331.83 L 3929.2092 3331.42 L 3929.6192 3331.01 L 3930.2292 3330.8 L 3931.0492 3330.6 L 3931.4592 3330.39 L 3931.6592 3329.99 L 3931.6592 3329.58 L 3931.4592 3329.17 L 3930.8392 3328.96 L 3930.0292 3328.96 M 3934.4392 3328.96 L 3933.8292 3329.17 L 3933.4192 3329.78 L 3933.2192 3330.8 L 3933.2192 3331.42 L 3933.4192 3332.44 L 3933.8292 3333.05 L 3934.4392 3333.26 L 3934.8492 3333.26 L 3935.4692 3333.05 L 3935.8792 3332.44 L 3936.0792 3331.42 L 3936.0792 3330.8 L 3935.8792 3329.78 L 3935.4692 3329.17 L 3934.8492 3328.96 L 3934.4392 3328.96 M 3937.4292 3328.96 L 3940.2892 3333.26 M 3940.2892 3328.96 L 3937.4292 3333.26","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3962.9126,3354.9725 3959.7629,3354.9725"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3964.1325,3350.6034 3964.1325,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3958.5433,3350.6034 3958.5433,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3964.1554,3348.3361 3964.1554,3345.1865"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3962.9356,3343.9667 3959.7861,3343.9667"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3958.5664,3348.3361 3958.5664,3345.1865"},{"type":"arc","width":1,"svgpath":"M 3962.9356 3343.9665 A 1.2198 1.2198 0 0 1 3964.1554 3345.1863","net":""},{"type":"arc","width":1,"svgpath":"M 3958.5662 3345.1863 A 1.2198 1.2198 0 0 1 3959.7861 3343.9665","net":""},{"type":"arc","width":1,"svgpath":"M 3964.1325 3353.7527 A 1.2198 1.2198 0 0 1 3962.9126 3354.9725","net":""},{"type":"arc","width":1,"svgpath":"M 3959.7631 3354.9725 A 1.2198 1.2198 0 0 1 3958.5433 3353.7527","net":""},{"type":"text","svgpath":"M 3973.4088 3361.3501 L 3973.1988 3360.9401 L 3972.5888 3360.3301 L 3976.8788 3360.3301 M 3972.5888 3357.7501 L 3972.7888 3358.3601 L 3973.4088 3358.7701 L 3974.4288 3358.9801 L 3975.0388 3358.9801 L 3976.0688 3358.7701 L 3976.6788 3358.3601 L 3976.8788 3357.7501 L 3976.8788 3357.3401 L 3976.6788 3356.7301 L 3976.0688 3356.3201 L 3975.0388 3356.1101 L 3974.4288 3356.1101 L 3973.4088 3356.3201 L 3972.7888 3356.7301 L 3972.5888 3357.3401 L 3972.5888 3357.7501 M 3974.0188 3354.7601 L 3976.0688 3354.7601 L 3976.6788 3354.5601 L 3976.8788 3354.1501 L 3976.8788 3353.5401 L 3976.6788 3353.1301 L 3976.0688 3352.5101 M 3974.0188 3352.5101 L 3976.8788 3352.5101 M 3972.5888 3351.1601 L 3976.8788 3351.1601 M 3972.5888 3351.1601 L 3972.5888 3348.5001 M 3974.6288 3351.1601 L 3974.6288 3349.5301","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3975.511,3354.9725 3972.3613,3354.9725"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3976.7309,3350.6034 3976.7309,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3971.1417,3350.6034 3971.1417,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3976.7538,3348.3361 3976.7538,3345.1865"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3975.534,3343.9667 3972.3845,3343.9667"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3971.1648,3348.3361 3971.1648,3345.1865"},{"type":"arc","width":1,"svgpath":"M 3975.534 3343.9665 A 1.2198 1.2198 0 0 1 3976.7538 3345.1863","net":""},{"type":"arc","width":1,"svgpath":"M 3971.1646 3345.1863 A 1.2198 1.2198 0 0 1 3972.3845 3343.9665","net":""},{"type":"arc","width":1,"svgpath":"M 3976.7309 3353.7527 A 1.2198 1.2198 0 0 1 3975.511 3354.9725","net":""},{"type":"arc","width":1,"svgpath":"M 3972.3615 3354.9725 A 1.2198 1.2198 0 0 1 3971.1417 3353.7527","net":""},{"type":"text","svgpath":"M 3983.747 3362.9801 L 3983.747 3360.7301 L 3985.387 3361.9601 L 3985.387 3361.3401 L 3985.587 3360.9401 L 3985.787 3360.7301 L 3986.407 3360.5301 L 3986.817 3360.5301 L 3987.427 3360.7301 L 3987.837 3361.1401 L 3988.037 3361.7501 L 3988.037 3362.3701 L 3987.837 3362.9801 L 3987.637 3363.1901 L 3987.227 3363.3901 M 3983.747 3358.7701 L 3983.747 3356.5201 L 3985.387 3357.7401 L 3985.387 3357.1301 L 3985.587 3356.7201 L 3985.787 3356.5201 L 3986.407 3356.3101 L 3986.817 3356.3101 L 3987.427 3356.5201 L 3987.837 3356.9301 L 3988.037 3357.5401 L 3988.037 3358.1501 L 3987.837 3358.7701 L 3987.637 3358.9701 L 3987.227 3359.1801 M 3985.177 3354.9601 L 3989.477 3354.9601 M 3985.787 3354.9601 L 3985.387 3354.5501 L 3985.177 3354.1401 L 3985.177 3353.5301 L 3985.387 3353.1201 L 3985.787 3352.7101 L 3986.407 3352.5101 L 3986.817 3352.5101 L 3987.427 3352.7101 L 3987.837 3353.1201 L 3988.037 3353.5301 L 3988.037 3354.1401 L 3987.837 3354.5501 L 3987.427 3354.9601 M 3983.747 3351.1601 L 3988.037 3351.1601 M 3983.747 3351.1601 L 3983.747 3348.5001 M 3985.787 3351.1601 L 3985.787 3349.5201","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3979.0561,3344.0275 3982.2058,3344.0275"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3977.8362,3348.3966 3977.8362,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3983.4254,3348.3966 3983.4254,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3977.8133,3350.6639 3977.8133,3353.8135"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3979.0331,3355.0333 3982.1826,3355.0333"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3983.4023,3350.6639 3983.4023,3353.8135"},{"type":"arc","width":1,"svgpath":"M 3979.0331 3355.0335 A 1.2198 1.2198 0 0 1 3977.8133 3353.8137","net":""},{"type":"arc","width":1,"svgpath":"M 3983.4025 3353.8137 A 1.2198 1.2198 0 0 1 3982.1826 3355.0335","net":""},{"type":"arc","width":1,"svgpath":"M 3977.8362 3345.2473 A 1.2198 1.2198 0 0 1 3979.0561 3344.0275","net":""},{"type":"arc","width":1,"svgpath":"M 3982.2056 3344.0275 A 1.2198 1.2198 0 0 1 3983.4254 3345.2473","net":""},{"type":"text","svgpath":"M 3965.0901 3350.0902 L 3965.0901 3347.8402 L 3966.7301 3349.0702 L 3966.7301 3348.4502 L 3966.9301 3348.0502 L 3967.1301 3347.8402 L 3967.7501 3347.6402 L 3968.1601 3347.6402 L 3968.7701 3347.8402 L 3969.1801 3348.2502 L 3969.3801 3348.8602 L 3969.3801 3349.4802 L 3969.1801 3350.0902 L 3968.9801 3350.3002 L 3968.5701 3350.5002 M 3965.0901 3345.8802 L 3965.0901 3343.6302 L 3966.7301 3344.8502 L 3966.7301 3344.2402 L 3966.9301 3343.8302 L 3967.1301 3343.6302 L 3967.7501 3343.4202 L 3968.1601 3343.4202 L 3968.7701 3343.6302 L 3969.1801 3344.0402 L 3969.3801 3344.6502 L 3969.3801 3345.2602 L 3969.1801 3345.8802 L 3968.9801 3346.0802 L 3968.5701 3346.2902 M 3966.5201 3342.0702 L 3970.8201 3342.0702 M 3967.1301 3342.0702 L 3966.7301 3341.6602 L 3966.5201 3341.2502 L 3966.5201 3340.6402 L 3966.7301 3340.2302 L 3967.1301 3339.8202 L 3967.7501 3339.6202 L 3968.1601 3339.6202 L 3968.7701 3339.8202 L 3969.1801 3340.2302 L 3969.3801 3340.6402 L 3969.3801 3341.2502 L 3969.1801 3341.6602 L 3968.7701 3342.0702 M 3965.0901 3338.2702 L 3969.3801 3338.2702 M 3965.0901 3338.2702 L 3965.0901 3335.6102 M 3967.1301 3338.2702 L 3967.1301 3336.6302","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3956.2197,3354.9725 3953.07,3354.9725"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3957.4396,3350.6034 3957.4396,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3951.8504,3350.6034 3951.8504,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3957.4625,3348.3361 3957.4625,3345.1865"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3956.2427,3343.9667 3953.0932,3343.9667"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3951.8735,3348.3361 3951.8735,3345.1865"},{"type":"arc","width":1,"svgpath":"M 3956.2427 3343.9665 A 1.2198 1.2198 0 0 1 3957.4625 3345.1863","net":""},{"type":"arc","width":1,"svgpath":"M 3951.8733 3345.1863 A 1.2198 1.2198 0 0 1 3953.0932 3343.9665","net":""},{"type":"arc","width":1,"svgpath":"M 3957.4396 3353.7527 A 1.2198 1.2198 0 0 1 3956.2197 3354.9725","net":""},{"type":"arc","width":1,"svgpath":"M 3953.0702 3354.9725 A 1.2198 1.2198 0 0 1 3951.8504 3353.7527","net":""},{"type":"text","svgpath":"M 3966.7158 3365.5601 L 3966.5058 3365.1501 L 3965.8958 3364.5401 L 3970.1858 3364.5401 M 3965.8958 3361.9601 L 3966.0958 3362.5701 L 3966.7158 3362.9801 L 3967.7358 3363.1901 L 3968.3458 3363.1901 L 3969.3758 3362.9801 L 3969.9858 3362.5701 L 3970.1858 3361.9601 L 3970.1858 3361.5501 L 3969.9858 3360.9401 L 3969.3758 3360.5301 L 3968.3458 3360.3201 L 3967.7358 3360.3201 L 3966.7158 3360.5301 L 3966.0958 3360.9401 L 3965.8958 3361.5501 L 3965.8958 3361.9601 M 3965.8958 3357.7501 L 3966.0958 3358.3601 L 3966.7158 3358.7701 L 3967.7358 3358.9701 L 3968.3458 3358.9701 L 3969.3758 3358.7701 L 3969.9858 3358.3601 L 3970.1858 3357.7501 L 3970.1858 3357.3401 L 3969.9858 3356.7201 L 3969.3758 3356.3101 L 3968.3458 3356.1101 L 3967.7358 3356.1101 L 3966.7158 3356.3101 L 3966.0958 3356.7201 L 3965.8958 3357.3401 L 3965.8958 3357.7501 M 3967.3258 3354.7601 L 3970.1858 3354.7601 M 3968.1458 3354.7601 L 3967.5358 3354.1501 L 3967.3258 3353.7401 L 3967.3258 3353.1201 L 3967.5358 3352.7101 L 3968.1458 3352.5101 L 3970.1858 3352.5101 M 3965.8958 3351.1601 L 3970.1858 3351.1601 M 3965.8958 3351.1601 L 3965.8958 3348.5001 M 3967.9358 3351.1601 L 3967.9358 3349.5201","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3949.5268,3354.9725 3946.3771,3354.9725"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3950.7467,3350.6034 3950.7467,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3945.1575,3350.6034 3945.1575,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3950.7696,3348.3361 3950.7696,3345.1865"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3949.5498,3343.9667 3946.4003,3343.9667"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3945.1806,3348.3361 3945.1806,3345.1865"},{"type":"arc","width":1,"svgpath":"M 3949.5498 3343.9665 A 1.2198 1.2198 0 0 1 3950.7696 3345.1863","net":""},{"type":"arc","width":1,"svgpath":"M 3945.1804 3345.1863 A 1.2198 1.2198 0 0 1 3946.4003 3343.9665","net":""},{"type":"arc","width":1,"svgpath":"M 3950.7467 3353.7527 A 1.2198 1.2198 0 0 1 3949.5268 3354.9725","net":""},{"type":"arc","width":1,"svgpath":"M 3946.3773 3354.9725 A 1.2198 1.2198 0 0 1 3945.1575 3353.7527","net":""},{"type":"text","svgpath":"M 3959.2029 3363.0999 L 3962.0629 3365.1499 L 3962.0629 3362.0799 M 3959.2029 3363.0999 L 3963.4929 3363.0999 M 3962.4729 3360.5299 L 3962.6829 3360.7299 L 3962.8829 3360.5299 L 3962.6829 3360.3199 L 3962.4729 3360.5299 M 3959.2029 3356.1099 L 3963.4929 3358.1499 M 3959.2029 3358.9699 L 3959.2029 3356.1099 M 3960.6329 3354.7599 L 3962.6829 3354.7599 L 3963.2929 3354.5499 L 3963.4929 3354.1499 L 3963.4929 3353.5299 L 3963.2929 3353.1199 L 3962.6829 3352.5099 M 3960.6329 3352.5099 L 3963.4929 3352.5099 M 3959.2029 3351.1599 L 3963.4929 3351.1599 M 3959.2029 3351.1599 L 3959.2029 3348.4999 M 3961.2429 3351.1599 L 3961.2429 3349.5199","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4090.0795,3344.0275 4093.2292,3344.0275"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4088.8596,3348.3966 4088.8596,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4094.4488,3348.3966 4094.4488,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4088.8367,3350.6639 4088.8367,3353.8135"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4090.0565,3355.0333 4093.206,3355.0333"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4094.4257,3350.6639 4094.4257,3353.8135"},{"type":"arc","width":1,"svgpath":"M 4090.0565 3355.0335 A 1.2198 1.2198 0 0 1 4088.8367 3353.8137","net":""},{"type":"arc","width":1,"svgpath":"M 4094.4259 3353.8137 A 1.2198 1.2198 0 0 1 4093.206 3355.0335","net":""},{"type":"arc","width":1,"svgpath":"M 4088.8596 3345.2473 A 1.2198 1.2198 0 0 1 4090.0795 3344.0275","net":""},{"type":"arc","width":1,"svgpath":"M 4093.229 3344.0275 A 1.2198 1.2198 0 0 1 4094.4488 3345.2473","net":""},{"type":"text","svgpath":"M 4076.1134 3348.45 L 4078.9734 3350.5 L 4078.9734 3347.43 M 4076.1134 3348.45 L 4080.4034 3348.45 M 4079.3834 3345.88 L 4079.5934 3346.08 L 4079.7934 3345.88 L 4079.5934 3345.67 L 4079.3834 3345.88 M 4076.1134 3341.46 L 4080.4034 3343.5 M 4076.1134 3344.32 L 4076.1134 3341.46 M 4077.5434 3340.11 L 4079.5934 3340.11 L 4080.2034 3339.9 L 4080.4034 3339.5 L 4080.4034 3338.88 L 4080.2034 3338.47 L 4079.5934 3337.86 M 4077.5434 3337.86 L 4080.4034 3337.86 M 4076.1134 3336.51 L 4080.4034 3336.51 M 4076.1134 3336.51 L 4076.1134 3333.85 M 4078.1534 3336.51 L 4078.1534 3334.87","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4083.3866,3344.0275 4086.5363,3344.0275"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4082.1667,3348.3966 4082.1667,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4087.7559,3348.3966 4087.7559,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4082.1438,3350.6639 4082.1438,3353.8135"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4083.3636,3355.0333 4086.5131,3355.0333"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4087.7328,3350.6639 4087.7328,3353.8135"},{"type":"arc","width":1,"svgpath":"M 4083.3636 3355.0335 A 1.2198 1.2198 0 0 1 4082.1438 3353.8137","net":""},{"type":"arc","width":1,"svgpath":"M 4087.733 3353.8137 A 1.2198 1.2198 0 0 1 4086.5131 3355.0335","net":""},{"type":"arc","width":1,"svgpath":"M 4082.1667 3345.2473 A 1.2198 1.2198 0 0 1 4083.3866 3344.0275","net":""},{"type":"arc","width":1,"svgpath":"M 4086.5361 3344.0275 A 1.2198 1.2198 0 0 1 4087.7559 3345.2473","net":""},{"type":"text","svgpath":"M 4070.2405 3350.5 L 4070.0305 3350.09 L 4069.4205 3349.48 L 4073.7105 3349.48 M 4069.4205 3346.9 L 4069.6205 3347.51 L 4070.2405 3347.92 L 4071.2605 3348.13 L 4071.8705 3348.13 L 4072.9005 3347.92 L 4073.5105 3347.51 L 4073.7105 3346.9 L 4073.7105 3346.49 L 4073.5105 3345.88 L 4072.9005 3345.47 L 4071.8705 3345.26 L 4071.2605 3345.26 L 4070.2405 3345.47 L 4069.6205 3345.88 L 4069.4205 3346.49 L 4069.4205 3346.9 M 4069.4205 3342.69 L 4069.6205 3343.3 L 4070.2405 3343.71 L 4071.2605 3343.91 L 4071.8705 3343.91 L 4072.9005 3343.71 L 4073.5105 3343.3 L 4073.7105 3342.69 L 4073.7105 3342.28 L 4073.5105 3341.66 L 4072.9005 3341.25 L 4071.8705 3341.05 L 4071.2605 3341.05 L 4070.2405 3341.25 L 4069.6205 3341.66 L 4069.4205 3342.28 L 4069.4205 3342.69 M 4070.8505 3339.7 L 4073.7105 3339.7 M 4071.6705 3339.7 L 4071.0605 3339.09 L 4070.8505 3338.68 L 4070.8505 3338.06 L 4071.0605 3337.65 L 4071.6705 3337.45 L 4073.7105 3337.45 M 4069.4205 3336.1 L 4073.7105 3336.1 M 4069.4205 3336.1 L 4069.4205 3333.44 M 4071.4605 3336.1 L 4071.4605 3334.46","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4060.5502,3354.9725 4057.4005,3354.9725"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4061.7701,3350.6034 4061.7701,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4056.1809,3350.6034 4056.1809,3353.7529"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4061.793,3348.3361 4061.793,3345.1865"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4060.5732,3343.9667 4057.4237,3343.9667"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4056.204,3348.3361 4056.204,3345.1865"},{"type":"arc","width":1,"svgpath":"M 4060.5732 3343.9665 A 1.2198 1.2198 0 0 1 4061.793 3345.1863","net":""},{"type":"arc","width":1,"svgpath":"M 4056.2038 3345.1863 A 1.2198 1.2198 0 0 1 4057.4237 3343.9665","net":""},{"type":"arc","width":1,"svgpath":"M 4061.7701 3353.7527 A 1.2198 1.2198 0 0 1 4060.5502 3354.9725","net":""},{"type":"arc","width":1,"svgpath":"M 4057.4007 3354.9725 A 1.2198 1.2198 0 0 1 4056.1809 3353.7527","net":""},{"type":"text","svgpath":"M 4068.7862 3362.98 L 4068.7862 3360.73 L 4070.4262 3361.96 L 4070.4262 3361.34 L 4070.6262 3360.94 L 4070.8262 3360.73 L 4071.4462 3360.53 L 4071.8562 3360.53 L 4072.4662 3360.73 L 4072.8762 3361.14 L 4073.0762 3361.75 L 4073.0762 3362.37 L 4072.8762 3362.98 L 4072.6762 3363.19 L 4072.2662 3363.39 M 4068.7862 3358.77 L 4068.7862 3356.52 L 4070.4262 3357.74 L 4070.4262 3357.13 L 4070.6262 3356.72 L 4070.8262 3356.52 L 4071.4462 3356.31 L 4071.8562 3356.31 L 4072.4662 3356.52 L 4072.8762 3356.93 L 4073.0762 3357.54 L 4073.0762 3358.15 L 4072.8762 3358.77 L 4072.6762 3358.97 L 4072.2662 3359.18 M 4070.2162 3354.96 L 4074.5162 3354.96 M 4070.8262 3354.96 L 4070.4262 3354.55 L 4070.2162 3354.14 L 4070.2162 3353.53 L 4070.4262 3353.12 L 4070.8262 3352.71 L 4071.4462 3352.51 L 4071.8562 3352.51 L 4072.4662 3352.71 L 4072.8762 3353.12 L 4073.0762 3353.53 L 4073.0762 3354.14 L 4072.8762 3354.55 L 4072.4662 3354.96 M 4068.7862 3351.16 L 4073.0762 3351.16 M 4068.7862 3351.16 L 4068.7862 3348.5 M 4070.8262 3351.16 L 4070.8262 3349.52","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4064.0953,3344.0275 4067.245,3344.0275"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4062.8754,3348.3966 4062.8754,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4068.4646,3348.3966 4068.4646,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4062.8525,3350.6639 4062.8525,3353.8135"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4064.0723,3355.0333 4067.2218,3355.0333"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4068.4415,3350.6639 4068.4415,3353.8135"},{"type":"arc","width":1,"svgpath":"M 4064.0723 3355.0335 A 1.2198 1.2198 0 0 1 4062.8525 3353.8137","net":""},{"type":"arc","width":1,"svgpath":"M 4068.4417 3353.8137 A 1.2198 1.2198 0 0 1 4067.2218 3355.0335","net":""},{"type":"arc","width":1,"svgpath":"M 4062.8754 3345.2473 A 1.2198 1.2198 0 0 1 4064.0953 3344.0275","net":""},{"type":"arc","width":1,"svgpath":"M 4067.2448 3344.0275 A 1.2198 1.2198 0 0 1 4068.4646 3345.2473","net":""},{"type":"text","svgpath":"M 4050.129 3350.0897 L 4050.129 3347.8397 L 4051.769 3349.0697 L 4051.769 3348.4497 L 4051.969 3348.0497 L 4052.169 3347.8397 L 4052.789 3347.6397 L 4053.199 3347.6397 L 4053.809 3347.8397 L 4054.219 3348.2497 L 4054.419 3348.8597 L 4054.419 3349.4797 L 4054.219 3350.0897 L 4054.019 3350.2997 L 4053.609 3350.4997 M 4050.129 3345.8797 L 4050.129 3343.6297 L 4051.769 3344.8497 L 4051.769 3344.2397 L 4051.969 3343.8297 L 4052.169 3343.6297 L 4052.789 3343.4197 L 4053.199 3343.4197 L 4053.809 3343.6297 L 4054.219 3344.0397 L 4054.419 3344.6497 L 4054.419 3345.2597 L 4054.219 3345.8797 L 4054.019 3346.0797 L 4053.609 3346.2897 M 4051.559 3342.0697 L 4055.859 3342.0697 M 4052.169 3342.0697 L 4051.769 3341.6597 L 4051.559 3341.2497 L 4051.559 3340.6397 L 4051.769 3340.2297 L 4052.169 3339.8197 L 4052.789 3339.6197 L 4053.199 3339.6197 L 4053.809 3339.8197 L 4054.219 3340.2297 L 4054.419 3340.6397 L 4054.419 3341.2497 L 4054.219 3341.6597 L 4053.809 3342.0697 M 4050.129 3338.2697 L 4054.419 3338.2697 M 4050.129 3338.2697 L 4050.129 3335.6097 M 4052.169 3338.2697 L 4052.169 3336.6297","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4076.6937,3344.0275 4079.8434,3344.0275"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4075.4738,3348.3966 4075.4738,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.063,3348.3966 4081.063,3345.2471"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4075.4509,3350.6639 4075.4509,3353.8135"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4076.6707,3355.0333 4079.8202,3355.0333"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4081.0399,3350.6639 4081.0399,3353.8135"},{"type":"arc","width":1,"svgpath":"M 4076.6707 3355.0335 A 1.2198 1.2198 0 0 1 4075.4509 3353.8137","net":""},{"type":"arc","width":1,"svgpath":"M 4081.0401 3353.8137 A 1.2198 1.2198 0 0 1 4079.8202 3355.0335","net":""},{"type":"arc","width":1,"svgpath":"M 4075.4738 3345.2473 A 1.2198 1.2198 0 0 1 4076.6937 3344.0275","net":""},{"type":"arc","width":1,"svgpath":"M 4079.8432 3344.0275 A 1.2198 1.2198 0 0 1 4081.063 3345.2473","net":""},{"type":"text","svgpath":"M 4063.5476 3350.5 L 4063.3376 3350.09 L 4062.7276 3349.48 L 4067.0176 3349.48 M 4062.7276 3346.9 L 4062.9276 3347.51 L 4063.5476 3347.92 L 4064.5676 3348.13 L 4065.1776 3348.13 L 4066.2076 3347.92 L 4066.8176 3347.51 L 4067.0176 3346.9 L 4067.0176 3346.49 L 4066.8176 3345.88 L 4066.2076 3345.47 L 4065.1776 3345.26 L 4064.5676 3345.26 L 4063.5476 3345.47 L 4062.9276 3345.88 L 4062.7276 3346.49 L 4062.7276 3346.9 M 4064.1576 3343.91 L 4066.2076 3343.91 L 4066.8176 3343.71 L 4067.0176 3343.3 L 4067.0176 3342.69 L 4066.8176 3342.28 L 4066.2076 3341.66 M 4064.1576 3341.66 L 4067.0176 3341.66 M 4062.7276 3340.31 L 4067.0176 3340.31 M 4062.7276 3340.31 L 4062.7276 3337.65 M 4064.7676 3340.31 L 4064.7676 3338.68","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.51181,"svgpath":"M4050.5117,3352.4528 4050.5117,3347.3346"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.51181,"svgpath":"M4050.6294,3350.9942 4053.9764,3350.9942"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.51181,"svgpath":"M4054.0551,3352.4528 4054.0551,3347.3346"},{"type":"text","svgpath":"M 4037.7435 3349.8943 L 4042.0335 3349.8943 M 4037.7435 3349.8943 L 4037.7435 3348.0543 L 4037.9435 3347.4443 L 4038.1535 3347.2343 L 4038.5635 3347.0343 L 4038.9735 3347.0343 L 4039.3835 3347.2343 L 4039.5835 3347.4443 L 4039.7835 3348.0543 L 4039.7835 3349.8943 M 4039.7835 3348.4643 L 4042.0335 3347.0343 M 4037.7435 3345.6843 L 4042.0335 3345.6843 M 4037.7435 3345.6843 L 4037.7435 3343.8443 L 4037.9435 3343.2243 L 4038.1535 3343.0243 L 4038.5635 3342.8143 L 4038.9735 3342.8143 L 4039.3835 3343.0243 L 4039.5835 3343.2243 L 4039.7835 3343.8443 M 4039.7835 3345.6843 L 4039.7835 3343.8443 L 4039.9935 3343.2243 L 4040.1935 3343.0243 L 4040.6035 3342.8143 L 4041.2235 3342.8143 L 4041.6335 3343.0243 L 4041.8335 3343.2243 L 4042.0335 3343.8443 L 4042.0335 3345.6843 M 4037.7435 3339.0143 L 4037.7435 3341.0543 L 4039.5835 3341.2643 L 4039.3835 3341.0543 L 4039.1735 3340.4443 L 4039.1735 3339.8343 L 4039.3835 3339.2143 L 4039.7835 3338.8043 L 4040.4035 3338.6043 L 4040.8135 3338.6043 L 4041.4235 3338.8043 L 4041.8335 3339.2143 L 4042.0335 3339.8343 L 4042.0335 3340.4443 L 4041.8335 3341.0543 L 4041.6335 3341.2643 L 4041.2235 3341.4643 M 4038.7635 3337.0443 L 4038.5635 3337.0443 L 4038.1535 3336.8443 L 4037.9435 3336.6443 L 4037.7435 3336.2343 L 4037.7435 3335.4143 L 4037.9435 3335.0043 L 4038.1535 3334.7943 L 4038.5635 3334.5943 L 4038.9735 3334.5943 L 4039.3835 3334.7943 L 4039.9935 3335.2043 L 4042.0335 3337.2543 L 4042.0335 3334.3943 M 4038.5635 3333.0443 L 4038.3535 3332.6343 L 4037.7435 3332.0143 L 4042.0335 3332.0143 M 4038.3535 3327.8043 L 4037.9435 3328.2143 L 4037.7435 3328.8243 L 4037.7435 3329.6443 L 4037.9435 3330.2543 L 4038.3535 3330.6643 L 4038.7635 3330.6643 L 4039.1735 3330.4643 L 4039.3835 3330.2543 L 4039.5835 3329.8443 L 4039.9935 3328.6243 L 4040.1935 3328.2143 L 4040.4035 3328.0043 L 4040.8135 3327.8043 L 4041.4235 3327.8043 L 4041.8335 3328.2143 L 4042.0335 3328.8243 L 4042.0335 3329.6443 L 4041.8335 3330.2543 L 4041.4235 3330.6643 M 4040.1935 3326.4543 L 4040.1935 3322.7743 M 4037.7435 3321.0143 L 4037.7435 3318.7643 L 4039.3835 3319.9943 L 4039.3835 3319.3743 L 4039.5835 3318.9643 L 4039.7835 3318.7643 L 4040.4035 3318.5543 L 4040.8135 3318.5543 L 4041.4235 3318.7643 L 4041.8335 3319.1743 L 4042.0335 3319.7843 L 4042.0335 3320.3943 L 4041.8335 3321.0143 L 4041.6335 3321.2143 L 4041.2235 3321.4243 M 4037.7435 3315.9843 L 4037.9435 3316.5943 L 4038.5635 3317.0043 L 4039.5835 3317.2043 L 4040.1935 3317.2043 L 4041.2235 3317.0043 L 4041.8335 3316.5943 L 4042.0335 3315.9843 L 4042.0335 3315.5743 L 4041.8335 3314.9543 L 4041.2235 3314.5443 L 4040.1935 3314.3443 L 4039.5835 3314.3443 L 4038.5635 3314.5443 L 4037.9435 3314.9543 L 4037.7435 3315.5743 L 4037.7435 3315.9843","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M3965.0735,3344.4934 3965.0735,3347.4934"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M3965.0735,3354.4541 3965.0735,3351.4541"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M3970.2751,3354.4541 3970.2751,3351.4541"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M3970.2751,3354.4541 3969.675,3355.0537 3965.6733,3355.0537 3965.0735,3354.4541"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M3970.2751,3344.4934 3970.2751,3347.4934"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M3965.0735,3344.4934 3965.6733,3343.8933 3969.675,3343.8933 3970.2751,3344.4934"},{"type":"text","svgpath":"M 3986.7878 3361.2534 C 3986.5778 3361.0534 3986.3778 3360.8534 3986.2578 3360.7434 C 3985.5678 3360.0834 3985.2878 3359.8634 3984.9078 3359.8634 C 3984.4578 3359.8634 3984.1378 3360.1134 3984.1378 3360.6734 C 3984.1378 3361.1134 3984.3578 3361.4934 3984.7978 3361.5534 C 3984.8778 3361.5134 3984.9278 3361.4334 3984.9278 3361.3434 C 3984.9278 3361.2334 3984.8578 3361.1534 3984.6578 3361.1034 L 3984.3378 3361.0134 C 3984.3178 3360.9234 3984.3078 3360.8434 3984.3078 3360.7834 C 3984.3078 3360.4534 3984.5578 3360.2434 3984.9278 3360.2434 C 3985.2878 3360.2434 3985.6178 3360.4434 3986.1078 3360.8734 C 3986.3278 3361.0634 3986.5878 3361.2934 3986.8578 3361.5334 L 3987.1278 3361.5334 L 3987.1278 3359.7334 L 3986.7878 3359.7334 Z M 3987.1878 3358.9034 C 3987.1878 3358.7334 3987.0478 3358.6034 3986.8878 3358.6034 C 3986.7278 3358.6034 3986.5878 3358.7334 3986.5878 3358.9034 C 3986.5878 3359.0634 3986.7278 3359.1934 3986.8878 3359.1934 C 3987.0478 3359.1934 3987.1878 3359.0634 3987.1878 3358.9034 Z M 3984.5378 3357.5734 L 3984.5378 3356.3134 L 3984.1978 3356.3134 L 3984.1978 3357.7434 L 3985.5678 3357.8334 L 3985.5978 3357.7234 C 3985.5578 3357.5834 3985.5378 3357.4434 3985.5378 3357.3034 C 3985.5378 3356.8834 3985.7978 3356.6134 3986.2578 3356.6134 C 3986.7178 3356.6134 3987.0178 3356.8534 3987.0178 3357.2834 C 3987.0178 3357.3734 3987.0078 3357.4634 3986.9778 3357.5534 L 3986.7078 3357.6334 C 3986.4978 3357.6834 3986.4378 3357.7334 3986.4378 3357.8634 C 3986.4378 3357.9634 3986.4878 3358.0334 3986.5778 3358.0734 C 3986.9778 3357.9834 3987.1878 3357.7034 3987.1878 3357.2534 C 3987.1878 3356.6334 3986.7978 3356.2334 3986.2278 3356.2334 C 3985.6378 3356.2334 3985.3078 3356.6234 3985.3078 3357.1934 C 3985.3078 3357.3534 3985.3278 3357.4934 3985.3678 3357.6334 Z M 3986.9378 3353.4634 L 3985.3078 3354.3734 L 3984.3978 3353.6334 L 3984.3478 3353.2134 L 3984.1978 3353.2134 L 3984.1978 3354.2134 L 3984.3478 3354.2134 L 3984.4078 3353.8734 L 3985.8578 3355.0434 L 3985.5578 3355.0434 C 3985.1678 3355.0434 3984.7678 3355.0434 3984.3878 3355.0334 L 3984.3478 3354.6234 L 3984.1978 3354.6234 L 3984.1978 3355.8534 L 3984.3478 3355.8534 L 3984.3878 3355.4434 C 3984.7778 3355.4334 3985.1678 3355.4334 3985.5578 3355.4334 L 3985.7678 3355.4334 C 3986.1678 3355.4334 3986.5478 3355.4334 3986.9278 3355.4434 L 3986.9778 3355.8534 L 3987.1278 3355.8534 L 3987.1278 3354.6234 L 3986.9778 3354.6234 L 3986.9278 3355.0334 C 3986.6378 3355.0434 3986.3578 3355.0434 3986.1078 3355.0434 L 3985.5878 3354.6134 L 3986.9278 3353.8834 L 3986.9778 3354.2534 L 3987.1278 3354.2534 L 3987.1278 3353.1234 L 3986.9778 3353.1234 Z M 3986.3878 3350.3234 L 3986.8178 3350.4234 L 3986.8178 3351.0434 L 3986.8178 3351.0434 C 3986.4978 3350.5934 3986.0278 3350.2334 3985.4578 3350.2334 C 3984.5978 3350.2334 3984.1278 3350.8434 3984.1278 3351.5134 C 3984.1278 3352.2034 3984.5978 3352.8034 3985.4578 3352.8034 C 3986.0278 3352.8034 3986.4978 3352.4434 3986.8178 3351.9934 L 3986.8178 3351.9934 L 3986.8178 3352.6134 L 3986.3878 3352.7134 L 3986.3878 3352.9434 L 3987.1278 3352.9034 L 3987.1278 3351.7334 L 3986.8578 3351.7334 C 3986.5278 3352.1334 3986.0078 3352.3934 3985.4578 3352.3934 C 3984.8078 3352.3934 3984.3178 3352.0734 3984.3178 3351.5134 C 3984.3178 3350.9734 3984.8078 3350.6434 3985.4578 3350.6434 C 3986.0078 3350.6434 3986.5278 3350.9034 3986.8578 3351.3134 L 3987.1278 3351.3134 L 3987.1278 3350.1334 L 3986.3878 3350.0934 Z ","useTrueTypeFontRendering":true,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M4074.5328,3354.5066 4074.5328,3351.5066"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M4074.5328,3344.5459 4074.5328,3347.5459"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M4069.3312,3344.5459 4069.3312,3347.5459"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M4069.3312,3344.5459 4069.9313,3343.9463 4073.933,3343.9463 4074.5328,3344.5459"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.5984,"svgpath":"M4069.3312,3354.5066 4069.3312,3351.5066"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M4074.5328,3354.5066 4073.933,3355.1067 4069.9313,3355.1067 4069.3312,3354.5066"},{"type":"text","svgpath":"M 4055.0784 3348.6067 C 4054.8684 3348.4067 4054.6684 3348.2067 4054.5484 3348.0967 C 4053.8584 3347.4367 4053.5784 3347.2167 4053.1984 3347.2167 C 4052.7484 3347.2167 4052.4284 3347.4667 4052.4284 3348.0267 C 4052.4284 3348.4667 4052.6484 3348.8467 4053.0884 3348.9067 C 4053.1684 3348.8667 4053.2184 3348.7867 4053.2184 3348.6967 C 4053.2184 3348.5867 4053.1484 3348.5067 4052.9484 3348.4567 L 4052.6284 3348.3667 C 4052.6084 3348.2767 4052.5984 3348.1967 4052.5984 3348.1367 C 4052.5984 3347.8067 4052.8484 3347.5967 4053.2184 3347.5967 C 4053.5784 3347.5967 4053.9084 3347.7967 4054.3984 3348.2267 C 4054.6184 3348.4167 4054.8784 3348.6467 4055.1484 3348.8867 L 4055.4184 3348.8867 L 4055.4184 3347.0867 L 4055.0784 3347.0867 Z M 4055.4784 3346.2567 C 4055.4784 3346.0867 4055.3384 3345.9567 4055.1784 3345.9567 C 4055.0184 3345.9567 4054.8784 3346.0867 4054.8784 3346.2567 C 4054.8784 3346.4167 4055.0184 3346.5467 4055.1784 3346.5467 C 4055.3384 3346.5467 4055.4784 3346.4167 4055.4784 3346.2567 Z M 4052.8284 3344.9267 L 4052.8284 3343.6667 L 4052.4884 3343.6667 L 4052.4884 3345.0967 L 4053.8584 3345.1867 L 4053.8884 3345.0767 C 4053.8484 3344.9367 4053.8284 3344.7967 4053.8284 3344.6567 C 4053.8284 3344.2367 4054.0884 3343.9667 4054.5484 3343.9667 C 4055.0084 3343.9667 4055.3084 3344.2067 4055.3084 3344.6367 C 4055.3084 3344.7267 4055.2984 3344.8167 4055.2684 3344.9067 L 4054.9984 3344.9867 C 4054.7884 3345.0367 4054.7284 3345.0867 4054.7284 3345.2167 C 4054.7284 3345.3167 4054.7784 3345.3867 4054.8684 3345.4267 C 4055.2684 3345.3367 4055.4784 3345.0567 4055.4784 3344.6067 C 4055.4784 3343.9867 4055.0884 3343.5867 4054.5184 3343.5867 C 4053.9284 3343.5867 4053.5984 3343.9767 4053.5984 3344.5467 C 4053.5984 3344.7067 4053.6184 3344.8467 4053.6584 3344.9867 Z M 4055.2284 3340.8167 L 4053.5984 3341.7267 L 4052.6884 3340.9867 L 4052.6384 3340.5667 L 4052.4884 3340.5667 L 4052.4884 3341.5667 L 4052.6384 3341.5667 L 4052.6984 3341.2267 L 4054.1484 3342.3967 L 4053.8484 3342.3967 C 4053.4584 3342.3967 4053.0584 3342.3967 4052.6784 3342.3867 L 4052.6384 3341.9767 L 4052.4884 3341.9767 L 4052.4884 3343.2067 L 4052.6384 3343.2067 L 4052.6784 3342.7967 C 4053.0684 3342.7867 4053.4584 3342.7867 4053.8484 3342.7867 L 4054.0584 3342.7867 C 4054.4584 3342.7867 4054.8384 3342.7867 4055.2184 3342.7967 L 4055.2684 3343.2067 L 4055.4184 3343.2067 L 4055.4184 3341.9767 L 4055.2684 3341.9767 L 4055.2184 3342.3867 C 4054.9284 3342.3967 4054.6484 3342.3967 4054.3984 3342.3967 L 4053.8784 3341.9667 L 4055.2184 3341.2367 L 4055.2684 3341.6067 L 4055.4184 3341.6067 L 4055.4184 3340.4767 L 4055.2684 3340.4767 Z M 4054.6784 3337.6767 L 4055.1084 3337.7767 L 4055.1084 3338.3967 L 4055.1084 3338.3967 C 4054.7884 3337.9467 4054.3184 3337.5867 4053.7484 3337.5867 C 4052.8884 3337.5867 4052.4184 3338.1967 4052.4184 3338.8667 C 4052.4184 3339.5567 4052.8884 3340.1567 4053.7484 3340.1567 C 4054.3184 3340.1567 4054.7884 3339.7967 4055.1084 3339.3467 L 4055.1084 3339.3467 L 4055.1084 3339.9667 L 4054.6784 3340.0667 L 4054.6784 3340.2967 L 4055.4184 3340.2567 L 4055.4184 3339.0867 L 4055.1484 3339.0867 C 4054.8184 3339.4867 4054.2984 3339.7467 4053.7484 3339.7467 C 4053.0984 3339.7467 4052.6084 3339.4267 4052.6084 3338.8667 C 4052.6084 3338.3267 4053.0984 3337.9967 4053.7484 3337.9967 C 4054.2984 3337.9967 4054.8184 3338.2567 4055.1484 3338.6667 L 4055.4184 3338.6667 L 4055.4184 3337.4867 L 4054.6784 3337.4467 Z ","useTrueTypeFontRendering":true,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3940.834,3345.3426 3940.834,3344.8359 3939.554,3344.8359"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3940.8122,3345.3605 3940.8122,3354.1176 3939.6463,3354.1176"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3928.3816,3353.5789 3928.3816,3344.8218 3929.5475,3344.8218"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3928.3598,3353.5968 3928.3598,3354.1035 3929.6398,3354.1035"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3932.7152,3353.437 3936.419,3353.437"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3932.7152,3345.563 3936.419,3345.563"},{"type":"circle","_svgpath":"M 3931.067, 3355 m -0.5, 0 a 0.5,0.5 0 1,0 1,0 a 0.5,0.5 0 1,0 -1,0","start":[3931.067,3355],"radius":0.5,"width":"1","net":""},{"type":"circle","_svgpath":"M 3933.567, 3349.5 m -0.591, 0 a 0.591,0.591 0 1,0 1.182,0 a 0.591,0.591 0 1,0 -1.182,0","start":[3933.567,3349.5],"radius":0.591,"width":"0.7874","net":""},{"type":"text","svgpath":"M 3915.0271 3348.86 L 3919.3171 3350.5 M 3915.0271 3348.86 L 3919.3171 3347.23 M 3917.8871 3349.89 L 3917.8871 3347.84 M 3915.0271 3345.88 L 3919.3171 3345.88 M 3915.0271 3345.88 L 3915.0271 3344.04 L 3915.2271 3343.42 L 3915.4371 3343.22 L 3915.8471 3343.01 L 3916.4571 3343.01 L 3916.8671 3343.22 L 3917.0671 3343.42 L 3917.2771 3344.04 L 3917.2771 3345.88 M 3916.0471 3341.46 L 3915.8471 3341.46 L 3915.4371 3341.25 L 3915.2271 3341.05 L 3915.0271 3340.64 L 3915.0271 3339.82 L 3915.2271 3339.41 L 3915.4371 3339.21 L 3915.8471 3339 L 3916.2571 3339 L 3916.6671 3339.21 L 3917.2771 3339.62 L 3919.3171 3341.66 L 3919.3171 3338.8 M 3915.0271 3334.59 L 3919.3171 3336.63 M 3915.0271 3337.45 L 3915.0271 3334.59 M 3915.8471 3333.24 L 3915.6371 3332.83 L 3915.0271 3332.21 L 3919.3171 3332.21 M 3915.0271 3329.84 L 3915.2271 3330.45 L 3915.6371 3330.66 L 3916.0471 3330.66 L 3916.4571 3330.45 L 3916.6671 3330.05 L 3916.8671 3329.23 L 3917.0671 3328.61 L 3917.4771 3328.2 L 3917.8871 3328 L 3918.5071 3328 L 3918.9171 3328.2 L 3919.1171 3328.41 L 3919.3171 3329.02 L 3919.3171 3329.84 L 3919.1171 3330.45 L 3918.9171 3330.66 L 3918.5071 3330.86 L 3917.8871 3330.86 L 3917.4771 3330.66 L 3917.0671 3330.25 L 3916.8671 3329.64 L 3916.6671 3328.82 L 3916.4571 3328.41 L 3916.0471 3328.2 L 3915.6371 3328.2 L 3915.2271 3328.41 L 3915.0271 3329.02 L 3915.0271 3329.84 M 3915.0271 3325.01 L 3919.3171 3326.65 M 3915.0271 3325.01 L 3919.3171 3323.38 M 3917.8871 3326.04 L 3917.8871 3323.99 M 3915.0271 3320.6 L 3919.3171 3320.6 M 3915.0271 3322.03 L 3915.0271 3319.16","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4099.166,3353.6574 4099.166,3354.1641 4100.446,3354.1641"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4099.1878,3353.6395 4099.1878,3344.8824 4100.3537,3344.8824"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4111.6184,3345.4211 4111.6184,3354.1782 4110.4525,3354.1782"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4111.6402,3345.4032 4111.6402,3344.8965 4110.3602,3344.8965"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4107.2848,3345.563 4103.581,3345.563"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4107.2848,3353.437 4103.581,3353.437"},{"type":"circle","_svgpath":"M 4108.933, 3344 m -0.5, 0 a 0.5,0.5 0 1,0 1,0 a 0.5,0.5 0 1,0 -1,0","start":[4108.933,3344],"radius":0.5,"width":"1","net":""},{"type":"circle","_svgpath":"M 4106.433, 3349.5 m -0.591, 0 a 0.591,0.591 0 1,0 1.182,0 a 0.591,0.591 0 1,0 -1.182,0","start":[4106.433,3349.5],"radius":0.591,"width":"0.7874","net":""},{"type":"text","svgpath":"M 4120.683 3378.2001 L 4124.973 3379.8401 M 4120.683 3378.2001 L 4124.973 3376.5701 M 4123.543 3379.2301 L 4123.543 3377.1801 M 4120.683 3375.2201 L 4124.973 3375.2201 M 4120.683 3375.2201 L 4120.683 3373.3801 L 4120.883 3372.7601 L 4121.093 3372.5601 L 4121.503 3372.3501 L 4122.113 3372.3501 L 4122.523 3372.5601 L 4122.723 3372.7601 L 4122.933 3373.3801 L 4122.933 3375.2201 M 4121.703 3370.8001 L 4121.503 3370.8001 L 4121.093 3370.5901 L 4120.883 3370.3901 L 4120.683 3369.9801 L 4120.683 3369.1601 L 4120.883 3368.7501 L 4121.093 3368.5501 L 4121.503 3368.3401 L 4121.913 3368.3401 L 4122.323 3368.5501 L 4122.933 3368.9601 L 4124.973 3371.0001 L 4124.973 3368.1401 M 4120.683 3363.9301 L 4124.973 3365.9701 M 4120.683 3366.7901 L 4120.683 3363.9301 M 4121.503 3362.5801 L 4121.293 3362.1701 L 4120.683 3361.5501 L 4124.973 3361.5501 M 4120.683 3359.1801 L 4120.883 3359.7901 L 4121.293 3360.0001 L 4121.703 3360.0001 L 4122.113 3359.7901 L 4122.323 3359.3901 L 4122.523 3358.5701 L 4122.723 3357.9501 L 4123.133 3357.5401 L 4123.543 3357.3401 L 4124.163 3357.3401 L 4124.573 3357.5401 L 4124.773 3357.7501 L 4124.973 3358.3601 L 4124.973 3359.1801 L 4124.773 3359.7901 L 4124.573 3360.0001 L 4124.163 3360.2001 L 4123.543 3360.2001 L 4123.133 3360.0001 L 4122.723 3359.5901 L 4122.523 3358.9801 L 4122.323 3358.1601 L 4122.113 3357.7501 L 4121.703 3357.5401 L 4121.293 3357.5401 L 4120.883 3357.7501 L 4120.683 3358.3601 L 4120.683 3359.1801 M 4120.683 3354.3501 L 4124.973 3355.9901 M 4120.683 3354.3501 L 4124.973 3352.7201 M 4123.543 3355.3801 L 4123.543 3353.3301 M 4120.683 3349.9401 L 4124.973 3349.9401 M 4120.683 3351.3701 L 4120.683 3348.5001","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M4006.5205,3352.2606 4006.5205,3346.7394"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M3998.0465,3352.2606 3998.0465,3346.7394"},{"type":"circle","_svgpath":"M 3997.254, 3353.407 m -0.591, 0 a 0.591,0.591 0 1,0 1.182,0 a 0.591,0.591 0 1,0 -1.182,0","start":[3997.254,3353.407],"radius":0.591,"width":"1.1811","net":""},{"type":"text","svgpath":"M 4001.2835 3330.96 L 4001.2835 3335.25 M 4001.2835 3335.25 L 4003.7335 3335.25 M 4005.2935 3331.98 L 4005.2935 3331.78 L 4005.4935 3331.37 L 4005.7035 3331.16 L 4006.1135 3330.96 L 4006.9335 3330.96 L 4007.3335 3331.16 L 4007.5435 3331.37 L 4007.7435 3331.78 L 4007.7435 3332.19 L 4007.5435 3332.6 L 4007.1335 3333.21 L 4005.0835 3335.25 L 4007.9535 3335.25 M 4009.3035 3330.96 L 4009.3035 3335.25 M 4009.3035 3330.96 L 4012.1635 3335.25 M 4012.1635 3330.96 L 4012.1635 3335.25 M 4016.3835 3330.96 L 4014.3335 3335.25 M 4013.5135 3330.96 L 4016.3835 3330.96 M 4018.9535 3330.96 L 4018.3435 3331.16 L 4017.9335 3331.78 L 4017.7335 3332.8 L 4017.7335 3333.41 L 4017.9335 3334.44 L 4018.3435 3335.05 L 4018.9535 3335.25 L 4019.3635 3335.25 L 4019.9835 3335.05 L 4020.3835 3334.44 L 4020.5935 3333.41 L 4020.5935 3332.8 L 4020.3835 3331.78 L 4019.9835 3331.16 L 4019.3635 3330.96 L 4018.9535 3330.96 M 4023.1735 3330.96 L 4022.5535 3331.16 L 4022.1435 3331.78 L 4021.9435 3332.8 L 4021.9435 3333.41 L 4022.1435 3334.44 L 4022.5535 3335.05 L 4023.1735 3335.25 L 4023.5835 3335.25 L 4024.1935 3335.05 L 4024.6035 3334.44 L 4024.8035 3333.41 L 4024.8035 3332.8 L 4024.6035 3331.78 L 4024.1935 3331.16 L 4023.5835 3330.96 L 4023.1735 3330.96 M 4026.3635 3331.98 L 4026.3635 3331.78 L 4026.5635 3331.37 L 4026.7735 3331.16 L 4027.1835 3330.96 L 4027.9935 3330.96 L 4028.4035 3331.16 L 4028.6135 3331.37 L 4028.8135 3331.78 L 4028.8135 3332.19 L 4028.6135 3332.6 L 4028.2035 3333.21 L 4026.1535 3335.25 L 4029.0235 3335.25 M 4033.2335 3331.57 L 4032.8235 3331.16 L 4032.2135 3330.96 L 4031.3935 3330.96 L 4030.7835 3331.16 L 4030.3735 3331.57 L 4030.3735 3331.98 L 4030.5735 3332.39 L 4030.7835 3332.6 L 4031.1835 3332.8 L 4032.4135 3333.21 L 4032.8235 3333.41 L 4033.0335 3333.62 L 4033.2335 3334.03 L 4033.2335 3334.64 L 4032.8235 3335.05 L 4032.2135 3335.25 L 4031.3935 3335.25 L 4030.7835 3335.05 L 4030.3735 3334.64 M 4034.5835 3330.96 L 4034.5835 3335.25 M 4034.5835 3330.96 L 4036.0135 3330.96 L 4036.6335 3331.16 L 4037.0335 3331.57 L 4037.2435 3331.98 L 4037.4435 3332.6 L 4037.4435 3333.62 L 4037.2435 3334.23 L 4037.0335 3334.64 L 4036.6335 3335.05 L 4036.0135 3335.25 L 4034.5835 3335.25 M 4038.7935 3330.96 L 4039.8235 3335.25 M 4040.8435 3330.96 L 4039.8235 3335.25 M 4040.8435 3330.96 L 4041.8635 3335.25 M 4042.8835 3330.96 L 4041.8635 3335.25 M 4044.2335 3331.78 L 4044.6435 3331.57 L 4045.2635 3330.96 L 4045.2635 3335.25 M 4048.0435 3330.96 L 4048.0435 3335.25 M 4046.6135 3330.96 L 4049.4735 3330.96 M 4050.8235 3331.78 L 4051.2335 3331.57 L 4051.8435 3330.96 L 4051.8435 3335.25 M 4056.2635 3331.98 L 4056.0635 3331.57 L 4055.6535 3331.16 L 4055.2435 3330.96 L 4054.4235 3330.96 L 4054.0135 3331.16 L 4053.6035 3331.57 L 4053.4035 3331.98 L 4053.1935 3332.6 L 4053.1935 3333.62 L 4053.4035 3334.23 L 4053.6035 3334.64 L 4054.0135 3335.05 L 4054.4235 3335.25 L 4055.2435 3335.25 L 4055.6535 3335.05 L 4056.0635 3334.64 L 4056.2635 3334.23 L 4056.2635 3333.62 M 4055.2435 3333.62 L 4056.2635 3333.62","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"S$67","start":[0,0],"end":[0,0],"width":0.7874,"svgpath":"M3984.5666,3347.926 3984.5666,3343.595 3990.8666,3343.595 3990.8666,3347.926"},{"type":"polyline","net":"S$69","start":[0,0],"end":[0,0],"width":0.7874,"svgpath":"M3984.5666,3351.075 3984.5666,3355.406 3988.5036,3355.406 3990.8666,3355.406 3990.8666,3351.075"},{"type":"text","svgpath":"M 3971.1766 3347.6 L 3974.0366 3349.65 L 3974.0366 3346.58 M 3971.1766 3347.6 L 3975.4666 3347.6 M 3971.1766 3342.37 L 3975.4666 3344.41 M 3971.1766 3345.23 L 3971.1766 3342.37 M 3971.1766 3341.02 L 3975.4666 3341.02 M 3971.1766 3338.15 L 3974.0366 3341.02 M 3973.0166 3340 L 3975.4666 3338.15","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"S$67","start":[0,0],"end":[0,0],"width":0.7874,"svgpath":"M4049.1342,3351.4677 4049.1342,3355.7987 4042.8342,3355.7987 4042.8342,3351.4677"},{"type":"polyline","net":"S$69","start":[0,0],"end":[0,0],"width":0.7874,"svgpath":"M4049.1342,3348.3187 4049.1342,3343.9877 4045.1972,3343.9877 4042.8342,3343.9877 4042.8342,3348.3187"},{"type":"text","svgpath":"M 4058.2343 3359.1936 L 4061.0943 3361.2436 L 4061.0943 3358.1736 M 4058.2343 3359.1936 L 4062.5243 3359.1936 M 4058.2343 3353.9636 L 4062.5243 3356.0036 M 4058.2343 3356.8236 L 4058.2343 3353.9636 M 4058.2343 3352.6136 L 4062.5243 3352.6136 M 4058.2343 3349.7436 L 4061.0943 3352.6136 M 4060.0743 3351.5936 L 4062.5243 3349.7436","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M4041.8921,3348.2157 4041.8921,3344.4406 4036.6905,3344.4406 4036.6905,3348.2157"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M4041.8921,3351.5717 4041.8921,3355.3468 4036.6905,3355.3468 4036.6905,3351.5717"},{"type":"text","svgpath":"M 4022.4114 3346.8467 C 4022.2014 3346.6467 4022.0014 3346.4467 4021.8814 3346.3367 C 4021.1914 3345.6767 4020.9114 3345.4567 4020.5314 3345.4567 C 4020.0814 3345.4567 4019.7614 3345.7067 4019.7614 3346.2667 C 4019.7614 3346.7067 4019.9814 3347.0867 4020.4214 3347.1467 C 4020.5014 3347.1067 4020.5514 3347.0267 4020.5514 3346.9367 C 4020.5514 3346.8267 4020.4814 3346.7467 4020.2814 3346.6967 L 4019.9614 3346.6067 C 4019.9414 3346.5167 4019.9314 3346.4367 4019.9314 3346.3767 C 4019.9314 3346.0467 4020.1814 3345.8367 4020.5514 3345.8367 C 4020.9114 3345.8367 4021.2414 3346.0367 4021.7314 3346.4667 C 4021.9514 3346.6567 4022.2114 3346.8867 4022.4814 3347.1267 L 4022.7514 3347.1267 L 4022.7514 3345.3267 L 4022.4114 3345.3267 Z M 4022.5714 3343.0267 L 4021.3814 3343.7667 L 4020.8714 3343.2667 L 4020.8214 3342.8567 L 4020.6714 3342.8567 L 4020.6714 3343.8667 L 4020.8214 3343.8667 L 4020.8914 3343.5267 L 4021.7114 3344.3167 L 4020.1714 3344.3167 L 4019.5414 3344.2967 L 4019.5114 3344.3567 L 4019.6914 3345.0267 L 4019.8314 3345.0267 L 4019.8614 3344.6767 L 4021.8314 3344.6767 C 4022.0714 3344.6767 4022.3314 3344.6767 4022.5714 3344.6867 L 4022.6114 3345.0267 L 4022.7514 3345.0267 L 4022.7514 3343.9667 L 4022.6114 3343.9667 L 4022.5714 3344.3067 C 4022.3614 3344.3067 4022.1414 3344.3167 4021.9314 3344.3167 L 4021.6314 3344.0267 L 4022.7514 3343.3467 L 4022.7514 3342.7467 L 4022.6114 3342.7467 Z M 4022.0114 3339.9467 L 4022.4414 3340.0467 L 4022.4414 3340.6667 L 4022.4414 3340.6667 C 4022.1214 3340.2167 4021.6514 3339.8667 4021.0814 3339.8667 C 4020.2214 3339.8667 4019.7514 3340.4667 4019.7514 3341.1467 C 4019.7514 3341.8267 4020.2214 3342.4267 4021.0814 3342.4267 C 4021.6514 3342.4267 4022.1214 3342.0667 4022.4414 3341.6167 L 4022.4414 3341.6167 L 4022.4414 3342.2367 L 4022.0114 3342.3467 L 4022.0114 3342.5667 L 4022.7514 3342.5267 L 4022.7514 3341.3567 L 4022.4814 3341.3567 C 4022.1514 3341.7667 4021.6314 3342.0167 4021.0814 3342.0167 C 4020.4314 3342.0167 4019.9414 3341.6967 4019.9414 3341.1467 C 4019.9414 3340.5967 4020.4314 3340.2667 4021.0814 3340.2667 C 4021.6314 3340.2667 4022.1514 3340.5267 4022.4814 3340.9367 L 4022.7514 3340.9367 L 4022.7514 3339.7567 L 4022.0114 3339.7167 Z ","useTrueTypeFontRendering":true,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M3997.0103,3347.822 3997.0103,3344.0469 3991.8087,3344.0469 3991.8087,3347.822"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":0.6,"svgpath":"M3997.0103,3351.178 3997.0103,3354.9531 3991.8087,3354.9531 3991.8087,3351.178"},{"type":"text","svgpath":"M 3977.5295 3346.4531 C 3977.3195 3346.2531 3977.1195 3346.0531 3976.9995 3345.9431 C 3976.3095 3345.2831 3976.0295 3345.0631 3975.6495 3345.0631 C 3975.1995 3345.0631 3974.8795 3345.3131 3974.8795 3345.8731 C 3974.8795 3346.3131 3975.0995 3346.6931 3975.5395 3346.7531 C 3975.6195 3346.7131 3975.6695 3346.6331 3975.6695 3346.5431 C 3975.6695 3346.4331 3975.5995 3346.3531 3975.3995 3346.3031 L 3975.0795 3346.2131 C 3975.0595 3346.1231 3975.0495 3346.0431 3975.0495 3345.9831 C 3975.0495 3345.6531 3975.2995 3345.4431 3975.6695 3345.4431 C 3976.0295 3345.4431 3976.3595 3345.6431 3976.8495 3346.0731 C 3977.0695 3346.2631 3977.3295 3346.4931 3977.5995 3346.7331 L 3977.8695 3346.7331 L 3977.8695 3344.9331 L 3977.5295 3344.9331 Z M 3977.6895 3342.6331 L 3976.4995 3343.3731 L 3975.9895 3342.8731 L 3975.9395 3342.4631 L 3975.7895 3342.4631 L 3975.7895 3343.4731 L 3975.9395 3343.4731 L 3976.0095 3343.1331 L 3976.8295 3343.9231 L 3975.2895 3343.9231 L 3974.6595 3343.9031 L 3974.6295 3343.9631 L 3974.8095 3344.6331 L 3974.9495 3344.6331 L 3974.9795 3344.2831 L 3976.9495 3344.2831 C 3977.1895 3344.2831 3977.4495 3344.2831 3977.6895 3344.2931 L 3977.7295 3344.6331 L 3977.8695 3344.6331 L 3977.8695 3343.5731 L 3977.7295 3343.5731 L 3977.6895 3343.9131 C 3977.4795 3343.9131 3977.2595 3343.9231 3977.0495 3343.9231 L 3976.7495 3343.6331 L 3977.8695 3342.9531 L 3977.8695 3342.3531 L 3977.7295 3342.3531 Z M 3977.1295 3339.5531 L 3977.5595 3339.6531 L 3977.5595 3340.2731 L 3977.5595 3340.2731 C 3977.2395 3339.8231 3976.7695 3339.4731 3976.1995 3339.4731 C 3975.3395 3339.4731 3974.8695 3340.0731 3974.8695 3340.7531 C 3974.8695 3341.4331 3975.3395 3342.0331 3976.1995 3342.0331 C 3976.7695 3342.0331 3977.2395 3341.6731 3977.5595 3341.2231 L 3977.5595 3341.2231 L 3977.5595 3341.8431 L 3977.1295 3341.9531 L 3977.1295 3342.1731 L 3977.8695 3342.1331 L 3977.8695 3340.9631 L 3977.5995 3340.9631 C 3977.2695 3341.3731 3976.7495 3341.6231 3976.1995 3341.6231 C 3975.5495 3341.6231 3975.0595 3341.3031 3975.0595 3340.7531 C 3975.0595 3340.2031 3975.5495 3339.8731 3976.1995 3339.8731 C 3976.7495 3339.8731 3977.2695 3340.1331 3977.5995 3340.5431 L 3977.8695 3340.5431 L 3977.8695 3339.3631 L 3977.1295 3339.3231 Z ","useTrueTypeFontRendering":true,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4133.7788,3356.587 4114.8808,3356.587 4114.8808,3342.414 4133.7788,3342.414 4133.7788,3356.587"},{"type":"circle","_svgpath":"M 4135.354, 3342.413 m -0.394, 0 a 0.394,0.394 0 1,0 0.788,0 a 0.394,0.394 0 1,0 -0.788,0","start":[4135.354,3342.413],"radius":0.394,"width":"0.7874","net":""},{"type":"text","svgpath":"M 4099.7107 3365.75 L 4101.3507 3370.04 M 4102.9807 3365.75 L 4101.3507 3370.04 M 4104.3307 3365.75 L 4104.3307 3370.04 M 4104.3307 3370.04 L 4106.7907 3370.04 M 4110.5907 3366.36 L 4110.3907 3365.95 L 4109.7707 3365.75 L 4109.3607 3365.75 L 4108.7507 3365.95 L 4108.3407 3366.57 L 4108.1407 3367.59 L 4108.1407 3368.61 L 4108.3407 3369.43 L 4108.7507 3369.84 L 4109.3607 3370.04 L 4109.5707 3370.04 L 4110.1807 3369.84 L 4110.5907 3369.43 L 4110.8007 3368.82 L 4110.8007 3368.61 L 4110.5907 3368 L 4110.1807 3367.59 L 4109.5707 3367.39 L 4109.3607 3367.39 L 4108.7507 3367.59 L 4108.3407 3368 L 4108.1407 3368.61 M 4112.1507 3366.57 L 4112.5607 3366.36 L 4113.1707 3365.75 L 4113.1707 3370.04 M 4115.5407 3365.75 L 4114.9307 3365.95 L 4114.7207 3366.36 L 4114.7207 3366.77 L 4114.9307 3367.18 L 4115.3407 3367.39 L 4116.1607 3367.59 L 4116.7707 3367.79 L 4117.1807 3368.2 L 4117.3807 3368.61 L 4117.3807 3369.23 L 4117.1807 3369.64 L 4116.9707 3369.84 L 4116.3607 3370.04 L 4115.5407 3370.04 L 4114.9307 3369.84 L 4114.7207 3369.64 L 4114.5207 3369.23 L 4114.5207 3368.61 L 4114.7207 3368.2 L 4115.1307 3367.79 L 4115.7507 3367.59 L 4116.5607 3367.39 L 4116.9707 3367.18 L 4117.1807 3366.77 L 4117.1807 3366.36 L 4116.9707 3365.95 L 4116.3607 3365.75 L 4115.5407 3365.75 M 4119.9607 3365.75 L 4119.3507 3365.95 L 4118.9407 3366.57 L 4118.7307 3367.59 L 4118.7307 3368.2 L 4118.9407 3369.23 L 4119.3507 3369.84 L 4119.9607 3370.04 L 4120.3707 3370.04 L 4120.9807 3369.84 L 4121.3907 3369.23 L 4121.6007 3368.2 L 4121.6007 3367.59 L 4121.3907 3366.57 L 4120.9807 3365.95 L 4120.3707 3365.75 L 4119.9607 3365.75 M 4122.9507 3365.75 L 4125.8107 3370.04 M 4125.8107 3365.75 L 4122.9507 3370.04","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"circle","_svgpath":"M 4020, 3349.5 m -11.024, 0 a 11.024,11.024 0 1,0 22.048,0 a 11.024,11.024 0 1,0 -22.048,0","start":[4020,3349.5],"radius":11.024,"width":"1","net":""}],"B":[{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3918.6217,3359.2426 3958.3849,3359.2426"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3918.6217,3359.2426 3918.6217,3355.0375"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3918.6217,3345.3375 3918.6217,3339.5396"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3918.6413,3339.5396 3926.1679,3339.5396"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3950.822,3339.5576 3958.3849,3339.5576"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3958.3849,3339.5575 3958.3849,3345.3375"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3958.3849,3355.0375 3958.3849,3359.2426"},{"type":"polyline","net":"","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3958.3849,3359.2426 3918.6217,3359.2426"},{"type":"text","svgpath":"M 3996.131 3367.9939 L 3996.131 3372.2839 M 3997.561 3367.9939 L 3994.701 3367.9939 M 3993.351 3367.9939 L 3993.351 3372.2839 M 3990.481 3367.9939 L 3990.481 3372.2839 M 3993.351 3370.0339 L 3990.481 3370.0339 M 3989.131 3367.9939 L 3989.131 3372.2839 M 3989.131 3367.9939 L 3987.701 3367.9939 L 3987.091 3368.1939 L 3986.681 3368.6039 L 3986.471 3369.0139 L 3986.271 3369.6339 L 3986.271 3370.6539 L 3986.471 3371.2639 L 3986.681 3371.6739 L 3987.091 3372.0839 L 3987.701 3372.2839 L 3989.131 3372.2839 M 3983.691 3367.9939 L 3984.311 3368.1939 L 3984.711 3368.8139 L 3984.921 3369.8339 L 3984.921 3370.4439 L 3984.711 3371.4739 L 3984.311 3372.0839 L 3983.691 3372.2839 L 3983.281 3372.2839 L 3982.671 3372.0839 L 3982.261 3371.4739 L 3982.061 3370.4439 L 3982.061 3369.8339 L 3982.261 3368.8139 L 3982.671 3368.1939 L 3983.281 3367.9939 L 3983.691 3367.9939 M 3978.251 3367.9939 L 3980.301 3367.9939 L 3980.501 3369.8339 L 3980.301 3369.6339 L 3979.681 3369.4239 L 3979.071 3369.4239 L 3978.461 3369.6339 L 3978.051 3370.0339 L 3977.841 3370.6539 L 3977.841 3371.0639 L 3978.051 3371.6739 L 3978.461 3372.0839 L 3979.071 3372.2839 L 3979.681 3372.2839 L 3980.301 3372.0839 L 3980.501 3371.8839 L 3980.711 3371.4739 M 3976.491 3368.8139 L 3976.081 3368.6039 L 3975.471 3367.9939 L 3975.471 3372.2839 M 3971.661 3367.9939 L 3973.711 3367.9939 L 3973.911 3369.8339 L 3973.711 3369.6339 L 3973.101 3369.4239 L 3972.481 3369.4239 L 3971.871 3369.6339 L 3971.461 3370.0339 L 3971.261 3370.6539 L 3971.261 3371.0639 L 3971.461 3371.6739 L 3971.871 3372.0839 L 3972.481 3372.2839 L 3973.101 3372.2839 L 3973.711 3372.0839 L 3973.911 3371.8839 L 3974.121 3371.4739 M 3969.911 3370.4439 L 3966.221 3370.4439 M 3964.871 3368.8139 L 3964.461 3368.6039 L 3963.851 3367.9939 L 3963.851 3372.2839 M 3962.301 3369.0139 L 3962.301 3368.8139 L 3962.091 3368.4039 L 3961.891 3368.1939 L 3961.481 3367.9939 L 3960.661 3367.9939 L 3960.251 3368.1939 L 3960.051 3368.4039 L 3959.841 3368.8139 L 3959.841 3369.2239 L 3960.051 3369.6339 L 3960.461 3370.2439 L 3962.501 3372.2839 L 3959.641 3372.2839 M 3955.221 3369.0139 L 3955.421 3368.6039 L 3955.831 3368.1939 L 3956.241 3367.9939 L 3957.061 3367.9939 L 3957.471 3368.1939 L 3957.881 3368.6039 L 3958.081 3369.0139 L 3958.291 3369.6339 L 3958.291 3370.6539 L 3958.081 3371.2639 L 3957.881 3371.6739 L 3957.471 3372.0839 L 3957.061 3372.2839 L 3956.241 3372.2839 L 3955.831 3372.0839 L 3955.421 3371.6739 L 3955.221 3371.2639 M 3953.871 3367.9939 L 3953.871 3372.2839 M 3953.871 3372.2839 L 3951.411 3372.2839 M 3950.061 3370.4439 L 3946.381 3370.4439 M 3942.171 3368.6039 L 3942.581 3368.1939 L 3943.191 3367.9939 L 3944.011 3367.9939 L 3944.621 3368.1939 L 3945.031 3368.6039 L 3945.031 3369.0139 L 3944.831 3369.4239 L 3944.621 3369.6339 L 3944.211 3369.8339 L 3942.991 3370.2439 L 3942.581 3370.4439 L 3942.371 3370.6539 L 3942.171 3371.0639 L 3942.171 3371.6739 L 3942.581 3372.0839 L 3943.191 3372.2839 L 3944.011 3372.2839 L 3944.621 3372.0839 L 3945.031 3371.6739 M 3940.821 3367.9939 L 3940.821 3372.2839 M 3940.821 3367.9939 L 3937.961 3372.2839 M 3937.961 3367.9939 L 3937.961 3372.2839","useTrueTypeFontRendering":false,"thickness":0.6,"width":0.6,"net":"","val":1},{"type":"polyline","net":"S$4448","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3993.0316,3347.9253 4004.4489,3347.9253"},{"type":"circle","_svgpath":"M 4020, 3349.5 m -11.811, 0 a 11.811,11.811 0 1,0 23.622,0 a 11.811,11.811 0 1,0 -23.622,0","start":[4020,3349.5],"radius":11.811,"width":"1","net":""},{"type":"polygon","svgpath":"M 3999.9213 3344.3664 C 4001.0096 3344.5676 4001.8814 3344.974 4002.6236 3345.6263 C 4003.1753 3346.1111 4003.4057 3346.4323 4003.5503 3346.9178 C 4003.69 3347.387 4003.6729 3347.596 4003.4841 3347.7259 C 4003.3338 3347.8293 4003.2525 3347.8347 4001.8337 3347.8347 L 4000.3414 3347.8347 L 4000.3414 3348.4591 L 4000.3414 3349.0835 L 3998.766 3348.5355 C 3997.8996 3348.2342 3997.1606 3347.9532 3997.124 3347.9112 C 3997.0688 3347.8479 3996.8026 3347.8347 3995.5759 3347.8347 L 3994.0944 3347.8347 L 3993.9406 3347.7002 C 3993.7989 3347.5762 3993.7902 3347.5424 3993.8294 3347.268 C 3994.0368 3345.8156 3995.8172 3344.5499 3998.0158 3344.2918 L 3998.3009 3344.2583 L 3998.3009 3344.8414 C 3998.3009 3345.3905 3998.3095 3345.4321 3998.4482 3345.5534 C 3998.6417 3345.7226 3998.8593 3345.719 3999.0167 3345.5439 C 3999.1252 3345.4232 3999.1411 3345.3328 3999.1411 3344.8352 C 3999.1411 3344.1712 3999.0761 3344.2102 3999.9213 3344.3664 M 3998.7358 3349.2964 L 4000.3409 3349.8559 L 4000.3412 3350.5467 L 4000.3414 3351.2374 L 3998.766 3350.6866 C 3997.8996 3350.3838 3997.1695 3350.1182 3997.1437 3350.0966 C 3997.118 3350.0751 3997.1045 3349.7603 3997.1137 3349.3972 L 3997.1306 3348.7369 L 3998.7358 3349.2964 M 3998.736 3351.4446 L 4000.3414 3352.0047 L 4000.3414 3352.6759 C 4000.3414 3353.0638 4000.3174 3353.347 4000.2845 3353.347 C 4000.207 3353.347 3997.2025 3352.2956 3997.1437 3352.2479 C 3997.118 3352.227 3997.1045 3351.9116 3997.1137 3351.5472 L 3997.1306 3350.8846 L 3998.736 3351.4446 M 3998.736 3353.5961 L 4000.3414 3354.1541 L 4000.3414 3354.8268 C 4000.3414 3355.1968 4000.3178 3355.4996 4000.2889 3355.4996 C 4000.2147 3355.4996 3997.2007 3354.4458 3997.1437 3354.4 C 3997.118 3354.3793 3997.1045 3354.0643 3997.1137 3353.7002 L 3997.1306 3353.0382 L 3998.736 3353.5961 M 3998.766 3355.7506 L 4000.3414 3356.3069 L 4000.3414 3356.9794 C 4000.3414 3357.3493 4000.3207 3357.652 4000.2953 3357.652 C 4000.2699 3357.652 3999.5475 3357.4063 3998.6899 3357.106 L 3997.1306 3356.5599 L 3997.1139 3355.8722 C 3997.1047 3355.494 3997.1182 3355.1867 3997.1439 3355.1895 C 3997.1696 3355.1922 3997.8996 3355.4447 3998.766 3355.7506 M 3998.661 3357.8651 C 3999.4697 3358.1509 4000.1662 3358.3966 4000.2087 3358.4112 C 4000.3004 3358.4427 3999.0913 3359.8729 3998.8955 3359.9646 C 3998.6391 3360.0846 3998.5005 3359.9831 3997.7906 3359.1558 L 3997.1006 3358.3516 L 3997.1006 3357.8443 C 3997.1006 3357.5653 3997.1209 3357.3389 3997.1456 3357.3413 C 3997.1704 3357.3435 3997.8523 3357.5793 3998.661 3357.8651"},{"type":"text","svgpath":"M4141.56 3364.76L4141.78 3365.72L4143.29 3365.72C4143.30 3365.14 4143.30 3364.57 4143.30 3364.07L4143.30 3363.64C4143.30 3363.05 4143.30 3362.47 4143.29 3361.90L4142.67 3361.83L4142.67 3361.60L4144.52 3361.60L4144.52 3361.83L4143.91 3361.90C4143.90 3362.47 4143.90 3363.05 4143.90 3363.64L4143.90 3363.98C4143.90 3364.54 4143.90 3365.12 4143.91 3365.71L4144.52 3365.77L4144.52 3366L4141.27 3366L4141.22 3364.76ZM4139.92 3362.05C4139.69 3362.05 4139.50 3361.87 4139.50 3361.64C4139.50 3361.40 4139.69 3361.24 4139.92 3361.24C4140.16 3361.24 4140.35 3361.40 4140.35 3361.64C4140.35 3361.87 4140.16 3362.05 4139.92 3362.05ZM4139.63 3365.72C4139.64 3365.39 4139.65 3364.93 4139.65 3364.62L4139.65 3363.74L4139.63 3362.86L4139.72 3362.80L4140.73 3363.16L4140.73 3363.35L4140.20 3363.40C4140.19 3363.69 4140.18 3363.91 4140.18 3364.27L4140.18 3364.62C4140.18 3364.93 4140.19 3365.39 4140.19 3365.72L4140.70 3365.80L4140.70 3366L4139.18 3366L4139.18 3365.80ZM4133.70 3365.72C4133.71 3365.39 4133.71 3364.94 4133.71 3364.62L4133.71 3363.94C4133.71 3363.13 4134.02 3362.80 4134.55 3362.80C4134.97 3362.80 4135.39 3362.99 4135.74 3363.41C4135.85 3362.98 4136.11 3362.80 4136.52 3362.80C4136.92 3362.80 4137.34 3363.03 4137.67 3363.40L4137.72 3362.86L4137.81 3362.80L4138.73 3363.16L4138.73 3363.36L4138.21 3363.41C4138.19 3363.68 4138.19 3363.91 4138.19 3364.28L4138.19 3364.62C4138.19 3364.93 4138.20 3365.39 4138.21 3365.72L4138.69 3365.80L4138.69 3366L4137.18 3366L4137.18 3365.80L4137.64 3365.72C4137.64 3365.39 4137.65 3364.93 4137.65 3364.62L4137.65 3363.65C4137.31 3363.34 4137.05 3363.22 4136.75 3363.22C4136.38 3363.22 4136.21 3363.41 4136.21 3364.01L4136.21 3364.62C4136.21 3364.94 4136.22 3365.39 4136.23 3365.72L4136.72 3365.80L4136.72 3366L4135.21 3366L4135.21 3365.80L4135.66 3365.72C4135.67 3365.39 4135.68 3364.94 4135.68 3364.62L4135.68 3363.99C4135.68 3363.86 4135.69 3363.76 4135.70 3363.65C4135.35 3363.34 4135.07 3363.22 4134.80 3363.22C4134.42 3363.22 4134.25 3363.39 4134.25 3364.00L4134.25 3364.62C4134.25 3364.94 4134.25 3365.39 4134.26 3365.72L4134.74 3365.80L4134.74 3366L4133.24 3366L4133.24 3365.80ZM4132.03 3362.05C4131.80 3362.05 4131.61 3361.87 4131.61 3361.64C4131.61 3361.40 4131.80 3361.24 4132.03 3361.24C4132.27 3361.24 4132.46 3361.40 4132.46 3361.64C4132.46 3361.87 4132.27 3362.05 4132.03 3362.05ZM4131.74 3365.72C4131.75 3365.39 4131.76 3364.93 4131.76 3364.62L4131.76 3363.74L4131.74 3362.86L4131.83 3362.80L4132.84 3363.16L4132.84 3363.35L4132.31 3363.40C4132.30 3363.69 4132.29 3363.91 4132.29 3364.27L4132.29 3364.62C4132.29 3364.93 4132.30 3365.39 4132.30 3365.72L4132.81 3365.80L4132.81 3366L4131.29 3366L4131.29 3365.80ZM4129.07 3365.60C4129.25 3365.72 4129.37 3365.78 4129.52 3365.78C4129.76 3365.78 4129.90 3365.64 4129.90 3365.29L4129.90 3363.17L4129.01 3363.17L4129.01 3362.89L4129.90 3362.89L4129.86 3361.98L4130.24 3361.98L4130.41 3362.87L4131.00 3362.94L4131.00 3363.17L4130.44 3363.17L4130.44 3364.77C4130.44 3365.02 4130.45 3365.16 4130.45 3365.32C4130.45 3365.84 4130.17 3366.08 4129.70 3366.08C4129.37 3366.08 4129.11 3365.96 4128.94 3365.75ZM4127.66 3363.50C4127.30 3363.17 4127.05 3363.13 4126.84 3363.13C4126.34 3363.13 4125.98 3363.58 4125.98 3364.46C4125.98 3365.38 4126.40 3365.75 4126.87 3365.75C4127.12 3365.75 4127.39 3365.65 4127.66 3365.39ZM4127.67 3362.12L4127.65 3361.19L4127.74 3361.14L4128.73 3361.42L4128.73 3361.61L4128.20 3361.67L4128.20 3364.62C4128.20 3364.93 4128.20 3365.39 4128.21 3365.72L4128.70 3365.80L4128.70 3366L4127.72 3366.07L4127.67 3365.62C4127.38 3365.98 4127.05 3366.08 4126.75 3366.08C4125.95 3366.08 4125.40 3365.40 4125.40 3364.41C4125.40 3363.40 4125.95 3362.80 4126.66 3362.80C4127.00 3362.80 4127.36 3362.95 4127.67 3363.29ZM4124.10 3362.05C4123.87 3362.05 4123.68 3361.87 4123.68 3361.64C4123.68 3361.40 4123.87 3361.24 4124.10 3361.24C4124.34 3361.24 4124.53 3361.40 4124.53 3361.64C4124.53 3361.87 4124.34 3362.05 4124.10 3362.05ZM4123.81 3365.72C4123.82 3365.39 4123.82 3364.93 4123.82 3364.62L4123.82 3363.74L4123.81 3362.86L4123.90 3362.80L4124.91 3363.16L4124.91 3363.35L4124.38 3363.40C4124.36 3363.69 4124.36 3363.91 4124.36 3364.27L4124.36 3364.62C4124.36 3364.93 4124.36 3365.39 4124.37 3365.72L4124.87 3365.80L4124.87 3366L4123.36 3366L4123.36 3365.80ZM4121.14 3365.60C4121.32 3365.72 4121.44 3365.78 4121.59 3365.78C4121.83 3365.78 4121.97 3365.64 4121.97 3365.29L4121.97 3363.17L4121.08 3363.17L4121.08 3362.89L4121.96 3362.89L4121.93 3361.98L4122.31 3361.98L4122.48 3362.87L4123.07 3362.94L4123.07 3363.17L4122.51 3363.17L4122.51 3364.77C4122.51 3365.02 4122.52 3365.16 4122.52 3365.32C4122.52 3365.84 4122.24 3366.08 4121.77 3366.08C4121.44 3366.08 4121.18 3365.96 4121.01 3365.75ZM4116.11 3361.89L4115.93 3362.77L4115.61 3362.77L4115.65 3361.60L4119.26 3361.60L4119.31 3362.77L4118.98 3362.77L4118.80 3361.89L4117.77 3361.89C4117.76 3362.47 4117.76 3363.05 4117.76 3363.64L4117.76 3363.97C4117.76 3364.55 4117.76 3365.13 4117.77 3365.70L4118.45 3365.77L4118.45 3366L4116.47 3366L4116.47 3365.77L4117.15 3365.70C4117.16 3365.12 4117.16 3364.54 4117.16 3363.97L4117.16 3363.64C4117.16 3363.05 4117.16 3362.47 4117.15 3361.89ZM4115.06 3364.16C4114.99 3363.38 4114.57 3363.05 4114.16 3363.05C4113.74 3363.05 4113.44 3363.40 4113.44 3363.81C4113.44 3364.03 4113.50 3364.18 4113.79 3364.18ZM4112.95 3364.42C4112.92 3364.33 4112.90 3364.20 4112.90 3364.05C4112.90 3363.28 4113.43 3362.80 4114.13 3362.80C4114.94 3362.80 4115.64 3363.45 4115.64 3364.46C4115.64 3365.49 4115.04 3366.08 4114.16 3366.08C4113.58 3366.08 4113.16 3365.80 4112.92 3365.33L4113.05 3365.24C4113.28 3365.53 4113.54 3365.72 4113.97 3365.72C4114.61 3365.72 4115.05 3365.28 4115.06 3364.41ZM4109.75 3365.22C4109.96 3365.53 4110.29 3365.72 4110.67 3365.72C4111.30 3365.72 4111.76 3365.24 4111.76 3364.39C4111.76 3363.54 4111.35 3363.05 4110.75 3363.05C4110.65 3363.05 4110.52 3363.07 4110.40 3363.11L4110.27 3363.57C4110.23 3363.76 4110.13 3363.88 4109.92 3363.88C4109.77 3363.88 4109.67 3363.80 4109.63 3363.64C4109.72 3363.15 4110.20 3362.80 4110.79 3362.80C4111.58 3362.80 4112.32 3363.41 4112.32 3364.45C4112.32 3365.45 4111.73 3366.08 4110.84 3366.08C4110.23 3366.08 4109.81 3365.79 4109.62 3365.28ZM4106.16 3365.72C4106.17 3365.39 4106.17 3364.94 4106.17 3364.62L4106.17 3364.00C4106.17 3363.14 4106.46 3362.80 4107.02 3362.80C4107.44 3362.80 4107.89 3363.04 4108.22 3363.41L4108.22 3362.12L4108.20 3361.19L4108.28 3361.14L4109.28 3361.42L4109.28 3361.61L4108.75 3361.66L4108.75 3364.62C4108.75 3364.93 4108.75 3365.39 4108.76 3365.72L4109.25 3365.80L4109.25 3366L4107.74 3366L4107.74 3365.80L4108.19 3365.72C4108.20 3365.39 4108.21 3364.93 4108.21 3364.62L4108.21 3363.65C4107.85 3363.32 4107.56 3363.21 4107.26 3363.21C4106.89 3363.21 4106.71 3363.40 4106.71 3364.01L4106.71 3364.62C4106.71 3364.94 4106.72 3365.39 4106.72 3365.72L4107.22 3365.80L4107.22 3366L4105.70 3366L4105.70 3365.80ZM4102.18 3365.72C4102.18 3365.39 4102.19 3364.94 4102.19 3364.62L4102.19 3363.99C4102.19 3363.14 4102.47 3362.80 4103.03 3362.80C4103.44 3362.80 4103.87 3363.03 4104.21 3363.40L4104.26 3362.86L4104.35 3362.80L4105.28 3363.16L4105.28 3363.36L4104.76 3363.41C4104.74 3363.68 4104.74 3363.91 4104.74 3364.28L4104.74 3364.62C4104.74 3364.93 4104.74 3365.39 4104.75 3365.72L4105.24 3365.80L4105.24 3366L4103.72 3366L4103.72 3365.80L4104.18 3365.72C4104.19 3365.39 4104.19 3364.93 4104.19 3364.62L4104.19 3363.65C4103.85 3363.34 4103.57 3363.21 4103.27 3363.21C4102.89 3363.21 4102.73 3363.41 4102.73 3364.01L4102.73 3364.62C4102.73 3364.94 4102.73 3365.39 4102.74 3365.72L4103.23 3365.80L4103.23 3366L4101.71 3366L4101.71 3365.80ZM4099.72 3366.08C4098.95 3366.08 4098.20 3365.54 4098.20 3364.45C4098.20 3363.36 4098.95 3362.80 4099.72 3362.80C4100.48 3362.80 4101.22 3363.37 4101.22 3364.45C4101.22 3365.53 4100.49 3366.08 4099.72 3366.08ZM4099.72 3365.83C4100.29 3365.83 4100.62 3365.36 4100.62 3364.45C4100.62 3363.54 4100.29 3363.05 4099.72 3363.05C4099.15 3363.05 4098.81 3363.54 4098.81 3364.45C4098.81 3365.36 4099.15 3365.83 4099.72 3365.83ZM4096.69 3365.72C4096.70 3365.36 4096.70 3364.98 4096.70 3364.62L4096.70 3362.12L4096.67 3361.19L4096.76 3361.14L4097.78 3361.42L4097.78 3361.61L4097.24 3361.66L4097.24 3364.62C4097.24 3364.98 4097.25 3365.36 4097.26 3365.72L4097.78 3365.80L4097.78 3366L4096.16 3366L4096.16 3365.80ZM4094.18 3366.08C4093.42 3366.08 4092.67 3365.54 4092.67 3364.45C4092.67 3363.36 4093.42 3362.80 4094.18 3362.80C4094.95 3362.80 4095.69 3363.37 4095.69 3364.45C4095.69 3365.53 4094.96 3366.08 4094.18 3366.08ZM4094.18 3365.83C4094.76 3365.83 4095.09 3365.36 4095.09 3364.45C4095.09 3363.54 4094.76 3363.05 4094.18 3363.05C4093.61 3363.05 4093.28 3363.54 4093.28 3364.45C4093.28 3365.36 4093.61 3365.83 4094.18 3365.83ZM4090.82 3364.73C4091.23 3364.73 4091.47 3364.39 4091.47 3363.88C4091.47 3363.37 4091.21 3363.02 4090.79 3363.02C4090.38 3363.02 4090.14 3363.37 4090.14 3363.86C4090.14 3364.37 4090.39 3364.73 4090.82 3364.73ZM4090.28 3366.09C4089.81 3366.09 4089.64 3366.32 4089.64 3366.62C4089.64 3367.01 4090.03 3367.31 4090.78 3367.31C4091.29 3367.31 4091.63 3367.11 4091.63 3366.67C4091.63 3366.44 4091.56 3366.27 4091.36 3366.08C4091.27 3366.08 4091.17 3366.09 4091.04 3366.09ZM4089.13 3362.87L4089.22 3362.80L4089.97 3363.05C4090.18 3362.88 4090.46 3362.80 4090.80 3362.80C4091.49 3362.80 4091.99 3363.19 4091.99 3363.87C4091.99 3364.31 4091.80 3364.63 4091.48 3364.80C4091.81 3365.11 4091.93 3365.32 4091.93 3365.53C4091.93 3365.78 4091.78 3365.95 4091.51 3366.04C4091.97 3366.26 4092.14 3366.48 4092.14 3366.76C4092.14 3367.24 4091.73 3367.57 4090.78 3367.57C4089.70 3367.57 4089.16 3367.01 4089.16 3366.44C4089.16 3365.92 4089.49 3365.61 4090.21 3365.61L4091.08 3365.61C4091.41 3365.61 4091.50 3365.50 4091.50 3365.30C4091.50 3365.15 4091.44 3365.02 4091.32 3364.87C4091.17 3364.93 4090.99 3364.96 4090.80 3364.96C4090.12 3364.96 4089.62 3364.56 4089.62 3363.87C4089.62 3363.62 4089.68 3363.41 4089.79 3363.24L4089.13 3363.26ZM4085.55 3362.89L4086.82 3362.89L4086.82 3363.09L4086.23 3363.16L4087.06 3365.49L4087.92 3363.15L4087.35 3363.09L4087.35 3362.89L4088.91 3362.89L4088.91 3363.09L4088.54 3363.14L4087.31 3366.19L4087.34 3366.26C4087.49 3366.66 4087.69 3367.01 4087.98 3367.24L4088.03 3367.19C4088.20 3367.03 4088.32 3366.95 4088.51 3366.95C4088.70 3366.95 4088.89 3367.04 4088.93 3367.22C4088.93 3367.47 4088.65 3367.64 4088.34 3367.64C4087.86 3367.64 4087.45 3367.19 4087.02 3366.07L4085.92 3363.15L4085.55 3363.09ZM4080.76 3362.89L4081.97 3362.89L4081.97 3363.10L4081.43 3363.19L4082.20 3365.38L4083.03 3363.17L4082.46 3363.10L4082.46 3362.89L4084.03 3362.89L4084.03 3363.10L4083.66 3363.16L4082.48 3366.04L4082.21 3366.04L4081.13 3363.19L4080.76 3363.10ZM4078.71 3365.66C4078.72 3365.32 4078.72 3364.96 4078.72 3364.61L4078.72 3362.55L4078.70 3361.60L4078.79 3361.54L4080.14 3361.89L4080.14 3362.12L4079.26 3362.03L4079.26 3364.61C4079.26 3364.96 4079.27 3365.32 4079.27 3365.66L4080.21 3365.80L4080.21 3366L4077.79 3366L4077.79 3365.80ZM4076.42 3366.08C4076.17 3366.08 4075.97 3365.88 4075.97 3365.65C4075.97 3365.39 4076.17 3365.19 4076.42 3365.19C4076.67 3365.19 4076.87 3365.39 4076.87 3365.65C4076.87 3365.88 4076.67 3366.08 4076.42 3366.08ZM4074.69 3365.49C4074.38 3365.18 4074.09 3364.87 4073.92 3364.69C4072.93 3363.67 4072.60 3363.25 4072.60 3362.68C4072.60 3361.99 4072.97 3361.51 4073.82 3361.51C4074.47 3361.51 4075.05 3361.84 4075.14 3362.50C4075.07 3362.63 4074.96 3362.71 4074.82 3362.71C4074.65 3362.71 4074.54 3362.60 4074.46 3362.29L4074.33 3361.81C4074.19 3361.78 4074.07 3361.77 4073.98 3361.77C4073.48 3361.77 4073.17 3362.14 4073.17 3362.71C4073.17 3363.23 4073.47 3363.73 4074.11 3364.46C4074.40 3364.79 4074.75 3365.19 4075.11 3365.59L4075.11 3366L4072.41 3366L4072.41 3365.49ZM4071.40 3365.49C4071.09 3365.18 4070.80 3364.87 4070.62 3364.69C4069.64 3363.67 4069.30 3363.25 4069.30 3362.68C4069.30 3361.99 4069.68 3361.51 4070.53 3361.51C4071.18 3361.51 4071.76 3361.84 4071.85 3362.50C4071.78 3362.63 4071.67 3362.71 4071.53 3362.71C4071.36 3362.71 4071.25 3362.60 4071.17 3362.29L4071.04 3361.81C4070.90 3361.78 4070.78 3361.77 4070.68 3361.77C4070.19 3361.77 4069.88 3362.14 4069.88 3362.71C4069.88 3363.23 4070.18 3363.73 4070.82 3364.46C4071.11 3364.79 4071.46 3365.19 4071.82 3365.59L4071.82 3366L4069.12 3366L4069.12 3365.49ZM4066.85 3365.66C4066.86 3365.32 4066.87 3364.96 4066.87 3364.61L4066.87 3362.55L4066.84 3361.60L4066.93 3361.54L4068.28 3361.89L4068.28 3362.12L4067.41 3362.03L4067.41 3364.61C4067.41 3364.96 4067.41 3365.32 4067.42 3365.66L4068.35 3365.80L4068.35 3366L4065.93 3366L4065.93 3365.80ZM4064.70 3363.77C4064.70 3362.19 4064.32 3361.78 4063.90 3361.78C4063.49 3361.78 4063.12 3362.19 4063.12 3363.77C4063.12 3365.40 4063.49 3365.83 4063.90 3365.83C4064.32 3365.83 4064.70 3365.41 4064.70 3363.77ZM4063.90 3361.51C4064.60 3361.51 4065.28 3362.12 4065.28 3363.77C4065.28 3365.47 4064.60 3366.08 4063.90 3366.08C4063.21 3366.08 4062.53 3365.47 4062.53 3363.77C4062.53 3362.12 4063.21 3361.51 4063.90 3361.51Z","useTrueTypeFontRendering":true,"thickness":0.8,"width":0.8,"net":""},{"type":"text","svgpath":"M 4126.7285 3348.1901 L 4127.0148 3347.6174 L 4127.5875 3347.3311 L 4128.4465 3347.3311 L 4129.0191 3347.6174 L 4129.3054 3347.9037 L 4129.5918 3348.7627 L 4129.5918 3349.6217 L 4129.3054 3350.1943 L 4128.7328 3350.4807 L 4127.8738 3350.4807 L 4127.3011 3350.1943 L 4127.0148 3349.6217 M 4128.4465 3347.3311 L 4129.0191 3347.9037 L 4129.3054 3348.7627 L 4129.3054 3349.6217 L 4129.0191 3350.1943 L 4128.7328 3350.4807 M 4126.7285 3347.3311 L 4127.0148 3349.6217 L 4127.0148 3350.1943 L 4126.4422 3350.4807 L 4125.8695 3350.4807 L 4125.2969 3349.908 L 4125.0105 3349.049 L 4125.0105 3348.4764 L 4125.2969 3347.6174 L 4125.5832 3347.0447 L 4126.1558 3346.4721 L 4126.7285 3346.1858 L 4127.5875 3345.8994 L 4128.4465 3345.8994 L 4129.3054 3346.1858 L 4129.8781 3346.4721 L 4130.4507 3347.0447 L 4130.7371 3347.6174 L 4131.0234 3348.4764 L 4131.0234 3349.3354 L 4130.7371 3350.1943 L 4130.4507 3350.767 L 4129.8781 3351.3397 L 4129.3054 3351.626 L 4128.4465 3351.9123 L 4127.5875 3351.9123 L 4126.7285 3351.626 L 4126.1558 3351.3397 L 4125.8695 3351.0533 M 4126.4422 3347.3311 L 4126.7285 3349.6217 L 4126.7285 3350.1943 L 4126.4422 3350.4807 M 4123.1208 3347.9037 L 4123.1208 3351.9123 M 4123.1208 3349.6217 L 4122.8344 3348.7627 L 4122.2618 3348.1901 L 4121.6891 3347.9037 L 4120.8301 3347.9037 M 4117.5088 3347.9037 L 4118.0814 3348.1901 L 4118.6541 3348.7627 L 4118.9404 3349.6217 L 4118.9404 3350.1943 L 4118.6541 3351.0533 L 4118.0814 3351.626 L 4117.5088 3351.9123 L 4116.6498 3351.9123 L 4116.0771 3351.626 L 4115.5045 3351.0533 L 4115.2181 3350.1943 L 4115.2181 3349.6217 L 4115.5045 3348.7627 L 4116.0771 3348.1901 L 4116.6498 3347.9037 L 4117.5088 3347.9037 M 4113.3284 3345.8994 L 4113.3284 3351.9123 M 4113.3284 3348.7627 L 4112.7557 3348.1901 L 4112.1831 3347.9037 L 4111.3241 3347.9037 L 4110.7514 3348.1901 L 4110.1788 3348.7627 L 4109.8924 3349.6217 L 4109.8924 3350.1943 L 4110.1788 3351.0533 L 4110.7514 3351.626 L 4111.3241 3351.9123 L 4112.1831 3351.9123 L 4112.7557 3351.626 L 4113.3284 3351.0533 M 4106.5711 3347.9037 L 4107.1437 3348.1901 L 4107.7164 3348.7627 L 4108.0027 3349.6217 L 4108.0027 3350.1943 L 4107.7164 3351.0533 L 4107.1437 3351.626 L 4106.5711 3351.9123 L 4105.7121 3351.9123 L 4105.1394 3351.626 L 4104.5668 3351.0533 L 4104.2804 3350.1943 L 4104.2804 3349.6217 L 4104.5668 3348.7627 L 4105.1394 3348.1901 L 4105.7121 3347.9037 L 4106.5711 3347.9037 M 4101.5317 3345.8994 L 4101.5317 3350.767 L 4101.2454 3351.626 L 4100.6727 3351.9123 L 4100.1001 3351.9123 M 4102.3907 3347.9037 L 4100.3864 3347.9037 M 4094.7744 3345.8994 L 4094.7744 3351.9123 M 4094.7744 3348.7627 L 4095.347 3348.1901 L 4095.9197 3347.9037 L 4096.7787 3347.9037 L 4097.3513 3348.1901 L 4097.924 3348.7627 L 4098.2103 3349.6217 L 4098.2103 3350.1943 L 4097.924 3351.0533 L 4097.3513 3351.626 L 4096.7787 3351.9123 L 4095.9197 3351.9123 L 4095.347 3351.626 L 4094.7744 3351.0533 M 4091.453 3347.9037 L 4092.0256 3348.1901 L 4092.5983 3348.7627 L 4092.8846 3349.6217 L 4092.8846 3350.1943 L 4092.5983 3351.0533 L 4092.0256 3351.626 L 4091.453 3351.9123 L 4090.594 3351.9123 L 4090.0213 3351.626 L 4089.4487 3351.0533 L 4089.1624 3350.1943 L 4089.1624 3349.6217 L 4089.4487 3348.7627 L 4090.0213 3348.1901 L 4090.594 3347.9037 L 4091.453 3347.9037 M 4087.2726 3345.8994 L 4087.2726 3351.9123 M 4085.0965 3347.9037 L 4083.3785 3351.9123 M 4081.6606 3347.9037 L 4083.3785 3351.9123 L 4083.9512 3353.0576 L 4084.5239 3353.6303 L 4085.0965 3353.9166 L 4085.3828 3353.9166","useTrueTypeFontRendering":false,"thickness":0.8,"width":0.8,"net":""},{"type":"text","svgpath":"M 4009.2401 3365.8567 C 4009.2501 3365.5167 4009.2601 3365.1567 4009.2601 3364.8067 L 4009.2601 3362.7467 L 4009.2301 3361.7967 L 4009.3201 3361.7367 L 4010.6701 3362.0867 L 4010.6701 3362.3167 L 4009.8001 3362.2267 L 4009.8001 3364.8067 C 4009.8001 3365.1567 4009.8001 3365.5167 4009.8101 3365.8567 L 4010.7401 3365.9967 L 4010.7401 3366.1967 L 4008.3201 3366.1967 L 4008.3201 3365.9967 Z M 4006.9601 3366.2767 C 4006.7101 3366.2767 4006.5101 3366.0767 4006.5101 3365.8467 C 4006.5101 3365.5867 4006.7101 3365.3867 4006.9601 3365.3867 C 4007.2001 3365.3867 4007.4001 3365.5867 4007.4001 3365.8467 C 4007.4001 3366.0767 4007.2001 3366.2767 4006.9601 3366.2767 Z M 4005.6401 3361.7967 L 4005.6401 3362.3167 L 4003.3301 3362.3167 L 4005.0901 3366.1367 L 4005.0301 3366.1967 L 4004.5201 3366.1967 L 4002.9701 3362.1267 L 4002.9701 3361.7967 Z M 3999.7501 3365.9267 L 4000.7101 3364.5467 L 3999.7501 3363.3667 L 3999.3701 3363.2967 L 3999.3701 3363.0867 L 4000.5801 3363.0867 L 4000.5801 3363.2967 L 4000.1201 3363.3767 L 4000.8501 3364.3467 L 4001.5301 3363.3667 L 4001.1001 3363.2967 L 4001.1001 3363.0867 L 4002.5601 3363.0867 L 4002.5601 3363.2967 L 4002.1301 3363.3667 L 4001.2201 3364.7067 L 4002.1901 3365.9267 L 4002.6101 3365.9967 L 4002.6101 3366.1967 L 4001.3301 3366.1967 L 4001.3301 3365.9967 L 4001.8401 3365.9167 L 4001.0801 3364.9067 L 4000.3801 3365.9167 L 4000.8701 3365.9967 L 4000.8701 3366.1967 L 3999.3001 3366.1967 L 3999.3001 3365.9967 Z M 3998.7201 3364.4467 L 3997.2701 3362.3467 L 3997.2701 3364.4467 Z M 3996.0401 3364.4467 L 3996.7401 3364.4467 L 3996.7401 3361.7367 L 3997.1101 3361.7367 L 3999.0501 3364.5067 L 3999.0501 3364.8267 L 3997.2701 3364.8267 L 3997.2701 3366.1967 L 3996.7401 3366.1967 L 3996.7401 3364.8267 L 3996.0401 3364.8267 Z M 3990.6801 3365.9167 C 3990.6901 3365.5867 3990.6901 3365.1367 3990.6901 3364.8167 L 3990.6901 3364.1367 C 3990.6901 3363.3267 3991.0001 3362.9967 3991.5301 3362.9967 C 3991.9501 3362.9967 3992.3701 3363.1867 3992.7201 3363.6067 C 3992.8301 3363.1767 3993.0901 3362.9967 3993.5001 3362.9967 C 3993.9001 3362.9967 3994.3201 3363.2267 3994.6501 3363.5967 L 3994.7001 3363.0567 L 3994.7901 3362.9967 L 3995.7101 3363.3567 L 3995.7101 3363.5567 L 3995.1901 3363.6067 C 3995.1701 3363.8767 3995.1701 3364.1067 3995.1701 3364.4767 L 3995.1701 3364.8167 C 3995.1701 3365.1267 3995.1801 3365.5867 3995.1901 3365.9167 L 3995.6701 3365.9967 L 3995.6701 3366.1967 L 3994.1601 3366.1967 L 3994.1601 3365.9967 L 3994.6201 3365.9167 C 3994.6201 3365.5867 3994.6301 3365.1267 3994.6301 3364.8167 L 3994.6301 3363.8467 C 3994.2901 3363.5367 3994.0301 3363.4167 3993.7301 3363.4167 C 3993.3601 3363.4167 3993.1901 3363.6067 3993.1901 3364.2067 L 3993.1901 3364.8167 C 3993.1901 3365.1367 3993.2001 3365.5867 3993.2101 3365.9167 L 3993.7001 3365.9967 L 3993.7001 3366.1967 L 3992.1901 3366.1967 L 3992.1901 3365.9967 L 3992.6401 3365.9167 C 3992.6501 3365.5867 3992.6601 3365.1367 3992.6601 3364.8167 L 3992.6601 3364.1867 C 3992.6601 3364.0567 3992.6701 3363.9567 3992.6801 3363.8467 C 3992.3301 3363.5367 3992.0501 3363.4167 3991.7801 3363.4167 C 3991.4001 3363.4167 3991.2301 3363.5867 3991.2301 3364.1967 L 3991.2301 3364.8167 C 3991.2301 3365.1367 3991.2301 3365.5867 3991.2401 3365.9167 L 3991.7201 3365.9967 L 3991.7201 3366.1967 L 3990.2201 3366.1967 L 3990.2201 3365.9967 Z M 3984.7601 3365.9167 C 3984.7701 3365.5867 3984.7801 3365.1367 3984.7801 3364.8167 L 3984.7801 3364.1367 C 3984.7801 3363.3267 3985.0801 3362.9967 3985.6201 3362.9967 C 3986.0401 3362.9967 3986.4601 3363.1867 3986.8001 3363.6067 C 3986.9201 3363.1767 3987.1801 3362.9967 3987.5801 3362.9967 C 3987.9901 3362.9967 3988.4101 3363.2267 3988.7301 3363.5967 L 3988.7801 3363.0567 L 3988.8701 3362.9967 L 3989.8001 3363.3567 L 3989.8001 3363.5567 L 3989.2801 3363.6067 C 3989.2601 3363.8767 3989.2601 3364.1067 3989.2601 3364.4767 L 3989.2601 3364.8167 C 3989.2601 3365.1267 3989.2601 3365.5867 3989.2701 3365.9167 L 3989.7601 3365.9967 L 3989.7601 3366.1967 L 3988.2401 3366.1967 L 3988.2401 3365.9967 L 3988.7001 3365.9167 C 3988.7101 3365.5867 3988.7101 3365.1267 3988.7101 3364.8167 L 3988.7101 3363.8467 C 3988.3801 3363.5367 3988.1201 3363.4167 3987.8201 3363.4167 C 3987.4501 3363.4167 3987.2801 3363.6067 3987.2801 3364.2067 L 3987.2801 3364.8167 C 3987.2801 3365.1367 3987.2801 3365.5867 3987.2901 3365.9167 L 3987.7901 3365.9967 L 3987.7901 3366.1967 L 3986.2801 3366.1967 L 3986.2801 3365.9967 L 3986.7301 3365.9167 C 3986.7401 3365.5867 3986.7401 3365.1367 3986.7401 3364.8167 L 3986.7401 3364.1867 C 3986.7401 3364.0567 3986.7501 3363.9567 3986.7601 3363.8467 C 3986.4101 3363.5367 3986.1401 3363.4167 3985.8601 3363.4167 C 3985.4801 3363.4167 3985.3101 3363.5867 3985.3101 3364.1967 L 3985.3101 3364.8167 C 3985.3101 3365.1367 3985.3201 3365.5867 3985.3201 3365.9167 L 3985.8101 3365.9967 L 3985.8101 3366.1967 L 3984.3001 3366.1967 L 3984.3001 3365.9967 Z ","useTrueTypeFontRendering":true,"thickness":0.8,"width":0.8,"net":""}]},"fabrication":{"F":[],"B":[]}},"footprints":[{"ref":"FPNL","center":[3938.5041,3345.1693],"bbox":{"pos":[3938.5041,3345.1693],"angle":180,"relpos":[-22.834650000000238,-14.073300000000472],"size":[45.66949999999997,21.65065000000004]},"pads":[{"layers":["B"],"pos":[3949.321,3340.151],"size":[1.1811,5.1181],"angle":0,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3949.3215,"y":3340.1511},"polygon":[{"x":3949.912,"y":3337.5921},{"x":3948.7309,"y":3337.5921},{"x":3948.7309,"y":3342.7102},{"x":3949.912,"y":3342.7102}],"net":"+3.3V"},{"layers":["B"],"pos":[3947.353,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3947.3535,"y":3340.1512},"polygon":[{"x":3947.944,"y":3337.5921},{"x":3946.7629,"y":3337.5921},{"x":3946.7629,"y":3342.7102},{"x":3947.944,"y":3342.7102}],"net":"+2.8V"},{"layers":["B"],"pos":[3945.384,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3945.3845,"y":3340.1512},"polygon":[{"x":3945.975,"y":3337.5921},{"x":3944.7939,"y":3337.5921},{"x":3944.7939,"y":3342.7102},{"x":3945.975,"y":3342.7102}],"net":"TOF_ENL"},{"layers":["B"],"pos":[3943.416,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3943.4165,"y":3340.1512},"polygon":[{"x":3944.007,"y":3337.5921},{"x":3942.8259,"y":3337.5921},{"x":3942.8259,"y":3342.7102},{"x":3944.007,"y":3342.7102}],"net":"GND"},{"layers":["B"],"pos":[3941.447,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3941.4475,"y":3340.1512},"polygon":[{"x":3942.038,"y":3337.5921},{"x":3940.8569,"y":3337.5921},{"x":3940.8569,"y":3342.7102},{"x":3942.038,"y":3342.7102}],"net":"TOF_SCL"},{"layers":["B"],"pos":[3939.479,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3939.4795,"y":3340.1512},"polygon":[{"x":3940.07,"y":3337.5921},{"x":3938.8889,"y":3337.5921},{"x":3938.8889,"y":3342.7102},{"x":3940.07,"y":3342.7102}],"net":"GND"},{"layers":["B"],"pos":[3937.51,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3937.5105,"y":3340.1512},"polygon":[{"x":3938.101,"y":3337.5921},{"x":3936.9199,"y":3337.5921},{"x":3936.9199,"y":3342.7102},{"x":3938.101,"y":3342.7102}],"net":"TOF_SDA"},{"layers":["B"],"pos":[3935.542,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3935.5425,"y":3340.1512},"polygon":[{"x":3936.133,"y":3337.5921},{"x":3934.9519,"y":3337.5921},{"x":3934.9519,"y":3342.7102},{"x":3936.133,"y":3342.7102}],"net":"GND"},{"layers":["B"],"pos":[3933.573,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3933.5735,"y":3340.1512},"polygon":[{"x":3934.164,"y":3337.5921},{"x":3932.9829,"y":3337.5921},{"x":3932.9829,"y":3342.7102},{"x":3934.164,"y":3342.7102}],"net":"RINPUT1"},{"layers":["B"],"pos":[3931.605,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3931.6055,"y":3340.1512},"polygon":[{"x":3932.196,"y":3337.5921},{"x":3931.0149,"y":3337.5921},{"x":3931.0149,"y":3342.7102},{"x":3932.196,"y":3342.7102}],"net":"GND"},{"layers":["B"],"pos":[3929.636,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3929.6365,"y":3340.1512},"polygon":[{"x":3930.227,"y":3337.5921},{"x":3929.0459,"y":3337.5921},{"x":3929.0459,"y":3342.7102},{"x":3930.227,"y":3342.7102}],"net":"LINPUT1"},{"layers":["B"],"pos":[3927.668,3340.151],"size":[1.1811,5.1181],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3927.6685,"y":3340.1511},"polygon":[{"x":3928.259,"y":3337.592},{"x":3927.0779,"y":3337.592},{"x":3927.0779,"y":3342.7101},{"x":3928.259,"y":3342.7101}],"net":"GND"},{"layers":["B"],"pos":[3918.622,3350.188],"size":[5.9055,7.874],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3918.6215,"y":3350.188},"polygon":[{"x":3921.5767,"y":3346.2475},{"x":3915.6668,"y":3346.2475},{"x":3915.6668,"y":3354.1275},{"x":3921.5767,"y":3354.1275}],"net":""},{"layers":["B"],"pos":[3958.386,3350.188],"size":[5.9055,7.874],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3958.3855,"y":3350.188},"polygon":[{"x":3961.3409,"y":3346.2475},{"x":3955.4309,"y":3346.2475},{"x":3955.4309,"y":3354.1275},{"x":3961.3409,"y":3354.1275}],"net":""}],"drawings":[],"layer":"B"},{"ref":"TOF_R","center":[3908.1892,3349.5],"bbox":{"pos":[3908.1892,3349.5],"angle":0,"relpos":[-3.9372000000003027,-7.086999999999989],"size":[20.867200000000594,14.568000000000211]},"pads":[{"layers":["F"],"pos":[3908.189,3354.028],"size":[1.9685,3.5433],"angle":0,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3908.1892,"y":3354.0273},"polygon":[{"x":3907.205,"y":3352.2559},{"x":3909.1735,"y":3352.2559},{"x":3909.1735,"y":3355.7992},{"x":3907.205,"y":3355.7992}],"net":""},{"layers":["F"],"pos":[3911.142,3354.028],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3911.1418,"y":3354.0273},"polygon":[{"x":3910.158,"y":3352.2559},{"x":3912.1265,"y":3352.2559},{"x":3912.1265,"y":3355.7992},{"x":3910.158,"y":3355.7992}],"net":""},{"layers":["F"],"pos":[3914.096,3354.028],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3914.0947,"y":3354.0273},"polygon":[{"x":3913.112,"y":3352.2559},{"x":3915.0805,"y":3352.2559},{"x":3915.0805,"y":3355.7992},{"x":3913.112,"y":3355.7992}],"net":""},{"layers":["F"],"pos":[3917.049,3354.028],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3917.0473,"y":3354.0263},"polygon":[{"x":3916.065,"y":3352.2559},{"x":3918.0335,"y":3352.2559},{"x":3918.0335,"y":3355.7992},{"x":3916.065,"y":3355.7992}],"net":"R1_1"},{"layers":["F"],"pos":[3920.001,3354.028],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3920.0003,"y":3354.0273},"polygon":[{"x":3919.017,"y":3352.2559},{"x":3920.9855,"y":3352.2559},{"x":3920.9855,"y":3355.7992},{"x":3919.017,"y":3355.7992}],"net":"TOF_L_5"},{"layers":["F"],"pos":[3922.954,3354.028],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3922.9528,"y":3354.0273},"polygon":[{"x":3921.97,"y":3352.2559},{"x":3923.9385,"y":3352.2559},{"x":3923.9385,"y":3355.7992},{"x":3921.97,"y":3355.7992}],"net":"TOF_L_6"},{"layers":["F"],"pos":[3908.189,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3908.1892,"y":3344.9727},"polygon":[{"x":3907.205,"y":3343.2008},{"x":3909.1735,"y":3343.2008},{"x":3909.1735,"y":3346.7441},{"x":3907.205,"y":3346.7441}],"net":"GND"},{"layers":["F"],"pos":[3911.142,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3911.1418,"y":3344.9725},"polygon":[{"x":3910.158,"y":3343.2008},{"x":3912.1265,"y":3343.2008},{"x":3912.1265,"y":3346.7441},{"x":3910.158,"y":3346.7441}],"net":""},{"layers":["F"],"pos":[3914.096,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3914.0947,"y":3344.972},"polygon":[{"x":3913.112,"y":3343.2008},{"x":3915.0805,"y":3343.2008},{"x":3915.0805,"y":3346.7441},{"x":3913.112,"y":3346.7441}],"net":"+2.8V"},{"layers":["F"],"pos":[3917.049,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3917.0473,"y":3344.9718},"polygon":[{"x":3916.065,"y":3343.2008},{"x":3918.0335,"y":3343.2008},{"x":3918.0335,"y":3346.7441},{"x":3916.065,"y":3346.7441}],"net":"GND"},{"layers":["F"],"pos":[3920.001,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3920.0003,"y":3344.9722},"polygon":[{"x":3919.017,"y":3343.2008},{"x":3920.9855,"y":3343.2008},{"x":3920.9855,"y":3346.7441},{"x":3919.017,"y":3346.7441}],"net":"+2.8V"},{"layers":["F"],"pos":[3922.954,3344.972],"size":[1.9685,3.5433],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3922.9528,"y":3344.972},"polygon":[{"x":3921.97,"y":3343.2008},{"x":3923.9385,"y":3343.2008},{"x":3923.9385,"y":3346.7441},{"x":3921.97,"y":3346.7441}],"net":""}],"drawings":[],"layer":"F"},{"ref":"C47","center":[3961.3387,3349.5],"bbox":{"pos":[3961.3387,3349.5],"angle":270,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008209867,5.612100000000282]},"pads":[{"layers":["F"],"pos":[3961.339,3352.256],"size":[3.1496,3.5433],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3961.3387,"y":3352.2555},"polygon":[{"x":3963.1104,"y":3350.6811},{"x":3963.1104,"y":3353.8307},{"x":3959.567,"y":3353.8307},{"x":3959.567,"y":3350.6811}],"net":"LINPUT1"},{"layers":["F"],"pos":[3961.339,3346.744],"size":[3.1496,3.5433],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3961.3387,"y":3346.7445},"polygon":[{"x":3963.1104,"y":3345.1693},{"x":3963.1104,"y":3348.3189},{"x":3959.567,"y":3348.3189},{"x":3959.567,"y":3345.1693}],"net":"C47_1"}],"drawings":[],"layer":"F"},{"ref":"C48","center":[3973.9371,3349.5],"bbox":{"pos":[3973.9371,3349.5],"angle":270,"relpos":[-5.533500004105008,-2.8166999999994005],"size":[11.006000008209412,5.612099999999828]},"pads":[{"layers":["F"],"pos":[3973.937,3352.256],"size":[3.1496,3.5433],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3973.9371,"y":3352.2555},"polygon":[{"x":3975.7088,"y":3350.6811},{"x":3975.7088,"y":3353.8307},{"x":3972.1654,"y":3353.8307},{"x":3972.1654,"y":3350.6811}],"net":"GND"},{"layers":["F"],"pos":[3973.937,3346.744],"size":[3.1496,3.5433],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3973.9371,"y":3346.7445},"polygon":[{"x":3975.7088,"y":3345.1693},{"x":3975.7088,"y":3348.3189},{"x":3972.1654,"y":3348.3189},{"x":3972.1654,"y":3345.1693}],"net":"C47_1"}],"drawings":[],"layer":"F"},{"ref":"C49","center":[3980.63,3349.5],"bbox":{"pos":[3980.63,3349.5],"angle":90,"relpos":[-5.533500004105463,-2.81670000000031],"size":[11.006000008209867,5.612100000000282]},"pads":[{"layers":["F"],"pos":[3980.63,3346.744],"size":[3.1496,3.5433],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3980.63,"y":3346.7445},"polygon":[{"x":3978.8583,"y":3348.3189},{"x":3978.8583,"y":3345.1693},{"x":3982.4017,"y":3345.1693},{"x":3982.4017,"y":3348.3189}],"net":"GND"},{"layers":["F"],"pos":[3980.63,3352.256],"size":[3.1496,3.5433],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3980.63,"y":3352.2555},"polygon":[{"x":3978.8583,"y":3353.8307},{"x":3978.8583,"y":3350.6811},{"x":3982.4017,"y":3350.6811},{"x":3982.4017,"y":3353.8307}],"net":"C49_1"}],"drawings":[],"layer":"F"},{"ref":"C50","center":[3954.6458,3349.5],"bbox":{"pos":[3954.6458,3349.5],"angle":270,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008209412,5.612100000000282]},"pads":[{"layers":["F"],"pos":[3954.646,3352.256],"size":[3.1496,3.5433],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3954.6458,"y":3352.2555},"polygon":[{"x":3956.4175,"y":3350.6811},{"x":3956.4175,"y":3353.8307},{"x":3952.8741,"y":3353.8307},{"x":3952.8741,"y":3350.6811}],"net":"C50_2"},{"layers":["F"],"pos":[3954.646,3346.744],"size":[3.1496,3.5433],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3954.6458,"y":3346.7445},"polygon":[{"x":3956.4175,"y":3345.1693},{"x":3956.4175,"y":3348.3189},{"x":3952.8741,"y":3348.3189},{"x":3952.8741,"y":3345.1693}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"C51","center":[3947.9529,3349.5],"bbox":{"pos":[3947.9529,3349.5],"angle":270,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008209867,5.612100000000282]},"pads":[{"layers":["F"],"pos":[3947.953,3352.256],"size":[3.1496,3.5433],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3947.9529,"y":3352.2555},"polygon":[{"x":3949.7246,"y":3350.6811},{"x":3949.7246,"y":3353.8307},{"x":3946.1812,"y":3353.8307},{"x":3946.1812,"y":3350.6811}],"net":"C50_2"},{"layers":["F"],"pos":[3947.953,3346.744],"size":[3.1496,3.5433],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3947.9529,"y":3346.7445},"polygon":[{"x":3949.7246,"y":3345.1693},{"x":3949.7246,"y":3348.3189},{"x":3946.1812,"y":3348.3189},{"x":3946.1812,"y":3345.1693}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"C52","center":[4091.6534,3349.5],"bbox":{"pos":[4091.6534,3349.5],"angle":90,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008209412,5.612100000000282]},"pads":[{"layers":["F"],"pos":[4091.653,3346.744],"size":[3.1496,3.5433],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4091.6534,"y":3346.7445},"polygon":[{"x":4089.8817,"y":3348.3189},{"x":4089.8817,"y":3345.1693},{"x":4093.4251,"y":3345.1693},{"x":4093.4251,"y":3348.3189}],"net":"GND"},{"layers":["F"],"pos":[4091.653,3352.256],"size":[3.1496,3.5433],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4091.6534,"y":3352.2555},"polygon":[{"x":4089.8817,"y":3353.8307},{"x":4089.8817,"y":3350.6811},{"x":4093.4251,"y":3350.6811},{"x":4093.4251,"y":3353.8307}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"C53","center":[4084.9605,3349.5],"bbox":{"pos":[4084.9605,3349.5],"angle":90,"relpos":[-5.533500004105463,-2.81670000000031],"size":[11.006000008209412,5.612100000000282]},"pads":[{"layers":["F"],"pos":[4084.961,3346.744],"size":[3.1496,3.5433],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4084.9605,"y":3346.7445},"polygon":[{"x":4083.1888,"y":3348.3189},{"x":4083.1888,"y":3345.1693},{"x":4086.7322,"y":3345.1693},{"x":4086.7322,"y":3348.3189}],"net":"GND"},{"layers":["F"],"pos":[4084.961,3352.256],"size":[3.1496,3.5433],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4084.9605,"y":3352.2555},"polygon":[{"x":4083.1888,"y":3353.8307},{"x":4083.1888,"y":3350.6811},{"x":4086.7322,"y":3350.6811},{"x":4086.7322,"y":3353.8307}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"C54","center":[4058.9763,3349.5],"bbox":{"pos":[4058.9763,3349.5],"angle":270,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008209867,5.612100000000282]},"pads":[{"layers":["F"],"pos":[4058.976,3352.256],"size":[3.1496,3.5433],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4058.9763,"y":3352.2555},"polygon":[{"x":4060.748,"y":3350.6811},{"x":4060.748,"y":3353.8307},{"x":4057.2046,"y":3353.8307},{"x":4057.2046,"y":3350.6811}],"net":"GND"},{"layers":["F"],"pos":[4058.976,3346.744],"size":[3.1496,3.5433],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4058.9763,"y":3346.7445},"polygon":[{"x":4060.748,"y":3345.1693},{"x":4060.748,"y":3348.3189},{"x":4057.2046,"y":3348.3189},{"x":4057.2046,"y":3345.1693}],"net":"L6_2"}],"drawings":[],"layer":"F"},{"ref":"C55","center":[4065.6692,3349.5],"bbox":{"pos":[4065.6692,3349.5],"angle":90,"relpos":[-5.533500004105008,-2.816699999999855],"size":[11.006000008209867,5.612099999999828]},"pads":[{"layers":["F"],"pos":[4065.669,3346.744],"size":[3.1496,3.5433],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4065.6692,"y":3346.7445},"polygon":[{"x":4063.8975,"y":3348.3189},{"x":4063.8975,"y":3345.1693},{"x":4067.4409,"y":3345.1693},{"x":4067.4409,"y":3348.3189}],"net":"GND"},{"layers":["F"],"pos":[4065.669,3352.256],"size":[3.1496,3.5433],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4065.6692,"y":3352.2555},"polygon":[{"x":4063.8975,"y":3353.8307},{"x":4063.8975,"y":3350.6811},{"x":4067.4409,"y":3350.6811},{"x":4067.4409,"y":3353.8307}],"net":"L6_1"}],"drawings":[],"layer":"F"},{"ref":"C56","center":[4078.2676,3349.5],"bbox":{"pos":[4078.2676,3349.5],"angle":90,"relpos":[-5.533500004105008,-2.81670000000031],"size":[11.006000008208957,5.612100000000282]},"pads":[{"layers":["F"],"pos":[4078.268,3346.744],"size":[3.1496,3.5433],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4078.2676,"y":3346.7445},"polygon":[{"x":4076.4959,"y":3348.3189},{"x":4076.4959,"y":3345.1693},{"x":4080.0393,"y":3345.1693},{"x":4080.0393,"y":3348.3189}],"net":"RINPUT1"},{"layers":["F"],"pos":[4078.268,3352.256],"size":[3.1496,3.5433],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4078.2676,"y":3352.2555},"polygon":[{"x":4076.4959,"y":3353.8307},{"x":4076.4959,"y":3350.6811},{"x":4080.0393,"y":3350.6811},{"x":4080.0393,"y":3353.8307}],"net":"L6_1"}],"drawings":[],"layer":"F"},{"ref":"D1","center":[4052.2834,3349.8937],"bbox":{"pos":[4052.2834,3349.8937],"angle":90,"relpos":[-4.330400000000736,-1.7716999999997824],"size":[8.661200000000008,3.5434000000000196]},"pads":[{"layers":["F"],"pos":[4052.283,3346.744],"size":[2.3622,2.3622],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4052.2834,"y":3346.7441},"polygon":[{"x":4053.4645,"y":3345.563},{"x":4053.4645,"y":3347.9252},{"x":4051.1023,"y":3347.9252},{"x":4051.1023,"y":3345.563}],"net":"TOF_L_4"},{"layers":["F"],"pos":[4052.283,3353.043],"size":[2.3622,2.3622],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4052.2834,"y":3353.0433},"polygon":[{"x":4051.1023,"y":3354.2244},{"x":4051.1023,"y":3351.8622},{"x":4053.4645,"y":3351.8622},{"x":4053.4645,"y":3354.2244}],"net":"TOF_ENL"}],"drawings":[],"layer":"F"},{"ref":"L5","center":[3967.6379,3349.5],"bbox":{"pos":[3967.6379,3349.5],"angle":270,"relpos":[-5.606699999999819,-2.637199999999666],"size":[11.160399999999754,5.201599999999871]},"pads":[{"layers":["F"],"pos":[3967.638,3346.744],"size":[3.1496,3.4016],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3967.6384,"y":3346.7445},"polygon":[{"x":3965.9376,"y":3348.3189},{"x":3965.9376,"y":3345.1693},{"x":3969.3392,"y":3345.1693},{"x":3969.3392,"y":3348.3189}],"net":"C47_1"},{"layers":["F"],"pos":[3967.638,3352.256],"size":[3.1496,3.4016],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3967.6384,"y":3352.2555},"polygon":[{"x":3965.9376,"y":3353.8307},{"x":3965.9376,"y":3350.6811},{"x":3969.3392,"y":3350.6811},{"x":3969.3392,"y":3353.8307}],"net":"C49_1"}],"drawings":[],"layer":"F"},{"ref":"L6","center":[4071.9684,3349.5],"bbox":{"pos":[4071.9684,3349.5],"angle":90,"relpos":[-5.606699999999819,-2.637200000000121],"size":[11.160399999999754,5.201599999999871]},"pads":[{"layers":["F"],"pos":[4071.968,3352.256],"size":[3.1496,3.4016],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4071.9679,"y":3352.2555},"polygon":[{"x":4073.6687,"y":3350.6811},{"x":4073.6687,"y":3353.8307},{"x":4070.2671,"y":3353.8307},{"x":4070.2671,"y":3350.6811}],"net":"L6_1"},{"layers":["F"],"pos":[4071.968,3346.744],"size":[3.1496,3.4016],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4071.9679,"y":3346.7445},"polygon":[{"x":4073.6687,"y":3345.1693},{"x":4073.6687,"y":3348.3189},{"x":4070.2671,"y":3348.3189},{"x":4070.2671,"y":3345.1693}],"net":"L6_2"}],"drawings":[],"layer":"F"},{"ref":"MIC1","center":[3934.5671,3349.5],"bbox":{"pos":[3934.5671,3349.5],"angle":90,"relpos":[-5.999999999999545,-6.207300000000032],"size":[10.678199999999833,12.474199999999655]},"pads":[{"layers":["F"],"pos":[3930.768,3351.489],"size":[2.7559,2.7559],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3930.7679,"y":3351.4885},"polygon":[{"x":3929.3901,"y":3352.867},{"x":3929.3901,"y":3350.111},{"x":3932.1461,"y":3350.111},{"x":3932.1461,"y":3352.867}],"net":"C49_1"},{"layers":["F"],"pos":[3938.366,3351.489],"size":[2.7559,2.7559],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3938.3663,"y":3351.4885},"polygon":[{"x":3936.9881,"y":3352.867},{"x":3936.9881,"y":3350.111},{"x":3939.7441,"y":3350.111},{"x":3939.7441,"y":3352.867}],"net":"GND"},{"layers":["F"],"pos":[3938.366,3347.511],"size":[2.7559,2.7559],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3938.3663,"y":3347.5115},"polygon":[{"x":3936.9881,"y":3348.889},{"x":3936.9881,"y":3346.133},{"x":3939.7441,"y":3346.133},{"x":3939.7441,"y":3348.889}],"net":"GND"},{"layers":["F"],"pos":[3930.768,3347.511],"size":[2.7559,2.7559],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3930.7679,"y":3347.5115},"polygon":[{"x":3929.3901,"y":3348.889},{"x":3929.3901,"y":3346.133},{"x":3932.1461,"y":3346.133},{"x":3932.1461,"y":3348.889}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"MIC2","center":[4105.4329,3349.5],"bbox":{"pos":[4105.4329,3349.5],"angle":270,"relpos":[-6.0000000000009095,-6.207300000000032],"size":[10.678200000001198,12.474199999999655]},"pads":[{"layers":["F"],"pos":[4109.232,3347.511],"size":[2.7559,2.7559],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4109.2321,"y":3347.5115},"polygon":[{"x":4110.6099,"y":3346.133},{"x":4110.6099,"y":3348.889},{"x":4107.8539,"y":3348.889},{"x":4107.8539,"y":3346.133}],"net":"L6_2"},{"layers":["F"],"pos":[4101.634,3347.511],"size":[2.7559,2.7559],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4101.6337,"y":3347.5115},"polygon":[{"x":4103.0119,"y":3346.133},{"x":4103.0119,"y":3348.889},{"x":4100.2559,"y":3348.889},{"x":4100.2559,"y":3346.133}],"net":"GND"},{"layers":["F"],"pos":[4101.634,3351.489],"size":[2.7559,2.7559],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4101.6337,"y":3351.4885},"polygon":[{"x":4103.0119,"y":3350.111},{"x":4103.0119,"y":3352.867},{"x":4100.2559,"y":3352.867},{"x":4100.2559,"y":3350.111}],"net":"GND"},{"layers":["F"],"pos":[4109.232,3351.489],"size":[2.7559,2.7559],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4109.2321,"y":3351.4885},"polygon":[{"x":4110.6099,"y":3350.111},{"x":4110.6099,"y":3352.867},{"x":4107.8539,"y":3352.867},{"x":4107.8539,"y":3350.111}],"net":"+3.3V"}],"drawings":[],"layer":"F"},{"ref":"Q1","center":[4002.2835,3349.5],"bbox":{"pos":[4002.2835,3349.5],"angle":0,"relpos":[-5.620499999999993,-5.4334499999999935],"size":[9.857500000000073,10.866900000000442]},"pads":[{"layers":["F"],"pos":[3999.725,3353.398],"size":[1.378,3.0709],"angle":0,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3999.7244,"y":3353.3977},"polygon":[{"x":3999.0355,"y":3351.8622},{"x":4000.4135,"y":3351.8622},{"x":4000.4135,"y":3354.933},{"x":3999.0355,"y":3354.933}],"net":"TOF_L_5"},{"layers":["F"],"pos":[4002.284,3353.398],"size":[1.378,3.0709],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4002.2835,"y":3353.3977},"polygon":[{"x":4001.5945,"y":3351.8622},{"x":4002.9725,"y":3351.8622},{"x":4002.9725,"y":3354.933},{"x":4001.5945,"y":3354.933}],"net":"+2.8V"},{"layers":["F"],"pos":[4004.842,3353.398],"size":[1.378,3.0709],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4004.8426,"y":3353.3977},"polygon":[{"x":4004.1535,"y":3351.8622},{"x":4005.5315,"y":3351.8622},{"x":4005.5315,"y":3354.933},{"x":4004.1535,"y":3354.933}],"net":"TOF_SDA"},{"layers":["F"],"pos":[4004.842,3345.602],"size":[1.378,3.0709],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4004.8426,"y":3345.6023},"polygon":[{"x":4004.1535,"y":3344.067},{"x":4005.5315,"y":3344.067},{"x":4005.5315,"y":3347.1378},{"x":4004.1535,"y":3347.1378}],"net":"TOF_L_6"},{"layers":["F"],"pos":[4002.284,3345.602],"size":[1.378,3.0709],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4002.2835,"y":3345.6023},"polygon":[{"x":4001.5945,"y":3344.067},{"x":4002.9725,"y":3344.067},{"x":4002.9725,"y":3347.1378},{"x":4001.5945,"y":3347.1378}],"net":"+2.8V"},{"layers":["F"],"pos":[3999.725,3345.602],"size":[1.378,3.0709],"angle":0,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3999.7244,"y":3345.6023},"polygon":[{"x":3999.0355,"y":3344.067},{"x":4000.4135,"y":3344.067},{"x":4000.4135,"y":3347.1378},{"x":3999.0355,"y":3347.1378}],"net":"TOF_SCL"}],"drawings":[],"layer":"F"},{"ref":"R1","center":[3987.7166,3349.5],"bbox":{"pos":[3987.7166,3349.5],"angle":90,"relpos":[-5.905999999999949,-3.150000000000091],"size":[11.81100000000015,6.299999999999727]},"pads":[{"layers":["F"],"pos":[3987.717,3352.256],"size":[3.937,4.3307],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3987.7166,"y":3352.256},"polygon":[{"x":3985.5513,"y":3354.2248},{"x":3985.5513,"y":3350.2878},{"x":3989.882,"y":3350.2878},{"x":3989.882,"y":3354.2248}],"net":"R1_1"},{"layers":["F"],"pos":[3987.717,3346.745],"size":[3.937,4.3307],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3987.7166,"y":3346.744},"polygon":[{"x":3985.5513,"y":3348.713},{"x":3985.5513,"y":3344.776},{"x":3989.882,"y":3344.776},{"x":3989.882,"y":3348.713}],"net":"+2.8V"}],"drawings":[],"layer":"F"},{"ref":"R77","center":[4045.9842,3349.8937],"bbox":{"pos":[4045.9842,3349.8937],"angle":270,"relpos":[-5.905999999999949,-3.150000000000091],"size":[11.810999999999694,6.300000000000182]},"pads":[{"layers":["F"],"pos":[4045.984,3347.137],"size":[3.937,4.3307],"angle":-270,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4045.9842,"y":3347.1377},"polygon":[{"x":4048.1495,"y":3345.1689},{"x":4048.1495,"y":3349.1059},{"x":4043.8188,"y":3349.1059},{"x":4043.8188,"y":3345.1689}],"net":"TOF_L_4"},{"layers":["F"],"pos":[4045.984,3352.649],"size":[3.937,4.3307],"angle":-270,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4045.9842,"y":3352.6497},"polygon":[{"x":4048.1495,"y":3350.6807},{"x":4048.1495,"y":3354.6177},{"x":4043.8188,"y":3354.6177},{"x":4043.8188,"y":3350.6807}],"net":"+2.8V"}],"drawings":[],"layer":"F"},{"ref":"R53","center":[4039.2913,3349.8937],"bbox":{"pos":[4039.2913,3349.8937],"angle":90,"relpos":[-5.453099999999722,-2.6007999999997082],"size":[10.906199999999899,5.201599999999871]},"pads":[{"layers":["F"],"pos":[4039.291,3346.928],"size":[3.1751,3.4016],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4039.2913,"y":3346.9282},"polygon":[{"x":4040.9921,"y":3348.5157},{"x":4037.5905,"y":3348.5157},{"x":4037.5905,"y":3345.3406},{"x":4040.9921,"y":3345.3406}],"net":"TOF_L_6"},{"layers":["F"],"pos":[4039.291,3352.859],"size":[3.1751,3.4016],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4039.2913,"y":3352.8592},"polygon":[{"x":4040.9921,"y":3351.2717},{"x":4037.5905,"y":3351.2717},{"x":4037.5905,"y":3354.4468},{"x":4040.9921,"y":3354.4468}],"net":"+2.8V"}],"drawings":[],"layer":"F"},{"ref":"R56","center":[3994.4095,3349.5],"bbox":{"pos":[3994.4095,3349.5],"angle":90,"relpos":[-5.453100000000177,-2.600800000000163],"size":[10.906200000000354,5.201599999999871]},"pads":[{"layers":["F"],"pos":[3994.409,3346.534],"size":[3.1751,3.4016],"angle":-90,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3994.4095,"y":3346.5345},"polygon":[{"x":3996.1103,"y":3348.122},{"x":3992.7087,"y":3348.122},{"x":3992.7087,"y":3344.9469},{"x":3996.1103,"y":3344.9469}],"net":"+2.8V"},{"layers":["F"],"pos":[3994.409,3352.466],"size":[3.1751,3.4016],"angle":-90,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":3994.4095,"y":3352.4655},"polygon":[{"x":3996.1103,"y":3350.878},{"x":3992.7087,"y":3350.878},{"x":3992.7087,"y":3354.0531},{"x":3996.1103,"y":3354.0531}],"net":"TOF_L_5"}],"drawings":[],"layer":"F"},{"ref":"TOF_L","center":[4131.8108,3349.5],"bbox":{"pos":[4131.8108,3349.5],"angle":180,"relpos":[-3.937199999999393,-7.086999999999534],"size":[20.867199999999684,14.568000412460606]},"pads":[{"layers":["F"],"pos":[4131.811,3344.972],"size":[1.9685,3.5433],"angle":-180,"pin1":1,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4131.8108,"y":3344.9727},"polygon":[{"x":4132.795,"y":3346.7441},{"x":4130.8265,"y":3346.7441},{"x":4130.8265,"y":3343.2008},{"x":4132.795,"y":3343.2008}],"net":""},{"layers":["F"],"pos":[4128.858,3344.972],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4128.8582,"y":3344.9727},"polygon":[{"x":4129.842,"y":3346.7441},{"x":4127.8735,"y":3346.7441},{"x":4127.8735,"y":3343.2008},{"x":4129.842,"y":3343.2008}],"net":""},{"layers":["F"],"pos":[4125.904,3344.972],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4125.9053,"y":3344.9727},"polygon":[{"x":4126.888,"y":3346.7441},{"x":4124.9195,"y":3346.7441},{"x":4124.9195,"y":3343.2008},{"x":4126.888,"y":3343.2008}],"net":""},{"layers":["F"],"pos":[4122.951,3344.972],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4122.9527,"y":3344.9737},"polygon":[{"x":4123.935,"y":3346.7441},{"x":4121.9665,"y":3346.7441},{"x":4121.9665,"y":3343.2008},{"x":4123.935,"y":3343.2008}],"net":"TOF_L_4"},{"layers":["F"],"pos":[4119.999,3344.972],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4119.9997,"y":3344.9727},"polygon":[{"x":4120.983,"y":3346.7441},{"x":4119.0145,"y":3346.7441},{"x":4119.0145,"y":3343.2008},{"x":4120.983,"y":3343.2008}],"net":"TOF_L_5"},{"layers":["F"],"pos":[4117.046,3344.972],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4117.0472,"y":3344.9727},"polygon":[{"x":4118.03,"y":3346.7441},{"x":4116.0615,"y":3346.7441},{"x":4116.0615,"y":3343.2008},{"x":4118.03,"y":3343.2008}],"net":"TOF_L_6"},{"layers":["F"],"pos":[4131.811,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4131.8108,"y":3354.0273},"polygon":[{"x":4132.795,"y":3355.7992},{"x":4130.8265,"y":3355.7992},{"x":4130.8265,"y":3352.2559},{"x":4132.795,"y":3352.2559}],"net":"GND"},{"layers":["F"],"pos":[4128.858,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4128.8582,"y":3354.0275},"polygon":[{"x":4129.842,"y":3355.7992},{"x":4127.8735,"y":3355.7992},{"x":4127.8735,"y":3352.2559},{"x":4129.842,"y":3352.2559}],"net":""},{"layers":["F"],"pos":[4125.904,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4125.9053,"y":3354.028},"polygon":[{"x":4126.888,"y":3355.7992},{"x":4124.9195,"y":3355.7992},{"x":4124.9195,"y":3352.2559},{"x":4126.888,"y":3352.2559}],"net":"+2.8V"},{"layers":["F"],"pos":[4122.951,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4122.9527,"y":3354.0282},"polygon":[{"x":4123.935,"y":3355.7992},{"x":4121.9665,"y":3355.7992},{"x":4121.9665,"y":3352.2559},{"x":4123.935,"y":3352.2559}],"net":"GND"},{"layers":["F"],"pos":[4119.999,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4119.9997,"y":3354.0278},"polygon":[{"x":4120.983,"y":3355.7992},{"x":4119.0145,"y":3355.7992},{"x":4119.0145,"y":3352.2559},{"x":4120.983,"y":3352.2559}],"net":"+2.8V"},{"layers":["F"],"pos":[4117.046,3354.028],"size":[1.9685,3.5433],"angle":-180,"shape":"rect","type":"smd","drillsize":[0,0],"holeCenterPoint":{"x":4117.0472,"y":3354.028},"polygon":[{"x":4118.03,"y":3355.7992},{"x":4116.0615,"y":3355.7992},{"x":4116.0615,"y":3352.2559},{"x":4118.03,"y":3352.2559}],"net":""}],"drawings":[],"layer":"F"}],"metadata":{"title":"PCB_Doly_CE_Bumper","revision":"0","company":"Unknown Company","date":"2023-04-03"},"tracks":{"F":[{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3980.63,3346.744 3981.4175,3345.9565 3981.4175,3342.4133"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3968.819,3356.587 3967.6384,3357.7676 3930.6299,3357.7676 3926.2993,3353.437 3926.2993,3351.0747 3923.9373,3348.7126 3921.1814,3348.7126 3920.0012,3347.5325 3920.0012,3344.9719"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3914.49,3336.9 3910.95,3336.9 3908.19,3339.66 3908.19,3344.97"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":2.3622,"svgpath":"M4088.11,3356.19 4088.11,3352.26 4091.65,3352.26"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4091.65,3352.26 4091.65,3353.83 4094.41,3356.59 4107.4,3356.59 4109.23,3354.76 4109.23,3351.49"},{"type":"polyline","net":"C49_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3930.77,3351.49 3930.77,3352 3934.5701,3355.8 3964.095,3355.8 3967.639,3352.256"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3951.8899,3343.988 3951.8899,3345.563 3953.0709,3346.744 3954.646,3346.744"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3930.77,3347.51 3930.77,3346.6101 3934.5701,3342.8101 3944.0191,3342.8101 3947.953,3346.744"},{"type":"polyline","net":"C50_2","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3947.9529,3352.2561 3954.6459,3352.2561 3954.646,3352.256"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3954.646,3346.744 3947.953,3346.744 3947.9529,3346.7439"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4097.5589,3350.2874 4098.7605,3351.489 4101.6339,3351.489"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4130.6297,3360.1299 4131.8108,3358.9488 4131.8108,3354.028"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3944.016,3348.713 3942.814,3347.511 3938.3662,3347.511"},{"type":"polyline","net":"RINPUT1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4078.2676,3346.744 4078.2676,3343.5945"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4084.96,3346.74 4081.81,3349.89 4081.81,3355.01 4080.63,3356.19 4061.34,3356.19 4058.98,3353.83 4058.98,3352.26"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4120,3354.03 4120,3357.37 4121.18,3358.56 4124.33,3358.56 4125.9,3356.98 4125.9,3354.03"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4122.9508,3354.028 4122.9508,3351.2734 4124.3305,3349.8937 4130.236,3349.8937 4131.8108,3351.4685 4131.8108,3354.028"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3908.1892,3344.9719 3908.1892,3339.6575 3916.0632,3331.7834 3965.6694,3331.7834 3980.63,3346.744"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3914.1,3344.97 3914.09,3341.63 3915.67,3340.05 3918.43,3340.05 3920,3341.63 3920,3344.97"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3917.05,3344.97 3917.05,3346.94 3915.67,3348.32 3909.37,3348.32 3908.19,3347.14 3908.19,3344.97"},{"type":"polyline","net":"TOF_L_4","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4052.2839,3346.7439 4046.3781,3346.7439 4045.984,3347.138"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4039.291,3352.86 4039.5011,3352.6499 4045.9839,3352.6499"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3994.41,3346.534 3994.1989,3346.7451 3987.717,3346.7451"},{"type":"polyline","net":"TOF_L_5","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3999.724,3353.398 3998.7921,3352.4661 3994.4099,3352.4661"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3973.937,3352.2561 3979.4491,3346.744 3980.63,3346.744"},{"type":"polyline","net":"C47_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3967.6389,3346.7439 3973.9369,3346.7439 3973.937,3346.744"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3938.3661,3351.489 3938.3661,3347.511"},{"type":"polyline","net":"C47_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3967.639,3346.744 3961.3392,3346.744 3961.3391,3346.7439"},{"type":"polyline","net":"L6_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4071.9684,3352.2555 4078.2676,3352.256"},{"type":"polyline","net":"L6_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4065.6692,3352.256 4071.9684,3352.2555"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4058.9763,3352.256 4064.4883,3346.744 4065.6692,3346.744"},{"type":"polyline","net":"L6_2","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4071.9684,3346.7445 4071.9684,3343.2008 4068.4251,3339.6575 4060.5511,3339.6575 4058.9763,3341.2323 4058.9763,3346.744"},{"type":"polyline","net":"L6_2","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4109.2319,3347.511 4108.1683,3347.511 4100.7085,3340.0512 4075.5117,3340.0512 4071.9684,3343.5945 4071.9684,3346.7445"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4101.6339,3347.511 4101.6339,3351.489"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4091.6534,3346.744 4092.4204,3347.511 4101.6339,3347.511"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4084.9605,3346.744 4091.6534,3346.744"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4084.9605,3352.256 4091.6534,3352.256"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.827,3341.626 4055.8301,3341.6291 4055.8301,3349.1101 4058.98,3352.26"},{"type":"polyline","net":"TOF_ENL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4052.2839,3353.043 4054.647,3355.406 4055.039,3355.406"},{"type":"polyline","net":"LINPUT1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3961.339,3352.256 3958.1892,3349.1062 3958.1892,3343.4907 3958.1892,3340.8394 3951.8899,3334.54 3927.0901,3334.54"},{"type":"polyline","net":"TOF_SCL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3999.72,3345.6 3999.72,3344.58 3998.35,3343.2 3998.35,3342.02"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3994.41,3346.53 3995.77,3346.53 3998.35,3349.11 4001,3349.11 4002.28,3347.83 4002.28,3345.6"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4002.2831,3353.398 4002.2831,3345.602"},{"type":"polyline","net":"TOF_L_6","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4004.84,3345.6 4004.84,3341.43 4012.52,3333.75 4103.46,3333.75 4114.68,3344.97 4117.05,3344.97"},{"type":"polyline","net":"TOF_L_6","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4004.84,3345.6 4013.15,3337.3 4037.16,3337.3 4039.29,3339.43 4039.29,3346.93"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":2.3622,"svgpath":"M4045.98,3352.65 4045.98,3353.44 4040.08,3353.44 4036.93,3356.59"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4045.984,3352.65 4054.2539,3360.9199 4116.46,3360.9199 4120,3357.3799 4120,3354.03"},{"type":"polyline","net":"C49_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3967.64,3352.26 3968.43,3352.26 3973.15,3356.98 3978.43,3356.98 3980.63,3354.78 3980.63,3352.26"},{"type":"polyline","net":"TOF_L_5","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3920,3354.03 3920,3351.47 3918.82,3350.29 3906.22,3350.29 3903.86,3352.65 3903.86,3356.19 3905.83,3358.16 3913.31,3358.16 3920.4,3365.25 3982.2,3365.25 3994.41,3353.04 3994.41,3352.47"},{"type":"polyline","net":"R1_1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3917.05,3354.03 3917.05,3357.57 3922.76,3363.28 3981.02,3363.28 3987.72,3356.59 3987.72,3352.26"},{"type":"polyline","net":"TOF_L_6","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3922.95,3354.03 3922.95,3356.78 3927.48,3361.31 3979.84,3361.31 3984.17,3356.98 3984.17,3343.99 3988.51,3339.65 4003,3339.65 4004.84,3341.49 4004.84,3345.6"},{"type":"polyline","net":"TOF_SDA","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4004.842,3353.3979 4004.842,3355.2083 4009.7638,3360.13 4027.874,3360.13"},{"type":"polyline","net":"TOF_L_5","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3999.72,3353.4 3999.72,3356.78 4008.19,3365.25 4131.02,3365.25 4138.11,3358.16 4138.11,3343.59 4133.78,3339.26 4122.76,3339.26 4120,3342.02 4120,3344.97"},{"type":"polyline","net":"TOF_L_4","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4122.95,3344.97 4123.15,3345.17 4123.15,3346.74 4121.18,3348.71 4115.28,3348.71 4102.28,3335.72 4056.29,3335.72 4052.28,3339.73 4052.28,3346.74"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4002.28,3353.4 4002.28,3356.19 4008.98,3362.89 4030.63,3362.89 4036.93,3356.59"},{"start":[3927.087,3334.539],"end":[3927.087,3334.539],"width":2.4,"net":"LINPUT1"},{"start":[4027.874,3360.13],"end":[4027.874,3360.13],"width":2.4,"net":"TOF_SDA"},{"start":[3998.347,3342.02],"end":[3998.347,3342.02],"width":2.4,"net":"TOF_SCL"},{"start":[4036.929,3356.587],"end":[4036.929,3356.587],"width":2.4,"net":"+2.8V"},{"start":[3951.89,3343.988],"end":[3951.89,3343.988],"width":2.4,"net":"+3.3V"},{"start":[4088.11,3356.193],"end":[4088.11,3356.193],"width":2.4,"net":"+3.3V"},{"start":[4078.268,3343.595],"end":[4078.268,3343.595],"width":2.4,"net":"RINPUT1"},{"start":[4055.039,3355.406],"end":[4055.039,3355.406],"width":2.4,"net":"TOF_ENL"},{"start":[3968.819,3356.587],"end":[3968.819,3356.587],"width":2.4,"net":"+2.8V"},{"start":[3914.488,3336.902],"end":[3914.488,3336.902],"width":2.4,"net":"GND"},{"start":[3944.016,3348.713],"end":[3944.016,3348.713],"width":2.4,"net":"GND"},{"start":[3917.685,3336.902],"end":[3917.685,3336.902],"width":2.4,"net":"GND"},{"start":[4130.63,3360.13],"end":[4130.63,3360.13],"width":2.4,"net":"GND"},{"start":[4097.559,3350.287],"end":[4097.559,3350.287],"width":2.4,"net":"GND"},{"start":[4055.827,3341.626],"end":[4055.827,3341.626],"width":2.4,"net":"GND"},{"start":[3981.417,3342.413],"end":[3981.417,3342.413],"width":2.4,"net":"GND"}],"B":[{"type":"polyline","net":"TOF_SCL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3998.347,3342.02 3988.5,3342.02 3971.1799,3359.3401 3950.3201,3359.3401 3941.45,3350.47 3941.45,3340.1499"},{"type":"polyline","net":"RINPUT1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4078.27,3343.59 4082.2,3347.53 4089.68,3347.53 4094.02,3351.86 4094.02,3358.95 4087.72,3365.25 3944.02,3365.25 3933.57,3354.81 3933.57,3340.15"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3947.353,3340.1509 3947.353,3350.8687 3952.2837,3355.7993 3968.0313,3355.7993 3968.819,3356.587"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3943.42,3340.15 3943.42,3348.71 3944.02,3348.71"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4097.5591,3350.2874 4086.5354,3339.2639 4059.3701,3339.2639 4057.008,3341.626 4055.827,3341.626"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4130.6297,3360.1299 4120.7872,3350.2874 4097.5589,3350.2874"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3914.4884,3336.9016 3910.9451,3340.4449 3910.9451,3356.1929 3921.9687,3367.2165 3996.378,3367.2165 4065.6692,3367.2165 4112.5195,3367.2165 4119.6061,3360.1299 4130.6297,3360.1299"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3943.42,3340.15 3943.42,3336.3 3942.05,3334.93 3937.72,3334.93"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3931.6,3340.15 3931.6,3335.93 3932.6,3334.93 3934.17,3334.93 3935.54,3336.3 3935.54,3340.15"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3939.48,3340.15 3939.48,3336.7 3937.72,3334.93 3934.17,3334.93"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3927.6681,3340.1508 3927.4805,3340.3384 3927.4805,3343.5945 3929.0553,3345.1693 3930.2364,3345.1693 3931.6051,3343.8006 3931.6051,3340.1508"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3927.6681,3340.1508 3924.4189,3336.9016 3917.6853,3336.9016"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3917.6853,3336.9016 3914.4884,3336.9016"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3949.321,3340.1509 3949.321,3343.7815 3949.5276,3343.988 3951.89,3343.988"},{"type":"polyline","net":"LINPUT1","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3927.087,3334.539 3929.636,3337.088 3929.636,3340.1509"},{"type":"polyline","net":"+2.8V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4036.93,3356.59 4036.93,3342.02 4030.24,3335.33 3949.13,3335.33 3947.35,3337.11 3947.35,3340.15"},{"type":"polyline","net":"+3.3V","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3951.89,3343.99 3958.19,3337.69 4029.45,3337.69 4034.05,3342.29 4034.05,3358.04 4036.14,3360.13 4084.17,3360.13 4088.11,3356.19"},{"type":"polyline","net":"TOF_ENL","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4055.039,3355.406 4040.8667,3355.406 4040.196,3354.7354 4040.196,3340.9561 4032.6001,3333.3601 3948.3501,3333.3601 3945.3799,3336.3201 3945.3799,3340.1499"},{"type":"polyline","net":"TOF_SDA","start":[0,0],"end":[0,0],"width":1,"svgpath":"M4027.874,3360.13 4027.874,3361.311 3945.981,3361.311 3937.51,3352.8401 3937.51,3340.1499"},{"type":"polyline","net":"GND","start":[0,0],"end":[0,0],"width":1,"svgpath":"M3935.54,3340.15 3935.54,3353.23 3945.59,3363.28 4086.54,3363.28 4092.05,3357.77 4092.05,3352.65 4088.9,3349.5 4079.45,3349.5 4077.09,3347.14 4061.34,3347.14 4055.83,3341.63"},{"start":[3927.087,3334.539],"end":[3927.087,3334.539],"width":2.4,"net":"LINPUT1"},{"start":[4027.874,3360.13],"end":[4027.874,3360.13],"width":2.4,"net":"TOF_SDA"},{"start":[3998.347,3342.02],"end":[3998.347,3342.02],"width":2.4,"net":"TOF_SCL"},{"start":[4036.929,3356.587],"end":[4036.929,3356.587],"width":2.4,"net":"+2.8V"},{"start":[3951.89,3343.988],"end":[3951.89,3343.988],"width":2.4,"net":"+3.3V"},{"start":[4088.11,3356.193],"end":[4088.11,3356.193],"width":2.4,"net":"+3.3V"},{"start":[4078.268,3343.595],"end":[4078.268,3343.595],"width":2.4,"net":"RINPUT1"},{"start":[4055.039,3355.406],"end":[4055.039,3355.406],"width":2.4,"net":"TOF_ENL"},{"start":[3968.819,3356.587],"end":[3968.819,3356.587],"width":2.4,"net":"+2.8V"},{"start":[3914.488,3336.902],"end":[3914.488,3336.902],"width":2.4,"net":"GND"},{"start":[3944.016,3348.713],"end":[3944.016,3348.713],"width":2.4,"net":"GND"},{"start":[3917.685,3336.902],"end":[3917.685,3336.902],"width":2.4,"net":"GND"},{"start":[4130.63,3360.13],"end":[4130.63,3360.13],"width":2.4,"net":"GND"},{"start":[4097.559,3350.287],"end":[4097.559,3350.287],"width":2.4,"net":"GND"},{"start":[4055.827,3341.626],"end":[4055.827,3341.626],"width":2.4,"net":"GND"},{"start":[3981.417,3342.413],"end":[3981.417,3342.413],"width":2.4,"net":"GND"}]},"zones":{"F":[{"net":"GND","svgpath":"M 3940.72626 3354.28 L 3940.57318 3354.24955 3940.44341 3354.16284 3940.3567 3354.03307 3940.32626 3353.88 3940.3567 3353.72693 3940.44341 3353.59716 3940.53974 3353.50083 3940.66096 3353.30791 3940.73621 3353.09286 3940.76425 3352.84399 3940.76425 3352.42747 3939.30528 3352.42747 3939.30528 3353.88 3939.27483 3354.03307 3939.18812 3354.16284 3939.05835 3354.24955 3938.90528 3354.28 3937.82733 3354.28 3937.67425 3354.24955 3937.54448 3354.16284 3937.45777 3354.03307 3937.42733 3353.88 3937.42733 3352.42747 3935.96835 3352.42747 3935.96835 3352.84399 3935.99639 3353.09286 3936.07164 3353.30791 3936.19286 3353.50083 3936.28919 3353.59716 3936.3759 3353.72693 3936.40634 3353.88 3936.3759 3354.03307 3936.28919 3354.16284 3936.15942 3354.24955 3936.00634 3354.28 3935.36538 3354.28 3935.2123 3354.24955 3935.08254 3354.16285 3933.28301 3352.36337 3933.1963 3352.2336 3933.16585 3352.08052 3933.16585 3350.13301 3933.13781 3349.88414 3933.04962 3349.63211 3933.02717 3349.5 3933.04962 3349.36789 3933.13781 3349.11586 3933.16585 3348.86699 3933.16585 3346.52958 3933.1963 3346.3765 3933.28301 3346.24673 3935.08254 3344.44725 3935.2123 3344.36055 3935.36538 3344.3301 3936.84146 3344.3301 3937.00922 3344.36698 3937.14604 3344.47081 3937.22671 3344.62245 3937.23634 3344.79394 3937.17316 3344.95366 3937.04882 3345.07216 3936.88625 3345.12758 3936.76194 3345.14159 3936.54689 3345.21684 3936.35397 3345.33806 3936.19286 3345.49917 3936.07164 3345.69209 3935.99639 3345.90714 3935.96835 3346.15601 3935.96835 3346.57253 3937.42733 3346.57253 3937.42733 3344.7301 3937.45777 3344.57703 3937.54448 3344.44726 3937.67425 3344.36055 3937.82733 3344.3301 3938.90528 3344.3301 3939.05835 3344.36055 3939.18812 3344.44726 3939.27483 3344.57703 3939.30528 3344.7301 3939.30528 3346.57253 3940.76425 3346.57253 3940.76425 3346.15601 3940.73621 3345.90714 3940.66096 3345.69209 3940.53974 3345.49917 3940.37863 3345.33806 3940.18571 3345.21684 3939.97066 3345.14159 3939.84635 3345.12758 3939.68378 3345.07216 3939.55944 3344.95366 3939.49626 3344.79394 3939.50589 3344.62245 3939.58656 3344.47081 3939.72338 3344.36698 3939.89114 3344.3301 3943.22381 3344.3301 3943.37688 3344.36055 3943.50665 3344.44726 3945.04409 3345.9847 3945.1308 3346.11447 3945.16125 3346.26754 3945.16125 3348.29684 3945.18929 3348.54571 3945.26454 3348.76076 3945.38576 3348.95368 3945.54687 3349.11479 3945.62091 3349.16131 3945.73689 3349.27221 3945.79996 3349.41976 3945.79996 3349.58024 3945.73689 3349.72779 3945.62091 3349.83869 3945.54687 3349.88521 3945.38576 3350.04632 3945.26454 3350.23924 3945.18929 3350.45429 3945.16125 3350.70316 3945.16125 3353.80784 3945.14796 3354.00147 3945.06511 3354.14654 3944.93023 3354.24511 3944.76685 3354.28 3940.72626 3354.28 Z M 3935.96835 3350.13301 L 3935.96835 3350.54952 3937.42733 3350.54952 3937.42733 3348.45048 3935.96835 3348.45048 3935.96835 3348.86699 3935.99639 3349.11586 3936.08458 3349.36789 3936.10703 3349.5 3936.08458 3349.63211 3935.99639 3349.88414 3935.96835 3350.13301 Z M 3939.30528 3350.30945 L 3939.30528 3350.54952 3940.76425 3350.54952 3940.76425 3350.13301 3940.73621 3349.88414 3940.64802 3349.63211 3940.62557 3349.5 3940.64802 3349.36789 3940.73621 3349.11586 3940.76425 3348.86699 3940.76425 3348.45048 3939.30528 3348.45048 3939.30528 3350.30945 Z "},{"net":"GND","svgpath":"M 4130.37778 3363.69955 L 4130.22471 3363.73 4032.90529 3363.73 4032.75222 3363.69955 4032.62245 3363.61284 4032.53574 3363.48307 4032.50529 3363.33 4032.53574 3363.17693 4032.62245 3363.04716 4036.7554 3358.91421 4036.86919 3358.83453 4037.00338 3358.79857 4037.31433 3358.77137 4037.68786 3358.67128 4038.03834 3358.50785 4038.35511 3358.28605 4038.62855 3358.0126 4038.67275 3357.96008 4040.87457 3355.75826 4041.00434 3355.67155 4041.15741 3355.6411 4045.97914 3355.6411 4046.6552 3355.6382 4046.80919 3355.66832 4046.93975 3355.75536 4053.1652 3361.98081 4053.41051 3362.18212 4053.67296 3362.32241 4053.95774 3362.4088 4054.27355 3362.4399 4116.44035 3362.4399 4116.75616 3362.4088 4117.04094 3362.32241 4117.30339 3362.18212 4117.5487 3361.98081 4119.73439 3359.79511 4119.85553 3359.7121 4119.99845 3359.67839 4120.14391 3359.69854 4120.2723 3359.76982 4120.33129 3359.81865 4120.59315 3359.96005 4120.87756 3360.04763 4121.1924 3360.07998 4124.31035 3360.08 4124.62616 3360.0489 4124.91094 3359.96251 4125.17339 3359.82222 4125.41821 3359.62131 4126.96458 3358.0651 4127.16207 3357.82367 4127.30251 3357.56094 4127.3889 3357.27616 4127.39922 3357.17131 4127.44519 3357.02072 4127.54571 3356.89954 4127.68522 3356.82654 4127.89641 3356.81915 4129.81999 3356.81915 4130.06886 3356.79111 4130.20267 3356.74428 4130.33479 3356.72184 4130.4669 3356.74428 4130.60014 3356.79091 4130.84901 3356.81895 4131.06868 3356.81895 4131.06868 3355.11306 4130.95912 3355.02387 4130.88739 3354.90217 4130.86245 3354.76313 4130.86245 3353.29148 4130.88739 3353.15243 4130.95912 3353.03073 4131.06868 3352.94154 4131.06868 3351.23565 4130.84901 3351.23565 4130.60014 3351.26369 4130.46633 3351.31052 4130.33421 3351.33296 4130.2021 3351.31052 4130.06886 3351.26389 4129.81999 3351.23585 4127.89641 3351.23585 4127.64754 3351.26389 4127.51315 3351.31092 4127.38104 3351.33336 4127.24892 3351.31092 4127.11596 3351.26439 4126.86709 3351.23635 4124.94351 3351.23635 4124.69464 3351.26439 4124.56083 3351.31122 4124.42871 3351.33366 4124.2966 3351.31122 4124.16336 3351.26459 4123.91449 3351.23655 4123.69482 3351.23655 4123.69482 3352.94244 4123.80438 3353.03163 4123.87611 3353.15333 4123.90105 3353.29238 4123.90105 3354.76403 4123.87611 3354.90307 4123.80438 3355.02477 4123.69482 3355.11396 4123.69482 3356.64 4123.66438 3356.79307 4123.57767 3356.92284 4123.4479 3357.00955 4123.29482 3357.04 4122.61057 3357.04 4122.4575 3357.00955 4122.32773 3356.92284 4122.24102 3356.79307 4122.21058 3356.64 4122.21058 3355.11418 4122.10082 3355.025 4122.02895 3354.90321 4122.00395 3354.76403 4122.00395 3353.29237 4122.02895 3353.15319 4122.10082 3353.0314 4122.21058 3352.94222 4122.21058 3351.23655 4121.99091 3351.23655 4121.74204 3351.26459 4121.60888 3351.31119 4121.47677 3351.33363 4121.34466 3351.31119 4121.21036 3351.26419 4120.96149 3351.23615 4119.03791 3351.23615 4118.78904 3351.26419 4118.65528 3351.311 4118.52316 3351.33344 4118.39105 3351.311 4118.25786 3351.26439 4118.00899 3351.23635 4116.08541 3351.23635 4115.83654 3351.26439 4115.62149 3351.33964 4115.42857 3351.46086 4115.26746 3351.62197 4115.14624 3351.81489 4115.07099 3352.02994 4115.04295 3352.27881 4115.04295 3355.77719 4115.07099 3356.02606 4115.14624 3356.24111 4115.26746 3356.43403 4115.42857 3356.59514 4115.62149 3356.71636 4115.83654 3356.79161 4116.08541 3356.81965 4117.44496 3356.81965 4117.59803 3356.8501 4117.7278 3356.93681 4117.81451 3357.06658 4117.84496 3357.21965 4117.81451 3357.37272 4117.7278 3357.50249 4115.94755 3359.28274 4115.81778 3359.36945 4115.66471 3359.3999 4055.04919 3359.3999 4054.89612 3359.36945 4054.76635 3359.28274 4053.42803 3357.94443 4053.3402 3357.81192 4053.31092 3357.65567 4053.34481 3357.50035 4053.43653 3357.3705 4053.57157 3357.28663 4053.72863 3357.26198 4053.88287 3357.30045 4054.28213 3357.49061 4054.65407 3357.59027 4055.0393 3357.62397 4055.42453 3357.59027 4055.79806 3357.49018 4056.14854 3357.32675 4056.46531 3357.10495 4056.73875 3356.83151 4056.96055 3356.51474 4057.12398 3356.16426 4057.22407 3355.79073 4057.25777 3355.4055 4057.24724 3355.28516 4057.26695 3355.12172 4057.35081 3354.98006 4057.48462 3354.88418 4057.64572 3354.8503 4057.84047 3354.8503 4057.84047 3353.2929 4055.87447 3353.2929 4055.77758 3353.30305 4055.68112 3353.28948 4055.42453 3353.22073 4055.0393 3353.18703 4054.91936 3353.19752 4054.75592 3353.17782 4054.61426 3353.09395 4054.51838 3352.96014 4054.4845 3352.79904 4054.4845 3351.88466 4054.45646 3351.63579 4054.38121 3351.42074 4054.25999 3351.22782 4054.09888 3351.06671 4053.90596 3350.94549 4053.69091 3350.87024 4053.44204 3350.8422 4051.12476 3350.8422 4050.87589 3350.87024 4050.66084 3350.94549 4050.46792 3351.06671 4050.30681 3351.22782 4050.18559 3351.42074 4050.11034 3351.63579 4050.0823 3351.88466 4050.0823 3353.63301 4050.05185 3353.78608 4049.96514 3353.91585 4049.83537 3354.00256 4049.6823 3354.03301 4049.52923 3354.00256 4049.39946 3353.91585 4049.28671 3353.8031 4049.2 3353.67333 4049.16955 3353.52026 4049.16955 3350.70366 4049.14151 3350.45479 4049.06626 3350.23974 4048.98255 3350.10651 4048.92821 3349.96806 4048.92821 3349.81934 4048.98255 3349.68089 4049.06626 3349.54766 4049.14151 3349.33261 4049.16955 3349.08374 4049.16955 3348.6639 4049.2 3348.51083 4049.28671 3348.38106 4049.41648 3348.29435 4049.56955 3348.2639 4049.89995 3348.2639 4050.03206 3348.28635 4050.14935 3348.35117 4050.23864 3348.45109 4050.30681 3348.55958 4050.46792 3348.72069 4050.66084 3348.84191 4050.87589 3348.91716 4051.12476 3348.9452 4053.44204 3348.9452 4053.69091 3348.91716 4053.90596 3348.84191 4054.09888 3348.72069 4054.25999 3348.55958 4054.38121 3348.36666 4054.45646 3348.15161 4054.4845 3347.90274 4054.4845 3345.58546 4054.45646 3345.33659 4054.38121 3345.12154 4054.25999 3344.92862 4054.09888 3344.76751 4053.98719 3344.69733 4053.88727 3344.60803 4053.82245 3344.49075 4053.8 3344.35864 4053.8 3340.52529 4053.83045 3340.37222 4053.91716 3340.24245 4056.80245 3337.35716 4056.93222 3337.27045 4057.08529 3337.24 4101.48514 3337.24 4101.63814 3337.27042 4101.76788 3337.35705 4108.84687 3344.4306 4108.93364 3344.56036 4108.96414 3344.71345 4108.93372 3344.86655 4108.84702 3344.99636 4108.71724 3345.08309 4108.56414 3345.11355 4108.08614 3345.11355 4107.93307 3345.0831 4107.8033 3344.99639 4101.7972 3338.99029 4101.55189 3338.78898 4101.28944 3338.64869 4101.00466 3338.5623 4100.68885 3338.5312 4075.53135 3338.5312 4075.21554 3338.5623 4074.93076 3338.64869 4074.66831 3338.78898 4074.423 3338.99029 4072.44809 3340.9652 4072.31832 3341.05191 4072.16525 3341.08236 4072.01218 3341.05191 4071.88241 3340.9652 4069.5138 3338.59659 4069.26849 3338.39528 4069.00604 3338.25499 4068.72126 3338.1686 4068.40545 3338.1375 4060.57075 3338.1375 4060.25494 3338.1686 4059.97016 3338.25499 4059.70771 3338.39528 4059.4624 3338.59659 4057.91539 3340.1436 4057.71408 3340.38891 4057.57379 3340.65136 4057.4874 3340.93614 4057.4563 3341.25195 4057.4563 3343.76642 4057.43 3343.90906 4057.35456 3344.03295 4057.23989 3344.12179 4057.10109 3344.1639 4056.97824 3344.17774 4056.76319 3344.25299 4056.57027 3344.37421 4056.40916 3344.53532 4056.28794 3344.72824 4056.21269 3344.94329 4056.18465 3345.19216 4056.18465 3348.29684 4056.21269 3348.54571 4056.28794 3348.76076 4056.40916 3348.95368 4056.57027 3349.11479 4056.64431 3349.16131 4056.76029 3349.27221 4056.82336 3349.41976 4056.82336 3349.58024 4056.76029 3349.72779 4056.64431 3349.83869 4056.57027 3349.88521 4056.40916 3350.04632 4056.28794 3350.23924 4056.21269 3350.45429 4056.18465 3350.70316 4056.18465 3351.2181 4057.84047 3351.2181 4057.84047 3349.7393 4057.87092 3349.58623 4057.95763 3349.45646 4058.0874 3349.36975 4058.24048 3349.3393 4059.71213 3349.3393 4059.8652 3349.36975 4059.99497 3349.45646 4060.08168 3349.58623 4060.11213 3349.7393 4060.11213 3351.2181 4061.76795 3351.2181 4061.76795 3350.70316 4061.73991 3350.45429 4061.66466 3350.23924 4061.54344 3350.04632 4061.38233 3349.88521 4061.30829 3349.83869 4061.19231 3349.72779 4061.12924 3349.58024 4061.12924 3349.41976 4061.19231 3349.27221 4061.30829 3349.16131 4061.38233 3349.11479 4061.54344 3348.95368 4061.66466 3348.76076 4061.73991 3348.54571 4061.76795 3348.29684 4061.76795 3345.19216 4061.73991 3344.94329 4061.66466 3344.72824 4061.54344 3344.53532 4061.38233 3344.37421 4061.18941 3344.25299 4060.97436 3344.17774 4060.85151 3344.1639 4060.71271 3344.12179 4060.59804 3344.03295 4060.5226 3343.90906 4060.4963 3343.76642 4060.4963 3342.02759 4060.52675 3341.87452 4060.61346 3341.74475 4061.06355 3341.29466 4061.19332 3341.20795 4061.34639 3341.1775 4067.62981 3341.1775 4067.78288 3341.20795 4067.91265 3341.29466 4070.14988 3343.53188 4070.23828 3343.66581 4070.26693 3343.8237 4070.23123 3343.98015 4070.1369 3344.10997 4069.99915 3344.19228 4069.82564 3344.25299 4069.63272 3344.37421 4069.47161 3344.53532 4069.35039 3344.72824 4069.27514 3344.94329 4069.25146 3345.15347 4069.19931 3345.31053 4069.08805 3345.43304 4068.93672 3345.50003 4068.77123 3345.50003 4068.6199 3345.43304 4068.50864 3345.31053 4068.45649 3345.15347 4068.43281 3344.94329 4068.35756 3344.72824 4068.23634 3344.53532 4068.07523 3344.37421 4067.88231 3344.25299 4067.66726 3344.17774 4067.41839 3344.1497 4066.80503 3344.1497 4066.80503 3345.7071 4068.8471 3345.7071 4069.00017 3345.73755 4069.12994 3345.82426 4069.21665 3345.95403 4069.2471 3346.1071 4069.2471 3347.3819 4069.21665 3347.53497 4069.12994 3347.66474 4069.00017 3347.75145 4068.8471 3347.7819 4066.80503 3347.7819 4066.80503 3349.2607 4066.77458 3349.41377 4066.68787 3349.54354 4066.5581 3349.63025 4066.40503 3349.6607 4064.93337 3349.6607 4064.7803 3349.63025 4064.65053 3349.54354 4064.56382 3349.41377 4064.53337 3349.2607 4064.53337 3347.7819 4062.87755 3347.7819 4062.87755 3348.29684 4062.90559 3348.54571 4062.98084 3348.76076 4063.10206 3348.95368 4063.26317 3349.11479 4063.33721 3349.16131 4063.45319 3349.27221 4063.51626 3349.41976 4063.51626 3349.58024 4063.45319 3349.72779 4063.33721 3349.83869 4063.26317 3349.88521 4063.10206 3350.04632 4062.98084 3350.23924 4062.90559 3350.45429 4062.87755 3350.70316 4062.87755 3353.80784 4062.90559 3354.05671 4062.98084 3354.27176 4063.10206 3354.46468 4063.26317 3354.62579 4063.45609 3354.74701 4063.67114 3354.82226 4063.92001 3354.8503 4067.41839 3354.8503 4067.66726 3354.82226 4067.88231 3354.74701 4068.07523 3354.62579 4068.23634 3354.46468 4068.35756 3354.27176 4068.43738 3354.04364 4068.52171 3353.90369 4068.65496 3353.80913 4068.8149 3353.77575 4068.89298 3353.77574 4069.05295 3353.80911 4069.18623 3353.90367 4069.27057 3354.04363 4069.35039 3354.27176 4069.47161 3354.46468 4069.63272 3354.62579 4069.82564 3354.74701 4070.04069 3354.82226 4070.28956 3354.8503 4073.64624 3354.8503 4073.89511 3354.82226 4074.11016 3354.74701 4074.30308 3354.62579 4074.46419 3354.46468 4074.58541 3354.27176 4074.66523 3354.04363 4074.74957 3353.90367 4074.88285 3353.80911 4075.04282 3353.77574 4075.1219 3353.77575 4075.28184 3353.80913 4075.41509 3353.90369 4075.49942 3354.04364 4075.57924 3354.27176 4075.70046 3354.46468 4075.86157 3354.62579 4076.05449 3354.74701 4076.26954 3354.82226 4076.51841 3354.8503 4080.01679 3354.8503 4080.26566 3354.82226 4080.48071 3354.74701 4080.67363 3354.62579 4080.83474 3354.46468 4080.95596 3354.27176 4081.03121 3354.05671 4081.05925 3353.80784 4081.05925 3350.70316 4081.03121 3350.45429 4080.95596 3350.23924 4080.83474 3350.04632 4080.67363 3349.88521 4080.59959 3349.83869 4080.48361 3349.72779 4080.42054 3349.58024 4080.42054 3349.41976 4080.48361 3349.27221 4080.59959 3349.16131 4080.67363 3349.11479 4080.83474 3348.95368 4080.95596 3348.76076 4081.03121 3348.54571 4081.05925 3348.29684 4081.05925 3345.19216 4081.03121 3344.94329 4080.95596 3344.72824 4080.83474 3344.53532 4080.67363 3344.37421 4080.53153 3344.25369 4080.46679 3344.12343 4080.45291 3343.97863 4080.48647 3343.595 4080.45277 3343.20977 4080.35268 3342.83624 4080.18925 3342.48576 4079.9896 3342.20063 4079.92334 3342.04066 4079.93089 3341.86767 4080.01084 3341.71408 4080.14821 3341.60868 4080.31726 3341.5712 4099.91321 3341.5712 4100.06628 3341.60165 4100.19605 3341.68836 4102.9384 3344.43071 4103.02511 3344.56048 4103.05556 3344.71355 4103.02511 3344.86662 4102.9384 3344.99639 4102.80863 3345.0831 4102.65556 3345.11355 4102.57267 3345.11355 4102.57267 3346.57252 4104.03165 3346.57252 4104.03165 3346.48964 4104.0621 3346.33657 4104.14881 3346.2068 4104.27858 3346.12009 4104.43165 3346.08964 4104.58472 3346.12009 4104.71449 3346.2068 4106.71699 3348.2093 4106.8037 3348.33907 4106.83415 3348.49214 4106.83415 3348.86699 4106.86219 3349.11586 4106.95038 3349.36789 4106.97283 3349.5 4106.95038 3349.63211 4106.86219 3349.88414 4106.83415 3350.13301 4106.83415 3352.84399 4106.86219 3353.09286 4106.93744 3353.30791 4107.05866 3353.50083 4107.21977 3353.66194 4107.38382 3353.76502 4107.48925 3353.86139 4107.5541 3353.98867 4107.5701 3354.13061 4107.53519 3354.26913 4107.45385 3354.38655 4106.88755 3354.95284 4106.75778 3355.03955 4106.60471 3355.07 4095.20529 3355.07 4095.05222 3355.03955 4094.92245 3354.95284 4094.49346 3354.52385 4094.40968 3354.40097 4094.37658 3354.25597 4094.41701 3354.05671 4094.44505 3353.80784 4094.44505 3350.70316 4094.41701 3350.45429 4094.34176 3350.23924 4094.22054 3350.04632 4094.05943 3349.88521 4093.98539 3349.83869 4093.86941 3349.72779 4093.80634 3349.58024 4093.80634 3349.41976 4093.86941 3349.27221 4093.98539 3349.16131 4094.05943 3349.11479 4094.22054 3348.95368 4094.34176 3348.76076 4094.41701 3348.54571 4094.44505 3348.29684 4094.44505 3347.7819 4092.78923 3347.7819 4092.78923 3349.2607 4092.75878 3349.41377 4092.67207 3349.54354 4092.5423 3349.63025 4092.38923 3349.6607 4090.91757 3349.6607 4090.7645 3349.63025 4090.63473 3349.54354 4090.54802 3349.41377 4090.51757 3349.2607 4090.51757 3347.7819 4088.86175 3347.7819 4088.86175 3348.29684 4088.88979 3348.54571 4088.96504 3348.76076 4089.08626 3348.95368 4089.24737 3349.11479 4089.32141 3349.16131 4089.43739 3349.27221 4089.50046 3349.41976 4089.50046 3349.58024 4089.43739 3349.72779 4089.32141 3349.83869 4089.19084 3349.94174 4089.06107 3350.02845 4088.90799 3350.0589 4088.12746 3350.0589 4087.77328 3350.08989 4087.60161 3350.06729 4087.45557 3349.97425 4087.36653 3349.88521 4087.29249 3349.83869 4087.17651 3349.72779 4087.11344 3349.58024 4087.11344 3349.41976 4087.17651 3349.27221 4087.29249 3349.16131 4087.36653 3349.11479 4087.52764 3348.95368 4087.64886 3348.76076 4087.72411 3348.54571 4087.75215 3348.29684 4087.75215 3347.7819 4086.09633 3347.7819 4086.09633 3349.2607 4086.06588 3349.41377 4085.97917 3349.54354 4085.8494 3349.63025 4085.69633 3349.6607 4084.22467 3349.6607 4084.0716 3349.63025 4083.94183 3349.54354 4083.85512 3349.41377 4083.82467 3349.2607 4083.82467 3347.7819 4082.16885 3347.7819 4082.16885 3348.29684 4082.19689 3348.54571 4082.27214 3348.76076 4082.39336 3348.95368 4082.55447 3349.11479 4082.62851 3349.16131 4082.74449 3349.27221 4082.80756 3349.41976 4082.80756 3349.58024 4082.74449 3349.72779 4082.62851 3349.83869 4082.55447 3349.88521 4082.39336 3350.04632 4082.27214 3350.23924 4082.19689 3350.45429 4082.16885 3350.70316 4082.16885 3353.80784 4082.19689 3354.05671 4082.27214 3354.27176 4082.39336 3354.46468 4082.55447 3354.62579 4082.74739 3354.74701 4082.96244 3354.82226 4083.21131 3354.8503 4085.5089 3354.8503 4085.66197 3354.88075 4085.79174 3354.96746 4085.87845 3355.09723 4085.9089 3355.2503 4085.90738 3356.01183 4085.89153 3356.193 4085.92523 3356.57823 4086.02532 3356.95176 4086.18875 3357.30224 4086.41055 3357.61901 4086.68399 3357.89245 4087.00076 3358.11425 4087.35124 3358.27768 4087.72477 3358.37777 4088.11 3358.41147 4088.49523 3358.37777 4088.86876 3358.27768 4089.21924 3358.11425 4089.53601 3357.89245 4089.80945 3357.61901 4090.03125 3357.30224 4090.19468 3356.95176 4090.29477 3356.57823 4090.32847 3356.193 4090.3111 3355.97697 4090.3111 3355.60639 4090.34155 3355.45332 4090.42826 3355.32355 4090.55803 3355.23684 4090.7111 3355.20639 4090.86417 3355.23684 4090.99394 3355.32355 4093.3213 3357.65091 4093.56661 3357.85222 4093.82906 3357.99251 4094.11384 3358.0789 4094.42965 3358.11 4107.38035 3358.11 4107.69616 3358.0789 4107.98094 3357.99251 4108.24339 3357.85222 4108.4887 3357.65091 4110.29091 3355.8487 4110.49222 3355.60339 4110.63251 3355.34094 4110.7189 3355.05616 4110.75 3354.74035 4110.75 3354.17248 4110.78338 3354.01252 4110.87793 3353.87926 4111.05151 3353.78316 4111.24443 3353.66194 4111.40554 3353.50083 4111.52676 3353.30791 4111.60201 3353.09286 4111.63005 3352.84399 4111.63005 3350.13301 4111.60201 3349.88414 4111.51382 3349.63211 4111.49137 3349.5 4111.51382 3349.36789 4111.60201 3349.11586 4111.63005 3348.86699 4111.63005 3348.1768 4111.66049 3348.02375 4111.74717 3347.89399 4111.87691 3347.80727 4112.02995 3347.7768 4112.183 3347.80719 4112.31278 3347.89384 4114.19174 3349.77135 4114.43657 3349.97221 4114.69906 3350.11251 4114.98384 3350.1989 4115.29965 3350.23 4121.16035 3350.23 4121.47616 3350.1989 4121.76094 3350.11251 4122.02339 3349.97222 4122.26868 3349.77092 4124.22668 3347.81251 4124.34957 3347.72871 4124.49458 3347.6956 4124.69464 3347.73631 4124.94351 3347.76435 4126.86709 3347.76435 4127.11596 3347.73631 4127.24964 3347.68953 4127.38175 3347.66709 4127.51386 3347.68953 4127.64754 3347.73631 4127.89641 3347.76435 4129.81999 3347.76435 4130.06886 3347.73631 4130.20239 3347.68958 4130.3345 3347.66714 4130.46661 3347.68958 4130.60014 3347.73631 4130.84901 3347.76435 4132.77259 3347.76435 4133.02146 3347.73631 4133.23651 3347.66106 4133.42943 3347.53984 4133.59054 3347.37873 4133.71176 3347.18581 4133.78701 3346.97076 4133.81505 3346.72189 4133.81505 3343.22351 4133.78701 3342.97464 4133.71176 3342.75959 4133.59054 3342.56667 4133.42943 3342.40556 4133.23651 3342.28434 4133.02146 3342.20909 4132.77259 3342.18105 4130.84901 3342.18105 4130.60014 3342.20909 4130.46661 3342.25582 4130.3345 3342.27826 4130.20239 3342.25582 4130.06886 3342.20909 4129.81999 3342.18105 4127.89641 3342.18105 4127.64754 3342.20909 4127.51386 3342.25587 4127.38175 3342.27831 4127.24964 3342.25587 4127.11596 3342.20909 4126.86709 3342.18105 4124.94351 3342.18105 4124.69464 3342.20909 4124.55968 3342.25632 4124.42757 3342.27876 4124.29546 3342.25632 4124.16336 3342.21009 4123.91449 3342.18205 4122.95324 3342.18205 4122.80017 3342.1516 4122.6704 3342.06489 4122.58369 3341.93512 4122.55324 3341.78205 4122.58369 3341.62898 4122.6704 3341.49921 4123.27245 3340.89716 4123.40222 3340.81045 4123.55529 3340.78 4132.98471 3340.78 4133.13778 3340.81045 4133.26755 3340.89716 4136.47284 3344.10245 4136.55955 3344.23222 4136.59 3344.38529 4136.59 3357.36471 4136.55955 3357.51778 4136.47284 3357.64755 4130.50755 3363.61284 4130.37778 3363.69955 Z M 4104.03165 3350.54952 L 4104.03165 3350.13301 4104.00361 3349.88414 4103.91542 3349.63211 4103.89297 3349.5 4103.91542 3349.36789 4104.00361 3349.11586 4104.03165 3348.86699 4104.03165 3348.45048 4102.57267 3348.45048 4102.57268 3350.54952 4104.03165 3350.54952 Z M 4099.23575 3350.13301 L 4099.23575 3350.54952 4100.69473 3350.54952 4100.69473 3348.45048 4099.23575 3348.45048 4099.23575 3348.86699 4099.26379 3349.11586 4099.35198 3349.36789 4099.37443 3349.5 4099.35198 3349.63211 4099.26379 3349.88414 4099.23575 3350.13301 Z M 4060.72549 3354.8503 L 4060.97436 3354.82226 4061.18941 3354.74701 4061.38233 3354.62579 4061.54344 3354.46468 4061.66466 3354.27176 4061.73991 3354.05671 4061.76795 3353.80784 4061.76795 3353.2929 4060.11213 3353.2929 4060.11213 3354.8503 4060.72549 3354.8503 Z M 4086.09633 3344.1497 L 4086.09633 3345.7071 4087.75215 3345.7071 4087.75215 3345.19216 4087.72411 3344.94329 4087.64886 3344.72824 4087.52764 3344.53532 4087.36653 3344.37421 4087.17361 3344.25299 4086.95856 3344.17774 4086.70969 3344.1497 4086.09633 3344.1497 Z M 4090.51757 3345.7071 L 4090.51757 3344.1497 4089.90421 3344.1497 4089.65534 3344.17774 4089.44029 3344.25299 4089.24737 3344.37421 4089.08626 3344.53532 4088.96504 3344.72824 4088.88979 3344.94329 4088.86175 3345.19216 4088.86175 3345.7071 4090.51757 3345.7071 Z M 4062.87755 3345.19216 L 4062.87755 3345.7071 4064.53337 3345.7071 4064.53337 3344.1497 4063.92001 3344.1497 4063.67114 3344.17774 4063.45609 3344.25299 4063.26317 3344.37421 4063.10206 3344.53532 4062.98084 3344.72824 4062.90559 3344.94329 4062.87755 3345.19216 Z M 4082.16885 3345.19216 L 4082.16885 3345.7071 4083.82467 3345.7071 4083.82467 3344.1497 4083.21131 3344.1497 4082.96244 3344.17774 4082.74739 3344.25299 4082.55447 3344.37421 4082.39336 3344.53532 4082.27214 3344.72824 4082.19689 3344.94329 4082.16885 3345.19216 Z M 4094.44505 3345.7071 L 4094.44505 3345.19216 4094.41701 3344.94329 4094.34176 3344.72824 4094.22054 3344.53532 4094.05943 3344.37421 4093.86651 3344.25299 4093.65146 3344.17774 4093.40259 3344.1497 4092.78923 3344.1497 4092.78923 3345.7071 4094.44505 3345.7071 Z M 4100.69473 3353.88645 L 4100.69473 3352.42748 4099.23575 3352.42748 4099.23575 3352.84399 4099.26379 3353.09286 4099.33904 3353.30791 4099.46026 3353.50083 4099.62137 3353.66194 4099.81429 3353.78316 4100.02934 3353.85841 4100.27821 3353.88645 4100.69473 3353.88645 Z M 4100.69473 3346.57252 L 4100.69473 3345.11355 4100.27821 3345.11355 4100.02934 3345.14159 4099.81429 3345.21684 4099.62137 3345.33806 4099.46026 3345.49917 4099.33904 3345.69209 4099.26379 3345.90714 4099.23575 3346.15601 4099.23575 3346.57252 4100.69473 3346.57252 Z M 4102.98919 3353.88645 L 4103.23806 3353.85841 4103.45311 3353.78316 4103.64603 3353.66194 4103.80714 3353.50083 4103.92836 3353.30791 4104.00361 3353.09286 4104.03165 3352.84399 4104.03165 3352.42748 4102.57268 3352.42748 4102.57268 3353.88645 4102.98919 3353.88645 Z M 4132.55292 3351.23565 L 4132.55292 3352.89148 4133.81505 3352.89148 4133.81505 3352.27811 4133.78701 3352.02924 4133.71176 3351.81419 4133.59054 3351.62127 4133.42943 3351.46016 4133.23651 3351.33894 4133.02146 3351.26369 4132.77259 3351.23565 4132.55292 3351.23565 Z M 4132.55292 3355.16313 L 4132.55292 3356.81895 4132.77259 3356.81895 4133.02146 3356.79091 4133.23651 3356.71566 4133.42943 3356.59444 4133.59054 3356.43333 4133.71176 3356.24041 4133.78701 3356.02536 4133.81505 3355.77649 4133.81505 3355.16313 4132.55292 3355.16313 Z "},{"net":"GND","svgpath":"M 4145.11077 3368.13455 L 4144.9577 3368.165 3895.0423 3368.165 3894.88923 3368.13455 3894.75946 3368.04784 3894.67275 3367.91807 3894.6423 3367.765 3894.6423 3331.235 3894.67275 3331.08193 3894.75946 3330.95216 3894.88923 3330.86545 3895.0423 3330.835 4144.9577 3330.835 4145.11077 3330.86545 4145.24054 3330.95216 4145.32725 3331.08193 4145.3577 3331.235 4145.3577 3367.765 4145.32725 3367.91807 4145.24054 3368.04784 4145.11077 3368.13455 Z M 3920.10384 3366.7389 L 3920.41965 3366.77 3982.18035 3366.77 3982.49616 3366.7389 3982.78094 3366.65251 3983.04339 3366.51222 3983.2887 3366.31091 3994.4094 3355.19021 3994.53917 3355.1035 3994.69224 3355.07305 3996.08784 3355.07305 3996.33671 3355.04501 3996.55176 3354.96976 3996.74468 3354.84854 3996.90579 3354.68743 3997.02701 3354.49451 3997.11117 3354.25399 3997.1955 3354.11403 3997.32877 3354.01948 3997.48872 3353.9861 3997.6154 3353.9861 3997.76847 3354.01655 3997.89824 3354.10326 3997.98495 3354.23303 3998.0154 3354.3861 3998.0154 3354.91069 3998.04344 3355.15956 3998.18437 3355.50852 3998.2 3355.61925 3998.2 3356.76035 3998.2311 3357.07616 3998.31749 3357.36094 3998.45778 3357.62339 3998.65909 3357.8687 4007.1013 3366.31091 4007.34661 3366.51222 4007.60906 3366.65251 4007.89384 3366.7389 4008.20965 3366.77 4131.00035 3366.77 4131.31616 3366.7389 4131.60094 3366.65251 4131.86339 3366.51222 4132.1087 3366.31091 4139.17091 3359.2487 4139.37222 3359.00339 4139.51251 3358.74094 4139.5989 3358.45616 4139.63 3358.14035 4139.63 3343.60965 4139.5989 3343.29384 4139.51251 3343.00906 4139.37222 3342.74661 4139.17091 3342.5013 4134.8687 3338.19909 4134.62339 3337.99778 4134.36094 3337.85749 4134.07616 3337.7711 4133.76035 3337.74 4122.77965 3337.74 4122.46384 3337.7711 4122.17906 3337.85749 4121.91661 3337.99778 4121.6713 3338.19909 4118.93909 3340.9313 4118.73778 3341.17661 4118.59749 3341.43906 4118.5111 3341.72384 4118.50082 3341.82829 4118.45485 3341.97888 4118.35433 3342.10006 4118.21482 3342.17306 4118.00899 3342.18105 4116.08541 3342.18105 4115.83654 3342.20909 4115.62149 3342.28434 4115.42857 3342.40556 4115.26746 3342.56667 4115.20972 3342.65856 4115.11335 3342.76399 4114.98607 3342.82884 4114.84413 3342.84484 4114.70561 3342.80993 4114.58819 3342.72859 4104.5487 3332.68909 4104.30339 3332.48778 4104.04094 3332.34749 4103.75616 3332.2611 4103.44035 3332.23 4012.53965 3332.23 4012.22384 3332.2611 4011.93906 3332.34749 4011.67661 3332.48778 4011.4313 3332.68909 4005.09284 3339.02755 4004.96307 3339.11426 4004.81 3339.14471 4004.65693 3339.11426 4004.52716 3339.02755 4004.0887 3338.58909 4003.84339 3338.38778 4003.58094 3338.24749 4003.29616 3338.1611 4002.98035 3338.13 3988.52965 3338.13 3988.21384 3338.1611 3987.92906 3338.24749 3987.66661 3338.38778 3987.4213 3338.58909 3983.10909 3342.9013 3982.90778 3343.14661 3982.76749 3343.40906 3982.6811 3343.69384 3982.67174 3343.78891 3982.63096 3343.92954 3982.54229 3344.04608 3982.41763 3344.1229 3982.27367 3344.1497 3981.76583 3344.1497 3981.76583 3345.7071 3982.25 3345.7071 3982.40307 3345.73755 3982.53284 3345.82426 3982.61955 3345.95403 3982.65 3346.1071 3982.65 3347.3819 3982.61955 3347.53497 3982.53284 3347.66474 3982.40307 3347.75145 3982.25 3347.7819 3981.76583 3347.7819 3981.76583 3349.2607 3981.73538 3349.41377 3981.64867 3349.54354 3981.5189 3349.63025 3981.36583 3349.6607 3979.89417 3349.6607 3979.7411 3349.63025 3979.61133 3349.54354 3979.52462 3349.41377 3979.49417 3349.2607 3979.49417 3347.7819 3977.83835 3347.7819 3977.83835 3348.29684 3977.86639 3348.54571 3977.94164 3348.76076 3978.06286 3348.95368 3978.22397 3349.11479 3978.29801 3349.16131 3978.41399 3349.27221 3978.47706 3349.41976 3978.47706 3349.58024 3978.41399 3349.72779 3978.29801 3349.83869 3978.22397 3349.88521 3978.06286 3350.04632 3977.94164 3350.23924 3977.86639 3350.45429 3977.83835 3350.70316 3977.83835 3353.80784 3977.86639 3354.05671 3977.94164 3354.27176 3978.06286 3354.46468 3978.14644 3354.54827 3978.23315 3354.67803 3978.2636 3354.83111 3978.23315 3354.98418 3978.14644 3355.11395 3977.91755 3355.34284 3977.78778 3355.42955 3977.63471 3355.46 3976.40392 3355.46 3976.23714 3355.42357 3976.10073 3355.32091 3976.01956 3355.17073 3976.00839 3355.00038 3976.06927 3354.84089 3976.19111 3354.72131 3976.34313 3354.62579 3976.50424 3354.46468 3976.62546 3354.27176 3976.70071 3354.05671 3976.72875 3353.80784 3976.72875 3353.2929 3975.07293 3353.2929 3975.07293 3355.06 3975.04248 3355.21307 3974.95577 3355.34284 3974.826 3355.42955 3974.67293 3355.46 3973.94529 3355.46 3973.79222 3355.42955 3973.66245 3355.34284 3972.91843 3354.59883 3972.83172 3354.46906 3972.80127 3354.31598 3972.80127 3353.2929 3971.77819 3353.2929 3971.62512 3353.26245 3971.49535 3353.17574 3970.47636 3352.15675 3970.38965 3352.02698 3970.3592 3351.87391 3970.3592 3351.6181 3970.38965 3351.46503 3970.47636 3351.33526 3970.60613 3351.24855 3970.7592 3351.2181 3972.80127 3351.2181 3972.80127 3349.7393 3972.83172 3349.58623 3972.91843 3349.45646 3973.0482 3349.36975 3973.20127 3349.3393 3974.67293 3349.3393 3974.826 3349.36975 3974.95577 3349.45646 3975.04248 3349.58623 3975.07293 3349.7393 3975.07293 3351.2181 3976.72875 3351.2181 3976.72875 3350.70316 3976.70071 3350.45429 3976.62546 3350.23924 3976.50424 3350.04632 3976.34313 3349.88521 3976.26909 3349.83869 3976.15311 3349.72779 3976.09004 3349.58024 3976.09004 3349.41976 3976.15311 3349.27221 3976.26909 3349.16131 3976.34313 3349.11479 3976.50424 3348.95368 3976.62546 3348.76076 3976.70071 3348.54571 3976.72875 3348.29684 3976.72875 3345.19216 3976.70071 3344.94329 3976.62546 3344.72824 3976.50424 3344.53532 3976.34313 3344.37421 3976.15021 3344.25299 3975.93516 3344.17774 3975.68629 3344.1497 3972.18791 3344.1497 3971.93904 3344.17774 3971.72399 3344.25299 3971.53107 3344.37421 3971.36996 3344.53532 3971.24874 3344.72824 3971.16904 3344.95601 3971.08471 3345.09597 3970.95144 3345.19052 3970.79149 3345.2239 3970.71316 3345.2239 3970.55321 3345.19052 3970.41994 3345.09597 3970.33561 3344.95601 3970.25591 3344.72824 3970.13469 3344.53532 3969.97358 3344.37421 3969.78066 3344.25299 3969.56561 3344.17774 3969.31674 3344.1497 3965.96006 3344.1497 3965.71119 3344.17774 3965.49614 3344.25299 3965.30322 3344.37421 3965.14211 3344.53532 3965.02089 3344.72824 3964.94116 3344.95611 3964.85682 3345.09607 3964.72356 3345.19062 3964.5636 3345.224 3964.48435 3345.224 3964.32439 3345.19062 3964.19113 3345.09607 3964.10679 3344.95611 3964.02706 3344.72824 3963.90584 3344.53532 3963.74473 3344.37421 3963.55181 3344.25299 3963.33676 3344.17774 3963.08789 3344.1497 3960.1092 3344.1497 3959.95613 3344.11925 3959.82636 3344.03254 3959.73965 3343.90277 3959.7092 3343.7497 3959.7092 3340.85906 3959.6781 3340.54325 3959.59171 3340.25847 3959.45143 3339.99602 3959.25012 3339.75071 3952.97861 3333.4791 3952.7333 3333.27778 3952.47085 3333.1375 3952.18607 3333.05111 3951.87026 3333.02 3928.85914 3333.02 3928.70607 3332.98955 3928.5763 3332.90284 3928.51301 3332.83955 3928.19624 3332.61775 3927.84576 3332.45432 3927.47223 3332.35423 3927.087 3332.32053 3926.70177 3332.35423 3926.32824 3332.45432 3925.97776 3332.61775 3925.66099 3332.83955 3925.38755 3333.11299 3925.16575 3333.42976 3925.00232 3333.78024 3924.90223 3334.15377 3924.86853 3334.539 3924.90223 3334.92423 3925.00232 3335.29776 3925.16575 3335.64824 3925.38755 3335.96501 3925.66099 3336.23845 3925.97776 3336.46025 3926.32824 3336.62368 3926.70177 3336.72377 3927.087 3336.75747 3927.47223 3336.72377 3927.84576 3336.62368 3928.19624 3336.46025 3928.51301 3336.23845 3928.5743 3336.17716 3928.70407 3336.09045 3928.85714 3336.06 3951.0946 3336.06 3951.24768 3336.09045 3951.37745 3336.17716 3956.55204 3341.35184 3956.63875 3341.48161 3956.6692 3341.63468 3956.6692 3343.7497 3956.63875 3343.90277 3956.55204 3344.03254 3956.42227 3344.11925 3956.2692 3344.1497 3954.48915 3344.1497 3954.34418 3344.1225 3954.21892 3344.04461 3954.1304 3343.92662 3954.09067 3343.78456 3954.07477 3343.60277 3953.97468 3343.22924 3953.81125 3342.87876 3953.58945 3342.56199 3953.31601 3342.28855 3952.99924 3342.06675 3952.64876 3341.90332 3952.27523 3341.80323 3951.89 3341.76953 3951.50477 3341.80323 3951.13124 3341.90332 3950.78076 3342.06675 3950.46399 3342.28855 3950.19055 3342.56199 3949.96875 3342.87876 3949.80532 3343.22924 3949.70523 3343.60277 3949.68933 3343.78456 3949.6496 3343.92662 3949.56108 3344.04461 3949.43582 3344.1225 3949.29085 3344.1497 3947.67399 3344.1497 3947.52092 3344.11925 3947.39115 3344.03254 3945.1078 3341.74919 3944.86249 3341.54788 3944.60004 3341.40759 3944.31526 3341.3212 3943.99945 3341.2901 3934.58975 3341.2901 3934.27396 3341.3212 3933.98918 3341.40758 3933.72673 3341.54786 3933.48142 3341.74918 3930.23411 3344.9964 3930.10435 3345.0831 3929.95127 3345.11355 3929.41241 3345.11355 3929.16354 3345.14159 3928.94849 3345.21684 3928.75557 3345.33806 3928.59446 3345.49917 3928.47324 3345.69209 3928.39799 3345.90714 3928.36995 3346.15601 3928.36995 3348.86699 3928.39799 3349.11586 3928.48618 3349.36789 3928.50863 3349.5 3928.48618 3349.63211 3928.39876 3349.88194 3928.36792 3350.18709 3928.31594 3350.34761 3928.20239 3350.47241 3928.04748 3350.53929 3927.87878 3350.53635 3927.72631 3350.46411 3927.61718 3350.33543 3927.56154 3350.23134 3927.36023 3349.98602 3925.02602 3347.65172 3924.87987 3347.48956 3924.83623 3347.33399 3924.8577 3347.17386 3924.92901 3346.97006 3924.95705 3346.72119 3924.95705 3343.22281 3924.92901 3342.97394 3924.85376 3342.75889 3924.73254 3342.56597 3924.57143 3342.40486 3924.37851 3342.28364 3924.16346 3342.20839 3923.91459 3342.18035 3921.99101 3342.18035 3921.79853 3342.16693 3921.65346 3342.08408 3921.55489 3341.9492 3921.52 3341.78582 3921.52 3341.64933 3921.48992 3341.33888 3921.40435 3341.05352 3921.2649 3340.79062 3921.06436 3340.54468 3919.52206 3338.99255 3919.27739 3338.79046 3919.01539 3338.64934 3918.73088 3338.56205 3918.41581 3338.53001 3915.68965 3338.53 3915.37384 3338.5611 3915.08906 3338.64749 3914.82661 3338.78778 3914.5813 3338.98909 3913.02909 3340.5413 3912.82778 3340.78661 3912.68749 3341.04906 3912.6011 3341.33384 3912.57006 3341.64906 3912.57046 3341.78466 3912.53594 3341.94842 3912.43745 3342.08371 3912.29222 3342.16687 3912.10359 3342.18085 3910.18001 3342.18085 3909.93114 3342.20889 3909.79733 3342.25572 3909.66521 3342.27816 3909.5331 3342.25572 3909.39986 3342.20909 3909.15099 3342.18105 3908.93133 3342.18105 3908.93133 3343.88694 3909.04088 3343.97613 3909.11261 3344.09783 3909.13755 3344.23687 3909.13755 3345.70853 3909.11261 3345.84757 3909.04088 3345.96927 3908.93133 3346.05846 3908.93133 3347.76435 3909.15099 3347.76435 3909.39986 3347.73631 3909.53367 3347.68948 3909.66579 3347.66704 3909.7979 3347.68948 3909.93114 3347.73611 3910.18001 3347.76415 3912.10359 3347.76415 3912.35246 3347.73611 3912.48685 3347.68908 3912.61896 3347.66664 3912.75108 3347.68908 3912.88404 3347.73561 3913.13291 3347.76365 3915.05649 3347.76365 3915.30536 3347.73561 3915.43917 3347.68878 3915.57129 3347.66634 3915.7034 3347.68878 3915.83664 3347.73541 3916.08551 3347.76345 3916.30517 3347.76345 3916.30517 3346.05756 3916.19562 3345.96837 3916.12389 3345.84667 3916.09895 3345.70763 3916.09895 3344.23597 3916.12389 3344.09693 3916.19562 3343.97523 3916.30517 3343.88604 3916.30517 3341.97 3916.33562 3341.81693 3916.42233 3341.68716 3916.5521 3341.60045 3916.70518 3341.57 3917.38943 3341.57 3917.5425 3341.60045 3917.67227 3341.68716 3917.75898 3341.81693 3917.78943 3341.97 3917.78943 3343.88582 3917.89918 3343.975 3917.97105 3344.09679 3917.99605 3344.23597 3917.99605 3345.70763 3917.97105 3345.84681 3917.89918 3345.9686 3917.78943 3346.05778 3917.78943 3347.76345 3918.00909 3347.76345 3918.14565 3347.74806 3918.28354 3347.75653 3918.41032 3347.81141 3918.51088 3347.90614 3918.57321 3348.02943 3918.63504 3348.18144 3918.68104 3348.33862 3918.66019 3348.50105 3918.576 3348.64152 3918.44257 3348.73648 3918.28227 3348.77 3906.23965 3348.77 3905.92384 3348.8011 3905.63906 3348.88749 3905.37661 3349.02778 3905.1313 3349.22909 3902.79909 3351.5613 3902.59778 3351.80661 3902.45749 3352.06906 3902.3711 3352.35384 3902.34 3352.66965 3902.34 3356.17035 3902.3711 3356.48616 3902.45749 3356.77094 3902.59778 3357.03339 3902.79909 3357.2787 3904.7413 3359.22091 3904.98661 3359.42222 3905.24906 3359.56251 3905.53384 3359.6489 3905.84965 3359.68 3912.51471 3359.68 3912.66778 3359.71045 3912.79755 3359.79716 3919.3113 3366.31091 3919.55661 3366.51222 3919.81906 3366.65251 3920.10384 3366.7389 Z M 3977.83835 3345.19216 L 3977.83835 3345.7071 3979.49417 3345.7071 3979.49417 3344.1497 3978.88081 3344.1497 3978.63194 3344.17774 3978.41689 3344.25299 3978.22397 3344.37421 3978.06286 3344.53532 3977.94164 3344.72824 3977.86639 3344.94329 3977.83835 3345.19216 Z M 3906.18495 3343.22351 L 3906.18495 3343.83687 3907.44707 3343.83687 3907.44707 3342.18105 3907.22741 3342.18105 3906.97854 3342.20909 3906.76349 3342.28434 3906.57057 3342.40556 3906.40946 3342.56667 3906.28824 3342.75959 3906.21299 3342.97464 3906.18495 3343.22351 Z M 3907.44707 3347.76435 L 3907.44707 3346.10853 3906.18495 3346.10853 3906.18495 3346.72189 3906.21299 3346.97076 3906.28824 3347.18581 3906.40946 3347.37873 3906.57057 3347.53984 3906.76349 3347.66106 3906.97854 3347.73631 3907.22741 3347.76435 3907.44707 3347.76435 Z "}],"B":[{"net":"GND","svgpath":"M 3971.57963 3356.7508 L 3971.43283 3356.78334 3971.28439 3356.75939 3971.15528 3356.68232 3971.06374 3356.56303 3971.02272 3356.41838 3971.00377 3356.20177 3970.90368 3355.82824 3970.74025 3355.47776 3970.51845 3355.16099 3970.24501 3354.88755 3969.92824 3354.66575 3969.57776 3354.50232 3969.20423 3354.40223 3968.819 3354.36853 3968.66321 3354.38216 3968.51224 3354.36646 3968.32746 3354.3104 3968.01165 3354.2793 3962.75825 3354.2793 3962.60518 3354.24885 3962.47541 3354.16214 3962.3887 3354.03237 3962.35825 3353.8793 3962.35825 3346.27346 3962.33021 3346.02459 3962.25496 3345.80954 3962.13374 3345.61662 3961.97263 3345.45551 3961.77971 3345.33429 3961.56466 3345.25904 3961.31579 3345.231 3955.45521 3345.231 3955.20634 3345.25904 3954.99129 3345.33429 3954.79837 3345.45551 3954.63726 3345.61662 3954.51604 3345.80954 3954.44079 3346.02459 3954.41275 3346.27346 3954.41275 3353.8793 3954.3823 3354.03237 3954.29559 3354.16214 3954.16582 3354.24885 3954.01275 3354.2793 3953.07898 3354.2793 3952.92591 3354.24885 3952.79614 3354.16215 3948.99016 3350.35624 3948.90345 3350.22647 3948.873 3350.0734 3948.873 3345.88292 3948.90732 3345.72083 3949.00438 3345.58654 3949.14753 3345.50311 3949.31221 3345.48485 3949.54725 3345.508 3950.11886 3345.508 3950.27193 3345.53845 3950.4017 3345.62516 3950.46399 3345.68745 3950.78076 3345.90925 3951.13124 3346.07268 3951.50477 3346.17277 3951.89 3346.20647 3952.27523 3346.17277 3952.64876 3346.07268 3952.99924 3345.90925 3953.31601 3345.68745 3953.58945 3345.41401 3953.81125 3345.09724 3953.97468 3344.74676 3954.07477 3344.37323 3954.10219 3344.05976 3954.13815 3343.92557 3954.21783 3343.81178 3958.70245 3339.32716 3958.83222 3339.24045 3958.98529 3339.21 3997.33826 3339.21 3997.48903 3339.2395 3997.61756 3339.32365 3997.70489 3339.45004 3997.73814 3339.60003 3997.7124 3339.75148 3997.63148 3339.88207 3997.50731 3339.97252 3997.23726 3340.09845 3996.92049 3340.32025 3996.8579 3340.38284 3996.72813 3340.46955 3996.57506 3340.5 3988.51965 3340.5 3988.20384 3340.5311 3987.91906 3340.61749 3987.65661 3340.75778 3987.4113 3340.95909 3971.70404 3356.66636 3971.57963 3356.7508 Z "},{"net":"GND","svgpath":"M 3951.43364 3357.7817 L 3951.26261 3357.8201 3951.11539 3357.8201 3950.96232 3357.78965 3950.83255 3357.70294 3943.08716 3349.95755 3943.00045 3349.82778 3942.97 3349.67471 3942.97 3343.17612 3942.99245 3343.044 3943.03845 3342.91254 3943.12278 3342.77259 3943.25604 3342.67803 3943.416 3342.64466 3943.57596 3342.67803 3943.70922 3342.77259 3943.79355 3342.91254 3943.87724 3343.15171 3943.94614 3343.29075 3943.96177 3343.40148 3943.96177 3343.73025 3944.23346 3343.70221 3944.4005 3343.66754 3944.56754 3343.70221 3944.81641 3343.73025 3945.433 3343.73025 3945.58607 3343.7607 3945.71584 3343.84741 3945.80255 3343.97718 3945.833 3344.13025 3945.833 3350.84905 3945.8641 3351.16486 3945.95049 3351.44964 3946.09078 3351.71209 3946.29209 3351.9574 3951.195 3356.86021 3951.5839 3357.18182 3951.65493 3357.34206 3951.65063 3357.51729 3951.57182 3357.67386 3951.43364 3357.7817 Z "},{"net":"GND","svgpath":"M 3946.77628 3359.791 L 3946.62321 3359.76055 3946.49344 3359.67384 3939.14716 3352.32765 3939.06045 3352.19788 3939.03 3352.0448 3939.03 3343.18469 3939.05245 3343.05258 3939.10145 3342.91254 3939.18578 3342.77259 3939.31904 3342.67803 3939.479 3342.64466 3939.63896 3342.67803 3939.77222 3342.77259 3939.85655 3342.91254 3939.90755 3343.05829 3939.93 3343.19041 3939.93 3350.45035 3939.9611 3350.76616 3940.04749 3351.05094 3940.18778 3351.31339 3940.38909 3351.5587 3947.93855 3359.10816 3948.02526 3359.23793 3948.05571 3359.391 3948.02526 3359.54407 3947.93855 3359.67384 3947.80878 3359.76055 3947.65571 3359.791 3946.77628 3359.791 Z "},{"net":"GND","svgpath":"M 4145.11077 3368.13455 L 4144.9577 3368.165 3895.0423 3368.165 3894.88923 3368.13455 3894.75946 3368.04784 3894.67275 3367.91807 3894.6423 3367.765 3894.6423 3331.235 3894.67275 3331.08193 3894.75946 3330.95216 3894.88923 3330.86545 3895.0423 3330.835 4144.9577 3330.835 4145.11077 3330.86545 4145.24054 3330.95216 4145.32725 3331.08193 4145.3577 3331.235 4145.3577 3367.765 4145.32725 3367.91807 4145.24054 3368.04784 4145.11077 3368.13455 Z M 4087.70035 3366.77 L 4088.01616 3366.7389 4088.30094 3366.65251 4088.56339 3366.51222 4088.8087 3366.31091 4095.08091 3360.0387 4095.28222 3359.79339 4095.42251 3359.53094 4095.5089 3359.24616 4095.54 3358.93035 4095.54 3351.87965 4095.5089 3351.56384 4095.42251 3351.27906 4095.28222 3351.01661 4095.08105 3350.77148 4090.76739 3346.46776 4090.52349 3346.26783 4090.26094 3346.12749 4089.97616 3346.0411 4089.66035 3346.01 4082.99672 3346.01 4082.84341 3345.97945 4082.71352 3345.89248 4080.5953 3343.76887 4080.51587 3343.65521 4080.48002 3343.52125 4080.45277 3343.20977 4080.35268 3342.83624 4080.18925 3342.48576 4079.96745 3342.16899 4079.69401 3341.89555 4079.37724 3341.67375 4079.02676 3341.51032 4078.65323 3341.41023 4078.268 3341.37653 4077.88277 3341.41023 4077.50924 3341.51032 4077.15876 3341.67375 4076.84199 3341.89555 4076.56855 3342.16899 4076.34675 3342.48576 4076.18332 3342.83624 4076.08323 3343.20977 4076.04953 3343.595 4076.08323 3343.98023 4076.18332 3344.35376 4076.34675 3344.70424 4076.56855 3345.02101 4076.84199 3345.29445 4077.15876 3345.51625 4077.50924 3345.67968 4077.88277 3345.77977 4078.2026 3345.80775 4078.33702 3345.84381 4078.45094 3345.92375 4081.10996 3348.58952 4081.35501 3348.79115 4081.61728 3348.93177 4081.90195 3349.01852 4082.21747 3349.05 4088.88601 3349.05 4089.03887 3349.08036 4089.16852 3349.16683 4092.38252 3352.37342 4092.46946 3352.5033 4092.5 3352.65659 4092.5 3358.15471 4092.46955 3358.30778 4092.38284 3358.43755 4087.20755 3363.61284 4087.07778 3363.69955 4086.92471 3363.73 3944.81475 3363.73 3944.66177 3363.69959 3944.53204 3363.61298 3935.20729 3354.29715 3935.12048 3354.16733 3935.09 3354.01417 3935.09 3343.19326 3935.11245 3343.06115 3935.16445 3342.91254 3935.24878 3342.77259 3935.38204 3342.67803 3935.542 3342.64466 3935.70196 3342.67803 3935.83522 3342.77259 3935.91955 3342.91254 3935.96755 3343.04972 3935.99 3343.18183 3935.99 3352.82045 3936.0211 3353.13626 3936.10749 3353.42104 3936.24778 3353.68349 3936.44909 3353.9288 3944.8923 3362.37191 3945.13761 3362.57322 3945.40006 3362.71351 3945.68484 3362.7999 3946.00065 3362.831 4027.85435 3362.831 4028.17016 3362.7999 4028.45494 3362.71351 4028.71739 3362.57322 4028.94743 3362.38443 4029.13622 3362.15439 4029.29343 3361.86029 4029.36335 3361.766 4029.57345 3361.55591 4029.79525 3361.23914 4029.95868 3360.88866 4030.05877 3360.51513 4030.09247 3360.1299 4030.05877 3359.74467 4029.95868 3359.37114 4029.79525 3359.02066 4029.57345 3358.70389 4029.30001 3358.43045 4028.98324 3358.20865 4028.63276 3358.04522 4028.25923 3357.94513 4027.874 3357.91143 4027.48877 3357.94513 4027.11524 3358.04522 4026.76476 3358.20865 4026.44799 3358.43045 4026.17455 3358.70389 4025.95275 3359.02066 4025.78932 3359.37114 4025.75626 3359.49453 4025.6763 3359.64812 4025.53893 3359.75352 4025.36989 3359.791 3973.84429 3359.791 3973.69122 3359.76055 3973.56145 3359.67384 3973.47474 3359.54407 3973.44429 3359.391 3973.47474 3359.23793 3973.56145 3359.10816 3989.01245 3343.65716 3989.14222 3343.57045 3989.29529 3343.54 3996.57566 3343.54 3996.72873 3343.57045 3996.8585 3343.65716 3996.92049 3343.71915 3997.23726 3343.94095 3997.58774 3344.10438 3997.96127 3344.20447 3998.3465 3344.23817 3998.73173 3344.20447 3999.10526 3344.10438 3999.45574 3343.94095 3999.77251 3343.71915 4000.04595 3343.44571 4000.26775 3343.12894 4000.43118 3342.77846 4000.53127 3342.40493 4000.56497 3342.0197 4000.53127 3341.63447 4000.43118 3341.26094 4000.26775 3340.91046 4000.04595 3340.59369 3999.77251 3340.32025 3999.45574 3340.09845 3999.18569 3339.97252 3999.06152 3339.88207 3998.9806 3339.75148 3998.95486 3339.60003 3998.98811 3339.45004 3999.07544 3339.32365 3999.20397 3339.2395 3999.35474 3339.21 4028.65471 3339.21 4028.80778 3339.24045 4028.93755 3339.32716 4032.41284 3342.80245 4032.49955 3342.93222 4032.53 3343.08529 4032.53 3358.02035 4032.5611 3358.33616 4032.64749 3358.62094 4032.78778 3358.88339 4032.98909 3359.1287 4035.0513 3361.19091 4035.29661 3361.39222 4035.55906 3361.53251 4035.84384 3361.6189 4036.15965 3361.65 4084.15035 3361.65 4084.46616 3361.6189 4084.75094 3361.53251 4085.01339 3361.39222 4085.2587 3361.19091 4087.9283 3358.52131 4088.04209 3358.44163 4088.17628 3358.40567 4088.49523 3358.37777 4088.86876 3358.27768 4089.21924 3358.11425 4089.53601 3357.89245 4089.80945 3357.61901 4090.03125 3357.30224 4090.19468 3356.95176 4090.29477 3356.57823 4090.32847 3356.193 4090.29477 3355.80777 4090.19468 3355.43424 4090.03125 3355.08376 4089.80945 3354.76699 4089.53601 3354.49355 4089.21924 3354.27175 4088.86876 3354.10832 4088.49523 3354.00823 4088.11 3353.97453 4087.72477 3354.00823 4087.35124 3354.10832 4087.00076 3354.27175 4086.68399 3354.49355 4086.41055 3354.76699 4086.18875 3355.08376 4086.02532 3355.43424 4085.92523 3355.80777 4085.8979 3356.12015 4085.86195 3356.25433 4085.78227 3356.36813 4083.65755 3358.49284 4083.52778 3358.57955 4083.37471 3358.61 4038.97864 3358.61 4038.80959 3358.57252 4038.67222 3358.46712 4038.59227 3358.31353 4038.58472 3358.14054 4038.65098 3357.98057 4038.85035 3357.69584 4039.01378 3357.34536 4039.11387 3356.97183 4039.13349 3356.7476 4039.18512 3356.58322 4039.3011 3356.45581 4039.45992 3356.389 4039.6321 3356.3952 4039.78571 3356.47325 4040.0233 3356.66822 4040.28576 3356.80851 4040.57054 3356.8949 4040.88635 3356.926 4053.26866 3356.926 4053.42173 3356.95645 4053.5515 3357.04316 4053.61329 3357.10495 4053.93006 3357.32675 4054.28054 3357.49018 4054.65407 3357.59027 4055.0393 3357.62397 4055.42453 3357.59027 4055.79806 3357.49018 4056.14854 3357.32675 4056.46531 3357.10495 4056.73875 3356.83151 4056.96055 3356.51474 4057.12398 3356.16426 4057.22407 3355.79073 4057.25777 3355.4055 4057.22407 3355.02027 4057.12398 3354.64674 4056.96055 3354.29626 4056.73875 3353.97949 4056.46531 3353.70605 4056.14854 3353.48425 4055.79806 3353.32082 4055.42453 3353.22073 4055.0393 3353.18703 4054.65407 3353.22073 4054.28054 3353.32082 4053.93006 3353.48425 4053.61329 3353.70605 4053.5505 3353.76884 4053.42073 3353.85555 4053.26766 3353.886 4042.116 3353.886 4041.96293 3353.85555 4041.83316 3353.76884 4041.74645 3353.63907 4041.716 3353.486 4041.716 3340.97575 4041.6849 3340.65995 4041.59851 3340.37517 4041.45823 3340.11272 4041.25691 3339.86741 4033.6888 3332.2992 4033.4435 3332.09788 4033.18105 3331.9576 4032.89627 3331.87121 4032.58046 3331.8401 3948.36958 3331.8401 3948.05667 3331.87065 3947.77158 3331.95659 3947.50888 3332.09643 3947.26323 3332.29732 3944.32087 3335.22958 3944.11913 3335.47454 3943.97839 3335.73675 3943.89152 3336.02138 3943.8599 3336.33679 3943.8599 3337.13229 3943.83745 3337.2644 3943.79355 3337.38986 3943.70922 3337.52981 3943.57596 3337.62437 3943.416 3337.65774 3943.25604 3337.62437 3943.12278 3337.52981 3943.03845 3337.38986 3942.95476 3337.15069 3942.88686 3337.01324 3942.87122 3336.90251 3942.87122 3336.57215 3942.59954 3336.60019 3942.432 3336.63504 3942.26446 3336.60019 3942.01559 3336.57215 3940.87941 3336.57215 3940.63054 3336.60019 3940.4635 3336.63486 3940.29646 3336.60019 3940.02477 3336.57215 3940.02477 3336.90092 3940.00914 3337.01165 3939.94024 3337.15069 3939.85655 3337.38986 3939.77222 3337.52981 3939.63896 3337.62437 3939.479 3337.65774 3939.31904 3337.62437 3939.18578 3337.52981 3939.10145 3337.38986 3939.01776 3337.15069 3938.94986 3337.01324 3938.93422 3336.90251 3938.93422 3336.57215 3938.66254 3336.60019 3938.495 3336.63504 3938.32746 3336.60019 3938.07859 3336.57215 3936.94241 3336.57215 3936.69354 3336.60019 3936.5265 3336.63486 3936.35946 3336.60019 3936.08777 3336.57215 3936.08777 3336.90092 3936.07214 3337.01165 3936.00324 3337.15069 3935.91955 3337.38986 3935.83522 3337.52981 3935.70196 3337.62437 3935.542 3337.65774 3935.38204 3337.62437 3935.24878 3337.52981 3935.16445 3337.38986 3935.08076 3337.15069 3935.01286 3337.01324 3934.99723 3336.90251 3934.99723 3336.57215 3934.72554 3336.60019 3934.558 3336.63504 3934.39046 3336.60019 3934.14159 3336.57215 3933.00541 3336.57215 3932.75654 3336.60019 3932.5895 3336.63486 3932.42246 3336.60019 3932.15078 3336.57215 3932.15078 3336.90092 3932.13514 3337.01165 3932.06624 3337.15069 3931.98255 3337.38986 3931.89822 3337.52981 3931.76496 3337.62437 3931.605 3337.65774 3931.44504 3337.62437 3931.31178 3337.52981 3931.22745 3337.38986 3931.15766 3337.15406 3931.12447 3336.79045 3931.07745 3336.63543 3931.06023 3336.48212 3930.96028 3336.36071 3930.89822 3336.24461 3930.69691 3335.9993 3929.41502 3334.71742 3929.33534 3334.60362 3929.29939 3334.46944 3929.27177 3334.15377 3929.17168 3333.78024 3929.00825 3333.42976 3928.78645 3333.11299 3928.51301 3332.83955 3928.19624 3332.61775 3927.84576 3332.45432 3927.47223 3332.35423 3927.087 3332.32053 3926.70177 3332.35423 3926.32824 3332.45432 3925.97776 3332.61775 3925.66099 3332.83955 3925.38755 3333.11299 3925.16575 3333.42976 3925.00232 3333.78024 3924.90223 3334.15377 3924.86853 3334.539 3924.90223 3334.92423 3925.00232 3335.29776 3925.16575 3335.64824 3925.38755 3335.96501 3925.66099 3336.23845 3925.97776 3336.46025 3926.04435 3336.4913 3926.17849 3336.59291 3926.25897 3336.7407 3926.27155 3336.90851 3926.21399 3337.06664 3926.16124 3337.15059 3926.08599 3337.36564 3926.05795 3337.61451 3926.05795 3338.62158 3927.12323 3338.62158 3927.12323 3337.69052 3927.15367 3337.53744 3927.24038 3337.40767 3927.37015 3337.32096 3927.52323 3337.29052 3927.6763 3337.32096 3927.80607 3337.40767 3927.90879 3337.5104 3927.9955 3337.64017 3928.02595 3337.79324 3928.02595 3342.68779 3928.05399 3342.93666 3928.12924 3343.15171 3928.19814 3343.29075 3928.21378 3343.40148 3928.21378 3343.73015 3928.48546 3343.70211 3928.65236 3343.66749 3928.81954 3343.70221 3929.06841 3343.73025 3930.20459 3343.73025 3930.45346 3343.70221 3930.621 3343.66736 3930.78854 3343.70221 3931.06023 3343.73025 3931.06023 3343.39989 3931.07586 3343.28916 3931.14376 3343.15171 3931.22745 3342.91254 3931.31178 3342.77259 3931.44504 3342.67803 3931.605 3342.64466 3931.76496 3342.67803 3931.89822 3342.77259 3931.98255 3342.91254 3932.02755 3343.04115 3932.05 3343.17326 3932.05 3354.79035 3932.0811 3355.10616 3932.16749 3355.39094 3932.30778 3355.65339 3932.50903 3355.89862 3942.93184 3366.31146 3943.17657 3366.5122 3943.43906 3366.65251 3943.72384 3366.7389 3944.03965 3366.77 4087.70035 3366.77 Z M 4020.15861 3357.99722 L 4020.27902 3357.99412 4021.03147 3357.93587 4021.15092 3357.92041 4021.89338 3357.7851 4022.01061 3357.75744 4022.73523 3357.54651 4022.84899 3357.50694 4023.54809 3357.22263 4023.65717 3357.17157 4024.32333 3356.81688 4024.42659 3356.75487 4025.05274 3356.33357 4025.14908 3356.26127 4025.7286 3355.77782 4025.81699 3355.696 4026.34373 3355.15553 4026.42324 3355.06506 4026.89161 3354.47328 4026.9614 3354.37512 4027.36644 3353.73832 4027.42577 3353.6335 4027.76319 3352.95843 4027.81142 3352.84807 4028.07764 3352.14189 4028.11427 3352.02714 4028.30647 3351.29733 4028.33111 3351.17943 4028.44725 3350.43373 4028.45963 3350.31392 4028.49848 3349.56022 4028.49848 3349.43978 4028.45963 3348.68608 4028.44725 3348.56627 4028.33111 3347.82057 4028.30647 3347.70267 4028.11427 3346.97286 4028.07764 3346.85811 4027.81142 3346.15193 4027.76319 3346.04157 4027.42577 3345.3665 4027.36644 3345.26168 4026.9614 3344.62488 4026.89161 3344.52672 4026.42324 3343.93494 4026.34373 3343.84447 4025.81699 3343.304 4025.7286 3343.22218 4025.14908 3342.73873 4025.05274 3342.66643 4024.42659 3342.24513 4024.32333 3342.18312 4023.65717 3341.82843 4023.54809 3341.77737 4022.84899 3341.49306 4022.73523 3341.45349 4022.01061 3341.24256 4021.89338 3341.2149 4021.15092 3341.07959 4021.03147 3341.06413 4020.27902 3341.00588 4020.15861 3341.00278 4019.40417 3341.02222 4019.28408 3341.03151 4018.53563 3341.12841 4018.41714 3341.15001 4017.68262 3341.32335 4017.56697 3341.35701 4016.85417 3341.60496 4016.7426 3341.65034 4016.05907 3341.97027 4015.95275 3342.02687 4015.30574 3342.41538 4015.20581 3342.48262 4014.60217 3342.9356 4014.50969 3343.01276 4013.95582 3343.5254 4013.87176 3343.61166 4013.37355 3344.17854 4013.2988 3344.27298 4012.86151 3344.88808 4012.79687 3344.98971 4012.42514 3345.64651 4012.37129 3345.75425 4012.06907 3346.44579 4012.02658 3346.55849 4011.79707 3347.27744 4011.76639 3347.39392 4011.61202 3348.13266 4011.59348 3348.25167 4011.51588 3349.00237 4011.50968 3349.12265 4011.50968 3349.87735 4011.51588 3349.99763 4011.59348 3350.74833 4011.61202 3350.86734 4011.76639 3351.60608 4011.79707 3351.72256 4012.02658 3352.44151 4012.06907 3352.55421 4012.37129 3353.24575 4012.42514 3353.35349 4012.79687 3354.01029 4012.86151 3354.11192 4013.2988 3354.72702 4013.37355 3354.82146 4013.87176 3355.38834 4013.95582 3355.4746 4014.50969 3355.98724 4014.60217 3356.0644 4015.20581 3356.51738 4015.30574 3356.58462 4015.95275 3356.97313 4016.05907 3357.02973 4016.7426 3357.34966 4016.85417 3357.39504 4017.56697 3357.64299 4017.68262 3357.67665 4018.41714 3357.84999 4018.53563 3357.87159 4019.28408 3357.96849 4019.40417 3357.97778 4020.15861 3357.99722 Z M 3915.44234 3355.11696 L 3915.69121 3355.145 3921.55179 3355.145 3921.80066 3355.11696 3922.01571 3355.04171 3922.20863 3354.92049 3922.36974 3354.75938 3922.49096 3354.56646 3922.56621 3354.35141 3922.59425 3354.10254 3922.59425 3346.27346 3922.56621 3346.02459 3922.49096 3345.80954 3922.36974 3345.61662 3922.20863 3345.45551 3922.01571 3345.33429 3921.80066 3345.25904 3921.55179 3345.231 3915.69121 3345.231 3915.44234 3345.25904 3915.22729 3345.33429 3915.03437 3345.45551 3914.87326 3345.61662 3914.75204 3345.80954 3914.67679 3346.02459 3914.64875 3346.27346 3914.64875 3354.10254 3914.67679 3354.35141 3914.75204 3354.56646 3914.87326 3354.75938 3915.03437 3354.92049 3915.22729 3355.04171 3915.44234 3355.11696 Z M 3927.12323 3343.73015 L 3927.12323 3341.68062 3926.05795 3341.68062 3926.05795 3342.68769 3926.08599 3342.93656 3926.16124 3343.15161 3926.28246 3343.34453 3926.44357 3343.50564 3926.63649 3343.62686 3926.85154 3343.70211 3927.12323 3343.73015 Z "}]},"pads":[],"nets":["LINPUT1","TOF_SDA","TOF_SCL","+2.8V","+3.3V","RINPUT1","TOF_ENL","GND","C49_1","C50_2","TOF_L_4","TOF_L_5","C47_1","L6_1","L6_2","TOF_L_6","R1_1"],"bom":{"both":[[1,"THD0515-12CL-SN","FPC-SMD_12P-P0.50_THD0515-12CL-SN",[["FPNL",0]],["THD","THD0515-12CL-SN","LCSC","C283143"]],[2,"VL6180X","VL6180X",[["TOF_R",1],["TOF_L",22]],[" ","?"," "," "]],[2,"10uF","C0603",[["C47",2],["C56",11]],["SAMSUNG","CL10A106KP8NNNC","LCSC","C19702"]],[4,"33pF","C0603",[["C48",3],["C49",4],["C54",9],["C55",10]],["YAGEO","CC0603JRNPO9BN330","LCSC","C107047"]],[2,"100nF","C0603",[["C50",5],["C53",8]],["SAMSUNG","CL10B104KB8NNNC","LCSC","C1591"]],[2,"4.7uF","C0603",[["C51",6],["C52",7]],["SAMSUNG","CL10A475KP8NNNC","LCSC","C1705"]],[1,"RB521S-30","SOD-523_L1.2-W0.8-LS1.6-RD",[["D1",12]],["SK","RB521S-30","LCSC","C122862"]],[2,"2.5KΩ","L0603",[["L5",13],["L6",14]],["MuRata","BLM18BD252SN1D","LCSC","C77668"]],[2,"AP2718AT","MIC-SMD_4P-L2.8-W1.9-P1.01-TL",[["MIC1",15],["MIC2",16]],["ALLPOWER(铨力)","AP2718AT","LCSC","C918197"]],[1,"L2N7002SDW1T1G","SOT-363_L2.0-W1.3-P0.65-LS2.1-BL",[["Q1",17]],["Leshan Radio","L2N7002SDW1T1G","LCSC","C383163"]],[2,"47K","0603",[["R1",18],["R77",19]],["UniOhm","0603WAF4702T5E","LCSC","C25819"]],[2,"2kΩ","R0603",[["R53",20],["R56",21]],["UniOhm","0603WAF2001T5E","LCSC","C22975"]]],"F":[[2,"VL6180X","VL6180X",[["TOF_R",1],["TOF_L",22]],[" ","?"," "," "]],[2,"10uF","C0603",[["C47",2],["C56",11]],["SAMSUNG","CL10A106KP8NNNC","LCSC","C19702"]],[4,"33pF","C0603",[["C48",3],["C49",4],["C54",9],["C55",10]],["YAGEO","CC0603JRNPO9BN330","LCSC","C107047"]],[2,"100nF","C0603",[["C50",5],["C53",8]],["SAMSUNG","CL10B104KB8NNNC","LCSC","C1591"]],[2,"4.7uF","C0603",[["C51",6],["C52",7]],["SAMSUNG","CL10A475KP8NNNC","LCSC","C1705"]],[1,"RB521S-30","SOD-523_L1.2-W0.8-LS1.6-RD",[["D1",12]],["SK","RB521S-30","LCSC","C122862"]],[2,"2.5KΩ","L0603",[["L5",13],["L6",14]],["MuRata","BLM18BD252SN1D","LCSC","C77668"]],[2,"AP2718AT","MIC-SMD_4P-L2.8-W1.9-P1.01-TL",[["MIC1",15],["MIC2",16]],["ALLPOWER(铨力)","AP2718AT","LCSC","C918197"]],[1,"L2N7002SDW1T1G","SOT-363_L2.0-W1.3-P0.65-LS2.1-BL",[["Q1",17]],["Leshan Radio","L2N7002SDW1T1G","LCSC","C383163"]],[2,"47K","0603",[["R1",18],["R77",19]],["UniOhm","0603WAF4702T5E","LCSC","C25819"]],[2,"2kΩ","R0603",[["R53",20],["R56",21]],["UniOhm","0603WAF2001T5E","LCSC","C22975"]]],"B":[[1,"THD0515-12CL-SN","FPC-SMD_12P-P0.50_THD0515-12CL-SN",[["FPNL",0]],["THD","THD0515-12CL-SN","LCSC","C283143"]]],"skipped":[],"customColumns":["BOM_Manufacturer","BOM_Manufacturer Part","BOM_Supplier","BOM_Supplier Part"]}};
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* Utility functions */
|
|
|
|
var storagePrefix = 'ibom__' + pcbdata.metadata.title + '__' +
|
|
pcbdata.metadata.revision + '__#';
|
|
|
|
function buildKeyForLocalStorageDict() {
|
|
return storagePrefix;
|
|
}
|
|
|
|
var storage;
|
|
var _isLocalStorageUsed = false;
|
|
|
|
function initStorage(key) {
|
|
try {
|
|
window.localStorage.getItem("blank");
|
|
storage = window.localStorage;
|
|
_isLocalStorageUsed = true;
|
|
} catch (e) {
|
|
// localStorage not available
|
|
}
|
|
if (!storage) {
|
|
try {
|
|
window.sessionStorage.getItem("blank");
|
|
storage = window.sessionStorage;
|
|
} catch (e) {
|
|
// sessionStorage also not available
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function readStorage(key) {
|
|
if(!storage) {
|
|
return null;
|
|
}
|
|
|
|
if(!_isLocalStorageUsed) {
|
|
return storage.getItem(storagePrefix + key);
|
|
}
|
|
|
|
try {
|
|
var dictKey = buildKeyForLocalStorageDict();
|
|
var obj = JSON.parse(storage.getItem(dictKey));
|
|
if(!obj || !obj.hasOwnProperty(key)) {
|
|
return null;
|
|
}
|
|
|
|
return JSON.parse(storage.getItem(dictKey))[key];
|
|
} catch(e) {
|
|
console.log('[ibom]: Unable to obtain a value from local storage!');
|
|
console.log(e);
|
|
}
|
|
|
|
// Original implementation
|
|
// return storage.getItem(storagePrefix + key);
|
|
}
|
|
|
|
|
|
function writeStorage(key, value) {
|
|
if(!storage) {
|
|
return;
|
|
}
|
|
|
|
if(!_isLocalStorageUsed) {
|
|
storage.setItem(storagePrefix + key, value);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
var dictKey = buildKeyForLocalStorageDict();
|
|
if(!storage.getItem(dictKey)) {
|
|
storage.setItem(dictKey,JSON.stringify({
|
|
_storagePrefix: storagePrefix
|
|
}));
|
|
}
|
|
|
|
var obj = JSON.parse(storage.getItem(dictKey));
|
|
obj[key] = value;
|
|
storage.setItem(dictKey,JSON.stringify(obj));
|
|
} catch(e) {
|
|
console.log('[ibom]: Unable to write key to local storage!');
|
|
console.log(e);
|
|
}
|
|
|
|
// Original implementation
|
|
// storage.setItem(storagePrefix + key, value);
|
|
}
|
|
|
|
function fancyDblClickHandler(el, onsingle, ondouble) {
|
|
return function() {
|
|
if (el.getAttribute("data-dblclick") == null) {
|
|
el.setAttribute("data-dblclick", 1);
|
|
setTimeout(function() {
|
|
if (el.getAttribute("data-dblclick") == 1) {
|
|
onsingle();
|
|
}
|
|
el.removeAttribute("data-dblclick");
|
|
}, 200);
|
|
} else {
|
|
el.removeAttribute("data-dblclick");
|
|
ondouble();
|
|
}
|
|
}
|
|
}
|
|
|
|
function smoothScrollToRow(rowid) {
|
|
document.getElementById(rowid).scrollIntoView({
|
|
behavior: "smooth",
|
|
block: "center",
|
|
inline: "nearest"
|
|
});
|
|
}
|
|
|
|
function focusInputField(input) {
|
|
input.scrollIntoView(false);
|
|
input.focus();
|
|
input.select();
|
|
}
|
|
|
|
function copyToClipboard() {
|
|
var text = '';
|
|
for (var node of bomhead.childNodes[0].childNodes) {
|
|
if (node.firstChild) {
|
|
text = text + node.firstChild.nodeValue;
|
|
}
|
|
if (node != bomhead.childNodes[0].lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
for (var row of bombody.childNodes) {
|
|
for (var cell of row.childNodes) {
|
|
for (var node of cell.childNodes) {
|
|
if (node.nodeName == "INPUT") {
|
|
if (node.checked) {
|
|
text = text + '✓';
|
|
}
|
|
} else if (node.nodeName == "MARK") {
|
|
text = text + node.firstChild.nodeValue;
|
|
} else {
|
|
text = text + node.nodeValue;
|
|
}
|
|
}
|
|
if (cell != row.lastChild) {
|
|
text += '\t';
|
|
}
|
|
}
|
|
text += '\n';
|
|
}
|
|
var textArea = document.createElement("textarea");
|
|
textArea.classList.add('clipboard-temp');
|
|
textArea.value = text;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.focus();
|
|
textArea.select();
|
|
|
|
try {
|
|
if (document.execCommand('copy')) {
|
|
console.log('Bom copied to clipboard.');
|
|
}
|
|
} catch (err) {
|
|
console.log('Can not copy to clipboard.');
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
}
|
|
|
|
function removeGutterNode(node) {
|
|
for (var i = 0; i < node.childNodes.length; i++) {
|
|
if (node.childNodes[i].classList &&
|
|
node.childNodes[i].classList.contains("gutter")) {
|
|
node.removeChild(node.childNodes[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function cleanGutters() {
|
|
removeGutterNode(document.getElementById("bot"));
|
|
removeGutterNode(document.getElementById("canvasdiv"));
|
|
}
|
|
|
|
var units = {
|
|
prefixes: {
|
|
giga: ["G", "g", "giga", "Giga", "GIGA"],
|
|
mega: ["M", "mega", "Mega", "MEGA"],
|
|
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
|
|
milli: ["m", "milli", "Milli", "MILLI"],
|
|
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
|
|
nano: ["N", "n", "nano", "Nano", "NANO"],
|
|
pico: ["P", "p", "pico", "Pico", "PICO"],
|
|
},
|
|
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
|
|
unitsLong: [
|
|
"OHM", "Ohm", "ohm", "ohms",
|
|
"FARAD", "Farad", "farad",
|
|
"HENRY", "Henry", "henry"
|
|
],
|
|
getMultiplier: function(s) {
|
|
if (this.prefixes.giga.includes(s)) return 1e9;
|
|
if (this.prefixes.mega.includes(s)) return 1e6;
|
|
if (this.prefixes.kilo.includes(s)) return 1e3;
|
|
if (this.prefixes.milli.includes(s)) return 1e-3;
|
|
if (this.prefixes.micro.includes(s)) return 1e-6;
|
|
if (this.prefixes.nano.includes(s)) return 1e-9;
|
|
if (this.prefixes.pico.includes(s)) return 1e-12;
|
|
return 1;
|
|
},
|
|
valueRegex: null,
|
|
}
|
|
|
|
function initUtils() {
|
|
var allPrefixes = units.prefixes.giga
|
|
.concat(units.prefixes.mega)
|
|
.concat(units.prefixes.kilo)
|
|
.concat(units.prefixes.milli)
|
|
.concat(units.prefixes.micro)
|
|
.concat(units.prefixes.nano)
|
|
.concat(units.prefixes.pico);
|
|
var allUnits = units.unitsShort.concat(units.unitsLong);
|
|
units.valueRegex = new RegExp("^([0-9\.]+)" +
|
|
"\\s*(" + allPrefixes.join("|") + ")?" +
|
|
"(" + allUnits.join("|") + ")?" +
|
|
"(\\b.*)?$", "");
|
|
units.valueAltRegex = new RegExp("^([0-9]*)" +
|
|
"(" + units.unitsShort.join("|") + ")?" +
|
|
"([GgMmKkUuNnPp])?" +
|
|
"([0-9]*)" +
|
|
"(\\b.*)?$", "");
|
|
for (var bom_type of ["both", "F", "B"]) {
|
|
for (var row of pcbdata.bom[bom_type]) {
|
|
row.push(parseValue(row[1], row[3][0][0]));
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
unit = unit[0];
|
|
} else {
|
|
ref = /^([a-z]+)\d+$/i.exec(ref);
|
|
if (ref) {
|
|
ref = ref[1].toLowerCase();
|
|
if (ref == "c") unit = 'f';
|
|
else if (ref == "l") unit = 'h';
|
|
else if (ref == "r" || ref == "rv") unit = 'r';
|
|
else unit = null;
|
|
}
|
|
}
|
|
return unit;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
var unit;
|
|
if (match) {
|
|
val = parseFloat(match[1]);
|
|
if (match[2]) {
|
|
val = val * units.getMultiplier(match[2]);
|
|
}
|
|
unit = inferUnit(match[3], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
match = units.valueAltRegex.exec(val);
|
|
if (match && (match[1] || match[4])) {
|
|
val = parseFloat(match[1] + "." + match[4]);
|
|
if (match[3]) {
|
|
val = val * units.getMultiplier(match[3]);
|
|
}
|
|
unit = inferUnit(match[2], ref);
|
|
if (!unit) return null;
|
|
else return {
|
|
val: val,
|
|
unit: unit,
|
|
extra: match[5],
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function valueCompare(a, b, stra, strb) {
|
|
if (a === null && b === null) {
|
|
// Failed to parse both values, compare them as strings.
|
|
if (stra != strb) return stra > strb ? 1 : -1;
|
|
else return 0;
|
|
} else if (a === null) {
|
|
return 1;
|
|
} else if (b === null) {
|
|
return -1;
|
|
} else {
|
|
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
|
|
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
|
|
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
|
|
function validateSaveImgDimension(element) {
|
|
var valid = false;
|
|
var intValue = 0;
|
|
if (/^[1-9]\d*$/.test(element.value)) {
|
|
intValue = parseInt(element.value);
|
|
if (intValue <= 16000) {
|
|
valid = true;
|
|
}
|
|
}
|
|
if (valid) {
|
|
element.classList.remove("invalid");
|
|
} else {
|
|
element.classList.add("invalid");
|
|
}
|
|
return intValue;
|
|
}
|
|
|
|
function saveImage(layer) {
|
|
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
|
|
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
|
|
var bgcolor = null;
|
|
if (!document.getElementById("render-save-transparent").checked) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
bgcolor = style.getPropertyValue("background-color");
|
|
}
|
|
if (!width || !height) return;
|
|
|
|
// Prepare image
|
|
var canvas = document.createElement("canvas");
|
|
var layerdict = {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
bg: canvas,
|
|
fab: canvas,
|
|
silk: canvas,
|
|
highlight: canvas,
|
|
layer: layer,
|
|
}
|
|
// Do the rendering
|
|
recalcLayerScale(layerdict, width, height);
|
|
prepareLayer(layerdict);
|
|
clearCanvas(canvas, bgcolor);
|
|
drawBackground(layerdict, false);
|
|
drawHighlightsOnLayer(layerdict, false);
|
|
|
|
// Save image
|
|
var imgdata = canvas.toDataURL("image/png");
|
|
|
|
var filename = pcbdata.metadata.title;
|
|
if (pcbdata.metadata.revision) {
|
|
filename += `.${pcbdata.metadata.revision}`;
|
|
}
|
|
filename += `.${layer}.png`;
|
|
saveFile(filename, dataURLtoBlob(imgdata));
|
|
}
|
|
|
|
function saveSettings() {
|
|
var data = {
|
|
type: "InteractiveHtmlBom settings",
|
|
version: 1,
|
|
pcbmetadata: pcbdata.metadata,
|
|
settings: settings,
|
|
}
|
|
var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
|
|
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
|
|
}
|
|
|
|
function loadSettings() {
|
|
var input = document.createElement("input");
|
|
input.type = "file";
|
|
input.accept = ".settings.json";
|
|
input.onchange = function(e) {
|
|
var file = e.target.files[0];
|
|
var reader = new FileReader();
|
|
reader.onload = readerEvent => {
|
|
var content = readerEvent.target.result;
|
|
var newSettings;
|
|
try {
|
|
newSettings = JSON.parse(content);
|
|
} catch(e) {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
if (newSettings.type != "InteractiveHtmlBom settings") {
|
|
alert("Selected file is not InteractiveHtmlBom settings file.");
|
|
return;
|
|
}
|
|
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
|
|
if (metadataMatches) {
|
|
for (var k in pcbdata.metadata) {
|
|
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
|
|
metadataMatches = false;
|
|
}
|
|
}
|
|
}
|
|
if (!metadataMatches) {
|
|
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
|
|
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
|
|
if (!confirm(
|
|
`Settins file metadata does not match current metadata.\n\n` +
|
|
`Page metadata:\n${currentMetadata}\n\n` +
|
|
`Settings file metadata:\n${fileMetadata}\n\n` +
|
|
`Press OK if you would like to import settings anyway.`)) {
|
|
return;
|
|
}
|
|
}
|
|
overwriteSettings(newSettings.settings);
|
|
}
|
|
reader.readAsText(file, 'UTF-8');
|
|
}
|
|
input.click();
|
|
}
|
|
|
|
function overwriteSettings(newSettings) {
|
|
|
|
initDone = false;
|
|
Object.assign(settings, newSettings);
|
|
writeStorage("bomlayout", settings.bomlayout);
|
|
writeStorage("bommode", settings.bommode);
|
|
writeStorage("canvaslayout", settings.canvaslayout);
|
|
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
|
|
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
|
|
for (var checkbox of settings.checkboxes) {
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
}
|
|
writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
|
|
padsVisible(settings.renderPads);
|
|
document.getElementById("padsCheckbox").checked = settings.renderPads;
|
|
fabricationVisible(settings.renderFabrication);
|
|
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
|
|
silkscreenVisible(settings.renderSilkscreen);
|
|
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
|
|
referencesVisible(settings.renderReferences);
|
|
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
|
|
valuesVisible(settings.renderValues);
|
|
document.getElementById("valuesCheckbox").checked = settings.renderValues;
|
|
tracksVisible(settings.renderTracks);
|
|
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
|
|
zonesVisible(settings.renderZones);
|
|
document.getElementById("zonesCheckbox").checked = settings.renderZones;
|
|
dnpOutline(settings.renderDnpOutline);
|
|
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
|
|
setRedrawOnDrag(settings.redrawOnDrag);
|
|
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
|
|
setShowCrosshair(settings.showCrosshair);
|
|
document.getElementById("crosshairCheckbox").checked = settings.showCrosshair;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
changeBomLayout(settings.bomlayout);
|
|
}
|
|
|
|
function saveFile(filename, blob) {
|
|
var link = document.createElement("a");
|
|
var objurl = URL.createObjectURL(blob);
|
|
link.download = filename;
|
|
link.href = objurl;
|
|
link.click();
|
|
}
|
|
|
|
function dataURLtoBlob(dataurl) {
|
|
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
|
|
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
|
while(n--){
|
|
u8arr[n] = bstr.charCodeAt(n);
|
|
}
|
|
return new Blob([u8arr], {type:mime});
|
|
}
|
|
|
|
var settings = {
|
|
canvaslayout: "default",
|
|
bomlayout: "default",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: false,
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
}
|
|
|
|
function initDefaults() {
|
|
settings.bomlayout = readStorage("bomlayout");
|
|
if (settings.bomlayout === null) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
|
|
settings.bomlayout = config.bom_view;
|
|
}
|
|
settings.bommode = readStorage("bommode");
|
|
if (settings.bommode === null) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
|
|
settings.bommode = "grouped";
|
|
}
|
|
settings.canvaslayout = readStorage("canvaslayout");
|
|
if (settings.canvaslayout === null) {
|
|
settings.canvaslayout = config.layer_view;
|
|
}
|
|
var bomCheckboxes = readStorage("bomCheckboxes");
|
|
if (bomCheckboxes === null) {
|
|
bomCheckboxes = config.checkboxes;
|
|
}
|
|
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
|
|
document.getElementById("bomCheckboxes").value = bomCheckboxes;
|
|
|
|
settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
|
|
populateDarkenWhenCheckedOptions();
|
|
|
|
function initBooleanSetting(storageString, def, elementId, func) {
|
|
var b = readStorage(storageString);
|
|
if (b === null) {
|
|
b = def;
|
|
} else {
|
|
b = (b === true);
|
|
}
|
|
document.getElementById(elementId).checked = b;
|
|
func(b);
|
|
}
|
|
|
|
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
|
|
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
|
|
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
|
|
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
|
|
initBooleanSetting("valuesVisible", false, "valuesCheckbox", valuesVisible);
|
|
if ("tracks" in pcbdata) {
|
|
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
|
|
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
|
|
} else {
|
|
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
|
|
tracksVisible(false);
|
|
zonesVisible(false);
|
|
}
|
|
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
|
|
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
|
|
initBooleanSetting("showCrosshair", config.show_crosshair, "crosshairCheckbox", setShowCrosshair);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
|
|
settings.boardRotation = readStorage("boardRotation");
|
|
if (settings.boardRotation === null) {
|
|
settings.boardRotation = config.board_rotation * 5;
|
|
} else {
|
|
settings.boardRotation = parseInt(settings.boardRotation);
|
|
}
|
|
document.getElementById("boardRotation").value = settings.boardRotation / 5;
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
}
|
|
|
|
// Helper classes for user js callbacks.
|
|
|
|
const IBOM_EVENT_TYPES = {
|
|
ALL: "all",
|
|
HIGHLIGHT_EVENT: "highlightEvent",
|
|
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
|
|
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
|
|
}
|
|
|
|
const EventHandler = {
|
|
callbacks: {},
|
|
init: function() {
|
|
for (eventType of Object.values(IBOM_EVENT_TYPES))
|
|
this.callbacks[eventType] = [];
|
|
},
|
|
registerCallback: function(eventType, callback) {
|
|
this.callbacks[eventType].push(callback);
|
|
},
|
|
emitEvent: function(eventType, eventArgs) {
|
|
event = {
|
|
eventType: eventType,
|
|
args: eventArgs,
|
|
}
|
|
var callback;
|
|
for(callback of this.callbacks[eventType])
|
|
callback(event);
|
|
for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
|
|
callback(event);
|
|
}
|
|
}
|
|
EventHandler.init();
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* PCB rendering code */
|
|
|
|
var emptyContext2d = document.createElement("canvas").getContext("2d");
|
|
var hitTestContext2d = document.createElement("canvas").getContext("2d");
|
|
|
|
function deg2rad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
|
|
var point = [
|
|
linepoint[0] * text.width + offsetx,
|
|
linepoint[1] * text.height + offsety
|
|
];
|
|
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
|
|
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
|
|
return point;
|
|
}
|
|
|
|
function drawText(ctx, text, color) {
|
|
if ("ref" in text && !settings.renderReferences) return;
|
|
if ("val" in text && !settings.renderValues) return;
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
ctx.lineJoin = "round";
|
|
ctx.lineWidth = text.thickness;
|
|
|
|
if ("svgpath" in text) {
|
|
// TODO: This path must be cached!
|
|
const path = new Path2D(text.svgpath);
|
|
if(text.useTrueTypeFontRendering) {
|
|
ctx.fill(path);
|
|
} else {
|
|
ctx.stroke(path);
|
|
}
|
|
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
|
|
ctx.translate(...text.pos);
|
|
ctx.translate(text.thickness * 0.5, 0);
|
|
var angle = -text.angle;
|
|
if (text.attr.includes("mirrored")) {
|
|
ctx.scale(-1, 1);
|
|
angle = -angle;
|
|
}
|
|
var tilt = 0;
|
|
if (text.attr.includes("italic")) {
|
|
tilt = 0.125;
|
|
}
|
|
var interline = text.height * 1.5 + text.thickness;
|
|
var txt = text.text.split("\n");
|
|
// KiCad ignores last empty line.
|
|
if (txt[txt.length - 1] == '') txt.pop();
|
|
ctx.rotate(deg2rad(angle));
|
|
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
|
|
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
|
|
for (var i in txt) {
|
|
var lineWidth = text.thickness + interline / 2 * tilt;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
lineWidth += fourSpaces - lineWidth % fourSpaces;
|
|
} else {
|
|
if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
}
|
|
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
|
|
}
|
|
}
|
|
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
|
|
var inOverbar = false;
|
|
for (var j = 0; j < txt[i].length; j++) {
|
|
if (txt[i][j] == '\t') {
|
|
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
|
|
offsetx += fourSpaces - offsetx % fourSpaces;
|
|
continue;
|
|
} else if (txt[i][j] == '~') {
|
|
j++;
|
|
if (j == txt[i].length)
|
|
break;
|
|
if (txt[i][j] != '~') {
|
|
inOverbar = !inOverbar;
|
|
}
|
|
}
|
|
var glyph = pcbdata.font_data[txt[i][j]];
|
|
if (inOverbar) {
|
|
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
|
|
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
|
|
|
|
if (!lastHadOverbar) {
|
|
overbarStart[0] += text.height * 1.4 * tilt;
|
|
lastHadOverbar = true;
|
|
}
|
|
ctx.beginPath();
|
|
ctx.moveTo(...overbarStart);
|
|
ctx.lineTo(...overbarEnd);
|
|
ctx.stroke();
|
|
} else {
|
|
lastHadOverbar = false;
|
|
}
|
|
for (var line of glyph.l) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
|
|
for (var k = 1; k < line.length; k++) {
|
|
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
offsetx += glyph.w * text.width;
|
|
}
|
|
offsety += interline;
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawedge(ctx, scalefactor, edge, color) {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
|
|
ctx.lineCap = "round";
|
|
if ("svgpath" in edge) {
|
|
ctx.stroke(new Path2D(edge.svgpath));
|
|
} else {
|
|
ctx.beginPath();
|
|
if (edge.type == "segment") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(...edge.end);
|
|
}
|
|
if (edge.type == "rect") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.lineTo(edge.start[0], edge.end[1]);
|
|
ctx.lineTo(...edge.end);
|
|
ctx.lineTo(edge.end[0], edge.start[1]);
|
|
ctx.lineTo(...edge.start);
|
|
}
|
|
if (edge.type == "arc") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
deg2rad(edge.startangle),
|
|
deg2rad(edge.endangle));
|
|
}
|
|
if (edge.type == "circle") {
|
|
ctx.arc(
|
|
...edge.start,
|
|
edge.radius,
|
|
0, 2 * Math.PI);
|
|
ctx.closePath();
|
|
}
|
|
if (edge.type == "curve") {
|
|
ctx.moveTo(...edge.start);
|
|
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
|
|
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
|
|
var path = new Path2D();
|
|
var width = size[0];
|
|
var height = size[1];
|
|
var x = width * -0.5;
|
|
var y = height * -0.5;
|
|
var chamfOffset = Math.min(width, height) * chamfratio;
|
|
path.moveTo(x, 0);
|
|
if (chamfpos & 4) {
|
|
path.lineTo(x, y + height - chamfOffset);
|
|
path.lineTo(x + chamfOffset, y + height);
|
|
path.lineTo(0, y + height);
|
|
} else {
|
|
path.arcTo(x, y + height, x + width, y + height, radius);
|
|
}
|
|
if (chamfpos & 8) {
|
|
path.lineTo(x + width - chamfOffset, y + height);
|
|
path.lineTo(x + width, y + height - chamfOffset);
|
|
path.lineTo(x + width, 0);
|
|
} else {
|
|
path.arcTo(x + width, y + height, x + width, y, radius);
|
|
}
|
|
if (chamfpos & 2) {
|
|
path.lineTo(x + width, y + chamfOffset);
|
|
path.lineTo(x + width - chamfOffset, y);
|
|
path.lineTo(0, y);
|
|
} else {
|
|
path.arcTo(x + width, y, x, y, radius);
|
|
}
|
|
if (chamfpos & 1) {
|
|
path.lineTo(x + chamfOffset, y);
|
|
path.lineTo(x, y + chamfOffset);
|
|
path.lineTo(x, 0);
|
|
} else {
|
|
path.arcTo(x, y, x, y + height, radius);
|
|
}
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getOblongPath(size) {
|
|
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
|
|
}
|
|
|
|
function getPolygonsPath(shape) {
|
|
if (shape.path2d) {
|
|
return shape.path2d;
|
|
}
|
|
if ("svgpath" in shape) {
|
|
shape.path2d = new Path2D(shape.svgpath);
|
|
} else {
|
|
var path = new Path2D();
|
|
for (var polygon of shape.polygons) {
|
|
path.moveTo(...polygon[0]);
|
|
for (var i = 1; i < polygon.length; i++) {
|
|
path.lineTo(...polygon[i]);
|
|
}
|
|
path.closePath();
|
|
}
|
|
shape.path2d = path;
|
|
}
|
|
return shape.path2d;
|
|
}
|
|
|
|
function drawPolygonShape(ctx, shape, color) {
|
|
ctx.save();
|
|
ctx.fillStyle = color;
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
ctx.fill(getPolygonsPath(shape));
|
|
ctx.restore();
|
|
}
|
|
|
|
|
|
function drawPolylineShape(ctx, shape, color) {
|
|
ctx.save();
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = shape.width;
|
|
if (!("svgpath" in shape)) {
|
|
ctx.translate(...shape.pos);
|
|
ctx.rotate(deg2rad(-shape.angle));
|
|
}
|
|
ctx.stroke(getPolygonsPath(shape));
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawDrawing(ctx, scalefactor, drawing, color) {
|
|
if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
|
|
drawedge(ctx, scalefactor, drawing, color);
|
|
} else if (drawing.type == "polygon") {
|
|
drawPolygonShape(ctx, drawing, color);
|
|
} else if (drawing.type == "text") {
|
|
drawText(ctx, drawing, color);
|
|
} else if (drawing.type == "polyline") {
|
|
drawPolylineShape(ctx, drawing, color);
|
|
}
|
|
}
|
|
|
|
function getCirclePath(radius) {
|
|
var path = new Path2D();
|
|
path.arc(0, 0, radius, 0, 2 * Math.PI);
|
|
path.closePath();
|
|
return path;
|
|
}
|
|
|
|
function getCachedPadPath(pad) {
|
|
if (!pad.path2d) {
|
|
// if path2d is not set, build one and cache it on pad object
|
|
if (pad.shape == "rect") {
|
|
pad.path2d = new Path2D();
|
|
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
|
|
} else if (pad.shape == "oval") {
|
|
pad.path2d = getOblongPath(pad.size);
|
|
} else if (pad.shape == "circle") {
|
|
pad.path2d = getCirclePath(pad.size[0] / 2);
|
|
} else if (pad.shape == "roundrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
|
|
} else if (pad.shape == "chamfrect") {
|
|
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
|
|
} else if (pad.shape == "custom") {
|
|
pad.path2d = getPolygonsPath(pad);
|
|
} else if(pad.shape === "polygon") {
|
|
pad.path2d = new Path2D();
|
|
if(pad.polygon.length > 1) {
|
|
const pos = {
|
|
x: pad.pos[0],
|
|
y: pad.pos[1]
|
|
};
|
|
|
|
pad.path2d.moveTo(pad.polygon[0].x - pos.x, pad.polygon[0].y - pos.y);
|
|
for (var i = 1; i < pad.polygon.length; i++) {
|
|
const point = pad.polygon[i];
|
|
pad.path2d.lineTo(point.x - pos.x, point.y - pos.y);
|
|
}
|
|
pad.path2d.closePath();
|
|
}
|
|
}
|
|
}
|
|
return pad.path2d;
|
|
}
|
|
|
|
function drawPad(ctx, pad, color, outline) {
|
|
ctx.save();
|
|
ctx.translate(...pad.pos);
|
|
if(pad.shape !== 'polygon') {
|
|
ctx.rotate(deg2rad(pad.angle));
|
|
} else {
|
|
ctx.rotate(deg2rad(0));
|
|
}
|
|
|
|
if (pad.offset) {
|
|
ctx.translate(...pad.offset);
|
|
}
|
|
ctx.fillStyle = color;
|
|
ctx.strokeStyle = color;
|
|
var path = getCachedPadPath(pad);
|
|
if (outline) {
|
|
ctx.stroke(path);
|
|
} else {
|
|
ctx.fill(path);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawPadHole(ctx, pad, padHoleColor) {
|
|
if (pad.type != "th") {
|
|
return
|
|
};
|
|
|
|
ctx.save();
|
|
ctx.translate(pad.holeCenterPoint.x, pad.holeCenterPoint.y);
|
|
ctx.rotate(deg2rad(pad.angle));
|
|
ctx.fillStyle = padHoleColor;
|
|
if (pad.drillshape == "oblong") {
|
|
ctx.fill(getOblongPath(pad.drillsize));
|
|
} else {
|
|
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprint(ctx, layer, scalefactor, footprint, padColor, padHoleColor, outlineColor, highlight, outline) {
|
|
if (highlight) {
|
|
// draw bounding box
|
|
if (footprint.layer == layer) {
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.2;
|
|
ctx.translate(...footprint.bbox.pos);
|
|
ctx.rotate(deg2rad(-footprint.bbox.angle));
|
|
ctx.translate(...footprint.bbox.relpos);
|
|
ctx.fillStyle = padColor;
|
|
ctx.fillRect(0, 0, ...footprint.bbox.size);
|
|
ctx.globalAlpha = 1;
|
|
ctx.strokeStyle = padColor;
|
|
ctx.strokeRect(0, 0, ...footprint.bbox.size);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
// draw drawings
|
|
for (var drawing of footprint.drawings) {
|
|
if (drawing.layer == layer) {
|
|
drawDrawing(ctx, scalefactor, drawing.drawing, padColor);
|
|
}
|
|
}
|
|
// draw pads
|
|
if (settings.renderPads) {
|
|
for (var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, outline);
|
|
if (pad.pin1 && settings.highlightpin1) {
|
|
drawPad(ctx, pad, outlineColor, true);
|
|
}
|
|
}
|
|
}
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawCrosshair(canvas, x, y, scalefactor, color) {
|
|
if(!settings.showCrosshair) {
|
|
return;
|
|
}
|
|
|
|
var ctx = canvas.getContext("2d");
|
|
|
|
HTMLFormControlsCollection.log
|
|
|
|
ctx.save();
|
|
ctx.globalAlpha = 0.75;
|
|
ctx.lineWidth = 2 / scalefactor;
|
|
ctx.strokeStyle = color;
|
|
|
|
// TODO: Should calculate a proper bbox for the view port.
|
|
const dummyOffset = 4000;
|
|
|
|
// horz line
|
|
ctx.beginPath();
|
|
ctx.moveTo(x - dummyOffset, y);
|
|
ctx.lineTo(x + dummyOffset, y);
|
|
ctx.stroke();
|
|
|
|
// vert line
|
|
ctx.beginPath();
|
|
ctx.moveTo(x, y - dummyOffset);
|
|
ctx.lineTo(x, y + dummyOffset);
|
|
ctx.stroke();
|
|
|
|
ctx.globalAlpha = 1;
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawEdgeCuts(canvas, scalefactor) {
|
|
var ctx = canvas.getContext("2d");
|
|
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
|
|
for (var edge of pcbdata.edges) {
|
|
drawedge(ctx, scalefactor, edge, edgecolor);
|
|
}
|
|
}
|
|
|
|
function drawOrphanPads(canvas, layer, scalefactor, highlight, highlightedPads) {
|
|
if (!settings.renderPads) {
|
|
return;
|
|
}
|
|
|
|
highlightedPads = highlightedPads || [];
|
|
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var padColor = style.getPropertyValue('--pad-color');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
if (highlight) {
|
|
padColor = style.getPropertyValue('--pad-color-highlight');
|
|
outlineColor = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
}
|
|
|
|
var i = 0;
|
|
for (var pad of pcbdata.pads) {
|
|
if (pad.layers.includes(layer)) {
|
|
var outline = settings.renderDnpOutline;
|
|
if (!highlight || highlightedPads.includes(i)) {
|
|
drawPad(ctx, pad, padColor, outline);
|
|
}
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
for (var pad of pcbdata.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawFootprints(canvas, layer, scalefactor, highlight) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.lineWidth = 3 / scalefactor;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var padColor = style.getPropertyValue('--pad-color');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var outlineColor = style.getPropertyValue('--pin1-outline-color');
|
|
if (highlight) {
|
|
padColor = style.getPropertyValue('--pad-color-highlight');
|
|
outlineColor = style.getPropertyValue('--pin1-outline-color-highlight');
|
|
}
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var mod = pcbdata.footprints[i];
|
|
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
|
|
if (!highlight || highlightedFootprints.includes(i)) {
|
|
drawFootprint(ctx, layer, scalefactor, mod, padColor, padHoleColor, outlineColor, highlight, outline);
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
|
|
var ctx = canvas.getContext("2d");
|
|
for (var d of pcbdata.drawings[layername][layer]) {
|
|
if (["segment", "arc", "circle", "curve", "rect","polyline"].includes(d.type)) {
|
|
drawedge(ctx, scalefactor, d, edgeColor);
|
|
} else if (d.type == "polygon") {
|
|
drawPolygonShape(ctx, d, polygonColor);
|
|
} else if (d.type == "text") {
|
|
drawText(ctx, d, polygonColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawTracks(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.strokeStyle = color;
|
|
ctx.lineCap = "round";
|
|
for(var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
ctx.lineWidth = track.width;
|
|
|
|
if(track.type === 'polyline') {
|
|
drawPolylineShape(ctx,track,color);
|
|
} else if(track.type === 'polygon') {
|
|
drawPolygonShape(ctx, track, color);
|
|
} else if(track.type === 'text') {
|
|
drawText(ctx, track, color);
|
|
} else {
|
|
if ('radius' in track) {
|
|
ctx.beginPath();
|
|
ctx.arc(
|
|
...track.center,
|
|
track.radius,
|
|
deg2rad(track.startangle),
|
|
deg2rad(track.endangle));
|
|
ctx.stroke();
|
|
} else if('start' in track && 'end' in track) {
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, color, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.strokeStyle = color;
|
|
ctx.fillStyle = color;
|
|
ctx.lineJoin = "round";
|
|
for(var zone of pcbdata.zones[layer]) {
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.fill(zone.path2d);
|
|
if (zone.width > 0) {
|
|
ctx.lineWidth = zone.width;
|
|
ctx.stroke(zone.path2d);
|
|
}
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function clearCanvas(canvas, color = null) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.save();
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
if (color) {
|
|
ctx.fillStyle = color;
|
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
} else {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
}
|
|
ctx.restore();
|
|
}
|
|
|
|
function drawNets(canvas, layer, highlight) {
|
|
var style = getComputedStyle(topmostdiv);
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, highlight);
|
|
}
|
|
if (settings.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (highlight && settings.renderPads) {
|
|
var padColor = style.getPropertyValue('--pad-color-highlight');
|
|
var padHoleColor = style.getPropertyValue('--pad-hole-color');
|
|
var ctx = canvas.getContext("2d");
|
|
for (var footprint of pcbdata.footprints) {
|
|
// draw pads
|
|
var padDrawn = false;
|
|
for (var pad of footprint.pads) {
|
|
if (highlightedNet != pad.net) continue;
|
|
if (pad.layers.includes(layer)) {
|
|
drawPad(ctx, pad, padColor, false);
|
|
padDrawn = true;
|
|
}
|
|
}
|
|
if (padDrawn) {
|
|
// redraw all pad holes because some pads may overlap
|
|
for (var pad of footprint.pads) {
|
|
drawPadHole(ctx, pad, padHoleColor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawHighlightsOnLayer(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.highlight);
|
|
}
|
|
|
|
if (highlightedFootprints.length > 0) {
|
|
drawFootprints(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true);
|
|
}
|
|
|
|
// Draw crosshairs
|
|
if (highlightedFootprints.length > 0) {
|
|
for(var i = 0; i < pcbdata.footprints.length; i++) {
|
|
const footprint = pcbdata.footprints[i];
|
|
if(highlightedFootprints.includes(i) && footprint.layer === canvasdict.layer) {
|
|
drawCrosshair(canvasdict.highlight, footprint.center[0], footprint.center[1], canvasdict.transform.s * canvasdict.transform.zoom, 'red');
|
|
}
|
|
}
|
|
}
|
|
|
|
if (highlightedNet !== null) {
|
|
var highlightedPads = [];
|
|
for(var i = 0; i < pcbdata.pads.length; i++) {
|
|
var pad = pcbdata.pads[i];
|
|
if(pad.net === highlightedNet) {
|
|
highlightedPads.push(i);
|
|
}
|
|
}
|
|
|
|
drawOrphanPads(canvasdict.highlight, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom, true, highlightedPads);
|
|
|
|
drawNets(canvasdict.highlight, canvasdict.layer, true);
|
|
}
|
|
}
|
|
|
|
function drawHighlights() {
|
|
drawHighlightsOnLayer(allcanvas.front);
|
|
drawHighlightsOnLayer(allcanvas.back);
|
|
}
|
|
|
|
function drawBackground(canvasdict, clear = true) {
|
|
if (clear) {
|
|
clearCanvas(canvasdict.bg);
|
|
clearCanvas(canvasdict.fab);
|
|
clearCanvas(canvasdict.silk);
|
|
}
|
|
|
|
drawNets(canvasdict.bg, canvasdict.layer, false);
|
|
|
|
drawOrphanPads(canvasdict.bg, canvasdict.layer, canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawFootprints(canvasdict.bg, canvasdict.layer, canvasdict.transform.s * canvasdict.transform.zoom, false);
|
|
|
|
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
|
|
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
|
|
var textColor = style.getPropertyValue('--silkscreen-text-color');
|
|
if (settings.renderSilkscreen) {
|
|
drawBgLayer(
|
|
"silkscreen", canvasdict.silk, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
edgeColor = style.getPropertyValue('--fabrication-edge-color');
|
|
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
|
|
textColor = style.getPropertyValue('--fabrication-text-color');
|
|
if (settings.renderFabrication) {
|
|
drawBgLayer(
|
|
"fabrication", canvasdict.fab, canvasdict.layer,
|
|
canvasdict.transform.s * canvasdict.transform.zoom,
|
|
edgeColor, polygonColor, textColor);
|
|
}
|
|
}
|
|
|
|
function prepareCanvas(canvas, flip, transform) {
|
|
var ctx = canvas.getContext("2d");
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
var fontsize = 1.55;
|
|
ctx.scale(transform.zoom, transform.zoom);
|
|
ctx.translate(transform.panx, transform.pany);
|
|
if (flip) {
|
|
ctx.scale(-1, 1);
|
|
}
|
|
ctx.translate(transform.x, transform.y);
|
|
ctx.rotate(deg2rad(settings.boardRotation));
|
|
ctx.scale(transform.s, transform.s);
|
|
}
|
|
|
|
function prepareLayer(canvasdict) {
|
|
var flip = (canvasdict.layer == "B");
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
|
|
}
|
|
}
|
|
|
|
function rotateVector(v, angle) {
|
|
angle = deg2rad(angle);
|
|
return [
|
|
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
|
|
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
|
|
];
|
|
}
|
|
|
|
function applyRotation(bbox) {
|
|
var corners = [
|
|
[bbox.minx, bbox.miny],
|
|
[bbox.minx, bbox.maxy],
|
|
[bbox.maxx, bbox.miny],
|
|
[bbox.maxx, bbox.maxy],
|
|
];
|
|
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
|
|
return {
|
|
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
|
|
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
|
|
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
|
|
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
|
|
}
|
|
}
|
|
|
|
function recalcLayerScale(layerdict, width, height) {
|
|
var bbox = applyRotation(pcbdata.edges_bbox);
|
|
var scalefactor = 0.98 * Math.min(
|
|
width / (bbox.maxx - bbox.minx),
|
|
height / (bbox.maxy - bbox.miny)
|
|
);
|
|
if (scalefactor < 0.1) {
|
|
scalefactor = 1;
|
|
}
|
|
layerdict.transform.s = scalefactor;
|
|
var flip = (layerdict.layer == "B");
|
|
if (flip) {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
|
|
} else {
|
|
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
|
|
}
|
|
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
|
|
for (var c of ["bg", "fab", "silk", "highlight"]) {
|
|
canvas = layerdict[c];
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
canvas.style.width = (width / devicePixelRatio) + "px";
|
|
canvas.style.height = (height / devicePixelRatio) + "px";
|
|
}
|
|
}
|
|
|
|
function redrawCanvas(layerdict) {
|
|
prepareLayer(layerdict);
|
|
drawBackground(layerdict);
|
|
drawHighlightsOnLayer(layerdict);
|
|
}
|
|
|
|
function resizeCanvas(layerdict) {
|
|
var canvasdivid = {
|
|
"F": "frontcanvas",
|
|
"B": "backcanvas"
|
|
} [layerdict.layer];
|
|
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
|
|
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
|
|
recalcLayerScale(layerdict, width, height);
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function resizeAll() {
|
|
resizeCanvas(allcanvas.front);
|
|
resizeCanvas(allcanvas.back);
|
|
}
|
|
|
|
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
|
|
var A = x - x1;
|
|
var B = y - y1;
|
|
var C = x2 - x1;
|
|
var D = y2 - y1;
|
|
|
|
var dot = A * C + B * D;
|
|
var len_sq = C * C + D * D;
|
|
var dx, dy;
|
|
if (len_sq == 0) {
|
|
// start and end of the segment coincide
|
|
dx = x - x1;
|
|
dy = y - y1;
|
|
} else {
|
|
var param = dot / len_sq;
|
|
var xx, yy;
|
|
if (param < 0) {
|
|
xx = x1;
|
|
yy = y1;
|
|
} else if (param > 1) {
|
|
xx = x2;
|
|
yy = y2;
|
|
} else {
|
|
xx = x1 + param * C;
|
|
yy = y1 + param * D;
|
|
}
|
|
dx = x - xx;
|
|
dy = y - yy;
|
|
}
|
|
return dx * dx + dy * dy <= d * d;
|
|
}
|
|
|
|
function modulo(n, mod) {
|
|
return ((n % mod) + mod ) % mod;
|
|
}
|
|
|
|
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
|
|
var dx = x - xc;
|
|
var dy = y - yc;
|
|
var r_sq = dx * dx + dy * dy;
|
|
var rmin = Math.max(0, radius-d);
|
|
var rmax = radius + d;
|
|
|
|
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
|
|
return false;
|
|
|
|
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
|
|
var dx1 = xc + radius * Math.cos(angle1) - x;
|
|
var dy1 = yc + radius * Math.sin(angle1) - y;
|
|
if (dx1 * dx1 + dy1 * dy1 <= d * d)
|
|
return true;
|
|
|
|
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
|
|
var dx2 = xc + radius * Math.cos(angle2) - x;
|
|
var dy2 = yc + radius * Math.sin(angle2) - y;
|
|
if (dx2 * dx2 + dy2 * dy2 <= d * d)
|
|
return true;
|
|
|
|
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
|
|
if (angle1 > angle2)
|
|
return (angle >= angle2 || angle <= angle1);
|
|
else
|
|
return (angle >= angle1 && angle <= angle2);
|
|
}
|
|
|
|
function pointWithinPad(x, y, pad) {
|
|
var v = [x - pad.pos[0], y - pad.pos[1]];
|
|
v = rotateVector(v, -pad.angle);
|
|
if (pad.offset) {
|
|
v[0] -= pad.offset[0];
|
|
v[1] -= pad.offset[1];
|
|
}
|
|
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
|
|
}
|
|
|
|
function netHitScan(layer, x, y) {
|
|
// TODO: Should be refactored
|
|
|
|
// Check track segments
|
|
if (settings.renderTracks && pcbdata.tracks) {
|
|
for(var track of pcbdata.tracks[layer]) {
|
|
if(track.type === 'polyline') {
|
|
const path = getPolygonsPath(track);
|
|
if(path) {
|
|
hitTestContext2d.save();
|
|
hitTestContext2d.lineWidth = track.width;
|
|
|
|
if(hitTestContext2d.isPointInStroke(path,x,y)) {
|
|
hitTestContext2d.restore();
|
|
return track.net;
|
|
}
|
|
|
|
hitTestContext2d.restore();
|
|
}
|
|
|
|
} else if(track.type === 'polygon') {
|
|
const path = getPolygonsPath(track);
|
|
if(path && hitTestContext2d.isPointInPath(path,x,y)) {
|
|
return track.net;
|
|
}
|
|
} else if(track.type === 'text') {
|
|
// TODO: To implement taking in account TrueType fonts.
|
|
} else if ('radius' in track) {
|
|
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
} else if('start' in track && 'end' in track) {
|
|
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
|
|
return track.net;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check pads
|
|
if (settings.renderPads) {
|
|
|
|
// Footprints containing pads
|
|
for (var footprint of pcbdata.footprints) {
|
|
for(var pad of footprint.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Orphan pads
|
|
for(var pad of pcbdata.pads) {
|
|
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
|
|
return pad.net;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function pointWithinFootprintBbox(x, y, bbox) {
|
|
var v = [x - bbox.pos[0], y - bbox.pos[1]];
|
|
v = rotateVector(v, bbox.angle);
|
|
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
|
|
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
|
|
}
|
|
|
|
function bboxHitScan(layer, x, y) {
|
|
var result = [];
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
var footprint = pcbdata.footprints[i];
|
|
if (footprint.layer == layer) {
|
|
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
|
|
result.push(i);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
function handlePointerDown(e, layerdict) {
|
|
if (e.button != 0 && e.button != 1) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
layerdict.pointerStates[e.pointerId] = {
|
|
distanceTravelled: 0,
|
|
lastX: e.offsetX,
|
|
lastY: e.offsetY,
|
|
downTime: Date.now(),
|
|
};
|
|
}
|
|
|
|
function handleMouseClick(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var x = e.offsetX;
|
|
var y = e.offsetY;
|
|
var t = layerdict.transform;
|
|
if (layerdict.layer == "B") {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
|
|
} else {
|
|
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
|
|
}
|
|
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
|
|
var v = rotateVector([x, y], -settings.boardRotation);
|
|
if ("nets" in pcbdata) {
|
|
var net = netHitScan(layerdict.layer, ...v);
|
|
if (net !== highlightedNet) {
|
|
netClicked(net);
|
|
}
|
|
}
|
|
if (highlightedNet === null) {
|
|
var footprints = bboxHitScan(layerdict.layer, ...v);
|
|
if (footprints.length > 0) {
|
|
footprintsClicked(footprints);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handlePointerLeave(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function resetTransform(layerdict) {
|
|
layerdict.transform.panx = 0;
|
|
layerdict.transform.pany = 0;
|
|
layerdict.transform.zoom = 1;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function handlePointerUp(e, layerdict) {
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (e.button == 2) {
|
|
// Reset pan and zoom on right click.
|
|
resetTransform(layerdict);
|
|
layerdict.anotherPointerTapped = false;
|
|
return;
|
|
}
|
|
|
|
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
|
|
var ptr = layerdict.pointerStates[e.pointerId];
|
|
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
|
|
|
|
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
if (layerdict.anotherPointerTapped) {
|
|
// This is the second pointer coming off of a two-finger tap
|
|
resetTransform(layerdict);
|
|
} else {
|
|
// This is just a regular tap
|
|
handleMouseClick(e, layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
} else {
|
|
// This is the first finger coming off of what could become a two-finger tap
|
|
layerdict.anotherPointerTapped = true;
|
|
}
|
|
} else {
|
|
if (!settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
layerdict.anotherPointerTapped = false;
|
|
}
|
|
|
|
delete layerdict.pointerStates[e.pointerId];
|
|
}
|
|
|
|
function handlePointerMove(e, layerdict) {
|
|
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (!e.hasOwnProperty("offsetX")) {
|
|
// The polyfill doesn't set this properly
|
|
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
|
|
e.offsetY = e.pageY - e.currentTarget.offsetTop;
|
|
}
|
|
|
|
var thisPtr = layerdict.pointerStates[e.pointerId];
|
|
|
|
var dx = e.offsetX - thisPtr.lastX;
|
|
var dy = e.offsetY - thisPtr.lastY;
|
|
|
|
// If this number is low on pointer up, we count the action as a click
|
|
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
|
|
|
|
if (Object.keys(layerdict.pointerStates).length == 1) {
|
|
// This is a simple drag
|
|
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
|
|
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
|
|
} else if (Object.keys(layerdict.pointerStates).length == 2) {
|
|
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
|
|
|
|
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
|
|
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
|
|
|
|
var scaleFactor = newDist/oldDist;
|
|
|
|
if (scaleFactor != NaN) {
|
|
layerdict.transform.zoom *= scaleFactor;
|
|
|
|
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
|
|
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
|
|
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
|
|
}
|
|
}
|
|
|
|
thisPtr.lastX = e.offsetX;
|
|
thisPtr.lastY = e.offsetY;
|
|
|
|
if (settings.redrawOnDrag) {
|
|
redrawCanvas(layerdict);
|
|
}
|
|
}
|
|
|
|
function handleMouseWheel(e, layerdict) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var t = layerdict.transform;
|
|
var wheeldelta = e.deltaY;
|
|
if (e.deltaMode == 1) {
|
|
// FF only, scroll by lines
|
|
wheeldelta *= 30;
|
|
} else if (e.deltaMode == 2) {
|
|
wheeldelta *= 300;
|
|
}
|
|
var m = Math.pow(1.1, -wheeldelta / 40);
|
|
// Limit amount of zoom per tick.
|
|
if (m > 2) {
|
|
m = 2;
|
|
} else if (m < 0.5) {
|
|
m = 0.5;
|
|
}
|
|
t.zoom *= m;
|
|
var zoomd = (1 - m) / t.zoom;
|
|
t.panx += devicePixelRatio * e.offsetX * zoomd;
|
|
t.pany += devicePixelRatio * e.offsetY * zoomd;
|
|
redrawCanvas(layerdict);
|
|
}
|
|
|
|
function addMouseHandlers(div, layerdict) {
|
|
div.addEventListener("pointerdown", function(e) {
|
|
handlePointerDown(e, layerdict);
|
|
});
|
|
div.addEventListener("pointermove", function(e) {
|
|
handlePointerMove(e, layerdict);
|
|
});
|
|
div.addEventListener("pointerup", function(e) {
|
|
handlePointerUp(e, layerdict);
|
|
});
|
|
var pointerleave = function(e) {
|
|
handlePointerLeave(e, layerdict);
|
|
}
|
|
div.addEventListener("pointercancel", pointerleave);
|
|
div.addEventListener("pointerleave", pointerleave);
|
|
div.addEventListener("pointerout", pointerleave);
|
|
|
|
div.onwheel = function(e) {
|
|
handleMouseWheel(e, layerdict);
|
|
}
|
|
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
|
|
element.addEventListener("contextmenu", function(e) {
|
|
e.preventDefault();
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function setRedrawOnDrag(value) {
|
|
settings.redrawOnDrag = value;
|
|
writeStorage("redrawOnDrag", value);
|
|
}
|
|
|
|
function setShowCrosshair(value) {
|
|
settings.showCrosshair = value;
|
|
writeStorage("showCrosshair", value);
|
|
}
|
|
|
|
function setBoardRotation(value) {
|
|
settings.boardRotation = value * 5;
|
|
writeStorage("boardRotation", settings.boardRotation);
|
|
document.getElementById("rotationDegree").textContent = settings.boardRotation;
|
|
resizeAll();
|
|
}
|
|
|
|
function initRender() {
|
|
allcanvas = {
|
|
front: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("F_bg"),
|
|
fab: document.getElementById("F_fab"),
|
|
silk: document.getElementById("F_slk"),
|
|
highlight: document.getElementById("F_hl"),
|
|
layer: "F",
|
|
},
|
|
back: {
|
|
transform: {
|
|
x: 0,
|
|
y: 0,
|
|
s: 1,
|
|
panx: 0,
|
|
pany: 0,
|
|
zoom: 1,
|
|
},
|
|
pointerStates: {},
|
|
anotherPointerTapped: false,
|
|
bg: document.getElementById("B_bg"),
|
|
fab: document.getElementById("B_fab"),
|
|
silk: document.getElementById("B_slk"),
|
|
highlight: document.getElementById("B_hl"),
|
|
layer: "B",
|
|
}
|
|
};
|
|
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
|
|
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
/* DOM manipulation and misc code */
|
|
|
|
var bomsplit;
|
|
var canvassplit;
|
|
var initDone = false;
|
|
var bomSortFunction = null;
|
|
var currentSortColumn = null;
|
|
var currentSortOrder = null;
|
|
var currentHighlightedRowId;
|
|
var highlightHandlers = [];
|
|
var footprintIndexToHandler = {};
|
|
var netsToHandler = {};
|
|
var highlightedFootprints = [];
|
|
var highlightedOrphanPads = [];
|
|
var highlightedNet = null;
|
|
var lastClicked;
|
|
|
|
function dbg(html) {
|
|
dbgdiv.innerHTML = html;
|
|
}
|
|
|
|
function redrawIfInitDone() {
|
|
if (initDone) {
|
|
redrawCanvas(allcanvas.front);
|
|
redrawCanvas(allcanvas.back);
|
|
}
|
|
}
|
|
|
|
function padsVisible(value) {
|
|
writeStorage("padsVisible", value);
|
|
settings.renderPads = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function referencesVisible(value) {
|
|
writeStorage("referencesVisible", value);
|
|
settings.renderReferences = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function valuesVisible(value) {
|
|
writeStorage("valuesVisible", value);
|
|
settings.renderValues = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function tracksVisible(value) {
|
|
writeStorage("tracksVisible", value);
|
|
settings.renderTracks = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function zonesVisible(value) {
|
|
writeStorage("zonesVisible", value);
|
|
settings.renderZones = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function dnpOutline(value) {
|
|
writeStorage("dnpOutline", value);
|
|
settings.renderDnpOutline = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setDarkMode(value) {
|
|
if (value) {
|
|
topmostdiv.classList.add("dark");
|
|
} else {
|
|
topmostdiv.classList.remove("dark");
|
|
}
|
|
writeStorage("darkmode", value);
|
|
settings.darkMode = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setFullscreen(value) {
|
|
if (value) {
|
|
document.documentElement.requestFullscreen();
|
|
} else {
|
|
document.exitFullscreen();
|
|
}
|
|
}
|
|
|
|
function fabricationVisible(value) {
|
|
writeStorage("fabricationVisible", value);
|
|
settings.renderFabrication = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function silkscreenVisible(value) {
|
|
writeStorage("silkscreenVisible", value);
|
|
settings.renderSilkscreen = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function setHighlightPin1(value) {
|
|
writeStorage("highlightpin1", value);
|
|
settings.highlightpin1 = value;
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function getStoredCheckboxRefs(checkbox) {
|
|
function convert(ref) {
|
|
var intref = parseInt(ref);
|
|
if (isNaN(intref)) {
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.footprints[i].ref == ref) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
} else {
|
|
return intref;
|
|
}
|
|
}
|
|
if (!(checkbox in settings.checkboxStoredRefs)) {
|
|
var val = readStorage("checkbox_" + checkbox);
|
|
settings.checkboxStoredRefs[checkbox] = val ? val : "";
|
|
}
|
|
if (!settings.checkboxStoredRefs[checkbox]) {
|
|
return new Set();
|
|
} else {
|
|
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
|
|
}
|
|
}
|
|
|
|
function getCheckboxState(checkbox, references) {
|
|
var storedRefsSet = getStoredCheckboxRefs(checkbox);
|
|
var currentRefsSet = new Set(references.map(r => r[1]));
|
|
// Get difference of current - stored
|
|
var difference = new Set(currentRefsSet);
|
|
for (ref of storedRefsSet) {
|
|
difference.delete(ref);
|
|
}
|
|
if (difference.size == 0) {
|
|
// All the current refs are stored
|
|
return "checked";
|
|
} else if (difference.size == currentRefsSet.size) {
|
|
// None of the current refs are stored
|
|
return "unchecked";
|
|
} else {
|
|
// Some of the refs are stored
|
|
return "indeterminate";
|
|
}
|
|
}
|
|
|
|
function setBomCheckboxState(checkbox, element, references) {
|
|
var state = getCheckboxState(checkbox, references);
|
|
element.checked = (state == "checked");
|
|
element.indeterminate = (state == "indeterminate");
|
|
}
|
|
|
|
function createCheckboxChangeHandler(checkbox, references, row) {
|
|
return function() {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (this.checked) {
|
|
// checkbox ticked
|
|
for (var ref of references) {
|
|
refsSet.add(ref[1]);
|
|
}
|
|
if (darkenWhenChecked) {
|
|
row.classList.add("checked");
|
|
}
|
|
eventArgs.state = 'checked';
|
|
} else {
|
|
// checkbox unticked
|
|
for (var ref of references) {
|
|
refsSet.delete(ref[1]);
|
|
}
|
|
if (darkenWhenChecked) {
|
|
row.classList.remove("checked");
|
|
}
|
|
eventArgs.state = 'unchecked';
|
|
}
|
|
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
|
|
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
|
|
updateCheckboxStats(checkbox);
|
|
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
|
|
}
|
|
}
|
|
|
|
function clearHighlightedFootprints() {
|
|
if (currentHighlightedRowId) {
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
currentHighlightedRowId = null;
|
|
highlightedFootprints = [];
|
|
highlightedOrphanPads = [];
|
|
highlightedNet = null;
|
|
}
|
|
}
|
|
|
|
function createRowHighlightHandler(rowid, refs, net) {
|
|
return function() {
|
|
if (currentHighlightedRowId) {
|
|
if (currentHighlightedRowId == rowid) {
|
|
return;
|
|
}
|
|
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
|
|
}
|
|
document.getElementById(rowid).classList.add("highlighted");
|
|
currentHighlightedRowId = rowid;
|
|
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
|
|
{
|
|
rowid: rowid,
|
|
refs: refs,
|
|
net: net
|
|
});
|
|
}
|
|
}
|
|
|
|
function entryMatches(entry) {
|
|
if (settings.bommode == "netlist") {
|
|
// entry is just a net name
|
|
return entry.toLowerCase().indexOf(filter) >= 0;
|
|
}
|
|
// check refs
|
|
for (var ref of entry[3]) {
|
|
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check extra fields
|
|
for (var i in config.extra_fields) {
|
|
if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// check value
|
|
if (entry[1].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
// check footprint
|
|
if (entry[2].toLowerCase().indexOf(filter) >= 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function findRefInEntry(entry) {
|
|
return entry[3].filter(r => r[0].toLowerCase() == reflookup);
|
|
}
|
|
|
|
function highlightFilter(s) {
|
|
if (!filter) {
|
|
return s;
|
|
}
|
|
var parts = s.toLowerCase().split(filter);
|
|
if (parts.length == 1) {
|
|
return s;
|
|
}
|
|
var r = "";
|
|
var pos = 0;
|
|
for (var i in parts) {
|
|
if (i > 0) {
|
|
r += '<mark class="highlight">' +
|
|
s.substring(pos, pos + filter.length) +
|
|
'</mark>';
|
|
pos += filter.length;
|
|
}
|
|
r += s.substring(pos, pos + parts[i].length);
|
|
pos += parts[i].length;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
function checkboxSetUnsetAllHandler(checkboxname) {
|
|
return function() {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var allset = true;
|
|
var checkbox;
|
|
var row;
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
if (!checkbox.checked || checkbox.indeterminate) {
|
|
allset = false;
|
|
break;
|
|
}
|
|
}
|
|
for (row of bombody.childNodes) {
|
|
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = !allset;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
}
|
|
}
|
|
|
|
function createColumnHeader(name, cls, comparator) {
|
|
var th = document.createElement("TH");
|
|
th.innerHTML = name;
|
|
th.classList.add(cls);
|
|
th.style.cursor = "pointer";
|
|
var span = document.createElement("SPAN");
|
|
span.classList.add("sortmark");
|
|
span.classList.add("none");
|
|
th.appendChild(span);
|
|
th.onclick = function() {
|
|
if (currentSortColumn && this !== currentSortColumn) {
|
|
// Currently sorted by another column
|
|
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
if (currentSortColumn && this === currentSortColumn) {
|
|
// Already sorted by this column
|
|
if (currentSortOrder == "asc") {
|
|
// Sort by this column, descending order
|
|
bomSortFunction = function(a, b) {
|
|
return -comparator(a, b);
|
|
}
|
|
currentSortColumn.childNodes[1].classList.remove("asc");
|
|
currentSortColumn.childNodes[1].classList.add("desc");
|
|
currentSortOrder = "desc";
|
|
} else {
|
|
// Unsort
|
|
bomSortFunction = null;
|
|
currentSortColumn.childNodes[1].classList.remove("desc");
|
|
currentSortColumn.childNodes[1].classList.add("none");
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
}
|
|
} else {
|
|
// Sort by this column, ascending order
|
|
bomSortFunction = comparator;
|
|
currentSortColumn = this;
|
|
currentSortColumn.childNodes[1].classList.remove("none");
|
|
currentSortColumn.childNodes[1].classList.add("asc");
|
|
currentSortOrder = "asc";
|
|
}
|
|
populateBomBody();
|
|
}
|
|
return th;
|
|
}
|
|
|
|
function populateBomHeader() {
|
|
while (bomhead.firstChild) {
|
|
bomhead.removeChild(bomhead.firstChild);
|
|
}
|
|
var tr = document.createElement("TR");
|
|
var th = document.createElement("TH");
|
|
th.classList.add("numCol");
|
|
tr.appendChild(th);
|
|
var checkboxCompareClosure = function(checkbox) {
|
|
return (a, b) => {
|
|
var stateA = getCheckboxState(checkbox, a[3]);
|
|
var stateB = getCheckboxState(checkbox, b[3]);
|
|
if (stateA > stateB) return -1;
|
|
if (stateA < stateB) return 1;
|
|
return 0;
|
|
}
|
|
}
|
|
if (settings.bommode == "netlist") {
|
|
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
});
|
|
tr.appendChild(th);
|
|
} else {
|
|
for (var checkbox of settings.checkboxes) {
|
|
th = createColumnHeader(
|
|
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
|
|
th.onclick = fancyDblClickHandler(
|
|
th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
|
|
tr.appendChild(th);
|
|
}
|
|
tr.appendChild(createColumnHeader("References", "References", (a, b) => {
|
|
var i = 0;
|
|
while (i < a[3].length && i < b[3].length) {
|
|
if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
|
|
i++;
|
|
}
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
// Extra fields
|
|
if (config.extra_fields.length > 0) {
|
|
var extraFieldCompareClosure = function(fieldIndex) {
|
|
return (a, b) => {
|
|
var fa = a[4][fieldIndex];
|
|
var fb = b[4][fieldIndex];
|
|
if (fa != fb) return fa > fb ? 1 : -1;
|
|
else return 0;
|
|
}
|
|
}
|
|
for (var i in config.extra_fields) {
|
|
tr.appendChild(createColumnHeader(
|
|
config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
|
|
}
|
|
}
|
|
tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
|
|
return valueCompare(a[5], b[5], a[1], b[1]);
|
|
}));
|
|
tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
|
|
if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
|
|
else return 0;
|
|
}));
|
|
if (settings.bommode == "grouped") {
|
|
tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
|
|
return a[3].length - b[3].length;
|
|
}));
|
|
}
|
|
}
|
|
bomhead.appendChild(tr);
|
|
}
|
|
|
|
function populateBomBody() {
|
|
while (bom.firstChild) {
|
|
bom.removeChild(bom.firstChild);
|
|
}
|
|
highlightHandlers = [];
|
|
footprintIndexToHandler = {};
|
|
netsToHandler = {};
|
|
currentHighlightedRowId = null;
|
|
var first = true;
|
|
if (settings.bommode == "netlist") {
|
|
bomtable = pcbdata.nets.slice();
|
|
} else {
|
|
switch (settings.canvaslayout) {
|
|
case 'F':
|
|
bomtable = pcbdata.bom.F.slice();
|
|
break;
|
|
case 'FB':
|
|
bomtable = pcbdata.bom.both.slice();
|
|
break;
|
|
case 'B':
|
|
bomtable = pcbdata.bom.B.slice();
|
|
break;
|
|
}
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
expandedTable = []
|
|
for (var bomentry of bomtable) {
|
|
for (var ref of bomentry[3]) {
|
|
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
|
|
}
|
|
}
|
|
bomtable = expandedTable;
|
|
}
|
|
}
|
|
if (bomSortFunction) {
|
|
bomtable = bomtable.sort(bomSortFunction);
|
|
}
|
|
for (var i in bomtable) {
|
|
var bomentry = bomtable[i];
|
|
if (filter && !entryMatches(bomentry)) {
|
|
continue;
|
|
}
|
|
var references = null;
|
|
var netname = null;
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
var rownum = +i + 1;
|
|
tr.id = "bomrow" + rownum;
|
|
td.textContent = rownum;
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "netlist") {
|
|
netname = bomentry;
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(netname ? netname : "<no net>");
|
|
tr.appendChild(td);
|
|
} else {
|
|
if (reflookup) {
|
|
references = findRefInEntry(bomentry);
|
|
if (references.length == 0) {
|
|
continue;
|
|
}
|
|
} else {
|
|
references = bomentry[3];
|
|
}
|
|
// Checkboxes
|
|
for (var checkbox of settings.checkboxes) {
|
|
if (checkbox) {
|
|
td = document.createElement("TD");
|
|
var input = document.createElement("input");
|
|
input.type = "checkbox";
|
|
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
|
|
setBomCheckboxState(checkbox, input, references);
|
|
if (input.checked && settings.darkenWhenChecked == checkbox) {
|
|
tr.classList.add("checked");
|
|
}
|
|
td.appendChild(input);
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
// References
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
|
|
tr.appendChild(td);
|
|
// Extra fields
|
|
for (var i in config.extra_fields) {
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[4][i]);
|
|
tr.appendChild(td);
|
|
}
|
|
// Value
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[1]);
|
|
tr.appendChild(td);
|
|
// Footprint
|
|
td = document.createElement("TD");
|
|
td.innerHTML = highlightFilter(bomentry[2]);
|
|
tr.appendChild(td);
|
|
if (settings.bommode == "grouped") {
|
|
// Quantity
|
|
td = document.createElement("TD");
|
|
td.textContent = bomentry[3].length;
|
|
tr.appendChild(td);
|
|
}
|
|
}
|
|
bom.appendChild(tr);
|
|
var handler = createRowHighlightHandler(tr.id, references, netname);
|
|
tr.onmousemove = handler;
|
|
highlightHandlers.push({
|
|
id: tr.id,
|
|
handler: handler,
|
|
});
|
|
if (references !== null) {
|
|
for (var refIndex of references.map(r => r[1])) {
|
|
footprintIndexToHandler[refIndex] = handler;
|
|
}
|
|
}
|
|
if (netname !== null) {
|
|
netsToHandler[netname] = handler;
|
|
}
|
|
if ((filter || reflookup) && first) {
|
|
handler();
|
|
first = false;
|
|
}
|
|
}
|
|
EventHandler.emitEvent(
|
|
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT,
|
|
{
|
|
filter: filter,
|
|
reflookup: reflookup,
|
|
checkboxes: settings.checkboxes,
|
|
bommode: settings.bommode,
|
|
});
|
|
}
|
|
|
|
function highlightPreviousRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[0].id == currentHighlightedRowId) {
|
|
highlightHandlers[highlightHandlers.length - 1].handler();
|
|
} else {
|
|
for (var i = 0; i < highlightHandlers.length - 1; i++) {
|
|
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function highlightNextRow() {
|
|
if (!currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
if (highlightHandlers.length > 1 &&
|
|
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[0].handler();
|
|
} else {
|
|
for (var i = 1; i < highlightHandlers.length; i++) {
|
|
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
|
|
highlightHandlers[i].handler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
}
|
|
|
|
function populateBomTable() {
|
|
populateBomHeader();
|
|
populateBomBody();
|
|
}
|
|
|
|
function footprintsClicked(footprintIndexes) {
|
|
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
|
|
for (var i = 1; i <= footprintIndexes.length; i++) {
|
|
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
|
|
if (refIndex in footprintIndexToHandler) {
|
|
lastClicked = refIndex;
|
|
footprintIndexToHandler[refIndex]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function netClicked(net) {
|
|
if (net in netsToHandler) {
|
|
netsToHandler[net]();
|
|
smoothScrollToRow(currentHighlightedRowId);
|
|
} else {
|
|
clearHighlightedFootprints();
|
|
highlightedNet = net;
|
|
drawHighlights();
|
|
}
|
|
}
|
|
|
|
function updateFilter(input) {
|
|
filter = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function updateRefLookup(input) {
|
|
reflookup = input.toLowerCase();
|
|
populateBomTable();
|
|
}
|
|
|
|
function changeCanvasLayout(layout) {
|
|
document.getElementById("fl-btn").classList.remove("depressed");
|
|
document.getElementById("fb-btn").classList.remove("depressed");
|
|
document.getElementById("bl-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'F':
|
|
document.getElementById("fl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(1);
|
|
}
|
|
break;
|
|
case 'B':
|
|
document.getElementById("bl-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.collapse(0);
|
|
}
|
|
break;
|
|
default:
|
|
document.getElementById("fb-btn").classList.add("depressed");
|
|
if (settings.bomlayout != "bom-only") {
|
|
canvassplit.setSizes([50, 50]);
|
|
}
|
|
}
|
|
settings.canvaslayout = layout;
|
|
writeStorage("canvaslayout", layout);
|
|
resizeAll();
|
|
changeBomMode(settings.bommode);
|
|
}
|
|
|
|
function populateMetadata() {
|
|
document.getElementById("title").innerHTML = pcbdata.metadata.title;
|
|
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
|
|
document.getElementById("company").innerHTML = pcbdata.metadata.company;
|
|
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
|
|
if (pcbdata.metadata.title != "") {
|
|
document.title = pcbdata.metadata.title + " BOM";
|
|
}
|
|
// Calculate board stats
|
|
var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
|
|
for (var i = 0; i < pcbdata.footprints.length; i++) {
|
|
if (pcbdata.bom.skipped.includes(i)) continue;
|
|
var mod = pcbdata.footprints[i];
|
|
if (mod.layer == "F") {
|
|
fp_f++;
|
|
} else {
|
|
fp_b++;
|
|
}
|
|
for (var pad of mod.pads) {
|
|
if (pad.type == "th") {
|
|
pads_th++;
|
|
} else {
|
|
if (pad.layers.includes("F")) {
|
|
pads_f++;
|
|
}
|
|
if (pad.layers.includes("B")) {
|
|
pads_b++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
document.getElementById("stats-components-front").innerHTML = fp_f;
|
|
document.getElementById("stats-components-back").innerHTML = fp_b;
|
|
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
|
|
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
|
|
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
|
|
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
|
|
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
|
|
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
|
|
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
|
|
document.getElementById("stats-th-pads").innerHTML = pads_th;
|
|
// Update version string
|
|
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom " +
|
|
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
|
|
}
|
|
|
|
function changeBomLayout(layout) {
|
|
document.getElementById("bom-btn").classList.remove("depressed");
|
|
document.getElementById("lr-btn").classList.remove("depressed");
|
|
document.getElementById("tb-btn").classList.remove("depressed");
|
|
switch (layout) {
|
|
case 'bom-only':
|
|
document.getElementById("bom-btn").classList.add("depressed");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
document.getElementById("frontcanvas").style.display = "none";
|
|
document.getElementById("backcanvas").style.display = "none";
|
|
document.getElementById("bot").style.height = "";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.remove("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.remove("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.add("split-horizontal");
|
|
document.getElementById("backcanvas").classList.add("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
direction: "vertical",
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
onDragEnd: resizeAll
|
|
});
|
|
break;
|
|
case 'left-right':
|
|
document.getElementById("lr-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("bot").style.height = "calc(100% - 80px)";
|
|
document.getElementById("bomdiv").classList.add("split-horizontal");
|
|
document.getElementById("canvasdiv").classList.add("split-horizontal");
|
|
document.getElementById("frontcanvas").classList.remove("split-horizontal");
|
|
document.getElementById("backcanvas").classList.remove("split-horizontal");
|
|
if (bomsplit) {
|
|
bomsplit.destroy();
|
|
bomsplit = null;
|
|
canvassplit.destroy();
|
|
canvassplit = null;
|
|
}
|
|
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
|
|
sizes: [50, 50],
|
|
onDragEnd: resizeAll,
|
|
gutterSize: 5
|
|
});
|
|
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
|
|
sizes: [50, 50],
|
|
gutterSize: 5,
|
|
direction: "vertical",
|
|
onDragEnd: resizeAll
|
|
});
|
|
}
|
|
settings.bomlayout = layout;
|
|
writeStorage("bomlayout", layout);
|
|
changeCanvasLayout(settings.canvaslayout);
|
|
}
|
|
|
|
function changeBomMode(mode) {
|
|
document.getElementById("bom-grouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
|
|
document.getElementById("bom-netlist-btn").classList.remove("depressed");
|
|
switch (mode) {
|
|
case 'grouped':
|
|
document.getElementById("bom-grouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'ungrouped':
|
|
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
|
|
break;
|
|
case 'netlist':
|
|
document.getElementById("bom-netlist-btn").classList.add("depressed");
|
|
}
|
|
writeStorage("bommode", mode);
|
|
if (mode != settings.bommode) {
|
|
settings.bommode = mode;
|
|
bomSortFunction = null;
|
|
currentSortColumn = null;
|
|
currentSortOrder = null;
|
|
clearHighlightedFootprints();
|
|
}
|
|
populateBomTable();
|
|
}
|
|
|
|
function focusFilterField() {
|
|
focusInputField(document.getElementById("filter"));
|
|
}
|
|
|
|
function focusRefLookupField() {
|
|
focusInputField(document.getElementById("reflookup"));
|
|
}
|
|
|
|
function toggleBomCheckbox(bomrowid, checkboxnum) {
|
|
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
|
|
checkbox.checked = !checkbox.checked;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function checkBomCheckbox(bomrowid, checkboxname) {
|
|
var checkboxnum = 0;
|
|
while (checkboxnum < settings.checkboxes.length &&
|
|
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
|
|
checkboxnum++;
|
|
}
|
|
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
|
|
return;
|
|
}
|
|
var bomrow = document.getElementById(bomrowid);
|
|
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
|
|
checkbox.checked = true;
|
|
checkbox.indeterminate = false;
|
|
checkbox.onchange();
|
|
}
|
|
|
|
function setBomCheckboxes(value) {
|
|
writeStorage("bomCheckboxes", value);
|
|
settings.checkboxes = value.split(",").filter((e) => e);
|
|
prepCheckboxes();
|
|
populateBomTable();
|
|
populateDarkenWhenCheckedOptions();
|
|
}
|
|
|
|
function setDarkenWhenChecked(value) {
|
|
writeStorage("darkenWhenChecked", value);
|
|
settings.darkenWhenChecked = value;
|
|
populateBomTable();
|
|
}
|
|
|
|
function prepCheckboxes() {
|
|
var table = document.getElementById("checkbox-stats");
|
|
while (table.childElementCount > 1) {
|
|
table.removeChild(table.lastChild);
|
|
}
|
|
if (settings.checkboxes.length) {
|
|
table.style.display = "";
|
|
} else {
|
|
table.style.display = "none";
|
|
}
|
|
for (var checkbox of settings.checkboxes) {
|
|
var tr = document.createElement("TR");
|
|
var td = document.createElement("TD");
|
|
td.innerHTML = checkbox;
|
|
tr.appendChild(td);
|
|
td = document.createElement("TD");
|
|
td.id = "checkbox-stats-" + checkbox;
|
|
var progressbar = document.createElement("div");
|
|
progressbar.classList.add("bar");
|
|
td.appendChild(progressbar);
|
|
var text = document.createElement("div");
|
|
text.classList.add("text");
|
|
td.appendChild(text);
|
|
tr.appendChild(td);
|
|
table.appendChild(tr);
|
|
updateCheckboxStats(checkbox);
|
|
}
|
|
}
|
|
|
|
function populateDarkenWhenCheckedOptions() {
|
|
var container = document.getElementById("darkenWhenCheckedContainer");
|
|
|
|
if (settings.checkboxes.length == 0) {
|
|
container.parentElement.style.display = "none";
|
|
return;
|
|
}
|
|
|
|
container.innerHTML = '';
|
|
container.parentElement.style.display = "inline-block";
|
|
|
|
function createOption(name, displayName) {
|
|
var id = "darkenWhenChecked-" + name;
|
|
|
|
var div = document.createElement("div");
|
|
div.classList.add("radio-container");
|
|
|
|
var input = document.createElement("input");
|
|
input.type = "radio";
|
|
input.name = "darkenWhenChecked";
|
|
input.value = name;
|
|
input.id = id;
|
|
input.onchange = () => setDarkenWhenChecked(name);
|
|
div.appendChild(input);
|
|
|
|
// Preserve the selected element when the checkboxes change
|
|
if (name == settings.darkenWhenChecked) {
|
|
input.checked = true;
|
|
}
|
|
|
|
var label = document.createElement("label");
|
|
label.innerHTML = displayName;
|
|
label.htmlFor = id;
|
|
div.appendChild(label);
|
|
|
|
container.appendChild(div);
|
|
}
|
|
createOption("", "None");
|
|
for (var checkbox of settings.checkboxes) {
|
|
createOption(checkbox, checkbox);
|
|
}
|
|
}
|
|
|
|
function updateCheckboxStats(checkbox) {
|
|
var checked = getStoredCheckboxRefs(checkbox).size;
|
|
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
|
|
var percent = checked * 100.0 / total;
|
|
var td = document.getElementById("checkbox-stats-" + checkbox);
|
|
td.firstChild.style.width = percent + "%";
|
|
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
|
|
}
|
|
|
|
document.onkeydown = function(e) {
|
|
switch (e.key) {
|
|
case "n":
|
|
if (document.activeElement.type == "text") {
|
|
return;
|
|
}
|
|
if (currentHighlightedRowId !== null) {
|
|
checkBomCheckbox(currentHighlightedRowId, "placed");
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
}
|
|
break;
|
|
case "ArrowUp":
|
|
highlightPreviousRow();
|
|
e.preventDefault();
|
|
break;
|
|
case "ArrowDown":
|
|
highlightNextRow();
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.altKey) {
|
|
switch (e.key) {
|
|
case "f":
|
|
focusFilterField();
|
|
e.preventDefault();
|
|
break;
|
|
case "r":
|
|
focusRefLookupField();
|
|
e.preventDefault();
|
|
break;
|
|
case "z":
|
|
changeBomLayout("bom-only");
|
|
e.preventDefault();
|
|
break;
|
|
case "x":
|
|
changeBomLayout("left-right");
|
|
e.preventDefault();
|
|
break;
|
|
case "c":
|
|
changeBomLayout("top-bottom");
|
|
e.preventDefault();
|
|
break;
|
|
case "v":
|
|
changeCanvasLayout("F");
|
|
e.preventDefault();
|
|
break;
|
|
case "b":
|
|
changeCanvasLayout("FB");
|
|
e.preventDefault();
|
|
break;
|
|
case "n":
|
|
changeCanvasLayout("B");
|
|
e.preventDefault();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (e.key >= '1' && e.key <= '9') {
|
|
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
|
|
}
|
|
}
|
|
}
|
|
|
|
function hideNetlistButton() {
|
|
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
|
|
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
|
|
document.getElementById("bom-netlist-btn").style.display = "none";
|
|
}
|
|
|
|
window.onload = function(e) {
|
|
initUtils();
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
cleanGutters();
|
|
populateMetadata();
|
|
dbgdiv = document.getElementById("dbg");
|
|
bom = document.getElementById("bombody");
|
|
bomhead = document.getElementById("bomhead");
|
|
filter = "";
|
|
reflookup = "";
|
|
if (!("nets" in pcbdata)) {
|
|
hideNetlistButton();
|
|
}
|
|
initDone = true;
|
|
prepCheckboxes();
|
|
// Triggers render
|
|
changeBomLayout(settings.bomlayout);
|
|
|
|
// Users may leave fullscreen without touching the checkbox. Uncheck.
|
|
document.addEventListener('fullscreenchange', () => {
|
|
if (!document.fullscreenElement)
|
|
document.getElementById('fullscreenCheckbox').checked = false;
|
|
});
|
|
}
|
|
|
|
window.onresize = resizeAll;
|
|
window.matchMedia("print").addListener(resizeAll);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
<!-- USERHEADER -->
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div style="float: right; height: 100%;">
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="menubtn"></button>
|
|
<div class="menu-content">
|
|
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
|
|
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
|
|
Dark mode
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
|
|
Full Screen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
|
|
Fab layer
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
|
|
Silkscreen
|
|
</label>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
|
|
References
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
|
|
Values
|
|
</label>
|
|
<div id="tracksAndZonesCheckboxes">
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
|
|
Tracks
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
|
|
Zones
|
|
</label>
|
|
</div>
|
|
<label class="menu-label" style="width: calc(50% - 18px)">
|
|
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
|
|
Pads
|
|
</label><!-- This comment eats space! All of it!
|
|
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
|
|
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
|
|
DNP outlined
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
|
|
Highlight first pin
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="crosshairCheckbox" type="checkbox" checked onchange="setShowCrosshair(this.checked)">
|
|
Show Crosshair
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</span>
|
|
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Bom checkboxes</div>
|
|
<input id="bomCheckboxes" class="menu-textbox" type=text
|
|
oninput="setBomCheckboxes(this.value)">
|
|
</label>
|
|
<label class="menu-label">
|
|
<div style="margin-left: 5px">Darken when checked</div>
|
|
<div id="darkenWhenCheckedContainer"></div>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span class="shameless-plug">
|
|
<span>Created using</span>
|
|
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
|
|
</span>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
|
|
title="Front only">F
|
|
</button>
|
|
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
|
|
title="Front and Back">FB
|
|
</button>
|
|
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
|
|
title="Back only">B
|
|
</button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
|
|
title="BOM only"></button>
|
|
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
|
|
title="BOM left, drawings right"></button>
|
|
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
|
|
title="BOM top, drawings bot"></button>
|
|
</div>
|
|
<div class="button-container hideonprint"
|
|
style="float: right; position: relative; top: 8px">
|
|
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
|
|
title="Grouped BOM"></button>
|
|
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
|
|
title="Ungrouped BOM"></button>
|
|
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
|
|
title="Netlist"></button>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="statsbtn"></button>
|
|
<div class="menu-content">
|
|
<table class="stats">
|
|
<tbody>
|
|
<tr>
|
|
<td width="40%">Board stats</td>
|
|
<td>Front</td>
|
|
<td>Back</td>
|
|
<td>Total</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Components</td>
|
|
<td id="stats-components-front">~</td>
|
|
<td id="stats-components-back">~</td>
|
|
<td id="stats-components-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Groups</td>
|
|
<td id="stats-groups-front">~</td>
|
|
<td id="stats-groups-back">~</td>
|
|
<td id="stats-groups-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>SMD pads</td>
|
|
<td id="stats-smd-pads-front">~</td>
|
|
<td id="stats-smd-pads-back">~</td>
|
|
<td id="stats-smd-pads-total">~</td>
|
|
</tr>
|
|
<tr>
|
|
<td>TH pads</td>
|
|
<td colspan=3 id="stats-th-pads">~</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<table class="stats">
|
|
<col width="40%"/><col />
|
|
<tbody id="checkbox-stats">
|
|
<tr>
|
|
<td colspan=2 style="border-top: 0">Checkboxes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="hideonprint menu" style="float: right; top: 8px;">
|
|
<button class="iobtn"></button>
|
|
<div class="menu-content">
|
|
<div class="menu-label menu-label-top">
|
|
<div style="margin-left: 5px;">Save board image</div>
|
|
<div class="flexbox">
|
|
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
<span>X</span>
|
|
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
|
|
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
|
|
</div>
|
|
<label>
|
|
<input id="render-save-transparent" type="checkbox">
|
|
Transparent background
|
|
</label>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveImage('F')">Front</button>
|
|
<button class="savebtn" onclick="saveImage('B')">Back</button>
|
|
</div>
|
|
</div>
|
|
<div class="menu-label">
|
|
<span style="margin-left: 5px;">Config and checkbox state</span>
|
|
<div class="flexbox">
|
|
<button class="savebtn" onclick="saveSettings()">Export</button>
|
|
<button class="savebtn" onclick="loadSettings()">Import</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="fileinfodiv" style="overflow: auto;">
|
|
<table class="fileinfo">
|
|
<tbody>
|
|
<tr>
|
|
<td id="title" class="title" style="width: 70%">
|
|
Title
|
|
</td>
|
|
<td id="revision" class="title" style="width: 30%">
|
|
Revision
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td id="company">
|
|
Company
|
|
</td>
|
|
<td id="filedate">
|
|
Date
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="height: calc(100% - 80px)">
|
|
<div id="bomdiv" class="split split-horizontal">
|
|
<div style="width: 100%">
|
|
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
|
|
oninput="updateRefLookup(this.value)">
|
|
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
|
|
oninput="updateFilter(this.value)">
|
|
<div class="button-container hideonprint" style="float: left; margin: 0;">
|
|
<button id="copy" title="Copy bom table to clipboard"
|
|
onclick="copyToClipboard()"></button>
|
|
</div>
|
|
</div>
|
|
<div id="dbg"></div>
|
|
<table class="bom">
|
|
<thead id="bomhead">
|
|
</thead>
|
|
<tbody id="bombody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div id="canvasdiv" class="split split-horizontal">
|
|
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
|
|
<div style="position: relative; width: 100%; height: 100%;">
|
|
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
|
|
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
|
|
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
|
|
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- USERFOOTER -->
|
|
</body>
|
|
|
|
</html>
|