summaryrefslogtreecommitdiff
path: root/heater/bom/ibom.html
diff options
context:
space:
mode:
Diffstat (limited to 'heater/bom/ibom.html')
-rw-r--r--heater/bom/ibom.html2388
1 files changed, 2388 insertions, 0 deletions
diff --git a/heater/bom/ibom.html b/heater/bom/ibom.html
new file mode 100644
index 0000000..d0622da
--- /dev/null
+++ b/heater/bom/ibom.html
@@ -0,0 +1,2388 @@
+<!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-color-highlight: #D04040;
+ --pin1-outline-color: #ffb629;
+ --pin1-outline-color-highlight: #b4ff03;
+}
+
+html, body {
+ margin: 0px;
+ height: 100%;
+ font-family: Verdana, sans-serif;
+}
+
+.dark {
+ --pcb-edge-color: #eee;
+ --pad-color: #808080;
+ --pin1-outline-color: #ffa800;
+ --pin1-outline-color-highlight: #ccff00;
+ 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");
+ background-size: 32px 32px;
+ background-position: 5px 5px;
+ background-repeat: no-repeat;
+}
+
+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");
+ background-size: 32px 32px;
+ background-position: 5px 5px;
+ background-repeat: no-repeat;
+}
+
+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");
+ background-size: 32px 32px;
+ background-position: 5px 5px;
+ background-repeat: no-repeat;
+}
+
+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;
+}
+
+.dark .button-container {
+ filter: invert(1);
+}
+
+@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 {
+ 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;
+ font-size: 16px;
+ 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;
+}
+
+.dark .menubtn {
+ filter: invert(1);
+}
+
+.menu {
+ position: relative;
+ display: inline-block;
+}
+
+.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 {
+ background-color: #eee;
+}
+
+.dark .menu:hover .menubtn {}
+
+.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);
+}
+
+.dark .menu-textbox {
+ background-color: #222;
+ color: #eee;
+}
+
+#topmostdiv {
+ 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;
+}
+
+.shameless-plug a {
+ color: #0278a4;
+}
+
+.dark .shameless-plug a {
+ color: #00b9fd;
+}
+
+ </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}}});
+
+///////////////////////////////////////////////
+
+///////////////////////////////////////////////
+var config = {"redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "layer_view": "FB"}
+///////////////////////////////////////////////
+
+///////////////////////////////////////////////
+var pcbdata = {"font_data": {" ": {"l": [], "w": 0.7619047619047619}, ".": {"l": [[[0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.23809523809523808, -0.14285714285714285], [0.23809523809523808, -0.047619047619047616]]], "w": 0.47619047619047616}, "1": {"l": [[[0.7619047619047619, -0.047619047619047616], [0.19047619047619047, -0.047619047619047616]], [[0.47619047619047616, -0.047619047619047616], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -0.9047619047619047], [0.2857142857142857, -0.8095238095238095], [0.19047619047619047, -0.7619047619047619]]], "w": 0.9523809523809523}, "0": {"l": [[[0.42857142857142855, -1.0476190476190474], [0.5238095238095237, -1.0476190476190474], [0.6190476190476191, -1.0], [0.6666666666666666, -0.9523809523809523], [0.7142857142857142, -0.8571428571428571], [0.7619047619047619, -0.6666666666666666], [0.7619047619047619, -0.42857142857142855], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.42857142857142855, -0.047619047619047616], [0.3333333333333333, -0.09523809523809523], [0.2857142857142857, -0.14285714285714285], [0.23809523809523808, -0.23809523809523808], [0.19047619047619047, -0.42857142857142855], [0.19047619047619047, -0.6666666666666666], [0.23809523809523808, -0.8571428571428571], [0.2857142857142857, -0.9523809523809523], [0.3333333333333333, -1.0], [0.42857142857142855, -1.0476190476190474]]], "w": 0.9523809523809523}, "3": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.7619047619047619, -1.0476190476190474], [0.42857142857142855, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.2857142857142857, -0.047619047619047616], [0.19047619047619047, -0.09523809523809523], [0.14285714285714285, -0.14285714285714285]]], "w": 0.9523809523809523}, "2": {"l": [[[0.19047619047619047, -0.9523809523809523], [0.23809523809523808, -1.0], [0.3333333333333333, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666666, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6190476190476191], [0.14285714285714285, -0.047619047619047616], [0.7619047619047619, -0.047619047619047616]]], "w": 0.9523809523809523}, "5": {"l": [[[0.7142857142857142, -1.0476190476190474], [0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.5714285714285714, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.7619047619047619, -0.47619047619047616], [0.7619047619047619, -0.23809523809523808], [0.7142857142857142, -0.14285714285714285], [0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.14285714285714285]]], "w": 0.9523809523809523}, "4": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.42857142857142855, -1.0952380952380951], [0.19047619047619047, -0.38095238095238093], [0.8095238095238095, -0.38095238095238093]]], "w": 0.9523809523809523}, "7": {"l": [[[0.14285714285714285, -1.0476190476190474], [0.8095238095238095, -1.0476190476190474], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9523809523809523}, "6": {"l": [[[0.6666666666666666, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474], [0.38095238095238093, -1.0], [0.3333333333333333, -0.9523809523809523], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.23809523809523808], [0.23809523809523808, -0.14285714285714285], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.47619047619047616], [0.7142857142857142, -0.5714285714285714], [0.6666666666666666, -0.6190476190476191], [0.5714285714285714, -0.6666666666666666], [0.38095238095238093, -0.6666666666666666], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.5714285714285714], [0.19047619047619047, -0.47619047619047616]]], "w": 0.9523809523809523}, "A": {"l": [[[0.19047619047619047, -0.3333333333333333], [0.6666666666666666, -0.3333333333333333]], [[0.09523809523809523, -0.047619047619047616], [0.42857142857142855, -1.0476190476190474], [0.7619047619047619, -0.047619047619047616]]], "w": 0.8571428571428571}, "C": {"l": [[[0.8095238095238095, -0.14285714285714285], [0.7619047619047619, -0.09523809523809523], [0.6190476190476191, -0.047619047619047616], [0.5238095238095237, -0.047619047619047616], [0.38095238095238093, -0.09523809523809523], [0.2857142857142857, -0.19047619047619047], [0.23809523809523808, -0.2857142857142857], [0.19047619047619047, -0.47619047619047616], [0.19047619047619047, -0.6190476190476191], [0.23809523809523808, -0.8095238095238095], [0.2857142857142857, -0.9047619047619047], [0.38095238095238093, -1.0], [0.5238095238095237, -1.0476190476190474], [0.6190476190476191, -1.0476190476190474], [0.7619047619047619, -1.0], [0.8095238095238095, -0.9523809523809523]]], "w": 1.0}, "B": {"l": [[[0.5714285714285714, -0.5714285714285714], [0.7142857142857142, -0.5238095238095237], [0.7619047619047619, -0.47619047619047616], [0.8095238095238094, -0.38095238095238093], [0.8095238095238094, -0.23809523809523808], [0.7619047619047619, -0.14285714285714285], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.5714285714285714, -1.0476190476190474], [0.6666666666666665, -1.0], [0.7142857142857142, -0.9523809523809523], [0.7619047619047619, -0.8571428571428571], [0.7619047619047619, -0.7619047619047619], [0.7142857142857142, -0.6666666666666666], [0.6666666666666665, -0.6190476190476191], [0.5714285714285714, -0.5714285714285714], [0.23809523809523803, -0.5714285714285714]]], "w": 1.0}, "E": {"l": [[[0.23809523809523808, -0.5714285714285714], [0.5714285714285714, -0.5714285714285714]], [[0.7142857142857142, -0.047619047619047616], [0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.7142857142857142, -1.0476190476190474]]], "w": 0.9047619047619047}, "D": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.4761904761904761, -1.0476190476190474], [0.619047619047619, -1.0], [0.7142857142857142, -0.9047619047619047], [0.7619047619047619, -0.8095238095238095], [0.8095238095238094, -0.6190476190476191], [0.8095238095238094, -0.47619047619047616], [0.7619047619047619, -0.2857142857142857], [0.7142857142857142, -0.19047619047619047], [0.619047619047619, -0.09523809523809523], [0.4761904761904761, -0.047619047619047616], [0.23809523809523803, -0.047619047619047616]]], "w": 1.0}, "G": {"l": [[[0.7619047619047619, -1.0], [0.6666666666666666, -1.0476190476190474], [0.5238095238095237, -1.0476190476190474], [0.38095238095238093, -1.0], [0.2857142857142857, -0.9047619047619047], [0.23809523809523808, -0.8095238095238095], [0.19047619047619047, -0.6190476190476191], [0.19047619047619047, -0.47619047619047616], [0.23809523809523808, -0.2857142857142857], [0.2857142857142857, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.6190476190476191, -0.047619047619047616], [0.7619047619047619, -0.09523809523809523], [0.8095238095238095, -0.14285714285714285], [0.8095238095238095, -0.47619047619047616], [0.6190476190476191, -0.47619047619047616]]], "w": 1.0}, "F": {"l": [[[0.5714285714285714, -0.5714285714285714], [0.23809523809523808, -0.5714285714285714]], [[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.7142857142857142, -1.0476190476190474]]], "w": 0.8571428571428571}, "I": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]]], "w": 0.47619047619047616}, "H": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474]], [[0.23809523809523803, -0.5714285714285714], [0.8095238095238094, -0.5714285714285714]], [[0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "J": {"l": [[[0.5238095238095237, -1.0476190476190474], [0.5238095238095237, -0.3333333333333333], [0.47619047619047616, -0.19047619047619047], [0.38095238095238093, -0.09523809523809523], [0.23809523809523808, -0.047619047619047616], [0.14285714285714285, -0.047619047619047616]]], "w": 0.7619047619047619}, "M": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474], [0.5714285714285714, -0.3333333333333333], [0.9047619047619047, -1.0476190476190474], [0.9047619047619047, -0.047619047619047616]]], "w": 1.1428571428571428}, "L": {"l": [[[0.7142857142857142, -0.047619047619047616], [0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]]], "w": 0.8095238095238095}, "O": {"l": [[[0.4285714285714285, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.8095238095238094, -0.9047619047619047], [0.857142857142857, -0.7142857142857142], [0.857142857142857, -0.38095238095238093], [0.8095238095238094, -0.19047619047619047], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.4285714285714285, -0.047619047619047616], [0.33333333333333326, -0.09523809523809523], [0.23809523809523803, -0.19047619047619047], [0.1904761904761904, -0.38095238095238093], [0.1904761904761904, -0.7142857142857142], [0.23809523809523803, -0.9047619047619047], [0.33333333333333326, -1.0], [0.4285714285714285, -1.0476190476190474]]], "w": 1.0476190476190474}, "N": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.8095238095238094, -0.047619047619047616], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "Q": {"l": [[[0.9047619047619047, 0.047619047619047616], [0.8095238095238094, 0.0], [0.7142857142857142, -0.09523809523809523], [0.5714285714285714, -0.23809523809523808], [0.4761904761904761, -0.2857142857142857], [0.3809523809523809, -0.2857142857142857]], [[0.4285714285714285, -0.047619047619047616], [0.33333333333333326, -0.09523809523809523], [0.23809523809523803, -0.19047619047619047], [0.1904761904761904, -0.38095238095238093], [0.1904761904761904, -0.7142857142857142], [0.23809523809523803, -0.9047619047619047], [0.33333333333333326, -1.0], [0.4285714285714285, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.8095238095238094, -0.9047619047619047], [0.857142857142857, -0.7142857142857142], [0.857142857142857, -0.38095238095238093], [0.8095238095238094, -0.19047619047619047], [0.7142857142857142, -0.09523809523809523], [0.619047619047619, -0.047619047619047616], [0.4285714285714285, -0.047619047619047616]]], "w": 1.0476190476190474}, "P": {"l": [[[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "S": {"l": [[[0.19047619047619047, -0.09523809523809523], [0.3333333333333333, -0.047619047619047616], [0.5714285714285714, -0.047619047619047616], [0.6666666666666666, -0.09523809523809523], [0.7142857142857142, -0.14285714285714285], [0.7619047619047619, -0.23809523809523808], [0.7619047619047619, -0.3333333333333333], [0.7142857142857142, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616], [0.5714285714285714, -0.5238095238095237], [0.38095238095238093, -0.5714285714285714], [0.2857142857142857, -0.6190476190476191], [0.23809523809523808, -0.6666666666666666], [0.19047619047619047, -0.7619047619047619], [0.19047619047619047, -0.8571428571428571], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.6190476190476191, -1.0476190476190474], [0.7619047619047619, -1.0]]], "w": 0.9523809523809523}, "R": {"l": [[[0.8095238095238094, -0.047619047619047616], [0.4761904761904761, -0.5238095238095237]], [[0.23809523809523803, -0.047619047619047616], [0.23809523809523803, -1.0476190476190474], [0.619047619047619, -1.0476190476190474], [0.7142857142857142, -1.0], [0.7619047619047619, -0.9523809523809523], [0.8095238095238094, -0.8571428571428571], [0.8095238095238094, -0.7142857142857142], [0.7619047619047619, -0.6190476190476191], [0.7142857142857142, -0.5714285714285714], [0.619047619047619, -0.5238095238095237], [0.23809523809523803, -0.5238095238095237]]], "w": 1.0}, "U": {"l": [[[0.23809523809523803, -1.0476190476190474], [0.23809523809523803, -0.23809523809523808], [0.28571428571428564, -0.14285714285714285], [0.33333333333333326, -0.09523809523809523], [0.4285714285714285, -0.047619047619047616], [0.619047619047619, -0.047619047619047616], [0.7142857142857142, -0.09523809523809523], [0.7619047619047619, -0.14285714285714285], [0.8095238095238094, -0.23809523809523808], [0.8095238095238094, -1.0476190476190474]]], "w": 1.0476190476190474}, "T": {"l": [[[0.09523809523809523, -1.0476190476190474], [0.6666666666666666, -1.0476190476190474]], [[0.38095238095238093, -0.047619047619047616], [0.38095238095238093, -1.0476190476190474]]], "w": 0.7619047619047619}, "V": {"l": [[[0.09523809523809523, -1.0476190476190474], [0.42857142857142855, -0.047619047619047616], [0.7619047619047619, -1.0476190476190474]]], "w": 0.8571428571428571}, "a": {"l": [[[0.6666666666666666, -0.047619047619047616], [0.6666666666666666, -0.5714285714285714], [0.6190476190476191, -0.6666666666666666], [0.5238095238095237, -0.7142857142857142], [0.3333333333333333, -0.7142857142857142], [0.23809523809523808, -0.6666666666666666]], [[0.6666666666666666, -0.09523809523809523], [0.5714285714285714, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.19047619047619047], [0.19047619047619047, -0.2857142857142857], [0.23809523809523808, -0.38095238095238093], [0.3333333333333333, -0.42857142857142855], [0.5714285714285714, -0.42857142857142855], [0.6666666666666666, -0.47619047619047616]]], "w": 0.9047619047619047}, "e": {"l": [[[0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523], [0.19047619047619047, -0.19047619047619047], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.47619047619047616], [0.19047619047619047, -0.38095238095238093]]], "w": 0.8571428571428571}, "f": {"l": [[[0.09523809523809523, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142]], [[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.9047619047619047], [0.2857142857142857, -1.0], [0.38095238095238093, -1.0476190476190474], [0.47619047619047616, -1.0476190476190474]]], "w": 0.5714285714285714}, "i": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -1.0476190476190474], [0.19047619047619047, -1.0], [0.23809523809523808, -0.9523809523809523], [0.2857142857142857, -1.0], [0.23809523809523808, -1.0476190476190474], [0.23809523809523808, -0.9523809523809523]]], "w": 0.47619047619047616}, "h": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]], [[0.6666666666666666, -0.047619047619047616], [0.6666666666666666, -0.5714285714285714], [0.6190476190476191, -0.6666666666666666], [0.5238095238095237, -0.7142857142857142], [0.38095238095238093, -0.7142857142857142], [0.2857142857142857, -0.6666666666666666], [0.23809523809523808, -0.6190476190476191]]], "w": 0.9047619047619047}, "k": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -1.0476190476190474]], [[0.3333333333333333, -0.42857142857142855], [0.6190476190476191, -0.047619047619047616]], [[0.6190476190476191, -0.7142857142857142], [0.23809523809523808, -0.3333333333333333]]], "w": 0.8095238095238095}, "m": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.047619047619047616]], [[0.6666666666666666, -0.5714285714285714], [0.7142857142857142, -0.6666666666666666], [0.8095238095238095, -0.7142857142857142], [0.9523809523809523, -0.7142857142857142], [1.0476190476190474, -0.6666666666666666], [1.0952380952380951, -0.5714285714285714], [1.0952380952380951, -0.047619047619047616]]], "w": 1.3333333333333333}, "o": {"l": [[[0.38095238095238093, -0.047619047619047616], [0.2857142857142857, -0.09523809523809523], [0.23809523809523808, -0.14285714285714285], [0.19047619047619047, -0.23809523809523808], [0.19047619047619047, -0.5238095238095237], [0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5238095238095237], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.38095238095238093, -0.047619047619047616]]], "w": 0.9047619047619047}, "n": {"l": [[[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, -0.047619047619047616]], [[0.23809523809523808, -0.6190476190476191], [0.2857142857142857, -0.6666666666666666], [0.38095238095238093, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.5714285714285714], [0.6666666666666666, -0.047619047619047616]]], "w": 0.9047619047619047}, "p": {"l": [[[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, 0.2857142857142857]], [[0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142], [0.6190476190476191, -0.6666666666666666], [0.6666666666666666, -0.6190476190476191], [0.7142857142857142, -0.5238095238095237], [0.7142857142857142, -0.23809523809523808], [0.6666666666666666, -0.14285714285714285], [0.6190476190476191, -0.09523809523809523], [0.5238095238095237, -0.047619047619047616], [0.3333333333333333, -0.047619047619047616], [0.23809523809523808, -0.09523809523809523]]], "w": 0.9047619047619047}, "s": {"l": [[[0.19047619047619047, -0.09523809523809523], [0.2857142857142857, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616], [0.5714285714285714, -0.09523809523809523], [0.6190476190476191, -0.19047619047619047], [0.6190476190476191, -0.23809523809523808], [0.5714285714285714, -0.3333333333333333], [0.47619047619047616, -0.38095238095238093], [0.3333333333333333, -0.38095238095238093], [0.23809523809523808, -0.42857142857142855], [0.19047619047619047, -0.5238095238095237], [0.19047619047619047, -0.5714285714285714], [0.23809523809523808, -0.6666666666666666], [0.3333333333333333, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142], [0.5714285714285714, -0.6666666666666666]]], "w": 0.8095238095238095}, "r": {"l": [[[0.23809523809523808, -0.047619047619047616], [0.23809523809523808, -0.7142857142857142]], [[0.23809523809523808, -0.5238095238095237], [0.2857142857142857, -0.6190476190476191], [0.3333333333333333, -0.6666666666666666], [0.42857142857142855, -0.7142857142857142], [0.5238095238095237, -0.7142857142857142]]], "w": 0.6190476190476191}, "u": {"l": [[[0.6666666666666666, -0.7142857142857142], [0.6666666666666666, -0.047619047619047616]], [[0.23809523809523808, -0.7142857142857142], [0.23809523809523808, -0.19047619047619047], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.5238095238095237, -0.047619047619047616], [0.6190476190476191, -0.09523809523809523], [0.6666666666666666, -0.14285714285714285]]], "w": 0.9047619047619047}, "t": {"l": [[[0.09523809523809523, -0.7142857142857142], [0.47619047619047616, -0.7142857142857142]], [[0.23809523809523808, -1.0476190476190474], [0.23809523809523808, -0.19047619047619047], [0.2857142857142857, -0.09523809523809523], [0.38095238095238093, -0.047619047619047616], [0.47619047619047616, -0.047619047619047616]]], "w": 0.5714285714285714}, "w": {"l": [[[0.1428571428571428, -0.7142857142857142], [0.33333333333333326, -0.047619047619047616], [0.5238095238095237, -0.5238095238095237], [0.7142857142857142, -0.047619047619047616], [0.9047619047619047, -0.7142857142857142]]], "w": 1.0476190476190474}}, "modules": [{"layer": "F", "center": [171.4, 95.89999999999999], "pads": [{"layers": ["F", "B"], "angle": -180.0, "pos": [130.76, 95.89999999999999], "drillsize": [1.2, 1.2], "shape": "oval", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [2.4, 2.4]}, {"layers": ["F", "B"], "angle": -180.0, "pos": [171.4, 95.89999999999999], "drillsize": [1.2, 1.2], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [2.4, 2.4]}], "drawings": [], "ref": "R2", "bbox": {"pos": [129.274999, 91.024999], "size": [43.600001999999996, 9.750002]}}, {"layer": "F", "center": [178.04999999999998, 91.1], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [176.7, 91.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -0.0, "pos": [179.4, 91.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R6", "bbox": {"pos": [175.67499899999999, 90.159999], "size": [4.750001999999999, 1.880002]}}, {"layer": "F", "center": [184.35, 91.1], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [185.7, 91.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [183.0, 91.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "D2", "bbox": {"pos": [181.974999, 90.174999], "size": [4.750001999999999, 1.850002]}}, {"layer": "F", "center": [184.35, 85.1], "pads": [{"layers": ["F"], "angle": -180.0, "pos": [183.0, 85.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -180.0, "pos": [185.7, 85.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "D1", "bbox": {"pos": [181.974999, 84.174999], "size": [4.750001999999999, 1.850002]}}, {"layer": "F", "center": [178.04999999999998, 85.1], "pads": [{"layers": ["F"], "angle": -0.0, "pos": [179.4, 85.1], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -0.0, "pos": [176.7, 85.1], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R1", "bbox": {"pos": [175.67499899999999, 84.159999], "size": [4.750001999999999, 1.880002]}}, {"layer": "F", "center": [141.5, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [149.0, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [146.5, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [144.0, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [141.5, 86.8], "drillsize": [1.0, 1.0], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J1", "bbox": {"pos": [138.52499899999998, 83.924999], "size": [13.450002, 6.800002]}}, {"layer": "F", "center": [156.4, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [161.4, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [158.9, 86.8], "drillsize": [1.0, 1.0], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [156.4, 86.8], "drillsize": [1.0, 1.0], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J2", "bbox": {"pos": [153.42499899999999, 83.924999], "size": [10.950002, 6.800002]}}, {"layer": "F", "center": [168.79999999999998, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [171.29999999999998, 86.8], "drillsize": [1.05, 1.05], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [168.79999999999998, 86.8], "drillsize": [1.05, 1.05], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J4", "bbox": {"pos": [165.824999, 83.924999], "size": [8.450002, 6.800002]}}, {"layer": "F", "center": [156.0, 95.94999999999999], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [156.0, 94.6], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -90.0, "pos": [156.0, 97.3], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R5", "bbox": {"pos": [155.059999, 93.57499899999999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [165.000001, 95.6], "pads": [{"layers": ["F", "B"], "angle": -270.0, "pos": [165.000001, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [159.92000099999998, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [162.460001, 95.6], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}], "drawings": [], "ref": "Q2", "bbox": {"pos": [158.885, 93.564999], "size": [7.150002, 4.790001999999999]}}, {"layer": "F", "center": [131.5, 86.8], "pads": [{"layers": ["F", "B"], "angle": -0.0, "pos": [131.5, 86.8], "drillsize": [1.05, 1.05], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.75, 1.75]}, {"layers": ["F", "B"], "angle": -0.0, "pos": [134.0, 86.8], "drillsize": [1.05, 1.05], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.75, 1.75]}], "drawings": [], "ref": "J3", "bbox": {"pos": [128.524999, 83.924999], "size": [8.450002, 6.800001]}}, {"layer": "F", "center": [147.79999999999998, 95.5], "pads": [{"layers": ["F", "B"], "angle": -270.0, "pos": [147.79999999999998, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "rect", "offset": [0.0, 0.0], "drillshape": "circle", "pin1": 1, "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [142.72, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}, {"layers": ["F", "B"], "angle": -270.0, "pos": [145.26, 95.5], "drillsize": [0.7999999999999999, 0.7999999999999999], "shape": "circle", "offset": [0.0, 0.0], "drillshape": "circle", "type": "th", "size": [1.52, 1.52]}], "drawings": [], "ref": "Q1", "bbox": {"pos": [141.684999, 93.46499899999999], "size": [7.150002, 4.790001999999999]}}, {"layer": "F", "center": [151.0, 95.94999999999999], "pads": [{"layers": ["F"], "angle": -270.0, "pos": [151.0, 97.3], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -270.0, "pos": [151.0, 94.6], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R3", "bbox": {"pos": [150.059999, 93.57499899999999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [136.25, 95.5], "pads": [{"layers": ["F"], "angle": -90.0, "pos": [136.25, 96.85], "shape": "rect", "offset": [0.0, 0.0], "pin1": 1, "type": "smd", "size": [1.5, 1.3]}, {"layers": ["F"], "angle": -90.0, "pos": [136.25, 94.14999999999999], "shape": "rect", "offset": [0.0, 0.0], "type": "smd", "size": [1.5, 1.3]}], "drawings": [], "ref": "R4", "bbox": {"pos": [135.309999, 93.124999], "size": [1.880002, 4.750001999999999]}}, {"layer": "F", "center": [123.19, 98.044], "pads": [], "drawings": [], "ref": "REF***", "bbox": {"pos": [118.788845, 94.326691], "size": [8.80231, 7.452731999999999]}}], "edges": [{"start": [115.057082, 97.94291799999999], "radius": 3.1999999999999997, "type": "circle", "width": 0.09999999999999999}, {"start": [190.199999, 83.8], "end": [190.199999, 99.8], "type": "segment", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 0.0, "start": [187.2, 83.8], "radius": 2.999999, "startangle": -90.0, "type": "arc"}, {"start": [185.342918, 97.94291799999999], "radius": 3.1999999999999997, "type": "circle", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 90.00001909859319, "start": [187.200001, 99.8], "radius": 3.0, "startangle": 1.9098593179478487e-05, "type": "arc"}, {"start": [187.2, 102.8], "end": [113.19999999999999, 102.8], "type": "segment", "width": 0.09999999999999999}, {"width": 0.09999999999999999, "endangle": 270.0, "start": [113.19999999999999, 83.8], "radius": 3.0, "startangle": 180.0, "type": "arc"}, {"width": 0.09999999999999999, "endangle": 180.0, "start": [113.19999999999999, 99.8], "radius": 3.0000009999999997, "startangle": 90.0, "type": "arc"}, {"start": [113.19999999999999, 80.8], "end": [187.2, 80.800001], "type": "segment", "width": 0.09999999999999999}, {"start": [110.19999899999999, 99.8], "end": [110.19999999999999, 83.800001], "type": "segment", "width": 0.09999999999999999}], "bom": {"both": [[2, "470", "R_0805_HandSoldering", [["R1", 4], ["R6", 1]], []], [1, "4.7", "R_0805_HandSoldering", [["R3", 12]], []], [1, "1k", "R_0805_HandSoldering", [["R4", 13]], []], [1, "4.7k", "R_0805_HandSoldering", [["R5", 8]], []], [1, "27", "R_Axial_Power_L38.0mm_W9.0mm_P40.64mm", [["R2", 0]], []], [1, "HEATon", "LED_0805_HandSoldering", [["D1", 3]], []], [1, "FANon", "LED_0805_HandSoldering", [["D2", 2]], []], [2, "BC517", "TO-92_Inline_Wide", [["Q1", 11], ["Q2", 9]], []], [1, "thermistor", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J3", 10]], []], [1, "fan", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J4", 7]], []], [1, "MCUpins", "JST_XH_B03B-XH-A_03x2.50mm_Straight", [["J2", 6]], []], [1, "power Input", "JST_XH_B04B-XH-A_04x2.50mm_Straight", [["J1", 5]], []]], "B": [], "F": [[2, "470", "R_0805_HandSoldering", [["R1", 4], ["R6", 1]], []], [1, "4.7", "R_0805_HandSoldering", [["R3", 12]], []], [1, "1k", "R_0805_HandSoldering", [["R4", 13]], []], [1, "4.7k", "R_0805_HandSoldering", [["R5", 8]], []], [1, "27", "R_Axial_Power_L38.0mm_W9.0mm_P40.64mm", [["R2", 0]], []], [1, "HEATon", "LED_0805_HandSoldering", [["D1", 3]], []], [1, "FANon", "LED_0805_HandSoldering", [["D2", 2]], []], [2, "BC517", "TO-92_Inline_Wide", [["Q1", 11], ["Q2", 9]], []], [1, "thermistor", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J3", 10]], []], [1, "fan", "JST_XH_B02B-XH-A_02x2.50mm_Straight", [["J4", 7]], []], [1, "MCUpins", "JST_XH_B03B-XH-A_03x2.50mm_Straight", [["J2", 6]], []], [1, "power Input", "JST_XH_B04B-XH-A_04x2.50mm_Straight", [["J1", 5]], []]]}, "silkscreen": {"B": [], "F": [{"width": 1.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "heater\n", "thickness": 0.19999999999999998, "pos": [177.79999999999998, 97.536], "height": 1.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "temp", "thickness": 0.09999999999999999, "pos": [161.4, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "GND", "thickness": 0.09999999999999999, "pos": [141.5, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "5V", "thickness": 0.09999999999999999, "pos": [144.0, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "12V", "thickness": 0.09999999999999999, "pos": [146.4, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "heat\n", "thickness": 0.09999999999999999, "pos": [158.9, 83.5], "height": 0.5}, {"width": 0.5, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "fan\n", "thickness": 0.09999999999999999, "pos": [156.4, 83.5], "height": 0.5}, {"width": 2.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "OpenPLC\nFOSSEE", "thickness": 0.39999999999999997, "pos": [120.142, 87.37599999999999], "height": 2.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R2", "thickness": 0.15, "pos": [151.07999999999998, 101.46], "height": 1.0}, {"start": [132.01999999999998, 91.33999999999999], "end": [132.01999999999998, 94.52], "type": "segment", "width": 0.12}, {"start": [170.14, 91.33999999999999], "end": [132.01999999999998, 91.33999999999999], "type": "segment", "width": 0.12}, {"start": [170.14, 94.52], "end": [170.14, 91.33999999999999], "type": "segment", "width": 0.12}, {"start": [132.01999999999998, 100.46], "end": [132.01999999999998, 97.28], "type": "segment", "width": 0.12}, {"start": [170.14, 100.46], "end": [132.01999999999998, 100.46], "type": "segment", "width": 0.12}, {"start": [170.14, 97.28], "end": [170.14, 100.46], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R6", "thickness": 0.15, "pos": [178.04999999999998, 89.39999999999999], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "470", "thickness": 0.15, "pos": [178.04999999999998, 92.85], "height": 1.0}, {"start": [178.65, 91.97999999999999], "end": [177.45, 91.97999999999999], "type": "segment", "width": 0.12}, {"start": [177.45, 90.22], "end": [178.65, 90.22], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "D2", "thickness": 0.15, "pos": [184.35, 92.8], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "FANon", "thickness": 0.15, "pos": [184.35, 89.35], "height": 1.0}, {"start": [183.35, 90.35], "end": [186.54999999999998, 90.35], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 91.85], "end": [183.35, 91.85], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 91.85], "end": [186.54999999999998, 90.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "D1", "thickness": 0.15, "pos": [184.35, 86.8], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "HEATon", "thickness": 0.15, "pos": [184.35, 83.35], "height": 1.0}, {"start": [186.54999999999998, 85.85], "end": [186.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [186.54999999999998, 85.85], "end": [183.35, 85.85], "type": "segment", "width": 0.12}, {"start": [183.35, 84.35], "end": [186.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "R1", "thickness": 0.15, "pos": [178.04999999999998, 83.39999999999999], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "470", "thickness": 0.15, "pos": [178.04999999999998, 86.85], "height": 1.0}, {"start": [177.45, 84.22], "end": [178.65, 84.22], "type": "segment", "width": 0.12}, {"start": [178.65, 85.97999999999999], "end": [177.45, 85.97999999999999], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J1", "thickness": 0.13999999999999999, "pos": [152.7, 86.8], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "power Input", "thickness": 0.15, "pos": [145.29999999999998, 81.89999999999999], "height": 1.0}, {"start": [138.65, 84.05], "end": [138.65, 86.55], "type": "segment", "width": 0.12}, {"start": [141.15, 84.05], "end": [138.65, 84.05], "type": "segment", "width": 0.12}, {"start": [150.79999999999998, 89.55], "end": [145.25, 89.55], "type": "segment", "width": 0.12}, {"start": [150.79999999999998, 86.6], "end": [150.79999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 86.6], "end": [150.79999999999998, 86.6], "type": "segment", "width": 0.12}, {"start": [139.7, 89.55], "end": [145.25, 89.55], "type": "segment", "width": 0.12}, {"start": [139.7, 86.6], "end": [139.7, 89.55], "type": "segment", "width": 0.12}, {"start": [138.95, 86.6], "end": [139.7, 86.6], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 84.35], "end": [149.75, 84.35], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 85.1], "end": [151.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [149.75, 85.1], "end": [151.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [149.75, 84.35], "end": [149.75, 85.1], "type": "segment", "width": 0.12}, {"start": [140.75, 84.35], "end": [138.95, 84.35], "type": "segment", "width": 0.12}, {"start": [140.75, 85.1], "end": [140.75, 84.35], "type": "segment", "width": 0.12}, {"start": [138.95, 85.1], "end": [140.75, 85.1], "type": "segment", "width": 0.12}, {"start": [138.95, 84.35], "end": [138.95, 85.1], "type": "segment", "width": 0.12}, {"start": [148.25, 84.35], "end": [142.25, 84.35], "type": "segment", "width": 0.12}, {"start": [148.25, 85.1], "end": [148.25, 84.35], "type": "segment", "width": 0.12}, {"start": [142.25, 85.1], "end": [148.25, 85.1], "type": "segment", "width": 0.12}, {"start": [142.25, 84.35], "end": [142.25, 85.1], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 84.35], "end": [138.95, 84.35], "type": "segment", "width": 0.12}, {"start": [151.54999999999998, 90.3], "end": [151.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [138.95, 90.3], "end": [151.54999999999998, 90.3], "type": "segment", "width": 0.12}, {"start": [138.95, 84.35], "end": [138.95, 90.3], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J2", "thickness": 0.13999999999999999, "pos": [165.1, 87.1], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "MCUpins", "thickness": 0.15, "pos": [158.9, 81.89999999999999], "height": 1.0}, {"start": [153.54999999999998, 84.05], "end": [153.54999999999998, 86.55], "type": "segment", "width": 0.12}, {"start": [156.04999999999998, 84.05], "end": [153.54999999999998, 84.05], "type": "segment", "width": 0.12}, {"start": [163.2, 89.55], "end": [158.9, 89.55], "type": "segment", "width": 0.12}, {"start": [163.2, 86.6], "end": [163.2, 89.55], "type": "segment", "width": 0.12}, {"start": [163.95, 86.6], "end": [163.2, 86.6], "type": "segment", "width": 0.12}, {"start": [154.6, 89.55], "end": [158.9, 89.55], "type": "segment", "width": 0.12}, {"start": [154.6, 86.6], "end": [154.6, 89.55], "type": "segment", "width": 0.12}, {"start": [153.85, 86.6], "end": [154.6, 86.6], "type": "segment", "width": 0.12}, {"start": [163.95, 84.35], "end": [162.15, 84.35], "type": "segment", "width": 0.12}, {"start": [163.95, 85.1], "end": [163.95, 84.35], "type": "segment", "width": 0.12}, {"start": [162.15, 85.1], "end": [163.95, 85.1], "type": "segment", "width": 0.12}, {"start": [162.15, 84.35], "end": [162.15, 85.1], "type": "segment", "width": 0.12}, {"start": [155.65, 84.35], "end": [153.85, 84.35], "type": "segment", "width": 0.12}, {"start": [155.65, 85.1], "end": [155.65, 84.35], "type": "segment", "width": 0.12}, {"start": [153.85, 85.1], "end": [155.65, 85.1], "type": "segment", "width": 0.12}, {"start": [153.85, 84.35], "end": [153.85, 85.1], "type": "segment", "width": 0.12}, {"start": [160.65, 84.35], "end": [157.15, 84.35], "type": "segment", "width": 0.12}, {"start": [160.65, 85.1], "end": [160.65, 84.35], "type": "segment", "width": 0.12}, {"start": [157.15, 85.1], "end": [160.65, 85.1], "type": "segment", "width": 0.12}, {"start": [157.15, 84.35], "end": [157.15, 85.1], "type": "segment", "width": 0.12}, {"start": [163.95, 84.35], "end": [153.85, 84.35], "type": "segment", "width": 0.12}, {"start": [163.95, 90.3], "end": [163.95, 84.35], "type": "segment", "width": 0.12}, {"start": [153.85, 90.3], "end": [163.95, 90.3], "type": "segment", "width": 0.12}, {"start": [153.85, 84.35], "end": [153.85, 90.3], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J4", "thickness": 0.13999999999999999, "pos": [175.1, 87.1], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "fan", "thickness": 0.15, "pos": [170.04999999999998, 81.89999999999999], "height": 1.0}, {"start": [165.95, 84.05], "end": [165.95, 86.55], "type": "segment", "width": 0.12}, {"start": [168.45, 84.05], "end": [165.95, 84.05], "type": "segment", "width": 0.12}, {"start": [173.1, 89.55], "end": [170.04999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [173.1, 86.6], "end": [173.1, 89.55], "type": "segment", "width": 0.12}, {"start": [173.85, 86.6], "end": [173.1, 86.6], "type": "segment", "width": 0.12}, {"start": [167.0, 89.55], "end": [170.04999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [167.0, 86.6], "end": [167.0, 89.55], "type": "segment", "width": 0.12}, {"start": [166.25, 86.6], "end": [167.0, 86.6], "type": "segment", "width": 0.12}, {"start": [173.85, 84.35], "end": [172.04999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [173.85, 85.1], "end": [173.85, 84.35], "type": "segment", "width": 0.12}, {"start": [172.04999999999998, 85.1], "end": [173.85, 85.1], "type": "segment", "width": 0.12}, {"start": [172.04999999999998, 84.35], "end": [172.04999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [168.04999999999998, 84.35], "end": [166.25, 84.35], "type": "segment", "width": 0.12}, {"start": [168.04999999999998, 85.1], "end": [168.04999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [166.25, 85.1], "end": [168.04999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [166.25, 84.35], "end": [166.25, 85.1], "type": "segment", "width": 0.12}, {"start": [170.54999999999998, 84.35], "end": [169.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [170.54999999999998, 85.1], "end": [170.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [169.54999999999998, 85.1], "end": [170.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [169.54999999999998, 84.35], "end": [169.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [173.85, 84.35], "end": [166.25, 84.35], "type": "segment", "width": 0.12}, {"start": [173.85, 90.3], "end": [173.85, 84.35], "type": "segment", "width": 0.12}, {"start": [166.25, 90.3], "end": [173.85, 90.3], "type": "segment", "width": 0.12}, {"start": [166.25, 84.35], "end": [166.25, 90.3], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R5", "thickness": 0.15, "pos": [156.2, 99.19999999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "4.7k", "thickness": 0.15, "pos": [155.79999999999998, 92.8], "height": 1.0}, {"start": [155.12, 96.55], "end": [155.12, 95.35], "type": "segment", "width": 0.12}, {"start": [156.88, 95.35], "end": [156.88, 96.55], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "Q2", "thickness": 0.15, "pos": [162.460001, 99.16], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "BC517", "thickness": 0.15, "pos": [162.460001, 92.81], "height": 1.0}, {"width": 0.12, "endangle": 225.78482460299193, "start": [162.460001, 95.6], "radius": 2.581182, "startangle": 205.78482460299193, "type": "arc"}, {"width": 0.12, "endangle": 155.0, "start": [162.460001, 95.6], "radius": 2.6, "startangle": 90.0, "type": "arc"}, {"width": 0.12, "endangle": 90.0, "start": [162.460001, 95.6], "radius": 2.6, "startangle": 25.0, "type": "arc"}, {"width": 0.12, "endangle": 334.2151753970081, "start": [162.460001, 95.6], "radius": 2.581182, "startangle": 314.2151753970081, "type": "arc"}, {"start": [164.260001, 93.75], "end": [160.660001, 93.75], "type": "segment", "width": 0.12}, {"width": 0.7999999999999999, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "J3", "thickness": 0.13999999999999999, "pos": [137.7, 86.8], "height": 0.7999999999999999}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "thermistor", "thickness": 0.15, "pos": [132.5, 82.0], "height": 1.0}, {"start": [128.95, 84.35], "end": [128.95, 90.3], "type": "segment", "width": 0.12}, {"start": [128.95, 90.3], "end": [136.54999999999998, 90.3], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 90.3], "end": [136.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 84.35], "end": [128.95, 84.35], "type": "segment", "width": 0.12}, {"start": [132.25, 84.349999], "end": [132.250001, 85.1], "type": "segment", "width": 0.12}, {"start": [132.250001, 85.1], "end": [133.249999, 85.1], "type": "segment", "width": 0.12}, {"start": [133.249999, 85.1], "end": [133.249999, 84.35], "type": "segment", "width": 0.12}, {"start": [133.249999, 84.35], "end": [132.25, 84.349999], "type": "segment", "width": 0.12}, {"start": [128.95, 84.35], "end": [128.95, 85.1], "type": "segment", "width": 0.12}, {"start": [128.95, 85.1], "end": [130.749999, 85.1], "type": "segment", "width": 0.12}, {"start": [130.749999, 85.1], "end": [130.75, 84.349999], "type": "segment", "width": 0.12}, {"start": [130.75, 84.349999], "end": [128.95, 84.35], "type": "segment", "width": 0.12}, {"start": [134.75, 84.349999], "end": [134.750001, 85.1], "type": "segment", "width": 0.12}, {"start": [134.750001, 85.1], "end": [136.54999999999998, 85.1], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 85.1], "end": [136.54999999999998, 84.35], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 84.35], "end": [134.75, 84.349999], "type": "segment", "width": 0.12}, {"start": [128.95, 86.6], "end": [129.7, 86.6], "type": "segment", "width": 0.12}, {"start": [129.7, 86.6], "end": [129.7, 89.55], "type": "segment", "width": 0.12}, {"start": [129.7, 89.55], "end": [132.75, 89.55], "type": "segment", "width": 0.12}, {"start": [136.54999999999998, 86.6], "end": [135.79999999999998, 86.6], "type": "segment", "width": 0.12}, {"start": [135.79999999999998, 86.6], "end": [135.79999999999998, 89.55], "type": "segment", "width": 0.12}, {"start": [135.79999999999998, 89.55], "end": [132.75, 89.55], "type": "segment", "width": 0.12}, {"start": [131.15, 84.05], "end": [128.65, 84.05], "type": "segment", "width": 0.12}, {"start": [128.65, 84.05], "end": [128.65, 86.55], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "Q1", "thickness": 0.15, "pos": [145.26, 99.06], "height": 1.0}, {"width": 1.0, "angle": 0.0, "attr": [], "horiz_justify": 0, "text": "BC517", "thickness": 0.15, "pos": [145.26, 92.71], "height": 1.0}, {"width": 0.12, "endangle": 225.78482460299193, "start": [145.26, 95.5], "radius": 2.581182, "startangle": 205.78482460299193, "type": "arc"}, {"width": 0.12, "endangle": 155.0, "start": [145.26, 95.5], "radius": 2.6, "startangle": 90.0, "type": "arc"}, {"width": 0.12, "endangle": 90.0, "start": [145.26, 95.5], "radius": 2.6, "startangle": 25.0, "type": "arc"}, {"width": 0.12, "endangle": 334.2151753970081, "start": [145.26, 95.5], "radius": 2.581182, "startangle": 314.2151753970081, "type": "arc"}, {"start": [147.06, 93.64999999999999], "end": [143.45999999999998, 93.64999999999999], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R3", "thickness": 0.15, "pos": [151.1, 99.3], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "4.7", "thickness": 0.15, "pos": [150.9, 92.7], "height": 1.0}, {"start": [151.88, 95.35], "end": [151.88, 96.55], "type": "segment", "width": 0.12}, {"start": [150.12, 96.55], "end": [150.12, 95.35], "type": "segment", "width": 0.12}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "R4", "thickness": 0.15, "pos": [136.2, 98.89999999999999], "height": 1.0}, {"width": 1.0, "angle": 90.0, "attr": [], "horiz_justify": 0, "text": "1k", "thickness": 0.15, "pos": [136.2, 92.3], "height": 1.0}, {"start": [137.13, 94.89999999999999], "end": [137.13, 96.1], "type": "segment", "width": 0.12}, {"start": [135.37, 96.1], "end": [135.37, 94.89999999999999], "type": "segment", "width": 0.12}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-3.231114, 2.584505], [-3.1564609999999997, 2.621727], [-3.090569, 2.690261], [-3.0724229999999997, 2.715648], [-3.0526549999999997, 2.748866], [-3.039828, 2.784945], [-3.0324899999999997, 2.8330979999999997], [-3.029187, 2.902536], [-3.0284619999999998, 2.9942059999999997], [-3.0317369999999997, 3.11983], [-3.043123, 3.2141539999999997], [-3.064959, 3.2845229999999996], [-3.0995809999999997, 3.3382859999999996], [-3.14933, 3.3827879999999997], [-3.152986, 3.385423], [-3.202015, 3.4123769999999998], [-3.261055, 3.425712], [-3.336141, 3.429], [-3.458205, 3.429], [-3.458256, 3.547497], [-3.459392, 3.613492], [-3.4663139999999997, 3.652202], [-3.4844019999999998, 3.6754189999999998], [-3.5190379999999997, 3.694933], [-3.527355, 3.6989199999999998], [-3.56628, 3.717603], [-3.5964169999999998, 3.729403], [-3.618826, 3.730422], [-3.6345669999999997, 3.716761], [-3.644698, 3.684522], [-3.650277, 3.629804], [-3.6523649999999996, 3.548711], [-3.6520189999999997, 3.437344], [-3.6502999999999997, 3.2918019999999997], [-3.6497629999999996, 3.248269], [-3.6478279999999996, 3.0982049999999997], [-3.646096, 3.0000419999999997], [-3.4583079999999997, 3.0000419999999997], [-3.457252, 3.083364], [-3.452562, 3.13788], [-3.4419489999999997, 3.173837], [-3.4231279999999997, 3.201482], [-3.4103499999999998, 3.214965], [-3.35811, 3.2544169999999997], [-3.311858, 3.257628], [-3.2641329999999997, 3.225049], [-3.262923, 3.223846], [-3.243506, 3.198668], [-3.231693, 3.164447], [-3.225735, 3.111748], [-3.22388, 3.031131], [-3.223846, 3.013271], [-3.2283299999999997, 2.9021749999999997], [-3.2429259999999998, 2.825161], [-3.2693499999999998, 2.7781469999999997], [-3.309317, 2.75705], [-3.332416, 2.754923], [-3.387238, 2.7649], [-3.424842, 2.797752], [-3.4474769999999997, 2.857857], [-3.457394, 2.949598], [-3.4583079999999997, 3.0000419999999997], [-3.646096, 3.0000419999999997], [-3.645778, 2.9820599999999997], [-3.643127, 2.894679], [-3.639394, 2.830905], [-3.634093, 2.785582], [-3.6267419999999997, 2.753555], [-3.616857, 2.7296679999999998], [-3.603954, 2.708764], [-3.5984209999999996, 2.700898], [-3.525031, 2.626595], [-3.4322399999999997, 2.584467], [-3.3249039999999996, 2.5727219999999997], [-3.231114, 2.584505]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-1.7283359999999999, 2.5950889999999998], [-1.665633, 2.631358], [-1.622039, 2.6673579999999997], [-1.590155, 2.705075], [-1.56819, 2.7511989999999997], [-1.554351, 2.812421], [-1.5468469999999999, 2.895431], [-1.543883, 3.006919], [-1.543539, 3.087062], [-1.543539, 3.382065], [-1.7096149999999999, 3.456515], [-1.719385, 3.133402], [-1.7234209999999999, 3.0127289999999998], [-1.7276559999999999, 2.925141], [-1.7329029999999999, 2.8646499999999997], [-1.7399749999999998, 2.825268], [-1.7496889999999998, 2.801007], [-1.762856, 2.7858799999999997], [-1.767081, 2.782606], [-1.831091, 2.757034], [-1.895792, 2.767153], [-1.934308, 2.794], [-1.949975, 2.813024], [-1.96082, 2.8379879999999997], [-1.967712, 2.875834], [-1.9715209999999999, 2.933502], [-1.973117, 3.017935], [-1.973385, 3.105928], [-1.9734369999999999, 3.216323], [-1.975328, 3.294463], [-1.981655, 3.347165], [-1.9950169999999998, 3.381242], [-2.018015, 3.403511], [-2.053246, 3.420787], [-2.100303, 3.438738], [-2.151697, 3.458278], [-2.1455789999999997, 3.111485], [-2.143116, 2.986468], [-2.140233, 2.894082], [-2.1361019999999997, 2.827881], [-2.129893, 2.78142], [-2.120774, 2.748256], [-2.107917, 2.7219439999999997], [-2.092416, 2.6987289999999997], [-2.017629, 2.6245689999999997], [-1.926372, 2.581684], [-1.8271169999999999, 2.571412], [-1.7283359999999999, 2.5950889999999998]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-3.9831139999999996, 2.587256], [-3.891536, 2.6354089999999997], [-3.8239509999999997, 2.7129049999999997], [-3.799943, 2.762727], [-3.781262, 2.837533], [-3.771699, 2.9320519999999997], [-3.7707919999999997, 3.0352099999999997], [-3.778079, 3.135935], [-3.793097, 3.223153], [-3.815385, 3.2857909999999997], [-3.8222349999999996, 3.296579], [-3.903368, 3.377105], [-3.9997339999999997, 3.4253359999999997], [-4.104299, 3.43945], [-4.210032, 3.417629], [-4.239457, 3.404547], [-4.296759, 3.3642309999999997], [-4.347049999999999, 3.310775], [-4.351802999999999, 3.303995], [-4.371122, 3.271321], [-4.3838919999999995, 3.2363939999999998], [-4.391436, 3.1904139999999996], [-4.3950759999999995, 3.124584], [-4.396135, 3.030105], [-4.396154, 3.008923], [-4.396106, 3.002182], [-4.200769, 3.002182], [-4.199632, 3.0913489999999997], [-4.195158999999999, 3.1505199999999998], [-4.185754, 3.188741], [-4.169824, 3.2150529999999997], [-4.1616919999999995, 3.223846], [-4.114942, 3.2572609999999997], [-4.069553, 3.255737], [-4.02366, 3.226752], [-3.996288, 3.1958089999999997], [-3.9800769999999996, 3.1506429999999996], [-3.970974, 3.07942], [-3.9703489999999997, 3.0711139999999997], [-3.9687959999999998, 2.942037], [-3.985035, 2.8461719999999997], [-4.018848, 2.7841069999999997], [-4.070016, 2.7564319999999998], [-4.08828, 2.754923], [-4.13624, 2.7625129999999998], [-4.169047, 2.788808], [-4.189105, 2.839095], [-4.198822, 2.9186639999999997], [-4.200769, 3.002182], [-4.396106, 3.002182], [-4.395426, 2.908249], [-4.392371, 2.837906], [-4.3856779999999995, 2.789163], [-4.37404, 2.753288], [-4.356147, 2.721548], [-4.352192, 2.715648], [-4.285733, 2.636104], [-4.213315, 2.5899289999999997], [-4.125151, 2.571599], [-4.095213, 2.570703], [-3.9831139999999996, 2.587256]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-2.4657459999999998, 2.599745], [-2.388714, 2.651567], [-2.3291839999999997, 2.726412], [-2.293622, 2.8216539999999997], [-2.286429, 2.891756], [-2.287246, 2.9210089999999997], [-2.294086, 2.9434069999999997], [-2.312888, 2.9634739999999997], [-2.349592, 2.9857329999999997], [-2.410138, 3.014709], [-2.500466, 3.0549269999999997], [-2.500923, 3.055129], [-2.5840669999999997, 3.09321], [-2.652247, 3.1270249999999997], [-2.698495, 3.152933], [-2.715842, 3.1672949999999997], [-2.715846, 3.167411], [-2.700557, 3.198685], [-2.6648039999999997, 3.233157], [-2.623758, 3.25799], [-2.602963, 3.262923], [-2.54623, 3.245862], [-2.497373, 3.203133], [-2.473535, 3.156155], [-2.450603, 3.1215219999999997], [-2.405682, 3.082081], [-2.352877, 3.048009], [-2.3062899999999997, 3.02948], [-2.296548, 3.0284619999999998], [-2.285582, 3.045215], [-2.2849209999999998, 3.0880389999999998], [-2.29298, 3.145781], [-2.308173, 3.207289], [-2.3289139999999997, 3.261409], [-2.329962, 3.2635099999999997], [-2.392379, 3.35066], [-2.473274, 3.409939], [-2.565144, 3.439034], [-2.660487, 3.435634], [-2.751802, 3.3974279999999997], [-2.755862, 3.394741], [-2.8276939999999997, 3.3296419999999998], [-2.874927, 3.2447049999999997], [-2.9010659999999997, 3.133021], [-2.9045739999999998, 3.1016429999999997], [-2.910787, 2.9535359999999997], [-2.903339, 2.884468], [-2.715846, 2.884468], [-2.7134099999999997, 2.927552], [-2.7000859999999998, 2.940126], [-2.666868, 2.930719], [-2.614506, 2.908483], [-2.555976, 2.88061], [-2.554521, 2.8798719999999998], [-2.504911, 2.853777], [-2.485, 2.836363], [-2.48991, 2.818107], [-2.5105839999999997, 2.79412], [-2.5631809999999997, 2.759406], [-2.619823, 2.756856], [-2.6706309999999998, 2.782119], [-2.705724, 2.830847], [-2.715846, 2.884468], [-2.903339, 2.884468], [-2.898008, 2.8350359999999997], [-2.8652219999999997, 2.741055], [-2.819579, 2.6752149999999997], [-2.737198, 2.608681], [-2.646454, 2.575676], [-2.5538149999999997, 2.5735729999999997], [-2.4657459999999998, 2.599745]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[-0.840154, 2.49212], [-0.834428, 2.57198], [-0.827851, 2.619039], [-0.818738, 2.639566], [-0.805402, 2.6398289999999998], [-0.8010769999999999, 2.637378], [-0.743556, 2.619636], [-0.668732, 2.620672], [-0.592661, 2.63891], [-0.545082, 2.662505], [-0.49629799999999996, 2.700198], [-0.460636, 2.742855], [-0.43615499999999996, 2.7970569999999997], [-0.420913, 2.8693839999999997], [-0.41297, 2.9664189999999997], [-0.41038399999999997, 3.0947419999999997], [-0.410338, 3.119358], [-0.410308, 3.39587], [-0.47183899999999995, 3.4173199999999997], [-0.515541, 3.4319119999999996], [-0.5395179999999999, 3.438706], [-0.540223, 3.4387689999999997], [-0.542585, 3.4203449999999997], [-0.544594, 3.369526], [-0.546099, 3.292993], [-0.546947, 3.1974299999999998], [-0.5470769999999999, 3.139329], [-0.547349, 3.024771], [-0.548748, 2.9426669999999997], [-0.552151, 2.886393], [-0.558433, 2.849326], [-0.568471, 2.8248439999999997], [-0.583139, 2.8063249999999997], [-0.592298, 2.797406], [-0.655211, 2.761466], [-0.723864, 2.758775], [-0.786152, 2.78917], [-0.797671, 2.800144], [-0.8145669999999999, 2.820779], [-0.826286, 2.845256], [-0.8337669999999999, 2.8806469999999997], [-0.837946, 2.934026], [-0.8397629999999999, 3.012466], [-0.840154, 3.1206169999999998], [-0.840154, 3.39587], [-0.901685, 3.4173199999999997], [-0.945387, 3.4319119999999996], [-0.969364, 3.438706], [-0.97007, 3.4387689999999997], [-0.9718739999999999, 3.420069], [-0.9734999999999999, 3.3673219999999997], [-0.9748829999999999, 3.285557], [-0.975958, 3.179805], [-0.97666, 3.055094], [-0.976923, 2.916455], [-0.976923, 2.381806], [-0.849923, 2.328236], [-0.840154, 2.49212]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.053501, 2.626303], [0.13005999999999998, 2.654733], [0.130936, 2.6552789999999997], [0.178285, 2.690127], [0.21324099999999999, 2.730852], [0.23782499999999998, 2.783925], [0.254062, 2.855814], [0.263975, 2.952992], [0.269586, 3.081928], [0.270077, 3.100298], [0.27714099999999997, 3.377287], [0.217695, 3.408028], [0.174681, 3.4288019999999997], [0.14870999999999998, 3.438646], [0.147509, 3.4387689999999997], [0.143014, 3.420606], [0.13944399999999998, 3.371612], [0.13724799999999998, 3.3000309999999997], [0.136769, 3.2420679999999997], [0.136758, 3.14817], [0.132466, 3.089203], [0.117503, 3.061079], [0.085482, 3.059706], [0.030014, 3.0809979999999997], [-0.053731, 3.120136], [-0.115311, 3.152643], [-0.146983, 3.1808449999999997], [-0.156294, 3.211582], [-0.156308, 3.213104], [-0.14094299999999998, 3.266054], [-0.095453, 3.29466], [-0.025834, 3.298803], [0.024312999999999998, 3.298084], [0.050754, 3.3125269999999998], [0.067243, 3.347218], [0.076733, 3.391416], [0.063057, 3.416493], [0.057907, 3.420082], [0.009425, 3.4344959999999998], [-0.058469, 3.436537], [-0.128388, 3.426983], [-0.17793199999999998, 3.409522], [-0.24642999999999998, 3.351364], [-0.285366, 3.2704079999999998], [-0.293077, 3.20716], [-0.287193, 3.150111], [-0.265899, 3.103542], [-0.223735, 3.062181], [-0.155241, 3.020755], [-0.054956, 2.9739929999999997], [-0.048846, 2.9713499999999997], [0.04149, 2.929617], [0.097235, 2.895391], [0.121129, 2.864635], [0.11591299999999999, 2.8333109999999997], [0.084328, 2.797383], [0.07488299999999999, 2.789116], [0.011616999999999999, 2.757058], [-0.053936, 2.758407], [-0.111028, 2.789838], [-0.14890699999999998, 2.8480239999999997], [-0.152426, 2.8594459999999997], [-0.1867, 2.914837], [-0.23019099999999998, 2.941518], [-0.293077, 2.9679599999999997], [-0.293077, 2.899548], [-0.27394799999999997, 2.8001099999999997], [-0.217169, 2.7089019999999997], [-0.18762199999999998, 2.6783889999999997], [-0.120458, 2.6392279999999997], [-0.035044, 2.6214999999999997], [0.053501, 2.626303]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.7133619999999999, 2.62467], [0.802117, 2.657421], [0.874022, 2.71535], [0.902144, 2.756128], [0.9328019999999999, 2.8309539999999997], [0.9321649999999999, 2.885058], [0.899987, 2.921446], [0.888081, 2.9276329999999997], [0.836675, 2.946925], [0.810422, 2.941982], [0.80153, 2.9095869999999997], [0.8010769999999999, 2.891692], [0.784797, 2.825859], [0.7423649999999999, 2.779807], [0.683388, 2.757564], [0.617475, 2.7631609999999998], [0.5638949999999999, 2.792229], [0.545798, 2.80881], [0.532971, 2.828925], [0.5243059999999999, 2.8593319999999998], [0.5186959999999999, 2.9067879999999997], [0.515035, 2.97805], [0.512215, 3.079875], [0.5114839999999999, 3.1121149999999997], [0.5088199999999999, 3.22241], [0.505792, 3.300036], [0.50125, 3.351396], [0.494046, 3.3828899999999997], [0.483033, 3.4009199999999997], [0.46706, 3.411888], [0.45683399999999996, 3.416733], [0.413406, 3.4333009999999997], [0.38784199999999996, 3.4387689999999997], [0.379395, 3.4205069999999997], [0.374239, 3.365296], [0.372346, 3.272499], [0.373689, 3.1414779999999998], [0.37410699999999997, 3.121269], [0.377058, 3.0017329999999998], [0.380548, 2.914449], [0.38551399999999997, 2.852591], [0.392893, 2.809336], [0.403624, 2.77786], [0.418645, 2.7513389999999998], [0.426502, 2.739975], [0.471553, 2.689692], [0.52194, 2.650581], [0.528108, 2.647167], [0.618458, 2.620212], [0.7133619999999999, 2.62467]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[1.6020809999999999, 2.780289], [1.6018329999999998, 2.92632], [1.6008719999999999, 3.038655], [1.5987939999999998, 3.122678], [1.5951929999999999, 3.183769], [1.5896649999999999, 3.227309], [1.581804, 3.258679], [1.571207, 3.2832619999999997], [1.5631819999999998, 3.297294], [1.4967279999999998, 3.373388], [1.41247, 3.421084], [1.319249, 3.438199], [1.2259, 3.4225459999999996], [1.170312, 3.394418], [1.1119569999999999, 3.34576], [1.0721859999999999, 3.286333], [1.04819, 3.208507], [1.037161, 3.1046519999999997], [1.035599, 3.0284619999999998], [1.035809, 3.022986], [1.172308, 3.022986], [1.173141, 3.1103549999999998], [1.176961, 3.168192], [1.185746, 3.206029], [1.201474, 3.2333979999999998], [1.2202659999999999, 3.2540419999999997], [1.283375, 3.2938899999999998], [1.351137, 3.2972949999999996], [1.415179, 3.2640249999999997], [1.420164, 3.2595169999999998], [1.441439, 3.236067], [1.454779, 3.208166], [1.4620009999999999, 3.166641], [1.464923, 3.102316], [1.465385, 3.0311999999999997], [1.464383, 2.941858], [1.460238, 2.8822579999999998], [1.451236, 2.843089], [1.435667, 2.8150399999999998], [1.422902, 2.800144], [1.3636, 2.762575], [1.295301, 2.758057], [1.23011, 2.786753], [1.217528, 2.797406], [1.196111, 2.8210629999999997], [1.182744, 2.8492509999999998], [1.1755659999999999, 2.891245], [1.1727189999999998, 2.9563189999999997], [1.172308, 3.022986], [1.035809, 3.022986], [1.040322, 2.9057649999999997], [1.056362, 2.813577], [1.086528, 2.744269], [1.133629, 2.6902109999999997], [1.170312, 2.662505], [1.23699, 2.6325719999999997], [1.3142719999999999, 2.618678], [1.38611, 2.622397], [1.426308, 2.6374], [1.4420819999999999, 2.64167], [1.45255, 2.62575], [1.459856, 2.5830889999999997], [1.465385, 2.518106], [1.4714369999999999, 2.445732], [1.479844, 2.402187], [1.4951409999999998, 2.377287], [1.5218639999999999, 2.360845], [1.538654, 2.353564], [1.6021539999999999, 2.326963], [1.6020809999999999, 2.780289]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[2.3959289999999998, 2.636662], [2.398911, 2.688068], [2.4012469999999997, 2.7661919999999998], [2.402749, 2.8648569999999998], [2.403231, 2.968343], [2.403231, 3.318533], [2.341401, 3.380363], [2.298793, 3.418462], [2.26139, 3.4338949999999997], [2.21027, 3.432918], [2.189978, 3.430433], [2.126554, 3.4232], [2.074095, 3.4190549999999997], [2.061308, 3.418672], [2.018199, 3.421176], [1.9565439999999998, 3.427462], [1.9326379999999999, 3.430433], [1.8739219999999999, 3.435028], [1.8344639999999999, 3.425046], [1.7953379999999999, 3.394228], [1.781215, 3.380363], [1.719385, 3.318533], [1.719385, 2.663503], [1.76915, 2.640829], [1.812002, 2.624034], [1.837073, 2.618154], [1.8435009999999998, 2.636736], [1.8495089999999998, 2.688655], [1.8546969999999998, 2.768172], [1.8586639999999999, 2.8695459999999997], [1.860577, 2.955192], [1.865923, 3.2922309999999997], [1.9125599999999998, 3.298825], [1.9549759999999998, 3.2942139999999998], [1.97576, 3.279287], [1.9815699999999998, 3.2513769999999997], [1.98653, 3.191925], [1.990246, 3.108466], [1.992324, 3.0085319999999998], [1.992624, 2.9571039999999997], [1.992923, 2.661054], [2.054454, 2.639604], [2.098004, 2.6250199999999997], [2.1216939999999997, 2.618219], [2.1223769999999997, 2.618154], [2.124754, 2.6366419999999997], [2.127366, 2.687906], [2.129995, 2.765649], [2.132421, 2.863574], [2.134115, 2.955192], [2.139461, 3.2922309999999997], [2.2566919999999997, 3.2922309999999997], [2.262072, 2.984746], [2.267451, 2.6772609999999997], [2.324601, 2.647707], [2.366797, 2.6274129999999998], [2.3917699999999997, 2.618204], [2.3924909999999997, 2.618154], [2.3959289999999998, 2.636662]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[2.887333, 2.633528], [2.94359, 2.6591169999999997], [2.9877469999999997, 2.690124], [3.020101, 2.724795], [3.0424379999999998, 2.76952], [3.056546, 2.830692], [3.064211, 2.914701], [3.06722, 3.02794], [3.067538, 3.102509], [3.067538, 3.39342], [3.017773, 3.416095], [2.978576, 3.432667], [2.959157, 3.4387689999999997], [2.9554419999999997, 3.42061], [2.952495, 3.371648], [2.950691, 3.300153], [2.9503079999999997, 3.243385], [2.948661, 3.161371], [2.944222, 3.0963089999999998], [2.93774, 3.056467], [2.93259, 3.048], [2.897977, 3.0566459999999998], [2.8436399999999997, 3.078823], [2.780722, 3.108886], [2.7203679999999997, 3.1411919999999998], [2.673721, 3.170098], [2.651926, 3.189961], [2.651839, 3.190175], [2.653714, 3.2269349999999997], [2.670525, 3.2620259999999996], [2.700039, 3.2905279999999997], [2.7431159999999997, 3.300061], [2.779932, 3.29895], [2.832074, 3.298133], [2.859444, 3.310349], [2.875882, 3.342624], [2.877955, 3.3487099999999996], [2.885081, 3.394739], [2.866024, 3.422687], [2.816353, 3.436007], [2.7626969999999997, 3.4384699999999997], [2.666142, 3.42021], [2.6161589999999997, 3.394131], [2.554429, 3.332868], [2.52169, 3.25767], [2.518753, 3.1782109999999997], [2.546424, 3.104167], [2.588047, 3.057769], [2.629604, 3.031793], [2.694922, 2.998907], [2.771038, 2.965557], [2.7837259999999997, 2.960461], [2.867333, 2.923565], [2.91553, 2.891046], [2.93103, 2.858718], [2.91655, 2.822394], [2.891692, 2.794], [2.8329389999999997, 2.759039], [2.768293, 2.756417], [2.709008, 2.7833579999999998], [2.666339, 2.837088], [2.660739, 2.8509499999999997], [2.628133, 2.901936], [2.58053, 2.939787], [2.520461, 2.97085], [2.520461, 2.882768], [2.523997, 2.828951], [2.5391559999999997, 2.786534], [2.572768, 2.741279], [2.605035, 2.70642], [2.6552089999999997, 2.657062], [2.694193, 2.630547], [2.736064, 2.619911], [2.78346, 2.618154], [2.887333, 2.633528]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[3.570807, 2.6367819999999997], [3.5941609999999997, 2.646988], [3.649902, 2.691134], [3.6975689999999997, 2.7549669999999997], [3.727048, 2.8230869999999997], [3.731846, 2.85667], [3.71576, 2.903556], [3.680475, 2.928365], [3.6426439999999998, 2.943387], [3.625321, 2.946155], [3.616886, 2.926066], [3.60023, 2.882351], [3.592923, 2.8625979999999998], [3.551948, 2.7942709999999997], [3.492622, 2.760191], [3.416552, 2.7612389999999998], [3.4109179999999997, 2.762581], [3.3703049999999997, 2.7818359999999998], [3.340448, 2.819375], [3.320055, 2.879809], [3.307836, 2.967751], [3.3024999999999998, 3.0878129999999997], [3.302, 3.1516979999999997], [3.301752, 3.2524029999999997], [3.3001259999999997, 3.3210539999999997], [3.295801, 3.364673], [3.287454, 3.390282], [3.273765, 3.404903], [3.253411, 3.415558], [3.252234, 3.416095], [3.213038, 3.432667], [3.193619, 3.4387689999999997], [3.190635, 3.4203189999999997], [3.188081, 3.369323], [3.18614, 3.292308], [3.1849969999999996, 3.195805], [3.1847689999999997, 3.125184], [3.1859319999999998, 2.9885249999999997], [3.190479, 2.884851], [3.199999, 2.808108], [3.216081, 2.752246], [3.240313, 2.7112119999999997], [3.274286, 2.678954], [3.307833, 2.65644], [3.388499, 2.626476], [3.4823809999999997, 2.6197179999999998], [3.570807, 2.6367819999999997]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[4.245223999999999, 2.6478379999999997], [4.322528, 2.698361], [4.359814, 2.7435899999999998], [4.389353, 2.825663], [4.391699, 2.8906069999999997], [4.386385, 2.977445], [4.186115, 3.0651029999999997], [4.0887389999999995, 3.109887], [4.025113, 3.1459129999999997], [3.9920289999999996, 3.177117], [3.98628, 3.207436], [4.004658, 3.240805], [4.024923, 3.262923], [4.083889, 3.298393], [4.1480239999999995, 3.3008789999999997], [4.206926, 3.2732349999999997], [4.250197, 3.21832], [4.257936, 3.198928], [4.295006, 3.1383639999999997], [4.337654, 3.112552], [4.396154, 3.090471], [4.396154, 3.174184], [4.390982, 3.23115], [4.370723, 3.2791889999999997], [4.328262, 3.334346], [4.321950999999999, 3.3415139999999997], [4.274719999999999, 3.3905849999999997], [4.234121, 3.4169199999999997], [4.1833279999999995, 3.429035], [4.14122, 3.433003], [4.0659019999999995, 3.433991], [4.012286, 3.4214659999999997], [3.9788379999999997, 3.402869], [3.926268, 3.3619749999999997], [3.8898789999999996, 3.317748], [3.86685, 3.262126], [3.8543589999999996, 3.1870469999999997], [3.8495869999999996, 3.0844489999999998], [3.8492059999999997, 3.0323759999999997], [3.850501, 2.969948], [3.9684709999999996, 2.969948], [3.969839, 3.003438], [3.973249, 3.008923], [3.9957529999999997, 3.0014719999999997], [4.044182, 2.981753], [4.108908, 2.953718], [4.122443, 2.947692], [4.204244, 2.906096], [4.249312, 2.869538], [4.259217, 2.835296], [4.235526, 2.800648], [4.21596, 2.785339], [4.14536, 2.754721], [4.07928, 2.7597799999999997], [4.023959, 2.797151], [3.985636, 2.863473], [3.973349, 2.9161159999999997], [3.9684709999999996, 2.969948], [3.850501, 2.969948], [3.85173, 2.91072], [3.861032, 2.82071], [3.87946, 2.7551669999999997], [3.90936, 2.706912], [3.95308, 2.668767], [3.9721409999999997, 2.65644], [4.058726, 2.624336], [4.153522, 2.622316], [4.245223999999999, 2.6478379999999997]]]}, {"angle": [0.0], "type": "polygon", "pos": [123.19, 98.044], "polygons": [[[0.139878, -3.712224], [0.245612, -3.711645], [0.322132, -3.7100779999999998], [0.374372, -3.7070279999999998], [0.407263, -3.7020039999999996], [0.425737, -3.694511], [0.434727, -3.684056], [0.43916299999999997, -3.670147], [0.439594, -3.6683459999999997], [0.446333, -3.635855], [0.458808, -3.571748], [0.475719, -3.482849], [0.49577099999999996, -3.375981], [0.517664, -3.257967], [0.518429, -3.253822], [0.5403589999999999, -3.138169], [0.560877, -3.035986], [0.5786589999999999, -2.953402], [0.5923809999999999, -2.896544], [0.600718, -2.871542], [0.601116, -2.871099], [0.6256769999999999, -2.8588899999999997], [0.676315, -2.8385439999999997], [0.742095, -2.8144549999999997], [0.7424609999999999, -2.814326], [0.825317, -2.783182], [0.9229999999999999, -2.743509], [1.015077, -2.7036189999999998], [1.019434, -2.701647], [1.1694069999999999, -2.63358], [1.501498, -2.8603609999999997], [1.6033739999999999, -2.929496], [1.695657, -2.991303], [1.7730029999999999, -3.042267], [1.830064, -3.0788729999999997], [1.861495, -3.097606], [1.864479, -3.0989959999999996], [1.8873209999999998, -3.09281], [1.9299819999999999, -3.0629649999999997], [1.994128, -3.008053], [2.0814209999999997, -2.926666], [2.170535, -2.8400779999999997], [2.2564409999999997, -2.754753], [2.3333269999999997, -2.676892], [2.3965639999999997, -2.611303], [2.441523, -2.562795], [2.4635759999999998, -2.536175], [2.464396, -2.534805], [2.466834, -2.516537], [2.4576499999999997, -2.4867049999999997], [2.434574, -2.4412789999999998], [2.395337, -2.37623], [2.3376699999999997, -2.28753], [2.260795, -2.173343], [2.19257, -2.072838], [2.131582, -1.982697], [2.081356, -1.908151], [2.045416, -1.8544349999999998], [2.027287, -1.826782], [2.026146, -1.824905], [2.028359, -1.7984099999999998], [2.045138, -1.7469139999999999], [2.073142, -1.680149], [2.083122, -1.658828], [2.126672, -1.563841], [2.173134, -1.4560629999999999], [2.210877, -1.362808], [2.238073, -1.293594], [2.259675, -1.240994], [2.2721579999999997, -1.213503], [2.2737089999999998, -1.211384], [2.296668, -1.207876], [2.350786, -1.198262], [2.428868, -1.183911], [2.523719, -1.166193], [2.6281429999999997, -1.146475], [2.734944, -1.126126], [2.836926, -1.106514], [2.926894, -1.089009], [2.9976529999999997, -1.074978], [3.0420059999999998, -1.065791], [3.052885, -1.063193], [3.064122, -1.0567819999999999], [3.072605, -1.042303], [3.0787139999999997, -1.014867], [3.082832, -0.9695889999999999], [3.0853409999999997, -0.9015799999999999], [3.086621, -0.8059529999999999], [3.0870539999999997, -0.67782], [3.087077, -0.6252989999999999], [3.087077, -0.198155], [2.9844999999999997, -0.17790899999999998], [2.927431, -0.16693], [2.842269, -0.15090499999999998], [2.739372, -0.131767], [2.629096, -0.11144899999999999], [2.5986149999999997, -0.10586799999999999], [2.496855, -0.08608299999999999], [2.4082049999999997, -0.06662699999999999], [2.340108, -0.049303], [2.300004, -0.035912], [2.293323, -0.031921], [2.276919, -0.003658], [2.253399, 0.051108999999999995], [2.227316, 0.12158799999999999], [2.222142, 0.136769], [2.187956, 0.230896], [2.145523, 0.337101], [2.103997, 0.432473], [2.103792, 0.43291599999999997], [2.03464, 0.582525], [2.489512, 1.251617], [2.1975, 1.5441159999999998], [2.10918, 1.63117], [2.028625, 1.707909], [1.9603599999999999, 1.7702369999999998], [1.9089079999999998, 1.814056], [1.8787939999999999, 1.83527], [1.874474, 1.836616], [1.849111, 1.8260159999999999], [1.797358, 1.796547], [1.7248679999999998, 1.7517049999999998], [1.637294, 1.6949839999999998], [1.5426119999999999, 1.631462], [1.446516, 1.566668], [1.3608369999999999, 1.510287], [1.291016, 1.4657879999999999], [1.242494, 1.436639], [1.220782, 1.426308], [1.194293, 1.43505], [1.144062, 1.458087], [1.080451, 1.490631], [1.0737079999999999, 1.494249], [0.988046, 1.53721], [0.929306, 1.558279], [0.892772, 1.558503], [0.8737309999999999, 1.5389279999999999], [0.87362, 1.538654], [0.8641019999999999, 1.515472], [0.841403, 1.4604409999999999], [0.8072819999999999, 1.3778219999999999], [0.7635, 1.271872], [0.711816, 1.146852], [0.653992, 1.00702], [0.5979909999999999, 0.871637], [0.536447, 0.7222339999999999], [0.479939, 0.583832], [0.43016099999999996, 0.460673], [0.388806, 0.357002], [0.357568, 0.277059], [0.33814099999999997, 0.22508799999999998], [0.332154, 0.20569199999999999], [0.347168, 0.183443], [0.386439, 0.147982], [0.438807, 0.108887], [0.5879409999999999, -0.014754999999999999], [0.704511, -0.156478], [0.787118, -0.31329599999999996], [0.8343659999999999, -0.48222499999999996], [0.844857, -0.6602779999999999], [0.837231, -0.7424609999999999], [0.795682, -0.9129689999999999], [0.724123, -1.0635409999999998], [0.626995, -1.192691], [0.508734, -1.2989359999999999], [0.37378, -1.38079], [0.226571, -1.436768], [0.071544, -1.465385], [-0.086861, -1.465156], [-0.24420599999999998, -1.4345949999999998], [-0.39605399999999996, -1.372218], [-0.537965, -1.27654], [-0.597197, -1.2224279999999998], [-0.710797, -1.08348], [-0.789894, -0.931639], [-0.8350139999999999, -0.7713329999999999], [-0.846684, -0.606988], [-0.8254309999999999, -0.443029], [-0.7717799999999999, -0.28388199999999997], [-0.68626, -0.13397499999999998], [-0.569395, 0.002267], [-0.438807, 0.108887], [-0.384412, 0.149642], [-0.34598599999999996, 0.184718], [-0.332154, 0.205726], [-0.339397, 0.22863499999999998], [-0.359995, 0.283365], [-0.392254, 0.365672], [-0.434479, 0.471315], [-0.484977, 0.59605], [-0.542052, 0.735636], [-0.598146, 0.87167], [-0.660033, 1.021201], [-0.717356, 1.159767], [-0.7683559999999999, 1.283107], [-0.8112729999999999, 1.3869639999999999], [-0.844347, 1.46708], [-0.865819, 1.5191949999999999], [-0.873775, 1.538654], [-0.892571, 1.558423], [-0.9289259999999999, 1.558365], [-0.987521, 1.5374409999999998], [-1.073032, 1.494613], [-1.0737079999999999, 1.494249], [-1.138093, 1.461012], [-1.1901389999999998, 1.436802], [-1.219488, 1.426404], [-1.220783, 1.426308], [-1.2428759999999999, 1.436855], [-1.291652, 1.466184], [-1.361669, 1.510827], [-1.4474859999999998, 1.5673139999999999], [-1.5426119999999999, 1.631462], [-1.63946, 1.696411], [-1.726747, 1.752896], [-1.798819, 1.797421], [-1.850023, 1.82649], [-1.874474, 1.836616], [-1.89699, 1.823307], [-1.9422579999999998, 1.786112], [-2.005756, 1.729128], [-2.082961, 1.6564489999999998], [-2.169349, 1.572171], [-2.1976009999999997, 1.5440159999999998], [-2.489713, 1.2514159999999999], [-2.267369, 0.9251039999999999], [-2.199798, 0.824897], [-2.1404929999999998, 0.7349629999999999], [-2.092783, 0.6605099999999999], [-2.059993, 0.6067509999999999], [-2.045452, 0.578894], [-2.045026, 0.576912], [-2.052692, 0.550655], [-2.073311, 0.497837], [-2.103315, 0.42730999999999997], [-2.124375, 0.38009299999999996], [-2.163752, 0.289694], [-2.200835, 0.198366], [-2.2295849999999997, 0.12119999999999999], [-2.237395, 0.097692], [-2.259583, 0.034915999999999996], [-2.281273, -0.013588999999999999], [-2.293187, -0.031921], [-2.319477, -0.043141], [-2.376858, -0.059045999999999994], [-2.4578819999999997, -0.077833], [-2.5551049999999997, -0.097701], [-2.5986149999999997, -0.10586799999999999], [-2.709104, -0.126171], [-2.8150839999999997, -0.14583], [-2.906199, -0.162912], [-2.972092, -0.175482], [-2.9844999999999997, -0.17790899999999998], [-3.087077, -0.198155], [-3.087077, -0.6252989999999999], [-3.0868469999999997, -0.7657539999999999], [-3.085901, -0.8720209999999999], [-3.083859, -0.9489869999999999], [-3.080338, -1.0015399999999999], [-3.074957, -1.034567], [-3.067334, -1.0529549999999999], [-3.057088, -1.0615919999999999], [-3.052885, -1.063193], [-3.02753, -1.068873], [-2.971516, -1.0802049999999999], [-2.892036, -1.095821], [-2.7962879999999997, -1.114353], [-2.691467, -1.134431], [-2.584768, -1.154688], [-2.483387, -1.173754], [-2.3945209999999997, -1.190261], [-2.325363, -1.202841], [-2.283111, -1.210125], [-2.27371, -1.211384], [-2.265193, -1.228237], [-2.24634, -1.2731299999999999], [-2.220676, -1.33757], [-2.210877, -1.362808], [-2.1713519999999997, -1.460314], [-2.124808, -1.568041], [-2.083123, -1.658828], [-2.05245, -1.7282469999999999], [-2.032044, -1.7852899999999998], [-2.025232, -1.820223], [-2.026318, -1.824905], [-2.040715, -1.847009], [-2.073588, -1.896169], [-2.12141, -1.967152], [-2.180652, -2.054722], [-2.247785, -2.1536429999999998], [-2.261059, -2.17317], [-2.3389539999999998, -2.28886], [-2.396213, -2.376956], [-2.435119, -2.4415139999999997], [-2.457956, -2.486589], [-2.467006, -2.516237], [-2.464552, -2.534515], [-2.464489, -2.534631], [-2.445173, -2.558639], [-2.402449, -2.605053], [-2.3409489999999997, -2.669063], [-2.2653019999999997, -2.7458549999999997], [-2.180139, -2.830618], [-2.170535, -2.8400779999999997], [-2.0632099999999998, -2.9440109999999997], [-1.9803849999999998, -3.0203249999999997], [-1.9203949999999999, -3.070429], [-1.8815769999999998, -3.0957299999999996], [-1.86448, -3.0989959999999996], [-1.839527, -3.0847499999999997], [-1.787745, -3.051844], [-1.71448, -3.003792], [-1.6250799999999999, -2.94411], [-1.524889, -2.876312], [-1.501499, -2.8603609999999997], [-1.1694069999999999, -2.63358], [-1.0194349999999999, -2.701647], [-0.92823, -2.7413149999999997], [-0.8303309999999999, -2.781209], [-0.746169, -2.813017], [-0.742462, -2.814326], [-0.676631, -2.838424], [-0.625884, -2.8588], [-0.601158, -2.871064], [-0.601116, -2.871099], [-0.593271, -2.8932659999999997], [-0.579934, -2.947783], [-0.56243, -3.02852], [-0.542083, -3.12935], [-0.520218, -3.244144], [-0.518429, -3.253822], [-0.496496, -3.372096], [-0.47636, -3.4794579999999997], [-0.45932, -3.569083], [-0.44667199999999996, -3.634149], [-0.439716, -3.6678319999999998], [-0.439594, -3.6683459999999997], [-0.435361, -3.6826749999999997], [-0.427129, -3.6934929999999997], [-0.40996699999999997, -3.701294], [-0.378942, -3.706571], [-0.32912199999999997, -3.709818], [-0.25557599999999997, -3.711528], [-0.15337099999999998, -3.7121929999999996], [-0.017575, -3.712307], [0.0, -3.7123079999999997], [0.139878, -3.712224]]]}]}, "edges_bbox": {"minx": 110.149998, "miny": 80.749999, "maxx": 190.250002, "maxy": 102.85000199999999}, "metadata": {"date": "2019-01-14 15:38:20", "company": "", "revision": "", "title": "heater"}}
+///////////////////////////////////////////////
+
+///////////////////////////////////////////////
+/* Utility functions */
+
+var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
+ pcbdata.metadata.revision + '__';
+var storage;
+
+function initStorage(key) {
+ try {
+ window.localStorage.getItem("blank");
+ storage = window.localStorage;
+ } 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 storage.getItem(storagePrefix + '#' + key);
+ } else {
+ return null;
+ }
+}
+
+function writeStorage(key, value) {
+ if (storage) {
+ 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 bomtable of Object.values(pcbdata.bom)) {
+ for (var row of bomtable) {
+ 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;
+ }
+}
+
+///////////////////////////////////////////////
+
+///////////////////////////////////////////////
+/* PCB rendering code */
+
+var redrawOnDrag = true;
+var boardRotation = 0;
+
+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
+ ];
+ // Adding half a line height here is technically a bug
+ // but pcbnew currently does the same, text is slightly shifted.
+ point[0] -= (point[1] + text.height * 0.5) * tilt;
+ return point;
+}
+
+function drawtext(ctx, text, color, flip) {
+ ctx.save();
+ ctx.translate(...text.pos);
+ 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) / 2;
+ var txt = text.text.split("\n");
+ // KiCad ignores last empty line.
+ if (txt[txt.length-1] == '') txt.pop();
+ ctx.rotate(deg2rad(angle));
+ ctx.fillStyle = color;
+ ctx.strokeStyle = color;
+ ctx.lineCap = "round";
+ ctx.lineWidth = text.thickness;
+ for (var i in txt) {
+ var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
+ var lineWidth = 0;
+ for (var c of txt[i]) {
+ lineWidth += pcbdata.font_data[c].w * text.width;
+ }
+ var offsetx = 0;
+ switch (text.horiz_justify) {
+ case -1:
+ // Justify left, do nothing
+ break;
+ case 0:
+ // Justify center
+ offsetx -= lineWidth / 2;
+ break;
+ case 1:
+ // Justify right
+ offsetx -= lineWidth;
+ break;
+ }
+ for (var c of txt[i]) {
+ for (var line of pcbdata.font_data[c].l) {
+ // Drawing each segment separately instead of
+ // polyline because round line caps don't work in joints
+ for (var i = 0; i < line.length - 1; i++) {
+ ctx.beginPath();
+ ctx.moveTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
+ ctx.lineTo(...calcFontPoint(line[i + 1], text, offsetx, offsety, tilt));
+ ctx.stroke();
+ }
+ }
+ offsetx += pcbdata.font_data[c].w * text.width;
+ }
+ }
+ ctx.restore();
+}
+
+function drawedge(ctx, scalefactor, edge, color) {
+ ctx.strokeStyle = color;
+ ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
+ ctx.lineCap = "round";
+ if (edge.type == "segment") {
+ ctx.beginPath();
+ ctx.moveTo(...edge.start);
+ ctx.lineTo(...edge.end);
+ ctx.stroke();
+ }
+ if (edge.type == "arc") {
+ ctx.beginPath();
+ ctx.arc(
+ ...edge.start,
+ edge.radius,
+ deg2rad(edge.startangle),
+ deg2rad(edge.endangle));
+ ctx.stroke();
+ }
+ if (edge.type == "circle") {
+ ctx.beginPath();
+ ctx.arc(
+ ...edge.start,
+ edge.radius,
+ 0, 2 * Math.PI);
+ ctx.closePath();
+ ctx.stroke();
+ }
+}
+
+function drawRoundRect(ctx, color, size, radius, ctxmethod) {
+ ctx.beginPath();
+ ctx.strokeStyle = color;
+ var x = size[0] * -0.5;
+ var y = size[1] * -0.5;
+ var width = size[0];
+ var height = size[1];
+ ctx.moveTo(x, 0);
+ ctx.arcTo(x, y + height, x + width, y + height, radius);
+ ctx.arcTo(x + width, y + height, x + width, y, radius);
+ ctx.arcTo(x + width, y, x, y, radius);
+ ctx.arcTo(x, y, x, y + height, radius);
+ ctx.closePath();
+ ctxmethod();
+}
+
+function drawOblong(ctx, color, size, ctxmethod) {
+ drawRoundRect(ctx, color, size, Math.min(size[0], size[1]) / 2, ctxmethod);
+}
+
+function drawPolygons(ctx, color, polygons, ctxmethod) {
+ ctx.fillStyle = color;
+ for (var polygon of polygons) {
+ ctx.beginPath();
+ for (var vertex of polygon) {
+ ctx.lineTo(...vertex)
+ }
+ ctx.closePath();
+ ctxmethod();
+ }
+}
+
+function drawPolygonShape(ctx, shape, color) {
+ ctx.save();
+ ctx.translate(...shape.pos);
+ ctx.rotate(deg2rad(-shape.angle));
+ drawPolygons(ctx, color, shape.polygons, ctx.fill.bind(ctx));
+ ctx.restore();
+}
+
+function drawDrawing(ctx, layer, scalefactor, drawing, color) {
+ if (["segment", "arc", "circle"].includes(drawing.type)) {
+ drawedge(ctx, scalefactor, drawing, color);
+ } else if (drawing.type == "polygon") {
+ drawPolygonShape(ctx, drawing, color);
+ } else {
+ drawtext(ctx, drawing, color, layer == "B");
+ }
+}
+
+function drawCircle(ctx, radius, ctxmethod) {
+ ctx.beginPath();
+ ctx.arc(0, 0, radius, 0, 2 * Math.PI);
+ ctx.closePath();
+ ctxmethod();
+}
+
+function drawPad(ctx, pad, color, outline) {
+ ctx.save();
+ ctx.translate(...pad.pos);
+ ctx.rotate(deg2rad(pad.angle));
+ if (pad.offset) {
+ ctx.translate(...pad.offset);
+ }
+ ctx.fillStyle = color;
+ ctx.strokeStyle = color;
+ var ctxmethod = outline ? ctx.stroke.bind(ctx) : ctx.fill.bind(ctx);
+ if (pad.shape == "rect") {
+ var rect = [...pad.size.map(c => -c * 0.5), ...pad.size];
+ if (outline) {
+ ctx.strokeRect(...rect);
+ } else {
+ ctx.fillRect(...rect);
+ }
+ } else if (pad.shape == "oval") {
+ drawOblong(ctx, color, pad.size, ctxmethod);
+ } else if (pad.shape == "circle") {
+ drawCircle(ctx, pad.size[0] / 2, ctxmethod);
+ } else if (pad.shape == "roundrect") {
+ drawRoundRect(ctx, color, pad.size, pad.radius, ctxmethod);
+ } else if (pad.shape == "custom") {
+ drawPolygons(ctx, color, pad.polygons, ctxmethod);
+ }
+ if (pad.type == "th" && !outline) {
+ ctx.fillStyle = "#CCCCCC";
+ if (pad.drillshape == "oblong") {
+ drawOblong(ctx, "#CCCCCC", pad.drillsize, ctxmethod);
+ } else {
+ drawCircle(ctx, pad.drillsize[0] / 2, ctxmethod);
+ }
+ }
+ ctx.restore();
+}
+
+function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight) {
+ if (highlight) {
+ // draw bounding box
+ if (module.layer == layer) {
+ ctx.save();
+ ctx.globalAlpha = 0.2;
+ ctx.translate(...module.bbox.pos);
+ ctx.fillStyle = padcolor;
+ ctx.fillRect(
+ 0, 0,
+ ...module.bbox.size);
+ ctx.globalAlpha = 1;
+ ctx.strokeStyle = padcolor;
+ ctx.strokeRect(
+ 0, 0,
+ ...module.bbox.size);
+ ctx.restore();
+ }
+ }
+ // draw drawings
+ for (var drawing of module.drawings) {
+ if (drawing.layer == layer) {
+ drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
+ }
+ }
+ // draw pads
+ for (var pad of module.pads) {
+ if (pad.layers.includes(layer)) {
+ drawPad(ctx, pad, padcolor, false);
+ if (pad.pin1 && highlightpin1) {
+ drawPad(ctx, pad, outlinecolor, true);
+ }
+ }
+ }
+}
+
+function drawEdges(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 drawModules(canvas, layer, scalefactor, highlight) {
+ var ctx = canvas.getContext("2d");
+ ctx.lineWidth = 3 / scalefactor;
+ var style = getComputedStyle(topmostdiv);
+ var padcolor = style.getPropertyValue('--pad-color');
+ var outlinecolor = style.getPropertyValue('--pin1-outline-color');
+ if (highlight > 0) {
+ padcolor = style.getPropertyValue('--pad-color-highlight');
+ outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
+ }
+ for (var i = 0; i < pcbdata.modules.length; i++) {
+ var mod = pcbdata.modules[i];
+ if (!highlight || highlightedModules.includes(i)) {
+ drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight);
+ }
+ }
+}
+
+function drawSilkscreen(canvas, layer, scalefactor) {
+ var ctx = canvas.getContext("2d");
+ for (var d of pcbdata.silkscreen[layer]) {
+ if (["segment", "arc", "circle"].includes(d.type)) {
+ drawedge(ctx, scalefactor, d, "#aa4");
+ } else if (d.type == "polygon") {
+ drawPolygonShape(ctx, d, "#4aa");
+ } else {
+ drawtext(ctx, d, "#4aa", layer == "B");
+ }
+ }
+}
+
+function clearCanvas(canvas) {
+ var ctx = canvas.getContext("2d");
+ ctx.save();
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.restore();
+}
+
+function drawHighlightsOnLayer(canvasdict) {
+ clearCanvas(canvasdict.highlight);
+ drawModules(canvasdict.highlight, canvasdict.layer,
+ canvasdict.transform.s * canvasdict.transform.zoom, true);
+}
+
+function drawHighlights() {
+ drawHighlightsOnLayer(allcanvas.front);
+ drawHighlightsOnLayer(allcanvas.back);
+}
+
+function drawBackground(canvasdict) {
+ clearCanvas(canvasdict.bg);
+ clearCanvas(canvasdict.silk);
+ drawEdges(canvasdict.bg, canvasdict.transform.s);
+ drawModules(canvasdict.bg, canvasdict.layer,
+ canvasdict.transform.s * canvasdict.transform.zoom, false);
+ drawSilkscreen(canvasdict.silk, canvasdict.layer, canvasdict.transform.s);
+}
+
+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(boardRotation));
+ ctx.scale(transform.s, transform.s);
+}
+
+function prepareLayer(canvasdict) {
+ var flip = (canvasdict.layer == "B");
+ for (var c of ["bg", "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, 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(canvasdict) {
+ var canvasdivid = {
+ "F": "frontcanvas",
+ "B": "backcanvas"
+ } [canvasdict.layer];
+ var width = document.getElementById(canvasdivid).clientWidth * 2;
+ var height = document.getElementById(canvasdivid).clientHeight * 2;
+ 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;
+ }
+ canvasdict.transform.s = scalefactor;
+ var flip = (canvasdict.layer == "B");
+ if (flip) {
+ canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
+ } else {
+ canvasdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
+ }
+ canvasdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
+ for (var c of ["bg", "silk", "highlight"]) {
+ canvas = canvasdict[c];
+ canvas.width = width;
+ canvas.height = height;
+ canvas.style.width = (width / 2) + "px";
+ canvas.style.height = (height / 2) + "px";
+ }
+}
+
+function redrawCanvas(layerdict) {
+ prepareLayer(layerdict);
+ drawBackground(layerdict);
+ drawHighlightsOnLayer(layerdict);
+}
+
+function resizeCanvas(layerdict) {
+ recalcLayerScale(layerdict);
+ redrawCanvas(layerdict);
+}
+
+function resizeAll() {
+ resizeCanvas(allcanvas.front);
+ resizeCanvas(allcanvas.back);
+}
+
+function bboxScan(layer, x, y) {
+ var result = [];
+ for (var i = 0; i < pcbdata.modules.length; i++) {
+ var module = pcbdata.modules[i];
+ if (module.layer == layer) {
+ var b = module.bbox;
+ if (b.pos[0] <= x && b.pos[0] + b.size[0] >= x &&
+ b.pos[1] <= y && b.pos[1] + b.size[1] >= y) {
+ result.push(i);
+ }
+ }
+ }
+ return result;
+}
+
+function handleMouseDown(e, layerdict) {
+ if (e.which != 1) {
+ return;
+ }
+ e.preventDefault();
+ e.stopPropagation();
+ layerdict.transform.mousestartx = e.offsetX;
+ layerdict.transform.mousestarty = e.offsetY;
+ layerdict.transform.mousedownx = e.offsetX;
+ layerdict.transform.mousedowny = e.offsetY;
+ layerdict.transform.mousedown = true;
+}
+
+function handleMouseClick(e, layerdict) {
+ var x = e.offsetX;
+ var y = e.offsetY;
+ var t = layerdict.transform;
+ if (layerdict.layer == "B") {
+ x = (2 * x / t.zoom - t.panx + t.x) / -t.s;
+ } else {
+ x = (2 * x / t.zoom - t.panx - t.x) / t.s;
+ }
+ y = (2 * y / t.zoom - t.y - t.pany) / t.s;
+ var v = rotateVector([x, y], -boardRotation);
+ var modules = bboxScan(layerdict.layer, v[0], v[1]);
+ if (modules.length > 0) {
+ modulesClicked(modules);
+ }
+}
+
+function handleMouseUp(e, layerdict) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (e.which == 1 &&
+ layerdict.transform.mousedown &&
+ layerdict.transform.mousedownx == e.offsetX &&
+ layerdict.transform.mousedowny == e.offsetY) {
+ // This is just a click
+ handleMouseClick(e, layerdict);
+ layerdict.transform.mousedown = false;
+ return;
+ }
+ if (e.which == 3) {
+ // Reset pan and zoom on right click.
+ layerdict.transform.panx = 0;
+ layerdict.transform.pany = 0;
+ layerdict.transform.zoom = 1;
+ redrawCanvas(layerdict);
+ } else if (!redrawOnDrag) {
+ redrawCanvas(layerdict);
+ }
+ layerdict.transform.mousedown = false;
+}
+
+function handleMouseMove(e, layerdict) {
+ if (!layerdict.transform.mousedown) {
+ return;
+ }
+ e.preventDefault();
+ e.stopPropagation();
+ var dx = e.offsetX - layerdict.transform.mousestartx;
+ var dy = e.offsetY - layerdict.transform.mousestarty;
+ layerdict.transform.panx += 2 * dx / layerdict.transform.zoom;
+ layerdict.transform.pany += 2 * dy / layerdict.transform.zoom;
+ layerdict.transform.mousestartx = e.offsetX;
+ layerdict.transform.mousestarty = e.offsetY;
+ if (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 += 2 * e.offsetX * zoomd;
+ t.pany += 2 * e.offsetY * zoomd;
+ redrawCanvas(layerdict);
+}
+
+function addMouseHandlers(div, layerdict) {
+ div.onmousedown = function(e) {
+ handleMouseDown(e, layerdict);
+ };
+ div.onmousemove = function(e) {
+ handleMouseMove(e, layerdict);
+ };
+ div.onmouseup = function(e) {
+ handleMouseUp(e, layerdict);
+ };
+ div.onmouseout = function(e) {
+ handleMouseUp(e, layerdict);
+ }
+ div.onwheel = function(e) {
+ handleMouseWheel(e, layerdict);
+ }
+ for (var element of [div, layerdict.bg, layerdict.silk, layerdict.highlight]) {
+ element.addEventListener("contextmenu", function(e) {
+ e.preventDefault();
+ }, false);
+ }
+}
+
+function setRedrawOnDrag(value) {
+ redrawOnDrag = value;
+ writeStorage("redrawOnDrag", value);
+}
+
+function setBoardRotation(value) {
+ boardRotation = value * 5;
+ writeStorage("boardRotation", boardRotation);
+ document.getElementById("rotationDegree").textContent = boardRotation;
+ resizeAll();
+}
+
+function initRender() {
+ allcanvas = {
+ front: {
+ transform: {
+ x: 0,
+ y: 0,
+ s: 1,
+ panx: 0,
+ pany: 0,
+ zoom: 1,
+ mousestartx: 0,
+ mousestarty: 0,
+ mousedown: false,
+ },
+ bg: document.getElementById("F_bg"),
+ 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,
+ mousestartx: 0,
+ mousestarty: 0,
+ mousedown: false,
+ },
+ bg: document.getElementById("B_bg"),
+ 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 canvaslayout = "default";
+var bomlayout = "default";
+var initDone = false;
+var bomSortFunction = null;
+var currentSortColumn = null;
+var currentSortOrder = null;
+var currentHighlightedRowId;
+var highlightHandlers = [];
+var highlightedModules = [];
+var checkboxes = [];
+var bomCheckboxes = "";
+var highlightpin1 = false;
+var lastClicked;
+
+function dbg(html) {
+ dbgdiv.innerHTML = html;
+}
+
+function setDarkMode(value) {
+ if (value) {
+ topmostdiv.classList.add("dark");
+ } else {
+ topmostdiv.classList.remove("dark");
+ }
+ writeStorage("darkmode", value);
+ if (initDone) {
+ redrawCanvas(allcanvas.front);
+ redrawCanvas(allcanvas.back);
+ }
+}
+
+function setHighlightPin1(value) {
+ writeStorage("highlightpin1", value);
+ highlightpin1 = value;
+ if (initDone) {
+ redrawCanvas(allcanvas.front);
+ redrawCanvas(allcanvas.back);
+ }
+}
+
+function getStoredCheckboxRefs(checkbox) {
+ function convert(ref) {
+ var intref = parseInt(ref);
+ if (isNaN(intref)) {
+ for (var i = 0; i < pcbdata.modules.length; i++) {
+ if (pcbdata.modules[i].ref == ref) {
+ return i;
+ }
+ }
+ return -1;
+ } else {
+ return intref;
+ }
+ }
+ var existingRefs = readStorage("checkbox_" + checkbox);
+ if (!existingRefs) {
+ return new Set();
+ } else {
+ return new Set(existingRefs.split(",").map(r => convert(r)));
+ }
+}
+
+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) {
+ return function() {
+ refsSet = getStoredCheckboxRefs(checkbox);
+ if (this.checked) {
+ // checkbox ticked
+ for (var ref of references) {
+ refsSet.add(ref[1]);
+ }
+ } else {
+ // checkbox unticked
+ for (var ref of references) {
+ refsSet.delete(ref[1]);
+ }
+ }
+ writeStorage("checkbox_" + checkbox, [...refsSet].join(","));
+ }
+}
+
+function createRowHighlightHandler(rowid, refs) {
+ return function() {
+ if (currentHighlightedRowId) {
+ if (currentHighlightedRowId == rowid) {
+ return;
+ }
+ document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
+ }
+ document.getElementById(rowid).classList.add("highlighted");
+ currentHighlightedRowId = rowid;
+ highlightedModules = refs.map(r => r[1]);
+ drawHighlights();
+ }
+}
+
+function entryMatches(entry) {
+ // check refs
+ for (var ref of entry[3]) {
+ if (ref[0].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 < checkboxes.length &&
+ checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
+ checkboxnum++;
+ }
+ if (checkboxnum >= 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);
+ checkboxes = bomCheckboxes.split(",").filter((e) => e);
+ 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;
+ }
+ }
+ for (var checkbox of 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;
+ }));
+ 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 = [];
+ currentHighlightedRowId = null;
+ var first = true;
+ switch (canvaslayout) {
+ case 'F':
+ bomtable = pcbdata.bom.F;
+ break;
+ case 'FB':
+ bomtable = pcbdata.bom.both;
+ break;
+ case 'B':
+ bomtable = pcbdata.bom.B;
+ break;
+ }
+ if (bomSortFunction) {
+ bomtable = bomtable.slice().sort(bomSortFunction);
+ }
+ for (var i in bomtable) {
+ var bomentry = bomtable[i];
+ if (filter && !entryMatches(bomentry)) {
+ continue;
+ }
+ var references = bomentry[3];
+ if (reflookup) {
+ references = findRefInEntry(bomentry);
+ if (references.length == 0) {
+ continue;
+ }
+ }
+ var tr = document.createElement("TR");
+ var td = document.createElement("TD");
+ var rownum = +i + 1;
+ tr.id = "bomrow" + rownum;
+ td.textContent = rownum;
+ tr.appendChild(td);
+ // Checkboxes
+ for (var checkbox of checkboxes) {
+ if (checkbox) {
+ td = document.createElement("TD");
+ var input = document.createElement("input");
+ input.type = "checkbox";
+ input.onchange = createCheckboxChangeHandler(checkbox, references);
+ setBomCheckboxState(checkbox, input, references);
+ 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);
+ // Quantity
+ td = document.createElement("TD");
+ td.textContent = bomentry[3].length;
+ tr.appendChild(td);
+ bom.appendChild(tr);
+ var handler = createRowHighlightHandler(tr.id, references);
+ tr.onmousemove = handler;
+ highlightHandlers.push({
+ id: tr.id,
+ handler: handler,
+ refs: references
+ });
+ if ((filter || reflookup) && first) {
+ handler();
+ first = false;
+ }
+ }
+}
+
+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 modulesClicked(moduleIndexes) {
+ var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
+ var index = moduleIndexes[(lastClickedIndex + 1) % moduleIndexes.length];
+ for (var handler of highlightHandlers) {
+ if (handler.refs.map(r => r[1]).indexOf(index) >= 0) {
+ lastClicked = index;
+ handler.handler();
+ smoothScrollToRow(currentHighlightedRowId);
+ break;
+ }
+ }
+}
+
+function updateFilter(input) {
+ filter = input.toLowerCase();
+ populateBomTable();
+}
+
+function updateRefLookup(input) {
+ reflookup = input.toLowerCase();
+ populateBomTable();
+}
+
+function silkscreenVisible(visible) {
+ if (visible) {
+ allcanvas.front.silk.style.display = "";
+ allcanvas.back.silk.style.display = "";
+ writeStorage("silkscreenVisible", true);
+ } else {
+ allcanvas.front.silk.style.display = "none";
+ allcanvas.back.silk.style.display = "none";
+ writeStorage("silkscreenVisible", false);
+ }
+}
+
+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 (bomlayout != "bom-only") {
+ canvassplit.collapse(1);
+ }
+ break;
+ case 'B':
+ document.getElementById("bl-btn").classList.add("depressed");
+ if (bomlayout != "bom-only") {
+ canvassplit.collapse(0);
+ }
+ break;
+ default:
+ document.getElementById("fb-btn").classList.add("depressed");
+ if (bomlayout != "bom-only") {
+ canvassplit.setSizes([50, 50]);
+ }
+ }
+ canvaslayout = layout;
+ writeStorage("canvaslayout", layout);
+ resizeAll();
+ populateBomTable();
+}
+
+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";
+ }
+}
+
+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
+ });
+ }
+ bomlayout = layout;
+ writeStorage("bomlayout", layout);
+ changeCanvasLayout(canvaslayout);
+}
+
+function focusFilterField() {
+ focusInputField(document.getElementById("filter"));
+}
+
+function focusRefLookupField() {
+ focusInputField(document.getElementById("reflookup"));
+}
+
+function toggleBomCheckbox(bomrowid, checkboxnum) {
+ if (!bomrowid || checkboxnum > 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 < checkboxes.length &&
+ checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
+ checkboxnum++;
+ }
+ if (!bomrowid || checkboxnum >= 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) {
+ bomCheckboxes = value;
+ writeStorage("bomCheckboxes", value);
+ populateBomTable();
+}
+
+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 initDefaults() {
+ bomlayout = readStorage("bomlayout");
+ if (bomlayout === null) {
+ bomlayout = config.bom_view;
+ }
+ if (!['bom-only', 'left-right', 'top-bottom'].includes(bomlayout)) {
+ bomlayout = config.bom_view;
+ }
+ canvaslayout = readStorage("canvaslayout");
+ if (canvaslayout === null) {
+ canvaslayout = config.layer_view;
+ }
+ bomCheckboxes = readStorage("bomCheckboxes");
+ if (bomCheckboxes === null) {
+ bomCheckboxes = config.checkboxes;
+ }
+ document.getElementById("bomCheckboxes").value = bomCheckboxes;
+
+ var b = readStorage("silkscreenVisible");
+ if (b === null) {
+ b = config.show_silkscreen;
+ }
+ document.getElementById("silkscreenCheckbox").checked = b;
+ silkscreenVisible(b);
+
+ b = readStorage("redrawOnDrag");
+ if (b === null) {
+ b = config.redraw_on_drag;
+ }
+ document.getElementById("dragCheckbox").checked = b;
+ setRedrawOnDrag(b);
+
+ b = readStorage("darkmode");
+ if (b === null) {
+ b = config.dark_mode;
+ }
+ document.getElementById("darkmodeCheckbox").checked = b;
+ setDarkMode(b);
+
+ b = readStorage("highlightpin1");
+ if (b === null) {
+ b = config.highlight_pin1;
+ }
+ document.getElementById("highlightpin1Checkbox").checked = b;
+ setHighlightPin1(b);
+
+ boardRotation = readStorage("boardRotation");
+ if (boardRotation === null) {
+ boardRotation = config.board_rotation * 5;
+ } else {
+ boardRotation = parseInt(boardRotation);
+ }
+ document.getElementById("boardRotation").value = boardRotation / 5;
+ document.getElementById("rotationDegree").textContent = boardRotation;
+}
+
+window.onload = function(e) {
+ initUtils();
+ initRender();
+ initStorage();
+ initDefaults();
+ cleanGutters();
+ populateMetadata();
+ dbgdiv = document.getElementById("dbg");
+ bom = document.getElementById("bombody");
+ bomhead = document.getElementById("bomhead");
+ filter = "";
+ reflookup = "";
+ initDone = true;
+ // Triggers render
+ changeBomLayout(bomlayout);
+}
+
+window.onresize = resizeAll;
+window.matchMedia("print").addListener(resizeAll);
+
+///////////////////////////////////////////////
+
+ </script>
+</head>
+
+<body>
+<div id="topmostdiv" style="width: 100%; height: 100%">
+ <div id="top">
+ <div style="float: right;">
+ <div class="hideonprint menu" style="float: right; margin: 10px; top: 8px;">
+ <button class="menubtn"></button>
+ <div class="menu-content">
+ <label class="menu-label menu-label-top">
+ <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
+ Dark mode
+ </label>
+ <label class="menu-label">
+ <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
+ Show silkscreen
+ </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">
+ <span>Board rotation</span>
+ <span style="float: right"><span id="rotationDegree">0</span>&#176;</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">
+ <span class="shameless-plug">
+ <span>Created using</span>
+ <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
+ </span>
+ </label>
+ </div>
+ </div>
+ <div class="button-container hideonprint"
+ style="float: right; margin: 10px; 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; margin: 10px; 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>
+ <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">
+ Kicad version
+ </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="searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
+ oninput="updateRefLookup(this.value)">
+ <input id="filter" class="searchbox filter hideonprint" type="text" placeholder="Filter"
+ oninput="updateFilter(this.value)">
+ <div class="button-container hideonprint" style="float: left">
+ <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" 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_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
+ <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
+ </div>
+ </div>
+ <div id="backcanvas" class="split" 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_slk" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
+ <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</body>
+
+</html>