bspd/Hardware/bom/ibom.html

4670 lines
288 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--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: 0.4rem 0.4rem 0.4rem 0;
}
.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: 3px;
}
.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;
position: relative;
}
.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: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.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;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
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: 0.4rem 0.4rem 0.4rem 0;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
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 {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
}
#topdivider {
border-bottom: 2px solid black;
display: flex;
justify-content: center;
align-items: center;
}
.dark #topdivider {
border-bottom: 2px solid #ccc;
}
#topdivider>div {
position: relative;
}
#toptoggle {
cursor: pointer;
user-select: none;
position: absolute;
padding: 0.1rem 0.3rem;
top: -0.4rem;
left: -1rem;
font-size: 1.4rem;
line-height: 60%;
border: 1px solid black;
border-radius: 1rem;
background-color: #fff;
z-index: 100;
}
.flipped {
transform: rotate(0.5turn);
}
.dark #toptoggle {
border: 1px solid #fff;
background-color: #222;
}
#fileinfodiv {
flex: 20rem 1 0;
overflow: auto;
}
#bomcontrols {
display: flex;
flex-direction: row-reverse;
}
#bomcontrols>* {
flex-shrink: 0;
}
#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;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
.bom-color {
width: 20%;
}
.color-column input {
width: 1.6rem;
height: 1rem;
border: 1px solid black;
cursor: pointer;
padding: 0;
}
/* removes default styling from input color element */
::-webkit-color-swatch {
border: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-moz-color-swatch,
::-moz-focus-inner {
border: none;
}
::-moz-focus-inner {
padding: 0;
}
/* #bomhead {
position: sticky;
top: 0px;
z-index: 1;
} */
</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 = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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Vz9XDVaw1i9VqsKbVK9W6NZjVODXtPCIZAzHGNbrVZjV5SHRVljXX1dY13VW6VY0AnQj9VUZV1dUoNfyYnDX51dw1BYDTVcwAs1XUgL+VIYALVSAAAACqK1UgVagAYFWSNRdQw8BZFaiEcjWGANkAFcwHVZbEQDVb6KdVQTUZ1RdVuFXaNacAFVWeNRbV1VVFNYGwunhlzCY1B9VnED8iioQU1WA17ZVsVYPVhVUDVfPVLjWoNe41YVWYNV41+jU/MM0x456c1QM1eVWgNW7VozXZVdE1TjV81aFVIYCr1Z015ZVLNaU1qzU9OYHgGzXK1UxVYzXn1Z0ARVUG1bE10zXxNQc17TVRVS3VJzVwZMOeZzUuMBc1jTXfVaE1NzW01RM1MTUv1R08ZVVzNeJVjdWLNRO0Dqj+NcHVazW/NSQ16YT/NVs1UYCONQjVoLXMDBC1EVUdNd41BrAfNXSoKFX9Nec1oTp/NSfV1zXbNei1DzWYtU+VLzXzNbi1+jURqN8wDGhANQi1pLVItUrVY9UwmJS1PFWTNSw1YLXI1di1VlWMtVkyDqhfNfC1JLVDNT3VIzUUtWi1vLUgtc41ArVCVUK1ULW41Uy1pzUStT817LV/IqQ1KLWyteM1NoD3NVM1SrX7Na0AhzV4tXVQorWOOis1mrWDNZc1XLWohDy1wLW7NTXVKrV6NWq1VrUoIKy1krX2tVY1gLU7NRi1irVYtXS1kLXutS3V6rVU5IKw3zV2tWS1MrUZVf61VLXGtcG1ZrWvNUc17TwEtfEJ1ZXEtVq1UrV3uHq18bVOtYa1fLWPNSa1zzUptfS1bzVdNQS12CDetTm1vrUAtYW1dzXFtTS14LXjVZNVvDWpNfw16TXzVUI1HpXwYD6VBTXrVWuVfPoOqBuwO1VwVZ+YiFXKNQQ1hgCqNchwwTVNNeawV1WtNbmVqbUWtXphNaLaUEA18tUNNRy1TZX5tdSAYTX+tf2VtzUYUEa1/LVTlW416DUeNRW1abWBldXwsLBGUNu1RDV7lVIs5LWdVZ5Vx7UcVV7gp7W7AOe1JbVYtW21PDUpNau1C5UCNZk1QjUAACoAAArAVSAA4jWtABBVXWFFKGO15TWnABGVi6zRlSnVwdXTcimV3dV5tTwAWjX4VWu1P9Xhtch107DetTVwXwbDNZs1+rW/tZNwVDVM1TQ1t9Uj1ffVxLXYgIGQc9UXtZ087DUx1aG1XjWkdV014Yz3KDOwZzVUda1V0rW0ddnVtDVq1Yx1hdXMdbA1dDXwNex1KZXGNUm1PHVL1XcwQHXJNacAn5VdtcwAGTWtAFk1XpV5NfB1g7USNRBVJTV6sbI1u1WTtVGV07VZtYmVc7XqNXu1UySEdc01xHW3teu1xTX+Tmk4UbUINU7Vr7WiZGQ1oTVdVV+1vVU9OQG11LVBtRp1V7UcNSG1OLWVtZZ1UmSyVES1hDWBdRJ1wXUHtTHQYXXbNSe1QLVFtQq1ezXxNdp1U1W6dXw1YHXdtYI1KjAgAABVWNirVeZ1iHVrlaKBUFU2dXBVCFVRlchVrLUIcMRQmFUWNYu1arDLtcqAbTVedfo1pcbqjKJ1mrVHaM5VOrWqVSF1HlVZVbY1YYR+VYm13HVv1Zp1n9X8dQy1v9UtdX0ktbXTdSDwC7XZdW+4uXVLdXpVG0oFdU21RXWutQl1wrU7dVvA5FUztQpVTlWHdf11x3VHtXl137Uq6vR1sAD/tS21grW3daq1LdWG+q11T3XKgElVajUpVW+1cbWHtad1PVV2NWClUXXqdeC1gPVhtVW14qCg9Y51s7XNVZD1mXVJnO91cPURNWSA+VWXdWe1zbUxda21XDXttSB1aTUGdT21NXUelSiECHXgVem16OnNpm118jV2dUo1HawqNW1EKZUI9LN1nAAigER1OjWjdbjVtkD/xP51DDUvtXj1BoAE9Z+1n3URdQOV8rUutXE1xjVoNfF15bVbdUl1rPVeltvuaXWk1buVsvVC9fN1mlUK9Wd1kTU/dX91FPWCtaV1HbWgdd+VVXUQdTV1i1Vwdcz1XTWbVVClHPUVNftVUZWHVWD1BgAnVdgAZ1VktSL1K7XmtYJ1G1XkWiaEz7VH1bG1UnXj1RQ1kDVwNQ612tWj1Qg13NXMNQB1sXUa9Xx1iXVY1SAAzdUe9RUORTTSNdmpe9VY9Y7VIDXx9Vc10nUsdZQ1KfXkNYHV6fXS9Zn1XHXZ9et1cXV59XHVhfXedXjVpfUnuHwcTPSx9dX1rnWm9XX1inWydY31CnVs1S31hDVt9ar1TzXq9bM1qPUCdevVv9WxpJIYI/VZgPh1urXvtYn1ANUN9Up1qfUydVPV8/VP1YG1xXXL9de1brVr9b31Y3Wb9V71AfVp1dq1NHW19Qf1BrVWAJfV0DUz9c31bHVOdT05ldWX9TXVvHWbdfn12DUP9bbV3qDb9QrVY/XHdRA17FDf9dQ1p9UsdWf11nQL9cANavW11d3139Xr9cD1E0T/1SE6lWKz0n016XWj9YL1rtXv9f3V9fXJ9cf1TfVydbrVGA3RdVf12A1gDT31RfVR9VvVMyKHFMP1AfU7tbv1yLX79dQNk/VH9ax1THUoDZP1aA1xnEwNyPVsNRt1GDXa9QX1HA1rlXg1T/WV9Z3V5A1v9Sf1NA2IDcPVV9USDbP1//XoDRf1zA0gDfINqFB29TT1+nXLldV1VgDCNfV1+TV+lRZ1zXXuJI46jgRVgGh14ZVc9Vh1Qly89e0s87Vvde51S7UtNcN1DvXgDWN1BJbw+MQ1pA3WdIE1QXX49UINJ3Xm9fD1YYRRNat1HfVyDV31bA1A9R71hZE4+NENATU/IvENc3Xy9Yt1KQ0rYGkNKvWYDUv14bCWDeV1nbWVdXT1tg2AVbOVDXVODU11gZWeikN83vXodchVnXV6eAH1+dkYVcEwxvX7tUENg3UhDUYAYQ13dcD1WiysbI4E3zUHdSWKFA3YVeP1sPXJDUT1nFUXdUj1a3WZDbn12Q1o9RtVsbhXrPt1NFWvda519FUOtR91FvW+VdsN6Q3/dcq1q/XbdfgNm/BkMLz1/vwzBEd1iQ3XDeUNjQAk9TsNGQ2PDVr14Q2/1YPg3Q0B9RD1nw2BDTD1OXUbDTlVCPX/DfcNNvXKtXUNyoB6dY0NNg3O9VYA2TVu9Y11LPWBlbb4FaaodbtVixiIVUj6BvV4UJr52QlwDeMNWZWedYoNffUmYEpIKAhANZvwC+D1tai1n/Vk9dd1WA2gDQoNII3A9bjZSkjt1QH1bI0x4ByNdHWk9X+15PUsDbf1zw0e9UKNUQ18yqKNcYDijTX1Vw0JtVUNpg1YDXKNOvUEjff5zTHKjeoNBgBijWRsKw1rDdy1crXOtdUNpbXmVU8Neo2KVAaNs2iTdQfVpo0CDZy1frWNtdyNi/W2jeVV0w05DRtVx+JWBOx8MQ2nAG6NEo0FtVaNhXU+jYB1VPXAdfUNYQ3gdUZ1QjUAAOIAAFQZjQO17Q34jcDuWIzTiD0N4ZX6CXL82QBfktKSAfVIxDVyTABEgdysx9Vh9WiNcY06daENtPW99Q2NUAD+lSlsnyK41Ze1b/WDdECiEaT9ZN9MzygyxTmMUI74bAnF1PDHqImkw3GF+eOwRbxHiFONbajMYEUokzK6ZAuNAkKk9M8onKjjckmkdtJ9HIU0J+JZDNjIZmCIbIU0SUzcYmQOMGB4nIU0B0bF9ITmv6iZsGMqYJmJpNW5rbxSzrS4t42IhcPgZVHkJL/4z41zZUEQs40gWHA8/khNwjowiNQzgn+NLHCwZNu6x/SQTbRqD43fvBliE3QYwIblr7w+sH+NtERTzB6k7GwvbBhNj8AGPpeg5dh/ja3ArRZHeeH6h42ceGOe1ILX4q1aIIz9TFKwzlwUTeb+p/qQOPBM1HyxpBQqQYUbgLBEOfRFQm3Mc24oIoeNez61hAJNYAxCTeex49QvQJD0C40VSEDsAk1zzLeNQGhwxMGwv2yt+AuNn6DP0AJN+oyL9HFaMxCSPKxNkswLjbVYL2xzbnnAG8rmeRtWXE2CHClKb26yHNfwaTAoeH8CN25UPL/4KaSLRDpNkiDbpJJNnCqJpAgFfkC/aM5QITITdENEt0r7efn8Hk1iOfKQYzlCoJqsisSPgJ22v2jP6P1SE3S0frL0HqTI8J1oiaRxqMPC6U1GrJ/MDFb/8mBN7EDeillNIw01Mg260WDZQnBWi8LyhAnEiywpTWIkjYQepFZMQDxwViV293l+edJCpU0noLeOv2hTzO143U20Uo6kVjhxPIeNUWG3vF0ulvQjjUm0RvzYTcyiv3QMVi9Uahj9yLkEOfQpMtLslbiW5JggY01RFJ1MEq5szNoC8R64bKhN/LjiHL5NO+DAzAY+a0Ad4sFN/wUyBVMkLMjAHOdNYaCoHA9NbRrnTeS8w+wPTf1k05LeKXGwjqSJBvVcEtUV0ndUSUhusrcAGpjYtVYAm9Stje2N0ZydjS3V3Y2SdWlsgKLKgGV4guYRbJVopXQV3BN004gP0kVoiOBfspvVQ0h8rMn01vjG6ImkPhRSYCrOlbDqUrNEoAxk3AgU5dg6TZOBXQwigN6KMkqKpBbAEXTT5Kzgt415+HPM340JAq1NWypwKvO4rbw2ikDEQfLTsPOCxfQDeaRKiHzApCOC9ALsqJ6Mr0wD6MHIjgLCqNYcRSisrC7cXnQyqFOsus3gKu/0sKhLmDuwD67bIdV4xNrftBkcoeV5jKbNiLxdHADNWAhjYi6ANs3vTA05TcCREp15F1E1OfXYHYTRdLCogDLnVDMlnDDWzbLUTPhFKHdg/YruzSfUySjFUdtItOIGzRJ8WyzPKCq8+zK/SPfEAYzbuijsEc0UlDzNOQYQTbjNGWomTb9o8U2GQJTN9dgOsB1NzUymosTNRjC/4vt5+vw59FAgT4imqL7arzwlzccQe+xjniBQK6wfJH/snLC0HgPNHOQxol54VWR/jcCK0E2JMHGKyE1toizILnglDChi4W6JPPKENCrT0AtNAsFIAlaoJ4SlXMlEIuB2zUz8cUw59IiFyOiOpJ9Mn4rzzTDMQvRpMAhiI42Yxmf8EHr3zZBNy6w6MAmAtLjv9P5IcQzQuOACg9CQTUcsOc1HMDX8yUQZYGnNnq5mAvPNhC66jF0uU6JQLSq8cvyFNF+g243q2ATMy40vIM70XRjcJInNmiLMyml5M8Eb+unAW80MGOQwDTnJIgd0COW7rBQI5ej3XOVEUmAuzYscKxxVzRUi6aIazZJMzvTuEBNgmbDPjLnMLM2ghTVM07DcnEaNTohmRD5k07C75PzN2GLTZFMklbCczYCkKRA6gRs4nOJqqNT43CzszYAyVc2lRCzs+wLxolXNvdBYTXLO8wqSLYQsK7Ih1GcsHC1P4lr8WM04TRYt+vRgYlNIEJR6LaMcyJhTSHg8gixQzdSAMM2JNZNVcM3sUG08jEyuNT2NMixDdBUOShCMiNh40kI59ITkIUwMmNXqXiC3jQcw+FLPaNuk2MzI+Z74vfS9cHI8502RukFMzrqXYIeNGDz6PDqBjwx0EhqkMbChzfhqjlyfDkvSlhw5zv9M50048HIMNSgX3MBNIm64IOONDyD7TB9NnqK6zZSs2ExuKfr0DC324DZNbimvSbrNXWSiwqMt7B7jsDFYC1JuKWus6s0UJspCH02J7P7NqCDnyrdNy/T2TXcEIDwFLW6wxfy9OUz0I42NXCZooM2TQGiKt02daIvNvTnlwgkt7EB4PN+NCOyGzLdNq2QaBLQIbnR3LX2sYRwdOdOoC00OcE9A3C0jDZMypU3vkRBMQ43VQs70V1plSg9NYciz0k6I+gihNB1NZ/yTLXVEsvxSzr4pB3QTGA3MGs6anAtNWBL7dKhN/KC1hKVNnKC3ghKuiuyrgrP23dgITTDKzkyz9tysL+yR6mesDU2AydWMp43k8Hit5wh90oStRfg6TbnpkMxIrRvgO01tikH0zyiXTD7NgFYloPKEaE65cg1N6cDLpnv6w+BIkpxa6VhsrXvE86B8ra3iJmgzLaIe002KyYPiCySxOH6KDFrSMous0KSgXKVN5WTSrecI+mB6rS28Z8JTJFKxPsK6pA2M9TSOrR8cKK0MSWPY07CZ+PsyLq3IJBVchjQFkpqtFfwwLWQGJYrwrftwyyDPVN0wmK3L6D/Qz1RkgnGtSvodLfRCTIourcWoEsKU1IZMO037DIJs2a2TiJat8iJCzVsCt41lMM4CgK2g7B38cq2jDJWtq/TCrRO2oc0k9MotAxhIyqA+yCSarT780LgXGo+oJK3QIgLOrpRwraJaG+j8Ut+QPJI7TeDw9rLV5L8ceq0IEPRsIdSUVN1N7Q6SmHs85qx6rQWKrSKSxCTwkK0ClIOC8ggnQKVN2LKMzbuiPUok7nf4bozPaMtwEwLxHhxgTWzV6tT4US36UD/iQ558NHcteYy9nEOenUyE0qEtAypFaG+sNsKQzQl10M1QNUk1bY0SNR2NwixfIryNNI2WdKjNtrDRsL9IgtiPzCzwmqyIbdGUB8wobTmMv0j2NGlyyESxrPnNCtgR0iwcMAxwPL9Ii8K8XHeog5JZDLCoLPA1HCQ+Q63BzalivcxUPIv0xNrs8CfsNmzISinN0ShszCdMaeI60sTa8iQFjP06Qc2RBhKcGczzcNeMz0jsWJTke5520vnNAmwl7I8UWGwKbZWcRWhSknkICm0mchktEu5azRQmJ2JDnolYptzPSNT4OzIvRBMcCm3+kpWtMxAp4tJt/EC39Eg+scBYbYLU0DzUtFQ8js2T4e5KwKR3+Mat0m2dkKHNSyGLeQhtwSi90InNlUQlYtxtc0DBhI6t3pirgsTaJ9yOrfxAMvLaqOXm47AsuPXNwW2fSvb8UyQQBFxtcc2wYk0tOW0N0KLC7KiJDOIt8EzUbYp0EMCgzYBg7LLcbbHwIFjPVIPOcs09rXkI87jcKl/N35CTMpWtxNwLTU2BBMzjsHSKTk1AxJdCOm3JrCVNJc2nILg0WM0QYKKcE0RKIPFM8IhmXBYtPJI3EM9oyDxzLZCkNGLPaNjsfC1i+NKENKQvLBltpKjv8SyYPJK3kstEfByRIkb2uVCtzThg2cp/rfWtti1hWNdtazFoSHotU9KxLRBIjYR8LbFgS4KVaHw069xqqE5MK60rnE9Ami0kQELMuazlAvta+Tg24v2Ya6ySLSFQgZw+uDiszC1ADCHMVrjrOMwtJ0j2rNFsX82YtlQcsYzSQkDtNAqf7GXobpynzfB+B5ClzLl8f408YP5U0NytVPOKrdWz4vI8pZiJyolIxgKn4kzte+CSLR1YckxM7Qr0/O0DnLGMmkylLSbAXszKzDUKzq1fKs+AiqzHZM1gVc3hApjtbIrAaFXNq/j+TQZM5rIHdGNILdL6pOgEsU0iREE8Bu0GIH1t2WS7fAbtx1xVzS9gqnK7jBzATIryzeXoFuxfmMAiA3lYMBusd9zrzPVtxGC/gvaMrMy/dOyotBAA9M4YsrD5bddcUNyy/hEgHm3nkHuEGuxwxDVQgG3AjcBtsM3gbfDNkG1djbF1QS1wbejNEJgDWKhcQOAPza1yhPSrLEvSTE3P0j5crGBezMQt4SDRckgazkBTzXg8VgwoyrFNgW4ZgqiMUEr07QdwaXJcWNi0OO1oSO50zGDmTT8k+yBc7NJg6SyHjV8qe1zrdMSC5u1til0cIOyeghrtnvTyPFHQ69gWLbeCZJRqmBCMki1YYMDMapgJePbie0ggLIqM2QI+yhdI203qjMJwE2A27av4STw/iIoq+c3dBb/MaYkGCgN5TcBvDMAYOZhP7eVgxhxnSQ6S3G2TiFy8taS5rM5t+lDWgkFQbYpSbRomfYy7dAHIv03zPKiGJMgqQBKtvXB7hIqMbxa67RAlgILNiEtymiJVzTcCIczfDHE0Vc0ScpDsIsD4YiXNi0SFbefMVFhz7YEgqu23HIpcJc2sUkuKd6jHQlXNqExb3PFQfVJVzWXtrSLxUExEI41DKCZoFuzB7HSteZBPzL3MThB0zZi24hy5TKOg/qIxpBzkSKwBrJ0CtcJ3JOjKYax/oJztdyT8UKFigMAzqFPNQlJMAoYdZsrzzb4cvcxklOeNWqSuit6M+wx/jchIEfQG7csgRBKt1UxEHGJhIcotDbjiHNIdexB/jQXSg3xW7Yl8H403asgk64wijMItiUjRfEJMw41F7YXCLOyxIeft+2CH0GWs3xzELeeJKR783OeJmC0hhpqSu4wAIPniOO7k8PFcY1FVLSBObq3S3lu8xE1HfDBs+S4ULeXkAPAHzOeATkIuefs8SayRyHNt9oyTWCwcPMjKLfXedtIHzBpKMk0ebPxSeG0RYmQOSZj8HKv4FM3zzeOgJIoSsY+Yf41KgulQM6w1TKTtpPaE3OZolAASrQwQ0y0yjEesOk2HDCOIMoxVrQTt28jP9KcdPPDnHefgPkx9JOhs9QobVIF6nIzhTKEdNxDVwCescgoYTU/YymyIMFVN6SHMYKxsZZDATYSEq03yTKGsoR3iYvwcq0o2HTxahuyQnARgyq0QeI+YcXRFvMPtctgzVHF0E0xU7ZD0LtJrSChg8gozWlQ8O5x6PLkdYVjnvKhcbCyOHYrsqjzTOqcSSe0jdY718dWp7R8iGe2IzVntyM29jWjNrdWgIly80gRv7PPNyBBMUsKco+xHHZ9Ktux/UPxgmCyQTQHthWzaWFTtdeLLXIDC6uJ/jbfF6TDwyDYwEa1s5vBCFsT0So8dHmDOYnF0kkyt7UuR09BGnSuNr81guFYMHkA+0tfNOF7udHkSSvJqxCzI2/yEGEsQVO3nEHHKZPQBSP8dgzomUmT0+DCOYq1amHzrdBmQw22tWsDMd4zE8I4gyx1q9AGSDUhpILkdVPQYbP90ik3kJDGgKExB8vHiZA4CyhusU8xqShN0YArYralQn1ilLatAEmBqmJ30I43gjCgwM6wTfl/NXByA8L4OKUTqTdOo/BxNzPRcRVo14L/MsIygDEZNa6y7DCTkVnhppDngLjQmjCKMIC1EeO78GG0/QH0KgPQEnUMdPnQNnSmQ4SoHzInoptxJpCI08Z3JPjv0C42hrGzCcWj9oOJNz+zCPF8B9kALTfJUIIzaTCscivSFnUXAAZLcjoNA503Lshxtrwx4gjsOkAoW7NAqEq0jSBCCWew48Eftu24Xciakrcy/Td4864ImpIvC9AJ5DrkRXUyWLAqceQ4/NA1oyazqwNkt49BJPPFwqLh3LWqdZM0UaMXNwM3r2E1NupjBBOdNrDjarbqYSqR8gqEteCFKgdFg9QpilEIK9JjzhI+to4SE3HhUHVh7LVCcEqLZmszsjgI3rcjkj23Q7Ieto+2g7VScUipnreocpoEKOkWY3U0jzCyYKG1xrYgIxZ3hBjJcDU1FMmMMRJjv3GpdRq1SXYoiOtKz9vGYXoz+gYTNpU0gSTXiIkQR7KZdc6K4XeXeHwJyrRHsX22NhCYsJO5RZDbiUc6p9KVNnYXHraFAswoNTfqMKIwh5KNM363k2CuIKs6IMK0dLq31MFzsguj7IDutn4DIEoLopyCcrXCUpi3JPq54ka31MOBk7M6D6KVNqfR5jRwpTFKJpO+aEYoEzV0cOsKDuQxg2i3BMOcQRV3N3obiWM1MHQd0Y4rprCJEFhy1XTvACGzPaOM8uV0gUHeM8ghdQg1NAZCj/A1dsjKlTaeYEyQEzRmMcV3MYG5dUmkfDGNdGcpSSJ3e6a184jxgBM2gwHTNYwR2TQTNibiWrYHoASSSxI9Ne12ufF1dPGCWrUBAr2048LkElq2MYHeticBr0JatCs1SSAmKUR26pFKS5rJDnsrCY10CwGly/oEEUoNdjgZz+lZica38oGZttowgLfZoYQpdXQNdMaROxPRwc/ovLLeNbDr9ZEOeAIrO9DBaYYzPhKi4a03sQh2QLJgkiJtdbT4v8p3o9UxI3fwIRfS4Xbugv02M4vVkUl0fHObg7V29XOEtt+mjkhN0CQTUQDptQlA4qIzdObzqbchgyi0JBNUQRWjs8P1kjN22JcLdpBILTTTdXQILeYRQ5V2ZMMBwJ0zBUKfyuV0RIDRcx5ixTHFdMR7JjBhYQW0MWlmKaizKwIOSIa2ulLKcObktCg1NvJ2KrH2sv2znXbMQQsz/hCWgnl2g8g7d55DQXf5a4RxqHdKQqS0BZLSsUM5qXCytICAUItAKCWB9rTFezNyfhJqtTVxYHO9K7t1CscnSu4xfwmWt9LxkXLQdGOLkWqotv8xzzDEIpU12QiaM5YxR3QssmAFSDETNka25BMhIu3Qe+HIt58DkNEqYdQR8XefAFQHJDqq8yd3ZTNGtX3TaQM6trUFHLDOs5d4IXUjE8xC/zM4Cs8zdTZH+dZ1g9IetjwzbnaKgO01KIJDMM6xbil/NasYxmh3d4vwgrZdNSph3CCtdOlr8iuu5s6wgrR1SL+26ZJLN8R7kMKFiwd5hPCCtZmWKjEz40yy3TV+YcPIq3oQc993j+IGcbdae9OdNvPBGrDOsaET0XW1EykTU9JdgwnBX3fOgWCzBguftiZbwQtvti5h6rVhsW7zb7buQ6919wOqMJ4SRPA1Nl4SynIiR54l6reS88J1LrOUgO03p4AsKNmgT3Q1Nj4QfUldAzJyHrbYww2wOrJdc6D3CcHnM1qWxTCCtwxycjO1Y543fljeInIwFQDqKisTOAoksSGjkeMctggoR+Cj0R+QRTYdAqIIoTLuykj1rrTBs+GwL8gRd7EQYbMhgrU2SDCaGKEwCwEcK0PmDzH9s6VgHdMBJqrzrdBfM500CYJk8oZ2kSoY9yMJ3HUBw+QzWPVI0kkKojIEcG50jSJBJwvS5WBFNtLzN7WEwFy3Azc0ceNIP3DZcdy30oLKcIm4DnMsd7QIO9PSgcy2/IGdMup1AKjcdciqzqPWRRe2VvL+CcRidYGKd3JJKYML0U9woLbaYHezN7dCKbx2XLAvcEzLQiMRNu0AfPMo81+14TUHySwxgDFdKyh1BKp+AqyybTEXt5xCAYKssAswendaM1JymBDzIGE3fdPMsZZBinZXMbgwPBDP45x03mClcD9z9bDM9MGA1PdgYg5LETaZgdjwOnB6iNR1mXMMsfcDsTdhYmFgqnP98y8DETUvYRz3uWMQtAF7RPdfCX83hPcrk8ywRPbdNErw0XAJuYTIfTdBgXowCbpOIy53lnD3tx+ooUnedx7yBnN9IQlIHdL9chvikDAy8eC02aAAgSwwW9Ppd8BgeosKcXC3qTQYMXOxKwjSKsQ5QYhuKkp0iNKUtZ511yLr0esKnPXGMuvQG4g0dM5hNYg8M0fLqmNaVQG2eLSBtPi1p7X4tCM1dNUjNBHWwbSmcIS1w4JJMDt3ykH0KrmDl3WZMG+g6PRGdNVJmTDDKuR0zhD9JgYxMzExNrRSp8oGM8hhMTbicgMy8efbc882kUurdQcIn3Z9chky5TLBEroABHUCS0u13+CCdhZofPH52h4hF7fk0YLj3aDggDR1WQOt8wXTMLAgdsxzgQjHYU8zMLYmsFG2wIOREd23ckqo0uph4eBFdJqi0GrqYLNzm7Yk8bvQA7SpsWB1/jpG89JgR+BYtvZxb7ZVo6S3JciPtRmxFaL5SqS1qwICIX236/NjyIi2okDKsLJjN7Hwd7B46bdvsrbJ8HZgsgZwniEG8db19vKDtg6LQXSbAU2Bz+sjwfD0QvHjdc/r/4Hwd6fLM3dSCn6B8Hfi4d12r0sotBLyNwEUoZLh9XPTtN5hwLOuwyooNHW7OHS1v4kidgoU7sVMkIuApDq3VCMBKCo8k8U3p3RjAlGyh5V0cFL0/bR0tCgL5TVOgx9iArc0cJz3zzerAQb19TtZAVO07SGqtsbRyLfaM0DDXvSUMaZ2IMKIgvTlLmNL82MhuztatmApOnSAdC+0gfS9c6k3DiA+9O9wLjTax2y1MnMwdWL1gQEmMjyRbQNBdg5n7YoatM5hgvTEwSCAuzWzMKiK3TQB9fyhwjKktCUD5QDnNJ9QAvCh9DBwLAoY0TH13nS0i7SwsXmdyKH0yImFtb+gXnStS8JRIPjqMzvSA9OgCaD4TvEZN0LzrvUsQ6vxFWulQoM1timEc6k0z+ISYml7GAtWdL2Zusmltp/LFvfPa2vRvLdauz4AyTV8wq8zrsIdA241UamBA3409wJ1C4k3ILIe95jTPMjJNFFygza0UlB1YvR0J/s3tSFGad53BUNOc8a6rSv2d/8LzuJ3KWn2lfMYwseSGTGmdQfKTiO1tXWTLnUKgWspWmNucgn0n0I30kwaqChx9LH0dLapNF210fUUtbH3m8sDNTUS5LeNk4wINLeEcljygPrvAj60WWMLibnWc7OidYaJNkINtzX0KnbyRHS3wNMqMkE3iEiWtpMyQTaZgNW1Dkg0dDqwq8s9UOZhU7TnRgK34YPZAAR09MLN9BVgwkjNavCA8DC4I+wTxHR8Uai3/POII8R2rCv7N8YzaDPPNWGiZfYBydTwnfXCocaTZrQssjh2ikN2t/VY3EI4dPOxNrQJgK4yeSBZYxmwugYFijh048KHNGUA0Mu4di0QJbLe0aiKOHWk0ib2XIvONUC0wClJd7m2dnWBE4aEqzpnCkJ117C4tjyoq4KqdLbyQ/S9g2mLXzU8MZXTszhvgYp1M6MOCg22LmCAtc4SGLOT9w2CdfeH67X36ElV9/Lj/fR19TP0b6Az9hizPTbPsY218jNeM1S3MLOj9YcjzoM9NZLjcbOGx0kDPnewtX23drBL9lH0FZLhd1XCnIM+d7VivbU1EAd3AzfuAlu2GCKJygn2p9MtoBM0lND89COw0XCIIAZCCfZ7gXvxYzVhsd9IjnafU+kzflE8IC422zcxC62T51IJ9xag5Hg1dzUhO/QXSSyLvlGTyd53aKqFiYhLc3YH9M/hVXTySh5xO/QTM/IzmKBGYYn1RrRhdB6IqQAuN74CTSkSYiCB+PSOdO/SwEvJdDoxafeS5ecwu4KysIj35vF6sRJiJWAhd1Kx7Kp+tEDKS/cbCQ55KpNetsjxXnc9o6TDM4tUtI1jS/e39EU2coHRmRJifWMPtVJTgyn+tnWC6HaieFCzo/Uwi4/3RKFtsLJhhHHxddEAzwFyyM562SXudjwzzzM4meIp7neDKz11S7HOdgvhRdKjdhDwJ/cPdRl0I8BdtAPi+Ketd+Mp3nX3SInyGLZoivE06+Bpduy6b9A59xsxfbaFAQ6ALjbcMAV2vFMxgkT19XMj9oKxzHayVuF1C+Arcaz1TdKVddWi5HdoqRiyW4ItEKr0riqDtDWG5HVpgspzoqmvs181xDIttxupxQK/NixzM3ccshmAynb+oOm3RSuUd3JbZTEqBY8B4LenIecCg7fJiDANcrbVcTE7RIQEdEoLo/fp8Ex3HmGEcB12XYvJ9x+ioEgZI4xARXfO21M2VaGWQimx/jVHMMYzSA26yfAP12JZJf62OGEXtzOz8fNIDfvi5HZEwFCJQII4aU83NMH+t9iKrvXzClAOMcroD3Kxb3F8qG5xTzVZA5l1CuBv49gMb4LhdA+y+nWUy3Zw0oLloxC1z3VJINrLnHYKMjgNBaQj9Yah9XRRo732cujoilWgHkP3Ml32hQMzd60qTLTqUx6C4XSVW+32GvOptOmiHTfwDkZgRvWJdAR1timfMCEQCzExNzgL9SgDty2hOnYwDmPwA7fQDGAMdWPoDSjnUjBhNtlBKgWnMmb0P6MZe6m3nUm8dUcCg7TGwF9Kt1U7OWV2lMmZSd52IAuj9Ywhn7Hedz9AuAjEDsERBnf/ovxyg7RAgRk3gIBbcZKB4QMudYVhZskaYrkxafYNKqV1CUCh8d52+kFgDfnkwvFi9UW2zXUn4r0pnAyeUX21AuR39qJ6icn+t5DwJ/TVMT3RqaV3ge51E4Of90/13LVI0hmCj/beCQIO3DKIcv4SdwM9NtBAtAv5wzvSNXASywt1R2M39vzLcHSDww4JpnZKs+kwqHbKtWL38uNJyANpADOJNRqxeA1w6QO0TDjTtMQOqLE79iZ24XbB8or0IBs+8Ph4/0GmdW4jzrXh8K8BrjVAIzN31MNbSI53zhCVdMQPDgjRNQ0I1zcLd6hyCfcxgTR36pHIKv03maLWMyF1fzLQtGPC8RA1o+0yqXdcDms3aTEbNYH0SitLN+qQQYCtIa42S4gGsTwxVEnedLPCjrCiYvZz9LUtCXF0gXU2gWn3mLdv8tRaxTOb9UUw6g+bgYjyBWg6sQ8x9GICUqf3FqPesCOVF9EGDS/LIXf2ZIT2AYELMgvR4gzduIayRIvDUvUIrLc/yJqTCcMdtUy0bmoaDUfTfrY5AbrJCzGqKeYPPIPbyJqTpIAPN9ozFLCakX2B/osMDs8CRvM3YzK0tPQhsmiLqg9CSNx2VoAT8MUigDG8d1kKKrFtAnQOtPWqsKD6uPIKdYvgW7OFiAr3YYhethoP6YDRNw/pQ4sF0QAz7PfpRRHyfiHcI+l1JIZ3e6UyjoMQtVFhF+Ntop/ISA/1WTiw1jPZKxC2KHR9c9WmQLS09uNyYTHq94l3DA7nMSm1zRNBdV6jVoKnsvdCZvf7t/2IJTExS0H3wftEKh/n6oli9xJ1gYpy6xkIfTaggiR2f9Oayz52inVXseyo/PQBgNeKfXOpMC43ccl6MKR1PfYH9w+CG3Yj5xFyWg73AFuxE/CqDk+EG8kUhxOhGTT+A+EPyLHTNFIqJfHy9mALqTQkcvr0Dwvp94H0ULNq9caqh9JDN6I1MnZiNyY0M9QxAWY2FNVH1PkCvrAWNBgAKNTuwPg0+CZzVznUC9f10dY1TDea1D/UP7ZJDfA0y9V8NMI1JDWUNmw0/tVKNjoDW9SwNfI03tQyND/X5inZsioS61Rl1OkMJ9bCN+kPwjakNVvUyja61qI0GAPxDNgBJjW6VvbWtDY4NYkM+Nfnwag1lNbZ1kZXc9b4NEI189Wo1SkOCmML1HnWi9RZDarXBQ7NAiMi2Q0UNow1KVeuB3w2E9c5DFQ2uQzyNNQ1mQ7qNd7V1UClDQygUjRoNRvVYVSpkpQ02Nb8Nl5VGQ791bkM6jR5DXkM+Q6iENXXCNSoAokNDtfi1wUP6oFJDMkNTtTz1UUP+DS51Kw1CmLwAKkOMnQKNVbXlQ+QSz7VxDZlDtUM5Q3CNb7hfdZUN1o3ajUVD5g0lQ331hTQGBAH9xo2jkdVDGdWrQ7pDPw0GQ/BkBUMxjU+VbUMVdQJDhnW+QzV1MHUODWZ12Y25DTzWzSghlWFDmHUvVcaNuHVqNe6NJ7AzQ/6NWDWR9c1130M1KJR1/PURjYe1mo26DQwN9A0p9RK1HHW/IrINrjX7DfyN7A2MjSeq9gSwwzFD8MPCDUn1SMPT9QYNf/X0NWhVqo1qdbsNWMOzNQ9DDQ1PQ/T1npVFoL1Dzg34tWMeg0O/QxO14UNyQ5VDSZXRQwENrnVTQ7SNQ3WqQ2u1izVjHn5kMA27tSsNF0MOQ3pD9UPXQ8r120OYwzM1N/X2jaVDfoV46aBessPFDR+e2UOXQ7lDG0NK9bdDNo2xjd4t8Y31jUzD3kNO9UJDnpXOMW0NgUP9Q3u+gjjjtZz1fMMOdaGN4PVCwxNDCmQDdXSNiUNzQ8c1cqpIXvrDmUNiZFcNJsP5dQCNDw0aw5r1s0MzDfND8tCd6ALDO7UGwzgAUcNWNTHDm0PmwztDvo0JNSPVoG329c2Nz0OdQ1YAAAAis2DOw31DD26+gEANoUNwVaiaUZVTvALDtf5yADO0Xw1gw2pDG/VfRpduPsMdPCEoRuUrDZcNOcPrQ/2VYLBxw8iNCcM4DYcNa5VvXYjuS0MplY7wbVXRwxPDm0NTw0iNso2Mw4mN9sMvQz+V/kMfQy7DjwBaqv9wQ0NwQiNDWl3GjdyoKZWZw9uwPcOSwxv1tdiYAbLVpjVNcK/1yM3rw05DpsMI9UFwEdDTw6ZDe0Naw4yNmVbunF90S0Mfw7m1e/XGwxvDSvWR9k1DJkPuQ62NpcPWDeXDWTXdQ+9D7vUbVf3wb548w/I14YqIVaiaAsOPbmjotY0JQ+H1T8OCjdc20c2sjTAIyVXEw0rD4TV5Q5E1DjVajerDxtUr9cCNycM4I7s4tCMqjW7EGcUwbYrDV0MsIwERbCNqw3TDoVW7w2XDLMPUgF6VWCN4jUJ16aTWdfgjFTXeDd7DCkN+w7FDV7jxQ8EN9I0hwz41KiMyw1pDdkPnQ0bDIiO5w2bDiCMtQ7tDWQ04wwGNRiO6gHhwUvVkDWdDrnUKw1QNTCPhdX/D+cMcI2NVKCNWDRiN6CO9tWI1SiPHNYaA67AXw17Do0M3w9ojGJQdKHojEw0GIzwj6bWi8Kl1EcM1QxYjXiOiI7/DLkM2I4VDvo3FQyAjizWRI3rDpiMZQ1kjFo3eI4r1viMFI3dDlPVWw42NnkOPQ3bDTQ1YjdSAwjWmddgjuvVGYZTeHg1hQ4o1/MN+DRKq/sNxQ4HD4sNJw44j+LVs9UiB6cO5ceY1HiPZI9/DysNiI4i4W8PsI1IjnCOaw9wj0yNomHJhVXhaQ8tDVSN1Q8wjeSMVDRsjkiOAjdIjgSMJjbIjzQ3MAJXDPUO1wxzDeNAFcYyYMJieDdJD+vWtw9h1B9XXnsJomUOiw4/DYvXvNXU1S6ztUYPDEXhZgJyEz7CeIysjZyP8ZHmk28NmDfYj5kOGIzMjlHoQo64jVFX/jJ/wJyNrQz/DSKMSI9GNFsO0tbsj88P4te8jEBRpQxK1eKNCI/LDyyPjw0SjX3XIo5sj1yMldbcjNsN7w+0jDsPyI8xA7MMdDeyJxiRhINEjQyOaI2XV8SPdwxQjTY1UI7kNiggD+pkj0I2WI3AjdSOAI6ij2MPoo6kjgZWGMb72p1DpQ+4jo8MhNQt1qyPnI5b19SNko40jxcPU9XcjaCNyI0tViiOfQ+WV4IAx9Woj6HW+9WI4/vXGjUH1IfU0jSCjDI2QwwawdEHs5PZVAXWaDV/DKMNGQ0gN4g3g1af1c/XGDUw17fXxw9sjicPgw3f1yg1Bo0uSUtW7CMQNNkNhozv1jCMIDRfVeg0/9RTDDA0Z9SYN/iOsDQ4jEMN4DV01ZqkD9QiUQ/XuYoPD/A2FozJ1og36DbGjqA3xo9INlaNbI9f1qaMR9XWjzqMpgFv1FSMFo+qNkaNT9XQNv/Xlo631/aMco4Ojc8Ppo331LqMhQ6nV+iTp1cIjXiNFo1/1JaPIDd2jkg29o77DLjCNw1WjxSMUo6uj+jXro9ANE6OwDeaN8A0do7QNYg3ydWWjqMMLo4mjDSN7DVwjUyO1o/f1uNXcAEX43A06bBX1raNENSDDmdXTo52jpaNHo4YNVMMJo/rVF6PAI1ejuLWBo8MATINanDwNLaMGow+jWg3QYy+jXaMT9fBjynXn9V+jlqM/ozsjf6PXo4BjttW4pfej0Q34Y3Oj9HXRo2+jcGOUw6RjiGNINUuj1aMWDVyjLSO2wx1DWTWVw07DAUN1w2YkYKX0Y58jgyPFjTckAsNsiPz1UwgU1f6jGKMeIQ0Q4USx9RHQiyOPo4SjpqP9lek8fiMDo7xj+0MRDZLArqMnQyF4lSNTo6F1qqOpDQZjFqMFw5bD1qPWwwJjPKOCQwfD/KNhI06jw7XAUFGUYqOyQxKjB9WKQwkjb7UqY9qjffD8aIaNSqMXDcajZvUso9Yj6qPQbWijJmO/1Q+1UWMMY/fDY8M2Y/FjaqMoo61D/GPtQ/vDFcPyI0owLyNCo2bQ1XHAUP5jI0ORQ3Ej40M6I5GESSNBw5QjoKNVtZVjeHzRY4yj1SO5I7HDeWN2I5qjKWPvNdVxkWOdY3CjTKPZY3pjecMOY1WjRcO5gCXDQSPMww8jIAAwdUfDPSOdDekyVDjRI/9DfyOJlUDDUgDkI/ojwcO4w2N1ZhFcOC6N1MPidYwjZyMwY4ejxGMcY2c16MO0wzxjl6PUY2hjI6NrlaksZ2OEwzsw7aM6DcWjyMPMY8f1aMOqdUmjM8Mpo1p1BWOtI0JjvbWOoyfDFVABOmil0mO8w+KjsSODw8FjWFXAozKjEsOtYxBVAToQ9KNjkyjwo8yjk2MJY31jRSMoY69jDo3w44llFUME46I4ROMTY4ijU2OJYzUNs2Ovlc0jhWO8ox5jzAB9tatj4SMuDV6FT7Vuo14NMSO1Y2jjUqOh9VjjlOPaw0F4hSijtXTjMCMqozlj+SMs4+TjyWMlI6ljLcXy4xljmUPdY1YjuWPso8mjASNNI2V13KP3Ix0jzADZNbDj4mNP8hhkQ0OualGVdrKstXt6MUaZQ5o1UuNpo29jAGP4DbHkOaM4owpVl2PKo7ujz6Nkw7Oj76NA4yp1ajVPY0bjxmMgI+hjsoihDh0IAsMmqtR10PWKw3uj1ICsY9oNx6NGDQpVj2Og47KNcePvY50NvQR+48njSqqp465VukMZ4wZVB6Mxo3dj86PUw/nj36MojZDjgmNFY1k12TV8495jOqPSw00wQ0NVNX71NTUB9eCjvqNGoxMjkw3S43jDCO7aVL010bXrNUHjGo1ejdKNhSOXtQNjGuPA9U8EGGTl43W1i+OejVGNV3Ut46a1U+NjdVvj9pa1tTG1MWPdY4jDpKOOY+SjJ+M7dfCkRjU745fj4+PvdTfjh+MUY0CND+Ob40/j4KWDDT61e+MNtQfj3o1f48fjnuNU40F4f+PCSS/jC+NX4+/jy+PGQ7YjhcMb47kNM+P/48aNbLXQIyUN3w0f46ATd+Mo9ahjkBONeF9uYeEX43ATb+O4E4gTzUOr4/fjEBMy4yQT2H394wATu+PwE1QTIBMr40fjZbU/42gTpBPTcuQTiLWUE5dDeBOcE2AT3BP0E9PjfBOU3vPjghNrw/vjXI2iEwQTAPVEEwwTbeV3xLATshNp4zkjIhNIE7QThBM8ExtVZ+MUqBoTn8NV4yIjOhM0E1wTdo0qE3jD0BNk7pgTgBNsE8IT1BNII/ljJuOoI8Ej9qMgAB6VuI09447Ee77kcNVj9nWo41oj9WMhY7ojE+MpI3sjfoXNMeEOFmNmI0sjeuO2Y/lD02NGYy9jEhNSwwETUQoK4zsADOMmo0zjpOOG42DjxuPOYxzjUOMd435DpWNiY68jEmMk9S6QQRMRQ/JDkqNhE9Kjh2MtY0lDgo0/FDcGUwi4Y3LDchOM4z4jKuNk42vjv6MZE6ljgPTdEzkT6ZVJE8rjKROq405jc2M2o2bjdqNLY5XDvhNw45TQGCncw0jjnsMz+METMQJjQ+J1SmPjI9NDHuO9w0Nj3qQ+FP7jndVaY30ThOPjY/kTgxMVDfZj8xM59aMT5xNtY5aIlQS0o9L1e0raY2NjMxMk43/DLxPDE/dDbeNuYyEjDPU1w9UT5WOU0HFl7sNfI8ND+xNNE0FjEuMiw01jkyNjE+81I/Bpw1MTpQkPE3FjQJNDE0UTQCPq4zYTizVxZeUj8RNWY4kTpyNPE+ajrxNWo4sTLmOc4+5jxWPMAN1D3SP84/e1RQnatQMjcFWEI1GVxCNANaQjcAgHY8kjR2PRE2hRMKKysXQjgiOwoxGjAxO1I6kNJKOf40oT9MNUY1iTCo18I7KTAiNUdQqTHL1K40STFQ2qk/gTM2MyIysTFuPLY9B1XJN+EwHweHxVlU3DnsPbYz0TOHVYo/tjkuNtE7KjXnXx48skDpPpKPqjErWB4zujS+McEwx15MPsY43jVFXN42ITy6MHDTRjm+NY3H6EABPBkzpj1eMh4/9jEZMN4x+jTeMg41YTxmMWk54TqxNM9dyTilRG3WxYGqr8k7sTsmOCoH4NRxMY4xiTk+Nak4GN5ZO7CAsNAXW3E/fDeROEkwUTwJN7SoyTlGNDo3KjLZOSY1Tg8yN/E3cT9OMEkx+1sxORNSCTJJPII+4TC2NtI2yTwmNVE8fDNuM3bmQSQ6xOk+ojlfj7Eza1qJM7sMBYrRMSk+0TqmPI7o8M0ZI7k7ZDnZNu47FjM5PGk3OT/ZOgk5316+Pkkxv17zon8L2ommPc1ZljD5PrDbOTARHzk1cjMeNs4/NjtqNFk1aTi1Xd4xsTKoDPVYMxVZM+9ZbEQ+POXYPDPqOTk3v1YWO4Dd7j9aPl1WCissOQY9UjNePhk2HjkZM5k1xjWfUx4+kTw6O4U86jWaME1Rci2kokDb0TRFNPo39j+6MA4+Hjr6OMDYuj1FMU4xITvpNnAAxTBDLPpLwN1JOToyGTBGOh4zxT06NSDTPV5GPqk7PD8ZNe4xmjyYDBOhzBhFO/YyINhGOwY9mTEeNkY0hjaRMCU7RTalNggGOjBFPP9VujphOK48HjHFOZ43XjbGP6UzxTkqNno3seyGNkk1PjQlProwJSWlPWY9xTN2P14x/1FFN9o4pTHlPvk15TxeMYY4REWpx7pKX1flNSU4DjM6OyU0lT8lMh1WFTxlOeU4JTUVNggJhjQTKANQxjbFOJDSRTWeNyUyej6VNGU89jJlMkdTlTyoBwwPg1ElN4Y4qTAVO6U7djwVMGU5RTBeMaowzD4JPm43yjjyNeY3BTE76qIzsTe5N7ExFDh5MADceTx8ANk5ETkpOUo3jQG3lXE+OTd5MEo7AjQFOIuCBTt+PhU+8Tw5PptfN53xMrU3+TK0PTk4BTT5PAUy+TC5NuE6UTpuOuY31T3OMiNesTm5NeOt9uDRPDI2NDoyMNY+iAjZNREwtT1OOZsLei8yPHI+YjgJO9k6kNlyPbU5lTEVPNkz41ATonAUDTNJNdY3STypMXI6aTihPmk71TlpP9U7V1tpNwU+v44I2jU70NXLD9DX5ErLWe5L11Iw2nk81j3pMdEx71xnYnDSwTSw2rw1oTCKP0k7cNACOvk4OTK6PyjYGN96EoTO2T2bVM0/ZDOSP648t1dw1XU6zjqBOBjXEOHpNxIx8NMAjC06zTKNN/DQcsA5Pf4zDT97WVIATT4uPy01D1ZhMi08kTKtMQ02qTGNNLk5BTi2NWk16VomMbkzUTfpObTXseSFPodRojIRPNE59T4RNYU2cTe1O941Owv2gNVb8TiNNMY48TytONQ2rTylM1ows1O3UKo9hNeJNQY0qTNw2IuIZjPGPgU0sTd1NY0w9TlcPW47bTN24odUNDPyNiOCfIQDUAo+pjVNOYkx8TUfVlMNR93rX0owaTCQ3rU+dT6lic0+rTZdMLw8He8fHXE9GwMpMwo4rTxONg03uojdNh01qjUpMjnX1KOb3l49XT3dNx0w1DDdMS04XDhZMW09jTHpUAAGqwU5uTBGTiUENDgpNiOFWgrLUAmRTTHhwrDT9T81MJk/WjPGTr0ywTXQwPmFhV2cPAEwoTpFMpU9xTaVOi5D8iLpxKU+DjKlNr1XRT7TzTIFP9b8PZtRfTEA5X08RTGZOcU1mT7VMuU9L14Ayi5F1TOo1F45/TQaMtJLRctbX/05PggDPsUzpTMlNEY2Azj9N/xFmAL9Om0zdTHhPz0w9TXpUlk3aTXMJuJXB6b1OBY1NTbtMl002TzdP6jSWDDLB5o/7ThqP9E0HT8dOGQ6HTb9Ph0zzTa5XMJFmm5Ho64xPTHDNT01wz/dOco2bTyxNQU9jTwjXW02tj/hPBsFMIjtMi4yjjYuOhE7QzGdWH0+eT4WMxE3duPxOENcDTrnXX06IzKsPG02aTUNO7Uzjj6bXe0KgoCNNsM5MoJjM9k2zT6yNo07oT+ZPJ0yyT5RNc4+yT3hPPIzCTOY0F4cPDdPhUMy7TR5OaM+iTc1M6M0PTRKCysQYzhvX/E/cToNMuM+IzM9MjE5qTDDN40JWR8qrt0xnDJ1PJM8HTCdOpE0nTc9Mrk5CTdg3QkzbTsJNOiGng/AS5053TEZWenIDD9CNKVXK44pPU09jjtNNR9fY1dTMAE6kJjGPNU84zhTMXVInT/FNZU5kzecWGNekoLDPUw/0zRVN1073TrCOjM8UTtQ2Y0zIzxDO405uTFXEhOhiUKjPSQ87T6jOu0/z17tPfU1EzNNMXk5sTS75KOTHT3ZOPk4szIdMSM3GTvDPEE9szLEXjkwHTSTPI05wzkXWPM6szUjOp0+szvjN9tYNTm5OTApllu5NO06LjKJM0M8czs1OnE16TnTMXM2mCOaPxM1X1DjNTkwUz3zOqw5DTVVPjM17TgoiRIzXo7zPos8pkp1OOQ/XTqTOgUysznjNlE+3jPjMYIyvTWdMiGeZjELOqMwFjYTMwszFDJzNCZGcziLO6MxdQDjrHQLkzCyOYU7kTZLM1I1iz5jPo05YzGTP4s7VVpqiFKMvDJLNis5izYjM3Q8UzYFOlM9DjXUOkM3jT1HhpbaEzhzPhM7CzWjO8swYTzXXVcW3DSrOJM1l1umP3M64zyzOkk9DTEzPcibFV6Kr2MzazX7hOM3czKTPqs9wzJRPMk7SzEJNeE8I165MKM5SNu4g1psLj3yMNM1azAfXGOGcNvTUBw/CzZ5PnM/yz4XymqDoe5eNzM6gzdrO+s1Kz7jOxk7HjH5PA9XbgEHrt06DUeHW5swsz+bNuM5YTRbM0s7dTrJPlM9SA6Y2ZjWVjgTPE4rlSuzMew+ojDIoteFGVK+TzjKKNysSSKmMAktZL7YENKkNaswy9RcO9AC4AxQAuAO2NBADGAF+4JZWQdbIA8ADr1AAAytB1lcP5UD2ABADFgI0qzAAOgHYAKAB4AAOA7ABWAJPVg4AAgHgc0ZUUAAew2FWYAEZAr7OzlTaVqAB4AP6VqACZgPBtIjX+Qzo8IjV5NSztIjUODZACj1PAgFPULrAW1aI1wIBj9CI1omN+nCI10Jg+wC6wAHM8AMCADEgwcyI10JMy8iI1VRO8QwGwsHMaAFBzoXQAcw4NZvQ4c16VWHNNdN4TeTU+7N4TmC6gjN4TomPwYOhzCiPAgFn9fjNIc/l41HMODTO83hPAVYZC9HOYc1WNYbDEc34zYnPYAMacfjP+Q/AifjNVE2q81HPelUxMHHMjenaC9HP+Q8AM1HPQk36K9HPAVdQMknMelUpz5HNelZgulFzUc9CYwQAqc3k1ie3GcwKjNFU0TMZzsgDAgNsoOHNrE1BzkdUW1ZXDmC5g7B5zDg0OMB5zomMB4BJzaM0gANXDXHMQzZJzlcNVE5X0HnPQmOZcHnP+M0T0OHNd4/BzEow5NXk16piSc1bj8HMDaGlzhnOTADhzdYD+Q/2MOHMrY/BzCHMwddlz1XPQdeBzm3TWk8BVBXOSc22zaY3AgNH01HPL025zN1A4cwBV8nPkcwBV2XM2c5JzdXXAgI1zQFVYc1mkTgClgAQAZgAWANWwOJQcdZlodxxj7LaVBAAwVSENoACYc0RVDoIOgB6V8ABKgrEA8AAkTeFAD5W1Kg4AdwB11bBzOrBEAIdzFABoAPlA8ADDgMeVxgBvldB1xAAOgMOALYAdlc9zd7PZAAAActkAK4AoAKWA8ACxAGYA8AB1ACgAtSpxlTqwLgD8qncAWNhEVRQAkQAF9cI1h3Py3CdzM4LDgOdzLYAJ1UIGRFUrgMOAeOQCANuz27MAAPLQdRiAHgDwAIUwaABcQHgAeADwANB18KRM8wnVhbgo88OA+3OY809zp3O488YAF3MJ1c4xRFXGAHAAxgDZAFmVDoCOGIW4dwCzYCjzI8ClgDzzR3PY8zVAAvNC83cASjBEVcI1t3P3c49zx3Mvc12Vb3NpAB9zIiwjgD9zKAB/c2LzgPPA86Dz4POQ89DzsPPw8wY6dwCmkCjzFABK8wIAB3Mq8/zzePOXcwIAbMMo8wJARADo87zzx3O+84Lz+PNXc5s42vO68w6Qj3PSAM9zr3Pvc59zAgDfc5WAlvPDgP9zQPMg82Dz0gAO8zDzNZXO84jzAfPI85FV0HWL0ymNmawAAILbsw6A27PDgJXDAACS1PMXAPAAAADqxhDs81dznPORVegIyvNY8xHzGvMB8yLzkVUqAJ7zPONh86rzZ3OR8/7zzAACoyjzaPMOgBjzPvM4837zCdVL2aLz4vOS8+EA0vN+RBvzbvNj8xPz3hNT80PzUfMCAP21QfPH897zg/Nr87PzCdU1oEuVlcPwAAAAWn0A35UCAM/zlPOVwxiAsEAP8zHz5fNmdIhQ0QAA1XWAIAuHc8zs8ABoRGyg6/N3AH/zQfNL8wIAGPMAAKKZAHYA8AAeAGgATTAP84TzY/M8ANfzp/N388PzzACuc1fzA/N880QL5/MkC6PzFtUKoCHzy/OEC2rzsAsX8/LzkVXP85B1i9Pbs/AAlcORAHyq8ADV89XzwjX18xTzkHUljbEAe1UP81rzkVUYQAQLq/NMC/fzSPM7c5FVK4DIC/uzn/OMCzPzxAsgAKJAS5U3gKWAFPN1AN+zXvMaC+rzVAvaCwALFtV6CwYLRguT83ILmgtmC9eAS5Vi884AO/MDVTLzCdVGQEuVkKDkC+HzlAtz89oLvfMW1Xtzxgt2C6YL/gtngF4LzYzkQqZ1iTxFEs60HgusCxbVxPOk88wA5PNU8zTzdPMsgAzzAEBM8yzzbPPfs0jzUgu0C9zzIQu38/ILWguUBCjzsgtlC/YL/gsjwEuVKgtqC8wAjQsmC8wLzACPgEuV/fOlCxQL5QtmC7+AXgs8AIgLHJPwAKgLp5UYC1gLD4AE82XzFtXOCxLzUvMCAO4LdwA5aEuV69QrgNk1yAsOgC0LoQttCyAAMiBLlSmNHpXIC8gLAPObC6oLrQsKCwIADFhE86oLpwvP89sLFwvtC0ULIAB0C6Hz9wtaC36wS5U680QAd3Px86oASfNG8ynzZvPp879zWfPW8znzdvP581DzhfNw8/0ALvMLC0oLtAv4Cz4L0/NhCxzz13MRc/AA27N2ANDzxgDGAKWAHABk8yILYgsSC3cAQBBEVQdz0HUOlQcADSrzsx/zzACwRBcA0HWVTSuAnTXAIEuVwQu2CzULqIuki7gLtAtDCyI15wtaCyyJVQvIi2fz/guoQAMLkQAMC7GYbfNoSJzAOwtSQAML1Qs9C7ULHPNPCwxY3Qu+C70L4ouH84iLPAD0C0gLgotmCz7AXgv8iyvzXIs7C1OAkovSi9+04PPj0NyLAgAHgA0LFPMpjRTzDoB1gJB1IPPasPAAvQBwgAULNpUNgECiAHNucwb0wHNcc3Rz9g1Ycxr0kHNMANBzknNwcxXV6HNyM25zqaQocx1z3nMYc1hz9nPhc8I1eHMRi4Rz0XM5i6RzsYvkc5gjXHPFcw5ztHMccwxzmXMelcxzDXisc1xzGYucczRVqYtW025zfHPGcwJzbYvCc41zfbXSc4xQKnMDiw2LXpXyc6GLXpVKcyNz4XNelcBVzYsacwhzvOPwc4OLxnN6c9GLfbWGc8uL04umc+pzFnOFi7aw3hPWc2Fz+4smdcCA2YvHi45zSlXOc9OLrnNVjVeL+4uec7GLGYu+c1BzZ4s+c4Fze4s+cyFznYvhc5FzNFUfixFzcXObi/eLiXM5cz+LKXOvizk12nOZc7k1UHNHixbVeXMV1S1z4XM4jVhzFYvhc6VzXHO9c5JzlXMV1XVztXPoc29DWHONczB1zXNwS94T3XNVjVhL4XP9c1hzg3PDc2RLY3O+AOhzk3PEUNNz8dVBi21zHXO9c5UqtpXw8/AAi7OCALWANpUEAF+z8AA9gOJVDSq6sNSAPYDAULwA8aBAAA="))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* 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 saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
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 isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
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.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
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 resetSettings() {
if (!confirm(
`This will reset all checkbox states and other settings.\n\n` +
`Press OK if you want to continue.`)) {
return;
}
if (storage) {
var keys = [];
for (var i = 0; i < storage.length; i++) {
var key = storage.key(i);
if (key.startsWith(storagePrefix)) keys.push(key);
}
for (var key of keys) storage.removeItem(key);
}
location.reload();
}
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("markWhenChecked", settings.markWhenChecked);
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.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
setOffsetBackRotation(settings.offsetBackRotation);
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
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: "FB",
bomlayout: "left-right",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: "none",
redrawOnDrag: true,
boardRotation: 0,
offsetBackRotation: false,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: [],
netColors: {},
}
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 (settings.bommode == "netlist" && !pcbdata.nets) {
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;
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
if (highlightpin1 === "false") highlightpin1 = "none";
if (highlightpin1 === "true") highlightpin1 = "all";
setHighlightPin1(highlightpin1);
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
settings.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
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);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
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;
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
settings.netColors = JSON.parse(readStorage("netColors")) || {};
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function () {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function (eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function (eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (config.kicad_text_formatting) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
} else if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
if (txt[i][j] != '~') {
inOverbar = !inOverbar;
}
}
}
var glyph = pcbdata.font_data[txt[i][j]];
if (inOverbar) {
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
if (!lastHadOverbar) {
overbarStart[0] += text.height * 1.4 * tilt;
lastHadOverbar = true;
}
ctx.beginPath();
ctx.moveTo(...overbarStart);
ctx.lineTo(...overbarEnd);
ctx.stroke();
} else {
lastHadOverbar = false;
}
for (var line of glyph.l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var k = 1; k < line.length; k++) {
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += glyph.w * text.width;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if ("svgpath" in shape) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.lineWidth = 3 / scalefactor;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
ctx.lineWidth = 3 / scalefactor;
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 &&
(settings.highlightpin1 == "all" ||
settings.highlightpin1 == "selected" && highlight)) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
function drawTracks(canvas, layer, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineCap = "round";
var hasHole = (track) => (
'drillsize' in track &&
track.start[0] == track.end[0] &&
track.start[1] == track.end[1]);
// First draw tracks and tented vias
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (!hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
ctx.lineWidth = track.width;
ctx.beginPath();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
}
ctx.stroke();
}
}
// Second pass to draw untented vias
var style = getComputedStyle(topmostdiv);
var holeColor = style.getPropertyValue('--pad-hole-color')
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
ctx.strokeStyle = holeColor;
ctx.lineWidth = track.drillsize;
ctx.lineTo(...track.end);
ctx.stroke();
}
}
}
function drawZones(canvas, layer, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (highlight && highlightedNet != zone.net) continue;
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
if (zone.width > 0) {
ctx.lineWidth = zone.width;
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 {
if (!window.matchMedia("print").matches)
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(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);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
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);
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 + (flip && settings.offsetBackRotation ? - 180 : 0)));
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, flip) {
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 + (flip && settings.offsetBackRotation ? - 180 : 0)));
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 flip = (layerdict.layer === "B");
var bbox = applyRotation(pcbdata.edges_bbox, flip);
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;
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for (var track of pcbdata.tracks[layer]) {
if ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0 && e.button != 1) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
var flip = layerdict.layer === "B";
if (flip) {
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 + (flip && settings.offsetBackRotation ? - 180 : 0));
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist / oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function setOffsetBackRotation(value) {
settings.offsetBackRotation = value;
writeStorage("offsetBackRotation", value);
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);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
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();
if (initDone) {
populateBomTable();
}
}
function setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.footprints[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references, row) {
return function () {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function () {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
rowid: rowid,
refs: refs,
net: net
});
}
}
function updateNetColors() {
writeStorage("netColors", JSON.stringify(settings.netColors));
redrawIfInitDone();
}
function netColorChangeHandler(net) {
return (event) => {
settings.netColors[net] = event.target.value;
updateNetColors();
}
}
function netColorRightClick(net) {
return (event) => {
if (event.button == 2) {
event.preventDefault();
event.stopPropagation();
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
event.target.value = defaultNetColor;
delete settings.netColors[net];
updateNetColors();
}
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.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, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === 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 = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
}
return 0;
}
}
if (settings.bommode == "netlist") {
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
}));
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
return 0;
}));
} else {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
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) {
expandedTable.push([ref]);
}
}
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);
var color = settings.netColors[netname] || defaultNetColor;
td = document.createElement("TD");
var colorBox = document.createElement("INPUT");
colorBox.type = "color";
colorBox.value = color;
colorBox.onchange = netColorChangeHandler(netname);
colorBox.onmouseup = netColorRightClick(netname);
colorBox.oncontextmenu = (e) => e.preventDefault();
td.appendChild(colorBox);
td.classList.add("color-column");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
var output = new Array();
for (let item of valueSet) {
const visible = highlightFilter(String(item));
if (typeof item === 'string' && item.match(urlRegex)) {
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
} else {
output.push(visible);
}
}
td.innerHTML = output.join(", ");
tr.appendChild(td);
}
});
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
footprintIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
EventHandler.emitEvent(
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
filter: filter,
reflookup: reflookup,
checkboxes: settings.checkboxes,
bommode: settings.bommode,
});
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0,
fp_b = 0,
pads_f = 0,
pads_b = 0,
pads_th = 0;
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&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("topmostdiv").style.height = "";
document.getElementById("topmostdiv").style.display = "block";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
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("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
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");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
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 populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
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 = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
function constrain(number, min, max) {
return Math.min(Math.max(parseInt(number), min), max);
}
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;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text") {
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft") {
settings.boardRotation += 3; // 15 degrees
}
else {
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
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));
e.preventDefault();
}
}
}
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";
}
function topToggle() {
var top = document.getElementById("top");
var toptoggle = document.getElementById("toptoggle");
if (top.style.display === "none") {
top.style.display = "flex";
toptoggle.classList.remove("flipped");
} else {
top.style.display = "none";
toptoggle.classList.add("flipped");
}
}
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;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// 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);
///////////////////////////////////////////////
///////////////////////////////////////////////
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
// for(var tr of bom.childNodes) {
// tr.onclick = tr.onmousemove;
// tr.onmousemove = null;
// };
// });
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div id="fileinfodiv">
<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 id="bomcontrols">
<div class="hideonprint menu">
<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="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
Highlight first pin
<form id="highlightpin1">
<div class="flexbox">
<label>
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
None
</label>
<label>
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
All
</label>
<label>
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
Selected
</label>
</div>
</form>
</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">
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
Offset back rotation
</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">Mark when checked</div>
<div id="markWhenCheckedContainer"></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>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint">
<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">
<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">
<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">
<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">
<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>
<button class="savebtn" onclick="resetSettings()">Reset</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="topdivider">
<div class="hideonprint">
<div id="toptoggle" onclick="topToggle()"></div>
</div>
</div>
<div id="bot" class="split" style="flex: 1 1">
<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="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<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>