From 3af643d41821d1af2bffd44c65dbe4f89296f429 Mon Sep 17 00:00:00 2001 From: Sascha Nitsch Date: Sun, 29 Jan 2023 00:53:50 +0100 Subject: [PATCH] initial import --- .gitignore | 11 + Gruntfile.js | 117 ++ arduino/main/CPPLINT.cfg | 2 + arduino/main/data/config | 1 + arduino/main/main.ino | 599 ++++++ arduino/main/wlanmanager.cpp | 171 ++ arduino/main/wlanmanager.h | 88 + electronics/board.pdf | Bin 0 -> 32420 bytes electronics/electronics.kicad_pcb | 1556 ++++++++++++++++ electronics/electronics.kicad_pro | 435 +++++ electronics/electronics.kicad_sch | 2883 +++++++++++++++++++++++++++++ electronics/electronics.pro | 249 +++ electronics/schematic.pdf | Bin 0 -> 46693 bytes lang/en/error.json | 5 + lang/en/generic.json | 6 + lang/en/main.json | 9 + lang/en/mapping.json | 14 + lang/en/menu.json | 6 + lang/en/update.json | 7 + lang/en/wifi.json | 15 + less/colors.less | 30 + less/default.less | 114 ++ less/fform.less | 152 ++ less/header.less | 23 + less/main.less | 112 ++ less/mapping.less | 12 + less/overlay.less | 41 + less/update.less | 9 + less/wifi.less | 21 + package.json | 38 + static/api/config.json | 4 + static/api/pinmapping.json | 10 + static/api/run | 3 + static/api/ssid.json | 4 + static/api/wifi | 3 + static/cameratrigger_logo.png | Bin 0 -> 25196 bytes static/index.html | 20 + templates/base/main.mst | 26 + templates/base/menu.mst | 4 + templates/base/pinmapping.mst | 23 + templates/base/update.mst | 8 + templates/base/wifi.mst | 28 + ts/api.ts | 70 + ts/cameratrigger.ts | 189 ++ ts/forminfo.ts | 12 + ts/loader.ts | 178 ++ ts/mainview.ts | 158 ++ ts/pinmappingview.ts | 67 + ts/toast.d.ts | 10 + ts/updateview.ts | 26 + ts/view.ts | 19 + ts/wifiview.ts | 145 ++ 52 files changed, 7733 insertions(+) create mode 100644 .gitignore create mode 100644 Gruntfile.js create mode 100644 arduino/main/CPPLINT.cfg create mode 100644 arduino/main/data/config create mode 100644 arduino/main/main.ino create mode 100644 arduino/main/wlanmanager.cpp create mode 100644 arduino/main/wlanmanager.h create mode 100644 electronics/board.pdf create mode 100644 electronics/electronics.kicad_pcb create mode 100644 electronics/electronics.kicad_pro create mode 100644 electronics/electronics.kicad_sch create mode 100644 electronics/electronics.pro create mode 100644 electronics/schematic.pdf create mode 100644 lang/en/error.json create mode 100644 lang/en/generic.json create mode 100644 lang/en/main.json create mode 100644 lang/en/mapping.json create mode 100644 lang/en/menu.json create mode 100644 lang/en/update.json create mode 100644 lang/en/wifi.json create mode 100644 less/colors.less create mode 100644 less/default.less create mode 100644 less/fform.less create mode 100644 less/header.less create mode 100644 less/main.less create mode 100644 less/mapping.less create mode 100644 less/overlay.less create mode 100644 less/update.less create mode 100644 less/wifi.less create mode 100644 package.json create mode 100644 static/api/config.json create mode 100644 static/api/pinmapping.json create mode 100644 static/api/run create mode 100644 static/api/ssid.json create mode 100644 static/api/wifi create mode 100644 static/cameratrigger_logo.png create mode 100644 static/index.html create mode 100644 templates/base/main.mst create mode 100644 templates/base/menu.mst create mode 100644 templates/base/pinmapping.mst create mode 100644 templates/base/update.mst create mode 100644 templates/base/wifi.mst create mode 100644 ts/api.ts create mode 100644 ts/cameratrigger.ts create mode 100644 ts/forminfo.ts create mode 100644 ts/loader.ts create mode 100644 ts/mainview.ts create mode 100644 ts/pinmappingview.ts create mode 100644 ts/toast.d.ts create mode 100644 ts/updateview.ts create mode 100644 ts/view.ts create mode 100644 ts/wifiview.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3f63c12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.tscache +.project +arduino/main/main.ino.nodemcu.bin +htdocs +node_modules +package-lock.json +tmp +electronics/electronics-cache.lib +electronics/electronics.kicad_prl +electronics/fp-info-cache +electronics/sym-lib-table diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..6b138df --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,117 @@ +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + copy: { + release: { + files: [ + { src: "node_modules/jquery/dist/jquery.min.js", dest: "htdocs/jquery.min.js" }, + { src: "node_modules/jquery-toast-plugin/dist/jquery.toast.min.js", dest: "htdocs/jquery.toast.min.js" }, + { src: "node_modules/jquery-toast-plugin/dist/jquery.toast.min.css", dest: "htdocs/jquery.toast.min.css" }, + { src: "node_modules/mustache/mustache.min.js", dest: "htdocs/mustache.min.js" }, + { cwd: "js/templates/", src:"*.mst", dest: "htdocs/", expand: true}, + { src: "node_modules/mustache/mustache.min.js", dest: "htdocs/mustache.min.js" }, + ] + }, + static: { + files: [ + { cwd: "static/", src: "**/*", dest: "htdocs/", expand:true}, + ] + } + }, + ts: { + default: { + src: ['ts/**/*.ts'], + outDir: 'tmp/', + options: { + module: 'none', + moduleResolution: 'node', + sourceMap: true, + target: 'es5', + rootDir: ['ts'] + } + } + }, + uglify: { + options: { + beautify: true, + mangle:false, + sourceMap: false + }, + bootstrap: { + files: { + 'htdocs/bootstrap.min.js': ['tmp/view.js','tmp/*.js'], + } + }, + }, + watch: { + jsbootstrapts: { + files: ['ts/*.ts'], + tasks: ['ts', 'newer:uglify:bootstrap'] + }, + + lessdefault: { + files: ['less/*.less'], + tasks: ['less'] + }, + concat: { + files: ['templates/base/*'], + tasks: ['concat'] + }, + jstemplate: { + files: ['templates/*.mst'], + tasks: ['copy'] + }, + json_merge: { + files: ["lang/*/*.json"], + tasks: ['json_merge'] + }, + static: { + files: ['static/**/*'], + tasks: ['copy:static'] + }, + }, + less: { + default: { + options: { + "strictImports": true, + "compress": true + }, + files: { + "htdocs/default.css": "less/default.less" + } + }, + }, + concat: { + options: { + sourceMap: false + }, + base: { src: ['templates/base/*'], dest: 'htdocs/base.mst'}, + }, + json_merge: { + options: { + replacer: null, + space: " " + }, + en: { + files: [ + { 'htdocs/en_main.json': ['lang/en/generic.json','lang/en/menu.json', 'lang/en/wifi.json', 'lang/en/error.json', 'lang/en/mapping.json', 'lang/en/main.json', 'lang/en/update.json'] }, + ] + } + }, + }); + + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-newer'); + grunt.loadNpmTasks('grunt-json-merge'); + grunt.loadNpmTasks("grunt-ts"); + + // Default task(s). + grunt.registerTask('default', ['less', 'concat', 'ts', 'newer:uglify', 'json_merge', 'copy', 'watch']); + grunt.registerTask('release', ['less', 'concat', 'ts', 'uglify', 'json_merge', 'copy']); +}; diff --git a/arduino/main/CPPLINT.cfg b/arduino/main/CPPLINT.cfg new file mode 100644 index 0000000..a6d1dce --- /dev/null +++ b/arduino/main/CPPLINT.cfg @@ -0,0 +1,2 @@ +filter=-build/include_subdir,-whitespace/line_length +root=./ diff --git a/arduino/main/data/config b/arduino/main/data/config new file mode 100644 index 0000000..5dc9e26 --- /dev/null +++ b/arduino/main/data/config @@ -0,0 +1 @@ +abc123;42758142061871992313;client diff --git a/arduino/main/main.ino b/arduino/main/main.ino new file mode 100644 index 0000000..eed1d8a --- /dev/null +++ b/arduino/main/main.ino @@ -0,0 +1,599 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include +#include //https://github.com/esp8266/Arduino +#include +#include +#include +#include "wlanmanager.h" + +#define MORSEPIN 2 +#define MORSEON LOW +#define MORSEOFF HIGH +char lang[3]="en"; + +/// \brief handle config call +void handleConfig(); +/// \brief handle SSID call +void handleSSID(); +/// \brief handle wifi call and set new credentials +void handleWifi(); + +/// should program be run +volatile bool run; + +/// translation of D0...D7 to physical pins +char pinTranslation[8] = { 16, 5, 4, 0, 2, 14, 12, 13 }; + +// default config expects this: +// camera @d0 + side of optocoppler +// valve1 @d1 + side of optocoppler +// valve2 @d2 + side of optocoppler +// Trigger @d3 connects to ground (uses internal pull-up) +// LED @d4 + side of LED +// Flash @d5 + side of optocoppler +// IR @d6 + side of LED + +/// our local ip +char localIP[17]={0}; +/// morse ip info +volatile int8_t morseIP; +/// web server +ESP8266WebServer server(80); +/// wlan manager +WLANManager wlanManager; +/// start timestamp (in local time) of the main loop +uint32_t start; + +/// handle OTA update response +void handleUpdate () { + server.sendHeader("Connection", "close"); + if (Update.hasError()) { + server.send(500, "application/json", "{\"error\":\"failed\"}"); + } else { + server.send(200, "application/json", "{\"success\":true}"); + } + ESP.restart(); +} + +/// handle OTA update +void handleUpdateProgress() { + HTTPUpload& upload = server.upload(); + if (upload.status == UPLOAD_FILE_START) { + Serial.setDebugOutput(true); + WiFiUDP::stopAll(); + Serial.printf("Update: %s\n", upload.filename.c_str()); + uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + if (!Update.begin(maxSketchSpace)) { //start with max available size + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_WRITE) { + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { //true to set the size to the current progress + Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); + } else { + Update.printError(Serial); + } + Serial.setDebugOutput(false); + } + yield(); +} + +/// setup routine +void setup() { + LittleFS.begin(); + Serial.begin(115200); + wlanManager.setSSID("cameratrigger","cameratrigger"); // set default + wlanManager.loadConfigFromFile("/config"); // load from config file + wlanManager.start(); // start access point or connect to access point + uint8_t ip[4]; + *((uint32_t*)&ip) = wlanManager.getIP(); + sprintf(localIP,"%i.%i.%i.%i",ip[0],ip[1],ip[2],ip[3]); + Serial.println(localIP); + morseIP = 0; + server.onNotFound([]() { // If the client requests any URI + if (!handleFileRead(server.uri())) // send it if it exists + server.send(404, "text/plain", "404: Not Found"); // otherwise, respond with a 404 (Not Found) error + }); + server.on("/api/config.json", HTTP_GET, handleConfig); + server.on("/api/ssid.json", HTTP_GET, handleSSID); + server.on("/api/wifi", HTTP_POST, handleWifi); + server.on("/api/pinmapping", HTTP_POST, handlePinMapping); + server.on("/api/run", HTTP_POST, handleRun); + server.on("/api/upload", HTTP_POST, handleUpdate, handleUpdateProgress); + server.on("/update", HTTP_POST, handleUpdate, handleUpdateProgress); + server.begin(); + run = false; + start = millis(); + pinMode(LED_BUILTIN, OUTPUT); + pinMode(D8, OUTPUT); + digitalWrite(D8, false); +} + +/// handle config call +void handleConfig() { + morseIP = -1; + String result = String("{\"wifimode\":\"") + (wlanManager.isAccessPoint()? "ap" : "client") + "\",\"ssid\": \"" + wlanManager.getSSID() +"\"}"; + server.send(200, "application/json", result); // Send HTTP status 200 (Ok) and send some text to the browser/client +} + +/// handle SSID scan call and return list of WLAN +void handleSSID() { + int n = WiFi.scanNetworks(); + String out="["; + char line[1024] = {0}; + for (int i = 0; i < n; ++i) { + snprintf(line,1023,"[\"%s\",%i,%i,\"%s\"]%c",WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "open": "", ((i+1(*input); + break; + case 'T': // trigger on rising input + enableInput = true; + break; + default: + error = true; + parseValue = false; + advance = false; + server.send(400, "application/json", "{\"error\":\"invalidcommand\"}"); + } + if (parseValue) { + unsigned int value = 0; + ++input; + while ((*input) && (*input) != ';') { + if ((*input) >= '0' && (*input) <= '9') { + value = value * 10 + ((*input)-'0'); + } + if (*input) + ++input; + } + cmds[cmdIndex].value = value; + } + + if (enableOutput || enableInput) { + if (cmds[cmdIndex].value > 7) { + server.send(400, "application/json", "{\"error\":\"invalidpin\"}"); + error = true; + break; + } + cmds[cmdIndex].value = pinTranslation[cmds[cmdIndex].value]; + if (enableOutput) { + pinMode(cmds[cmdIndex].value, OUTPUT); + } else if (enableInput) { + pinMode(cmds[cmdIndex].value, INPUT_PULLUP); + attachInterrupt(digitalPinToInterrupt(cmds[cmdIndex].value), triggerSequence, FALLING); + } + } + if (advance) { + if (cmdIndex < 255) + ++cmdIndex; + else { + error = true; + server.send(400, "application/json", "{\"error\":\"toomanycommands\"}"); + break; + } + } + if (*input) + ++input; + } + if (error) { + return; + } + + server.send(200, "application/json", "{\"message\":\"ok\"}"); + // wait for trigger ? + const String& trigger = server.arg("trigger"); + if (trigger == "true") { + // run now + run = true; + } +} + +/// send a trigger impulse for Nikon cameras (confirmed, works) +/// \param pin which pin +/// \param reps number of repeats +void sendNikonPulse(uint8_t pin, uint8_t reps) { + // 13us on, 13us off + while (reps) { + digitalWrite(pin,HIGH); + delayMicroseconds(10); + delayTicks(40); + digitalWrite(pin,LOW); + delayMicroseconds(10); + delayTicks(39); + --reps; + } +} + +/// send a trigger for Nikon cameras (confirmed, works) +/// \param pin which pin +void triggerNikon(uint16_t pin) { // takes 135.6ms + noInterrupts(); + // SendSequence generates a full command signal by repeatedly calling SendPulse(). + // The duration of each pulse and the time gaps between pulses is exactly the same as the + // values obtained from the analysis^ by oscilloscope + for(uint8_t i=0;i<2;++i) { + //pulse for 2.0 millis + sendNikonPulse(pin, 77); + //delay for 27.8 millis + //using a combination of delay() and delayMicroseconds() + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(7786); + //on pulse for 0.4 millis + sendNikonPulse(pin, 15); + //delay for 1.5 millis + delayMicroseconds(1499); + //on pulse for 0.4 millis + sendNikonPulse(pin, 15); + //delay for 3.5 millis + delayMicroseconds(3496); + //send pulse for 0.4 millis + sendNikonPulse(pin, 15); + if(!i) { + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(10000); + delayMicroseconds(2977); + } + } + interrupts(); +} + +/// send a 32kHz pulse +/// \param pin pin number to use +/// \param reps number of pulses +void send32kHzPulse(uint8_t pin, uint16_t reps) { + while (reps) { + digitalWrite(pin,HIGH); + delayMicroseconds(12); + delayTicks(64); + digitalWrite(pin,LOW); + delayMicroseconds(12); + delayTicks(64); + --reps; + } +} + +/// send a trigger for Canon cameras (not confirmed) +void triggerCanon(uint16_t pin) { // takes 8.3 ms + noInterrupts(); + //16 pulses for at 32kHz + send32kHzPulse(pin, 16); + delayMicroseconds(5310); + //on pulse for 0.5 millis + send32kHzPulse(pin, 16); + interrupts(); +} + +/// get current tick count +/// \param tick count +uint32_t inline asm_ccount() { + uint32_t r; + asm volatile ("rsr %0, ccount": "=r"(r)); + return r; +} +/// delay for given number of ticks +/// \param ticks number of ticks +void delayTicks(int32_t ticks) { + uint32_t expire_ticks = asm_ccount() + ticks; + do { + ticks = expire_ticks - asm_ccount(); + } while(ticks>0); +} + +/// send a pulse for Sony cameras +/// \param pin pin number to use +/// \param count number of pulses +void sendSonyPulse(uint16_t pin, uint16_t count) { + // warm up cache + digitalWrite(pin,LOW); + delayTicks(40); + while (count) { // 1 pulse = 7uS high, 18us Low = 25uS at 40kHz + digitalWrite(pin,HIGH); + delayMicroseconds(4); + delayTicks(39); + digitalWrite(pin,LOW); + delayMicroseconds(15); + delayTicks(50); + --count; + } +} + +/// send a trigger for Sony cameras (not confirmed) +/// \param pin pin number to use +void triggerSony(uint16_t pin) { // takes ? 6ms + noInterrupts(); + bool cmd[] = {1,0,1,1,0,1,0,0,1,0,1,1,1,0,0,0,1,1,1,1}; + //2,4ms start pulse, 600uS gap, 20 bit data + sendSonyPulse(pin, 96); // 96 cycles = 2,4ms + delayMicroseconds(600); + for (uint8_t i = 0; i < 20; ++i) { + sendSonyPulse(pin, cmd[i] ? 48 : 24); + delayMicroseconds(600); + } + interrupts(); +} + +/// rund defined program +void runProgram() { + for (unsigned int i = 0 ; i < cmdIndex; ++i) { + switch(cmds[i].c) { + + case E: + digitalWrite(cmds[i].value, true); + break; + case D: + digitalWrite(cmds[i].value, false); + break; + case C: + triggerCanon(cmds[i].value); + break; + case N: + triggerNikon(cmds[i].value); + break; + case S: + triggerSony(cmds[i].value); + break; + case d: + uint32_t d = cmds[i].value; + while (d>16000) { + d-= 16000; + delay(16000); + } + delay(d); + break; + } + } +} + +/// guess content type based on file name +/// \param filename filename to check +/// \return content type +String getContentType(String filename) { // convert the file extension to the MIME type + if (filename.endsWith(".html")) return "text/html"; + else if (filename.endsWith(".css")) return "text/css"; + else if (filename.endsWith(".js")) return "application/javascript"; + else if (filename.endsWith(".ico")) return "image/x-icon"; + else if (filename.endsWith(".png")) return "image/png"; + else if (filename.endsWith(".svg")) return "image/svg+xml"; + else if (filename.endsWith(".json")) return "application/json"; + return "text/plain"; +} + +/// send a file to the client +/// \param path file/path to send +/// \return true on success +bool handleFileRead(String path) { // send the right file to the client (if it exists) + morseIP = -2; + if (path.endsWith("/")) path += "index.html"; // If a folder is requested, send the index file + String contentType = getContentType(path); // Get the MIME type + path = "/htdocs" + path; + if (LittleFS.exists(path)) { // If the file exists + File file = LittleFS.open(path, "r"); // Open it + server.sendHeader("X-Version", "1.2"); + server.streamFile(file, contentType); // And send it to the client + file.close(); // Then close the file again + return true; + } + if (captivePortal()) { + return true; + } + return false; // If the file doesn't exist, return false +} + +/// crude check if string is an IP +/// \return true if an IP +bool isIp(String str) { + for (size_t i = 0; i < str.length(); i++) { + int c = str.charAt(i); + if (c != '.' && (c < '0' || c > '9')) { + return false; + } + } + return true; +} + +/// IP to String +/// \param ip IP to convert +/// return formatted string +String toStringIp(IPAddress ip) { + String res = ""; + for (int i = 0; i < 3; i++) { + res += String((ip >> (8 * i)) & 0xFF) + "."; + } + res += String(((ip >> 8 * 3)) & 0xFF); + return res; +} + +/// Redirect to captive portal if we got a request for another domain. +/// \return true in that case so the page handler do not try to handle the request again. +bool captivePortal() { + morseIP = -2; + if (!isIp(server.hostHeader()) ) { + //Serial.println("Request redirected to captive portal"); + server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()) + "/", true); + server.send ( 302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. + server.client().stop(); // Stop is needed because we sent no content length + return true; + } + return false; +} + +/// +// char msg[4]; +// int msgLen = 0; +// uint32_t nextmsg; +// bool out = false; + +/// "morse" a digit (blink number of times) +/// \param count number of times to blink +void morseDigit(uint8_t count) { + while (count) { + server.handleClient(); + wlanManager.loop(); + digitalWrite(MORSEPIN, MORSEON); + delay(500); + digitalWrite(MORSEPIN, MORSEOFF); + delay(250); + --count; + } + delay(2000); +} +/// is ready LED on +bool readyLEDActive = false; + +/// main loop +void loop() { + if (morseIP > -1) { + if (morseIP == 0) { + readyLEDActive = false; + // send long start indicator + digitalWrite(MORSEPIN, MORSEON); + delay(1000); + digitalWrite(MORSEPIN, MORSEOFF); + delay(1000); + } + // morse localIP[morseIP] + char digit = localIP[morseIP]; + if (digit == '.') { + digitalWrite(MORSEPIN, MORSEON); + delay(10); + digitalWrite(MORSEPIN, MORSEOFF); + // wait 1 sec + delay(1000); + } else if (digit == 0) { + morseIP = -1; // restart + // send long end indicator + for (uint8_t i = 0; i < 50; ++i) { + digitalWrite(MORSEPIN, MORSEON); + delay(30); + digitalWrite(MORSEPIN, MORSEOFF); + delay(10); + } + // wait 2 sec + delay(2000); + } else { + morseDigit(digit - '0'); + } + ++morseIP; + } else if (!readyLEDActive) { + readyLEDActive = true; + digitalWrite(MORSEPIN, MORSEON); + } + + server.handleClient(); + wlanManager.loop(); + + if (run) { + digitalWrite(MORSEPIN, MORSEOFF); + runProgram(); + digitalWrite(MORSEPIN, MORSEON); + run = false; + delay(1000); + } +} diff --git a/arduino/main/wlanmanager.cpp b/arduino/main/wlanmanager.cpp new file mode 100644 index 0000000..a5931fb --- /dev/null +++ b/arduino/main/wlanmanager.cpp @@ -0,0 +1,171 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include +#include +#include "wlanmanager.h" + +#define _connectTimeout 5000 + +WLANManager::WLANManager() { + bzero(m_ssid, sizeof(m_ssid)); + bzero(m_password, sizeof(m_password)); + m_dnsServer = NULL; + m_isAccessPoint = true; +} + +void WLANManager::setSSID(const char* ssid, const char* password) { + strncpy(m_ssid, ssid, sizeof(m_ssid) - 1); + strncpy(m_password, password, sizeof(m_password) - 1); +} + +void WLANManager::loadConfigFromFile(const char* filename) { + File file = LittleFS.open(filename, "r"); // Open it + unsigned int size = file.size(); + if (size == 0) { + return; + } + char mode[20]={0}; + char* config = reinterpret_cast(malloc(size + 1)); + config[size] = 0; + file.read((unsigned char*)config, size); + file.close(); + while (config[size - 1] == '\n') { + config[size - 1] = 0; + --size; + } + // format: "ssid;password;ap/client" + char* next = nextSemi(config); + strncpy(m_ssid, config, sizeof(m_ssid)-1); + if (!next) return; + char* start = next; + next = nextSemi(start); + strncpy(m_password, start, sizeof(m_password)-1); + start = next; + next = nextSemi(start); + strncpy(mode, start, sizeof(mode)-1); + m_isAccessPoint = strcmp(mode, "ap") == 0; + free(config); +} + +void WLANManager::start() { + // try to connect to stored AP + if (m_isAccessPoint || !connectToAp(NULL, NULL, NULL)) { + // fire up own AP + openAP(); + m_dnsServer = new DNSServer(); + m_dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + m_dnsServer->start(53, "*", WiFi.softAPIP()); + } +} + +bool WLANManager::connectToAp(const char* ssid, const char* pass, std::function callback) { + m_isAccessPoint = false; + if (ssid == NULL) { + WiFi.mode(WIFI_STA); + } + if (WiFi.status() == WL_CONNECTED) { + return true; + } + if (ssid) { + WiFi.begin(ssid, pass); + } else { + if (WiFi.SSID().length()) { + ETS_UART_INTR_DISABLE(); + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); + WiFi.begin(); + } else { + WiFi.begin(m_ssid, m_password); + } + } + int connRes = waitForConnectResult(); + if (connRes != WL_CONNECTED) { + WiFi.beginWPSConfig(); + // should be connected at the end of WPS + connRes = waitForConnectResult(); + } + if (connRes == WL_CONNECTED) { + if (callback) { + callback(); + } + } + WiFi.mode(WIFI_STA); + if (m_dnsServer) { + delete m_dnsServer; + m_dnsServer = NULL; + } + return connRes == WL_CONNECTED; +} + +uint8_t WLANManager::waitForConnectResult() { + uint32_t start = millis(); + boolean keepConnecting = true; + uint8_t status; + while (keepConnecting) { + status = WiFi.status(); + if (millis() > start + _connectTimeout) { + keepConnecting = false; + } + if (status == WL_CONNECTED || status == WL_CONNECT_FAILED) { + keepConnecting = false; + } + delay(100); + } + return status; +} + +void WLANManager::openAP() { + m_isAccessPoint = true; + // do we have stored settings? + if (!WiFi.isConnected()) { + WiFi.persistent(false); + // disconnect sta, start ap + WiFi.disconnect(); // this alone is not enough to stop the autoconnecter + WiFi.mode(WIFI_AP); + WiFi.persistent(true); + } else { + // setup AP + WiFi.mode(WIFI_AP_STA); + } + Serial.println(m_ssid); + Serial.println(m_password); + WiFi.softAP(m_ssid, m_password); +} + +char* WLANManager::nextSemi(char* start) { + char* semi = strchr(start, ';'); + if (!semi) return NULL; + *semi = 0; + return semi + 1; +} + +bool WLANManager::isAccessPoint() const { + return m_isAccessPoint; +} + +void WLANManager::save(const char* filename) { + String line = String(m_ssid) + ";" + m_password + ";" + (m_isAccessPoint ? "ap" : "client"); + File file = LittleFS.open(filename, "w"); + file.write(line.c_str(), line.length()); + file.close(); +} + +const char* WLANManager::getSSID() const { + return m_ssid; +} + +void WLANManager::loop() { + if (m_dnsServer) { + m_dnsServer->processNextRequest(); + } +} + +uint32_t WLANManager::getIP() const { + if (m_isAccessPoint) + return WiFi.softAPIP(); + return WiFi.localIP(); +} diff --git a/arduino/main/wlanmanager.h b/arduino/main/wlanmanager.h new file mode 100644 index 0000000..a331562 --- /dev/null +++ b/arduino/main/wlanmanager.h @@ -0,0 +1,88 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef WLANMANAGER_H_ +#define WLANMANAGER_H_ +#include + +/** + * \class WLANManager + * \brief manager for and connecting to WLAN + */ +class WLANManager { + public: + /// \brief constructor + WLANManager(); + + /// \brief set SSID and password + /// \param ssid SSID to set + /// \param password password to set + void setSSID(const char* ssid, const char* password); + + /// \brief load config from given file + /// \param filename file name of config file + void loadConfigFromFile(const char* filename); + + /// \brief start WLAN + void start(); + + /// \brief set mode to access point (true) or client (false) + /// \param isAccessPoint true if we are an access point + void setAccessPoint(bool isAccessPoint); + + /// \brief are we an access point? + /// \return true if we are + bool isAccessPoint() const; + + /// \brief save configuration + /// \param filename filename of config file + void save(const char* filename); + + /// \brief connect to an access point + /// \param ssid ssid of AP + /// \param pass password of AP + /// \param callbal function to be called if connected + /// \retval true on success + bool connectToAp(const char* ssid, const char* pass, std::function callback); + + /// \brief get SSID + /// \return current SSID + const char* getSSID() const; + + /// \brief open access point + void openAP(); + + /// \brief internal loop, need to be called from main loop + void loop(); + + /// \brief get current IP + /// \return current IP + uint32_t getIP() const; + + private: + /// \brief parse input and search for next semicolon + /// \param start start offset. Input string will be modified + /// \return pointer to char after semicolor or NULL if not found + char* nextSemi(char* start); + + /// \brief wait for connection to access point + /// \return WLAN status + uint8_t waitForConnectResult(); + + /// pointer to our dns server + DNSServer* m_dnsServer; + + /// are we an access point + bool m_isAccessPoint; + + /// our ssid + char m_ssid[64]; + + // our password + char m_password[64]; +}; + +#endif // WLANMANAGER_H_ diff --git a/electronics/board.pdf b/electronics/board.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93bea3b3d43ce4a1352589727e9a4b5b48896f18 GIT binary patch literal 32420 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 literal 0 HcmV?d00001 diff --git a/electronics/electronics.kicad_pcb b/electronics/electronics.kicad_pcb new file mode 100644 index 0000000..1c93648 --- /dev/null +++ b/electronics/electronics.kicad_pcb @@ -0,0 +1,1556 @@ +(kicad_pcb (version 20211014) (generator pcbnew) + + (general + (thickness 1.6) + ) + + (paper "A4") + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + ) + + (setup + (stackup + (layer "F.SilkS" (type "Top Silk Screen")) + (layer "F.Paste" (type "Top Solder Paste")) + (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01)) + (layer "F.Cu" (type "copper") (thickness 0.035)) + (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) + (layer "B.Cu" (type "copper") (thickness 0.035)) + (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01)) + (layer "B.Paste" (type "Bottom Solder Paste")) + (layer "B.SilkS" (type "Bottom Silk Screen")) + (copper_finish "None") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0.051) + (solder_mask_min_width 0.25) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (disableapertmacros false) + (usegerberextensions false) + (usegerberattributes false) + (usegerberadvancedattributes false) + (creategerberjobfile false) + (svguseinch false) + (svgprecision 6) + (excludeedgelayer true) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (dxfpolygonmode true) + (dxfimperialunits true) + (dxfusepcbnewfont true) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (sketchpadsonfab false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + + (net 0 "") + (net 1 "Net-(D1-Pad2)") + (net 2 "+12V") + (net 3 "GND") + (net 4 "Net-(D2-Pad2)") + (net 5 "Net-(J11-Pad1)") + (net 6 "Net-(J11-Pad2)") + (net 7 "Net-(J14-Pad1)") + (net 8 "Net-(J14-Pad2)") + (net 9 "Net-(R1-Pad2)") + (net 10 "Net-(R2-Pad2)") + (net 11 "Net-(R3-Pad2)") + (net 12 "Net-(R4-Pad2)") + (net 13 "Net-(R7-Pad2)") + (net 14 "Net-(U1-Pad14)") + (net 15 "Net-(R6-Pad1)") + (net 16 "Net-(R8-Pad1)") + (net 17 "Net-(R1-Pad1)") + (net 18 "Net-(R2-Pad1)") + (net 19 "Net-(R3-Pad1)") + (net 20 "Net-(R4-Pad1)") + (net 21 "Net-(J1-Pad9)") + (net 22 "Net-(R11-Pad1)") + (net 23 "Net-(Q3-Pad1)") + (net 24 "Net-(R9-Pad1)") + (net 25 "Net-(R10-Pad2)") + (net 26 "Net-(R9-Pad2)") + (net 27 "/3.3V") + (net 28 "/D3") + (net 29 "/ESPGND") + + (footprint "Package_TO_SOT_THT:TO-220-3_Vertical" (layer "F.Cu") + (tedit 5AC8BA0D) (tstamp 00000000-0000-0000-0000-00005f0d9c5f) + (at 134.62 58.42) + (descr "TO-220-3, Vertical, RM 2.54mm, see https://www.vishay.com/docs/66542/to-220-1.pdf") + (tags "TO-220-3 Vertical RM 2.54mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/39bf7fb9-ac91-4ed7-9f86-a482c712e903") + (attr through_hole) + (fp_text reference "Q1" (at 2.54 -4.27) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6aabd190-1426-4ed0-b5fc-78d29d820d85) + ) + (fp_text value "IRLZ34N" (at 2.54 2.5) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7238c32b-c73a-4d2f-9f1a-fa13843739ac) + ) + (fp_text user "${REFERENCE}" (at 2.54 -4.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f59511ab-e850-4a2c-9af5-430ad9f7c2f3) + ) + (fp_line (start 7.66 -3.27) (end 7.66 1.371) (layer "F.SilkS") (width 0.12) (tstamp 0155ced5-26a9-400a-a0f1-51c7300d90f4)) + (fp_line (start -2.58 1.371) (end 7.66 1.371) (layer "F.SilkS") (width 0.12) (tstamp 0ed9fc28-cb25-4d69-80fb-32a030a07e5f)) + (fp_line (start -2.58 -1.76) (end 7.66 -1.76) (layer "F.SilkS") (width 0.12) (tstamp 54f8d785-848f-4f70-a6a8-209a18c30011)) + (fp_line (start 0.69 -3.27) (end 0.69 -1.76) (layer "F.SilkS") (width 0.12) (tstamp 61b25ef3-e9f1-430a-84d0-8cf2e3c7a560)) + (fp_line (start -2.58 -3.27) (end -2.58 1.371) (layer "F.SilkS") (width 0.12) (tstamp 9a6b0829-ded5-4fc0-915a-84a1842b32a7)) + (fp_line (start 4.391 -3.27) (end 4.391 -1.76) (layer "F.SilkS") (width 0.12) (tstamp babe3d93-5d65-47ce-911e-bc250abe2124)) + (fp_line (start -2.58 -3.27) (end 7.66 -3.27) (layer "F.SilkS") (width 0.12) (tstamp c291f5f7-6813-4ca1-9e83-ecb5d9f97803)) + (fp_line (start 7.79 1.51) (end 7.79 -3.4) (layer "F.CrtYd") (width 0.05) (tstamp 0be29200-d8af-42d2-8119-307b14b45b0c)) + (fp_line (start -2.71 1.51) (end 7.79 1.51) (layer "F.CrtYd") (width 0.05) (tstamp 4cf5995a-bb77-4980-8e59-453f9ae0a7f5)) + (fp_line (start -2.71 -3.4) (end -2.71 1.51) (layer "F.CrtYd") (width 0.05) (tstamp dd36fc08-c491-46c6-b2fa-6d62e5037af5)) + (fp_line (start 7.79 -3.4) (end -2.71 -3.4) (layer "F.CrtYd") (width 0.05) (tstamp fb8e854b-10af-425c-ac74-9c484dfbbece)) + (fp_line (start 7.54 1.25) (end 7.54 -3.15) (layer "F.Fab") (width 0.1) (tstamp 011eea5b-13cc-4a4a-8f68-838e2909648b)) + (fp_line (start 0.69 -3.15) (end 0.69 -1.88) (layer "F.Fab") (width 0.1) (tstamp 0d5b71b5-9880-4a88-a3a9-5e8dd8e7c927)) + (fp_line (start -2.46 1.25) (end 7.54 1.25) (layer "F.Fab") (width 0.1) (tstamp 0e09b053-db39-4eea-998d-70e8d31c7d95)) + (fp_line (start 7.54 -3.15) (end -2.46 -3.15) (layer "F.Fab") (width 0.1) (tstamp 463f4ee8-aada-4d5e-8f2f-5a1282552c48)) + (fp_line (start -2.46 -1.88) (end 7.54 -1.88) (layer "F.Fab") (width 0.1) (tstamp 5ab0bf0a-997d-4dcb-a407-70309fad9aef)) + (fp_line (start -2.46 -3.15) (end -2.46 1.25) (layer "F.Fab") (width 0.1) (tstamp 63aa6e81-c4d7-4591-807f-200d7940a685)) + (fp_line (start 4.39 -3.15) (end 4.39 -1.88) (layer "F.Fab") (width 0.1) (tstamp 9a5e207f-b1c0-4554-bf4a-55316673933a)) + (pad "1" thru_hole rect (at 0 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 15 "Net-(R6-Pad1)") (pinfunction "G") (pintype "input") (tstamp 2d22abcf-b5f4-4753-b230-8378d4b4d974)) + (pad "2" thru_hole oval (at 2.54 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 1 "Net-(D1-Pad2)") (pinfunction "D") (pintype "passive") (tstamp fd8c98e2-8d44-41c6-82f7-dc19cf3d7436)) + (pad "3" thru_hole oval (at 5.08 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 3 "GND") (pinfunction "S") (pintype "passive") (tstamp 7d7ebbe8-eb10-4ef8-9e2f-4617a79dfb4e)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-220-3_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 00000000-0000-0000-0000-00005f0d9e4c) + (at 106.68 63.5) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/9457c2ff-4fad-4b5d-a65b-03239159fd45") + (attr through_hole) + (fp_text reference "R3" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 3e2a6bdd-ee21-4a87-867e-a324fe7992cc) + ) + (fp_text value "100R" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1eb49746-76b0-4717-9e4b-3495bb0142e4) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 69fe87cf-39b8-43ad-80b2-cff69ae49253) + ) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 3e1d0dae-7263-4e7f-a0a9-f957c13dbb6e)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 4f9e820d-36cf-4f0b-bf9a-56b74fc5e5cb)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 6b1fdda2-54d2-4223-8b44-6902537c4d54)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 8b72dd9f-0f8a-404e-abf9-f7427a45521e)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp b8cf2e87-014d-4e13-8641-679bf538dfdf)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp d3ca08d4-01d4-4a12-ba9c-dbcd1d893f98)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 24549bd7-9d2c-4fc8-bd50-6116c1a19a7d)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 79d70329-9b1f-4e23-982b-e5cdfd6f9281)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 980cb635-bf4e-4c52-b97d-9c9106066131)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp a0d7f099-f036-4139-9aca-ea436adb9989)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 106f311e-25a0-4e58-83ae-2b09e4dd7257)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 25ac63ba-55cb-41ef-b1ad-45f2ec4b2699)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 5853c293-254d-4076-8ce0-13c3747f4f49)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 66b404dd-51bf-4048-8bcc-30d7011d05d8)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 78cb359f-d325-4bf8-9044-d0f1b627e22e)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 84bc6768-a756-42fd-a630-a8fa73506ab9)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 19 "Net-(R3-Pad1)") (pintype "passive") (tstamp a9509d11-08ca-42aa-bc59-b6dcf4560cbb)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 11 "Net-(R3-Pad2)") (pintype "passive") (tstamp bc74a54c-6cc1-4572-b66d-a015e86017fe)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 00000000-0000-0000-0000-00005f0db84e) + (at 106.68 58.42) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f508930") + (attr through_hole) + (fp_text reference "R1" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 528f079b-06fa-4e3c-b516-1eec853888b0) + ) + (fp_text value "100R" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 5bffe907-ea9e-4cd4-af7e-44f81129e68b) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp b314fd38-2c1f-4688-be72-a127a6ac9f9c) + ) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 37e7daa2-d9dd-4528-bf7b-2cfd2ed60c85)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 5ff460c0-3ba1-4345-9439-79d79ce606c5)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 7cd26d34-3c50-44e3-8940-063af8aa9ac5)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp a7daa0c8-1c24-41dc-928a-d8d4cc3a6c64)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp b2a82c9e-f62e-4253-9cea-a3e82f8146d6)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp fb63a85c-3fd9-42d5-88ee-6c87e21998e1)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 1b50edce-fae6-4311-bd52-bf2faf95ec28)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 5ad8745f-8aa2-4f65-9920-cb1c81fc4e72)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 8dd8ff2e-969a-4149-969c-5191aeab88bd)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 8f41b075-8a6e-4d8b-b1c0-3addf77b1435)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 1d982b25-d1db-4eba-ad3a-687dfc22925e)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 6d5ffb70-0d74-4f8a-9612-9847534965f0)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 8a306046-5723-40b7-8994-44bfcb1118d6)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp b1fa79ca-0603-4923-9104-12c0fca5e91b)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp ed36997d-3699-46ef-8900-953ae6d69d53)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp f872e85e-7b91-40a5-a219-691b30c7ea30)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 17 "Net-(R1-Pad1)") (pintype "passive") (tstamp 3d2f827e-9020-4967-8051-c42782d04bdb)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 9 "Net-(R1-Pad2)") (pintype "passive") (tstamp 186a1787-b318-4189-96ef-9a42b98e2e02)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 00000000-0000-0000-0000-00005f0decd7) + (at 106.68 76.2) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/20ac2947-029a-4bef-9b1f-63bd1873260e") + (attr through_hole) + (fp_text reference "R4" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7707f51c-fd0d-4a3e-81c1-f82040019082) + ) + (fp_text value "100R" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f2dd660c-14c5-445d-b9c9-f05247145ce6) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp f27d26d7-9b10-43ce-b9e2-decacec91f3f) + ) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 0a8a1b39-312b-41dc-b974-a5a5c16b3a5e)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 0e0cce9b-e681-4c13-a2ac-41149fc79a6d)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 970458ff-85ff-43a4-a82e-c9b75b59b4a8)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp d76d501b-de67-4e49-bc84-52d34000b0f7)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp dda669ae-ba85-4fbb-aba9-3e2340466eb7)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp fb2d8659-d4b3-4965-a34d-487a062144e1)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 0309e4f2-1ff6-491a-b307-871b47b4e3f6)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 26aa033d-efdf-484f-aaf8-6efe9ae5a078)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 4e11109d-ea2a-490c-bcd9-543ace5b9a7a)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp a9f45678-3a2e-4406-863d-095fb79bc3e3)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 341ed90d-9348-4228-a6f2-6aa7033a2350)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 428b11f9-71f4-4e11-b380-a93dd1b48044)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 4daf60b6-c459-4c14-899c-ffd837b58b81)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 8f6891df-00ca-4929-88ff-d2153150b262)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp b75e4c1e-ba97-427e-8ee8-5f0de9d46ce2)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp f573ca8c-cbc8-48c3-b99e-081aa4b38524)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 20 "Net-(R4-Pad1)") (pintype "passive") (tstamp 4c770c07-8b4b-44a6-9cc0-5c0dae9b7548)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 12 "Net-(R4-Pad2)") (pintype "passive") (tstamp ffca0dd4-bcf4-4a20-935f-7b38591835ce)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Diode_THT:D_A-405_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE50CD5) (tstamp 00000000-0000-0000-0000-00005f0df7e9) + (at 142.24 68.58 90) + (descr "Diode, A-405 series, Axial, Horizontal, pin pitch=7.62mm, , length*diameter=5.2*2.7mm^2, , http://www.diodes.com/_files/packages/A-405.pdf") + (tags "Diode A-405 series Axial Horizontal pin pitch 7.62mm length 5.2mm diameter 2.7mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f5089dd") + (attr through_hole) + (fp_text reference "D1" (at 3.81 -2.47 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 96b25ca8-1d44-4a8c-bc1e-74976cdf2a4d) + ) + (fp_text value "1N4007" (at 3.81 2.47 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp ea19b11a-1cc5-4c1d-a0a8-39043603477f) + ) + (fp_text user "K" (at 0 -1.9 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a96c2c72-de01-4cc9-a1f5-19b74f5db656) + ) + (fp_text user "${REFERENCE}" (at 4.2 0 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 708967a4-09dd-48a8-b8fc-7b43151f05f8) + ) + (fp_text user "K" (at 0 -1.9 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 875edca6-08d9-48a9-8e10-76bbcb58c79f) + ) + (fp_line (start 1.09 1.47) (end 6.53 1.47) (layer "F.SilkS") (width 0.12) (tstamp 2094adf0-35d6-4085-b1f5-f6e9c9b4dbcc)) + (fp_line (start 2.11 -1.47) (end 2.11 1.47) (layer "F.SilkS") (width 0.12) (tstamp 305b4223-6eee-460c-a60d-d94ce78c56ed)) + (fp_line (start 1.99 -1.47) (end 1.99 1.47) (layer "F.SilkS") (width 0.12) (tstamp 427c17d0-bb1a-4fa8-99e5-17be57ace7d8)) + (fp_line (start 1.09 -1.47) (end 6.53 -1.47) (layer "F.SilkS") (width 0.12) (tstamp 55e53b4e-ed62-40b5-8fa3-9e78d04f2a2d)) + (fp_line (start 1.09 1.14) (end 1.09 1.47) (layer "F.SilkS") (width 0.12) (tstamp 61fbfac8-7af0-4f75-a629-413360113fb0)) + (fp_line (start 6.53 -1.47) (end 6.53 -1.14) (layer "F.SilkS") (width 0.12) (tstamp 9e93de91-dfa8-49b0-ab54-d8347cd89e4d)) + (fp_line (start 1.87 -1.47) (end 1.87 1.47) (layer "F.SilkS") (width 0.12) (tstamp bf277c37-4e97-42ed-b197-5e739d64770a)) + (fp_line (start 1.09 -1.14) (end 1.09 -1.47) (layer "F.SilkS") (width 0.12) (tstamp c1abecdc-0ab0-48cd-a754-a0d6811aae8d)) + (fp_line (start 6.53 1.47) (end 6.53 1.14) (layer "F.SilkS") (width 0.12) (tstamp f219fbf0-1a7c-4fd8-b09c-7e234a187955)) + (fp_line (start 8.77 -1.6) (end -1.15 -1.6) (layer "F.CrtYd") (width 0.05) (tstamp 0bd9f1e4-cb64-4499-a16a-350a3b484992)) + (fp_line (start -1.15 1.6) (end 8.77 1.6) (layer "F.CrtYd") (width 0.05) (tstamp 43f5fdd7-83f3-4282-9d30-8b352862d0c6)) + (fp_line (start 8.77 1.6) (end 8.77 -1.6) (layer "F.CrtYd") (width 0.05) (tstamp 88fbc8fc-9a54-4152-b8e6-450d29d7092a)) + (fp_line (start -1.15 -1.6) (end -1.15 1.6) (layer "F.CrtYd") (width 0.05) (tstamp f4c19a3b-15a2-4795-a704-0de12553b92b)) + (fp_line (start 1.99 -1.35) (end 1.99 1.35) (layer "F.Fab") (width 0.1) (tstamp 1a5063f8-6bbe-4616-b4cc-1faed04ad7cb)) + (fp_line (start 6.41 -1.35) (end 1.21 -1.35) (layer "F.Fab") (width 0.1) (tstamp 1a73147a-ce72-4b67-bcd6-107999e7ed1f)) + (fp_line (start 2.09 -1.35) (end 2.09 1.35) (layer "F.Fab") (width 0.1) (tstamp 224e0372-837a-48ca-b79d-1d540784af11)) + (fp_line (start 1.21 1.35) (end 6.41 1.35) (layer "F.Fab") (width 0.1) (tstamp 24faffda-bbfd-4428-981c-3f29c592d0d7)) + (fp_line (start 0 0) (end 1.21 0) (layer "F.Fab") (width 0.1) (tstamp 7515173d-42eb-43c8-8f34-7a3e820f30ed)) + (fp_line (start 6.41 1.35) (end 6.41 -1.35) (layer "F.Fab") (width 0.1) (tstamp 81564abe-a3b2-4955-99b5-2f4dc1541d47)) + (fp_line (start 7.62 0) (end 6.41 0) (layer "F.Fab") (width 0.1) (tstamp a3d2ce11-73c2-4d03-b481-f53ee210257b)) + (fp_line (start 1.21 -1.35) (end 1.21 1.35) (layer "F.Fab") (width 0.1) (tstamp b9ab0494-335c-4db3-8ba8-610001a69f77)) + (fp_line (start 1.89 -1.35) (end 1.89 1.35) (layer "F.Fab") (width 0.1) (tstamp e15d77c1-b3b6-4673-b868-d171a3ae590d)) + (pad "1" thru_hole rect (at 0 0 90) (size 1.8 1.8) (drill 0.9) (layers *.Cu *.Mask) + (net 2 "+12V") (pinfunction "K") (pintype "passive") (tstamp 412b982d-3970-4cc7-83d8-65f225d66379)) + (pad "2" thru_hole oval (at 7.62 0 90) (size 1.8 1.8) (drill 0.9) (layers *.Cu *.Mask) + (net 1 "Net-(D1-Pad2)") (pinfunction "A") (pintype "passive") (tstamp 0c9dd649-80e0-4be5-8265-62c6d41c93ad)) + (model "${KICAD6_3DMODEL_DIR}/Diode_THT.3dshapes/D_A-405_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_DIP:DIP-16_W7.62mm" (layer "F.Cu") + (tedit 5A02E8C5) (tstamp 00000000-0000-0000-0000-00005f0e0d3c) + (at 119.38 58.42) + (descr "16-lead though-hole mounted DIP package, row spacing 7.62 mm (300 mils)") + (tags "THT DIP DIL PDIP 2.54mm 7.62mm 300mil") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/db5460be-38eb-4169-98d3-87f3cad354a5") + (attr through_hole) + (fp_text reference "U1" (at 3.81 -2.33) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 2a1fa866-44a3-4ba8-ac77-74540f8c1ed3) + ) + (fp_text value "LTV-247" (at 3.81 20.11) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 30e0aa8a-ce3a-4ed2-a471-e166265ca416) + ) + (fp_text user "${REFERENCE}" (at 3.81 8.89) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f6b772ad-8bb9-4dc1-8a7d-1a79fc005b57) + ) + (fp_line (start 6.46 19.11) (end 6.46 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 6d223021-102a-487d-a52d-3ed7b103218a)) + (fp_line (start 2.81 -1.33) (end 1.16 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 6f2c3c11-c451-4f8e-a66d-6eaeab2df148)) + (fp_line (start 1.16 -1.33) (end 1.16 19.11) (layer "F.SilkS") (width 0.12) (tstamp 84818502-39ca-4596-a220-672495e43553)) + (fp_line (start 1.16 19.11) (end 6.46 19.11) (layer "F.SilkS") (width 0.12) (tstamp c3cbe7df-a5a3-4095-9b3c-b8eba2906a0a)) + (fp_line (start 6.46 -1.33) (end 4.81 -1.33) (layer "F.SilkS") (width 0.12) (tstamp c609b2a1-5497-4a0c-8de1-8b395ccb6709)) + (fp_arc (start 4.81 -1.33) (mid 3.81 -0.33) (end 2.81 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 77ffd435-779a-4850-ad41-85581f6496a1)) + (fp_line (start -1.1 -1.55) (end -1.1 19.3) (layer "F.CrtYd") (width 0.05) (tstamp 295472e2-2da6-4297-8cd5-43727b37744a)) + (fp_line (start -1.1 19.3) (end 8.7 19.3) (layer "F.CrtYd") (width 0.05) (tstamp 450b15f3-235f-4471-9a32-7bbc8a603ba2)) + (fp_line (start 8.7 -1.55) (end -1.1 -1.55) (layer "F.CrtYd") (width 0.05) (tstamp 96a0f916-1a48-4af3-b999-5654b2f03e4e)) + (fp_line (start 8.7 19.3) (end 8.7 -1.55) (layer "F.CrtYd") (width 0.05) (tstamp dbf78f33-4d5e-462d-aac1-7b784a482a3d)) + (fp_line (start 0.635 19.05) (end 0.635 -0.27) (layer "F.Fab") (width 0.1) (tstamp 863a56c2-b24b-4a07-ad3f-a3e8c6a87e65)) + (fp_line (start 6.985 -1.27) (end 6.985 19.05) (layer "F.Fab") (width 0.1) (tstamp acf2b4af-b7c9-4f5c-a39e-12a8fa012c66)) + (fp_line (start 6.985 19.05) (end 0.635 19.05) (layer "F.Fab") (width 0.1) (tstamp afe56577-c2d7-4365-b005-5cff8cb7ee7b)) + (fp_line (start 1.635 -1.27) (end 6.985 -1.27) (layer "F.Fab") (width 0.1) (tstamp b5285fd3-6722-4443-8239-7b996ece53c0)) + (fp_line (start 0.635 -0.27) (end 1.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp c7c3641a-46d0-4224-bae3-ec2f74b6d163)) + (pad "1" thru_hole rect (at 0 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 9 "Net-(R1-Pad2)") (pintype "passive") (tstamp 1532d4f5-26cb-4ede-ad45-beae123fc0ed)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pintype "passive") (tstamp fa090a42-65ee-4b0b-af48-1a46ecd11904)) + (pad "3" thru_hole oval (at 0 5.08) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 10 "Net-(R2-Pad2)") (pintype "passive") (tstamp fd87c064-0744-4a4b-8f1a-78dd17322df2)) + (pad "4" thru_hole oval (at 0 7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pintype "passive") (tstamp 04b71ff0-87b7-4db8-ab2d-96ad692c272a)) + (pad "5" thru_hole oval (at 0 10.16) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 11 "Net-(R3-Pad2)") (pintype "passive") (tstamp 6b30aade-d5be-42e9-9a50-554a369ab86d)) + (pad "6" thru_hole oval (at 0 12.7) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pintype "passive") (tstamp 6761c575-2c27-4d35-9600-ca27e199d0e9)) + (pad "7" thru_hole oval (at 0 15.24) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 12 "Net-(R4-Pad2)") (pintype "passive") (tstamp a21030d6-2920-4784-88c2-8860f0543d2a)) + (pad "8" thru_hole oval (at 0 17.78) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pintype "passive") (tstamp aa89e027-d931-47a0-ac3e-4efd27f05da4)) + (pad "9" thru_hole oval (at 7.62 17.78) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 8 "Net-(J14-Pad2)") (pintype "passive") (tstamp 8885531d-f9cb-4c35-ad6c-48bf2c6bd987)) + (pad "10" thru_hole oval (at 7.62 15.24) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 7 "Net-(J14-Pad1)") (pintype "passive") (tstamp 85e4f8bf-6b50-4284-ab9e-90659ed6cd67)) + (pad "11" thru_hole oval (at 7.62 12.7) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 16 "Net-(R8-Pad1)") (pintype "passive") (tstamp b8e292f6-2c1d-4d1c-86cc-787d1b7c5cfb)) + (pad "12" thru_hole oval (at 7.62 10.16) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 13 "Net-(R7-Pad2)") (pintype "passive") (tstamp 0ce11c23-6b94-489c-8b37-3fe30ef74a31)) + (pad "13" thru_hole oval (at 7.62 7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 15 "Net-(R6-Pad1)") (pintype "passive") (tstamp a0ef3d0c-a1a2-44b9-af51-d6f6cb3bc0c8)) + (pad "14" thru_hole oval (at 7.62 5.08) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 14 "Net-(U1-Pad14)") (pintype "passive") (tstamp adde05a3-fc83-4494-a2ef-a29065ba8aaa)) + (pad "15" thru_hole oval (at 7.62 2.54) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 6 "Net-(J11-Pad2)") (pintype "passive") (tstamp 08ac2285-65c5-4df2-9a6b-8be8c7aa9348)) + (pad "16" thru_hole oval (at 7.62 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask) + (net 5 "Net-(J11-Pad1)") (pintype "passive") (tstamp 732b7c27-b9f8-456e-b4ea-b9e505285c3f)) + (model "${KICAD6_3DMODEL_DIR}/Package_DIP.3dshapes/DIP-16_W7.62mm.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x09_P2.54mm_Vertical" (layer "F.Cu") + (tedit 5A19A431) (tstamp 00000000-0000-0000-0000-00005f0e17c1) + (at 101.625 58.42) + (descr "Through hole straight socket strip, 1x09, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x09 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/2bdda44f-4a64-4a91-a3b2-306502ca67ca") + (attr through_hole) + (fp_text reference "J1" (at 0 -2.77) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 6ff9fd05-b571-4652-bc94-cd16b71c22c9) + ) + (fp_text value "ESP" (at 0 23.09) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp bf256647-a71b-4eb7-8785-0080b99c4487) + ) + (fp_text user "${REFERENCE}" (at -2.54 10.16 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 97c09612-a2e4-496f-9820-7a58ee74ad39) + ) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 38d7f647-5e1c-43f1-b3c8-e7356dbd7d97)) + (fp_line (start 1.33 -1.33) (end 1.33 0) (layer "F.SilkS") (width 0.12) (tstamp 4aaaf78a-c660-467c-b3b7-d7ed7fea72bf)) + (fp_line (start -1.33 1.27) (end -1.33 21.65) (layer "F.SilkS") (width 0.12) (tstamp 5386d6b9-e2a1-40ee-a8d3-7f9e3b5007d2)) + (fp_line (start -1.33 21.65) (end 1.33 21.65) (layer "F.SilkS") (width 0.12) (tstamp a712265f-c95d-4e95-b459-bd8cbae905ae)) + (fp_line (start 1.33 1.27) (end 1.33 21.65) (layer "F.SilkS") (width 0.12) (tstamp ca97bedd-391a-47dc-9e0f-4ff35aeb5a2c)) + (fp_line (start 0 -1.33) (end 1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp cf295b73-8054-4167-9fe5-5bc6948e3f80)) + (fp_line (start -1.8 -1.8) (end 1.75 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 29f89b67-5328-4aa3-9bcc-12aa73e3da34)) + (fp_line (start 1.75 -1.8) (end 1.75 22.1) (layer "F.CrtYd") (width 0.05) (tstamp 6e43f003-0dad-42c6-bf3b-553428d73d20)) + (fp_line (start 1.75 22.1) (end -1.8 22.1) (layer "F.CrtYd") (width 0.05) (tstamp 865e2585-7c5b-4a8b-82da-fa79ac44b47d)) + (fp_line (start -1.8 22.1) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp efd4ecc3-1718-4bf5-9c1d-82d1404a6435)) + (fp_line (start -1.27 21.59) (end -1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 08061de6-3c60-4bc2-ba97-bea5078fa931)) + (fp_line (start 1.27 -0.635) (end 1.27 21.59) (layer "F.Fab") (width 0.1) (tstamp 5f7e6147-1aac-46df-aa3d-61e17388b9f7)) + (fp_line (start 0.635 -1.27) (end 1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp dc21d66d-d47c-4d0c-a13d-031307679da0)) + (fp_line (start -1.27 -1.27) (end 0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp ded8d73d-1bda-4417-9336-fc8697d360f2)) + (fp_line (start 1.27 21.59) (end -1.27 21.59) (layer "F.Fab") (width 0.1) (tstamp e059d24b-cf2f-4df2-8156-43ff0fb5ad53)) + (pad "1" thru_hole rect (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 17 "Net-(R1-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp c7e9b0c5-7a00-4a14-8ddc-fe64e51f398d)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 18 "Net-(R2-Pad1)") (pinfunction "Pin_2") (pintype "passive") (tstamp 120ec684-6090-435a-b270-fa23265688f5)) + (pad "3" thru_hole oval (at 0 5.08) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 19 "Net-(R3-Pad1)") (pinfunction "Pin_3") (pintype "passive") (tstamp 058dca80-741f-4093-9441-17d578454f63)) + (pad "4" thru_hole oval (at 0 7.62) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 28 "/D3") (pinfunction "Pin_4") (pintype "passive") (tstamp 00d87d82-d419-42b6-ada5-1d051e42e13f)) + (pad "5" thru_hole oval (at 0 10.16) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 26 "Net-(R9-Pad2)") (pinfunction "Pin_5") (pintype "passive") (tstamp 7b3ad66f-1a25-42f7-b763-ac7a44a0f4c0)) + (pad "6" thru_hole oval (at 0 12.7) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 27 "/3.3V") (pinfunction "Pin_6") (pintype "passive") (tstamp a566a677-e4f8-4dfd-855b-d083df03dddc)) + (pad "7" thru_hole oval (at 0 15.24) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pinfunction "Pin_7") (pintype "passive") (tstamp 922b8ff1-09dd-456d-b238-9abfea0658f8)) + (pad "8" thru_hole oval (at 0 17.78) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 20 "Net-(R4-Pad1)") (pinfunction "Pin_8") (pintype "passive") (tstamp 2ff23d0d-7b5e-4d90-b19e-2e3dbc93f0ef)) + (pad "9" thru_hole oval (at 0 20.32) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 21 "Net-(J1-Pad9)") (pinfunction "Pin_9") (pintype "passive") (tstamp f98cf7dc-9651-483a-aa0e-af63995f029b)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x09_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 00000000-0000-0000-0000-00005f0e1c1e) + (at 106.68 60.96) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f5088a4") + (attr through_hole) + (fp_text reference "R2" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 72ee0951-6360-4e5a-b9f4-01d3599146dd) + ) + (fp_text value "100R" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 77e124d6-c888-407c-a2c9-e0754a1151f1) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 14ee753a-34df-4b67-86f1-bbd85c87a91c) + ) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 5768e043-61e2-464f-b49d-9cf618cdf168)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 7f16747f-5eea-4de5-85df-4b3bc6c5a903)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 8a84f5ad-7e16-46e1-990e-1e3c2ee57bb5)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 9a2f2c60-1ecc-4725-80b1-40050d472a65)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp d37a73d4-d786-4899-9ab9-49524a29dec8)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp e7b3b74a-edbb-4318-b17d-3802f244daaa)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 1c3721e9-eb1d-4340-884f-e29b7d38e515)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 2beabe37-52be-4aa8-b0fe-16a423e53c35)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp a0dde88b-9b1f-4e00-956a-0a909f6e5009)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp b5c4d660-246c-4d80-8b4a-f03e25b39161)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 004b80d3-2cf4-40fb-b1ce-dea52d00a488)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 3e713acf-b6da-4605-8077-da002ee4c75d)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 5ef0891f-af4b-4ab3-a04b-10405ead9d42)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp a3ecc40f-16af-4fb7-9b9a-6e48702b3f24)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp ab716cab-1031-43c8-8542-fcc5b078e537)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp b2334d8d-fd9e-4c4e-8523-f05b3699b08b)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 18 "Net-(R2-Pad1)") (pintype "passive") (tstamp 37c51675-6ee1-4626-badc-349a82b0f72a)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 10 "Net-(R2-Pad2)") (pintype "passive") (tstamp b3ee17e5-86bd-4081-9a6e-c32d786e160f)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp 0c37789b-303a-4458-b351-bd60d9bfecce) + (at 144.78 60.96 180) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f508a23") + (attr through_hole) + (fp_text reference "J12" (at 0 -3.81 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 993320a5-7601-4a13-836e-55511f83b29e) + ) + (fp_text value "Valve 1" (at 1.27 6.35) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 20eddd65-4ccd-469a-9844-338f88f6cab4) + ) + (fp_text user "${REFERENCE}" (at 0 1.27 90) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 9a2a6b6d-590f-490b-aa4a-657d2e176887) + ) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 272f1f85-a23c-4788-b38e-c7069c1a5dac)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 494a739d-cb4d-4790-b638-b7759288d904)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 54131297-b755-4dd3-8d5e-b6ace334bb79)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 77726282-a2aa-42e7-9740-48a7a06ab1b9)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 8cda7583-d537-42a5-a8a7-796b65753868)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp b3d72771-b2b0-4624-bb1e-99540cbbc76c)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 473fc374-d0d1-4d18-84ad-dcbb908a6692)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 6c6af1a5-775a-4108-8706-e4cbc4bcace1)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp e08be6a5-5d41-44e0-af21-8fc01c54554f)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp ea7929d8-68d0-4d43-95d4-4220430194df)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 631280f3-d088-483c-b50b-08fe0489e492)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp e64cd4b3-da16-4c46-84db-606bc9ec99c4)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp e79a9992-8dce-44ec-94fe-6dfca616a68b)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp f3707fd1-a268-46e2-a13f-b2037a90e68e)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp f46eb0d3-f744-4713-a34a-2774c00a8803)) + (pad "1" thru_hole rect (at 0 0 180) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 2 "+12V") (pinfunction "Pin_1") (pintype "passive") (tstamp 0c8a431a-dee6-4744-abcf-6d84cac4872e)) + (pad "2" thru_hole oval (at 0 2.54 180) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 1 "Net-(D1-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp f820fc80-874e-4a4f-876e-f743bed401c5)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 0dc825ff-ef24-4ce9-b710-9e507e4275a4) + (at 106.68 78.74) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/0ca74120-cd87-45be-9db9-b0132d5e8c71") + (attr through_hole) + (fp_text reference "R10" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp e77a52f0-dc2d-4f84-8511-981bb9a31d52) + ) + (fp_text value "1K" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 67521749-afef-44ca-b084-26fa143c47dc) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp b6599995-8502-41f7-ad6d-843e2e1cb5c7) + ) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 04a2d8b4-a678-46ce-9848-12c2f2f78062)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 1b54ab60-03c6-4e3c-9bd0-ac0d57fd3132)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 89a36a30-a54e-4961-b95a-bb68aca0fcae)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp ea6d2c28-ee4e-4b33-a6be-16ef0b4fa531)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp ea8ebe08-c997-4d18-827f-12f3c35c2c1a)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp ffc88380-8b78-425d-b888-fa9141b91eac)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 31a85d82-1aeb-4f4e-8ae9-3c865a8c10a2)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 7db1d148-f5ba-459b-9e6d-2022c9fda7ec)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp aa6b548d-f757-4cdb-ad39-d5c753d1450a)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp beacf745-21be-44a3-bc39-51c1e5429c1d)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 217ccd79-15d5-4ca4-a8cb-9b40d9461af6)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 415a3548-a724-46b7-b782-0c6677e30606)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 90e4acfe-6405-430b-9eae-7ace61dd5110)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 924a3f19-cbf5-4fdb-91b5-577554966490)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 9430eaa7-2e0a-4619-ad00-8848abb8034c)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp ce7c14cf-f434-46e9-95b5-2c3f5a246690)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 21 "Net-(J1-Pad9)") (pintype "passive") (tstamp b0ad9ace-8b1b-47bf-a2ab-61ef9aefe0ac)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 25 "Net-(R10-Pad2)") (pintype "passive") (tstamp 8dc10f17-4346-453f-8be8-7913e25d8730)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp 1db86964-6ea0-40fb-b7ff-59d230318fa7) + (at 111.755 81.28 90) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/7170ed2c-0e15-4189-ae8c-08c797d7caab") + (attr through_hole) + (fp_text reference "J15" (at 0 -2.33 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp c0888f61-c57a-41de-bcae-27fa6ad1ff1d) + ) + (fp_text value "IR" (at 0 -2.535 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1618e3d2-fbaf-4c8e-bc0b-e04850ef51cd) + ) + (fp_text user "${REFERENCE}" (at 0 1.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f3aabbfe-5221-466e-9dc4-499c35ed1a66) + ) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 350a1204-2a1a-4c3f-853d-7e85537048a7)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 43213ca4-abb4-41ea-867e-8288b71fb4fc)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 786dda36-9a09-438c-a6f7-5a3c83bfcfe1)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 7be80f8c-9e52-4e15-bb23-7b2bd10d9476)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp b981fb0d-64fe-4033-a5ee-1cdcaedad35b)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp d8fb1b44-974c-4dee-9b24-fdc3982e6c77)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 3827aac4-ded0-42dd-8ced-271f4c8e0051)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 694451d6-2d0e-4c81-83c0-7c34cee82a7d)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp b7419fde-905d-46e2-821e-4be9e3fdfb5f)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp c50ab0b7-1389-4d83-ac03-dd978b4db852)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 3216e9fa-f5dd-4d8b-82c2-b64cffcd717d)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 7b563dac-be2d-4dff-85b1-bcd5d191ad98)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 80e2eb16-4078-458d-a530-b2b866430ba2)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 9c55585d-e493-43ae-9e1c-edbe9b31cad0)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp e556f330-b472-4bf0-bd22-a4ce0cb39552)) + (pad "1" thru_hole rect (at 0 0 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 22 "Net-(R11-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp 635e77f4-699d-444e-b0d8-857b83bef9bd)) + (pad "2" thru_hole oval (at 0 2.54 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 23 "Net-(Q3-Pad1)") (pinfunction "Pin_2") (pintype "passive") (tstamp 39b7347e-5aec-44f0-ae9f-e2a4ecee9462)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 2b0d4d70-d7d8-494c-80eb-464631ccd894) + (at 132.08 71.12) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/e771a23f-5482-42b5-bba2-d3ac332e91c4") + (attr through_hole) + (fp_text reference "R8" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 60c0bc21-4018-467e-b2d9-7f1e2d6539c9) + ) + (fp_text value "1K" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d6734966-88e7-443c-bfa2-c28193fb757f) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 12ad2720-d6c9-48fc-ab19-ef6c5dfe7f8a) + ) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 2667ba54-f5e5-4452-9be6-04b596628745)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 55bc4845-6692-4c98-b972-c3ba0b8b0cd8)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 6e82ca65-65ac-4238-8c24-beb9b86dd388)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 86e7bda1-2b67-4cbf-8514-9adf4c1e7864)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 9200742f-1dba-4a80-96a3-d290e8da3366)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp d18b0e1c-0645-48dd-bac3-5e64457dfe3e)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 41b63f1d-0305-4b6c-b71c-7afd5b4e78e8)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 42185218-bae7-48b7-8f32-8deda40efc85)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 55fd47f1-fe15-4407-aae7-86aff8927c4d)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp e586d112-007f-48d4-a4a0-5c2fd0fe4f7f)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 4908c9a6-e0d4-44e5-be14-ca75ce95af0f)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 52d5366e-e7a6-4857-9818-5a11d7f6a867)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 8e32ae18-e9ff-4697-b0dc-89e2a8931fde)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 93c4ea27-8e51-4178-b7b8-8c089825cff9)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 9a4530fe-85a4-4469-b35a-014c6d5bb772)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp ef328d0b-4477-4be3-b41b-5eba91031f1a)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 16 "Net-(R8-Pad1)") (pintype "passive") (tstamp e0d772c6-e515-4895-a2b2-f4c1a8c0e6c0)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 3 "GND") (pintype "passive") (tstamp dae75534-0314-41fe-93c3-6bab55836abe)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Diode_THT:D_A-405_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE50CD5) (tstamp 2b8ea394-0f3e-45ec-a466-692315465aff) + (at 144.78 81.28 180) + (descr "Diode, A-405 series, Axial, Horizontal, pin pitch=7.62mm, , length*diameter=5.2*2.7mm^2, , http://www.diodes.com/_files/packages/A-405.pdf") + (tags "Diode A-405 series Axial Horizontal pin pitch 7.62mm length 5.2mm diameter 2.7mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/7d330779-7275-4e95-832c-46969b23a74d") + (attr through_hole) + (fp_text reference "D2" (at 3.81 -2.47) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8bc8c32e-b764-44b6-91b8-7c440758b614) + ) + (fp_text value "1N4007" (at 3.81 2.47) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 94c329c9-b8a2-422c-9863-0822dbef1f47) + ) + (fp_text user "K" (at 0 -1.9) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 9f11663f-e157-4750-8659-b6785040d91d) + ) + (fp_text user "${REFERENCE}" (at 4.2 0) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1fed06fb-8f0f-46dd-ba97-6bc29f94a184) + ) + (fp_text user "K" (at 0 -1.9) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 3828f476-f380-4452-95ec-54d36acc766e) + ) + (fp_line (start 6.53 -1.47) (end 6.53 -1.14) (layer "F.SilkS") (width 0.12) (tstamp 1b652d8d-f2d2-42cf-9308-eb4f76698aa5)) + (fp_line (start 1.09 -1.47) (end 6.53 -1.47) (layer "F.SilkS") (width 0.12) (tstamp 556c4074-4b94-4717-ba1d-3256f9a706b9)) + (fp_line (start 1.09 1.14) (end 1.09 1.47) (layer "F.SilkS") (width 0.12) (tstamp 5c01ad6f-53ee-4f64-8d46-46d265550518)) + (fp_line (start 1.99 -1.47) (end 1.99 1.47) (layer "F.SilkS") (width 0.12) (tstamp 7c757d0c-6f22-4ab8-b72f-1edde9f0445e)) + (fp_line (start 1.09 1.47) (end 6.53 1.47) (layer "F.SilkS") (width 0.12) (tstamp 906e0ea5-589b-4481-9ae7-79d1f1ef7234)) + (fp_line (start 1.87 -1.47) (end 1.87 1.47) (layer "F.SilkS") (width 0.12) (tstamp c861ea98-8621-41e1-b881-8127133bc280)) + (fp_line (start 1.09 -1.14) (end 1.09 -1.47) (layer "F.SilkS") (width 0.12) (tstamp f3d5078b-c1fb-4dc5-884e-ff69cc38c83b)) + (fp_line (start 2.11 -1.47) (end 2.11 1.47) (layer "F.SilkS") (width 0.12) (tstamp fc886493-7684-41bb-a6c1-2a6a72d38b40)) + (fp_line (start 6.53 1.47) (end 6.53 1.14) (layer "F.SilkS") (width 0.12) (tstamp fe89109f-2c87-4032-858a-91e30b705b25)) + (fp_line (start -1.15 -1.6) (end -1.15 1.6) (layer "F.CrtYd") (width 0.05) (tstamp 12e9c481-29d5-414f-bed5-6fcf197473c5)) + (fp_line (start 8.77 1.6) (end 8.77 -1.6) (layer "F.CrtYd") (width 0.05) (tstamp 401c0fdd-f95d-4e7f-abed-0768d11df188)) + (fp_line (start -1.15 1.6) (end 8.77 1.6) (layer "F.CrtYd") (width 0.05) (tstamp afa65158-da31-4bea-8c7b-11dbe1fb18cd)) + (fp_line (start 8.77 -1.6) (end -1.15 -1.6) (layer "F.CrtYd") (width 0.05) (tstamp eea62fa2-1bd1-4075-9103-ee5cb8773dfc)) + (fp_line (start 6.41 1.35) (end 6.41 -1.35) (layer "F.Fab") (width 0.1) (tstamp 004485dc-1685-463e-a289-fe32e5fec6ce)) + (fp_line (start 7.62 0) (end 6.41 0) (layer "F.Fab") (width 0.1) (tstamp 3a41998c-ad3b-4532-b01d-ffa700e9ca46)) + (fp_line (start 6.41 -1.35) (end 1.21 -1.35) (layer "F.Fab") (width 0.1) (tstamp 71eb9125-c2a2-4564-bee5-08c9bd2dd61e)) + (fp_line (start 1.21 -1.35) (end 1.21 1.35) (layer "F.Fab") (width 0.1) (tstamp 82a0a71c-55af-4ec1-8edd-024d98a88f29)) + (fp_line (start 2.09 -1.35) (end 2.09 1.35) (layer "F.Fab") (width 0.1) (tstamp 986f3e93-ed0f-4b2f-8177-396a93613946)) + (fp_line (start 1.21 1.35) (end 6.41 1.35) (layer "F.Fab") (width 0.1) (tstamp cf30835d-d004-41f1-aee6-a264e2a89c15)) + (fp_line (start 1.99 -1.35) (end 1.99 1.35) (layer "F.Fab") (width 0.1) (tstamp f0c6d2ae-f55e-4797-85b0-8b13004132c9)) + (fp_line (start 0 0) (end 1.21 0) (layer "F.Fab") (width 0.1) (tstamp f93055e9-58fd-4e08-b06d-ef54d1683db4)) + (fp_line (start 1.89 -1.35) (end 1.89 1.35) (layer "F.Fab") (width 0.1) (tstamp fe12a1dc-bf9e-4a82-90c6-56a3ae89052e)) + (pad "1" thru_hole rect (at 0 0 180) (size 1.8 1.8) (drill 0.9) (layers *.Cu *.Mask) + (net 2 "+12V") (pinfunction "K") (pintype "passive") (tstamp abdff2e4-2b9c-4a4e-a8a1-0ff16833d5a1)) + (pad "2" thru_hole oval (at 7.62 0 180) (size 1.8 1.8) (drill 0.9) (layers *.Cu *.Mask) + (net 4 "Net-(D2-Pad2)") (pinfunction "A") (pintype "passive") (tstamp 6b98cbdd-688e-4e5c-b9b8-4dcbaa1b43d8)) + (model "${KICAD6_3DMODEL_DIR}/Diode_THT.3dshapes/D_A-405_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 3203ddc7-599a-4598-9ee3-3a5874562c13) + (at 114.3 71.12 180) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/1432aa29-d149-44e0-9cc3-e01fa3b1eac9") + (attr through_hole) + (fp_text reference "R11" (at 3.81 -1.92 180) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 8189323c-6918-4630-8223-3ccf65c5398c) + ) + (fp_text value "22R" (at 3.81 0 180) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 0186009f-0ef0-4a38-be90-0c97ded99ef0) + ) + (fp_text user "${REFERENCE}" (at 3.81 0 180) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 6d263417-c8a0-490b-9f5c-5c02ec0effa2) + ) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 1a3fdb35-15aa-4d3b-802a-09b9dd8b21ab)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 343f8003-ade4-4847-9511-0988a3b55857)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 5143aeb6-cefc-4cbe-be95-a9e6a7e250cd)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 815dbe97-2dad-4671-9a33-263d64dbc3cf)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp adef97cd-e5a6-477b-bce4-2ea52e26e9c6)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp e0bda57b-e1ca-443d-9fb1-85bc658f0161)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 15cf932c-563f-48bf-bf98-99d0fb5793ca)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 4960edc2-b7e7-404d-ba24-51bc8cd08850)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp d1e455e5-8475-429c-82c9-6d5d74407cd1)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp e01d8ecc-15ed-4e20-a6cb-70669b5a81a1)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 5dc9053f-1237-40db-86b2-889284dfba1e)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 897e6807-137f-4dd9-8d3d-5b81488466a5)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 91ca2e23-83ae-47f5-b733-b161b5e7a65f)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp b7b3a392-b549-4f0d-93ff-2ff617f10033)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp c5d7352d-ce3b-4f42-8e5e-9dd9f71ba0e9)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp f202e840-c2da-4e7b-8597-3eb01e1a079d)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 22 "Net-(R11-Pad1)") (pintype "passive") (tstamp c6fe08d9-b34d-47dc-854b-3c101cd4f163)) + (pad "2" thru_hole oval (at 7.62 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 27 "/3.3V") (pintype "passive") (tstamp 34689b8b-b72c-4a65-a6c5-94295b04d976)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 390777ca-04fb-468a-abf5-6853b724e09f) + (at 114.3 68.58 180) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/62438ad9-bdeb-4be2-9254-38dac2f7bf14") + (attr through_hole) + (fp_text reference "R9" (at 3.81 -1.92 180) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 970d247d-c7ae-4a27-af83-e168397a4b3a) + ) + (fp_text value "200R" (at 3.81 0 180) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp b23bc0cf-7662-4628-b5ba-cfe5d34b8728) + ) + (fp_text user "${REFERENCE}" (at 3.81 0 180) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 9cce8218-2bc1-4bcf-8f0b-effa932e8ea8) + ) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 59947981-cd4e-42c3-9c3f-645be4c5c511)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 60551b72-5061-4be0-8dab-2ddf61ea4f6c)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 6fb946a7-65c6-4941-8812-d8745b6251ce)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 83f6eb77-70a1-4af0-93d5-fdff4895400e)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 9398cf0b-36e0-4d24-ba38-19b4626de5ba)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp dac473db-d036-4a07-9b2a-c4058f9dee4f)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 0376148f-93cc-42cd-a08a-6d092a09e230)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 207cfd54-04b6-4cb6-8919-48e77248589a)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 72449227-a04e-4ec7-bdc3-f83042d9d6c7)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 94ae909f-74d6-4411-861f-4d8cfbdb732b)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 13816589-9432-4e34-8d01-b4d4c88010c9)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 2991b52b-16d4-4c7e-8057-b099b114a75e)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 47f04e79-50d4-45c4-b12d-063abf8fa9c2)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 84debe8a-03d6-4e8a-bc89-2a8f6d39a501)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 9624e387-df6c-4873-b51d-e0d9f9fdb444)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp ea76a795-1762-4ae0-9635-c0ba413c38fa)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 24 "Net-(R9-Pad1)") (pintype "passive") (tstamp b3904d6d-7d14-455d-bdc5-087b12c42233)) + (pad "2" thru_hole oval (at 7.62 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 26 "Net-(R9-Pad2)") (pintype "passive") (tstamp a13cf60e-2b45-4153-b343-f20139b1f617)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 4fa564cf-6a7c-4cfe-8de6-b3fb0af7789f) + (at 139.7 68.58 180) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/e613a07e-716e-42c6-9100-c2fb4978f7c0") + (attr through_hole) + (fp_text reference "R7" (at 3.81 -1.92 180) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp c8f628b8-0f2d-427d-8eba-83ae986961d0) + ) + (fp_text value "1K" (at 3.81 0 180) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 152e883c-5218-4b61-9138-da737c1b37b6) + ) + (fp_text user "${REFERENCE}" (at 3.81 0 180) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 2a79812a-a15b-4155-8372-c3a99d570605) + ) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 160fe9d5-4380-4f29-8b74-3b23df1108b6)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 2e1766fa-59fc-4e40-bfbf-4f5a372cc03f)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 31583188-06d6-49a0-b788-8c8cfb422add)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 46749514-845e-4540-9c81-9f42f8fc37a3)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 5791c76e-7bc1-4697-87cd-78e6a0c7b3af)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp ea052490-c013-4c62-8201-289b3a098c17)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 011b3fd6-0f3a-4da7-a947-15ef889ef348)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 863ee885-3fc5-4970-9e1a-b3ae5c61e0bf)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp f52d012c-23d4-4412-bac4-3a54cea2786a)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp fa78be0f-3d18-462a-aa18-16e0e47e843a)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 2b9fffef-5563-4a89-aea1-dd8d92f9082c)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 49b25614-4655-4044-a37e-cdabb5ed8b60)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp 740d141b-7444-48bf-a298-f70a28aba5c6)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp 83ece082-ab5c-4a64-8964-af90b5516a25)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 9192ffca-1930-4627-bf5e-99a311bfd38f)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp e6f58ca2-3a93-48cd-b403-094a4006cf3c)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 2 "+12V") (pintype "passive") (tstamp 254ab2a1-e5af-488f-b377-abdea8265d02)) + (pad "2" thru_hole oval (at 7.62 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 13 "Net-(R7-Pad2)") (pintype "passive") (tstamp 1b959503-5a24-436b-ac31-e5b6f03f14a2)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp 5a44efcb-d0c9-4ce2-bd10-177ab9d12800) + (at 129.54 73.66) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/a7a6c287-8b95-4c4f-9024-d870da2fb4ed") + (attr through_hole) + (fp_text reference "J14" (at 0 -2.33) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 018e97ed-c613-414d-bb1f-aa7d06729d19) + ) + (fp_text value "Flash" (at -0.635 5.08 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp bec37f3b-0254-4c8d-b17f-0ea69d897772) + ) + (fp_text user "${REFERENCE}" (at 0 1.27 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 2e361c99-ece0-490c-9023-d0cea9c2fd43) + ) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 02c5f048-b101-457c-bdbe-15fe7dc692f3)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 3f042e75-e0dd-48a1-b8bf-6ad66c0d0682)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 688fe44d-071a-4644-8e25-74469eab83a8)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 9cd8a81e-42b5-4af3-8dfe-47be1d53c9c1)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp d98f9874-9f0a-44d5-9307-74a400d5fa83)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp ddacc89f-af99-4a3c-8bcc-0c8bb301b6cd)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 129de1fb-3e9b-415e-a990-ca0caabf8e34)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 35852272-80e8-40c8-932b-c2e5a4687e18)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 5b2c4ed3-4885-4198-87a4-916d340b59d5)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 7c489709-a45b-4721-8913-7f66c4a5e2b3)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 00b67d74-feef-40ec-a9e7-e1688c55229b)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 09ad605e-824f-4189-92ea-7cc97d96829b)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 0aff35b6-9197-4590-b517-f5a0ba507e7f)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 6446f9db-1aa2-4c5d-a175-f8b2140d487e)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp b3c0a354-9f74-42c2-afe7-d492a5088b63)) + (pad "1" thru_hole rect (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 7 "Net-(J14-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp 54ff94b3-a625-4dfa-a1cb-11113e56a3bf)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 8 "Net-(J14-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp 5abdbe92-ae6a-4ff2-884d-6cb99943af96)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp 74c90b86-30a4-4057-93d5-9bda4912dc55) + (at 129.54 58.42) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f508a07") + (attr through_hole) + (fp_text reference "J11" (at 0 -2.33) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 27425dee-421b-4eac-ab04-804e052c5bba) + ) + (fp_text value "Camera" (at -1.27 -2.54 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7ade6a3c-c788-484b-b383-14a149566f45) + ) + (fp_text user "${REFERENCE}" (at 0 1.27 90) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a9a52d5b-2438-46a8-95e9-a40525fd1531) + ) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 1d456c6e-da26-475d-94fc-fec434538dc4)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 348b0ec3-484b-477d-9b3b-fa9e4c6c94e1)) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 3f3562c3-4106-46b3-aa58-47115f17de81)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp c6ed9413-e499-4347-853a-55cb5d54e9c2)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp de0828c1-fd4c-4202-a073-6f1b35ae2969)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp efdbf8f7-8bc6-4341-afbe-da42dcce8ba0)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 577e8bb6-b322-4892-9da4-9ef62c1576fd)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 81e0a4ca-0646-4d44-ab02-4c1de356fa63)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp b4df8e70-611c-4d89-829c-48cbf7ccc563)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp e906ef71-51ee-441f-a071-82a8756af4e7)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 7a16a7f1-c17c-459a-9b86-4fda552055ac)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 9b44d3e5-b5ec-44b9-8ccc-84e13a02b32d)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp b143ac52-d99e-4716-9513-451af493188a)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp b8e3981d-20a6-47c4-91a3-47bc5ceff28a)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp e9f25439-0418-4900-a32f-3bc52b515cb8)) + (pad "1" thru_hole rect (at 0 0) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 5 "Net-(J11-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp 6a454aa2-b0dd-4c09-9005-e9a0db90dc47)) + (pad "2" thru_hole oval (at 0 2.54) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 6 "Net-(J11-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp 74ee81e0-e2c9-4840-9044-d18220145913)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp 84da67a6-bebc-4952-9e19-f3ef8aaa5afc) + (at 132.08 81.28 90) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/182fbb93-0096-492c-82ec-a3699b10e48b") + (attr through_hole) + (fp_text reference "J13" (at 0 -3.81) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp f0ab0465-1fcc-4d1a-b05c-caee56665219) + ) + (fp_text value "Valve 2" (at 0 -4.445) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 432618a9-11ef-4a65-95a5-25beb42d1704) + ) + (fp_text user "${REFERENCE}" (at 0 1.27) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp b844af32-d8ae-43d0-a482-f432dcae5a94) + ) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 01336d0e-68f2-4964-aa51-67e24707276f)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 2404c4e0-b49f-493b-9221-3375d24b5ce8)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 2825a50a-34bc-4be2-a7cf-c54168a11f2a)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 3448974a-2da0-4baa-8800-4a1e4dd2fa6d)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 74fc31cf-6729-473b-850b-a32261d9a39f)) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp f5123a2a-ea5b-461f-a679-fa671ea8642f)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 17b2113a-8e41-40d6-9543-b57b9b614822)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 60e1d5bf-06de-44a5-a849-19ef9f6d6884)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp cc1cc2f7-2e00-4d98-850b-73e9de40fe37)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp cefcaca1-8923-42d9-afbe-116b4481056a)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 031d77e5-9106-4421-a9ff-0adfb08bac1f)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 092d8bf4-b551-487d-9927-ff2e16a72c9e)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp d8b480b8-491b-4138-a8be-cda2c2d6b9fe)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp de26e95a-954c-4985-b6d5-269b9f8397d6)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp edd2cc19-d5ef-4eb1-aa75-d9303b26229b)) + (pad "1" thru_hole rect (at 0 0 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 2 "+12V") (pinfunction "Pin_1") (pintype "passive") (tstamp 84102ccf-8d7a-45ab-87ba-e6ad0b290d0b)) + (pad "2" thru_hole oval (at 0 2.54 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 4 "Net-(D2-Pad2)") (pinfunction "Pin_2") (pintype "passive") (tstamp 8c87e029-ffe5-4c7c-b01a-130d6c00c9c6)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp 8abe3a8e-40df-48f6-993e-1984f4656d89) + (at 139.7 63.5 180) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f508963") + (attr through_hole) + (fp_text reference "R5" (at 3.81 -1.92 180) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 81210098-4316-4691-8def-41b01b5ebd7f) + ) + (fp_text value "1K" (at 3.81 0 180) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 50530273-4d70-49bc-befc-54e27cf450e4) + ) + (fp_text user "${REFERENCE}" (at 3.81 0 180) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp 92f6b68f-d518-468b-a0d7-0347e95ffe7d) + ) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 17b45a24-6d54-4a2e-b36a-11417a909f1e)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp 324eac56-0f07-4231-9c38-6d123c65458f)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 46c2b2e4-bee5-44d9-a31a-cc3ba26a07fb)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 4e518bbe-4079-4cb2-a0aa-6210278145c4)) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 6c758057-3d83-4948-a7a4-b7663131953e)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 7dd6aa24-7467-4d93-855d-67b18114002a)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 2861e34b-d63c-48cf-a21c-36df034809bc)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 56408d15-a44b-4ffe-92a6-b3bc127d2301)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp e0bf9fe8-22af-4b9e-8826-b3da40d6db18)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp f7e7f235-21c0-41e1-898f-c761adb7b484)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp 1482c43e-8196-4a40-8b76-541126320664)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 4fed5fc5-5b46-4100-aa7e-6460fcf4e5e0)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 99f77936-cacc-49f1-827c-11d978b2d1cf)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp ee6261ee-3304-4eb8-8c5d-4f9dd5735c81)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp f657a14b-f712-457d-b1e5-987f1b4ed8be)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp fa908c45-1c62-49b3-9c74-a536f76a84c4)) + (pad "1" thru_hole circle (at 0 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 2 "+12V") (pintype "passive") (tstamp 781d636d-5593-4392-8b7e-4b4bc2f45d5a)) + (pad "2" thru_hole oval (at 7.62 0 180) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 14 "Net-(U1-Pad14)") (pintype "passive") (tstamp 2461da91-011c-4967-80cf-d97028d8d68e)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp aa0c57f9-0496-49c2-9596-e2effcc00dba) + (at 106.68 66.04 90) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/6cff5a5c-63fd-4755-9b6a-e4d2cc4df440") + (attr through_hole) + (fp_text reference "J17" (at 0 -2.33 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 75375d99-6d4b-4161-b10b-f7bf0a1c3815) + ) + (fp_text value "Trigger" (at 0 6.985 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 3914a73d-58cb-4037-987a-462d1d796218) + ) + (fp_text user "${REFERENCE}" (at 0 1.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a33ca168-01f6-4f2c-8aee-fc408baa1b9c) + ) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 3a293957-6517-44b8-a07c-646be432fa09)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 46b088c9-7ff7-44c1-9d23-b0226d5d0f87)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 8678631e-8106-4e2b-949f-8f16de4f03fd)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp c9c302a9-3a4e-4acc-aae7-42ac06d4dec1)) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp ce0e1602-70f7-4950-b223-e066c30d6807)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp ef17930b-b488-486f-bd23-f35a35774484)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 11d0f5fa-e6c7-4989-a0c4-a11657b185e9)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 807219d6-2844-450d-b121-e3847566ef05)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp a7bf9ffa-7886-4a5a-bb5e-4721c558c9f7)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp f7b88409-d4f4-4b3a-81e7-3a9913d75b9e)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 2acf2fc0-cc0b-4ec2-9e58-eba38130b204)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 69cb735d-2bf7-4f58-b02d-114ada0af931)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 77ec90f6-d179-4da0-90e1-9bfbaa78f00c)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp db97b37e-c157-4e3e-9f58-2513c1207eca)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp f903dd39-efe6-489a-bbe5-c1e35672672b)) + (pad "1" thru_hole rect (at 0 0 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 28 "/D3") (pinfunction "Pin_1") (pintype "passive") (tstamp 214335d4-abc4-4d20-8bc6-517f596b7eaf)) + (pad "2" thru_hole oval (at 0 2.54 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pinfunction "Pin_2") (pintype "passive") (tstamp 4ffacc4b-ab65-4463-ac65-886fe68ba53a)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (layer "F.Cu") + (tedit 5AE5139B) (tstamp ccb717fe-0b69-40f3-8e8f-dcc635979f8a) + (at 132.08 66.04) + (descr "Resistor, Axial_DIN0204 series, Axial, Horizontal, pin pitch=7.62mm, 0.167W, length*diameter=3.6*1.6mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf") + (tags "Resistor Axial_DIN0204 series Axial Horizontal pin pitch 7.62mm 0.167W length 3.6mm diameter 1.6mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f5088c2") + (attr through_hole) + (fp_text reference "R6" (at 3.81 -1.92) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7caf9240-8b46-4dbc-869e-d252aa380848) + ) + (fp_text value "1K" (at 3.81 0) (layer "F.Fab") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 698d2002-954a-492a-905d-4f56c209842f) + ) + (fp_text user "${REFERENCE}" (at 3.81 0) (layer "F.Fab") hide + (effects (font (size 0.72 0.72) (thickness 0.108))) + (tstamp fc11e107-0da2-4ea4-bba4-27e71ec2d840) + ) + (fp_line (start 6.68 0) (end 5.73 0) (layer "F.SilkS") (width 0.12) (tstamp 25c4c442-37f9-4555-aba9-be43d258149b)) + (fp_line (start 1.89 -0.92) (end 1.89 0.92) (layer "F.SilkS") (width 0.12) (tstamp 58131a3d-5bc1-46db-9118-630a4d7587dd)) + (fp_line (start 5.73 0.92) (end 5.73 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 6f51be9b-ebff-474b-865a-4add59911d5e)) + (fp_line (start 0.94 0) (end 1.89 0) (layer "F.SilkS") (width 0.12) (tstamp 83c30e3f-3d4f-451e-98bc-2ea6abbc6860)) + (fp_line (start 5.73 -0.92) (end 1.89 -0.92) (layer "F.SilkS") (width 0.12) (tstamp 96ef2f8b-e5bd-458d-a344-900c22a5601d)) + (fp_line (start 1.89 0.92) (end 5.73 0.92) (layer "F.SilkS") (width 0.12) (tstamp ef8e4784-ddf4-4595-8902-f36d7992a27d)) + (fp_line (start -0.95 1.05) (end 8.57 1.05) (layer "F.CrtYd") (width 0.05) (tstamp 09ac173b-61d2-4bc5-a705-448b48c8a78a)) + (fp_line (start 8.57 1.05) (end 8.57 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 1ad52a44-ac44-476f-92db-f40ea3de5372)) + (fp_line (start 8.57 -1.05) (end -0.95 -1.05) (layer "F.CrtYd") (width 0.05) (tstamp 87bf6186-3705-4782-b30a-0638affbf35d)) + (fp_line (start -0.95 -1.05) (end -0.95 1.05) (layer "F.CrtYd") (width 0.05) (tstamp a70f5d3e-f481-4756-a8ef-0f3d66fa24d3)) + (fp_line (start 5.61 -0.8) (end 2.01 -0.8) (layer "F.Fab") (width 0.1) (tstamp 18be3d70-a0c1-49ae-8fa4-11c153403716)) + (fp_line (start 5.61 0.8) (end 5.61 -0.8) (layer "F.Fab") (width 0.1) (tstamp 4abc93df-2640-4a3a-bb68-7109359f68d2)) + (fp_line (start 2.01 0.8) (end 5.61 0.8) (layer "F.Fab") (width 0.1) (tstamp 4ba67e1d-0196-4d81-a65f-5d65ad0efbba)) + (fp_line (start 0 0) (end 2.01 0) (layer "F.Fab") (width 0.1) (tstamp dfc0e11e-e7ad-4151-9852-bdd654a913b1)) + (fp_line (start 2.01 -0.8) (end 2.01 0.8) (layer "F.Fab") (width 0.1) (tstamp f1aa181e-51d1-49f8-be1e-1ba7e53212e9)) + (fp_line (start 7.62 0) (end 5.61 0) (layer "F.Fab") (width 0.1) (tstamp f5899f5a-bb61-48db-b352-5326132dcc8f)) + (pad "1" thru_hole circle (at 0 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 15 "Net-(R6-Pad1)") (pintype "passive") (tstamp 8136271d-5c94-4305-a0f8-f2d9646da721)) + (pad "2" thru_hole oval (at 7.62 0) (size 1.4 1.4) (drill 0.7) (layers *.Cu *.Mask) + (net 3 "GND") (pintype "passive") (tstamp 3659323e-4673-4fce-aadf-a88ffbc98f79)) + (model "${KICAD6_3DMODEL_DIR}/Resistor_THT.3dshapes/R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp d83a11b5-5e63-4176-a933-764a02bc2958) + (at 144.78 71.12 -90) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/00000000-0000-0000-0000-00005f508a74") + (attr through_hole) + (fp_text reference "J10" (at 0 -3.81) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 42305151-2153-4f6e-ae72-d7b89f972cfd) + ) + (fp_text value "12V" (at 2.54 0.635 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp eaa3ba5e-a787-4ac9-b47e-0a05d6eea35f) + ) + (fp_text user "${REFERENCE}" (at 0 1.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 7f48376b-0be0-4bcc-a93f-dccae22aca79) + ) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 598297ac-7aeb-4464-9733-cef4fff8876e)) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 5e49ae85-66d4-41be-ad50-f529f80e0e4e)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp 9f251240-11f0-4266-90a1-a1f2feea0f2d)) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp a61ee069-c237-4f2d-92d2-5302d9cfd14a)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp a90826ba-6803-44e1-bab1-1b87b092b745)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp ee0a0916-2b58-4bf6-bc47-ab3331f587e7)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 51567da9-f551-4e1d-989c-030d6c5d483c)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 5dcc49a7-cf89-4da7-b7e9-a8be7c96bbfc)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp b5baa5e2-902a-4bdb-b976-3aab4750e016)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp c2ad0611-d17f-4025-acf0-3a1f1e2f0fb9)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 0c67b675-19af-4da0-9d6b-b874fdd932b0)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp bb805caf-7bf8-43d4-95e0-54148f6a95d8)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp d1d75786-18a4-49cb-9ecd-6d5aa042d139)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp da4f5986-178b-4726-a28b-145b450eaa0a)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp fda55b2b-99b8-45b8-b428-7c5e0f79456e)) + (pad "1" thru_hole rect (at 0 0 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 2 "+12V") (pinfunction "Pin_1") (pintype "passive") (tstamp 550cbf8e-0714-45bb-ba9d-bfe09909fc92)) + (pad "2" thru_hole oval (at 0 2.54 270) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 3 "GND") (pinfunction "Pin_2") (pintype "passive") (tstamp 0d724287-d4b5-4809-a144-984f04edcf5d)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-92_Inline_Wide" (layer "F.Cu") + (tedit 5A02FF81) (tstamp e17ce0b6-0414-48a8-9cd2-6e18b156d995) + (at 116.84 81.28) + (descr "TO-92 leads in-line, wide, drill 0.75mm (see NXP sot054_po.pdf)") + (tags "to-92 sc-43 sc-43a sot54 PA33 transistor") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/2e6d26a8-7d38-4064-bced-cd5ba64a56af") + (attr through_hole) + (fp_text reference "Q3" (at 2.54 -3.56) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp aadfd258-fe3f-4be7-beb2-7068885f41b1) + ) + (fp_text value "BC517" (at 2.54 2.79) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 1be228d5-edf2-4d54-aa3e-f2789ac88409) + ) + (fp_text user "${REFERENCE}" (at 2.54 0) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 52bc13d1-896f-4a8d-9f08-51a6e245e750) + ) + (fp_line (start 0.74 1.85) (end 4.34 1.85) (layer "F.SilkS") (width 0.12) (tstamp 22d0339d-a5c5-40fa-98fe-b71a08b12182)) + (fp_arc (start 2.54 -2.6) (mid 3.936979 -2.192818) (end 4.8964 -1.098807) (layer "F.SilkS") (width 0.12) (tstamp 06d0594f-08b0-4793-8b98-2adbe7510522)) + (fp_arc (start 0.74 1.85) (mid 0.446097 1.509328) (end 0.215816 1.122795) (layer "F.SilkS") (width 0.12) (tstamp 396f30b1-d66e-48d4-b5df-b1e32d18fe8b)) + (fp_arc (start 0.1836 -1.098807) (mid 1.143021 -2.192817) (end 2.54 -2.6) (layer "F.SilkS") (width 0.12) (tstamp 622d2c29-bf76-4731-9230-53c010859a7c)) + (fp_arc (start 4.864184 1.122795) (mid 4.633903 1.509328) (end 4.34 1.85) (layer "F.SilkS") (width 0.12) (tstamp 98d9b919-2c7b-4896-85f4-3b773aed1838)) + (fp_line (start 6.09 2.01) (end 6.09 -2.73) (layer "F.CrtYd") (width 0.05) (tstamp 23dec50c-6d04-46e0-bd34-be9445e4fee3)) + (fp_line (start -1.01 -2.73) (end 6.09 -2.73) (layer "F.CrtYd") (width 0.05) (tstamp 27210af9-5da4-40a7-bf81-07ec61f6ef3e)) + (fp_line (start 6.09 2.01) (end -1.01 2.01) (layer "F.CrtYd") (width 0.05) (tstamp 4c53b6e5-52b8-4016-9edd-27a074bf1840)) + (fp_line (start -1.01 -2.73) (end -1.01 2.01) (layer "F.CrtYd") (width 0.05) (tstamp 7d8ab70b-22ef-4512-8a9c-5371ac8188cc)) + (fp_line (start 0.8 1.75) (end 4.3 1.75) (layer "F.Fab") (width 0.1) (tstamp ab57ffc5-b166-4d13-ab98-47c771d65293)) + (fp_arc (start 2.54 -2.48) (mid 4.831221 -0.949055) (end 4.293625 1.753625) (layer "F.Fab") (width 0.1) (tstamp 07b54a0e-31bb-467a-a340-ab8774e71908)) + (fp_arc (start 0.786375 1.753625) (mid 0.248779 -0.949055) (end 2.54 -2.48) (layer "F.Fab") (width 0.1) (tstamp 3f9d0da2-fde2-4cf2-88b7-b9c675cde37a)) + (pad "1" thru_hole rect (at 0 0) (size 1.5 1.5) (drill 0.8) (layers *.Cu *.Mask) + (net 23 "Net-(Q3-Pad1)") (pinfunction "C") (pintype "passive") (tstamp 24938965-4dac-4704-9d03-36790fc5c0b9)) + (pad "2" thru_hole circle (at 2.54 0) (size 1.5 1.5) (drill 0.8) (layers *.Cu *.Mask) + (net 25 "Net-(R10-Pad2)") (pinfunction "B") (pintype "input") (tstamp 0dc32661-4b42-4c63-8ebe-5767a918cfd9)) + (pad "3" thru_hole circle (at 5.08 0) (size 1.5 1.5) (drill 0.8) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pinfunction "E") (pintype "passive") (tstamp 69d7ec2d-3cf3-485c-9e2b-3c7804af6653)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-92_Inline_Wide.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Package_TO_SOT_THT:TO-220-3_Vertical" (layer "F.Cu") + (tedit 5AC8BA0D) (tstamp e3c95742-55f6-45ad-b371-073821ee97c8) + (at 134.62 76.2) + (descr "TO-220-3, Vertical, RM 2.54mm, see https://www.vishay.com/docs/66542/to-220-1.pdf") + (tags "TO-220-3 Vertical RM 2.54mm") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/234efd1c-1460-4e8d-9696-8836ff63bc4e") + (attr through_hole) + (fp_text reference "Q2" (at 2.54 -4.27) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp a6d8a67a-92a2-4ba1-8172-1bc6d2db011f) + ) + (fp_text value "IRLZ34N" (at 2.54 2.5) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp aac7ae92-b1d2-4b83-99f2-9bb1f61d33e2) + ) + (fp_text user "${REFERENCE}" (at 2.54 -4.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d8d03cb9-69c8-44bf-b7ac-8671eaa6ec4d) + ) + (fp_line (start 0.69 -3.27) (end 0.69 -1.76) (layer "F.SilkS") (width 0.12) (tstamp 33f5c262-99c0-4210-a08d-975ebbf4fd26)) + (fp_line (start -2.58 -1.76) (end 7.66 -1.76) (layer "F.SilkS") (width 0.12) (tstamp 6185d9ff-6c8f-4a8f-84a0-171deab4509e)) + (fp_line (start -2.58 -3.27) (end 7.66 -3.27) (layer "F.SilkS") (width 0.12) (tstamp 69f060d5-4d16-495a-a4e2-69f1b5094929)) + (fp_line (start -2.58 1.371) (end 7.66 1.371) (layer "F.SilkS") (width 0.12) (tstamp 700055c8-1a3f-4042-b1b9-52d0437d3255)) + (fp_line (start 4.391 -3.27) (end 4.391 -1.76) (layer "F.SilkS") (width 0.12) (tstamp c2a003ef-5e28-4b7b-90da-ae7f0ad4b2a5)) + (fp_line (start -2.58 -3.27) (end -2.58 1.371) (layer "F.SilkS") (width 0.12) (tstamp da8e0ce9-336e-421a-8e42-2df1ef886f09)) + (fp_line (start 7.66 -3.27) (end 7.66 1.371) (layer "F.SilkS") (width 0.12) (tstamp f427be89-5401-4a8e-ad6a-abc63d54d7cf)) + (fp_line (start -2.71 -3.4) (end -2.71 1.51) (layer "F.CrtYd") (width 0.05) (tstamp 5a7210e7-712f-496e-b879-3ab4094e8207)) + (fp_line (start -2.71 1.51) (end 7.79 1.51) (layer "F.CrtYd") (width 0.05) (tstamp 71bd5fce-2d80-4f23-94ff-349e26f8ce33)) + (fp_line (start 7.79 -3.4) (end -2.71 -3.4) (layer "F.CrtYd") (width 0.05) (tstamp 93dd0533-5885-49c6-ae97-930402904b23)) + (fp_line (start 7.79 1.51) (end 7.79 -3.4) (layer "F.CrtYd") (width 0.05) (tstamp b975ed39-0040-4cf3-bafa-b3ab16efe280)) + (fp_line (start -2.46 -1.88) (end 7.54 -1.88) (layer "F.Fab") (width 0.1) (tstamp 0d04f421-c17a-4589-8e77-2f418e0fb233)) + (fp_line (start -2.46 -3.15) (end -2.46 1.25) (layer "F.Fab") (width 0.1) (tstamp 0e2ab438-c7a0-47be-961b-42f3797fb148)) + (fp_line (start 7.54 -3.15) (end -2.46 -3.15) (layer "F.Fab") (width 0.1) (tstamp 388f0067-c0a8-4e95-abaf-dbb2f1075b46)) + (fp_line (start -2.46 1.25) (end 7.54 1.25) (layer "F.Fab") (width 0.1) (tstamp 6f8ce4a9-b8a9-4e08-92a6-7da4e564b196)) + (fp_line (start 4.39 -3.15) (end 4.39 -1.88) (layer "F.Fab") (width 0.1) (tstamp 7c3ab474-cbe9-4b63-b56b-5c66d1c10988)) + (fp_line (start 7.54 1.25) (end 7.54 -3.15) (layer "F.Fab") (width 0.1) (tstamp aa82fa44-a75c-4251-881a-3e9e86dc0122)) + (fp_line (start 0.69 -3.15) (end 0.69 -1.88) (layer "F.Fab") (width 0.1) (tstamp ef2a9f8c-7cd4-416a-84ef-aadb97a72e72)) + (pad "1" thru_hole rect (at 0 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 16 "Net-(R8-Pad1)") (pinfunction "G") (pintype "input") (tstamp c76ced2a-0b0a-4f50-8765-2d2b558a1436)) + (pad "2" thru_hole oval (at 2.54 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 4 "Net-(D2-Pad2)") (pinfunction "D") (pintype "passive") (tstamp 687f3f0b-fce2-49b8-aa12-0a7902528cc3)) + (pad "3" thru_hole oval (at 5.08 0) (size 1.905 2) (drill 1.1) (layers *.Cu *.Mask) + (net 3 "GND") (pinfunction "S") (pintype "passive") (tstamp 16c73c0f-69ae-4a2d-885d-491e48393140)) + (model "${KICAD6_3DMODEL_DIR}/Package_TO_SOT_THT.3dshapes/TO-220-3_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (layer "F.Cu") + (tedit 59FED5CC) (tstamp ffba3f95-26ae-4e2f-abef-62290f7d4274) + (at 111.76 55.88 90) + (descr "Through hole straight pin header, 1x02, 2.54mm pitch, single row") + (tags "Through hole pin header THT 1x02 2.54mm single row") + (property "Sheetfile" "electronics.kicad_sch") + (property "Sheetname" "") + (path "/56b1ef67-0d6f-4d06-97fd-45bca9c1e150") + (attr through_hole) + (fp_text reference "J16" (at 0 -2.33 90) (layer "F.SilkS") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d59cc7b1-f9a9-4aff-9301-3156c48899f3) + ) + (fp_text value "LED" (at 0 -3.175 180) (layer "F.SilkS") + (effects (font (size 1 1) (thickness 0.15))) + (tstamp d761806c-bfd3-463b-8e79-dc525a64a7d8) + ) + (fp_text user "${REFERENCE}" (at 0 1.27) (layer "F.Fab") hide + (effects (font (size 1 1) (thickness 0.15))) + (tstamp 091c4f41-ab50-471d-a4fb-dc1d71b60f07) + ) + (fp_line (start -1.33 1.27) (end -1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 0a4a77be-b9aa-4a3a-802e-3df4ef0dd5fc)) + (fp_line (start -1.33 -1.33) (end 0 -1.33) (layer "F.SilkS") (width 0.12) (tstamp 31fb4b9c-aada-4ca0-9c5a-ac86c478cf0c)) + (fp_line (start 1.33 1.27) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp 7268d337-7682-4495-b91c-663da76f2e2b)) + (fp_line (start -1.33 3.87) (end 1.33 3.87) (layer "F.SilkS") (width 0.12) (tstamp b46f74c9-51a3-4dfb-9691-b32668b6e989)) + (fp_line (start -1.33 0) (end -1.33 -1.33) (layer "F.SilkS") (width 0.12) (tstamp f4735624-5964-4c6a-8c80-b289f8397bd3)) + (fp_line (start -1.33 1.27) (end 1.33 1.27) (layer "F.SilkS") (width 0.12) (tstamp f94fbfd8-1ad8-4225-9290-f0ad759f5a38)) + (fp_line (start 1.8 4.35) (end 1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp 138f25f9-569a-4380-8e94-a0b45a0a69c2)) + (fp_line (start -1.8 -1.8) (end -1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp 76c3fac7-59b3-410c-8a40-f3686e5b89c0)) + (fp_line (start -1.8 4.35) (end 1.8 4.35) (layer "F.CrtYd") (width 0.05) (tstamp d2dea8a4-8128-488c-a92a-8d24e519e3cf)) + (fp_line (start 1.8 -1.8) (end -1.8 -1.8) (layer "F.CrtYd") (width 0.05) (tstamp e2a9dcd0-afd5-4c04-848e-657684f7c7c8)) + (fp_line (start -1.27 -0.635) (end -0.635 -1.27) (layer "F.Fab") (width 0.1) (tstamp 1e9490dd-e3b2-46d4-a605-d2e10d106ad3)) + (fp_line (start 1.27 3.81) (end -1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 3bb40358-4887-4280-9b64-c960ef2777e6)) + (fp_line (start 1.27 -1.27) (end 1.27 3.81) (layer "F.Fab") (width 0.1) (tstamp 5abba730-b1a2-46c9-ad28-fdc7a20ab14a)) + (fp_line (start -1.27 3.81) (end -1.27 -0.635) (layer "F.Fab") (width 0.1) (tstamp 5c49d6e1-f8a9-4b07-8110-2ef03d686e30)) + (fp_line (start -0.635 -1.27) (end 1.27 -1.27) (layer "F.Fab") (width 0.1) (tstamp 694efd74-62b7-4b02-8564-d95c5a8f7e00)) + (pad "1" thru_hole rect (at 0 0 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 24 "Net-(R9-Pad1)") (pinfunction "Pin_1") (pintype "passive") (tstamp 34ccdb16-688f-41c0-b67c-855ef29e58ea)) + (pad "2" thru_hole oval (at 0 2.54 90) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) + (net 29 "/ESPGND") (pinfunction "Pin_2") (pintype "passive") (tstamp b07f0c55-0a30-49a8-9261-a8d935e8be7f)) + (model "${KICAD6_3DMODEL_DIR}/Connector_PinHeader_2.54mm.3dshapes/PinHeader_1x02_P2.54mm_Vertical.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_line (start 147.32 76.2) (end 99.06 76.2) (layer "Dwgs.User") (width 0.1) (tstamp 07ed7205-8bdb-4862-9972-15b0b6b3639d)) + (gr_line (start 116.84 53.34) (end 116.84 86.36) (layer "Dwgs.User") (width 0.1) (tstamp 0ab3efab-4801-488f-9ef8-a65636a397b7)) + (gr_line (start 147.32 60.96) (end 99.06 60.96) (layer "Dwgs.User") (width 0.1) (tstamp 16a241cc-ff48-40b4-99fd-9e4e97fc020e)) + (gr_line (start 99.06 58.42) (end 147.32 58.42) (layer "Dwgs.User") (width 0.1) (tstamp 2d2b0cf4-58c4-4106-8c04-eb1c20b05149)) + (gr_line (start 111.76 53.34) (end 111.76 86.36) (layer "Dwgs.User") (width 0.1) (tstamp 49b772b4-25fb-4d4e-8f60-1fae5c8be0d9)) + (gr_line (start 109.22 86.36) (end 109.22 53.34) (layer "Dwgs.User") (width 0.1) (tstamp 58087b8c-1cdb-4a4b-89ad-4054cec95ed0)) + (gr_line (start 132.08 53.34) (end 132.08 86.36) (layer "Dwgs.User") (width 0.1) (tstamp 5948e34c-77d0-474c-9c1d-771f98e6dd9b)) + (gr_line (start 144.78 86.36) (end 144.78 53.34) (layer "Dwgs.User") (width 0.1) (tstamp 617b0fe2-b5d0-4ebb-8cd5-e8e3be5cf787)) + (gr_line (start 147.32 81.28) (end 99.06 81.28) (layer "Dwgs.User") (width 0.1) (tstamp 624e8784-dce8-4e46-ba68-e55f723815a2)) + (gr_line (start 129.54 86.36) (end 129.54 53.34) (layer "Dwgs.User") (width 0.1) (tstamp 67af8c37-709c-4dda-b3f7-5a2281997566)) + (gr_line (start 147.32 83.82) (end 99.06 83.82) (layer "Dwgs.User") (width 0.1) (tstamp 69ec7f31-42c0-4d99-88f7-93d787afb6e6)) + (gr_line (start 142.24 53.34) (end 142.24 86.36) (layer "Dwgs.User") (width 0.1) (tstamp 6ea3064d-3471-4b03-816f-b6e9135d05ea)) + (gr_line (start 99.06 78.74) (end 147.32 78.74) (layer "Dwgs.User") (width 0.1) (tstamp 89fbd510-d966-4220-965a-795f0fab13d5)) + (gr_line (start 147.32 71.12) (end 99.06 71.12) (layer "Dwgs.User") (width 0.1) (tstamp 90c680f4-9812-42a2-8a45-b08224fded88)) + (gr_line (start 134.62 86.36) (end 134.62 53.34) (layer "Dwgs.User") (width 0.1) (tstamp 91951b66-328b-421d-aa35-0a0308924547)) + (gr_line (start 99.06 66.04) (end 99.06 68.58) (layer "Dwgs.User") (width 0.1) (tstamp 97e872ba-7615-467a-bb03-4fe365751432)) + (gr_line (start 106.68 86.36) (end 106.68 53.34) (layer "Dwgs.User") (width 0.1) (tstamp 9dafddcb-2db1-4b35-9b94-c9b7b6815fc3)) + (gr_line (start 99.06 63.5) (end 147.32 63.5) (layer "Dwgs.User") (width 0.1) (tstamp a6e5039b-4b15-4626-ad48-983a0e30d761)) + (gr_line (start 127 53.34) (end 127 86.36) (layer "Dwgs.User") (width 0.1) (tstamp b8f5c651-2b36-41fe-af82-50b542175426)) + (gr_line (start 137.16 53.34) (end 137.16 86.36) (layer "Dwgs.User") (width 0.1) (tstamp b9c06a6b-1130-4775-a6d9-82074ea83b21)) + (gr_line (start 99.06 55.88) (end 147.32 55.88) (layer "Dwgs.User") (width 0.1) (tstamp ccd8f61e-0b6a-44eb-8ae9-592d75e89439)) + (gr_line (start 124.46 86.36) (end 124.46 53.34) (layer "Dwgs.User") (width 0.1) (tstamp ce2bc21a-9c69-4d84-9527-df5f9103bfb0)) + (gr_line (start 147.32 66.04) (end 99.06 66.04) (layer "Dwgs.User") (width 0.1) (tstamp d7e8a293-5751-4958-ad9d-b4b7f49027bd)) + (gr_line (start 99.06 68.58) (end 147.32 68.58) (layer "Dwgs.User") (width 0.1) (tstamp d8b275f9-a307-4208-a5e1-51b3694f7091)) + (gr_line (start 139.7 86.36) (end 139.7 53.34) (layer "Dwgs.User") (width 0.1) (tstamp dd0b49c0-8193-420b-a601-ec76c38b167b)) + (gr_line (start 101.6 53.34) (end 101.6 86.36) (layer "Dwgs.User") (width 0.1) (tstamp e96ab7e8-9577-403c-9aad-fd1d74ce6ad2)) + (gr_line (start 121.92 53.34) (end 121.92 86.36) (layer "Dwgs.User") (width 0.1) (tstamp ea657044-01fe-4e97-9d4b-9bd3dcc34acd)) + (gr_line (start 114.3 86.36) (end 114.3 53.34) (layer "Dwgs.User") (width 0.1) (tstamp ef203ae2-968b-48eb-914b-bdffd42354bd)) + (gr_line (start 119.38 86.36) (end 119.38 53.34) (layer "Dwgs.User") (width 0.1) (tstamp f73d5bbe-418e-4f5e-9f26-79f6ce72c477)) + (gr_line (start 99.06 73.66) (end 147.32 73.66) (layer "Dwgs.User") (width 0.1) (tstamp f82ce0ed-1254-4766-93c4-cf970c744261)) + (gr_line (start 104.14 53.34) (end 104.14 86.36) (layer "Dwgs.User") (width 0.1) (tstamp fd772470-d2f4-439a-870e-0ea994c6032d)) + (gr_rect (start 147.32 86.36) (end 99.06 53.34) (layer "Edge.Cuts") (width 0.2) (fill none) (tstamp d60744de-eede-45c0-90ac-d35d080d4108)) + (gr_text "+" (at 144.78 68.58) (layer "F.SilkS") (tstamp d35f42fa-7bb8-45b2-9cf9-812a3c2d5855) + (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror)) + ) + (dimension (type aligned) (layer "B.Cu") (tstamp 51b0fdf8-933f-44e6-ad09-38876b2c1999) + (pts (xy 99.06 53.34) (xy 147.32 53.34)) + (height -5.08) + (gr_text "48,2600 mm" (at 123.19 46.46) (layer "B.Cu") (tstamp 51b0fdf8-933f-44e6-ad09-38876b2c1999) + (effects (font (size 1.5 1.5) (thickness 0.3))) + ) + (format (units 3) (units_format 1) (precision 4)) + (style (thickness 0.2) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + (dimension (type aligned) (layer "B.Cu") (tstamp 931b2c3a-6a34-446c-a3ef-e31393616536) + (pts (xy 147.32 53.34) (xy 147.32 86.36)) + (height -5.08) + (gr_text "33,0200 mm" (at 150.6 69.85 90) (layer "B.Cu") (tstamp 931b2c3a-6a34-446c-a3ef-e31393616536) + (effects (font (size 1.5 1.5) (thickness 0.3))) + ) + (format (units 3) (units_format 1) (precision 4)) + (style (thickness 0.2) (arrow_length 1.27) (text_position_mode 0) (extension_height 0.58642) (extension_offset 0.5) keep_text_aligned) + ) + + (segment (start 137.16 58.42) (end 137.16 55.88) (width 1) (layer "B.Cu") (net 1) (tstamp 644a3af4-fc3b-46fb-a459-c17d183e1ca2)) + (segment (start 137.16 55.88) (end 142.24 55.88) (width 1) (layer "B.Cu") (net 1) (tstamp 9a350a45-3456-42e6-86ce-72ada23fec6d)) + (segment (start 144.78 58.42) (end 142.24 58.42) (width 1) (layer "B.Cu") (net 1) (tstamp d1617a56-937f-47b2-b625-4e7a95352fda)) + (segment (start 142.24 58.42) (end 142.24 55.88) (width 1) (layer "B.Cu") (net 1) (tstamp da5678bf-f9be-4a56-a942-66d0c360e8f1)) + (segment (start 142.24 60.96) (end 142.24 58.42) (width 1) (layer "B.Cu") (net 1) (tstamp f91de863-8ffe-47b8-a677-dc6e046fdbf5)) + (segment (start 142.24 63.5) (end 142.24 68.58) (width 1) (layer "B.Cu") (net 2) (tstamp 08740404-dd70-4027-9af9-de935fcd3ed3)) + (segment (start 144.78 68.58) (end 139.7 68.58) (width 1) (layer "B.Cu") (net 2) (tstamp 0ec47b18-41fe-4139-ae98-57ee99141be4)) + (segment (start 139.7 63.5) (end 142.24 63.5) (width 1) (layer "B.Cu") (net 2) (tstamp 2b03f1e6-6697-47ad-9bd2-82eaa4751ef0)) + (segment (start 144.78 68.58) (end 144.78 60.96) (width 1) (layer "B.Cu") (net 2) (tstamp 2b901244-291a-4128-b337-c5ac08ce29c2)) + (segment (start 132.08 83.82) (end 132.08 81.28) (width 1) (layer "B.Cu") (net 2) (tstamp 77c8c3ff-11ea-4a49-90eb-aa7690daada3)) + (segment (start 144.78 83.82) (end 132.08 83.82) (width 1) (layer "B.Cu") (net 2) (tstamp 8b4eec2f-d24b-4a76-bad2-be80c4caa508)) + (segment (start 144.78 68.58) (end 144.78 83.82) (width 1) (layer "B.Cu") (net 2) (tstamp a3e83623-69e4-4d07-9ba0-22a99044f2a9)) + (segment (start 137.16 60.96) (end 139.7 60.96) (width 1) (layer "B.Cu") (net 3) (tstamp 19de9b9e-4694-4fc0-9966-20703b193f01)) + (segment (start 139.7 71.12) (end 137.16 71.12) (width 1) (layer "B.Cu") (net 3) (tstamp 35068bde-8f07-4791-a8e7-75f33d863632)) + (segment (start 137.16 71.12) (end 137.16 66.04) (width 1) (layer "B.Cu") (net 3) (tstamp 436639b9-ec44-4d9b-9a14-935d4da72c43)) + (segment (start 137.16 66.04) (end 139.7 66.04) (width 1) (layer "B.Cu") (net 3) (tstamp 772fab93-7770-4bb1-82a5-68635702f500)) + (segment (start 137.16 66.04) (end 137.16 60.96) (width 1) (layer "B.Cu") (net 3) (tstamp 80afff70-1cb9-421e-af55-5105a8474f27)) + (segment (start 139.7 71.12) (end 142.24 71.12) (width 1) (layer "B.Cu") (net 3) (tstamp b3806e3b-8027-4448-bd21-0ba5cfaf0289)) + (segment (start 139.7 76.2) (end 139.7 71.12) (width 1) (layer "B.Cu") (net 3) (tstamp cc9da913-e650-4fd5-a745-606dd8c70e72)) + (segment (start 139.7 60.96) (end 139.7 58.42) (width 1) (layer "B.Cu") (net 3) (tstamp efcb771b-bd84-40fd-9a58-a4d7701a23fc)) + (segment (start 137.16 81.28) (end 134.62 81.28) (width 1) (layer "B.Cu") (net 4) (tstamp 017b7c91-4cad-4602-803c-f55690cb1a03)) + (segment (start 137.16 76.2) (end 137.16 81.28) (width 1) (layer "B.Cu") (net 4) (tstamp 30b29af2-38e9-4a97-ad76-9318f7d4a84e)) + (segment (start 127 58.42) (end 129.54 58.42) (width 1) (layer "B.Cu") (net 5) (tstamp 9249f668-213d-4e5c-a68e-defe2479a59d)) + (segment (start 127 60.96) (end 129.54 60.96) (width 1) (layer "B.Cu") (net 6) (tstamp 73fd4575-ba49-4f7b-b1cb-c8b2cb8b2d62)) + (segment (start 127 73.66) (end 129.54 73.66) (width 1) (layer "B.Cu") (net 7) (tstamp d47ebc66-4b78-4ccf-a1f6-04daf3ad7f91)) + (segment (start 127 76.2) (end 129.54 76.2) (width 1) (layer "B.Cu") (net 8) (tstamp 47745d1b-ddda-4755-bed2-4b1c83e3bfa8)) + (segment (start 114.3 58.42) (end 119.38 58.42) (width 1) (layer "B.Cu") (net 9) (tstamp f862e03a-62bf-467e-90af-23dde3525c1d)) + (segment (start 116.84 63.5) (end 116.84 60.96) (width 1) (layer "B.Cu") (net 10) (tstamp 48902999-bc59-45e2-b8fd-a26203369902)) + (segment (start 116.84 63.5) (end 119.38 63.5) (width 1) (layer "B.Cu") (net 10) (tstamp d4deae3c-cea4-42a4-a1af-d0620fcbe628)) + (segment (start 116.84 60.96) (end 114.3 60.96) (width 1) (layer "B.Cu") (net 10) (tstamp d8d28bd2-a6a3-4438-9a45-ac25efe53ba9)) + (segment (start 116.84 68.58) (end 119.38 68.58) (width 1) (layer "B.Cu") (net 11) (tstamp a60b7177-169a-48d6-bd59-4d4516c8f38a)) + (segment (start 114.3 66.04) (end 114.3 63.5) (width 1) (layer "B.Cu") (net 11) (tstamp e5bb3364-26cd-4bc2-ba18-763b3e60a8dc)) + (segment (start 116.84 68.58) (end 116.84 66.04) (width 1) (layer "B.Cu") (net 11) (tstamp f435cf8e-24c7-4a63-afa4-0a7150588cd8)) + (segment (start 116.84 66.04) (end 114.3 66.04) (width 1) (layer "B.Cu") (net 11) (tstamp fd58ce9b-e75f-41c3-adfe-7602ac84853d)) + (segment (start 116.84 73.66) (end 119.38 73.66) (width 1) (layer "B.Cu") (net 12) (tstamp 2cbd4fb6-e4f0-4ddd-8274-d97a97c38230)) + (segment (start 114.3 76.2) (end 116.84 76.2) (width 1) (layer "B.Cu") (net 12) (tstamp b3265a13-18f8-48ee-9206-96644f3105a0)) + (segment (start 116.84 76.2) (end 116.84 73.66) (width 1) (layer "B.Cu") (net 12) (tstamp fbaf9c5f-d61d-41f4-ba5d-94edf3d3ba52)) + (segment (start 127 68.58) (end 132.08 68.58) (width 1) (layer "B.Cu") (net 13) (tstamp f2ec8174-7765-4aee-b569-840c2ff1d55e)) + (segment (start 127 63.5) (end 132.08 63.5) (width 1) (layer "B.Cu") (net 14) (tstamp f311c84f-c7e9-46c8-8255-5510e6f564f4)) + (segment (start 127 66.04) (end 134.62 66.04) (width 1) (layer "B.Cu") (net 15) (tstamp 3c11ec05-f8f7-4105-9724-060ea9a4a70a)) + (segment (start 134.62 66.04) (end 134.62 58.42) (width 1) (layer "B.Cu") (net 15) (tstamp 620f8b8f-11c4-4d13-ab95-3eb8273601ff)) + (segment (start 134.62 71.12) (end 127 71.12) (width 1) (layer "B.Cu") (net 16) (tstamp 3957b4c1-9c35-4e47-9b36-3d9eb4feb93f)) + (segment (start 134.62 76.2) (end 134.62 71.12) (width 1) (layer "B.Cu") (net 16) (tstamp a363e60f-db16-4ab1-a666-06072ee530c9)) + (segment (start 101.625 58.42) (end 106.68 58.42) (width 1) (layer "B.Cu") (net 17) (tstamp c53c7a00-19b0-445b-b396-b3f10f963442)) + (segment (start 106.68 60.96) (end 101.625 60.96) (width 1) (layer "B.Cu") (net 18) (tstamp 876d000c-f2ab-4086-af9c-8035348bc763)) + (segment (start 106.68 63.5) (end 101.625 63.5) (width 1) (layer "B.Cu") (net 19) (tstamp e162300c-558a-4684-88d9-cb468ddec026)) + (segment (start 101.625 76.2) (end 106.68 76.2) (width 1) (layer "B.Cu") (net 20) (tstamp 7518ffb2-50fd-4681-9924-5b2e1f2b6a1d)) + (segment (start 101.625 78.74) (end 106.68 78.74) (width 1) (layer "B.Cu") (net 21) (tstamp 66ffbb18-0f87-4162-a219-930842171ece)) + (segment (start 111.76 71.12) (end 111.76 81.28) (width 1) (layer "B.Cu") (net 22) (tstamp 260e75f9-92d4-4b86-bfe8-c2b717279c77)) + (segment (start 114.3 71.12) (end 111.76 71.12) (width 1) (layer "B.Cu") (net 22) (tstamp 76119b2e-00be-4069-b4e1-7df2d21936ec)) + (segment (start 114.3 81.28) (end 116.84 81.28) (width 1) (layer "B.Cu") (net 23) (tstamp 97512d4e-436f-4782-8a57-cbcee72c862a)) + (segment (start 111.76 68.58) (end 114.3 68.58) (width 1) (layer "B.Cu") (net 24) (tstamp 91ac1fbb-d4db-4c56-9f5f-9b072f37811e)) + (segment (start 111.76 55.88) (end 111.76 68.58) (width 1) (layer "B.Cu") (net 24) (tstamp c33686de-d358-41df-a96d-17443e779ae3)) + (segment (start 119.38 78.74) (end 119.38 81.28) (width 1) (layer "B.Cu") (net 25) (tstamp 30a674b4-603f-4d64-8404-782e783a30f7)) + (segment (start 114.3 78.74) (end 119.38 78.74) (width 1) (layer "B.Cu") (net 25) (tstamp b82531db-7096-4b9b-a40b-2b68e923215c)) + (segment (start 106.68 68.58) (end 101.625 68.58) (width 1) (layer "B.Cu") (net 26) (tstamp 4ae60256-da33-4d15-94d8-1c92c0d13891)) + (segment (start 101.625 71.12) (end 106.68 71.12) (width 1) (layer "B.Cu") (net 27) (tstamp 95385932-c25c-42a6-8ab8-b5f3deadb01a)) + (segment (start 101.625 66.04) (end 106.68 66.04) (width 1) (layer "B.Cu") (net 28) (tstamp 154b960f-6f40-4d33-b7b2-c7948e722ed5)) + (segment (start 121.92 66.04) (end 119.38 66.04) (width 1) (layer "B.Cu") (net 29) (tstamp 10bfd8f4-1fce-4b8f-8280-b4e3811fb320)) + (segment (start 119.38 76.2) (end 121.92 76.2) (width 1) (layer "B.Cu") (net 29) (tstamp 34f6c5f5-c0f0-4f9d-a1fb-b7d7bca4fcea)) + (segment (start 121.92 66.04) (end 121.92 60.96) (width 1) (layer "B.Cu") (net 29) (tstamp 490acc3d-664c-4be9-b7ec-b480fece135f)) + (segment (start 109.22 71.12) (end 109.22 73.66) (width 1) (layer "B.Cu") (net 29) (tstamp 4e861ae0-aff4-4c68-9835-5e30e0ad3e0f)) + (segment (start 121.92 76.2) (end 121.92 71.12) (width 1) (layer "B.Cu") (net 29) (tstamp 66656e6a-0da0-4c9c-9344-22a8ab3974e1)) + (segment (start 109.22 73.66) (end 101.625 73.66) (width 1) (layer "B.Cu") (net 29) (tstamp 76df2d5a-6e53-4d90-bad2-41012f63180f)) + (segment (start 121.92 60.96) (end 119.38 60.96) (width 1) (layer "B.Cu") (net 29) (tstamp 79326588-7105-436e-a093-f13501daf755)) + (segment (start 121.92 76.2) (end 121.92 81.28) (width 1) (layer "B.Cu") (net 29) (tstamp 7bfdecba-0b34-4f8f-9361-16f764ad7915)) + (segment (start 109.22 83.82) (end 109.22 73.66) (width 1) (layer "B.Cu") (net 29) (tstamp 89d03e39-cbba-487b-b8cf-d93efbdaa2e0)) + (segment (start 121.92 71.12) (end 121.92 66.04) (width 1) (layer "B.Cu") (net 29) (tstamp 9ca300b6-247c-4a3f-9d4c-ac090d7b9b51)) + (segment (start 114.3 55.88) (end 121.92 55.88) (width 1) (layer "B.Cu") (net 29) (tstamp a8540948-9f3f-412d-bb04-79443f31f14b)) + (segment (start 121.92 55.88) (end 121.92 60.96) (width 1) (layer "B.Cu") (net 29) (tstamp b3b3c10f-fe02-499b-9a53-c5a118bfe85c)) + (segment (start 109.22 66.04) (end 109.22 71.12) (width 1) (layer "B.Cu") (net 29) (tstamp bb2474c9-096e-44a6-abe1-b5ba717c0c47)) + (segment (start 121.92 81.28) (end 121.92 83.82) (width 1) (layer "B.Cu") (net 29) (tstamp cfd7ca96-6e07-4e7d-acdc-190c72ba3f40)) + (segment (start 121.92 71.12) (end 119.38 71.12) (width 1) (layer "B.Cu") (net 29) (tstamp e92f9171-9e91-4430-813f-97f4bdda0190)) + (segment (start 121.92 83.82) (end 109.22 83.82) (width 1) (layer "B.Cu") (net 29) (tstamp f7fa478c-2c99-40f5-a764-b9ebec21d07b)) + +) diff --git a/electronics/electronics.kicad_pro b/electronics/electronics.kicad_pro new file mode 100644 index 0000000..d9995d1 --- /dev/null +++ b/electronics/electronics.kicad_pro @@ -0,0 +1,435 @@ +{ + "board": { + "design_settings": { + "defaults": { + "board_outline_line_width": 0.049999999999999996, + "copper_line_width": 0.19999999999999998, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.049999999999999996, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": false, + "text_position": 0, + "units_format": 1 + }, + "fab_line_width": 0.09999999999999999, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.09999999999999999, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.762, + "height": 1.524, + "width": 1.524 + }, + "silk_line_width": 0.12, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.15, + "silk_text_upright": false, + "zones": { + "45_degree_only": false, + "min_clearance": 0.508 + } + }, + "diff_pair_dimensions": [ + { + "gap": 0.0, + "via_gap": 0.0, + "width": 0.0 + } + ], + "drc_exclusions": [], + "meta": { + "filename": "board_design_settings.json", + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "copper_edge_clearance": "error", + "courtyards_overlap": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint_type_mismatch": "error", + "hole_clearance": "error", + "hole_near_hole": "error", + "invalid_outline": "error", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "error", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_dangling": "warning", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zone_has_empty_net": "error", + "zones_intersect": "error" + }, + "rule_severitieslegacy_courtyards_overlap": true, + "rule_severitieslegacy_no_courtyard_defined": false, + "rules": { + "allow_blind_buried_vias": false, + "allow_microvias": false, + "max_error": 0.005, + "min_clearance": 0.0, + "min_copper_edge_clearance": 0.0, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.19999999999999998, + "min_microvia_drill": 0.09999999999999999, + "min_silk_clearance": 0.0, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.19999999999999998, + "min_via_annular_width": 0.049999999999999996, + "min_via_diameter": 0.39999999999999997, + "use_height_for_length_calcs": true + }, + "track_widths": [ + 0.0, + 1.0 + ], + "via_dimensions": [ + { + "diameter": 0.0, + "drill": 0.0 + } + ], + "zones_allow_external_fillets": false, + "zones_use_no_outline": true + }, + "layer_presets": [] + }, + "boards": [], + "cvpcb": { + "equivalence_files": [] + }, + "erc": { + "erc_exclusions": [], + "meta": { + "version": 0 + }, + "pin_map": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 1, + 2 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2 + ], + [ + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 2 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 2, + 0, + 0, + 1, + 0, + 2, + 2, + 2, + 2 + ], + [ + 0, + 2, + 0, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 0, + 2, + 1, + 1, + 0, + 0, + 1, + 0, + 2, + 0, + 0, + 2 + ], + [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ] + ], + "rule_severities": { + "bus_definition_conflict": "error", + "bus_entry_needed": "error", + "bus_label_syntax": "error", + "bus_to_bus_conflict": "error", + "bus_to_net_conflict": "error", + "different_unit_footprint": "error", + "different_unit_net": "error", + "duplicate_reference": "error", + "duplicate_sheet_names": "error", + "extra_units": "error", + "global_label_dangling": "warning", + "hier_label_mismatch": "error", + "label_dangling": "error", + "lib_symbol_issues": "warning", + "multiple_net_names": "warning", + "net_not_bus_member": "warning", + "no_connect_connected": "warning", + "no_connect_dangling": "warning", + "pin_not_connected": "error", + "pin_not_driven": "error", + "pin_to_pin": "warning", + "power_pin_not_driven": "error", + "similar_labels": "warning", + "unannotated": "error", + "unit_value_mismatch": "error", + "unresolved_variable": "error", + "wire_dangling": "error" + } + }, + "libraries": { + "pinned_footprint_libs": [], + "pinned_symbol_libs": [] + }, + "meta": { + "filename": "electronics.kicad_pro", + "version": 1 + }, + "net_settings": { + "classes": [ + { + "bus_width": 12.0, + "clearance": 0.2, + "diff_pair_gap": 0.25, + "diff_pair_via_gap": 0.25, + "diff_pair_width": 0.2, + "line_style": 0, + "microvia_diameter": 0.3, + "microvia_drill": 0.1, + "name": "Default", + "pcb_color": "rgba(0, 0, 0, 0.000)", + "schematic_color": "rgba(0, 0, 0, 0.000)", + "track_width": 1.0, + "via_diameter": 0.8, + "via_drill": 0.4, + "wire_width": 6.0 + } + ], + "meta": { + "version": 2 + }, + "net_colors": null + }, + "pcbnew": { + "last_paths": { + "gencad": "", + "idf": "", + "netlist": "", + "specctra_dsn": "", + "step": "", + "vrml": "" + }, + "page_layout_descr_file": "" + }, + "schematic": { + "annotate_start_num": 0, + "drawing": { + "default_line_thickness": 6.0, + "default_text_size": 50.0, + "field_names": [], + "intersheets_ref_own_page": false, + "intersheets_ref_prefix": "", + "intersheets_ref_short": false, + "intersheets_ref_show": false, + "intersheets_ref_suffix": "", + "junction_size_choice": 3, + "label_size_ratio": 0.25, + "pin_symbol_size": 0.0, + "text_offset_ratio": 0.08 + }, + "legacy_lib_dir": "", + "legacy_lib_list": [], + "meta": { + "version": 1 + }, + "net_format_name": "", + "ngspice": { + "fix_include_paths": true, + "fix_passive_vals": false, + "meta": { + "version": 0 + }, + "model_mode": 0, + "workbook_filename": "" + }, + "page_layout_descr_file": "${KICAD6_TEMPLATE_DIR}/pagelayout_default.kicad_wks", + "plot_directory": "", + "spice_adjust_passive_values": false, + "spice_external_command": "spice \"%I\"", + "subpart_first_id": 65, + "subpart_id_separator": 0 + }, + "sheets": [ + [ + "102cb741-e9ae-4781-bb1b-b26fba217145", + "" + ] + ], + "text_variables": {} +} diff --git a/electronics/electronics.kicad_sch b/electronics/electronics.kicad_sch new file mode 100644 index 0000000..cebd1a8 --- /dev/null +++ b/electronics/electronics.kicad_sch @@ -0,0 +1,2883 @@ +(kicad_sch (version 20211123) (generator eeschema) + + (uuid 102cb741-e9ae-4781-bb1b-b26fba217145) + + (paper "A4") + + (title_block + (title "Camera Trigger") + (company "@grumpydevelop@contentnation.net") + ) + + (lib_symbols + (symbol "Connector:AudioJack2" (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 8.89 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "AudioJack2" (id 1) (at 0 6.35 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "audio jack receptacle mono phone headphone TS connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Audio Jack, 2 Poles (Mono / TS)" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Jack*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "AudioJack2_0_1" + (rectangle (start -3.81 0) (end -2.54 -2.54) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (rectangle (start -2.54 3.81) (end 2.54 -2.54) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (polyline + (pts + (xy 0 0) + (xy 0.635 -0.635) + (xy 1.27 0) + (xy 2.54 0) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 2.54) + (xy -0.635 2.54) + (xy -0.635 0) + (xy -1.27 -0.635) + (xy -1.905 0) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "AudioJack2_1_1" + (pin passive line (at 5.08 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "S" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 0 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "T" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector:AudioJack3" (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 8.89 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "AudioJack3" (id 1) (at 0 6.35 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "audio jack receptacle stereo headphones phones TRS connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Audio Jack, 3 Poles (Stereo / TRS)" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Jack*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "AudioJack3_0_1" + (rectangle (start -5.08 -5.08) (end -6.35 -2.54) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (polyline + (pts + (xy 0 -2.54) + (xy 0.635 -3.175) + (xy 1.27 -2.54) + (xy 2.54 -2.54) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.905 -2.54) + (xy -1.27 -3.175) + (xy -0.635 -2.54) + (xy -0.635 0) + (xy 2.54 0) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 2.54) + (xy -2.54 2.54) + (xy -2.54 -2.54) + (xy -3.175 -3.175) + (xy -3.81 -2.54) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start 2.54 3.81) (end -5.08 -5.08) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + ) + (symbol "AudioJack3_1_1" + (pin passive line (at 5.08 0 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "R" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "S" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "T" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector:Barrel_Jack" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 5.334 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Barrel_Jack" (id 1) (at 0 -5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 1.27 -1.016 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 1.27 -1.016 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "DC power barrel jack connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "DC Barrel Jack" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "BarrelJack*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Barrel_Jack_0_1" + (rectangle (start -5.08 3.81) (end 5.08 -3.81) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (arc (start -3.302 3.175) (mid -3.937 2.54) (end -3.302 1.905) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (arc (start -3.302 3.175) (mid -3.937 2.54) (end -3.302 1.905) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (polyline + (pts + (xy 5.08 2.54) + (xy 3.81 2.54) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -3.81 -2.54) + (xy -2.54 -2.54) + (xy -1.27 -1.27) + (xy 0 -2.54) + (xy 2.54 -2.54) + (xy 5.08 -2.54) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start 3.683 3.175) (end -3.302 1.905) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + ) + (symbol "Barrel_Jack_1_1" + (pin passive line (at 7.62 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x02" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x02" (id 1) (at 0 -5.08 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_01x02_1_1" + (rectangle (start -1.27 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 0.127) (end 0 -0.127) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 1.27) (end 1.27 -3.81) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (pin passive line (at -5.08 0 0) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -2.54 0) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Connector_Generic:Conn_01x09" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "J" (id 0) (at 0 12.7 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "Conn_01x09" (id 1) (at 0 -12.7 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "connector" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Generic connector, single row, 01x09, script generated (kicad-library-utils/schlib/autogen/connector/)" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "Connector*:*_1x??_*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "Conn_01x09_1_1" + (rectangle (start -1.27 -10.033) (end 0 -10.287) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 -7.493) (end 0 -7.747) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 -4.953) (end 0 -5.207) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 -2.413) (end 0 -2.667) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 0.127) (end 0 -0.127) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 2.667) (end 0 2.413) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 5.207) (end 0 4.953) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 7.747) (end 0 7.493) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 10.287) (end 0 10.033) + (stroke (width 0.1524) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (rectangle (start -1.27 11.43) (end 1.27 -11.43) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (pin passive line (at -5.08 10.16 0) (length 3.81) + (name "Pin_1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 7.62 0) (length 3.81) + (name "Pin_2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 5.08 0) (length 3.81) + (name "Pin_3" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 2.54 0) (length 3.81) + (name "Pin_4" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 0 0) (length 3.81) + (name "Pin_5" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -2.54 0) (length 3.81) + (name "Pin_6" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -5.08 0) (length 3.81) + (name "Pin_7" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -7.62 0) (length 3.81) + (name "Pin_8" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -5.08 -10.16 0) (length 3.81) + (name "Pin_9" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:LED" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "D" (id 0) (at 0 2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "LED" (id 1) (at 0 -2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "LED diode" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Light emitting diode" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "LED* LED_SMD:* LED_THT:*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "LED_0_1" + (polyline + (pts + (xy -1.27 -1.27) + (xy -1.27 1.27) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.27 0) + (xy 1.27 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -1.27) + (xy 1.27 1.27) + (xy -1.27 0) + (xy 1.27 -1.27) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -3.048 -0.762) + (xy -4.572 -2.286) + (xy -3.81 -2.286) + (xy -4.572 -2.286) + (xy -4.572 -1.524) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -1.778 -0.762) + (xy -3.302 -2.286) + (xy -2.54 -2.286) + (xy -3.302 -2.286) + (xy -3.302 -1.524) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "LED_1_1" + (pin passive line (at -3.81 0 0) (length 2.54) + (name "K" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 3.81 0 180) (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "R" (id 0) (at 2.032 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "R" (id 1) (at 0 0 90) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at -1.778 0 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "R res resistor" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Resistor" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "R_*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "R_0_1" + (rectangle (start -1.016 -2.54) (end 1.016 2.54) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "R_1_1" + (pin passive line (at 0 3.81 270) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 0 -3.81 90) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Diode:1N4001" (pin_numbers hide) (pin_names hide) (in_bom yes) (on_board yes) + (property "Reference" "D" (id 0) (at 0 2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Value" "1N4001" (id 1) (at 0 -2.54 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "http://www.vishay.com/docs/88503/1n4001.pdf" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "diode" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "50V 1A General Purpose Rectifier Diode, DO-41" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "D*DO?41*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "1N4001_0_1" + (polyline + (pts + (xy -1.27 1.27) + (xy -1.27 -1.27) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 0) + (xy -1.27 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 1.27) + (xy 1.27 -1.27) + (xy -1.27 0) + (xy 1.27 1.27) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "1N4001_1_1" + (pin passive line (at -3.81 0 0) (length 2.54) + (name "K" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 3.81 0 180) (length 2.54) + (name "A" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Isolator:LTV-247" (in_bom yes) (on_board yes) + (property "Reference" "U" (id 0) (at -5.08 5.08 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "LTV-247" (id 1) (at 0 5.08 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_SO:SOP-16_4.4x10.4mm_P1.27mm" (id 2) (at -5.08 -5.08 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://optoelectronics.liteon.com/upload/download/DS70-2009-0014/LTV-2X7%20sereis%20Mar17.PDF" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "NPN DC Quad Optocoupler" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "DC Quad Optocoupler, Vce 80V, CTR 100-600%, SOP-16" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "SOP*4.4x10.4mm*P1.27mm*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "LTV-247_0_1" + (rectangle (start -5.08 3.81) (end 5.08 -3.81) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type background)) + ) + (polyline + (pts + (xy -3.175 -0.635) + (xy -1.905 -0.635) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 0.635) + (xy 4.445 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 4.445 -2.54) + (xy 2.54 -0.635) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (polyline + (pts + (xy 4.445 -2.54) + (xy 5.08 -2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 4.445 2.54) + (xy 5.08 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -2.54 -0.635) + (xy -2.54 -2.54) + (xy -5.08 -2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 1.905) + (xy 2.54 -1.905) + (xy 2.54 -1.905) + ) + (stroke (width 0.508) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -5.08 2.54) + (xy -2.54 2.54) + (xy -2.54 -1.27) + (xy -2.54 0.635) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -2.54 -0.635) + (xy -3.175 0.635) + (xy -1.905 0.635) + (xy -2.54 -0.635) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -0.508 -0.508) + (xy 0.762 -0.508) + (xy 0.381 -0.635) + (xy 0.381 -0.381) + (xy 0.762 -0.508) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy -0.508 0.508) + (xy 0.762 0.508) + (xy 0.381 0.381) + (xy 0.381 0.635) + (xy 0.762 0.508) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 3.048 -1.651) + (xy 3.556 -1.143) + (xy 4.064 -2.159) + (xy 3.048 -1.651) + (xy 3.048 -1.651) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + ) + (symbol "LTV-247_1_1" + (pin passive line (at -7.62 2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "15" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "16" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 -2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + (symbol "LTV-247_2_1" + (pin passive line (at 7.62 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "13" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "14" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 -2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27)))) + ) + ) + (symbol "LTV-247_3_1" + (pin passive line (at 7.62 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "11" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "12" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "5" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 -2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "6" (effects (font (size 1.27 1.27)))) + ) + ) + (symbol "LTV-247_4_1" + (pin passive line (at 7.62 2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "10" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "7" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at -7.62 -2.54 0) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "8" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 7.62 -2.54 180) (length 2.54) + (name "~" (effects (font (size 1.27 1.27)))) + (number "9" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Switch:SW_Push" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) + (property "Reference" "SW" (id 0) (at 1.27 2.54 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "SW_Push" (id 1) (at 0 -1.524 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 5.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 0 5.08 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "switch normally-open pushbutton push-button" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Push button switch, generic, two pins" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "SW_Push_0_1" + (circle (center -2.032 0) (radius 0.508) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 1.27) + (xy 0 3.048) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 1.27) + (xy -2.54 1.27) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (circle (center 2.032 0) (radius 0.508) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (pin passive line (at -5.08 0 0) (length 2.54) + (name "1" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 5.08 0 180) (length 2.54) + (name "2" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Transistor_BJT:BC517" (pin_names (offset 0) hide) (in_bom yes) (on_board yes) + (property "Reference" "Q" (id 0) (at 5.08 1.905 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "BC517" (id 1) (at 5.08 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (id 2) (at 5.08 -1.905 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC517-D74Z-D.PDF" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "NPN Darlington Darl Transistor" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "1A Ic, 30V Vce, Darlington NPN Transistor, TO-92" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?92*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "BC517_0_1" + (polyline + (pts + (xy 0.635 0.635) + (xy 2.54 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 -0.635) + (xy 2.54 -2.54) + (xy 2.54 -2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 0) + (xy 2.54 1.905) + (xy 2.54 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.635 1.905) + (xy 0.635 -1.905) + (xy 0.635 -1.905) + ) + (stroke (width 0.508) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.27 -1.778) + (xy 1.778 -1.27) + (xy 2.286 -2.286) + (xy 1.27 -1.778) + (xy 1.27 -1.778) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (circle (center 1.27 0) (radius 2.8194) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "BC517_1_1" + (pin passive line (at 2.54 5.08 270) (length 2.54) + (name "C" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin input line (at -5.08 0 0) (length 5.715) + (name "B" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 -5.08 90) (length 2.54) + (name "E" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "Transistor_FET:IRLZ34N" (pin_names hide) (in_bom yes) (on_board yes) + (property "Reference" "Q" (id 0) (at 6.35 1.905 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "IRLZ34N" (id 1) (at 6.35 0 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" (id 2) (at 6.35 -1.905 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "ki_keywords" "N-Channel HEXFET MOSFET Logic-Level" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "30A Id, 55V Vds, 35mOhm Rds, N-Channel HEXFET Power MOSFET, TO-220AB" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_fp_filters" "TO?220*" (id 6) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "IRLZ34N_0_1" + (polyline + (pts + (xy 0.254 0) + (xy -2.54 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.254 1.905) + (xy 0.254 -1.905) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.762 -1.27) + (xy 0.762 -2.286) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.762 0.508) + (xy 0.762 -0.508) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.762 2.286) + (xy 0.762 1.27) + ) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 2.54) + (xy 2.54 1.778) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 2.54 -2.54) + (xy 2.54 0) + (xy 0.762 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0.762 -1.778) + (xy 3.302 -1.778) + (xy 3.302 1.778) + (xy 0.762 1.778) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 1.016 0) + (xy 2.032 0.381) + (xy 2.032 -0.381) + (xy 1.016 0) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (polyline + (pts + (xy 2.794 0.508) + (xy 2.921 0.381) + (xy 3.683 0.381) + (xy 3.81 0.254) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 3.302 0.381) + (xy 2.921 -0.254) + (xy 3.683 -0.254) + (xy 3.302 0.381) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (circle (center 1.651 0) (radius 2.794) + (stroke (width 0.254) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (circle (center 2.54 -1.778) (radius 0.254) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + (circle (center 2.54 1.778) (radius 0.254) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type outline)) + ) + ) + (symbol "IRLZ34N_1_1" + (pin input line (at -5.08 0 0) (length 2.54) + (name "G" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 5.08 270) (length 2.54) + (name "D" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27)))) + ) + (pin passive line (at 2.54 -5.08 90) (length 2.54) + (name "S" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:+12V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (id 0) (at 0 -3.81 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (id 1) (at 0 3.556 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "power-flag" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"+12V\"" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "+12V_0_1" + (polyline + (pts + (xy -0.762 1.27) + (xy 0 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 0) + (xy 0 2.54) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + (polyline + (pts + (xy 0 2.54) + (xy 0.762 1.27) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "+12V_1_1" + (pin power_in line (at 0 0 90) (length 0) hide + (name "+12V" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes) + (property "Reference" "#PWR" (id 0) (at 0 -6.35 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (id 1) (at 0 -3.81 0) + (effects (font (size 1.27 1.27))) + ) + (property "Footprint" "" (id 2) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_keywords" "power-flag" (id 4) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (id 5) (at 0 0 0) + (effects (font (size 1.27 1.27)) hide) + ) + (symbol "GND_0_1" + (polyline + (pts + (xy 0 0) + (xy 0 -1.27) + (xy 1.27 -1.27) + (xy 0 -2.54) + (xy -1.27 -1.27) + (xy 0 -1.27) + ) + (stroke (width 0) (type default) (color 0 0 0 0)) + (fill (type none)) + ) + ) + (symbol "GND_1_1" + (pin power_in line (at 0 0 270) (length 0) hide + (name "GND" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27)))) + ) + ) + ) + ) + + (junction (at 127 80.01) (diameter 0) (color 0 0 0 0) + (uuid 110a0c0d-1b31-4d7d-86dd-1fa8f51f5950) + ) + (junction (at 200.66 59.69) (diameter 0) (color 0 0 0 0) + (uuid 129c2870-b914-42ff-a464-992891894644) + ) + (junction (at 187.96 88.9) (diameter 0) (color 0 0 0 0) + (uuid 199d2cba-a65e-4941-92f6-47b415357f03) + ) + (junction (at 162.56 80.01) (diameter 0) (color 0 0 0 0) + (uuid 1d2c07f9-1949-45c9-b381-ac1cfcdac472) + ) + (junction (at 127 107.95) (diameter 0) (color 0 0 0 0) + (uuid 29d53627-e930-484d-8f3d-2c46e7cae32d) + ) + (junction (at 160.02 59.69) (diameter 0) (color 0 0 0 0) + (uuid 31cc4738-48ef-4a1e-8ff7-0622e8bfd965) + ) + (junction (at 200.66 72.39) (diameter 0) (color 0 0 0 0) + (uuid 56454f28-9c16-4354-862b-63a050a038de) + ) + (junction (at 95.25 119.38) (diameter 0) (color 0 0 0 0) + (uuid 5c3953d0-ba6b-41fe-b3c6-a1d4ddd15b47) + ) + (junction (at 200.66 88.9) (diameter 0) (color 0 0 0 0) + (uuid 790b1131-5c88-4229-bdd7-3117edc8d03b) + ) + (junction (at 127 93.98) (diameter 0) (color 0 0 0 0) + (uuid 9997ee26-c8d9-40fc-99bd-55557f2987b2) + ) + (junction (at 175.26 72.39) (diameter 0) (color 0 0 0 0) + (uuid bba9cc60-22e0-4126-8b11-ff81494bfb51) + ) + (junction (at 104.14 119.38) (diameter 0) (color 0 0 0 0) + (uuid c00ca608-dfd7-4822-8d68-00fb2f805fc2) + ) + (junction (at 167.64 59.69) (diameter 0) (color 0 0 0 0) + (uuid e23dbc8a-e4e0-4bcc-90e5-8da590197713) + ) + (junction (at 175.26 88.9) (diameter 0) (color 0 0 0 0) + (uuid e2b4ff36-9bbc-4714-a5f0-b027b2835354) + ) + (junction (at 175.26 59.69) (diameter 0) (color 0 0 0 0) + (uuid e381ec45-b7ac-4c1d-9455-58b40cc7b8a8) + ) + (junction (at 177.8 59.69) (diameter 0) (color 0 0 0 0) + (uuid e434c8ff-c6c7-4b04-ad8b-c686eeebf0c2) + ) + + (no_connect (at 241.3 57.15) (uuid 36d937a0-6eb8-4093-a1e5-4e05398ef795)) + + (wire (pts (xy 100.965 71.12) (xy 104.14 71.12)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 000677d4-7781-41a1-a34f-947dda361da8) + ) + (wire (pts (xy 114.3 74.93) (xy 116.84 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 008eaa50-fbf1-4b1d-a367-cefa0f75893b) + ) + (polyline (pts (xy 251.46 34.29) (xy 251.46 139.065)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0150125b-1bb9-49f1-b2bf-8d71cb6b4727) + ) + + (wire (pts (xy 127 107.95) (xy 127 93.98)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0199f6db-3ace-4852-a3a7-c0e53b0dff26) + ) + (wire (pts (xy 200.66 88.9) (xy 198.12 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 058cdb08-7187-4d2f-a0ed-6459ae72c6f4) + ) + (wire (pts (xy 237.49 40.64) (xy 238.76 40.64)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 05ad5883-87c5-423e-95fb-b82d679b7df8) + ) + (wire (pts (xy 240.03 55.88) (xy 240.03 54.61)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 072bdd57-2102-4b68-aecf-5bd04319ed96) + ) + (wire (pts (xy 238.76 44.45) (xy 238.76 43.18)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 07f570c3-2f84-43bb-8d42-02365b62643d) + ) + (wire (pts (xy 143.51 60.96) (xy 148.59 60.96)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 08fc16c2-6ac6-4692-a37d-7f04572b9892) + ) + (wire (pts (xy 203.2 67.31) (xy 203.2 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0c338e21-00b6-4411-b7a9-adf41009d47f) + ) + (wire (pts (xy 129.54 41.91) (xy 121.92 41.91)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0c5cf049-ccb4-44d4-a479-8b48f1057155) + ) + (wire (pts (xy 153.67 59.69) (xy 160.02 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 0eae4f4a-3540-4e0a-8f5c-e4208d05a6b7) + ) + (wire (pts (xy 237.49 115.57) (xy 248.92 115.57)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 1021d2a8-e908-49e1-88d3-2be47234d986) + ) + (wire (pts (xy 250.825 135.255) (xy 237.49 135.255)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 11fa0e72-10ef-4d20-ab27-4fb903e4d2f0) + ) + (wire (pts (xy 187.96 80.01) (xy 193.04 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 123a73d1-b906-48c8-a532-c001a8022efc) + ) + (wire (pts (xy 127 93.98) (xy 128.27 93.98)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 139ead63-2083-4080-bb1e-cabc975d9f39) + ) + (wire (pts (xy 237.49 100.33) (xy 243.84 100.33)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 1498ec5e-b808-44b6-8c64-de87a308d239) + ) + (wire (pts (xy 175.26 88.9) (xy 172.72 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 14b10c59-26e4-45f6-8a6b-239f18c70527) + ) + (wire (pts (xy 177.8 67.31) (xy 177.8 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 15ca6e48-9f43-4881-9705-c498a6bca424) + ) + (wire (pts (xy 110.49 93.98) (xy 127 93.98)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 15e814b1-1697-483e-9e6c-72d7a7d00948) + ) + (wire (pts (xy 124.46 74.93) (xy 128.27 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 16b0555f-d659-4e2e-a54b-0d0cc713695e) + ) + (wire (pts (xy 200.66 88.9) (xy 200.66 85.09)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 190ea63a-d448-463b-be8b-0acd74b988a7) + ) + (wire (pts (xy 148.59 60.96) (xy 148.59 58.42)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 1d9e51cb-f4f4-49ad-afcb-de8b3d5a99fa) + ) + (wire (pts (xy 127 119.38) (xy 127 107.95)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 1e06fdc9-1d8c-4bfc-be97-83f60cd16fd0) + ) + (wire (pts (xy 200.66 72.39) (xy 200.66 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 235cc1c7-9f81-491c-b6f8-30c11ad4baef) + ) + (wire (pts (xy 143.51 107.95) (xy 146.05 107.95)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 27226514-3658-4569-8f61-d9b99df21567) + ) + (wire (pts (xy 177.8 59.69) (xy 177.8 64.77)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 27796072-eddd-423f-baa9-3929edbe6ea5) + ) + (wire (pts (xy 237.49 69.85) (xy 243.84 69.85)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 2f3d9f91-6ae0-4196-983b-651e659910b2) + ) + (wire (pts (xy 146.05 105.41) (xy 146.05 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 2f5baecb-07a1-44e1-8cff-8e89dd4add78) + ) + (wire (pts (xy 85.725 119.38) (xy 95.25 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 319c71ae-35b7-47f7-a7cd-841ab8df14a9) + ) + (wire (pts (xy 238.76 40.64) (xy 238.76 39.37)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 33df23ec-19ce-4cbd-9c3d-2b700ab91173) + ) + (wire (pts (xy 153.67 74.93) (xy 153.67 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 348b0d61-5022-49af-9778-aac29085ad6f) + ) + (polyline (pts (xy 229.87 139.065) (xy 229.87 34.29)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 36b53a8f-af87-48cd-8d0e-90c0db70e455) + ) + + (wire (pts (xy 237.49 102.87) (xy 243.84 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 394b6bd8-54b1-418d-b810-125383e1e203) + ) + (wire (pts (xy 175.26 59.69) (xy 175.26 62.23)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 39bd2aa0-965f-4326-8cb2-35d015e841b3) + ) + (wire (pts (xy 203.2 59.69) (xy 203.2 64.77)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 3a21fd69-89b4-47d8-a06c-8257cc1db70a) + ) + (wire (pts (xy 76.835 113.03) (xy 78.105 113.03)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 3c7319a2-7754-4db6-9271-baba8cf6446c) + ) + (wire (pts (xy 248.92 125.73) (xy 237.49 125.73)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 42664593-5683-414b-ac75-49eac3109160) + ) + (polyline (pts (xy 229.87 34.29) (xy 251.46 34.29)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 47b9a006-0a82-4d74-ab71-99ce5aa3851c) + ) + + (wire (pts (xy 116.84 88.9) (xy 111.76 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 47bffc28-f2d8-421b-8c73-6fc99a391113) + ) + (wire (pts (xy 177.8 59.69) (xy 200.66 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 4e05cecd-fa6d-4bba-bb09-f4162a667543) + ) + (wire (pts (xy 240.03 58.42) (xy 240.03 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 4ee530cb-6f16-48d7-a018-4f71c4d2e13b) + ) + (wire (pts (xy 187.96 88.9) (xy 190.5 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 4f5cde8d-a28a-4fcb-90d2-8137f6d16c82) + ) + (wire (pts (xy 121.92 39.37) (xy 121.92 35.56)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 50c5afd3-84a7-4360-aae6-f45810c1ebb9) + ) + (wire (pts (xy 74.93 78.74) (xy 109.22 78.74)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 51f09656-4db8-4694-be8e-85c57384726f) + ) + (wire (pts (xy 237.49 132.715) (xy 240.665 132.715)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 5757c8df-fe31-4792-b4c3-f72278cd143d) + ) + (wire (pts (xy 237.49 123.19) (xy 241.3 123.19)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 59bc09d6-c916-493d-ba80-c70d4cb4c967) + ) + (wire (pts (xy 74.93 73.66) (xy 85.725 73.66)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 5b449aa8-66ff-496e-b990-52b5a4c0f82f) + ) + (wire (pts (xy 175.26 88.9) (xy 175.26 91.44)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 5c347296-2e71-407d-b9e5-73c75fe5ff36) + ) + (polyline (pts (xy 251.46 139.065) (xy 229.87 139.065)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 61efe474-7aba-4188-b5c4-9309c5fa5b50) + ) + + (wire (pts (xy 85.725 118.11) (xy 85.725 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 65aa2c0f-e26d-4c6c-8c90-38500215431e) + ) + (wire (pts (xy 85.725 73.66) (xy 85.725 86.36)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 685ed69e-7fcf-4dd4-9488-b3235d26911c) + ) + (wire (pts (xy 143.51 74.93) (xy 153.67 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 6913b7fc-0282-4345-9a40-229de77f9d88) + ) + (wire (pts (xy 74.93 63.5) (xy 114.3 63.5)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 6e984cbf-c784-4d9d-b804-282c256fa941) + ) + (wire (pts (xy 237.49 85.09) (xy 243.84 85.09)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 6f7f918b-b1eb-475c-86d1-544caab116be) + ) + (wire (pts (xy 121.92 39.37) (xy 129.54 39.37)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 703c377b-1001-4910-b4be-c9e6e761aaaf) + ) + (wire (pts (xy 175.26 69.85) (xy 175.26 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 707e75de-bd71-44c6-a0a2-fadc672ae3bc) + ) + (wire (pts (xy 127 93.98) (xy 127 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7168a191-0f93-451e-9fc1-7ca64a0e5707) + ) + (wire (pts (xy 124.46 102.87) (xy 128.27 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 717fe736-662d-47c5-840a-925c63deb9c5) + ) + (wire (pts (xy 127 80.01) (xy 128.27 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 71df0000-975f-4b7d-a2f9-b4a5077b55f5) + ) + (wire (pts (xy 74.93 68.58) (xy 100.965 68.58)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 768e28b8-b4c0-4dc8-b6be-f1aed22e7416) + ) + (wire (pts (xy 237.49 87.63) (xy 243.84 87.63)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 78f63b55-063e-4f24-9e29-dc066a197da2) + ) + (wire (pts (xy 160.02 72.39) (xy 160.02 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7999f2e1-b767-4160-a900-f398ecf36182) + ) + (wire (pts (xy 162.56 88.9) (xy 162.56 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7adfb321-f941-47b8-b4b6-f5fee53ef3ea) + ) + (wire (pts (xy 104.14 73.66) (xy 104.14 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7b09f36b-90b9-463d-a6e0-1860e759737e) + ) + (wire (pts (xy 146.05 102.87) (xy 143.51 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 7cdc2ef1-4f95-4632-8381-aa287bf10c2c) + ) + (wire (pts (xy 114.3 63.5) (xy 114.3 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 87235c42-7717-4001-ae3a-7b53e94f2099) + ) + (wire (pts (xy 240.03 54.61) (xy 241.3 54.61)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 880030fe-ca8e-40a0-928f-1ab6607361fa) + ) + (wire (pts (xy 109.22 102.87) (xy 116.84 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 8e612ff9-cccf-4cc0-9a66-01cbf5d85362) + ) + (wire (pts (xy 187.96 97.79) (xy 187.96 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 8eb7a0a9-9676-4294-a40a-a1f9f2ce6788) + ) + (wire (pts (xy 153.67 93.98) (xy 153.67 97.79)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 907e40dc-cabd-4d17-8f50-440987f8e725) + ) + (wire (pts (xy 187.96 88.9) (xy 187.96 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 955db33c-7ff4-497d-82fc-67357ed26f80) + ) + (wire (pts (xy 175.26 72.39) (xy 175.26 74.93)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 969647fa-dec0-4ad5-871a-5d57d22d733a) + ) + (wire (pts (xy 250.825 132.715) (xy 250.825 135.255)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 99bdefc0-15c2-4865-83f2-75c2793895a7) + ) + (wire (pts (xy 175.26 59.69) (xy 177.8 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid 9ac79d56-7857-4067-9b2a-5df344096969) + ) + (wire (pts (xy 111.76 88.9) (xy 111.76 66.04)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a0a93e65-920f-4289-8752-08a035180165) + ) + (wire (pts (xy 127 80.01) (xy 127 66.04)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a0e32e0b-e08d-4ccd-b09f-651084d51bfb) + ) + (wire (pts (xy 238.76 43.18) (xy 237.49 43.18)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a3aa1992-376c-4c49-881a-ecc5945833fe) + ) + (wire (pts (xy 143.51 93.98) (xy 153.67 93.98)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a546bd25-8658-4f85-b720-3142705c1d5c) + ) + (wire (pts (xy 74.93 81.28) (xy 76.835 81.28)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a65a4dc7-4bd2-4ab8-8bb7-0c0d0aab637d) + ) + (wire (pts (xy 203.2 72.39) (xy 200.66 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a67224f6-a3c1-4b68-a32c-c289b2270156) + ) + (wire (pts (xy 151.13 66.04) (xy 151.13 58.42)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a7cbfcec-8089-4c92-93d5-62d73b1df19d) + ) + (wire (pts (xy 143.51 80.01) (xy 162.56 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid a9b53dfe-7aac-4d72-a8da-08029124bd3f) + ) + (wire (pts (xy 237.49 113.03) (xy 241.3 113.03)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid ac4b6aad-e4ec-4b32-85ec-578342430c4f) + ) + (wire (pts (xy 203.2 59.69) (xy 200.66 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid ac73956b-7c46-48ed-aca5-4de476d5f141) + ) + (wire (pts (xy 121.92 41.91) (xy 121.92 44.45)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid af42f897-f3ff-48f8-8b68-6468cd1d71e1) + ) + (wire (pts (xy 95.25 103.505) (xy 95.25 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid af71aa3e-d66e-4b1b-ae51-cbb21ec3808e) + ) + (wire (pts (xy 248.92 113.03) (xy 248.92 115.57)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b02f6a55-b462-44a3-8636-7254719de68b) + ) + (wire (pts (xy 85.725 93.98) (xy 85.725 100.965)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b2d299b2-44cc-4adc-a7e9-b5bd0c034e9e) + ) + (wire (pts (xy 200.66 88.9) (xy 200.66 91.44)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b392e0ca-1552-4b3c-a5b9-5a7b5e26bd46) + ) + (wire (pts (xy 76.835 93.98) (xy 76.835 113.03)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b52d2193-9cf5-4145-a513-c8b493402961) + ) + (wire (pts (xy 95.25 119.38) (xy 104.14 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b7c6d34c-1f24-4d06-947a-96b73a4f3a24) + ) + (wire (pts (xy 124.46 60.96) (xy 128.27 60.96)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid b8618f6a-646a-4c2a-adc7-e8d746979aad) + ) + (wire (pts (xy 177.8 72.39) (xy 175.26 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid ba48f959-efe4-4850-91c0-87d4b7b11e56) + ) + (wire (pts (xy 110.49 93.98) (xy 110.49 76.2)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid bdd44dfc-bb1c-406b-89c7-c887b8ef9e80) + ) + (wire (pts (xy 127 107.95) (xy 128.27 107.95)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid bf62fa88-0ee3-4655-8c6e-35742090c8b4) + ) + (wire (pts (xy 95.25 93.98) (xy 95.25 100.965)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c147c6fc-b0d1-4383-b2ac-fbc90cc41fe0) + ) + (wire (pts (xy 124.46 88.9) (xy 128.27 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c28110f7-a59c-4e94-b0e4-5e742cd28163) + ) + (wire (pts (xy 85.725 103.505) (xy 85.725 107.95)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c344278c-9554-4e68-b874-eb37b2c72ba1) + ) + (wire (pts (xy 74.93 71.12) (xy 95.25 71.12)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid c9ae26db-9aa1-4ae7-b7a2-a389cce4ed17) + ) + (wire (pts (xy 100.965 68.58) (xy 100.965 71.12)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid cbfeb388-757e-4752-97f1-65d9730014e2) + ) + (wire (pts (xy 167.64 50.8) (xy 167.64 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid cc257787-96f7-4a07-adbc-a4fc50302489) + ) + (wire (pts (xy 160.02 59.69) (xy 160.02 64.77)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid cf67dfd2-2818-4f6d-99ef-853a92789f6e) + ) + (wire (pts (xy 74.93 76.2) (xy 110.49 76.2)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d0d4924c-1346-4816-8691-de7b89752cd6) + ) + (wire (pts (xy 74.93 60.96) (xy 116.84 60.96)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d3f84f95-3abb-4a84-99f8-c012ebb0906c) + ) + (wire (pts (xy 237.49 58.42) (xy 240.03 58.42)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d570f55e-1cd5-4c3e-b5e8-8c306868e276) + ) + (wire (pts (xy 111.76 66.04) (xy 74.93 66.04)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d675aaab-cf35-4f6b-afbd-a1bb59795d6f) + ) + (wire (pts (xy 162.56 88.9) (xy 165.1 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d6d45db8-ec03-4d9a-89c7-ca2cb57932f1) + ) + (wire (pts (xy 95.25 71.12) (xy 95.25 86.36)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid d752ac8e-b2b3-4b3f-9205-cfbc681b5331) + ) + (wire (pts (xy 153.67 97.79) (xy 187.96 97.79)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid dbd8a65a-9d2e-4b53-beb7-7b44d5b7b98b) + ) + (wire (pts (xy 162.56 80.01) (xy 167.64 80.01)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid dc534ae5-69c7-4fcf-9a37-63054e139c90) + ) + (wire (pts (xy 153.67 59.69) (xy 153.67 64.77)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid deead966-50c4-43da-a2d3-b46280310a78) + ) + (wire (pts (xy 237.49 55.88) (xy 240.03 55.88)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid df46b854-c992-44ff-b16d-3b486c5fc7bf) + ) + (wire (pts (xy 160.02 59.69) (xy 167.64 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e088514a-81c5-4d3f-b5e5-a6fd621d448f) + ) + (wire (pts (xy 175.26 59.69) (xy 167.64 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e13f4352-ddc5-43c9-b6df-446bcc054399) + ) + (wire (pts (xy 104.14 119.38) (xy 127 119.38)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e4345c19-5173-4de9-bbb1-d5f4146aa6e6) + ) + (wire (pts (xy 200.66 59.69) (xy 200.66 62.23)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e5780908-e792-4193-bcf5-ed3cbdb6abf9) + ) + (wire (pts (xy 240.03 59.69) (xy 241.3 59.69)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e798323b-9d60-484f-8136-e584790bb016) + ) + (wire (pts (xy 248.92 123.19) (xy 248.92 125.73)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e8c2809d-e6c8-4cdb-a9bd-4d62ef5f2b0c) + ) + (wire (pts (xy 175.26 88.9) (xy 175.26 85.09)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid e93fdd68-b689-49e2-a2c0-8f1516652e6f) + ) + (wire (pts (xy 109.22 78.74) (xy 109.22 102.87)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid ea530128-60ad-4ba6-b02f-cc43d12daef4) + ) + (wire (pts (xy 143.51 66.04) (xy 151.13 66.04)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid f16d9ae8-c94f-4b6c-af06-9384bf38d4cc) + ) + (wire (pts (xy 127 66.04) (xy 128.27 66.04)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid f3dfeb75-2602-4390-b37e-3f5e15ccf004) + ) + (wire (pts (xy 200.66 69.85) (xy 200.66 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid f818df2d-3096-4c28-9c75-75f819dbf1eb) + ) + (wire (pts (xy 76.835 81.28) (xy 76.835 86.36)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid f99a27de-e2a9-4396-a6dd-0f7474049dd7) + ) + (wire (pts (xy 237.49 72.39) (xy 243.84 72.39)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid fb5ad605-699f-4826-ae24-66bc34e2bb17) + ) + (wire (pts (xy 160.02 88.9) (xy 143.51 88.9)) + (stroke (width 0) (type default) (color 0 0 0 0)) + (uuid fbad52a8-66ab-45e3-ab3d-f4f978049ed0) + ) + + (text "D5" (at 64.77 79.375 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 0cf4d535-1743-4166-88d0-c617092362b0) + ) + (text "D2" (at 64.77 66.675 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 20aaf926-808e-4646-9e72-10c64da1968d) + ) + (text "D0" (at 64.77 61.595 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 23369747-e9e9-4b63-aa2d-51505c932d5c) + ) + (text "D4" (at 64.77 71.755 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 24d28b46-8567-453a-98f2-96237126cd06) + ) + (text "D6" (at 64.77 81.915 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 2e65d106-930d-4bef-97a5-f6991a61b405) + ) + (text "+3.3V" (at 61.595 74.295 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 60a9c5e0-23e5-4508-af12-7f6e30746fa9) + ) + (text "D3" (at 64.77 69.215 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid bd7277bb-a8d3-41ab-8347-51f85cbd32ea) + ) + (text "GND" (at 63.5 76.835 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid c2d9cccb-68a9-417a-9e91-b5786963e772) + ) + (text "D1" (at 64.77 64.135 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid dea7a33e-0b9d-4119-a9d6-1451681be2d7) + ) + + (label "ESPGND" (at 86.995 76.2 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 72fbdc19-d5ad-419e-b619-07d12efc0cd8) + ) + (label "D3" (at 85.725 68.58 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid e2e3e2d2-830f-4555-a8d8-4375b05d30c9) + ) + (label "3.3V" (at 85.725 73.66 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid e61cf46a-dc08-401e-9cab-51dc884a279d) + ) + + (symbol (lib_id "Connector:AudioJack3") (at 246.38 57.15 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f15d486) + (property "Reference" "#J31" (id 0) (at 246.8372 63.0682 0)) + (property "Value" "Camera 2.5mm" (id 1) (at 261.62 57.15 0)) + (property "Footprint" "" (id 2) (at 246.38 57.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 246.38 57.15 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "R" (uuid 235be564-b5b7-49e6-be34-9f729f20248b)) + (pin "S" (uuid 70961c7f-4baf-44e6-9e7f-07f72a19957e)) + (pin "T" (uuid e4211997-7e82-4ce3-af14-5fb949ce86c9)) + ) + + (symbol (lib_id "Connector:AudioJack2") (at 248.92 85.09 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f16a27d) + (property "Reference" "#J33" (id 0) (at 248.92 90.17 0)) + (property "Value" "Flash 2.5mm" (id 1) (at 260.35 85.09 0)) + (property "Footprint" "" (id 2) (at 248.92 85.09 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 248.92 85.09 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "S" (uuid 21a97618-1187-4c19-863b-0f10793d9f5a)) + (pin "T" (uuid 964778b2-7e58-4cb4-95a1-39dffdbbd4a6)) + ) + + (symbol (lib_id "Connector:Barrel_Jack") (at 246.38 41.91 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f1766f2) + (property "Reference" "#J30" (id 0) (at 246.38 46.99 0)) + (property "Value" "12V" (id 1) (at 254 41.91 0)) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 245.11 42.926 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 245.11 42.926 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e51bdfc3-3151-4640-a320-09340720271d)) + (pin "2" (uuid e5c7e39c-8961-40f7-9494-c3e86119fc7b)) + ) + + (symbol (lib_id "Connector:AudioJack2") (at 248.92 69.85 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f1a757b) + (property "Reference" "#J32" (id 0) (at 248.92 74.93 0)) + (property "Value" "Valve 3.5mm" (id 1) (at 260.35 69.85 0)) + (property "Footprint" "" (id 2) (at 248.92 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 248.92 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "S" (uuid 775ac8d3-9334-49d7-9a1d-e1d4414e0ba9)) + (pin "T" (uuid cb52b9de-dfff-4e34-a84a-6074eed02435)) + ) + + (symbol (lib_id "Connector:AudioJack2") (at 248.92 100.33 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f1d00a9) + (property "Reference" "#J34" (id 0) (at 248.92 105.41 0)) + (property "Value" "Valve 3.5mm" (id 1) (at 261.62 100.33 0)) + (property "Footprint" "" (id 2) (at 248.92 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 248.92 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "S" (uuid ad77445d-6493-4245-807d-380aef4337d9)) + (pin "T" (uuid 7defc90b-cee2-404a-b8ee-dfc0f61ca15e)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 69.85 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f429e89) + (property "Reference" "#J22" (id 0) (at 232.41 74.93 0)) + (property "Value" "Valve 1" (id 1) (at 230.378 72.3646 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 69.85 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 05402cc1-1561-49f1-a985-242bb8e741d0)) + (pin "2" (uuid 5c7b868d-3ffe-4e70-a192-2a25271fe432)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 100.33 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f43680f) + (property "Reference" "#J24" (id 0) (at 232.41 105.41 0)) + (property "Value" "Valve 2" (id 1) (at 230.378 102.8446 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 100.33 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ab3c9d6f-04fd-4e63-87bf-71a8cc390e70)) + (pin "2" (uuid 3df9f2f3-8256-49b2-b9f1-4788a4c93c9d)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 85.09 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f443dc0) + (property "Reference" "#J23" (id 0) (at 234.95 90.17 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Flash" (id 1) (at 230.378 87.6046 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 85.09 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 85.09 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 19219a01-073c-4da7-b093-139da7e316f0)) + (pin "2" (uuid d13230e6-bd1f-43d6-99c1-3a08c25883b0)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 40.64 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f44b381) + (property "Reference" "#J20" (id 0) (at 234.95 45.72 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Flash" (id 1) (at 230.378 43.1546 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 40.64 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 40.64 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1fb5c3a8-a7ea-41ae-bed1-f7886ed0e2f4)) + (pin "2" (uuid 0f244b45-e094-48b6-ab90-bcc5a9a205c5)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 55.88 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f468807) + (property "Reference" "#J21" (id 0) (at 232.41 60.96 0)) + (property "Value" "Camera" (id 1) (at 230.378 58.3946 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 55.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 55.88 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid d66db1b3-97f6-4719-bc73-83f0546a1566)) + (pin "2" (uuid 1effa2b5-2b9b-4ab2-9318-8ce1930bc7c0)) + ) + + (symbol (lib_id "Device:R") (at 120.65 74.93 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5088a4) + (property "Reference" "R2" (id 0) (at 121.92 71.12 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "100R" (id 1) (at 123.19 76.2 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 120.65 76.708 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 120.65 74.93 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 666e326a-9d7d-446d-89bb-ba4c86236ed3)) + (pin "2" (uuid 4b6b8d76-321d-4ec7-aa43-e94fb1532f5f)) + ) + + (symbol (lib_id "Device:R") (at 168.91 88.9 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5088c2) + (property "Reference" "R6" (id 0) (at 170.18 85.09 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "1K" (id 1) (at 170.18 90.17 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 168.91 90.678 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 168.91 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2f81d498-57f1-49f7-be20-e39d2ae15de3)) + (pin "2" (uuid 58812fc1-b666-45d1-b842-78d1c41a1679)) + ) + + (symbol (lib_id "power:+12V") (at 121.92 33.02 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5088cc) + (property "Reference" "#P+0101" (id 0) (at 121.92 33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (id 1) (at 119.38 30.48 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 121.92 33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 121.92 33.02 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1a8694ab-d86f-4d48-a9d7-34ee00dfa58f)) + ) + + (symbol (lib_id "power:+12V") (at 167.64 48.26 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5088d6) + (property "Reference" "#P+0102" (id 0) (at 167.64 48.26 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "+12V" (id 1) (at 165.1 53.34 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 167.64 48.26 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 167.64 48.26 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 71fcf8ca-722a-46fa-8260-22376b3dd5d6)) + ) + + (symbol (lib_id "power:GND") (at 121.92 46.99 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5088e0) + (property "Reference" "#GND0101" (id 0) (at 121.92 46.99 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (id 1) (at 119.38 49.53 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 121.92 46.99 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 121.92 46.99 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 87df90cd-36ac-4325-b3dc-41a79d9fc74f)) + ) + + (symbol (lib_id "Device:R") (at 120.65 60.96 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f508930) + (property "Reference" "R1" (id 0) (at 121.92 57.15 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "100R" (id 1) (at 123.19 62.23 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 120.65 62.738 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 120.65 60.96 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 73b712b4-e02a-4930-afe5-3f7092f0b6bd)) + (pin "2" (uuid b8d34a25-ff79-4096-9393-79c8daebc419)) + ) + + (symbol (lib_id "Device:R") (at 153.67 68.58 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f508963) + (property "Reference" "R5" (id 0) (at 154.94 68.58 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "1K" (id 1) (at 154.94 71.12 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 151.892 68.58 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 153.67 68.58 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 492c73e8-fd0a-4682-8f5c-10aeb081b4fc)) + (pin "2" (uuid 6e52c315-d8a1-4dee-ad49-8dbe63f6ab36)) + ) + + (symbol (lib_id "power:GND") (at 175.26 93.98 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5089c8) + (property "Reference" "#GND0107" (id 0) (at 175.26 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (id 1) (at 172.72 96.52 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 175.26 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 175.26 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid c16f9838-db6c-4d60-ba4c-586936e3f992)) + ) + + (symbol (lib_id "Diode:1N4001") (at 175.26 66.04 270) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f5089dd) + (property "Reference" "D1" (id 0) (at 171.45 64.77 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1N4007" (id 1) (at 172.72 66.04 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal" (id 2) (at 170.815 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "http://www.vishay.com/docs/88503/1n4001.pdf" (id 3) (at 175.26 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 33c21d30-56cb-4862-884b-21e8b93bb27a)) + (pin "2" (uuid 66664491-e7a5-43f6-af57-ff1f19e02647)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 148.59 53.34 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f508a07) + (property "Reference" "J11" (id 0) (at 153.67 55.88 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Value" "Camera" (id 1) (at 153.67 49.53 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 148.59 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 148.59 53.34 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1c71ad02-1855-49fb-8894-e4e305c839be)) + (pin "2" (uuid 6cc2c5e5-037b-4d35-8acc-bcc0942f7d3a)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 182.88 64.77 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f508a23) + (property "Reference" "J12" (id 0) (at 181.61 69.85 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Value" "Valve 1" (id 1) (at 186.69 69.85 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 182.88 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 182.88 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a13d22da-a7c9-4b62-9440-05ca97186a9e)) + (pin "2" (uuid f8577e69-dd20-40b5-9de8-bd0eb19defd5)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 134.62 39.37 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 00000000-0000-0000-0000-00005f508a74) + (property "Reference" "J10" (id 0) (at 132.08 44.45 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "12V" (id 1) (at 136.652 41.8846 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 134.62 39.37 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ad80c1d4-cc62-48fc-9f38-d013266c434c)) + (pin "2" (uuid 06ad5979-3ced-4954-a2bc-48358511aa3a)) + ) + + (symbol (lib_id "Device:R") (at 76.835 90.17 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 0ca74120-cd87-45be-9db9-b0132d5e8c71) + (property "Reference" "R10" (id 0) (at 78.74 90.805 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "1K" (id 1) (at 78.74 93.345 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 75.057 90.17 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 76.835 90.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 7a4fa85c-a384-49b2-a0ea-d611628f3bec)) + (pin "2" (uuid 8e9858aa-f63f-4109-9f2a-d6be5ab4a46d)) + ) + + (symbol (lib_id "Device:R") (at 85.725 90.17 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 1432aa29-d149-44e0-9cc3-e01fa3b1eac9) + (property "Reference" "R11" (id 0) (at 91.44 88.265 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "22R" (id 1) (at 91.44 90.805 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 87.503 90.17 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 85.725 90.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 346a7ca0-2e41-48dd-8837-229f4a5d5d4a)) + (pin "2" (uuid 24fb763b-9e22-4fe6-84a3-17d89097a98f)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 208.28 64.77 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 182fbb93-0096-492c-82ec-a3699b10e48b) + (property "Reference" "J13" (id 0) (at 207.01 69.85 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Value" "Valve 2" (id 1) (at 212.09 69.85 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 208.28 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 208.28 64.77 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f6fa71bb-856a-4691-b94d-9e9d95e906c9)) + (pin "2" (uuid 832995d4-4f8d-439a-978e-a50edb5c1c35)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 123.19 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 1d070cd3-ea6b-4cdd-a3de-323a4c0eca99) + (property "Reference" "#J26" (id 0) (at 232.41 128.27 0)) + (property "Value" "Valve 2" (id 1) (at 230.378 125.7046 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 123.19 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 123.19 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid ab1e3999-27ef-4029-88f2-c591b2e99c72)) + (pin "2" (uuid a138fa9c-2f8f-4b46-8fe0-30424c1c193f)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 132.715 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 1e6b835b-d782-4c93-af12-949f57a31d86) + (property "Reference" "#J27" (id 0) (at 232.41 137.795 0)) + (property "Value" "Valve 2" (id 1) (at 230.378 135.2296 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 132.715 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 132.715 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 6ba8f0e2-1eba-4787-9f22-4b2e842dcc41)) + (pin "2" (uuid 01197e11-5e34-4fff-8a73-4fef0c3f35fb)) + ) + + (symbol (lib_id "Device:R") (at 120.65 102.87 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 20ac2947-029a-4bef-9b1f-63bd1873260e) + (property "Reference" "R4" (id 0) (at 121.92 99.06 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "100R" (id 1) (at 123.19 104.14 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 120.65 104.648 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 120.65 102.87 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f5948e87-9cbd-4205-958c-36b9ba578507)) + (pin "2" (uuid d8c4d8c2-94ae-4d2f-8791-0fb6876d7d55)) + ) + + (symbol (lib_id "Transistor_FET:IRLZ34N") (at 198.12 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 234efd1c-1460-4e8d-9696-8836ff63bc4e) + (property "Reference" "Q2" (id 0) (at 204.47 78.7399 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "IRLZ34N" (id 1) (at 204.47 81.2799 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" (id 2) (at 204.47 81.915 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720" (id 3) (at 198.12 80.01 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid bf18f34c-8df3-4640-af08-91677a036d96)) + (pin "2" (uuid 47ec2b74-924c-4d2b-ae24-70c0c9a30168)) + (pin "3" (uuid c87311b3-e8d3-4b50-bda2-01aadcba67b6)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x09") (at 69.85 71.12 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 2bdda44f-4a64-4a91-a3b2-306502ca67ca) + (property "Reference" "J1" (id 0) (at 69.85 59.69 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "ESP" (id 1) (at 69.85 57.785 0)) + (property "Footprint" "Connector_PinSocket_2.54mm:PinSocket_1x09_P2.54mm_Vertical" (id 2) (at 69.85 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 69.85 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid de98b981-fd7e-4a42-b98c-7e5bff3bfb54)) + (pin "2" (uuid 5ef0283e-8d86-47b0-9ee3-a2ae28bda3dd)) + (pin "3" (uuid 9dd24b62-03ed-40eb-9f4d-f382317f2e20)) + (pin "4" (uuid 2446c785-a3e5-4310-a9c8-f264bcaef01b)) + (pin "5" (uuid 25c30408-3223-4458-935a-8c4e58160868)) + (pin "6" (uuid 5210cfb9-70d0-409a-af0c-1fa2b3668193)) + (pin "7" (uuid 13c9e34f-1886-4fb8-a12b-8810fbcd4b32)) + (pin "8" (uuid 41bfdd47-912b-4558-baa3-fc20aa54503d)) + (pin "9" (uuid 702abede-bbc2-4df8-beb3-e2f13463cca7)) + ) + + (symbol (lib_id "Transistor_BJT:BC517") (at 83.185 113.03 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 2e6d26a8-7d38-4064-bced-cd5ba64a56af) + (property "Reference" "Q3" (id 0) (at 88.265 111.7599 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Value" "BC517" (id 1) (at 88.265 113.0299 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-92_Inline" (id 2) (at 88.265 114.935 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "https://www.onsemi.com/pub/Collateral/BC517-D74Z-D.PDF" (id 3) (at 83.185 113.03 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid d1fe2267-764b-4500-a163-69f500dffb2c)) + (pin "2" (uuid 441ce9da-c95a-4b49-9151-36653401381e)) + (pin "3" (uuid 6828baf4-12b6-48ca-a81c-21f72d79d687)) + ) + + (symbol (lib_id "Transistor_FET:IRLZ34N") (at 172.72 80.01 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 39bf7fb9-ac91-4ed7-9f86-a482c712e903) + (property "Reference" "Q1" (id 0) (at 179.07 78.7399 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "IRLZ34N" (id 1) (at 179.07 81.2799 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" (id 2) (at 179.07 81.915 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720" (id 3) (at 172.72 80.01 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid c685980a-45f6-4471-80b1-89fc541d2b8d)) + (pin "2" (uuid d5945562-71cc-4dd5-9e98-3e4f795f1e52)) + (pin "3" (uuid 56295c32-b537-4b23-852e-d8c15cb3f956)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 100.33 100.965 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 56b1ef67-0d6f-4d06-97fd-45bca9c1e150) + (property "Reference" "J16" (id 0) (at 99.06 98.425 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "LED" (id 1) (at 102.87 104.14 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 100.33 100.965 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 100.33 100.965 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 3edbdf54-7552-4d37-bf4d-b41b2100ecdf)) + (pin "2" (uuid 94336284-eddf-40f1-b26b-ff46d137d359)) + ) + + (symbol (lib_id "Isolator:LTV-247") (at 135.89 63.5 0) (unit 1) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 5d6fa3b0-2257-4bed-bda3-eec3345b1075) + (property "Reference" "U1" (id 0) (at 135.89 55.9902 0)) + (property "Value" "LTV-247" (id 1) (at 135.89 58.5271 0)) + (property "Footprint" "Package_SO:SOP-16_4.4x10.4mm_P1.27mm" (id 2) (at 130.81 68.58 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://optoelectronics.liteon.com/upload/download/DS70-2009-0014/LTV-2X7%20sereis%20Mar17.PDF" (id 3) (at 135.89 63.5 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid ede4bd2d-5005-4ddf-ae5f-724273423583)) + (pin "15" (uuid cdbc3419-c3a2-40f0-967b-570be738d232)) + (pin "16" (uuid 166d9916-3235-4f97-889f-f088bec97d01)) + (pin "2" (uuid c0f5053b-fb17-489e-a526-c2c692f7280d)) + (pin "13" (uuid 789bf898-a06d-438c-81b9-6027ca2d360c)) + (pin "14" (uuid 0012a819-6427-4abf-8bc4-e8e5d38975a3)) + (pin "3" (uuid 852a97b3-139f-45dc-be4d-dd6fb61a5da8)) + (pin "4" (uuid 32b639af-195b-4dfd-a6ab-2b74fcb0477e)) + (pin "11" (uuid bcc71f45-57db-4d5f-985b-760bb24665f8)) + (pin "12" (uuid 047f5ffd-6232-4668-bc51-b5aa440a4403)) + (pin "5" (uuid 5708fe11-6aec-47a2-b276-fc84191a6915)) + (pin "6" (uuid 6999c692-3370-4e1d-b55e-c3271fea53e2)) + (pin "10" (uuid 737fb656-10b9-4560-a100-06e7cd17ab1a)) + (pin "7" (uuid f6c8721f-2fef-4de4-9be3-8a6d3d55253a)) + (pin "8" (uuid eef38387-84cb-4c83-8741-a4c8d0f15ff7)) + (pin "9" (uuid 6dbc0037-b842-4863-ba6a-b38fa836fbbf)) + ) + + (symbol (lib_id "Device:R") (at 95.25 90.17 180) (unit 1) + (in_bom yes) (on_board yes) + (uuid 62438ad9-bdeb-4be2-9254-38dac2f7bf14) + (property "Reference" "R9" (id 0) (at 99.695 88.265 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "200R" (id 1) (at 102.87 90.805 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 97.028 90.17 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 95.25 90.17 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 5892313e-ac45-43c4-afc7-e3281390e16d)) + (pin "2" (uuid fab8a2a4-bd12-48d5-b731-995a74a91f4e)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 109.22 71.12 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 6cff5a5c-63fd-4755-9b6a-e4d2cc4df440) + (property "Reference" "J17" (id 0) (at 107.95 68.58 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Value" "Trigger" (id 1) (at 104.775 67.945 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 109.22 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 109.22 71.12 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid e6a556bc-38f3-4143-8098-033702b40e0a)) + (pin "2" (uuid c7b0ecb5-ac65-497b-a06b-7cd2f0714f7e)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 90.805 100.965 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 7170ed2c-0e15-4189-ae8c-08c797d7caab) + (property "Reference" "J15" (id 0) (at 89.535 98.425 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "IR" (id 1) (at 93.345 103.505 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 90.805 100.965 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 90.805 100.965 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid a42b4b14-ff66-4db3-bdd7-80cc790c2ecd)) + (pin "2" (uuid d218ab06-3f2e-4607-a7b0-8f6f190d2272)) + ) + + (symbol (lib_id "Diode:1N4001") (at 200.66 66.04 270) (unit 1) + (in_bom yes) (on_board yes) + (uuid 7d330779-7275-4e95-832c-46969b23a74d) + (property "Reference" "D2" (id 0) (at 196.85 64.77 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "1N4007" (id 1) (at 198.12 66.04 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal" (id 2) (at 196.215 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "http://www.vishay.com/docs/88503/1n4001.pdf" (id 3) (at 200.66 66.04 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1d3a0991-aa65-4b73-80a1-e631e3d47b6b)) + (pin "2" (uuid 3a3874ab-f94b-4267-9b10-c9c9a66574a8)) + ) + + (symbol (lib_id "Isolator:LTV-247") (at 135.89 91.44 0) (unit 3) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid 7fbcda24-0176-416f-a409-9bb9ca0af6b6) + (property "Reference" "U1" (id 0) (at 135.89 83.9302 0)) + (property "Value" "LTV-247" (id 1) (at 135.89 86.4671 0)) + (property "Footprint" "Package_SO:SOP-16_4.4x10.4mm_P1.27mm" (id 2) (at 130.81 96.52 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://optoelectronics.liteon.com/upload/download/DS70-2009-0014/LTV-2X7%20sereis%20Mar17.PDF" (id 3) (at 135.89 91.44 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid 24046193-b966-49db-a989-93df085066d9)) + (pin "15" (uuid 4eee78ac-8ba1-4c44-93c4-b5696025b180)) + (pin "16" (uuid 92fcb2cb-9753-47a0-aa52-c858bf45caff)) + (pin "2" (uuid 8b8fda9b-d885-4687-b2c9-de99e6124f85)) + (pin "13" (uuid 13ce126a-8c12-49af-a5ab-4749d147e30b)) + (pin "14" (uuid a36d3264-440d-410c-b0ad-8698faaacbe3)) + (pin "3" (uuid 416cf76e-2bde-4021-853a-d49ad67efb30)) + (pin "4" (uuid b33e1db7-b4ff-4b09-abdd-eade3b11f9df)) + (pin "11" (uuid ad18a382-29f4-4058-af27-b42b40eb2236)) + (pin "12" (uuid 110f4f08-74ad-4fae-b506-ed0b81020083)) + (pin "5" (uuid 5a4f16a4-033f-4dbd-b9bf-9679746c8ad2)) + (pin "6" (uuid b9666d18-771a-4b27-ae5d-09032255c9c8)) + (pin "10" (uuid b17289b8-000a-4855-b5c9-536932c5544d)) + (pin "7" (uuid 0bf8934e-6dc7-4717-b8c9-e1e5cedba4ea)) + (pin "8" (uuid 685764c8-2f5d-4f29-bb71-271cad7c3741)) + (pin "9" (uuid 300078b2-9318-4e0e-b696-98d15d92410a)) + ) + + (symbol (lib_id "Device:R") (at 120.65 88.9 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid 9457c2ff-4fad-4b5d-a65b-03239159fd45) + (property "Reference" "R3" (id 0) (at 121.92 85.09 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "100R" (id 1) (at 123.19 90.17 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 120.65 90.678 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 120.65 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 177482eb-81dd-4cd6-b67a-425089056996)) + (pin "2" (uuid b7b18150-7fa6-4eb2-8f9d-ecfad0dc4db0)) + ) + + (symbol (lib_id "power:GND") (at 200.66 93.98 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid 969288f7-ea59-463a-a0fd-4c319c1b71b6) + (property "Reference" "#GND0102" (id 0) (at 200.66 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "GND" (id 1) (at 198.12 96.52 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "" (id 2) (at 200.66 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "" (id 3) (at 200.66 93.98 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid f2d6cf2c-8f72-4841-8cd1-29da29e7cefc)) + ) + + (symbol (lib_id "Device:LED") (at 245.11 113.03 180) (unit 1) + (in_bom no) (on_board no) + (uuid 97a1ff33-09f0-4497-9688-f3c242da3e47) + (property "Reference" "D3" (id 0) (at 245.4274 109.855 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + (property "Value" "IR-LED" (id 1) (at 252.73 113.03 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "" (id 2) (at 245.11 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 245.11 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 2f4924d2-c993-44ee-a0f1-1af4a7b8851f)) + (pin "2" (uuid 44fe8606-49f6-4ee8-8fd1-be07ff7600d4)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 232.41 113.03 0) (mirror y) (unit 1) + (in_bom yes) (on_board yes) + (uuid 9a3dc59e-ca06-4337-b665-2eb7a06b0a73) + (property "Reference" "#J25" (id 0) (at 232.41 118.11 0)) + (property "Value" "Valve 2" (id 1) (at 230.378 115.5446 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 232.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 232.41 113.03 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 1cbdb9ee-c94d-4667-9c2c-896bde93cf0d)) + (pin "2" (uuid e8d2f584-5dfa-4c7a-8d86-8d264e781652)) + ) + + (symbol (lib_id "Connector_Generic:Conn_01x02") (at 151.13 105.41 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid a7a6c287-8b95-4c4f-9024-d870da2fb4ed) + (property "Reference" "J14" (id 0) (at 149.86 102.87 0) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Value" "Flash" (id 1) (at 154.94 109.22 90) + (effects (font (size 1.27 1.27)) (justify left)) + ) + (property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical" (id 2) (at 151.13 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 151.13 105.41 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 621d1ca1-42f0-4eb2-8ee5-1d06ad2c5537)) + (pin "2" (uuid 377ad84e-ed2d-43e6-a0ef-12f6c7f883c3)) + ) + + (symbol (lib_id "Device:LED") (at 245.11 123.19 180) (unit 1) + (in_bom no) (on_board no) + (uuid afd724c5-2a3c-40b6-a848-59b94a49b424) + (property "Reference" "D4" (id 0) (at 245.4274 119.38 90) + (effects (font (size 1.27 1.27)) (justify right) hide) + ) + (property "Value" "LED" (id 1) (at 252.73 123.19 0) + (effects (font (size 1.27 1.27)) (justify right)) + ) + (property "Footprint" "" (id 2) (at 245.11 123.19 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 245.11 123.19 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 230694b3-344f-482d-8964-e1f1c300937f)) + (pin "2" (uuid dcd5605c-3c94-49fc-babf-96704f307040)) + ) + + (symbol (lib_id "Switch:SW_Push") (at 245.745 132.715 0) (unit 1) + (in_bom no) (on_board no) + (uuid cdebc9f9-65b8-4c97-b08a-e791b6669bbb) + (property "Reference" "SW1" (id 0) (at 245.745 125.095 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Value" "Trigger" (id 1) (at 255.905 132.715 0)) + (property "Footprint" "" (id 2) (at 245.745 127.635 0) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 245.745 127.635 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 706e8c02-a003-457a-8457-e26ab01e0c04)) + (pin "2" (uuid 44f3c931-0e50-44b0-9784-684a7472ce68)) + ) + + (symbol (lib_id "Isolator:LTV-247") (at 135.89 77.47 0) (unit 2) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid db5460be-38eb-4169-98d3-87f3cad354a5) + (property "Reference" "U1" (id 0) (at 135.89 69.9602 0)) + (property "Value" "LTV-247" (id 1) (at 135.89 72.4971 0)) + (property "Footprint" "Package_SO:SOP-16_4.4x10.4mm_P1.27mm" (id 2) (at 130.81 82.55 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://optoelectronics.liteon.com/upload/download/DS70-2009-0014/LTV-2X7%20sereis%20Mar17.PDF" (id 3) (at 135.89 77.47 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid ca6ec4c4-5fc3-4a14-bdb0-b43bdc6030a2)) + (pin "15" (uuid 8d6316e8-8ef1-40b4-ae7a-841c061e6246)) + (pin "16" (uuid be70602a-e8b0-4b36-831a-93ba37ec69a9)) + (pin "2" (uuid 8eb30453-eb3a-4717-a039-6cacc6038671)) + (pin "13" (uuid 588d25a4-63ce-441e-8575-4b5681b18c87)) + (pin "14" (uuid a254e623-81ae-4006-804d-508e03b7ad07)) + (pin "3" (uuid 0a906535-5a02-441c-8b1d-b6a37bdc6b16)) + (pin "4" (uuid fffc54a4-e833-4291-a774-5275ecabf0a3)) + (pin "11" (uuid 01d8da54-28f8-43c4-adad-55cbb7541428)) + (pin "12" (uuid 2a8fc66f-df36-44f2-b2a7-e10931377161)) + (pin "5" (uuid 651b0e5f-ad88-43db-96d5-20c5f40a5c89)) + (pin "6" (uuid 2a9fc48c-4e24-4b21-8aa3-c337555f81a8)) + (pin "10" (uuid 6a580fc6-797c-4ccf-b341-8882a1116738)) + (pin "7" (uuid 6f698641-b789-4049-b6bb-b001d13aafac)) + (pin "8" (uuid 9b3f31b6-f4a5-4304-8e53-7486909c68af)) + (pin "9" (uuid 794410d8-8b04-423d-b733-74db5ac05aea)) + ) + + (symbol (lib_id "Device:R") (at 160.02 68.58 0) (unit 1) + (in_bom yes) (on_board yes) + (uuid e613a07e-716e-42c6-9100-c2fb4978f7c0) + (property "Reference" "R7" (id 0) (at 161.29 68.58 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "1K" (id 1) (at 161.29 71.12 0) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 158.242 68.58 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 160.02 68.58 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid 0317acc1-d03c-477d-9991-3d6eb2299dfe)) + (pin "2" (uuid a3bb3785-40c8-4e2a-b4ee-3019b74b5d54)) + ) + + (symbol (lib_id "Device:R") (at 194.31 88.9 90) (unit 1) + (in_bom yes) (on_board yes) + (uuid e771a23f-5482-42b5-bba2-d3ac332e91c4) + (property "Reference" "R8" (id 0) (at 195.58 85.09 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Value" "1K" (id 1) (at 195.58 90.17 90) + (effects (font (size 1.4986 1.4986)) (justify left bottom)) + ) + (property "Footprint" "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal" (id 2) (at 194.31 90.678 90) + (effects (font (size 1.27 1.27)) hide) + ) + (property "Datasheet" "~" (id 3) (at 194.31 88.9 0) + (effects (font (size 1.27 1.27)) hide) + ) + (pin "1" (uuid bfb709e4-f2be-4f25-9ae0-b5ce6906aa52)) + (pin "2" (uuid 774d6258-7814-44d5-b440-792e175168de)) + ) + + (symbol (lib_id "Isolator:LTV-247") (at 135.89 105.41 0) (unit 4) + (in_bom yes) (on_board yes) (fields_autoplaced) + (uuid ff2ed516-99d9-42ae-a5b6-404aad1e7f07) + (property "Reference" "U1" (id 0) (at 135.89 97.9002 0)) + (property "Value" "LTV-247" (id 1) (at 135.89 100.4371 0)) + (property "Footprint" "Package_SO:SOP-16_4.4x10.4mm_P1.27mm" (id 2) (at 130.81 110.49 0) + (effects (font (size 1.27 1.27) italic) (justify left) hide) + ) + (property "Datasheet" "http://optoelectronics.liteon.com/upload/download/DS70-2009-0014/LTV-2X7%20sereis%20Mar17.PDF" (id 3) (at 135.89 105.41 0) + (effects (font (size 1.27 1.27)) (justify left) hide) + ) + (pin "1" (uuid 43e47173-9812-4012-a2b2-5e3c309c8b28)) + (pin "15" (uuid 82c79802-1405-46dc-a7de-5d3ce5176b60)) + (pin "16" (uuid 1922fd10-f94a-411f-a8ba-f5c34c81e6cf)) + (pin "2" (uuid aebf2711-e187-41d1-b0b6-71bcc0de346f)) + (pin "13" (uuid dccba007-1564-45a1-98bc-5422ae32e7ba)) + (pin "14" (uuid 3b46a54b-f19d-4461-830b-fa12cd4dab3c)) + (pin "3" (uuid 9844707e-50a0-432f-9c44-765268547fc6)) + (pin "4" (uuid 9ffa4c48-ded4-41db-9a82-4952c23e6d34)) + (pin "11" (uuid 40e76a97-f813-4634-a912-ad47012c3d5c)) + (pin "12" (uuid 63a24c70-9410-4b6b-b1f0-f19726d907bc)) + (pin "5" (uuid d6b0945f-8600-4b0e-bc0a-dd3e222b47c2)) + (pin "6" (uuid 84d895f4-b8c8-4906-9884-dd803796898d)) + (pin "10" (uuid 1ba5be61-2c19-4210-96d8-25c60d0a7964)) + (pin "7" (uuid f6fd9817-6f26-413e-a96e-c1e6ab79a722)) + (pin "8" (uuid 87dcfb7b-462c-4ed5-b0d1-63091ab5c2e7)) + (pin "9" (uuid 49183969-09fa-435a-be23-753adf53cb3d)) + ) + + (sheet_instances + (path "/" (page "1")) + ) + + (symbol_instances + (path "/00000000-0000-0000-0000-00005f5088e0" + (reference "#GND0101") (unit 1) (value "GND") (footprint "") + ) + (path "/969288f7-ea59-463a-a0fd-4c319c1b71b6" + (reference "#GND0102") (unit 1) (value "GND") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f5089c8" + (reference "#GND0107") (unit 1) (value "GND") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f44b381" + (reference "#J20") (unit 1) (value "Flash") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f468807" + (reference "#J21") (unit 1) (value "Camera") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f429e89" + (reference "#J22") (unit 1) (value "Valve 1") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f443dc0" + (reference "#J23") (unit 1) (value "Flash") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f43680f" + (reference "#J24") (unit 1) (value "Valve 2") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/9a3dc59e-ca06-4337-b665-2eb7a06b0a73" + (reference "#J25") (unit 1) (value "Valve 2") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/1d070cd3-ea6b-4cdd-a3de-323a4c0eca99" + (reference "#J26") (unit 1) (value "Valve 2") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/1e6b835b-d782-4c93-af12-949f57a31d86" + (reference "#J27") (unit 1) (value "Valve 2") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f1766f2" + (reference "#J30") (unit 1) (value "12V") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f15d486" + (reference "#J31") (unit 1) (value "Camera 2.5mm") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f1a757b" + (reference "#J32") (unit 1) (value "Valve 3.5mm") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f16a27d" + (reference "#J33") (unit 1) (value "Flash 2.5mm") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f1d00a9" + (reference "#J34") (unit 1) (value "Valve 3.5mm") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f5088cc" + (reference "#P+0101") (unit 1) (value "+12V") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f5088d6" + (reference "#P+0102") (unit 1) (value "+12V") (footprint "") + ) + (path "/00000000-0000-0000-0000-00005f5089dd" + (reference "D1") (unit 1) (value "1N4007") (footprint "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal") + ) + (path "/7d330779-7275-4e95-832c-46969b23a74d" + (reference "D2") (unit 1) (value "1N4007") (footprint "Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal") + ) + (path "/97a1ff33-09f0-4497-9688-f3c242da3e47" + (reference "D3") (unit 1) (value "IR-LED") (footprint "") + ) + (path "/afd724c5-2a3c-40b6-a848-59b94a49b424" + (reference "D4") (unit 1) (value "LED") (footprint "") + ) + (path "/2bdda44f-4a64-4a91-a3b2-306502ca67ca" + (reference "J1") (unit 1) (value "ESP") (footprint "Connector_PinSocket_2.54mm:PinSocket_1x09_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f508a74" + (reference "J10") (unit 1) (value "12V") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f508a07" + (reference "J11") (unit 1) (value "Camera") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/00000000-0000-0000-0000-00005f508a23" + (reference "J12") (unit 1) (value "Valve 1") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/182fbb93-0096-492c-82ec-a3699b10e48b" + (reference "J13") (unit 1) (value "Valve 2") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/a7a6c287-8b95-4c4f-9024-d870da2fb4ed" + (reference "J14") (unit 1) (value "Flash") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/7170ed2c-0e15-4189-ae8c-08c797d7caab" + (reference "J15") (unit 1) (value "IR") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/56b1ef67-0d6f-4d06-97fd-45bca9c1e150" + (reference "J16") (unit 1) (value "LED") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/6cff5a5c-63fd-4755-9b6a-e4d2cc4df440" + (reference "J17") (unit 1) (value "Trigger") (footprint "Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical") + ) + (path "/39bf7fb9-ac91-4ed7-9f86-a482c712e903" + (reference "Q1") (unit 1) (value "IRLZ34N") (footprint "Package_TO_SOT_THT:TO-220-3_Vertical") + ) + (path "/234efd1c-1460-4e8d-9696-8836ff63bc4e" + (reference "Q2") (unit 1) (value "IRLZ34N") (footprint "Package_TO_SOT_THT:TO-220-3_Vertical") + ) + (path "/2e6d26a8-7d38-4064-bced-cd5ba64a56af" + (reference "Q3") (unit 1) (value "BC517") (footprint "Package_TO_SOT_THT:TO-92_Inline") + ) + (path "/00000000-0000-0000-0000-00005f508930" + (reference "R1") (unit 1) (value "100R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/00000000-0000-0000-0000-00005f5088a4" + (reference "R2") (unit 1) (value "100R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/9457c2ff-4fad-4b5d-a65b-03239159fd45" + (reference "R3") (unit 1) (value "100R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/20ac2947-029a-4bef-9b1f-63bd1873260e" + (reference "R4") (unit 1) (value "100R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/00000000-0000-0000-0000-00005f508963" + (reference "R5") (unit 1) (value "1K") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/00000000-0000-0000-0000-00005f5088c2" + (reference "R6") (unit 1) (value "1K") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/e613a07e-716e-42c6-9100-c2fb4978f7c0" + (reference "R7") (unit 1) (value "1K") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/e771a23f-5482-42b5-bba2-d3ac332e91c4" + (reference "R8") (unit 1) (value "1K") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/62438ad9-bdeb-4be2-9254-38dac2f7bf14" + (reference "R9") (unit 1) (value "200R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/0ca74120-cd87-45be-9db9-b0132d5e8c71" + (reference "R10") (unit 1) (value "1K") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/1432aa29-d149-44e0-9cc3-e01fa3b1eac9" + (reference "R11") (unit 1) (value "22R") (footprint "Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal") + ) + (path "/cdebc9f9-65b8-4c97-b08a-e791b6669bbb" + (reference "SW1") (unit 1) (value "Trigger") (footprint "") + ) + (path "/5d6fa3b0-2257-4bed-bda3-eec3345b1075" + (reference "U1") (unit 1) (value "LTV-247") (footprint "Package_SO:SOP-16_4.4x10.4mm_P1.27mm") + ) + (path "/db5460be-38eb-4169-98d3-87f3cad354a5" + (reference "U1") (unit 2) (value "LTV-247") (footprint "Package_SO:SOP-16_4.4x10.4mm_P1.27mm") + ) + (path "/7fbcda24-0176-416f-a409-9bb9ca0af6b6" + (reference "U1") (unit 3) (value "LTV-247") (footprint "Package_SO:SOP-16_4.4x10.4mm_P1.27mm") + ) + (path "/ff2ed516-99d9-42ae-a5b6-404aad1e7f07" + (reference "U1") (unit 4) (value "LTV-247") (footprint "Package_SO:SOP-16_4.4x10.4mm_P1.27mm") + ) + ) +) diff --git a/electronics/electronics.pro b/electronics/electronics.pro new file mode 100644 index 0000000..308aff2 --- /dev/null +++ b/electronics/electronics.pro @@ -0,0 +1,249 @@ +update=Mo 13 Jul 2020 19:09:55 CEST +version=1 +last_client=kicad +[general] +version=1 +RootSch= +BoardNm= +[cvpcb] +version=1 +NetIExt=net +[eeschema] +version=1 +LibDir= +[eeschema/libraries] +[schematic_editor] +version=1 +PageLayoutDescrFile=empty.kicad_wks +PlotDirectoryName= +SubpartIdSeparator=0 +SubpartFirstId=65 +NetFmtName= +SpiceAjustPassiveValues=0 +LabSize=50 +ERC_TestSimilarLabels=1 +[pcbnew] +version=1 +PageLayoutDescrFile= +LastNetListRead= +CopperLayerCount=2 +BoardThickness=1.6 +AllowMicroVias=0 +AllowBlindVias=0 +RequireCourtyardDefinitions=0 +ProhibitOverlappingCourtyards=1 +MinTrackWidth=0.2 +MinViaDiameter=0.4 +MinViaDrill=0.3 +MinMicroViaDiameter=0.2 +MinMicroViaDrill=0.09999999999999999 +MinHoleToHole=0.25 +TrackWidth1=0.25 +TrackWidth2=1 +ViaDiameter1=0.8 +ViaDrill1=0.4 +dPairWidth1=0.2 +dPairGap1=0.25 +dPairViaGap1=0.25 +SilkLineWidth=0.12 +SilkTextSizeV=1 +SilkTextSizeH=1 +SilkTextSizeThickness=0.15 +SilkTextItalic=0 +SilkTextUpright=1 +CopperLineWidth=0.2 +CopperTextSizeV=1.5 +CopperTextSizeH=1.5 +CopperTextThickness=0.3 +CopperTextItalic=0 +CopperTextUpright=1 +EdgeCutLineWidth=0.05 +CourtyardLineWidth=0.05 +OthersLineWidth=0.15 +OthersTextSizeV=1 +OthersTextSizeH=1 +OthersTextSizeThickness=0.15 +OthersTextItalic=0 +OthersTextUpright=1 +SolderMaskClearance=0.051 +SolderMaskMinWidth=0.25 +SolderPasteClearance=0 +SolderPasteRatio=-0 +[pcbnew/Layer.F.Cu] +Name=F.Cu +Type=0 +Enabled=1 +[pcbnew/Layer.In1.Cu] +Name=In1.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In2.Cu] +Name=In2.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In3.Cu] +Name=In3.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In4.Cu] +Name=In4.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In5.Cu] +Name=In5.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In6.Cu] +Name=In6.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In7.Cu] +Name=In7.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In8.Cu] +Name=In8.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In9.Cu] +Name=In9.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In10.Cu] +Name=In10.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In11.Cu] +Name=In11.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In12.Cu] +Name=In12.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In13.Cu] +Name=In13.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In14.Cu] +Name=In14.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In15.Cu] +Name=In15.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In16.Cu] +Name=In16.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In17.Cu] +Name=In17.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In18.Cu] +Name=In18.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In19.Cu] +Name=In19.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In20.Cu] +Name=In20.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In21.Cu] +Name=In21.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In22.Cu] +Name=In22.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In23.Cu] +Name=In23.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In24.Cu] +Name=In24.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In25.Cu] +Name=In25.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In26.Cu] +Name=In26.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In27.Cu] +Name=In27.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In28.Cu] +Name=In28.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In29.Cu] +Name=In29.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.In30.Cu] +Name=In30.Cu +Type=0 +Enabled=0 +[pcbnew/Layer.B.Cu] +Name=B.Cu +Type=0 +Enabled=1 +[pcbnew/Layer.B.Adhes] +Enabled=1 +[pcbnew/Layer.F.Adhes] +Enabled=1 +[pcbnew/Layer.B.Paste] +Enabled=1 +[pcbnew/Layer.F.Paste] +Enabled=1 +[pcbnew/Layer.B.SilkS] +Enabled=1 +[pcbnew/Layer.F.SilkS] +Enabled=1 +[pcbnew/Layer.B.Mask] +Enabled=1 +[pcbnew/Layer.F.Mask] +Enabled=1 +[pcbnew/Layer.Dwgs.User] +Enabled=1 +[pcbnew/Layer.Cmts.User] +Enabled=1 +[pcbnew/Layer.Eco1.User] +Enabled=1 +[pcbnew/Layer.Eco2.User] +Enabled=1 +[pcbnew/Layer.Edge.Cuts] +Enabled=1 +[pcbnew/Layer.Margin] +Enabled=1 +[pcbnew/Layer.B.CrtYd] +Enabled=1 +[pcbnew/Layer.F.CrtYd] +Enabled=1 +[pcbnew/Layer.B.Fab] +Enabled=1 +[pcbnew/Layer.F.Fab] +Enabled=1 +[pcbnew/Layer.Rescue] +Enabled=0 +[pcbnew/Netclasses] +[pcbnew/Netclasses/Default] +Name=Default +Clearance=0.2 +TrackWidth=0.25 +ViaDiameter=0.8 +ViaDrill=0.4 +uViaDiameter=0.3 +uViaDrill=0.1 +dPairWidth=0.2 +dPairGap=0.25 +dPairViaGap=0.25 diff --git a/electronics/schematic.pdf b/electronics/schematic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a3e12085e10eae1f220259ac6c8e136a2f2c622 GIT binary patch literal 46693 zcmW(+Wk6KV*H#gvq(MNsyE~;(x;vMUMqxo(Vv$%7q#Ks*25G6KOISMoO7GGs{oddE zVQ25$n3+5G^mz`mwxTjOKaVIjbMs-%9kvi1ADxG-Gq#iz9k05*yQB9-#tr*Rc2n0_jd0tKB2ihb)9*OiS1|!q zP8yU1`Esool$eyND)OW+Azyi3U)(MePR3>&ca8sZEb;UtYD>>Mv=+<3{q2_(+|~Vf zy`f?Cw79-PdtUE$yuTn@8*<+oa-U}PbVz%Ce@Q#JAM`Y2^>i9?f14Nlu<`Uy>uKcz zwegr2qTX}#^f1)(aI5u%s(gB^eY#mdefJCMYI#_Ax=Xp*2zhvVx*vMF?+GmK4t_X( zO1JEJ{00oWa3Ll9cyn3h_XzT%Y0?boEIl6?xd`6Czh4NsxwLvby#-~(2T9XB`t`M| zA8(_cZ#>S4@P>5ueD0#Dl})|ALEReYwFKRQGE1$V7HXePQCh(yh6lG`o?6+GwS6Ll zoiLi|m2{SJYuDrA!u~?wI@z7>;FR0Oli2rGLIdRF=G9QJgb6H@i>5}2JzTfpaOy2D zinex>U+LZl9X@BpU3=zTJ!&!s+n0W-?+ZxT_)Vr(kX6Q_itv|G_JEz4IbZGn17&rT z+^1%O0%Q$cV3~9Vvz?Eph^l+joxdux7Jod>Cq^GiYANe`9Fmp#?jJXsjZF&VueMGf zhU#P0iAXa#^Ex_Z)F_`HUm)(eX)SEm7j|Vsr0qLsU-ayr7f!Ko*bNy~R&ghmnYBFB z*CeG7k~VZWea>J)rXKp{L>oP@y})3G6_GnLIDU!H_BI=iao^+bI5nZW6)dt1ayzI& zp@h(14#b5tPuA{FZrz?9QnV`#>8UD5Xh$7kC}ctl2-XHKQcl)oZ#7|km}3{-FCqxB zbxv+XT41!#8iXqG-C(zsQj`rZCFZYb z$JWB$7=7%q$7sC_eEfKhaFfoRn)7}-FT_m$@;k?hd1>R%t3&a-n3ca!uv^6>J6wLClvFfqD-0fZuq>%)`= z3Av(Sl49s-@enIEw&_?pQnUD6l|ZacXxLA73*G8k^3T5Y=<<&;GZDmb>K+MGj9p#; zIxb{y-zWGW<~gDC?Oqyto)*b)@*9DdCW6YW9CpReNtv_D+@%jSqhlCa@`xklFD@w5 z$)XvSzP<^QOC73*o)W%Dbaf{}H%X2&gQ>Et#gw@RBAkiQ2CIZIL)9`42q9p#x8ZDM zT)!{u2UcFKaLZxPAk$k>{xKw}pF9?tU$S#5Z1A{X=^DQ3u~^V6s>6$F4T`nYq?Ss3 zDcFE+qLFS-#b6Vp8d$nY!4LWyb18S4^Esf6g2D)Q!}F8Ee85*9oHtZ-Sw`c=v<&!| zgs5;kPP;1nq*oD9&7W-j9Hq(7`nb>Gw*&0Cd1;5+Aog^ za`?p=f(ELrSagEecI_0KZ3>ORW%xSBFA1?mjD_J9uj_rZ@kb@YOt5=eO|Wrst-)rg z5c+0G0)+CUCPe$K_zD*hVrWv?=+&4nyAtcq(lYb;Kj#mA;tMi?-D6u`tzQd7zRtrW zJ|I(yaCy`RKj_njlMhXhOKBMpN8av@R(?f-#2G;q->JHA%VadcEbonJNn>xJm{_Z2 z)coTx?=5J-duReb*9!wQA_zK;r7uRpVGT2cSM#O znw!Io30D=PgK>@S@PfGXc|^QKtC!}>Qz?|1$(v)?ym?sBuydBuBls(1Xl0-HH)N=5 zF%y%ck!NPHsZJdD6|*bMa%1yue(SX(&V8&VxGWpT%av`CET^c(zm-iT3zbbWE1==) z0(txaDXq31rb~}NvbAH$T49NXl;{Nm3r6UK9p6$cee|Sb zIo6eN$@|Ai3BhBzv3=pYU02D#lXv$oTZWb4oM2+o=yqatm1FDYmXMgl|VX z+c%XNi}U}_ZyvSSF*xT3`w&_&ZTG4@RO9un;i>aYd(5?Z>pO*pD2JlwQ<8xXvB8JR zb7Vv8nEr}dt0r4z#8aHIp__Waq(lfVFe@f6{T|`k>5iVy9l3nsUY5Yir7VnYtdtj^ zbfo~r&=IT8wwdLYoxDq11p4NxoQ8ez7J~=`q*}rH>323#-Hy)m@&ueM@D<~`EN=j z)L-vG+Q&@Q2*eWfQ<`(D8%+$~BPSgQFDD%=%*rLRl;$O~!06RSuJimphi>cPNq6iG zJtmU3T|*|{DB7no%FM`=9NTkzOOAMhpY9Q^na5Ue0Osg4c#iHHu3kgAtF@{cp`j6YNw=4~d zi8OmcLGw`I&3#Qy1-gdb5BaJNwiWL})qTu~AuRkW1mp^vW8IeUx}WxrLZCfs!zl9h zh7k_X=|mlDD8GyIH<4YfkPd;2w*NkmWI-Y!R79Ox73he9|b4e1h0pIzTvYTU}XcjyslunU#^l zZtCaC&S{56uDO}n3rL%g1e`C=Fv=M7m>|?k3#M9vd?BAcqM)ow6zL#7cS~B5Ptb%- zf8j7IL#3s#PR-169+#J0{AsWHU?~&FDFparhe_<7aE8Ju*K%S33=cN&9cN^zg>UJ< zii9#VL&G>RYEbKmuGX97XJIwL zLZXZz{3NvGf&y)9@zsmLDLu{G{=3(9jX8658r%Y;0k>*>Dr*Zyc9PDm|89iGUU3({ ziiCM0-4KFG24V{}h;t$8ZC)4M+kWS;+^91B0DTLCmi?t45xwVCcx4IF#XI1r-g9;O z`;%bCrPV^YFbZrY&H92`tQ&PS z_L5+KQ^tD+I8A{sDqcUdT#CB4YTu+YB9xtM$;}R1!(%m;pUZV~5?T;oLT|e_9WGqp z2v#Sj|Li%IS%+kIg~^lI7mi8W_{xk)ST4K(cCoba01~y<_q+Dmggdny6=2ztiWVj= zq=5!XSC|#z18!IXIyy{A+-N%K8sZugB$>=UhQ^IA4RPMZK6`E@B6#d_%d+s&!lU{(I-zXon}#k`@tA9k7uz4&z}KP(P8GLPWpR2H424B zV|rU-0tX#TkoJk;E0UiXBfFCGjMpVTv0#jv=tm@*$HDw1FNF#S7g8e6=kwrfGTnY= zfg$U{zT8L*m%og`>R2}V{J-d^Kg3{*AIEHslx}YvnoGzl1$+>cPT&A!Oqws4Iy%CF zd#uJcwT{5O@$j_(X~VLTHYtY<+uTNUgq-rFZxXu@^iiD^H@5E!J4pKizHoIxuReLL za~iydp1Sp9$9c9?U*5fLy1*1Z5@Wh-ZoU* zY_aQaq($zjLgq*-z(mN+qA4ns7Du(2pdXRKdE!?E1)us(qLqh@F&9EZoq@v=w(g!y zW5X$S(Zb!z*FW{?Sq_5#2H1W4r9Ye+`pLRayUaxi*!Sx12Y&@20&62$z_WM*=#|;+f&optCQ@3s|f4ZL%%za5~lKE5WbRl~H+}-Bz+go}NJ=K0q-bOphQ9Kncw1I{5$B@!{Ch)(N z2D0J`Iy>`$K2kE;0Rst%Ky6Ne2ma?SQF<&EUgax*>?7YS0lqm0?X0*BhaLFyz#c&d z1e~1zZ3P%-=i7>UsCqk_T>5(pMxv|q!FkztzwX-`1i{TKxK&3h!=)1OBaAvmR*Ac~ zeT#^BM~d@fs{ZO8u-XKPgRZX)5r#5FrPo?>%lsgp#6bRZTznbQTr(-K2cBCbM;`tG zgiSX;BxjRnPww0qTW|ISiff#XZ4yU4w#$z(CAfZn_@LadWXRqua%EW}%;!B$UiD(O z+7&MUb7fv!hd#EVzN|4J9a%ZqO(U zem9k$RZw@uY;Q;r5V6j~D=<2i`E-f1eC~^5UnvvNr~T2i%QvQeXtSBPXFAlXyQZ@Y z)~VbsOVQsatkK)2G1V3CmhUvN$W4{OqDeBcwHfsy<5P);hiK}EbX>|&vcxkH`2qJo z{Dzg^J(_RHot5HOW2mZybscG04#;xRED97u)s3D<@Fl^^DehwXLeVuTV#BV(&lDl9 zWy?n!6^Al(488Mk-int|@)e@67$2xzSIT;1IX5hDY!E)lbR&8_T!Hn`LjCwh9P_9^*9?-n5Xk zz2XC%4(#5GGO90fAFN<0tz^{`z|G9)ZMjG!`voKAn|-8oxQNvdf{`VOv6F(4kb+oQ z8{>QBpY}cCks>Mf2ZVT0s&%*r+#mFZbEh-c>y!9NGUcst1uAmT3!L$)jj?DKz0v`t zGNv^ag>ACN!lcnlj=im!11&fO+RepS#@6gqZeRHOsCIiWPIlASO+^4{VQ)9Fa<;4u zz4@WYvLfW*Cf%Rf_C%_Ub8qPSF3xpcK5+VA2a`&qNF?ej9F^gJ|tZ(llAOf#PcYo6+0!r-12;>OZdyjkj7&}`uUb&A% zU7?~j#+bMH3lSDUX{jqJJ|z!%zN24#9S>p-E&MA_af8<$ycc%Q`6K0*Do2ec@@2$d z5C}nt2_xYPugsaaVgjyNo%zsZ%Fo*ZCDRIuhi%PnKT%%#eX@-TpwapFvo{dtSx5Z-lK|Q&O@7djCbcFj+_$g`y45YIpl-n-2i@!4>^hu+*k4P zLz`og_7q~Vbbu^9wCdxlY{$i?31~L*;gHC;q1eY@LEa+9^v0rWGlWJYU-S9LJo*Fn zgU&|fDgwf7Z*1J}b^eP6swg);wqMfZg3>I1i)BZZ z$RFjm&z=IUKRH*lgK4w$_W?Er6vq))0~7(Zu^CpfqX_R4m4HnzsVgtEU^bBrPXBp9 z5iXYQ)havz2F3U>*s=*7UCl~98X5+$&$qT1D&gj_r5)QrAqw07W{IDgw3W+tniOxv zfbSm}FIf9ykGO3=(to8TZOF@iJ99^IJLI2__#oix^-N6$nH#mH&+)F8c(;gc= ze$3t-4!hhOH}eRH;dfs54=7b!v4@Tt+X8Lcuc2hHkVLx=I`hWeNiU6s~8AXTUo+YmWfwO@ z^^^XUwR*rMy?zNt5;tM(X{blqYB83sTmSGcfXZY(x%w* z+`T8qeOl#~<0TqQ4CYBv>?KDSN0d2!-2Bi=rSNQlW^kGIT32zc!EZPQ5Y_L>`ANge zKE5xKOAjkOJk#WgI9a=}s8NJ4=glL;Li%c~s@0+KWtDLy<|5JUfTy<7vG_DKet zP&to3?Bw!blc0as3IE~GAx47JsIrwRV6+*S z)2objXVL1wTu6li-EZMs_5>#n8>Dk#M#mJa?=zNy8M1PfD6+UzQU|NUnXf<439Efs zd%p53b}7xi+JAzy0o5|Klz~blYG39DBeK3}P_yn;yvgs-qS0$TKylGDS?r5-sACCWwQD zX2mZ7`^5`JHKz?@k*v+jfPN3P+&5RgDk5iH`Mu!2QRy-|1O$^lPFCU7n;C!Om&j6t za0QyT;wk=_RoD1e!kIOv&I6c~Ew7Cs|J|VbpMl{L_|87LjCbkubIHL=8KtaKwju88 zk^&lyO~}5B=lI|!XhJ=~eD^o0xQKd!Te@d*|AgGsU?+!m<@{jj-E%Iqqm(+fNWvcV z#Y-wCk{p8^9l+!au9%P~kHs))eiOZ zFnOWh^DGC*-Fb2wX@|nBZFA+wcj^V|-86bevWf%tN%bi4BL^n2%sPU3AAQFrymVCJ z8^NF&CCyo*F6n8^QmQ9uwJ#e&j#wSH6!PuTAZ+^vBlsKwpGJU`&xU^0VWqsa91O6;*kJH(XC>_M&>&mbzY*=K*EtM7ZCN6yf-_U>tp zrD}>}H|I-{WUlm5Z`kzgig_rMYf-mC(2tW(9$(tK~ zyh*(QUT)rQm6ylKLu#^Cc`=yli?A9w4gF!;hlI{4AyD0*)rMF$f2Z3JCI!wPiG*27 ziP|{V0LQf|N8CwLPkH$NNH4GHKy{bquc8I#-5Rs~j|Bja#iCk%ggiStf29supkeSf zmF+}it;7x&nMk~Y^``2Fe~5_hE^<=ez~k+6No$Q}X6zPZ`{*xn*CF3#k0--Bk2;25GMX;O4Rf(GdD zKHFgDl`2O@hqcbmEAG`7bGJsDZW&T3H`%dfq*7u`L%Isp<~Np!FcVdCPJWSOTEy30 zIc$C^o6NRzujXeAQzUKZFDhRUfyd$#|2YE2Wc>Q@TDCnlY;FGDRY%ZB zSax{nYAoj{##Pbw&%#;*`GjtX=WV!YOdD>c?L(-r5>Ff`#{TmrD~MidA#@0gnJ4lw zHE&(hp|MH|Eucp0PY{{Z(~Wa@L;Ln=;a9*~@Re}Zd1^O>)KHKz4AdAJRVUO}A`G0M z@#f7xOalne1-zz+b<(B1Y=}W03G{5p`x*G;;qu0nW#b%xjr)@^m;Fb%k{_lHKW^2t zh~J!oGNWn|L}6}MN2-8HLS`Xb%5Xxp87JF0ak}#KIj`&oic%T1Eq6%786+@Qd7GW|e4&oN~~d zbjVn^hwzXqs!vdy35nz+>~f)l%Qvg1vhloVJ3Gyh4FmV*pZ$n857H_;CxUB#Jc`bA z>DeTE-6Xb3>0X?5tO#A}ORMJj8ev`3&V&oup{X#c;W@lnrXY?~<`;F~H=OWL6vX+k zpTPyl$hd+@7R5yM>MZ#voOd<9IY8}gHNt`Z=<}>RTH6aoD|tAf$v(bC8^J<0l_Tdr?_s4v|LR0j0TVY)UztI0_Zw zS;xT6!nt+TKsi2d?zTszdRf9xf|}}hNDul_VXtTEkS5^XvMa6~*zLF?bfnb{DR6AuNRyp_H@P*^BTy_*e@-`lfa`vg51`pQie+ zt$X&LoKKx;SjHaHABOz{U((0eBL#o(4VQpF;Egw53pan|=fVV>wAl46q4-f`uur$? zzduPB36&NpNRCNKCAN6qEDd7HbkEIfyq+oJD^1Fa>|lYD>@3H*O0l#8vLc)6B26o~ zDejO3fI-O`Z4Wzw+>5VS@37SWoR1Gi0YMOJ!z}i|T=vMkbq}_}?X8El^>wkcC9xhQ zD$R`y@p48l8hZ(p;6_xXm7PKv4nmj1TRfzm7xYvX*H57&1kfxxMq;R-dsJd@LFsT!R7tlFo4*E(kKNYm1m?&BIM}FsdWy1-)c_h zNDgxku2OYuR>?2<{l(5Mt2~bU)XshV7Zne<`qXlvpOQUJOMPGSj6`OzCp)2Pox-l9 zNyY+pjcJ&MM<>Y1zB*~PtYTFtiF^BUjVSMYTzA_yG&_HE)~@_$gY{Uh!it>KLkzKyLg$(FL1j;s0xqlosS`?wS$(PK12jnj-Lph zF(H=7>;wkGNvOLI5HIDx(_x#nR3aJGcgbbri)62e>sYeU@tvT%8PHB(1l6ewZ1eFl zBH0@}W<(UcZPaFjg@7I2%X8$4=nly(`_dm;o&haz!f;!T?JAApQIIYGoA!&Mo>!mV z6;@=62={z=Dl%^s>anv*E;lp0MkA*N(L+nlnH%5FA+BF^UNmUK+Fkv}3<>~+!Q%{g z(h9B08i%)#+Y040KDMy;R_}k*RbKu)A|cIxzld-?&Vj|_u^}0YRO`q&ku)|?x*R!ao7vHJc4a$vXGHq$D5AOD02niB8 zqm6SLDMlOm!0wu5$@G|3|86E_<^Lis=0p&YWP{>EkB<}P78LnehzN^12oMG7u%3-_ z{hrZ&yN)?aLyWMW)QJjHZ`ZZP9k<2KVPnH!WJDr6OwC0oI+m|U9La#pQ;(RU96faH zdNwAo8uhvT z^D~`?!)#ZVhnvi?*8%^~+U+$PdUp|l?r13~bitWiXqP^WOD|h%*w4bpNyhBltgEsH zW!&#hoj})-5C42PvdpLjTSn_r{v6E}vRZNXp(^j19)IEovhR9p)cyv1OWoSmbzQ)) z%;T+j!+=r9%&2aBEFZ9zoA;&~F_Z)%z>*UxL++(3)~j14jgdQeQnshJTJx2puWI~y z_s0|b10)E`|J4j-_vA|&i?HZv&vS0n$CWz2j#$f0U}yw_qj~s|Zy0=)8^D5oELDgt_+8N{LL>P<#=aE>bKcWjqrb538=*z&BGK3; zoyRZ_dWQq&q2^U~0ilsa;+*J_d8e7TYk=1Hl0eE3`G-0SaTZjr@F&yPi0GY?%))F1 zK?Q&1`|s<9qvk>E52S#Nv~uv)8TRg~4K;%`ob8fJ!Rhd&Yi+_-&Reeop3TN)Tnef( z5=iPtDb2lK1Z9H-9? zK`$*H@?Sp*4b%irM*_ijMx7)rSdCa-zrN(Vm|w}>f3wUg0|~*+pm*66S96Pqx6Ro{ z!*LdEH)C5w1(j#b3hWPq^8Yb_$mEf+Qg{pq}2Da z%Dh`^`*I>gZ%z4YsKo=1n9xZ zZroY)EOt21bc}=Bd8ml-UUhp9%{jzvEs;PWeC=GzKmb#I%~AZU?ABP>KVBVD<=@_} z4+Y%wL2C&@EQLS2nlI@RfNU<89%|)N==wgn<)s#sQ}~S< zcoCceta6_ho_dpta#v6@LUg#NW#@LcXLIEv6(9Pbo87iG8e3E0gxYZU>-M@FNIm|S zg+vyU_(pI_QG9)+)uUrJN?p2QQ^Tu|7JMuPHb2JIU%xC_exPwtS>ISr^vzN<#8W0A z9}r*62y*PaR}l6>>Z!NGMIS&wY3C>dT4L+kRUp`tDPd)7r;>fLE`vd=9HO# z>w4H*#CoAewPGw~9DbHZVKYVU}AE(3%o zGLs_Y3_few9XP-F+HRDsJ5aiwjC7UQp496Kn}aeCVQ6_j!i_@|9-h-mnbhK6OWrI8xcY6~t(*;iR%#g89SFa_ zUgVg(ZZ*i>mZG$ORDR};oxwJo`-vUa&Yt~Bi~ZRJjp_9e2}yHewclh>2`=h3Q5X$D zSx`x9yt(Q;;i8LL;?w-O{p(kNT`?KJ$0nT#d<2vr8o&8gOZr30T6h#n=}@@$!j{OV znX@U!BiE^8$>t9 zlUkpvvpqz6+qo%|uY%*M_S?+fX9w(>8et{A?P8Bh3G3RGf7?}@ntPG6 zQgc-R`@>@-wa%JfUUy2jVr;uxojbq1Ogi3J{6rvdWOXnrAz+mVL`5PyO^OY^I=$WN z2lCBMb}kj7vl6;$88Ks7DyEQ#`e}3ZiGrC_^oJ1}>iu7vT$lw*LMAw4$^?-)LFsgcQ#)}zgQaj_>v$&{QNNe{I>Bb zx81-2naZt@cN77s^SOc&)SE39VsI1!nwXMhi0LTVU{dwP^PlVvFuDMEIS|41{wpkM zfv72Y&43-VGJGYpGN&5}M*O>b7bT!W|8{?t^?(fTuw)F#IV@48v8BGRmGUz3pfRCn z&AmO>8g4x66Ln#I}ix)E1l6;{~Z*t=_Te8?-Z zC9X*VQ=nTG|KJo03i@>Si^{LvnX#7(A@?i1w+~iN=e4ENljr?y>YvE|cy|Xwd^PKv z{wMqR-RkL<7cJ!eTh!8>$7Admr%2yK{ZG{KP2qX{Q&)(mp9)W@bi8RMsBMBu?`z2I zRE=78lu-4I62}r$>S=p?a`(p9zUg5^IG*UPyFX#Mfap>S46lJxZ^7S@ELkY$Ko&Uaaft{L&CvyQ3L=8UxF$Lf9Ft@_8d zeQJ+K(Z`XSe9=eFkOnd>am%e^_FRyEd_cK|>Zby~I~O-q?hB{ew~eMxdo7O-M{QLr z8+o(#%TFQ0`=`Fa={v0PqFqldT8`pVox%I@vO5cB2x|WW?I+|!@TGeR$m;uEMBo8A zb?xwUQ<|R4_k{-#p~5^JrR61E^ls&c`T?crWB<$mwS=K-BWHh&8R}y!f&MrSqkxN- zwHcN(n+I5pQR6<&aU)^5fL&isU5NuR8|6x~@~xsVp4Jmts&`w|xjmNNu5Q5;cFh=F zEGZqnQPr^gIs zCcZu01iG~D$ZaUM2^d0Bba8KUPe~munnxZ=D_NE;*ZX@JY9$&~8Mp>_As3s9xsayy z@owdZIaWieo01F0s%i<(CpEcO|4ptd?fSz%t0lZL^mX2W`{phr!hPMZb1##{PawQ@Z1A?ZZCl;1+-TG@ic-__Umn@+#m{8GfSW!yPAQh7Z&awGm`z3 ze`@hz>up3O-oA+I`#2BkBGW%WzQaD~yHNL-NGaTRX&zX`($(BQo~+gS#kz+S;9{N% z&}`^#b{w2V*2H%Kvs2B!0~#FB?y&;*-zXBN$pxUFEeQ16@PL8ZfPuufkESBKtjbTT zLlIhy)GD||%O_uCZHF&XmFj5up~wb740UB6I32bfzxn3|a`{j$3^nDe_~-g*U7)fp zyQvc_{i$~&(Yd{P-vv4y3V-%fSmC{laZK1!ocdKBTSCr2fgtH;Nf>-KGGaUZvVok2 zVu?zjgeME+xn;+1{bDJ!=4R&HYOl6+b80V>)}Hg0GXetLPyw5)H+!t;U6|VqPKs!( z=-P>Pf|{S!_3VavK;VICT|Du*J>!n7w&LMljiJ%}GS;$s{lY7Omnf_}R;RbRk^a(h zJfY=thOA3wVN?k|t}YXH8i@-3i$~OZshM1M?YwrmHg6>nA3rvZ!@nS*F#fox%Sa@x z6e%EK2%?i#nnD@5y5nG(#^5e^SHb=KV{i$;Rm!QRqeTq5ITdfDTVIksAxWGpIVR`J ziE>d`92E=Yl&=ri{omX7?)b*ZUXf7zJTQ*?0{n9v8pqYQB1GIna2+*)aOX<5L8UEf3D zzWyG-L+fL}&0VE)|1?WGnHxa?&Vi*~)J{O78F%cB+zum^1eis0NaQ!r057wj4lqZ+ zW5(MJCt2Xg2_Q?!!*kWm04;H^O-Z*iqRaTh)qm?aRDnPbAjsJ(zXe65`EcO=H4NZ> zi=U@C^G*Q2rUE=&x=jwuWUmo-+%yinL{ld)*u>e@X#63tupNM_AI?&M$&)MtR_Xxu zo^6T~0-7TDwWWjL^gqp7LExMVEilAFCa^MLeBdf-Fz(pQ!hAVgD+rs-*;0eB@aB&D zotVmmSKm#!Us-^2Zi=)pzCCYcMsDV-%>8md!>c)|WTgqOcB45df^OK3iOrl8iSk5a zUzs1l))$ot02D?oj1M{WFeDeok6_mP8^Qb~47m7T7eahf6%`0$R2d)%x+?T!R)J3w zVq0DNSDa_39jXB#jgmVUQLX~dEB}QEe2Smn+5hhUOSQ!-;at3s(b0b#XVuwPn*0=_ zb;n$4uu@6gT)Ck;5G^Mw>m)4t#g#3F|A)V75Xw#YZTf=EjLDE}&mGA*hZh%3@Pek= zdvdOP-3o+jc=2*jS;%X~?OzHbE z^tRb2KD3wxFXS+~k7Q7KMCjGf<$c4oTczK4jnkoSHy@!TP|~jcMjlq<*uWS@Z0eiu zB0S^B>lEfQ;7q)~Q@M3wS^dVRsy!119{b!Nm%1?2ElBXdAM+hdxj|b$JoCFNe`~4d zydu_dl(qtk*86(2*l|No((z|;mB78%l${hyXBuA$?IaSX<;7*1pr2oTJJs23iq++8 z)}Tq!8lA9Qk5SNre=CL%s_oZK64(G%E4%1{?i(^&)b_voR z+=bK&|86qsTfqIS5N+IPw6QBlU?uSrMf8Tf^lI^EqhIsDW2Jf zj5`7?G(xErF};Q4mk-&rx9^3OLX4ex?Jb5nxGrZOzvw+qhY(F1uhNo}oXxKD3i6dv z|LmKZU*ObTXb6dBU~wdCeVQIr4;s>ve+2Nw9p+(%Jt-Co-F^~<`)F6Jcdy@GimY9C zias+abFt?vohSU*W%BUed2p@WcJJBd!&{`Ln3hvlJeV`uaWTrSM z!Qjwd78>Flb40X(_{UncrP{rj7+SCh1|qRlT0 ziK@rkCE_4^m-%g9%U>B7ou@ud4}DpS%v+L76+c_6ZfK_2(6^WPrDN}SIBl?0Zqzqd zn)AK|=@gN$MtI-;SgYUv-Y_(BLNdl-DSN9YPD`+4t0x49apN{r_+_BhN7BkBlBJ0W zW3#%C-oj?aFOqnhy6wwIGTlQ=k4y!1y-IuHER0I0&aDJ$FT*ukd=0L{Z;Fj*)Gj1Z zupYy82U2Sb#icZ`(OQX-015KrTeh*ImCV0qOAz+molqB!Uzyf+UOAyIyizFp6oZ8; zzto}qqtACJ>8z1onv1kzsWSoWBVPZ0U7xme6O>{1d=H;c?tL7PA`sc!t+%-rUP zO4Y-Cy(+sJo-6Jp>*EsAb8Xj}NaKqqX5Qnk3C0X7d>dq3ahH17l`3N%*lguIF!UnE zXq7yV=mH@aaCn^Ov$uicd_>V7a5@57$)$UfVt3##@+DY$3K`XoB%#C1=X$n%rl%wX}rTQtc9Ix<;q+XQ| zG>yHV;tN1M%;5meyyAY&0T=Q)TnV1fHYej6nLoYV{YSAN*2zM=_Gen46K7Kg0SOGV zN1Rlp9r3>OCq3)<@VKy3Or^TZH=LpCh5{^3vWVRht1;r!@I?$YRG2@n*n zzww*Ysq_&R01wvPP>&6IC_MNO%9gM%pn|Cg?+0*NrypU{OeGlnkxKcTTsp>Ej2qQA z!mXB`PSEww0akGT&0TNB%gFhWsIbTfZhYTiavWJ+Z%zFt@3oMNN%L#7gX3<=z zkY8(^(PLR7w8ljy%n+i3hliv3D)=g;-%@}IC?ko`*JQhLm;r1(I2A~;#OnhdD5C}P z8ruTN>~j*eeH|TUo2F91guSMYLTZ=22|OGm|Ms3dP=EdND|NVk&mih6GKX`MPyNr` z$b<_pq^D4ccF6-X03)RR77=RGRLGA$XiXK#w%74RMWO0C1wem<(RcH!;oNtc*5=0- zZ7JVFdxt0XqQZ1wiG+|sU9h3udaSM?FSb*edS zh})p^(fXCU?19ko(3s2k(pjJ&p-oen#Jk+l&(sudEXF51-Kx`i`ZXrkH{vCl9@^o+ z$fMmXD+mffL#vCCBOLB0BSJ^7i66DbTvMy~;08J4QFy+|0ss`ROEcs%(%!xMpAXqm z0H`YHp*p@y2C2K`qIf)O%*h9r|I@2p;9A!BDjt))yU~b^@7tAC$*+IQ#DsmYc@EgG zg8zzFGAQj+IGWX+$ZaRnhspJw3K_8}2^bl%-*Wj$sl$!;R5~Di7$!W@Bjh*_A6vB( zGz4e!_{i{}KAiJ7wuxC2#E94+ejQTSuL)?4VJDhtS4W>@$a~{sx!0J4{id8f&q+gL zSgE0O1Wwns6=Ui)f=UA7+RPQctU2GAaG}Q^vg+3-{i(IP418~xu)FCed7$;4bar3S zb$V19z}7ML3RWYcfy{ZgcB@dff2;d-GJ3|lRe1cKLRQoSh0aWe@+2cNX?+*2ZzNsH z?hRlg&Jp^o96LUQR$7U#%Gcyh1DFis1>5u9l&b8X#{oJ2Q~^R8TS@@DZ({2LekZ*Y z7(BurAOF9A{r_Rjo&N(Du(K)zh=d@D+wlsWHi<53`}z^4@ULb^40ViAA1D6K|?xk z?=`&FAMP_~HbL5<*3&qXDTN8L_A;_}1QM$_)>(dAHOF5;@c=OK{(62-ni1Q9E_3eua2E!-;MUJ7}PvE0Q6Y8N&a z38S;6zYAr4HkJ3y2C=tJWv=r3AOb3?;sGRl7t7`!td3mb&cbqjdEmRTr~^5B*c|M*xo+z$WZi zF8)?>kb%8KM4^5D6X51nHFd}V)=b6^Ens`!FxVvMJaB_z?3}?EdH`-yFNcrIXRTb- z7*lkE!UljtQqS8Z*Y_xW{Ez@(Z3-(zg)WTDBPllkXaaZs)T^QNWVVEiA?h}!4}IxX zj%U!luZaMND@tVFFs!U{&BHkh3&3npVgs0Bd?6CW&~Y&w0G21*PVm=%~zHt`eDl4a46R$wrP2C|*t#B@rShukN_MAk1tkLR3py+qZ>u4jT=$au@Qd zgJpu$v_&lhUozBMn=8*}$Sdr1g#kJlm4mA;$DcI;9JhY%6WeIK8Pb{bo^~IcJ9pyB zLS1P7h`5w+hCnY3d&RKys?pCX@IrMWJf6$H*tft6KXBr;!H%;5M-|*Or!jG1ONq!) z(u2AhZ8%?ms*MKP7id?!4^XGWf45qZx64kuYr0B@6;vrj7Az{Im5xaEjGbZwUc5bN>|LICe|#qA#_s=Jvp+RO5hN;l z`PYeJzRzL!v;Ke~-V-ktZJr9r@ah!RrTuJ7hPH7$WE+Qb;@sXffEoYVF`Ksi+rz*b(6;|ZfTu*}K zbzVqU4cYF&gz63Tw@$b17bnL(v@e`wvVmG02?9sfLm>3Z^9v|SpV`^?8Lob4xj z6uvHHTWu?qwEJZQ8}{~Omaql|$eN#A--0%J;EpT1qLTB5L;a5`(%*gcszaz}d`vVF z?&Jl5q9}6TREsVsq|SX!f5D6ycSHL!B6!zJlhDWGY}vULtdI_KO#ql&vBQ)(oh`Y% zUy2yAl#J>UfXfrUm|EnPQr_7SAd{!{+Bkzw8-?!)ldtqtUN(MKxAGVw89ve3q#1sY zZzs1IzWbZyDKE>f>(iW02O2bu#XfsB^NBE1p$L1cn@y2ME^ulsi_hm0zW`Cq#p$J{ zIb?i%><47Tuba##*`VMM!Ffk)J7=x83h5(y6Jz$c(6FJ!z!@tyl#!D7ZO{GI{GE%7 zbnEba4v|^eHopRZva`SZ%{3JOB*Qn&Dz461k*R|moLzacfXwV$w7ga)>%B85@RNnR z|B>=sR|Wu?dG6q|cYxJ&Oyh_x$o{PWsKXgnH3hO^WG(UoeO9T@sde`93|ot#hDM?# zHbA`!8vyg?`2zd-mqU~h$!oY$Y(!v$YaCZ+8#H%VpYn4+{&-{NlV~vjXGKNxDn|hz zKs8i$0#G3VZ}IpK3e%rHVZ%O7u{_c z3@9ecJ^H~vT+)sAot-Z>drwuL_r)%YS%u{6w7L;o9+O_H0FA?LTj;G*vVh28x9+P- zmMljXmazrz7$+<*V@-H>gcrp-=QXP0*FNR!?SJ{fW46TgezGO)xU^T&lhq|MW8A$i zIEIRSxATOAup>SXlORWLEVMr?cQh0z3g#SajpHvXr!7-EK3iAUjQ({+S)Z-K3BOj? zSed#cpGO5u>J!-Vnnh=oFqb`uMf=l`Hp`8r$EaSM51MQf9Rl_QdIAwyAK#BvcoIKZ zMMlqmg*&%Lza;KO|1&}o3I%ZhyUM`|4*&Pg#dzkuEAYa%!htUkS@!U^b@M*f`#OT|&TSJ-TfJ0x80C6?v zH0tBhw+N-{S~t)WN zvL#TT-Nr-Zl=1!emEphmzOCA2@w3G!xTj4R^Zrxtp}`7+a2ukNaJhWS006y7%ktv{ zhVm9)6#sNkSVX`1Kd!zqEUNE~_NRoDNDMHDNOz~w-8po_Fmx&@EnOoa4bp;ihk}HI zGzcg|he&saAb7X```j=0%Nb(MIWuSP{pMP0pJ#C3mf{hk4JRGdNG27oVTT_NN%WZD z>QkOZbMgRDl%Cc&rM?ObnIvHTKj-b`|HPVEZ}ic>f5mHFTAPBB1&+t>_&5qU-e&~3 z;nuv~-0-XB$vhRvbIPGV(?R7oNjo*+>9mKXgEJW~_Dv&GdEu;jrf8B#%CrX6Tvt7O zwju*QtWT5trADQFOSr2pK7|BV!oBe$4DK8wGr6lmKI4wmy5<+Zqqu30&P~SDFkgKk zFUfy)c-%^EB7B%m&;9c1%&TQUSp=u6G_Xl$#Id06{gac-Wf0mQ$SklGp%Lu-CT@5) zRogh7v%6zWSS69%cBT6T7hLlO874PxENQyrXHv2I?H&1(Aj05bS?z;BXoJ{@m-HI%RoG^RR&{ z=iwJM$dqMqKyyp!S)mj5H{J91Sz&WFCex+P_wTos;Td27F8r!3%d!7DU6w|3^EZ80se-#HK zC7qaH`A=^}#%`;13HvOm?&MWO)?`#r7C}FLy?EC#Ro2;BTe_9W2y3kh{O|?|>KT{M zDYfb1cgj|qD%yR&_5gSDf#(Ez8dJ;kj(<+yc@`63XoHOB|ulijaKhBFqQ`l-@{f?LSJ*bj! zwGXo(40AGCqTmG7BY4D!LUxZL?b5MP74QhSUHZlaLB>KJCE^yx$NER^k}*csUO*I3 zxHTkWQA0KaJx0|nn)3JEcwKJBe<>vuC1B81*l7o1?bHX}E}juv;$ozjE)F%A_&BjR zg7hCysJ$#xl=|vWP&$N>!v2Gg*Sq*2$|%{ z+zn7pb0mZP9AQqBhp+P~!mISP%rOPBLOAah>U>b}hhE#WWf3dd+Yc>!m*en8JrnSH z%jH&Kh1#5$-@pnzs5l8a zOyZt=9wLl~R`}F1mUlh-W za6w%O+>q74wvXMDiAy~9kkbLIC&_iJSD^zBbQdSg))?T6&C$y*N?LEkJuoo$%P^q0 zJuH+f97>WEhnWNYySel<>pQxnzpW|;&DM$~z);&qeNmSvv5Q`KEgfL3AaX*Sw?U7m zE+gkm55>ihd%XA#oH56gGbW-W>14V>(6~0B7GZ%#q_30D{ z-egr!LM%fKsr_4he}w;u2pz0WV4$hqvmpp)d%;?rEpjsP=lj~rZ^?-Uq{tV8;N^1f ze`Z@5qgb-Nxd8b^52!tbs6e00X;%uu6xu#u%mgyNzio^6OV(eFN4LXpyXB0z>XLml&!SY?&gYz&fZwSF90?HMSVa*riyqeF z@#^@HQ9$%?@4}w_kB3cb2&#a4TU$WZ=$`ikapa+$m(tw6C8_#39s5ql^1hZf#kNwK zXJLBENv|sAvAY_5XVG?8tu}9smD%^pe!P zLCEv0xqY4wd6xE~Pn#Gs5t3QgJBZYMXT=OYqMcP4fhhq|e{qMu_*xlV96Bin&-+{?xVHZatGe z>sG_wH!Mbdv0+D$ zIR%;gLRt?KLy3+bi@)P(1lvfSSuhGR{N9u=Y9k{W#fzm-t&dZPFkV(7FgK!#WUX;# z7uKN~@)2DzDPr8n?BDdnDf&Sj9-}Onh|w=@2f%dTNU${gq==;-t zadLgBje3dw%LKo7I~@kDm?YD2(xcog@UA3G$UE52x=371l=Q!lv*0TAR zDEI6j)zzRKuI-9%ug~8J^_nT0*V{5BXEE3l2)IO`lg>Nmb)IjuxPob7!41zG>)LPG ze=Pc+>67i2{p|l*T|;zd=UZ+)C9!F)TK3;jafx+%Ftoa6uqxEvKXu+}*^lTo@>&Bg zUudTmS{C0G<2yfHYo1kyD>frp&sJ9ETQ-H3TNZVO%x5oyhF;D4EcoHKx-RR2!0%#r zZN6pRJ!swsRl{B7Yulf4Z9d1uaoe&#z_HL`ZdrO4dDa%v<2v6fVk*GjOqG{sTJ|Bu zecr8W*L6M_e6(q)q~N=f`4;DgJFZhXZu5CpvMqP*i!F-{#+2`QTsH2A=hb{YK`KQa^p|;H3 zwzw)MSB63HSGry20pagyMGwTz)4^73q2(c)haWA17q$|CJQsOTyE@;}WgdDPZpZRP z#A99-r2PXPzzX!agB(n*M1yTf8bez3A!(NG>SL^XuleXb(1#lJJg*v z4^aA_Qa28kkmma~upq-1MKzm@x*_X6MKwM~d#@8}7Y<}kgTX)F8(apo{bYwLgo@XYx{G+JAHGFZ0(km<#a?~1 zIUaKIMctgDnOz$qudU5Dnbj)9c4u5PQLzS&%?cMAG zK`!tt&Qvm2};v-J%osUtxzx$Sj?{t-t9!@Slt! z2jUt#O~>+Z#gZzW{UdyJ;^};W|C_8ZV;@kix+Itr{UGDvPyD>agm@X>(M8J)1F6bS zdyuMNbH~V-P8P?FNxhUAxvMa>+tDfEIUe{ze&eh{@wEvOB%|IZyTucuqGvN{MidT` zlOrrXqvD+}-!}6<(w0iKDYgYn>Ae?&!7D@Yt$}-+P6jXJvH>y#a&(VB(lR4BA=G!E zhM-sjLfMJ2A*0lSfA_!o{O^X6T7lqDi$U=fD8He*7#_85wTZSjj|~rC@qvWov>S^L zaCN~E^e7ipa)A~WQu_Z-N1Rj7HIKmsK;T93)rRx4-OsR0klSZR0WKrTiZkLaEYt0K zTMoIdBD?i|gFe-8byFw;#O{yAf|OXJ+VUN1Dy5u26lH4V0Z?Jku5=+qb7bnTVDVMwv2$p? zq+O_N?mx%t8M~E}F3_QNCxd+h0t8Rw+1Ci-=B~d#`=`EkO?#VPkT6u5@}~zmQ6)s2@&xEPjH5A|msw!PA7>Ij z*aC-2QuKo=66B7HheX3rJljA#M8m_QA~!&Dbc_wRd=(q`UWr1}~)^bqNV zE77`GP8gl(o?A?2@o+X+EtBP@&__AlFfSVJVQon zg2DvDy?2zmwGLhZB33P%UOb+`8)T%|mhUv&cmShDO;f=}05<;3)oCKQs7SwK(?IxB zJ`0RCppwp{h&H7?n@3&m*&z2OJ}H($UDugmG9Rm#E*%N^GV-|;3iR3&-wd-O636G) zBNbYL-n`Jm65Hs~!gt31Gn{*h zsUpCIqZPk%BGY(s9kqM}gNz^VJqCR^hiuY5RcsB@2839HP;EL{RK43PL$TPfFrU$T zh;e(sY4)%EVw=jkCG@<97u02wjoJu6gx`2DM)nLa>InOc#!8QEBf42@=6I*@zv$~0 z6^v^%zWD64g65Y}yHu?)HN7Yf(yy$0|IsI=-t>waTUfU5fH-K@$w57Z7qZg;@=uBz zVmci8eDf;OOp)eqj6f;m2R5bLY0iCn0(>)93z}H7=0z2um6FmQlwn6HprFCu5y_5_ zNO?~cYofu`twV2^LO3$HDQNu0>X^B8`HgjR0KbXhdGpR&o**)!sZ>AKJAK}*dNDc# zQ4L$a=f_tXUudPzOuQP0L1T(T3o;~+Q^LTQgyCN_PFq=ZfD5R>k>8-?ZNz=iI0VL1 zT5UxLf@`sF#!!yi=PYx^ME1+sPk_4Ls)@Xe^w2AE7$;RMf{dV{oSJ}ct7fa+mp^KD z67^Wvsh!?QUE#3QVS;8nEmftaeGnS)<`?G!3L!kaFvXPYXidEkiRy~*?!3XrWW4Sf zybcTJ!86G7Bjs5ZM-)S3n2+t-_+ruB$y}*Ld3tT!Y|gnz&QWcv!2R|lli=n*FbWs#(Z}0im7GwG1A`o@16oeD8VPFxS*Yd!6jKA~NYW>( zPma6$g;w`MJ#=r97^8?c=Y&5KRB5W{tby(mL=s_i6>`z={xOf=G@bhIpzPOB7!d`3 zTSVv)*8>yvbC)6~#_Y2^lV#>2757i4H4>$RPJ*#swaagqa|2A#u(rAnqRa)}mePj0 zYi?Ia8N(%9%J7-NZHl{hkV%pC?>or)ad}4~xk7Om2e32YCZ*$y9$5i>bwpm}q>+&| zw#2EgTRCt~woolqxT@lvt{=qX=z*=;2mf}xPg1~69Cyi$fiEuu zU3I4-CQRQwFn*1^d} z{`|OMmB|hSlD}^@U!Ss~#`{I^iG1ORAT<(AknMx`Ak44?Ge}JkOqrhpwR9`P z-?2NZdMpeT=eRD+u{*^8^OA5j(b@PMMr8h?7Z~YgF=DJ)!8|nxCX<;EyvldbteFun zjHHb?CX_eT8&~D?x?71THkLVMYBqB;D-@H862`kFEDWkJ`gDv{(PZj{|6mNi81Wj} zYNfzZ?M=8>S_f4x7l`UjkPTQv=_GJxF1uDx=;*C$fhI;{8JIr!`jbNNclvCcGsc=Z z2e|&{1}NGO;O}_o`k7c1GEBWMCA(m6>yY_7Lv=(D?gvBH-qeJ0ZZY&H41yKsZ-`?? z*32^3Q!!10_cARKEboI~yPfv&)(Z;=t@q$hUfhcmQo!~BEI#7$*dKsrBs^WJ3F)MZ z@(r%cjT!J2`W;ZnWIMHXe(bH{JXUBnoKaudyl((#XOA5@Z1yUu&t4M(5Y*s#ZX{v- zuHofaYut=IGLl{}oo`^rlso*}3|exp)i5TV4`kRRor-d8wf_AsIZqwg{GB)fmlYfS z;q$BnqP4E-z8KmV0+@{-GxBcKjGEGYL#DP>FNwX*cda8{Y7lJE1A#Do^+?Vddh`zs z-1tCA;t{#AXG{bZKz75w*>QMBFqr}u?$NTX&rLby`4TivRv-2~$K72vyo>{l~0L+?5Y%Vj{G7&4_w@uw(khwGae?A z7&L5tMlg?+p$B51yLM7%pLunSrjZGJRnAkF#Nlmr-ot+ihX&|phKSs1m@G);U;4g> zWQAp9GG&?&D}^0En(UjF8VhOc_tMtZR!ZR4BN4iq1LCRasNf7Av&&ICeI3+R9D z>WO5>MJ307$1&Gx5C6OO$>i`y928ObsvmjIsXDPVED=0FB8};>ArHa|5xXKM><2vz z_okDN5O|bJ(rZqh*P5xkL_39|y65OVS^8!o)#o-m)4YG|#Mff{)}NwhhLJhA(NAj0 zTiJowK@S}+KAf{*d?hJDLe_p+^JmVj0rb5=KFR%ZySq`Sa)1xjRx5~Xi0(*Fe3b<85ees&cny5ZsmDs-XlUjKZGt?nlXDpAQhH$RZcJR(g-w(f zNE38cQZBLVI7JEd+#t^>yxJN9NluL0q7Ser!?m)XKCvapcZiGu9c1Lg+YQe!xe zfnaW?qr;UEiZ=cx^|9Sv=m^`J;v|kBQ%( z`_rRu9;JUnJ?*)&?acY(7jj|E=}Db)ck}3N$Ss9HoZzG1R+kB8%csXOa+6%EEFqIY zV?VWIDKTTXpI;j?s#{j00>v#(CDX~rD<8$=|3x-JH&-mzZKrcN8V~xK$9@e=6_!V# zEf3fOPl*Iq({9wvjT-!u>PTfr4cMb`4wc#*+19 z{fJPYq`Pi;EdNFx2-xo-#U4}ufgWpneRw|+#^}XG+m$U?_)SJ67>N{ zFzgZWdk>>B(vA1~)gY2@gx5s0{``rxIO_ft8fWSBi@%3OOh>Zjx#Al6SN2@nEE``& zIBVcwjVVg@)uqTG1nyKSd!aX_Q1j)R5l)wxoXLCQXHR#n8JCkCT=Gr!`TIbR(ZrQN zM$dgAcM%ZV7#Yaa;mqi)U$L^qf3jBlJKuFS)vYh|{hl$wVD7Xo1Pm;yNHmW97J>b{i$mwbuYTF}YyNC=G(v>i`9{@#fdnK!(0F6SA(Nh%Dd7 zIk$dBAJIKng~$5Bk%1x3mYlzzie-JI){^A3mZmEb-LfKEAX&W)E{all$# zTHabA=hV8yKXe%2&I@;Z_Z&JbiqA-1W@L zcsMfohfgBTe67A)z1i56fx7c-_{To3==E0pQGI>VHRE<_4*Rb)>v27Ak6?;=HYcBk z+-{A8h(lX-lF5Kr_d>*$1-pOV50eM*OnTQbXtrGQH5hdIU7J4I;`l!(;O>SB(o}(oo83t?2UY zP<#i35EwT8b=eC`r%BL_e&c)D60coE=R{^+{%5SgdpK*m{vZF;8{x5YoJvRcR=+ek zhf;Iyx~k3Og1XWXhRvUbRrx4HBq;rStafbe51{k8-Erq~PXp}p(R-FLg)j7jega#Q zNBa$Al}kr?e4K=<{~-%8pm5GCxiP^c=<32IY?;XIfg% zP3N*NTt?4&+3dfPV3kU-_(CPEwP)HM^LjU@)B}*9Ll+RL0AiHPJc7z1!XsqTC?K>g z8+u#@GDcBe-Cjs(>F2s^h-sVZAQV#XjIHWPFe*(MDnf_2bzb#QokVNidMMKE_-j&l zy7nj7@$_I#zu?7|MSFR@w;5@s5^JVhN1I{6tEd*xibVylHP%`1BoBeU#^2BF>Hw;D z+F1pIw(tD5Zove-K}WlWOtJg-H?@)H1do>$a7N(lxUj{m8dVZ31=sA?&tKukU2}FY zdtxraIS*eLS{$0XRsXw*7&j;V>O zv86!k7y76MP3LXQ$&~@oE)QCHPOIRp#;32p-_33P=$Lb?Kx_IL;CDh|yxwi?mXx16 zb)6SyhFLS_n$#}gmta@r*seWHro3U)<7>{Ib*nm&M6_Hpi&2QcP!RF`_uIK+LgExU zl@INpd38F@O*q7_dSom^_NxJ(EA#xkCR}{tSY?tcplG}_od}bDc3Wlg75Q*w^SC^E zdtAQApZoj)7ZC9+QJRcaze`(uvfHE-VO4!7KwTpDG4;P+q8(}^H2h-^N*U3tSHSDaIFV++>_mBfc@m zEw^_j<&-B$T+E%n;lhnqR~*p|*&&@;PVfpA6%P_R)cSQ3otP?gAv*nK!9u<68&jNx zj%0As@KMFCDvHzI06;1Q>fJvBZA~P_6b)!b;y;E{_ncKt(Z2Rm=+pjKQ65lw_m;Db zpwdNy)CWJ2BtQ_TZ9z-FQ!?%F41Ak=GUz4_qn)4h#}4C-&(ATEzI$&)UG9d2^8p3f zEd%;^>fb87OOi4fx3@na`!8H4=n8(D$k3xCwfCTw_qzlX*LIWKMjN2Q zPRq=A+5d3Z+3Xo=eRpqpO$-eQfy?2})qvRi_>GSUfqhILs{BPG57+exL?Cu~8;*3~IQ}+xiZa0PABH@K1~;(pDl5r2Vpn5M<$tjK$<>X=iw)?!uBf0kNp7OBKE5;i%1ZhlwGu+#3xtubHB;O-+*Je&rG#@bDMq=llTvU zC#STKUwMY>9RoIf;!4fEAbu}L#>8QSm86w9{Rjn(F6mb$T5$}7}5!S~D0 z{Up9@mHx824XroO>ar**8d|d5ero8WyBART%KpYStixNM=I>K7GE0Hq2zDDITG@;t z*X*I3Av55|S!SGUrR&udVnDjz+#mtC0J|CjzZW+!~7fVheC-qPKs zRQA@&(yVgRmNep;^nF(euk+N$*+SfXMqdwCIk0Ot7#K~r@m;y3(K>7XnE;&Pi20ca z^r*B=fXu1M$MlA65Ro?mA;P|lNjze?!clhXOnpf&g%KO>_3)X$iW_SZMXR<6$_FI+2*f_`}LUgzZ4mc*1mjB zN`7c@GvlPg3Abu8=V4KS;<03Zr*YuTBTsdLyV`~f?=)}c?9gK<6XP#}7=2T$TBBPp z!*xfTH;OjJ&H->?Dzt1+vR7x!!hT220Qxr(#qvKLp4v)K&1tQZe`3}FCx}QzPj4Cd zztJ9VY9X@R3;ax~H$e{(`gOoq;}Pu*kb+c>)r9p9oOyA@o`ZS=Q+ExrEpJuQahjLe zhNws`aPlRP>|40X#GIm44{&ToU9>cS2cf?#W5FY+y@UfL3s<1R(b`Z!=>1@dK1}v( z5~I=7_YFR7H>qjdg24!6fSi)gj=i%6WUfGjcUB;(nZLlzSf04=WQN^%-zQ5omv^9q zlz-~fF`F|&_Dt|gDc?U(Noyzo;Vs>aK(ZAMUui+fBZ&F?B&)M)yoX0UH29wWDE}UJ z+u~N6INxE&Fxk$n7(sLd<1YGk8XGqJ~_YcH`)g%Bk^zgUB zmaP%jiP;6ythWFauA4q#=T5y7GrJ894{fHPzrZoapTga`__Ptv2XT@k(Qo(=Uqxz# z%_4(0;${o7M925HK(3^+Hc!1?T__P3@uQNbo7^*ci|SOl*RAcM+ttzAz?%)^Wwxh} z{?+I;?&}htK^;hjTrjdrO1Dk`x?y+Vhr!86&_Lnk-gtfeSQ#jbN^jP67&x^H@#b#VVm0S`?F*6fTOW!!5#@Ds4?1il|ZrX-DOZ26@KRNn# z)s}7Iggt|K;YM~i(TT2orEQrZ@KB?ZN3CDvdB@6iXUB)ySZHvA0efebzRT||o_hu% zyTLwt1z2L~%hnRw4C6WMQVr#8mS^*$1{&aj5 zG~HdZW5ADIA7z@QjIV&p$8=K>ih9rb2cFu>sd7?Q;?mHlPU>G0<*>_Wla9Lk)hQJ9 zH5wfV1k%)PIUV9&qqPn4Y7N7A!Co)^@<9V@%XO9heq63Wj-Mho_1$yIZ&DBOD2p3H z{&G_-7+2?=76w`EUDJutL;zHj4!Pt`r>&QA`s4LV*NS1w{4W~bw|L*%_D2@XO@s#u zxk)rD5@3cI&g-+>+@CRbtS!L|_@vrlf57THmYrb@Hjd~OStrf|MF1br zy)H5;ovVp3_ZCa*j8CH@%F+k`#lz?po%5R|)40w<2}B3cXF^t1FT;D#_F$pEFF}~q zvOBzyT3>l^^LV`4{_P?ShbaUQgsgg)$%8dsim8RlX1#RjYlEvx$l}C(L7Vgy{4CFc zE)h;s9k)>*Jfk{p;HY>eby-uEtsq3CX|zmund3`=IPB=^bvIKt$qxv*xK8NYoJz=8 zoQO7B#(VW);Ef-$ncAULDv$MTtY;D~N`2@+xo@2F#7wc&|I-rgj#Xd8xoZN3?AL2y z=@eM05wq_)@09TUY-`#W`HF!ol)4iI;Lbg`2rkk!yxHl<$L$GgMQNRnfzrwJ)Vu~M zHkr!dGg~|xk9Ia7FF#ue@{nFU;-0V>o0N9|H4Efab2aRR;K04-)v)5+pBNBEuwGnv zwO3N|krTQUZ&aLh5EABx==8WBLN*^iEjoW|zWH$<79bC-ERR*fFnn)&`PIa?u#Lxe zAB#5dO62U!=wP(E8d7qZ3e-fv>YWomJcI8Vp!*NOz8)C)2SBIOyPz_uEa{<_252+R z6I-~p&4`nysi|a z`3<~KP|N15mQPrDh|rnJ-k=O9u3_BzKnE!bV3ee>ZYXCk6eC#a%$$%=8EG~<2uR=+JmBHtizoyfxQbFWHQsBH1tZ-KGwG4ng z6<;S0F6yRjtKo~pD&X)%)pdL4sz5(xOg7_oc-BfBlKj*=#mLSMP|`%U&3&Q#23TGnwh?SYkE0v&xna7< z8jGvI=5T=>G>S$DJi#pjjs>-x@3~C$G*iRS_PJTgGoKJAzwiDn&&^dtBrQ+x<5YS7 z=9I?7tUNGaB4{X$tR7vm{D^}HnV5UjCGEJYOIBNJSsb6T5mdX_eVq|SBSGt1QnyJ>TDdc#SPILk`h$TEod zdI5rK?{SF*=jidXAY40?>g_na{7*6^>UQq++4(cq-_nQva~b8G%>8<}rOKt>=42hj z@=V*=p+~VGpJ<7VFGGH0K`5q--|77c84~qi)V!+(}_qN^X z#ml#^MxxVSm+eN61dj7fO+nEFG426F8%dnab9I8Tb3?}^Dwe-%h({ZuKD-Yck*VUl zZ>|D;&hlBhj#q^OPq&VDP%sO(Cqn>bWQf6ING|of`0Ks5tW|6WRSpGKX%Y4Kupot~ z05PC4eN}b!MI~d7=T)oL&qLAWDZ=L!>y6tf$#GPn+$09nO;&gd?h;la~~Myi;3GrE6}%7xv@?`)yrSSJ4@+YH}kAxU~0lGB{6GRrC}3B-uy=|jGXq+0~F z5k6(&WWKD@I$Rq+cKD9u@tJcd{PF5d6=_4q^WDAA$Kl9kCX7D4Sk$I5wRK&EQyTFX z-rxP0fZOA8l$%h^Pklc^y6(HjEP$SRv@#5R+ zv*?V9t@Px-;9+H`^jUSh2B3acK`gLK!n2_9poqk4s`T$56BHM9>*9VfEQ`uGV z)W3Mdsm3|wbMLz2t2Mf{G=nYFTV=k=umf_EQ>FJPMWNIxHgdY;d!;jrx+E!f^A~)8 z<#k90B~20gP(JdZjTAm3o0SD5UtrOv@UoE)HQr?YYA@P&Y}}k%hw$R`d8Qcf(v6|U z#@n}CMvlb?BnIA!(jy1>%jHf(v$lVG2on`H74b$VIy!ISj4T&jPIuQZ*E zvMsqzTn>{aBUJT*it?DzIjcTT9{jRbX%-m5UQs;u>*KJ=8ZIauy0SDZ!!1`kCWgx3GF0Yv;$h6W@4za77A z#IQE6@ltB;Z(K!O8J2EeoWDIf{>@jrsK0(G{^G{J#7cMpqJjd)rVQMkX#rGj1Ep^9 z!9Gx2{!QFy);t0k3IEr@(-q&H-zNe5K>PE_P_}*9P<0*|JG{nnXE>PfFR07#uy-UCf6rf^40ncZVirF0LF zoWt?#(i_6{H`k%-z;#ol3^wfigtVwgy@~y-oXZ@Q(;+Vt{2XZ|AXM+Jk z0vCo6=$g4j0qn*%ny*UjHvc;Bo4sY6_T!Z3svICo{q&T3@I!OBMNf0XK`e9gUzupk zu;&kmgQdr=l(J-Q67cWS{K8=D_(+z{f37HOp<+FsH9sm3YfmwQB8*VhvuCO>29ly+rgqJ=kZscMnQ`bTu=7AwtAQN} znR9+K0oX20-HIU6zdy(P;(@z;d~%8DUQNJwGv=*egmv|~Y7(g`ve#tyjQxU+H>&nS zWN`DUdNV21r9ua;#ky{odIMLUe&f--x!IrmvG&w8e4AfYsEvVoz=RIKYmJ-TEpW; z)SsA&*Kqxj%)4tA{gY_@?X>=Vkn^Js{q3A8t}Ukp2QP<-^WXx8*ME`QyjoWBj$|2Uxl}EHnbu2nneoCY#iR3dnua0n? zeHN!qH3ngN!)kO|l5t}*I(;acL$k~c6Z4tnQl81EGrzUKB_)?_EhGwlmKNzG@pJY7 zE8hMR5(Jt4!Q%C6HZKe|*c1L?bVKlip%fJ1j6wK`&1!MZTcE(1En0Gz8J1zMk|X}P{8MgsMq?e(sRP){d1>m+LZdsYN^ z(o9Xmp}aJg2I2AdyJwir;5x?%$SeXfrnnJb}Rzarq*__tlSC!Fk*Uu}j6&Q#idHHI05G&+^dEMOmQ1W)o@I(59~ zK7BWd(P@#{ZusYAzmoHloLuB(+veoFd0{j%!Dk1p#dfFcbJpS89%OAHxgs@(I8x(E z?Bua;d^Ia~xanxf{d5WA5VxVW+2sNkD~n5=x}hgzG5ad5u%Mx9eU_0R)SkufkAN<7 z`%v(?wfvX(K@DWP(5GliXdu(Vw+xogjO;a698XYs3kpVqF>&pWI2dBvY=jZP18S+H zwhbG`X|A9>`kRK1_vO^IGKp>4p%ZtU>&XrM~%!9go+t*YWAQ#(sXVq(po~B$fuI(~7T$AiYMg~u4kx&ODzzsxk6#I_+o_D=_bIF=%Sz}L0_yVnnUOc{FNe(K;7=H{c} zWX%g>ZXZoPO#Duc}%oGFrFKo159d$D{5`fWxcGURVbwx_h2wu|W_OpTP&Xv)U7 zp0$zcqMxH!pAj+kEKam&^Nl`zNyE1D-@bg-ULJ1NdKJ7+{T0{Z$aM^~lzWzXLVQ$o zhMJDFdViaL>Gr9>=#vwR*s4SvcCGQ7Iudd&xVy&BBCZsw|v9wGG-ltHP#QWE@Z(=Up!+mfia_$Ug$irU*< zv9rc^5Ak?u8o+6mj8^BUS+gDzw~N|xy@%T#LGG-NM=7wvpWy=rEjg!$#7?&BtA14y z;PnY5C-VyG9p-6et}maHqDKR8<#b`sMUf`cuOBSR^;<>9$eqvSEf_f#M48 zMsD%R3FeQQ&}FKb0FQ?ubxmq$bk_t~Y}GWfd`3NfFEWZyvi4cs;s+o%ZiH!0#s${v z>2R~{Q@|)#9RHR)5XsJbY8i!vx34!TI;29$ET-hW=9Muet*C}sqc9shh6YP(|?Avr0|F>-`!odKadjl-nb-wo%R9ue^VD{uMI)8rt6Xvw#;VWtGFQPZyL~YZzO52P?7+9^9 z#v=<6Ykp1u93#5P4Ra{t1{-utZ=uq8N8*Y`cG*>ycg!Yp#(3+nQKt<*^ECQrH$5F?+`I`TE0zh1n_c z+!a*7J(uh#WWTCE|K7whq6qc9a$Se?sc*gM7{V;lHdqruuud`|S>HZ%7@%uI5k*pJ zPdR+$9d3T%*faV`BWd4|I2ZkHj$*>UjjldIMROQjPxxmtsR4Kn<{5L8wX!ir0b-Qq z?X4f998W|FIwFSeIT zB$Ko6M+iUons^$0GwN(EGb=r1%E>gv$k6h%B;W-@P5Z|6AQiuRwXa?X{9#-z=f7ZT z8nsUY^aE;-sw~z({mzM#eNL*4#Gun>^YbgX;R3Srm64WD?zoo!EVaw|-0zHFZM&PZ ztk`-0AN!awMCkogrbyk6Pj;>yx5xK-3#DCUBbni-85|^-Mw#fY8<9zSO$MGu?w|*| z0L=Gd29_Pk4QFn$E`6wxiCb+}{^x%o!Z+IbO zVXtX9nImm}$<1#UKOvc(A_Ob|v4edkd}3W@(`gT5F+|2ucV>L6Xpy>)QoS;o@BG~1 z?^!@o{a&HnNQ7?_yc}catsk#y>|tgR1G zhA-Lu1EurZNFf}Y=v?q=YL{@2F#SZ``cU6>{z0ykve*P6HVlhL+i0;5i%R?k9Egd0 zZZCE3EUE(A1Tl`?yEDuOEJyNb4kmWOXKKV?1@{$Sxa9=(VvEKPk@ks`O#1# zZqKFlG+`@2Pz1W|XW-n=7ZiVp8632dqfs`T*FO`B{whJvzTlgq3LaTNvw62(NS-~B zK^c{G76YH2ISeS(_UC-Ic-OzKo2HQ~r`lI9Ed!lausb*;%UL6rNW0wYVrY_cCIb%r zPSAgs9_HK3Nbg49jLAv;xh13O;E*`yu3#By*kj^s`@@O(G`_L3COe3vBLl3rmQ1D3HjJM;?e`Cv%&&-9nYNW4NQ(_{sg z)G(90m6K_;0d2b}&*2k&YZ__nV58Ye$|3Vu~AIOXiUvE~j2A>zY zh-LNLbW+UFvkokCpJS1PR;d1mgERTvh1TjVNmEbBbb0?!VA_I0f*SGm%eFgwcOm&N z^LnEF37uDWPQD()68^wN9?SP}OD*9qrWt0o*{HQ=20Wh6``goQvc}itL>)C}eYSyq zCVy~y;qE7?(npV158=0yJuMQSV+6r~GeN&jhti?@Z=>cT-BEx(>UOj5I9wJeN;9UNw ztb*%VfU_yGm4_4GZQ#5W8n&(m zGlPcLC~(P-L`*CFVmoBfoSc2;X3oaX`iAdC{1SCHWWdW2sIsRWZ>T++jxx{n0Q+zcqUof3xJ^m`;+pXPZ?$p7$KAJ@~d1SUDpwE z@m6OMt!;|G_dc*dF!)P3PmZ4^>5Cqwe?9$NEIfRtj#77!ko&a!hAoLKN|MH5?KZ=Q zk#<_w0?j<(#7L__!1%h-EvPXQ!~g z7>$xwi$7ktoykBg;tH&|N^{8r`}oa-$!3p)Fy?JH_HBHerAF$Y!Hwx?6E9hVK6VNq zu~nVC;TwKka`&AV%Z|LEB&1+&}@$%O2eT{L1;80z1PJCo!tg)Egg_rl@}Z1_ z4Qw3Xd^zWkaA63O*DxY1udsxOkJBNt96-H9KP*P$Xq`dKC&NzYPs?k_CZ?se;tF^s z+*(VViDj4{Zz=KFHn~xQTkz5Qz%FJ3cRypWG4u>{J#PD%PO<-`#WzX{!e3H0TtEvwJjixf-sWO-OM1} zjdX}~4BaIiB1nS>N{Xb?-Gb!M(t>mdNW*|2UEksN|Nr0he(U|dwcZ75hPn67z1(xo zJ$s*LKl|AV#U$EH6lBW`cwu2}L4=c!Khh9Az!y#Ivu(y%rE7CGBO=h$G7y-%vOq<46@zg=;iO^O{-|N;9%qG-OL-nY+ z`xJ257MFg{=)RvbAD2OT09NMOIO^7igCxvUVgFP@=aNF1M8qI5@4?KgU@G2&%6s82 ztUN#Y_6$e9FA9y#cx3mdu#Z4m3pMC2i8(B$FVlp)uP*6zpfrZ&(>8f3%v_PV8 z*XW-^!bos98ND|h1CFvHBii<^rUbrkuw?FVB<#l}2T-7?3s2+WdG5^k4ALZrH0~$0 zej~oe3)eHp0dcNc>iyPeHbpyxPanS5>*FJw%f-@HTv>~wYdMNlxExvig7)2vEK@Q7O1Oy1>guyv9En-Q}j~aOhjHM*$gcu zjG8w08T*YnqlD=hp7mzh?8e4_QSuq(zlZ-W;oCh@u(gPVQC6zrb0Ui8$yW->o~%ON zl>jE8oKA?K?1(;y=Nc>BIm9{;GPHutA7KR6lA7|QBJ_|VE~Cf{vHU_FB3i=7n7)RO zH)U)THN(;hj~-f82^U()W;{aC{%-qD9Y2p1g!WZbKQry_K9c*8`M@gLa@)TP^0A2B z0dXOi!)B%uoMy0&+0cDv?u3ckHc_S*CA@Ezaas7oT+jlJOXCo<^VK+C#X19(k}IiF z`D+8M9_^i5+D3{cFP(GTkD=le_vdTuwZ}@rV^=ptFd7kOv~aQ*3zK;+qv49Y>lM)bRv;Sf4O2u5OfdM~IbCx*O!U zAdJyPHN73r^KKf)DC*GY|9&PA_Lr2*qubs^LCG5+Vf{?!C};`w{MNAwk~SV3&%593?s`H@(8J0iDfi&5<)Y)`@*v{wL%?f ztPv=>yq**WpY+jWe+e6)Q7$aGwqx%$%2X)uuIFz>*J^Ukt`O;C88~@v^!Eg3*C<>A zI8qH?h;`5Z3w|JXR2cni-OjIA#RPm{*tV}DVKZK_q7PYK&6>7l!Ct!9?8pWN)DIhK zCIJ8Jhk>TPA!#S`w!yQ+ex!+v=53U)|0kKEIrs6_y%uyWpgnnmjZfkX1hmi^y(`Ta zD$ywj)mgujT5P`0)!+qo5_coHi83?I;P|&mAh%#xLM%L(YyO9t<~vM3X-x#G1LNAy z$$T723nn8>jAz)qIdzW!OjpyJ{u}`~5I^rUeAchuH6@@}B8I7oU^KG3yHd<~uHWDM z4kWi51yAN*#Vsw6!)e@fm2!$x>T?>37;Z21*+<*&;a;y{NQ&ekx*&TK22P2Yn~1O} z500lh0(CF9MbDlIXsr=>`C$#bcD6`yws`#N^2Ks5lPjUuN&EXBd9gVJMi^2QF zi6f|57k0>Vn?*G_n3ufKGg=i=tmDQbGBj;=xQO~jJFdt2=dWaaQ8iilFB5fta9lwo zXq!jR{Z%W!!h1<~@{pmym40*<(CgAb=}|J9ttW4oBW@1zIW^X5YSu2bu6M>pe%r-t zUA#U7^8&9XHkpXUP|FNWD0pJnzD%Nc_Gn%I`JsyfCI-&}YEAfhj!2S9u%SJrdHkaY zs>ckwv4z-yg@HZUgA>wS!&D^heMQV6!;#XyL3$E&ETh!Pp~1fHR|*8eGC{Y5;mE1E zaiVa>JOWraI=L#Pgg!HQ%j8*rm%pO-SJU0Gy#(*zzuF#gk-m1Uh5iBLjX&Or?dPyx z*oRVm`%xi(ki}LmzbVE1iccEfG(nf%=daTITLKA&efiAcx zp`gfBT%#1;eD0ehz{25TR|!iq_0>)Dppe)i(ioz|@>a=nMb@W!(H+Y-n+JrnUYRfn)*-whS*Wt%dET zcHmN)@ZN5$40ZZ_MXcv6EHt*M;t$#2n>c|&4v5k7uy`m}&vyE)qcNK6&5x#_*>fFRb(edAz{TPQZ-xAzO`Te>FIv;gkRh;mZXLe6BiW>B`5ZpN++1c0cMj2=Q%aV{b zAj;4<_wwabW<^F6LDLs4lrVjbwI>=(HKk7m4qRY+1YlLVGuIGB!CYal{D09wFngV)es8(vJp!VFPy)Ahxh&!%=WH z%t%>q(f$kZ?02AX8z^r2`Hd*J0h9RszIB50FR!11sYBeiSG%b3ujVWytg4o_i_~qJ zxm3}|j#FBp_Y=Na9s9w3-|<46Z?JxgI`#3|SPnc@J_mm(0o zm{TQOuB^j>sy3cuot_It3tv`se|L@aWhcDyE-_6Q=eAA)pN~W*8D1%xB-BviH(}-9 za$ZUSwPrRMmF||(3)C=xp(BfS=Ez|f0yV@4uZ=BUWLoBBpv=C%RuoL%x8$LWYl>|S z9UIquPMwjz9NY}uEqQ>B;z>vZ%7s0%02$_wxh!1yoHJGfdR4EU(>f|V3Rj-fDCxt> zUCE!w)raFa6P9^Kc7$ao$&l5Y)|@B~>saAY(id35z>3rjj;ES*T55@x@p&#U6z&BH z3x|F)ZQyg$Qb_D?4*L)e!BMUVOX_19vXc|BXx{jDN=86~~0-E;Mp z$FNC@2kZ-;gyy!hLJ?sJD#q3Is%?J67BtVH?!jHkMVk}ye|bzLp16A*&VAHRr| z>w3N=-!uHm!y@VDN%-X_cfX|0RN0Im_x@J}%A{D{fktKsgvO7e&Fj8B?mw$Y7Wqm1 zuAzELTc?PtV+!wg4t}k_{klHyN!&M9_T9d8A@XYZv%p*Gp^~<{`1dF&mu@r4JS}$G zW-zp&fWu5`^R;=}Jg9d~e(?j75_Y1zyl0+qqyq2xTpo9IGl}K992f}u>@IeF6RU?5 zpFNpW%_93y=>q^Vu!LDlB3Gb!i4pBcqKE#I0uxlenim3RD&#IyCT+@v&|#EMHQ>Um z^jr9GWq-l6^`zOzG&K4IS`_1Xhz!mrN)oUw;9~^z;rZKz-Jv-S9*LR=9(Ip==7`Ec zTR5W9=W|h~lbVN&LAp#!)F1wh^VeSOA6+OvT-*9DXT2&kQUJWhAzj6*eiHdjm1%DK+rSXhP3>nF{y$l)Cm(AcA*jC5i{?!`AixsG znh1co`}h*kX8t|py0uxU56Of^68kgr>|5WV%e9pvM}nc)eY4Nta(2&BvG<*Q!QyK7 zTWr4ZK0htaqWV5RJlfLTRT?Z?tEHd!J#@QrVQzn{({GOV$u#j%uHzHmpsImfbO@dV zJ1=m9bQF_BP8Qeymc2mp%->@`n~~p>&6{)Ene}{V786e(oUQgv6h4I}E%~d3LvSU- zdZ9F8bpT_kF_V9Ove$)qHx^Awpz&;EVut&=%t|sN=&F3>hf2?|AkyQ*00gknr$}|P zOvn^TAg-9q$532^Ti`e*&DnSSnfHu%8CRnspGZ4ZI74IMv}|FK@G8!*$c!LAbe}?( zPWvSfmRFfPTQ42SL@w7W*yWIX7Q4Hr*U8f0?7|JibY4AUjdevxiVAb*H|0NMb8?dK zSf19{VuOX9BQ~iFe2g5(Dtjh#YHp_LXFUVeNo84O@nRYTOOD3m-7BL;m^XgsWC!cN zoaBF$EDUCMG$+Z(=^5{Apr9_Y>Nu~|2m0c?0Azl;Jid6=@b)acig)-AmQfHj3bk^@OaCD#=ctGrLz3AeUy76cfbnJk4CPj0%BNDyK);Vc$2BZs~&Ua zqn~&nYKKO}dvnzu0#fz$Dj9A)u9}ziPhGc1sAtNslKRx+Ig6bT!xCrO7WiL`lh8(F zV#A8l&i*_AGEY_U=VUc<%PK&8o0$a&g6D-5)$Bhh6@P#&vOg3c&aU|+B4(OwW0N?X z&~p~rl%)N_Ju*{h?s72gT7Bu3A`&-Rt5yr!ApBw#TZUQJkjdA)Xk)U^OXK}{w){sR zo}Z`f*w2|cb;G5kQIL7GRJdZaP(;Pg1L{4r)^WWJz7||Gh@AFydGXh|l4BQm0ki98 z#tpGgQ9v&XtiR^*967C;>AIeCG&iK7AXuMdvwoU)7uBkxaO-}*7v#YEruzMLQE|&0 zl-~wK(ggWWJpJ8NZD8pp2(DJjIo) zI0UQ;ra14sd@L@?#Z~?x?O8S9x}Q@57?vFT-e9C_uvEzYV`M4#%j`t9o{A}WwF+b8 zzW{r_#_a}N_dkb#w+to;8Idc7`o8-=8migEBiosMNqutE7 z>2u+s?$)55U%m_h0bjuv@xcK>Ely4xg5Dpm38QX!?JtX+USuR=?)y1m|EwXN|Ffqs8_SvQKnZjzd%dU zqo3Z*lf|#idmZxViuZlW{$+N-kz=%(?u9--?|922B^E4+{(>-Ke-q5ZCr}@A#(Av= z_TDEDA*tuP)une?C+jp8Rg|@ZQa$Eq_CF69L8kjnuxxNn3?5LI`I>K^NGg-#oD6ct zOjAg^E?#YPyvL~CP(12~^x?D-fH;1$iPe3JD(;5wJ|GwbdD_!HT5QWp99OhWsL7zs zN0QU$4taYT*)aW@iuHSgY=>lJJYd|+VDa`?E5SQ6&-IGTYs`AuC%~kG6QS0A0s8gf z+k{JG`oV{JuTNE^SH!~k()p(knQ=^$ys>{;tlJ28^%03v@}8D2M~Cl5HJRRYE&kTO+F4s#4ZzQo}HQ1?#`Xf5sYDe z;gpLtcPjX>#6lv$=%U{I>b6|oYjh`%x6?4hXR*a@3tKh!I@^;e`uUapYFd7& z?jZ|>;}YZ7A5iPn=5I5_p|Kr`f!s`5WHD72CWD^|L43sq#8*D8HN>zC+#eXJGCHkZ zQJ*U2cg6WBti^-BG&g6ZUL2B#Ou)pt{G#q;ju+0LGYk!P!SWTT6uNvhZnbZ?A+{_o z<>)fLwRH3JYDvJs3tL3Wr;F%UTldIJgvE>)`4|y@pkIG;P7h}xvI)IpzioHu8rgbP zP%jE+#(H;hbhBST6*vt)$%LIq?|n2Ne*4Pxw0q_FBYwFPtp3+H;bL0lylJx4euKMT z$n!F9C`J|VV8 z6`Iky{8ADV0OY9;+j6p^#yO|FPniaHYca|RU>MviBS=~-Q}vQan7+f@^VgsfExWTC z1I}BHS%#i=#;`b+!H`@lI36!pyoDbt8qSulqQTY2_yj;aZZVQ$QYGUW(Sbr~4s<8{ zUw=9^nbNUt>0DLrga$dXi@KNO zkh9O3Q9rgQe|e}DxVfKI^UPE?oyYbN7mj#!)Rn0dPrKxsR=vKVVM?MN`y<}VdO}_X`cKqsOEz!3u z{I8*=>A13{LZ; zriR3}Av<2|gSG)8o-OkyxeTXtpRD&y3S0K@WqY~9b#t*RU<@Hg89{8TtQ-pcj4R&8VL*Q6%36_&fU4eoSPHPrXHTMD z-}FyNPgjcHk4l{CQ?u>;*UY|V!}HHFIk(w@so|uE z;?H7dY+zx2ZUV+y&Gx^HwMQyD&7-NnmV%@+^ zw_h?wIsI^tRQ%65P>S16c1!oasu?o${XS>iEB}6gza!c9vdG4h?7%pkf5~(VwfSz2 z=Sy{vph8)6Za2*EbmbcKay-5t_}CNS7jT-C{hd(z(MF)Y$!?rH$4YYrge-Dc@7>>W z56;a~_t>CQ!+T#El{Q~*2QSvKWn&$cKbMt@_hzJL%PqJz1~NEQSb;y$1L<8Q8Q4zb z(Zb}p=-oEs^C31>}nX=1G3+{`t{UE0qp2AG6l6yS>!9==3fRE9WJE zGaeIb20*4Lkan|1%-civzQx{%Fx-UmFte(4*)x0ap65-J^m9^hAnp_o@m$-$AUHe* z`50j1Tz(R$791SNGI>0hOi*zeVvyS-7VgH5XBAtL=<&dU<0?J#q`9DMKv$`yvq_Vu zodaO{j%E?ZBi0XhE917(3ATB^0I!-@x<|5*`6CP?|Glg2?t*T+-}hYqAnX_^KowxK z{LqZ{RP(I(4ZCfsgs7}aN!VwLKdkvmv(qj=UUE#03d^3F9=Zn8m@$YK-K&=E5Ntkh zMjT`;E}ogxJ*@4V1%^Lj1RA}XX#YeFG56ZaET&GIhmhL?`%RS(+!kT>RUh!)m)n^f zdNo)I$e+*#&qnk?V%s;&bCaL}R5;XGaqTIjw)KzBv|=^pumZLyr*5><4IDP6mk_`IM+E7kQcqf zrp1w8e$$Aw>dq?HDciu$bi7_+!zGnjo+kA?=a=W4mxjdhMfY&Pq4h-`vK@NGJRew+ zAAgqXGOPWXxT@U+)G=y8bBfI6*$4>x*16&F=sGiaSiD9hk%$!?(tc8G3FIwhi^zRe z7%%A?DGf&O09W_+lBTnTIV^EbeB@J)zkCYANWOEW1>J>b@WVqKZ9O(O2ts3ixAc?6 zXqw!0)ZsK*_yM039}Ko@2oD%VU_QWmhj%HSBu+j?VT4RDiA1&)AH5ewwdgcn)J}qu zQre%w!d$}qA>#HF0l&@#&e@=cpe){o3eQhKTjJ)eBDSUr#{3pKZ5vEaEX4vXwoEDpqq z9y9r@$h0nwg-UNq_m`c3lrnDZl%122gzeTc>}c*Ljctnb&9I1g<&`zpk#Wt2f`j?R z68BFT)d}B`dQ;EhAHb6?4toYkWz~7;JI}_@ygva8C02T@%|Ud;NJdXDQ*be=%CoQ} zsH^U7!mU}LPW=MZ;B;hTw4DD-zRCNB!Z9-_4XO5(8SiAR+-~iBdB=n^cbaI?uh&3! zqK+Qd^zeBs;ElCDTFD#MR-BlTNlvmr+2Rh*q^vlb#PGhQs-@DtXz-obXLbKpo_K0} z0{}dJh0MaV!kP-rL}6fMJ}I+5623%)x0S`ydfilMeJ$n^qT`A$D5DF>?{D9a)$ecI z9>3Bk`5onsCIy?NI7wRFT8kJzt!BrsYa`a&r)M|agVZRpc!i)(DU6AAh;VHE&4)p@%KUvj5ei9G zmjz?A^6GD#On$vTE3JU2TzIDqp7?thow#OO{N9W6-&dM|h(s-7xI-Y~?>hK8V?8;q zL3_yEbAndJ1|O&Jxol2?dx3M$D@I4m!`9#EEr1*M5v~j&H+X7&C%!DJuTcvm=fX*Z zb1N5_4>J(Wo8 zv6|y<#I?h%W3iU>#8xnB5)Lhq{`m96M<6gc=$hA@HKYRh9$jjU_kfbeUEUj_FAouJ z8!c;8pEz=(DfuAzEdh2tj|n2`F*FeF$Mg>ePsbjTfY_K$EV0}>DehkM(6kxUQU9+ zTB16O#rI3HOxfVK24MtIvNljn$J`0dq7P)O)vK9R&bCGLIF{Ay@&BB8cUsFTTm59VKE=EXJcJR#AY+VY95WsM8Y2m@8s_Ut?2X?dzOg!o>1wm7Ge+iE{S zqsP6wYy%!NR6azBliyRSt(~WJ%5$!I-l@wnOcwhdwv=0)dC#vsesR3jyXUH<;cvylgWDHloLoNSNN|MZ{J9n9*&s$&y$ZlPmoqtjG7w@EiGJS z3u`cSK^t&CTIlzNNTtPts zZ_j(mxuej$htNT+$E}Ghg-|e#CPxs8J=tQT!uh$^MKD^h2H&n1!3d9w<*KYbqaf*y zh4zKp<3R|lefe6^aANfINeDhS>26MDm5iR~mKjsLu1kJM*Mu3)aP;(?XZ+}E-g7zH zP-NTIxd461jwzMC?|013i_3F<3-ogViNAUgRefz+I<*8SQb^T`Vkv1LJUB{cVQD?K zf{O0k$QAgijhV$FwL{_fSb>AhDG!vWjQXz8ldH-0q!W@Hkn!jaDmS8+504I!C-|Dj zHW@3&uXoMjj>7(EqL^(YsMy~C<2htYAH$dlr+Ad(vnX#k;@R*75xRBq+snaW(u4aV zEl-B%F!YT!BN22uLD6>2T0w_)uqszxZIfbzSv;0ww zg&7r6Y)siybgLnB9A2Xx!f-3?$aUf&f}~09=mIF1_9B1X#f6Y^_siV6?(6229kK%t zLwgE5sQ2YT6t$H&qnfzlmXzSGZ&@;WIiKzii!Ec$AuTfmU4~ zSsf3oVHeEv#Jk)Qn2eJ%ZBXDqX8CpBeI&Jh%U!j|MQj-~Pfk@*Tsb}~9Nz3cmmZ$Z zx&u4YUo0%@JASpH4b^0fFLfkC1g|Ah)OD1H!M(^l$ZU#;=Lz^M?bG%!)%V?PF^No{ z?9|3rwli#AIImXJlg9hRqMDEZz>`6aQPu*K+lfgTaBM`5v1KAQ|0p1MaDVIAk-fp2 z0wrLM)VcW#LPuxba;gIN@CR#b#zKV^KabZUncai;!(Mk#9&gX6hH+_Dk=VYA=r7e1 zOHEDi-3sx@$<@u}?VUisQs(BLGrg3Sdkz)MWNEOOp13}1EH_jcc2l?_-c z_KN|)2l}GjvbZSGInCnZ%2+_r^p8kf6*RRR~BM#hyYJM39aJ;_RWCQY>}!({$SVr$LgTExw&ohn=H3TME&N+))UdAacvJ>Hh9Vb--G~QvhRt| zM)0Vll@6U0XHsZ0@v1+23#6vsY9ZPs#X{jY3po)y*qwMR)t{h)?t$yGpFJ0w3pw!T zYz#f7c&(*()OKW!2)(dV5@xz%(?-SlVE5<&4Om3wun-y|$q?`Z`>9$MO%e~0ALGOb zD$WA8gME+6^g0^A=u=7`KXGD|W_T}7``waXGKE}0kp`bhnUqxUh24cvSVA@qMEaLc zpca*O>KHIf9C|ucm^irZ%S513(PsYP=C!yBJO2Jye|{Rvhne@WyP2>sQ&dj+ZNEnM z-*J7Mn-=c+3?QIr5a$PA*`yh);DlM@ zuL2k6U8(;V83&xku_gVx*4;>dKpaPlVb#jJZe!FSaVWh)>u{n5;^rouT5_Z=S0=^>xXV_ z>uXVtPupDPE=--%OVXYG3=oq=#g1cI*jXG4%iSp5F5OLa`3^TqR{F zer8{~ zf4P|3S#(9k^P91yUpV09a z!#zoShe6-8e{c~XFtdVUqy(CTbvjE)+CIj3`2MY$n%^+;Up#rEbZS*^fH+ z;v2SFRc&(Fhi@1E%{j?(|U%a div + div { + margin-left:40px; + } +} +.half { + width: 50%; +} + +.center { + margin-left:auto; + margin-right:auto; +} + +.hidden { + display:none; +} + +ul.none { + list-style-type: none; + padding:0; +} + +ul.inline li { + display:inline-block; +} + +.errormsg { + color:#FF0000; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +.loading:before { + display:inline-block; + content: ' '; + border-radius: 50%; + border: .5rem solid @loadingColor; + border-top-color: #000; + animation: spin 1s infinite linear; + width:16px; + height:16px; +} + +.loading.smallani:before { + margin-left:-20px; + border-width: .3rem; + position:absolute; + width:8px; + height:8px; +} + +a, input, button { + outline:0; +} +::-moz-focus-inner { + border:0; +} +#main { + position:relative; + padding:10px; +} +#main { + h1, h2, h3 { + font-weight:500; + margin-left:10px; + margin-right:10px; + } +} + +#mapping { + td { + vertical-align:middle; + } + input[type=text] { + margin-top:0; + } +} + +a { + color:inherit; + text-decoration: none; +} + +@media screen and (max-width: 400px) { + #main { + padding:0; + } +} diff --git a/less/fform.less b/less/fform.less new file mode 100644 index 0000000..4d7377e --- /dev/null +++ b/less/fform.less @@ -0,0 +1,152 @@ +.fform { + min-width:320px; + background-color: @boxBackgroundColor; + box-shadow: -5px -5px 30px @boxShadowTLColor, 5px 5px 30px @boxShadowBRColor; + border-radius:20px; + border:1px solid @boxBorderColor; + margin:10px; + padding:10px; + position:relative; + + .loading { + &:before { + width:25px; + height:25px; + } + } + input[type=text] + label, + input[type=password] + label { + box-sizing: border-box; + display:block; + position:absolute; + pointer-events: none; + margin: ~"calc(-1.85em + 1px) 1em 0"; + &:before { + content: attr(placeholder); + display: inline-block; + color: @labelColor; + white-space: nowrap; + transition-property: transform, color, font-size; + transition-duration: 0.2s; + transition-timing-function: ease-out; + transform-origin: left center; + border:1px solid @labelBorder; + border-bottom:0; + padding:3px; + border-radius:5px 5px 0 0; + } + } + input,button,.button,select { + box-shadow: -3px -3px 10px @buttonShadowTLColor, 3px 3px 10px @buttonShadowBRColor; + background: radial-gradient(@buttonUnCheckedColorInner 20%, @buttonUnCheckedColorOuter 100%); + border:1px solid @inputBorderColor; + border-radius:1em; + color: @labelColor; + transition: box-shadow .5s, border .5s; + &:hover, &:focus, &:focus-within { + box-shadow: none; + border:1px solid @inputBorderColorActive; + transition: box-shadow 0.5s, border .5s; + } + &:checked, &:active { + box-shadow: -5px -5px 13px @buttonShadowBRColor, 3px 3px 10px @buttonShadowTLColor; + transition: box-shadow 0.5s; + } + &.green { + background: radial-gradient(@buttonUnCheckedColorInnerGreen 20%, @buttonUnCheckedColorOuterGreen 100%); + } + &.red { + background: radial-gradient(@buttonUnCheckedColorInnerRed 20%, @buttonUnCheckedColorOuterRed 100%); + } + } + input[type=radio], input[type=checkbox], select { + height: 2em; + -webkit-appearance: none; + -moz-appearance: none; + } + + select { + margin-top:-4px; + vertical-align:top; + padding:0 3px; + } + + input[type=radio], input[type=checkbox] { + width:2em; + &:checked { + background: radial-gradient(@buttonCheckedColorInner 20%, @buttonCheckedColorOuter 100%); + } + + & + label { + margin:0.5em 0 0 5px; + display:inline-block; + height:2em; + vertical-align:top; + } + } + input[type=text], input[type=password], input[type=submit], button { + font-size: 100%; + margin: 1.3em 0 0; + padding: 0.2em 0.5em 0; + height: 2em; + box-sizing: border-box; + width:100%; + } + input[type=text], input[type=password] { + &:active { + box-shadow:none; + } + } + button { + cursor:pointer; + outline:none; + } + + label + a, label + p { + margin-top:1.3em; + display:inline-block; + } + input[type=text], input[type=password], input[type=file], select, button { + &:focus, + &.active, + &:valid, + &.invalid, + &:disabled { + & + label:before { + transform: translateY(-2.0em) translateX(0.5em); + border-color: @inputBorderColor; + font-size:70%; + background: @labelBackground; + } + } + } + + .errormsg { + display:inline-block; + } + + .successmsg { + margin-top:1em; + color:#009900; + display:inline-block; + } + + &.small, .small { + font-size: 75%; + input[type=checkbox] + label { + margin:0.6em 0 0; + } + input[type=text], input[type=password], input[type=file], select { + &:focus, + &.active, + &:valid, + &.invalid, + &:disabled { + & + label:before { + transform: translateY(-2.3em) translateX(0.5em); + } + } + } + } + +} diff --git a/less/header.less b/less/header.less new file mode 100644 index 0000000..dc9205d --- /dev/null +++ b/less/header.less @@ -0,0 +1,23 @@ +header { + padding:0px 1em 1.5em; + background: linear-gradient(0deg, @backgroundColor 0%, @headerBottom 1.0em, @headerBackground 1.0em 100%); + h1 { + display:inline-block; + margin: 0 20px 0 0; + } + #menu { + display:inline-block; + margin:0; + li+li{ + margin-left: 20px; + } + } + a { + color:inherit; + text-decoration: none; + &:focus, &:active { + text-decoration: underline; + + } + } +} diff --git a/less/main.less b/less/main.less new file mode 100644 index 0000000..def7c50 --- /dev/null +++ b/less/main.less @@ -0,0 +1,112 @@ +#trigger { + button.trigger { + height:1.5em; + margin-top:0; + text-align:center; + font-size:2em; + img { + margin-right:20px; + vertical-align:top; + height:1em; + } + align-items:center; + } +} +#edittiming { + > div { + float:left; + margin-bottom:20px; + .outer { + transition: font-size .1s, opacity 0.1s 0.1s; + } + overflow:hidden; + .minmax { + display:block; + position:absolute; + right:20px; + width:18px; + height:18px; + border-radius:50%; + background: @buttonUnCheckedColorOuter; + + &:before { + top:5px; + right:1px; + content: ''; + display: block; + border-top: 8px solid @buttonCheckedColorInner; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + width: 0; + height: 0; + position:absolute; + transition: transform 0.2s; + } + + } + h3 { + text-align:center; + margin:0; + font-weight:500; + } + input[type=text] { + width:80px; + } + + button.del { + width:40px; + } + .time { + white-space:nowrap; + } + hr { + margin:10px -10px -10px; + border:0; + border-top:1px solid rgba(0,0,0,.3); + border-bottom:1px solid rgba(255,255,255,.3); + } + &.min { + .outer { + font-size:0; + opacity:0; + transition: opacity 0.1s, font-size 0.1s .1s; + } + .minmax:before{ + transform: rotate(90deg); + transition:transform .2s; + } + } + } +} + +#mainview .error { + color:@errorColor; + margin:25px 10px; +} +@media screen and (min-width: 800px) { + #trigger { + width:400px; + } + #edittiming > div { + width:400px; + .time br { + display: none; + } + } +} + +@media screen and (max-width: 800px) { + #edittiming { + > div { + width:auto; + float:none; + .time { + white-space: normal; + } + button.del { + display:block; + width:100%; + } + } + } +} \ No newline at end of file diff --git a/less/mapping.less b/less/mapping.less new file mode 100644 index 0000000..d4522c8 --- /dev/null +++ b/less/mapping.less @@ -0,0 +1,12 @@ +#mapping { + max-width:500px; + .pin { + display:inline-block; + height:2em; + margin:0.5em 0 0; + vertical-align:top; + } + .mapping { + margin-bottom:0.5em; + } +} diff --git a/less/overlay.less b/less/overlay.less new file mode 100644 index 0000000..3988972 --- /dev/null +++ b/less/overlay.less @@ -0,0 +1,41 @@ +.overlay { + position:fixed; + z-index:128000; + top:0; + left:0; + width:100%; + height:100vh; + background:rgba(0,0,0,0.5); + + > div { + display:flex; + flex-direction:column; + margin: 12vh auto 0; + max-width:960px; + min-width:350px; + min-height:300px; + width:75%; + height:75vh; + background:#FFF; + border:1px solid #cacaca; + border-radius:5px; + box-shadow:0 0 10px #000; + .header { + padding:5px; + border-bottom:1px solid #cacaca; + h2 { + margin:0; + padding:0; + font-size:120%; + text-align:center; + } + span.close { + float:right; + cursor:pointer; + } + } + form { + overflow:auto; + } + } +} \ No newline at end of file diff --git a/less/update.less b/less/update.less new file mode 100644 index 0000000..18d1bd3 --- /dev/null +++ b/less/update.less @@ -0,0 +1,9 @@ +#update { + > div { + width:400px; + } + label { + display:block; + margin-bottom:10px; + } +} \ No newline at end of file diff --git a/less/wifi.less b/less/wifi.less new file mode 100644 index 0000000..87ecba7 --- /dev/null +++ b/less/wifi.less @@ -0,0 +1,21 @@ +#wifi { + margin-top:20px; + max-width:600px; + .hsplit { + >div + div { + width:400px; + } + } +} + +@media screen and (max-width: 500px) { + #wifi { + .hsplit { + display:block; + >div + div { + margin:0; + width:100%; + } + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..e427351 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "name": "CameraTrigger", + "version": "1.0.0", + "homepage": "https://contentnation.net/grumpydevelop/", + "author": { + "name" : "Sascha Nitsch", + "url" : "https://contentnation.net/grumpydevelop/" + }, + "funding": { + "type": "ContentNation", + "url": "https://contentnation.net/grumpydevelop/" + }, + "license": "GPL-3.0-or-later", + "devDependencies": { + "@types/jquery": "^3.5.16", + "grunt": "^1.5.3", + "grunt-cli": "^1.4.3", + "grunt-contrib-concat": "^2.1.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-less": "^3.0.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-json-merge": "^0.2.2", + "grunt-newer": "^1.3.0", + "grunt-ts": "^6.0.0-beta.22", + "typescript": "^4.9.4" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.2.1", + "@types/mustache": "^4.2.2", + "jquery": "^3.6.3", + "jquery-toast-plugin": "^1.3.2", + "mustache": "^4.2.0" + }, + "browserslist": [ + "defaults" + ] +} diff --git a/static/api/config.json b/static/api/config.json new file mode 100644 index 0000000..822d037 --- /dev/null +++ b/static/api/config.json @@ -0,0 +1,4 @@ +{ + "wifimode": "ap", + "ssid": "CameraTrigger" +} \ No newline at end of file diff --git a/static/api/pinmapping.json b/static/api/pinmapping.json new file mode 100644 index 0000000..cc7b5a1 --- /dev/null +++ b/static/api/pinmapping.json @@ -0,0 +1,10 @@ +{ + "d0": ["Flash 1", "digitalout", false], + "d1": ["Valve 1", "digitalout", false], + "d2": ["Valve 2", "digitalout", false], + "d3": ["trigger", "trigger", false], + "d4": ["", "none", false], + "d5": ["Flash 2", "digitalout", false], + "d6": ["Camera", "irsony", false], + "d7": ["", "none", false] +} \ No newline at end of file diff --git a/static/api/run b/static/api/run new file mode 100644 index 0000000..ef12c17 --- /dev/null +++ b/static/api/run @@ -0,0 +1,3 @@ +{ + "message": "ok" +} \ No newline at end of file diff --git a/static/api/ssid.json b/static/api/ssid.json new file mode 100644 index 0000000..95bf4fd --- /dev/null +++ b/static/api/ssid.json @@ -0,0 +1,4 @@ +[ + ["abc", 70, 2, ""], + ["def", 65, 3, "open"] +] diff --git a/static/api/wifi b/static/api/wifi new file mode 100644 index 0000000..13a1641 --- /dev/null +++ b/static/api/wifi @@ -0,0 +1,3 @@ +{ + "error": "invalidpassword" +} \ No newline at end of file diff --git a/static/cameratrigger_logo.png b/static/cameratrigger_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..092be7f3f947be83b1b5406f8477a4c3451ad76b GIT binary patch literal 25196 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 literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..5a7d334 --- /dev/null +++ b/static/index.html @@ -0,0 +1,20 @@ + + + + + Camera Trigger + + + + + + + + +
loading ...
+ + + \ No newline at end of file diff --git a/templates/base/main.mst b/templates/base/main.mst new file mode 100644 index 0000000..89c7c03 --- /dev/null +++ b/templates/base/main.mst @@ -0,0 +1,26 @@ + + diff --git a/templates/base/menu.mst b/templates/base/menu.mst new file mode 100644 index 0000000..6056e4d --- /dev/null +++ b/templates/base/menu.mst @@ -0,0 +1,4 @@ + diff --git a/templates/base/pinmapping.mst b/templates/base/pinmapping.mst new file mode 100644 index 0000000..738c51e --- /dev/null +++ b/templates/base/pinmapping.mst @@ -0,0 +1,23 @@ + diff --git a/templates/base/update.mst b/templates/base/update.mst new file mode 100644 index 0000000..b406ca0 --- /dev/null +++ b/templates/base/update.mst @@ -0,0 +1,8 @@ + diff --git a/templates/base/wifi.mst b/templates/base/wifi.mst new file mode 100644 index 0000000..fe78579 --- /dev/null +++ b/templates/base/wifi.mst @@ -0,0 +1,28 @@ + + \ No newline at end of file diff --git a/ts/api.ts b/ts/api.ts new file mode 100644 index 0000000..5b51e8c --- /dev/null +++ b/ts/api.ts @@ -0,0 +1,70 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// + +class Api { + /** + * ajax get call + * @param {string} path url path to call + * @param {object} parameter parameters to pass to api call + * @param {object} context optional parameter for setting the context the success and error function will be called + * @param {function} success optional success callback function + * @param {function} error optional error callback function + */ + static get(path: string, parameter, context, success, error) { + jQuery.ajax({ + url : "api" + (path[0] != '/' ? '/' : '') + path, + dataType : 'json', + type : "GET", + data : parameter, + success : success, + error : error, + context : context + }); + }; + + /** + * brief ajax post call api + * @param {string} path url path to call + * @param {object} parameter parameters to pass to api call + * @param {object} context optional parameter for setting the context the success and error function will be called + * @param {function} success optional success callback function + * @param {function} error optional error callback function + */ + static post(path: string, parameter, context, success, error) { + jQuery.ajax({ + url : "api" + (path[0] != '/' ? '/' : '') + path, + dataType : 'json', + type : "POST", + data : parameter, + processData: !(parameter instanceof FormData), + success : success, + error : error, + context : context, + contentType: parameter instanceof FormData ? false : "application/x-www-form-urlencoded; charset=UTF-8" + }); + }; + + /** + * brief ajax del call api + * @param {string} path url path to call + * @param {object} parameter parameters to pass to api call + * @param {object} context optional parameter for setting the context the success and error function will be called + * @param {function} success optional success callback function + * @param {function} error optional error callback function + */ + static del(path: string, context, success, error) { + jQuery.ajax({ + url : "api" + (path[0] != '/' ? '/' : '') + path, + dataType : 'json', + type : "DELETE", + success : success, + error : error, + context : context + }); + }; +} diff --git a/ts/cameratrigger.ts b/ts/cameratrigger.ts new file mode 100644 index 0000000..8278a53 --- /dev/null +++ b/ts/cameratrigger.ts @@ -0,0 +1,189 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// +/// +/// +/// +/// + +interface Wifi { + mode:string; + ssid:string; +} + +type PinMappings = Record; + +class CameraTrigger { + public form:FormInfo; + public lang: any; + public loader: Loader; + public routing: any; + public oldhash: string; + public view: View; + public wifi: Wifi; + public pinMapping: PinMappings; + + constructor() { + this.routing = { + "": "MainView", + "#wifi": "WifiView", + "#pinmapping": "PinMappingView", + "#update": "UpdateView" + }; + + this.loader = new Loader(this); + this.loadConfig(); + this.loader.template("base", this, this.start, null); + } + + public getVersion() : string { + return "beta1"; + } + + /** + * default error function + * - disables loading indicator + * - fills in fields with class errormsg + * - show error toaster + */ + public error(jqXHR, textStatus, errorThrown) { + var error="error"; + if (jqXHR.responseJSON) { + error = jqXHR.responseJSON.error; + } else { + if (errorThrown in app.lang.error) { + error = app.lang.error[errorThrown]; + } else { + error = errorThrown; + } + } + if (this.form) { + $(this.form.target).removeClass("loading"); + $(this.form.target).find('.errormsg').text(error); + } + $.toast({ + text: error, + position: 'top-right', + icon: 'error' + }); + }; + + /** + * default success function + * - disables loading indicator + * - fills in fields with class successmsg + * - show toaster + */ + public success(jqXHR, textStatus, errorThrown) { + var message="ok"; + if (jqXHR.responseJSON) { + message = jqXHR.responseJSON.message; + if (message in app.lang.message) { + message = app.lang.message[message]; + } + } + if (this.form) { + $(this.form.target).removeClass("loading"); + $(this.form.target).find('.successmsg').text(message); + } + $.toast({ + text: message, + position: 'top-right', + icon: 'success' + }); + }; + + loadConfig() { + Api.get("config.json", {}, this, this.applyConfig, this.error); + } + + applyConfig(config) { + // load language file + this.loader.addLang("en", "main", this, this.start, this.error); + this.wifi = {mode: config.wifimode, ssid: config.ssid}; + } + + start() { + if (!this.lang || $("#tplMenu").length == 0) { + // try again the next time + return; + } + // render menu + var template = $("#tplMenu").html(); + var data:any = {}; + data.l = this.lang; + var html = Mustache.render(template, data); + $("#menu").prepend(html); + $(window).on('hashchange', this, this.doRouting); + this.doRouting(); + } + + doRouting(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.data.doRouting(); + return false; + } + var hash = document.location.hash; + if (hash != this.oldhash && this.view) { + this.view.finish(); + } + this. oldhash = hash; + var className = this.routing[hash]; + if (className) { + this.newClass(className); + } + } + + /** + * create a new instance of given classname with optional construction parameter + * - loads class if not yet known, filename: js/lowerCaseClassName.min.js + * - creates instance of class + * @param {any} classname class name + * @param {object} parameter optional parameter for new instance + * @private + */ + newClass(classname: any, parameter?: object) : any { + if (typeof classname === "object") { + let newclass: any = window[classname.name]; + new newclass(this, classname.parameter); + return; + } + if (!window[classname]) { + this.loader.js(classname.toLowerCase(), this, this.newClass, { + name : classname, + parameter : parameter + }); + return; + } + let newclass: any = window[classname]; + new newclass(this, parameter); + }; + + getPinMapping(context: any, callback: any) { + Api.get("pinmapping.json",{}, {t:this, context:context, callback:callback}, this.gotPinMapping, this.error); + } + + gotPinMapping(this:any, data: any) { + var self = this.t; + var cbcontext = this.context; + var callback = this.callback; + self.pinMapping = data; + if (callback) { + callback.call(cbcontext); + } + } + + setPinMapping(data: PinMappings) { + this.pinMapping = data; + } + +} + +var app: CameraTrigger; +$(document).ready(function() { + app = new CameraTrigger(); +}); diff --git a/ts/forminfo.ts b/ts/forminfo.ts new file mode 100644 index 0000000..a0753fe --- /dev/null +++ b/ts/forminfo.ts @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +class FormInfo { + public enctype: string; + public target: JQuery.Node; + public path: string; + public parentElement: JQuery; +} \ No newline at end of file diff --git a/ts/loader.ts b/ts/loader.ts new file mode 100644 index 0000000..23a728f --- /dev/null +++ b/ts/loader.ts @@ -0,0 +1,178 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + + +/// + +// IE stuff +interface HTMLElement { + readyState: any; + onreadystatechange: any; +} + +class Loader { + private loading: object; + private app: CameraTrigger; + + constructor(app: CameraTrigger) { + this.loading = {}; + this.app = app; + } + + /** + * load css + * @param {string} file file to load + * - checks for duplicates + * - file name: /css/ + file + .css?v=version + */ + css(file: string) { + if (!document.getElementById("css_" + file)) { + var link = document.createElement('link'); + link.setAttribute("rel", "stylesheet"); + link.setAttribute("type", "text/css"); + link.setAttribute("id", "css_" + file); + if (file[0] === "/") { + link.setAttribute("href", file); + } else { + link.setAttribute("href", "css/" + file + ".css?v=" + this.app.getVersion()); + } + document.getElementsByTagName("head")[0].appendChild(link); + } + }; + + /** + * gerneic callback wrapper supporting App scope or optional other scope + * @param {object} scope to use (undefined or false uses App instance) + * @param {Function} funct function to call + * @param {object} parameter paramter for funct + * @private + */ + private callback(scope: object, funct: Function, parameter: object) { + if (!scope) { + funct.call(this, parameter); + } else { + funct.call(scope, parameter); + } + }; + + /** + * load javascript + * @param {string} file file to load + * @param {object} scope scope for callback + * @param {Function} callback callback function + * @param {object} parameter parameter for callback + * - checks for duplicates + * - file name: /js/ + file + .min.js?v=version + */ + js(file: string, scope?: object, callback?: Function, parameter?: object) : boolean { + if (this.loading[file]) { + this.loading[file].push([scope,callback, parameter]); + return true; + } + if (!document.getElementById("script_" + file.replace("/","_"))) { + var script:HTMLElement = document.createElement('script'); + if (file[0] === "/") { + script.setAttribute("src", file); + } else { + script.setAttribute("src", file + ".min.js?v=" + this.app.getVersion()); + } + if (!callback) { + callback = function() { + script.setAttribute("id", "script_" + file); + // console.log("trigger", "scriptload." + file); + $(document).trigger("scriptload." + file); + }; + } + this.loading[file] = [[scope,callback, parameter]]; + if (callback) { + if (script.readyState) { // IE + script.onreadystatechange = function() { + if (script.readyState === "loaded" || script.readyState === "complete") { + script.onreadystatechange = null; + script.setAttribute("id", "script_" + file.replace("/","_")); + this.callbackList(file); + delete this.loading[file]; + } + }.bind(this); + } else { // Others + script.onload = function() { + script.setAttribute("id", "script_" + file.replace("/","_")); + this.callbackList(file); + delete this.loading[file]; + }.bind(this); + } + } + document.getElementsByTagName("head")[0].appendChild(script); + return true; + } + if (callback) { + this.callback(scope, callback, parameter); + } else { + $(document).trigger("scriptload." + file); + } + return false; + }; + + /** + * calls multiple callsbacks if a file has been loaded + * @param {string} file file that has been loaded + * @private + */ + callbackList(file: string) { + for (var i = 0; i < this.loading[file].length; ++i) { + var c = this.loading[file][i]; + if (c[0]) { + this.callback(c[0], c[1], c[2]); + } + } + $(document).trigger("scriptload." + file); + }; + + /** + * add translation file to global translation object + * @param {string} language + * @param {string} group language group + * @param {object} scope scope for callback function + * @param {Function} callback callback function + * @param {object} parameter parameter for callback + */ + addLang(lang: string, group: string, scope?: object, callback?:Function, parameter?: object) { + if (this.app.lang && this.app.lang[group]) { + if (callback) { + this.callback(scope, callback, parameter); + } + } else { + jQuery.ajax({ + url : lang + "_" + group + ".json?v=" + this.app.getVersion(), + dataType : 'json', + type : "GET", + data : parameter, + success : function(a) { + this.app.lang = jQuery.extend(this.app.lang, a); + if (callback) { + this.callback(scope, callback, parameter); + } + }, + error : this.app.error, + context : this + }); + } + }; + + template(file: string, scope: object, callback: Function, param?: object) { + jQuery.ajax({ + url: file+'.mst?v=' + this.app.getVersion(), + dataType: 'text', + context: this, + success: function(template) { + $("body").append(template); + if (callback) { + this.callback(scope, callback, param); + } + } + }); + } +} diff --git a/ts/mainview.ts b/ts/mainview.ts new file mode 100644 index 0000000..29df5ae --- /dev/null +++ b/ts/mainview.ts @@ -0,0 +1,158 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// +/// + +class MainView extends View { + + constructor(app: CameraTrigger) { + super(app); + if (!this.app.pinMapping) { + this.app.getPinMapping(this, this.render); + } else { + this.render(); + } + } + + finish() { + } + + render() { + var template = $("#tplMain").html(); + var data:any = {}; + data.l = this.app.lang; + var keys = Object.keys(this.app.pinMapping); + data.pinmapping = []; + keys.forEach(function(key){ + var pin = this.app.pinMapping[key]; + if (pin[1] !== "none" && pin[1] !== "trigger") { + data.pinmapping.push({pin: key, name: pin[0]}); + } + }); + var html = Mustache.render(template, data); + this.root.html(html); + this.root.find("button.add").on("click", this, this.addTime); + this.root.on("click","button.del", this, this.delTime); + this.root.find(".minmax").on("click", this, this.toggleExpansion); + this.root.find("#trigger button.trigger").on("click", this, this.trigger); + this.root.find("#trigger button.save").on("click", this, this.save); + } + + addTime(event: JQuery.TriggeredEvent) { + event.preventDefault(); + var target = $(event.currentTarget); + var template = $("#tplMainTime").html(); + var data:any = {}; + var fform = target.parents(".fform"); + data.name = fform.data("pin"); + data.index = fform.find(".time").length; + data.delta = event.data.app.pinMapping[data.name][1]==="digitalout"; + data.l = event.data.app.lang; + var html = Mustache.render(template, data); + target.before(html); + } + + delTime(event: JQuery.TriggeredEvent) { + event.preventDefault(); + var target = $(event.currentTarget).parent(); + target.remove(); + } + + toggleExpansion(event: JQuery.TriggeredEvent) { + event.preventDefault(); + + var form = $(event.currentTarget).parents("div.fform") + form.toggleClass("min"); + return false; + } + + trigger(event: JQuery.TriggeredEvent) { + event.preventDefault(); + event.data.realTrigger(true) + } + + save(event: JQuery.TriggeredEvent) { + event.preventDefault(); + event.data.realTrigger(false) + } + + realTrigger(alsoTrigger: boolean) { + // get list of active pins + var times={}; + var inputs = this.root.find("form").serializeArray(); + for (var i = 0 ; i < inputs.length; ++i) { + var tokens = inputs[i].name.split("_"); + var type = tokens[0] + var pin = parseInt(tokens[1].substr(1)); + var time = parseInt(inputs[i].value); + if (type === "delta") { + time += parseInt(inputs[i-1].value); + } + if (!times[time]) { + times[time] = []; + } + var start = type === "start"; + if (this.app.pinMapping[tokens[1]][2]) // inverted + start = !start; + switch (this.app.pinMapping[tokens[1]][1]) { // type + case "digitalout": + times[time].push((start ? "E" : "D") + pin); + break; + case "ircanon": + times[time].push("C" + pin); + break; + case "irnikon": + times[time].push("N" + pin); + break; + case "irsony": + times[time].push("S" + pin); + break; + } + } + var keys = Object.keys(times).sort(function(a,b){var A=parseInt(a);var B=parseInt(b);return A diff) { + var err = this.app.lang.main.needpause.replace("$1", needDelay); + $.toast({ + text: err, + position: 'top-right', + icon: 'error' + }); + this.root.find(".error").html(err); + return; + } + if (diff>0) { + cmdString += "d" + diff + ";"; + } + needDelay = 0; + times[keys[j]].forEach(function(a) { + if (a[0] === 'C') + needDelay = 10; + else if (a[0] === 'N') + needDelay = 136; + else if (a[0] === 'S') + needDelay = 39; + }); + cmdString += times[keys[j]].join(";") + ";"; + curTime = parseInt(keys[j]); + } + //check for trigger + keys = Object.keys(this.app.pinMapping) + for (var k = 0; k < keys.length ; ++k) { + if (this.app.pinMapping[keys[k]][1] === "trigger") { + cmdString += "T" + keys[k].substr(1) + ";"; + } + console.log(this.app.pinMapping[keys[k]]); + } + Api.post("/run", {"cmd": cmdString, "trigger": alsoTrigger}, this, this.app.success, this.app.error); + } +} diff --git a/ts/pinmappingview.ts b/ts/pinmappingview.ts new file mode 100644 index 0000000..0876a5f --- /dev/null +++ b/ts/pinmappingview.ts @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// +/// +class PinMappingView extends View { + public form: any; + constructor(app: CameraTrigger) { + super(app); + if (!this.app.pinMapping) { + this.app.getPinMapping(this, this.render); + } else { + this.render(); + } + } + + finish() { + this.root.find("input[type=submit]").off("click", this.saveEdit); + } + + render() { + var template = $("#tplPinMapping").html(); + var data:any = {}; + data.l = this.app.lang; + data.pinmapping = []; + var keys = Object.keys(this.app.pinMapping); + keys.forEach(function(key){ + var pin = this.app.pinMapping[key]; + data.pinmapping.push({pin: key, name: pin[0], type: pin[1], inverted: pin[2]}); + }); + var html = Mustache.render(template, data); + this.root.html(html); + this.root.find("input[type=submit]").on("click", this, this.saveEdit); + // set select boxes + for (var i = 0; i < 8; ++i) { + this.root.find("select[name=type_d" + i + "]").val(this.app.pinMapping["d" + i][1]); + } + } + + saveEdit(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.preventDefault(); + event.data.saveEdit(); + return; + } + var data = {}; + var keys = Object.keys(this.app.pinMapping); + var root = this.root; + keys.forEach(function(key){ + var pin = this.app.pinMapping[key]; + data[key] = [root.find("input[name=name_" + key + "]").val(), root.find("#type_" + key).val(), root.find("input[name=inverted_" + key + "]").prop("checked")===true]; + }); + Api.post("pinmapping", JSON.stringify(data), this, this.success, this.app.error); + } + + success(data: PinMappings) { + this.app.setPinMapping(data); + $.toast({ + text: this.app.lang.generic.savesuccess, + position: 'top-right', + icon: 'success' + }); + } +} diff --git a/ts/toast.d.ts b/ts/toast.d.ts new file mode 100644 index 0000000..16fa811 --- /dev/null +++ b/ts/toast.d.ts @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + + +interface JQueryStatic { + toast(options?: any, callback?: Function) : any; +} \ No newline at end of file diff --git a/ts/updateview.ts b/ts/updateview.ts new file mode 100644 index 0000000..895de2a --- /dev/null +++ b/ts/updateview.ts @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// +/// +class UpdateView extends View { + public form: any; + constructor(app: CameraTrigger) { + super(app); + this.render(); + } + + finish() { + } + + render() { + var template = $("#tplUpdate").html(); + var data:any = {}; + data.l = this.app.lang; + var html = Mustache.render(template, data); + this.root.html(html); + } +} \ No newline at end of file diff --git a/ts/view.ts b/ts/view.ts new file mode 100644 index 0000000..e4f6388 --- /dev/null +++ b/ts/view.ts @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +class View { + protected app: CameraTrigger; + protected root:JQuery; + constructor(app: CameraTrigger) { + this.app = app; + app.view = this; + this.root = $("#main"); + this.root.empty(); + } + + finish() { + } +} diff --git a/ts/wifiview.ts b/ts/wifiview.ts new file mode 100644 index 0000000..a3cc0a5 --- /dev/null +++ b/ts/wifiview.ts @@ -0,0 +1,145 @@ +/* + * SPDX-FileCopyrightText: 2023 Sascha Nitsch (@grumpydevelop@contentnation.net) https://contentnation.net/en/grumpydevelop + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/// +/// +interface SSID { + name: string; + quality: number; + active: boolean; + channel: number; + encryption: string; + index: number; +} +class WifiView extends View { + private ssidlist: Array; + public form: any; + constructor(app: CameraTrigger) { + super(app); + this.render(); + this.ssidlist = []; + } + + finish() { + this.root.off("change", "input[name=mode]"); + this.root.find("#ssidscan button").off("click"); + this.root.find("#ssidscan ul").off("change", "input[name=ssidlist]"); + this.root.find("#save").off("click"); + } + + render() { + var template = $("#tplWifi").html(); + var data:any = {}; + data.l = this.app.lang; + data.ssid = this.app.wifi.ssid; + var html = Mustache.render(template, data); + this.root.html(html); + var active = $("#" + this.app.wifi.mode); + active.prop("checked", true); + this.root.on("change", "input[name=mode]", this, this.modechange); + this.root.find("#ssidscan button").on("click", this, this.loadSSIDList); + this.root.find("#save").on("click", this, this.save); + this.modechange(); + } + + modechange(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.data.modechange(); + return false; + } + + var mode = this.root.find("input[name=mode]:checked").val(); + var sync = this.root.find("#ssidscan"); + var ssid = this.root.find("#ssid"); + if (mode == "client") { + // show sync button and optionally load first list + sync.removeClass("hidden"); + ssid.attr("disabled","disabled"); + if (!this.ssidlist || this.ssidlist.length == 0) { + this.loadSSIDList(); + } + } else { + // hide sync button + sync.addClass("hidden"); + ssid.removeAttr("disabled"); + } + } + + loadSSIDList(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.preventDefault(); + event.data.loadSSIDList() + return false; + } + var button = this.root.find("#ssidscan button"); + button.addClass("loading"); + Api.get("ssid.json", {}, this, this.ssidListReceived, this.app.error); + } + + ssidListReceived(listdata) { + var i; + this.ssidlist = []; + var button = this.root.find("#ssidscan button"); + button.removeClass("loading"); + var existing = this.root.find("#ssid").val(); + for (i=0; i < listdata.length; ++i) { + this.ssidlist.push({name:listdata[i][0], quality: -listdata[i][1], active: listdata[i][0] === existing, channel:listdata[i][2], encryption: this.app.lang.wifi["encryption" + listdata[i][3]], index:i}); + } + var template = $("#tplWifiSSID").html(); + var data:any = {}; + data.l = this.app.lang; + data.ssids = this.ssidlist; + var html = Mustache.render(template, data); + var list = this.root.find("#ssidscan ul"); + list.html(html); + list.on("change", "input[name=ssidlist]", this, this.selectSSID); + } + + selectSSID(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.data.selectSSID(); + return false; + } + var ssid = this.root.find("#ssidscan input[name=ssidlist]:checked").val(); + this.root.find("#ssid").val(ssid); + } + + save(event?: JQuery.TriggeredEvent) { + if (event && event.data) { + event.preventDefault(); + event.data.save(); + return false; + } + var save = this.root.find("#save"); + save.addClass("loading"); + this.form = {target: save[0]}; + var data = { + ssid: this.root.find("input[name=ssid]").val(), + mode: this.root.find("input[name=mode]:checked").val(), + password: this.root.find("input[name=password]").val() + }; + Api.post("wifi",data, this, this.saved, this.app.error); + } + + saved(response: any) { + this.root.find("#save").removeClass("loading"); + if (response.error) { + $.toast({ + text: this.app.lang.error[response.error], + position: 'top-right', + icon: 'error' + }); + } else { + $.toast({ + text: this.app.lang.generic.savesuccess, + position: 'top-right', + icon: 'success' + }); + window.setTimeout(function(){document.location.href="http://" + response.redirect;}, 3000); + } + + } +} \ No newline at end of file
+

logo Camera Trigger

+ +