rusefi_documentation/ibom-backup/hw48na_V0.1.html

3582 lines
238 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-color-highlight: #D04040;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #b4ff03;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html, body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 5px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
}
.bom th, .bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th, .dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #aaa;
}
.dark .bom tr.checked {
color: #666;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 25px;
}
.bom .Description {
width: 10%;
}
.bom .Part {
width: 10%;
}
.bom .Value {
width: 15%;
}
.bom .Quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal, .gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.menu-content {
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid, .dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
height: 78px;
border-bottom: 2px solid black;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas, #backcanvas {
touch-action: none;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0.0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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wAj2YuR3s1ujIGNHEs2Q24vsh9lcAZ9C/LXdl8zEmA/sg0njyH9k7smcB7skmlfs4DmAckDnKw1OmXstQ614M9lsMdDDGgQlAXsuCDwcuDkR2EAAyiI9kMrU9mwclDnociykKEm9mvs+9k3s6ImKQZ9mkct9lkc/9DTATdmeofDmMc7mwgAEdbNs49lzoX5aocvDloc/oCWU9DkwcgPjs4feL8crjmCclGngc79nfs2jl6AWsyQcoDm/swYDtMUgBscnDmzVbjnqcn8TyU4jkPskjnrYHhy6cgzlC00TnGcuDlrUnjnmc+HZC0uTnWcvmZXUvsA2c79lGckTnOciAhg02uYCc0Tlx0wxzUcnznSRXDkec/jlec+TnBckDnw4OjmVABzkSc5gDtMJDDYcu8i/LCDmJc3RJWcpLlRcuzlRc39mOchQkhc1LkNUX5aRczLmcU7vipcwrl2cgrlAcwkk5c79lb4jTnGch5j60qrngctalUclrl4U6Dkmc/DkH4jLk5ciSklc+TnSc7ICVADrnmc9pivYOLkns6NStc3TmFoSQnlcuyluclznmcwQneGPrnzc2GmScjLkSky2FfsqMa7cvblRjXymLc7jkH4gzk6ckezMM29nac7TkncjbmFclil1IfbmPcjXFlRbrmQciSlXc3zmt0QFhncj7kSUpjkachHF4yJ7n7c1Skfc1rlm017l/spzn/cy9kH4o7mXss0mNc0rkH4sHmXclmwzc4rm3cirk5E9+C48vHn48+rnCcmHmoc5rlo8qbmg8z7m6cszm1cwLl/cizkCcwHmQ8rLmUcsnms8vTn2c1blmk4HmPc6nkBci9lecqblnc0nmnc4jmHc4nmmctzkE8qXm48uUko8ynnvsuUlzc1QiIc+jluk+Hmoc9phXocbkcc60ny8m9mK8znn80rHlvckYlK8tFao86bkSU7nn7cuHki86jlW863m7cs2mO8g7kKE43l/sk7k/cnzkq0u3mkcm7lM8gUBo4znn1If3l3c+Tl08mnn88z3kW887kKEr3ng8tzku813kkU4bnHchbm+8y7kpc93kh8tzl68l9lZ8gPnpcsPk2c6Hn08knluc+Pms8inmC8m9kDcpDmQgVPmXs9piUYbXlzoQZBI855li8svkS82Gni8/nmy8yXnS8qXkG893k60jPmG3EfmQ8tFZJ8wWkjE6Pl58rvmR8zQgvc4vk/si7nj8oTlKpAPn3crfmr83RLz8mvmUUp8R78ygCb8yvm6cgvkn8uznB8wPmY8wvl181XmqkvvksAdphvoVvkJc8/mx82bmG83nmN87Ekd8tbm/Lbfmd8hQms8kXm/8+Hlec7Pmn8nHlD8/HkO8pPm28z/kRUmfl2c1AVW87fmb8jfl0Ug8TYC0PlI897k386/nQCnfnP8lnFuc7AVH85AWWQxPkz80vlL8pAUx8iKkAC2zmwCuAUy87LlK8nPm987vn987LmN88vmw04AUsoLTl584pwq8obnq8uDntMB9Dv8h7lJ83rnUC53kKCzgVEC5zD5csQWOXIulSCs/kn839kSU3gXwc5fkBAPnlocgwVL8tQ4UEcLkN8qQX9AdpimYOQXecw/nWOb/mj8g/EWCgPiT81fk1c0wWWCy/mNcsLkycmwXP89pjfoRwXoC03k/8tzlcCzikrctwWS8jwWakAfmw09gXwChQkCCnvn+cv/nMM3wUB8Lrl6CkAW6EzAX5ClgUR83IWA8sgWac3XnOC9nmaCxHkZC1zkpCxIWE8gDnQCuzlgCn7n+CyLloCugX8C2wXGCygXV8joW18igUkCsoV/8/AUFcwgVtCg/nDCo/lzCv3m0ClQVFCvQWb8hYWZ8t3kz8nInNChAUu84Xnn8jAWrCiAUw8rznrCw24lCpXnTC+/kSC4IWGC9phSYRwV1CroW5clHlEC54Ubc9oXYC+gWmCiHmrCoYUZ82YV28v7k1Cnqm78ggVEctQWjC7fnr8z/mAir3mL8n4VLCl3nJC9WlfCyIXxCpoW5CpIXoiqfn7Ci3koitTnlChEXDci4Wc8mEUx80kXu8w4VI8zfmVC04XP80EVPCiEUzChIVYiloVMC9HmMCvXnvczQXs8iIVB8lkWw0wYWgChkWTCkrnUigrnokawVq8kIU8ASzCOCwwV+Ct3nFC3Pkgi3YWO844X08rzmUCykWQ8nIUZC3UWr88kXy8zUUA84kWLcvEWU8gkWnWNkVeCnLlj85AV2imznT83oWSEuEW/c9IX9CsUW3c40WC870UZc/UVSC90Xe8hQk6ipEWO89UXW8rkU18iUUlczfmKizsmxi27m0itUWgCvAW58hMX0iwwWgi4QVmkjkXFwQ0U9c/imZi00UM8/4WV8y0Xk8voXP87YW2i1QWCi1EWOi+sX388MXW874UkiigXUC8sWo8/0V3c8YWQC3sXh8ojm8i4MVUclWmii1sXc8n3nIC6MXDCpMWbch/mSC2UXZsFTnxc9vmXChQmpCvHnKC5EWbircVuMXjBE8wwXvCtLly8moUzcuIW4iqEV6Ck8XI8m4VNgEEV72C9CriibkmCjIXdiz7mDik3kp8r0WJ8zAW3i7HkLchkUAS0Lm1igQUtCrEWZC/TkHCuPkFC1og8CjwVecuoWFikvnMilsVCCuCVc8lUUISokUKExIW1C1MUNcpXlgS9Xn1crfhw84CU4i7wW/CmkVOixLlG86EVz8tzn4S80VMcxcUzmRPAvinXkBDJsWYk9MVCirsUii7MVfitfloSq/nuCrEURUhMVyMZiWSS/sUnCkSXJcuPn5i9nnCin8U1iv8U3i5sXiSjMUeCiCUxCuzmVCsiWtCq8Ww0s4WEc1wWmSnbku8i8Xbc77kci1iXmcxSW38wWAb85yU78m/kzE9lQOSzYWICycVPcjHnH8mkWzikXnTipgWli0TktC8yVirIIX/2dpjAkR4WZisKV68kKWdCtMUziz9n2ShfnaSgIURS2nk5S7oV5SvgWWS6iWdinyUlS+0XsSt0ksC9pgY4RKV6SkCWsC3SW5C4yUsC83k38uiXVcmiVTCpiUCS8qVuAFgXuSwMXi8iSUCClAXYS35aJC69mQioUVjC/ikgi0cVo81SmYS7qXii6sWGC14XQCxqXcCrIXw8/SVqC+8XEGEABD4RwWeS60X8iy8WlSsyWUSiqXOikiXE81qWVisAW+UwaXNS7IV4SyCUoSxLnziu7m6C0oViS3KVvSyAXAis4VPSwzmwS16WYi8CXtii0VAS7MXbS0DkdIP4UFSl4XXi8EXqSjaWyS98XKSzQWjSqQVXCnSXrc/8UAywqWHSoozO6LiVt8niVMC5KU18oqVns04V4CzKXuc96UkUgyX0yyzlUSyqVlS7KW3S+iVVS/MDmS9piYmeqW4StmUzS3aUnCzqXgcmKWDcyEAGS9piWiUWWN8/aUNiwkUqy6WUKc9QXqyvaW0y4YV4y4nkRU6KXayt8Xq85gXsyrGVmyzWXPM2WX18/+xm89phMYZWW6ylGUfCjmVboa2V2U5mVTShGV2c6SU/S+Tk6MSaVySrmV3SoGUw89kUHS6UVHSqEyOC/oXLckyVXS9Wk3SkCz7i4wUGS5aWQy35bSSiCUNC4wV0i32VdclSWFy+8Ur8pHntMDYzOyqWWuy08XhyrUWeyh2m4C3iWpy/cXn4/6V8yrqVuczCUly6OVOChYXtMfMSnSwSXiytWUsy4GU1y5Hl1ys0Why/mWly02Xi89pht4RwXFymeWdyomVaSjuUyyxaWvs60U+y9IVZywWXj8xQUci9wVnC8wVsig2Vl8iKm5i7eVf8o8UMCzSXoyu/mEyjQU1CwuWD8rcXDfDGUPynCUayiGXESivlwS8+XgSr6W7s4+V5892UtClaUfy1IVfy8iXRCzQUNy22Wq8y6X2i9phTGKuX081WXoSyWVYKpBWXy2rnmyiWVD4saX4KsmVtS9pgZGRwXdyjWAWy62khyy4kf8/qWaJX8VmStEVMrEsXRCjqXzS0GWsigQUgy8fkmyleUjynBUty2BWbEyCWNC3BUacloU3ywBUAC4BWkS0BXAc8BWH8yBUvSgBUpC/cVwKuyUCBN+WryreWPynqWbyrWU8yw/m7ykOVESznmnyo+WhipQXMSs+Wbi5oUEKjznXy6BV9S3mX3yxEXryp+WJywGWw04RXPy3KXkKh2VM0SmXSKgTnYKl+U6yiOX4KoxVrSkxU2y2+V0U+BWzSxiX601hXBy0hV4S8yUuK4zkRUsMVpKjeVIy4KVmKuYV6y8AXxKn0VCSpfmMihMVRS0UXkK9phEsRwW5imGVsSmBWpC9+VsK5uV+KwqX+Sp7ntKpyVlKoEU4ymoVDS4sWISiZWsU1uUjK+EXDi88U7iiMUky1GU9KmmU1K0wWginOUVKn7lgynTkByyDm0ipKW+SvYXyKjcXu4kgXKK/QU5KtyVTyssWeijSW98wiWpK7OU7CgxWmKnxWSiuJVFK9GXkSueV5y9phj6RwV7ykRXRK9QpbSjZXDc6mhkYGJV4KieWAS3+UuyxJWACkpXGK1BVhyjxXmK3qUJcuaUZKx5VZKq2U3K2EWWyw2WqKuYXTK1FVxi5JXzC/iVgc4pWIg4SV3KyKXji4SVNKngDyGTBUyK75URK5lWTK8oV7Km9np8MZXrCtgXsCr+VeKjsUBKxBXwq0CVVKgMUyqpqWYq8pXrSn+U4q9JXVCkVUkqq+XySrUV5KkTl20s3lVS9FX0S9pjGGRwWSK1qWGqgZWPcshWHim0XQyhVU7S5z51i5FXK86UVlygrntMagytK4RXGqteWvKl1VBK/pVrK7kWhiy5Voy4xVBq1ZWO0shW9y6gUHIEACu8c1V5y7lWTc9YWBSlgVOqsEVoqvpWzy91WuSz/ntMZxTLy3kUsq2pVni9NUlyu1UWq1NV6KytWQqxbmgis6XvKpJVzyx8XtMTAw+q6VWuqtFYsSx1We472WQS2tXxqjNXsy/5X9C9pgP6LtX6KntV6q/DnDqwJW5qt2Vaqmnk9y2KVP8u4U8AOtDhK0KBRq5dU/KnqV7q08VzyzyXtMLAA7qoHm7i0FX+K6yVXqpuXhSuVW/SyMXc8iiXwyuxUnyzpXsCslV2892VQCrYXMy/kUSq2GUhqmMX9qv2Vpy7pU8q/KXfy7xVACmhV00g+Uc8qkU8KwRVMq6DXOqkBWfquAU8ixZXp83pUqSvkWui/4RRy9dUagJXntMU4DhCojUsK/FX3q0NXXq4NUBqh1UMa6NXQS/EUqq2DWwq6eWiC8ZVnKskV8qiYV8a5DWYkicWIq6uUrC0pVPKxxW6ErYV8K0iXfqr3mpSq7kKaj7lLKtsUnKjUVtqoWXjoC9UFysDW/q21UwqseXia+QWnKrRX7ilTU+c19W1KyzVUc1aXJi59XA8tTVTi5UVHCuZUeikTWMqpVWjKjhVTK61Ug84VUAix9WByoZVp866VvqljX7q7OUQa/TVoa4qVAatiX/KmqU1AC9UkC/9kWq6zWbKyDViKrpWxasTX1yjjWSquDXty9cXWKoTV6i9KUPq/LXca0zUairDVD82zVo8zLVQqxrWvs+zWbcxzVPc5zXA8nZVXc7rWDKlZVRa0rXCajDVKKrTUb89pgzQUADscqmWAapdW1y9bmuiv1VbygDXUajLV4a9ZWRahbVMa+TV5axamEShLXDK6rX3KnjWaqjCUla4zW6q8rVGihtVMcupWISg5Ue81UXSa2rVRiuTUPS1rUj2JTX2899UQK/zV7czrU88pLXkangBQAVLXUawpW3q5ZWHasLV0q2iWVIRDXRSy7F0izaWF85HULS+rXS89HW8K47Wec5HUli1bXLCmHWw8jbX0ao9WTyqGW7arbUU6/bUvamjWYy3HXoavuVBa87XnKrjUM8q5WFCg8SiaqDXxaoKWSigVX58jTVvaynUfa37VqK0nWga93H2KxbVE6y9Waa/NWYS2dkXqmtXi68lVcKtoWfasYjMyvTXU6hFW86hmUaKsrVSa2xVui97Vl8y1VRCgJVvCltVey/NXRS9pgCAXTXHKvXWyqxnV86nUU66l3XLaj5XFa85UvK9nV46h5UM62nWm6gPWXa7jU+6pJVxaw3XB6hgVzyhWVfMZ3UPavbWB66DVR6r2V2qubWZqxGXy69TV8SmcXBaw5WA6m3lwymzVq6n9Xm62rktCyHVsaq0XC6l9Ux6zmUSagXXA6znntMTzCcqk7Xk6/XVp64qUZ65Xl2qtOXsikcVF6qHn6agDXEy6XUfq93Wx6mZVbigWXzy7vntMSdBd6oPWu6xVUG65vVZStRVe6lPUt6qlXPa03WvaxvWi6i3Va67anxyi/Xtap9UN6pzX/a3bm9a6jn9am1UT6rPXUa42XuakMUyavyX0K7GXT6v7Ww0lNUV6xTU+EtqUl6vbkg4yCX/sz/Ws0jIXpasdW9y4fXtMY9nTa1Tn2qqnU96t3Wh6mCUwaorV96ufXDayHkGa23Vuq0jXxy9pjVoC9XbK1PWciOnXra2fXb65nUVi67VFi3zX8q1g2oSzzXlqpvVVC/nWH6k3W4Gk/X36s/XV66/Vl6rLUgG1TVj63RL/s1AUv6gLUH65MXUqstWbKlQ0CagcUP65PkaqlnVw6r5WFa4DXJyiLVYGzfWjasXUb6kPlt693ntMDtBr6pnW16iPXd6+bV3iu1W66ylXKGo/VCGvPWn6nbXmGnfXq68LXl6gA0S6z5VxiiA1O8rQ2z8gvVVaqHX56kw2WGxXXJax5jJ6sWX+GyvWMGlCl0GwRV761I3eGkQ3RaizVSGqzUSGlrVFGuzUyG0/nhGqMYKGgHWuayTVMKzxUMqng3ea+ZXsGwTWy6u9XMGnsUVGqDnE6wQVGGoI3xG3PXD67LWOG9fV9G0zlWGyHntMWIBoGtcVIairV4Gww116qsUWG3PUZy2g1I6gw0dK0I0Oa/+XG6vQ1hGjQ0KSyXVzivcWzK63Wa6pxUXyzHXD8642YajI1ecgjWc6kQXc6rzV+6/jXRGlKW8Gv9W/6go1bi8Q2XGtHVlGprWnG0KV36rrVtqyCXtMTDhzG18VuG5w296sY32GpQU5G1mVvG5o04G9jVKGhcW3GgnlVG57l1qjPmBShw1X6kE1taueVpa9pggYKjVy6hw3Z6sdWuGl3VpG0A2PGzOWaKrE316pY07G3w3n6zY0pyxE3YG9w0da7Y1Ha2I0ua07UAiqY2r89phhgOE3cS1XXBGgI35cm3VKmn9Vom8eWzqn43smg40rG56Wim2HVmGvk1rGsrmqmoY2BCuWXeibAXtMBtAXqkdWAm3k1iG2g1pa6/UnqkgXtMaVjymqmX2m8k1faqvUecqJXBKrPVT6lk3SG0Q0Bm0Y1Miog2r8kg0EG8gVCCleV6mgzmL609U8AIdlemoAWLqnPU9Cuk2omu1U+mtU2sm8U09aifX5q/CU2AFfXVoCABCAbQAvMUADyAfgB1mtdmvqZtAvMCmWcS6YBMwY6D6OcK7PM/qYuoDEDTACADHoLPCtodZhEgK5Zk2EqkP/QjAnkIwBYAT4Y8AatA7MHZixrZwC7q2bHDmzpiaAWADzmxc2XwCoCdAJFgTmmc3TmhICzmmUCaAFs0toWZgxWI8idm2WAkU1xROiPWC/oronD0yIBbm0c3Hmy8Dnms81TmyqC7mhc1xzf0DLm1c2Hodc2KQS4kgAL807mvc0gWi5gKwQ81hQH82A3P808mdC3irabXXmts13mtzhdmzKCKiDGIZwBukDmj80wWkc07m1C1WgdC1k4gC1zm4C3WDLqBgWtc29ADc01aWC1AW/c02eZC0dMcc2/mgC10WxYC9YS804W28054fC2Pm7s2VbHiKcgXKzNudvYUW7c1jmic0u0lakZUzoDwWpi1Lmlc2sW2Gn7AaC2cWrS2CLIYqwMWLksuK2C8WlS0ZgdcRRZKdQ62KYCiW2QCtm8S0dm3AS9oJND0OWS2+rRtL4EqaGcW6i2O0qyk70jS1hQYy30DI0AsWiC1sWqC2bmyi1cWhC2fQKy2BW+y12W2y0BEJy0uWgVh4Wh83mwaS3pCbtDCW4ny+ABS1McAK38WhECbkkK1jE2EDhW9ICi5KK0gwdi1Dm+K11WvNKWWkwBHmiq2k01va62dK2OWmEBXm5y03m7K0SW3K26QDy35W3wSFWxIDFWuIAhMgVwtW5S0pWqq3/2Xem1Wxi0mWyK26W6K36Ww3FLW0c1tW6TIdWrqDWWyq29WqqkOWrC3Nm4a24Wsa3uWqa38ffJBw4Eq1NQRS3lW1S2rWtS0MW7i2NWyC0GWuK3KWo62i5E61dWz60XWtulXWzK0jWrTA5W9y2aoT+xUmF63zW06yLWngAfWmy3Bk6q2AW4G1DFP60xWgG0cW1q2bWiK3+gUG0oW7q0E0hy2Q2j2DXWoa1ZW2G33WiERPmhjbPWnkylWg61UWym1qW7G0/WxK2RAfG17WjWCc2hK3aWg82dWim3g26m0RkqG2DWsS2jWty3M2hG1WbBfwlLFG1+WyqAY2yq1Y2ta2hWja2/Wna1NW2K1E2oG0k2+q1DFcm18WqW1pWi6102+W2M2xW25SFm0gKCNCdk3Ywc29G3xWla062762aWs215pQW3rE/a2e2023cWy21nWnq3S21K0ZWuW23W1y1A0SS3mwZW2TqfJBu2p+S+W++ma2r23c2r62bkvm1i2kACB25q0h2w63+2461IWiW1W2my0Q2mW2026G13Wx20EWgyDMiW5y0s3Iwe2z83Z2z60+2vO1+2g23gWo22E2kW242o0Dh2la0126O0DWmkD02mG0voOG1K2zy0t21O0xGDO1o2zu3LWnO0924Mn52ra2gWw23/W4O3r20u1h2iu2nW8e1R2/q122uO0K2hO3jWuSCPWxlqp2tfwbAknBlWru2Y24K262mq2i23e3MW/e0E2w+1KW4+382ni2V2iO1U2m22y26e322ue1M2p23J22FQZnJgyjABa3+W9+3a2z+2+2sK1l2hq3/2oW2GW4m0n2/2DJWnO0T2y+312+O0PMxO0TWh+3YKL6lFiF+3vW9B1wGqUm82vu0gOou3G24e04Oi22n2sG3V2i+222ih032qh132ggCTWwi1sSeh2eUVe1oOje3d2zB2927B392vS1B24W0l2uC08O0e18OyW0COyB1122O0M22B2N2qS2SOxKS18Q8CMOt+3yOj+2sOr+042rR172ge0H29R1H2zR1EOisAkO6219WoR2GO2e3tm2+3w2xe1GSHHooO1G1yO782b2xR3b29h0F2zh1D2jR0/20m2IW4h1gO8+36OmO3QO6+0O2wJ3M22h3NMsIAfjV60w46x2ROhR12OrB362jh14OtR0EO0O0gOse2kOwR1QO7C3ZO4x25O+B3BOxKRySQp1cSWR1Z2mx0YOip1KOqp1xOmp3F2tx1JO823aO1J1n2pp0ZOqe2tOox0BO0R0PWsx3jVc82Z+Kx0i2723RO9a1TOgO3jOrh2JOke1k2nR1V2863NOgx1ZO5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Y9S5T6OmYvRjMGLmY7BiUmLyY6tCCmKAYhhCZmJ4YjZi+GLGYhRDToCWYrW4iaOAYg5i5GOOo8BjAmO6Y5Q87XnQY7+jGSLuYluimmNyPPpjwyWeYkBj2mMnAzZiTmMdQjxiRaN5olhim6IkYhZjfzi+YsY8qGLqY/5jjmJiY65CnmK4YjBj1GJGYzHDIWJBQ6Fj5CRjQhJj1mNoYgFjEWLZQp5iZGNRY4ZijmOSYwFifUMteapiQkJEYruixGNYY6JjMWKRY0gZOkK8DNpjoqI6Y3ujFGNbo65DsWN9xXRjRGMFvMBiNO39owPDJ0J+vdsiFsJWI8xiF0O0gmlj1LmXQgcj3iT6QhOjgL0eXA7Cq6MMPMl5D0MGgPFi0WIpY0ZjYCOuQ9V4v8MfwzljeqJ5Y+5j0MKOw8wjdWJfQhCM3iN+Yrlj4WMpYk1i2ULNYhAinWPXItZjDWIJYhFjkiPpAYFlQgOtAA1jyWIDY91ig2NjgL1iSCLDYuFj4IMJY6Nif4F1YtnDwmO6o7uif6IaYrpjbWIUwkFDY2JKKZjD02KzosujbqOYo95jumJ1YkNjxMJrxBNjPoMDYpoiY2KjdaLBa2LBYnujy2NyYxQMq2KeeMJBTcLbYrNjOmLKY3NjDDwLYgwi62MZQjFjG2JTY6tjLCK9w4tifGPkIjRik2KnYvoBR2NcIvSjhWLUo8Ri2GOTYvoBdWMTw8diPUKjYldjujA1eA9j+2NeY0pi+6J/I7tibTlLw7xibCN8Y11jE2IbYiojq0NHYoZES6LvgxljwWJ3Yk9jdWN7w5vDLWMmojti8aPHrEdjm2LKwmoitzBeYgxiFGJtY4jDb2ObeCfDgOPLo0DizaPe9CDiXgGQ47XCDmJ9opWi/aPXwoLCQ4KlYsxiZWLDo5EDlsIPw5Q8C2ImI0/DVWK2w9VirgOwPMcieoJ2PMZ49WNw4v1iI2O3Y5liV2LLOOGipXAfw/VjD2M4w9UieiI+PDjjHWIfY64in2KtY9DicGMw4gg8BONH+UAj52MfYxdj0WMtw0Yibjw44vHDw2NmYyNjjWN3YlTiWqX040Tj1MP6oytjlOL04jgiv2NUQyJijOMnYt9iXEPaEQTjpUULYugiN2IZYxzjeOPmY/ji9OOEI2DjfaJyYsDiu2OU4tzijbjlwgzjDmKc47TiJOIJPDjix2Iv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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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 bom_type of ["both", "F", "B"]) {
for (var row of pcbdata.bom[bom_type]) {
row.push(parseValue(row[1], row[3][0][0]));
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch(e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
populateDarkenWhenCheckedOptions();
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function() {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function(eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function(eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for(callback of this.callbacks[eventType])
callback(event);
for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
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) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if (text.svgpath) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
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));
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]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
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]) {
if (c == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
}
for (var line of pcbdata.font_data[c].l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var i = 1; i < line.length; i++) {
ctx.lineTo(...calcFontPoint(line[i], 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.svgpath) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if (shape.svgpath) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, shape, color) {
ctx.save();
ctx.fillStyle = color;
if (!shape.svgpath) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
ctx.fill(getPolygonsPath(shape));
ctx.restore();
}
function drawDrawing(ctx, layer, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, drawing, color);
} else {
drawtext(ctx, drawing, color, layer == "B");
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline, hole) {
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 path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
if (pad.type == "th" && hole) {
if (pad.offset) {
ctx.translate(-pad.offset[0], -pad.offset[1]);
}
ctx.fillStyle = "#CCCCCC";
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
}
ctx.restore();
}
function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
if (highlight) {
// draw bounding box
if (module.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...module.bbox.pos);
ctx.rotate(deg2rad(-module.bbox.angle));
ctx.translate(...module.bbox.relpos);
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
if (settings.renderPads) {
for (var pad of module.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padcolor, outline, true);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, outlinecolor, true, false);
}
}
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawedge(ctx, scalefactor, edge, edgecolor);
}
}
function 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) {
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];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
if (!highlight || highlightedModules.includes(i)) {
drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata[layername][layer]) {
if (["segment", "arc", "circle", "curve"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, d, polygonColor);
} else {
drawtext(ctx, d, textColor, layer == "B");
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for(var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for(var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.lineWidth = zone.width ? zone.width : 0;
ctx.fill(zone.path2d);
ctx.stroke(zone.path2d);
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var ctx = canvas.getContext("2d");
for (var mod of pcbdata.modules) {
// draw pads
for (var pad of mod.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false, true);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (highlightedModules.length > 0) {
drawModules(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawModules(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
var fontsize = 1.55;
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer == "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var bbox = applyRotation(pcbdata.edges_bbox);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
var flip = (layerdict.layer == "B");
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, -pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for(var track of pcbdata.tracks[layer]) {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
// Check pads
if (settings.renderPads) {
for (var mod of pcbdata.modules) {
for(var pad of mod.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinModuleBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.modules.length; i++) {
var module = pcbdata.modules[i];
if (module.layer == layer) {
if (pointWithinModuleBbox(x, y, module.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
if (layerdict.layer == "B") {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation);
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var modules = bboxHitScan(layerdict.layer, ...v);
if (modules.length > 0) {
modulesClicked(modules);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist/oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var netsToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.modules.length; i++) {
if (pcbdata.modules[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references) {
return function(evt) {
refsSet = getStoredCheckboxRefs(checkbox);
var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (darkenWhenChecked) {
evt.target.parentElement.parentElement.classList.add("checked");
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (darkenWhenChecked) {
evt.target.parentElement.parentElement.classList.remove("checked");
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedModules() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedModules = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function() {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedModules = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
{
rowid: rowid,
refs: refs,
net: net
});
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
for (var ref of entry[3]) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
// check extra fields
for (var i in config.extra_fields) {
if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
// check value
if (entry[1].toLowerCase().indexOf(filter) >= 0) {
return true;
}
// check footprint
if (entry[2].toLowerCase().indexOf(filter) >= 0) {
return true;
}
return false;
}
function findRefInEntry(entry) {
return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function() {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
th.style.cursor = "pointer";
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
th.onclick = function() {
if (currentSortColumn && this !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && this === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function(a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = this;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
return th;
}
function populateBomHeader() {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
tr.appendChild(th);
var checkboxCompareClosure = function(checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a[3]);
var stateB = getCheckboxState(checkbox, b[3]);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
th.onclick = fancyDblClickHandler(
th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
tr.appendChild(th);
}
tr.appendChild(createColumnHeader("References", "References", (a, b) => {
var i = 0;
while (i < a[3].length && i < b[3].length) {
if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
i++;
}
return a[3].length - b[3].length;
}));
// Extra fields
if (config.extra_fields.length > 0) {
var extraFieldCompareClosure = function(fieldIndex) {
return (a, b) => {
var fa = a[4][fieldIndex];
var fb = b[4][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
for (var i in config.extra_fields) {
tr.appendChild(createColumnHeader(
config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
}
}
tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
return valueCompare(a[5], b[5], a[1], b[1]);
}));
tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
else return 0;
}));
if (settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
return a[3].length - b[3].length;
}));
}
}
bomhead.appendChild(tr);
}
function populateBomBody() {
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
moduleIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry[3]) {
expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry[3];
}
// Checkboxes
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.darkenWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
// References
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
// Extra fields
for (var i in config.extra_fields) {
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[4][i]);
tr.appendChild(td);
}
// Value
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[1]);
tr.appendChild(td);
// Footprint
td = document.createElement("TD");
td.innerHTML = highlightFilter(bomentry[2]);
tr.appendChild(td);
if (settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = bomentry[3].length;
tr.appendChild(td);
}
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
moduleIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
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);
for (var i = 1; i <= moduleIndexes.length; i++) {
var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
if (refIndex in moduleIndexToHandler) {
lastClicked = refIndex;
moduleIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedModules();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
for (var i = 0; i < pcbdata.modules.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.modules[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("bot").style.height = "";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedModules();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").filter((e) => e);
prepCheckboxes();
populateBomTable();
populateDarkenWhenCheckedOptions();
}
function setDarkenWhenChecked(value) {
writeStorage("darkenWhenChecked", value);
settings.darkenWhenChecked = value;
populateBomTable();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateDarkenWhenCheckedOptions() {
var container = document.getElementById("darkenWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "darkenWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "darkenWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setDarkenWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.darkenWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
document.onkeydown = function(e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function(e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
prepCheckboxes();
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
Highlight first pin
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
<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">
<div style="margin-left: 5px">Darken when checked</div>
<div id="darkenWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="copyToClipboard()"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>