Skip to content
Snippets Groups Projects
Select Git revision
  • 4a21412b85f2d2c3fe4b7a5e0d10084b013e3fc2
  • main default protected
2 results

RP2040-VCO-ibom-circuit.html

Blame
  • RP2040-VCO-ibom-global.html 294.38 KiB
    <!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: 10px 10px 10px 0px;
    }
    
    .dark .button-container {
      filter: invert(1);
    }
    
    .button-container button {
      background-size: 32px 32px;
      background-position: 5px 5px;
      background-repeat: no-repeat;
    }
    
    @media print {
      .hideonprint {
        display: none;
      }
    }
    
    canvas {
      cursor: crosshair;
    }
    
    canvas:active {
      cursor: grabbing;
    }
    
    .fileinfo {
      width: 100%;
      max-width: 1000px;
      border: none;
      padding: 5px;
    }
    
    .fileinfo .title {
      font-size: 20pt;
      font-weight: bold;
    }
    
    .fileinfo td {
      overflow: hidden;
      white-space: nowrap;
      max-width: 1px;
      width: 50%;
      text-overflow: ellipsis;
    }
    
    .bom {
      border-collapse: collapse;
      font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
      font-size: 10pt;
      table-layout: fixed;
      width: 100%;
      margin-top: 1px;
      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: 10px 10px 10px 0px;
    }
    
    .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 {
      width: 100%;
      height: 100%;
      background-color: white;
      transition: background-color 0.3s;
    }
    
    #top {
      height: 78px;
      border-bottom: 2px solid black;
    }
    
    .dark #top {
      border-bottom: 2px solid #ccc;
    }
    
    #dbg {
      display: block;
    }
    
    ::-webkit-scrollbar {
      width: 8px;
    }
    
    ::-webkit-scrollbar-track {
      background: #aaa;
    }
    
    ::-webkit-scrollbar-thumb {
      background: #666;
      border-radius: 3px;
    }
    
    ::-webkit-scrollbar-thumb:hover {
      background: #555;
    }
    
    .slider {
      -webkit-appearance: none;
      width: 100%;
      margin: 3px 0;
      padding: 0;
      outline: none;
      opacity: 0.7;
      -webkit-transition: .2s;
      transition: opacity .2s;
      border-radius: 3px;
    }
    
    .slider:hover {
      opacity: 1;
    }
    
    .slider:focus {
      outline: none;
    }
    
    .slider::-webkit-slider-runnable-track {
      -webkit-appearance: none;
      width: 100%;
      height: 8px;
      background: #d3d3d3;
      border-radius: 3px;
      border: none;
    }
    
    .slider::-webkit-slider-thumb {
      -webkit-appearance: none;
      width: 15px;
      height: 15px;
      border-radius: 50%;
      background: #0a0;
      cursor: pointer;
      margin-top: -4px;
    }
    
    .dark .slider::-webkit-slider-thumb {
      background: #3d3;
    }
    
    .slider::-moz-range-thumb {
      width: 15px;
      height: 15px;
      border-radius: 50%;
      background: #0a0;
      cursor: pointer;
    }
    
    .slider::-moz-range-track {
      height: 8px;
      background: #d3d3d3;
      border-radius: 3px;
    }
    
    .dark .slider::-moz-range-thumb {
      background: #3d3;
    }
    
    .slider::-ms-track {
      width: 100%;
      height: 8px;
      border-width: 3px 0;
      background: transparent;
      border-color: transparent;
      color: transparent;
      transition: opacity .2s;
    }
    
    .slider::-ms-fill-lower {
      background: #d3d3d3;
      border: none;
      border-radius: 3px;
    }
    
    .slider::-ms-fill-upper {
      background: #d3d3d3;
      border: none;
      border-radius: 3px;
    }
    
    .slider::-ms-thumb {
      width: 15px;
      height: 15px;
      border-radius: 50%;
      background: #0a0;
      cursor: pointer;
      margin: 0;
    }
    
    .shameless-plug {
      font-size: 0.8em;
      text-align: center;
      display: block;
    }
    
    a {
      color: #0278a4;
    }
    
    .dark a {
      color: #00b9fd;
    }
    
    #frontcanvas,
    #backcanvas {
      touch-action: none;
    }
    
    .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;
    }
    
    
      </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": false, "redraw_on_drag": true, "board_rotation": 0.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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r7Ev+Sx6rE0v/gEir8Mt8HdeSZ/AFKxirTcslKxQrZStJS+Oz0OSha+lrz0s2TK7FrM0SK7lr7cveBNBr+qsJa/vLt6v8a+1zjKtAa4urjiu9ay2YdM3vSxuzpyvDa9xrmmvdS0lrk2uqK3ZrYMsOa+fLzmvwq9grjQA1a/orUqu/xOir+ytyq+Qr1kv5C5GrCkvRq91rYSuf+b/E2qtSK9hr+WvFS2Cr2msMa1trzMvzyzNrh6sUY0yML2vWq2SrwWsTK3Frn2ulS3xrhGs2a1Cr9msaK6srWiviCydrkquQZbsr34ukK9drxyufC3iruMtRq1tLhKuOKwhl/yvjizar4Ov9hCNrPGsbazDrWauBKygreauA63Vr0MgSK4CrF6vjCxZrMyu0q79rtmvLc7triOsHa8jrbICo682LfExVsBdrigtY69ireQtKq3drqqsPa7NriAuXZRIwr2t5axzrBWtfa9zrsOuriyzLxGsGa/0Lz2XLuKzr5OsPKxDrH2vTKxPLm2va6wNLO2uny3tr6Ss1ixfTiKt4K8irL940DMoJbYuLS75ry0uta2tLnNjRK11riuurUEWSY4Qe6xQrt3PLa9ErVOvra1zrxWtHy/izuuvyayyr3uoc4GHrCssxfGMrUetra1Jrluu067WrpWtqK26rFWsZKywAmzMvi7fLb4stKirqPIgS66jLEkvoyzdr6MQcq9/LBOuXK4vLMsug7tXrb9Bpy/7Laus5M1TL2Is0y5AreIuiy4KzhYv561Nriev6a57L8Ys7S4JMZQl+y0rL7Osqy1nLg+s5y8PrXIv4i2LLBcvW6/urAOt/y0vLUNrucHNuPetL6+9r/Mtqy9pr9sswK7nLkcugi9HLE+sxi9PrOotz6/uEWSCL6+TLy+vBy6vrVovayxHLcCv5y3iYj+tIawTLicuOK4JMaJAf6wHL1GsX67bLV+shi+vrvwsiy9/zqos763TrcmvP62Xzr+sFDN6Up+uf6+frK+uX64LL4cvCyyPrKBvb60Abe6vzq/vrSvNgG14zR+u1gmvLpvM8y33r3+tEG9ArHIsb63TLgBt/8/HrIBtsy3Qbq1AMGwlSeBvQG+prmcvsG2vrN+tcG3nL9+toG8AbvOv8C3brAutwq1or59Piq+5r9Bv2aoK1axSNa5dr3uvNy4qrgWv+67ar5yslCzQb+uv6K1DtAPPRa5nrphsxKzBrGuvQ699rsmsmqwzraWtB6xwdLsWYuKMrkev2G9HrOeudKy4b1mspK2VrMKvF647rUXM+sy7rtWveXdLsn4veayQr+UDyq7qgOOsYs3jrNiu0K3YrCutM62uN8RvZ86Drzevh1HarMeu568EbyWt9K9NryGuWGwlzBHUFGxLzbOtaSwEbnOtlG1rr6Bv9q4srKhuVa/Pz2wtua3fL53MJmBE6nuuoczW1was6QtlrhwBa6HVAJhsU60/IgesJy7Pr1yvfVBgmExs9i5AwwPPFGzRLZTM/62HL1ouVsx3zXfNLgNwbchv39O0bAGumq3rrM+v/y2sNgxtf7iAr6xt4800bnishy3bLCBvSG2UzH/NHG7IbqBunGwoblxsv6wbr7LRDG77rDxtZ68CrLxvwG5rLKsufGz3z3xvb678bVBsF67brQquOayKrE0ux8wAA8pFz3Eveq/0b9vMIi7WEMquNywhL9LDmKywrT3N9aHzz8xsH6+4LHxIAylJLqagbG/PMWxtKi1ArUhucG0gbZBuw8x0zGOy8G9mr7suYG8KLjCtCiiRUDJtjQEybIdQOG4UkHBs2i37z3JupM7ybesv8m0/rFhtXG0vL1IuEmxIrLvPjs/fIspt/C7/rOIu36wAbchuUGyVrk+v/a9UbapvPC6cLzrjIi9qb7cu6m//rMpv/69yLY+sP64ibApuqmwCbVIv4Bf1MdpsYs67z+PNSm+DztgDX6xybrJtcmzrLppt8G4ob0KtpK+6rJevaK1NLFes5K3EbR0gnuBLrpiuKC2SbFCuZg1YrAeut616bCmt9cxNgkE3p67ZLYJuSay0b+ktW62cbNmsXG0nrw4vjeie4risNs5WbkOsW6zWbeesem9trfOvKG8KrSOuiq1fTMRtJy00AU1JEm01rUusKq77rJyty69kbhOtha8JroiRvC6rr/hvZ69WbRWu9q3WbOusWmzUrScsSJCubhRs6qzAbjktOGzTr5Rs86/Dr/OsDm4LroqvJmxKr9BsoaE/LtetXa9LrlAuy6/Yb1JtCa1obAgxV80ebb2snmymrZ5ux61ubChsNm4KbFqu/m6Tre4sm68mrO8vAW60bcevKm3oznRs3m6obNjPn07gr00tbKwaA9UzelC+bBhsta43rxhsVKylLFytFm4frc6wAICtgvhuIS6wb8FtQ6+ebbRtgW+4b/xvFm0IbuirhOrgbtht+GxTrJRuBG5ubs6u763HLqFuom4ObE0tD7Q+bQhteub3QehuKC4Rb/ms4qyRbyUv9i4WblpsNq44rIDKkSwkbS2t0W2ubGmsCW7yrF5vCWzmrVRt7m2jrArXaW/UbpvODa3xbLJuja4VrRlvMWz2bKFthG/GbERtcSywAOJsi6xxbMOBcHcMbb9NZm5JLK0t5m/Szsks0K1+bNRv0G9AI/lvh65YQYCuZG80bCFtdm8Zb25ufK6lrbFuH6z0q6wytm9QoQKtVm8lbpvSJK0JbaVsuq4Xr5WuQy5EbkXPl61JbcE1HSWUSE5uXa1ObqRs4q7Ob5Ku5c2pb5lslmw70vzP/m+2b5usvK4lr3Ztmmwnru5tE631zEuyUQHcrsFucqwVbjFsgWyVbfxuiW/tr6FtVa/ebmhvNM/zo7I6NW/Jb1aB+a6sbq0vKWx1roDOdW+Nbm1sxiaui38C6W1RLGTP8WxubTltIW/TrXyuM6yxrSctbWwtrLVuNK3YbFOurawZb91tDW6lbS1tuW/brCZuRG5fTuJuV67kru90UKARbe1s+68RbrcszG6brZytZG+Rb6lvsWxRjBbQWSKnLPFt6W7Mb1XOnm/NbiFugWy5bDKtT6xRbGqt1K9jbtFs3W08bf1uFWw9bJNsjW65b5VvhG5VbnlsgAAAAkntzAABqENupm+zzBRyx5C+bJJv3cxrzFJvhWyDzZhv0KzSbKvMQgqMIQCCA89xIEpuxhPUL0pvsm3qbyBvym34A8PN8m5CrSesd64czhBTvqgdbuPM6m2rbIZulAGGbmtuRm5ez1PN62xgbFFuG24LbB1ix5MYL9psU646bpBuWi7sbf+ve28cbqBvRm8hbZNtjW+3rghs3G4Msbtvc8wGb5tssm+rbBptD65ybm+uj63Wz4+uk25lbztsO8ywIUdsS8x7byNte21rLzpv+23CbbpvyG+nby1sO6xzbkXOSWxtbdVunvbJbeyuS68kb2OutW7jrpytzG6dbi5vdW0e9Olt9W+1bd1sM2wDbzlvM2yHbwiu5GwBND7292w0bM1t023NbnZuCWxNrJlvHy8ibRevs2y5rF9PRG9hbrut5G9j908xyW7FL9etEWwFriNukWxFbnduPawlzmWv4uH+bX1u8W8jbFKvq60TbQRvD2zGb4FsU20OrEWtitdBbFEsxa/3b9lvU6wtbi9ulWyJbwNtdG4mbO3PVy5Db2gmsgF3eAasmK5aY9esr3SFbodAbiFSb59ueGy/eJ8gMVCtLeOR5W7NbhUsD64tbpNtv2+jbLKswO6gYKrO4Owlbjyv2W4Q7QDt/G42bFQuUTNg7FCtUO+4rs9sEO8xzj1uO26Q7w4vMOxDUrDtpM+w7mxsOGwVr3Dv9q4w7qGsaYER+g3NsO/1bxbO6gOI7RGsV26DbVdsyAD5bKKvpZDtbmKst2zLrbVt2W6jb5hu8OxULpsQLpKubBjtJW0/bC9sEa8A7plvk28Y7BuunEWY7fdsWO+ubg9vjazY7QNus2+5ba9uHayAAmzN9G1A7O8Mgbhm4aSD726ukEkvGNf+L3aioGHJLkVtWmyrz/rJobhIrLBt/26I7dDuhm28b4Zu2i87LQdtPWxlbBtvh26KAITtcyyk76ctpO9BrEJvEG3sbxdt364HbDtsSO4KbzttJO0nE8suiG/I7hBtwG9U7fttay66bqdvumyPbGdtFO6OAJTtmy2U7vesVO88bOxuZO1CbRpt9O0s4eTs8O6Abixv9sy07//xQGx07bBtdO0XbvTtb66XbizuNO07bwzvBO7MUFCjtO5M74JvTO1bbWTs228nb5Bv7Ow07yjugO2hb26aRG5szNdt4m3BN2WbhdnNuEutIQhJLS+Ya88M68FAwIHObaNvLO9cbmDtZUD87vWDnO6479NtWO4zbCduIGxGbdzva2w87Spv5O2ZbAhsrOwlz3q7a2FiE4ztn64BbMhuQmyQbuzsp2ws7jztw64U7uLt9c/i7kH4n69xzqTvwu7c7ocszO+S7sCvzO2bzrss0u007xzve2phQMyYbO/pbbLuvG7M7pLvGm/U7mLtLOzi7kLvaCQy7uD5MG/8zLLvI2xbb+pu+24abkrvcu2nbgzu0u/K7AE3fO7JuIrusu06bGtsum3s7/Ttl23q7/Lt0u80zirvGu0S7+Bsku0nb7LvXOxK7rrsl21a7BztEa/q7LKtGu2z8Jrtqu3Hbltulszc7FruUuzy7l5t+u3w7wFhImHwAQbtwW567ZLs1OxS79zveu9S7TGtHO3a7XzvQu3dyONsS86q7Sbuou267YbseuyW7XrtUuzK7HRvPO2Jbx7NvO+tbnzuugACUNevhOx6wEkun3Y3rd7BFG5kb8TvemwGzLbvd68y75Tv4208rGTvuu5y7czuWu1W7vLs7m2PbstsG6zXoUUzKu2izRbv4O4/zkhvIu+8bFbt1OxQbmbt6a9m7BrtB7n+ITLuFuyO799sE21s7pbsay5O72rvTu1G7S9sqm6Q7ztvHu+9qd0CJu+u7sBvXu9bbEbvpuzO70bu2u0e7S7uQG067Yhs0Ow4bVTs7O1y797u6uzGbQzs5u827243cW2e7EzujuyybkHvmu7U7Urt7u9W7vruAe0vLr7uMGx+7HDsbu9s7mHtpu+i7Gbu4e3y7h7sEezXo6iKwu8O7qHsXu/ULGHtbu9k7cptRm/u7ZVsr2xVbTmtmc5EbO3OBOwLbKgJlwPhbcluJCYIgm0CAutZbsQCKkDM4c3zCO1Ur6DsLGwa7tyTIQEJ1xHsuuyHKXDvke9B7kbuwe8HbJDsQuyyrxVgjOuuscLvBu8GbGrscu6m7+nt/uw+7tjuem8+7Artme3nAyHvMG+e7xbvx25q7ids7u9h7GLuzuwe7LnsIe9oJbnt/Ziu7grNruwQbRptQe1O7BnsDO3B7Mbsmy1BjsdQP0unr0Xvaez57tns9O/Z7lHv/u4+7/Bth26F7rjOpe5p7oHv0W8m73Ttau1V7OruJe8Hb8Htqe2QCZcAiG0x7xLviG2a77Htiu7u7gXsAe7R7GqvNe9fbSIsVe6K7nXu+eyi7OTs8G9R7Wbshe017inxie1FrKHvte2ZrWHtxe3e7CXvWu0l7+HsDe/N778gge3FbmXsde6t7envxew57hnv629t7r+vX8Cy0PnMje6a7x3tde7+7+XuOeww7l3vPS4N782yMe0t7zrtHe4XbJ3vre2d79XsXe/17KXsrFJ3WWnu/e7Ara3u1ezB7QPuyu8V7Brt0sYl07+t3e1Z70GvZexO7dnune89753sCq947INv+S687bQBOAJ4AP7CeAHfTZgAEAGYAl9BRcwAACkTKoQDrQDzb59MYmwuS/xwEAOuAAR4sAB8Au4AoAHgAwJwcALYAhrMgnPyARfVkKzQAZCsCAJfAmADIwJgA8KCuYnALfPt306gAKYBHUIezWSsOCJdQtjP1i3xAWvvn04kL4lDs2LYzMY2bs+r7m+pBIJdQ6vtTS3dK6vsvi2yAevtYW++7Rvvg21UAEGnq+87rDlgOHkdQtjPDmzoezvsSCwkAXvvq+5vb/MBB+z77Ovt2wJb7PvsG+4XAUfuX01NLwNhR+9Xbrvvq2FFzvvsYEFr7dYtVAGOzRvviC4kLmka5+8LrZayZ+xsrX3Rh+9FzVQCYcFFzBvtfWFFzL4vL4IezkXOb2wyA5fvHc7IA5fsJ+6MASftYW/Cg5fub6gm7SfvHa/yIrft2+wC47NiN+x77FHDj+9orx3M0wFr7OitVAI2zRvu8S9n7VfvcS1NLpdhR+16ri/seQFv79YvPElv7+ftd+9P72wvHc4+wUfu9G1UAUFJx+5ib2Jtt+4IeXNu827P7D/u7c4dzx3Ox+9P7mzOz+2H7ATuV+53AUfswy9n7AcAAB1NLqaAABy+LxmsAB837P/s9+z/7MY272A4edgBbgAQAlgDWAM2AUTB1QOQIbQDKHqczx/OgAKEA/DO5oLNAPbPn07T78AAHc2tAu4DwADQAaACEQKRzHbOHs0QHJAdkBxQHijPUB7QHtACkc/otsTOc20QA/xzYAOfTPNsfAFtzWQCLUMgHvPtEAEtQbQBQ/bEzPNsAAPQoAMxzIgdiBx8ci1BSByIADzGxMxibs0C6gMoHRADiB2oHpHPJqbEzFABbgB8AkXPwAAXYZADwABBA/4BgnNozPh5UB7T7kqCAumgAxXx4AHgA8ACx8ytAEAAbC7NQEAAWM20APrMmB6EAZgciALT7+9PrQKgAs0BeAAdQ60DcnpYARDP0BwQHsTOpQGEH2CuWB4LYNgehMfYHZgCOB/AAzgcQAK4H7geeB94H0QB+BxuAAQerC20Ax2smB+kHUXOZBzMA2Qd2Bw4HHxwFBy4HOepuB2/cHgdeBz4HFQdVB/QH3Acks9sL8ABgnAdz59PwAAicGJtbCwUHkXMYmyeAkwcHc9xLHwC0+5umIwCbQJbAW3MInPQHMgcks7mg9QcWB1YHzQdcAq0HTgcdBxBAXQcYED0HZQe+B/4HgQciAMLrIQehAEQAJAeNB9YHtgcnB3kHbQeFB2N+lwdkANcHfQd3B9UHDwfGBySzm6YAAIJbc+NAHwDcS/AAGwsYm9xLm0DZIPQHwQd7B8QHHwATB0cHHwe5B/kHPwdFYn8HAIflB0CH9Ac7M08HLwcYh28Hxwc4h98HHQdbQASHpQeAh5UH9wcsAFtA/DPn02oHlgcUAGgAGJCjB9yeLuS0+8QAsfNgAJKgcDPwAFyHPIf0+5QYPQc823AzlPu7gM6+NQc6MiEH5IciAJiHWQfYh6cH7QdFB/iHyCCEh7cHTIfAhywA8vupB3HABweUhxqHXwdnB9qHFwclB70HRIcGh1wHQweHsxCHUId8S7CH8IeIhx4QXAe7B4wHzwevB1iHOQeah3iHdIe6hwyH9ocDB20AFECEB6EH5gfmh4GHlodah8UH3Qdhh/qHEYciAAoA/DM2QGaHAYctBwmHeIc2h8mHdoeph8yHIAB8APwz0urZh+qH8Ye4h+cHoQCXB6EAeof9ByWHwQD8M1sHzcDJm/CHnNvn05tANADwAC4gaAA6oD0HtPtW+h4HXAeK/MqH/odVh7mHNYfahyGHgUCNh8SHkYdKhySzlODoh6qHcYfThzSHs4e3gPSHRYdNh4aHIADOQJmHzkCVh00HFoczh0mHVwcph/uHpHOyAPwz/iCnh+8H1Ydbh5eHDYfXh4uHIgAaQNGHj4dUh0GHtYf1hwuHDofSBz6HIABfAiqHF9Mbh58HF4c6h/OH74dAR5+Hmgcks+yHkgech9yHt4C8h32wAodEAEKHIodeAGKHaEcFB95y0oeyh74ePJ7SB6CHvofgR7YzkEfUh1aHvwehh3uHH4csAAyAhAc/h+eHL4edB7aHNwc3h9IHpIfDBzMHGwu0+9xLW3MfACMHW3MoAFAA+ZDwAJumG4CzQGAA8ACpABsLXfNmAEYA0gfjh3sHMYfhB5EH0QexB7AA8Qcv00kH0gfLh86HkIfQhyIA7ocIh0iHUP1tABgQ34exhzmHUEccRwWHV4eMR/BHLAAwIMeHoQCRc/ZHU4eOR3RHnEeFh9xHTEcgALBeZIeTh2eHz4f+R3OHIUCAR2mH7kcgR7mgVEdqhxFHm4dRRzuHDEdBR25HIUeIRyZHrocwh3CHlkdehzZHFEegR2xHkUeJhwFHLkeZR3FHIUeoh76HoQCWAOFHT4epRxVH0Uf/B3BHNUdM0mFHFIcOR7RHrUfpR7BHrkedR+pHvof1BxEHZgBRB2Qzukf6R4kHogCkcycAdkciAIcHvkd9R/mHdYdcR4yHNUf8wNGHa4cQR71Hf4fbh7uH1Uclh5QA/DPgh/T73DwAANJoc1tzkXMAAOKwC/CHW3OyIPT7RlAAABrvWBcze3NGB06HoEeaRxkH+0d5h/+HG0fhhydHIEfIR0QAqEc8hyeAYADKAJhHxAB+B58c2jP4RxKHREeeBzKHPgCkR0YHOUcgABEHqQBwM9gAvAeWADoHHwCc29xL3Yc4R1UHNgfch9YHkofEEMRHmMfyh2RHIgAaAGyHHIcjAARHMMdwx/yHCMeKB1uAyMfih+hHdMc0AAzHcocKhyzHdUcgABsLh4AQAPAAb0ec2+CHGJvwAJFz9PsDSqJHMsfYAPLHisfYACrHDPtIM+4ewR71AN77GvuTYHr7OvsP+/r72fup++fTJvvy2LYz5vsA1NP7k0vZ+wPYtjN2+/dQtjOO+/TYPvuz+67Hl9PN+//7Tse++/mg7vt2+2H759Mh+2P7Rsfh+4v7kftBxzH74cdF+xHo5fsm+6n74gsEB6IIJfv1izn7JLN5+5X73sfiCxv7Bcel+7gg5fv7+5n7NfuZ+/X7VftN+1f7H/vRxyjrykAd+677x/sNxz37rcfe+2Kri/v1x53HQ/ulkCP72ftRx73Hm9tT+9HH3ls60PP7Ovvexyv7/QDz+xv7ccfRx9v7ZKBh+xA7lfsdx4ezp/vZ+/IeJ/tbC/WL1/tOx7f748eQwFr73Nt82677L/v7c0dzVQA9x4ezX/uu+z/7BvvAB5/7EAfFQFAHV/swB4v7x9hks0vEh7NCe5X7N8f+O/v7gcfRx5szoAeOxyAn8AevxwKLHh6LUGYA8ABk+3NHq4DuHgQAqACeB/8cvQv+HktQpQD/HKcgYQBK/EAAA=="))
    ///////////////////////////////////////////////
    
    ///////////////////////////////////////////////
    /* 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 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.getElementById("highlightpin1Checkbox").checked = 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: "default",
      bomlayout: "default",
      bommode: "grouped",
      checkboxes: [],
      checkboxStoredRefs: {},
      darkMode: false,
      highlightpin1: false,
      redrawOnDrag: true,
      boardRotation: 0,
      offsetBackRotation: false,
      renderPads: true,
      renderReferences: true,
      renderValues: true,
      renderSilkscreen: true,
      renderFabrication: true,
      renderDnpOutline: false,
      renderTracks: true,
      renderZones: true,
      columnOrder: [],
      hiddenColumns: []
    }
    
    function initDefaults() {
      settings.bomlayout = readStorage("bomlayout");
      if (settings.bomlayout === null) {
        settings.bomlayout = config.bom_view;
      }
      if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
        settings.bomlayout = config.bom_view;
      }
      settings.bommode = readStorage("bommode");
      if (settings.bommode === null) {
        settings.bommode = "grouped";
      }
      if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
        settings.bommode = "grouped";
      }
      settings.canvaslayout = readStorage("canvaslayout");
      if (settings.canvaslayout === null) {
        settings.canvaslayout = config.layer_view;
      }
      var bomCheckboxes = readStorage("bomCheckboxes");
      if (bomCheckboxes === null) {
        bomCheckboxes = config.checkboxes;
      }
      settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
      document.getElementById("bomCheckboxes").value = bomCheckboxes;
    
      settings.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);
      initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
    
      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);
    }
    
    // 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) {
              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, color, highlight) {
      ctx = canvas.getContext("2d");
      ctx.strokeStyle = color;
      ctx.lineCap = "round";
      for (var track of pcbdata.tracks[layer]) {
        if (highlight && highlightedNet != track.net) continue;
        ctx.lineWidth = track.width;
        ctx.beginPath();
        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();
      }
    }
    
    function drawZones(canvas, layer, color, highlight) {
      ctx = canvas.getContext("2d");
      ctx.strokeStyle = color;
      ctx.fillStyle = color;
      ctx.lineJoin = "round";
      for (var zone of pcbdata.zones[layer]) {
        if (!zone.path2d) {
          zone.path2d = getPolygonsPath(zone);
        }
        if (highlight && highlightedNet != zone.net) continue;
        ctx.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.renderTracks) {
        var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
        drawTracks(canvas, layer, trackColor, highlight);
      }
      if (settings.renderZones) {
        var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
        drawZones(canvas, layer, zoneColor, highlight);
      }
      if (highlight && settings.renderPads) {
        var padColor = style.getPropertyValue('--pad-color-highlight');
        var padHoleColor = style.getPropertyValue('--pad-hole-color');
        var ctx = canvas.getContext("2d");
        for (var footprint of pcbdata.footprints) {
          // draw pads
          var padDrawn = false;
          for (var pad of footprint.pads) {
            if (highlightedNet != pad.net) continue;
            if (pad.layers.includes(layer)) {
              drawPad(ctx, pad, padColor, false);
              padDrawn = true;
            }
          }
          if (padDrawn) {
            // redraw all pad holes because some pads may overlap
            for (var pad of footprint.pads) {
              drawPadHole(ctx, pad, padHoleColor);
            }
          }
        }
      }
    }
    
    function drawHighlightsOnLayer(canvasdict, clear = true) {
      if (clear) {
        clearCanvas(canvasdict.highlight);
      }
      if (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();
    }
    
    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 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 (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") {
        th = createColumnHeader("Net name", "bom-netname", (a, b) => {
          if (a > b) return -1;
          if (a < b) return 1;
          return 0;
        });
        tr.appendChild(th);
      } 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;
      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);
        } 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(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("bot").style.height = "";
          break;
        case 'top-bottom':
          document.getElementById("tb-btn").classList.add("depressed");
          document.getElementById("frontcanvas").style.display = "";
          document.getElementById("backcanvas").style.display = "";
          document.getElementById("bot").style.height = "calc(100% - 80px)";
          document.getElementById("bomdiv").classList.remove("split-horizontal");
          document.getElementById("canvasdiv").classList.remove("split-horizontal");
          document.getElementById("frontcanvas").classList.add("split-horizontal");
          document.getElementById("backcanvas").classList.add("split-horizontal");
          if (bomsplit) {
            bomsplit.destroy();
            bomsplit = null;
            canvassplit.destroy();
            canvassplit = null;
          }
          bomsplit = Split(['#bomdiv', '#canvasdiv'], {
            sizes: [50, 50],
            onDragEnd: resizeAll,
            direction: "vertical",
            gutterSize: 5
          });
          canvassplit = Split(['#frontcanvas', '#backcanvas'], {
            sizes: [50, 50],
            gutterSize: 5,
            onDragEnd: resizeAll
          });
          break;
        case 'left-right':
          document.getElementById("lr-btn").classList.add("depressed");
          document.getElementById("frontcanvas").style.display = "";
          document.getElementById("backcanvas").style.display = "";
          document.getElementById("bot").style.height = "calc(100% - 80px)";
          document.getElementById("bomdiv").classList.add("split-horizontal");
          document.getElementById("canvasdiv").classList.add("split-horizontal");
          document.getElementById("frontcanvas").classList.remove("split-horizontal");
          document.getElementById("backcanvas").classList.remove("split-horizontal");
          if (bomsplit) {
            bomsplit.destroy();
            bomsplit = null;
            canvassplit.destroy();
            canvassplit = null;
          }
          bomsplit = Split(['#bomdiv', '#canvasdiv'], {
            sizes: [50, 50],
            onDragEnd: resizeAll,
            gutterSize: 5
          });
          canvassplit = Split(['#frontcanvas', '#backcanvas'], {
            sizes: [50, 50],
            gutterSize: 5,
            direction: "vertical",
            onDragEnd: resizeAll
          });
      }
      settings.bomlayout = layout;
      writeStorage("bomlayout", layout);
      changeCanvasLayout(settings.canvaslayout);
    }
    
    function changeBomMode(mode) {
      document.getElementById("bom-grouped-btn").classList.remove("depressed");
      document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
      document.getElementById("bom-netlist-btn").classList.remove("depressed");
      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";
    }
    
    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);
    
    ///////////////////////////////////////////////
    
    ///////////////////////////////////////////////
    
    ///////////////////////////////////////////////
      </script>
    </head>
    
    <body>
    
    <div id="topmostdiv" class="topmostdiv">
      <div id="top">
        <div style="float: right; height: 100%;">
          <div class="hideonprint menu" style="float: right; top: 8px;">
            <button class="menubtn"></button>
            <div class="menu-content">
              <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
                <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
                Dark mode
              </label><!-- This comment eats space! All of it!
              --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
                <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
                Full Screen
              </label>
              <label class="menu-label" style="width: calc(50% - 18px)">
                <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
                Fab layer
              </label><!-- This comment eats space! All of it!
              --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
                <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
                Silkscreen
              </label>
              <label class="menu-label" style="width: calc(50% - 18px)">
                <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
                References
              </label><!-- This comment eats space! All of it!
              --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
                <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
                Values
              </label>
              <div id="tracksAndZonesCheckboxes">
                <label class="menu-label" style="width: calc(50% - 18px)">
                  <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
                  Tracks
                </label><!-- This comment eats space! All of it!
                --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
                  <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
                  Zones
                </label>
              </div>
              <label class="menu-label" style="width: calc(50% - 18px)">
                <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
                Pads
              </label><!-- This comment eats space! All of it!
              --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
                <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
                DNP outlined
              </label>
              <label class="menu-label">
                <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
                Highlight first pin
              </label>
              <label class="menu-label">
                <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
                Continuous redraw on drag
              </label>
              <label class="menu-label">
                <span>Board rotation</span>
                <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
                <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
              </label>
              <label class="menu-label">
                <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"
               style="float: right; position: relative; top: 8px">
            <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                    title="Front only">F
            </button>
            <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                    title="Front and Back">FB
            </button>
            <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                    title="Back only">B
            </button>
          </div>
          <div class="button-container hideonprint"
               style="float: right; position: relative; top: 8px">
            <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                    title="BOM only"></button>
            <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                    title="BOM left, drawings right"></button>
            <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                    title="BOM top, drawings bot"></button>
          </div>
          <div class="button-container hideonprint"
               style="float: right; position: relative; top: 8px">
            <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                    title="Grouped BOM"></button>
            <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                    title="Ungrouped BOM"></button>
            <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                    title="Netlist"></button>
          </div>
          <div class="hideonprint menu" style="float: right; top: 8px;">
            <button class="statsbtn"></button>
            <div class="menu-content">
              <table class="stats">
                <tbody>
                  <tr>
                    <td width="40%">Board stats</td>
                    <td>Front</td>
                    <td>Back</td>
                    <td>Total</td>
                  </tr>
                  <tr>
                    <td>Components</td>
                    <td id="stats-components-front">~</td>
                    <td id="stats-components-back">~</td>
                    <td id="stats-components-total">~</td>
                  </tr>
                  <tr>
                    <td>Groups</td>
                    <td id="stats-groups-front">~</td>
                    <td id="stats-groups-back">~</td>
                    <td id="stats-groups-total">~</td>
                  </tr>
                  <tr>
                    <td>SMD pads</td>
                    <td id="stats-smd-pads-front">~</td>
                    <td id="stats-smd-pads-back">~</td>
                    <td id="stats-smd-pads-total">~</td>
                  </tr>
                  <tr>
                    <td>TH pads</td>
                    <td colspan=3 id="stats-th-pads">~</td>
                  </tr>
                </tbody>
              </table>
              <table class="stats">
                <col width="40%"/><col />
                <tbody id="checkbox-stats">
                  <tr>
                    <td colspan=2 style="border-top: 0">Checkboxes</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <div class="hideonprint menu" style="float: right; top: 8px;">
            <button class="iobtn"></button>
            <div class="menu-content">
              <div class="menu-label menu-label-top">
                <div style="margin-left: 5px;">Save board image</div>
                <div class="flexbox">
                  <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                      style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
                  <span>X</span>
                  <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                      style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
                </div>
                <label>
                  <input id="render-save-transparent" type="checkbox">
                  Transparent background
                </label>
                <div class="flexbox">
                  <button class="savebtn" onclick="saveImage('F')">Front</button>
                  <button class="savebtn" onclick="saveImage('B')">Back</button>
                </div>
              </div>
              <div class="menu-label">
                <span style="margin-left: 5px;">Config and checkbox state</span>
                <div class="flexbox">
                  <button class="savebtn" onclick="saveSettings()">Export</button>
                  <button class="savebtn" onclick="loadSettings()">Import</button>
                </div>
              </div>
              <div 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 id="fileinfodiv" style="overflow: auto;">
          <table class="fileinfo">
            <tbody>
              <tr>
                <td id="title" class="title" style="width: 70%">
                  Title
                </td>
                <td id="revision" class="title" style="width: 30%">
                  Revision
                </td>
              </tr>
              <tr>
                <td id="company">
                  Company
                </td>
                <td id="filedate">
                  Date
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div id="bot" class="split" style="height: calc(100% - 80px)">
        <div id="bomdiv" class="split split-horizontal">
          <div style="width: 100%">
            <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
                   oninput="updateRefLookup(this.value)">
            <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
                   oninput="updateFilter(this.value)">
            <div class="button-container hideonprint" style="float: left; margin: 0;">
              <button id="copy" title="Copy bom table to clipboard"
                   onclick="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>